
// Definimos las variables globales.
var http_request = false;  // Objeto del request GET
var xmlhttp=false; // Objeto del request POST
var Ajax_ocupado=false; // Variable semáforo
var timeoutCancelacion=null; // Este es el timer que provocará las cancelaciones
var tiempoAvisoCancelacion = 6000; // Milisegundos
var tiempoCancelacion = 25000; // Milisegundos
/**
 * Función genérica para crear un objeto httpRequest tanto en Mozillas como en Explorer.
 */
function createRequest(){
	var request;
	if (window.XMLHttpRequest) { // Mozilla, Safari,...
		request = new XMLHttpRequest();
		//if (http_request.overrideMimeType) {
		  //  http_request.overrideMimeType('text/xml');
		//}
	} else if (window.ActiveXObject) { // IE
		try {
			request = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
			request = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e) {}
		}
	}

	if (!request) {
		alert('Giving up :( Cannot create an XMLHTTP instance');
		return null;
	}
	return request;
}

/**
 * Función para cargar una página por GET a una capa concreta.
 */
function makeRequest(url,capa_output,refreshFunction) {
	// Pequeño semáforo para evitar peticiones concurrentes.
	if (Ajax_ocupado!=false) {
		//Si está ocupado, lo intentamos más tarde.
		setTimeout("makeRequest('"+url+"','"+capa_output+"')",1000);
		return null;
	}
	Ajax_ocupado = true;
	http_request = false;
	http_request = createRequest();
	
	// Lanzamos Timeout de seguridad a 5 segundos. En 5 segundos se avisará del problema.
	timeoutCancelacion=setTimeout("cancelaRequest('http_request','"+capa_output+"')",tiempoAvisoCancelacion);
	//alert(url);
	//Callback Function
	http_request.onreadystatechange = function () {
			if (http_request.readyState == 4) {
				// cancelamos el timeout de seguridad.
				clearTimeout(timeoutCancelacion);
				if (http_request.status == 200 ||http_request.status == "complete") {
					//alert(capa_output);
					document.getElementById(capa_output).innerHTML = http_request.responseText;
					Ajax_ocupado=false;
					if (refreshFunction!=null) {
						if (refreshFunction.lastIndexOf(")") == -1) {
							eval(refreshFunction+"()");
						} else {
							eval(refreshFunction);
						}
					}
				} else {
				 //alert(http_request.responseText);
					document.getElementById(capa_output).innerHTML = "<table width='80%' class='warnMess'><tr><td>"+http_request.responseText+"</td></tr></table><br>";
					//alert('Hubo un problema con la petición.\nRecargue la página de nuevo para reintentarlo.');
					Ajax_ocupado=false;
				}
			}
	}
	http_request.open('GET', url, true);
	http_request.send(null);

}

/**
 * Esta función me lanza el formulario de los comentarios, aka. Ajax por POST
 */
function sendAjaxForm(objetivo,capa_output,refreshFunction,cargaFormularioFunction,cargaContenidosFunction) {
    var target = objetivo;
    //alert("Objetivo: "+objetivo+" -- capa_out: "+capa_output+" -- FnRefresh: "+refreshFunction+" -- FnCargaForm: "+cargaFormularioFunction+" -- FnCargaContenidos: "+cargaContenidosFunction);
	//alert(objetivo);
	// Pequeño semáforo para evitar peticiones concurrentes.
	if (Ajax_ocupado!=false) {
		//Si está ocupado, lo intentamos más tarde.
		setTimeout("sendAjaxForm('"+objetivo+"','"+capa_output+"','"+refreshFunction+"','"+cargaFormularioFunction+"','"+cargaContenidosFunction+"')",1000);
		return null;
	}
	Ajax_ocupado = true;

    // Montamos el request.
	xmlhttp = false;
	xmlhttp = createRequest();

	// Lanzamos Timeout de seguridad a 5 segundos. En 5 segundos se avisará del problema.
	timeoutCancelacion=setTimeout("cancelaRequest('xmlhttp','"+capa_output+"')",tiempoAvisoCancelacion);

    
    // Callback function
    xmlhttp.onreadystatechange = function() {
        if (xmlhttp.readyState == 4) {
			// Liberamos el semáforo
			Ajax_ocupado=false;
			// y cancelamos el timeout de seguridad.
			clearTimeout(timeoutCancelacion);
            if (xmlhttp.status == 200){
                //alert("OK");
				//alert("status : "+xmlhttp.status);
 				//alert("statusText : "+xmlhttp.statusText);
 				document.getElementById(capa_output).innerHTML = "<table width='80%' class='okMess'><tr><td>"+xmlhttp.responseText+"</td></tr></table><br>";
				if (cargaContenidosFunction!=null) {
					//alert("OK2");
					if (cargaContenidosFunction.lastIndexOf(")") == -1) {
						//alert("OK3");
						eval(cargaContenidosFunction+"()");
					} else {
						//alert("OK4");
						//alert(cargaContenidosFunction);
						eval(cargaContenidosFunction);
					}
				}
				if (cargaFormularioFunction!=null) {
					//alert("OK3");
					if (cargaFormularioFunction.lastIndexOf(")") == -1) {
						eval(cargaFormularioFunction+"()");
					} else {
						eval(cargaFormularioFunction);
					}
				}
				//eval(cargaContenidosFunction+"()");
				//eval(cargaFormularioFunction+"()");
            } else {
				//alert("error : "+xmlhttp.status);
 				//alert("statusText : "+xmlhttp.statusText);
				if (xmlhttp.status==401)
	 				document.getElementById(capa_output).innerHTML = "<table width='80%' class='warnMess'><tr><td>Ocurrió un problema en el envío, recargue la página y vuelva a intentarlo.</td></tr></table><br>";
				else if (xmlhttp.status==403)
	 				document.getElementById(capa_output).innerHTML = "<table width='80%' class='warnMess'><tr><td>Debe escribir correctamente el CAPTCHA para poder enviar comentarios.</td></tr></table><br>";
				else
	 				document.getElementById(capa_output).innerHTML = "<table width='80%' class='warnMess'><tr><td>Ocurrió un problema en el envío, recargue la página y vuelva a intentarlo.</td></tr></table><br>";
				//alert("Cargando formulario");
				if (refreshFunction!=null) {
					if (refreshFunction.lastIndexOf(")") == -1) {
						eval(refreshFunction+"()");
					} else {
						eval(refreshFunction);
					}
				}
			}
        }
    }
    
    // Enviar el request por POST
	xmlhttp.open('POST', target.action, true);
    xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    // Esto da igual, nos lo va a enviar como UTF digamos lo que digamos.
	xmlhttp.setRequestHeader('encoding','ISO-8859-1');
	post_data="";
	for (var i=0;i<target.elements.length;i++) {
		//Montamos el request NAME1=VALUE1&NAME2=VALUE2...
		//alert(target.elements[i].name+"-"+target.elements[i].value);
		//if (i>0) post_data+='&';
		post_data+=(target.elements[i].name+'=' + target.elements[i].value+'&');
	}
	//alert(post_data);
	xmlhttp.send(post_data);
}

function cancelaRequest(request,capa_output) {
	// Mostramos el aviso de que algo va a petar... xD
	 document.getElementById(capa_output).innerHTML += "<br><table width='80%' class='warnMess' align='center'><tr><td>La petición se se está demorando más de lo normal.</td></tr></table><br>";
	 // Lanzamos el 2º Timeout de seguridad a 25 segundos. En 25 segundos se cancelará el request.
	 timeoutCancelacion=setTimeout("cancelaRequestDeVerdad('"+request+"','"+capa_output+"')",tiempoCancelacion);
}

function cancelaRequestDeVerdad(request,capa_output) {
	// Mostramos el aviso del PWNED.
	 document.getElementById(capa_output).innerHTML = "<br><table width='80%' class='warnMess' align='center'><tr><td>La petición se ha tomado demasiado tiempo para ejecutarse. Recargue la página y vuelva a intentarlo.</td></tr></table><br>";
	 // Cancelamos el request.
	 eval(request+"=false");
	 // Liberamos el semáforo y ponemos a null el timeout.
	 timeoutCancelacion=null;
	 Ajax_ocupado=false;
}

//Esta función no hace nada xD
function nada(){}
