/*****************************************************************************
'*                                                                           *
'* Fichier     : scripts/jsLib.js                                            *
'* Application : Portail                                                     *
'* Société     : DoubleTrade                                                 *
'* Copyright   : (c) 2007 DoubleTrade                                        *
'* Auteur      : Sébastien Nussbaumer                                        *
'* Créé le     : 12 novembre 2002                                            *
'* Date Modif  : Raison Modif                                                *
'*                                                                           *
'* Description :                                                             *
'* Ce fichier javascript procure quelques fonctions de manipulations courantes
'* des objets de formulaire                                                  *
'*                                                                           *
'****************************************************************************/

var C_SortNone = 0;
var C_SortAsc  = 1;
var C_SortDesc = 2;

var C_LstSeparator = ";";

// Fonctions sur les objets Select

// Fonction de tri d'une liste de type <select>
// Le premier argument est une référence à l'objet select
// Le deuxième argument est le type de tri (C_SortNone, C_SortAsc ou C_SortDesc)
// par défaut le tri est un tri ascendant (C_SortAsc)
// Les arguments suivants représentent les attrributs supplémentaires à copier
function select_Sort(pFullLst) {
	var sortType = (arguments.length >= 2 ? arguments[1] : C_SortAsc);
	if (sortType != C_SortNone) {
		var o = new Array();
		var idx = 0;
		var j = 0;
		for (var i=0; i<pFullLst.options.length; i++) {
			idx = o.length;
			o[idx] = new Option( pFullLst.options[i].text,
			                          pFullLst.options[i].value, 
			                          pFullLst.options[i].defaultSelected, 
			                          pFullLst.options[i].selected );
			if (arguments.length >= 2) {
				for(j = 2; j < arguments.length; j++) {
					o[idx].setAttribute(arguments[j], pFullLst.options[i].getAttribute(arguments[j]));
				}
			}
		}
		if (sortType == C_SortAsc) {	// tri ascendant
			o = o.sort( 
				function(a,b) { 
					if ((a.text+"").toLowerCase() < (b.text+"").toLowerCase()) { return -1; }
					if ((a.text+"").toLowerCase() > (b.text+"").toLowerCase()) { return 1; }
					return 0;
					} 
				);
		}
		else {							// tri descendant
			o = o.sort( 
				function(a,b) { 
					if ((a.text+"").toLowerCase() < (b.text+"").toLowerCase()) { return 1; }
					if ((a.text+"").toLowerCase() > (b.text+"").toLowerCase()) { return -1; }
					return 0;
					} 
				);
		}
		for (var i=0; i<o.length; i++) {
			pFullLst.options[i] = new Option(o[i].text, 
			                                 o[i].value, 
			                                 o[i].defaultSelected, 
			                                 o[i].selected);
			if (arguments.length >= 2) {
				for(j = 2; j < arguments.length; j++) {
					pFullLst.options[i].setAttribute(arguments[j], o[i].getAttribute(arguments[j]));
				}
			}
		}
	}
}

// La fonction select_moveItem prend tous les éléments sélectionnés
// dans la liste pLstFrom et les mets dans pLstTo
// Il y a la possibilité de spécifier un troisème paramètre
// qui serait en fait le type de tri effectuer (cf. select_Sort)
function select_moveItems(pLstFrom, pLstTo) {
	for(var x = pLstFrom.length-1; x >= 0; x--)	{
		if(pLstFrom.options[x].selected) {
			with(pLstTo) {
				options[options.length] = new Option(pLstFrom.options[x].text,
													 pLstFrom.options[x].value);
			}
			pLstFrom.options[x] = null;
		}
	}
	if (arguments.length >= 3) {
		select_Sort(pLstFrom, arguments[2]);
		select_Sort(pLstTo, arguments[2]);
	}
	else {
		select_Sort(pLstFrom);
		select_Sort(pLstTo);
	}
}

// La fonction select_copyItems prend tous les éléments sélectionnés
// dans la liste pLstFrom et les mets dans pLstTo
// Par défaut si une option de même valeur existe déjà dans pLstTo
// elle n'est pas réajoutée. Le troisième argument permet de forcer
// l'ajout.
// Il y a la possibilité de spécifier un quatrième paramètre
// qui serait en fait le type de tri effectuer (cf. select_Sort)
// Synopsys : select_copyItems(pLstFrom, pLstTo, [forceCopy], [SortOrder])
function select_copyItems(pLstFrom, pLstTo) {
	var forceCopy = false;
	if (arguments.length >= 3) {
		forceCopy = arguments[2];
	}
	for (var x=0; x<pLstFrom.length; x++) {
		if (pLstFrom.options[x].selected) {
			if ( (!select_ItemExists(pLstTo, pLstFrom.options[x].value)) || 
			     (forceCopy == true)) {
				with(pLstTo) {
					options[options.length] = new Option(pLstFrom.options[x].text,
														 pLstFrom.options[x].value);
				}
			}
		}			
	}
	if (arguments.length >= 4) {
		select_Sort(pLstTo, arguments[3]);
	}
	else {
		select_Sort(pLstTo);
	}
}

// La fonction select_ItemExists teste si une option ayant
// pour valeur pVal existe dans le select pLst
function select_ItemExists(pLst, pVal) {
	for (var x=0; x<pLst.length; x++) {
		if (pLst.options[x].value == pVal) {
			return true;
		}
	}
	return false;
}

// La fonction suivante déplace l'option d'indice pIdx de la liste
// pLstFrom vers la liste pLstTo
function select_moveOption(pLstFrom, pLstTo, pIdx) {
	with(pLstTo) {
		options[options.length] = new Option(pLstFrom.options[pIdx].text,
											 pLstFrom.options[pIdx].value);
	}
	pLstFrom.options[pIdx] = null;
}

// select_getItemsAsList renvoie une liste chaine contenant
// les valeurs de tous les éléments présents dans pFullLst
// séparées par le séparateur C_LstSeparator, ou le deuxième argument
// s'il est spécifié
function select_getItemsAsList(pFullLst) {
	var sep = (arguments.length >= 2 ? arguments[1] : C_LstSeparator)
	var str = "";
	for (var i=0; i<pFullLst.options.length; i++) {
		str = str + pFullLst.options[i].value + sep;
	}
	return str;
}

// La fonction select_selectAll sélectionne tous les éléments de la liste
function select_selectAll(pFullLst) {
	select_selectVal(pFullLst,true);
}

// La fonction select_selectNone déselectionne tous les éléments de la liste
function select_selectNone(pFullLst) {
	select_selectVal(pFullLst,false);
}

// La fonction change la valeur de la propriété selected de tous les 
// éléments de la liste pFullLst.
function select_selectVal(pFullLst, pVal) {
	for (var i=0; i<pFullLst.options.length; i++) {
		pFullLst.options[i].selected = pVal;
	}
}

// Vide un objet de type Select
function select_removeAll(pFullLst) {
	while (pFullLst.options.length > 0) {
		pFullLst.options[0] = null;
	}
}

// Supprimer tous les éléments sélectionnés
function select_removeSelected(pFullLst) {
	var i=pFullLst.options.length - 1;
	while (i>=0) {
		if (pFullLst.options[i].selected == true) {
			pFullLst.options[i] = null;
		}
		i--;
	}
}

// Renvoie l'index du premier élément sélectionné d'un select
// Renvoie -1 si aucun élément n'est sélectionné
function select_getFirstSelected(pFullLst) {
	var i = 0;
	while (i<pFullLst.options.length && pFullLst.options[i].selected == false) {
		i++;
	}
	if (i == pFullLst.options.length) {
		return -1;
	}
	else {
		return i;
	}
}

// Cette fonction sélectionne l'élément de valeur pVal
// dans la liste pFullLst
function select_setSelected(pFullLst, pVal) {
	for (var i=0; i<pFullLst.options.length; i++) {
		if (pFullLst.options[i].value == pVal) {
			pFullLst.options[i].selected = true;
		}
		else {
			pFullLst.options[i].selected = false;
		}
	}
}

// Cette fonction sauve une liste dans un champ de formulaire
// sous la forme :
// val1_;txt1__;val2_;txt2__;...__;valn_;txtn__;
function select_Save(pFullLst, pForm, pField) {
	var str = "";
	var sp1 = (arguments.length > 3 ? arguments[3] : "_;");
	var sp2 = (arguments.length > 4 ? arguments[4] : "__;");
	for (var i=0; i<pFullLst.options.length; i++) {
		str += pFullLst.options[i].value + sp1 + pFullLst.options[i].text + sp2;
	}
	document.forms[pForm].elements[pField].value = str;
}

// Cette fonction sauve une liste dans un champ de formulaire
// sous la forme :
// val1_;val2_;..._;valn_;
function select_SaveSimple(pFullLst, pForm, pField) {
	var str = "";
	for (var i=0; i<pFullLst.options.length; i++) {
		str += pFullLst.options[i].value + "_;";
	}
	document.forms[pForm].elements[pField].value = str;
}

function select_moveUpSelected(pFullLst) {
	var i = 0;
	
	while (i < pFullLst.options.length) {
		if ( (i > 0) && (pFullLst.options[i].selected == true) ) {
			var eOption = new Option(pFullLst.options[i].text, pFullLst.options[i].value, pFullLst.options[i].defaultSelected, pFullLst.options[i].selected);
			var eOption2 = new Option(pFullLst.options[i-1].text, pFullLst.options[i-1].value, pFullLst.options[i-1].defaultSelected, pFullLst.options[i-1].selected);
			pFullLst.options[i-1] = eOption;
			pFullLst.options[i] = eOption2;
		}
		i++;
	}
}

function select_moveDownSelected(pFullLst) {
	var i = pFullLst.options.length;
	
	while (i > -1) {
		if ( (i < pFullLst.options.length - 1) && (pFullLst.options[i].selected == true) ) {
			var eOption = new Option(pFullLst.options[i].text, pFullLst.options[i].value, pFullLst.options[i].defaultSelected, pFullLst.options[i].selected);
			var eOption2 = new Option(pFullLst.options[i+1].text, pFullLst.options[i+1].value, pFullLst.options[i+1].defaultSelected, pFullLst.options[i+1].selected);
			pFullLst.options[i+1] = eOption;
			pFullLst.options[i] = eOption2;
		}
		i--;
	}
}
