/**********************************************************
Tipo:			Biblioteca de funciones Javascript
Descripción: 	Funciones para la utilización de AJAX
**********************************************************/

/**
@desc	Genera un objeto Ajax para realizar peticiones
@return	XMLHttpRequest objeto XMLHttpRequest
*/
function objetoAjax(){
	var xmlhttp=false;
	try {
		xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
	} catch (e) {
		try {
		   xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
		} catch (E) {
			xmlhttp = false;
		}
	}
	if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
		xmlhttp = new XMLHttpRequest();
	}
	return xmlhttp;
}

/**
@desc	Realiza una ejecución de la URL con los parametros y metodo pasados
@param	string	direccion de la página a procesar
@param	string	parametros a pasar a la página (formato: param1=valor1&param2=valor2)
@param	string	Método "POST" o "GET"
@param	funcion	Puntero a la funcion a ejecutar cuando se reciba el resultado. Formato: function funcionResultado(respuesta){ ... } (respuesta es responseText)
@param	funcion	Puntero a la funcion a ejecutar cuando se esta procesando el resultado. Formato: function funcionProgreso(){ ... }
@param	funcion	Puntero a la funcion que gestiona el error. Formato: function funcionError(status){ ... } (status es el codigo HTTP de error)
*/
function ejecutarAjax(url,parametros,metodo,funcionResultado,funcionProgreso,funcionError){
	var usarGET = (metodo=="GET");
	var urlFinal;
	var paramFinal;

	if(usarGET){
		urlFinal = parsearURL(url + "?" + parametros);
		paramFinal = null;
	}else{
		urlFinal = parsearURL(url);
		paramFinal = parsearURL(parametros);
	}

	var req=objetoAjax();
	req.open(metodo, urlFinal, true);

	req.onreadystatechange=function(){
		if(req.readyState==1){
			if(funcionProgreso)
				funcionProgreso();
		}else if(req.readyState==4){
			if(req.status==200){
				if(funcionResultado){
                    //ejecutamos javascript que pudiera haber dentro
                    interpretarBloquesJS(req.responseText);
					funcionResultado(req.responseText);
                }
			}else
				if(funcionError)
					funcionError(req.status);
		}
	 }

	if(!usarGET)
		req.setRequestHeader("Content-Type","application/x-www-form-urlencoded");

	req.send(paramFinal);
}

/**
@desc	Realiza una ejecución de la URL con los parametros y metodo pasados de forma sincrona
@param	string	direccion de la página a procesar
@param	string	parametros a pasar a la página (formato: param1=valor1&param2=valor2)
@param	string Método	"POST" o "GET"
@return	string Texto generado en la llamada (responseText), en caso de error devuelve "#error#"
*/
function ejecutarAjaxSync(url,parametros,metodo){
	var usarGET = (metodo=="GET");
	var urlFinal;
	var paramFinal;

	if(usarGET){
		urlFinal = parsearURL(url + "?" + parametros);
		paramFinal = null;
	}else{
		urlFinal = parsearURL(url);
		paramFinal = parsearURL(parametros);
	}

	var req=objetoAjax();
	req.open(metodo, urlFinal, false);

	if(!usarGET)
		req.setRequestHeader("Content-Type","application/x-www-form-urlencoded");

	req.send(paramFinal);

	if(req.readyState==4 && req.status==200){
        interpretarBloquesJS(req.responseText);
		return req.responseText;
	}else
		return "#error#";
}

/**
@desc	Realiza una ejecución de la URL con los parametros y metodo pasados y la muestra en el objeto HTML DOM pasado
@param	string	direccion de la página a procesar
@param	string	parametros a pasar a la página (formato: param1=valor1&param2=valor2)
@param	string  "POST" o "GET"
@param	string	id del tag HTML sobre el que se volcara el resultado
@param	string	HTML que se mostrara mientras se carga el ajax
@param	string	HTML a mostrar si se produce un error
*/
function ejecutarAjaxHTML(url,parametros,metodo,idTagHTML,htmlCargando,htmlError){
    var objResultado = document.getElementById(idTagHTML);
	ejecutarAjax(url,parametros,metodo,
				 		function(respuesta){
							if(objResultado)
								objResultado.innerHTML = respuesta;
						},
						function(){
							if(objResultado && htmlCargando)
								objResultado.innerHTML = htmlCargando;
						}
						,
						function(status){
							if(objResultado && htmlError)
								objResultado.innerHTML = htmlError;
						}
				);
}

/**
@desc	Devuelve un objeto DOM a partir de un contenido XML
@param	string	Código XML a procesar
@return	DOM Objeto DOM listo para usar (con métodos getElementsByTagName, getAttribute...)
*/
function crearDocumentoXML(contenidoXML){
	var documento;
	if(esIE()){
		documento = new ActiveXObject("Microsoft.XMLDOM");
		documento.async = false;
		documento.loadXML(contenidoXML);
	}else{
		documento = (new DOMParser()).parseFromString(contenidoXML, "text/xml");
	}
	return documento;
}
