//Archivo de funciones Ajax
// Autor:  Moisés Martínez Muñoz
// Correo: moises@ciclik.es

//Function de parseo de Ajax sobre XML/XSL
//XML   indica el archivo que posee el xml o que lo genera
//XSL   indica el archivo que posee el codigo xsl para la transformación
//DONDE representa el objeto sobre el cual se va a insertar la información obtenida de la transformación
function parsearXSL(xml,xsl,donde) 
{
	var xmlDoc
	var xslDoc
	
	xmlDoc = new ActiveXObject('Microsoft.XMLDOM');
	xmlDoc.async = false;
	
	xslDoc = new ActiveXObject('Microsoft.XMLDOM');
	xslDoc.async = false;
	
	xmlDoc.load(xml);
	xslDoc.load(xsl);
	
	donde.innerHTML = xmlDoc.documentElement.transformNode(xslDoc);
}

//Función de creación del objeto Ajax, para la ejecución de proceso en el servidor mediante
//peticiones por parte del cliente.
function nuevoXMLHTTP()
{	
	
	var xmlhttp=false;
	try {
		xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");  		// Creación del objeto ajax para navegadores diferentes a Explorer
	} catch (e) {
		try {								// o bien
			xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");		// Creación del objet ajax para Explorer
		} catch (E) {
			xmlhttp = false;
		}
	}

	if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
		xmlhttp = new XMLHttpRequest();
	}
	
	return xmlhttp;
}


//**********************************************************************//
//*******************Funciones de Operación*****************************//
//**********************************************************************//

function call_user_func_array(nombre, parametros) 
{
    var funcion;
	
	var tipoCadena = typeof(nombre);
	var tipoObjeto = typeof(this[nombre]);
	
    if (tipoCadena == 'string') 
	{
        if (tipoObjeto == 'function') 
		{
            funcion = this[nombre];
        } 
		else 
		{
            funcion = (new Function(null, 'return ' + nombre))();
        }
    } 
	else if (funcion instanceof Array) 
	{
        funcion = eval(funcion[0]+"['"+funcion[1]+"']");
    }
    
    if (tipoObjeto != 'function') 
	{
        throw new Exception(funcion + ' no es una funcion valida.');
    }
 
    return funcion.apply(null, parametros);
}



//Función de ejecución de operaciones para la recogida de los valores por defecto y la aplicación 
//de la operación
//resultado: Se corresponde con una cadena que almacena el resultado devuelto por la petición ajax.
//operación: Inica la operación que se desea realiza
function ejecutarOperacion(resultado,operacionOk,operacionError,contenedor)
{
	var valores = resultado.split("%");
	
	if ((valores[0] == 'ok') && (operacionOk != null))
		call_user_func_array(operacionOk,[contenedor,valores[1]]);
	else if (operacionError != null)
		call_user_func_array(operacionError,[contenedor,valores[1]]);
	
	//	throw new Exception(funcion + ': Ejecución incorrecta de la función.');

}

//**********************************************************************//
//**********************************************************************//


//Funcion generica para enviar datos por ajax
//pagina     : corresponde a la página a la que se va llamar.
//metodo     : su valor puede ser 1 o 2 --> 1 representa a POST y 2 represeta a GET.
//parametros : contiene los parametros que se pasan por post, en caso de usar get contiene null.
//operacion  : Indica el nombre de la función que se utilizará para ejecutar la salida.
//contenedor : objeto en el cual se cargará el resultado. 
function lanzarPagina(pagina,metodo,parametros,operacionOk,operacionError,contenedor)
{
	var navegador = false;
	var resultado = '';

    //Definimos el tipo de tranferencia comprobando el tipo de navegador a utilizar
    
    if (navigator.appName == 'Netscape')
        navegador = true;

	oAjax = nuevoXMLHTTP();
	//Lanzamos el ajax a la página indicada

	if (metodo == 1)
	{
		oAjax.open("POST",pagina,navegador);
		//Cabecera para que el navegador carge los parametros en el array de post del navegador
		oAjax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");		
	}
	else
		oAjax.open("GET",pagina,navegador);
		
	oAjax.onreadystatechange=function() 
	{
		if (oAjax.readyState==4) 
		{		
			//creamos un contador para matar el proceso en caso de que no responda el servidor.
			var requestTimer = setTimeout('expira()',100000);
			//Almacenamos la información de la salida de la página la que llama el objeto ajax
            if (operacionOk == null)
				resultado = oAjax.responseText;
			else
				ejecutarOperacion(oAjax.responseText,operacionOk,operacionError,contenedor);
			//finalizamos el contador de expiración de la petición
			clearTimeout(requestTimer);		
			//Si la salida es erronea
		}
	}
	oAjax.send(parametros);
	
	return resultado;
}
