//@author Carlos Carrasco T.
//Envia un request http asincronamente
var CONSTANTES_idMensajesAjax = "idMensajesAjax";
var CONSTANTES_TAG_MENSAJES = "mensajes";
var CONSTANTES_TAG_MENSAJE = "mensaje";

function xmlHttpPost(method,strURL,strQuery) {
    var xmlHttpReq = false;
    var self = this;
    // Mozilla/Safari
    if (window.XMLHttpRequest) {
        self.xmlHttpReq = new XMLHttpRequest();
    }
    // IE
    else if (window.ActiveXObject) {
        self.xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
    }
    self.xmlHttpReq.open('POST', strURL, true);
    self.xmlHttpReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    self.xmlHttpReq.onreadystatechange = function() {
        if (self.xmlHttpReq.readyState == 4) { //Complete
        	if (self.xmlHttpReq.status == 200) { // OK response
            	eval(method + "(self.xmlHttpReq.responseText)");
        	}
        	else{
        		alert("Problema: " + self.xmlHttpReq.statusText);
				if(postOnErrorHandleAjaxMethod != ""){
					eval(postOnErrorHandleAjaxMethod);
					postOnErrorHandleAjaxMethod = "";
				}
        	}
        }
    }
    self.xmlHttpReq.send(strQuery);
}

var divReplace = "";//Id Div a Reemplazar
var postHandleAjaxMethod = "";
var postOnErrorHandleAjaxMethod = "";
/**
 * Id: Id del Element en el documento Html que será reemplazado al recibir la respuesta
 * Query: Query que se enviara por xmlHttpPost
 * Forward: Nombre del LocalForward para el ActionInvocado que se utilizará para retornar una respuesta
 * Extra (Opcional): Parametros Extra a enviar via xmlHttpPost
 * mensajeTemporal (Opcional): Mensaje que se muestra hasta que el servidor responda
**/
function ajaxQueryHtml(id,query,extra,mensajeTemporal, post, postOnError){
	divReplace = id;
	if(post != null){postHandleAjaxMethod = post};
	if(postOnError != null){postOnErrorHandleAjaxMethod = postOnError};
	limpiarMensajesAjax();
	xmlHttpPost("handleAjaxResponse",query,(extra == null?"":extra));
	if(mensajeTemporal != null){
		cambiarHtml(id,mensajeTemporal);
	}
}

//Controla la respuesta de una invocacion a Ajax Manejado por este JS
function handleAjaxResponse(result){
	if(result.indexOf("<" + CONSTANTES_TAG_MENSAJES + ">") == -1){
		cambiarHtml(divReplace, result);
		if(postHandleAjaxMethod != ""){
			eval(postHandleAjaxMethod);
		}
	}else{
		mostrarMensajesAjax(result);
		if(postOnErrorHandleAjaxMethod != ""){
			eval(postOnErrorHandleAjaxMethod);
		}
	}
	//Limpieza de datos temporales
	postHandleAjaxMethod = ""; //metodo post reemplazo html
	postOnErrorHandleAjaxMethod = "";//metodo postOnError
	divReplace = ""; //id html a reemplazar
}

function mostrarMensajesAjax(result){
	var mensajes = obtenerMensajes(result);
	var texto = "";
	if(mensajes.length != null && mensajes.length > 0){
		texto = "<ul>";
		for (var i=0;i<mensajes.length;i++) {
			texto += ("<li>" + mensajes[i] + "</li>");
		}
		texto+="</ul>";
	}
	cambiarHtml(CONSTANTES_idMensajesAjax,texto);
}

function limpiarMensajesAjax(){
	cambiarHtml(CONSTANTES_idMensajesAjax,"");
}

function obtenerMensajes(result){
	if (window.ActiveXObject){
		//Codigo para Internet Explorer
		xmlDoc=new ActiveXObject("microsoft.xmldom");
		xmlDoc.loadXML(result);
		var root = xmlDoc.getElementsByTagName(CONSTANTES_TAG_MENSAJES)[0];
		var mensajes = root.getElementsByTagName(CONSTANTES_TAG_MENSAJE);
		var retorno = new Array();
		for (var i = 0 ; i < mensajes.length ; i++) {
			retorno[i] = mensajes[i].firstChild.nodeValue;
		}
		return retorno;
	}else{
		//Codigo para FireFox y Otros
		var parser=new DOMParser();
		var doc = parser.parseFromString(result,"text/xml");
		var root = doc.getElementsByTagName(CONSTANTES_TAG_MENSAJES)[0];
		var mensajes = root.getElementsByTagName(CONSTANTES_TAG_MENSAJE);
		var retorno = new Array();
		for (var i = 0 ; i < mensajes.length ; i++) {
			retorno[i] = mensajes[i].firstChild.nodeValue;
		}
		return retorno;
	}
}

function cambiarHtml(id,contenido){
	if(id == null || id == '') return;
	var elem = document.getElementById(id);
	if(elem == null){
		alert("El elemento con id " + id + " no existe");
	}else{
		elem.innerHTML = contenido;
	}
}
function getById(id){
	return document.getElementById(id);
}