/************************************************************************************
@ Author : Nicolas Castelli
@ Mail : nicolas.castelli2@gmail.com
@ Date of creation : 2008-01-01
@ Filename : test.js
@ Use : JS pour la définition du filtre des différents outils
Le filtre est un assemblage de composants, qui retournent chacun une valeur
à chaque fois qu'ils sont modifiés.
Il faut avoir la liste des ID de chacun de ces composants.
Définir le comportement de chacun de ces composants.
Récupérer leur valeur.
Il y a plusieurs types de composants :
- les combobox
- les combobox perso
- les groupes d'images
- les champs de texte
- les boutons
************************************************************************************/

/************************************************************************/
/************************    |FILTRE VSCREATOR | ************************/
/************************************************************************/
//Classe pour le filtre du VSCreator
MyFilter_VSCreator = function() {
	//**** VARIABLES PRIVÉES
	var vValue = "";
	//****  Définition des différents composants du filtre  ****//
	//Groupe d'image
	var compImg_Color = new Array("CWHITE", "CRED", "CGREEN", "CUBLUE", "CBLACK", "CCOLORLESS");
	var compImg_Type = new Array("TLAND", "TARTIFACT", "TCREATURE", "TINSTANT", "TSORCERY", "TENCHANTMENT", "TPLANESWALKER", "TTRIBAL");
	var compImg_Rarity = new Array("RCOMMON", "RUNCOMMON", "RRARE", "RMYTHICRARE");
	var compImg_ColorMode = new Array("MGOLD", "MHYBRID" );
	//Combobox
	var compCB_Block = "BLOCK";
	var compCB_Lang = "LANG";
	//Combobox perso
	var compCBP_OCC = "OCCost";//Signe
	var compCBP_VCC = "VCCost";//Valeur
	var compCBP_OPow = "OPow";//Signe
	var compCBP_VPow = "VPow";//Valeur
	var compCBP_OTgh = "OTgh";//Signe
	var compCBP_VTgh = "VTgh";//Valeur
	//Champ texte
	var compTxt_Search = "WORDS";
	//Initialisation des composants
	var fltColor = new MyCompImg();
	var fltType = new MyCompImg();
	var fltRarity = new MyCompImg();
	var fltColorMode = new MyCompImg();
	var fltCC_O = new MyCompCBPerso();
	var fltCC_V = new MyCompCBPerso();
	var fltPow_O = new MyCompCBPerso();
	var fltPow_V = new MyCompCBPerso();
	var fltTgh_O = new MyCompCBPerso();
	var fltTgh_V = new MyCompCBPerso();
	var fltSearch = new MyCompInputTxt();
	var fltLang = new MyCompCB();
	var fltBlock = new MyCompCB();
	//Le filtre qui contiendra la valeur pour le filtrage
	var filter = new MyFilter();
	//*****Autres composants
	//Boutons
	var compBt_Reset = "BT_RESETFILTER";
	var compBt_Search = "BT_SEARCH";

	//**** VARIABLES PUBLIQUES


	//**** FONCTIONS PRIVÉES
	var resetFlt = function() {
		fltColor.reset();
		fltType.reset();
		fltRarity.reset();
		fltColorMode.reset(true);
		//Coût converti
		fltCC_O.reset("&gt;=");
		fltCC_V.reset("0");
		//Force
		fltPow_O.reset("&gt;=");
		fltPow_V.reset("0");
		//Endurance
		fltTgh_O.reset("&gt;=");
		fltTgh_V.reset("0");
		//Recherche textuelle
		fltSearch.reset("");
		filter.setFilterValue("");
	}

	//**** FONCTIONS PUBLIQUES
	this.construct = function(refWorkbook) {
		var tComponents = new Array(fltBlock, fltLang, fltColor, fltColorMode, fltType, fltRarity, fltCC_O, fltCC_V, fltPow_O, fltPow_V, fltTgh_O, fltTgh_V, fltSearch);
		filter.construct(tComponents, refWorkbook);
		//Construction des composants du filtre
		fltColor.construct(compImg_Color, "COLOR", filter);
		fltType.construct(compImg_Type, "TYPE", filter);
		fltRarity.construct(compImg_Rarity, "RARITY", filter);
		//Le choix de mode de recherche par couleur fonctionne comme des boutons radios : un seul choix possible
		fltColorMode.construct(compImg_ColorMode, "COLORMODE", filter, true);
		//Coût converti
		fltCC_O.construct(compCBP_OCC, "O_CC", filter);
		fltCC_V.construct(compCBP_VCC, "V_CC", filter);
		//Force
		fltPow_O.construct(compCBP_OPow, "O_POW", filter);
		fltPow_V.construct(compCBP_VPow, "V_POW", filter);
		//Endurance
		fltTgh_O.construct(compCBP_OTgh, "O_TGH", filter);
		fltTgh_V.construct(compCBP_VTgh, "V_TGH", filter);
		//Recherche textuelle
		fltSearch.construct(compTxt_Search, "SEARCH", filter);
		//Restriction du périmètre
		fltBlock.construct(compCB_Block, "BLOCK", filter, true);
		fltLang.construct(compCB_Lang, "LANG", filter);
		//Activation des différents boutons du filtre
		$(compBt_Reset).onclick = function() { resetFlt(); };
		$(compBt_Search).onclick = function() { filter.setFilterValue("SEARCH"); };
	}

	//Récupérer la valeur du filtre
	this.getValue = function() { return vValue;	}

	/* Remise à zéro du filtre : config. initiale */
	this.resetFlt = function() { resetFlt(); }

}//Fin de la classe MyFilter_VSCreator

/************************************************************************/
/*********************  |COMPOSANT FILTRE : FILTRE| *********************/
/************************************************************************/
//Classe pour le filtre d'application
//Un filtre est un "tableau" de composants qui définissent une valeur globale,
//à un instant t, en fonction des différents actions effectuées sur ces composants.
MyFilter = function() {
	//**** VARIABLES PRIVÉES
	var vValue = "";
	var tComp = new Array();
	var vWbk = "";

	//**** VARIABLES PUBLIQUES

	//**** FONCTIONS PRIVÉES


	//**** FONCTIONS PUBLIQUES
	//Constructeur de classe
	this.construct = function(tComponents, workbook) {
		tComp = tComponents;
		vWbk = workbook;
	}

	//Détermine la valeur actuelle du filtre
	this.setFilterValue = function(trigger) {
		var vComp = "";
		var vCompVal = "";
		for(var i=0; i < tComp.length; i++)
		{
			vComp = tComp[i];
			vComp.getCompValue();
			vCompVal += vComp.getValue() + "#";
		}
		vValue = vCompVal;
		if(trigger == "BLOCK" || trigger == "LANG")
			vWbk.loadSet(vValue);
		else
			vWbk.updateWbk(vValue);
	}

	//Récupérer la valeur du filtre
	this.getValue = function() { return vValue;	}

}//Fin de la classe MyFilter

/************************************************************************/
/****************  |COMPOSANT FILTRE : GROUPE D'IMAGES| *****************/
/************************************************************************/
//Classe pour les groupes d'images du filtre.
//Quand une image du groupe d'image est cliqué, cela change la valeur du
//composant.
MyCompImg = function() {
	//**** VARIABLES PRIVÉES
	var tImgId = "";
	var vValue = "";
	var vType = "";
	var vParent = "";

	//**** VARIABLES PUBLIQUES

	//**** FONCTIONS PRIVÉES

	//Gestion du clic sur une image
	var imgOnClick = function(id, modeBTRadio, myEvent) {
		var elt = new MyElement(id);
		var userEvent = "";
		//********  PARTIE GRAPHIQUE  ********//
		//On vérifie si la touche SHIFT était maintenue durant le clic
		(myEvent)? userEvent = myEvent : userEvent = event;
		//Si oui, seul doit rester actif le paramètre choisi
		if(userEvent.shiftKey == true && modeBTRadio != true)
			shiftPressed(id);
		//Si non, mais que le fonctionnement est celui des boutons radio
		else if(modeBTRadio == true)
			modeRadio(id);
		//Si non, on allume/éteint le paramètre choisi
		else
			elt.switchOnOff();
		//********  PARTIE TECHNIQUE  ********//
		//Le filtre est mis à jour selon les critères choisis
		vParent.setFilterValue(vType);
	}

	//Quand on clique sur une des images en maintenant la touche SHIFT enfoncée,
	//l'application ne doit maintenir active que l'image sélectionnée.
	var shiftPressed = function(id) {
		var elt = "";
		for(var i=0; i < tImgId.length; i++)
		{
			elt = new MyElement(tImgId[i]);
			if(elt.getIsOn()) { elt.switchOff(); }
		}
		elt = new MyElement(id);
		elt.switchOnOff();
	}

	//Fonctionnement en bouton radio : une seule image active à la fois, que l'on
	//peut toutefois déselectionner
	var modeRadio = function(id) {
		var elt = "";
		for(var i=0; i < tImgId.length; i++)
		{
			elt = new MyElement(tImgId[i]);
			if(elt.getIsOn() && id != tImgId[i]) { elt.switchOff(); }
		}
		elt = new MyElement(id);
		elt.switchOnOff();
	}

	//**** FONCTIONS PUBLIQUES
	//Récupérer la valeur du composant
	this.getValue = function() { return vValue;	}

	//Récupérer le type de valeur du composant
	this.getType = function() { return vType;	}

	//Constructeur de classes
	this.construct = function(tElements, vTypeComp, refFilter, modeBTRadio) {
		tImgId = tElements;
		vType =  vTypeComp;
		vParent = refFilter;
		for(var i=0; i < tImgId.length; i++)
		{
			var img = $(tImgId[i]);
			if (globalBrowser.getNavigator() == "Internet Explorer" )
				img.onclick = function() { imgOnClick(this.id, modeBTRadio); } ;
			else
				img.onclick = function(event) { imgOnClick(this.id, modeBTRadio, event); };
		}
	}

	//Déterminer la valeur du composant
	this.getCompValue = function() {
		var elt = "";
		var imgValue = "";
		var compValue = "";
		for(var i=0; i < tImgId.length; i++)
		{
			elt = new MyElement(tImgId[i]);
			imgValue = tImgId[i].substring(1, tImgId[i].length);
			if( elt.getIsOn() )
				compValue += imgValue + ";";
		}
		//On ne récupère pas le dernier caractère, qui est un ";"
		vValue = compValue.substring(0, compValue.length-1);
	}

	//Remet le composant dans son état initial
	this.reset = function(modeBTRadio) {
		var elt = "";
		var end = tImgId.length;
		if(modeBTRadio != true)
		{
			for(var i=0; i < end; i++)
			{
				elt = new MyElement(tImgId[i]);
				elt.switchOn();
			}
		}
	}



}//Fin de la classe MyCompImg

/************************************************************************/
/***********  |COMPOSANT FILTRE : COMBO BOX PERSONNALISEE |  ************/
/************************************************************************/
//Classe pour les groupes de combo box personnalisées
//Quand une combobox voit sa valeur modifiée, cela change la valeur du
//composant.
MyCompCBPerso = function() {
	//**** VARIABLES PRIVÉES
	var vValue = "";
	var vType = "";
	var vParent = "";
	var vId = "";

	//**** VARIABLES PUBLIQUES

	//**** FONCTIONS PRIVÉES
	//Le filtre est mis à jour selon les critères choisis
	var slctOnChange = function() { vParent.setFilterValue(vType); }

	//**** FONCTIONS PUBLIQUES
	//Récupérer la valeur du composant
	this.getValue = function() { return vValue;	}

	//Récupérer le type de valeur du composant
	this.getType = function() { return vType;	}

	//Constructeur de classe
	this.construct = function(id, compType, compParent) {
		vType = compType;
		vParent = compParent;
		vId = "S" + id;
		var comboTmp = new MyComboBox(vId);
		comboTmp.init();
		$(vId + "_List").onclick = function() { slctOnChange(); }
	}

	//Déterminer la valeur du composant
	this.getCompValue = function() {
		var idSelected = vId.split("_")[0] + "_Selected_Val";
		var value = $(idSelected).innerHTML;
		vValue = value.trim();
	}

	this.reset = function(value) {
		var idSelected = vId.split("_")[0] + "_Selected_Val";
		$(idSelected).innerHTML = value;
		vValue = value;
	}

}//Fin de la classe MyCompCBPerso



/************************************************************************/
/******************  |COMPOSANT FILTRE : CHAMP TEXTE |  *****************/
/************************************************************************/
//Classe pour les champs de saisie textuelle
MyCompInputTxt = function() {
	//**** VARIABLES PRIVÉES
	var vValue = "";
	var vType = "";
	var vParent = "";
	var vId = "";

	//**** VARIABLES PUBLIQUES


	//**** FONCTIONS PRIVÉES
	//Initialisation du composant pour la RECHERCHE TEXTUELLE
	//Quand la touche Entrée est pressée, il faut lancer une mise à jour
	//du filtre.
	var inputOnKeyPress = function(evt) {
		var keyCode = null;
		(evt.which) ? keyCode = evt.which : keyCode = evt.keyCode;
		//Si ce n'est pas "Entrée" (num = 13) et que le texte n'est pas
		//au bon format, on ne fait rien
		if(keyCode == 13 && isGoodForSearch())
			vParent.setFilterValue(vType);
	}

	//Dédiée à la RECHERCHE TEXTUELLE, cette fonction permet de savoir
	//s'il faut ou non mettre à jour le filtre avec le texte saisi
	var isGoodForSearch = function() {
		var textVal = $(vId).value;
		var reg = new RegExp(/[^_;\' a-z0-9\274\275\276\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\330\331\332\333\334\335\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\370\371\372\373\374\375\377]/gi);
		var isOK = false;
		if( (textVal.length > 2 && !reg.test(textVal)) || (textVal == "") )
			isOK = true;
		else
			alert("Search string incorrect ! At least 3 characters and not special characters expect ', - or ;");
		return isOK;
	}

	//**** FONCTIONS PUBLIQUES
	//Récupérer la valeur du composant
	this.getValue = function() { return vValue;	}

	//Récupérer le type de valeur du composant
	this.getType = function() { return vType;	}

	//Constructeur de classe
	this.construct = function(id, compType, compParent) {
		vType = compType;
		vParent = compParent;
		vId = id;
		if (globalBrowser.getNavigator() == "Internet Explorer" )
			$(vId).onkeypress = function() { inputOnKeyPress(event); } ;
		else
			$(vId).onkeypress = function(event) { inputOnKeyPress(event); };
	}

	this.reset = function(val) { $(vId).value = val; vValue = val;	}

	//Déterminer la valeur du composant
	this.getCompValue = function() {
		var value = $(vId).value;
		vValue = value;
	}


}//Fin de la classe MyCompInputTxt

/************************************************************************/
/*******************  |COMPOSANT FILTRE : COMBO BOX |  ******************/
/************************************************************************/
//Classe pour les groupes de combo box
//Quand une combobox voit sa valeur modifiée, cela change la valeur du
//composant.
MyCompCB = function() {
	//**** VARIABLES PRIVÉES
	var vValue = "";
	var vType = "";
	var vParent = "";
	var vId = "";

	//**** VARIABLES PUBLIQUES

	//**** FONCTIONS PRIVÉES
	//Existe-t-il une traduction pour le set ?
	var isTraduced = function(val) {
		var arrTest = setLocalization.split(";");
		for(var i=0; i < arrTest.length; i++)
		{
			var el = arrTest[i];
			if(el == val) { return true; }
		}
		return false;
	}


	//Le filtre est mis à jour selon les critères choisis
	var slctOnChange = function(val, special) {
		if(special == true)
		{
			if(isTraduced(val))
				$("fTBar2Lang").className = "slct";
			else
			{
				$("fTBar2Lang").className = "slct hidden";
				$("LANG").selectedIndex = 0;
				vValue = "EN";
			}
		}
		vParent.setFilterValue(vType);
	}

	//**** FONCTIONS PUBLIQUES
	//Récupérer la valeur du composant
	this.getValue = function() { return vValue;	}

	//Récupérer le type de valeur du composant
	this.getType = function() { return vType;	}

	//Constructeur de classe
	this.construct = function(id, compType, compParent, special) {
		vType = compType;
		vParent = compParent;
		vId = id;
		$(vId).onchange = function() { slctOnChange(this.value, special); }
	}

	//Déterminer la valeur du composant
	this.getCompValue = function() { vValue = $(vId).value; }

}//Fin de la classe MyCompCB
