
/* JavaScript Document
// Gestiona documentos XML
// Autor: Enrique Ignacio Vazquez (EIV)
// mail: eivazquez@maat-g.com, ei_Vazquez@hotmail.com
// 18/05/2005
*/
/* Permite gestionar peticiones al servidor
// particularmente realizadas en XML
*/
//------------------------ Inicio ------------------------------------------//
// Permite controlar si se mantienen peticiones ajax activas
var countLoadingRequest = 0;
var countWaitingRequest = 0;

function callServer(p_oDef){
	// Metodos XMLHttpRequest

	this.DocTxt;
	this.DocXml;
	this.controlLoad=0; // controla si realizo un load al servidor devuelve 1 por si

	//--- Intefase se control
	this.onLoad=null; // Funcion controladora que se ejecuta al terminar la lectura
	this.onLoading=null; // Funcion controlador al iniciar la petición
	this.onInteractive=null; // Funcion controlador mientras se recibe petición
	this.onLoaded=null; // Funcion controlador al terminar la petición
	this.onError=null; // Funcion controlador al terminar la petición y con error
	//--------------------------------------------------------------------------------------//
	this.sendValues;

	/**
	* Habilita la detección de jscript en los archivos html peticionados. Default false
	*/
	this.detectScript=false;

	/**
	* Código jscript detectado.
	*/
	this.textScript='';
// Habilita la ejecución de peticiones ajax sin mensaje de espera (background)
this.backgroundLoad = false;

	var me=this;
	var xmlhttp;
	var ret;
	var xmlTXT; // 0 - Retorna XML, 1 - Texto

	if(p_oDef){
		for (_p in p_oDef){
			this[_p]=p_oDef[_p];
		}
	}

	this.loadXMLhttp=function(url,metodo,asc){
		xmlTXT=0;
		xmlHttpLoad(url,metodo,asc);
	}
	this.loadTXThttp=function(url,metodo,asc){
		xmlTXT=1;
		xmlHttpLoad(url,metodo,asc);
	}

	function xmlHttpLoad(url,metodo,asc){
	/*
	metodo: POST, GET , HEAD
	url: Server Side datos
	asc: true o false , si es ascicronico o no
	*/
	// Detección de peticiones ajax activas
	countLoadingRequest++;
	if (!me.backgroundLoad) {
		// si es la primera petición y no se está mostrando mensaje de espera, lo presenta en pantalla
		if ( countWaitingRequest == 0 && ((document.getElementById('defaultDialog') && document.getElementById('defaultDialog').style.display=='none') || !document.getElementById('defaultDialog')))
		{
			try {
				if (G_default_dialog==undefined) { G_default_dialog = new G_simple_dialog(); }
				G_default_dialog.request({title:((GdialogStyle.msgTitle!=undefined)? GdialogStyle.msgTitle : 'Espere un momento por favor'), msg:((GdialogStyle.msgWait!=undefined)? GdialogStyle.msgWait:'Espere un momento por favor'), modal:true});
			} catch(e) {}
		}
		countWaitingRequest++;
	}

	 /* Fix para reutilizar el objeto serverload o callserver */
         _onLoadingHandled = false;
         _onLoadedHandled = false;
         _onInteractiveHandled = false;
         _onLoadHandled = false;
	// Valores por default
		if (metodo==undefined){ metodo="GET";}
		if (asc==undefined){ asc=true;}
		var _sendValues='';
		// Mozilla, etc.
		if (window.XMLHttpRequest){
			  xmlhttp=new XMLHttpRequest()
			 _sendValues=null;
			if(asc){
				xmlhttp.onreadystatechange=state_Change
			};
		}else if (window.ActiveXObject) {
		  //IE
		  try {
				xmlhttp= new ActiveXObject("Msxml2.XMLHTTP");
			} catch (e) {
				try {
					xmlhttp= new ActiveXObject("Microsoft.XMLHTTP");
				} catch (e) {
					xmlhttp= null;
				}
			}
		}

		if (xmlhttp){
			try{
				xmlhttp.onreadystatechange=state_Change
			} catch (e) {
				try {
					xmlhttp= new ActiveXObject("Microsoft.XMLHTTP");
					xmlhttp.onreadystatechange=state_Change
				} catch (e) {
					xmlhttp= null;
				}
			}
		}

		if (xmlhttp){
			xmlhttp.open(metodo,url,asc);
			xmlhttp.setRequestHeader('P3P','CP=\"CAO PSA OUR\"');
			xmlhttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
			if (me.sendValues==undefined){
				xmlhttp.send(_sendValues);
			}else{
				xmlhttp.send( me.sendValues);
			}
			if(!asc){
				/* Arreglo false para ff */
				if (window.XMLHttpRequest){
					state_Change();
				};
			};
		}
	  return ret;
	}

	function state_Change(){
		me.controlLoad=1;
		if (xmlhttp.readyState==1)     { _onLoading();}
		else if (xmlhttp.readyState==2){ _onLoaded();}
		else if (xmlhttp.readyState==3){ _onInteractive();}
		else if (xmlhttp.readyState==4){ _onLoad();}

	};

//------------------------------------ Manager readyState==1-----------------------------//
	var _onLoadingHandled = false;
	function _onLoading(){
		//alert("_onLoading");
		if (_onLoadingHandled) {return;}
		if (typeof(me.onLoading)=="function"){
			try{
				me.onLoading(me);
			}catch (e){
				alert('User Function onLoading -> ' +(e.message)?e.message:e.description);
			}
		}
		_onLoadingHandled=true;
	};

//----------------------------------------------------------------------------------------------//

//------------------------------------ Manager readyState==2-----------------------------//
	var _onLoadedHandled = false;
	function _onLoaded(){
		//alert("_onLoaded");
		if (_onLoadingHandled) {return;}
		if (typeof(me.onLoaded)=="function"){
			try {
				me.onLoaded(me);
			}catch (e){
				alert('User Function onLoaded -> ' +(e.message)?e.message:e.description);
			}
		}
		_onLoadedHandled=true;
	};

//----------------------------------------------------------------------------------------------//

//------------------------------------ Manager readyState==3-----------------------------//
	var _onInteractiveHandled = false;
	function _onInteractive(){
		//alert("_onInteractive");
		if (_onInteractiveHandled) {return;}
		if (typeof(me.onInteractive)=="function"){
			try {
				me.onInteractive();
			}catch (e){
				alert('User Function onInteractive -> ' +(e.message)?e.message:e.description);
			}
		}
		_onInteractiveHandled=true;
	};

//----------------------------------------------------------------------------------------------//

//------------------------------------ Manager readyState==4-----------------------------//
	var _onLoadHandled = false;
	function _onLoad(){
		//alert("_onLoad");
		if (_onLoadHandled) {return;}
		try{
			if (xmlhttp.status==200){
				ret=true;
				if(xmlTXT==0) {
					me.DocXml=xmlhttp.responseXML;
				}else{
					var _aux=xmlhttp.responseText
					if (me.detectScript){
						me.textScript='';
						_aux=_aux.replace(/\/\*.[^\*\/]*\*\//g,""); // Quitando comentarios
						var re =new RegExp(/<script>[\{\}a-zA-Z0-9,_.=+;:!><()\/'"\-\*\?\s\&\[\]%#$]+<\/script>/);
						while (_aux.search(re)>-1){
							var _script_found=RegExp.lastMatch;
							var _script=_script_found;
							_script=_script.replace(/<script>|<\/script>/ig,'');
							G_generate_code(_script);
							//eval(_script);
							_aux=_aux.replace(_script_found,'');
							me.textScript=me.textScript + _script_found;
						}
					}
					me.DocTxt=_aux
				}
				if (typeof(me.onLoad)=="function"){
					try {
						me.onLoad(true);
					}catch (e){
						alert('User Function onLoad -> ' +(e.message)?e.message:e.description);
					}
				}
			}else{
				ret=false;
				if (typeof(me.onError)=="function"){
					me.onError(xmlhttp.statusText);
				}else{
					alert("Problemas al recibir datos:" + xmlhttp.statusText);
				}
			}
			// Actualizar el control de peticiones ajax activas
			countLoadingRequest--;
			if (!me.backgroundLoad) {
				countWaitingRequest--;
				// si es la última petición y se está mostrando mensaje de espera, lo oculta
				//if ( countWaitingRequest == 0 && document.getElementById('defaultDialog') && document.getElementById('defaultDialog').style.display!='none')
				if ( countWaitingRequest == 0 )
				{
					try { G_default_dialog.hide(); } catch(e) {}
				}
			}

		}catch (e){
			if (navigator.appName == "Netscape"){
				msg=e.message;
			}else{
				msg=e.description;
			}
			alert("Error: " + msg );
		}
		_onLoadHandled=true;
	};
//------------------------------------------------------------------//
// -------------------------     Funciones de Recarda de Objetos Form -----------------------------------//
	this.isNull=function(valor,retorno){
		if ((valor==null) || (valor=='null')){
			return retorno;
		}else{
			return valor;
		};
	};
	this.xmlToArray=function(listaFields){
	// listaFields : lista de campos
	// Devuelve un objeto con "n" array cuyo contenido es el texto de los tag listaFieds
		var ret=new Object();
		var f_array=listaFields.split(",");
		for (var i=0; i<f_array.length; i++){
			var _nTag=f_array[i];
			var _nField=f_array[i].replace('.','_');
			var _nodes=me.getCampo(_nTag);
			var _sconcat='';
			if (_nodes.length>0){
				for (var j=0; j <_nodes.length; j++){
					var v='';
					if (_nodes[j].hasChildNodes()){
						v=_nodes[j].firstChild.nodeValue;
					};
					_sconcat=_sconcat + v + "|";
				};
				_sconcat=_sconcat.substr(0,_sconcat.length -1);
				var _str="ret." + _nField +"=_sconcat.split('|');";
				eval(_str);
			};
		};
		return ret;
	};

	this.xmlToCombo=function (IdCombo,fieldTexto, fieldValor, inicio){
			// Recarga un comboBox = select
			/* recibe
			IdCombo= id del objeto
			campo= nombre del campo que se rellena
			*/
			try {
			var myCombo=document.getElementById(IdCombo);
			if (inicio==undefined){ inicio=0;}
			myCombo.options.length=inicio;
			aTexto=me.getCampo(fieldTexto);
			aValor=me.getCampo(fieldValor);
				for(i=0; i<aTexto.length; i++){
					myCombo.options.add(new Option(me.isNull(me.getValue(fieldTexto,i),""),me.isNull(me.getValue(fieldValor,i),"")))
				}
			} catch (e) {
				//alert("Error en xmlToCombo -> IdCombo,fieldTexto, fieldValor");
			};
		}

	this.xmlToObj=function (IdObj,campo,i){
			// Carga valor dea un TextField
			if(i== undefined){i=0;}
			try {
				var myObj=document.getElementById(IdObj);
				var aCampo=me.getCampo(campo);

				myObj.value =aCampo[i].firstChild.nodeValue;
			} catch (e) {
				alert ("Error en xmlToObj-> IdObj:" +IdObj + " ,campo: " + campo);
			}
		}; // End xmlToObj

    this.xmlToAllObjPrefix=function (listaFields,i,iF, Prefix ){
		// Implementa xmlToAllObj
		// la única diferencia  es que todos los objetos dl form tienen un prefijo
		// Prefix = prefijo


		if(i== undefined){i=0;}
		if(iF== undefined){iF=0;}
		if(Prefix== undefined){Prefix='';}
		if(listaFields== undefined){
		// se construiran en funcion de los objetos del formulario

		}
		var listaNodos=listaFields;
		var s;
		var newLista='';
		var f_array=listaFields.split(",");

		// armo la lista de nombres de objetos con el prefijo adelante
		for (s=0;s< f_array.length;s++){
			newLista= newLista + Prefix + f_array[s] + ',';
		}
		newLista= newLista.substring(0, newLista.length -1 ); // descarto ultima coma
		this.xmlToAllObj(newLista,i,iF,listaNodos);
	}; // End xmlToAllObjPrefix

	this.xmlToAllObj=function (listaFields,i,iF, listaNodos ){
		// listaFields = lista de Id's de los objetos de formularios a rellenar
		// i = optional Indice por default es el cero
		// iF = index de formulario cero por default
		// listaNodos= nombre de los nodos, Opcional si viene este parametro indica que se debe mapear,
		//             por que los nombres de los Objetos del form , no coinciden con los nombres de Nodos
		var f_array, n_array;
		//Valores por default
		if(i== undefined){i=0;}
		if(iF== undefined){iF=0;}
		if(listaFields== undefined){
			// se construiran en funcion de los objetos del formulario
		}else{
			f_array=listaFields.split(",")
		}
		if (listaNodos==undefined){
			// No vino el parametro , tomo la misma lista de Objetos
			n_array=listaFields.split(",")
		}else {
			n_array=listaNodos.split(",")
		}
		try{
			var s;
			// carga uno a uno los objetos de la lista
			for (s=0;s< f_array.length;s++){
			    //             idObjeto  ,Nodo     , Indice
				this.xmlToObj(f_array[s],n_array[s],i);
			}
		} catch (e) {
			alert ("Error en xmlToAllObj-> no se pudo definir Matriz de Objetos");
		}
	}; // End xmlToAllObj

	this.getCampo=function (campo){
		//Devuelve el Nodo Campo
			var aResp;
			try {
				aResp=me.DocXml.getElementsByTagName(campo);
			} catch (e) {
				alert("Error en getCampo-> No se ha encontrado el Campo");
			}

			return aResp;
		}

	this.getValue=function(campo,i){
	// retorna el valor especifico de un Nodo texto
	// campo : Obligatorio
	// indice a recuperar : Obligatorio

		var _node;
		var _text=null;

		_node=me.getCampo(campo)[i];
		try{
			var _nodeType=_node.firstChild.nodeType;
			if ((_nodeType==3) || (_nodeType==4)){
				_text=_node.firstChild.nodeValue;
			}
		} catch (e){
			//alert("No existe el Subíndice: " + e.description);

		};
		return _text

	}
	this.setBackgroundLoad = function (mode)
	// Permite configurar el modo de carga background=true para las peticiones invisibles, false para las habituales (con mensaje de espera)
	{
		me.backgroundLoad = mode;
	}
	//
}; // Fin CallServer


function G_generate_code(p_script,p_fn_callback){
	if (p_script){
		var slScript = document.createElement('script');
		slScript.type = "text/javascript";
		slScript.text=  p_script;
		slScript.language= "Javascript";
		if (p_fn_callback){
			if (navigator.appName == "Netscape"){
				slScript.onload=function(){
					p_fn_callback();
				}
			}else{
				slScript.onreadystatechange= function(){
					if (slScript.readyState == 'loaded') {
						p_fn_callback();
					}
				};
			}
		}
		document.getElementsByTagName('head')[0].appendChild(slScript);
	}
}

function isLoadingRequest() {
	// retorna true si actualmente hay peticiones ajax en ejecución
	return (countLoadingRequest>0 || (window.opener && window.opener.countLoadingRequest>0));
}

// ---------------------------- Esto es todo ------------------------------------- //
