
function MM_reloadPage(init) {  //reloads the window if Nav4 resized
  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);

function MM_openBrWindow(theURL,winName,features) { //v2.0
  window.open(theURL,winName,features);
}
function MM_findObj(n, d) { //v4.0
  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;
}

function MM_changeProp(objName,x,theProp,theValue) { //v3.0
  var obj = MM_findObj(objName);
  if (obj && (theProp.indexOf("style.")==-1 || obj.style)) eval("obj."+theProp+"='"+theValue+"'");
}

function MM_goToURL() { //v3.0
  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]+"'");
}

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;}
    var xOffset = (xMax-width)/2, yOffset = (yMax-height)/2;
    
// gestion de parametres
if (option == '')
	{ var opt = '';}
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 (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+'');

/*  SX_popup window.open(URL,name,opt+taille);
  SX_popup.moveTo(gauche,haut); */
}

/*
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)
{
	try
	{
		val=trim(ObjToStr(obj).val);
		if(val!="")
		{
			alpha =/\S.+\w.+/;
			res_alpha= alpha.test(val);//test si c'est de l'alpahanumerique sans espace, retour chariot, tabulation, etc...
			point = /\./;
			res_point = point.test(val);//test s'il y a au moins 1 .
			arobase_point = /@.+\./;
			res_arobase_point = arobase_point.test(val);//test si il y a un @ avant un .
			interdit1 = /(\.@|@\.|^@|@$)/;//Interdit un mail qui commence ou finit par @
			interdit2 = /(^\.|\.$|\.\.+)/;//Interdit un mail qui commence ou finit . ou n . d'affiler, etc
			interdit3 = /[Ã©Ã¨Ã Ã¹ÃªÃ¢Ã´Ã¯Ã«Ã¤Ã¶Ã¿Ã¼Ã§^Â¨\[\]\{\}\##\&\,\;\:\/\!\$\%\*\!\+\=\?\|\/\Â°\(\)\\\s]/;//ces caractÃ¨res sont interdits
			car=/(\.{2,})/;
			while (car.test(val)==true)
			{
				val=val.replace(car,".");
			}
			car=/(@{2,})/;
			while (car.test(val)==true)
			{
				val=val.replace(car,"@");
			}
			arobase = /@/g;
			resultat = val.match(arobase);//compte le nombre d'@ (erreur si > 1)
			//alert("alpha="+res_alpha+"\nPoint="+res_point+"\nArob_Point="+res_arobase_point+"\nNbRes="+resultat.length);
			if(res_alpha==true && res_point==true && res_arobase_point==true && resultat.length==1 && interdit1.test(val)==false && interdit2.test(val)==false && interdit3.test(val)==false )
			{
				statut=true;
			}
			else
			{
				if(isdefined(alerter)==false||alerter)
				alert("Erreur dans le champs : 'Mail' !");//\n1)"+ interdit1.test(val) +"\n2)"+interdit2.test(val) +"\n3)"+interdit3.test(val) );
				statut=false;
				if(testObj(obj))
				{
					obj.focus();
				}
			}
		}
		else
		{
			statut=true;
		}
}
	catch(er)
	{
		alert("Une erreur est survenue  dans la fonction testEmail !"+"\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...
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)
{
	try
	{
		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
			{
				statut=false;
				if(testObj(obj))
				{
					if(isdefined(alerter)==false||alerter)
					alert("Erreur dans le champs : '"+obj.name+"' !");//\n1)"+ interdit1.test(val) +"\n2)"+interdit2.test(val));
					obj.focus();
				}
				else
				{
					if(isdefined(alerter)==false||alerter)
					alert("Erreur dans la valeur : '"+val+"' !!");
				}
				
			}
		}
		else
		{
			statut=true;
		}
}
	catch(er)
	{
		alert("Une erreur est survenue  dans la fonction testPhone !"+"\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...
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)
{
	//alert("ok");obj.onchange=new Function("this.value=this.value.toUpperCase();");
	//obj.value=obj.value.toUpperCase();
	text=obj.value;
	//text=text.replace(/Ã¢|Ã |Ã¤|Ã?|Ã?/gi,"A");
	//text=text.replace(/Ã©|Ã¨|Ãª|Ã?|Ã?|Ã?|Ã«|Ã?/gi,"E");
	//alert(text.search(/Ã©|Ã¨|Ãª|Ã?|Ã?|Ã?|Ã«|Ã?/));
	//text=text.replace(/Ã¯|Ã|Ã®|Ã?/gi,"I");
	//text=text.replace(/Ã¶|Ã?|Ã´|Ã?/gi,"O");
	//text=text.replace(/Ã»|Ã¹|Ã?|Ã?/gi,"U");
	//text=text.replace(/Ã¿/gi,"Y");
	//text=text.replace(/Ã§/gi,"C");
	//text=text.replace(/\,|\;/gi," ");
	obj.value=text.toUpperCase();
}











/*
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;
}