// + --------------------------------------------------------------------------------------
// + XHRConnection
// + V1.2
// + Thanh Nguyen, http://www.sutekidane.net
// + 14.06.2005
// + http://creativecommons.org/licenses/by-nc-sa/2.0/fr/deed.fr
// + --------------------------------------------------------------------------------------
function XHRConnection(pdebug) {
	
	// + ----------------------------------------------------------------------------------
	var conn = false;
	var debug = (pdebug == true || pdebug == false) ? pdebug : false;
	var datas = new String();
	var areaId = new String();
	// Objet XML
	var xmlObj;
	// Type de comportement au chargement du XML
	var xmlLoad;
	
	this.texte_renvoye = "";
	
	// + ----------------------------------------------------------------------------------
	try {
		conn = new XMLHttpRequest();		
	}
	catch (error) {
		if (debug) { alert('Erreur lors de la tentative de cr‚ation de l\'objet \nnew XMLHttpRequest()\n\n' + error); }
		try {
			conn = new ActiveXObject("Microsoft.XMLHTTP");
		}
		catch (error) {
			if (debug) { alert('Erreur lors de la tentative de cr‚ation de l\'objet \nnew ActiveXObject("Microsoft.XMLHTTP")\n\n' + error); }
			try {
				conn = new ActiveXObject("Msxml2.XMLHTTP");
			}
			catch (error) {
				if (debug) { alert('Erreur lors de la tentative de cr‚ation de l\'objet \nnew ActiveXObject("Msxml2.XMLHTTP")\n\n' + error); }
				conn = false;
			}
		}
	}

	// + ----------------------------------------------------------------------------------
	// + setDebugOff
	// + Désactive l'affichage des exceptions
	// + ----------------------------------------------------------------------------------
	this.setDebugOff = function() {
		debug = false;
	};

	// + ----------------------------------------------------------------------------------
	// + setDebugOn
	// + Active l'affichage des exceptions
	// + ----------------------------------------------------------------------------------
	this.setDebugOn = function() {
		debug = true;
	};
	
	// + ----------------------------------------------------------------------------------
	// + resetData
	// + Permet de vider la pile des données
	// + ----------------------------------------------------------------------------------
	this.resetData = function() {
		datas = new String();
		datas = '';
	};
	
	// + ----------------------------------------------------------------------------------
	// + appendData
	// + Permet d'empiler des données afin de les envoyer
	// + ----------------------------------------------------------------------------------
	this.appendData = function(pfield, pvalue) {
		datas += (datas.length == 0) ? pfield+ "=" + escape(pvalue) : "&" + pfield + "=" + escape(pvalue);
	};
	// + ----------------------------------------------------------------------------------
	// + setRefreshArea
	// + Indique quel elment identifié par id est valoris lorsque l'objet XHR reoit une réponse
	// + ----------------------------------------------------------------------------------
	this.setRefreshArea = function(id) {
		areaId = id;
	};
	
	// + ----------------------------------------------------------------------------------
	// + createXMLObject
	// + Méthode permettant de créer un objet DOM, retourne la réfrence
	// + Inspiré de: http://www.quirksmode.org/dom/importxml.html
	// + ----------------------------------------------------------------------------------
	this.createXMLObject = function() {
		try {
			 	xmlDoc = document.implementation.createDocument("", "", null);
				xmlLoad = 'onload';
		}
		catch (error) {
			try {
				xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
				xmlLoad = 'onreadystatechange ';
			}
			catch (error) {
				if (debug) { alert('Erreur lors de la tentative de cr‚ation de l\'objet XML\n\n'); }
				return false;
			}
		}
		return xmlDoc;
	}
	
	// + ----------------------------------------------------------------------------------
	// + Permet de définir l'objet XML qui doit être valorisé lorsque l'objet XHR reoit une réponse
	// + ----------------------------------------------------------------------------------
	this.setXMLObject = function(obj) {
		if (obj == undefined) {
				if (debug) { alert('Paramètre manquant lors de l\'appel de la méthode setXMLObject'); }
				return false;
		}
		try {
			//xmlObj = this.createXMLObject();
			xmlObj = obj;
		}
		catch (error) {
				if (debug) { alert('Erreur lors de l\'affectation de l\'objet XML dans la méthode setXMLObject'); }
		}
	}
	
	// + ----------------------------------------------------------------------------------
	// + loadXML
	// + Charge un fichier XML
	// + Entrées
	// + 	xml				String		Le fichier XML à charger
	// + 	callBack		Objet		Le nom de la fonction de callback
	// + ----------------------------------------------------------------------------------
	this.loadXML = function(xml, callBack) {
		if (!conn) return false;
		// Chargement pour alimenter un objet DOM
		if (xmlObj && xml) {
			if (typeof callBack == "function") {
				if (xmlLoad == 'onload') {
					xmlObj.onload = callBack;
				}
				else {
					xmlObj.onreadystatechange = function() {
						if (xmlObj.readyState == 4) callBack()
					}
				}
			}
			xmlObj.load(xml);
			return;
		}		
	}

	// + ----------------------------------------------------------------------------------
	// + sendAndLoad
	// + Connexion à la page désirée avec envoie des données, puis mise en attente de la réponse
	// + Entrées
	// + 	Url				String		L'url de la page à laquelle l'objet doit se connecter
	// + 	httpMode		String		La méthode de communication HTTP : GET, HEAD ou POST
	// + 	callBack		Objet		Le nom de la fonction de callback
	// + ----------------------------------------------------------------------------------
	this.sendAndLoad = function(Url, httpMode, callBack, callNext) {
		httpMode = httpMode.toUpperCase();
		conn.onreadystatechange = function() {//alert(conn+" "+conn.readyState);
			
			if (conn.readyState == 4 && conn.status == 200) {
				// Si une fonction de callBack a été définie
				if (typeof callBack == "function") {
					
					callBack(conn);//alert("callback");
					//return;
					
				}
				// Si une zone destinée à récupérer le résultat a été définie
				//else if (areaId.length > 0){
				if (areaId.length > 0){
					try {
						document.getElementById(areaId).innerHTML = conn.responseText;
						
					}
					catch(error) {
						if (debug) { alert('Echec, ' + areaId + ' n\'est pas un objet valide'); }
					}
				}
				else{
					texte_renvoye=conn.responseText;
					
				}
				
				if (typeof callNext == "function") {
					callNext(conn);//alert("callback");
					//return;
					
				}
				return ;
			}
			
		};
		switch(httpMode) {
			case "GET":
				try {
					Url = (datas.length > 0) ? Url + "?" + datas : Url;
					conn.open("GET", Url,true);
					conn.send(null);
				}
				catch(error) {
					if (debug) { alert('Echec lors de la transaction avec ' + Url + ' via la méthode GET'); }
					return false;
				}
			break;
			case "POST":
				try {
					conn.open("POST", Url,true); 
					conn.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
					conn.send(datas);
				}
				catch(error) {
					if (debug) { alert('Echec lors de la transaction avec ' + Url + ' via la mthode POST'); }
					return false;
				}
			break;
			default :
				return false;
			break;
		}
		return true;
	};
	return this;
}

function getElementsByTagNames(list,obj) {
	if (!obj) var obj = document;
	var tagNames = list.split(',');
	var resultArray = new Array();
	for (var i=0;i<tagNames.length;i++) {
		var tags = obj.getElementsByTagName(tagNames[i]);
		for (var j=0;j<tags.length;j++) {
			resultArray.push(tags[j]);
		}
	}
	var testNode = resultArray[0];
	if (!testNode) return [];
	if (testNode.sourceIndex) {
		resultArray.sort(function (a,b) {
				return a.sourceIndex - b.sourceIndex;
		});
	}
	else if (testNode.compareDocumentPosition) {
		resultArray.sort(function (a,b) {
				return 3 - (a.compareDocumentPosition(b) & 6);
		});
	}
	return resultArray;
}


function LoadAndSave(nom_div,url,id_form,est_div)
{ i=0;
	// Cration de l'objet
	var XHR = new XHRConnection();
	XHR.appendData('demande_ajax', 1);
	if(id_form!=""){
		// Recuperarion des valeurs des elements
		XHR.appendData('send_ajax', 1);
		
		if(est_div==1)
		{
			ladiv=document.getElementById(id_form);
			tab_elem = getElementsByTagNames('input,select,textarea',ladiv);
			for(i=0;i<tab_elem.length;i++){
				name=tab_elem[i].name;
				//alert(name);
				if(tab_elem[i].type=='radio' && tab_elem[i].checked==true){
						XHR.appendData(name, tab_elem[i].value);
				}
				if(tab_elem[i].type=='checkbox' && tab_elem[i].checked==true){
						XHR.appendData(name, tab_elem[i].value);
				}
				if(tab_elem[i].type!='radio' && tab_elem[i].type!='checkbox'){
						XHR.appendData(name, tab_elem[i].value);
				}
			}
		}
		else
		{
			// Recuperation des inputs
			nb=document.getElementById(id_form).length;
			//nb=document[nom_form].length;
				
			for(i=0;i<nb;i++){
				
				//name=document.getElementById(nom_form).elements[i].name;
				/*if(document[nom_form].elements[i].type=='radio' && document[nom_form].elements[i].checked==true){
						XHR.appendData(name, document[nom_form].elements[i].value);
				}
				if(document[nom_form].elements[i].type=='checkbox' && document[nom_form].elements[i].checked==true){
						XHR.appendData(name, document[nom_form].elements[i].value);
				}
				if(document[nom_form].elements[i].type!='radio' && document[nom_form].elements[i].type!='checkbox'){
						XHR.appendData(name, document[nom_form].elements[i].value);
				}*/
				name=document.getElementById(id_form).elements[i].name;
	
				if(document.getElementById(id_form).elements[i].type=='radio' && document.getElementById(id_form).elements[i].checked==true){
						XHR.appendData(name, document.getElementById(id_form).elements[i].value);
				}
				if(document.getElementById(id_form).elements[i].type=='checkbox' && document.getElementById(id_form).elements[i].checked==true){
						XHR.appendData(name, document.getElementById(id_form).elements[i].value);
				}
				if(document.getElementById(id_form).elements[i].type!='radio' && document.getElementById(id_form).elements[i].type!='checkbox'){
						XHR.appendData(name, document.getElementById(id_form).elements[i].value);
				}
				
			}
		}
		// Envoie des informations
		
	}
	
	if(nom_div!="")XHR.setRefreshArea(nom_div);
	XHR.sendAndLoad(url, "POST");
}

