/**
 * Si method = GET alors params=''
 * Si method = POST alors params='var1=valeur1&var2=valeur2'
 */
function file(page, method, params, asynchrone){
	var xhr_object = false;

	if (window.XMLHttpRequest) { // Mozilla, Safari,...
	    xhr_object = new XMLHttpRequest();
	    if (xhr_object.overrideMimeType) {
	        xhr_object.overrideMimeType('text/xml');
	    }
	}
	else if (window.ActiveXObject) { // IE
	    try {
	        xhr_object = new ActiveXObject("Msxml2.XMLHTTP");
	    }
	    catch (e) {
	        try {
	            xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
	        }
	        catch (e) {}
	    }
	}
	
	if (!xhr_object) {
	    //alert('Abandon :( Impossible de créer une instance XMLHTTP');
	    return false;
	}
     
	//onreadystatechange éxécuté en mode asynchrone seulement.
	xhr_object.onreadystatechange = function() { alertContents(xhr_object); };
	
	if(asynchrone==undefined){ asynchrone=false; }
	xhr_object.open(method, page, asynchrone);
	
	if(method=='POST'){
     	xhr_object.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
		xhr_object.send(params);
	}
	else{ xhr_object.send(null); }
	
	
	if(asynchrone==false){
		return(xhr_object.responseText);
	}
}


function alertContents(httpRequest) {
    if (httpRequest.readyState == 4) {
        if (httpRequest.status == 200) {
            return(httpRequest.responseText);
        } else {
            return(false);
            //alert('Un problème est survenu avec la requête.');
        }
    }
}



/**
* tab_params_serialize est un tableau sérializé (fonction serialize de PHP)
**/
function exec_fonction(racine,include,fonction,tab_params_serialize){
	params='fonction='+fonction;
	if(include!=''){params+='&include='+include;}
	params+='&params='+tab_params_serialize;
	
	result=file(racine+'/ajax_exec_fonction.php','POST',params);
	return result;
}

function getHTTPObject() {
  var xmlhttp;
  /*@cc_on
  @if (@_jscript_version >= 5)
    try {
      xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
      } catch (e) {
      try {
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
        } catch (E) {
        xmlhttp = false;
        }
      }
  @else
  xmlhttp = false;
  @end @*/
  if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
    try {
      xmlhttp = new XMLHttpRequest();
      } catch (e) {
      xmlhttp = false;
      }
    }
  return xmlhttp;
  }
  
function change_liste(niveau, champ, selection_table, selection_ligne, id_liste, include, optgroup){
	if(include!=undefined && include!=''){include="&include="+include;}
	else{include="";}
	if(optgroup==1) fonction="remplir3";
	else{fonction="remplir2";}
	
  	r=file(niveau+'/fonction_ajax.php','POST','fonction='+fonction+'&param1='+champ+'&param2='+selection_table+'&param3='+selection_ligne+'&param4=&param5=true&echo=true'+include);
  	var liste=document.getElementById(id_liste);
  	clearSelect(liste);//On vide la liste avant de la regénérer
  	deb3=0; i=0; selection=0; optGroup=''; libelle_optgroup='&nbsp;';
  	while(deb3<r.length){
  		deb_optgroup=0;
  		libelle_optgroup_prec = libelle_optgroup;
		libelle_optgroup='';
	  	deb1 = r.indexOf(';',deb3); //1er ";"
	  	nb_caractere=Number(r.substring(deb3,deb1));
	  	deb2 = r.indexOf(';',deb1+1); //2ème ";"
	  	value=Number(r.substring(deb1+1,deb2));
	  	//Cas où on insère un <optgroup> dans la liste
	  	if(optgroup==1){
		  	deb_optgroup=deb2+nb_caractere+1;
		  	deb_optgroup=r.indexOf(';',deb2+1); //3ème ";"
		  	libelle_optgroup=r.substring(deb2+1,deb_optgroup);
		  	
		  	deb3=deb_optgroup+nb_caractere+1;
	  		text=r.substring(deb_optgroup+1,deb3);
	  		
	  		if(libelle_optgroup_prec != libelle_optgroup){
	  			optGroup = document.createElement('optgroup');
	  			optGroup.label = libelle_optgroup;
	  		}
		}else{
			deb3=deb2+nb_caractere+1;
	  		text=r.substring(deb2+1,deb3);
		}
     	var objOption=document.createElement("option");
     	objOption.innerHTML = text;
		objOption.value = value;
     	if(optgroup==1){
     		liste.appendChild(optGroup);
	    	optGroup.appendChild(objOption);
	    }else{
			liste.appendChild(objOption);
			/*try { //tente methode Microsoft
			    liste.add(objOption, 1);
			}
			catch(err) { //si erreur fait methode pour navigateur DOM compliant
			    liste.add(objOption, null);
			}*/
	    }
     	if(value==selection_ligne){selection=i;}
     	i++;
  	}
  	liste.selectedIndex=selection;
}



function clearSelect(liste){
	var optgroups = liste.childNodes;
	for(i = optgroups.length-1 ; i>=0 ; i--) {
		liste.removeChild(optgroups[i]);
	}
	return liste;
}



/**
 * Classe pour transformer un tableau PHP sérialisé en tableau Javascript
 *
 * <script language="Javascript">
 * var tableau = new PhpArray2Js('<?php echo htmlspecialchars(serialize($tab), ENTQUOTES); ?>');
 * var tab = tableau.retour();
 * </script>
 **/


function PhpArray2Js(tabphp_serialise) {
   this.php = corrigerChainePHP(tabphp_serialise);
   var dim = this.extraireDimTab();
   this.tabjs = this.transformer(dim);
}

PhpArray2Js.prototype.retour = function() {
        // retourne le tableau JS
        return this.tabjs;
}

PhpArray2Js.prototype.transformer = function(dim) {
   // méthode principale qui transforme la chaîne sérialisée en un tableau Javascript
        // dim est la dimension du tableau PHP
   var tab = new Array();
   // extrait un groupe de dim données (indice - valeur)
   for (var i=0;i<dim;i++) {
       // extrait un indice : numérique ou littéral
       var indice = this.extraireIndice();
       if (indice == -1) return;
       // extrait une valeur : tableau, null, booléen, numérique ou littéral
       var valeur = this.extraireValeur();
       if (valeur == -1) tab[indice] = undefined;
       else {
           switch (valeur[0]) {
               case "N" : tab[indice] = null; break;
               case "b" : tab[indice] = valeur[1] ? true : false; break;
               case "i" : tab[indice] = parseInt(valeur[1]); break;
               case "d" : tab[indice] = parseFloat(valeur[1]); break;
               case "s" : tab[indice] = valeur[1]; break;
               case "a" : tab[indice] = this.transformer(valeur[1]); break;
               default  : tab[indice] = undefined;
           }
       }
   }
   // en fin de groupe de données, supprime l'accolade final
   this.php = this.php.substring(1);
   return tab;
}

PhpArray2Js.prototype.extraireDimTab = function() {
   // extrait la dimension N du tableau de "a:N:{"
   var reg = this.php.match(/^a:(\d+):\{/);
   if (reg != -1) {
       // on coupe le texte de l'entité détectée
       this.php = this.php.substring(reg[0].length);
       return reg[1];
   }
   else return -1;
}

PhpArray2Js.prototype.extraireIndice = function() {
   // extrait l'indice d'un tableau
   // cet indice peut être de la forme "i:\d+" ou "s:\d+:\"\w+\""
   var retour;
   var reg = this.php.match(/^((i):(\d+);|(s):\d+:"([^"]+)";)/);
   if (reg != -1) {
       // on coupe le texte de la chaîne détectée
       this.php = this.php.substring(reg[0].length);
       if (reg[2] == "i") retour = reg[3];
       else if (reg[4] == "s") retour = reg[5];
       else retour = -1;
   }
   else retour = -1;
   return retour;
}

PhpArray2Js.prototype.extraireValeur = function() {
   // extrait une valeur au début de this.php
   // cette valeur est de type "a:\d+:{" ou "N" ou "b:[01]" ou "i:\d+" ou "i:[\d\.]+" ou "s:\d+:\"\w+\""
   // on tente de détecter une valeur en tête de texte
   var retour;
   var reg = this.php.match(/^((N);|(b):([01]);|(i):(\d+);|(d):([\d\.]+);|(s):\d+:"([^"]*)";|(a):(\d+):\{)/);
   if (reg != -1) {
       // on coupe le texte de la valeur détectée
       this.php = this.php.substring(reg[0].length);
       // retour est un tableau contenant le type et la valeur de la donnée détectée dans la chaîne
       if (reg[2] == "N") retour = new Array("N", null); // valeur nulle
       else if (reg[3] == "b") retour = new Array("b", reg[4]); // booléen (true/false)
       else if (reg[5] == "i")  retour = new Array("i", reg[6]); // entier
       else if (reg[7] == "d")  retour = new Array("d", reg[8]); // entier double ou flottant
       else if (reg[9] == "s") retour = new Array("s", remplacerQuotes(reg[10])); // chaîne de caractères
       else if (reg[11] == "a") retour = new Array("a", reg[12]); // sous-tableau
       else retour = -1;
   }
   else retour = -1;
   return retour;
}

function corrigerChainePHP(chaine) {
   // remplace les &quot; en " uniquement autour des chaînes de caractères
   chaine = chaine.replace(/:&quot;/g, ':"');
   chaine = chaine.replace(/&quot;;/g, '";');
   chaine = chaine.replace(/&amp;/g, "&");
   chaine = chaine.replace(/&lt;/g, "<");
   chaine = chaine.replace(/&gt;/g, ">");
   return chaine;
}

function remplacerQuotes(chaine) {
   // remplace les &quot; à l'intérieur des chaînes de caractères
   return chaine.replace(/&quot;/g, '\"');
}

PhpArray2Js.prototype.var_dump = function() {
   // affiche le tableau
   return var_dump(this.tabjs);
}

function var_dump(tab) {
   // fonction analogue à var_dump en PHP, mais plus simple
   if (arguments.length == 2) var indent = arguments[1] + "\t";
   else var indent = "\t";
   var i = 0;
   var elements = "";
   for (var elt in tab) {
       elements += (i ? ",\n " : " ") + indent + "[" + elt + "]:";
       switch (typeof tab[elt]) {
           case "string" :
               elements += "\"" + tab[elt] + "\""; break;
           case "number" :
               elements += tab[elt]; break;
           case "object" :
               if (tab[elt] == null) elements += "*null*";
               else if (tab[elt]) elements += var_dump(tab[elt], indent); break;
           case "undefined" :
               elements += "*undefined*"; break;
           default : elements += tab[elt];
       }
       i++;
   }
   return "tableau(" + i + "){\n" + elements + "\n" + (arguments[1] ? arguments[1] : "") + "}";
}