/**
 * Libreria: Funciones para utilizar AJAX en las paginas
 * Por     : José Antonio Rojas
 * e_mail  : joanrove@gmail.com
 * Fecha   : 25-04-2006
 *
 * Basado en ejemplos de las paginas:
 * - http://www.desarrolloweb.com/articulos/2279.php
 * - http://www.hackorama.com/ajax/
**/


//
//Invoca URL dada en modo asincrono ejecutando los handlers indicados una vez cargada
//Parametros:
//  - a_url         ==> URL a invocar
//  - a_user/a_pass ==> datos de usuario y clave de la pagina invocada, pueden ser null o vacios si la
//                      pagina no los requiere
//  - a_funcionHandlerExito ==> funcion javascript a invocar si la pagina dada carga exitosamente
//  - a_funcionHandlerError ==> analoga anterior en caso de error
//
//Obs:
//  - las funciones pueden ser null, en cuyo caso no se invoca la correspondiente
//  - las funciones se ejecutan dando el objeto HttpRequest resultado de invocar
//    la pagina dada. Para referencias sobre este objeto ver:
//    http://windowssdk.msdn.microsoft.com/library/default.asp?url=/library/en-us/dhtml/workshop/author/dhtml/reference/objects/obj_xmlhttprequest.asp
//
//Ejemplos de invocaciones:
//   ajax( "http://www.opensoft.cl",    "", "", null, null );
//   ajax( document.forms[0].url.value, "", "", handlerOK, null );
//   ajax( "/OpenNet/asp/pagRecuperar?argRegistroId=123", a_user, a_pass, handlerOK, handlerError );
//
//Ejemplos de handlers:
//function handlerOK( a_objXML ) {  document.forms[0].html.value = a_objXML.ResponseText; }
//function handlerError( a_objXML ) { alert( "No se pudo recuperar pagina.\n\nError:\n" + a_objXML.status + " - " + a_objXML.statusText ); }
//function handlerOK( a_objXML ) {  document.getElementById("divDinamico").innerHTML = a_objXML.ResponseText; }
//
function ajax( a_url, a_user, a_pass, a_funcionHandlerExito, a_funcionHandlerError ) {

  //Crea objeto para invocar url
  var objXML = newXMLHttpRequest();

  //Verifica creacion de objeto
  if( objXML == null ) {
    alert( "Su browser no tiene AJAX" );
    return;
  }
  //Indica pagina a invocar
  objXML.open( "GET", a_url, true, a_user, a_pass );

  //Instala funcion handler que invoca a su vez a las funciones handlers dadas
  objXML.onreadystatechange = function() {
    if( objXML.readyState != 4 )  return;
    if( objXML.status == 200 ) {
      if( typeof( a_funcionHandlerExito ) == "function" )  a_funcionHandlerExito( objXML );
    } else
      if( typeof( a_funcionHandlerError ) == "function" )  a_funcionHandlerError( objXML );
  }
  
  //Invoca URL
  objXML.send(null);
}


//
// Crea objeto XMLHttpRequest para implementar AJAX
//
function newXMLHttpRequest() {

  //Variable con objeto a retornar
  var objXML = null;
  //1ro, intenta con metodo propio de browser para crear objeto HttpRequest
  try {
    objXML = new XMLHttpRequest();
  } catch( e1 ) {
  
  //2do, intenta creando control activeX Microsoft.XMLHTTP
  try {
    objXML = new ActiveXObject("Microsoft.XMLHTTP");
  } catch( e2 ) {
    
  //3ro, intenta creando control activeX MSXML2
  try {
    objXML = new ActiveXObject("Msxml2.XMLHTTP");
  } catch( e3 ) {
  } } }
  
  //Retorna objeto
  return( objXML );
} 
