/*
object : reqMaker
description : objet permettant de construire des requette en GET et en POST
creator : Valentin Dubois valentin@veacks.net
creation date : 28/11/2006
last update : 28/11/2006
*/
var reqMaker = {
	//création de la requete
	obj : function ()
		{
		var o;
		var browser = navigator.appName;
		if(browser == "Microsoft Internet Explorer")
			{ o = new ActiveXObject("Microsoft.XMLHTTP"); }
		else
			{ o = new XMLHttpRequest(); }
		return o;
		},

	//methode, url, tableau get, tableau post.
	init : function (retVar, u, tGet, tPost) 
		{
		if (!retVar)
			assyc = false;
		else
			assyc = true;

		o = reqMaker.obj();
		
		var m = "GET";

		if ((tGet != null) && (tGet[0] != null))
			{
			var firstParam = true;

			for (var i=0; i<tGet.length; i++)
				{
				if (firstParam) u += "?" + tGet[i][0] + "=" + tGet[i][1];
				else u += "&" + tGet[i][0] + "=" + tGet[i][1];
				firstParam = false;
				}
			}


		if ((tPost != null) && (tPost[0] != null))
			{
			var firstParam = true;

			m = "POST";
			
			var post = "";

			for (var i=0; i<tPost.length; i++)
				{
				//Convertion des caractères spéciaux pour le post.
				tPost[i][0] = tPost[i][0].replace(/&/,'%26');
				tPost[i][1] = tPost[i][1].replace(/&/,'%26');

				if (firstParam) post += tPost[i][0] + "=" + tPost[i][1];
				else post += "&" + tPost[i][0] + "=" + tPost[i][1];
				firstParam = false;
				}
			}
		else 
			var post = null;

	
		if (tGet != null)
			u += "&idReq=" + Req++;
		else
			u += "?idReq=" + Req++;

		o.open(m, u, assyc);
		
		//init des variables de réponses.
		reqMaker.ResponseXML = new Object();
		reqMaker.textResponse = new String();
		reqMaker.responseXMLTab = new Array();

		if (post != null)
			{
			o.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
			o.setRequestHeader("Content-length", 1);
			o.setRequestHeader("Connection", "close");
			}

		o.onreadystatechange = function recept () {
			//si le serveur répond
			if(o.readyState == 4)
				{
				reqMaker.textResponse = o.responseText;
				if (o.responseXML)
					{
					reqMaker.ResponseXML = o.responseXML.documentElement;
					reqMaker.responseXMLTab = reqMaker.xml2tab(reqMaker.clean(o.responseXML.documentElement));	
					}
				//appel la fonction init pour le retour.
				retVar.init(reqMaker);
				}
			}
			
		o.send(post);
		},
	
	//Make XML2TAB
	xml2tab : function (xml)
		{
		//Fonction permettant le traitement d'un XML pour le retourner 
		//en tableau asscociatif (à chaque balise).
			//Initialisation du tableau à retourner
			var tmpRefNodeTab = new Array();
			//Début du scrutage du noeud Parent
			if (xml.firstChild)
				{
				var niv = xml.childNodes;
				//Départ de la boucle de traitements des noeuds enfants
				for ( var i=0; i<niv.length; i++)
					{
					//Début de détection des attributs pour chaque noeud enfant
					//Initialisation du FLAG si attributs à faux.
					var isAttr = false;
					//Vérification de la présence d'attributs.
					if (niv[i].attributes) isAttr = true;
					
					//Si des la présence est avérée,
					if (isAttr)
						{
						//si le nombre d'attributs est supperieur à 0,
						if (niv[i].attributes.length > 0)
							{
							//Initialisation du tableau contenant les attributs.
							var attTmpTab = new Array();

							//Départ des boucles de traitement des attributs du noeud
							//pour chaques attributs,
							for ( var j=0; j<niv[i].attributes.length; j++)
								{
								//insérer sa val dans le tableau des attributs à la case de son nom. 
								attTmpTab[niv[i].attributes[j].name] = niv[i].getAttribute(niv[i].attributes[j].name)
								}//Fin des boucles de traitement des attributs.
							}
						}//Fin de vérification des attributs du noeud enfant.

					//Début de la vérification du type de noeud enfant.
					//Si le noeud enfant contient d'autres noeud
					if (niv[i].firstChild)
						{ 
						//Initialisation du tableau contenant les autres noeuds.
						var tmpEnglobTab = new Array();
						
						//si le contenu n'est pas un tableau xhtml
						if (niv[i].nodeName != "table")
							{
							//Affectation des noeuds inferieur à tmpEnglobTab
							//(la fonction s'appel elle même.)
							tmpEnglobTab["c"] = reqMaker.xml2tab(niv[i]);
							}
						else
							{
							//sinon affecter le tableau à tmpEnglobTab
							tmpEnglobTab["c"] = niv[i];
							}
						
						//Affectation attTmpTab à tmpEnglobTab si il contient des attributs.
						if (isAttr){ tmpEnglobTab["a"] = attTmpTab; }
						
						//Si le nom du noeud à déjà été référencé,
						if (tmpRefNodeTab[niv[i].nodeName])
							//affectation de tmpEnglobTab au tableau à retourner.
							{ tmpRefNodeTab[niv[i].nodeName].push(tmpEnglobTab); }
						//Sinon,
						else
							{
							//créer un tableau globale dans le noeud au nom de balise,
							var tmpCountNodeTab = new Array;
							//affecter tmpEnglobTab à la première place de tmpCountNodeTab,
							tmpCountNodeTab[0] = tmpEnglobTab;
							//affecter tmpCountNodeTab au tableau de retour.
							tmpRefNodeTab[niv[i].nodeName] = tmpCountNodeTab;
							}
						}
					//Si il ne contient pas d'autres noeuds
					else
						{  
						//Si il contient une valeure on retourne la valeure
						if (niv[i].nodeValue != null){ return niv[i].nodeValue; }
						//Si le noeud parent contient un noeud d'attributs 
						else
							{
							//Si référencé
							if (tmpRefNodeTab[niv[i].nodeName])
								{ 
								//affectation du noeud d'attributs au tableau de retour
								if (isAttr){ tmpRefNodeTab[niv[i].nodeName].push(attTmpTab); }
								else{ tmpRefNodeTab[niv[i].nodeName].push("empty attribute node"); }
								}
							//Sinon
							else
								{ 
								//Référencement et affectation du noeud d'attributs au tableau de retour 
								var tmpCountNodeAttTab = new Array; 
								
								if (isAttr){ tmpCountNodeAttTab[0] = attTmpTab; }
								else { tmpCountNodeAttTab[0] = "empty attribute node"; }
								
								tmpRefNodeTab[niv[i].nodeName] = tmpCountNodeAttTab;
								}
							
							}
						}
					}
				//retour du tableau
				return tmpRefNodeTab;
				}
			},
	
	// Node cleaner	
	clean : function (d)
		{
		var bal=d.getElementsByTagName('*');

		for(i=0;i<bal.length;i++)
			{
			a=bal[i].previousSibling;
			if(a && a.nodeType==3)
				reqMaker.go(a);
			b=bal[i].nextSibling;
			if(b && b.nodeType==3)
				reqMaker.go(b);
			}
		return d;
		},
	
	go : function (c)
		{
		if(!c.data.replace(/\s/g,''))
			c.parentNode.removeChild(c);
		}
	};
