

 
/*****************************************************************************
/*	Fonction générique permettant de communiquer avec AJAX
/*		url : fichier que Ajax va appeler
/*		methode : 'post' ou 'get'
/*		params : les parametres à envoyer ('p1=v1&p2=v2' par exemple)
/*		type_reponse : à 'xml' si on veut un résultat xml, autre chose sinon
/*		fct_oncomplete : fonction a appelé quand ajax recoit le résultat
*/
function sendToAjax(url, methode, params, type_reponse, fct_oncomplete){
	if (type_reponse.toLowerCase() == 'xml') {
		var myAjax = new Request({
			url: url,
			method: methode,
			onComplete: fct_oncomplete
		}).send(params);
	}
}
	
	
/*****************************************************************************
/*	Retourne la valeur du premier noeud xml du tableau  t_elts
/*	Renvoie '' si il ya qlqch qui cloche
*/
function getNodeValue(t_elts){

	if(t_elts.length > 0 && t_elts[0].hasChildNodes() && t_elts[0].firstChild.nodeValue != '')
		return t_elts[0].firstChild.nodeValue;

	return '';
}


/*****************************************************************************
/*	Appelée pour mettre à jour un SELECT, après une requête Ajax
/*	Le XML récupéré doit être du genre:
/*		<donnees>
/*			<select>id_du_select</select>
/*			<selected_value>valeur_a_selectionner</selected_value>
/*			<mess1>message1</mess1>
/*			<mess2>message2</mess2>
/*			<options>
/*				<option>
/*					<value>valeur1</value>
/*					<text>texte1</text>
/*				</option>
/*				...
/*			</options>
/*		</donnees>
*/
function remplirSelectWithAjax(obj,xml){
		
		
	remplirSelectWithXML(
		getNodeValue(xml.getElementsByTagName('select')),
		getNodeValue(xml.getElementsByTagName('selected_value')),
		getNodeValue(xml.getElementsByTagName('mess1')),
		getNodeValue(xml.getElementsByTagName('mess2')),
		xml
	);
}
 
/**
 * Cette fonction remplit des éléments SELECT
 * Le fichier XML récupéré doit être du type:
 * <options>	--> noeud root
 * 		<option>
 * 			<value>valeur1</value>
 * 			<text>texte1</text>
 * 		</option>
 * 		...
 * </options>
 * 
 * id_select : ID de l'element SELECT à remplir
 * selected_value : valeur de l'option à sélectionner
 * mess1 : message affiché en position 0 s'il y a au moins 1 résultat
 * mess2 : message affiché en position 0 s'il n'y a aucun résultat
 */	
function remplirSelectWithXML(id_select, selected_value, mess1, mess2, xml){


	var t_option = xml.getElementsByTagName('option');
	var oSelect = $(id_select);
	var elt, stop, i;

	
	//	Je vide ma liste
	stop = oSelect.options.length;
	for(i=0; i<stop; i++)
		oSelect.options[0] = null;

	
	//	Insertion d'un texte "d'accueil"
	if (mess1!="") {
		elt = document.createElement('option');
		elt.text = (t_option.length == 0 ? mess2 : mess1);
		elt.value = '';
		elt.selected = true;
		oSelect.options[0] = elt;
	}

	//	Je remplis la liste si je peux
	if( t_option.length != 0 ){
		
		i = 1;	//	compteur dans l'élément SELECT: à 0 j'ai le texte d'accueil donc je commence à 1.
		while( i <= t_option.length ){
			elt = document.createElement('option');
			elt.text  = getNodeValue(t_option[i-1].getElementsByTagName('text')).replace(/&euro;/, '€');
			elt.value = getNodeValue(t_option[i-1].getElementsByTagName('value'));
			if( elt.value == selected_value )
				elt.selected = true;

			if (mess1 != "") {
				oSelect.options[i] = elt;
			}else{
				oSelect.options[i-1] = elt;				
			}
			i++;
		}
	}
}


/* Simple AJAX Code-Kit (SACK) v1.6.1 */
/* ©2005 Gregory Wild-Smith */
/* www.twilightuniverse.com */
/* Software licenced under a modified X11 licence,
   see documentation or authors website for more details */

function sack(file) {
	this.xmlhttp = null;

	this.resetData = function() {
		this.method = "POST";
  		this.queryStringSeparator = "?";
		this.argumentSeparator = "&";
		this.URLString = "";
		this.encodeURIString = true;
  		this.execute = false;
  		this.element = null;
		this.elementObj = null;
		this.requestFile = file;
		this.vars = new Object();
		this.responseStatus = new Array(2);
  	};

	this.resetFunctions = function() {
  		this.onLoading = function() { };
  		this.onLoaded = function() { };
  		this.onInteractive = function() { };
  		this.onCompletion = function() { };
  		this.onError = function() { };
		this.onFail = function() { };
	};

	this.reset = function() {
		this.resetFunctions();
		this.resetData();
	};

	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;
			}
		}
	};

	this.setVar = function(name, value){
		this.vars[name] = Array(value, false);
	};

	this.encVar = function(name, value, returnvars) {
		if (true == returnvars) {
			return Array(encodeURIComponent(name), encodeURIComponent(value));
		} else {
			this.vars[encodeURIComponent(name)] = Array(encodeURIComponent(value), true);
		}
	}

	this.processURLString = function(string, encode) {
		encoded = encodeURIComponent(this.argumentSeparator);
		regexp = new RegExp(this.argumentSeparator + "|" + encoded);
		varArray = string.split(regexp);
		for (i = 0; i < varArray.length; i++){
			urlVars = varArray[i].split("=");
			if (true == encode){
				this.encVar(urlVars[0], urlVars[1]);
			} else {
				this.setVar(urlVars[0], urlVars[1]);
			}
		}
	}

	this.createURLString = function(urlstring) {
		if (this.encodeURIString && this.URLString.length) {
			this.processURLString(this.URLString, true);
		}

		if (urlstring) {
			if (this.URLString.length) {
				this.URLString += this.argumentSeparator + urlstring;
			} else {
				this.URLString = urlstring;
			}
		}

		// prevents caching of URLString
		this.setVar("rndval", new Date().getTime());

		urlstringtemp = new Array();
		for (key in this.vars) {
			if (false == this.vars[key][1] && true == this.encodeURIString) {
				encoded = this.encVar(key, this.vars[key][0], true);
				delete this.vars[key];
				this.vars[encoded[0]] = Array(encoded[1], true);
				key = encoded[0];
			}

			urlstringtemp[urlstringtemp.length] = key + "=" + this.vars[key][0];
		}
		if (urlstring){
			this.URLString += this.argumentSeparator + urlstringtemp.join(this.argumentSeparator);
		} else {
			this.URLString += urlstringtemp.join(this.argumentSeparator);
		}
	}

	this.runResponse = function() {
		eval(this.response);
	}

	this.runAJAX = function(urlstring) {
		if (this.failed) {
			this.onFail();
		} else {
			this.createURLString(urlstring);
			if (this.element) {
				this.elementObj = document.getElementById(this.element);
			}
			if (this.xmlhttp) {
				var self = this;
				if (this.method == "GET") {
					totalurlstring = this.requestFile + this.queryStringSeparator + this.URLString;
					this.xmlhttp.open(this.method, totalurlstring, true);
				} else {
					this.xmlhttp.open(this.method, this.requestFile, true);
					try {
						this.xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
					} catch (e) { }
				}

				this.xmlhttp.onreadystatechange = function() {
					switch (self.xmlhttp.readyState) {
						case 1:
							self.onLoading();
							break;
						case 2:
							self.onLoaded();
							break;
						case 3:
							self.onInteractive();
							break;
						case 4:
							self.response = self.xmlhttp.responseText;
							self.responseXML = self.xmlhttp.responseXML;
							self.responseStatus[0] = self.xmlhttp.status;
							self.responseStatus[1] = self.xmlhttp.statusText;

							if (self.execute) {
								self.runResponse();
							}

							if (self.elementObj) {
								elemNodeName = self.elementObj.nodeName;
								elemNodeName.toLowerCase();
								if (elemNodeName == "input"
								|| elemNodeName == "select"
								|| elemNodeName == "option"
								|| elemNodeName == "textarea") {
									self.elementObj.value = self.response;
								} else {
									self.elementObj.innerHTML = self.response;
								}
							}
							if (self.responseStatus[0] == "200") {
								self.onCompletion();
							} else {
								self.onError();
							}

							self.URLString = "";
							break;
					}
				};

				this.xmlhttp.send(this.URLString);
			}
		}
	};

	this.reset();
	this.createAJAX();
}

