/************************************************************************************
@ Author : Nicolas Castelli
@ Mail : nicolas.castelli2@gmail.com
@ Date of creation : 2008-01-01
@ Filename : myComboBox.js
@ Use : Javascript pour la gestion des combo box personnalisées 				
************************************************************************************/

/*****************************************************************************/
/****************************  |MY COMBO BOX|  *******************************/
/*****************************************************************************/

/****************************    |COMBO BOX|   *******************************/
// * Classe  : ComboBox
// * Utilité : Pour créer une combo-box à partir d'une liste de valeurs
ComboBox = function(idElt) {
	//**** VARIABLES PRIVÉES
	var id = idElt;
	//**** VARIABLES PUBLIQUE



	//**** FONCTIONS PRIVÉES
	//Vide un select de ces options, sauf la première
	var reset = function() {
		var size = $(id).options.length;
		for(i=0; i < size; i++)
		{
			$(id).remove(size-i);
		}
	}

	//Ajoute une option à un select, à la suite des options existantes
	var addOption = function(idOpt, valOpt) {
	 var newOpt = new Option(valOpt, idOpt);
	 var size = $(id).options.length;
	 $(id).options[size] = newOpt;
	}


	//**** FONCTIONS PUBLIQUES
	this.getId =  function() { return id; }

	//Construit une combo-box à partir du tableau de valeurs arr
	this.construct = function(arr) {
		//On vide la combo-box
		reset();
		if(arr)
		{
			for(var i=0; i < arr.length; i++)
			{
				var set = arr[i];
				addOption(set.id, set.nom);
			}
		}
	}

//Fin de la classe ComboBox
}

/****************************  |MY COMBO BOX|  *******************************/
// * Classe  : MyComboBox
// * Utilité : simule le comportement d'une combo box personnalisable
// * Combo box maison :
// * Une div englobe la combo box et désigne donc le périmètre de celle-ci :
// * - 1)On clique sur la flèche (ou sur la valeur), la liste de valeurs apparaît.
// * - 2)On choisit une valeur : on survole les valeurs, la valeur en cours change de couleur.
// * - 3)On sélectionne une valeur : la valeur choisie change, la liste de valeur disparaît.
// * - Si la liste de valeurs est affichée :
// * 	- on clique sur la div, cela la cache
// * 	- on clique dedans, etape 3
MyComboBox = function(idCB) {
	//**** VARIABLES PRIVÉES
	var id = idCB;
	//Element de la combo box affichant la valeur sélectionnée
	var selectedValue = "";
	//Element de la combo box contenant la liste de valeur
	var listOfValues = "";

	//**** VARIABLES PUBLIQUE


	//**** FONCTIONS PRIVÉES


	//**** FONCTIONS PUBLIQUES
	this.init = function() {
		//Déclaration des composants de la combo box
		selectedValue = new MyCBElt(id + "_Selected");
		listOfValues = new MyCBElt(id + "_List");
		//On initialise la liste
		listOfValues.initList();
		//On place une fonction pour ouvrir la combo box
		selectedValue.openComboBox(id + "_List");
	}

//Fin de la classe MyComboBox
}

/****************************    |MY CBELT|    *******************************/
// * Classe  : MyCBElt
// * Utilité : définit les elements d'une combo box, à savoir pour l'affichage de la valeur
// choisie, et la liste de valeurs
MyCBElt = function(eltId) {
	//**** VARIABLES PRIVÉES
	var id = eltId;
  //**** VARIABLES PUBLIQUE


	//**** FONCTIONS PRIVÉES
	//Afficher la liste de valeur
	var showList = function(eltId) {
		showListIE(eltId); //Pour pallier à un bug IE
		//Fonctionnement normal
		( $(eltId).className == "open")? $(eltId).className	 = "close" : $(eltId).className	 = "open";
	}

	//Pour résoudre un bug IE, qui considère les select comme des fenetres
	//indépendantes, et qui donc empêche l'attribut CSS Z-index de fonctionner correctement !!!
	var showListIE = function(id) {
		var browser = new Browser();
		if ((id == "SVPow_List" || id == "SOPow_List") && browser.getNavigator() == "Internet Explorer" && $("DECK_TO_LOAD"))
		{
			if($("DECK_TO_LOAD").className == "hidden")
				$("DECK_TO_LOAD").className = "showed";
			else
				$("DECK_TO_LOAD").className = "hidden";
		}
	}

	//**** FONCTIONS PUBLIQUES

	//Pour définir la fonction d'ouverture combo box
	this.openComboBox = function(eltId) {
		$(id).onclick = function() { showList(eltId); };
	}

	//Fixe les fonctions des items de la liste de valeur
	this.initList = function() {
		var list = $(id).getElementsByTagName("li");
		for(var i = 0; i < list.length; i++)
		{
			var item = new MyCBItem(list[i].id);
			item.init();
		}
	}

//Fin de la classe MyCBElt

}

/****************************    |MY CB ITEM|  *******************************/
// * Classe  : MyCBItem
// * Utilité : définit les items de la liste de valeurs d'une combo box
// Les composants de la liste de valeurs ont 2 fonctions :
// - quand on les survole, on change leur style pour mettre la valeur survolée en
//  exergue
// - quand on clique dessus, on change la valeur de la liste
MyCBItem = function(idLI) {
	//**** VARIABLES PRIVÉES
	var id = idLI;
	//**** VARIABLES PUBLIQUES
	//**** FONCTIONS PRIVÉES

  //Survol à la souris des élements de la liste
	var mouseOver = function() {
		var childs = $(id).parentNode.getElementsByTagName("li");
		var i=0;
		for(i=0; i < childs.length; i++)
	  {
	  	if(childs[i].className == "selected")
	  		childs[i].className = '';
	  }
	  $(idLI).className = "selected";
	}


	//Sélection d'un élements de la liste
	var select = function() {
		selectIE();
		var idVal = id.split("_")[0] + "_Selected_Val";
		var idList = id.split("_")[0] + "_List";
		$(idVal).innerHTML = $(id).innerHTML;
		$(idList).className	 = "close";
	}

	//Pour résoudre un bug IE, qui considère les select comme des fenetres
	//indépendantes, et qui donc empêche l'attribut CSS Z-index de fonctionner correctement !!!
	var selectIE  = function() {
		//To solve an IE bug : combobox always on top, so, when I must hide it!!!
		var browser = new Browser();
		if ((id.search("SVPow_List") != -1 || id.search("SOPow_List") != -1 ) && browser.getNavigator() == "Internet Explorer" && $("DECK_TO_LOAD"))
			$("DECK_TO_LOAD").className = "showed";
	}

	//**** FONCTIONS PUBLIQUES
	this.init = function() {
		$(id).onmouseover = function() { mouseOver(); }
		$(id).onclick = function() { select(); }
	}

//Fin de la classe MyCBItem
}

/*********************************************************************************/