/*#########################################################################
#
#   name :       SX.css
#   desc :       Javascript collection (incliding Macromedia and Tim Funct()
#   categorie :  JavaScript
#   ID :  	 $Id: SX.js 935 2007-06-05 16:41:10Z cl $
#
#   copyright:   See licence.txt for this script licence
#########################################################################*/


//////////////////////////////////////////////
//           FONCTIONS MACROMEDIA
//////////////////////////////////////////////

//////////////////////////////////////////////
//           FONCTIONS Preload Images
function MM_preloadimages() 
	{ 
	var d=document; 
	if(d.images)
		{ if(!d.MM_p) d.MM_p=new Array();
		  var i,j=d.MM_p.length,a=MM_preloadimages.arguments; 
		  for(i=0; i<a.length; i++)
			if (a[i].indexOf("#")!=0)
				{ d.MM_p[j]=new Image(); 
				  d.MM_p[j++].src=a[i]; }
		}
	}
  
//////////////////////////////////////////////
//           FONCTIONS Reload Page
function MM_reloadPage(init) 
	{
	if (init==true) with (navigator) 
		{ 
		if ((appName=="Netscape")&&(parseInt(appVersion)==4)) 
			{ document.MM_pgW=innerWidth; 
			  document.MM_pgH=innerHeight; 
			  onresize=MM_reloadPage; }
		}
	else if (innerWidth!=document.MM_pgW || innerHeight!=document.MM_pgH) location.reload();
	}
MM_reloadPage(true);

//////////////////////////////////////////////
//           FONCTIONS OpenWindow
function MM_openBrWindow(theURL,winName,features) 
	{ window.open(theURL,winName,features); }

//////////////////////////////////////////////
//           FONCTIONS Find Object in JS
function MM_findObj(n, d) 
	{
	var p,i,x;  
	if(!d) d=document; 
		if((p=n.indexOf("?"))>0&&parent.frames.length) 
			{ d=parent.frames[n.substring(p+1)].document; 
			  n=n.substring(0,p); }
	if(!(x=d[n])&&d.all) x=d.all[n]; 
	for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
	for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
	if(!x && document.getElementById) x=document.getElementById(n); 
	return x;
	}

//////////////////////////////////////////////
//           FONCTIONS Change Element Property
function MM_changeProp(objName,x,theProp,theValue) 
	{
	var obj = MM_findObj(objName);
	if (obj && (theProp.indexOf("style.")==-1 || obj.style)) eval("obj."+theProp+"='"+theValue+"'");
	}

//////////////////////////////////////////////
//           FONCTIONS Relink
function MM_goToURL() 
	{
	var i, args=MM_goToURL.arguments; 
	document.MM_returnValue = false;
	for (i=0; i<(args.length-1); i+=2) eval(args[i]+".location='"+args[i+1]+"'");
	}


//////////////////////////////////////////////
//           FONCTIONS STARTX
//////////////////////////////////////////////

//////////////////////////////////////////////
//           ROLL OVER STARTX
function SX_RollIMG(ImgName,NewImg)
	{ MM_changeProp(ImgName,'','src',NewImg,'IMG'); }

//////////////////////////////////////////////
//           ROLL OVER DE DIV
function SX_RollDIV(DIVName,DIVStatus)
	{ MM_changeProp(DIVName,'','style.display',DIVStatus,'DIV'); }
//////////////////////////////////////////////
//           POPUP STARTX
function SX_popup(URL,width,height,gauche,haut,option,name) 
	{
	//gestion du dimentionnement et positionnement
	if (document.all)
		var xMax = screen.width, yMax = screen.height;
	else
		if (document.layers)
			var xMax = window.outerWidth, yMax = window.outerHeight;
		else
			var xMax = screen.width, yMax = screen.height;
	
	var xSize = (xMax)/2, ySize = (yMax)/2;
	if (width == '')
		{ var width = xSize;}
	if (height == '')
		{ var height = ySize;}
	if (height == 'full')
		{ var height = yMax-60;}
	var xOffset = (xMax-width)/2, yOffset = (yMax-height)/2;
    
	// gestion de parametres
	if (option == '')
		{ var opt = 'toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizable=no,';}
	if (option == 'full')
		{ var opt = 'toolbar=yes,location=yes,status=yes,menubar=yes,scrollbars=yes,resizable=yes,';}
	if (option == 'resize')
		{ var opt = 'resizable=yes,';}
	if (option == 'scroll')
		{ var opt = 'toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizable=no,';}
	if (option == 'resizeScroll')
		{ var opt = 'resizable=yes,scrollbars=yes,';}
	if (option == 'fullsize')
		{ var opt = 'toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizable=no,';
		  var decallage = 2;
		  var width = (xMax)-((decallage)*2);
		  var height = (yMax)-((decallage)*2);
		  var gauche = decallage;
		  var haut = decallage; }
	if (width == '')
		{ var width = xSize;}
	if (height == '')
		{ var height = ySize;}
	if (gauche == '')
		{ var gauche = xOffset;}
	if (haut == '')
		{ var haut = yOffset;}

	//alert("width=="+width+"\nheight="+height+"\nhaut=="+haut+"\ngauche="+gauche);
	window.open(URL,name,opt+'width='+width+',height='+height+',screenX='+gauche+',screenY='+haut+',top='+haut+',left='+gauche+'');
	}

//////////////////////////////////////////////
//           CLOCK STARTX
var clockID = 0;
function UpdateClock() 
{
	if(clockID) 
	{
		clearTimeout(clockID);
		clockID  = 0;
	}
	var tDate = new Date();
	var heure = tDate.getHours()
	var min = tDate.getMinutes()
	var sec = tDate.getSeconds()
	if (heure < 10)
		{ heure = "0" + tDate.getHours();}
	if (min < 10)
		{ min = "0" + tDate.getMinutes();}
	if (sec < 10)
		{ sec = "0" + tDate.getSeconds();}
	
	if (document.getElementById("Timer")!=null)
		{ 
			document.getElementById('Timer').innerHTML = "" + heure + ":" + min + ":" + sec;
		}
	clockID = setTimeout("UpdateClock()", 1000);
}

function StartClock() 
{
	clockID = setTimeout("UpdateClock()", 500);
}


//////////////////////////////////////////////
//           MENU STARTX

function getposOffset(what, offsettype)
{
	var totaloffset=(offsettype=="left")? what.offsetLeft : what.offsetTop;
	var parentEl=what.offsetParent;
	while (parentEl!=null)
	{
		totaloffset=(offsettype=="left")? totaloffset+parentEl.offsetLeft : totaloffset+parentEl.offsetTop;
		parentEl=parentEl.offsetParent;
	}
	return totaloffset;
}

function showhide(obj, e, visible, hidden, menuwidth)
{
	if (ie4||ns6)
		dropmenuobj.style.left=dropmenuobj.style.top=-500
	if (menuwidth!="")
	{
		dropmenuobj.widthobj=dropmenuobj.style
		dropmenuobj.widthobj.width=menuwidth
	}
	if (e.type=="click" && obj.visibility==hidden || e.type=="mouseover")
		obj.visibility=visible
	else if (e.type=="click")
		obj.visibility=hidden
}

function iecompattest()
{
	return (document.compatMode && document.compatMode!="BackCompat")? document.documentElement : document.body
}

function clearbrowseredge(obj, whichedge)
{
	var edgeoffset=0
	if (whichedge=="rightedge")
	{
		var windowedge=ie4 && !window.opera? iecompattest().scrollLeft+iecompattest().clientWidth-15 : window.pageXOffset+window.innerWidth-15
		dropmenuobj.contentmeasure=dropmenuobj.offsetWidth
		if (windowedge-dropmenuobj.x < dropmenuobj.contentmeasure)
			edgeoffset=dropmenuobj.contentmeasure-obj.offsetWidth
	}
	else
	{
	var windowedge=ie4 && !window.opera? iecompattest().scrollTop+iecompattest().clientHeight-15 : window.pageYOffset+window.innerHeight-18
	dropmenuobj.contentmeasure=dropmenuobj.offsetHeight
	if (windowedge-dropmenuobj.y < dropmenuobj.contentmeasure)
		edgeoffset=dropmenuobj.contentmeasure+obj.offsetHeight
	}
	return edgeoffset
}

function populatemenu(what)
{
	if (ie4||ns6)
	dropmenuobj.innerHTML=what.join("")
}


function dropdownmenu(obj, e, menucontents, menuwidth)
{
	if (window.event) event.cancelBubble=true
	else if (e.stopPropagation) e.stopPropagation()
	clearhidemenu()
	dropmenuobj=document.getElementById? document.getElementById("SXSubMenu") : SXSubMenu
	populatemenu(menucontents)

	if (ie4||ns6)
	{
		showhide(dropmenuobj.style, e, "visible", "hidden", menuwidth)
		dropmenuobj.x=getposOffset(obj, "left")
		dropmenuobj.y=getposOffset(obj, "top")
		dropmenuobj.style.left=(dropmenuobj.x-clearbrowseredge(obj, "rightedge")-1)+"px"
		dropmenuobj.style.top=(dropmenuobj.y-clearbrowseredge(obj, "bottomedge")+4)+obj.offsetHeight+"px"
	}
	return clickreturnvalue()
}

function dropdownmenuAdmin(obj, e, menucontents, menuwidth)
{
	if (window.event) event.cancelBubble=true
	else if (e.stopPropagation) e.stopPropagation()
	clearhidemenu()
	dropmenuobj=document.getElementById? document.getElementById("SXSubMenu") : SXSubMenu
	populatemenu(menucontents)

	if (ie4||ns6)
	{
		showhide(dropmenuobj.style, e, "visible", "hidden", menuwidth)
		dropmenuobj.x=getposOffset(obj, "left")
		dropmenuobj.y=getposOffset(obj, "top")
		dropmenuobj.style.left=dropmenuobj.x-clearbrowseredge(obj, "rightedge")+"px"
		dropmenuobj.style.top=(dropmenuobj.y-clearbrowseredge(obj, "bottomedge")+4)+obj.offsetHeight+"px"
	}
	return clickreturnvalue()
}

function dropdownmenuChannel(obj, e, menucontents, menuwidth)
{
	if (window.event) event.cancelBubble=true
	else if (e.stopPropagation) e.stopPropagation()
	clearhidemenu()
	dropmenuobj=document.getElementById? document.getElementById("SXChannelMenu") : SXChannelMenu
	populatemenu(menucontents)

	if (ie4||ns6)
	{
		showhide(dropmenuobj.style, e, "visible", "hidden", menuwidth)
		dropmenuobj.x=getposOffset(obj, "left")
		dropmenuobj.y=getposOffset(obj, "top")
		dropmenuobj.style.left=dropmenuobj.x-clearbrowseredge(obj, "rightedge")+"px"
		dropmenuobj.style.top=(dropmenuobj.y-clearbrowseredge(obj, "bottomedge")+4)+obj.offsetHeight+"px"
	}
	return clickreturnvalue()
}

function clickreturnvalue()
{
	if (ie4||ns6) return false
	else return true
}

function contains_ns6(a, b)
{
	while (b.parentNode)
	if ((b = b.parentNode) == a)
	return true;
	return false;
}

function dynamichide(e)
{
	if (ie4&&!dropmenuobj.contains(e.toElement))
		delayhidemenu()
	else if (ns6&&e.currentTarget!= e.relatedTarget&& !contains_ns6(e.currentTarget, e.relatedTarget))
		delayhidemenu()
}

function hidemenu(e)
{
	if (typeof dropmenuobj!="undefined")
	{
		if (ie4||ns6)
			dropmenuobj.style.visibility="hidden"
	}
}

function delayhidemenu()
{
	if (ie4||ns6)
		delayhide=setTimeout("hidemenu()",disappeardelay)
}

function clearhidemenu()
{
	if (typeof delayhide!="undefined")
		clearTimeout(delayhide)
}


/* Je commenta car ca ne semble pas servir et cas cr�e une erreur JS
if (hidemenu_onclick=="yes")
	document.onclick=hidemenu






//////////////////////////////////////////////
//           FONCTIONS TIM HUYNH
//////////////////////////////////////////////


/*
Attend un nom de champs ou une valeur, ex : [i_frame.document.form1.champs_a_verifier],"Jean", "", etc...
Et 'alerter' (true -defaut-/false) si l'on veut qu'une popup s'affiche lors de l'erreur
Si le paramètre est un objet:
Modifie la valeur du champs si incorrecte et Retourne 'true' si le masque de mail est correcte, sinon, renvoie 'false'.
Si le paramètre est une valeur:
Retourne la valeur modifiée dans la propriété 'val' et le 'statut' true/false dans.
ex acceptés: "nom@soc.com", "nom.prenom@soc-pays.division.com,etc...
refusés : nom.prénom@soc.fr, fêtedesmère@société.fr, etc...
Utilisation : testEmail(document.form1.champs).val ou testEmail(this).statut...
*/

function testEmail (obj,alerter) 
{
	val = obj.value;
	var new_string = new String(val);
	
if (val != '') {
	if (!new_string.match('^[-_\.0-9a-zA-Z]{1,}@[-_\.0-9a-zA-Z]{1,}[\.][0-9a-zA-Z]{2,}$')) {
		alert("Merci de saisir une adresse e-mail correcte");
		obj.value = "";
		return false;
		}
	else {
		return true;
		}
	}
else {
	return true;
	}
}

/*
Attend un nom de champs ou une valeur, ex : [i_frame.document.form1.champs_a_verifier],"Jean", "", etc...
Et 'alerter' (true -defaut-/false) si l'on veut qu'une popup s'affiche lors de l'erreur
Si le paramètre est un objet:
Modifie la valeur du champs si incorrecte et Retourne 'true' si le masque de tel est accepté, sinon, renvoie 'false'.
Si le paramètre est une valeur:
Retourne la valeur modifiée dans la propriété 'val' et le 'statut' true/false dans.
ex acceptés: "033.01.42.72.38.47", "06.61.51.49.33", "0001.01.42.35.6476" => "00.01.42.35.64.76", "06 61 51 49 33" => "06.61.51.49.33",etc...
refusés :  "(0001)/01|42\35[6476]", "ABCDEFG",etc...
Utilisation : testPhone(document.form1.champs).val ou testPhone(this).statut ou testPhone("0001.01.42.35.6476").val, etc...
*/
function testPhone(obj,alerter)
{
	val=trim(ObjToStr(obj).val);
	if(trim(val)!="")
	{
		alpha =/[a-z]|[A-Z]/;
		res_alpha=alpha.test(val);//test si c'est de l'alpahanumerique sans espace, retour chariot, tabulation, etc...
		car=/\d{4,10}/;
		while (car.test(val)==true)
		{
			res=car.exec(val);
			part1=res[0].substr(0,2);
			part2=res[0].substr(2,res[0].length-2);
			val=val.replace(car,part1+" "+part2);
		}
		car=/\;|\:|\,|\-|\.|\s{2,}/;
		while (car.test(val)==true)
		{
			val=val.replace(car," ");
		}
		car=/^\.|\.$|\.+/;
		while (car.test(val)==true)
		{
			val=val.replace(car," ");
		}
		if(testObj(obj))
		{
			obj.value = val;
		}
		
		num =/([0-9]|\.)+/;
		res_num= num.test(val);
		interdit1 = /(^\.|\.$|\.\.+)/;//Interdit un mail qui commence ou finit . ou n . d'affiler, etc
		interdit2 = /[éè� ùêâôïëäöÿüç^¨\[\]\{\}\##\&\;\:\/\!\$\*\!\+\=\?\|\/\°\(\)\{\[\]\}\\\@]/;//ces caractères sont interdits
		//alert("alpha="+res_alpha+"\nNum="+res_num);
		if(res_alpha==false && res_num==true &&  interdit1.test(val)==false && interdit2.test(val)==false )
		{
			statut=true;
		}
		else
		{
			//alert("Erreur dans le champs : 'Tel/Fax' !");
			statut=false;
		}
	}
	else
	{
		statut=true;
	}
	return this;	
}

/*
Attend un nom de champs ou une valeur, ex : [i_frame.document.form1.champs_a_verifier],"Jean", "", etc...
Et 'alerter' (true -defaut-/false) si l'on veut qu'une popup s'affiche lors de l'erreur
Gère les années bissextiles !
Si le paramètre est un objet:
Modifie la valeur du champs si incorrecte et Retourne 'true' si le masque de date est accepté, sinon, renvoie 'false'.
Si le paramètre est une valeur:
Retourne la valeur modifiée dans la propriété 'val' et le 'statut' true/false dans.
ex acceptés: "010102", "01012002", "01/01/02", "122"=>"12/02/2002,"01.01.2002","01 01 02", "01-01-2002", etc...
refusés :  "01|01|2002", "ABCDEFG", "001/003/034","72","1222002", etc...
Utilisation : testDate(document.form1.champs).statut ou testDate(this.value).val ou testDate("01 01 02").val, etc...
*/
function testDate(obj,alerter)
{
	try
	{


		val=trim(ObjToStr(obj).value);
		if(val!="")
		{
			alpha =/[a-zA-Z]/;
			res_alpha=alpha.test(val);//test si c'est de l'alpahanumerique sans espace, retour chariot, tabulation, etc...
			interdit1 = /(^\.|\.$|\.\.+)/;//Interdit un mail qui commence ou finit . ou n . d'affiler, etc
			interdit2 = /[éè� ùêâôïëäöÿüç^¨\##\&\,\;\:\!\$\%\*\!\+\=\?\|\°\(\)\{\[\]\}\\\@]/;//ces caractères sont interdits
			car=/(\,|\-|\s|\.)/;
			while (car.test(val)==true)
			{
				val=val.replace(car,"/");
			}
			
			if(testObj(obj))
			{
				obj.value = val;
				//alert(obj.value+res_alpha+interdit1.test(val)+interdit2.test(val))
			}
			if(res_alpha==false && interdit1.test(val) ==false && interdit2.test(val)==false)
			{
				date=/([0-9]{6,8}|\/\d{2,4})/
				if(date.test(val)==false)
				{
					date=/([0-9]{4})/;
					if(date.test(val))
					{
						tabexec=date.exec(val);
						val=val.replace(date,tabexec[0]+"2002");
					}
					else
					{
						date=/([0-9]{3})/;
						if(date.test(val))
						{
							tabexec=date.exec(val);
							val=val.replace(date,tabexec[0].substr(0,2)+"0"+tabexec[0].substr(2,1)+"2002");
						}
					}
				}
				date=/([0-9]{6,8})/
				if(date.test(val))
				{
					jour=val.substr(0,2);
					mois=val.substr(2,2);
					an=val.substr(4,val.length-4);
					val=jour+"/"+mois+"/"+an;
					if(testObj(obj))
					{
						obj.value=val;
					}
				}
				
				an=/(\/\d{2}$|\/\d{4}$)/;//an sur 2 ou 4 chiffres
				res_an=an.test(val);//test de l'expression an
				if(res_an==true)
				{
					tab_an = an.exec(val);
					val_an = tab_an[0].substr(1,tab_an[0].length);
				
					if(val_an.search(/\d{4}/)==-1)//Si an sur 2 car
					{
						val_an=Number(val_an)+Number(2000);
						val= val.replace(/(\/\d{2}$)/,"/"+val_an);
						if(testObj(obj))
						{
							obj.value=val;
						}
					}
					bissex = (val_an - 2000)/4;
					
					mois=/(\/0[1-9]\/|\/1[0-2]\/)/;
					val_mois=val.match(mois);
					res_mois=mois.test(val);
					
					if (res_mois==true)
					{
						//alert(val_an+" - "+val_mois[0]);
						switch(val_mois[0])
						{
							case "/02/":
								
								if(isInt(bissex))
								{
									jour=/^(0[1-9]\/|[1-2][0-9]\/)/;
								}
								else
								{
									jour=/^(0[1-9]\/|1[0-9]|2[0-8]\/)/;
								}
								
							break;
							case "/04/":
								jour=/^(0[1-9]\/|[1-2][0-9]\/|30\/)/;
							break;
							case "/06/":
								jour=/^(0[1-9]\/|[1-2][0-9]\/|30\/)/;
							break;
							case "/09/":
								jour=/^(0[1-9]\/|[1-2][0-9]\/|30\/)/;
							break;
							case "/11/":
								jour=/^(0[1-9]\/|[1-2][0-9]\/|30\/)/;
							break;
							default:
								jour=/^(0[1-9]\/|[1-2][0-9]\/|3[0-1]\/)/;
							break;
						}
						res_jour= jour.test(val);
					}
					else
					{
						res_jour=true;
						res_an=true;
					}
				}
				else
				{
					res_jour=true;
					res_mois=true;
				}
			}
			else
			{
				res_an=true;
				res_jour=true;
				res_mois=true;
			}
			
			//alert("alpha="+res_alpha+"\nJour="+res_jour+"\nMois="+res_mois+"\nAn="+res_an);
			if(res_alpha==false && res_jour==true && res_mois==true && res_an==true && interdit1.test(val)==false && interdit2.test(val)==false )
			{
				statut=true;
			}
			else
			{
				statut=false;
				if(isdefined(alerter)==false||alerter)
				{
					msgerr="";
					if(res_jour==false)
					{
						msgerr="Le 'jour' contient une erreur. Attention �  l'année bissexstile !\n";
					}
					if(res_mois==false)
					{
						msgerr="Le 'mois' contient une erreur !\n";
					}
					if(res_an==false)
					{
						msgerr="L'année contient une erreur !\n";
					}
					if(res_alpha==true || interdit1.test(val)==true || interdit2.test(val)==true)
					{
						msgerr="Un caractère incorrect a été saisi dans la date !\n";
					}
					
					if(testObj(obj))
					{
						alert("Erreur dans le champs date : '"+obj.name+"' !\n1)"+ msgerr);
						obj.focus();
					}
					else
					{
						alert("Erreur dans la valeur date : '"+val+"' !\n1)"+ msgerr);
					}
				}
			}
		}
		else
		{
			statut=true;
		}	
		
}
	catch(er)
	{
		alert("Une erreur est survenue  dans la fonction testDate !"+"\nNom:"+er.name+"\nMsg:"+er.message);
		statut=false;
		
	}
	return this;
}

/*
Attend un nom de champs ou une valeur, ex : [i_frame.document.form1.champs_a_verifier],"Jean", "", etc...
Test si c'est un objet, ex : "document.form1.champs". Renvoie 'true' si c'est le cas.
*/
function testObj(obj)
{
	try
	{
		testObjRes=false;
		if(isdefined(obj))
		{
			if(typeof(obj) == "object")
			{
				testObjRes=true;
			}
		}		
}
	catch(er)
	{
		alert("Une erreur est survenue dans la fonction testObj !"+"\nNom:"+er.name+"\nMsg:"+er.message);
		testObjRes=false;
	}
	return testObjRes;
}


/*
Renvoie la chaîne sans les espaces du début et de la fin 
Utilisation : this.form.champs=trim(this.form.champs)
*/
function trim(obj)
{
	try
	{
		val=ObjToStr(obj).val;
		re=new RegExp("\^\\s+\|\\s+\$")
		while (re.test(val))
		{
			val=val.replace(re,"");
		}
	}
	catch(er)
	{
		alert("Une erreur est survenue  dans la fonction trim !"+"\nNom:"+er.name+"\nMsg:"+er.message);
	}
	return val;
}



/*
Attend un nom de champs ou une valeur, ex : [i_frame.document.form1.champs_a_verifier],"Jean", "", etc...
Vérifie si le paramètre renvoyé est un objet ou une valeur chaîne.
Si c'est un objet, on termine par .value, sinon, on retour val = obj.
Utilisation : val=ObjToStr(obj); où obj peut être soit un objet de type "document.form1.champs", 
soit une valeur de type "123456" ou "Albert" ou "12/12/01", etc...
*/
function ObjToStr(obj)
{
	try
	{
		//alert("okOBJ:"+testObj(obj)+"   okSTR:"+testStr(obj)+"   Type="+typeof(obj)+"   obj.length="+obj.length+"  Valeur="+obj.value);
		if(testStr(obj))
		{
			val=String(obj);
			nam="Value";
			typ=typeof(obj);
		}
		else if(testObj(obj))
		{
			if(obj.type=="select-one"||obj.type=="select-multiple" ||obj.length>1)
			{
				tab_val=new Array();
				for(i=0;i<obj.length;i++)
				{
					if(obj[i].selected || obj[i].checked)
					{
						tab_val.push(obj[i].value);
					}
				}
				val=tab_val.join();
				if(obj.type=="select-one"||obj.type=="select-multiple")
				{
					nam=obj.name;
					typ=obj.type;
				}
				else
				{
					nam=obj[0].name;
					typ=obj[0].type;
				}
			}
			else if(obj.type=="text" || obj.type=="textarea" || obj.type=="radio" || obj.type=="checkbox" || obj.type=="password" || obj.type=="hidden")
			{
				val=obj.value;
				nam=obj.name;
				typ=obj.type;
			}
		}
	}
	catch(er)
	{
		alert("Une erreur est survenue dans la fonction ObjToStr !"+"\nNom:"+er.name+"\nMsg:"+er.message);
	}
	return this;
}



/*
Attend un nom de champs ou une valeur, ex : [i_frame.document.form1.champs_a_verifier],"Jean", "", etc...
Test si c'est une chaîne de caractère. Renvoie 'true' si c'est le cas.
*/
function testStr(obj)
{
	try
	{
		testStrRes=false;
		if(isdefined(obj))
		{
			if(typeof(obj) == "string")
			{
				testStrRes=true;
			}
		}
	}
	catch(er)
	{
		alert("Une erreur est survenue dans la fonction testStr !"+"\nNom:"+er.name+"\nMsg:"+er.message);
		testStrRes=false;
	}
	return testStrRes;
}

/*
Test si 'obj' en paramètre est défini et retourne 'true' si c'est le cas
Utilisation : isdefined(this.form.champs)
*/
function isdefined(obj)
{
	try
	{
		if(typeof(obj)=="undefined")
		{
			isdefinedRes=false;
		}
		else
		{
			isdefinedRes=true;
		}
	}
	catch(er)
	{
		alert("Une erreur est survenue dans la fonction isdefined !"+"\nNom:"+er.name+"\nMsg:"+er.message);
		isdefinedRes=false;
	}
	return isdefinedRes;
}

/*Vérifie si c'est une date ou une chaine de caratères*/
function isDate(DisDate)
{
	try
	{
		newDisDate=DisDate.toGMTString();
		return true;
	}
	catch(er)
	{
		return false;
	}
}

/*verifie si l'annee envoyée est une année bissextile*/
function isBissextile(annee)
{
	d_isBissextile=new Date(annee,1,29);
	j_isBissextile=d_isBissextile.getDate();
	(j_isBissextile==29)?Bissex=true:Bissex=false;
	return Bissex;
}


/*
Renvoie le jour de la semaine en mot.
date = format "JJ/MM/AAAA" obligatoire !!!
*/
function JourSemaine(date)
{
	date=new Date(toDateUk(date));
	var jour = new Array("dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi");
	return jour[date.getDay()];
}


function IsWe(DisWe)
{
	try
	{
		if(typeof(DisWe)=="undefined")DisWe=new Date();
		else
		{
			if(isDate(DisWe)==false)
			{
				if(DateValid(DisWe))DisWe=new Date(toDateUk(DisWe));
				else return false;
			}
		}
		if(DisWe.getDay() == 0 || DisWe.getDay() == 6)return true;
		else return false;
	}
	catch(er)
	{
		alert("Erreur : "+er+" dans la fonction IsWe() !!!");
		return false;
	}
}


/*Vérifie que la date envoyée est bien en format 9/9/9 et non A/B/C
*/
function VerifDateOk(dateToTest)
{
	TabdateOK=dateToTest.split("/");
	if(TabdateOK.length<3)return false;
	for(i in TabdateOK)
	{ 
		if(isNaN(TabdateOK[i]))return false;
	}
	return true;
	
}



function toJJMMAAAA(dateToConvert)
{
	if(isDate(dateToConvert)==false && dateToConvert.split("/").length>2 && dateToConvert.length<=10)
	{
		tabDateToConv=dateToConvert.split("/");
	}
	else
	{
		dateToConvert=new Date(dateToConvert);
		tabDateToConv=new Array(Number(dateToConvert.getDate()),Number(dateToConvert.getMonth())+1,dateToConvert.getYear());
	}
	JJ=(tabDateToConv[0]<9)?"0"+String(tabDateToConv[0]):tabDateToConv[0];
	MM=(tabDateToConv[1]<9)?"0"+String(tabDateToConv[1]):tabDateToConv[1];
	AAAA=(tabDateToConv[2].length<4)?Number(tabDateToConv[2])+2000:tabDateToConv[2];
	return JJ+"/"+MM+"/"+AAAA;
}



/*
Teste si une date en format "JJ/MM/AAAA" est correcte
Renvoie true si oui
*/
function DateValid(dDateValid)
{
	try
	{
		okDateValid=true;//alert("dDateValid="+dDateValid+"\n"+isDate(dDateValid));
		if(isDate(dDateValid)==false)
		{
			if(VerifDateOk(dDateValid))
			{
				tabDateValid=dDateValid.split("/");
				//alert(tabDate.length+" - "+dDateValid.length);
				if(tabDateValid.length==3 && dDateValid.length<=10 && dDateValid.length>=5)
				{
					ddDateValid=tabDateValid[0];
					mmDateValid=Number(tabDateValid[1])-1;
					aaDateValid=tabDateValid[2];
					DateCompDateValid=new Date(tabDateValid[2],mmDateValid,tabDateValid[0]);
					if(Number(ddDateValid)!=Number(DateCompDateValid.getDate()))okDateValid=false;
				}
				else
				{
					alert("La date envoyée : '"+dDateValid+"' n'est pas acceptée par la fonction DateValid() !!!");
					return false;
				}
			}
			else
			{
				okDateValid=false
			}
			
		}
		else
		{
			okDateValid=true;
		}
		return okDateValid;
	}
	catch(er)
	{
		alert("Erreur : "+er+"  dans la fonction DateValid !!!\nLa date envoyée : '"+dDateValid+"' ne semble pas être correcte!!!");
		return false;
	}
}

/*
DateDiff renvoie le nb de jour entre DateDiff1 et DateDiff2 (DateDiff1<=DateDiff2)
Format attendu : JJ/MM/AAAA ou date javascript
Renvoie false si erreur
*/
function DateDiff(DateDiff1,DateDiff2)
{
	try
	{
		if(typeof(DateDiff1)=="string" && DateValid(DateDiff1))DateDiff1=new Date(toDateUk(DateDiff1));
		if(typeof(DateDiff2)=="string" && DateValid(DateDiff2))DateDiff2=new Date(toDateUk(DateDiff2));
		msd1=Date.parse(DateDiff1);
		msd2=Date.parse(DateDiff2);
		resDateDiff=(msd2-msd1)/86400000;
		return Number(resDateDiff);
	}
	catch(er)
	{
		alert("Erreur : "+er+"  dans la fonction DateDiff !!!\nLes dates saisies ne semblent pas être correctes!!!");
		return false;
	}
}

/*Renvoie le nb de jour du mois de la date "dNbJourParMois"
Format attendu : JJ/MM/AAAA ou date javascript
*/
function NbJourParMois(dNbJourParMois)
{
	try
	{
		if(isDate(dNbJourParMois)==false)
		{
			if(DateValid(dNbJourParMois))
			{
				tabDate=dNbJourParMois.split("/");
				anNbJourParMois=tabDate[2];
				Mcur=Number(tabDate[1])-1;
			}
		}
		else 
		{
			anNbJourParMois=dNbJourParMois.getYear();
			Mcur=dNbJourParMois.getMonth();
		}
		BISSEX=(isBissextile(anNbJourParMois))?29:28;
		mois31=new Array(31,BISSEX,31,30,31,30,31,31,30,31,30,31);
		return Number(mois31[Mcur]);
	}
	catch(er)
	{
		alert("Erreur : "+er+" dans la fonction NbJourParMois() !");
	}
		
}

/*Ajoute un de mois : "NbMonth" �  la date : "dateMonthAdd" et renvoie la nouvelle date en format javascript
Si 
Format attendu : JJ/MM/AAAA ou date javascript
*/
function MonthAdd(NbMonth,dateMonthAdd)
{
	try
	{
		if(isDate(dateMonthAdd)==false)
		{
			if(DateValid(dateMonthAdd))dateMonthAdd=new Date(toDateUk(dateMonthAdd));
			else return false;
		}
		DtoAdd=dateMonthAdd.getDate();
		MtoAdd=Number(dateMonthAdd.getMonth())+Number(NbMonth);
		YtoAdd=dateMonthAdd.getYear();
		TestDate=new Date(YtoAdd,MtoAdd,1);
		NbDayNewDate=NbJourParMois(TestDate);
		if(Number(DtoAdd)>Number(NbDayNewDate))DtoAdd=NbDayNewDate;
		newDate=new Date(YtoAdd,MtoAdd,DtoAdd);
		return newDate;
	}
	catch(er)
	{
		alert("Erreur : "+er+" dans la fonction MonthAdd() !");
	}
}


function DateAdd(nbToAdd,dateToAdd)
{
	try
	{
		nbJMoisCur=NbJourParMois(dateToAdd);
		if(isDate(dateToAdd)==false)
		{
			if(DateValid(dateToAdd))dateTab=dateToAdd.split("/");
			else return false;
		}
		else 
		{
			andateToAdd=dateToAdd.getYear();
			moisdateToAdd=Number(dateToAdd.getMonth())+1;
			jourdateToAdd=dateToAdd.getDate();
			dateTab=new Array(jourdateToAdd,moisdateToAdd,andateToAdd);
			dateToAdd=new Date(dateToAdd);
		}
		
		if(nbToAdd==0)return dateToAdd;
		if(dateTab[0]<=0 || dateTab[0]>nbJMoisCur)
		{
			alert("Erreur de date dans la fonction DateAdd() !!!");
			return false;
		}
		else
		{
			mToSet=dateTab[1]-1;
			mcur=dateTab[1];
			aToSet=dateTab[2];
			jToSet=dateTab[0];
			dateCur=dateToAdd;
			if(Number(nbToAdd)>=0)
			{
				finirMois=Number(nbJMoisCur)-Number(jToSet);
				while(Number(finirMois)<Number(nbToAdd))
				{
					nbToAdd=Number(nbToAdd)-Number(finirMois);
					jToSet=0;
					if(mToSet==11)
					{
						mToSet=0;
						aToSet++;
					}
					else
					{mToSet++;}
					dToSet=new Date(aToSet,mToSet,1);
					nbJMoisCur=NbJourParMois(dToSet);
					finirMois=nbJMoisCur;
				}
				mcur=Number(mToSet);
				nbToAdd=Number(jToSet)+Number(nbToAdd);
				resDateAdd=(Number(nbToAdd)>0)?new Date(aToSet,mcur,nbToAdd):new Date(aToSet,mcur,1);
			}
			else
			{
				while(Number(jToSet)+Number(nbToAdd)<=0)
				{
					nbToAdd=Number(jToSet)+Number(nbToAdd);
					if(mToSet==0)
					{
						mToSet=11;
						aToSet--;
					}
					else
					{mToSet--;}
					dToSet=new Date(aToSet,mToSet,1);
					jToSet=NbJourParMois(dToSet);
				}
				mcur=Number(mToSet);
				nbToAdd=Number(jToSet)+Number(nbToAdd);
				resDateAdd=(Number(nbToAdd)>0)?new Date(aToSet,mcur,nbToAdd):new Date(aToSet,mcur,Number(jToSet));
			}
			return resDateAdd;
		}
	}
	catch(er)
	{
		alert("Erreur : "+er+" dans la fonction DateAdd()!!!");
	}
	
}


function DateMasque(obj)
{
	try
	{
		DateMasqueOk=true;
		Now=new Date();
		dDateMasque=new String();
		dDateMasque=(typeof(obj)=="object")?obj.value:obj;
		tabDate=dDateMasque.split("/");
		
		if(tabDate.length > 1)
		{
			jDateMasque=tabDate[0];
			mDateMasque=tabDate[1];
			aDateMasque=(tabDate.length>2)?tabDate[2]:Now.getYear();
		}
		else
		{
long1=dDateMasque.length;
			switch(long1)
			{
				case 1:
				case 2:
					jDateMasque=dDateMasque;
					mDateMasque=Now.getMonth()+1;
					aDateMasque=Now.getYear();
				break;
				case 3:
				case 4:
					jDateMasque=dDateMasque.substring(0,2);
					mDateMasque=dDateMasque.substring(2,long1);
					aDateMasque=Now.getYear();
				break;
				default:
					jDateMasque=dDateMasque.substring(0,2);
					mDateMasque=dDateMasque.substring(2,4);
					aDateMasque=dDateMasque.substring(4,long1);
				break;
			}
		}
		
		NewDate=new Date(aDateMasque,mDateMasque-1,jDateMasque);
		Change=false;
		NewJ=NewDate.getDate();
		//alert(Number(NewJ)!=Number(j));
		
		if(Number(NewJ)!=Number(jDateMasque))
		{
			jDateMasque=NewJ;
			mDateMasque=NewDate.getMonth()+1;
			aDateMasque=NewDate.getYear();
			Change=true;
		}
		//alert("DateMasque="+dDateMasque);
		if(Number(jDateMasque)<=NbJourParMois(NewDate) && Number(jDateMasque)>0)jj=(Number(jDateMasque)<10)?"0"+String(Number(jDateMasque)):String(jDateMasque);
		else DateMasqueOk=false;
		if(Number(mDateMasque)<=12 && Number(mDateMasque)>0)mm=(Number(mDateMasque)<10)?"0"+String(Number(mDateMasque)):String(mDateMasque);
		else DateMasqueOk=false;
		aaaa=(Number(aDateMasque)<2000 && aDateMasque.length<4)?Number(aDateMasque)+2000:Number(aDateMasque);
		DateRes=jj+"/"+mm+"/"+String(aaaa);
		
		if(typeof(obj)=="object")
		{
			obj.value=DateRes;
			msg="\nElle a été remplacé par une date valide : "+DateRes;
			if(Change==true)alert("La date saisie est inexistante."+msg);
			if(DateMasqueOk==false)
			{
				alert("La date saisie : "+DateRes+" est erronée !!!");
				obj.focus();
			}
		}
		else
		{
			msg="\nLa date utilisée sera : "+DateRes;
			if(Change==true)alert("La date saisie est inexistante."+msg);
			if(DateMasqueOk==false)
			{
				alert("La date envoyée : "+DateRes+" est erronée !!!");
				return false;
			}
			else
				return DateRes;
		}
		
		
	}
	catch(er)
	{
		alert("Erreur : "+er+"  dans la fonction DateMasque()!!!");
	}
}




/*
Transforme les date JJ/MM/AAAA en MM/JJ/AAAA pour qu'elle puissent être utilisées avec les fonctions de date.
Exemple : DateATraiter=new Date(toDateUk("25/12/2002"));
*/
function toDateUk(dateFR)
{
	if(dateFR.search(/[\/]/gi,"")!=-1)
	{
		if(dateFR.length <= 10)
		{
			tabDate = dateFR.split("/");
			dateUK=tabDate[1]+"/"+tabDate[0]+"/"+tabDate[2];
		}
		newDate=new Date(dateUK);
		newDate=newDate.toGMTString();
		return newDate;
	}
	else
	{
		return false;
	}
}

/*
Test si une date :'dateVerif', est fériée (compris dans 'jFerie') ou si c'est un week-end quand 'testWE' est �  'true'.
dateVerif : format "JJ/MM/AAAA" obligatoire ! Si vide, dateVerif=Date du jour.
ATTENTION : dateVerif >= DateActuelleEstFerie !!!!
jFerie : "J/M" ou "JJ/MM" ou "J/M-J/M" ou "JJ/MM-JJ/MM"
*/

function EstFerie(dateVerif,listDateDebutConges,listDateFinConges,testWE,testDateInf)
{
	try
	{	
		testWE=(typeof(testWE)=="" || typeof(testWE)=="undefined" || testWE!=false)?true:false;
		testDateInf=(typeof(testDateInf)=="undefined" || testDateInf != false)?true:false;
		DateActuelleEstFerie=new Date();
		//alert("DateDiff(DateActuelleEstFerie,dateVerif) = "+DateDiff(DateActuelleEstFerie,dateVerif));
		if(testDateInf)if(DateDiff(DateActuelleEstFerie,dateVerif)<-1)return true;
		if(testWE)if(IsWe(dateVerif))return true;
		
		if(listDateDebutConges!="" && typeof(listDateDebutConges)!="undefined" && listDateDebutConges.length >0 && listDateFinConges!="" && typeof(listDateFinConges)!="undefined" && listDateFinConges.length >0 && listDateDebutConges.length==listDateFinConges.length)
		{
			tabDebConges=listDateDebutConges.split(",");
			tabFinConges=listDateFinConges.split(",");
			for(iEstFerie=0;iEstFerie<tabDebConges.length;iEstFerie++)
			{
				if(DateDiff(tabDebConges[iEstFerie],dateVerif)>=0 && DateDiff(dateVerif,tabFinConges[iEstFerie])>=0)return true;
			}
		}
		return false;
	}
	catch(er)
	{
		alert("Erreur : "+er+" dans la fonction EstFerie()");
		return false;
	}
}


/*
A utiliser avec EstFerie() !!!
Recherche la première date disponible �  partir de DateDepart
DateDepart = format "DD/MM/YYYY" obligatoire et Supérieur �  Date du jour !!!
*/
function DateRappel(DRappel,listeDateDebConges,listeDateFinConges,testWE,testDateInf)
{
	try
	{
		if(DRappel!="")
			if(isDate(DRappel)==false)DRappel=new Date(toDateUk(DateMasque(DRappel)));
		else
		{
			DRappel=new Date();
			DRappel=MonthAdd(2,DRappel);
		}
			
		testWE=(typeof(testWE)=="" || typeof(testWE)=="undefined" || testWE!=false)?true:false;
		testDateInf=(typeof(testDateInf)=="undefined" || testDateInf != false)?true:false;
		while(EstFerie(DRappel,listeDateDebConges,listeDateFinConges,testWE,testDateInf))
		{
			//alert(EstFerie(DRappel,listeDateDebConges,listeDateFinConges,testWE,testDateInf));
			//alert(DRappel);
			DRappel=DateAdd(1,DRappel);
		}
		return toJJMMAAAA(DRappel);
		
	}
	catch(er)
	{
		alert("Erreur : "+er+" dans la fonction DateRappel()");
		return false;
	}
}
function OpenCal(obj,testWE,testConges,testDateInf,formulaire,DateDeb)
{	
	formURL=(typeof(formulaire)=="undefined" || formulaire=="")?"&f=form1":"&f="+formulaire;
	DateDebutCal=(typeof(formulaire)=="undefined" || formulaire=="")?"&DateDeb=":"&DateDeb="+DateDeb;
	testWE=(typeof(testWE)=="" || typeof(testWE)=="undefined" || testWE!=false)?true:false;
	testConges=(typeof(testConges)=="undefined" || testConges != false)?true:false;
	testDateInf=(typeof(testDateInf)=="undefined" || testDateInf != false)?true:false;
	weURL="&we="+testWE;
	congesURL="&cgs="+testConges;
	dateinfURL="&dateinf="+testDateInf;
	winAttrib="left="+Number(event.clientX)+",top="+Number(window.screenTop+event.clientY-152)+",width=110,height=152,menubar=no,toolbar=no,statusbar=no,scrollbars=no";
	var calendar=window.open("","calendar",winAttrib);
	var calendar=window.open("","calendar");
		calendar.resizeTo(110,152);
		//calendar.moveTo(event.clientX,window.screenTop+event.clientY-152);
		calendar.location ="calendrier.php?obj="+obj+DateDebutCal+formURL+weURL+congesURL+dateinfURL;
		calendar.focus();
		calendar.document.onblur=new Function("window.focus()");
}

/*
Crée, afffiche et fait bouger un cadre de type DIV et de nom 'NomCadre', s'il n'existe pas déj�  (nom par défaut : 'Cadre')
Xmouse et Ymouse définissent la distance du haut-gauche du cadre para rapport au pointeur de la souris
'fontSize' est la taille de police par défaut si classe n'est pas définie
Le DIV peut être formatté suivant une classe CSS prédéfinie
Il est ensuite possible de créer un tableau au sein de ce cadre en mettant true comme valeur �  tableFormat
Enfin, le texte 'txt' sera inséré dans le tableau (si défini) ou directement dans le cadre
Ce 'txt' peut lui-même contenir des balises
Le paramètre 'obj' permet d'activer cette fonction sur un évènement lié �  un obj : onclick, onmouseover,etc..

Utilisation :(Afficher du texte sur un onmouseover par exemple)
ex1 : <input type="radio" name="radio1" value="Albert" onmouseover="cadrer(this,this.value,'','',9,'','','Cadre_Radio');">
ex2 : 
	<input type="button" name="bouton1" value="Afficher" Onclick="cadrer('',this.value,'','',9,'','','Cadre_Exemple');">
	<input type="button" name="bouton2" value="Fermer" Onclick="cacher_cadre(Cadre_Exemple);">
	
ATTENTION : Cette fonction est utilisé avec celles qui la suivent, si 'obj' est défini (cf : ex1).
Sinon, il faut définir l'appel des autres fonctions distinctement (cf : ex2). 

*/
function cadrer(obj,txt,tableFormat,classe,fontSize,Xmouse,Ymouse,NomCadre)
{
	try
	{
		if(typeof(tableFormat)!="undefined" && tableFormat==true)
		{
			txt="<table cellpadding=\"5\" width=\"250\"><tr><td class=\"aide\">"+txt+"</td></tr></table>";
		}
		if(typeof(Xmouse)=="undefined" || Xmouse == "")
		{
			Xmouse=5;
		}
		if(typeof(Ymouse)=="undefined" || Ymouse== "")
		{
			Ymouse=5;
		}
		if(typeof(Cadre)=="undefined")
		{
			newCadre=document.createElement("Div");
			if(typeof(NomCadre)=="string" && NomCadre!="")
			{
				newCadre.id=NomCadre;
				newCadre.zindex=11;
				newCadre.name=NomCadre;
				Cadre=newCadre;
			}
			else
			{
				newCadre.id="Cadre";
			}
			document.body.appendChild(newCadre);
		}
		if(typeof(Cadre)!="undefined")
		{
			function crea_div()
			{
				with(Cadre)
				{
					if(typeof(fontSize)=="undefined" || fontSize == "")
					{
						fontSize=9;
					}
					if(typeof(classe)!="undefined" && classe != "")
					{
						className=classe;
					}
					else
					{
						style.cssText="visibility='hidden';position:absolute;";
					}
					
					style.left = 0;
					style.top = 0;
					
					innerHTML=String(txt);
					style.zIndex=500;
				}
			}
			this.crea_div=crea_div;
			crea_div();
			if(typeof(obj=="objet"))
			{
				obj.onmousemove=new Function("move_cadre(Cadre,"+Xmouse+","+Ymouse+")");
				obj.onmouseout=new Function("cacher_cadre(Cadre);");
			}
		}
	}
	catch(er)
	{
		alert("Une erreur est survenue  dans la fonction cadrer !"+"\nNom:"+er.name+"\nMsg:"+er.message);
	}
}


function move_cadre(Cadre,Xmouse,Ymouse)
{
	try
	{	
		if(typeof(Cadre)=="object")
		{
			with(Cadre)
			{style.visibility='';
			
				LargeurCadre=Cadre.offsetWidth;
				LongueurCadre=Cadre.offsetHeight;
				CurseurX=event.clientX+Xmouse;
				TotalX=LargeurCadre+CurseurX;
				CurseurY=event.clientY +Ymouse;
				TotalY=LongueurCadre+CurseurY;
				if(TotalX>=document.body.offsetWidth)
				{
					style.left = event.clientX-Xmouse+ document.body.scrollLeft-LargeurCadre;
				}
				else
				{
					style.left = event.clientX+Xmouse+ document.body.scrollLeft;
				}
				if(TotalY>=document.body.offsetHeight)
				{
					style.top = event.clientY -Ymouse+ document.body.scrollTop-LongueurCadre;
				}
				else
				{
					style.top = event.clientY +Ymouse+ document.body.scrollTop;
				}
				window.status=TotalY+ " - "+CurseurY+ " - "+document.body.offsetHeight +" - "+LongueurCadre;
			}
			//window.status = "X="+Cadre.style.left+"   Y="+Cadre.style.top;
		}
	}
	catch(er)
	{
		alert("Une erreur est survenue  dans la fonction move_cadre !"+"\nNom:"+er.name+"\nMsg:"+er.message);
	}
}

function cacher_cadre(Cadre)
{
	try
	{
		if(typeof(Cadre)=="object")
		{
			Cadre.style.visibility='hidden';
		}
	}
	catch(er)
	{
		alert("Une erreur est survenue  dans la fonction cacher_cadre !"+"\nNom:"+er.name+"\nMsg:"+er.message);
	}
}

/*
Permet de remplir les champs 'obj' par rapport �  une 'valeur' et suivant leur type.
Explication :
En présence d'une valeur de type liste et d'un objet composé (checkbox,radio,select ou tout type d'objet portant un nom
identique, ex : 2 champs texte nommés TEXTFIELD), il est possible que l'on soit amené �  créer une fonction de 
remplissage de ces champs pour insérer les valeurs �  la bonne place ou cocher les bonnes cases suivant une liste.
Cette fonction permet d'envoyer les bonnes valeurs aux objets concernés et de cocher les cases, selectionner 
les options dans un Select, dont la valeurs sont contenue s dans la liste passée en paramètre.
Utilisation :
Si l'on récupère des couples nom/valeur de ce type : 
	- document.form1.SELECT_NOM / "1,4,6,9",
	- document.form1.CHECKBOX1 / "petit,jeune",
au lieu de créer une fonction pour chaque type d'objet, il suffit d'appeler :
	- FillFormField(document.form1.SELECT_NOM,"1,4,6,9")
	- FillFormField(document.form1.SELECT_NOM,"petit,jeune")
Si l'on veut gérer par javascript le remplissage de tout un formulaire �  partir d'une variable de session ou d'une
variable de requête, il suffit de créer la boucle suivante :
	for(i=0;i=variable_tableau.length;i++)
	{
		obj=eval("document.form1"+variable_tableau[i].nom_de_champs)
		FillFormField(obj,variable_tableau[i].valeur_du_champs)
	}
	
ATTENTION !!!! : 
	1) Pour éviter les erreurs dues au nommage des champs, il est préférable mettre les noms de champs
	   en MAJUSCULE !!!! 
	2) Les objet de type FILE ne sont pas gérés �  cause de leur propriété VALUE en lecture seule !!!
*/
function FillFormField(obj,FieldValue)
{
	try
	{
		if(isdefined(obj))
		{
			if(isdefined(obj.length))
			{
				if(obj[0].type=="checkbox" || obj[0].type=="radio")
				{
					for(i=0;i<obj.length;i++)
					{
						re=RegExp("\\b"+obj[i].value+"\\b");
						//alert("Cherche : "+obj[i].value+" dans "+FieldValue+" = "+re.test(FieldValue));
						if(re.test(FieldValue))
						{
							obj[i].checked=true;
						}
						else
						{
							obj[i].checked=false;
						}
					}	
				}
				else if(obj.type=="select-one" || obj.type=="select-multiple")
				{
					for(i=0;i<obj.length;i++)
					{
						re=RegExp("\\b"+obj[i].value+"\\b");
						
						if(re.test(FieldValue) && obj[i].value!="")
						{
								obj.options[i].selected=true;
						}
					}
				}
			}
			else
			{
				if(obj.type=="checkbox" || obj.type=="radio")
				{
					if(FieldValue==true || FieldValue==1 || FieldValue==obj.value)obj.checked=true;
					else obj.checked=false;
				}
				else
				{
					obj.value = FieldValue;
				}
				
			}
		}
	}
	catch(er)
	{
		alert("Une erreur est survenue  dans la fonction FillFormField !"+"\nNom:"+er.name+"\nMsg:"+er.message);
	}
}

/*Transforme le contenu de l'objet 'obj' en Majuscule.
*/
function ToUpCase(obj)
{
	text=obj.value;
	obj.value=text.toUpperCase();
}

function ToUpFirstCase(obj)
{
	text=obj.value;
	obj.value=text.substr(0,1).toUpperCase() + text.substr(1,text.length);
}



/*
Crée, afffiche et fait bouger un cadre de type DIV et de nom 'NomCadre', s'il n'existe pas déj�  (nom par défaut : 'Cadre')
Xmouse et Ymouse définissent la distance du haut-gauche du cadre para rapport au pointeur de la souris
'fontSize' est la taille de police par défaut si classe n'est pas définie
Le DIV peut être formatté suivant une classe CSS prédéfinie
Il est ensuite possible de créer un tableau au sein de ce cadre en mettant true comme valeur �  tableFormat
Enfin, le texte 'txt' sera inséré dans le tableau (si défini) ou directement dans le cadre
Ce 'txt' peut lui-même contenir des balises
Le paramètre 'obj' permet d'activer cette fonction sur un évènement lié �  un obj : onclick, onmouseover,etc..

Utilisation :(Afficher du texte sur un onmouseover par exemple)
ex1 : <input type="radio" name="radio1" value="Albert" onmouseover="cadrer(this,this.value,'','',9,'','','Cadre_Radio');">
ex2 : 
	<input type="button" name="bouton1" value="Afficher" Onclick="cadrer('',this.value,'','',9,'','','Cadre_Exemple');">
	<input type="button" name="bouton2" value="Fermer" Onclick="cacher_cadre(Cadre_Exemple);">
	
ATTENTION : Cette fonction est utilisé avec celles qui la suivent, si 'obj' est défini (cf : ex1).
Sinon, il faut définir l'appel des autres fonctions distinctement (cf : ex2). 

*/
function cadrer(obj,txt,tableFormat,classe,fontSize,Xmouse,Ymouse,NomCadre)
{
	try
	{
		if(typeof(tableFormat)!="undefined" && tableFormat==true)
		{
			txt="<table cellpadding=\"2\" width=\"200\"><tr><td class=\"aide\">"+txt+"</td></tr></table>";
		}
		if(typeof(Xmouse)=="undefined" || Xmouse == "")
		{
			Xmouse=5;
		}
		if(typeof(Ymouse)=="undefined" || Ymouse== "")
		{
			Ymouse=5;
		}
		if(typeof(Cadre)=="undefined")
		{
			newCadre=document.createElement("Div");
			if(typeof(NomCadre)=="string" && NomCadre!="")
			{
				newCadre.id=NomCadre;
				newCadre.zindex=11;
				newCadre.name=NomCadre;
				Cadre=newCadre;
			}
			else
			{
				newCadre.id="Cadre";
			}
			document.body.appendChild(newCadre);
		}
		if(typeof(Cadre)!="undefined")
		{
			function crea_div()
			{
				with(Cadre)
				{
					if(typeof(fontSize)=="undefined" || fontSize == "")
					{
						fontSize=9;
					}
					if(typeof(classe)!="undefined" && classe != "")
					{
						className=classe;
					}
					else
					{
						style.cssText="visibility='hidden';position:absolute;";
					}
					
					style.left = 0;
					style.top = 0;
					
					innerHTML=String(txt);
					style.zIndex=500;
				}
			}
			this.crea_div=crea_div;
			crea_div();
			if(typeof(obj=="objet"))
			{
				obj.onmousemove=new Function("move_cadre(Cadre,"+Xmouse+","+Ymouse+")");
				obj.onmouseout=new Function("cacher_cadre(Cadre);");
			}
		}
	}
catch(er)
	{
		alert("Une erreur est survenue  dans la fonction cadrer !"+"\nNom:"+er.name+"\nMsg:"+er.message);
	}
}


function move_cadre(Cadre,Xmouse,Ymouse)
{
	try
	{	
		if(typeof(Cadre)=="object")
		{
			with(Cadre)
			{style.visibility='';
			
				LargeurCadre=Cadre.offsetWidth;
				LongueurCadre=Cadre.offsetHeight;
				CurseurX=event.clientX+Xmouse;
				TotalX=LargeurCadre+CurseurX;
				CurseurY=event.clientY +Ymouse;
				TotalY=LongueurCadre+CurseurY;
				if(TotalX>=document.body.offsetWidth)
				{
					style.left = event.clientX-Xmouse+ document.body.scrollLeft-LargeurCadre;
				}
				else
				{
					style.left = event.clientX+Xmouse+ document.body.scrollLeft;
				}
				if(TotalY>=document.body.offsetHeight)
				{
					style.top = event.clientY -Ymouse+ document.body.scrollTop-LongueurCadre;
				}
				else
				{
					style.top = event.clientY +Ymouse+ document.body.scrollTop;
				}
				window.status=TotalY+ " - "+CurseurY+ " - "+document.body.offsetHeight +" - "+LongueurCadre;
			}
			//window.status = "X="+Cadre.style.left+"   Y="+Cadre.style.top;
		}
	}
catch(er)
	{
		alert("Une erreur est survenue  dans la fonction move_cadre !"+"\nNom:"+er.name+"\nMsg:"+er.message);
	}
}

function cacher_cadre(Cadre)
{
	try
	{
		if(typeof(Cadre)=="object")
		{
			Cadre.style.visibility='hidden';
		}
	}
catch(er)
	{
		alert("Une erreur est survenue  dans la fonction cacher_cadre !"+"\nNom:"+er.name+"\nMsg:"+er.message);
	}
}

//==============================================
// PARAMETRAGE DU SCRIPT de SCROLLDOWN SXAPPS
var tjs_delai=30;
var tjs_max=50;
var tjs_mode=1; // 0 - calque toujours en haut de page / 1 - calque en bas

// LE RESTE NE CHANGE PAS
var tjs_hauteur=0;
function PrintCalque(left,top,width,height,contenu) {
	tjs_hauteur=height+25;
	if ((document.all)||(document.getElementById)) {
		var Z="<DIV id='tomber' style='position:absolute;left:"+left+";top:"+top+";width:"+width+";height:"+height+"'>"+contenu+"</DIV>";
	} else {
		var Z="<LAYER name='tomber' left="+left+" top="+top+" width="+width+" height="+height+">"+contenu+"</LAYER>";
	}
	document.write(Z);
	setTimeout("Start()",tjs_delai);
}
function Start() {
	// Toujours en haut :
	//var delta=parseInt(document.getElementById("tomber").style.top-document.body.scrollTop);
	MoveLayer("tomber",GetTop("tomber"));
	setTimeout("Start()",tjs_delai);
}
function Debug() {
	var obj=document.body
	var Z="";
	for (var i in obj) {
		Z+=i+"="+obj[i]+"\n";
	}
	alert(Z);
}
function MoveLayer(nom,top) {
	if (document.getElementById) { //IE5 et NS6
		document.getElementById(nom).style.top=top;
	}
	if ((document.all)&&(!document.getElementById)) { //IE4 seul
		document.all[nom].style.top=top;
	}
	if (document.layers) { //NS4.X seul
		document.layers[nom].top=top;
	}
}
function GetTop(nom) {
	// Partie 1 : R�cup�ration de la position du calque et de la page
	if (document.getElementById) { //IE5 
		var pos=parseInt(document.getElementById(nom).style.top);
		var wintop=parseInt(document.body.scrollTop);
		var avail=document.body.clientHeight;
	}
	if ((document.getElementById)&&(!document.all)) { //NS6
		var pos=parseInt(document.getElementById(nom).style.top);
		var wintop=parseInt(window.pageYOffset);
		var avail=window.innerHeight;
	}
	if ((document.all)&&(!document.getElementById)) { //IE4 seul
		var pos=parseInt(document.all[nom].style.top);
		var wintop=parseInt(document.body.scrollTop);
		var avail=document.body.clientHeight;
	}
	if (document.layers) { //NS4.X seul
		var pos=parseInt(document.layers[nom].top);
		var wintop=parseInt(window.pageYOffset);
		var avail=window.innerHeight;
	}

	// Partie 2 : Traitement de la position
	if (tjs_mode==0) { // toujours en haut
		var delta=Math.ceil((pos-wintop)/3);
		if (delta>20) {delta=20;}
		if (delta<-20) {delta=-20;}
		var top=pos-delta;
	}
	if (tjs_mode==1) {// toujours en bas
		var delta=Math.ceil((pos-(wintop+avail-tjs_hauteur)));
		if (delta>tjs_max) {delta=tjs_max;}
		if (delta<-1*tjs_max) {delta=-1*tjs_max;}
		var top=pos-delta;
	}
	return top;
}
