//
// Infraestructura AJAX
// Copyright(C) Best Business Service - 2007
//
/*
function AjaxCreate()
function AjaxRelease(ajax)
function AjaxGet(ajax, strURL, callbackFunction)
function AjaxGetSync(ajax, strURL, callbackFunction)
function AjaxPost(ajax, formName, strURL, callbackFunction)
function AjaxPostSync(ajax, formName, strURL, callbackFunction)
function AjaxGetPanel(strURL, divdestino, callbackFunction)
function AjaxGetDataBase(strURL, callbackFunction)
function AjaxPostPanel(formName, strURL, divdestino, callbackFunction)
function AjaxPostDataBase(formName, strURL, callbackFunction)
function AjaxCallbackPanel(ajaxobj, divdestino, callbackFunction)
function AjaxStarted(ajax)
function AjaxCompleted(ajax)
function AjaxResponse(ajax)
function AjaxResponseXML(ajax)
function AjaxMostrarResultado(DIV, ajax)
function AjaxMostrarCargando(DIV)
function AjaxGetFormParams(formName)
function FrameSubmitGet()
function FrameSubmitPost(formName, strURL, frameName)
function JavascriptLoadFileOnDemand(jsfile)
function JavascriptExecOnDemand(jsCode)
function AjaxEvalJavascript(idtextarea)
function AjaxCargarDOM(xmlText)
*/
			
			
//--------------------------------------------------------------------------------------------------------
// Crear objeto AJAX
function AjaxCreate()
{
	var ajax = new Object();
	ajax.strURL = "";
	ajax.postParams = '';
	
	try {
		ajax.HttpRequest = new XMLHttpRequest();
	}
	catch(err) {
		try {
			ajax.HttpRequest = new ActiveXObject("Msxml2.XMLHTTP");
		}
		catch(err) {
			try {
				ajax.HttpRequest = new ActiveXObject("Microsoft.XMLHTTP");
			}
			catch(err) {
				window.alert("Su navegador web no soporta AJAX");
				throw new Error("Su navegador web no soporta AJAX");
			}
		}
	}

	return ajax;
}


//--------------------------------------------------------------------------------------------------------
function AjaxRelease(ajax)
{
	//ajax.HttpRequest = null;
	ajax = null;
}


//--------------------------------------------------------------------------------------------------------
function AjaxResponse(ajax)
{
	var text = ajax.HttpRequest.responseText;
//objAjax.XmlHttp.abort();
//ajax.XmlHttp = null;
//ajax = null;							// Liberar memoria para objetos ActiveX en IE
	return text;
}


//--------------------------------------------------------------------------------------------------------
function AjaxResponseXML(ajax)
{
	var text = ajax.HttpRequest.responseXML;
//objAjax.XmlHttp.abort();
//ajax.XmlHttp = null;
//ajax = null;							// Liberar memoria para objetos ActiveX en IE
	return text;
}


//--------------------------------------------------------------------------------------------------------
function AjaxStarted(ajax)
{
	if (ajax.HttpRequest.readyState == 1) {
		return true;
	}
	return false;
}


//--------------------------------------------------------------------------------------------------------
// Determinar si se ha completado la peticion AJAX
function AjaxCompleted(ajax)
{
	if (ajax.HttpRequest.readyState == 4) {
		if (ajax.HttpRequest.status == 200) {
			return true;
		}
		else {
			jsError = "";
			jsError += "No se puede realizar la peticion AJAX\n";
			jsError += "Codigo: " + ajax.HttpRequest.status + "\n"
			jsError += "Descripcion: " + ajax.HttpRequest.statusText + "\n"
			jsError += "URL: " + ajax.strURL + "\n";
			jsError += "POST: " + ajax.postParams + "\n";
			window.alert(jsError);
			return true;
			//throw new Error(jsError);		//????
		}
	}
}


//--------------------------------------------------------------------------------------------------------
// strURL - URL donde se llamara en GET
// callbackFunction - funcion que se llamara al completar operacion GET
// RETORNA objeto AJAX
function AjaxGet(ajax, strURL, callbackFunction)
{
	// Notificar al server que la llamada se realiza a traves de AJAX
	if (strURL.indexOf('?') == -1) {
		strURL += '?AJAX=1';
	} else {
		strURL += '&AJAX=1';
	}
	ajax.strURL = strURL;
	ajax.postParams = null;        // No tiene parametros POST

	ajax.HttpRequest.open("GET", strURL, true);
	ajax.HttpRequest.onreadystatechange = callbackFunction;
	//ajax.HttpRequest.setRequestHeader("Cache-Control", "no-cache");
	//ajax.HttpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=ISO-8859-1");
	ajax.HttpRequest.send(null);
}


//--------------------------------------------------------------------------------------------------------
function AjaxGetSync(ajax, strURL, callbackFunction)
{
	// Notificar al server que la llamada se realiza a traves de AJAX
	if (strURL.indexOf('?') == -1) {
		strURL += '?AJAX=1';
	} else {
		strURL += '&AJAX=1';
	}
	ajax.strURL = strURL;
	ajax.postParams = null;        // No tiene parametros POST

	ajax.HttpRequest.open("GET", strURL, false);
	//ajax.HttpRequest.setRequestHeader("Cache-Control", "no-cache");
	//ajax.HttpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=ISO-8859-1");
	ajax.HttpRequest.send(null);
	try { callbackFunction(); } catch(err) {};
}


//--------------------------------------------------------------------------------------------------------
// formName - Formulario con Hiddens a enviar por POST
// strURL - URL donde se llamara en POST
// callbackFunction - funcion que se llamara al completar operacion POST
// RETORNA objeto AJAX
function AjaxPost(ajax, formName, strURL, callbackFunction)
{
	var postParams = AjaxGetFormParams(formName);
	// Notificar al server que la llamada se realiza a traves de AJAX
	postParams = 'AJAX=1&' + postParams;
	ajax.strURL = strURL;            // Guardar dinamicamente la URL para depurar errores
	ajax.postParams = postParams;    // Guardar dinamicamente parametros POST para depurar errores

	ajax.HttpRequest.open("POST", strURL, true);
	ajax.HttpRequest.onreadystatechange = callbackFunction;
	//ajax.HttpRequest.setRequestHeader("Cache-Control", "no-cache");
	ajax.HttpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=ISO-8859-1");
	ajax.HttpRequest.send(postParams);
}


//--------------------------------------------------------------------------------------------------------
function AjaxPostSync(ajax, formName, strURL, callbackFunction)
{
	var postParams = AjaxGetFormParams(formName);
	// Notificar al server que la llamada se realiza a traves de AJAX
	postParams = 'AJAX=1&' + postParams;
	ajax.strURL = strURL;            // Guardar dinamicamente la URL para depurar errores
	ajax.postParams = postParams;    // Guardar dinamicamente parametros POST para depurar errores

	ajax.HttpRequest.open("POST", strURL, false);
	//ajax.HttpRequest.setRequestHeader("Cache-Control", "no-cache");
	ajax.HttpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=ISO-8859-1");
	ajax.HttpRequest.send(postParams);
	try { callbackFunction(); } catch(err) {}
}


//--------------------------------------------------------------------------------------------------------
function AjaxGetPanel(strURL, divdestino, callbackFunction)
{
	var ajax = AjaxCreate();
	
	// Notificar al server que la llamada se realiza a traves de AJAX
	if (strURL.indexOf('?') == -1) {
		strURL += '?AJAX=1';
	} else {
		strURL += '&AJAX=1';
	}
	ajax.strURL = strURL;
	ajax.postParams = null;        // No tiene parametros POST

	ajax.HttpRequest.open("GET", strURL, true);
	ajax.HttpRequest.onreadystatechange = function() {
												AjaxCallbackPanel(ajax, divdestino, callbackFunction);
											};
	ajax.HttpRequest.setRequestHeader("Cache-Control", "no-cache");
	ajax.HttpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=ISO-8859-1");
	ajax.HttpRequest.send(null);
}

//--------------------------------------------------------------------------------------------------------
function AjaxGetDataBase(strURL, callbackFunction)
{
	var ajax = AjaxCreate();
	
	// Notificar al server que la llamada se realiza a traves de AJAX
	if (strURL.indexOf('?') == -1) {
		strURL += '?AJAX=1';
	} else {
		strURL += '&AJAX=1';
	}
	ajax.strURL = strURL;
	ajax.postParams = null;        // No tiene parametros POST

	ajax.HttpRequest.open("GET", strURL, true);
	ajax.HttpRequest.onreadystatechange = function() {
												AjaxCallbackPanel(ajax, "AJAXRESULT", callbackFunction);
											};
	ajax.HttpRequest.setRequestHeader("Cache-Control", "no-cache");
	ajax.HttpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=ISO-8859-1");
	ajax.HttpRequest.send(null);
}
//--------------------------------------------------------------------------------------------------------
function AjaxPostPanel(formName, strURL, divdestino, callbackFunction)
{
	var ajax = AjaxCreate();

	var postParams = AjaxGetFormParams(formName);
	
	// Notificar al server que la llamada se realiza a traves de AJAX
	postParams = 'AJAX=1&' + postParams;
	ajax.strURL = strURL;            // Guardar dinamicamente la URL para depurar errores
	ajax.postParams = postParams;    // Guardar dinamicamente parametros POST para depurar errores

	ajax.HttpRequest.open("POST", strURL, true);
	ajax.HttpRequest.onreadystatechange = function() {
												AjaxCallbackPanel(ajax, divdestino, callbackFunction);
											};
	ajax.HttpRequest.setRequestHeader("Cache-Control", "no-cache");
	ajax.HttpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=ISO-8859-1");
	ajax.HttpRequest.send(postParams);
}


//--------------------------------------------------------------------------------------------------------
function AjaxPostDataBase(formName, strURL, callbackFunction)
{
	var ajax = AjaxCreate();

	var postParams = AjaxGetFormParams(formName);
	
	// Notificar al server que la llamada se realiza a traves de AJAX
	postParams = 'AJAX=1&' + postParams;
	ajax.strURL = strURL;            // Guardar dinamicamente la URL para depurar errores
	ajax.postParams = postParams;    // Guardar dinamicamente parametros POST para depurar errores

	ajax.HttpRequest.open("POST", strURL, true);
	ajax.HttpRequest.onreadystatechange = function() {
												AjaxCallbackPanel(ajax, "AJAXRESULT", callbackFunction);
											};
	ajax.HttpRequest.setRequestHeader("Cache-Control", "no-cache");
	ajax.HttpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=ISO-8859-1");
	ajax.HttpRequest.send(postParams);
}


//--------------------------------------------------------------------------------------------------------
function AjaxCallbackPanel(ajaxobj, divdestino, callbackFunction)
{
	if (AjaxStarted(ajaxobj)) 
	{
		AjaxMostrarCargando(divdestino);
	}
	
	if (AjaxCompleted(ajaxobj)) 
	{
		AjaxMostrarResultado(divdestino, ajaxobj);

		// Llamar funcion callback proporcionada por usuario
		if (callbackFunction != undefined)
		{
			callbackFunction();
		}
		AjaxRelease(ajaxobj);
	}
}


//--------------------------------------------------------------------------------------------------------
// Obtiene el XML de la peticion AJAX, analiza mensajes de error y encaja el XML dentro del DIV
function AjaxMostrarCargando(DIV)
{
	//document.getElementById(DIV).innerHTML = '<span class="stdFont12">Cargando...</span>';
	
	jsHTML = '';
	jsHTML += '<div class="stdFont8" style="text-align: center">';
	jsHTML += '<img src="/images/Pixel1x1.gif" alt="" border="0" style="width:1px; height:100%; vertical-align:middle" />';
	jsHTML += 'Cargando contenido...';
	jsHTML += '</div>';

	document.getElementById(DIV).innerHTML = jsHTML;
}


//--------------------------------------------------------------------------------------------------------
// Obtiene el XML de la peticion AJAX, analiza mensajes de error y encaja el XML dentro del DIV
function AjaxMostrarResultado(DIV, ajax)
{
	var xmltext = AjaxResponse(ajax);
	document.getElementById(DIV).innerHTML = xmltext;
	if (DIV == "AJAXRESULT") {
		AjaxEvalJavascript("AJAXSCRIPT");
	}
}


//--------------------------------------------------------------------------------------------------------
// formName - Formulario
// RETORNA string con parametros del formulario separados por & "INPUT1=VALUE1&INPUT2=VALUE2"
function AjaxGetFormParams(formName)
{
	var length = document.forms[formName].length;
	var i;
	var elem;
	var strPARAMS = '';

	// TODO: FALTA CONTROLAR LOS TEXTAREA TAMBIEN
	// TODO: FALTA CONTROLAR LOS SELECT
	for (i = 0; i < length; i++)
	{
		elem = document.forms[formName].elements[i];
		if (elem.name != '' && !elem.disabled) {
			if (elem.type == 'checkbox') {
				if (elem.checked) {
					if (strPARAMS != '') strPARAMS += '&';
					strPARAMS += escape(elem.name) + '=' + escape(elem.value);
				}
			}
			else if (elem.type == 'radio') {
				if (elem.checked) {
					if (strPARAMS != '') strPARAMS += '&';
					strPARAMS += escape(elem.name) + '=' + escape(elem.value);
				}
			}
			else {
				if (strPARAMS != '') strPARAMS += '&';
				strPARAMS += escape(elem.name) + '=' + escape(elem.value);
			}
		}
	}
	//alert(strPARAMS);
	
	return strPARAMS;
}


//--------------------------------------------------------------------------------------------------------
function FrameSubmitGet()
{
	//FALTA IMPLEMENTAR
}


//--------------------------------------------------------------------------------------------------------
// Realiza un POST por IFRAME
// formName - Formulario con Hiddens a enviar por POST
// strURL - URL donde se llamara en POST
// frameName - Frame donde se realizara la carga del resultado del POST
function FrameSubmitPost(formName, strURL, frameName)
{
	document.getElementById(formName).target = frameName;
	document.getElementById(formName).action = strURL;
	document.getElementById(formName).submit();
	document.getElementById(formName).target = '';
}


//--------------------------------------------------------------------------------------------------------
// Carga un Javascript y lo guarda en el repositorio del head
// FUNCION EN BETA
function JavascriptLoadFileOnDemand(jsfile)
{
	var head = document.getElementsByTagName("head")[0];
	var script = document.createElement("script");
	script.type = "text/javascript";
	script.src = jsfile;
	head.appendChild(script);
}


//--------------------------------------------------------------------------------------------------------
// Carga un Javascript y lo guarda en el repositorio del head
// FUNCION EN BETA
function JavascriptExecOnDemand(jsCode)
{
	var head = document.getElementsByTagName("head")[0];
	var script = document.createElement("script");
	script.type = "text/javascript";
	script.text = jsCode;
	head.appendChild(script);
}


//--------------------------------------------------------------------------------------------------------
function AjaxEvalJavascript(idtextarea)
{
	var scriptcode;

	try {
		scriptcode = document.getElementById(idtextarea).value;
	}
	catch(err) {}
	eval(scriptcode);
}


//--------------------------------------------------------------------------------------------------------
// Retorna el DOM a partir de un string con XML
function AjaxCargarDOM(xmlText)
{
	if (window.ActiveXObject) {
		try {
			var xmldoc = new ActiveXObject("Microsoft.XMLDOM");
			xmldoc.async = false;
			xmldoc.loadXML(xmlText);
		}
		catch (err) {
			window.alert("Su navegador no soporta el parser XML");
			throw new Error("Su navegador no soporta el parser XML");
		}
	}
	else {
		try {
			var xmlparser = new DOMParser();
			var xmldoc = xmlparser.parseFromString(xmlText, "text/xml");
		}
		catch (err) {
			window.alert("Su navegador no soporta el parser XML");
			throw new Error("Su navegador no soporta el parser XML");
		}
	}
	
	return xmldoc;
}

function AjaxEliminarAjaxScript(idtextarea)
{
	objAjaxScript = document.getElementById(idtextarea);
	objAjaxScript.parentNode.removeChild(objAjaxScript);
}

	//FUNCIO ESCAPE DE JAVASCRIPT
	//document.forms['frmDatos'].elements[0].value = 'AQUI\'\n\r\"@#\&ÑÇáéíóú:u';
	//alert(escape(document.forms['frmDatos'].elements[0].value));
	//alert(AjaxGetFormParams('frmDatos'));

