/*--------------------------------------------------|
| Objeto Ajax v1.5 | www.userit.net                 |
|---------------------------------------------------|
| Copyright (c) 2005 Ruben Sanchez                  |
|                                                   |
| This script can be used freely as long as all     |
| copyright messages are intact.                    |
|                                                   |
| Created: 14.12.2005                               |
| Updated: 07.07.2006                               |
|--------------------------------------------------*/

function _ajax(pagina){

	this.pagina = pagina;
	this.metodo = "POST";
	this.asinc  = true;
	this.parametros = new Array;
	this.URL="";
	this.error=false;
	this.procesado=false;
	this.retorno="";
	this.respuesta="";
	this.respuestaXML="";

	function replaceAll(oldStr,findStr,repStr) {
		var srchNdx = 0;
		var newStr = "";
		try{
		while (oldStr.indexOf(findStr,srchNdx) != -1)
		{ newStr += oldStr.substring(srchNdx,oldStr.indexOf(findStr,srchNdx));
		newStr += repStr;
		srchNdx = (oldStr.indexOf(findStr,srchNdx) + findStr.length);
		}
		newStr += oldStr.substring(srchNdx,oldStr.length);
		}catch(exception){;}
		return newStr;
	}


	this.crear = function() {

		try {
			this.xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (exception) {
			try {
				this.xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (exception) {
				this.xmlhttp = null;
			}
		}
		if(!this.xmlhttp && typeof XMLHttpRequest != "undefined")
		this.xmlhttp = new XMLHttpRequest();
		if (!this.xmlhttp){
			this.error = true;
		}


	}

	this.pon_param = function(nombre, valor){
		//alert("pon_param "+nombre+" "+valor);
		var i = 0;		
		
		if (valor==null) { valor ="";}
		
			if ( valor.constructor == Array) {
				if (valor.length==0) {
					valor="";
				}else{
					valor_length = valor.length;
					for(i=0;i<valor_length;i++){
						if ((valor[i]!=null)&&(isNaN(valor[i]))) {
							//valor[i] = replaceAll(valor[i],"+","%2B");
							if ( valor[i].constructor == Array) {
								valor_length2 = valor[i].length;
								for(ii=0;ii<valor_length2;ii++){
									if (typeof valor[i][ii] == 'boolean') {
										if (valor[i][ii]) {valor[i][ii]=1;} else {valor[i][ii]=0;}
									}
									
									valor[i][ii] = replaceAll(valor[i][ii],"+","%2B");
								}
								;//valor[i] = "vector";
							}else{
								if (typeof valor[i] == 'boolean') {
									if (valor[i]) {valor[i]=1;} else {valor[i]=0;}
								}
								
								valor[i] = replaceAll(valor[i],"+","%2B");
							}
						}else{
							//if (valor[i]==null) alert(this.lee_param("funcion")+">"+nombre+"["+i+"]");
						}
					}
				}
			}else{
				if ((valor!=null)&&(isNaN(valor))) {
					if (typeof valor == 'boolean') {
						if (valor) {valor=1;} else {valor=0;} 
					}
					valor = escape(valor);
					valor = replaceAll(valor,"+","%2B");
				}else{
					if (typeof valor == 'boolean') {
						if (valor) {valor=1;} else {valor=0;} 
					}
					//if (valor==null) alert(this.lee_param("funcion")+">"+nombre);
				}
			}
		
		this.parametros[nombre]= valor;

	}

	this.carga_form = function(formulario,cargar_desac) {
		//alert(formulario);

		if (typeof formulario == 'object') {
			this.carga_form_objeto(formulario,cargar_desac);
		}
		else {
			this.carga_form_nombre(formulario,cargar_desac);
		}

	}

	this.carga_form_nombre = function(formulario,cargar_desac) {
	
		if (cargar_desac==null) { var cargar_desac = false;}
		
		var i =0;
		var len = document.forms[formulario].length;
		
		for (i=0;i<len;i++) {
			var elemento = document.forms[formulario].elements[i];
			var nombre   = elemento.name;
			var valor    = elemento.value;
			var desac    = elemento.disabled;
			var sel      = elemento.checked;
			var tipo     = elemento.type;

			//valor = escape(valor);
			//valor = replaceAll(valor,"+","%2B");
			
			//alert(tipo+"-"+nombre+"=>"+valor+" - " + desac);


			if ((!desac)||(cargar_desac)||(tipo=="select-one")) {
				if ((tipo=="checkbox")) {
					if (sel) {
						this.pon_param(nombre,valor);
					}
					else {
						this.pon_param(nombre,"");
					}
				}
				else {
					this.pon_param(nombre,valor);
				}
			}
		}


	}

	this.carga_form_objeto = function(formulario,cargar_desac) {
	
		if (cargar_desac==null) { var cargar_desac = false;}
		
		var i = 0;
		var len = formulario.length;
		
		for (i=0;i<len;i++) {
			var elemento = formulario.elements[i];
			var nombre   = elemento.name;
			var valor    = elemento.value;
			var desac    = elemento.disabled;
			var sel      = elemento.checked;
			var tipo     = elemento.type;

			//valor = escape(valor);
			//valor = replaceAll(valor,"+","%2B");

			//alert(tipo+"-"+nombre+"=>"+valor+" - " + desac);
			if ((!desac)||(cargar_desac)||(tipo=="select-one")) {
				if ((tipo=="checkbox")) {

					if (sel) {
						this.pon_param(nombre,valor);
					}
					else {
						this.pon_param(nombre,"");
					}
				}
				else {
					this.pon_param(nombre,valor);
				}
			}
		}


	}
	this.carga_contenedor = function(contenedor,cargar_desac) {
				
		if (typeof contenedor != 'object') {
			var contenedor = document.getElementById(contenedor);
		}
		
		var tipos = new Array ("input", "select", "select-one", "checkbox");
		
		for (var j=0; j < tipos.length; j++) {
			
			var elementos = contenedor.getElementsByTagName(tipos[j]);
			var len = elementos.length;
			
			for (var i = 0; i < len; i++) {
				var elemento = elementos[i];
	        	var nombre   = elemento.name;
				var valor    = elemento.value;
				var desac    = elemento.disabled;
				var sel      = elemento.checked;
				var tipo     = elemento.type;
	
				//valor = escape(valor);
				//valor = replaceAll(valor,"+","%2B");
	
				//alert(nombre+"=>"+valor+" - " + desac);
				if ((!desac)||(cargar_desac)||(tipo=="select-one")) {
					if ((tipo=="checkbox")) {
	
						if (sel) {
							this.pon_param(nombre,valor);
						}
						else {
							this.pon_param(nombre,"");
						}
					}
					else {
						this.pon_param(nombre,valor);
					}
				}
	    	}
		}
		
		
	
	}
	
	

	this.lee_param = function(nombre){
		return this.parametros[nombre];
	}

	this.generaURL = function () {

		var coma=""; var j = 0;
		this.URL="";
		for ( nombre in this.parametros ) {
			valor = this.parametros[nombre]
			if ( valor.constructor == Array) {
				for (j=0;j<valor.length;j++) {
					this.URL = this.URL+coma+nombre+"[]="+valor[j];
					coma="&";
				}
			}
			else {
				this.URL = this.URL+coma+nombre+"="+valor;
				coma="&";
			}
		}
		return this.URL;
	}

	this.ejecutar = function (retorno) {

		if (this.xmlhttp) {
			var self = this;

			if (retorno!=null) {

				this.retorno = retorno;
			}
			
			// resolve (Infinito), connect (60 seg)  send (30 seg), receive (30 seg) in milliseconds 
			//this.xmlhttp.setTimeouts(-1, 10000, 5000, 5000); 
			
			this.procesado = false;	
			if (this.metodo == "GET") {
				this.xmlhttp.open(this.metodo, this.pagina + "?" + this.generaURL(), this.asinc);
			} else {
				this.xmlhttp.open(this.metodo, this.pagina, this.asinc);

				try {
					this.xmlhttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded')
				} catch (exception) {}


			}

			this.xmlhttp.onreadystatechange = function() {

				if(self.xmlhttp.readyState == 4){
					if (self.xmlhttp.status == 200) {
						try {
							self.respuesta = self.xmlhttp.responseText;
							self.respuestaXML = self.xmlhttp.responseXML;
						}
						catch(e){}
						//if (self.retorno!=null) {
						if ((self.retorno!=null)&&(self.retorno!="")) {
							if ((self.respuestaXML==null)||(self.respuestaXML.xml=="")){
								if (self.respuesta=="#CERRAR_SESION#") {cerrar_sesion();return true;}
								callfunc(self.retorno,self.respuesta,"TEXT");
							}else{

								callfunc(self.retorno,self.respuestaXML,"XML");
							}
						}
						else {
							if (self.respuesta=="#CERRAR_SESION#") {cerrar_sesion();return true;}
								
							//Si no hay indicado retorno y la respuesta es un XML
							if ((self.respuestaXML!=null)&&(self.respuestaXML.xml!="")){
								//Anyadido por error en pocket pc
								if (self.procesado) { return;}								
								self.procesado = true;		
								
								procesar_XML(self.respuestaXML,"XML");																
							}
							else {

								if (self.respuesta=="") {
									//alert("No hay respuesta");
								}
								else {
									alert("Respuesta no esperada:\n"+self.respuesta);
								}

							}



						}
					}
					else if (self.xmlhttp.status==404) {
						alert("No existe esta URL: "+self.pagina + "?" + self.generaURL())
						
					}
					else {
						switch (self.xmlhttp.status) {
							case 12029:
							case 12031:
							msj_aux = "Error conexion de red";
							break;
							
							default:
							msj_aux = "Error peticion ajax: "+self.xmlhttp.status;
							break;
						}
						//alert(msj_aux);
						self.ejecutar(retorno);
						return false;
						/*
						//ventana=window.open(self.pagina+self.generaURL(),"_debugger","fullscreen=no,channelmode=no,toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,width=490,height=571,top=0,left=0",false);
						try {
						var ventana=window.open("about:blank","_debugger","fullscreen=no,channelmode=no,toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,width=490,height=571,top=0,left=0",false);
						ventana.document.body.innerHTML=self.respuesta;
						ventana.focus();
						ventana=null;
						}catch(e) {}
						*/
					}
					self.destruir();
				}
			}
			
			
			if (this.metodo == "GET") {
				this.xmlhttp.send(null);
			}
			else {
				this.xmlhttp.send(this.generaURL());
			}

			

		}
	}
	
		
	this.destruir = function () {

		this.pagina = null;
		this.metodo = null;
		this.asinc  = null;
		this.parametros=null;
		this.URL=null;
		this.error=null;
		this.retorno=null;
		this.xmlhttp=null;
		this.respuesta="";
		this.respuestaXML="";
	}

	this.crear();



	this.ejecutar_debug = function (retorno) {
		if (this.xmlhttp) {
			
			var self = this;
			if (retorno!=null) {
				this.retorno = retorno;
			}

			ruta="http://192.168.3.3/Gubed/ServerScripts/StartSession.php";
			//?gbdScript="+this.pagina+"?"+this.generaURL();//URLEncode(this.pagina+"?"+this.generaURL());
			
			//ven_nueva=window.open("");
			//ven_nueva.document.write(ruta)
			
			
			if (this.metodo == "GET") {
				this.xmlhttp.open(this.metodo, ruta+"?gbdScript="+URLEncode(this.pagina+"?"+this.generaURL()), this.asinc);
			} else {
				this.xmlhttp.open(this.metodo, ruta, this.asinc);
				try {
					this.xmlhttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded')
				} catch (exception) {}
			}
			
			this.xmlhttp.onreadystatechange = function() {
				if(self.xmlhttp.readyState == 4){
					if (self.xmlhttp.status == 200) {
						try {
							self.respuesta = self.xmlhttp.responseText;
							self.respuestaXML = self.xmlhttp.responseXML;
						} catch(e){}
						//if (self.retorno!=null) {
						if ((self.retorno!=null)&&(self.retorno!="")) {
							if ((self.respuestaXML==null)||(self.respuestaXML.xml=="")){
								if (self.respuesta=="#CERRAR_SESION#") {cerrar_sesion();return true;}
								callfunc(self.retorno,self.respuesta,"TEXT");
							} else {
								callfunc(self.retorno,self.respuestaXML,"XML");
							}
						} else {
							if (self.respuesta=="#CERRAR_SESION#") {cerrar_sesion();return true;}
							//Si no hay indicado retorno y la respuesta es un XML
							if ((self.respuestaXML!=null)&&(self.respuestaXML.xml!="")){
								procesar_XML(self.respuestaXML,"XML");
							} else {
								if (self.respuesta=="") {
									//alert("No hay respuesta");
								} else {
									//alert("Respuesta no esperada:\n"+self.respuesta);
								}
							}
						}
					} else if (self.xmlhttp.status==404) {
						alert("No existe esta URL: "+self.pagina + "?" + self.generaURL())
					} else {
						//alert("Error peticion ajax--: "+self.xmlhttp.status);

					}
					self.destruir();
				}
			}
			if (this.metodo == "GET") {
				this.xmlhttp.send(null);
			}else {
				this.xmlhttp.send("gbdScript="+URLEncode(this.pagina+"?"+this.generaURL()));
			}
		}
	}
}

function callfunc(name,param,param2) {
	if (typeof(window[name])=="function") {
		window[name](param,param2);
	}
}

function cerrar_sesion() {

	top.location = ruta_raiz_logica+"top.htm";

}

function procesar_XML(datos, tipo) {

	if (tipo=="XML"){
			
		try {
			var elems = datos.childNodes.item(1).childNodes;
		}
		catch(e) {
			var raiz = datos.getElementsByTagName('respuesta');
			var elems = raiz[0].childNodes;
		}
					
		var nom = ""; 
		var mensajep = "";
		var accion_ajax = "";
		var nom_funcion = "";
		var v_param = "";
		var dato = "";
		var valor = "";
		
		//alert('XML');
		
		var num = 0;
		
		for(var i = 0;i < elems.length; i++){
			if ((elems.item(i).nodeType!=3)&&(elems.item(i).nodeType!=8)) {
				nom=elems.item(i).nodeName;
				switch (elems.item(i).nodeName){
					case "mensaje":
					mensajep = elems.item(i).firstChild.data;
					mensajep=(mensajep);
					alert(mensajep);
					break;

					case "accion":
					accion_ajax = elems.item(i).firstChild.data;

					if (accion_ajax!="") {
						try {
							eval(accion_ajax);
						}catch(exception){}
					}
					break;

					case "funcion":

					nom_funcion = elems.item(i).childNodes.item(0).firstChild.data;
					v_param  = elems.item(i).childNodes.item(1).childNodes;

					accion_ajax = nom_funcion + "(";
					
					var coma_param = "";					
					for(var j = 0; j < v_param.length; j++){
						dato = v_param.item(j).childNodes.item(0).childNodes;
						
						if (dato.length==0) {
							//Es un valor
							valor = v_param.item(j).firstChild.data;
							
							if (valor!=undefined) {								
								accion_ajax = accion_ajax + coma_param + "'"+valor+"'";
							}
							else {								
								accion_ajax = accion_ajax + coma_param + "''";
							}
							
							coma_param = ",";
						} else {							
							
							//Es un array
							accion_ajax = accion_ajax + coma_param + "[";
							var coma_vector="";

							for(var k = 0; k < dato.length; k++){
								var clave = dato.item(k).childNodes.item(0).firstChild.data;
								var valor = dato.item(k).childNodes.item(1).firstChild.data;

								accion_ajax = accion_ajax + coma_vector + "'"+valor+"'";

								coma_vector = ",";
							}
							accion_ajax = accion_ajax + "]";
							coma_param = ",";
						}
					}
					accion_ajax = accion_ajax + ");";
					//alert(accion_ajax);
					try {
						eval(accion_ajax);
					}catch(exception){}
					break;

					case "html":
					try {
						var elemento = elems.item(i).childNodes.item(0).firstChild.data;
						var contenido = elems.item(i).childNodes.item(1).firstChild.data;
					} catch(e) {
						var elemento  = datos.getElementsByTagName('elemento').item(0).firstChild.data;
						var contenido = datos.getElementsByTagName('contenido').item(0).firstChild.data;
					}

					document.getElementById(elemento).innerHTML=contenido;

					break;

					default :
					//Opcion incorrecta
					try {
						alert("Respuesta con formato incorrecto:\n"+datos.xml);
					}catch(exception){}
					break;
				}
			}
		}

	}
	else {

		if (datos=="") {
			alert("No hay respuesta");
		}
		else {
			alert("Respuesta con formato incorrecto:\n"+datos);
		}

	}
}


function URLEncode(plaintext) {
	// The Javascript escape and unescape functions do not correspond
	// with what browsers actually do...
	var SAFECHARS = "0123456789" +					// Numeric
	"ABCDEFGHIJKLMNOPQRSTUVWXYZ" +	// Alphabetic
	"abcdefghijklmnopqrstuvwxyz" +
	"-_.!~*'()";					// RFC2396 Mark characters
	var HEX = "0123456789ABCDEF";

	//var plaintext = document.URLForm.F1.value;
	var encoded = "";
	for (var i = 0; i < plaintext.length; i++ ) {
		var ch = plaintext.charAt(i);
		if (ch == " ") {
			encoded += "+";				// x-www-urlencoded, rather than %20
		} else if (SAFECHARS.indexOf(ch) != -1) {
			encoded += ch;
		} else {
			var charCode = ch.charCodeAt(0);
			if (charCode > 255) {
				alert( "Unicode Character '"
				+ ch
				+ "' cannot be encoded using standard URL encoding.\n" +
				"(URL encoding only supports 8-bit characters.)\n" +
				"A space (+) will be substituted." );
				encoded += "+";
			} else {
				encoded += "%";
				encoded += HEX.charAt((charCode >> 4) & 0xF);
				encoded += HEX.charAt(charCode & 0xF);
			}
		}
	} // for

	return encoded;
	//document.URLForm.F2.value = encoded;
	//return false;
}