// Script original sur http://drakware.com/?e=3
// Utilisation libre

// Array des requetes XML
var aXmlReqs = new Array(); 

// Class des requetes
function oXMLHttpReq(bDispo) { 
	this.bDispo = bDispo; 
	this.sHandleFunction;
	this.aArguments;
	this.oXmlHttp = false; 
	
	// Mozilla et autres naviguateurs recents
	if (window.XMLHttpRequest) { 
		this.oXmlHttp = new XMLHttpRequest(); 
	} 

	// IE
	else if (window.ActiveXObject) { 
		this.oXmlHttp = new ActiveXObject("Microsoft.oXmlHttp"); 
	} 
} 

// Requete GET
// Parametres: string url, string fonction handler, Array d'arguments
function fAjaxGet(sUrl, sHandleFunction, aArguments) {

	var iPos = -1;

	// Verifie les objets dispos
	for (var i=0; i<aXmlReqs.length; i++) {
		if (aXmlReqs[i].bDispo == 1) {
			iPos = i;
			break;
		}
	}

	// Aucune requete liberee, donc nouveau
	if (iPos == -1) {
		iPos = aXmlReqs.length;
		aXmlReqs[iPos] = new oXMLHttpReq(1);
	}

	// Si l'objet est dispo
	if (aXmlReqs[iPos].oXmlHttp) {
		aXmlReqs[iPos].bDispo = 0;
		aXmlReqs[iPos].sHandleFunction = sHandleFunction;
		aXmlReqs[iPos].aArguments = aArguments;
		aXmlReqs[iPos].oXmlHttp.open("GET",sUrl,true); 
		// Fonction lors de disponnibilite
		aXmlReqs[iPos].oXmlHttp.onreadystatechange = function() { 
			if (typeof(oXmlHttpChange) != 'undefined') {
				oXmlHttpChange(iPos); 
			} 
		} 
		
		// Mozilla etc, send() doit etre null
		if (window.XMLHttpRequest) { 
			aXmlReqs[iPos].oXmlHttp.send(null); 
		} 
		// IE, AxticX send() peut etre vide
		else if (window.ActiveXObject) { 
			aXmlReqs[iPos].oXmlHttp.send(); 
		} 
	} 
}

// Requete POST
function fAjaxPost(sUrl, sFormID, sHandleFunction, aArguments) { 
	var pos = -1; 
	var sParametres = "";
	var oFormulaire = null;
	
	// Parcours le formulaire pour y prendre les elements
	oFormulaire = document.forms[sFormID];
	for (i = 0; i < oFormulaire.elements.length; i++) { 
		var tmp_nom		= oFormulaire.elements[i].name; //Nom du champs
		var tmp_valeur	= oFormulaire.elements[i].value; //Valeur du champs
		var tmp_type	= oFormulaire.elements[i].type; //type de champ
		
		if (tmp_type == 'checkbox'){ // si le type est checkbox, regarde si coche ou non pour prendre ou non la valeur
			if(oFormulaire.elements[i].checked==true){
				if(sParametres != "") { 
					sParametres += '&';
				}
				sParametres += tmp_nom+'='+tmp_valeur;
			}
		}
		else if(tmp_nom != null) { // Si la valeur n'est pas null [Pas forcement juste comme raisonnement] on l'ajoute à notre parametre
			
			// Si params n'est pas vide, on ajoute le &
			if(sParametres != "") { 
				sParametres += '&';
			}
			
			sParametres += tmp_nom+'='+tmp_valeur;
		}
	}
	
	// Cherche une requete liberee
	for (var i=0; i<aXmlReqs.length; i++) { 
		if (aXmlReqs[i].bDispo == 1) { 
			pos = i; 
			break; 
		} 
	} 
	
	// Aucune requete liberee, on utilise une nouvelle
	if (pos == -1) {
		pos = aXmlReqs.length;
		aXmlReqs[pos] = new oXMLHttpReq(1);
	} 
	
	// Requete dispo
	if (aXmlReqs[pos].oXmlHttp) { 
		aXmlReqs[pos].bDispo = 0;
		aXmlReqs[pos].sHandleFunction = sHandleFunction;
		aXmlReqs[pos].aArguments = aArguments;
		aXmlReqs[pos].oXmlHttp.open("POST",sUrl,true);
		aXmlReqs[pos].oXmlHttp.onreadystatechange = function() { 
			if (typeof(oXmlHttpChange) != 'undefined') {
				oXmlHttpChange(pos);
			}
		}
		
		aXmlReqs[pos].oXmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		aXmlReqs[pos].oXmlHttp.setRequestHeader("Content-length", sParametres.length);
		aXmlReqs[pos].oXmlHttp.send(sParametres); 
	} 
} 

// Changement de status
function oXmlHttpChange(iPos) { 
	// Pret a etre traite
	if (typeof(aXmlReqs[iPos]) != 'undefined' && aXmlReqs[iPos].bDispo == 0 && aXmlReqs[iPos].oXmlHttp.readyState == 4) { 
		if (aXmlReqs[iPos].oXmlHttp.status == 200 || aXmlReqs[iPos].oXmlHttp.status == 304) { 
			
			// Ajoute le resultat au tableau
			aXmlReqs[iPos].aArguments.push(aXmlReqs[iPos].oXmlHttp.responseText);
			
			this[aXmlReqs[iPos].sHandleFunction](aXmlReqs[iPos].aArguments);
			//fResultatAjax(xmlreqs[pos].oXmlHttp.responseXML); 
		} 
		else { 
			// Fonction appellee alors que pas pret
			alert('error ajax');
		} 
		// On libere l'objet
		aXmlReqs[iPos].bDispo = 1;
	} 
}
