//Créateur : Philippe FOGUENNE.
//Dernière modification le 24/03/2004.

/* Fonctions présentes dans ce fichier:
   selectAllOptions(s)
   unselectAllOptions(s)
   deleteOptions(s)
   copyOptions(s1, s2 [,boolTrim])
   moveOptions(s1, s2 [,boolTrim])
   moveOptionUp(s [, boolMoveOptionValue] [, boolMoveOptionClass])
   moveOptionDown(s [, boolMoveOptionValue] [, boolMoveOptionClass])
   countUncopiedOptions(s1, s2)
   selectSameOptions(s1, s2) */


// -------------------------------------
// selectAllOptions(s)
// -------------------------------------
// Fonction : sélectionne tous les éléments d'une liste à sélection multiple.
// Entrée : s = la liste à sélection multiple

function selectAllOptions(s) {
	var currentIndex = s.selectedIndex;
	if (currentIndex == -1) { currentIndex = 0; }

	for (i = 0; i < s.options.length; i++) { s.options[i].selected = true; }

	if (s.options.length > 0) { s.options[currentIndex].selected = true; } //Positionne le focus sur l'élément précédemment sélectionné.

	return true;
}


// -------------------------------------
// unselectAllOptions(s)
// -------------------------------------
// Fonction : désélectionne tous les éléments d'une liste à sélection multiple.
// Entrée : s = la liste à sélection multiple

function unselectAllOptions(s) {
	var currentIndex = s.selectedIndex;
	if (currentIndex == -1) { currentIndex = 0; }

	s.selectedIndex = s.options.length-1; //Positionne le focus sur le dernier élément.
	s.selectedIndex = currentIndex; //Positionne le focus sur l'élément précédemment sélectionné.
	s.selectedIndex = -1;

	return true;
}


// -------------------------------------
// deleteOptions(s)
// -------------------------------------
// Fonction : supprime les éléments sélectionnés d'une liste à sélection multiple.
// Entrée : s = la liste à sélection multiple

function deleteOptions(s) {
	for (i = s.options.length - 1; i >= 0; i--) {
		if (s.options[i].selected == true) { s.options[i] = null; }
	}

	if (s.options.length > 0) {
		s.selectedIndex = 0;
		s.selectedIndex = -1;
	}

	return true;
}

// -------------------------------------
// emptyList(s)
// -------------------------------------
// Fonction : supprime tout les éléments d'une liste.
// Entrée : s = la liste

function emptyList(s) {
	for (i = s.options.length - 1; i >= 0; i--) {
		s.options[i] = null;
	}

	if (s.options.length > 0) {
		s.selectedIndex = 0;
		s.selectedIndex = -1;
	}

	return true;
}


// -------------------------------------
// copyOptions(s1, s2 [,boolTrim])
// -------------------------------------
// Fonction : copie (append) les éléments sélectionnés d'une liste sur une autre liste.
// Entrée : s1 = la liste d'origine
//          s2 = la liste de destination
//          [boolTrim] = indique si il faut faire un lTrim sur les éléments copiés dans la liste de destination
//                       valeurs possibles : false (par défaut, pas de trim), true (faire un trim)
// Sortie : le nombre d'éléments ajoutés, un élément déjà présent ne pouvant être ajouté une seconde fois

function copyOptions(s1, s2) {
	var boolExists;
	var nbrAdded = 0;
	s2.selectedIndex = -1; //Tout désélectionner.

	for (i = 0; i < s1.options.length; i++) {
		if (s1.options[i].selected == true) {
			boolExists = false; //Valeur par défaut: l'élément sélectionné n'existe pas dans la liste de destination.

			for (j = 0; j < s2.options.length; j++) {
				if (s1.options[i].value == s2.options[j].value) {
					s2.options[j].selected = true; //Sélectionner les éléments préalablement ajoutés.
					boolExists = true;
				}
			}

			if (!boolExists) { //L'élément ne se trouve pas dans la liste de destination.
				var newValue = s1.options[i].value;
				var newText = s1.options[i].text;

				if (copyOptions.arguments.length > 2 && copyOptions.arguments[2] == true) {
					while (escape(newText.substring(0,1)) == '%A0' || escape(newText.substring(0,1)) == '%20') {
						newText = newText.substring(1, newText.length);
					}
				}

				var newOption = new Option(newText, newValue, true, true);
				s2.options[s2.options.length] = newOption;
				nbrAdded++;
			}
		}
	}

	if (nbrAdded > 0) { s2.options[s2.options.length-1].selected = true; } // Bug connu : sous IE 6.0, le focus ne se fait pas sur le dernier elmt de la liste. Solution : ajouter un alert au dessus de cette ligne.
	return nbrAdded;
}


// -------------------------------------
// moveOptions(s1, s2 [,boolTrim])
// -------------------------------------
// Fonction : déplace les éléments sélectionnés d'une liste vers une autre liste.
// Entrée : s1 = la liste d'origine
//          s2 = la liste de destination
//          [boolTrim] = indique si il faut faire un lTrim sur les éléments déplacés dans la liste de destination
//                       valeurs possibles : false (par défaut, pas de trim), true (faire un trim)
// Sortie : le nombre d'éléments copiés, un élément déjà présent ne pouvant être ajouté une seconde fois

function moveOptions(s1, s2) {
	var nbrAdded;

	if (moveOptions.arguments.length == 2) { //Le champ optionnel [trim] n'est pas spécifié => pas de trim
		nbrAdded = copyOptions(s1, s2, false);
	} else {
		nbrAdded = copyOptions(s1, s2, moveOptions.arguments[2]);
	}

	deleteOptions (s1);
	return nbrAdded;
}


// ---------------------------------------------------------------
// moveOptionUp(s [, boolMoveOptionValue] [, boolMoveOptionClass])
// ---------------------------------------------------------------
// Fonction : permute la première option sélectionnée avec celle qui la précède.
// Entrée : s = la liste à sélection multiple
//          [boolMoveOptionValue] = true (valeur par défaut) : pour déplacer la valeur des options;
//                                  false : pour ne pas déplacer la valeur des options.
//          [boolMoveOptionClass] = true (valeur par défaut) : les options permutées conservent le style qui leur a été appliqué;
//                                  false : les options héritent du style de l'option qui se trouvait en même position précédemment.
// Sortie : true ou false, indique si l'option sélectionnée a changé de position ou non.

function moveOptionUp(s) {
	if (s.selectedIndex > 0) {
		var currentIndex = s.selectedIndex;
		var optionBefore = new Array(s.options[currentIndex - 1].text, s.options[currentIndex - 1].value, s.options[currentIndex - 1].className);
		var optionAfter = new Array(s.options[currentIndex].text, s.options[currentIndex].value, s.options[currentIndex].className);

		if (moveOptionUp.arguments.length > 1 && moveOptionUp.arguments[1] == false) {
			s.options[currentIndex - 1] = new Option(optionAfter[0], optionBefore[1], true, true);
			s.options[currentIndex] = new Option(optionBefore[0], optionAfter[1], true, true);
		} else {
			s.options[currentIndex - 1] = new Option(optionAfter[0], optionAfter[1], true, true);
			s.options[currentIndex] = new Option(optionBefore[0], optionBefore[1], true, true);
		}

		if (moveOptionUp.arguments.length > 2 && moveOptionUp.arguments[2] == false) {
			s.options[currentIndex - 1].className = optionBefore[2];
			s.options[currentIndex].className = optionAfter[2];
		} else {
			s.options[currentIndex - 1].className = optionAfter[2];
			s.options[currentIndex].className = optionBefore[2];
		}

		s.selectedIndex = currentIndex - 1;
		return true;
	}

	return false;
}


// -----------------------------------------------------------------
// moveOptionDown(s [, boolMoveOptionValue] [, boolMoveOptionClass])
// -----------------------------------------------------------------
// Fonction : permute la première option sélectionnée avec celle qui la suit.
// Entrée : s = la liste à sélection multiple
//          [boolMoveOptionValue] = true (valeur par défaut) : pour déplacer la valeur des options;
//                                  false : pour ne pas déplacer la valeur des options.
//          [boolMoveOptionClass] = true (valeur par défaut) : les options permutées conservent le style qui leur a été appliqué;
//                                  false : les options héritent du style de l'option qui se trouvait en même position précédemment.
// Sortie : true ou false, indique si l'option sélectionnée a changé de position ou non.

function moveOptionDown(s) {
	if ((s.selectedIndex < s.options.length - 1) && (s.selectedIndex != -1)) {
		var currentIndex = s.selectedIndex;
		var optionBefore = new Array(s.options[currentIndex].text, s.options[currentIndex].value, s.options[currentIndex].className);
		var optionAfter = new Array(s.options[currentIndex + 1].text, s.options[currentIndex + 1].value, s.options[currentIndex + 1].className);

		if (moveOptionDown.arguments.length > 1 && moveOptionDown.arguments[1] == false) {
			s.options[currentIndex] = new Option(optionAfter[0], optionBefore[1], true, true);
			s.options[currentIndex + 1] = new Option(optionBefore[0], optionAfter[1], true, true);
		} else {
			s.options[currentIndex] = new Option(optionAfter[0], optionAfter[1], true, true);
			s.options[currentIndex + 1] = new Option(optionBefore[0], optionBefore[1], true, true);
		}

		if (moveOptionDown.arguments.length > 2 && moveOptionDown.arguments[2] == false) {
			s.options[currentIndex].className = optionBefore[2];
			s.options[currentIndex + 1].className = optionAfter[2];
		} else {
			s.options[currentIndex].className = optionAfter[2];
			s.options[currentIndex + 1].className = optionBefore[2];
		}

		s.selectedIndex = currentIndex + 1;
		return true;
	}

	return false;
}


// -------------------------------------
// countUncopiedOptions(s1, s2)
// -------------------------------------
// Fonction : retourne le nombre d'options sélectionnées dans s1 qui ne se trouvent pas dans s2.
// Entrée : s1 = liste à sélection multiple d'origine
//          s2 = liste à sélection multiple destination
// Sortie : un nombre naturel égal au nombre d'options sélectionnées dans s1 qui ne se trouvent pas dans s2.

function countUncopiedOptions(s1, s2) {
	var boolExists;
	var nbrUncopied = 0;

	for (var i = 0; i < s1.options.length; i++) {
		if (s1.options[i].selected) {
			boolExists = false; //Valeur par défaut: l'élément sélectionné n'existe pas dans la liste de destination.

			for (var j = 0; j < s2.options.length; j++) {
				if (s1.options[i].value == s2.options[j].value) {
					boolExists = true;
				}
			}

			if (!boolExists) { //L'élément ne se trouve pas dans la liste de destination.
				nbrUncopied++;
			}
		}
	}

	return nbrUncopied;
}


// -------------------------------------
// selectSameOptions(s1, s2)
// -------------------------------------
// Fonction : sélectionne les options de s2 si les options correspondantes de s1 sont sélectionnées.
// Entrée : s1 = liste à sélection multiple d'origine
//          s2 = liste à sélection multiple destination
// Contrainte : s1 et s2 ont le même nombre d'options

function selectSameOptions(s1, s2) {
	var cpt = s1.options.length;
	s2.selectedIndex = -1;

	if (s1.options.length != s2.options.length) {
		return false;
	}

	for (var i=0; i < cpt; i++) {
		if (s1.options[i].selected == true) {
			s2.options[i].selected = true;
		}
	}

	return true;
}