// CLASE GENÉRICA PARA APLICACIONES AJAX (25/08/06)

function Ajax(url,f,loading){

// FUNCIONAMIENTO GENERAL (XML) /////////////////////////////////////////////

	// VARIABLES LOCALES /////////////////////

	var intentos=0;
	var self;
	var indicemodal=0;
	var indicetooltip=0;


	// PROPIEDADES ///////////////////////////
	
	this.xmlDoc = null;
	this.url = url? url : null;
	this.f = f? f: null;
	this.loading = loading? loading : null;
	this.loaderror = null;
	this.running = false;
	this.post = null;
	this.id = Math.random();
	this.nocache = false;
	
	// MÉTODOS ///////////////////////////////
	
	// Iniciamos el objeto
	this.init = function(){	
		if (window.XMLHttpRequest) {
			this.xmlDoc = new XMLHttpRequest();
			this.xmlDoc.onreadystatechange = check;
		} 
		else if (window.ActiveXObject) {			
			this.xmlDoc = new ActiveXObject("Microsoft.XMLHTTP");
			if (this.xmlDoc)
				this.xmlDoc.onreadystatechange = check;
		} 
		else
			alert('Tu navegador no puede soportar el script');
	}
	
	
	// Ejecutamos
	this.run = function(run_url,run_f,run_loading){
		// Si nos llegan  parámetros los recogemos
		this.url = run_url? run_url : this.url;
		this.f = run_f? run_f: this.f;
		this.loading = run_loading? run_loading : this.loading;

		// Iniciamos objeto
		try{
			this.init();
		} catch(e){
			// ActiveX desactivado
			this.showModal('<h3 style="color: red">Aviso importante</h3>Hemos detectado que tu navegador tiene desactivado el uso de controles ActiveX en la configuraci&oacute;n de seguridad, lo que te impedir&aacute; navegar con normalidad por este sitio. Para activarlo, debes seguir los siguiente pasos:<br><br><div style="text-align:left">1- Accede al men&uacute; <strong>Herramientas -> Opciones de Internet</strong>.<br>2- Haz click en la pesta&ntilde;a <strong>Seguridad</strong>.<br>3- Haz click en el bot&oacute;n <strong>Nivel personalizado...</strong><br>4- Dentro del men&uacute; <strong>Controles y complementos de ActiveX</strong>, en la primera opci&oacute;n <strong>Activar la secuencia de comandos de los controles de ActiveX marcados como seguros</strong>, seleccionar la opci&oacute;n <strong>Activar</strong>.<br>5- Pincha en <strong>Aceptar</strong> en las dos ventanas.<br>6- Cuando hayas terminado, haz click en el bot&oacute;n <strong>Actualizar</strong> para volver a cargar la p&aacute;gina.</div><br><br><input type="button" value="Actualizar" onclick="location.reload();">');
			return false;
		}

		this.running = true;
		
		// Función cargando
		if (this.loading!=null)
			if(typeof(self.loading)=='function')
				self.loading();
			else
				eval(self.loading);

			eval(this.loading);
		
		// Prevenimos cacheo con IE
		if (this.nocache){
			if(this.url.indexOf('?')>0)
				this.url+='&ajax-random='+Math.random()
			else
				this.url+='?ajax-random='+Math.random()
		}
		
		// Cargamos la URL
//		try{
			this.xmlDoc.open((this.post==null?'GET':'POST'), this.url, true);
			if(this.post!=null)
				this.xmlDoc.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=ISO-8859-1');
			this.xmlDoc.send(this.post);
			this.post=null;
/*		}
		catch(e){checkerror();}*/
	}	
		
	
	// FUNCIONES PRIVATE ///////////////////////
	
	// Chequeamos el resultado
	function check() {
		if (self.xmlDoc.readyState==4)
			if (self.xmlDoc.status==200){
				self.running = false;
				if(typeof(self.f)=='function')
					self.f();
				else
					eval(self.f);
				intentos = 0;
			}
			else
				checkerror();	
	}


	function checkerror(){
		self.running = false;

		if(self.loaderror!=null)
			if(typeof(self.loaderror)=='function')
				self.loaderror();
			else
				eval(self.loaderror);
		else
			if(intentos < 3){
				if(confirm('Ha ocurrido un error de comunicacion con el servidor. ¿Desea reintentar?')){
					intentos ++;
					self.run();
				}
				else{
					intentos = 0;
					self.errorLabel('ERROR: No se ha podido establecer comunicacion con el servidor.');
				}
			}
			else{
				intentos = 0;
				self.errorLabel('Error de comunicacion con el servidor.\nPor favor, vuelva a intentarlo pasados unos minutos.');
			}
		
		return;
	}






// EFECTOS Y MENSAJES ////////////////////////////////////////////////


	// VARIABLES LOCALES /////////////////////

	var label;
	var modal2Html = '';
	var tooltipTimeout;
	

	// PROPIEDADES ///////////////////////////
	
	this.hideTimeout = 2;
	this.errorTimeout = 5;


	// MÉTODOS ///////////////////////////////
	
	// Mostrar mensaje en etiqueta arriba a la derecha, tipo Google
	this.showLabel = function(msg){
		crearEtiqueta();
		label.style.color = '#000';
		label.style.background = '#FD6';
		label.innerHTML = msg;
		label.style.display = '';
	}


	// Ocultar etiqueta (si se pasa un texto como parámetro se muestra con fondo verde durante 2 segundos)
	this.hideLabel = function(msg){
		if(msg){
			crearEtiqueta();
			label.style.color = '#FFF';
			label.style.background = '#093';
			label.innerHTML = msg;
			setTimeout(function(){if($('_ajax_label')) document.body.removeChild($('_ajax_label'))},this.hideTimeout*1000);
		}
		else 
			if($("_ajax_label")) 
				document.body.removeChild($("_ajax_label"));
	}


	// Ocultar etiqueta mostrando un mensaje con fondo rojo durante 5 segundos
	this.errorLabel = function(msg){
		crearEtiqueta();
		label.style.color = '#FFF';
		label.style.background = '#C30';
		label.innerHTML = msg;
		setTimeout(function(){if($('_ajax_label')) document.body.removeChild($('_ajax_label'))},this.errorTimeout*1000);
	}


	this.showTooltip = function(msg){
		clearTimeout(tooltipTimeout);
		var tt;
		if(!$('_ajax_tooltip_'+this.id)){
			tt = document.createElement('DIV');
			tt.id = '_ajax_tooltip_'+this.id;
			tt.style.position='absolute';
			tt.style.zIndex=1000*indicemodal+1;
			document.body.appendChild(tt);
			document.body.onmousemove=function(e){
				$('_ajax_tooltip_'+self.id).style.top=((e?e:event).clientY+document.body.scrollTop+20)+'px';
				$('_ajax_tooltip_'+self.id).style.left=((e?e:event).clientX+15)+'px';
			}
		}
		else
			tt = $('_ajax_tooltip_'+this.id);
		
		tt.style.left='-2000px';
		tt.style.top='-2000px';
		tt.className='ajax_tooltip_on';
		tt.innerHTML=msg;
		tt.style.display='';
	}
	
	this.hideTooltip = function(msg){
		clearTimeout(tooltipTimeout);
		if($('_ajax_tooltip_'+this.id)){
			if(msg){
				$('_ajax_tooltip_'+this.id).style.display='';
				$('_ajax_tooltip_'+this.id).className='ajax_tooltip_off';
				$('_ajax_tooltip_'+this.id).innerHTML = msg;
				tooltipTimeout=setTimeout(function(){$('_ajax_tooltip_'+self.id).style.display='none';},this.hideTimeout*1000);
			}
			else{
				$('_ajax_tooltip_'+this.id).style.display='none';
			}
		}
	}

	this.errorTooltip = function(msg){
		clearTimeout(tooltipTimeout);
		if($('_ajax_tooltip_'+this.id)){
			$('_ajax_tooltip_'+this.id).style.display='';
			$('_ajax_tooltip_'+this.id).className='ajax_tooltip_error';
			$('_ajax_tooltip_'+this.id).innerHTML = msg;
			tooltipTimeout=setTimeout(function(){$('_ajax_tooltip_'+self.id).style.display='none';},this.errorTimeout*1000);
		}
	}

	// Ventana modal centrada
	this.showModal = function(html,estilo){
		indicemodal++;
		bgTrans();
		var idventana = '_ajax_modalcontent_'+this.id+'_'+indicemodal;
		
		if(!$(idventana)){
			var modalcontent = document.createElement('DIV');
			modalcontent.style.cssText = 'position:absolute; left: 0px; top: 0px; width: 100%; height: 100%; z-index:'+((1000*indicemodal)+1)+';';
			modalcontent.id = idventana;
			document.body.appendChild(modalcontent);
		}
		
		$(idventana).innerHTML = '<table border="0" width="100%" height="100%" align="center"><tr><td align="center"><div class="modalstyle'+(estilo?' '+estilo:'')+'">'+html+'</div></td></tr></table>';
		$(idventana).style.top = getScrollY()+'px';
	}
	
	
	// Ventana modal centrada que carga un iframe con el contenido url con ancho y alto
	this.showModalURL = function(url,ancho,alto,estilo){
		//this.showModal('<img src="/images/icoOcultar.png" class="ifrimg" onclick="ajax.hideModal();" /><iframe name="frame_ajax" width="'+ancho+'" height="'+alto+'" scrolling="auto" src="'+url+'" frameborder="no"></iframe>');
		this.showModal('<img src="/images/icoOcultar.png" class="ifrimg" onclick="ajax.hideModal();" /><iframe name="frame_ajax" width="'+ancho+'" height="'+alto+'" scrolling="no" src="'+url+'" frameborder="no"></iframe>',estilo);
	}	
	

	// Ocultar ventanas modales
	this.hideModal = function(){
		visionCombos('visible','select');
		visionCombos('visible','object');
		
		if($('_ajax_modalcontent_'+this.id+'_'+indicemodal)){
			document.body.removeChild($('_ajax_modalcontent_'+this.id+'_'+indicemodal));
			document.body.removeChild($('_ajax_trans_'+this.id+'_'+indicemodal));
			indicemodal--;
		}else if($('_ajax_modal2_'+this.id+'_'+indicemodal)){
			document.body.removeChild($('_ajax_modal2_'+this.id+'_'+indicemodal));
			document.body.removeChild($('_ajax_trans_'+this.id+'_'+indicemodal));
			indicemodal--;
		}

		if(indicemodal>0 && $('_ajax_modalcontent_'+this.id+'_'+indicemodal))
			$('_ajax_modalcontent_'+this.id+'_'+indicemodal).style.top = getScrollY()+'px';
	}



	// FUNCIONES PRIVATE ///////////////////////

	function crearEtiqueta(){
		if($('_ajax_label'))
			label = $('_ajax_label');
		else{
			label = document.createElement('SPAN');
			label.style.cssText = 'position: absolute; right:0px; padding: 2px 20px 2px 20px; font-family: arial; font-size: 13px; font-weight: bold; z-index: 99';
			
			label.id = '_ajax_label';
			document.body.appendChild(label);
		}

		label.style.top = getScrollY()+'px';
	}


	function bgTrans(){
		if(!$('_ajax_trans_'+self.id+'_'+indicemodal))
		{
			var modal = document.createElement('DIV');
			if(document.all)
				modal.style.filter = 'Alpha(Opacity=80)';
			else
				modal.style.MozOpacity='0.8';
			
				/*
				modal.style.backgroundColor = 'transparent'; 
				modal.style.backgroundImage = 'url(/images/px.gif)';
				modal.style.filter = 'progid:DXImageTransform.Microsoft.AlphaImageLoader (src="/images/px.png", sizingMethod="scale")';
				*/

				/* modal.style.backgroundImage = 'url(/images/px.png)'; */
			
			//modal.style.backgroundColor = self.transBgColor;
			modal.style.position = 'absolute';
			modal.style.height = (document.body.scrollHeight?document.body.scrollHeight:document.documentElement.scrollHeight)+'px';
			modal.style.top = '0px';
			modal.style.left = '0px';
			modal.style.zIndex = 1000*indicemodal;
			modal.style.width = '100%';
			modal.className = 'ajax_trans';
			modal.id = '_ajax_trans_'+self.id+'_'+indicemodal;

			document.body.appendChild(modal);
			visionCombos('hidden','select');
			visionCombos('hidden','object');
		}
	}

	function visionCombos(opcion,etiq){
		if(document.all || etiq=='object'){
			if(indicemodal<=1)
				var arr = document.getElementsByTagName(etiq);
			else
				if($('_ajax_modal2_'+self.id+'_'+(indicemodal-1)))
					var arr = $('_ajax_modal2_'+self.id+'_'+(indicemodal-1)).getElementsByTagName(etiq);
				else
					if($('_ajax_modalcontent_'+self.id+'_'+(indicemodal-1)))
						var arr = $('_ajax_modalcontent_'+self.id+'_'+(indicemodal-1)).getElementsByTagName(etiq);

			for(i = 0; i < arr.length; i++)
				arr[i].style.visibility = opcion;
		}
	}

	
	function getScrollY(){
		var scrollY = 0;
		
		if ( document.body && document.body.scrollTop ){
			scrollY = document.body.scrollTop;
		}else if ( document.documentElement && document.documentElement.scrollTop ){
			scrollY = document.documentElement.scrollTop;
		}else if ( window.pageYOffset ){
			scrollY = window.pageYOffset;
		}else if ( window.scrollY ){
			scrollY = window.scrollY;
		}
		
		return scrollY;
	}
	
	// Necesario para poder instanciar la clase en el onreadystatechange
	self = this;
}

var ajax = new Ajax();