/* Funciones basicas AJAX */

/*
 * Modificaciones:
 *  
 *  22-10-2009: Añadimos el control de posicionamiento para los elementos por separado del pc y la web
 *  
 * 	24-06-2009: Añadimos control al ajax para evitar más de una llamada al mismo tiempo
 * 
 */


//Variable de control de uso de obtencion de datos para evitar el uso compartido
var obteniendo_datos=false;

function nuevoAjax()
{
	if(navigator.userAgent.indexOf('MSIE')>=0) navegador=0; // IE
	else navegador=1; // Demas
	
	var xmlhttp=false;
	try
	{
		// Creacion del objeto AJAX para navegadores no IE
		xmlhttp=new ActiveXObject('Msxml2.XMLHTTP');
	}
	catch(e)
	{
		try
		{
			// Creacion del objeto AJAX para IE
			xmlhttp=new ActiveXObject('Microsoft.XMLHTTP');
		}
		catch(E) { xmlhttp=false; }
	}
	if (!xmlhttp && typeof XMLHttpRequest!='undefined') { xmlhttp=new XMLHttpRequest(); }

	return xmlhttp;
}

function traeCodigo(phpdestino,datos,divdestino)
{
	//Si ya estamos obteniendo datos que demore la llamada
	if(obteniendo_datos==true)
	{
		setTimeout('traeCodigo("'+phpdestino+'","'+datos+'","'+divdestino+'")', 500);
		
	}else
	{	
		//Lanzamos la llamada si tenemos la cola vacia
		obteniendo_datos=true;
		
		//Destino por defecto para el cuerpo para detectar cuando se carga un modulo para la barra de estado
		var destino_pordefecto_pc='cuerpo_body_superior_01';
		var destino_pordefecto_web='div_cuerpo';
		//Destino de la barra de estado para actualizar la posicion del modulo actual
		var destino_barraestado='cuerpo_bdireccion_superior_01';
		//Destino de la barra de navegación
		var destino_barranavegacion;
		//Declaración necesaria para evitar errores en IE6
		destino_barranavegacion='div_cabecera_menu_flotante_navegacion';
			
		//Variables de control del navegador
		// navigator.appName
		// navigator.appVersion
		// navigator.userAgent
		// this.dataBrowser
		
		//Limpiamos el div destino de la carga
		//document.getElementById(divdestino).innerHTML = '';
		
		//Cargando
		idTimer=mostrarCargando();
		
		//Ajax
		ajax=nuevoAjax();
		ajax.open('POST', phpdestino, false);
		ajax.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		if(datos=='undefined') { datos=null };
		//Añadimos como parametro estandar para todos los casos el destino de los datos a mostrar
		datos+='&div_destino_web='+divdestino;
		ajax.send(datos);
		
		//Comprobamos si existe el div destino
		if(document.getElementById(divdestino))
		{
			ajax.onreadystatechange=new function()
			{
				if (ajax.readyState==4)
				{
					//XML?
					if(ajax.responseText.substring(0,5) != '<?xml' || ajax.getResponseHeader('Content-Type').indexOf('text/xml') < 0)
					{
						alert('Error en el contenido: \\r\\n'+ajax.responseText.substring(0,250));
						dd = document.getElementById(divdestino);
						if(dd) dd.innerHTML = ajax.responseText;
					}else
					{
						//XML
						var resp=ajax.responseXML;
						
						var javascript=resp.getElementsByTagName('javascript')[0].childNodes[0].data;
						var css=resp.getElementsByTagName('css')[0].childNodes[0].data;
						var html=resp.getElementsByTagName('html')[0].childNodes[0].data;
						
						//CSS
						try
						{
							addCss(css, divdestino);
						}catch(e){ }
						
						//HTML
						dd = document.getElementById(divdestino);
						dd.innerHTML = html;
						
						//JS
						try
						{
							addJs(javascript, divdestino);
						}catch(e){ }
					}
				}
			}
		}
		
		//Liberamos para dejar que siga corriendo el ajax
		obteniendo_datos=false;
		
		//Limpiamos la ventana de carga
		try{
			eliminarCargando(idTimer);
		}catch(err)
		{}
		
		//SI tenemos que el div destino es el del cuerpo por defecto pedimos tambien los datos necesarios para actualizar la barra de direccion
		if(divdestino==destino_pordefecto_pc)
		{
			//Para obtener unicamente el nombre del modulo que estamos cargando dividimos la cadena con '/' y obtenemos el ultimo
			var ele=phpdestino.split('/');
			traeCodigo('funciones/barra_estado.pc.php', 'accion=obtener_datos_modulo&modulo='+ele[ele.length-1], destino_barraestado);
		}
		
		//Vamos a ese elemento WEB
		if(returnObjById(divdestino)!=null) { posicionar(divdestino, destino_pordefecto_web); }
		
		//Vamos a ese elemento PC
		//if(returnObjById(divdestino)!=null) { posicionar(divdestino, destino_pordefecto_pc); }
		
		//Montamos la navegacion si tenemos div de navegación válido
		if(returnObjById(destino_barranavegacion)!=null) { navegacionMostrar(phpdestino,datos,divdestino); }
	}
}

function addCss(cssCode, nombre) {
	myObj = document.getElementById('css '+nombre);
	//CSS
	var styleElement = document.createElement('style');
	styleElement.setAttribute('id', 'css '+nombre);
	styleElement.type = 'text/css';
	if (styleElement.styleSheet) 
	{
		styleElement.styleSheet.cssText = cssCode;
	} else 
	{
		styleElement.appendChild(document.createTextNode(cssCode));
	}
	
	try{
		document.getElementsByTagName('head')[0].replaceChild(styleElement, myObj);
	}catch(e)
	{
		document.getElementsByTagName('head')[0].appendChild(styleElement);
	}
}

function addJs(jsCode, nombre) {
	myObj = document.getElementById('js '+nombre);
	// JS
	var etiquetaScript=document.createElement('script');
	etiquetaScript.setAttribute('id', 'js '+nombre);
	
	document.getElementsByTagName('head')[0].appendChild(etiquetaScript);
	etiquetaScript.text = jsCode;
	try{
		document.getElementsByTagName('head')[0].replaceChild(etiquetaScript, myObj);
	}catch(e)
	{ 
		document.getElementsByTagName('head')[0].appendChild(etiquetaScript);
	}
}

function posicionar(divdestino, destino_pordefecto)
{
	//Hacemos un intento de posicionar el navegador en el elemento de destino
	try{
		if(divdestino==destino_pordefecto)
		{
			var pos_actual=document.getElementById(divdestino).offsetTop;
			document.scrollTop = pos_actual;
		}
	}catch(e)
	{
		//Sin control de errores
	}
}
