var ie = (document.all) ? 1:0;
var cr="\n", crr=cr + cr

var TDataCal = [
 ["FR",
  ["Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"],
  ["Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Aout", "Septembre", "Octobre", "Novembre", "Décembre"],
  ["Mois précédent", "Mois suivant", "Année précédente", "Année suivante"],
  "Veuillez vérifier le format de la date."
 ],
 ["EN",
  ["S", "M", "T", "W", "T", "F", "S"],
  ["JANUARY", "FEBRUARY", "MARCH", "APRIL", "MAY", "JUNE", "JULY", "AUGUST", "SEPTEMBER", "OCTOBER", "NOVEMBER", "DECEMBER"],
  ["Previous month", "Next month", "Previous year", "Next year"],
  "Please check date format."
 ]
];
TJour = TDataCal[0][1]
TMois = TDataCal[0][2]



function OptionsObj (Opt) {
  this.Add = function (Opt) {  AddProperty (this, Opt)  }
  this.Add (Opt)
}

function ListValObj () {
	this.nb = 0
	this.all = {}
	this.Referer = null
	this.Add = Add

	function Add (Cle, Valeur) {
		var n = this.nb
		if (Valeur) {
			this[n] = Valeur
			this[n].Cle = Cle
			this.all[Cle] = this[n]
		}else
			this[n] = Cle
		this[n].Index = n
		this.nb++
	}

	this.Val = function () {
		Index = this.nb-1;  if (Index<0)  return
		return this[Index]
	}

	this.Depil = function (Index) {
		if (!Index)  Index = this.nb-1;  if (Index<0)  return
		var S = this[Index]
		this.Referer = S
		this.Clear(Index)
		this.nb = Index
		return S
	}

	this.Clear = function (Cle) {
		var O, Index
		if (!Cle) {
			for (var i=0; i<this.nb; i++) {
				if (Cle=this[i].Cle)  this.all[Cle] = null
				this[i] = null
			}
			this.nb=0
		}else{
			if (typeof(Cle)=="string") {  O = this.all[Cle];  if (!O) return;  Index = O.Index  } else  Index = Cle
			if (Cle=this[Index].Cle)  this.all[Cle] = null
			this[Index] = null
			for (var i=Index; i<this.nb-1; i++) {
				this[i] = this[i+1]
			}
		  this.nb--
	  }
	}
}

//var Histor = new ListValObj(); Histor.Add("XX"); Histor.Add("aa", "YY"); alert(Histor.nb + ", " + Histor[0] + ", " + Histor[1] + ", " + Histor.all["aa"])
//alert(Histor.Depil());  alert(Histor[0] + ", " + Histor.nb)


// ====================================     S T R I N G      ===============================

function AddStr (V1, V2, Separ) {
  var S, L
  if (!V2)  return V1;  if (!V1)  return V2
  if (!Separ)  Separ = ","
  S = V1 + "";  V2+="";  L = Separ.length
  if (Separ=="&" && S.indexOf("?")<0)  Separ="?"
  if (S && S.substring(S.length-L)!=Separ && V2.substr(0,L)!=Separ)  S+=Separ
  S+=V2
  return S
}


function AddV (Chaine, V) {
	if (!Chaine || !V)  return ""
  return Chaine+V
}

function ChercheListCar(Chaine, Liste) {
	var i, l
	l = Liste.length
	for (i=0; i<l; i++) {
		if (Chaine.indexOf(Liste.substr(i,1))>=0)  return i
	}
	return -1
}

function ClearText (Chaine, Test) {
		//ClearText ("03.81.X1", "!isNaN(Car) || Car=='.'")
	var S, V="", i, l
	l = Chaine.length
	for (i=0; i<l; i++) {
		Car = Chaine.substr(i,1)
		if (eval(Test))  V+=Car
	}
  return V
}

function Decortic(Def, Sep1, Sep2){
	  //Transform une chaine en tableau multidimensionnel
  if (!Sep1)  Sep1=";";  if (!Sep2)  Sep2=","
  T1 = Def.split(Sep1)
	var T = new Array(T1.length)
  for (i=0; i<T1.length; i++) {
  	T[i] = new Array();
  	T2 = T1[i].split(Sep2)
	  for (j=0; j<T2.length; j++) {
  	  T[i][j] = T2[j]
  	}
  }
  return T
}

function FicPartie (Chemin, Partie, Separ, noCasse) {
	var S, p, r="", Ch, Nom, Ext
	if (!Chemin)  return ""
	if (!Separ)  Separ="/"
  if ((p=Chemin.indexOf("?"))<0)  Ch = Chemin;  else  Ch = Chemin.substr(0,p)
	switch(Partie) {
		case "Ext":
		  if ((p=Ch.lastIndexOf("."))<0)  r = "";  else  r = Ch.substr(p+1);
		  if (r.length>9)  r=""
		  break
		case "NomFic":  if ((p=Ch.lastIndexOf(Separ))<0)  r = Ch;  else  r = Ch.substr(p+1);  break
		case "Nom":  //sans ext
			Ext = FicPartie (Ch, "Ext", Separ)
			r = FicPartie (Ch, "NomFic", Separ)
		  if (Ext)  r = r.substr(0,r.length - Ext.length - 1)
		  break
		case "FicLie":
			Ext = FicPartie (Ch, "Ext", Separ)
			if (Ext.toLowerCase().substr(0,3)=="htm")  r = FicPartie (Ch, "Nom", Separ) + "_fichiers"
		  break
		case "RepLie":
			Ext = FicPartie (Ch, "Ext", Separ)
			if (Ext.toLowerCase().substr(0,3)=="htm")  r = Ch.substr(0,Ch.length-4) + "_fichiers"
		  break
		case "Path":
			S = FicPartie (Ch, "NomFic", Separ)
		  r = Ch.substr(0,Ch.length - S.length - 1)
		  break
	}
	if (noCasse) r = r.toLowerCase()
	return r
}

function InitString (V, n, Car) {
	var i
	if (!V)  return "";  if (V.length>n)  return V.substr(0,n)
	if (!Car)  Car=" "
	for (i=V.length; i<n; i++)  V+=Car
	return V
}

function DebString (V, n, Car) {
	var i, L
	L = V.length;  if (L>n)  return V.substr(0,n)
	if (!Car)  Car=" "
	for (i=0; i<n-L; i++)  V=Car+V
	return V
}

function Mot (Chaine, n) {
	if (!Chaine)  return ""
  var arr = Chaine.match(/\w+/g);  if (n<=arr.length) return arr[n-1]
  //var regEx = /\w+/g;  var arr;  while ((arr = regEx.exec(src)) != null)  alert(arr.length + ", " + arr.index + "-" + arr.lastIndex + "\t" + arr);
}

function Isole (Mot, Separ, no) {
  var i;  var d=-1;  var f=0;  var S=null
  for (i=0; i<no-1; i++) {
    d = Mot.indexOf(Separ,d+1)
    if (d==-1)  break;
  }
  if (d==-1 && no>1) { //Si non trouvé un séparateur
    S=""   }
  else {
    d++
    f = Mot.indexOf(Separ,d)
    if (f==-1)  f=Mot.length
    S=Mot.substring(d,f)
  }
  return(S)
}

function Isol (Chaine, Separ, n) {
  var regEx = new RegExp
  //regEx.Pattern = "([^" & Separ & "]+)":  regEx.IgnoreCase = True:  regEx.Global = True
  //Set Matches = regEx.Execute(Chaine)
  //If n<=Matches.Count Then  Isolc=Matches(n-1)
}

function Replace(Chaine, Mot, V, nb, SiMinus) {
	var Ch2
  if (!Chaine)  return;  if (V==undefined)  V=""
  var i=0, n=0
  if (SiMinus) Mot = Mot.toLowerCase()
  while (i!=-1) {  // && (nb && n<nb)
	  if (SiMinus)  Ch2=Chaine.toLowerCase();  else  Ch2 = Chaine
    i = Ch2.indexOf(Mot,i)
    if (i>=0) {
      Chaine = Chaine.substring(0,i) + V + Chaine.substring(i + Mot.length)
      i+=V.length;  n++
    }
  }
  return Chaine
}

function ReplaceVar(Chaine) {
	var i, p, p2, S, V, Nom, Obj, O
	if (!Chaine)  return Chaine
	p = Chaine.indexOf("$")
	var nbArg = arguments.length
	while (p>=0) {
	Nom = Mot(Chaine.substr(p+1),1)
	for (i=1; i<nbArg; i++) {
		O = arguments[i];  if (!O)  continue
		if (O.tagName) {
			V = O.getAttribute(Nom)
		}else{
			V = O[Nom];
			if (V==undefined && O.nod)  V = O.nod[Nom]
		}
if (V!=undefined)  break
	}
	if (!V)  V=""
	Chaine = Chaine.substr(0,p) + V + Chaine.substr(p + Nom.length + 1);  //alert(Chaine + ", " + S + ", " + p + ", ")
	p = Chaine.indexOf("$")
	}
  p = Chaine.indexOf("{")
  while (p>=0) {
  	p2 = Chaine.substr(p+1).indexOf("}")
  	Nom = Chaine.substr(p+1, p2)
  	V = ""
	  for (i=1; i<nbArg; i++) {
	  	Obj = arguments[i]
	  	try { V = eval(Nom) }catch(e){}
	  	if (V!=undefined)  break
	  }
  	if (!V)  V=""
  	Chaine = Chaine.substr(0,p) + V + Chaine.substr(p + p2 + 2)
	  p = Chaine.indexOf("{")
  }
  return Chaine
}

function Left (Chaine, n, Separ) {
	if (!Chaine)  return ""
	if (Separ) {
		var S = Right (Chaine, n, Separ)
		n = S.length+1
	}
	return Chaine.substr(0, Chaine.length - n)
}

function Right (Chaine, n, Separ) {
	// avec Separ = Isole inversé. Ex : Ext = Right(Fic,1,".")
	if (!Chaine)  return ""
	if (Separ) {
		var T = Chaine.split(Separ)
		var P = T.length - n
		if (P>=0)  return T[P]
	}
	else
	  return Chaine.substr(Chaine.length-n)
}


String.prototype.lTrim = String.prototype.trimLeft = function() {   return this.replace(/^\s*/, "");  }
String.prototype.rTrim = String.prototype.trimRight = function() {    return this.replace(/\s*$/, "");  }
function Trim(S) {
	return S.replace(/^\s*|\s*$/g,"");
  /*while (S.substring(0,1)==' ') {  S = S.substring(1,S.length);  };  while (S.substring(S.length-1,S.length)==' ') {  S = S.substring(0,S.length-1);  }
  return S*/
}

function SupprAccent(Valeur) {
  var S
  S = Valeur + ""
  S = Replace(S,"é","e");  S = Replace(S,"è","e");  S = Replace(S,"ë","e");  S = Replace(S,"ê","e")
  S = Replace(S,"à","a");  S = Replace(S,"â","a");  S = Replace(S,"ô","o");  S = Replace(S,"û","u");  S = Replace(S,"ù","u")
  S = Replace(S,"ï","i");  S = Replace(S,"î","i")
  S = Replace(S,"ç","c")
  return S
}

function VarListe(Chaine, NomVar, Separ, Egal, Op) {
	var d, p, S, Rech, SS, H, c=0
	if (!Chaine)  return
	if (!Separ)   Separ=";";  if (!Egal)   Egal="="
	Rech = NomVar + Egal
	d = Chaine.indexOf(Separ + Rech)
	if (d>=0) { d++;  c=1 }
	else {
		if (Separ=="&") { d = Chaine.indexOf("?" + Rech);  if (d>=0)  d++  }
	}
	if (d<0 && Rech==Chaine.substr(0,Rech.length)) d=0;
	if (d<0) { d = Chaine.indexOf(" " + Rech);  if (d>=0) { d++;  c=1 }  }
		//alert(Chaine + ", " + NomVar + ", d=" + d)
	if (d<0)  return
	S = Chaine.substr(d + Rech.length)
	p = S.indexOf(Separ)
	if (p>=0)  S = S.substr(0,p + Separ.length-1)
	if (Op && Op=="-") {  //alert(aa);
	 S = Chaine.substr(0, d-c) + Chaine.substr(d + c + Rech.length + S.length) }
		//alert(Chaine + ", " + NomVar + ", S=" + S)
	return Trim(S)
}


function MajListe(Chaine, NomVar, Valeur, Separ, Egal, Ajout, Bascule) {
		// location = MajListe(location.href, "Archiv", "o", "&", "=", true, "n")  si Archiv=o alors Archiv=n et vice versa
	var p, S, V, oldV
	if (!Separ)   Separ=";";  if (!Egal)   Egal="="
	if ((oldV=VarListe(Chaine, NomVar, Separ, Egal))!=undefined) {
		if (oldV && Bascule && oldV==Valeur)  Valeur=Bascule
		return Replace(Chaine, NomVar + Egal + oldV, NomVar + Egal + Valeur)
	}else{
	  if (Ajout)  return Chaine + Separ + NomVar + Egal + Valeur;  else  return Chaine
	}
}

function InsereLien(Chaine) {
   //ex : InsereLien("Cliquez sur ce lien http://www.google.fr ou sur celui-ci http://www.google.com !")
   var reg=new RegExp("((http://)[a-zA-Z0-9/.]+)+","gi");
   return Chaine.replace(reg, "<A href='$1' target=_blank>$1</A>")
}



// ====================================      NOMBRES        ===============================
function FormatN(Valeur, nbDec, Separ) {
	var deci = Math.round( Math.pow(10,nbDec)*(Math.abs(Valeur)-Math.floor(Math.abs(Valeur)))) ;
	var val = Math.floor(Math.abs(Valeur));
	if (!Separ)  Separ=" "
	if ((nbDec==0)||(deci==Math.pow(10,nbDec))) {val=Math.floor(Math.abs(Valeur)); deci=0;}
	var val_format=val + "";
	var nb = val_format.length;
	for (var i=1;i<4;i++) {
		if (val>=Math.pow(10,(3*i))) {
			val_format = val_format.substring(0,nb-(3*i)) + Separ + val_format.substring(nb-(3*i));
		}
	}
	if (nbDec>0) {
		var decim="";
		for (var j=0;j<(nbDec-deci.toString().length);j++) {decim+="0";}
		deci=decim+deci.toString();
		val_format=val_format+"."+deci;
	}
	if (parseFloat(Valeur)<0) {val_format="-"+val_format;}
	return val_format;
}

function DecToHex(d) {
	var Chif="0123456789ABCDEF";
	var h = Chif.substr(d&15,1);
	while(d>15) {d>>=4;h=Chif.substr(d&15,1)+h;}
	return h
}

function HexToDec(h) {
	return parseInt(h,16);
}

function SeparMill(nStr) {
	nStr += '';
	x = nStr.split('.');
	x1 = x[0];
	x2 = x.length > 1 ? '.' + x[1] : '';
	var rgx = /(\d+)(\d{3})/;
	while (rgx.test(x1)) {
		x1 = x1.replace(rgx, '$1' + ' ' + '$2');
	}
	return x1 + x2;
}

function Round(Num, dec) {
  return Math.round(Num * 100)/100
}

function ze(Num) {
	Rep = parseInt(Num,10);  if (isNaN(Rep))  Rep = 0
  return Rep
}

function zed(Num, Decim) {
	if (isNaN(Num)) {
		Num = Replace(Num,",",".")
		Num = parseFloat(Num);  if (isNaN(Num))  Num = 0
	}
	if (Decim==2) Num = Math.round(Num*100)/100
  return Num
}


// ====================================     D A T E S         ===============================

function ConvDate(DateTexte, FormAff) {
  var S, D, J, M, A, H, Mn, Sec, T, lg, p, Today
  J="";  A="";  H="";  Mn="";  T=""

  var DatText = DateTexte;  if (!DatText)  return ""
  if (DatText.length==19 && DatText.substr(10,1)=="T") {  //Format Save XML : 2001-09-26T00:00:00
    S = DatText.substr(8,2) + "/" + DatText.substr(4,2) + "/" + DatText.substr(0,4)
    H = DatText.substr(11,8)
    if (H!="00:00:00")  S = S + " " + H
    DatText = S
  }
  S = Replace(DatText,"/"," ").toLowerCase()
  var M1 = Isole(S," ",1);  A = Isole(S," ",2);  if (isNaN(M1) || isNaN(A))  return DatText   // pour entre 1/2 et 1/4 ou 5 derniers jours

  Today = new Date()
  D = Isole(DatText," ",1);  lg = D.length

  if (D.indexOf("/")<0) {
    J = D.substr(0,2)
    if (lg<3)  M = Today.getMonth() + 1
    else {
	    M = D.substr(2,2)
	    if (lg==6)  A = D.substr(4,2)
	    if (lg==8)  A = D.substr(4,4)
	  }
  }else{
    J = Isole(D,"/",1);  M = Isole(D,"/",2);  A = Isole(D,"/",3)
  }

  S=""
  if (A) {
  	T = A;  A = parseInt(A,10)
  	if (T.length<3) {
  		if (A<30)  A+=2000;  else if (A<1900)  A+=1900
  	}
  }
	else  A = Today.getYear()

  switch (FormAff) {
    case "SQL":   S = A + "/" + M + "/" + J;  break
    case "USA":   S = M + "/" + J + "/" + A;  break
    default:      S = J + "/" + M + "/" + A
  }

  T  = Isole(DatText," ",2)
  if (T) {
    Sec=""
    lg = T.length
    p = T.indexOf(":")
    if (p>=0) {
    	var TH = T.split(":")
    	H = TH[0];  Mn = TH[1];  if (TH.length>2)  Sec = TH[2]
    }else{
      H = T
    	p = T.indexOf("h")
	    if (p>=0) {
	      H  = T.substr(0,2)
	      Mn = T.substr(p+1,2)
      }
    }
    if (!Mn)  Mn="00";  if (Sec)  Sec=":" + Sec
    S=S + " " + H + ":" + Mn + Sec
  }
  return S
}

function FormatDate(DD, Format) {
	var S, SH, D, J, M, A, SH
  if (typeof(DD)=="date")  D = new Date(DD)
	else if (DD) {
  	D = DateJS(DD)
  }
 	if (!D)  return ""
  //if (!Format)  Format = "JJ/MM/AAAA"
	var J = D.getDate(), M = D.getMonth()+1, A = D.getYear()
	if (typeof(Format)=="string") {
    S=Format
    S=Replace(S,"JJJJ",TJour[D.getDay()]);  S=Replace(S,"JJ",twoDigits(J));  S=Replace(S,"J",J)
    S=Replace(S,"MMMM",TMois[M-1]);  S=Replace(S,"MM",twoDigits(M));  S=Replace(S,"M ",M + " ")
    S=Replace(S,"AAAA",A)
    S=Replace(S,"AA",Right(A+"",2))
    return S
  }else {
  	switch(Format) {
	    case 2:   return TJour[D.getDay()] + " " + J + " " + TMois[M-1] + " " + A;  break
	    case 3:   return twoDigits(M) + "/" + twoDigits(J) + "/" + A;  break
	    case 4:   return twoDigits(A) + "/" + twoDigits(M) + "/" + J;  break
	    case 5:   return twoDigits(J) + "/" + twoDigits(M) + "/" + twoDigits(A);  break
	    case 1:
	 	  default:
	 	    S  = twoDigits(J) + "/" + twoDigits(M) + "/" + A
	 	    SH = twoDigits(D.getHours()) + ":" + twoDigits(D.getMinutes())
	 	    if (Format==1)  SH += ":" + twoDigits(D.getSeconds())
	 	    if (SH!="00:00" && SH!="00:00:00" )  S+= " " + SH
	 	    return S
	 	    break
	 	}
  }
}

function DateJS(D) {
	if (typeof(D)=="string") {
		if (D.indexOf("/")>=0)  D = ConvDate(D,"USA")
		return new Date(D)
	}else{
		return D
	}
}

function twoDigits(N) {
  return ((N <= 9) ? "0" : "") + N;
}


// ====================================     COORDONNEES         ===============================
function Contains(Elem, O, SansElem) {
	if (SansElem && O)  O = O.parentNode
  while (O && (Elem!=O) && (O!=null))  O = O.parentNode
  return Elem == O;
}

function ContainsXY(O,X,Y) {
	var Rep
	if (!O)  return 0
	if (document.all) { X-=2; Y-=2; }  //Rep = O.contains(event.srcElement)
  dX = GetPos(O,"Left");  dY = GetPos(O,"Top");  fX = dX + O.offsetWidth;  fY = dY + O.offsetHeight //- parseInt(O.style.paddingTop) - parseInt(O.style.paddingBottom)
  //Rep = (X-5>dX && X+10<fX && Y-5>dY && Y+10<fY) ? 1:0;
  Rep = (X>dX && X<fX && Y>dY && Y<fY) ? 1:0;
  	//wb("Contains : " + Rep + " :  " + X + "," + Y + ",   " + dX + "," + dY + ",   " + fX + "," + fY + ", pt=" + O.style.paddingTop + ", pb" + O.style.paddingBottom + ", " + O.innerText)
  return Rep
}

function GetPos(el,sProp) {
	var iPos = 0
	while (el!=null) {
		iPos+=el["offset" + sProp]
		el = el.offsetParent
	}
	return iPos
}


// ====================================     D H T M L         ===============================
function Aff(O, Tag, Test)  {
	var S
	if (typeof(O)=="string")  O = LID(O);  if (!O)  return
	if (Tag) if (!(O=ElemPTag(O,Tag)))  return;  //alert(Lout(O)+crr+Test)
	S="block";  if (Test!=undefined && !Test)  S="none"
	O.style.display = S
}
function Hide(O, Tag) {
	if (typeof(O)=="string")  O = LID(O);  if (!O)  return
	//alert(Tag + ", " + Lout(O) + ", " + Lout(ElemPTag(O,Tag)))
	if (Tag) if (!(O=ElemPTag(O,Tag)))  return
	if (O)  O.style.display = "none"
}
function Disp(O)  {
	if (typeof(O)=="string")  O = LID(O)
	if (O)  return O.style.display
}
function SiAff(O)  {
	if (typeof(O)=="string")  O = LID(O)
	if (O)  return (O.style.display!="none")
}

function InverseDisplay(O, O2, Param) {
	var S
	if (typeof(O)=="string") O = LID(O);  if (typeof(O2)=="string") O2 = LID(O2)
	if (O && O2) {
		if (Param) {
			O.style.display = Param;  O2.style.display = (O.style.display=="none") ? "block" : "none"
		}else{
			S = O.style.display;  O.style.display = O2.style.display;  O2.style.display = S
		}
	}else{
    if (O)  O.style.display = (O.style.display=="none") ? "block" : "none"
  }
}

function InsertBef(Dest, O) {
	var N
  if (document.all)  N = Dest.insertBefore(O);  else  N = Dest.insertBefore(O,Dest.lastChild)
  return N
}

function RMNod(O) {
	if (O) O.parentNode.removeChild(O)
}

function WinParent(Quoi) {
	// retrouve la fenêtre de niveau Niv
	var W, Win = window
	if (!Quoi)  Quoi=0
//	while (Win.name && Win.name!="SIP") {
//		if (Quoi==1 && (!Win.parent.name || Win.parent.name=="SIP"))  return Win
//		Win = Win.parent
//	}
	while (Win!=Win.parent) {
		if (Quoi==1 && Win.parent==Win.parent.parent)  return Win
		Win = Win.parent
	}
	return Win
}

// ====================================     GET & PUT         ===============================
function $(Nom) {
  if (arguments.length > 1) {
    for (var i=0, T=[], L=arguments.length; i<L; i++)  T.push(document.getElementById(arguments[i]))
    return T
  }
  if (typeof Nom=="string")  O = document.getElementById(Nom);  else  O = Nom
	if (!O) {  O = Doc.getElementsByName(Nom);  if (O)  O=O[0] 	}
  return O
}

function LID(Nom, Doc) {
	var O
	if (!Nom)  return null
	if (!Doc)  Doc = document
	if (typeof(Nom)=="string")  O = Doc.getElementById(Nom);  else  O = Nom
	if (!O) {  O = Doc.getElementsByName(Nom);  if (O)  O=O[0] 	}
	return O
}

function LText(O, Col) {
	if (O.tagName=="TR" && Col!=undefined)  O = O.cells[Col]
	if (ie)  return(Trim(O.innerText));  else  return(O.innerHTML)
}

function Lout(O,Alert) {
	if (!O)  return
	O=LID(O);  if (!O)  return
	var S = (ie) ? O.outerHTML : O.parentNode.innerHTML
	if (Alert=="!") alert(S)
	return S
}

function LTags(Div,Nom) {
	if (!Div || !Nom)  return
	return Div.getElementsByTagName(Nom)
}

function LTag(Div,Nom) {
	var O = LTags(Div,Nom)
	if (O.length>0)  return O[0]
}

function LX(Obj,Nom,Opt) {
	var O, R
	if (typeof(Obj)=="string")  O = LID(Obj);  else  O = Obj
	if (O) R = O.getAttribute(Nom);  else  R = undefined
	if (!Opt && R==undefined)  R=""
	return R
}

function PX(Obj,Nom,V) {
	var O
	if (typeof(Obj)=="string")  O = LID(Obj);  else  O = Obj
	if (O)  return O.setAttribute(Nom,V)
}

function RX(Obj,Nom) {
	var O
	if (typeof(Obj)=="string")  O = LID(Obj);  else  O = Obj
	if (O)  O.removeAttribute(Nom)
}

function SetAt(Nom, Chaine) {
	var O, T, i
	O = LID(Nom)
	T = Chaine.split(";")
	for (i=0; i<T.length; i++) {
		P = T[i].split("=")
		if (P.length>1)  O.setAttribute(Trim(P[0]),Trim(P[1]))
	}
}

function LVal(Ctl, SiText) {
	var O, V, Tag
	if (typeof(Ctl)=="string") O = LID(Ctl);  else  O = Ctl
	if (!O)  return
	Tag = O.tagName
	if (Tag=="SELECT") {
	  if (SiText) V=LitSelect(O);  else  V=O.value
	}else if (O.type)
		switch(O.type) {
			case "checkbox":  V = O.checked;  break;
			case "radio":  V = LitRadio(O);  break;
			default:  V = O.value
		}
	else if (O.tagName) {
	  switch (O.tagName.toLowerCase()) {
		  case "img": case "imagedata":  V = O.src;  break
		  case "input":  V = O.value;  break
		  case "a":  V = O.href;  break
		  default:  V = LText(O)
	  }
	}
	return V
}

function PVal(Ctl, V, SiHtml) {
	var O
	if (typeof(Ctl)=="string") O = LID(Ctl);  else  O = Ctl
	if (!O)  return
	if (V==undefined)  V=""
	if (O.type)
		switch(O.type) {
			case "checkbox":  O.checked = V;  break;
			case "radio":   LitRadio(O, V);  break;
			default:  O.value = V
		}
	else if (O.tagName) {
	  switch (O.tagName.toLowerCase()) {
		  case "img": case "imagedata":  O.src = V;  break
		  case "input":  O.value = V;  break
		  case "a":  O.href = V;  break
		  default:  if (SiHtml || !ie)  O.innerHTML = V;  else  O.innerText = V
	  }
	}
}



// ====================================     Recherche  DHTML        ===============================
function CalcIndex (Elem) {
	var ElemP, Os, O, i
	ElemP = Elem.parentNode
  Os = ElemP.getElementsByTagName('*')
	for (i=0; i<Os.length; i++) {
    if (Os[i]==Elem)  return i
	}
}

function Elem (El, Test, SiUp) {
	var O, i
	O = El
  while (O) {
  	if (O.nodeName.substr(0,1)!="#") {
	    if (eval(Test))  return O
	  }
	  if (SiUp)  O = O.previousSibling;  else  O = O.nextSibling
	}
}

function ElemFils(Obj, Test) {
	var O, R
	if (!Obj || !Test)  return;
	R = null
  for (var i=0; i<Obj.childNodes.length; i++) {
  	O = Obj.childNodes[i]
    if (O.nodeName=="#text") {
    	if (Eval(Test))  R = O;  else  return null
  	}else {
        //alert(O.outerHTML + ", " + "==>" + eval("O"))
    	if (eval(Test))  R = O;  else  R = ElemFils(O,Test)
    }
   	if (R)  return R
  }
}

function ElemIn (ElemP, Test, In, Action, P1, P2, P3) {
	var Os, O, i, Res
	if (ElemP.length)  Os = ElemP
  else if (In)  Os = ElemP.getElementsByTagName('*');  else  Os = ElemP.childNodes
	if (!Os.length)  return
	if (Test=="Ctl")  Test = "'INPUT,SELECT,TEXTAREA'.indexOf(O.tagName)>=0"
	for (i=0; i<Os.length; i++) {
		O = Os[i]
		if (O.nodeName.substr(0,1)!="#") {
	    //if (ie)  wb (i + ", " + O.outerHTML.substr(0,150));  else  alert(O.innerHTML)
	    if (eval(Test)) {
	    	Res = O
	    	if (Action)	{
	    		eval(Action)
	    	}else	break
	    }
		}
	}
	return Res
}

function ElemParent(Obj, Test) {
	var O, R
	O = Obj;	if (!O)  return
	if (O.nodeName=="#text")  O = O.parentNode
	while (O && O.nodeName.substr(0,1)!="#" && O.tagName!="BODY") {
		  //alert(Test + " = " + eval(Test) + "\n\n" + O.outerHTML)
		if (eval(Test))  return O
    O = O.parentNode
  }
}

function ElemPTag (Obj, tagName) {
	var O = Obj;  if (!O)  return
	if (O.nodeName=="#text")  O = O.parentNode
	while (O && O.nodeName.substr(0,1)!="#") {
		//alert(O.tagName + "\n" + O.outerHTML + O.parentNode.outerHTML)
		if (O.tagName == tagName) 	return O;
		O = O.parentNode;
	}
	return null;
}

function ElemPAt(Obj, At, V) {
	var O, S
	S = "O.getAttribute('" + At + "')";  if (V) S+="=='" + V + "'";  else  S+="!=null"
 	return ElemParent(Obj,S)
}



// ====================================          T A B LE A U         ===============================
function TLookUp(Obj, Rech, ColExtract) {
	var T, TR, i, j, VR, nbOk, nbColRech, NbCol, NbLig, noExtract
	  // si Rech="Toto;;5",  renvoi la colonne ColExtract lorsque la 1°col=Toto et la 3°col=5. Renvoi TR si !ColExtract
	if (typeof(Obj)=="string")  Obj = LID(Obj)
	T = LID(Obj);  if (!T)  return null
	NbLig = T.rows.length;  if (!T || !NbLig)  return null
	noExtract = (ColExtract)?ColExtract:0
	if (isNaN(noExtract)) noExtract = TRLookUp(T.rows[0], noExtract)
  var TRech = Rech.split(";");  nbColRech = TRech.length
  var NbCol = T.rows[0].cells.length
	if (NbCol<noExtract)  return null
	for (i=0; i<T.rows.length; i++) {
		TR = T.rows[i]
		nbOk = 0
		for (j=0; j<nbColRech; j++) {
			VR = TRech[j]
			if (!VR) nbOk++
			else {
				if (VR=="!" && Trim(LText(TR.cells[j]))=="") nbOk++
				else if (LText(TR.cells[j])==VR) {
					nbOk++
				}
					//alert(j + ", " + VR + " =? " + LText(TR.cells[j]) + ", " + nbOk + ", " + nbColRech + ", " + ColExtract)
			}
		}
		if (nbOk==nbColRech)
			if (ColExtract) {
				return LText(TR.cells[noExtract]);
			}else  return TR
	}
	return null
}

function TRLookUp(TR, Rech, noL) {
 	// TD = TRLookUp(TR, "=LX(TD,'Champ')=='Titre'", -1)
	var i, TD, S, Rechl, Test, ok
	if (!TR)  return null
	if (Rech.substr(0,1)=="=")  Test = Rech.substr(1);  else  Rechl = Rech.toLowerCase()
	for (i=0; i<TR.cells.length; i++) {
		TD = TR.cells[i]
		if (Test) {  if (eval(Test))  ok=true;  /*alert(Test + ", " + eval(Test));*/  }
		else if (Trim(LText(TD)).toLowerCase()==Rechl)  ok=true
		if (ok) {
			if (!noL)  return i
			else if (noL<0)  return TD
			else {
				var TR2 = TR.parentNode.rows[noL];  if (TR2)  return LText(TR2.cells[i])
			}
		}
	}
}

function LTD(TR, n) {
	if (!TR)  return
	n = ze(n);  if (n>=TR.cells.length) return
	return LText(TR.cells[n])
}


// ====================================       OBJETS JS      ===============================
function AddProperty(Obj, Opt, Separ) {
  if (!Obj || !Opt)  return
	var T, T2, T3, Expr, V, D, Key, Typ="", L, p
	if (!Separ)  Separ="|"
	T = Opt.split(Separ)
	for (Expr in T) {
    T2 = T[Expr].split("=");  L = T2.length
    if (L>1) {
    	Key = Trim(T2[0]);  V = Trim(T2[1])
    	switch(V.toLowerCase()) {
    		case "true":  V=true;  break
    		case "false": V=false;  break
    		case "null":  V=null;  break
    		case "undefined":  V=undefined;  break
    	}
    	Typ="T"
    	if ((p=Key.indexOf(":"))>=0) {  Typ = Key.substr(p+1);  Key = Key.substr(0,p)  }
    	switch(Typ) {
    		case "N":  V = parseInt(V);  break
    		case "D":  V = new Date(V);  break
    		case "B":  V = eval(V);  break
    	}
    	if (L>2) {
    		if (V) {
    			for (i=2; i<L; i++)  V+= "=" + Trim(T2[i])
    	  }else {
    	  	try {  V = eval(T2[2]);  }catch(e){}   //ex: Coche==true
    	  }
    	}
      Obj[Key] = V
    }
  }
}

function AddFunction(Obj, NomFonctObj, NomFonct) {
	var Fonct
	if (!NomFonct)  NomFonct = NomFonctObj
	try {
	  Fonct = eval(NomFonct)
    Obj[NomFonctObj] = Fonct
	}catch(e){
  	Obj[NomFonctObj] = function() { }
	}
}

function NodtoXml(Obj, Tag, Niv, Exclus) {
	var ret, H="", avt="", i, Typ
	if (!Obj)  return ""
	for (i=0; i<Niv; i++)  avt+= "\t"
	for (NomObj in Obj) {
		if (!Exclus.indexOf(NomObj + ","))  continue
  	O = Obj[NomObj]
		V = O;  Typ = typeof(O)
		if (Typ!="function" && Typ!="object" && V)  H+= ' ' + NomObj + '="' + V + '"'
  }
  if (!H) return ""
  if (Tag) return avt + "<" + Tag + H + "/>\n";  else  return H
}

function StructObj(Obj, Niv) {
	var ret, H="", avt="", i
	for (i=0; i<Niv; i++)  avt+= "    "
	for (NomObj in Obj) {
  	O = Obj[NomObj]
  	if (typeof(O)!="function") {
  		//alert(NomObj + "=" + O + ", " + typeof(O))
  		if (NomObj=="all")  continue
  		V = O
			switch (typeof(O)) {
				case "boolean":  V = (O) ? "true":"false";  break
			  case "string":   V = "'" + O + "'";  break
			  case "number":   V = O;  break
			}
	  	if (V)  H+= avt + NomObj + "=" + V + ", " + typeof(O) + "\n"
		  //if (NomObj=="Cle")  alert(aa)
  		if (typeof(O)=="object" || typeof(O)=="undefined")  H+= StructObj(O, Niv+1)
	  }
  }
  return H
}

// ====================================    D R A G  &  D R O P     ===============================



// ====================================      D I V E R S        ===============================
function AnnulEvent(ev, SiServer) {
  if (SiServer && ServerName && ServerName.indexOf(".")<0)  return
	if (ie) {
		ev = window.event;  if (!ev)  return
		ev.cancelBubble = true
		ev.returnValue = false
	}else{
		ev.preventDefault()
		ev.stopPropagation()
	}
}

function Focus(Ctl) {
	var Nom
	if (typeof(Ctl)=="string")  Ctl = LID(Ctl)
	try {
		Nom = Ctl.name
	  Ctl.focus()
	}catch(e){
		window.status="Contrôle " + Nom + " non prêt"
	}
}

function FocusEnd(Ctl) {
	try {
	  Ctl.focus();  Ctl.select()
	  var txtR = Ctl.createTextRange();  txtR.moveEnd("textedit");  txtR.moveStart("textedit");  txtR.select()
	}catch(e){
		window.status="Ctl non trouvé"
	}
}

function LoadJS(Ad, Ext) {
  //var oNode=document.createElement("script"); document.getElementsByTagName("body")[0].appendChild(oNode);
  Ext = (Ext)?Ext:"js";var Scr = (Ext=="vb")?"vb":"java"
  try {
		with (document.getElementsByTagName("head")[0].appendChild(document.createElement("script"))) {
			setAttribute("id", "newscript", 0);setAttribute("type", "text/" + Scr + "script", 0);setAttribute("src", Ad + "." + Ext, 0);
	  }
  }catch(e){}
}

function Eval(Chaine, SiMsg) {
	try {
		return eval(Chaine)
  }catch(e){
  	if (SiMsg)  alert(e.description)
  	return null
	}
}

function FileSystem(Opt) {
	var fso
	try {
  	fso = new ActiveXObject("Scripting.FileSystemObject")
  }catch(e){
		fso = null
		switch (Opt) {
			case 0:  alert("Le navigateur n'est pas configuré pour ce type d'opération\n\n" + e.description);  break
			case 1:  window.open("/sites/i2g/synchro/install sécurité.asp", "InstallSecur", "width=450,height=500,resizable=yes");	break;
		}
  }
  return fso
}

function ObjXUpload(SiMsg, Quoi) {
	var XUpload
	if (!Quoi)  Quoi="XUpload"
	try {  XUpload = new ActiveXObject("Persits." + Quoi)  }catch(e){  XUpload = null;  if (SiMsg)  alert("le composant de transfert n'est pas installé")  }
  return XUpload
}

function XmlPost(Param, Ad, NomVar, Win) {
  var Mess, Post = false
  if (!Ad)  Ad = "/sites/i2g/pgm/bdbox.aspx"
  if (Win) {
  	window.open(Ad + "?" + Param);  Mess="!"
  	return
  }
	if (window.XMLHttpRequest) {
    Post = new XMLHttpRequest()
    if (Post.overrideMimeType)  Post.overrideMimeType('text/xml')
	}else if (window.ActiveXObject) {
	  try {
	    Post = new ActiveXObject("Msxml2.XMLHTTP")
	  } catch (e) {
	    try {  Post = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {}
	  }
	}
	if (!Post)  return false

	//Post.onreadystatechange = function() { alertContents(Post); }
	Post.open('POST', Ad, false)
	Post.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
	Post.send(Param)

  try {
  	Mess = Post.responseText;    //alert(Mess + ", " + Mess.substr(0,6))
  }catch(e){  Mess="?" }
  if (NomVar)  Mess = VarListe(Mess, NomVar)
	return Mess
}

function LitValSql(AjUrl, Sql) {
	var Msg, n, S
  Msg = XmlPost(AjUrl + "&action=LitValSql&Sql=" + escape(Sql), "/sites/i2g/pgm/LitData.aspx")
  N = Isole(Msg,"|",1);  if (isNaN(N)) { alert("Impossible d'exécuter la requête" + crr + Msg);  return "" }
  return Msg
}

function LitBase(AjUrl, Ch, SqW) {
	var Msg, n, S
  Msg = XmlPost(AjUrl + "&action=LitBase&Ch="+Ch+"&SqW=" + escape(SqW), "/sites/i2g/pgm/LitData.aspx")
  N = Isole(Msg,"|",1);  if (isNaN(N)) { alert("Impossible d'exécuter la requête" + crr + Msg);  return "" }
  return Msg
}

function wh(Msg) {
	if (DivBug) DivBug.insertAdjacentHTML("BeforeEnd", Msg + "<BR>")
}

function wb(Msg) {
	if (!DivBug)  return
  var S = Msg
  if (ie) {
    S = S.replace(/</g,"&lt;");  S = S.replace(/>/g,"&gt;");  S = S.replace(/\[/g,"<");  S = S.replace(/\]/g,">");
    DivBug.insertAdjacentHTML("BeforeEnd", S + "<BR>")
  }else  alert(Msg)
}




