/**
 * Esta libreria contienen funciones que manejan el objeto XMLHTTP para el envio mediante ajax 
 * de peticiones al servidor.
 * 
 * Debe tratar los problemas de compatibilidades entre diferentes versiones del navegador.
 *  
 */
var XMLHttpFactories = [
	function () {return new XMLHttpRequest()},
	function () {return new ActiveXObject("Msxml2.XMLHTTP")},
	function () {return new ActiveXObject("Msxml3.XMLHTTP")},
	function () {return new ActiveXObject("Microsoft.XMLHTTP")}
];

libxmlhttp={
/*
 * Array de funciones anonimas que devuelven el objeto XMLHTTP dependiendo del navegador
 * que se utilice.
 * 
 * En el caso de navegadores con motor Gecko se usa el objeto XMLHttpRequest.
 * Para el motor de IE del explorer hay diferentes componentes ActiveX 
 * 
 */

/**
 * Esta funcion crea el objeto XMLHTTP sirviéndose del array XMLHttpFactories.
 * Intenta crear el primer objeto del array. Si este no está disponible
 * intenta el siguiente. Y así hasta encontrar uno que le sirva al navegador del 
 * cliente. Si no lo consigue crear devuelve false. 
 */
createXMLHTTPObject : function () {
	var xmlhttp = false;
	for (var i=0;i<XMLHttpFactories.length;i++)
	{
		try {
			xmlhttp = XMLHttpFactories[i]();
		}
		catch (e) {
			continue;
		}
		break;
	}
	return xmlhttp;
},

/**
 * Envia una peticion asincrona al navegador. Si no consigue crear un objeto XMLHTTP
 * termina la funcion, sin retornar nada. Debera ser tenido en cuenta.
 * 
 * Tiene en cuenta si se envian datos POST, en cuyo caso el metodo sera POST, o no,
 * en cuyo caso el metodo sera GET y los datos adicionales del GET se pasan por la url.
 * 
 * Si el estado de la respuesta es distinto de 4 (éxito) no retorna nada.
 * Si la respuesta HTTP es distinta de 200 o de 304 (caso del navegador opera) hay un error
 * de HTTP y se muestra con un alert (en navegación clásica se muestra en el propio HTML).
 * Si todo va bien llama a la funcion callback que le pasemos para tratar la respuesta.
 * 
 * Finalmente, con la funcion send se realiza la petición 
 * 
 * @param {Object} url
 * @param {Object} callback
 * @param {Object} postData
 */
sendRequest : function (url,callback,postData) {
	var method = (postData) ? "POST" : "GET";
	var req = libxmlhttp.createXMLHTTPObject();
	
	if (!req) return;
	
	// Cualquier error en el objeto se trata con un try..catch. En firefox hay ocasiones en las que
	// las propiedades readyState y status pueden no estar definidas.
	
	try {
		// Inicializaciones del request
		req.open(method,url,true); // Establece el metodo y pasa la url completa. 
		req.setRequestHeader('User-Agent','XMLHTTP/1.0'); // El agente de usuario es XMLHTTP
		if (postData)
			req.setRequestHeader('Content-type','application/x-www-form-urlencoded');
			
		// Funcion listener del evento onreadystatechange
		req.onreadystatechange = function () { 
			if (req.readyState == 4) 
			{
				if ( (req.status == 200) || (req.status == 304) ) 
				{
					callback(req);
				}
			}
		}
		
		// Si es la respuest valida no hace falta enviar nada.
		if (req.readyState == 4) return;
		req.send(postData);
	}
	catch(e)
	{
		return; // nada.
	}
 }
};


