
function checkBrowser(){
	var is_major = parseInt(navigator.appVersion);
	this.ver=navigator.appVersion;
	this.agent=navigator.userAgent;
	this.dom=document.getElementById?1:0;
	this.opera=this.agent.indexOf("Opera")>-1;
	this.ie5=(this.ver.indexOf("MSIE 5")>-1 && this.dom && !this.opera)?1:0;
	this.ie6=(this.ver.indexOf("MSIE 6")>-1 && this.dom && !this.opera)?1:0;
	this.ie4=(document.all && !this.dom && !this.opera)?1:0;
	this.ie=this.ie4||this.ie5||this.ie6;
	this.mac=this.agent.indexOf("Mac")>-1;
	this.ns6=(this.dom && parseInt(this.ver) >= 5) ?1:0;
	this.ie3 = (this.ver.indexOf("MSIE") && (is_major < 4));
	this.hotjava = (this.agent.toLowerCase().indexOf('hotjava') != -1)? 1:0;
	this.ns4=(document.layers && !this.dom && !this.hotjava)?1:0;
	this.bw=(this.ie6 || this.ie5 || this.ie4 || this.ns4 || this.ns6 || this.opera);
	this.ie=(this.ie5 || this.ie4 || this.ie6 || this.mac)
	this.ns=(this.ns4 || this.ns5 || this.ns6)
	return this
}

var cb=new checkBrowser()

/********************************************************************************
Début des scripts
********************************************************************************/

function layerWrite(id,nestref,text) {
	if (cb.ns) {
		var lyr = (nestref)? eval('document.'+nestref+'.document.'+id+'.document') : document.layers[id].document
		lyr.open()
		lyr.write(text)
		lyr.close()
	}
	else if (cb.ie) document.all[id].innerHTML = text
}

/*********************************************************************************************
END script
*********************************************************************************************/

/* function escString(str2escape  as string)
Cette fonction a pour but de remplacer les caractères suivants :
- le ; par \s
- la , par \c
- le \ par \\ */
function escString(str2escape) {
	var strDest;
	strDest=str2escape.toString();
	strDest=strDest.replace(/;/g, "\\s");
	strDest=strDest.replace(/,/g, "\\c");
	strDest=strDest.replace(/\\/g, "\\\\");
	return strDest;
}

/* function unescString(str2escape as string)
Cette fonction a pour but de remplacer les caractères suivants :
- le \s par ;
- la \c par ,
- le \\ par \ */
function unescString(str2escape) {
	var strDest;
	strDest=str2escape.toString();
	strDest=strDest.replace(/\\s/g, ";");
	strDest=strDest.replace(/(\\c)/g, ",");
	strDest=strDest.replace(/\\\\/g, "\\");
	return strDest;
}

function seekWithId(tabRef, id2seek, borne_basse, borne_haute) {
	var mediane;
	var result, cpt;
	result=-1;
	/*if (!borne_basse) {borne_basse=1;}
	if (!borne_haute) {borne_haute=tabRef.length;}*/
	//mediane=borne_basse+Math.floor((borne_haute-borne_basse)/2);
	//if (!confirm(borne_basse +" _ "+ borne_haute)) {return false;}
	//if ((borne_haute-borne_basse)<10||tabRef.needsort) {
		for (cpt=borne_basse; cpt<=borne_haute; cpt++) {
			if (tabRef[cpt].Id==id2seek) {result=cpt; break;}
		}
	/*} else {
		if (tabRef[mediane].Id<id2seek) {
			result=seekWithId(tabRef, id2seek, mediane, borne_haute);
		} else {
			result=seekWithId(tabRef, id2seek, borne_basse, mediane);
		}
	}*/
	return result;
}

function seekWithLib(tabRef, id2seek, borne_basse, borne_haute) {
	var mediane;
	var result, cpt;
	result=-1
	/*if (!borne_basse) {borne_basse=1;}
	if (!borne_haute) {borne_haute=tabRef.length;}*/
	mediane=borne_basse+Math.floor((borne_haute-borne_basse)/2);
	if (mediane<10||tabRef.needsort) {
		for (cpt=borne_basse; cpt<=borne_haute; cpt++) {
			if (tabRef[cpt].Lib==id2seek) {result=cpt; break;}
		}
	} else {
		if (tabRef[mediane].Lib<id2seek) {
			result=seekWithLib(tabRef, id2seek, mediane, borne_haute);
		} else {
			result=seekWithLib(tabRef, id2seek, borne_basse, mediane);
		}
	}
	return result;
}

/**
 * Recherche LINÉAIRE par Id dans une liste
 */
function SeekTab4Id(tabRef, id2seek, toReturn) {
	var cpt;
	cpt=seekWithId(tabRef, id2seek, 1, tabRef.length);
	switch(toReturn) {
		case 0: return (cpt>-1)? tabRef[cpt].Lib : ""; break;
		case 1: return cpt;	break;
		case 2: return (cpt>-1)? tabRef[cpt] : null; break;
	}
	return null;
}

/**
 * Recherche PAR DICHOTOMIE par Lib dans une liste triée
 * je répète : LA LISTE DOIT ÊTRE TRIÉE !!
 */
function SeekTab4Lib(tabRef, lib2seek, toReturn) {
	var cpt;
	cpt=seekWithLib(tabRef, lib2seek, 1, tabRef.length);
	switch(toReturn) {
		case 0: return (cpt>-1)? tabRef[cpt].Lib : ""; break;
		case 1: return cpt;	break;
		case 2: return (cpt>-1)? tabRef[cpt] : null; break;
	}
	return null;
}

/**
 * Recherche LINÉAIRE dans une liste par n'importe quelle propriété
 */
function SeekTab4What(tabRef, sProp, val2seek, toReturn ) {
	if ( typeof (toReturn) == 'undefined' || !toReturn )
		toReturn = 2;
	for ( cpt=1 ; cpt<=tabRef.length ; cpt++ ) {
		if ( eval('tabRef['+cpt+'].'+sProp) == val2seek ) break;
	}
	switch(toReturn) {
		case 0: return (cpt <= tabRef.length)? tabRef[cpt].Lib : ""; break;
		case 1: return (cpt <= tabRef.length)? cpt : -1;	break;
		default: return (cpt <= tabRef.length)? tabRef[cpt] : null; break;
	}
}

/*******************************************
	Début de la zone de déclaration des objest
*******************************************/
function add(object) {
	this.length++;
	this[this.length] = object;
}

function suppr(id2Delete) {
	var i;
	var booFind=false;
	i = SeekTab4Id(this, id2Delete, 1);
	if (i!=-1) {
		cpt=i;
		while (cpt<this.length) {
			this[cpt]=this[cpt+1];
			cpt++;
		}
		delete(this[this.length]);
		this.length--;
		if (this.length<0) this.length=0;
		if (this.formField && this.formField!="") {
			eval(this.formField).remove(i-1);
		}
	}
}

function ClearList(booClearField) {
	var i, osize;
	osize=this.length;
	for (i=osize; i>0; i--) {
		if (this.formField && this.formField!="" && booClearField) {
			eval(this.formField).remove(i-1);
		}
		delete(this[i]);
	}
	this.length=0;
}

function mySort() {
	var tmpObj,cpt,cptFrom;
	var bBouge=true;
	this.sortFrom?cptFrom=this.sortFrom:cptFrom=1;
	if (this.length>0) {
		tmpObj = this[1];
		while (bBouge) {
			bBouge=false;
			for (cpt=(cptFrom+1); cpt<=this.length; cpt++) {
				if (this[cpt].Lib<this[cpt-1].Lib) {
					tmpObj=this[cpt];
					this[cpt]=this[cpt-1];
					this[cpt-1]=tmpObj;
					bBouge=true;
				}
			}
		}
	}
}
function QuickSort() {
	var ListLow, ListHigh, pivot, i, j;
	var cptFrom=0;
	this.sortFrom?cptFrom=this.sortFrom:cptFrom=1;
	if ( this.length > cptFrom ) {
		pivot = this[cptFrom];
		ListLow = new EngListe(null);
		ListHigh = new EngListe(null);
		for ( i=cptFrom ; i<=this.length ; i++ ) {
			if ( this[i] != pivot ) {
				if ( this[i].Lib < pivot.Lib )
					ListLow.add( this[i] );
				else
					ListHigh.add( this[i] );
			}
		}
		ListLow.quickSort();
		ListHigh.quickSort();
		for ( i=cptFrom ; i<=ListLow.length ; i++ ) 
			this[i] = ListLow[i];
		this[i] = pivot;
		for ( j=cptFrom ; j<=ListHigh.length ; j++ )
			this[i+j] = ListHigh[j];
		ListLow.clear();
		ListHigh.clear();
		delete(ListLow);
		delete(ListHigh);
	}
}

function Seek(what2Test, str2Seek, toReturn) {
	var result;
	if (typeof(what2Test)=="undefined" || !what2Test) what2Test = "LIB";
	switch(what2Test) { 
		case "ID" : return SeekTab4Id(this, str2Seek, toReturn); break;
		case "LIB": return SeekTab4Lib(this, str2Seek, toReturn); break;
		default : return SeekTab4What(this, what2Test, str2Seek, toReturn); break;
	}
}

function AfficheListe(strFiltreEtat) {
	var iCount,iPos,j,elmt,theField, booOK;
	if (this.needsort) {this.sort();}
	theField=eval(this.formField);
	iCount = 1; iPos = 0;
	while ( iPos<theField.length && iCount<=this.length ) {
		if ( this[iCount].State != 3 ) {
			booOK=true;
			if (strFiltreEtat && strFiltreEtat!=this[iCount].etat) booOK=false;
			if (booOK) {
				theField.options[iPos].value = this[iCount].Id;
				theField.options[iPos].text = this[iCount].Lib;
				if (this[iCount].engclass=="" && this[iCount].etat) {
					setEngClass(this[iCount], this);
				}
				theField.options[iPos].className=this[iCount].engclass;
				iPos++;
			}
		}
		iCount++;
	}
	for ( j=theField.length-1 ; j>=iPos ; j-- ) {
		theField.remove(j);
	}
	while ( iCount <= this.length ) {
		if ( this[iCount].State != 3 ) {
			if (this[iCount].engclass=="") {
				if (this[iCount].etat) {
					setEngClass(this[iCount], this);
				}
			}
//			alert("this["+iCount+"].engclass " + this[iCount].engclass);
			if (strFiltreEtat) {
				if (strFiltreEtat==this[iCount].etat) this.addoption(iCount, this[iCount].engclass);
			} else {
				this.addoption(iCount, this[iCount].engclass);
			}
			/*elmt = this.engdocument.createElement("OPTION");
			elmt.text = this[iCount].Lib;
			elmt.value = this[iCount].Id;
			if ( this[iCount].engclass != "" ) {
				elmt.className=this[iCount].engclass;
			}
	    try {
	      theField.add(elmt, null); // standards compliant; doesn't work in IE
	    }
	    catch(ex) {
	      theField.add(elmt); // IE only
      }*/
		}
		iCount++;
	}
}

function setEngClass(oObj, oPere) {
	switch (oObj.etat) { 
	   case "-1" : 
	      oObj.engclass=oPere.class_actif;
	      break; 
	   case "0" : 
	      oObj.engclass=oPere.class_actif;
	      break; 
	   case "2" : 
	      oObj.engclass=oPere.class_inactif;
	      break; 
	   case "1" : 
	      oObj.engclass=oPere.class_select;
	      break; 
	   default : 
	      oObj.engclass=oPere.class_actif;
	} 
}

// Objets liste
function EngListe(formField) {
	this.length 			= 0;
	this.formField 		= formField;
	this.needsort 		= true;
	this.sortFrom			= 1;
	this.engdocument 	= document;
	this.add 					= add;
	this.suppr 				= suppr;
	this.update				= Update;
	this.sort 				= mySort;
	this.quickSort 		= QuickSort;
	this.affiche 			= AfficheListe;
	this.addoption 		= addOption;
	this.seek 				= Seek;
	
	this.getpos2insert = function(idxbottom, idxtop, lib2test) {
		if ((idxtop-idxbottom)>1) {
			middle=Math.ceil((idxtop-idxbottom)/2)+idxbottom-1;
			if (middle==idxbottom) middle++;
			if (this[middle].Lib<lib2test) {
				return this.getpos2insert(middle, idxtop, lib2test);
			} else if (this[middle].Lib>lib2test) {
				return this.getpos2insert(idxbottom, middle, lib2test);
			}
		} else {
			if (idxtop<idxbottom) {
				return idxbottom;
			} else {
				if (this[idxbottom].Lib>lib2test) return idxbottom;
				else if (this[idxtop].Lib>lib2test) return idxtop;
				else return idxtop+1;
			}
		}
	}
	
	this.insert 			= Insert;
	
	this.list 				= ListPropByState;
	this.clear 				= ClearList;
	this.allids				= GetAllIDS;
	this.class_actif 	=	"";
	this.class_inactif=	"";
	this.class_select =	"";
	this.currentid		= GetCurrentSelectedID;
	this.currenteng		=	GetCurrentEng;	
	this.getselected  = getSelected;
	return this
}

// une ligne d'un objet liste
function Eng(Id,Lib,State,etat) {
	this.Id = Id;
	this.Lib = Lib;
	this.engclass = "";
	this.State=State?State:0; //peut prendre comme valeur 0 -> rien, 1 -> maj, 2 -> nouveau, 3 -> à supprimer
	etat?this.etat=etat:this.etat = "-1";
	//this.etat = "-1"; //peut prendre comme valeur -1 -> rien, 0 -> actif, 1->sélectionnné, 2->inactif
	return this
}

function GetCurrentSelectedID() {
	var formItem=eval(this.formField);
	return formItem.selectedIndex>-1?this[formItem.selectedIndex+1].Id:0;
}

function GetCurrentEng() {
	var currentSelected; 
	var formItem=eval(this.formField);
	if (formItem.selectedIndex>-1) {
		currentSelected=formItem.selectedIndex+1; 
		return this[currentSelected];
	} else {
		return null;
	}
}

function GetAllIDS() {
	var cpt;
	var res;
	var tmpStr;
	if (this.length>0) {
		res = new String(this[1].Id);
		for (cpt=2; cpt<=this.length; cpt++) {
			tmpStr = new String(this[cpt].Id);
			res=res+","+tmpStr;
		}
	} else {
		res="";
	}
	return res;
}

function getSelected() {
	var cpt, strSelected, Obj;
	strSelected='';
	Obj=eval(this.formField);
	for (cpt=1; cpt<=this.length; cpt++) {
		if (Obj.options[cpt-1].selected) {
			(strSelected!='')?(strSelected+=","+this[cpt].Id):(strSelected=this[cpt].Id);
		}
	}
	return (strSelected);
}

function PushPop(tabOri, tabDest, strId2Push) {
	var index2Push, aTmp, tmpStr = String(strId2Push);
	var cpt;
	tmpStr=tmpStr.replace("/, /g", "");
	/*ajout d'un eng dans tabDest et suppression dans tabOri.
	id2Push représente l'id de l'objet à basculer de tabOri dans tabDest*/
	if (strId2Push!="") {
		aTmp = tmpStr.split(",");
		for (cpt=0; cpt<=aTmp.length; cpt++) {
			index2Push = SeekTab4Id(tabOri, aTmp[cpt], 1);
			if (index2Push!=-1) {
				//ajout dans tabDest
				tabDest.add(new Eng(tabOri[index2Push].Id, tabOri[index2Push].Lib, 0));
				//suppression dans tabOri
				tabOri.suppr(tabOri[index2Push].Id);
			}
		}
		tabDest.affiche();
		tabOri.affiche();
	}
}

function newPushPop(tabOri, tabDest, strId2Push, booNoCreate) {
	var index2Push, aTmp, tmpStr = String(strId2Push);
	var cpt;
	var iCount,elmt;
	tmpStr=tmpStr.replace("/, /g", "");
	/*ajout d'un eng dans tabDest et suppression dans tabOri.
	id2Push représente l'id de l'objet à basculer de tabOri dans tabDest*/
	if (strId2Push!="") {
		aTmp = tmpStr.split(",");
		for (cpt=0; cpt<aTmp.length; cpt++) {
			index2Push = SeekTab4Id(tabOri, aTmp[cpt], 1);
			if (index2Push!=-1) {
				//ajout dans tabDest
				InsertListe(tabOri, tabDest, index2Push, booNoCreate);
				//suppression dans tabOri
				tabOri.suppr(aTmp[cpt]);
				if (tabOri.formField) {
					eval(tabOri.formField).remove(index2Push-1);
				}
			}
		}
		//tabDest.affiche();
		//tabOri.affiche();
	}
}

function InsertListe(tabOri, tabDest, indexOri, booNoCreate) {
	var cpt, cpt2;
	//var tmpObj=new Eng(tabOri[indexOri].Id, tabOri[indexOri].Lib,0);
	var tmpObj=tabOri[indexOri];
	if (tabDest.needsort) {
		if (tabDest.length<1) {
			//tabDest.add(new Eng(tmpObj.Id, tmpObj.Lib, 0));
			tabDest.add(tmpObj);
			if (!booNoCreate) {tabDest.addoption(1);}
		} else {
			boo2Add=false;
			if (tmpObj.Lib>tabDest[tabDest.length].Lib) {
				//tabDest.add(new Eng(tmpObj.Id, tmpObj.Lib, 0));
				tabDest.add(tmpObj);
				if (!booNoCreate) {tabDest.addoption(tabDest.length);}
			} else {
				for (cpt=tabDest.length; cpt>=1; cpt--) {
					if (tabDest[cpt].Lib<tmpObj.Lib)  {
						cpt=cpt+1;
						break;
					}
				}
				if(cpt==0) {cpt=1};
				//tabDest.add(new Eng(tabDest[tabDest.length].Id, tabDest[tabDest.length].Lib, 0));
				tabDest.add(tabDest[tabDest.length]);
				for (cpt2=tabDest.length; cpt2>=cpt; cpt2--) {
					tabDest[cpt2]=tabDest[cpt2-1];
				}
				tabDest[cpt]=tmpObj;
				if (!booNoCreate) {tabDest.addoption(cpt);}
			}
		}
	} else {
		//tabDest.add(new Eng(tmpObj.Id, tmpObj.Lib, 0));
		tabDest.add(tmpObj);
		if (tabDest.formField) {
			if (!booNoCreate) {tabDest.addoption(tabDest.length);}
		}
	}
}

function newAddOption(index2Add, objForm, objColl, classStr) {
	var elmt;
	if (objForm) {
		elmt = document.createElement("OPTION");
		elmt.text = objColl.Lib;
		elmt.value = objColl.Id;
		if (classStr) {elmt.className=classStr;}
		//Ajout à la fin
    try {
      objForm.add(elmt, null); // standards compliant; doesn't work in IE
    }
    catch(ex) {
			objForm.add(elmt);
		}
	}
}

function addOption(index2Add, classStr) {
	var elmt;
	if (this.formField) {
		elmt = this.engdocument.createElement("OPTION");
		if (classStr) {elmt.className=classStr;}
		elmt.text = this[index2Add].Lib;
		elmt.value = this[index2Add].Id;
		if (index2Add) {
	    var elOptOld = eval(this.formField).options[index2Add-1];  
	    try {
	      eval(this.formField).add(elmt, elOptOld); // standards compliant; doesn't work in IE
	    }
	    catch(ex) {
	      eval(this.formField).add(elmt, index2Add-1); // IE only
	    }
		} else {
			//Ajout à la fin
	    try {
	      eval(this.formField).add(elmt, null); // standards compliant; doesn't work in IE
	    }
	    catch(ex) {
				eval(this.formField).add(elmt);
			}
		}
	}
}

function Insert(id2insert, pos2insert, lib) {
	var cpt, theIndex;
	bFind=false;
	objClone=new cloneObject(this.length);
	if (pos2insert>this.length) pos2insert=this.length;
	else if (pos2insert==-1&&this.needsort) {
		pos2insert=this.getpos2insert(this.sortFrom, this.length, lib);
	}
	this.add(objClone);
	for (cpt=pos2insert; cpt<this.length; cpt++) { 
		this[cpt+1]=new cloneObject(this[cpt]); 
	}
	this[pos2insert].Id=id2insert;
	this[pos2insert].Lib=lib;
	if (this.formField!="") {
		Obj=eval(this.formField);
		this.addoption(pos2insert);
	}
}

function cloneObject(what) {
    for (i in what) {
        this[i] = what[i];
    }
}

/**
 * Retourne la liste des propriétés sPropName de
 * chaque élément qui est dans l'état iState (à défaut tous les éléments)
 * séparées par sep (à défaut une virgule)
 */
function ListPropByState(sPropName, iState, sep)
{
	var val, result = '';
	if ( typeof(sep) == 'undefined' ) sep =',';
	for ( var i=1 ; i<=this.length ; i++ ) {
		val = eval('this['+i+'].'+sPropName);
		if ( val!=null && (!iState || this[i].State==iState) )
			result += sep + val;
	}
	if ( result.length > 0 )
		result = result.substr(sep.length);
	return result;
}

function Update(id2update, txtNom, State) {
	var cpt, theIndex;
	bFind=false;
	theIndex=this.seek("ID", id2update, 1);
	if (theIndex>-1) { 
		this[theIndex].Lib = txtNom;
		this[theIndex].State = State?State:0;
		if (this.formField!="") {
			Obj=eval(this.formField);
			Obj.options[theIndex-1].text = txtNom;
		}
	}
}

function UpdateListe(strAction, strCode, strValue, strTable) {
	var strFormField;
	switch (strAction) {
		case "ADD" :
			eval(strTable).add( new Eng(strCode, strValue, 0));
			break;
		case "UPD" :
			eval(strTable).suppr(strCode);
			eval(strTable).add( new Eng(strCode, strValue, 0));
			break;
		case "DEL"||"DELMASTER"||"FALSEDEL" :
			eval(strTable).suppr(strCode);
			break;	
	}
	eval(strTable).affiche();
	if (strAction!="DEL"&&strAction!="FALSEDEL"&&(strAction=="UPD"||strAction=="ADD")) {
		strFormField=eval(strTable);
		eval(strFormField.formField).value=strCode;
	}
}
/*******************************************
	fin de la zone de déclaration des objest
*******************************************/


