/**
 * Ajax class
 *
 * @author Eric Jeker - Virtua SA <eric.jeker@virtua.ch>
 * @copyright Copyright ? Virtua web solutions
 * @name: $Source: /vhosts/virtua_website/www/public/common/js/ajax/ajax.js,v $
 * @version $Revision: 1.1 $ $Date: 2006/10/20 14:41:03 $ $Author: eric $
 *
 * Required :
 * - logs.js
 * - tools.js
 *
**/

var Ajax = {
	xhReq : null,
	
	/**
	 * Constructeur, initialise le requ?teur Ajax
	**/
	initialize : function ()	{
		if (window.XMLHttpRequest)	{
			Ajax.xhReq = new XMLHttpRequest();
		   
			// Evite un Bug du navigateur Safari :
			if (Ajax.xhReq.overrideMimeType)	{
				Ajax.xhReq.overrideMimeType("text/xml") ;
			}
		}
		else if (window.ActiveXObject)	{
			try {
				Ajax.xhReq = new ActiveXObject("Msxml2.XMLHTTP");
			} catch (e)	{
				try {
		       		Ajax.xhReq = new ActiveXObject("Microsoft.XMLHTTP");
				} catch (e){}
			}
		}	
	},
	
	/**
	 * R?cup?ration des requ?tes par d?faut
	**/
	onreadystatechange : function ()	{
		/**
			0 Uninitialized
			    The initial value.
			1 Open
			    The open() method has been successfully called.
			2 Sent
			    The UA successfully completed the request, but 
			    no data has yet been received.
			3 Receiving
			    Immediately before receiving the message body (if any). 
			    All HTTP headers have been received.
			4 Loaded
			    The data transfer has been completed.
		**/
		
		if (Ajax.xhReq.readyState != 4)	{
			return ;
		}
		
		Logs.addLine(Ajax.xhReq.responseText) ;
	},
	
	/**
	 * Envoi une requ?te selon les param?tres pass?s :
	 * - method 	post/get (case sensitive !)
	 * - action 	destination de la requ?te
	 * - data 		param?tre de la requ?tes, format "param1=value1&param2=value2"
	 * - async 		true/false, requ?te asynchrone ou pas
	 * - listener 	le listener qui traitera la r?ponse, fonction
	**/
	send_request : function (method, action, data, async, listener)	{
		Logs.addLine('Ajax > Request (' + method + ', ' + action + ', ' + data + ')') ; 					

		if (method == "get")	{
			action += '?' + data ;
		}
		
		Logs.addLine('Ajax > Opening request pipe') ;
		
		Ajax.xhReq.open(method, action, async) ;
		
		if (listener)	{
			Logs.addLine('Ajax > Setting up response listener') ;
			Ajax.xhReq.onreadystatechange = listener ;
		}
		
		if (method == "post")	{
			Logs.addLine('Ajax > Changing content-type => application/x-www-form-urlencoded; charset=iso-8859-1') ;
			Ajax.xhReq.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=iso-8859-1"); 
		}

	 	Logs.addLine('Ajax > Sending request') ;
		Ajax.xhReq.send(data) ;
	},

	/**
	 * G?re le submit d'un formulaire et passe une requ?te 
	 * Ajax avec ses param?tres.
	 * 
	 * Cette fonction peut ?tre appel?e dans le onSubmit() d'un
	 * <form> suivi d'un "return false;" pour ?viter que le <form>
	 * n'envoi sa propre requ?te.
	 * 
	 * obj			l'objet formulaire (this dans <form>)
	 * listener		la fonction qui r?cup?rera la r?ponse Ajax
	**/
	form_submit : function (obj, listener)	{
		var method 	= String(obj.method).toLowerCase() ;
		var action	= obj.action ;
		var data 	= Ajax.get_form_content(obj) ;
		var async	= true ;
		
		Ajax.send_request(method, action, data, async, listener) ;
		
		// Si la requ?te n'est pas asynchrone on laisse le formulaire continuer
		return false ;
	},
	
	/**
	 * R?cup?re les param?tres contenus dans un formulaire HTML
	 * et construit le string de param?tre n?cessaire ? la requ?te Ajax.
	**/
	get_form_content : function (form)	{
		Logs.addLine('Ajax > Getting form content') ;
		if (!form.hasChildNodes())	{
			Logs.addLine('Ajax > Form has no child node') ;
			return null ;
		}
		
		var content = '' ;
		var node = form.firstChild ;
		
		// On boucle sur tous les ?l?ments du formulaire
		content = Ajax._get_form_content(node) ;
			
		// On supprime le premier & du string
		if (content != '')	{
			content = content.substr(1) ;
		}
		
		Logs.addLine('Ajax > Parameters string : ' + content) ;
		return content ;
	},

	_get_form_content : function (node)	{
		var content = '' ;
		
		while (node != null)	{
			if (node.hasChildNodes())	{
				Logs.addLine('Ajax > Getting child node') ;
				content += Ajax._get_form_content(node.firstChild) ;
			}
			
			// Si on se trouve sur une balise
			if (node.nodeType == 1)	{
				Logs.addLine('Ajax > Node : ' + node.nodeName + ', ' + node.nodeType) ;
				var inputName = node.nodeName.toLowerCase() ;
				
				// On va regarder le nom de la balise
				if (inputName == 'input')	{
					// <input type="text|password|checkbox|radio|hidden" name="">
					var inputType = node.getAttribute('type').toLowerCase()
					
					// La balise input peut ?tre de plusieurs types
					if (inputType == 'text' || inputType == 'password' || inputType == 'hidden')	{
						Logs.addLine('Ajax > Adding parameter [' + inputType + '] : ' + node.getAttribute('name')) ;
						content += '&' + node.getAttribute('name') + '=' + node.value ;
					} else if ((inputType == 'checkbox' || inputType == 'radio') && node.checked)	{
						// Si la case ? cocher ou le bouton radio est s?lectionn?, on l'ajoute
						Logs.addLine('Ajax > Adding parameter [' + inputType + '] : ' + node.getAttribute('name')) ;
						content += '&' + node.getAttribute('name') + '=' + node.value ;
					}
					
					/* UPLOAD DE FICHIER PAS ENCORE IMPLEMENTE
					 else if (inputType == 'file')	{
						Logs.addLine('Ajax > Adding parameter [' + inputType + '] : ' + node.getAttribute('name')) ;
						content += '&' + node.getAttribute('name') + '=' + node.value ;
					}
					*/
				} else if (inputName == 'select')	{
					// <select name="">
					// On r?cup?re l'?l?ment s?lectionn?
					Logs.addLine('Ajax > Adding parameter [select] : ' + node.getAttribute('name')) ;
					content += '&' + node.getAttribute('name') + '=' + node.value ;
				} else if (inputName == 'textarea')	{
					// <textarea name="">value</textarea>
					Logs.addLine('Ajax > Adding parameter [textarea] : ' + node.getAttribute('name')) ;
					content += '&' + node.getAttribute('name') + '=' + node.value ;
				}
			}
			
			node = node.nextSibling
		}
		
		return content ;
	}
}

Ajax.initialize() ;