// JavaScript Document
/*
*	Nombre: Ajax.js
*	Descripción: Funciones para el Manejo de peticiones HTTP a través de AJAX
*	Autor: Diego Alejandro Ruiz Tabares
*	E-mail: diegoale@gmail.com
*	Fecha de Creación: 26-04-2006
*	Fecha de Última Modificación: 22-05-2006
*/

/*	*********************************************	EJEMPLO DE USO	**************************************************************	*/

/*
*	- Se debe definir una funcion Javascript con un sólo parámetro, para manipular la respuesta de la Petición. Por ejemplo, se define la función
*	  miFuncionParaProcesarRespuesta encargada de imprimir la respuesta de la petición dentro de una etiqueta <DIV>.	
*	- Se debe realizar el llamado a la función realizarPeticionHttp y pasarle como parámetro el nombre de la función que manipula la 
*	  respuesta de la Petición, además de los demás parámetros que deben pasarse. Por ejemplo, se define una función llamada hacerPeticion
*	  que hará el respectivo llamado a realizarPeticionHttp cuyo parámetro final debe ser el nombre de la función que se acaba de definir.
*	- Ver ejemplo más abajo
*/


/*	*********************************************	CREAR OBJETO AJAX	**********************************************************	*/

/*
*	Utilidad:
*		Crea el Objeto que manejará asíncronamente la petición HTTP
*	Parámetros de entrada:
*	Valores de retorno: 
*		Un objeto ActiveXObject, si el navegador es Internet Explorer
*		Un objeto XMLHttpRequest, si el navegador es diferente de Internet Explorer
*		false, en caso de que no se pueda crear el objeto
*/

function crearObjetoAjax()
{
	var objeto_ajax; //Objeto Ajax
	try
	{
		objeto_ajax = new ActiveXObject("Msxml2.XMLHTTP"); //Para Internet Explorer
	}
	catch(excepcion)
	{
		try
		{
			objeto_ajax = new ActiveXObject("Microsoft.XMLHTTP"); //Para Internet Explorer
		}
		catch(excepcion)
		{
			objeto_ajax = false;
		}
	}
	if (!objeto_ajax && typeof XMLHttpRequest!='undefined') 
	{
		objeto_ajax = new XMLHttpRequest(); //Otros navegadores diferentes de Internet Explorer
	}
	return objeto_ajax;
}

/*	****************************************************	REALIZAR PETICIÓN HTTP	***********************************************************	*/

/*
*	Utilidad:
*		Realiza la Petición HTTP asíncrona al Servidor
*	Parámetros de entrada: 
*		metodo_peticion -> El método por el que se desea realizar la petición (GET o POST)
*		objetivo_peticion -> La página o el script al cual va dirigido la petición
*		tipo_respuesta -> El tipo en el que se desea que se retornen los datos desde el Servidor (TEXTO o XML)
*		datos_post -> Los datos que se desean enviar si se realiza una petición POST. Estos datos deben ir encapsulados dentro de un
*		              String de la forma "dato1=valor1&dato2=valor2&...&daton=valorn". Si metodo_peticion no es POST, el valor de
*		              datos_post debe ser el String vacío ""
*		funcion_procesar_respuesta -> Función previamente definida utilizada para procesar la respuesta de la petición 
*	Valores de retorno:
*		true, en caso de que se haya hecho la petición HTTP asíncrona
*		false, si no se pudo crear el objeto AJAX que realiza la petición
*/

function realizarPeticionHttp(metodo_peticion, objetivo_peticion, tipo_respuesta, datos_post, funcion_para_procesar_respuesta)
{
	var objeto_ajax = crearObjetoAjax(); //Objeto para la conexión asíncrona al Servidor
	var respuesta_peticion; //Respuesta de la Petición
	
	if(objeto_ajax)
	{
		objeto_ajax.open(metodo_peticion, objetivo_peticion, true);
		if(metodo_peticion == "GET")
		{
			objeto_ajax.send(null);
		}
		else
		{ 
			if(metodo_peticion == "POST" && datos_post != "")
			{
				objeto_ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
				objeto_ajax.send(datos_post);
			}
		}
		objeto_ajax.onreadystatechange = function()
		{
			if(objeto_ajax.readyState == 4)
			{
				if(objeto_ajax.status == 200) //El objetivo de la Petición se encontró
				{
					switch(tipo_respuesta)
					{
						case "TEXTO":
							respuesta_peticion = objeto_ajax.responseText;
							break;
						case "XML":
							respuesta_peticion = objeto_ajax.responseXML;
							break;
					}
				}
				else //El objetivo de la Petición no pudo ser encontrado
				{
					respuesta_peticion = -100;
				}
			}
			else
			{
				respuesta_peticion = "Loading...";
			}
			funcion_para_procesar_respuesta(respuesta_peticion);
		} //Fin función onreadystatechange
		return true;
	}
	else
	{
		return false;
	}	
}
