/** Objeto XMLHttpRequest */
var ajax_req;

/** Texto de respuesta del XMLHttpRequest */
var ajax_result = '';

/** Listener de la respuesta XMLHttpRequest (ajax_result) */
var ajax_external = '';

/** Indica si actualmente se está esperando por una repuesta XMLHttpRequest */
var ajax_reading = false;

/**
 * Ejecuta un script PHP mediante Ajax.
 *
 * @param url: Path hacia el script a invocar.
 * @param external: Referencia a listener que recibe el resultado retornado por el script.
 * @param method: Método de envío de parámetros ('GET' por defecto).
 * @param params: Array parámetros.
 *                Cada parámetro es un objeto con las siguientes propiedades:
 *                - name: Nombre del parámetro.
 *                - value: Valor del parámetro.
 */
function LoadURL(url, external, method, params)
{
   if (!ajax_reading)
   {
      if (!method) method = 'GET';
      if (!params) params = new Array();

   	ajax_external = external;
   	ajax_reading = true;
   	ajax_result = '';

   	var d = new Date()
   	var uID = '' + d.getDate()+d.getMonth()+1+d.getFullYear()+d.getHours()+d.getMinutes()+d.getSeconds()+Math.random();

   	url += ((url.indexOf('?') > 0) ? '&' : '?') + 'ajaxID=' + uID;
   	loadXMLDoc(url, method, params);
   }
   //else alert('Ajax is Busy');
}

/**
 * FUNCION INTERNA!
 * Realiza a través del XMLHttpRequest la solicitud ajax de la url especificada.
 * @param url: Path hacia el script a invocar.
 * @param method: Método de envío de parámetros ('GET' por defecto).
 * @param params: Array parámetros.
 *                Cada parámetro es un objeto con las siguientes propiedades:
 *                - name: Nombre del parámetro.
 *                - value: Valor del parámetro.
 */
function loadXMLDoc(url, method, params)
{
   if (!method) method = 'GET';
   if (!params) params = new Array();

   // branch for native XMLHttpRequest object
   if (window.XMLHttpRequest)
   {
      ajax_req = new XMLHttpRequest();
      ajax_req.onreadystatechange = processReqChange;
      ajax_req.open(method, url, true);
      if (method == 'POST')
         ajax_req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
      else
         ajax_req.setRequestHeader("Referer", window.location);
      ajax_req.send(getSendParams(params));
   }
   // branch for IE/Windows ActiveX version
   else if (window.ActiveXObject)
   {
      ajax_req = new ActiveXObject("Microsoft.XMLHTTP");
      if (ajax_req)
      {
         ajax_req.onreadystatechange = processReqChange;
         ajax_req.open(method, url, true);
         if (method == 'POST')
            ajax_req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
         ajax_req.send(getSendParams(params));
      }
      else
      {
         ajax_result = 'ERROR: XMLHttp object creation fail!';
         if (ajax_external) eval(ajax_external+'(ajax_result)');
      	ajax_reading = false;
      }
   }
}

/**
 * FUNCION INTERNA!
 * Listener de la solicitud enviada por XMLHttpRequest.
 * Si se completó la solicitud, se invoca a 'ajax_external' con parámetro 'ajax_result'.
 */
function processReqChange()
{
   try
   {
   	// only if ajax_req shows "complete"
   	if (ajax_req.readyState == 4)
   	{
      	if (ajax_req.status == 200)
      	   ajax_result = /*ajax_reading*/ true ? ajax_req.responseText : 'ERROR: Unexpected response!';
      	else
      	   ajax_result = 'ERROR: ' + ajax_req.statusText;
      	ajax_reading = false;
   		if (ajax_external) eval(ajax_external+'(ajax_result)');
   	}
   }
   catch (ex) { /* wait */ }
	//return false;
}

/**
 * FUNCION INTERNA!
 * Procesa los parámetros recibidos pasándolos a formato URL.
 * @param params: Array parámetros.
 *                Cada parámetro es un objeto con las siguientes propiedades:
 *                - name: Nombre del parámetro.
 *                - value: Valor del parámetro.
 * @return string de la forma "name=value& ... &name=value"
 */
function getSendParams(params)
{
   if (params.length == 0) return null;

   var ret = "";
   for (var i = 0; i < params.length; i++)
   {
      ret += (i > 0 ? "&" : "") + escape(params[i].name) + "=" + escape(params[i].value);
   }
   return ret;
}
