// FUNCIONES QUE PERMITEN LA CREACIÓN Y	MANTENIMIENTO DEL MENÚ DE LA APLICACIÓN.

/// INICIO---- CONSTANTES PROPIAS DE LA APLICACION/////////////////////////////////////////////

//	XML asociado a las solapas.
FileSolapasXML='./menus/solapas.xml';
// Número de espacios por cada nivel
TAB=3;
// Imágenes de los laterales de las solapas
Izq = "./images/Der.gif";
Der = "./images/Izq.gif";
IzqSel = "./images/IzqSel.gif";
DerSel = "./images/DerSel.gif";
Medio = "./images/Medio.gif";
SelMedio = "./images/SelMedio.gif";
MedioSel = "./images/MedioSel.gif";
/// FIN------- CONSTANTES PROPIAS DE LA APLICACION/////////////////////////////////////////////

var nodoEncontrado;			// Contenedor de nodo para realizar busqueda de un nodo sobre el objeto DOM
var SolapasXML;					// Objeto DOM que contiene al archivo XML de solapas
var menuLayer;					// Ubicación donde se debe dibujar el menú de árbol
var solapaLayer;				// Ubicación donde se debe dibujar el menú de solapas
var solapaSeleccionada;	// Indice de la última solapa que se ha seleccionado
var NSolapas;						// Número de solapas de la jerarquía de menús
var aGifss;							// Array con el path completo de las imágenes de las solapas seleccionadas
var aGifs;							// Array con el path completo de las imágenes de las solapas sin seleccionar
var aXMLs;							// Array con el path completo de los archivos XML que contienen el menú
var aXMLDOM;						// Objetos DOM para cada uno de los menús de las solapas
var aXMLRaiz;						// Array con todos los nodos raiz de los menús de cada solapa
var idmenu;							// Variable contador de items de menu.
var Documento;					// Variable global donde ubicaremos el resultado de la búsqueda de un texto por los menús.

function PrintSolapas()
{
	// Manda a solapaLayer el código para visualizar las solapas y selecciona la primera
	solapaLayer.innerHTML = "";
	for (i = 0;i < NSolapas;i++)
	{
		solapaLayer.innerHTML += (i == 0)?"<IMG SRC="+Der+" BORDER='0' NAME='Solapa0'>":"";		
		solapaLayer.innerHTML += "<IMG SRC='"+aGifs[i]+"' BORDER='0' NAME='Solapa"+eval(i*2+1)+"' onClick='window.parent.Seleccionar("+i+")' onmouseover=this.style.cursor='hand'>";
		solapaLayer.innerHTML += (i == NSolapas-1)?"<img SRC="+Izq+" BORDER='0' NAME='Solapa"+eval(i*2+2)+"'>":"<img SRC="+Medio+" BORDER='0' NAME='Solapa"+eval(i*2+2)+"'>"
	}
	Seleccionar(solapaSeleccionada);
}

function ComponerTexto(nivel,orden,punto,expandido)
{
	var s;
	var col = (nivel-1)%4;
	var pDigito = parseInt(orden / 10);
	var sDigito = parseInt(orden % 10);
	if (punto)
		return "<IMG SRC='./images/punto.gif' BORDER='0'>";
	else
	{
		if (expandido)
			return "<IMG SRC='./images/menos.gif' BORDER='0'>";	 
		else
			return "<IMG SRC='./images/mas.gif' BORDER='0'>";	 
	}
}

function PrintMenuArbol(raiz)
{
	// Manda a menuLayer el código para visualizar el menú árbol
	var hijos;
	var i;
	var iditem, caption, nivel, orden, ID;
	var expanded = 0;
	var s;

	if ((raiz != null) && (menuLayer != null))
	{
		hijos = raiz.childNodes;
		if (raiz.nodeName == "ROOT")
		{
			menuLayer.innerHTML = '';
			if (hijos != null)
				for(i = 0;i<hijos.length;i++)
					PrintMenuArbol(hijos.item(i));
		}
		else
		{
			caption = raiz.attributes.getNamedItem("nombre").text;
			nivel = parseInt(raiz.attributes.getNamedItem("nivel").text);
			orden =	parseInt(raiz.attributes.getNamedItem("orden").text);
			if (raiz.nodeName == "MENU")
			{
				ID = raiz.attributes.getNamedItem("IDMenu").text;
				expanded = parseInt(raiz.attributes.getNamedItem("expanded").text);
			}
			if (raiz.nodeName == "ITEM")
				iditem = raiz.attributes.getNamedItem("link").text;
			s = "<DIV class='Texto'>";
			for (i = 0; i < TAB*(nivel-1); i++)
				s +="&nbsp;";							
			if (hijos.length==0) 
			{	// Es un nodo hoja.
				s += "<A HREF='"+iditem+"' TARGET = 'datos'><NOBR>"+ComponerTexto(nivel,orden,true,false)+"&nbsp;"+caption+"</NOBR></A></DIV>";			
				menuLayer.innerHTML += s;
			}
			else
			{	// Es un nodo con hijos.
				s += "<A HREF='#' onClick='window.parent.OnClick("+ID+")'><NOBR>"+ComponerTexto(nivel,orden,false,expanded)+"&nbsp;"+caption+"</NOBR></A></DIV>";
				menuLayer.innerHTML += s;
				if (expanded) //Está expandido. Se muestran los hijos
					for(i = 0;i<hijos.length;i++)
						PrintMenuArbol(hijos.item(i));
			}
		}
	}
	else
		if (menuLayer != null)
			//menuLayer.innerHTML += '';
			menuLayer.innerHTML = "<DIV class='Texto'>La solapa seleccionada no tiene menú o no se ha encontrado su archivo.</DIV>";
}

function OnClick(IDNodo)
{
	// Evento que se lanza cuando se selecciona un item del menú árbol
	nodoEncontrado = null;
	BuscarNodo(IDNodo, aXMLRaiz[solapaSeleccionada]);
	if (nodoEncontrado != null)
	{
		expanded = parseInt(nodoEncontrado.attributes.getNamedItem("expanded").text);
		if (expanded == 1)
			nodoEncontrado.attributes.getNamedItem("expanded").value = "0";
		else	
			nodoEncontrado.attributes.getNamedItem("expanded").value = "1";
		PrintMenuArbol(aXMLRaiz[solapaSeleccionada]);
	}
}

function BuscarNodo(idItem,nodoRaiz)
{
	// Busca un nodo desde el nodoRaiz que tenga el atributo IDMenu=idItem
	var hijos;
	var i;
	
	if ((nodoRaiz.nodeName == "MENU") && (nodoRaiz.attributes.getNamedItem("IDMenu").text == idItem))//IDITEM
		nodoEncontrado = nodoRaiz;
	else
		if (nodoRaiz.childNodes.length != 0)
		{
			hijos = nodoRaiz.childNodes;
			for(i = 0;i<hijos.length;i++)
				BuscarNodo(idItem,hijos.item(i));
		}
}

function Deseleccionar()
{
	// Deselecciona la solapa seleccionada	
	var s;
	s = solapaSeleccionada*2;
	if (solapaSeleccionada > 0)
		eval("cabecera.document.Solapa"+s+".src = '"+Medio+"';");
	else
		eval("cabecera.document.Solapa"+s+".src = '"+Der+"';");
	s = solapaSeleccionada*2+1;
	eval("cabecera.document.Solapa"+s+".src = '"+aGifs[solapaSeleccionada]+"';");		
	s = solapaSeleccionada*2+2;
	if (solapaSeleccionada < NSolapas-1)
		eval("cabecera.document.Solapa"+s+".src = '"+Medio+"';");	
	else
		eval("cabecera.document.Solapa"+s+".src = '"+Izq+"';");
}

function Seleccionar(n)
{
	// Selecciona una solapa
	var s;
	Deseleccionar();
	solapaSeleccionada = n;	
	s = solapaSeleccionada*2;
	if (solapaSeleccionada > 0)
		eval("cabecera.document.Solapa"+s+".src = '"+MedioSel+"';");	
	else
		eval("cabecera.document.Solapa"+s+".src = '"+IzqSel+"';");	
	s = solapaSeleccionada*2+1;
	eval("cabecera.document.Solapa"+s+".src = '"+aGifss[solapaSeleccionada]+"';");		
	s = (solapaSeleccionada*2)+2;
	if (solapaSeleccionada < NSolapas-1)
		eval("cabecera.document.Solapa"+s+".src = '"+SelMedio+"';");
	else
		eval("cabecera.document.Solapa"+s+".src = '"+DerSel+"';");
	
	PrintMenuArbol(aXMLRaiz[solapaSeleccionada]);
	
	datos.location.href = "./inicio.htm";
}

function MostrarMenu(layer)
{
	// Guarda la situacion de menuLayer e imprime el menú árbol
	menuLayer = layer;
	PrintMenuArbol(aXMLRaiz[solapaSeleccionada]);
}

function MostrarSolapas(layer)
{
	// Guarda la situación de solapaLayer e imprime el menú de solapas
	solapaLayer = layer;
	PrintSolapas();	
}

function CrearMenu(modulos)
{
	// Inicializa el objeto DOM y los array para las solapas
	var raiz;
	var baseFile;
	var NSolapasAux;
	var SolapaInicial=-1;
	NSolapas=0;
	SolapasXML = new ActiveXObject('microsoft.XMLDOM');
	SolapasXML.validateOnParse = true;
	SolapasXML.async = false;
	SolapasXML.load(FileSolapasXML);
	raiz = SolapasXML.documentElement;
	NSolapasAux = raiz.childNodes.length;
	aGifss = new Array(NSolapasAux);
	aGifs = new Array(NSolapasAux);
	aXMLs = new Array(NSolapasAux);
	aXMLDOM = new Array(NSolapasAux);
	aXMLRaiz = new Array(NSolapasAux);
	for (i = 0; i < NSolapasAux; i++)
	{
		var modulo = (raiz.childNodes.item(i)).attributes.getNamedItem("modulo").text;
		if (modulos.indexOf(modulo)>=0)
		{
			baseFile = (raiz.childNodes.item(i)).attributes.getNamedItem("archivo").text;
			aGifss[NSolapas] = "./images/" + baseFile + "Sel.gif";
			aGifs[NSolapas] = "./images/" + baseFile + ".gif";
			aXMLs[NSolapas] = "./menus/" + baseFile + ".xml";
			aXMLDOM[NSolapas] = new ActiveXObject('microsoft.XMLDOM');
			aXMLDOM[NSolapas].validateOnParse = true;
			aXMLDOM[NSolapas].async = false;
			aXMLDOM[NSolapas].load(aXMLs[NSolapas]);
			aXMLDOM[NSolapas].createAttribute("nivel");
			aXMLDOM[NSolapas].createAttribute("orden");
			aXMLDOM[NSolapas].createAttribute("expanded");
			aXMLDOM[NSolapas].createAttribute("IDMenu");
			aXMLRaiz[NSolapas] = aXMLDOM[NSolapas].documentElement;
			idmenu = 0;
			CrearNiveles(aXMLRaiz[NSolapas],0,1);
			if (SolapaInicial==-1)
			{
				SolapaInicial=NSolapas;
			}
			NSolapas++;
		}
	}
	if (SolapaInicial != -1)
	{
		SetSolapaInicial(SolapaInicial);
	}
}

function CrearNiveles(raiz,nivel,orden)
{ // Para cada nodo del arbol menú, crea las propiedades para controlar el nivel, el orden y la expansibilidad
	var i;
	var hijos;
	
	if (raiz != null)
	{
		hijos = raiz.childNodes;
		if (raiz.nodeName == "ROOT")
			for(i=0; i<hijos.length; i++)
				CrearNiveles(hijos.item(i),nivel+1,i+1);
		else
		{
			raiz.setAttribute("orden",eval(orden));
			raiz.setAttribute("nivel",eval(nivel));
			if (raiz.nodeName == "MENU")
			{
				raiz.setAttribute("expanded","1");
				raiz.setAttribute("IDMenu",idmenu++);
				if (raiz.childNodes.length!=0)
					for(i=0; i<hijos.length; i++)
						CrearNiveles(hijos.item(i),nivel+1,i+1);
			}
		}
	}
}

function SetSolapaInicial(SolapaInicial)
{
	var nSolapa;
	solapaSeleccionada = SolapaInicial;
	if ( GetParam('solapa') != null)	
		solapaSeleccionada = GetParam('solapa')-1;
}

function GetParam(sParam) {
	var parametro = null;
	var parametros = document.location.search;
	var nPos = parametros.indexOf(sParam+"=");
	if (nPos != -1) {
		nPos += (sParam.length+1);
		parametros = parametros.substring(nPos);
	
		var posampersand = parametros.indexOf('&');
		if (posampersand == -1)
			parametro = parametros;
		else 
	   		parametro = parametros.substring(0,posampersand);
		while (parametro.search("%20")!=-1)
			parametro=parametro.replace(/%20/," ");
	}
	return parametro;
}

function CuantasSolapas()
{
	return NSolapas;
}

function Buscar(texto)
{
	// Esta función busca el 'texto' por todos los menús y construye un xml con las opciones encontradas.
	
	Documento = new ActiveXObject('microsoft.XMLDOM');
	var nodoRaiz = Documento.createNode(1,"ROOT","");
	Documento.appendChild(nodoRaiz);
	var nodoBusqueda = Documento.createNode(1,"BUSQUEDA","");
	nodoRaiz.appendChild(nodoBusqueda);
	var attTexto = Documento.createAttribute("texto");
	attTexto.value = texto;
	nodoBusqueda.attributes.setNamedItem(attTexto);
	var raizSolapas = SolapasXML.documentElement;
	//Recorremos todas las solapas para buscar en su interior.
	for (i = 0; i < NSolapas;i++)
	{
		solapa = (raizSolapas.childNodes.item(i)).attributes.getNamedItem("nombre").text;
		if (aXMLRaiz[i] != null && aXMLRaiz[i].childNodes.length != 0)
			BuscarEnHijos(texto, solapa, '', aXMLRaiz[i].childNodes.item(0));		
	}
	
	//alert(Documento.xml);
	return Documento.documentElement.selectSingleNode("BUSQUEDA");
}

function BuscarEnHijos(texto, solapa, path, nodoRaiz)
{	
		var nombre = nodoRaiz.attributes.getNamedItem("nombre").text;		
		if (nodoRaiz.nodeName != "ITEM")
		{
				if (nodoRaiz.childNodes.length != 0)
					//Buscamos dentro de los hijos del menú en el que estamos.
					BuscarEnHijos(texto, solapa, path+"/"+nombre, nodoRaiz.childNodes.item(0));			
		}
		else
		{
			if ((nombre.toUpperCase()).indexOf(texto.toUpperCase()) != -1)
			{
				var nodoBusqueda = Documento.documentElement.selectSingleNode("BUSQUEDA");
				// Ha encontrado un elemento en un menú, y entonces añadimos un nodo a la Búsqueda.
				var nodoLink = Documento.createNode(1,"ITEM","");
				//Añadimos el atributo solapa
				var attSolapa = Documento.createAttribute("solapa");
				attSolapa.value = solapa;
				nodoLink.attributes.setNamedItem(attSolapa);
				//Añadimos el atributo path
				var attPath = Documento.createAttribute("path");
				attPath.value = path;
				nodoLink.attributes.setNamedItem(attPath);
				//Añadimos el atributo nombre
				var attNombre = Documento.createAttribute("nombre");
				attNombre.value = nombre;
				nodoLink.attributes.setNamedItem(attNombre);
				//Añadimos el atributo secuencia
				var attSecuencia = Documento.createAttribute("secuencia");
				attSecuencia.value = nodoRaiz.attributes.getNamedItem("link").text;
				nodoLink.attributes.setNamedItem(attSecuencia);
				//Colgamos el nodoLink del nodoBusqueda.
				nodoBusqueda.appendChild(nodoLink);
			}
		}
		if (nodoRaiz.nextSibling != null)
			// Miramos en el siguiente hermano si lo tuviera
			BuscarEnHijos(texto, solapa, path, nodoRaiz.nextSibling);
}