//Crear un Registro de variables dinamicas
var objetosCargados="";
//Funcion para cargar javascript

function loadJS(){
	//Comprueba que puedo buscar
	if (!document.getElementById)
		return;
	//Para cada objeto de la lista de argumentos, añadir.
	for (i=0; i<arguments.length; i++){
		var documento=arguments[i];
		var archivo="";
		//Comprobar que no lo hemos añadido
		if (objetosCargados.indexOf(documento)==-1){ 
			if (documento.indexOf(".js")!=-1){ 
				//Si es un javascript
				archivo=document.createElement('script');
				archivo.setAttribute("type","text/javascript");
				archivo.setAttribute("src", documento);
			}
			else if (documento.indexOf(".css")!=-1){ 
				//si es un CSS
				archivo=document.createElement("link");
				archivo.setAttribute("rel", "stylesheet");
				archivo.setAttribute("type", "text/css");
				archivo.setAttribute("href", documento);
			}
		}
		//Si se agrega el archivo...
		if (archivo!=""){
			document.getElementsByTagName("head").item(0).appendChild(archivo);
			//Lo añade a la lista de objetos agregados
//			objetosCargados+=documento+" "; 
		}
	}
}

//AJAX Refactorizado
function loadURL(url,objID){
	var proveedor = new caXMLRPCProvider();
	proveedor.submit(url,objID);
}
function loadbgURL(url,objID){
	var proveedor = new caXMLRPCProvider();
	proveedor.bgSubmit(url,objID);
	var loadingTag=document.getElementById("loadingTag");
	if(navigator.appName=="Microsoft Internet Explorer"){
//		loadingTag.style.filter+="progid:DXImageTransform.Microsoft.Alpha(opacity=75)";
		loadingTag.style.position="absolute";
	}
	else{
//		loadingTag.style.MozOpacity="0.75";
	}
}
//Inicializar algunos componentes FIJOS y PERMANENTES
function init(){
	var loadingTag=document.getElementById("loadingTag");
	timestamp=0;
	if(navigator.appName=="Microsoft Internet Explorer"){
		//loadingTag.style.filter+="progid:DXImageTransform.Microsoft.Alpha(opacity=75)";
		loadingTag.style.position="absolute";
	}
	else{
		//loadingTag.style.MozOpacity="0.75";
	}
}
//------------------------------------------------------------------------------
//Esta clase provee de un XMLHTTPRequest y los manejadores genéricos necesarios
function caXMLRPCProvider() {
	//Un XMLHttpRequest
	var req;
	var objID=null;
	var background;
//	var timestamp;

//-----------------------------------
	//Realiza la solicitud XMLHttpRequest.
	//Avisa al usuario de que se está realizando una tarea
	this.submit=function loadXMLDoc(url,ObjID){
		//Asignar el Contenedor
		objID=ObjID;
		background=false;
		var loading = document.getElementById('loadingTag');
		if(loading!=null)
			loading.style.display="block";
		//Establecer elementos visuales de ayuda
		document.body.style.cursor="wait";
		var loading = document.getElementById('loadingTag');
		
		// branch for native XMLHttpRequest object
		if (window.XMLHttpRequest) {
			req = new XMLHttpRequest();
			req.onreadystatechange = processReqChange;
			req.open("GET", url, true);
			req.send(null);
		// branch for IE/Windows ActiveX version
		} else if (window.ActiveXObject) {
			req = new ActiveXObject("Microsoft.XMLHTTP");
			if (req) {
				req.onreadystatechange = processReqChange;
				req.open("GET", url, true);
				req.send();
			}
		}
	}
//-----------------------------------
	//Realiza la solicitud XMLHttpRequest
	//La tarea se realiza en background sin conocimiento del usuario
	this.bgSubmit=function bgLoadXMLDoc(url,ObjID){
		//Asignar el Contenedor
		objID=ObjID;
		background=true;
		
		// branch for native XMLHttpRequest object
		if (window.XMLHttpRequest) {
			req = new XMLHttpRequest();
			req.onreadystatechange = processReqChange;
			req.open("GET", url, true);
			req.send(null);
		// branch for IE/Windows ActiveX version
		} else if (window.ActiveXObject) {
			req = new ActiveXObject("Microsoft.XMLHTTP");
			if (req) {
				req.onreadystatechange = processReqChange;
				req.open("GET", url, true);
				req.send();
			}
		}
	}
//-----------------------------------
	// call this function to abort current request
	this.abort = function(){
		req.abort();
	}	//-----------------------------------
	//Manejador asincrono: Cuando la solicitud se completa, ejecutar el codigo
	var processReqChange = function (){
		// Solo si req se muestra "completo"
		if (req.readyState == 4) {
			// only if "OK"
			if (req.status == 200) {
				// ...Las instrucciones de procesamiento van aqui...
				var response = req.responseXML.documentElement;
				//Busco un timestamp y asigno el valor global en caso de actualizarse :)
				if(req.responseText.indexOf("<timestamp>")>0){
					timestamp = response.getElementsByTagName('timestamp')[0].firstChild.data;
				}
				//Asignar un identificador de objeto (si lo especifican los datos a cargar, y no está ya especificado)
				if (objID == null && response.getElementsByTagName('objID')!=null && response.getElementsByTagName('objID')[0]!=null && response.getElementsByTagName('objID')[0].firstChild!=null && response.getElementsByTagName('objID')[0].firstChild.data!=null)
					objID = response.getElementsByTagName('objID')[0].firstChild.data;
				//Determinar qué método manejará los datos
				var method = response.getElementsByTagName('method')[0].firstChild.data;
				//Hay que ejecutar codigo javascript al cargar los datos?
				var ejecutarAlCargar=req.responseText.indexOf('onloadexec');
				//Al actualizar hace un fade?
				var fade=req.responseText.indexOf("<fade>");
				//Al actualizar hay que hacer scroll hacia abajo?
				var scrolldown=req.responseText.indexOf("<scrolldown>");
				var loading = document.getElementById('loadingTag');
				//Determinar el cuerpo
				var cuerpo = req.responseText;
				//Para determinar el cuerpo (Necesario para Mozilla, corta el XML en 4096 bytes)
				var posicionInicial = cuerpo.indexOf("<cuerpo>");
				var posicionFinal = cuerpo.indexOf("</cuerpo>");
				cuerpo=cuerpo.substring(posicionInicial+8, posicionFinal);

				//Elimina el estado de espera
				document.body.style.cursor="default";
				if(loading!=null){
					loading.style.display="none";
				}
				//Evalúa el método elegido
				if(objID!=null)
					eval(method + '(\''+objID+'\', \''+decodeHTML(cuerpo)+'\','+fade+','+scrolldown+');');
				//Elimina el estado de espera
				document.body.style.cursor="default";

					
				if(ejecutarAlCargar>0){
					accion='\''+response.getElementsByTagName('onloadexec')[0].firstChild.data+'\'';
					eval(decodeAJAX(response.getElementsByTagName('onloadexec')[0].firstChild.data));
				}

			} else {
				alert("Se ha producido un error al recoger datos:\n" + req.statusText+"\nPor favor, avise al servicio técnico.");
				document.body.style.cursor="default";
				if(document.getElementById('loadingTag')!=null)
					document.getElementById('loadingTag').style.display="none";
			}
		}
	}
}

//------------------------------------------------------------------------------
//Funcion manejador boton del XMLHttpRequest
function setContent(destino,Contenido,fade,scrolldown){
	var para = document.getElementById(destino);
	if(para==null){
		alert("Se ha producido el siguiente error:\n - No se puede mostrar el contenido.\nPor favor, avise al servicio técnico.");
		return;
	}
	
	if(fade==true){
		//desvanecer(destino);
		desv = new EfectoVisual("desv");
		desv.hide(para)
		desv.fadeIn(para);
	}

	para.innerHTML=Contenido;
	if(scrolldown==true)
		para.scrollTop = para.scrollHeight;
}
//------------------------------------------------------------------------------
//Funcion manejador boton del XMLHttpRequest
function appendContent(destino,Contenido,fade,scrolldown){
	var para = document.getElementById(destino);
	if(para==null){
		alert("Se ha producido el siguiente error:\n - No se puede mostrar el contenido.\nPor favor, avise al servicio técnico.");
		return;
	}
	if(fade==true){
		//desvanecer(destino);
		desv = new EfectoVisual("desv");
		desv.fadeIn(para);
	}
	para.innerHTML = para.innerHTML + Contenido;
	if(scrolldown==true){
		para.scrollTop = para.scrollHeight;
	}
}
//------------------------------------------------------------------------------
//Funcion manejador boton del XMLHttpRequest
function loadJavascript(destino, Contenido){
	eval(Contenido);
}
//---------------------------------------------------------------------------------------------------------------------
//Aquí acaban las funciones "verdaderamente AJAX"
//Lo siguiente son funciones de utilidad.
//------------------------------------------------------------------------------
/*Permite el intercambio entre botones de solapas*/
function updateTab(Option, Element) {
	var i=0;
	if(Element==null)
		Element="menuPrincipal";
	//Activar-desactivar Botón de menú
	var barra=document.getElementById(Element);

	for(i=0;i<barra.childNodes.length;i++){
		//Desactivo todos
		if(barra.childNodes[i]!=null && barra.childNodes[i].className!=null)
			barra.childNodes[i].className="inactivo";
	}
	//Activo el que me interesa
	document.getElementById("menuItem_"+Option).className="activo";
}
//------------------------------------------------------------------------------
//Crear Botones mediante enlaces
function xmlButton(nombre, url, acronym, destination){
	//Establece los valores por defecto
	var destino;
	if(destination!=null){
		destino='javascript:loadURL(\'' + url + '\', \'' + destination + '\');';
	}else
		destino='javascript:loadURL(\'' + url + '\');';
	//Crea el enlace
	claseCSS="menuItem";
	if(acronym==null){
		return '<a href="'+destino+'" id="menuItem_'+nombre+'" accesskey="'+nombre[0]+'" class="' + claseCSS + '">' + nombre + '</a> ';
	}
	else{
		return '<a href="'+destino+'" id="menuItem_'+nombre+'" accesskey="'+nombre[0]+'" class="' + claseCSS + '" onmouseover="javascript:window.status=\''+acronym+'\';return true;" title="'+acronym+'">'+nombre + '</a> ';
	}
}
//------------------------------------------------------------------------------
//Crear Botones mediante enlaces
function xmlButtonTab(nombre, url, acronym, activo){
	//Establece los valores por defecto
	var destino='javascript:loadURL(\'' + url + '\');';
	if(activo!=null){
		claseCSS = 'activo';
	}
	else{
		claseCSS = 'inactivo';
	}

	//Crea el enlace
	if(acronym==null){
		return '<a href="'+destino+'" accesskey="'+nombre[0]+'" onclick="javascript:updateTab(\''+nombre+'\');" id="menuItem_'+nombre+'" class="' + claseCSS + '">' + nombre + '</a> ';
	}
	else{
		return '<a href="'+destino+'" accesskey="'+nombre[0]+'" onclick="javascript:updateTab(\''+nombre+'\');" id="menuItem_'+nombre+'" class="' + claseCSS + '" onmouseover="javascript:window.status=\''+acronym+'\';return true;" title="'+acronym+'">'+nombre + '</a> ';
	}
}
//------------------------------------------------------------------------------
//Genera el menú
function genMenu(){
		return 	xmlButtonTab('Empresa', 'modulos/intro.php', 'Acerca de Moncugas', true) + 
			xmlButtonTab('Catálogo', 'modulos/catalogo.php', 'Catálogo de productos') + 
			xmlButtonTab('Pedidos', 'modulos/pedidos.php', 'Pedidos') + 
			xmlButtonTab('Satisfacción', 'modulos/test_conformidad.php', 'Test de Conformidad') + 
			xmlButtonTab('Instalaciones', 'modulos/instalaciones.php', 'Instalaciones de la Empresa') + 
			xmlButtonTab('Localízanos', 'modulos/localizacion.php', 'Localización y Teléfono');
}
//------------------------------------------------------------------------------
//Funcion para convertir XML codificado en HTML
function decodeHTML(cadena){
	//Realiza una simple sustitución de caracteres
	var decodificado = cadena;
	var posicion=decodificado.indexOf("]", posicion);
	while(posicion >= 0){
		decodificado = decodificado.replace("]", ">");
		posicion=decodificado.indexOf("]", posicion);
	}
	posicion=decodificado.indexOf("[", posicion);
	while(posicion >= 0){
		decodificado = decodificado.replace("[", "<");
		posicion=decodificado.indexOf("[", posicion);
	}
	
	posicion=decodificado.indexOf("\\\\", posicion);
	while(posicion >= 0){
		decodificado = decodificado.replace("\\\\", "\\");
		posicion=decodificado.indexOf("\\", posicion+2);
	}
	posicion=decodificado.indexOf(";amp;", posicion);
	while(posicion >= 0){
		decodificado = decodificado.replace(";amp;", "&");
		posicion=decodificado.indexOf(";amp;", posicion);
	}
	decodificado = decodificado.replace("\[", "[");
	decodificado = decodificado.replace("\]", "]");
	return decodificado;
}

function decodeJS(cadena){
	var decodificado = cadena;
	posicion=decodificado.indexOf("]", posicion);
	while(posicion >= 0){
		decodificado = decodificado.replace("]", ">");
		posicion=decodificado.indexOf("]", posicion);
	}
	posicion=decodificado.indexOf("[", posicion);
	while(posicion >= 0){
		decodificado = decodificado.replace("[", "<");
		posicion=decodificado.indexOf("[", posicion);
	}
	
}

function decodeAJAX(cadena){
	var decodificado = cadena;
	var posicion=decodificado.indexOf("\\\'", posicion);
	while(posicion >= 0){
		decodificado = decodificado.replace("\\\'", "\'");
		posicion=decodificado.indexOf("\'", posicion+2);
	}
	return decodificado;
}

