//Copyright ADOK Gilles Vanderstraeten : gillesvds@adok.info
//--------------------------------------------------
var Ajax;//voir test de compatibilité du navigateur à la fin
//--------------------------------------------------
Ajax=function(){
	this.xhr=null;//objet JS.XmlHttpRequest
	this.url="";//URL sur laquelle faire un GET(string)
	this.f=null;//f(xhr.responseXXX) est exécuter dès que xhr.responseXXX disponible (function)
	this.methode="GET";//méthode d'envoi, GET ou POST, GET par défaut
	this.chainePost="";//chaine des arguments à passer à l'URL en POST sous la forme "nom1=valeur1&nom2=valeur2&...&nomN=valeurN"
	this.objPatientez=null;//objet DOM à rendre visible durant l'attente
	Ajax.navOk=false;//compatibilité du navigateur (false par défaut)
	//création de l'objet JS.XmlHttpRequest
	try{
		this.xhr=new XMLHttpRequest();//FF
	}
	catch(e){
		try{
			this.xhr=new ActiveXObject("Msxml2.XMLHTTP");//IE
		}
		catch(e){
			try{
				this.xhr=new ActiveXObject("Microsoft.XMLHTTP");//MS
			}
			catch(e){}
		}
	}
	if(this.xhr)Ajax.navOk=true;
};
//--------------------------------------------------
Ajax.prototype.fetchTxt=function(){
	//fait un GET ou un POST sur url et exécute f(xhr.responseText) en cas de succès
	//xhr.responseText remplacé par false en cas d'erreur serveur (status inaccessible ou !=200)
	var xhr=this.xhr;
	var f=this.f;
	var objPatientez=this.objPatientez;
	var estPost=this.methode.toUpperCase()=="POST";
	//affichage de patientez...
	if(this.objPatientez)this.objPatientez.style.visibility="visible";
	//formatage de l'URL pour ajouter un aléa qui évite la mise en cache
	if(estPost)this.chainePost+=(this.chainePost==""?"":"&")+"alea="+Math.random();
	else{
		this.url+=(this.url.indexOf("?")<0?"?":"&")+"alea="+Math.random();
		this.chainePost=null;
	}
	this.xhr.onreadystatechange=function(){
		if(xhr.readyState==4){
			try{//status pas toujours accessible quand erreur serveur
				if(xhr.status==200){
					f(xhr.responseText);
				}
				else{
					f(false);
				}
			}
			catch(e){
				f(false);
			}
			//suppression de patientez...
			if(objPatientez)objPatientez.style.visibility="hidden";
		}
	};
	this.xhr.open(this.methode,this.url,true);
	if(estPost)xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");//obligatoirement entre open() et send()
	this.xhr.send(this.chainePost);
};
//--------------------------------------------------
Ajax.prototype.fetchXml=function(){
	//fait un GET ou un POST sur url et exécute f(xhr.responseXML) en cas de succès
	//xhr.responseText remplacé par false en cas d'erreur serveur (status inaccessible ou !=200)
	var xhr=this.xhr;
	var f=this.f;
	var objPatientez=this.objPatientez;
	var estPost=this.methode.toUpperCase()=="POST";
	//affichage de patientez...
	if(this.objPatientez)this.objPatientez.style.visibility="visible";
	//formatage de l'URL pour ajouter un aléa qui évite la mise en cache
	if(estPost)this.chainePost+=(this.chainePost==""?"":"&")+"alea="+Math.random();
	else{
		this.url+=(this.url.indexOf("?")<0?"?":"&")+"alea="+Math.random();
		this.chainePost=null;
	}
	this.xhr.onreadystatechange=function(){
		if(xhr.readyState==4){
			try{//status pas toujours accessible quand erreur serveur
				if(xhr.status==200){
					f(xhr.responseXML);
				}
				else{
					f(false);
				}
			}
			catch(e){
				f(false);
			}
			//suppression de patientez...
			if(objPatientez)objPatientez.style.visibility="hidden";
		}
	};
	this.xhr.open(this.methode,this.url,true);
	if(estPost)xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");//obligatoirement entre open() et send()
	this.xhr.send(this.chainePost);
};
//--------------------------------------------------
Ajax.ok=function(){
	//Test la compatibilité du navigateur et affiche une boîte d'alerte avec les caractéristiques du navigateur en cas d'incompatibilité.
	if(!Ajax.navOk){
		Ajax.alerterNav();
		return false;
	}
	return true;
};
//--------------------------------------------------
Ajax.alerterNav=function(){
	//affiche une boîte d'alerte avec les caractéristiques du navigateur (utile en cas d'incompatibilité AJAX)
	var strErreur="Erreur : navigateur incompatible AJAX !";
	var strNav=navigator.userAgent;
	alert(strErreur+"\n"+strNav);
}
//--------------------------------------------------
Ajax.chargerPage=function(id,url,strFonction){
	//affiche l'url dans l'objet DOM portant l'id puis exécute la fonction strFonction, ex : "maFonction(arg1,arg2)"
	if(!Ajax.ok())return;
	var objDom=document.getElementById(id);
	var ajax=new Ajax();
	ajax.url=url;
	ajax.f=function(txt){
		if(txt!==false){
			objDom.innerHTML=txt;
			if(typeof(strFonction)!="undefined")eval(strFonction);
		}
	};
	ajax.fetchTxt();
};
//--------------------------------------------------
Ajax.dresserOptions=function(objMenu,objXml,val,avecNiveaux){
	//objMenu est un objet DOM <select>
	//objXml est un objet DOM correspondant à une chaine XML <racine><valeur>Vn</valeur><texte niveau="...">Tn</texte>...</racine>
	//val est la valeur à sélectionner
	//avecNiveaux est vrai si des niveaux sont utilisés, les classes CSS "optN" doivent alors être définies
	var xmlValeurs=objXml.getElementsByTagName("valeur");
	var xmlTextes=objXml.getElementsByTagName("texte");
	var i,n,itemValeur,itemTexte,valeur,texte;
	objMenu.length=0;//raz des options
	for(i=0,n=0;i<xmlValeurs.length;i++){
		itemValeur=xmlValeurs.item(i);
		itemTexte=xmlTextes.item(i);
		valeur=itemValeur.firstChild?itemValeur.firstChild.nodeValue:"";
		texte=itemTexte.firstChild?itemTexte.firstChild.nodeValue:"";
		objMenu.options[n]=new Option(texte,valeur);
		if(valeur==val)objMenu.selectedIndex=n;
		if(avecNiveaux && itemTexte.getAttribute("niveau"))objMenu.options[n].className="opt"+itemTexte.getAttribute("niveau");
		n++;
	}
};
//--------------------------------------------------
//test de compatibilité du navigateur pour définir la variable statique Ajax.navOk
new Ajax();
