/**
 * Cette classe repr�sente les donn�es d'une r�ponse Ajax.
 */
function ReponseAjax() {
	this.ok = false;	// true si la r�ponse a un statut OK
	this.error = false;	// true si la r�ponse a un statut ERR
	this.info = false;	// true si la r�ponse a un statut MSG
	this.msg;			// message (pr�sence possible quelque soit le statut)
	this.msgCode;		// code du message
	this.html = new Array();	// liste des div � mettre � jour
}

// m�thodes de la classe ReponseAjax
ReponseAjax.prototype.isOK = function () { return this.ok; }
ReponseAjax.prototype.setOK = function (_ok) { this.ok = _ok; }
ReponseAjax.prototype.isError = function () { return this.error; }
ReponseAjax.prototype.setError = function (_error) { this.error = _error; }
ReponseAjax.prototype.isInfo = function () { return this.info; }
ReponseAjax.prototype.setInfo = function (_info) { this.info = _info; }
ReponseAjax.prototype.getMesasgeCode = function () { return this.msgCode; }
ReponseAjax.prototype.setMessageCode = function (_code) { this.msgCode = _code; }
ReponseAjax.prototype.getMessage = function () { return this.msg; }
ReponseAjax.prototype.setMessage = function (_msg) { this.msg = _msg; }
ReponseAjax.prototype.getHTML = function () { return this.html; }
ReponseAjax.prototype.setHTML = function (_html) { this.html = _html; }
ReponseAjax.prototype.addHTML = function (_html) { this.html.push(_html); }

/**
 * Fonction d�codant la r�ponse faite � une requ�te Ajax 
 * pour une mise � jour directe en HTML.
 * 
 * La structure xml d�cod�e est la suivante :
 * <response>
 * <result>OK ou ERR ou MSG</result>
 * <msg code="">message (facultatif pour OK, obligatoire pour ERR et MSG)</msg>
 * <htmlplaceholder>Code HTML</htmlplaceholder>
 * </response>
 * @param originalRequest Requ�te Ajax (XMLHttpRequest]
 * @return Reponse (classe ReponseAjax) contenant le statut (ok, message, erreur) et 
 * le texte des divs (propri�t�s getHTML)
 */
 function chkReponseAjax(originalRequest){
 	
 	var msg;
	var root = originalRequest.responseXML.documentElement;
	var Nresultat = root.getElementsByTagName('result');
	var isOK = Nresultat[0].firstChild.nodeValue;
	var Nmsg = root.getElementsByTagName('msg');

	var reponse = new ReponseAjax();

	if (Nmsg && Nmsg.length==1) {
		msg = Nmsg[0].firstChild;
		reponse.setMessage(msg.nodeValue);
	}
		
	if(isOK == 'OK'){
		reponse.setOK(true);
				
		var Nplaceholder = root.getElementsByTagName('htmlplaceholder');
		if ( Nplaceholder ) {
			for(var i=0; i<Nplaceholder.length; i++) {
				reponse.addHTML(Nplaceholder[i].firstChild.nodeValue);
			}			
		}
	}else if(isOK=='ERR' || isOK=='MSG'){
		if(isOK=='ERR') {
			reponse.setError(true); 
		}else {
			reponse.setInfo(true);			
		}
		
		if (Nmsg && Nmsg.length==1) {
			alert(reponse.getMessage());			
		}
	}else {
		reponse.setError(true);
		msg = "Erreur PHP :" + (((originalRequest.responseText).replace(/<br \/>/g,"\n")).replace(/<b>/g,"")).replace(/<\/b>/g,"");
		reponse.setMessage(msg);
		alert(msg);
	}

 	return reponse; 	
 }

/**
 * Cette fonction permet la mise � jour d'un div html directement par Ajax.
 * 
 * @param url Adresse de la page serveur � ex�cuter.
 * @param formName Nom du formulaire (facultatif).
 * @param placeholder Nom de l'id du div.
 */
function getHTML(url, formName, placeholder) {
	var pars="";
	
	if (formName) {
		pars = serialiser(document.forms[formName]);
// 		La s�rialisation de Prototype (code ci-dessous) ne renvoie pas
// 		de valeur pour les �l�ments 'disabled' ce qui pose des probl�mes
//		lors des contr�les des donn�es obligatoires.
//		pars = Form.serialize(document.forms[formName]);
	}
	
	var myAjax = new Ajax.Updater(
					{success: placeholder}, 
					url, 
					{method: 'post', 
					parameters: pars, 
					onFailure: reportError,										 
					onLoading : loading,
					onLoaded : loaded
					});	
}

/**
 * Cette fonction permet l'ex�cution d'une requ�te Ajax.
 * 
 * @param url Adresse de la page serveur � ex�cuter.
 * @param formName Nom du formulaire (facultatif). Les champs du formulaire sont 
 *                 pass�s en param�tres � la requ�te.
 * @param onCompleteFunction Nom de la fonction js appel�e sur l'�v�nement onComplete.
 */
function sendAjaxRequest(url, formName, onCompleteFunction) {
	var pars="";

	if(!onCompleteFunction) onCompleteFunction="showResponse";

	if (formName) {
		pars = serialiser(document.forms[formName]);
// 		La s�rialisation de Prototype (code ci-dessous) ne renvoie pas
// 		de valeur pour les �l�ments 'disabled' ce qui pose des probl�mes
//		lors des contr�les des donn�es obligatoires.
//		pars = Form.serialize(document.forms[formName]);
	}
	
	var myAjax = new Ajax.Request(url, { method: 'post',  
										 parameters: pars, 
										 onFailure: reportError,
										 onLoading : loading,
										 onLoaded : loaded,
										 onComplete: eval(onCompleteFunction)
										}); 
}


/**
 * Cette fonction permet l'ex�cution d'une requ�te Ajax.
 * 
 * @param url Adresse de la page serveur � ex�cuter.
 * @param formName tableau de formulaires (facultatif). Les champs du formulaire sont 
 *                 pass�s en param�tres � la requ�te.
 * @param onCompleteFunction Nom de la fonction js appel�e sur l'�v�nement onComplete.
 */
function sendAjaxRequestForms(url, formArray, onCompleteFunction) {
	var pars="";
	if(!onCompleteFunction) onCompleteFunction="showResponse";

	if(formArray) {
		for(var i=0; i < formArray.length; i++){
			pars += serialiser(document.forms[formArray[i]])+"&";
		}
	}else{
		for(var i=0; i < document.forms.length; i++){
			pars += serialiser(document.forms[i]);
		}
		
	}
	var myAjax = new Ajax.Request(url, { method: 'post',  
										 parameters: pars, 
										 onFailure: reportError,
										 onLoading : loading,
										 onLoaded : loaded,
										 onComplete: eval(onCompleteFunction)
										}); 
	
	
}

function reportError(request){
	if ( $('attente') ) {
		$('attente').style.display='none';
	}

	alert(request.responseText);
}

function loading(){
	if ( $('attente') ) {
		$('attente').style.display='block';
	}
}

function loaded(){
	// Positionnement d'un timeout de 100ms pour �viter, sous Opera, un probl�me
	// de double appel de la fonction loaded().
	window.setTimeout('closeLoading()', 100);
}

function closeLoading(){
	if ($('attente')) {
		$('attente').style.display='none';
	}
}


function showResponse(reponse){
	chkReponseAjax(reponse);
}

/**
 * S�rialise les donn�es d'un formulaire.
 * 
 * @param form Formulaire � traiter
 * @return Renvoie les donn�es du formulaire au format cle1=valeur1&cle2=valeur2...
 */
function serialiser(form){
	var val="";

	for (i=0;i<form.elements.length;i++){
		//lla - 2006-11-23 - ajout - si c'est un Radio Bouton, alors, il ne faut le mettre dans les donn?es du formulaire que si il est coch�
		//donc, s'il n'est pas coch�, on l'ignore, on passe � la donn�es suivante du formulaire
		//===================================
		//si c'est un bouton Radio ou un checkbox
		if(form.elements[i].type == "radio" || form.elements[i].type == "checkbox"){
			//si pas coch�, on l'ignore et on passe au suivant
			if(! form.elements[i].checked) continue;
		}
				
		if (val!="") lien="&";
		else lien="";

		name=form.elements[i].name;
		value=encodeURIComponent(form.elements[i].value);
		val=val+lien+name+"="+value;
	}
	
	return val;
}

function reponseAjaxSimple(reponse){
	var retour = reponse.responseText;
	var tab = retour.split('|');
	
	if (tab[0] == 'ERROR'){
		$('message_text').className = 'erreur';
		$('message_text').innerHTML = tab[1];
		ouvrirMessage();
	
	}else if (tab[0] == 'SUCCESS'){
		if (tab[1].length > 0){
			$('message_text').className = 'succes';
			$('message_text').innerHTML = tab[1];
			ouvrirMessage();
			
		}else{
			$('message_text').className = '';
			$('message_text').innerHTML = '';
		}
	
	}else if (tab[0] == 'DATA'){		
		
		$('message_text').className = '';
		$('message_text').innerHTML = '';
		
		for (x = 1 ; x < tab.length ; x += 2){
			if (tab[x].length > 0 && $(tab[x]) && tab[x] != 'EXECFCT' && tab[x] != 'FORWARD'){
				$(tab[x]).value = tab[x+1];
			}
		}
	
	}else if (tab[0] == 'DATAHTML'){
		
		if (tab[2] == ''){
			$('message_text').className = '';
			$('message_text').innerHTML = '';
		}
		
		for (x = 1 ; x < tab.length ; x += 2){
			if (tab[x].length > 0 && $(tab[x]) && tab[x] != 'EXECFCT' && tab[x] != 'FORWARD'){
				$(tab[x]).innerHTML = tab[x+1];
			}
		}
	
	}else if (tab[0] == 'VIEW'){
		if ($(tab[1])){
			$(tab[1]).innerHTML = tab[2];
		}
		
	}else{
		$('message_text').className = 'erreur';
		$('message_text').innerHTML = 'Erreur de format du paquet AJAX : ' + retour;
		ouvrirMessage();
	}
	
	
	// V�rifie si une fonction JS a �t� demand�e en guise de retour
	// Les redirections sont ajout�es automatiquement en fin de paquet comme ceci :
	// |EXECFCT|page demand�e|
	if (tab.length >= 3){
		if (tab[tab.length-3] == 'EXECFCT'){
			eval(tab[tab.length-2]);		
		}
	}
	
	if (tab.length >= 3){
		if (tab[tab.length-3] == 'FORWARD'){
			document.location.href = tab[tab.length-2];		
		}
	}
}

