// LIBRERIA AJAX
// 14-09-2007


/* Función principal de la libreria*/
// 
//	dir: dirección relativa de la libreria respecto al archivo que la llama
//  file: nombre del script que va a procesar la llamada de AJAX
//	metod: metodo por el que se envian las variables 
//	vars: string que contiene las variables a pasar a AJAX ej: 'var1=valor1&var2=valor2'
//	func_ok: nombre de la función que procesa la respuesta cuando esta es correcta: NO INCLUIR COMILLAS
//	func_ko: nombre de la función que procesa la respuesta cuando esta es incorrecta: NO INCLUIR COMILLAS
//	loader:  id del div,span... que contiene el cargador, en caso de ser vacio '' se crea uno por defecto
//  timeout: tiempo máximo que se permite que dure la llamada a AJAX

	function AJAX(dir,file,metod,vars,func_ok,func_ko,loader,timeout)
	{
        var ancho,alto;
        // ancho y alto del area de trabajo en firefox
        if (window.innerWidth)
        {
            ancho=window.innerWidth;
            alto=window.innerHeight;
        }
        // ancho y alto del area de trabajo en IE
        else if (document.all)
        {
            ancho=document.body.clientWidth+10;
            alto=document.body.clientHeight+20;
        }

		// creación del cargador por defecto
		if (loader=='')
		{
            var Div = document.createElement("div");
            Div.id='cargador';
            Div.style.position = "absolute";
            Div.style.top=0;
            Div.style.left=0;
            Div.style.width=ancho+'px';
            Div.style.height=alto+'px';
            Div.style.display='none';
            Div.style.backgroundImage="url('"+dir+"/fondo.gif')";
            Div.innerHTML='<img src="'+dir+'/loader.gif" style="position:relative; top:70%;left:45%">';
            document.body.appendChild(Div);
			loader='cargador';
		}
		/////////////////////

		document.getElementById(loader).style.display='block'; // se muestra el cargador;

		// actualizacion de variables globales;
		IDloader=loader;
		function_ok=func_ok;
		function_ko=func_ko;

       // reubicación del cargador
            document.getElementById(IDloader).style.width=ancho+'px';
            document.getElementById(IDloader).style.height=alto+'px';

		// se establece la conexión con AJAX
		Conn.connect(file,metod,vars,leerDatos);
        //loaded=0;
        if (!timeout)
            timeout=30000;
        setTimeout('timeOut()',timeout);
	}

/* Función que recibe los datos que ha devuelto ajax */
	function leerDatos(oXML)
	{
        loaded=1;
		document.getElementById(IDloader).style.display='none'; // se oculta el cargador
        //var cabeceras=oXML.getAllResponseHeaders();
        //alert(cabeceras);
    	var response  = oXML.responseText; // obtención de la respuesta;

    	// comprobación del estado de la respuesta y llamada a la función correspondiente
    	if ((oXML.status==200) && (function_ok)){
    		loaded=1;
    		function_ok(response);
    	}
    	else if (function_ko)
    	{
    		loaded=1;
    		function_ko(response);
    	}
	 }

     function timeOut()
     {
        if (loaded==0)
        {
            document.getElementById(IDloader).style.display='none';
            xmlhttp.abort();
            if (function_ko)
            {
                function_ko('Time Out');
            }
        }
     }


/*  Función que establece la conexión AJAX controlando los estados (NO MODIFICAR)*/

function XHConn()
{
  var bComplete = false;
  try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); }
  catch (e) { try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); }
  catch (e) { try { xmlhttp = new XMLHttpRequest(); }
  catch (e) { xmlhttp = false; }}}
  if (!xmlhttp) return null;
  this.connect = function(sURL, sMethod, sVars, fnDone)
  {
    if (!xmlhttp) return false;
    bComplete = false;
    sMethod = sMethod.toUpperCase();

    try {
      if (sMethod == "GET")
      {
        xmlhttp.open(sMethod, sURL+"?"+sVars, true);
        sVars = "";
      }
      else
      {
        xmlhttp.open(sMethod, sURL, true);
        xmlhttp.setRequestHeader("Method", "POST "+sURL+" HTTP/1.1");
        xmlhttp.setRequestHeader("Content-Type",
          "application/x-www-form-urlencoded");
      }
      xmlhttp.onreadystatechange = function(){
        if (xmlhttp.readyState == 4 && !bComplete)
        {
          bComplete = true;
          fnDone(xmlhttp);
        }};
      xmlhttp.send(sVars);
    }
    catch(z) { return false; }
    return true;
  };
  this.submit = function(formu, args)
  {
    xmlhttp.submit(formu, args);
  };
  return this;
}


/*   Variable Globales necesarias para el funcionamiento de la libreria         */
var function_ok;		// variable que contiene el nombre de la función que se ejecutara cuando la respuesta de AJAX sea correcta
var function_ko;		// variable que contiene el nombre de la función que se ejecutara cuando la respuesta de AJAX sea incorrecta
var IDloader='';		// variable de texto que contiene el ID del cargador
var loaded=0;			// variable que indica si ha concluido la carga
var xmlhttp;			// objeto que contiene parametros de AJAX
var Conn = new XHConn(); // Variable que contiene la conexion con AJAX
var tipo = ""; //Tipo de llamada a ajax (cambiar_pais, insertar_datos, etc.)


function ProcesarAJAX(oXML){
	//Función que procesa los datos devueltos por el fichero:
	var resultado=oXML;
	switch(tipo){
		case "cambiar_pais": document.getElementById("selector_provincias").innerHTML=resultado; break;
	}
}

function ko_ajax(){
	switch (tipo){
		case "cambiar_pais": alert ("No se ha podido extraer la lista de provincias pertenecientes al país.\nInténtelo de nuevo más tarde.");
	}
}

//Ejemplo de llamada:
//AJAX('images','grupos/agregar_usuario.php','POST',poststr,ProcesarAJAX,ko_ajax,'');


