//////////////////////////////////////////////////////////////////////////////
// OBJET PERMETTANT DE SIMPLIFIER DES REQUETES AJAX
//////////////////////////////////////////////////////////////////////////////
/* Les param�tres de SetParameter

	parameters	Une chaine ou un tableau associatif des param�tres � POSTER
	callback	le nom de la fonction � appeler une fois le chargement termin�, par d�faut cette fonction est appel�e en lui faisant
				passer le texte de la requete ainsi que le tableau des param�tres pass�s
	element		l'id de l'�l�ment HTML servant � afficher le texte de la requ�te une fois le charegement termn�
	method		GET ou POST(par d�faut)
*/
/* Exemples
	//Exemple simple
		var maPage = new ajaxURL();
		maPage.setParameter("parameters","toto=1&tata=truc");
		maPage.setParameter("callBack","mafonction de callback");
		maPage.setParameter("element","id d'un div");
		maPage.getURL("http://mondomaine.com/page.php");

	//Exemple avec un tableau contenant les param�tres � poster
		var mesParams = new Array();
		mesParams["toto"]=1;
		mesParams["tata"]="truc";
	
		var maPage = new ajaxURL();
		maPage.setParameter("parameters",mesParams);
		maPage.setParameter("callBack","mafonction de callback");
		maPage.setParameter("element","id d'un div");
		maPage.getURL("http://mondomaine.com/page.php");
		
	//Exemple avec un formulaire HTML
		var maPage = new ajaxURL();
		maPage.setParameter("callBack","mafonction de callback");
		maPage.setParameter("element","id d'un div");
		maPage.submitForm(leFormulaire);
		
*/
//////////////////////////////////////////////////////////////////////////////

function ajaxURL()
{
	//D�claration des propri�t�s
	this.URL="";
	this.parameters = "";
	this.callBack = null;
	this.elementHTML = null;
	this.method = "POST";
	this.debug = false;
	this.frm = null;
}

//////////////////////////////////////////////////////////////////////////////
// D�fini les param�tres de la requ�te AJAX
//////////////////////////////////////////////////////////////////////////////

ajaxURL.prototype.setParameter = function(sParam,sValue)
{
	
	sParam = sParam.toLowerCase();
	
	switch(sParam)
	{
		case "post": // Param�tres � passer dans l'URL
		case "parameters": // Param�tres � passer dans l'URL
			if (ajaxIsArray(sValue))this.parameters = ajaxSerialize(sValue);
			else if (ajaxIsObject(sValue))this.parameters = ajaxSerialize(sValue);
			else this.parameters = sValue;
			break;
		case "method": // M�thode d'appel GET ou POST
			if (ajaxIsString(sValue))sValue = ajaxTrim(sValue).toLowerCase();
			switch(sValue)
			{
				case "get":
					sValue = "GET";
					break;
				default:
					sValue = "POST";
					break;
			}
			this.method = sValue;
			break;
		case "callback": //Fonction a appeler � la fin du chargement
			this.callBack = sValue;
			break;
		case "elementhtml": //Element HTML a remplir avec le texte retourn�
		case "element":
			this.elementHTML = sValue;
			break;
		case "debug": //Afficher le texte retourn�
			if (!ajaxIsBoolean(sValue))this.debug = false;
			else this.debug = sValue;
			break;
		case "frm":
		case "form":
			this.frm = sValue;
			break;
	}
}

//////////////////////////////////////////////////////////////////////////////
// Facilite la soumission d'un formulaire par Ajax
//////////////////////////////////////////////////////////////////////////////

ajaxURL.prototype.submitForm = function (frm)
{
	var ajaxPage=this;	
	
	var post = ajaxFormSerialize(frm);
	
	if (frm.method)ajaxPage.setParameter("method",frm.method);
	ajaxPage.setParameter("parameters",post);
	if (frm.action)return ajaxPage.getURL(frm.action);
	else return "Le formulaire pr�cis� doit poss�der une propri�t� 'action' pr�cisant l'URL a charger";
}

//////////////////////////////////////////////////////////////////////////////
// Envoi d'une requ�te Ajax
//////////////////////////////////////////////////////////////////////////////

ajaxURL.prototype.getURL = function (sURL)
{
	var ajaxPage=this;	
	if (sURL == undefined || sURL == "" )return "Besoin d'une URL";

	var sURL = sURL+"?rnd="+Math.floor(Math.random() * 9999999)+1;

	var ajax_object = null;
	
	if(window.XMLHttpRequest) // Firefox
		ajax_object = new XMLHttpRequest();
	else if(window.ActiveXObject) // Internet Explorer
		ajax_object = new ActiveXObject("Microsoft.XMLHTTP");
	else { // XMLHttpRequest non support� par le navigateur
		alert("Votre navigateur ne supporte pas AJAX");
	   	return;
	}

	//alert(sURL);
	
	ajax_object.open(ajaxPage.method, sURL, true);
	ajax_object.setRequestHeader("Content-Type","application/x-www-form-urlencoded");		
	ajax_object.send(ajaxPage.parameters);		
	
	ajax_object.onreadystatechange = function() {
		switch (ajax_object.readyState)
		{
			case 0: //uninitialized
				break;
			case 1: //loading
				break;
			case 2: //loaded
				break;
			case 3: //interactive
				break;
			case 4: //complete
				if (ajaxPage.debug==true)alert(ajax_object.responseText);
				var formatH = ajax_object.getResponseHeader("format"); 
				
				if (ajaxIsString(formatH))formatH = formatH.toLowerCase();
				var aParameters=ajaxQuery2array(ajaxPage.parameters);
				
				var headers = new Array();
					headers = ajax_object.getAllResponseHeaders().split("\n");
				
				var tab_headers = new Array();
				
				for (var i=0;i<headers.length;i++)
				{
					var temp = headers[i].split(":");
					tab_headers[temp[0]] = ajaxTrim(temp[1]);
				}
			
				//alert(dump(aParameters));
				switch(formatH)
				{
					case "json":
						var Reponse = new Array();
						if (ajax_object.responseText.indexOf("{")!=-1)Reponse = eval('(' + ajax_object.responseText + ')');
						Reponse["podz"]= new Array();
						Reponse["podz"]["param"]=ajaxPage.parameters;
						Reponse["podz"]["fnc"]=ajaxPage.callBack;
						Reponse["podz"]["element"]=ajaxPage.elementHTML;
						Reponse["podz"]["reponse"]=ajax_object.responseText;
						if (ajaxPage.callBack!=null && ajaxPage.callBack!="" && !ajaxIsUndefined(ajaxPage.callBack))eval(ajaxPage.callBack+"(Reponse,aParameters);");					
						break;
					case "js":
					case "javascript":
						//A EVALUER!!
						break;
					default:
						var Reponse = ajax_object.responseText;
						if (ajaxPage.elementHTML!=null && ajaxPage.elementHTML!="" && !ajaxIsUndefined(ajaxPage.elementHTML))
						{
							if(ajaxIsString(ajaxPage.elementHTML))
							{
								document.getElementById(ajaxPage.elementHTML).innerHTML = ajax_object.responseText;
							}
							else
							{
								ajaxPage.elementHTML.innerHTML = ajax_object.responseText;
							}
						}
						if (ajaxPage.callBack!=null && ajaxPage.callBack!="" && !ajaxIsUndefined(ajaxPage.callBack))eval(ajaxPage.callBack+"(Reponse,aParameters,tab_headers);");					
						break;
				}
				break;
		}
	}
}

//////////////////////////////////////////////////////////////////////////////
// Fonctions d'utilit� globale
//////////////////////////////////////////////////////////////////////////////

function ajaxTrim(str) {
   if (typeof str == 'string')return str.replace(/^\s*|\s*$/gi,"");
   else return str;
}

// V�rification des types ////////////////////////////////////////////////////////////////////////////////

function ajaxIsArray(a) {
    return ajaxIsObject(a) && a.constructor == Array;
}
function ajaxIsString(a) {
    return typeof a == 'string';
}
function ajaxIsBoolean(a) {
    return typeof a == 'boolean';
}
function ajaxIsFunction(a) {
    return typeof a == 'function';
}
function ajaxIsObject(a) {
    return (a && typeof a == 'object') || ajaxIsFunction(a);
}
function ajaxSerialize(a) {
	var sResult="";
	for(key in a)
	{
		if (typeof a[key] != "function")
		{
			if (sResult!="")sResult+="&";
			sResult+=key+"="+encodeURIComponent(a[key]);
		}
	}
	return sResult;	
}
function ajaxIsUndefined(a) {
    return typeof a == 'undefined';
} 

// TRANSFORME UNE CHAINE DE PARAMETRES SERIALIZES EN TABLEAU ////////////////////////////////////////////////////////////////////////////////

function ajaxQuery2array(tmpQuery) {   
	var q2oObj, q2oArr, q2oArr_i, tmpRest="";
    q2oObj = new Array();
    q2oArr = new Array();
    q2oArr_i = new Array();
    if(tmpQuery.indexOf("?")==0) tmpQuery = tmpQuery.substring(1);
    if (tmpQuery.indexOf('&') >= 0) q2oArr = tmpQuery.split('&');
    else q2oArr[0] = tmpQuery;
    for (qqq=0; qqq<q2oArr.length; qqq++) {
     if (q2oArr[qqq].indexOf('=') > -1) {
        q2oArr_i = q2oArr[qqq].split('=');
        tmpRest = q2oArr_i.slice(1).join("=");
        q2oObj[q2oArr_i[0]] = unescape(tmpRest);
     } else {
        if(q2oArr[qqq]!="") q2oObj[q2oArr[qqq]] = true;
     }
    }
    return q2oObj;
}

// SERIALIZE LES CHAMPS D'UN FORMULAIRE ////////////////////////////////////////////////////////////////////////////////

function ajaxFormSerialize(frm)
{   
	var sResult="";
	for(var i=0;i<frm.length;++i)
	{
		if (frm.elements[i].type!="button")
		{
			if (sResult!="")sResult+="&";
			sResult+=frm.elements[i].name+"="+encodeURIComponent(frm.elements[i].value);
		}
	}
	return sResult;	
}

// FIN //////////////////////////////////////////////////////////////////////////////////////

