// Classe d'objets BASCULE

// Le tableau de toutes les valeurs possible doit etre déclaré avant le constructeur

// var dataArray = new Array( );
//		dataArray[dataArray.length] = {_value:"10", _text:"libelle 10"};
//		...
//		dataArray[dataArray.length] = {_value:"25", _text:"libelle 25"};

// la classe est initialisee par le methode Bascule :
// 		b = new Bascule('list1','list2','textfield','B1','B1T','B2','B2T',dataArray);
// 			'list1','list2' 	:	2 listes gauche et droite
// 			'textfield'     	:	Champ cache qui initialise et recupere les valeurs des options choisie
//			'B1'             	:	Nom du Bouton selection individuelle
//			'B1T'             	:	Nom du Bouton selection de toutes les options
//			'B2'             	:	Nom du Bouton déselection individuelle
//			'B2T'             	:	Nom du Bouton déselection de toutes les options
//			dataArray        	:	Tableau des valeurs possibles (hash _value/_text)

// ATTENTION :
//	. Si un bouton RESET est dans le formulaire ne pas oublier de lui rajouter les methodes :
// 		onclick="objetbascule1.InitialiserListes();objetbascule2.InitialiserListes();..."
//		autant de fois que d'objets bascules présents dans le formulaire
//  . La fonction MM_findObj(n, d) est obligatoire pour que la classe puisse fonctionner

function move(sens) {
	if (sens=="S") {
		fbox = this.objListeGauche;
		tbox = this.objListeDroite		
	} else {
		fbox = this.objListeDroite		
		tbox = this.objListeGauche;
	}
	// Si on inverse le sens de selection alors on efface la selection cible
	if (this.derniereaction != sens) {
		for(var i=0; i<tbox.options.length; i++) tbox.options[i].selected = false;
	}
	for(var i=0; i<fbox.options.length; i++) {
		if(fbox.options[i].selected && fbox.options[i].value != "") {
			var no = new Option();
			no.value    = fbox.options[i].value;
			no.text     = fbox.options[i].text;
			no.selected = fbox.options[i].selected;
			tbox.options[tbox.options.length] = no;
			fbox.options[i].value = "";
			fbox.options[i].text = "";
	   }
	}
	this.BumpUp(fbox);
	if (this.sortitems) this.SortD(tbox);
	this.ActiverBoutons();
}

function moveall(fbox,tbox) {
	for(var i=0; i<fbox.options.length; i++) {
		if(fbox.options[i].value != "") {
			var no = new Option();
			no.value = fbox.options[i].value;
			no.text = fbox.options[i].text;
			no.selected = true;
			tbox.options[tbox.options.length] = no;
	   }
	}
	fbox.options.length = 0;
	this.ActiverBoutons();

}


// Tasser les éléments de la liste source
function BumpUp(box)  {
	for(var i=0; i<box.options.length; i++) {
		if(box.options[i].value == "")  {
			for(var j=i; j<box.options.length-1; j++)  {
				box.options[j].value = box.options[j+1].value;
				box.options[j].text = box.options[j+1].text;
			}
			var ln = i;
			break;
	   }
	}
	if(ln < box.options.length)  {
		box.options.length -= 1;
		this.BumpUp(box);
	}

	// on selectionne l'avant dernier element de la liste source si
	// le dernier vient d'etre basculé
	if (box.options.length>0) {
		var sauveselection = -1;
		for(var i=0; i<box.options.length; i++) {
			if(box.options[i].selected && sauveselection==-1) sauveselection = i;
			box.options[i].selected = false;
		}
		if (sauveselection==-1) {
			box.options[box.options.length-1].selected = true;
		} else {
			box.options[sauveselection].selected = true;
		}
	}
}

// trier les valeurs de la liste Box
function SortD(box)  {
	var temp_opts = new Array();
	var temp = new Object();
	for(var i=0; i<box.options.length; i++)  {
		temp_opts[i] = box.options[i];
	}
	for(var x=0; x<temp_opts.length-1; x++)  {
		for(var y=(x+1); y<temp_opts.length; y++)  {
			if(temp_opts[x].text > temp_opts[y].text)  {
				// permutter les libellés
				temp = temp_opts[x].text;
				temp_opts[x].text = temp_opts[y].text;
				temp_opts[y].text = temp;
				// et les valeurs
				temp = temp_opts[x].value;
				temp_opts[x].value = temp_opts[y].value;
				temp_opts[y].value = temp;
				// et les selections
				temp = temp_opts[x].selected;
				temp_opts[x].selected = temp_opts[y].selected;
				temp_opts[y].selected = temp;


			}
		}
	}
	for(var i=0; i<box.options.length; i++)  {
		box.options[i].value = temp_opts[i].value;
		box.options[i].text = temp_opts[i].text;
	}
}

function SaugevarderSelection() {
	box = this.objListeDroite;
	var chaineselection = '';
	for(var i=0; i<box.options.length; i++) {
		if( box.options[i].value != "") {
			if (chaineselection != "") chaineselection = chaineselection + ",";
			chaineselection = chaineselection + box.options[i].value
		}
	}
	if (this.objChampDonnees) this.objChampDonnees.value = chaineselection;
}

function ActiverBoutons() {
	// pour les 4 boutons si ils existent
	desactive = (this.objListeGauche.length==0 || this.objListeGauche.disabled );
	if (this.obj_btnselection)       this.obj_btnselection.disabled       = desactive;
	if (this.obj_btntoutselection)   this.obj_btntoutselection.disabled   = desactive;

	desactive = (this.objListeDroite.length==0 || this.objListeDroite.disabled);
	if (this.obj_btndeselection)     this.obj_btndeselection.disabled     = desactive;
	if (this.obj_btntoutdeselection) this.obj_btntoutdeselection.disabled = desactive;
}

function Selectionner() {
	this.move("S");
	this.SaugevarderSelection();
	this.derniereaction = "S";
};

function SelectionnerTout() {
	this.moveall(this.objListeGauche,this.objListeDroite);
	this.SaugevarderSelection();
	this.derniereaction = "S";
};

function Deselectionner() {
	this.move("D");
	this.SaugevarderSelection();
	this.derniereaction = "D";
};

function DeselectionnerTout() {
	this.moveall(this.objListeDroite,this.objListeGauche);
	this.SaugevarderSelection();
	this.derniereaction = "D";
};

function InitialiserListes() {
	// initialisation des 2 champs en fonction de la valeur de "ChampDonnees"
	var chainedonnees = this.sauvegardeDonnees;
	var tabValeursDroites = chainedonnees.split(",");

	// initialisation de la taille des 2 listes
	this.objListeGauche.length = this.tableautotal.length;
	this.objListeDroite.length = this.tableautotal.length;
	var g=0
	var d=0;
	var nbreselectionnes = 0;
	for(var i=0; i<this.tableautotal.length; i++)  {
		// balayage de la table des selectionnes
		valeurselectionnee = false;
		for(var j=0; j<tabValeursDroites.length; j++)  {
			if (tabValeursDroites[j]==this.tableautotal[i]._value) {
				valeurselectionnee = true;
				nbreselectionnes++;
				break;
			}
		}
		if (valeurselectionnee) {
			this.objListeDroite[d].value = this.tableautotal[i]._value;
			this.objListeDroite[d].text  = this.tableautotal[i]._text;
			this.objListeDroite[d].selected = false;
			d++;

		} else {
			this.objListeGauche[g].value = this.tableautotal[i]._value;
			this.objListeGauche[g].text  = this.tableautotal[i]._text;
			this.objListeGauche[g].selected = false;
			g++;			
		}
	}
	this.objListeGauche.length = this.tableautotal.length - nbreselectionnes;
	this.objListeDroite.length = nbreselectionnes;
	this.ActiverBoutons();
//	alert("raz avec = "+this.sauvegardeDonnees);
};



function Bascule(ListeGauche, ListeDroite, ChampDonnees, btnselection, btntoutselection, btndeselection, btntoutdeselection, sortitems, tableautotal) {	
	this.objListeGauche         = MM_findObj(ListeGauche);
	this.objListeDroite         = MM_findObj(ListeDroite);
	this.objChampDonnees        = MM_findObj(ChampDonnees);
	this.obj_btnselection       = MM_findObj(btnselection);
	this.obj_btntoutselection   = MM_findObj(btntoutselection);
	this.obj_btndeselection     = MM_findObj(btndeselection); 
	this.obj_btntoutdeselection = MM_findObj(btntoutdeselection);
	this.sauvegardeDonnees = this.objChampDonnees.value;
	this.derniereaction  = "";
	this.sortitems = sortitems;  // Automatically sort items within lists? (1 or 0)
	this.tableautotal = tableautotal;
	this.InitialiserListes();	
};

// Fonctions initales
Bascule.prototype.move      = move;
Bascule.prototype.moveall   = moveall;
Bascule.prototype.BumpUp    = BumpUp;
Bascule.prototype.SortD     = SortD;
Bascule.prototype.ActiverBoutons = ActiverBoutons;


Bascule.prototype.Selectionner         = Selectionner;
Bascule.prototype.Deselectionner       = Deselectionner;
Bascule.prototype.SelectionnerTout     = SelectionnerTout;
Bascule.prototype.DeselectionnerTout   = DeselectionnerTout;
Bascule.prototype.SaugevarderSelection = SaugevarderSelection;
Bascule.prototype.InitialiserListes    = InitialiserListes;



