/* RUBRIQUES
	_NOMBRES_   _DATES_   _TABLEAUX_   _COORDONNEES_   _GET_PUT_   _FORM_   _DHTML_   _ManipDOM_   _Rech_DHTML_   _OBJETS_JS_   _JSON_   _EVENT_   _INTERACTIF_   _COOKIES_   _SYSTEM_   _AJAX_   _DIVERS_
*/
var ie = (document.all) ? 1:0;  var navV = 0
if (navigator.appVersion.indexOf("MSIE")!=-1) {  S=navigator.appVersion.split("MSIE");  navV=parseFloat(S[1]); }

var Y
var pixX, pixY
var cr = "\n", crr=cr + cr
var WinBug

//var App = new Object()
function ClassFO(){}
var App = new ClassFO();  App.Vars = {};  App.Modul = {};
var Tables = [],  Apg = {};

var AjUrl = ''
var TRClic

document.onmousemove = PosMouse  //nécessaire pour clic-droit sur Tree : Tor.PosWinEvent


function Var(Nom) {
	if (typeof(window[Nom])!='undefined')  return window[Nom]
}

function OptionsObj (Opt) {
  this.Add = function (Opt) {  AddProperty (this, Opt)  }
  this.Add (Opt)
}

var TableClass = function() {}


// ====================================     _STRING_      ===============================
function isStr(V) { return (typeof(V)=='string') }
function isObj(V) { return (typeof(V)=='object') }

function AddStr (V1, V2, Separ) {
  var S, L
  if (!V2)  return V1;  if (!V1)  return V2
  if (!Separ)  Separ = ","
  V1+="";  V2+="";  L = Separ.length
  //if (Separ=="&" && V1.indexOf("?")<0)  Separ="?"
  if (V1.substring(V1.length-L)==Separ)  V1 = V1.substring(0,V1.length-L)
  if (V2.substr(0,L)==Separ)  V2 = V2.substr(L)
  S = V1+Separ+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 Minus(Li) {  if (CasseUniq(Li))  return Li.toLowerCase();  else  return Li }
function Majus(Li) {  if (CasseUniq(Li))  return Li.toUpperCase();  else  return Li }

function NomPropre(SMot, Opt) {
  var Lig, C1, C2, C3, C4, C5, Mot, Mx
  if (!SMot) return ""
  Mx = SMot.length
  if (!Opt && !CasseUniq(SMot))  return SMot

  Mot = SMot.toLowerCase()
  Lig = Mot.substr(0,1).toUpperCase()
  for (C=1; C<Mx; C++) {
    C1 = Mot.substr(C-1,1)
    C2 = Mot.substr(C,1)
    if (C+1<Mx)  C3 = Mot.substr(C+1,1);  else  C3=" "
    if (C+2<Mx)  C4 = Mot.substr(C+2,1);  else  C4=" "
    if (C+3<Mx)  C5 = Mot.substr(C+3,1);  else  C5=" "
    M1 = C2 + C3 + C4;  M2 = M1 + C5
    if ("de du d' le la l' et ".indexOf(M1)>=0 || "rue des les ".indexOf(M2)>=0) {
    	Lig=Lig + C2
    }else{
      if (" ,;./-'".indexOf(C1)>=0)  Lig += C2.toUpperCase();  else  Lig += C2
    }
  }
  return Lig
}

function CasseUniq(Mot) {
  var C, C1, nbMin=0, nbMaj=0
  var Mx = Mot.length
  for (C=0; C<Mx; C++) {
    C1 = Mot.substr(C,1)
    if (C1>="A" && C1<="Z")  nbMaj++
    if (C1>="a" && C1<="z")  nbMin++
  }
  return !(nbMin>0 && nbMaj>0)
}

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, aGauche) {
	var i
	if (!V)  return "";  V=V+'';  if (V.length>n)  return V.substr(0,n)
	if (!Car)  Car=' '
	if (aGauche)	for (i=V.length; i<n; i++)  V=Car+V;  else  for (i=V.length; i<n; i++)  V+=Car;
	return V
}

function Mot (Chaine, n) {
	var arr, reg
	if (!Chaine)  return ''
	arr = Chaine.match(/\w+/g);
	if (n!=undefined && n<=arr.length) return arr[n-1];  else  return arr
  //var regEx = /\w+/g;  var arr;  while ((arr = regEx.exec(src)) != null)  alert(arr.length + ", " + arr.index + "-" + arr.lastIndex + "\t" + arr);
}

function Isole (Li, Separ, no) {
  var T, P, L
  if (!Li)  return ""
	T = Li.split(Separ);  L = T.length
 	if (no<0)  P = L + no;  else  P = no-1
	if (P>=0 && P<L)  return T[P];  else  return null
}

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 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)
}

function IsoleTag(H, Tag) {
	var h = H.toLowerCase(), tag = Tag.toLowerCase(), d, f
  d = h.indexOf('<'+tag);
	d = h.indexOf('>',d)
  f = h.indexOf('</'+tag+'>',++d)
	if (f>=0)  return H.substr(d,f-d);  else  return H.substr(d)
}


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) {
	if (S && isStr(S)) return S.replace(/^\s*|\s*$/g,'');  else  return S
}

function Replace(Chaine, Li, V, nb, SiMinus) {
  if (!Chaine)  return "";  if (V==undefined)  V=""
  var Ch2, i=0, n=0
  if (SiMinus) Li = Li.toLowerCase()
  while (i!=-1) {  // && (nb && n<nb)
	  if (SiMinus)  Ch2=Chaine.toLowerCase();  else  Ch2 = Chaine
    i = Ch2.indexOf(Li,i)
    if (i>=0) {
      Chaine = Chaine.substring(0,i) + V + Chaine.substring(i + Li.length)
      i+=V.length;  n++
    }
  }
  return Chaine
}

//"hello".replace(/e|o/g, "x") // "hxllx"
function RegReplace (Chaine, Reg_exp, V, Opt) {
	// RegReplace(H, "<o:p><\/o:p>", "<br />"),  (html, "<st1:.*?>", ""),  (value, "[ \t\r\n]|%20", ""),  (content, "\r\n", "<br />", "gi"),  (url, '(http|https):///', '/')
	if (!Chaine)	return Chaine
	if (!Opt) Opt = 'g'
	var re = new RegExp(Reg_exp, Opt)
	return Chaine.replace(re, V)
}

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 MajValeurs(C1, C2, Sep, Opt) {
	//alert(MajValeurs(";a=1;b=2;", "a=11;b=;c=33", "=;"))
	var Li, i, V, S, T, T1, T2, key, SepV, SepL, SepZ
	if (!C2)  return;  if (!Opt)  Opt = new Object()
	if (!Sep)  Sep=",;";  else if (Sep.length<2)  Sep+=";";		SepV = Sep.substr(0,1);  SepL = Sep.substr(1,1);  SepZ = Sep.substr(2,1);
	T1 = Tableau1D(C1,Sep);  T2 = Tableau1D(C2,Sep)
	for (key in T2) {
		T1[key] = T2[key]
	}
	Li=""
	for (key in T1) {
	  V = T1[key]
	  if (SepZ && V.indexOf(SepZ)>=0) { T = V.split(SepZ);  V = T[0];  if (V==T[1]) V="" }
	  if (V)  Li+=SepL + key + SepV + V
	}
	if (Li) { Li = Li.substr(1);  if (Opt.Cadre)  Li=SepL+Li+SepL }
	return Li
}

function ReplaceVar(Chaine) {
		//	VueAct.TBody = "<TD class=Ongl_Menu><div>{Obj.Cle} $Lib</div></TD>"
	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 + ", " + V + ", " + 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 VarListe(Chaine, NomVar, Separ, Egal, Opt) {   // Cle = VarListe(location.search, 'Cle', "&", "=")
	var d, p, S, Rech, SS, H, Op, c=0, V = undefined
	if (typeof(Opt)=="string") { Op = Opt;  Opt=null; };  if (!Opt)  Opt = new Object();
	if (Opt.FctTyp && Opt.FctTyp=="T")  V=""
	if (!Chaine)  return V
	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 = 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 V
	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, "Pgm", V, "&", "="), MajListe(location.href, "Archiv", "o", "&", "=", true, "n")  si Archiv=o alors Archiv=n et vice versa
		//location.href=MajListe(location.href,'Mode','admin','&','=',1,'normal')
	var p, S, V, oldV, re
	if (!Separ)   Separ=";";  if (!Egal)   Egal="="
	if ((oldV=VarListe(Chaine, NomVar, Separ, Egal))!=undefined) {
		if (oldV && Bascule!=undefined && oldV==Valeur)  Valeur=Bascule
		re = Replace(Chaine, NomVar + Egal + oldV, NomVar + Egal + Valeur)
	}else{
		if (Ajout) {
			if (Separ=="&" && Chaine.indexOf('?')<0)  Separ='?'
			re = Chaine + Separ + NomVar + Egal + Valeur;
		}else
			re = Chaine
	}
	return re
}

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>")
}

function MakePwd(length, extraChars, firstNumber, firstLower, firstUpper, firstOther, latterNumber, latterLower, latterUpper, latterOther) {
	// MakePwd(8, '', true, true, true, false, true, true, true, false);
	var rc = '';
	if (length>0)  rc = rc + getRandomChar(firstNumber, firstLower, firstUpper, firstOther, extraChars);
	for (var idx=1; idx<length; ++idx) {
		rc = rc + getRandomChar(latterNumber, latterLower, latterUpper, latterOther, extraChars);
	}
	return rc;
}

function getRandomChar(number, lower, upper, other, extra) {
	var numberChars = "0123456789";
	var lowerChars = "abcdefghijklmnopqrstuvwxyz";
	var upperChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	var otherChars = "`~!@#$%^&*()-_=+[{]}\\|;:'\",<.>/? ";
	var charSet = extra;
	if (number == true)
	charSet += numberChars;
	if (lower == true)
	charSet += lowerChars;
	if (upper == true)
	charSet += upperChars;
	if (other == true)
	charSet += otherChars;
	return charSet.charAt(getRandomNum(0, charSet.length));
}

function getRandomNum(lbound, ubound) { return (Math.floor(Math.random() * (ubound - lbound)) + lbound); }


// ====================================      _NOMBRES_        ===============================
function FormatN(Valeur, nbDec, Opt) {
	var deci = Math.round( Math.pow(10,nbDec)*(Math.abs(Valeur)-Math.floor(Math.abs(Valeur)))) ;
	var val = Math.floor(Math.abs(Valeur));
	if (!Opt)  Opt=", ";  Separ = Opt.substr(0,1);  CarMil = Opt.substr(1,1);  Symbol = Opt.substr(2)
	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)) + CarMil + 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 + Separ + deci;
	}
	if (parseFloat(Valeur)<0) {val_format="-"+val_format;}
	return val_format + Symbol;
}

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) {
	var x, x1, x2, 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 Bit(N, P, V) {
	//Si V positionne le bit P à 1, sinon à 0
	var PP, M
	if (V==undefined)  V=1
	PP = Math.pow(2,P-1)
	if (V) {
		N = N | PP;    //alert(PP+cr+N)
	}else{
	  M = Math.pow(2,16)-1 ^ PP
	  N = N & M
	}
  return N
}

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) {
	if (typeof(Num)=="string")  Num = Replace(Num,',','.')
	var r = parseFloat(Num);  if (isNaN(r))  r = 0
  return r
}

// ====================================     _DATES_         ===============================

function ConvDate(DateTexte, FormAff) {
  var S, D, J, M, A, H, Mn, Sec, T, lg, p, Today
  J = A = H = Mn = T = ''

  var DatText = Trim(DateTexte);  if (!DatText)  return ''
  if (DatText=='0') { DatText = FormatDate(new Date()) }
  S = DatText.substr(0,1);  if (S=='+' || S=='-') { S = addDays(new Date(),ze(DatText));  DatText = FormatDate(S) }
  S = Replace(DatText,"/"," ").toLowerCase()
  S = Replace(S,"-"," ")
  var M1 = Isole(S," ",1);  T = Isole(S," ",2);  if (isNaN(M1) || isNaN(T))  return DatText   // pour entre 1/2 et 1/4 ou 5 derniers jours

  Today = new Date()
  D = Isole(DatText," ",1);  D = Replace(D,"-","/");  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)
    if (J.length==4) {  S=J;  J=A;  A=S; }
  }
  if (J=='00')  return
		//alert(D+", "+J+", "+M+", "+A)
  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()
    if (A<200)  A=A-100+2000  //Bug Chrome ??
	}
	J = InitString (J, 2, '0', 1);  M = InitString (M, 2, '0', 1)

  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 (A<200)  A=A-100+2000  //Bug Chrome ??
		//alert(D+crr+J+cr+M+cr+A)
	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") {
	  D = Replace(D,"-","/")
		if (D.indexOf("/")>=0)  D = ConvDate(D,"USA")
		return new Date(D)
	}else{
		return D
	}
}

function addDays(d,j) {
 return new Date(d.getTime() + (1000 * 60 * 60 * 24 * j));
}

function twoDigits(N) {
  return ((N <= 9) ? "0" : "") + N;
}

// ====================================      _TABLEAUX_        ===============================

// http://www.java2s.com/Tutorial/JavaScript/0220__Array/UsingcontainsmethodfromzArrayLibrary.htm
function Tclone(T) { return T.concat(); };
function Tin(T,V) {	var S = ','+T.toString()+',';  return (S.indexOf(','+V+','))>-1; }

function isArray(obj) {
	if (obj.constructor.toString().indexOf("Array") == -1)
	  return false;
	else
	  return true;
}

function InArray(T, V) {    // InArray(T,'ax*')
	var i, L, c, nbc
	c = Right(V,1);
	if (c=='*')  V = V.substr(0,V.length-1)
	else if (Array.prototype.indexOf)  return T.indexOf(V)
	L = T.length;  nbc = V.length
	if (c=='*')
		for (i=0; i<L; i++) {
			if (T[i].substr(0,nbc)==V)  return i
		}
	else
		for (i=0; i<L; i++)  if (T[i]==V)  return i
	return -1;
}

function RechArray(T, VRech, noRech, noV, Opt) {
	var i, L, R, vr, va, vt=-1
	if (noRech==undefined)  noRech = 0;  if (noV==undefined)  noV = 1
	L = T.length
	for (i=0; i<L; i++) {
		R = T[i]
		vr = R[noRech];  va = R[noV]
		switch(Opt) {
			case '>':  if (vr>VRech)  return vt;  else  vt = va;  break
			default:  if (vr==VRech)  return va
		}
	}
	return vt;
}

function Tableau1D(Def, Sep, Opt) {
	var SepV, SepL, T, T1, T2, i, j, S, lim
	Sep = Sep || ',;';  Opt = Opt || {}
	SepV = Sep.substr(0,1);  SepL = Sep.substr(1)
	if (!Def)  return new Array()
	T1 = Def.split(SepL)
	var T = []
	for (i=0; i<T1.length; i++) {
		S = T1[i]
		if (S.indexOf(SepV)>0) {
			T2 = S.split(SepV)
			T[Trim(T2[0])] = Trim(T2[1])
		}
	}
	//alert(JSW(T)+crr+Def)
	return T
}

function Tableau2D(Def, Sep, Opt){
		//Transform une chaine en tableau multidimensionnel
	var SepV, SepL, T, T1, T2, i, j, S, lim=-1
	Sep = Sep || ',;';  Opt = Opt || {}
	SepV = Sep.substr(0,1);  SepL = Sep.substr(1)
	//if (Opt.avecListVide)  lim = -1;
	T1 = Def.split(SepL)
	var T = new Array(T1.length)
	for (i=0; i<T1.length; i++) {
		S = T1[i]
		if (S.indexOf(SepV)>lim) {
			T[i] = new Array();
			T2 = T1[i].split(SepV)
			for (j=0; j<T2.length; j++) {
				T[i][j] = T2[j]
			}
		}
	}
	//alert(JSW(T)+crr+Def)
	return T
}

function TConvert(TA, Opt) {  // Converti un tableau HTML en array. Minus=colonnes à convertir en minus, Mime = col à doublonner texte + html
	var T=[], TL, TR, TD, i, j, V, Min, Key, nbCol, Mime
	if (!TA || (TA && !TA.rows.length))  return
	Opt=Opt||{};  Key = Opt.Key;  Min = Opt.Minus;  Mime = Opt.Mime
	nbCol = TA.rows[0].cells.length;  //if (Mime)  nbCol+=Mime.length
	for (i=0; i<TA.rows.length; i++) {
		TR = TA.rows[i]
		TL = []
		for (j=0; j<TR.cells.length; j++) {
			TD = TR.cells[j]
			V = Trim(LText(TD));  if (Min && Tin(Min,j))  V = V.toLowerCase()
			if (Mime && Tin(Mime,j))  V+='|-|'+TD.innerHTML
			TL.push(V)
		}
		if (isNaN(Key))
			T.push(TL);
		else{
			V = TL[Key];  TL.splice(Key,1)
			if (nbCol==2)  T[V] = TL[0];  else  T[V] = TL
		}
	}
  return T
}

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=="!" && 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])
}


function TdelDoublons(T1,T2) {
	//T1 = {'':'aa','b':'bb'};  T2 = {'':'a2','c':'cc'};  TdelDoublons(T1,T2)
	var k
	//alert(JSW(T1)+crr+JSW(T2))
	for (k in T2) {
		if (T1[k])  delete(T1[k])
	}
	return T1;
}


// ====================================     _COORDONNEES_         ===============================
function PosMouse(e){
 	try {
  if(e){
    pixX = e.pageX;
    pixY = e.pageY;
  }else if (event) {
    pixX = event.clientX + document.body.scrollLeft;
    pixY = event.clientY + document.body.scrollTop;
  }
	}catch(e){}
	if (window.PosMouse2)  window.PosMouse2(e)
}

function Contains(Paren, O, SansElem) {
	if (SansElem && O)  O = O.parentNode
  while (O && (Paren!=O) && (O!=null))  O = O.parentNode
  return Paren==O;
}

function ContainsXY(O,x,y,d) {
	var Rep, dX, dY, fX, fY
	if (!O)  return 0;  if (!d)  d=5;  x = (x)?x:pixX;  y = (y)?y:pixY
	if (document.all) { x-=2; x-=2; }
  dX = CalcPos(O,"Left");  dY = CalcPos(O,"Top");  fX = dX + O.offsetWidth;  fY = dY + O.offsetHeight
  Rep = (x+d>dX && x-d<fX && y+d>dY && y-d<fY) ? 1:0;
  	//wb("Contains : " + Rep + " : (" + dX + "," + dY + ") (" + fX + "," + fY + "), x=" + x + ", y=" + y + ", d="+d+ " IN=" + (x+5>dX && x-5<fX && y+5>dY && y-5<fY) + "\n")
  return Rep
}

function CalcPos(O,sProp) {
	var iPos = 0
	if (!(O=LID(O)))  return 0
 	try { // en cas de setTimeout, il arrive que l'objet à calculer a été supprimé (existence fantomatique)
		while (O.offsetParent) {
			iPos+=O["offset" + sProp]
			O = O.offsetParent
		}
	}catch(e){}
	return iPos
}

function CalcPos2(O, Styl) {
	var p = 0
	O = LID(O)
	while (O.offsetParent) {
		switch (Styl) {
			case 'top':			p += O.offsetTop;			break;
			case 'left':		p += O.offsetLeft;		break;
			case 'width':		p += O.offsetWidth;		break;
			case 'height':	p += O.offsetHeight;	break;
		}
		O = O.offsetParent;
	}
	return p
}

function Ecran(App) {
	var L=0, H=0, W=window, D=document, DD=document.documentElement, B=document.body

	if (typeof(W.innerWidth)=='number') {
	  L = W.innerWidth;
	  H = W.innerHeight;
	}else if (DD && (DD.clientWidth || DD.clientHeight)) {
	  L = DD.clientWidth
	  H = DD.clientHeight
	}else if (B && (B.clientWidth || B.clientHeight)) {
	  L = B.clientWidth;
	  H = B.clientHeight;
	}else{
	  L = -1;
	  H = -1;
	}
	App.WinW = L;  App.WinH = H
}

function CenterDiv(NomDiv, xmin, ymin) {
	//alert(App.WinW);
	var D, H, W, X, Y
	D=LID(NomDiv);  if (!D)  return
	if (!xmin)  xmin=1;  if (!ymin)  ymin=1;
	if (!App.WinW)  Ecran(App)
	Aff(D)
	W = D.offsetWidth;   if (W>App.WinW)  X=xmin;  else  X = Math.round((App.WinW-W)/2)
	H = D.offsetHeight;  if (H>App.WinH)  Y=ymin;  else  Y = Math.round((App.WinH-H)/2)
	//alert(App.WinH + ", " + H + ", " + D.offsetWidth + ", " + D.offsetHeight)
 	with (D.style) {
		left = X + "px"
 		top  = Y + "px";
 	}
}


// ====================================     _GET_PUT_         ===============================
function $g(stor,nodDeb) {
  if (typeof stor!='string')  return stor
  return $(stor,nodDeb).get(0)
}

function $G(expr,nodDeb,first) {    // http://yuiblog.com/assets/pdf/cheatsheets/selector.pdf
	// #barLogo>td>div:nth-child(2) - nth-of-type
	// #nav ul:first-of-type > li:not(.selected) = first ul not class selected
	// Dom.addClass($(“#data tr:nth-child(odd)”), “odd” ), removeClass, replaceClass, hasClass
	// slots = Y.Node.get('#workarea').queryAll('.slot');
	var O
	if (Y && Y.Selector) {
	  O = Y.Selector.query(expr,nodDeb,first)
	}else if (window.YAHOO && YAHOO.util.Selector) {
		O = YAHOO.util.Selector.query(expr,nodDeb,first);  //alert(expr+crr+O+crr+Lout(O))
	}else if (window.jQuery) {
	  O = $(expr,nodDeb);  if (O) { if (first!=undefined)  O = O.get(first);  else  O = O.get() }
	}else if (document.querySelector) {
		O = document.querySelector(expr);  //alert(Lout(O))
	}
	return O
}

function $w(expr,Msg,aj) { var O = $G(expr);  if (O)  if (aj)  O.innerHTML+= Msg;  else  O.innerHTML = Msg;  return O }

function $ftag(D, Tag, Filtre) {  // Filtre = [href], [name^=yui] (commence), not([type=button])
	D = LID(D);  if (!D)  return
	var T = LTags(D,Tag)
	return YAHOO.util.Selector.filter(T, Filtre);
}

function G$(Nom) {
	var i, L, T, O
  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, F, S
	if (!Nom)  return null
	if (!Doc)  Doc = document
	if (typeof(Nom)=='string') {
		S = Nom.substr(0,1);  if (S=='#' || S=='.')  return $(Nom, Doc).get(0)
		if (Doc.tagName=='FORM')
			F = Doc
		else{
		  var BD = App.BD;  if (BD)  BD=BD.BD;  if (BD && BD[0] && BD[0].Form)  F = BD[0].Form;
		}
		if (F)  O = F.elements[Nom]
		if (!O)  O = Doc.getElementById(Nom);
	}else
		O = Nom
	if (!O) {  O = Doc.getElementsByName(Nom);  if (O)  O=O[0] 	}
	return O
}

function LText(O, Col, Opt) {
	var V
	O = LID(O)
	if (!O)  return ''
	if (O.tagName=='TR' && Col!=undefined)  O = O.cells[Col]
	if (ie)  V = O.innerText;  else  V = O.textContent
	if (V && Opt)  V = V.toLowerCase()
	//V = O.innerHTML.replace(/<[^>]+>/g,”");  innerText firefox
	return Trim(V)
}

function PText(O, V) {
	O = LID(O);	if (!O)  return
	if (ie)  O.innerText=V;  else  O.textContent=V;
}

function PH(O, V, aj) {
	O = LID(O);	if (!O)  return;
	if (!aj)  O.innerHTML=''
	if (O.insertAdjacentHTML)  O.insertAdjacentHTML("BeforeEnd", V + '<br>');  else  O.innerHTML+=V + '<br>'
}

function Lout(O, Max) {
	if (!O)  return
	O=LID(O);  if (!O)  return;  if (!O.tagName)  return typeof(O)
	var S = (O.outerHTML) ? O.outerHTML : getouterHTML(O)
	if (Max)  S=S.substr(0,Max)
	return S
}

function LOUT(O, Max) { S = Lout(O,Max)+'';  return CodeHtml(S) }

function getouterHTML(O) {
	var tn, el, H
	tn = O.cloneNode(true);  el = document.createElement('div');  el.appendChild(tn);
	//H = el.innerHTML;  //el.removeNode(true)
	return el.innerHTML;
}

function LTags(Div, Nom, index) {
	if (!Div)  return
	if (!Nom) { Nom=Div;  Div=document.body }
	var O =  Div.getElementsByTagName(Nom)
	if (index!=undefined) { if (O.length>index)  O = O[index];  else  O=null }
	return O
}

function LTag(Div, Nom, no) {
	if (no==undefined)  no = 0
	var O = LTags(Div,Nom);  if (!O)  return
	if (O.length>0)  return O[no]
}

function LTagt(Div, Nom, index) {
	var i, T=[], Os = LTags(Div,Nom);  for (i=0; i<Os.length; i++)  T.push(Os[i]);  return T
}

function LX(Obj, Nom, NotText, Col) {
	// renvoie l'attribut Nom de Obj ou "". Si NotText=true, renvoie null au lieu de ""
	var O, R
	if (typeof(Obj)=="string")  O = LID(Obj);  else  O = Obj
	if (O) {
	  Nom = Nom.toLowerCase()
		if (O.tagName=="TR" && Col!=undefined)  O = O.cells[Col]
		R = O.getAttribute(Nom);
	}else
		R = undefined
	if (!NotText && !R)  R=""
	return R
}

function PX(Obj, Nom, V, Suppr) {
	var O, Sep, S
	if (!(O=LID(Obj)))  return
	if (V)  O.setAttribute(Nom,V);  else  if (Suppr)  RX(O,Nom)
}

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
	O = LID(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":  if (SiText) V=(O.checked)?"x":"";  else  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
		  case 'script':  V = O.innerHTML;  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) {
					try {
						O.innerHTML = V;
					}catch(e){
						O.innerText = V;
					}
				}else{
					if (ie)  O.innerText = V;  else  O.textContent = V
				}
		}
	}
}


// ====================================    _FORM_    ===============================
function LitRadio(O, V) {
	var Nom, Doc
	if (typeof(O)=="string") { Nom = O;  Doc = document } else  { Nom = O.name;  if (O.document)  Doc = O.document;  else  Doc = document }
	var Os = Doc.getElementsByName(Nom)
	for (i=0; i<Os.length; i++) {
 		O = Os[i];  //alert(Nom + ", V=" + V + crr + O.outerHTML + crr + Doc.location)
		if (V!=undefined) {
			if (O.value==V) {  O.checked = true;  return V  }
		}else
			if (O.checked)  return O.value
	}
	return ''
}

function LitSelect(Ctl) {
	if (typeof(Ctl)=="string")  Ctl = LID(Ctl);  if (!Ctl)  return
	if (!Ctl.options || Ctl.selectedIndex<0)  return ""
	return Ctl.options[Ctl.selectedIndex].text;
}

function ListCtl(D) {
	var O1, O2, O3, O4, i
	D = LID(D)
	O1 = LTagt(D,'INPUT');  O2 = LTagt(D,'SELECT');  O3 = LTagt(D,'TEXTAREA')
	O1 = O1.concat(O2,O3)
	O4 = LTags(D,'SPAN');  for (i=0; i<O4.length; i++) { if (LX(O4[i],'bd'))  O1.push(O4[i]) }
	return O1
}

function ParamForm(F, Opt) {
	var Ctl, V, S, Li='', T={}, i, Cs, Nom
	Opt=Opt||{}
	F = LID(F)
	Cs = ListCtl(F)
	for (i=0; i<Cs.length; i++) {
		Ctl = Cs[i]
		S = Ctl.tagName;  if (!(Nom=Ctl.name))  continue
		V = LVal(Ctl)
		if (V)  T[Nom] = V
	}
	if (Opt.Tableau)  return T
	for (Nom in T) {
		Li += '&'+Nom+'=' + T[Nom]   //escape(encodeURI(LVal(Ctl)))
	}
	return Li
}

function VerifForm(F) { var Fo = new FoClass(F);  return Fo.Verif() }

function SubmitForm(e) {    // appelé par les form. générés (voir Vue.Txt2Form)
	var Param, re, Fo, F, O, TR, S, Opt
	O = EventCtrl(e)
	if (App.Modul.Fo) {
		if (!(Fo=getFo(O))) {
			F = ElemPTag(O,'FORM');  //alert(Lout(F))
			Fo = new FoClass(F)
		}
		if (!Fo)  return
		Fo.Sov()
		return
	}
	TR = ElemPAt(F,'ValCle');  if (!F || !TR)  return
	Param = ParamForm(F);  //alert(Param+crr+AjUrl);  return
	if (Param.indexOf('_action')>=0) {
		var NomZ = LX(TR,'id')
		S = F.elements['_action'].value
		re = [{Action:S, ZoneDef:NomZ}]
		if ((O=F.elements['_Suivant'])) {
			if (!(S=LX(TR,'NivLst')))  S=1;
			re.push({Action:'Win', ValCle:O.value, ZoneDef:NomZ, ajoutNiv:S})
		}
		if (window.finSubmit)  Opt = {Suite:finSubmit}
		ExecAction(re, Param, Opt)
	}
}

// ============================     _DHTML_    ======================
function Aff(O, Tag, Test)  {
	var S, D
	if (!(O=LID(O)))  return
	if (Tag) {
	  D = LID(Tag);  if (!D && !(D=ElemPTag(O,Tag.toUpperCase())))  return;  //alert(Lout(O)+crr+Test)
	  O = D
	}
	if ((S=LX(O,'conteneur')))  O = LID(S)
	S = (Test!=undefined && !Test) ? 'none':'block'
	if (!(ie && navV<8) && O.tagName=='TD' && S=='block')  S = 'table-cell'
	if (O.style.display!=S)  O.style.display = S
	return SiAff(O)
}
function Hide(O, Tag, Opt) {
	var S
	if (!(O=LID(O)))  return
	//alert(Tag + ", " + Lout(O) + ", " + Lout(ElemPTag(O,Tag)))
	if (Tag)  if (!(O=ElemPTag(O,Tag.toUpperCase())))  return
	if (!Opt && (S=LX(O,'conteneur')))  O = LID(S)
	if (O)  O.style.display = 'none'
	return O
}
function Disp(O)  { if ((O=LID(O)))  return O.style.display }
function SiAff(O) { if ((O=LID(O)))  return (getStyle(O,'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 = (getStyle(O,'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 = (getStyle(O,'display')=='none') ? 'block' : 'none'
  }
  if (O)  return O.style.display
}

function getStyle(O, stylIE, stylMoz) {
	O = LID(O);  if (!stylMoz)  stylMoz = stylIE
	if (O.currentStyle)  return O.currentStyle[stylIE];
	else if (window.getComputedStyle)  return window.getComputedStyle(O, null)[stylMoz];
	//document.defaultView.getComputedStyle(obj, null).getPropertyValue(stylMoz);
}

// function setStyle(O, stylIE, V, stylMoz) {
// 	O = LID(O);  if (!stylMoz)  stylMoz = stylIE
// 	if (O.currentStyle)  O.currentStyle[stylIE] = V;
// 	else if (window.getComputedStyle)  window.getComputedStyle(O, null)[stylMoz] = V;
// }

function VoletVide(Zone) {
	var Zone, Divs, D, DZon, ZoneP, DP, T, S, i, n, nb
  n=nb=0;  DZon = LID(Zone);  if (!DZon)  return;  Zone = DZon.id
  ZoneP = LX(Zone,'conteneur');  DP = LID(ZoneP);  if (!DP) { ZoneP = Zone; }
	Divs = LX(DP,'divs');  if (!Divs)  Divs = Zone;   //alert(ZoneP+crr+Divs)
	T = Divs.split(';')
	for (i in T) {
	  if (!(D=LID(T[i])))  continue;			//alert(T[i]+crr+D.innerHTML)
  	if (!Trim(D.innerHTML))  n++
		nb++
	}
  if (nb && n==nb)  return ZoneP
}

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
}


// ============================     _ManipDOM_    ======================
function InsertBef(Dest, O) {
	var N
	if (document.all)  N = Dest.insertBefore(O);  else  N = Dest.insertBefore(O,Dest.lastChild)
	return N
}

function InsertHtml(H, Dest, htmlP) {
	if (!htmlP)  htmlP = 'div'
	if (!Dest)  Dest = document.body;  else  Dest = LID(Dest)
	var D = document.createElement(htmlP);  D.innerHTML = H
	InsertBef(Dest,D)
}

function MakeDom(el, Div, JS, Txt) {
	//D = MakeDom('div',Dest, {Niv:1, Class:'divTree'})  => écrire class Class, car mot réservé
	var D, O, i, L
	JS = JS || {}
	if (!(O=LID(el))) {
		if (!Div)  Div = 'body'
		if (typeof(Div)=='string')  Div = (Div=='body') ? document.documentElement.childNodes[1] : LID(Div)
		O = document.createElement(el);
		Div.appendChild(O)
	}
	for(i in JS) {
		switch(i) {
			case 'Class':  O.className = JS[i];  break
			default:  O.setAttribute(i, JS[i])
		}
	}
	if (Txt)  O.appendChild(document.createTextNode(Txt))
	//L = arguments.length;  for (i=2; i<L; i+=2)  O.setAttribute(arguments[i],arguments[i+1])
	return O
}

function MakeTxt(D,txt) { D.appendChild(document.createTextNode(txt)) }

function RMNod(O) {
	if (O) O = LID(O)
	if (O) O.parentNode.removeChild(O)
}

function ClearDiv(D) {
	var i, O
	if (D) D = LID(D);  if (!D)  return
	for (i in D.childNodes) {
		if (isNaN(i))  continue
	  O = D.childNodes[i]
	//alert(i+cr+D.childNodes.length+crr+Lout(O))
	  D.removeChild(O)
	}
}

function AdImg(D, Path) {
	$('img',D).each(function(index, O) { var S;  if (O.src.indexOf(Path)<0)  O.src = Replace(O.src, RootSite+'/', RootSite+Path+'/'); })
}


// ============================     _Rech_DHTML_     =====================
function CalcIndex(O) {
	var ElemP, i
	O = LID(O)
	ElemP = O.parentNode
	//var Os = ElemP.getElementsByTagName('*');  for (i=0; i<Os.length; i++) {  if (Os[i]==O)  return i	}
	nod = ElemP.firstChild
	i = -1
	while (nod) {
		if (nod.nodeType!=3)  i++
		if (nod==O)  return i
		nod = nod.nextSibling
	}
}

function PosIndex(ElemP, pos) {
	var Os, O, i
	nod = ElemP.firstChild;  i = -1
	while (nod) {
		if (nod.nodeType!=3)  i++
		//alert(i+crr+Lout(nod))
		if (i==pos)  return nod
		nod = nod.nextSibling
	}
}

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, L
	if (!Obj || !Test)  return;
	R = null
	L = Obj.childNodes.length
	for (var i=0; i<L; 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, Opt) {
	// ElemIn(Div, "cl1='2'", true, "Tag=DIV")
	// TA = ElemIn('DivTags','O.tagName=="TABLE"', false, 0) => extrait 1° table dans les fils direct
	// P = ElemIn(TR, "@C='DivIn'", true);  if (P)  P = P[0]
	var Os, O, i, Res = []
	ElemP = LID(ElemP);  if (!ElemP)  return
	if (!isNaN(Opt)) { i=Opt;  Opt={};  Opt.Index = i}  else if (!Opt)  Opt={}
	var Action = Opt.Action
	var Tag = Opt.Tag || '*'
	if (typeof(Test)=="string") {
		if (Test=="Ctl")
			Test = "'INPUT,SELECT,TEXTAREA'.indexOf(O.tagName)>=0";
		else{
			Test = Replace(Test,'@C','O.className')
		}
	}
		//alert(Test)
	if (Opt.Avec) {   // inclure le père dans la rech
		O = ElemP
		if (eval(Test)) {
			if (Action)	{	eval(Action) 	}else  return O
		}
	}
	if (ElemP.length)  Os = ElemP
  else if (In)  Os = ElemP.getElementsByTagName(Tag)
	else  Os = ElemP.childNodes
	if (!Os.length)  return

	var L = Os.length
	for (i=0; i<L; 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)) {
				if (Opt.Index!=undefined && Res.length==Opt.Index)  return O
				Res.push(O);  //alert(Test+crr+cl1+crr+Lout(O))
				if (Action)	{
					eval(Action)
				}
			}
		}
	}
	if (Opt.Index!=undefined && !Res.length)  Res = null
	return Res
}

function ElemAt(O, At, V, Opt) {
	//ElemAt(Obj, "Obj", "LibTree", {Avec:1})
	var O, S
	S = "O.getAttribute('" + At + "')";  if (V) S+="=='" + V + "'";  else  S+="!=null";  //alert(S+crr+Lout(O))
 	return ElemIn(O, S, true, Opt)
}

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)!="#") {
		  //if (Bug==8)  alert(Test + crr + eval(Test) + crr + O.outerHTML)
		if (eval(Test))  return O
		if (O.tagName=='BODY')  return
    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, car
	Obj = LID(Obj)
	if ((car=At.substr(0,1))=='!')  At = At.substr(1)
	S = "O.getAttribute('" + At.toLowerCase() + "')";  if (V) S+="=='" + V + "'";  else  S+="!=null"
	O = ElemParent(Obj,S)
	if (car=='!') return LX(O,At);  else  return O
}

function ElemPClass(Obj, V) {
	var S
	S = "O.className.indexOf('" + V + "')>=0";
 	return ElemParent(Obj,S)
}

function ElemNext(O, Test) {
	var O, r, L
	if (!O)  return;
	do {
		O = O.nextSibling;
	}while (O && O.nodeName=="#text")
	return O
}



// ====================================       _OBJETS_JS_      ===============================
function TypOf(O) {
	if (!O)  return typeof(O);
	if (O.tagName)  return O.tagName+' '+O.id
	if (O && O.constructor && O.constructor.toString) {
		var arr = O.constructor.toString().match(/function\s*(\w+)/);
		if (arr && arr.length == 2)  return arr[1];
	}
	return typeof(O);
}

function Heriter(De, So) { for (var el in So) { De[el] = So[el]; } }

function AddProperty(Obj, Opt, Separ) {
  if (!Obj || !Opt)  return
	if (typeof(Opt)!='string') {
		for (var Key in Opt) {
	  	Obj[Key] = 	Opt[Key]
		}
	  return
	}
	var T, T2, T3, Expr, Li, V, D, Key, Typ="", L, p
	if (!Separ)  Separ="|"
	T = Opt.split(Separ)
	for (Expr in T) {
	  Li = T[Expr]
    T2 = Li.split("=");  L = T2.length
    if (L>1) {
    	Key = Trim(T2[0]);  V = Trim(T2[1]);  //alert(Key + crr + V)
    	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) {
          p = Li.indexOf("=");  V = Trim(Li.substr(p+1))
    	  }else {
    	  	try {  V = eval(T2[2]);  }catch(e){}   //ex: Coche==true
    	  }
    	}
      Obj[Key] = V
    }else{
    	Obj[T[Expr]] = "";  //alert(T[Expr])
    }
  }
}

function ObjClone(O,recur,Opt) {  // O = new ObjClone(Memo)
	var avec, sauf, c
	if (Opt) {
		c = Opt.substr(0,1)
		if (c=='>')  avec = ','+Opt.substr(1)+',';  else  sauf=','+Opt+','
	}
	for (var K in O) {
		if (isNaN(K) && avec && avec.indexOf(','+K+',')<0)   continue;		//wh(K)
		if (sauf && sauf.indexOf(','+K+',')>=0)  continue;		//wh(K)
		if (recur && typeof O[K]=='object')  this[K] = new ObjClone(O[K],true,Opt);  else  this[K] = O[K];
	}
}

function copyObj(o1,o2) {  // contrairement à ObjClone, o1 garde son contenu et recoit en + o2
  var O, i
  if (!o1)  o1={}
	for (i in o2) {
	  O = o2[i];  if (typeof(O)=='object')  copyObj(o1[i],O);  else  o1[i] = O
	}
}

function ObjAsChild(Obj) { if (!Obj)  return 0;  for (NomObj in Obj)  return 1;  return 0 }

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
}


// ====================================       _JSON_      ===============================
function JST(J) {
	var c
	if (!isStr(J))  return J;  else  c = J.substr(0,1)
	if (c=='[' || c=='{')  return JSOND(J);  else  return J
}

function JSONS(Obj, Opt) {
	//alert(JSONS({'a':1, 'b':"2'4", 'c':{'x':'ab','a':1, 'b':"2'4"}}))
	if (!Obj) return
	if (window.JSON) {
		var S = JSON.stringify(Obj, JSONS_accept, Opt);
		if (window.jQuery && $.browser.mozilla)  S = SupprAccent(S)
		if (S=='undefined')  S=undefined;
		return S
	}
	//if (window['YAHOO'] && YAHOO.lang.JSON)  return YAHOO.lang.JSON.stringify(Obj)
	return JSO(Obj)
}

function JSONS_accept(key,V) {
	if (typeof V!='object' && !V) {
		//alert(key+cr+V)
		return undefined
	}else if (V==null)  return undefined
	else if (typeof(V)=='object' && !ObjAsChild(V))  return undefined
	return V
}

function JSO(Obj, Opt) {
	//alert(JSON({'a':1, 'b':"2'4", 'c':{'x':'ab','a':1, 'b':"2'4"}}))
	//if (window['YAHOO'] && YAHOO.lang.JSON)  return  YAHOO.lang.JSON.stringify(Obj)
	var H, H1='', Nom, nb=0, V
	//if (typeof(Obj)=="string") { S = XmlPost('Pgm=JSONDecode&Chaine='+escape(Obj));  return S }
	if (!Obj)  return '';  if (!Opt)  Opt = {}
	for (Nom in Obj) {
		V = Obj[Nom];  if (!V && V!==0) continue
		switch (typeof(V)) {
			case 'boolean':  V = (V) ? 1:0;  break
			case "string":   V = '"' + Replace(V,'"','\\"') + '"';  break
			case 'object':   V = JSO(V);  if (!V)  V='{}';  break
		}
		//if (!(Opt.nonVide && (!V || V=="''"))) {
		if (!(!V || V=="''")) {
			if (isNaN(Nom)) { H1+= ', "' + Nom + '":' + V;  nb++; }else  H1+= ", "+V;
		}
	}
	if (H1)  H1 = H1.substr(2);  else  return ''
	if (nb)	H = '{' + H1 + '}';  else  H = '[' + H1 + ']';
	return H
}

function JSW(Obj, htm) {
	if (window.JSON)  H = JSON.stringify(Obj, null, 4);  else  H = JSS(Obj, {cr:'\n'})
	if (htm) { H = Replace(H,' ','&nbsp;'); H = Replace(H,'\n','<br>') }
	return H
}

function JSS(Obj, Opt, niv) {
	var H, V, cr, H1='', Nom, nb=0, bl=''
	if (!Obj)  return '';  if (!Opt)  Opt = {}
	if (!niv)  niv=0;  else  if (niv>20)  return
	if (!(cr=Opt.cr))  cr='';  else  bl = InitString (' ', niv*2, ' ')
	//if (typeof(Obj)=="string") { S = XmlPost('Pgm=JSONDecode&Chaine='+escape(Obj));  return S }
	for (Nom in Obj) {
		V = Obj[Nom];  if (!V && V!==0) continue
		switch (typeof(V)) {
			case 'boolean':  V = (V) ? 1:0;  break
			case "string":   V = '"' + Replace(V,'"','\\"') + '"';  break
			case 'object':
				H = TypOf(V);  if (H.indexOf('Class')>0)  continue
				//alert(H)
				switch (TypOf(V)) {
				case 'Array':
				case 'Object':
					V = JSS(V,Opt,niv+1);
					break
				}
				break
			case 'function':  continue
		}
		if (!(Opt.nonVide && (!V || V=="''"))) {
		  if (isNaN(Nom)) { H1+= ', "' + Nom + '":' + V;  nb++; }else  H1+= ", "+V;
		}
	}
	if (H1)  H1 = H1.substr(2);  else  return ''
	if (nb)	H = '{' + cr + bl + H1 + bl + cr + bl + '}\n';  else  H = '[' + cr+ H1 + cr + ']';
	return H
}

function JSOND(Chaine) {
	var e
	if (!Chaine) return;  if (typeof(Chaine)=='object')  return Chaine
	//Chaine = Replace(Chaine,'\\"','"');  Chaine = Replace(Chaine,'\\"','"')
	try {
		if (window.JSON)  return JSON.parse(Chaine)
		if (window.jQuery)  return jQuery.parseJSON(Chaine)
		if (window.YAHOO && YAHOO.lang.JSON)  return YAHOO.lang.JSON.parse(Chaine)
	  e = eval('('+Chaine+')')
		return e
	}catch(e){
		try {
		  return eval('('+Chaine+')')   // JSON de ie a besoin de "Cle":"valeur" : des guillemets sur la clé. Avec eval, pas besoin
		}catch(e){
			alert('Chaine invalide : '+crr+(typeof(Chaine))+crr+Chaine)
		}
		//S = '{\"AdImg\":\"biblio/img/arist/banniere780.jpg\"}'
    //alert(S+crr+Chaine)
		//alert(JSOND(S))
	}
	//return JSON_Decode(Chaine);
}

function JSON_Decode(Chaine) {
	if (!Chaine) return
	var O, S
	//S = Replace(Chaine,'array(','{');  S = Replace(S,')','}');  S = Replace(S,'=>',':');  O = '('+S+')' //eval(S)
	S = XmlPost('Pgm=JSONDecode&Chaine='+escape(Chaine));  //alert(S)
	//O = eval(S)
  return S
}

function JSON_Encode(Obj, Opt) {
	//alert(JSON_Encode({'a':1, 'b':"2'4", 'c':{'x':'ab','a':1, 'b':"2'4"}}))
	var H, H1='', Nom
	if (typeof(Obj)=="string") {
		S = XmlPost('Pgm=JSONDecode&Chaine='+escape(Obj));  return S
	}
	if (!Obj)  return '';  if (!Opt)  Opt = {}
	for (Nom in Obj) {
  	V = Obj[Nom];
		switch (typeof(V)) {
			case "boolean":  V = (V) ? 1:0;  break
		  case "string":   V = '"' + Replace(V,'"','\\"') + '"';  break
		  case "object":   V = JSON_Encode(V);  break
		}
		if (!(Opt.nonVide && (!V || V=="''"))) {
		  if (isNaN(Nom))  H1+= ", '" + Nom + "'=>" + V;  else  H1+= ", "+V;
		}
  }
  if (H1)  H1 = H1.substr(2);  else  return ''
	H = 'array(' + H1 + ')'
  return H
}

function Encode(S) { return encodeURIComponent(S) }

// ====================================    _EVENT_    ===============================

function AttachEvent(O,Nom,fct) { if (document.attachEvent)  O.attachEvent('on'+Nom,fct);  else  O.addEventListener(Nom,fct,false) }

function EventCtrl(e) {
	var O
	if (typeof(e)=="string")  e = LID(e)
	if (e && e.tagName)  O=e;  else  O = (ie) ? window.event.srcElement : e.target;  //alert(Lout(O))
	return O
}

function AnnulEvent(e) {
	if(!e) var e = window.event;
	e.cancelBubble = true;
	e.returnValue = false;
	if (e.stopPropagation) {
		e.stopPropagation();
		e.preventDefault();
	}
	return false;
}

// -------------  Evt Listes --------------------
function ClicTR(TR) {
	if (TRClic)  DelClass(TRClic,"Clic")
	TRClic = TR;  AddClass(TR,"Clic")
	if (App.ClicTR)  App.ClicTR(TR)
	//alert(Lout(TR))
}

function ClicTH(TH) {
}

function OverTR(TR,Nom) {	return; if (!Nom)  Nom=" Over";  AddClass(TR,Nom);  /*Bug.innerText = Lout(TR.parentNode)*/ }
function OutTR(TR,Nom)  { return; if (!Nom)  Nom=" Over";  DelClass(TR,Nom) }

function hasClass(O, Class) { return Tin(LID(O).className.split(' '),Class) }
function AddClass(O, Class) { var S = O.className;  if (!Tin(S.split(' '),Class))   O.className = AddStr(S,Class,' '); }
function RMClass(O, Class) { DelClass(O, Class) }
function DelClass(O, Class) {
	var T, p
	if (!O)  return
	T = O.className.split(' ');  while ((p=InArray(T,Class))>=0)  T.splice(p,1)
  O.className = T.join(' ')
}
function InverseClass(O, Class1, Class2) {
	if (Tin(O.className.split(' '),Class1)) { DelClass(O, Class1);  AddClass(O, Class2)	}else{ DelClass(O, Class2);  AddClass(O, Class1) }
}

function PosWinEvent(D) {
	// pos Div D sur la souris
	Aff(D)
  D.style.position = 'absolute'
  D.style.left = pixX - 10 + window.document.body.scrollLeft
	D.style.top  = pixY - 18 + window.document.body.scrollTop
}

function OutDiv(NomDiv) {
	var D = LID(NomDiv)
  if (ContainsXY(D,pixX,pixY))  setTimeout("OutDiv('" + NomDiv + "')",800);  else  Hide(D)
}

function WhenOutObj(O,Obj) {
	if (ContainsXY(LID(O),pixX,pixY,0)) { setTimeout(function(){ WhenOutObj(O,Obj) },800) }  else if (Obj.onOut)  Obj.onOut(O)
}



// ====================================      _INTERACTIF_       ===============================
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 FocusCh(Ctl) {
	var Msg=LX(Ctl,'Msg')
	if (!Msg) { Msg=Ctl.value;  PX(Ctl,'Msg',Msg) }
	if (Ctl.value==Msg)  Ctl.value=''
}

function BlurCh(Ctl) {
	if (!Ctl.value)  Ctl.value=LX(Ctl,"Msg")
}

function OutPopup(Ad,Param) {
  if (Ad.indexOf('?')<0)  Ad+='?';
	Ad+= AjUrl
	window.open(Ad, '', AddStr("toolbar=no,menubar=no,scrollbars=yes,resizable=yes,status=yes,width=760,height=600",Param,','))
}

function CloseWindow() {
	ww = window.open(window.location, "_self");
	ww.close();
}



// -------------  _COOKIES_  ----------  http://www.actulab.com/les-cookies-en-javascript.php
function GetCookie(nom) {
	var arg  = nom+"=";
	var alen = arg.length;
	var clen = document.cookie.length;  //alert(document.cookie)
	var i=0
	while (i<clen) {
		var j=i+alen;
		if (document.cookie.substring(i,j)==arg) return getCookieVal(j);
		i=document.cookie.indexOf(" ",i)+1;
		if (i==0) break
	}
	return null
}

	function getCookieVal(offset) {
		var endstr = document.cookie.indexOf (";", offset);
		if (endstr==-1) endstr=document.cookie.length;
		return unescape(document.cookie.substring(offset, endstr))
	}

function SetCookie(nom, valeur) {
	// date=new Date; date.setMonth(date.getMonth()+1); SetCookie("nombredevisites", 1, date, "/")
	var argv=SetCookie.arguments;
	var argc=SetCookie.arguments.length;
	var expires=(argc > 2) ? argv[2] : null;
	var path=(argc > 3) ? argv[3] : null;
	var domain=(argc > 4) ? argv[4] : null;
	var secure=(argc > 5) ? argv[5] : false;
	var S = nom + "=" + escape(valeur) + ((expires==null) ? "" : ("; expires="+expires.toGMTString())) + ((path==null) ? "" : ("; path="+path)) +
		((domain==null) ? "" : ("; domain="+domain)) + ((secure==true) ? "; secure" : "");   //alert(S)
	document.cookie = S
}

function DelCookie(nom, path) {
	date = new Date
	date.setFullYear(date.getFullYear()-1)
	SetCookie(nom, null, date, path)
}


// ====================================      _SYSTEM_     ===============================
function Eval(Chaine, SiMsg) {
	try {
		return eval(Chaine)
  }catch(e){
  	if (SiMsg)  alert(e.description)
  	return null
	}
}

function LoadJS(Ad, JS) {
	if (JS)  App['Pgm_'+Right(Ad,1,'/')] = JS
	try {
		with (document.getElementsByTagName('head')[0].appendChild(document.createElement('script'))) {
			setAttribute('id', 'newscript', 0);setAttribute('type', 'text/javascript', 0);setAttribute('src', Ad + ".js", 0);setAttribute('charset', 'utf-8');
		}
	}catch(e){}
}

function LoadCSS(Ad) {
	var O = document.createElement('link');
	O.setAttribute("href",Ad);  O.setAttribute("rel","stylesheet");  O.setAttribute("type","text/css");
	try {
		document.getElementsByTagName("head").item(0).appendChild(O);
	}catch(e){}
}

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
}

// ====================================      _AJAX_     ===============================
function XmlPost(Param, Ad, NomVar, Win) {
	var Mess, Post = false
	if (!Ad)  Ad = AddStr(RootServ,'SIP/php/bdbox.php','/')
	if (!Param)  Param=''
	if (Win) {
		window.open(Ad + "?" + Param);  Mess="!"
		return
	}
// 	if (YAHOO.util.Connect) {
// 		var request = YAHOO.util.Connect.asyncRequest('POST', Ad, {success:PostSuccess, failure:PostFailure}, Param);
// 		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
	if ((S=window['RootServ']))  Ad = AddStr(S,Ad,'/');			//alert(Ad + crr + Param);  return
	//Post.onreadystatechange = function() { alertContents(Post); }
	try {
		Post.open('POST', Ad, false)
		//Post.setRequestHeader("content-type", "content='text/plain; charset=windows-1252'")  //UTF-8  windows-1252  iso-8859-1
		Post.setRequestHeader("Content-Type",		"application/x-www-form-urlencoded");
		Post.setRequestHeader("Content-length",	Param.length);
		Post.setRequestHeader("Connection",		"close");
		Post.send(Param)
	} catch(e) {
		alert('Erreur POST : ' + e.message);  return false;
	}
	if (Post.readyState==4) {
		if (Post.status==200) {
			try {
				Mess = Trim(Post.responseText);    //alert(Mess)
			} catch(e) {
				alert('Erreur POST : ' + e.message);  return false;
			}
		}else{
			alert("Erreur : " + Post.status + " \nConnexion impossible à " + Ad);
			return false;
		}
	}

//   try {	Mess = Trim(Post.responseText);    //alert(Post.responseText)
// 	}catch(e){  Mess="?" }
  if (NomVar)  Mess = VarListe(Mess, NomVar)
  return Mess
}

function InnerPost(Dest, Param, Ad, Win) {
	var Mess = XmlPost(Param, Ad, null, Win);  //alert(Param+crr+Mess)
	Dest.innerHTML = Mess
}

function TraitRep(Mess) {
  if (Mess.substr(0,3)=='|||')		 return Mess;
  else if (Mess.substr(0,1)=='|')  return Mess.substr(1).split('|');
	else  return Mess
}

function LitValSql(Proj, BD, Sql) {
	var Li
	if (BD)  Li = "Proj=" + Proj + "&BD=" + BD;  else  Li = Proj
  return XmlPost(Li + "&Pgm=ListBox&Sql=" + escape(Sql))
}

function XmlPost2(LigParam, Ad, fct, Param) {
	var Mess, Post = null
	if (!Ad)  Ad = AddStr(RootServ,'SIP/php/bdbox.php','/')
	if ((S=window['RootServ']))  Ad = AddStr(S,Ad,'/');			//alert(Ad + crr + LigParam);  //return
	if (!LigParam)  LigParam=''
	Param = Param || {}

	if (window.XMLHttpRequest)
		Post = new XMLHttpRequest();
	else if (window.ActiveXObject)
		Post = new ActiveXObject("Microsoft.XMLHTTP");
	else {
		alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");  return
	}

	Post.open("POST", Ad, true)
	Post.onreadystatechange = function() {
		if (Post.readyState==4) {
			var reJ, S
			S = Post.responseText
			if (S && window.DecoupeJS) { reJ = DecoupeJS(S);  if (reJ)  reJ = reJ.backVal || reJ.re || reJ  }
			if (fct)  fct(S, Param, reJ)
			//if (fct)  fct(Post.responseText, Param)
		}
	}
	//Post.setRequestHeader("content-type", "content='text/plain; charset=UTF-8'")  //UTF-8  windows-1252  iso-8859-1
	Post.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	Post.send(LigParam);
}

var PostSuccess = function(o) {	var H = o.responseText;  if (H===undefined)  return }
var PostFailure = function(o){ alert(o.tId+crr+o.status+crr+o.statusText) }
function makeRequest() {
	var request = YAHOO.util.Connect.asyncRequest('POST', "/biblio/pgm/yui/examples/connection/assets/post.php", {success:PostSuccess, failure:PostFailure}, "username=anonymous&userid=0");
}


//====================================      _DIVERS_      ===========================
function ChoixIco(Adr, Opt) {
	var Ext, Ico, Typ, Dir, H
	Opt=Opt || {}
	if ((Ext=Right(Adr,1,'.')))  Ext = Ext.toLowerCase().substr(0,3)
	Dir = 'typdoc/'
	switch(Ext) {
		case 'htm': case 'mht': case 'asp':  Ico='Page';  Typ='htm';  break;
		case 'doc':  Ico = 'doc1';  break;
		case 'xls':  Ico = 'xls1';  break;
		case 'csv':  Ico = 'xls';   break;
		case 'ppt':  Ico = 'ppt1';  break;
		case 'pdf':  Ico = 'pdf1';  break;
		case 'jpg':  Ico = 'jpg1';  break;
		case 'gif':  Ico = 'gif1';  break;
		default:  Ico = 'Generic';  Dir = 'tree/'
	}
	H = "<IMG src='/biblio/img/"+Dir+Ico+".gif'>";
	if (Adr)  H = "<a href='"+AddStr(RootSite,Adr,'/')+"' target=_blank>" + H + "</a>";
	return H
}

function CalcAd(Ad) { if (Ad.substr(0,1)!='/')  Ad = AddStr(RootSite,Ad,'/');  return Ad }

//====================================      _DEBUG_      ===========================
function AffMsg(Msg) { if (Msg)  alert(Msg) }     // affiche le résultat d'un XmlPost2
function _AffMsg(Msg) { }     // n'affiche pas le résultat d'un XmlPost2

function wh(Msg, NomDiv) {
	if (!NomDiv && window.console) {
		console.log(Msg);		//info, warn, error, assert(test,Msg)
		return
	}
	if (!NomDiv)  NomDiv = 'DivBog';  var D = LID(NomDiv);  if (!D)  return
	if (Msg.substr(0,1)=='!') { Msg = Msg.substr(1);  D.innerHTML='' }
	if (ie)  D.insertAdjacentHTML("BeforeEnd", Msg + "<BR>");  else  D.innerHTML+=Msg
}

function wobj(O, max) {
	if (!O)  return 'neant';  var S = '['+O.id+','+O.tagName+','+O.className+']-'+LX(O,'cl1')+'-'
	if (max)  S+= Lout(O,Max);
	return S
}

function CodeHtml(S) { S = S.replace(/</g,"&lt;");  S = S.replace(/>/g,"&gt;");  S = S.replace(/\[/g,"<");  S = S.replace(/\]/g,">");  S = Replace(S,"\n","<br>");  return S }

function wb(Msg) {
  var D, S = Msg;  if (!S) return
  if (!(D=LID('DivBog')))  return;  if (!SiAff(D))  return
  if (S.substr(0,1)=='!')  D.innerHTML=''
  if (typeof(S)=="string") {
    S = CodeHtml(S)
	}else
	  S = StructObj(S, 2)
	  //S = S.Nom
	//S+="<br>"
  if (ie)  D.insertAdjacentHTML("BeforeEnd", S);  else  D.innerHTML+=S
}

function wDiv(Titre, H, opt) {
	if (opt) {
		bal = 'pre';  H = Replace(H,'<','&lt;');  H = Replace(H,'\n\n','<br>');  H = Replace(H,'\n','<br>');
	}else
		bal = 'div'
	return "<fieldset xclass=hide><legend onclick='InverseDisplay(ElemNext(this))' style='cursor:pointer'>" + Titre + "</legend><" + bal + " style='display:none'>" + H + "</" + bal + "></fieldset>"
}
