var nom=-1;
var pla=-1;
var gen=-1;
var eda=-1;
var hab=new Array();
var con=new Array();

var jocs = new Object();

var JOC = 0;
var PLATAFORMA = 1;
var EDAT = 2;
var GENERE = 3;
var HABILITATS = 4;
var CONTINGUTS = 5;
var DESCRIPCIO = 6;
var STATSPAGE = 7;
var SITE = 8;

Array.prototype.contains = function (item) {
	for (var i = 0; i < this.length; i++) {
		if (this[i] == item) return true;
	}
	return false;
}

Array.prototype.containsAll = function (items) {
	for (var i = 0; i < items.length; i++) {
		if (!this.contains(items[i])) return false;
	}

	return true;
}

Array.prototype.containsNone = function (items) {
	for (var i = 0; i < items.length; i++) {
		if (this.contains(items[i])) return false;
	}
	return true;
}

// Eliminar de l'array la primera ocurrència de l'element indicat. Si es troba l'element
// s'elimina i es recompacta l'array. i es retorna true; si no es troba, es retorna false.
Array.prototype.remove = function (item) {
	for (var i = 0; i < this.length; i++) {
		if (this[i] == item) {
			for (; i + 1 < this.length; i++) {
				this[i] = this[i + 1];
			}
			
			this.length--;
			return true;
		}
	}
	return false;
}

// Obtenir la llista de jocs que satisfan els criteris de cerca actuals, i activar i
// desactivar els elements de la interfície de cerca en conseqüència
function filtrar() {

	var resultats = [];

	// Per cada joc
	for (var i in jocs) {
		var joc = jocs[i];

		// Comprovar si es satisfan els paràmetres de cerca
		if (
		(hab.length==0 || joc[HABILITATS].containsAll(hab))
		&& (con.length==0 || joc[CONTINGUTS].containsNone(con))
		&& (nom == -1 || joc[JOC] == nom)
		&& (pla == -1 || joc[PLATAFORMA] == pla)
		&& (eda == -1 || (edas[joc[EDAT]] <= edas[eda] && (edas[joc[EDAT]]!=0 || edas[eda]==18) ) )
		&& (gen==-1 || joc[GENERE] == gen)) {

			// En cas positiu, registrar una nova coincidència
			resultats.push(joc);

			// I activar els elements de cerca
			noms[joc[JOC]][1] = true;
			plas[joc[PLATAFORMA]][1] = true;
			edas[joc[EDAT]][1] = true;
			gens[joc[GENERE]][1] = true;

			for (var j = 0; j < joc[HABILITATS].length; j++) habs[joc[HABILITATS][j]][1] = true;
			for (var j = 0; j < joc[CONTINGUTS].length; j++) cons[joc[CONTINGUTS][j]][1] = true;
		}
	}

	var teCriteri = (nom != -1 || pla != -1 || eda != -1 || gen != -1 || hab.length > 0 || con.length > 0);

	if(extendido==0)
	{
		var llistat = document.getElementById("resultadosCuerpo");
		llistat.setGames(resultats, teCriteri);
	}
}

function pintaDropDown(quin) {
	
	var obj = document.getElementById(quin);
	var dades = eval(quin +"s");

	// Afegeix entrades a la llista desplegable
	if (obj.options.length == 0) {

		var voidOption = document.createElement("option");
		voidOption.innerHTML = "-- Qualquer --";
		voidOption.value = -1;
		obj.appendChild(voidOption);
		
		for (var i in dades) {
			var option = document.createElement("option");
			option.innerHTML = dades[i];
			option.value = i;
			option.id=nom+i;
			obj.appendChild(option);
		}
		if(extendido==0)
		{
			obj.onchange = dropDownChange;
		}
	}
}

function pintaDropDownEdat() {
	
	var obj = document.getElementById("eda");
	var dades = edas;

	// Afegeix entrades a la llista desplegable
	if (obj.options.length == 0) {

		var voidOption = document.createElement("option");
		voidOption.innerHTML = "-- Qualquer --";
		voidOption.value = -1;
		obj.appendChild(voidOption);
		
		for (var i in dades) {
			if (dades[i]!=0) {
				var option = document.createElement("option");
				option.innerHTML = "A partir dos " + dades[i] + " anos";
				//option.innerHTML = "M&aacute;s de " + dades[i] + " a&ntilde;os";
				option.value = i;
				option.id = "eda"+i;
				obj.appendChild(option);
			}
		}
		if(extendido==0)
		{
			obj.onchange = dropDownChange;
		}
	}
}

function pintaLlistaOpcions(id) {

	var llista = document.getElementById(id);
	var opcions = llista.getElementsByTagName("p");
	var dades = eval(id + "s");
	// Afegeix entrades a la llista d'opcions				
	for (var i in dades) {
		
		var option = document.createElement("p");
		option.value = i;
		
		option.checkBox = document.createElement("input");
		option.checkBox.type = "checkbox";
		option.checkBox.onclick = checkBoxChange;
		option.appendChild(option.checkBox);
		//	Definimos el id, para poder controlarlo
		option.checkBox.id="opc"+i;
		//
		option.checkBox.name="opc"+i;

		option.label = document.createElement("span");
		option.label.innerHTML = dades[i];
		option.appendChild(option.label);

		llista.appendChild(option);
	}
}

function pintar() {
	pintaDropDown("nom");
	pintaDropDown("pla");
	pintaDropDownEdat();
	pintaDropDown("gen");
	pintaLlistaOpcions("hab");
	pintaLlistaOpcions("con");
}

function pintar_init() {
	pintaDropDown("nom");
	pintaDropDown("pla");
	pintaDropDownEdat();
	pintaDropDown("hab");
}

function dropDownChange(n,m) {
	if(m>0)
	{
		eval(n+ " = " + m);
	}
	else
	{
		eval(this.id + " = " + this.options[this.selectedIndex].value);
	}
	filtrar();
}

function checkBoxChange() {
	var param = eval(this.parentNode.parentNode.id);
	var value = this.parentNode.value;
	if (this.checked) {
		if (!param.contains(value)) param.push(value);
	}
	else {
		param.remove(value);
	}
	filtrar();
}
//
if(extendido==0)
{
	alchemy.addHandler(window, "ready", function () {
		pintar();
		filtrar();
		act();
	});
}
else
{
	alchemy.addHandler(window, "ready", function () {
		pintar_init();
		filtrar();
	});
}
var warningIcons = {1:"discriminacion", 2:"drogas", 3:"miedo", 4:"palabrotas", 5:"desnudos", 6:"violencia"};
//var warningIcons = {1:"desnudos", 2:"discriminacion", 3:"drogas", 4:"miedo", 5:"palabrotas", 6:"violencia"};

/* Game details panel
-----------------------------------------------------------------------------------*/
function DetailsPanel(panel) {
	
	var game = null;
	var visible = false;

	// Inner UI elements
	var closeBtn = alchemy.selectElement("#detallesCerrar", panel);
	var titleLabel = alchemy.selectElement("#detallesTitulo", panel);
	var descLabel = alchemy.selectElement("#detallesSinopsis", panel);
	var platformLabel = alchemy.selectElement("#detallesPlataforma", panel);
	var gamePicture = alchemy.selectElement("#detallesImagen", panel);
	var ageImage = alchemy.selectElement("#detallesEdad", panel);
	var genreLabel = alchemy.selectElement("#detallesGenero", panel);
	var descLabel = alchemy.selectElement("#detallesSinopsis", panel);
	var parentalAdvisory = alchemy.selectElement("#detallesContenidos", panel);
	var skillList = alchemy.selectElement("#detallesHabilidades", panel);
	var gameStatsContainer = alchemy.selectElement("#detallesFicha", panel);
	var gameSiteContainer = alchemy.selectElement("#detallesSite", panel);

	panel.getVisible = function () { return visible; }
	panel.setVisible = function (value) {
		// Show/Hide dropdown lists, to prevent an IE bug
		var selects = document.getElementsByTagName("select");
		for (var i = 0; i < selects.length; i++) {
			selects[i].style.display = value ? "none" : "inline";
		}
		
		visible = value;
		panel.style.display = value ? "block" : "none";
	}

	panel.getGame = function () { return game; }
	panel.setGame = function (value) {
		game = value;

		titleLabel.innerHTML = noms[game[JOC]];
		platformLabel.innerHTML = plas[game[PLATAFORMA]];
		descLabel.innerHTML = game[DESCRIPCIO].replace(/\n/g,'<br>');	
		
		var gameCode = noms[game[JOC]].toLowerCase().replace(" ", "_");
		gameCode = gameCode.replace(/[^a-z0-9]/g, "") + "-" + plas[game[PLATAFORMA]].toLowerCase();
		gamePicture.src = "img/img_buscador/" + gameCode + ".jpg";
		
		ageImage.src = "img/ico_" + edas[game[EDAT]] + ".gif";
		genreLabel.innerHTML = gens[game[GENERE]];
		
		// Controversial content types
		var contentTypes = game[CONTINGUTS];
		alchemy.clear(parentalAdvisory);

		if (contentTypes.length == 0) {
			parentalAdvisory.innerHTML = "Nenhum.";
		}
		else {			
			for (var i = 0; i < contentTypes.length; i++) {
				var warning = document.createElement("img");
				warning.className = "avisoContenido";
				warning.src = "img/ico_" + warningIcons[contentTypes[i]] + ".gif"; // TODO
				warning.title = cons[contentTypes[i]].substr(4);
				parentalAdvisory.appendChild(warning);
			}
		}

		// Involved skills
		var skills = game[HABILITATS];
		alchemy.clear(skillList);

		for (var i = 0; i < skills.length; i++) {
			var skillItem = document.createElement("li");
			skillItem.innerHTML = habs[skills[i]];
			skillList.appendChild(skillItem);
		}

		// Game stats page
		if (game[STATSPAGE]) {
			gameStatsContainer.innerHTML = "<a href='" + game[STATSPAGE] + "'>Ver ficha</a>";
			gameStatsContainer.style.display = "block";
		}
		else {
			gameStatsContainer.style.display = "none";
		}

		// Game site
		if (game[SITE]) {
			gameSiteContainer.innerHTML = "<a href='" + game[SITE] + "' target='_blank'>Ir ao site</a>";
			gameSiteContainer.style.display = "block";
		}
		else {
			gameSiteContainer.style.display = "none";
		}	
	}
	
	closeBtn.onclick = function (value) {
		panel.setVisible(false);
	}
}

alchemy.bind("#detalles", DetailsPanel);

/* Results panel
-----------------------------------------------------------------------------------*/
function ResultsPanel(panel) {

	panel.setGames = function (games, hasCriteria) {
		
		if (!hasCriteria) {
			this.innerHTML = "Introduza um ou mais critérios de procura.";
		}
		else if (games.length == 0) {
			this.innerHTML = "Não se encontrou nenhum jogo que coincida com os critérios indicados.";
		}
		else {
			this.clear();
			this.innerHTML = "Encontraram-se " + games.length + " jogos que coincidem com os critérios indicados.<hr size='1'>";
			for (var i = 0; i < games.length; i++) {
				this.addGame(games[i]);
			}
		}
	}

	panel.clear = function () {
		alchemy.clear(this);
	}

	panel.addGame = function (game) {
		
		var title = noms[game[JOC]];
		var platform = plas[game[PLATAFORMA]];
		
		var entry = document.createElement("div");
		entry.className = "resultado";
		entry.innerHTML = "<strong>" + title + "</strong> - " + platform;
		this.appendChild(entry);

		entry.onclick = function () {
			
			var detailsPanel = document.getElementById("detalles");
			detailsPanel.setGame(game);
			detailsPanel.setVisible(true);
		}
	}
}
alchemy.bind("#resultadosCuerpo", ResultsPanel);
