// --------------------------------------------------------------------------------------------------
//   API multiuso para gestionar peticiones asincrónicas usando Ajax - "aún sin nombre... ¬¬"
//
//   Versión: 2.07
//   Autor: Shinzou no Elf - Pablo Masquiarán
//   Fecha de creación: 14 de Diciembre de 2007
//   Fecha de modificación: 31 de Julio de 2008
//
//   Existen siete variables globales que deben definirse en el documento y que son requeridas
//   para la comunicación y despliegue de los datos devueltos asincrónicamente.
//
//   var losDatos = "";                 String; contendrá los valores a enviar asincrónicamente.
//   var emptyMensaje = "";             String; guarda el texto del mensaje de respuesta vacía.
//   var displayMensaje = true/false;   Booleano; define si emptyMensaje se despliega o no.
//   var displayLoading = true/false;   Booleano; define si targetLoading se mantiene o no.
//   var targetHTML = true/false;       Booleano; define si respuesta se despliega en HTML o no.
//   var targetResponse = true/false;   Booleano; define si se captura respuesta del servidor o no.
//
//   emptyResponse y errorResponse son clases que deben construirse en la cascada de estilo y
//   definen el diseño de los respectivos mensajes de feedback de las respuestas asincrónicas.
// --------------------------------------------------------------------------------------------------

var objetoAjax = false; // Variable global que manipula el objeto XMLHTTP.

// Función que realiza la conexión con el objeto XMLHTTP...
function ajaxConex() {
 if(window.XMLHttpRequest) { objetoAjax = new XMLHttpRequest(); } // Creación del objeto XMLHTTP... usuarios inteligentes [CUALQUIERA NO MICRO$OFT]
 else {
  if(window.ActiveXObject) { objetoAjax = new ActiveXObject('Microsoft.XMLHTTP'); } // Creación del objeto XMLHTTP... usuarios TONTOS [MICRO$OFT INTERNET EXPLORER]
 }
}

// Función que despliega los resultados según la petición.
function ajaxContenido(idMensaje, idLoading) {
//  readyState devuelve el estado del objeto XMLHTTP y puede valer:
//  0 - No inicializado (Es el valor inicial de readyState).
//  1 - Abierto (El método "open" ha tenido éxito).
//  2 - Enviado (Se ha completado la solicitud pero ningun dato ha sido recibido todavía).
//  3 - Recibiendo.
//  4 - Respuesta completa (Todos los datos han sido recibidos).
 if(objetoAjax.readyState == 4) {
  if(objetoAjax.status == 200) { // Si la petición es exitosa...
  //  statusText contiene el texto del estado y status contiene un codigo enviado por el servidor:
  //  200 - Completado con éxito.
  //  404 - No se encontró URL.
  //  414 - Los valores pasados por GET superan los 512 caracteres.
   if (targetResponse) { catchResponse(objetoAjax); } // Si se desea operar con la respuesta del servidor
   if(objetoAjax.responseText) { // Si se reciben datos...
   //  El objeto XMLHTTP puede recibir datos de la forma:
   //  responseText - Datos devueltos por el servidor en forma de cadena de texto.
   //  responseXML - Datos devueltos por el servidor en forma de documento XML.
    if (targetHTML) { document.getElementById(idMensaje).innerHTML = objetoAjax.responseText; }
    if (!targetHTML) { document.getElementById(idMensaje).value = objetoAjax.responseText; }
    document.getElementById(idMensaje).style.visibility = 'visible';
   }
   else { // Si NO se reciben datos...
    if (displayMensaje) {
     document.getElementById(idMensaje).innerHTML = '<span class="emptyResponse">'+emptyMensaje+'</span>';
     document.getElementById(idMensaje).style.visibility = 'visible';
    }
    if (!displayMensaje) {
     document.getElementById(idMensaje).innerHTML = '&nbsp;';
     document.getElementById(idMensaje).style.visibility = 'hidden';
    }
   }
  }
  else { // Si la petición NO es exitosa...
   document.getElementById('errorResponse').style.visibility = 'visible';
   document.getElementById('errorResponse').innerHTML = 'Falló la petición...<br />Error: HTTP '+objetoAjax.status+'&nbsp;'+objetoAjax.statusText;
  }
  if (displayLoading) { document.getElementById(idLoading).style.visibility = 'hidden'; }
  objetoAjax = false;
 }
 else  {
  document.getElementById(idLoading).style.visibility = 'visible';
  return
 }
}

// Función que recibe los identificadores y variables e inicia la petición.
function ajaxInicio(idMensaje, idLoading, metodoEnvio, laPagina) {
 if(objetoAjax) { return; }
 ajaxConex();
 if(objetoAjax) { // Si se ha creado un objeto XMLHTTP...
   document.getElementById('errorResponse').style.visibility = 'hidden';
  document.getElementById('errorResponse').innerHTML = '&nbsp;';
  var elMomento = new Date();
  //  Preparamos un objeto XMLHTTP con el servidor de la forma (método, página, estado)
  //  Método [POST|GET] - Determina el método de envío de los datos al servidor.
  //  Página - Indica el nombre del archivo que devolverá la respuesta desde el servidor.
  //  Estado [false/true] - Determina si el estado de la conexión será sincrónica o asincrónica.
  objetoAjax.open(metodoEnvio, laPagina, true);
  objetoAjax.setRequestHeader('Content-Type','application/x-www-form-urlencoded; charset=utf-8');
  objetoAjax.onreadystatechange = function() { ajaxContenido(idMensaje, idLoading); }
  objetoAjax.send(losDatos+'&'+elMomento.getTime());
 }
 else { // Si NO se ha creado un objeto XMLHTTP...
  document.getElementById('errorResponse').style.visibility = 'visible';
  document.getElementById('errorResponse').innerHTML = 'Imposible realizar petición...';
 }
}