// Renvoie la liste de tous les champs du formulaire avec leur valeur
function getAjaxFormParams(thisForm) {
	var input;
	var params = '';
	if (thisForm) {
		for (var i = 0; i < thisForm.getElementsByTagName('input').length; i ++) {
			input = thisForm.getElementsByTagName('input')[i];
			if (input.type == 'text' 
					|| input.type == 'hidden'
					|| input.type == 'file'
					|| input.type == 'password'
					|| input.type == 'checkbox' && input.checked
					|| input.type == 'radio' && input.checked) {
				if (input.name != '') {
					if (params != '') {
						params += '&';
					}
					params += input.name + '=' + escapeChar(input.value);
					/*if (input.name.indexOf('piel_id') >= 0) {
						alert(params);
					}*/
				}
			}
		}
		for (var i = 0; i < thisForm.getElementsByTagName('select').length; i ++) {
			input = thisForm.getElementsByTagName('select')[i];
			if (input.name != '') {
				if (params != '') {
					params += '&';
				}
				if (input.selectedIndex >= 0) {
					params += input.name + '=' + escapeChar(input.options[input.selectedIndex].value);
				} else {
					params += input.name + '=0';
				}
			}
		}
		for (var i = 0; i < thisForm.getElementsByTagName('textarea').length; i ++) {
			input = thisForm.getElementsByTagName('textarea')[i];
			if (input.name != '') {
				if (params != '') {
					params += '&';
				}
				//params += input.name + '=' + input.options[input.selectedIndex].value;
				params += input.name + '=' + escapeChar(input.value);
			}
		}
	}

	//alert(params);
	return params;
}

/**
 * Crée et envoie la requête HTTP au serveur
 * Paramètres:
 * 	- (String) uri : fichier PHP visé
 *		- (String) post_data : la chaîne de requête en POST
 *		- (Ref) callbackFunction : référence de la function qui va réaliser les traitements spécifiques
 *											avant, pendant et après réception des données
 *		- (String) elmt : nom de l'élément visé par le traitement de la function callbackFunction
 */
function AJAXRequest(uri, post_data, callbackFunction, loadedElement)
{
	var xhr = false; //Futur objet XMLHttpRequest
	post_data = ajaxGetLabIdCourant(post_data);
	
	// Instanciation d'un objet XMLHttpRequest
	if(window.XMLHttpRequest) { // Mozilla, Safari, ... les vrais navigateurs
		xhr = new XMLHttpRequest();
		//Force le type MIME pour l'envoi
		if(xhr.overrideMimeType) {
			xhr.overrideMimeType('text/xml');
			// un appel de fonction supplémentaire pour écraser l'en-tête envoyé par le serveur,
			// juste au cas où il ne s'agit pas de text/xml, pour certaines versions de navigateurs Mozilla.
		}
	}
	else {
		if(window.ActiveXObject) { // IE
		 	try {
				xhr = new ActiveXObject("Msxml2.XMLHTTP");
	    	}
	    	catch (e) {
	        	try {
	        		xhr = new ActiveXObject("Microsoft.XMLHTTP");
	        	}
	        	catch (e) { alert(e.description); }
	    	}
		}
	}

	if(!xhr) {
	    alert('Abandon : Impossible de créer une instance XMLHTTP.');
	    return false;
	}

	// Affectation d'une fonction qui traitera les données retournées par le serveur
	xhr.onreadystatechange = function() {
		if(loadedElement === undefined || loadedElement === null){
			if(callbackFunction != undefined){
				callbackFunction(xhr);
			}
		} else {
			if(callbackFunction != undefined){
				callbackFunction(xhr, loadedElement);
			}
		}
	};

	// Envoi des variables à l'url
	xhr.open("POST", uri, true);
	xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	//alert(uri + ' - ' + post_data);
	xhr.send(post_data);

	/*
	Statut possibles à lé réception
	UNSENT = 0;
	OPENED = 1;
	HEADERS_RECEIVED = 2;
	LOADING = 3;
	DONE = 4;
	*/
}

function ajaxGetLabIdCourant(post_data){
	if($('menu_laboratoire')){
		if(post_data != ''){
			if(post_data.indexOf('labIdCourant',0) < 0){
				post_data = post_data + '&labIdCourant=' + $('menu_laboratoire').value;
			}
		} else {
			post_data = 'labIdCourant=' + $('menu_laboratoire').value;
		}
	}
	return post_data;
}

//Cette fonction retourne la valeur du champ 'field' dans le flux passé en paramètre
function getXhrValue(xhr, field){
	var retour = '';
	//Fonction récupérant le flux généré par la requête ajax
	if (xhr.readyState == 4) {// Réception des données
		if (xhr.status == 200) {// Statut OK HTTP 200
			var doc = xhr.responseXML;
			if (window.ActiveXObject) {
				//On utilise ie
				var xmlDoc = new ActiveXObject("Msxml2.DOMDocument.3.0" );
				var root;
				var newElem;
				xmlDoc.async = false;
				xmlDoc.loadXML(xhr.responseText);

				//Traitement du flux XML
				if(trim(xmlDoc.getElementsByTagName("valide")[0].childNodes[0].nodeValue) == 1){
					try{
						retour = trim(xmlDoc.getElementsByTagName(field)[0].childNodes[0].nodeValue);
					}
					catch(err){
						//alert(err.description);
					}
				}
			} else {
				//On utilise un autre navigateur
				
				//Traitement du flux XML
				if(trim(doc.getElementsByTagName("valide").item(0).firstChild.data) == 1) {
					try{
						retour = trim(doc.getElementsByTagName(field).item(0).firstChild.data);
					}
					catch(err){
						//alert(err.description);
					}
				}
			}
		}
	}
	return retour;
}

//Cette fonction retourne le code html du flux passé en paramètre
function getXhrValueHTML(xhr, field){
	var retour = '';
	//Fonction récupérant le flux généré par la requête ajax
	if (xhr.readyState == 4) {// Réception des données
		if (xhr.status == 200) {// Statut OK HTTP 200
			var doc = xhr.responseText;
			retour = doc;
		}
	}
	return retour;
}

//Cette fonction retourne la liste des valeurs des éléments du champ 'field'
//dans le flux passé en paramètre
function getXhrList(xhr, valueField, textField, htmlListId){
	//Fonction récupérant le flux généré par la requête ajax
	if (xhr.readyState == 4) {// Réception des données
		if (xhr.status == 200) {// Statut OK HTTP 200
			var doc = xhr.responseXML;
			if (window.ActiveXObject) {
				//On utilise ie
				var xmlDoc = new ActiveXObject("Msxml2.DOMDocument.3.0" );
				var root;
				var newElem;
				xmlDoc.async = false;
				xmlDoc.loadXML(xhr.responseText);

				//Traitement du flux XML
				if(trim(xmlDoc.getElementsByTagName("valide")[0].childNodes[0].nodeValue) == 1){
					try{
						$(htmlListId).options.length=0;
						var i = 0;
						while(xmlDoc.getElementsByTagName(valueField)[i]){
							$(htmlListId).options[i+1] = new Option(xmlDoc.getElementsByTagName(textField)[i].childNodes[0].nodeValue, xmlDoc.getElementsByTagName(valueField)[i].childNodes[0].nodeValue);
							i++;
						}
					}
					catch(err){/*alert(err.description);*/}
				}
			} else {
				//On utilise un autre navigateur
				
				//Traitement du flux XML
				if(trim(doc.getElementsByTagName("valide").item(0).firstChild.data) == 1) {
					try{
						//retour = trim(doc.getElementsByTagName(field).item(0).firstChild.data);
						$(htmlListId).options.length=0;
						var i = 0;
						while(doc.getElementsByTagName(valueField).item(i)){
							var element = doc.getElementsByTagName(textField).item(i);
							var elementValue = doc.getElementsByTagName(valueField).item(i);
							$(htmlListId).options[i+1] = new Option(element.firstChild.data, elementValue.firstChild.data);
							i++;
						}
					}
					catch(err){/*alert(err.description);*/}
				}
			}
		}
	}
	return true;
}

//Cette fonction retourne un tableau des éléments du champ 'field'
//dans le flux passé en paramètre
function getXhrListXML(xhr, field, listXhr){
	//Fonction récupérant le flux généré par la requête ajax
	if (xhr.readyState == 4) {// Réception des données
		if (xhr.status == 200) {// Statut OK HTTP 200
			var doc = xhr.responseXML;
			if (window.ActiveXObject) {
				//On utilise ie
				var xmlDoc = new ActiveXObject("Msxml2.DOMDocument.3.0" );
				var root;
				var newElem;
				xmlDoc.async = false;
				xmlDoc.loadXML(xhr.responseText);

				//Traitement du flux XML
				if(trim(xmlDoc.getElementsByTagName("valide")[0].childNodes[0].nodeValue) == 1){
					try{
						//listXhr.length=0;
						var i = 0;
						//var xmlNodes = xmlDoc.getElementsByTagName(field);
						//for(xmlNode in xmlNodes) {
						//	alert(xmlNode.attributes.getNamedItem("firstname"));
						//}
						while(xmlDoc.getElementsByTagName(field)[0].childNodes[i]){
							listXhr[i] = xmlDoc.getElementsByTagName(field)[0].childNodes[i];
							i++;
						}
					}
					catch(err){alert("Err:" + err.description);}
				}
			} else {
				//On utilise un autre navigateur
				var parser = new DOMParser ();
				
                xmlDoc = parser.parseFromString (xhr.responseText, "text/xml");
				//xmlDoc = xhr.responseXML;
				
				//Traitement du flux XML
//				if(trim(doc.getElementsByTagName("valide").item(0).firstChild.data) == 1) {
//					try{
//						//retour = trim(doc.getElementsByTagName(field).item(0).firstChild.data);
//						//listXhr.length=0;
//						var i = 0;
//						while(doc.getElementsByTagName(field).item(i)){
//							//var element = doc.getElementsByTagName(field).item(i);
//							//listXhr[i] = element.firstChild.data;
//							listXhr[i] = doc.getElementsByTagName(field).item(i);
//							i++;
//						}
//					}
//					catch(err){/*alert(err.description);*/}
//				}
				if(trim(xmlDoc.getElementsByTagName("valide")[0].childNodes[0].nodeValue) == 1){
					try{
						
						//listXhr.length=0;
						var i = 0;
						var cpt = 0;
						//var xmlNodes = xmlDoc.getElementsByTagName(field);
						while(xmlDoc.getElementsByTagName(field)[0].childNodes[i]){
							if (xmlDoc.getElementsByTagName(field)[0].childNodes[i].nodeType == 1) {
								listXhr[cpt] = xmlDoc.getElementsByTagName(field)[0].childNodes[i];
								cpt++;
							}
							i++;
						}
					}
					catch(err){alert("Err:" + err.description);}
				}
			}
		}
	}
}

//Cette fonction retourne la valeur du champ 'field' dans le flux passé en paramètre
function getXMLValue(xml, field){
	var retour = '';
	var doc = xml;
	if (window.ActiveXObject) {
		//On utilise ie
		var xmlDoc = new ActiveXObject("Msxml2.DOMDocument.3.0" );
		var root;
		var newElem;
		xmlDoc.async = false;
		xmlDoc = xml;

		//Traitement du flux XML
		if(trim(xmlDoc.getElementsByTagName("valide")[0].childNodes[0].nodeValue) == 1){
			try{
				retour = trim(xmlDoc.getElementsByTagName(field)[0].childNodes[0].nodeValue);
			}
			catch(err){
				alert(err.description);
			}
		}
	} else {
		//On utilise un autre navigateur
		var parser = new DOMParser();
		var xmlDoc = xml
		//Traitement du flux XML
		//if(trim(xmlDoc.getElementsByTagName("valide").item(0).firstChild.data) == 1) {
		if(trim(xmlDoc.getElementsByTagName("valide")[0].childNodes[0].nodeValue) == 1){
			try{
				//retour = trim(xmlDoc.getElementsByTagName(field).item(0).firstChild.data);
				retour = trim(xmlDoc.getElementsByTagName(field)[0].childNodes[0].nodeValue);
			}
			catch(err){
				alert(err.description);
			}
		}
	}
	
	return retour;
}



function escapeChar(text) {
	var textTmp = text;
	textTmp = textTmp.replace(/&/g, '%26');
	textTmp = textTmp.replace(/\+/g, '%2B');
	textTmp = textTmp.replace(/=/g, '%3D');
	textTmp = textTmp.replace(/ /g, '%20');
	textTmp = textTmp.replace(/;/g, '%3B');
	textTmp = textTmp.replace(/\\/g, '%5C');
	return textTmp;
}
