// Librería para Manejar AJAX

var metodo = { 
        GET: "GET",
        POST: "POST",
        get: "GET",
        post: "POST"
    }

var tipo = {
        TEXTO: 0,
        JSON: 1,
        XML: 2
    }
 
var xhr;

var parametrosOriginales = {
        funcionRetorno: '',
        parametros: '',
        tipo: '',
        adicionales: ''
}

/* Adicionales
    - metodo: metodo.GET o metodo.POST
    - funcionError: funcion que recibe codigo y texto del error

*/

function pedirAjax(url, funcionRetorno, parametros, tipo, adicionales) {
    xhr = getXMLHTTP();
    xhr.open(valorAdicional(adicionales, 'metodo', metodo.GET), url, true);
    xhr.onreadystatechange = __recibirAjax;
    xhr.send(null);
    
    parametrosOriginales.funcionRetorno = funcionRetorno;
    parametrosOriginales.parametros = parametros;
    parametrosOriginales.tipo = tipo;
    parametrosOriginales.adicionales = adicionales;
    
}

function valorAdicional(adicionales, propiedad, valorDefecto) {
    if (adicionales != undefined) {
        if (eval("adicionales." + propiedad) != undefined) {
            return eval("adicionales." + propiedad);
        } else {
            return valorDefecto;
        }        
    } else {
        return valorDefecto;
    }

}

function __recibirAjax() {

    if (xhr.readyState==4) {
        if (xhr.status==200) {
            var datos;
            switch (parametrosOriginales.tipo) {
                case tipo.TEXTO: 
                    datos = xhr.responseText;
                    break;
                case tipo.JSON:
                	try {
	                    datos = eval("(" + xhr.responseText + ")");
                	} catch (e) {
                		ocurrioError(-50, "JSON no válido");
                	}
                    break;
                case tipo.XML:
                    datos = xhr.responseXML;
                    break;
            } 
            parametrosOriginales.funcionRetorno(datos);
        } else {
            ocurrioError(xhr.status, "Error del servidor");
        }
        
   } 
   
}

function ocurrioError(codigo, mensaje) {
    if (valorAdicional(parametrosOriginales.adicionales, 'funcionError')!=undefined) {
        valorAdicional(parametrosOriginales.adicionales, 'funcionError')(codigo, mensaje)
    }
}


//pedirAjax("pepe.php", recibir, undefined, tipo.JSON, {metodo: metodo.GET});



function getXMLHTTP() {
   var req = false;
   if(window.XMLHttpRequest) {
      try {
         req = new XMLHttpRequest();
      }
      catch(e) {}
   }
   else if(window.ActiveXObject) {
      try {
         req = new ActiveXObject("Msxml2.XMLHTTP");
      }
      catch(e) {
         try {
            req = new ActiveXObject("Microsoft.XMLHTTP");
         }
         catch(e) {}
      }
   } // end if
   return req;   
}


