
function tncaAjax(){
	this.xmlhttp = null; // Objet de communication
	this.queryQueue = new Array(); // Tableau file d'attente
	this.globalLoading = false; // Est-on en cours de chargement ?
	this.argumentSeparator = "&";
	this.responseTypeDefault = "TARGET";
	this.responseStatus = new Array(2);
	
/******************* FILE D'ATTENTE *******************/

	/* Ajoute une requete dans la file d'attente
	*/
	this.setQuery = function(queryObject){
		if (typeof(queryObject) == "object" && queryObject.url != undefined){
			var query = new Object();
			query.vars = new Object();
			query.url = queryObject.url;
			// Id
			if (queryObject.id != undefined){
				query.id = queryObject.id;
				query.vars["id"] = queryObject.id;
			}
			// Target
			if (queryObject.target != undefined){
				query.target = queryObject.target;
				query.vars["target"] = queryObject.target;
			}
			// Response Type
			query.responseType = this.responseTypeDefault;
			if (queryObject.responseType != undefined){
				query.responseType = queryObject.responseType;
			}
			// Memorisation des variables de formulaire
			if (obForm=document.forms[queryObject.paramForm]){
				for (a=0;a<obForm.length;a++){
					if (obForm[a].id != ""){
						var valeur = obForm[a].value;
						switch (obForm[a].type){
							case "checkbox":
								if (obForm[a].checked == false){valeur = "";}
							break;
							case "radio":
								if (obForm[a].checked == false){valeur = null;}
							break;
						}
						if (valeur != null){
							query.vars[encodeURIComponent(obForm[a].id)] = encodeURIComponent(valeur);
						}
					}
				}
			}
			// Memorisation des variables contextuelles
			if (typeof(queryObject.paramObject) == "object"){
				for (var id in queryObject.paramObject){
					query.vars[encodeURIComponent(id)] = encodeURIComponent(queryObject.paramObject[id]);
				}
			}
			// Conversion des variables en String
			query.varString = this.createUrlString(query.vars);
			// Fonctions evenementielles
			query.onLoading = function() { };
			if(typeof(queryObject.onLoading)=="function"){query.onLoading=queryObject.onLoading;}
			query.onLoaded = function() { };
			if(typeof(queryObject.onLoaded)=="function"){query.onLoaded=queryObject.onLoaded;}
			query.onInteractive = function() { };
			if(typeof(queryObject.onInteractive)=="function"){query.onInteractive=queryObject.onInteractive;}
			query.onCompletion = function() {};
			if(typeof(queryObject.onCompletion)=="function"){query.onCompletion=queryObject.onCompletion;}
			query.onError = function() { };
			if(typeof(queryObject.onError)=="function"){query.onError=queryObject.onError;}
			query.onFail = function() { };
			if(typeof(queryObject.onFail)=="function"){query.onFail=queryObject.onFail;}
			// Mise en file d'attente
			this.queryQueue.push(query);
			// Execution de la requete
			this.startLoading();
		}

	}
	
	/* Test l'etat du chargement et lance la requete suivante
	*/
	this.startLoading = function(){
		// Verif si pas deja en chargement et si on a quelque chose a charger
		if (this.globalLoading === false && this.queryQueue.length > 0){ // Pas si on est deja en chargement
			// Instance de l'objet de communication
			if (this.xmlhttp == null){this.createAJAX();}
			// Recup element a charger
			var queryObject = this.queryQueue.shift();
			// Lance le chargement
			this.sendQuery(queryObject);
		}
	}
	
	/* Execution de la requete
	*/
	this.sendQuery = function(queryObject){
		this.globalLoading = true;
		if (this.failed) {
			this.loadingComplete();
			this.onFail = queryObject.onFail;
			this.onFail();
		}else{
			var self = this;
			self.id = queryObject.id;
			self.target = queryObject.target;
			self.url = queryObject.url;
			self.varString = queryObject.varString;
			self.queryObject = queryObject; // ****************************
			// Ouverture en POST
			this.xmlhttp.open("POST", queryObject.url, true);
			try {
				this.xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
			} catch (e) { }
			// Traitement retour
			this.xmlhttp.onreadystatechange = function() {
				switch (self.xmlhttp.readyState) {
					case 1:
						self.onLoading = self.queryObject.onLoading; //********
						self.onLoading();
					break;
					case 2:
						self.onLoaded = self.queryObject.onLoaded; //**********
						self.onLoaded();
					break;
					case 3:
						self.onInteractive = self.queryObject.onInteractive; //*********
						self.onInteractive();
					break;
					case 4:
						// alert('stop');
						self.response = self.xmlhttp.responseText;
						self.responseXML = self.xmlhttp.responseXML;
						self.responseFRT = false;
						self.responseStatus[0] = self.xmlhttp.status;
						self.responseStatus[1] = self.xmlhttp.statusText;
						if (self.responseStatus[0] == "200") {
							if (self.responseFRT=self.applyResponse(self.queryObject)){ //***************
								self.onCompletion = self.queryObject.onCompletion; //***************
								self.onCompletion();
								self.loadingComplete();	
							}
						}else{
							self.onError = self.queryObject.onError; //*************
							self.onError();
							self.loadingComplete();
						}
					break;
				}
			}
			// Lance la requete
			this.xmlhttp.send(queryObject.varString);
		}
	}
	
	/* Conversion des variables en string
	*/
	this.createUrlString = function(varObject){
		var SORTIE = new Array("rndval=" + new Date().getTime());
		if (typeof(varObject) == "object"){
			for (var cle in varObject){
				SORTIE.push(cle + "=" + varObject[cle]);
			}
		}
		return SORTIE.join(this.argumentSeparator);
	}
	
	this.loadingComplete = function(){
		this.globalLoading = false;
		this.startLoading();
	}
	
	/* Traitement de la reponse selon responseType
	*/
	this.applyResponse = function(queryObject){
		switch (queryObject.responseType){
			case "TARGET":
				if (obTarget=document.getElementById(queryObject.target)){
					obTarget.innerHTML = this.response;
					// Si la reponse contient des scripts
					var mesScripts = obTarget.getElementsByTagName("script");
					for (var i=0; i<mesScripts.length; i++) {
						eval(mesScripts[i].innerHTML);
					}
				}
			break;
			case "GETVARS":
				var responseArray = new Object();
				var reponseTmp = this.response.split("&");
				for (a=0;a<reponseTmp.length;a++){
					var reponse = reponseTmp[a].split("=");
					reponse[0] = decodeURIComponent(reponse[0]);
					reponse[1] = decodeURIComponent(reponse[1]);
					responseArray[reponse[0]] = reponse[1];
				}
				return responseArray;
			break;
		}
		return true;
	}
	
/************************* AJAX ***********************/
	
	/** Creation de l'objet de communication
	*/
	this.createAJAX = function() {
		try {
			this.xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e1) {
			try {
				this.xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e2) {
				this.xmlhttp = null;
			}
		}

		if (! this.xmlhttp) {
			if (typeof XMLHttpRequest != "undefined") {
				this.xmlhttp = new XMLHttpRequest();
			} else {
				this.failed = true;
			}
		}
	}
	
}

//tncaAjax.prototype = new tncaDebug;