﻿function DesplegarPublicacion(sender)
{
    var ul = sender.parentNode;
    
    while(ul && ul.nodeName.toLowerCase() != "ul")
        ul = ul.nextSibling;
    
    if(ul)
        ul.style.display = (ul.style.display == "none") ? "block" : "none";
    
}

//Pide la seccion 116 del web al servidor con los resultados de las empresas.
//La seccion esta formada por varios componentes, html y javascript. Además tiene un estilo propio en CSS
//REMARKS:
//La insercion se realiza en 2 pasos: 1 insertar el HTML de la seccion y 2 ejecutar el JavaScript de inicializacion de los componentes
function ResultadosBuscEmpresas(cadena, familia, tipo)
{
	//Almaceno la cadena de busqueda
	busqueda[0] = cadena;
	busqueda[1] = familia;
	busqueda[2] = tipo;
		
	//Obtengo el código javascript y el html
	GetResultadosBuscEmpresas_JS(cadena, familia, tipo);
}

/***********OBJETOS COMUNES****************/
//OBJETO BROWSER
//Representa el navegador que se esta utilizando
function Browser()
{
	var aux;
	this.isIE = false;
	this.isNS = false;
	this.isAnother = false;
	
	//Obtengo el tipo de navegador que es
	if(navigator.appName.indexOf("Microsoft") != -1)
		this.isIE = true;
	else if(navigator.appName.indexOf("Netscape") != -1)
		this.isNS = true;
	else
		this.isAnother = true;
	
	//Obtengo la version
	if(this.isIE)
	{
		aux = navigator.appVersion.split(";");
		aux = aux[1].split(" ");
		this.version = aux[2];
	}
	else if(this.isNS)
	{
		aux = navigator.appVersion.split("(");
		this.version = aux[0];
	}
	else
		this.version = navigator.vendorSub;
	
	//Plataforma
	if(navigator.platform.indexOf("Win") != -1)
		this.plataforma = "Windows";
	else if(navigator.platform.indexOf("Mac") != -1)
		this.plataforma = "Machintosh";
	else if(navigator.platform.indexOf("Sun") != -1)
		this.plataforma = "Solaris";
	else
		this.plataforma = "unknown";
	
	//Navegador
	if(navigator.vendor)
		this.navegador = navigator.vendor;
	else
		this.navegador = navigator.appName;
}
//OBJETO ELEMENTO
//El elemento se representa como un enlace
function Elemento(key, nombre, href)
{
	//Lleno el valor de los atributos
	this.nombre = nombre;
	this.enlace = href;
	this.id = key;
	this.nivel = 0;
	this.origen = "";
	this.padre = null;
	
	/*
	var expReg = /javascript:.*\((.*)\);?/i;
	var res = expReg.exec(href);
	if(res)
		this.id = res[1].split(",")[0].replace(/("|')/g,"");
	*/
	
	//Inicializo la memoria
	this.sigNivel = new Array();
	
	//Vinculo los métodos del objeto
	this.AddElement = AddElement;
	this.CreateList = CreateList;
	this.CreateTree = CreateTree;
	this.CreateMenu = CreateMenu;
}
//Añado un elemento al siguiente nivel del elemento actual
//Elemento es un objeto de tipo Elemento
function AddElement(elemento)
{
	this.sigNivel[this.sigNivel.length] = elemento;
	this.sigNivel[this.sigNivel.length-1].nivel = this.nivel+1;
}
//Busca un elemento en el arbol y devuelve un puntero a el.
//El elemento SIEMPRE existe.
function BuscarElemento(idElemento, nodo)
{
	var i;
	var res;
	
	if(nodo.id == idElemento)
		return nodo;
	else
	{
		//Busco el elemento en los hijos
		for(i=0; i< nodo.sigNivel.length; i++)
		{
			res = BuscarElemento(idElemento,nodo.sigNivel[i]);
			//OJO, comprobar si la busqueda ha tenido exito
			if(res)
				return res;
		}
	}
	//Nodo hoja que no es el que busco
	return;
}
//Abre un nivel en la lista de elementos, cerrando previamente los que hubieran abiertos
//PARAMETROS:
//padre: Puntero al elemento HTML del que se cuelga la lista
//elemento: Puntero al elemento HTML detrás del que se crea la lista
function CreateList(padre, elemento)
{
	var divSeccion,divImagen,divTexto,imagen,texto;
	
	var icono;
	var estado;
	
	//Obtengo el nombre del componente
	var componente = padre.id.split("_")[0];
	
	//Obtengo si el estilo del elemento si es una seccion o subseccion
	var estilo = (this.nivel == 0) ? (componente+"_seccion") : (componente+"_subseccion");
	var estiloTexto = (this.nivel == 0) ? (componente+"_textoSeccion") : (componente+"_textoSubseccion");
	
	var aux="";
			
	//Si el elemento despliega items el icono es texto
	for(i=0; i<this.nivel; i++)
		aux += ">";	
	
	for(i = 0; i<this.sigNivel.length; i++)
	{
		//Obtengo el icono correspondiente al elemento
		icono = GetIcono(this.nivel+1,(this.sigNivel[i].sigNivel.length > 0),true);
		
		//Obtengo si el estado del elemento si es una lista o un item
		estado = (this.sigNivel[i].sigNivel.length > 0) ? "plegado" : "item";
						
		divSeccion = document.createElement("DIV");
		divSeccion.setAttribute("id",estilo);
		divSeccion.setAttribute("nivel",this.nivel+1);
		//Almaceno el id del nodo en el arbol para busquedas
		divSeccion.setAttribute("nodo",this.sigNivel[i].id);
		//Establezco la seccion como plegada
		divSeccion.setAttribute("estado",estado);
	
		//Creo el icono
		divImagen = document.createElement("DIV");
		divImagen.setAttribute("id",componente+"_icono");
		
		//El color del div depende de si es una seccion (aleatorio) o una subseccion (el mismo que el de fondo)
		//para que parezca que el icono se ajusta al tamaño del texto
		divImagen.style.backgroundColor = (estilo == componente+"_seccion") ? ObtenerColor() : padre.style.backgroundColor;
		divImagen.style.width = 20+"px";
		divImagen.style.height = 20+"px";
		divImagen.style.cursor = "default";
	
		//Voy a captar la sensación de anidamiento en caso de que el elemento sea un item
		//utilizando tantos ">" como el nivel en el que se encuentra el ítem
		if(estado == "item")
			imagen = document.createTextNode(aux);
		else
		{
			//El icono es una imagen
			imagen = document.createElement("IMG");
			imagen.setAttribute("src",icono);
		}
		
		//Vinculo el icono al documento
		divImagen.appendChild(imagen);
		divSeccion.appendChild(divImagen);
		padre.insertBefore(divSeccion,elemento);	
						
		//Añado la captura del evento click para la imagen y los 2 divs
		//En explorer solo hace falta que lo capture el elemento que quiero que lo capture
		if(browser.isNS)
		{
			imagen.addEventListener("click",ManejadorLista,false);
			divImagen.addEventListener("click",ManejadorLista,false);
			divSeccion.addEventListener("click",ManejadorLista,false);
		}
		else
			divSeccion.onclick = ManejadorLista;
							
		//Creo el texto del campo
		divTexto = document.createElement("DIV");
		divTexto.setAttribute("id",estiloTexto);
		
		//Ahora los elementos tienen su tamaño correcto
		//El texto se situa a la derecha del icono y su tamaño va hasta el fin del menu
		aux2 = (estilo == componente+"_seccion") ? 10 : 25; //aux2 define la tabulacion minima para la seccion y la subseccion
		
		divTexto.style.left = divImagen.offsetWidth+"px";
		divTexto.style.paddingLeft = (aux2 + this.nivel*5)+"px";
		divTexto.style.width = (padre.offsetWidth - divImagen.offsetWidth - divTexto.offsetLeft)+"px";
		divTexto.style.cursor = "default";
					
		texto = document.createTextNode(this.sigNivel[i].nombre);
		
		//Vinculo el nombre de la seccion al documento
		divTexto.appendChild(texto);
		divSeccion.appendChild(divTexto);
		padre.insertBefore(divSeccion,elemento);
		
		//Agrego la captura de eventos que falta
		if(browser.isNS)
			divTexto.addEventListener("click",ManejadorLista,false);
		
		//Hago que el div de texto tenga un tamaño minimo de 20 px (como el icono)
		if(divTexto.offsetHeight < 20 && browser.isIE)					
			divTexto.style.height = 20;
		else if(divTexto.offsetHeight < 20)
			divTexto.setAttribute("style",divTexto.getAttribute("style")+ " height: 20px;");
			
		//Modifico la altura de la imagen (el texto puede tener varias lineas)
		divImagen.style.height = divTexto.offsetHeight;
	}
}
//Crea una lista con forma arborea (foro)
//PARAMETROS:
//padre: Puntero al elemento HTML del que se cuelga el arbol
//elemento: Puntero al elemento HTML detrás del que se pone el arbol
function CreateTree(padre, elemento)
{
	var divNodo,divImagen,divTexto,imagen,texto,enlace;
	var icono;
	var estado;
	var componente = padre.id.split("_")[0];
					
	for(i = 0; i<this.sigNivel.length; i++)
	{
		//Obtengo si el estado del elemento si es una lista o un item
		estado = (this.sigNivel[i].sigNivel.length > 0) ? "plegado" : "item";
		
		//Obtengo el icono correspondiente al elemento
		icono = GetIcono(2,(estado == "plegado"),true);
			
		//En el arbol todos los elementos tienen el mismo estilo, diferenciandose en la anidacion
		divNodo = document.createElement("DIV");
		divNodo.setAttribute("id",componente+"_nodo");
		//Almaceno el id del nodo en el arbol para búsquedas
		divNodo.setAttribute("nodo",this.sigNivel[i].id);
		//Establezco la seccion como plegada
		divNodo.setAttribute("estado",estado);
		divNodo.setAttribute("nivel",(this.nivel+1))
	
		//El nivel de anidacion se representa con un margen que depende del nivel
		divNodo.style.marginLeft = (this.nivel*16)+"px";
	
		//Creo el icono
		divImagen = document.createElement("DIV");
		divImagen.setAttribute("id",componente+"_icono");
		//Datos para el manejador del click
		divImagen.style.clip = "rect(0,16px,16px,0)";
	
		//El icono es una imagen
		imagen = document.createElement("IMG");
		imagen.setAttribute("src",icono);
																
		//Vinculo el icono al documento
		divImagen.appendChild(imagen);
		
		divNodo.appendChild(divImagen);
						
		//Creo el texto del campo (es un enlace)
		divTexto = document.createElement("DIV");
		divTexto.setAttribute("id",componente+"_texto");
		enlace = document.createElement("A");
		enlace.setAttribute("href",this.sigNivel[i].enlace);
		//Así formatea correctamente acentos, ...
		enlace.innerHTML = this.sigNivel[i].nombre;
		//Vinculo el nombre de la seccion al documento
		divTexto.appendChild(enlace);
		divNodo.appendChild(divTexto);
		
		//Inserto el nodo en el cuadro de mensajes antes del elemento que me indican
		padre.insertBefore(divNodo,elemento);
							
		divNodo.style.height = divTexto.offsetHeight+"px";					
		divImagen.style.height = divTexto.offsetHeight+"px";
		
		//Añado la captura del evento click para la imagen, siempre que sea desplegable
		if(estado == "plegado")
		{
			if(browser.isNS)
				imagen.addEventListener("click",ManejadorArbol,false);
			else
				imagen.onclick = ManejadorArbol;
		}	
	}
}
//Crea una lista con forma de menu principal
//PARAMETROS:
//padre: Puntero al elemento HTML del que se cuelga el arbol
//elemento: Puntero al elemento HTML detrás del que se pone el arbol (si es null es como si se hiciera append)
function CreateMenu(padre, elemento)
{
	var imagen,texto,enlace,lista,item,div;
	//Todos los elementos tienen el mismo icono
	var icono = "./iconos/lista.gif";
	
	
	
	
	var estado;
	var componente = (this.nivel == 0) ? padre.id.split("_")[0] : padre.getAttribute("componente"); //Sólo cierto en la primera llamada

	lista = document.createElement("UL");
	//Las listas del primer nivel tienen un estilo especial
	if(this.nivel == 0)
		lista.setAttribute("id",componente+"_primerNivel");						
					
	for(i = 0; i<this.sigNivel.length; i++)
	{
		//Obtengo si el estado del elemento si es una lista o un item
		estado = (this.sigNivel[i].sigNivel.length > 0) ? "plegado" : "item";
		
		item = document.createElement("LI");
		//Almaceno el id del nodo en el arbol para busquedas
		item.setAttribute("nodo",this.sigNivel[i].id);
		//Establezco la seccion como plegada
		item.setAttribute("estado",estado);
		item.setAttribute("nivel",(this.nivel+1))
		item.setAttribute("componente",componente);
								
		//2 posibilidades: hoja o no hoja
		if(estado == "item")
		{
			enlace = document.createElement("A");
			
			//El enlace puede ser a una seccion, canal o externo (URL).
			switch(this.sigNivel[i].origen)
			{
				case "seccion":
					enlace.href = "javascript:PedirSeccion('"+this.sigNivel[i].enlace+"');";
					break;
				case "canal":
					enlace.href = "javascript:PedirCanal('"+this.sigNivel[i].enlace+"');";
					break;
				case "externo":
					enlace.href = this.sigNivel[i].enlace;
					
					//Permitir enlaces internos
					if(!enlace.href.match(/javascript:.*/i))
						enlace.target = "_blank";
					break;
				case "documento":
					enlace.href = "javascript:CargarFichero('"+this.sigNivel[i].enlace+"');";
					break;
			}
			
			texto = document.createTextNode(this.sigNivel[i].nombre);
			enlace.appendChild(texto);
			item.appendChild(enlace);
		}
		else
		{
			//Hay que utilizar un div por compatibilidad
			div = document.createElement("DIV");
			texto = document.createTextNode(this.sigNivel[i].nombre);
			div.appendChild(texto);
			//Añado la captura del evento click al item
			if(browser.isIE)
				div.attachEvent("onclick",ManejadorMenu);
			else
				div.addEventListener("click",ManejadorMenu,false);
				
			item.appendChild(div);
		}
		
		lista.appendChild(item);
	}
	
	padre.insertBefore(lista,elemento);
}
//Manejador de eventos en un arbol de elementos
function ManejadorArbol(e)
{
	var target, elemento, nodo;

	//Obtengo el elemento (la imagen) que ha generado el evento)
	if(browser.isIE)
		target = this;
	else
		target = e.currentTarget;
		
	//Obtengo el nodo del árbol asociado
	nodo = target.parentNode.parentNode;

	//Compruebo la acción sobre el nodo
	if(nodo.getAttribute("estado") == "plegado")
	{
		//DESPLEGAR
		
		//Elimino los nodos de un nivel inferior, y los del mismo los pliego
		EliminarNodos(nodo.getAttribute("nivel"));
		
		//Cambio el icono
		target.src = GetIcono(2,true,false);
												
		//Busco el elemento a desplegar en la lista de mensajes
		elemento = BuscarElemento(nodo.getAttribute("nodo"),listaMensajes);
		//Despliego antes del siguiente nodo
		elemento.CreateTree(nodo.parentNode,nodo.nextSibling);
						
		//Cambio el estado
		nodo.setAttribute("estado","desplegado");
	}
	else
	{
		//PLEGAR
		EliminarNodos(nodo.getAttribute("nivel"));
	}
}
//Manejador de eventos en un Menu de elementos
function ManejadorMenu(e)
{
	var target;
	var nodo;
	var raiz;
	//El evento lo trata el div de seccion o subseccion
	//Ya que al ser capturado por varios hace bubbling
	if(browser.isIE)
		target = window.event.srcElement;
	else
		target = e.currentTarget;

	//Obtengo el componente que ha generado el evento
	var componente = target.parentNode.getAttribute("componente");

	//Obtengo la raíz, cada componente llama a su raiz como a sí mismo
	if(componente == "MenuNavegacion")
		raiz = menuNavegacion;

	//Plegar los hermanos
	PlegarHermanos(target.parentNode);

	//Mostrar contenido
	nodo = BuscarElemento(target.parentNode.getAttribute("nodo"),raiz);
	
	if(nodo.enlace)
	{
		if(nodo.enlace.indexOf("javascript") != -1)
			eval(nodo.enlace);
		else
			PedirSeccion(nodo.enlace);
	}

	//DESPLEGAR
	if(target.parentNode.getAttribute("estado") == "plegado")
	{
		//Desplegar
		target.parentNode.setAttribute("estado","desplegado");
		
		//Cambio el esilo
		target.parentNode.style.fontStyle = "italic";
		target.parentNode.style.fontWeight = "bold";
		nodo.CreateMenu(target.parentNode,null);
	}
}
//Recibe un puntero a un element HTML y pliega los hermanos (LI)
function PlegarHermanos(elemento)
{
	var aux;
	var lista;
	//2 recorridos
	//IZQUIERDA
	aux = elemento.previousSibling;
	while(aux)
	{
		if(aux.getAttribute("estado") == "desplegado")
		{
			//Obtengo la lista que deseo eliminar
			lista = aux.getElementsByTagName("UL");
			aux.removeChild(lista[0]);
			aux.setAttribute("estado","plegado");
			aux.style.fontStyle = "normal";
			if(aux.parentNode.id != "MenuNavegacion_primerNivel")
				aux.style.fontWeight = "normal";
		}
		aux = aux.previousSibling;
	}

	//DERECHA
	aux = elemento.nextSibling;
	while(aux)
	{
		if(aux.getAttribute("estado") == "desplegado")
		{
			//Obtengo la lista que deseo eliminar
			lista = aux.getElementsByTagName("UL");
			aux.removeChild(lista[0]);
			aux.setAttribute("estado","plegado");
			aux.style.fontStyle = "normal";
			if(aux.parentNode.id != "MenuNavegacion_primerNivel")
				aux.style.fontWeight = "normal";
		}
		aux = aux.nextSibling;
	}

}
//Obtiene un icono para un elemento de una lista en funcion del nivel de anidacion 
//y de si el nodo se encuentra plegado o no
function GetIcono(nivel, lista, plegado)
{
	var res = "./iconos/";

	if(nivel < 2 && plegado)
		res += "plegado.gif";
	else if(nivel < 2 && !plegado)
		res += "desplegado.gif";
	else if(nivel > 1 && lista && plegado)			
		res += "listaItemsPlegada.gif";
	else if(nivel > 1 && lista && !plegado)			
		res += "listaItemsDesplegada.gif";
	else
		res += "item.gif";	 

	return res;
}
//Obtiene aleatoriamente un color
function ObtenerColor()
{
	var res="#";
	//Obtengo las componentes RGB del color de forma aleatoria
	var rojo = parseInt(Math.random()*255,10);
	var verde = parseInt(Math.random()*255,10);
	var azul = parseInt(Math.random()*255,10);

	//Transforomo los valores a hexadecimal
	res += IntToHex(rojo);
	res += IntToHex(verde);
	res += IntToHex(azul);

	return res;
}
//Comprueba si una direccion de E-mail es correcta
//PARAMS:
//email: direccion de E-mail a comprobar
//RETURNS:
//Correcta o no
function CompruebaEmail(email) 
{ 
	//Pasar a minusculas
	email = email.toLowerCase();
	var ok = true;
	var error = ""; 
	
	if(email != "") 
	{ 
		//Realizar comprobaciones de tamaño minimo, servidor, numero de arrobas, puntos, ...
		if(email.length<7 || email.indexOf("@.") != -1 || email.indexOf("-.") != -1 || email.indexOf("_.") != -1 || email.indexOf("..") != -1 || email.indexOf("._") != -1 || email.indexOf(".-") != -1 || email.indexOf(".@") != -1 || email.indexOf("@-") != -1 || email.indexOf("@_") != -1 || email.indexOf("@") != email.lastIndexOf("@") || email.indexOf("@") == -1 || email.indexOf(".") == -1 || (email.length - (email.lastIndexOf(".") + 1)) < 2)
		{
			ok = false; 
			error += "La direccion de correo introducida no es valida.\n";
		}
		else 
		{ 
			
			var validos = "abcdefghijklmnopqrstuvwxyz0123456789@-_."; //Caracteres validos
			
			//Comprobar que la direccion esta compuesta por caracteres validos
			for(i=0; i<email.length; i++) 
			{ 
				if(validos.indexOf(email.charAt(i)) == -1) 
				{ 
					ok = false; 
					error += "La direccion de correo contiene el caracter desconocido: "+email.charAt(i)+".\n";
					break;
				} 
			}
		}
	}
	else
	{
		ok = false;
		error += "Debe introducir la direccion de correo del destinatario";
	}
	
	if(ok) 
	{ 
		//Hacer una comprobacion mediante expresiones regulares
		expReg = /^[a-z0-9\._]*[a-z0-9_]@[a-z0-9][a-z0-9\-\.]*[a-z0-9]\.[a-z][a-z]$|^[a-z0-9\._]*[a-z0-9_]@[a-z0-9][a-z0-9\-\.]*[a-z0-9]\.aero$|^[a-z0-9\._]*[a-z0-9_]@[a-z0-9][a-z0-9\-\.]*[a-z0-9]\.biz$|^[a-z0-9\._]*[a-z0-9_]@[a-z0-9][a-z0-9\-\.]*[a-z0-9]\.coop$|^[a-z0-9\._]*[a-z0-9_]@[a-z0-9][a-z0-9\-\.]*[a-z0-9]\.com$|^[a-z0-9\._]*[a-z0-9_]@[a-z0-9][a-z0-9\-\.]*[a-z0-9]\.edu$|^[a-z0-9\._]*[a-z0-9_]@[a-z0-9][a-z0-9\-\.]*[a-z0-9]\.gov$|^[a-z0-9\._]*[a-z0-9_]@[a-z0-9][a-z0-9\-\.]*[a-z0-9]\.info$|^[a-z0-9\._]*[a-z0-9_]@[a-z0-9][a-z0-9\-\.]*[a-z0-9]\.int$|^[a-z0-9\._]*[a-z0-9_]@[a-z0-9][a-z0-9\-\.]*[a-z0-9]\.mil$|^[a-z0-9\._]*[a-z0-9_]@[a-z0-9][a-z0-9\-\.]*[a-z0-9]\.museum$|^[a-z0-9\._]*[a-z0-9_]@[a-z0-9][a-z0-9\-\.]*[a-z0-9]\.name$|^[a-z0-9\._]*[a-z0-9_]@[a-z0-9][a-z0-9\-\.]*[a-z0-9]\.net$|^[a-z0-9\._]*[a-z0-9_]@[a-z0-9][a-z0-9\-\.]*[a-z0-9]\.org$|^[a-z0-9\._]*[a-z0-9_]@[a-z0-9][a-z0-9\-\.]*[a-z0-9]\.pro$/i;
		if(expReg.test(email)) 
		{ 
			expReg = /^[a-z0-9_]/i; 
			if(!(expReg.test(email))) 
			{ 
				ok = false;
				error += "La direccion de correo electronico introducida no es valida.";
			}
		}
		else 
		{ 
			ok = false; 
			error += "La direccion de correo electronico introducida no es valida.";
		}
	}
	
	//Sacar mensaje de error
	if(!ok)
		alert(error);
	
	return ok;
}
//Transaforma un valor entero en base10 a base16
function IntToHex(intValue)
{
	var res="";
	var resto;
	var aux;

	while(intValue > 0)
	{
		resto = intValue % 16;
		intValue = parseInt(intValue/16,10);
		
		//Sustituyo el valor por la letra en decimal
		switch(resto)
		{
			case 10:
				aux = "A";
				break;
			case 11:
				aux = "B";
				break;
			case 12:
				aux = "C";
				break;
			case 13:
				aux = "D";
				break;
			case 14:
				aux = "E";
				break;
			case 15:
				aux = "F";
				break;
			default:
				aux = resto+"";
		}
		
		//Inserto aux en la posicion 0 del resultado
		res = aux + res;
	}

	while(res.length < 2)
		res += "0";
					
	return res;
}
//Gestiona el evento click sobre cualquier elemento del menu
function ManejadorLista(event)
{
	var target;
	var raiz;
	var nodo;
	//El evento lo trata el div de seccion o subseccion
	//Ya que al ser capturado por varios hace bubbling
	if(browser.isIE)
		target = this;
	else
		target = event.currentTarget;

	//Obtengo el componente que ha generado el evento
	var componente = target.id.split("_")[0];

	//Cada componente llama al raiz de la lista como a él mismo pero empezando en minusculas
	if(componente == "MenuNavegacion")
		//Los elementos que no son listas tienen el estado "item"
		raiz = menuNavegacion;
	else if(componente == "Organigrama")
		raiz = organigrama;

	//Compruebo si tengo que desplegar el menu
	if(target.getAttribute("estado") == "plegado")
		DesplegarLista(raiz, target);
	else if(target.getAttribute("estado") == "item")
	{
		//Obtengo el elemento
		nodo = BuscarElemento(target.getAttribute("nodo"),raiz);
		//Ejecuto el codigo enlace
		eval(nodo.enlace);
	}
}
//Despliega un elemento de la lista que posee elementos dentro
function DesplegarLista(raiz, elemento)
{
	var aux;
	var icono;
	var imagen;
	//Obtengo el nodo del árbol que contiene los nodos a desplegar
	var nodo = BuscarElemento(elemento.getAttribute("nodo"),raiz);

	var nodoPlegado = null;
			
	//Voy a desplegar una lista de un nivel más al nodo, por lo que elimino
	//las secciones ó subsecciones de ese nivel antes de desplegar y obtener el elemento plegado
	aux = elemento.parentNode.childNodes;
			
	for(i=0; i<aux.length; i++)
	{
		//Compruebo que el hijo es un div (subseccion)
		if(aux[i].nodeType == 1 && aux[i].getAttribute("nivel") >= (nodo.nivel+1))
		{
			aux[i].parentNode.removeChild(aux[i]);
			//El tamaño de aux se reduce en 1 -> no muevo el indice de posicion en el vector
			i--;
					
			//Si es la primera vez que entro el nodo anterior al i es el que se pliega
			if(!nodoPlegado)
				nodoPlegado = aux[i];
		}
					
	} 
		
	//Modifico el src del icono del elemento plegado
	if(nodoPlegado)
	{
		imagen = nodoPlegado.getElementsByTagName("IMG");
		icono = GetIcono(parseInt(nodoPlegado.getAttribute("nivel"),10), (nodo.sigNivel.length > 0), true);
		imagen[0].setAttribute("src",icono);
		nodoPlegado.setAttribute("estado","plegado");
	}
			
	//Despliego el nodo
	elemento.setAttribute("estado","desplegado");
	imagen = elemento.getElementsByTagName("IMG");
	icono = GetIcono(parseInt(elemento.getAttribute("nivel"),10), ((BuscarElemento(elemento.getAttribute("nodo"),raiz)).sigNivel.length > 0), false);
	imagen[0].setAttribute("src",icono);

	nodo.CreateList(elemento.parentNode,elemento.nextSibling);
}
/**********CODIGO COMUN A VARIOS COMPONENTES Y PRINCIPAL***********/
//Inicializa los TODOS elementos del web (tamaño y posicion)
//Y cualquiera de los componentes que se encuentren en él
function Inicializar() {
	//Primero maximizo la ventana del browser
	MaximizarVentana();

	//En IE hay 3 imagenes que dejan margen excesivo
	if(browser.isIE)
	{
	    getElement("Main_barraProgreso").style.marginBottom = "-2px";
	    getElement("Main_imagenCartografia").style.marginBottom = "-2px";
	    getElement("Main_imagenCanal").firstChild.style.marginBottom = "-2px";
	}
	
	/***********RESTO DE COMPONENTES************/
	//Sólo hay 4 componentes inicializables con la web
	//Son los que pertenecen a la estructura de la misma
	var componente;
	/*MENÚ DE NAVEGACIÓN*/
	componente = getElement("MenuNavegacion");
	if(componente)
		InicializaMenu();
						
	/*CUADRO INFORMACION*/
	componente = getElement("CuadroInformacion");
	if(componente)
		InicializaCuadro();
		
	/*MARQUESINA*/
	componente = getElement("Marquesina");
	if(componente)
		InicializaMarquesina();
	
	/*LISTA NOTICIAS*/
	componente = getElement("Noticias_calendar");
	if(componente)
	{
	    cal = new Epoch("Calendario_noticias","popup",document.getElementById("Noticias_calendar"),false);
        cal.tgt = document.getElementById("Eventos_fecha");
        //cal.hide();
        cal.toggle()
	}
	
	/*LISTA EVENTOS*/
	componente = getElement("Eventos_calendar");
	if(componente)
	{
	    cal = new Epoch("Calendario_eventos","popup",document.getElementById("Eventos_calendar"),false);
        cal.tgt = document.getElementById("Eventos_fecha");
        cal.hide();
    }

    /*SCRIPT PARA CARGAR UNA NOTICIA DESDE LA URL*/
    var noticiaId = gup('noticia');
    if (noticiaId != '') {        
        GLB_OBJETOS['Noticia_In'] = new suceso_In();
        GLB_OBJETOS['Noticia_In'].F2026_Id = noticiaId;
        PedirSeccion('77');
    }
}

//Funcion para recoger parametros por url
function gup(name) {
    var regexS = "[\\?&]" + name + "=([^&#]*)";
    var regex = new RegExp(regexS);
    var results = regex.exec(window.location.href);
    if (results == null)
        return "";
    else
        return results[1];
}

//Maximiza la ventana del browser y calcula el tamaño de la aplicacion
function MaximizarVentana()
{
	window.moveTo(0,0);
	if (document.all) //IE
	{
		window.resizeTo(1024,window.screen.availHeight);
		document.body.style.overflowX = "hidden";
	}
	else  
	{
		window.outerHeight = window.screen.availHeight;
		window.outerWidth = 1024;
		document.body.style.overflow = "-moz-scrollbars-vertical";
	}
	
}
//Modifica la hoja de estilos modificando el tamaño de letra
function CambiarFuente(tam, win)
{
	//Modifico el estilo de los elementos que definen tamaño de letra
	//El tamaño mínimo es 10
	var elementos = new Array();
	var elemento;
	var tamDefecto;
	var incremento;

	//Calculo el incremento en píxels de la fuente en función del tamaño anterior
	incremento = tam - win.tamFuente;
	
	if(incremento != 0)
	{
		//Almaceno el cambio en sesion
		GuardarSession_JS("letra",tam);
		
		//Obtengo las reglas en las que se difine el tamaño de letra
		var reglas = ObtenerReglasCSS(win, "font-size");
		
		for(var i=0; i<reglas.length; i++)
		{
			tamDefecto = ObtenerValorAtributoRegla(reglas[i],"font-size");
			
			//Elimino la unidad en la que se mide el valor (px, em, ...)
			tamDefecto = parseInt(tamDefecto.substring(0,tamDefecto.length-2),10);
			
			//Asigno el nuevo valor
			reglas[i].style.fontSize = (tamDefecto+incremento)+"px";
		}
		
		win.tamFuente = tam;
		
	}
	
}
//Obtiene las relgas de las CSS vinculadas al documento actual, que contienen
//una especificacion de valor para un determinado atributo CSS
function ObtenerReglasCSS(win, atributo)
{
	var listaReglas = new Array();
	var css;
	var reglas;
	var texto;
		
	atributo = atributo.toLowerCase();
	//Voy recorriendo las hojas de estilo asociadas al documento
	for(i=0; i<win.document.styleSheets.length; i++)
	{
		css = win.document.styleSheets[i];
		
		if(browser.isIE)
			reglas = css.rules;
		else
			reglas = css.cssRules;
			
		//Voy recorriendo las reglas
		for(j=0; j< reglas.length; j++)
		{
			if(browser.isIE)
				texto = reglas[j].style.cssText;
			else
				texto = reglas[j].cssText;
			
			//Busco el atributo en la regla (OJO que IE pone los atributos en mayúscula)
			texto = texto.toLowerCase();
			
			if(texto.indexOf(atributo) != -1)
				//Añado la regla al resultado
				listaReglas[listaReglas.length] = reglas[j];
			
		}
	}
	
	return listaReglas;
}
//Obtiene el valor de un determinado atributo en una regla CSS
function ObtenerValorAtributoRegla(regla, atributo)
{
	var valor = "";
	var texto;
	var atributos;
	
	atributo = atributo.toLowerCase();
	
	//Obtengo el valor de la regla CSS
	if(browser.isIE)
		texto = regla.style.cssText;
	else
		texto = regla.cssText;
	
	texto = texto.toLowerCase();
	
	//Obtengo los atributos
	atributos = texto.split(";");
	
	//Busco el atributo
	for(i=0; i<atributos.length; i++)
	{
		if(atributos[i].indexOf(atributo) != -1)
		{
			valor = atributos[i];
			break;
		}
	}
	
	//Me quedo sólo con el valor
	valor = valor.split(":")[1];
	
	return valor;
}
//Obtiene el valor de un parámetro en una URL
function ObtenerParam(url, param)
{
	var aux = url.split("?");
	var aux2;
	var res = "";
	var params;

	//Obtengo los parámetros
	params = aux[1];
	
	if(params)
	{
		//Busco el parámetro que me piden
		aux = params.split("&");
		for(i=0; i<aux.length; i++)
		{
		 	aux2 = aux[i].split("=");
		 	//Izqda nombre param, Drecha. valor param
			if(aux2[0] == param)
		 	{
			 	//Obtengo su valor
		 		res = aux2[1];
		 		break;	
			}
		}
	}
	
	return res;
}
//Comprueba que se ha introducido un login y un password para logarse
function ComprobarUsuarios()
{
	var error = "";
	var log = "";
	if(document.formUsuarios.password.value == "")
	{
		error = "Debe introducir su password para registrarse.\n" + error;
		document.formUsuarios.password.focus();
	}
	if(document.formUsuarios.usuario.value == "")
	{
		error = "Debe introducir su login para registrarse.\n" + error;
		document.formUsuarios.usuario.focus();
	}
	
	if(error != "")
		alert(error);
	else
		//Registrar al usuario via servicio web
		RegistrarUsuario_JS(document.formUsuarios.usuario.value,document.formUsuarios.password.value);
	
}
//Comprueba que los datos del formulario de registro de usuarios son correctos.
function ValidarRegistro()
{
	var error = "";
	
	//DATOS DE USUARIO
	if(document.FormRegistro.imagen.value == "" && document.FormRegistro.fotoHidden.value == "")
	{
		error = "Debe seleccionar su imagen.\n" + error;
		document.FormRegistro.imagen.focus();
	}
	if(document.FormRegistro.nick.value == "")
	{
		error = "Debe introducir su nick.\n" + error;
		document.FormRegistro.nick.focus();
	}
	if(document.FormRegistro.respuesta.value == "")
	{
		error = "Debe introducir la respuesta a la pregunta de seguridad.\n" + error;
		document.FormRegistro.respuesta.focus();
	}
	if(document.FormRegistro.pregunta.value == "")
	{
		error = "Debe introducir su pregunta de seguridad.\n" + error;
		document.FormRegistro.pregunta.focus();
	}
	if(document.FormRegistro.password.value == "")
	{
		error = "Debe introducir su password.\n" + error;
		document.FormRegistro.password.focus();
	}
	if(document.FormRegistro.login.value == "")
	{
		error = "Debe introducir su login.\n" + error;
		document.FormRegistro.login.focus();
	}
	
	//DATOS PERSONALES
	if(document.FormRegistro.mail.value == "" || !CompruebaEmail(document.FormRegistro.mail.value))
	{
		error = "Debe introducir una direccion de E-Mail correcta.\n" + error;
		document.FormRegistro.mail.focus();
	}
	if(document.FormRegistro.telefono.value == "" || isNaN(parseInt(document.FormRegistro.telefono.value,10)))
	{
		error = "Debe introducir un numero de telefono.\n" + error;
		document.FormRegistro.telefono.focus();
	}
	if(document.FormRegistro.apellidos.value == "")
	{
		error = "Debe introducir sus apellidos.\n" + error;
		document.FormRegistro.apellidos.focus();
	}
	if(document.FormRegistro.nombre.value == "")
	{
		error = "Debe introducir su nombre.\n" + error;
		document.FormRegistro.nombre.focus();
	}
	
	if(error != "")
		alert(error);
	else
		document.FormRegistro.submit();
}
//Elimina la informacion de sesion del usuario y recarga la pagina
function DesconectarUsuario()
{
	CallWebService("servicio.asmx", "DesconectarUsuario_WM", "", "document.location.reload(true);");
}
//Da de baja al usuario actualmente registrado en la web
function BajaUsuario()
{
	CallWebService("servicio.asmx", "BajaUsuario_WM", "", "DesconectarUsuario();");
}
//Pide la seccion de registro de usuarios y la rellena con los datos del usuario actual
function ModificarUsuario()
{
	//Obtener la seccion de registro y llenarla con los datos del usuario actual
	PedirSeccion('Registro usuarios');
	PedirDatosUsuario();
}
//Obtiene la sección de recuperación de password para un login determinado
function RecuperarPassword()
{
    var login = document.formUsuarios.usuario.value;
    
    if(login == "")
    {
        document.formUsuarios.usuario.focus();
        alert("Debe introducir el usuario para el que desea recuperar el password");
    }
    else
    {
        //Traer la sección de recuperación password
        PedirSeccion('Recovery');
        
        //Insertar la pregunta de seguridad en la sección
        CallWebService("servicio.asmx", "GetPreguntaSeguridad", "login="+login, "document.getElementById('preguntaSeguridad').innerHTML = res+':'; document.formRecovery.login.value = \""+login+"\";", true);
    }
}
//Valida y obtiene el password de un usuario
function ValidarRecovery()
{
    var login = document.formRecovery.login.value;
    var respuesta = document.formRecovery.respuesta.value
    
    if(respuesta == "")
    {
        document.formRecovery.respuesta.focus();
        alert("Debe introducir la respuesta a la pregunta de seguridad.");
    }
    else
    {
        //Insertar la pregunta de seguridad en la sección
        CallWebService("servicio.asmx", "GetPassword", "login="+login+"&respuesta="+respuesta, "alert(res);", true);
    }
}
//Rellena los datos de usuario de la sección 'Registro de usuarios'
function RellenarDatosUsuario(usuario)
{
	if(document.FormRegistro && usuario)
	{
		//Rellenar los campos de registro con los datos del usuario
		document.FormRegistro.nombre.value = usuario.F3001_Nombre;
		document.FormRegistro.provincia.selectedIndex = 0;
		for(i=0; i<document.FormRegistro.provincia.options.length; i++)
		{
			if(document.FormRegistro.provincia.options[i].value == usuario.F3001_Provincia)
			{
				document.FormRegistro.provincia.selectedIndex = i;
				break;
			}
		}
		document.FormRegistro.apellidos.value = usuario.F3001_Apellidos;
		document.FormRegistro.localidad.value = usuario.F3001_Localidad;
		document.FormRegistro.telefono.value = usuario.F3001_Telefono;
		document.FormRegistro.direccion.value = usuario.F3001_Direccion;
		document.FormRegistro.mail.value = usuario.F3001_Email;
		document.FormRegistro.cp.value = (usuario.F3001_CP == -1) ? "" : usuario.F3001_CP;
		document.FormRegistro.login.value = usuario.F3001_Login;
		document.FormRegistro.respuesta.value = usuario.F3001_Respuesta;
		document.FormRegistro.pregunta.value = usuario.F3001_Pregunta;
		document.FormRegistro.password.value = usuario.F3001_Password;
		document.FormRegistro.nick.value = usuario.F3001_Nick;
		for(i=0; i<document.FormRegistro.idioma.options.length; i++)
		{
			if(document.FormRegistro.idioma.options[i].value == usuario.F1008_IdiomaPreferido)
			{
				document.FormRegistro.idioma.selectedIndex = i;
				break;
			}
		}
		document.FormRegistro.fotoHidden.value = "ObtenerImagen.aspx?id="+usuario.F2001_Foto;
		document.FormRegistro.fotoHidden.style.display = "";
		document.FormRegistro.accion.value = "modificar";	
	}
}
//Comprueba que el valor del campo de busqueda en la home
function BuscarEnInternet(query,start)
{
	var html = "";
	
	if(query != "")
	{
		var centro = getElement("Main_zonaCentral");
		var idioma = ObtenerParam(document.location+"","idioma");
		
		if(idioma == "")
			idioma = "Castellano";
			
		switch(idioma)
		{
			case "Castellano":
				idioma = "es";
				break;
			case "Valenciano":
				idioma = "ca";
				break;
			case "Ingles":
				idioma = "en";
				break;
			case "Aleman":
				idioma = "de";
				break;
			case "Frances":
				idioma = "fr";
				break;
			default:
				idioma = "es";
		}
		
		//Llamar a google en una nueva ventana
		window.open("http://www.google.es/search?hl="+idioma+"&q="+query);
	}
	
}
//Elimina el boton de cerrar de una capa
function EliminarCerrar(capa)
{
	//Compruebo que la capa existe
	if(capa)
	{
		//Obtengo el componente
		var componente = capa.id.split("_")[0];
		var cerrar = getElement(componente+"_cerrar");

		if(cerrar)
			//Eliminarlo
			cerrar.parentNode.removeChild(cerrar);
	}
}
//Añade el boton de cerrar en la parte superior derecha de una capa
//Cuando se presione se produce la eliminacion de la capa en concreto
function AnadirCerrar(capa)
{
	//Compruebo que existe la capa
	if(capa)
	{

		//Obtengo el componente en el que se crea el boton cerrar
		var componente = capa.id.split("_")[0];
		var cerrar = document.createElement("DIV");
		var aux = (browser.isIE) ? "on" : "";
		cerrar.setAttribute("id",componente+"_cerrar");
		
		//Posiciono el botón en la esquina superior izquierda de la capa
		if(componente == "Foros")
			cerrar.style.marginTop = "-20px";
		cerrar.style.backgroundImage = "url(./iconos/cerrar.gif)";
								
		//Cuelga de mapa para que sea visible y capture los eventos
		capa.insertBefore(cerrar,capa.firstChild);
		//Vinculo los eventos del botón cerrar
		if(browser.isIE)
		{
			//En cada componente el cerrar cierra una ventana determinada
			if(componente == "Foros")
			{
				if(capa.getAttribute("id") == "Foros_mensaje")
					cerrar.onclick = EliminarMensaje;
				else
					cerrar.onclick = EliminarCuadroMensajes;
			}
			else if(componente == "Organigrama")
			{
				cerrar.onclick = EliminaDatosMiembro;
			}
		}
		else
		{
			if(componente == "Foros")
			{
				if(capa.getAttribute("id") == "Foros_mensaje")
					cerrar.addEventListener("click",EliminarMensaje,false);
				else
					cerrar.addEventListener("click",EliminarCuadroMensajes,false);
			}
			else if(componente == "Organigrama")
			{
				cerrar.addEventListener("click",EliminaDatosMiembro,false);
			}
		}					
	}
}
//Obtiene el icono correspondiente a un tipo de documento
function GetTipoDoc(tipo)
{
	var res ="./iconos/";
	//Los tipos están sacados de la columna de tipos de la base de datos
	switch(tipo)
	{
		case ".pdf":
			res += "pdf.gif";
			break;
		case ".jpg":
		case ".bmp":
		case ".gif":
		case ".png":
			res += "dibujo.gif";
			break;
		case ".avi":
		case ".mpg":
		case ".mov":
			res += "video.gif";
			break;
		case ".au":
		case ".mid":
		case ".mod":
		case ".ra":
		case ".wav":
		case ".mp3":
			res += "sonido.gif";
			break;
		case ".xml":
			res += "xml.gif";
			break;
		case ".zip":
		case ".rar":
			res += "zip.gif";
			break;
		case ".html":
		case ".htm":
			res += "html.gif";
			break;
		default:
			res += "doc.gif";	
	}

	return res;
}
//Añade una funcion como manejadora de un evento a un determinado objeto (crossbrowser)
function anadirEvento(objeto, evento, funcion)
{
	if(document.addEventListener)//Para Mozilla
		objeto.addEventListener(evento, funcion, true);
	else//Para IE6
		objeto.attachEvent(evento, funcion);
}
//Elimina una funcion como manejadora de un evento a un determinado objeto (crossbrowser)
function quitarEvento(objeto, evento, funcion)
{
	if(document.removeEventListener)//Para Mozilla
		objeto.removeEventListener(evento, funcion, false);
	else//Para IE6
		objeto.detachEvent(evento, funcion);
}
//Elimina TODOS los elementos HTML que cuelgan de una capa (elemento)
function BorrarHijos(capa)
{
	var aux = capa.firstChild;

	while(aux)
	{
		capa.removeChild(aux);
		aux = capa.firstChild;
	}
}
//Crea una barra de navegacion por paginas en una determinada capa
//PARAMS:
//capa: Elemento del que se va a colgar la barra de navegacion
//paginaActual: Pagina resaltada en la barra de navegacion
//totalPaginas: Numero total de paginas de las que consta la barra
//funcion: Funcion a ejecutar (manejadora de la barra) cuando se pulsa sobre uno de los elementos de navegacion
//REMARKS:
//La barra muestra enlaces al primero, anterior, siguiente, ultimo y 3 paginas alrededor de la actual
//La funcion a ejecutar SOLO puede tener como parametro la pagina a buscar
function MontarNavegacion(capa, paginaActual, totalPaginas, funcion)
{
	var texto, enlace, negrita;
	
	//Borrar los enlaces que hubiera
	BorrarHijos(capa);

	//Añado los elementos de navegación a la barra
	if(paginaActual > 2)
	{
		enlace = document.createElement("A");
		enlace.setAttribute("href","javascript:"+funcion+"(1);");
		texto = document.createTextNode("<<");
		enlace.appendChild(texto);
		capa.appendChild(enlace);
	}
	if(paginaActual > 1)
	{
		enlace = document.createElement("A");
		enlace.setAttribute("href","javascript:"+funcion+"("+(paginaActual-1)+");");
		texto = document.createTextNode("<");
		enlace.appendChild(texto);
		capa.appendChild(enlace);
	}

	for(i=paginaActual-3; i<=paginaActual+3; i++)
	{
		if(i > 0 && i<=totalPaginas)
		{
			//2 casos: página actual ó resto
			if(i == paginaActual)
			{
				negrita = document.createElement("B");
				texto = document.createTextNode(""+paginaActual);
				negrita.appendChild(texto);
				capa.appendChild(negrita);		
			}
			else
			{
				enlace = document.createElement("A");
				enlace.setAttribute("href","javascript:"+funcion+"("+i+");");
				texto = document.createTextNode(""+i);
				enlace.appendChild(texto);
				capa.appendChild(enlace);
			}
		}
	}
		
	if(paginaActual < totalPaginas)
	{
		enlace = document.createElement("A");
		enlace.setAttribute("href","javascript:"+funcion+"("+(paginaActual+1)+");");
		texto = document.createTextNode(">");
		enlace.appendChild(texto);
		capa.appendChild(enlace);
	}
	if(paginaActual < totalPaginas-1)
	{
		enlace = document.createElement("A");
		enlace.setAttribute("href","javascript:"+funcion+"("+totalPaginas+");");
		texto = document.createTextNode(">>");
		enlace.appendChild(texto);
		capa.appendChild(enlace);
	}
						
}
//Abre una URL en un pop-up
function AbrirEnlace(enlace)
{
	if(enlace.toLowerCase().indexOf("http") == -1)
		enlace = "http://"+enlace;
		
	window.open(enlace);
}
//Carga un fichero en la capa central del web (zona de seccion)
//PARAMS:
//URL en la que se encuentra el fichero
function CargarFichero(url)
{
 	var centro = getElement("Main_zonaCentral");
 				
 	centro.style.width = "100%";
 	
	centro.innerHTML = "<IFRAME src='"+url+"' style='width: 100%; height: 800px;' align='middle'>No se ha podido cargar el documento en la zona central.<BR/> Para poder verlo pulse <a href='"+url+"'>aquí</a>.</IFRAME>";
	
	AnadirHistorial(-1000,"Documento");
}
/**************PETICIONES AL SERVIDOR********************/
//Obtiene una imagen desde servidor, en base al id del binario, su ancho y su alto
function PedirImagen(idImagen, ancho, alto)
{
	//Obtener la url actual sin servicio
	var url = (document.location+"");
	url = url.substring(0,url.lastIndexOf('/'));
	var params = "id="+idImagen;
	//Si el id de la imagen es el -3, obtengo la foto por defecto del usuario
	if(idImagen == -3)
		return "./imagenes/anonimo.jpg";
	//Si el id de la imagen es el -2, obtengo la foto por defecto del miembro
	else if(idImagen == -2)
		return "./imagenes/silueta.jpg";
	//Sino obtengo la imagen desde el servidor
	else
	{
		//El ancho y el alto pueden no estar
		if(ancho)
			params += "&width="+ancho;
		if(alto)
			params += "&height="+alto;
		
		return url+"/ObtenerImagen.aspx?"+params;
	}
}
//Descarga o abre un fichero que se encuentra en base de datos
//REMARKS:
//nombre representa el nombre del archivo que se quiere visualizar en el cuadro de descarga
function PedirBinario(idBinario,nombre)
{
	//Obtener la url actual sin servicio
	var url = (document.location+"");
	url = url.substring(0,url.lastIndexOf('/'));

	//El documento se abre en una nueva ventana
	document.location = url+"/ObtenerBinario.aspx?id="+idBinario+"&nombre="+nombre;
}
//Cambia el idioma en el que visualiza la web
function PedirIdioma(idioma)
{
	var urlHome = (document.location+"").split("?")[0];
	var canal;

	//Obtengo el valor del canal
	canal = ObtenerParam(document.location+"","canal");

	//En la primera llamada es el canal de la home
	if(canal == "")
		canal = canalHome;
		
	//Llamo a la home con el nuevo idioma
	document.location = urlHome+"?idioma="+idioma+"&canal="+canal;
}
//Pide al servidor que cambie el canal que se ve en la web (con sus propios datos)
function PedirCanal(canal)
{
	var urlHome = (document.location+"").split("?")[0];
	var idioma, actual;

	//Obtengo el valor del idioma
	idioma = ObtenerParam(document.location+"","idioma");
	//Obtengo el canal actual
	actual = ObtenerParam(document.location+"","canal");

	//En la primera llamada es el canal de la home
	if(idioma == "")
		idioma = "Castellano";
	if(actual == "")
		actual = canalHome;
		
	//Si se pide el canal actual, solo traigo la seccion principal
	//if(actual == canal)
	//	PedirSeccion(GetSeccionCentral_JS());
	//else
		//Llamo a la home con el nuevo idioma
		document.location = urlHome+"?idioma="+idioma+"&canal="+canal;
	
}

//Pide una seccion del web al servidor.
//La seccion esta formada por varios componentes, html y javascript. Además tiene un estilo propio en CSS
function PedirSeccion(idSeccion)
{
    if(cal!=null)  cal.hide();
    
	//Compruebo que el id de la sección es un número ó una cadena no nula
	if(idSeccion && ((!isNaN(parseInt(idSeccion,10)) && parseInt(idSeccion,10) > 0) || (isNaN(parseInt(idSeccion,10)) && idSeccion != "")))
		//Obtengo la sección via SW
		GetSeccionHTML_JS(idSeccion);
	
}
//Añade una seccion al historial de la web.
//PARAMS:
//idSeccion: identificador numérico y de cadena (separados por |) de la sección
//nomSeccion: Cadena a mostrar en el enlace (nombre navegacion)
//REMARKS:
//La navegacion se utiliza para navegar en el canal actual.
function AnadirHistorial(idSeccion, nomSeccion)
{
	var navegacion = getElement("Main_navegacion");
	var pos = -1;
	var ultimo = parseInt(navegacion.getAttribute("ultimo"),10);
	var	actual = parseInt(navegacion.getAttribute("actual"),10);
	var nodo,aux;
	
	//Obtengo el canal actual
	canalActual = ObtenerParam(document.location+"","canal");

	//En la primera llamada es el canal de la home
	if(canalActual == "")
		canalActual = canalHome;
	
	//Buscar idSeccion en el historial
	for(var i=0; i<historial.length; i++)
	{
	  	if(historial[i] && historial[i].indexOf(idSeccion+";") != -1)
		{
			pos = i;
			break;
		}
	}
	
	//Comprobar si la seccion ya existe
	//Si existe no inserto y muevo actual a su posicion
	if(pos != -1)
		actual = pos;
	//Sino vacio desde la actual hasta el final e inserto
	else
	{
	    
		//Vaciar desde el actual hasta el ultimo
		while(actual != ultimo)
		{
			actual = (actual+1)%10;
			delete(historial[actual]);
		}
		
		//Insertar en la siguiente libre
		actual = parseInt(navegacion.getAttribute("actual"),10);
		actual = (isNaN(actual)) ? 0 : (actual+1)%10;
		historial[actual] = idSeccion+";"+nomSeccion;
		//Almacenar
		navegacion.setAttribute("ultimo",actual);
		ultimo = actual;
	}
	
	navegacion.setAttribute("actual",actual);
	
	//Muestro la ruta hasta la seccion actual
	navegacion.innerHTML = "<b>"+(historial[actual].split(";")[1])+"</b>";
	
	//Saco las secciones del historial desde la actual hasta el primer enlace con el menu de navegacion
	//El enlace se identifica con el id de seccion + 10000
	aux = (idSeccion+"").split("|");
	nodo = BuscarElemento((parseInt(aux[0],10)+10000),menuNavegacion);
	if(!nodo)
		nodo = BuscarElemento(aux[1],menuNavegacion);

	pos = ((actual-1)<0) ? 9 : (actual-1);
	while(historial[pos] && !nodo)
	{
		aux = historial[pos].split(";")[0].split("|");
		navegacion.innerHTML = "<a href=\"javascript:PedirSeccion("+aux[0]+");\">"+historial[pos].split(";")[1]+"</a> > " + navegacion.innerHTML;
		
		nodo = BuscarElemento(parseInt(aux[0],10) + 10000,menuNavegacion);
		if(!nodo)
			nodo = BuscarElemento(aux[1],menuNavegacion);
		pos = ((pos-1)<0) ? 9 : (pos-1);		
	}
	
	//Recorro?el menu hasta la raiz
	if(nodo)
	{
		nodo = nodo.padre;
		while(nodo)
		{
		    var enl = (nodo.enlace && nodo.enlace.indexOf("PedirSeccion") != -1) ? nodo.enlace : "javascript:PedirSeccion("+(nodo.id-10000)+");";
		   
		    if(canalActual == canalHome || nodo != menuNavegacion.sigNivel[0])
				navegacion.innerHTML = "<a href='"+enl+"'>"+nodo.nombre+"</a> > " + navegacion.innerHTML;
			nodo = nodo.padre;
		}
	}
	
}
/**************CUADRO DE INFORMACION*******************/
//Pide las imagenes, da tamaño y posicion y asigna eventos a los componentes de los cuadros de informacion que lo requieren
//REMARKS:
//No tiene sentido que haya mas de un componente inicializable en la web
function InicializaCuadro()
{
	var aux;
	
	//Inicializo los foros si existen
	var foros = getElement("CuadroInformacion_forosCabecera");
	if(foros)
	{
		//Asocio el manejador del boton
		aux = foros.parentNode.getElementsByTagName("INPUT")[0];
	
		if(browser.isIE)
			aux.onclick = MostrarEditor;
		else
			aux.addEventListener("click",MostrarEditor,false);
	}
}
//Manejador del click en el botón de participacion de la encuesta
//Comprueba la opcion seleccionada y muestra el mensaje correspondiente
//a la accion realizada o una aclaracion
function ParticiparEncuesta(idEncuesta, idPregunta)
{
	//Obtengo el identificador de la opcion seleccionada en la encuesta
	var opciones = getElement("CuadroInformacion_encuesta").getElementsByTagName("INPUT");
	var seleccionada=null;
	for(i=0; i<opciones.length; i++)
	{
		if(opciones[i].getAttribute("name") == idPregunta && opciones[i].checked)
		{
			seleccionada = opciones[i];
			break;
		}	
	}

	//Compruebo si se ha seleccionado una opcion de la encuesta
	if(seleccionada)
		//Emitir el voto al servidor
		AddVoto_JS(idEncuesta, idPregunta, seleccionada.value);
	else
		alert("Debe seleccionar una opcion de la encuesta para poder participar en ella.");
}
/**************LISTA DE EVENTOS****************/
//Realiza una busqueda en el servidor de las noticias en el año y mes seleccionados en los SELECT
//Obtiene una pagina concreta de esa busqueda.
function BuscarEventos(pagina)
{
	//Obtengo el año y mes seleccionados
	var fecha = document.FormBuscarEventos.fecha.value
    var aux = fecha.split('/');
	var anyo = aux[2];
	var mes = aux[1];
	var dia = aux[0];
	
	//Realizo la búsqueda cuando se han seleccionado un año y un mes
	if(anyo != "" && mes != "" && dia != "")
	{
		//Borrar los eventos que hubieran
		BorrarEventos();
		
		//Pedir al servidor la página de las noticias en ese mes y año
		getElement("Eventos_navegacion").style.display = "none";
		GetPaginaEventos_JS(pagina,dia,mes,anyo);
	}
}
//Almacena y muestra una página de noticias obtenida mediante SW
//PARAMS:
//pagina: Número de la página visualizada.
//listaNoticias: Objeto de tipo 'PaginaNoticias_Out' con los datos de las noticias a mostrar.
function AlmacenarEventos(pagina,listaEventos)
{
    var eventos = getElement("ListaEventos").firstChild;
	var navegacion = getElement("Eventos_navegacion");
	var enlace, texto, tr, td, div, html;
    
    //Llenar la zona central con las nuevas noticias
	for(i=0; i<listaEventos.length; i++)
	{
		tr = document.createElement("TR");
		tr.setAttribute("name","Eventos_evento");
		
		td = document.createElement("TD");
		td.style.padding = "5px";
		
		//Titulo (el primero no saca borde)
		html = "<div id=\"Eventos_titulo\" ";
		if(i == 0)
			html += "style=\"border-top-style: none;\"";
		html += "><a href=\"javascript:GLB_OBJETOS['Evento_In'] = new suceso_In(); GLB_OBJETOS['Evento_In'].F2026_Id = "+listaEventos[i].F2026_Id+"; PedirSeccion('78');\">"+listaEventos[i].E2026_F3009_Titulo_IDIOMA+"</a></div>";
		
		//Lugar 
		html += "<div id=\"Eventos_lugar\">Lugar: "+listaEventos[i].E2029_F3009_Lugar_IDIOMA+"</div>";
		//Fecha
		html += "<div id=\"Eventos_fecha\">"+listaEventos[i].E2029_F3009_IntervaloFechas_IDIOMA+"</div>";
		//Resumen
		html += "<div>"+listaEventos[i].E2026_F3009_Resumen_IDIOMA+"</div>";
		td.innerHTML = html;
			
		tr.appendChild(td);
		eventos.insertBefore(tr,eventos.lastChild);
	}
		
	//Montar la barra de navegación
	MontarNavegacion(navegacion,pagina,GLB_OBJETOS["PaginaEventos_Out"].numPaginas_CALCULADO,"BuscarEventos");
	navegacion.style.display = "";
}
//Elimina los eventos que se estan mostrando en la lista
function BorrarEventos()
{
	var lista = getElement("ListaEventos");
	//TABLE -> TBODY -> TR
	var aux = lista.firstChild.firstChild;

	while(aux)
	{
		if(aux.nodeName == "TR" && aux.getAttribute("name") == "Eventos_evento")
		{
			aux.parentNode.removeChild(aux);
			aux = lista.firstChild.firstChild;	
		}
		aux = aux.nextSibling;
	}
}
/***************FOROS****************/
//Representa los datos de un usuario del foro
function Usuario(id, nick, foto)
{
	//Atributos
	this.id = id;
	this.nick = nick;
	this.foto = foto;
}
//Representa los datos de un adjunto a un mensaje del foro
function Adjunto(id, nombre, descripcion, tipo, tamanyo)
{
	this.id = id;
	this.nombre = nombre;
	this.descripcion = descripcion;
	this.tipo = tipo;
	this.tamanyo = tamanyo;
}
//Representa los datos de un mensaje en el foro
function Mensaje(id, usuario, fecha, titulo, texto)
{
	//Atributos
	this.id = id;
	this.usuario = usuario;
	this.fecha = fecha;
	this.titulo = titulo;
	this.texto = texto;
	this.adjuntos = new Array();

	//Métodos
	this.Adjuntar = Adjuntar;
}
//Adjunta un mensaje a un foto
//REMARKS:
//fichero debe ser un objeto de tipo ADJUNTO
function Adjuntar(fichero)
{
	this.adjuntos[this.adjuntos.length] = fichero;
}
//Pide las imagenes, da tamaño y posicion y asigna eventos a los elementos del foro que lo requieren
function InicializaForos()
{
	var foros = document.getElementsByName("Foros_foro");
	var aux;


	//Asociar el evento click al foro
	for(i=0; i<foros.length; i++)
	{
		aux = foros[i].getElementsByTagName("DIV");
		
		//En Netscape dar una altura a cada foro, de acuerdo al alto del campo del último mensaje
		if(browser.isNS)
		{
			foros[i].style.height = (aux[2].offsetHeight + 10)+"px";
			foros[i].addEventListener("click",AbrirForo,false);
		}
		else
			foros[i].onclick = AbrirForo;
			
	}	
}
//Elimina la capa de adjuntos a un mensaje del foro
function EliminarAdjuntos()
{
	var adjuntos = getElement("Foros_adjuntos");

	if(adjuntos)
		adjuntos.parentNode.removeChild(adjuntos);
}
//Elimina la capa de mensaje que se esta visualizando en un foro
function EliminarMensaje()
{
	var mensaje = getElement("Foros_mensaje");
	var cuadro = getElement("Foros_cuadroMensajes");
	var cerrar = getElement("Foros_cerrar");

	if(mensaje)
	{
		EliminarCerrar(mensaje);
		EliminarAdjuntos();
		mensaje.parentNode.removeChild(mensaje);
		//Si existeun cuadro de mensajes, lo hago visible
		if(cuadro)
			cuadro.style.display = "block";

	}
}
//Elimina la lista de mensajes de un foro
function EliminarCuadroMensajes()
{
	var cuadro = getElement("Foros_cuadroMensajes");

	if(cuadro)
	{
		EliminarCerrar(cuadro);
		EliminarAdjuntos();
		//Eliminarlo
		cuadro.parentNode.removeChild(cuadro);
		
		foroActual.style.backgroundColor = "transparent";
	}
}
//Despliega un foro mostrando, debajo de el, su arbol de mensajes en la pagina 1.
function DesplegarForo(paginaActual, totalPaginas)
{
	var cuadro, navegacion, texto, enlace, idForo, negrita, div;
	var textosFijos = getElement("Foros_textosFijos").innerHTML.split(";");
	if(listaMensajes)
	{
			
		EliminarMensaje();
		//Creo el DIV del cuadro de mensajes (solo uno cada vez)
		EliminarCuadroMensajes();
			
		idForo = foroActual.getAttribute("foro");
		cuadro = document.createElement("DIV");
		cuadro.setAttribute("id","Foros_cuadroMensajes");
		
		//El cuadro se añade antes del siguiente foro
		foroActual.parentNode.insertBefore(cuadro,foroActual.nextSibling);
		
		
		//Añado el boton de participar
		div = document.createElement("DIV");
		div.setAttribute("id","Foros_participar");
		//Almaceno los datos del foro y mensaje (no hay mensaje NUNCA en este enlace)
		div.setAttribute("modo","foro");
		div.setAttribute("foro",idForo);
		div.innerHTML = textosFijos[1];
		
		//Asocio el manejador de eventos
		if(browser.isIE)
			div.onclick = MostrarEditor;
		else
			div.addEventListener("click",MostrarEditor,false);
		
		cuadro.appendChild(div);
		
		//Añado el boton de cerrar
		AnadirCerrar(cuadro);
		
		//Añado la barra de navegacion
		
		div = document.createElement("DIV");
		div.setAttribute("id","Foros_navegacion");
		//Asocio el estilo
		div.setAttribute("className","navegacion"); //IE
		div.setAttribute("class","navegacion"); //Mozilla
				
		cuadro.appendChild(div);
				
		MontarNavegacion(div,paginaActual,totalPaginas,"PedirPagina");
		
		//Creo la lista de los mensajes
		listaMensajes.CreateTree(cuadro,div);
	}
}
//Manejador del click en un elemento de navegacion del cuadro de mensajes de un foro
//Pide y muestra la siguiente pagina de mensajes para el foro actual
function PedirPagina(ordenPagina)
{
	listaMensajes = null;
	//Creo el nodo raiz de la nueva lista
	listaMensajes = new Elemento(-1,"Mensajes del foro");
	var idForo = foroActual.getAttribute("foro");
	//Pido al servidor que envie la lista de mensajes en una página determinada del foro
	GetPaginaForo_JS(idForo, ordenPagina);
}
//Almacena los mensajes de un foro en la estructura de mensajes para visualizarlos
//PARAMS:
//idForo: Identificador del foro gestionado
//ordenPagina: Página de mensajes visualizada en el foro
//elementos: Objeto de tipo 'PaginaForo_Out' con los mensajes del foro.
function AlmacenarMensajesForo(idForo, ordenPagina, elementos)
{
  	var aux;
  	
    //Primero inserto los que no dependen de nadie que estàn al principio del array
	for(i=0; i<elementos.length; i++)
	{
		if(elementos[i].FK_F2003_RespuestaA != null)
			//El resto de elementos dependen de alguien
			break;
		else
		{
			//Los elementos se insertan con su id
			var ele = new Elemento(elementos[i].F2003_Id,elementos[i].F2003_Titulo+" <i>("+elementos[i].F2003_Fecha.split(",")[0]+")</i>","javascript:PedirMensaje("+foroActual.getAttribute("foro")+","+elementos[i].F2003_Id+");");
			listaMensajes.AddElement(ele);
		}
	}
	//Ahora inserto los que dependen de algún elemento
	for(; i<elementos.length; i++)
	{
		//Busco el padre
		aux = BuscarElemento(elementos[i].FK_F2003_RespuestaA.F2003_Id,listaMensajes);
		//Inserto
		if(aux)
		    aux.AddElement(new Elemento(elementos[i].F2003_Id,elementos[i].F2003_Titulo,"javascript:PedirMensaje("+foroActual.getAttribute("foro")+","+elementos[i].F2003_Id+");"));				
	}
	
    DesplegarForo(ordenPagina,paginasForos[idForo]);
}
//Pide y muestra un mensaje en un foro al servidor
function PedirMensaje(idForo, idMensaje)
{
	var texto;
	//Pido al servidor los datos del mensaje
	mensaje = null;
	GetOpinion_JS(idForo, idMensaje);
}
//Obtiene y muestra el mensaje correspondiente a una opinión del foro
//PARAMS:
//opinion: Objeto de tipo 'Opinion_Out' obtenido a través de SW
function ObtenerMensaje(idForo,idMensaje,opinion)
{
    var autor;
			
	//Obtengo el autor
	if(opinion.fotoUsuario)
		autor = new Usuario(32,opinion.F3001_Nick,opinion.fotoUsuario.F3007_Id);
	else
		autor = new Usuario(32,opinion.F3001_Nick,-3);
	//Lleno el mensaje
	mensaje = new Mensaje(opinion.F2003_Id, autor, opinion.F2003_Fecha, opinion.F2003_Titulo, opinion.F2003_Opinion);
	//Adjunto el archivo
	if(opinion.adjuntoOpinion)
		mensaje.Adjuntar(new Adjunto(opinion.adjuntoOpinion.datosBinario.F3007_Id,opinion.adjuntoOpinion.F2004_Nombre,opinion.adjuntoOpinion.F2004_Nombre,opinion.adjuntoOpinion.datosBinario.F3007_Tipo,""));
	
	//Lo muestro
    MostrarMensaje(idForo, idMensaje);
}
//Cuando se hace click en un elemento desplegable del arbol de mensajes en un foro
//borra todos los elementos que se encuentran a partir de un determinado nivel del arbol
function EliminarNodos(nivel)
{
	var cuadro = getElement("Foros_cuadroMensajes");
	var nodos = cuadro.childNodes;
	var icono;

	for(i=0; i<nodos.length; i++)
	{
		//Compruebo el nivel
		if(nodos[i].getAttribute("nivel") > nivel)
		{
			//Borro el nodo
			nodos[i].parentNode.removeChild(nodos[i]);
			i--;
		}
		else if(nodos[i].getAttribute("nivel") == nivel && nodos[i].getAttribute("estado") == "desplegado")
		{
			icono = nodos[i].getElementsByTagName("IMG");
			icono[0].src = GetIcono(2,true,true);
			nodos[i].setAttribute("estado","plegado");
		}
	}
}
//Obtiene un puntero al foro (DIV) sobre el cual se estan pidiendo datos
function ObtenerForo(idForo)
{
	var foros = document.getElementsByName("Foros_foro");

	for(i=0; i<foros.length; i++)
	{
		if(foros[i].getAttribute("foro") == idForo)
		{
			foroActual = foros[i];
			break;
		}
	}
}
//Muestra una capa con los adjuntos a un mensaje
function MostrarAdjuntos()
{
	var divAdjuntos,fila;
	var cuerpo = getElement("Foros_cuerpo");
	var foro = getElement("Foros");
	var icoAdjuntos = getElement("Foros_cabeceraAdjuntos").firstChild;
	var icono,enlace,texto;

	//Si el div ya está creado me lo cargo
	if(getElement("Foros_adjuntos"))
	{
		EliminarAdjuntos();
		//Cambio el icono a apagado
		icoAdjuntos.src = "./iconos/adjuntosOFF.gif";
	}
	else
	{
		//Creo un div y lo posiciono debajo de la cabecera y a la derecha
		divAdjuntos = document.createElement("DIV");
		divAdjuntos.setAttribute("id","Foros_adjuntos")
		//Añado los adjuntos a la capa
		for(i=0; i<mensaje.adjuntos.length; i++)
		{
			fila = document.createElement("DIV");
			//La última fila sin el borde inferior
			if(i == mensaje.adjuntos.length-1)
					fila.style.border = "none";
			
			//Añado el icono, el enlace y el tamaño del adjunto
			icono = document.createElement("IMG");
			icono.src = GetTipoDoc(mensaje.adjuntos[i].tipo);
			fila.appendChild(icono);
			enlace = document.createElement("A");
			enlace.href = "javascript:PedirBinario("+mensaje.adjuntos[i].id+",'"+mensaje.adjuntos[i].nombre+"');";
			texto = document.createTextNode(" "+mensaje.adjuntos[i].descripcion+" ("+mensaje.adjuntos[i].tamanyo+")");
			enlace.appendChild(texto);
			fila.appendChild(enlace);
			divAdjuntos.appendChild(fila);
			
			
		}
		foro.appendChild(divAdjuntos);

		//Posiciono la capa
		divAdjuntos.style.top = cuerpo.offsetTop+"px";
		divAdjuntos.style.left = (cuerpo.offsetLeft + cuerpo.offsetWidth - divAdjuntos.offsetWidth)+"px";
		
		//Cambio el icono a encendido
		icoAdjuntos.src = "./iconos/adjuntosON.gif";
	}
}
//Manejador del click en un foro.
//Despliega el foro mostrando la primera pagina de mensajes
function AbrirForo(e)
{
	var target;

	//Obtener el elemento que ha disparado el evento
	if(browser.isIE)
		target = window.event.srcElement;
	else
		target = e.target;

	if(target.nodeName == "DIV")
	{
	    if(foroActual)
	        foroActual.style.backgroundColor = "transparent";
	
		//Obtengo un puntero al div del foro que se ha pulsado
		foroActual = this;
		foroActual.style.backgroundColor = "#FFFFF0";
		
		PedirPagina(1);					
	}
}
//Muestra un mensaje de un foro en el cuadro de informacion
//Si existe oculta el arbol de mensajes que se esta viendo
function MostrarMensaje(idForo, idMensaje)
{
	var divMensaje,cuerpo,cabecera,divFoto,divNick,divTitulo,divAdjuntos,imagen,texto,input,divResponder,enlace;
	var cuadro = getElement("Foros_cuadroMensajes");

	//Elimino cualquier mensaje que se estuviera mostrando, pues se muestra uno cada vez
	EliminarMensaje();

	//Si existe un cuadro de mensajes abierto
	//Si el cuadro pertenece al mismo foro que el mensaje que se va a mostrar -> se oculta
	if(cuadro && foroActual.getAttribute("foro") == idForo)
		cuadro.style.display = "none";
	//sino lo borro xq he cambiado de foro
	else if(cuadro)
		EliminarCuadroMensajes();

	//Cuidao con los enlaces a mensaje del foro
	if(!foroActual || foroActual.getAttribute("foro") != idForo)
		ObtenerForo(idForo); 
					
	if(mensaje)
	{
		divMensaje = document.createElement("DIV");
		divMensaje.setAttribute("id","Foros_mensaje");
		divMensaje.setAttribute("mensaje",idMensaje);
		
		//El cuadro se añade antes del siguiente foro
		foroActual.parentNode.insertBefore(divMensaje,foroActual.nextSibling);
		
		//En Netscape no coge el margen de la derecha, por lo que reduzco el tamaño
		if(browser.isNS)
			divMensaje.style.width = (divMensaje.offsetWidth - 20)+"px";
		
		//Añado la cebecera del mensaje
		cabecera = document.createElement("DIV");
		cabecera.setAttribute("id","Foros_cabecera");
		//FOTO
		divFoto = document.createElement("DIV");
		divFoto.setAttribute("id","Foros_cabeceraFoto");
		imagen = document.createElement("IMG");
		divFoto.appendChild(imagen);
		cabecera.appendChild(divFoto);
		//NICK
		divNick = document.createElement("DIV");
		divNick.setAttribute("id","Foros_cabeceraNick");
		texto = document.createTextNode(mensaje.usuario.nick);
		divNick.appendChild(texto);
		cabecera.appendChild(divNick);
		//TITULO
		divTitulo = document.createElement("DIV");
		divTitulo.setAttribute("id","Foros_cabeceraTitulo");
		//Asi se formatean correctamente acentos, ...
		divTitulo.innerHTML = mensaje.fecha+"<BR/>"+mensaje.titulo;
		cabecera.appendChild(divTitulo);
		//ADJUNTOS
		divAdjuntos = document.createElement("DIV");
		divAdjuntos.setAttribute("id","Foros_cabeceraAdjuntos");
		input = document.createElement("INPUT");
		input.setAttribute("type","image");
		input.setAttribute("alt","Archivos adjuntos al mensaje");
		input.setAttribute("title","Archivos adjuntos al mensaje");
		input.setAttribute("src","./iconos/adjuntosOFF.gif");
		//Asocio el manejador del click
		if(browser.isIE)
			input.onclick = MostrarAdjuntos;
		else
			input.setAttribute("onclick","MostrarAdjuntos();");
		divAdjuntos.appendChild(input);
		cabecera.appendChild(divAdjuntos);
					
		//Inserto la cabecera en el mensaje
		divMensaje.appendChild(cabecera);
		
		//Ahora se conocen los tamaños -> Pido la imagen
		imagen.src = PedirImagen(mensaje.usuario.foto,divFoto.offsetWidth,divFoto.offsetHeight);
		
		//CUERPO
		cuerpo = document.createElement("DIV");
		cuerpo.setAttribute("id","Foros_cuerpo");
		//El texto del cuerpo está formateado mediante TAGS HTML
		cuerpo.innerHTML = mensaje.texto;
		divMensaje.appendChild(cuerpo);
		
		//Añado el botón de cerrar
		AnadirCerrar(divMensaje);
		
		//Añado el botón de respuesta
		divResponder = document.createElement("DIV");
		divResponder.setAttribute("id","Foros_responder");
		enlace = document.createElement("A");
		//Almaceno los datos del foro y mensaje
		enlace.setAttribute("modo","foro"); //Indica el modo del editor de mensajes
		enlace.setAttribute("foro",idForo);
		enlace.setAttribute("mensaje",idMensaje);
		//Añado el click
		if(browser.isIE)
			enlace.onclick = MostrarEditor;
		else
			enlace.addEventListener("click",MostrarEditor,false);
			
		enlace.setAttribute("href","javascript:;");
		
		texto = document.createTextNode("Responder a este mensaje");
		enlace.appendChild(texto);
		divResponder.appendChild(enlace);
		divMensaje.appendChild(divResponder);
	}
}
//Muestra el editor de mensajes para el foro
function MostrarEditor(e)
{
	//Obtener la url actual sin servicio
	var url = (document.location+"");
	url = url.substring(0,url.lastIndexOf('/'));
	var target;

	//Obtengo el elemento que originó el evento
	if(browser.isIE)
		target = this;
	else
		target = e.currentTarget;

	var modo = target.getAttribute("modo");

	/*PARAMS MODO FORO*/
	//Obtengo los datos del foro y la respuesta 
	//Ambos se encuentran en atributos ("foro" y "mensaje") del elemento que genera el evento click
	var foro = target.getAttribute("foro");
	var mensaje = target.getAttribute("mensaje");
	/*PARAMS MODO CORREO*/
	var direccion = target.getAttribute("direccion");
	
	//Obtengo la url
	url += "/EditorMensajes.aspx?modo="+modo;
	
	//Añado el resto de parametros que se han pasado
	if(mensaje)
		url += "&mensaje="+mensaje;
	if(foro)
		url += "&foro="+foro;
	if(direccion)
		url += "&direccion="+direccion;
					
	//Abro el pop-up
	var win = window.open(url,"","resizable=no,scrollbars=no,width=520,height=465");

}
/***************GALERIA********************/
//OBJETO FOTO
//Representa una foto de la galeria (los datos no la foto en si)
//REMARKS: georeferencia es un objeto de tipo Georeferencia
function Foto(id, binario, descripcion, georeferencia)
{
	this.id = id;
	this.binario = binario;
	this.descripcion = descripcion;
	//La georeferencia puede no estar
	if(georeferencia)
		this.georeferencia = georeferencia;	
	else
		this.georeferencia = null;
}
//Inicializa los elementos que forman parte de la galería
function InicializaGaleria()
{
	var centro = getElement("Galeria_centro");
	var mosaico = getElement("Galeria_mosaico");
	var pantalla = getElement("Galeria_pantalla");
	var foto = getElement("Galeria_foto");
	var efecto = getElement("Galeria_efecto");
	var botPlay = getElement("Galeria_play");
	var descripcion = getElement("Galeria_descripcion");
	var herramientas = getElement("Galeria_herramientas");
    
	//Calculo la altura del centro en función del contenedor del componente
	centro.style.height = (getElement("Galeria").parentNode.offsetWidth*0.7)+"px";

	//Posiciono y doy tamaño a la pantalla de visualización
	//Su ancho es la mitad del centro y 3/5 de su alto
	pantalla.style.top = (mosaico.offsetTop)+"px";

	//Calculo el tamaño de la foto
	foto.style.height = (pantalla.offsetHeight - descripcion.offsetHeight - herramientas.offsetHeight - 10)+"px";

	//Hago el div para el efecto del mismo tamaño que la foto de pantalla y en su misma posicion
	efecto.style.width = foto.offsetWidth+"px";
	efecto.style.height = foto.offsetHeight+"px";
	efecto.style.left = foto.offsetLeft+"px";
	efecto.style.top = foto.offsetTop+"px";
	efecto.style.MozOpacity = 0;
	efecto.style.filter = "alpha(opacity=0)";

	//Asocio eventos
	if(browser.isIE) //IE
	{
		botPlay.onclick = IniciarPresentacion;
		centro.onclick = SeleccionarImagen;
	}
	else //Netscape
	{
		botPlay.addEventListener("click",IniciarPresentacion,false);
		centro.addEventListener("click",SeleccionarImagen,false);	
	}
	
	//Montar la barra de navegacion
	MontarNavegacion(getElement("Galeria_navegacion"), 1, getElement("Galeria").getAttribute("numMosaicos"), "ObtenerMosaico");

	//PONER LA PRIMERA IMAGEN  DEL MOSAICO
	PonerImagen(0);
}
//Pide un mosaico al servidor con un determinado tamaño
//REMARKS: ordenMosaico representa el orden del mosaico dentro de la galeria
function ObtenerMosaico(ordenMosaico)
{
	var galeria = getElement("Galeria").getAttribute("galeria");
	//Obtener y visualizar el mosaico de la galería actual
	fotos = new Array();
	GetMosaico_JS(galeria, ordenMosaico);
}
//Almacena los datos de un mosaico obtenidos a través de SW
//PARAMS:
//ordenMosaico: Orden del mosaico solicitado al servidor.
//mosaico: Objeto de tipo 'Mosaico_Out' con los datos del mosaico.
function AlmacenarMosaico(ordenMosaico,mosaico)
{
    var aux;
    var centro = getElement("Galeria_centro");
    //Del mosaico sólo me interesa el identificador del binario (la imagen en BD)
	var imgMosaico = mosaico.F3007_Id;
	
	//Almaceno los datos de las fotos
	var fotosMosaico = mosaico.listaFotosMosaico;
	
	for(i=0; i<fotosMosaico.length; i++)
	{
		aux = fotosMosaico[i].datosFoto;
		//aux es de tipo fotoGeoreferenciada
		//La georeferencia puede estar o no
		if(aux.datosGeoreferencia)
			fotos[fotos.length] = new Foto(aux.F2001_Id, aux.F3007_Id, aux.E2001_F3009_Descripcion_IDIOMA, new Georeferencia(aux.datosGeoreferencia.F2014_Proveedor, aux.datosGeoreferencia.F2014_X, aux.datosGeoreferencia.F2014_Y, aux.datosGeoreferencia.F2014_AnchoMundo, aux.datosGeoreferencia.F2014_Zoom));
		else
			fotos[fotos.length] = new Foto(aux.F2001_Id, aux.F3007_Id, aux.E2001_F3009_Descripcion_IDIOMA, null);
	}
	
	//PEDIR AL SERVIDOR LA IMAGEN DEL MOSAICO
	aux = getElement("Galeria_mosaico").getElementsByTagName("IMG")[0];
    aux.src = PedirImagen(imgMosaico,centro.offsetWidth,centro.offsetHeight);

    //PONER LA PRIMERA IMAGEN  DEL MOSAICO
    PonerImagen(0);
	
    //Montar la barra de navegacion
    MontarNavegacion(getElement("Galeria_navegacion"), ordenMosaico, getElement("Galeria").getAttribute("numMosaicos"), "ObtenerMosaico");
}
//Obtiene la fila correspondiente a una coordenada interna de la parte central
function Fila(y)
{
	var fil = -1;
	var centro = getElement("Galeria_centro");

	//Aplico una regla de 3
	fil = parseInt(5*y/centro.offsetHeight,10);

	return fil;
}
//Obtiene la columna correspondiente a una coordenada interna de la parte central
function Columna(x)
{
	var col = -1;
	var centro = getElement("Galeria_centro");

	//Aplico una regla de 3
	col = parseInt(6*x/centro.offsetWidth,10);

	return col;
}
//Hace un recuadro alrededor de la imagen posicionada en la casilla fil,col del mosaico
function MarcarCasilla(fil, col)
{
	var left,top,width,height;
	var centro = getElement("Galeria_centro");
	var div,marco;

	//Si ya hubiera un marco, me lo cargo
	marco = getElement("Galeria_marco");

	if(marco)
		centro.removeChild(marco);

	//Obtengo el ancho y alto de la celda
	width = parseInt(centro.offsetWidth/6,10); 
	height = parseInt(centro.offsetHeight/5,10);

	//Obtengo la posicion de la esquina superior izquierda del recuadro
	left = (col * width) - col;
	top = (fil * height) - fil;

	//Creo el marco, lo pisiciono y le doy tamaño
	;
	div = document.createElement("DIV");
	div.id = "Galeria_marco";
	centro.appendChild(div);
	div.style.left = left+"px";
	div.style.top = top+"px";
}
//Reanuda la visualizacion de las fotos en el modo presentacion
function IniciarPresentacion()
{
	var botPlay = getElement("Galeria_play");
	var foto = getElement("Galeria_foto");

	//Cambio el botón del play por el de pausa
	botPlay.src = "./iconos/icopausa.gif";

	//Cambio el manejador del click
	if(browser.isIE) //IE
		botPlay.onclick = PausarPresentacion;
	else //Netscape
	{
		botPlay.removeEventListener("click",IniciarPresentacion,false);
		botPlay.addEventListener("click",PausarPresentacion,false);
	}

	//Inicio el temporizador
	//Empiezo a traer la imagen de la presentacion
	if(actual < fotos.length-1)
	{
		imgSiguiente = new Image(foto.offsetWidth,foto.offsetHeight);
		imgSiguiente.src = PedirImagen(fotos[actual+1].binario,foto.offsetWidth,foto.offsetHeight);
	}
	intervaloPresentacion = setInterval("PonerImagen(actual+1)",2000);
}
//Pausa la visualizacion en modo presentacion
function PausarPresentacion()
{
	var botPlay = getElement("Galeria_play");

	//Cambio el boton del pausa por el de play
	botPlay.src = "./iconos/icoplay.gif";

	//Cambio el manejador del click
	if(browser.isIE) //IE
		botPlay.onclick = IniciarPresentacion;
	else //Netscape
	{
		botPlay.removeEventListener("click",PausarPresentacion,false);
		botPlay.addEventListener("click",IniciarPresentacion,false);
	}

	//Paro los intervalos
	PararIntervalos();
}
//Detiene los dos intervalos y establece las imagenes con la opacidad correcta
function PararIntervalos()
{
	var foto = getElement("Galeria_foto").getElementsByTagName("IMG");
	var imgEfecto = getElement("Galeria_efecto").getElementsByTagName("IMG");
		
	if(intervaloPresentacion)
	{
		clearInterval(intervaloPresentacion);
		intervaloPresentacion = null;	
	}
	if(intervaloAnimacion)
	{
		clearInterval(intervaloAnimacion);
		intervaloAnimacion = null;
	}

	imgEfecto[0].parentNode.style.MozOpacity = 0;
	imgEfecto[0].parentNode.style.filter = "alpha(opacity=0)";
	foto[0].parentNode.style.MozOpacity = 1;
	foto[0].parentNode.style.filter = "alpha(opacity=100)";
}
//Detiene el modo presentacion y establece la foto actual como la primera 
function DetenerPresentacion()
{
	var foto = getElement("Galeria_foto").getElementsByTagName("IMG");
	PausarPresentacion();
	//Pongo la primera imagen en la pantalla
	PonerImagen(0); 
}
//Lleva a cabo la animacion del cambio de imagen en la presentacion
function AnimarPresentacion()
{
	var foto = getElement("Galeria_foto");
	var efecto = getElement("Galeria_efecto");
		
	//Opacidad varía en la animación de 0 a 100
	if(opacidadEfecto < 100)
	{
		opacidadEfecto += 10;
		//Voy haciendo la imagen de pantalla opaca y la de efecto transparente
		efecto.style.MozOpacity = 1 - opacidadEfecto/100;
		efecto.style.filter = "alpha(opacity="+(100 - opacidadEfecto)+")";
		foto.style.MozOpacity = opacidadEfecto / 100;
		foto.style.filter = "alpha(opacity="+opacidadEfecto+")";
	}
	else
	{
		//Fin de la animacion
		opacidadEfecto = 0;
		window.clearInterval(intervaloAnimacion);
		intervaloAnimacion = null;
		//Empiezo a traer la imagen de la presentación
		;
		if(actual < (fotos.length-1))
		{
			imgSiguiente = new Image(foto.offsetWidth,foto.offsetHeight);
			imgSiguiente.src = PedirImagen(fotos[actual+1].binario,foto.offsetWidth,foto.offsetHeight);
		}
		intervaloPresentacion = window.setInterval("PonerImagen(actual+1)",2000);
	}
}
//Manejador del click sobre la galeria.
//Marca una casilla en la que se encuentra una foto. Si el click es fuera de una foto, no hace nada.
function SeleccionarImagen(e)
{
	//El evento sólo se trata cuando quien lo recibe es el div centro
	//Obtengo la posicion relativa al centro en la que se ha pulsado
	var x,y,fil,col,origen,imagen;

	if(browser.isIE) //IE
	{
		x = window.event.x;
		y = window.event.y;
		origen = window.event.srcElement;
	}
	else //Netscape
	{
		x = e.layerX;
		y = e.layerY;
		origen = e.target;
	}

	if(origen.parentNode.getAttribute("id") == "Galeria_mosaico")
	{

		//Compruebo que se ha pinchado en una celda correcta
		fil = Fila(y);
		col = Columna(x);

		if(col < 3 || fil > 3)
		{
			//Obtengo la imagen que se quiere
			//2 casos
			if(fil > 3)
				//Matriz 1x6
				imagen = 12 + (fil-4)*6 + col;
			else
				//Matriz 4x3
				imagen = (fil*3)+col;
			
			if(imagen >= 0 && imagen < fotos.length)
			{
				//Paro la presentacion
				PausarPresentacion();
				
				//Marco la casilla
				MarcarCasilla(fil,col);
				PonerImagen(imagen);
			}
		}
	}
}
//Detiene la presentacion y establece como imagen de pantalla la que ocupa la posicion
//indiceImagen en el Array de Fotos
function PonerImagen(indiceImagen)
{
	//En los extremos no se hace nada
	if(indiceImagen < 0)
		actual = 0;
	else if(indiceImagen > fotos.length-1)
	{
		actual = fotos.length-1;
		//Si estoy en el modo presentacion -> fin de la presentacion
		if(intervaloPresentacion)
		{
			clearInterval(intervaloPresentacion);
			intervaloPresentacion = null;	
		}
	}
	else 
	{
		var foto = getElement("Galeria_foto").getElementsByTagName("IMG");
		var imgEfecto = getElement("Galeria_efecto").getElementsByTagName("IMG");
		var descripcion = getElement("Galeria_descripcion");
		var fil,col;
		var texto;
		var aux;
		
		actual = indiceImagen;
		
		//2 formas de mostrarla:
		//Con efecto en el modo presentacion
		if(intervaloPresentacion)
		{
			//Cambio la imagen de pantalla al DIV EFECTO
			imgEfecto[0].src = foto[0].src;
			//Hago el DIV EFECTO completamente opaco y el DIV PANTALLA completamente transparente
			imgEfecto[0].parentNode.style.MozOpacity = 1;
			imgEfecto[0].parentNode.style.filter = "alpha(opacity=100)";
			foto[0].parentNode.style.MozOpacity = 0;
			foto[0].parentNode.style.filter = "alpha(opacity=0)";
			//Pongo la siguiente imagen en el DIV PANTALLA
			foto[0].src = imgSiguiente.src;
			foto[0].setAttribute("alt",fotos[actual].descripcion);
			foto[0].setAttribute("title",fotos[actual].descripcion);
			//Inicio el intervalo de animacion
			clearInterval(intervaloPresentacion);
			intervaloPresentacion = null;
			intervaloAnimacion = setInterval("AnimarPresentacion()",50);
		}
		//Sin efecto
		else
		{
			//Establezco la imagen en la posicion indiceImagen en la pantalla
			foto[0].src = PedirImagen(fotos[actual].binario,foto[0].offsetWidth,foto[0].offsetHeight);
			foto[0].setAttribute("alt",fotos[actual].descripcion);
			foto[0].setAttribute("title",fotos[actual].descripcion);
		}
		
		//Pongo la descripcion
		aux = descripcion.firstChild;
		if(aux)
			aux.nodeValue = fotos[actual].descripcion;
		else
		{
			texto = document.createTextNode(fotos[actual].descripcion);
			descripcion.appendChild(texto);
		}
		
		//Marco la casilla
		//2 casos
		if(actual >= 0 && actual <= 11)
		{
			//Matriz 4x3
			fil = parseInt(actual/3,10);
			col = actual % 3;
		}
		else
		{
			//Matriz 1x6
			fil = parseInt((actual-12)/6,10)+4;
			col = (actual-12) % 6; 
		}
		
		MarcarCasilla(fil,col);
	}
}
//Expande la imagen mostrada en el visor en un pop-up
function Expandir()
{
	//Abro un pop-up con la imagen seleccionada
	win = window.open(PedirImagen(fotos[actual].binario,null,null));
	win.status = fotos[actual].descripcion;
	
}
//Para escribir menos :)
function getElement(nombre)
{
	return document.getElementById(nombre);
}
/************MENU NAVEGACION*************/
//Crea el menu de navegacion, desplegando la ultima seccion y dentro de esta la primera
function InicializaMenu()
{		 
	var menu = getElement("MenuNavegacion");
	var nodo;
	menuNavegacion.CreateMenu(menu,null);


	//Se abre el último
	var aux = menu.lastChild.lastChild;
	if(aux)
	{
		nodo = menuNavegacion.sigNivel[menuNavegacion.sigNivel.length-1];
		nodo.CreateMenu(aux,null);
		aux.setAttribute("estado","desplegado");
		aux.style.fontStyle = "italic";
		//Dentro abro el primero
		nodo = nodo.sigNivel[0];
		aux = aux.getElementsByTagName("UL")[0].firstChild;
		if(aux && nodo.sigNivel.length > 0)
		{
			nodo.CreateMenu(aux,null);
			aux.setAttribute("estado","desplegado");
			aux.style.fontStyle = "italic";
			aux.style.fontWeight = "bold";
		}
	}
	
}

/**************LISTA NOTICIAS***************/
//Realiza una busqueda en el servidor de las noticias en el año y mes seleccionados en los SELECT
//Obtiene una pagina concreta de esa busqueda.
function BuscarNoticias(pagina)
{
    //Obtengo el año y mes seleccionados
    var fecha = document.FormBuscarNoticias.fecha.value
    var aux = fecha.split('/');
	var anyo = aux[2];
	var mes = aux[1];
	var dia = aux[0];
	
	//Realizo la busqueda cuando se han seleccionado un año y un mes
	if(anyo != "" && mes != "" && dia != "")
	{
		//Borrar las noticias que hubieran
		BorrarNoticias();
		
		//Pedir al servidor la pagina de las noticias en ese mes y año
		getElement("Noticias_navegacion").style.display = "none";
		GetPaginaNoticias_JS(pagina,dia,mes,anyo);
	}
}
//Almacena y muestra una página de noticias obtenida mediante SW
//PARAMS:
//pagina: Número de la página visualizada.
//listaNoticias: Objeto de tipo 'PaginaNoticias_Out' con los datos de las noticias a mostrar.
function AlmacenarNoticias(pagina,listaNoticias)
{
    var noticias = getElement("ListaNoticias").firstChild;
	var navegacion = getElement("Noticias_navegacion");
	var enlace, texto, tr, td, div, html;
    
    //Llenar la zona central con las nuevas noticias
	for(i=0; i<listaNoticias.length; i++)
	{
		tr = document.createElement("TR");
		tr.setAttribute("name","Noticias_noticia");
		
		td = document.createElement("TD");
		td.style.padding = "5px";
		
		//Fecha (la primera no saca borde)
		html = "<div id=\"Noticias_fecha\" ";
		if(i == 0)
			html += "style=\"border-top-style: none;\"";
		html += ">"+listaNoticias[i].F2026_FechaDesde+"</div>";

		//Titulo
		html += "<div id=\"Noticias_titulo\">";
		var idioma = gup('idioma');
		var canal = gup('canal');
        
        if (idioma == '' && canal == '') 
            html += "<a href='HomeTeulada.aspx?noticia=" + listaNoticias[i].F2026_Id + "'>";  
        else 
            html += "<a href='HomeTeulada.aspx?idioma=" + idioma + "&canal=" + canal + "&noticia=" + listaNoticias[i].F2026_Id + "'>";
        
        html += listaNoticias[i].E2026_F3009_Titulo_IDIOMA + "</a></div>";
		//Resumen
		html += "<div>"+listaNoticias[i].E2026_F3009_Resumen_IDIOMA+"</div>";
		td.innerHTML = html;
		
	    tr.appendChild(td);
		noticias.insertBefore(tr,noticias.lastChild);
		
		
	}
		
	//Montar la barra de navegación
	MontarNavegacion(navegacion,pagina,GLB_OBJETOS["PaginaNoticias_Out"].numPaginas_CALCULADO,"BuscarNoticias");
	navegacion.style.display = "";
}
//Elimina las noticias que se muestran en la lista de noticias con buscador
function BorrarNoticias()
{
	var lista = getElement("ListaNoticias");
	//TABLE -> TBODY -> TR
	var aux = lista.firstChild.firstChild;

	while(aux)
	{
		if(aux.nodeName == "TR" && aux.getAttribute("name") == "Noticias_noticia")
		{
			aux.parentNode.removeChild(aux);
			aux = lista.firstChild.firstChild;	
		}
		aux = aux.nextSibling;
	}
}
//Almacena los datos de un órgano de gobierno, cominsión ó concejalia
//REMARKS:
//Cargos es un array de elementos de tipo 'cargo'
function Organo(id, nombre)
{
	//Identificador en BD del órgano
	this.id = id;
	//Nombre traducido del órgano
	this.nombre = nombre;
	//Cargos
	this.cargos = new Array();

	//Métodos
	this.MuestraOrgano = MuestraOrgano;
	this.BuscarMiembro = BuscarMiembro;
}
//Muestra dinamicamente los datos que se almacenan en la estructura Organo (con cargos y miembros)
function MuestraOrgano()
{
	var datos = getElement("Organigrama_datos");
	var aux, cargos, miembros;
	var div, enlace, texto;

	//Elimino lod datos que puedieraan haber
	aux = datos.firstChild;
	while(aux)
	{
		aux.parentNode.removeChild(aux);
		aux = datos.firstChild;
	}

	//Inserto los nuevos datos del órgano
	//NOMBRE
	div = document.createElement("DIV");
	div.setAttribute("id","Organigrama_titulo");
	texto = document.createTextNode(organo.nombre);
	div.appendChild(texto);
	datos.appendChild(div);

	//Inserto los cargos
	cargos = organo.cargos;
	for(i=0; i<cargos.length; i++)
	{
		div = document.createElement("DIV");
		div.setAttribute("id","Organigrama_seccionOrgano");
		div.setAttribute("name","seccion");
		texto = document.createTextNode(cargos[i].nombre);
		div.appendChild(texto);
		datos.appendChild(div);
		
		//Inserto los miembros del cargo
		miembros = cargos[i].miembros;
		for(dniMiembro in miembros)
		{
			div = document.createElement("DIV");
			div.setAttribute("id","Organigrama_miembroOrgano");
			enlace = document.createElement("A");
			enlace.setAttribute("href","javascript:MuestraDatosMiembro('"+miembros[dniMiembro].dni+"');");
			texto = document.createTextNode(miembros[dniMiembro].nombre);
			enlace.appendChild(texto);
			div.appendChild(enlace);
			datos.appendChild(div);
		}
	}
}
//Busca a un miembro del organo entre los cargos
//PARAMS: 
//dniMiembro: DNI del miembro a buscar
//RETURNS:
//Puntero a un objeto de tipo miembro que se corresponde al buscado o null
function BuscarMiembro(dniMiembro)
{
	var res = null;

	//Busco el miembro entre los miembros de cada uno de los cargos
	for(i=0; i<this.cargos.length; i++)
	{
		res = this.cargos[i].GetMiembro(dniMiembro);
		
		if(res)
			//Encontrado -> FIN
			break;
	}

	return res;
}

/*************************************************/

/***************OBJETO CARGO*********************/
//Almacena los datos de un cargo perteneciente a un órgano
//REMARKS:
//Miembros es un array de elementos de tipo 'miembro'
function Cargo(nombre)
{
	this.nombre = nombre;
	this.miembros = new Array();

	//Métodos
	this.GetMiembro = GetMiembro;
}

//Obtiene un miembro del cargo dado por su dni
//REMARKS: 
//Los miembros se insertan en el array en la posición de su DNI
//RETURNS:
//Puntero a un objeto de tipo miembro que se corresponde al buscado o null
function GetMiembro(dniMiembro)
{
	return this.miembros[dniMiembro];
}

/************************************************/

/***************OBJETO MIEMBRO*********************/
//Almacena la información de un miembro del ayuntamiento
function Miembro(dni, nombre, e_mail, telefono, partido, foto)
{
	//Lleno el valor de los atributos
	this.dni = dni;
	this.nombre = nombre;
	if(e_mail)
		this.e_mail = e_mail;
	else
		this.e_mail = "No disponible";
	if(telefono)
		this.telefono = telefono;
	else
		this.telefono = "No disponible";
	if(partido)	   
		this.partido = partido;
	else
		this.partido = "No pertenece a ninguno";
	this.foto = foto;
}
//Crea el menu de navegacion para el organigrama y posiciona el div con los datos del primer organo
function InicializaOrganigrama()
{
	var divDatos = getElement("Organigrama_datos");
	var menu = getElement("Organigrama_menu");

	//Creo el menú
	organigrama.CreateList(menu,null);

	//Posiciono el div de los datos a la derecha del menú
	divDatos.style.left = (menu.offsetLeft + menu.offsetWidth)+"px";
}
//Muestra una capa debajo del organo del ayuntamiento con los datos del miembro seleccionado
//Cada campo en una linea y la foto al principio
function MuestraDatosMiembro(dniMiembro)
{
	var datosOrgano = getElement("Organigrama_datos");
	var nombreOrgano = getElement("Organigrama_titulo");
	var menu = getElement("Organigrama_menu");
	var divDatos = document.createElement("DIV");
	var div1, div2, texto, miembro, mail, imagen;

	//Elimino los datos del miembro que pudieran estar visualizándose
	EliminaDatosMiembro();

	divDatos.setAttribute("id","Organigrama_datosMiembro");

	//Calculo el margen en función del explorador (1em)
	var margenX = (browser.isIE) ? 12 : 10;
	var margenY = (browser.isIE) ? 15 : 0;

	//Posiciono el div de los datos en la esquina inferior izquierda del nombre del órgano
	//divDatos.style.left = (datosOrgano.offsetLeft - menu.offsetWidth + 2)+"px"; //2 es el tam del borde
	divDatos.style.left = (menu.offsetLeft + 2)+"px"; //2 es el tam del borde
	divDatos.style.top = (nombreOrgano.offsetTop + nombreOrgano.offsetHeight)+"px";

	//Obtengo el miembro a mostrar	
	miembro = organo.BuscarMiembro(dniMiembro);
		
	//Asocio los datos del miembro al div de datos de el organo
	for(atributo in miembro)
	{
		//El E-MAIL se muestra como un link y la foto como una imagen
		if(atributo != "foto")
		{
			div1 = document.createElement("DIV");
			div1.setAttribute("id","Organigrama_campo");
			texto = document.createTextNode(organigramaTextos[atributo].toUpperCase());
			div1.appendChild(texto);
			div2 = document.createElement("DIV");
			texto = document.createTextNode(miembro[atributo]);
			
			//Si es el e-mail, el texto cuelga del enlace
			if(atributo == "e_mail" && miembro[atributo] != "No disponible")
			{
				mail = document.createElement("A");
				mail.setAttribute("href","mailto:"+miembro[atributo]);
				mail.appendChild(texto);
				div2.appendChild(mail);
			}
			else
				div2.appendChild(texto);
				
			div1.appendChild(div2);
			divDatos.appendChild(div1);
		}
		else
		{
			//Creo la foto
			imagen = document.createElement("IMG");
			imagen.setAttribute("alt","Sin foto");
			imagen.setAttribute("title","Sin foto");
			//La foto va al principio
			divDatos.insertBefore(imagen, divDatos.firstChild);
			
		}
	}	

	datosOrgano.appendChild(divDatos);
	imagen.src = PedirImagen(miembro[atributo],imagen.offsetWidth-2,imagen.offsetHeight-2);
	AnadirCerrar(divDatos);
}
//Elimina la capa de datos del miembro si se esta visualizando, junto con los manejadores asociados
function EliminaDatosMiembro()
{
	var datos = getElement("Organigrama_datosMiembro");
	var cerrar = getElement("Organigrama_cerrar");
	var aux = (document.all) ? "on" : "";
					
	if(cerrar)
	{
		//Elimino los eventos asociados y cierro
		quitarEvento(cerrar,aux+"click",EliminaDatosMiembro);
		datos.removeChild(cerrar);
	}

	if(datos)
		getElement("Organigrama_datos").removeChild(datos);
}
//Pide al servidor los datos del organo seleccionado en el menu del organigrama
//Tras obtener los datos (miembros), los muestra en el div que esta junto al menu
function PedirOrgano(idOrgano)
{
	//Vacio los datos del organo actual
	organo = null;
	//Obtengo los nuevos datos
	GetOrganoSeleccionado_JS(idOrgano);
}
function AlmacenarOrgano(organoSeleccionado)
{
    var cargos;
	var miembros;
	var aux;
	
    //Creo el órgano
	organo = new Organo(organoSeleccionado.F2010_Id,organoSeleccionado.E2010_F3009_Nombre_IDIOMA);
	
	//Asocio los cargos al órgano
	cargos = organoSeleccionado.listaCargos;
	for(i=0; i<cargos.length; i++)
	{
		//El cargo se inserta en la siguiente posición libre del array
		organo.cargos[organo.cargos.length] = new Cargo(cargos[i].E2011_F3009_Nombre_IDIOMA);
		
		//Inserto los miembros de ese cargo
		aux = organo.cargos[organo.cargos.length-1].miembros;
		miembros = cargos[i].listaMiembros;
		
		for(j=0; j<miembros.length; j++)
		{
			//Inserto en la posición dada por el DNI del miembro (para búsquedas rápidas)
			//Cuidado con la foto que puede no estar
			if(miembros[j].fotoMiembro)
				aux[miembros[j].F2008_Dni] = new Miembro(miembros[j].F2008_Dni, miembros[j].F2008_Nombre, miembros[j].F2008_Email, miembros[j].F2008_Telefono, miembros[j].F2008_Partido, miembros[j].fotoMiembro.F3007_Id);
			else
				//Imagen por defecto (silueta.jpg)
				aux[miembros[j].F2008_Dni] = new Miembro(miembros[j].F2008_Dni, miembros[j].F2008_Nombre, miembros[j].F2008_Email, miembros[j].F2008_Telefono, miembros[j].F2008_Partido, -2);
		}
	}
	
	//Lo muestro
    if(organo)
        organo.MuestraOrgano();
    else
        alert("No existen datos sobre el organo seleccionado.");
}
/**********CONCEJALIA***********/
//Establece el primer campo de datos (informacion) como el seleccionado, ya que es el que
//monta por defecto la XSL
function InicializaConcejalia()
{
	//Selecciono el primer elemento del menu
	;
	var menu = getElement("Concejalia_menu");
	var enlaces = menu.getElementsByTagName("A");
	var contacto = getElement("Concejalia_menuContacto");
	
	//No pido los datos, ya que los ha puesto la XSL
	enlaces[0].parentNode.id = "Concejalia_menuSeleccionado";
	
	//Asocio el click del menu de contacto para que muestre el editor de mensajes
	if(browser.isIE)
		contacto.onclick = MostrarEditor;
	else
		contacto.addEventListener("click",MostrarEditor,false);
	
}
//Selecciona un apartado del menu y carga los datos en la zona de datos del componente
function SeleccionarMenu(idMenu)
{
	var menu = getElement("Concejalia_menu");
	var enlaces = menu.getElementsByTagName("A");
	var seleccionado = getElement("Concejalia_menuSeleccionado");
	var capaDatos = getElement("Concejalia_datos");
	var idConcejalia, idConcejal;
	var aux;

	//Si ya habia seleccionado uno, lo deselecciono
	if(seleccionado)
		seleccionado.id = "";
	
	//Obtener el enlace que se ha pulsado
	for(i=0; i<enlaces.length; i++)
	{
		if(enlaces[i].getAttribute("menu") == idMenu)
		{
			seleccionado = enlaces[i];
			break;
		} 			
	}
	
	//Seleccionar el nuevo elemento del menu
	seleccionado.parentNode.id = "Concejalia_menuSeleccionado";
	idConcejalia = seleccionado.getAttribute("concejalia");
	idConcejal = seleccionado.getAttribute("concejal");
	
	//Realizar la peticion de servicio
	switch(idMenu)
	{
		case 1: //INFORMACION
			//Pido la pagina de ambitos de la concejalia
			GetInformacionConcejalia_JS(idConcejalia);
			break;
		case 2: //CONCEJAL
			//Pido los datos del conejal presidente de la concejalia
			GetConcejal_JS(idConcejal);
			break;
		case 3: //AMBITOS
			//Pido la pagina de ambitos de la concejalia
			GetAmbitoConcejalia_JS(idConcejalia);
			break;
		case 4: //EQUIPAMIENTO
			//Pido la pagina de equipamiento de la concejalia
			GetEquipamientoConcejalia_JS(idConcejalia);
			break;
		case 5: //ENLACES
			//Obtengo los enlaces y documentos relacionados con la concejalia (tipo "enlacesConcejalias")
			GetEnlacesConcejalia_JS(idConcejalia);
			break;
		case 6: //CONTACTO
			//Seguidamente el click muestra el Editor de mensajes para enviar un correo a la concejalia
			//Eso es pq se vincula el evento a la funcion al inicializar el componente
			break;
	}
}

//Muestra los datos de un concejal en una capa (DHTML)
//PARAMS:
//capa: Capa (elemento HTML) en la que se van a mostrar los datos del concejal
//datosConcejal: Objeto de tipo "concejal" con los datos del concejal
//textosEstaticos: Array de tipos "objetoFijo", cada una es un texto estatico determinado en el componente
function MostrarConcejal(capa, datosConcejal, textosEstaticos)
{
	//Creo el codigo HTML como una cadena
	var html,actos,anyos;
	
	html = "<div class='Concejalia_tituloSecundario'>"+
				textosEstaticos[12].F3015_Texto_Path+
		"	</div>"+
		"	<div id='Concejalia_datosConcejal'>"+
		"			<table cellspacing='0' cellpadding='0'>"+
		"			 	<tr>"+
		"					<td width='100'>";
		
		//INSERTO LA IMAGEN (Sino tiene -> una por defecto)
		if(datosConcejal.fotoConcejal)
			html += "<img ismap='true' src='ObtenerImagen.aspx?id="+datosConcejal.fotoConcejal.F3007_Id+"&width=100&height=100' alt='"+datosConcejal.fotoConcejal.E2001_F3009_Descripcion_IDIOMA+"' title='"+datosConcejal.fotoConcejal.E2001_F3009_Descripcion_IDIOMA+"'/>";
		else
			html += "<img ismap='true' src='./imagenes/silueta.jpg' alt='Foto no disponible' title='Foto no disponible'/>";
			
	html +=	"				</td>"+
		"					<td width='40%' style='padding-right: 5px;'>"+
		"						<b>"+textosEstaticos[13].F3015_Texto_Path+"</b> "+datosConcejal.F2008_Nombre+"<br/>"+
		"						<b>"+textosEstaticos[14].F3015_Texto_Path+"</b> "+datosConcejal.F2008_Email+"<br/>"+
		"						<b>"+textosEstaticos[15].F3015_Texto_Path+"</b> "+datosConcejal.F2008_Partido+
		"					</td>"+
		"					<td>"+
	//	"						<b>"+textosEstaticos[16].F3015_Texto_Path+"</b> "+datosConcejal.F2008_Dni+"<br/>"+
		"						<b>"+textosEstaticos[17].F3015_Texto_Path+"</b> "+datosConcejal.F2008_Telefono+"<br/>"+
		"						<b>"+textosEstaticos[18].F3015_Texto_Path+"</b> "+datosConcejal.E2008_F3009_Descripcion_IDIOMA+
		"					</td>"+
		"				</tr>"+
		"			</table>"+
		"	</div>"+
		"	<div class='Concejalia_tituloSecundario'>"+
		"			<div style='float: left; padding-top: 4px; padding-bottom: 4px;'>"+
						textosEstaticos[23].F3015_Texto_Path+
		"s			</div>"+
		"			<form name='FormBuscarActos'>"+
						textosEstaticos[19].F3015_Texto_Path+
		":				<select name='mes' onchange='BuscarActos(1);'>"+
		"					<option selected='true' value=''>--</option>";
		
		//INSERTO LOS MESES
		for(i=0; i<12; i++)
			html += "<option value='"+(i+1)+"'>"+textosEstaticos[i].F3015_Texto_Path+"</option>";
			
	html +=	"			</select>"+
						textosEstaticos[20].F3015_Texto_Path+
		":				<select name='anyo' onchange='BuscarActos(1);'>"+
		"					<option selected='true' value=''>--</option>";
		
		//INSERTO LOS AÑOS
		anyos = datosConcejal.listaAnyos;
		for(i=0; i<anyos.length; i++)
			html += "<option value='"+anyos[i]+"'>"+anyos[i]+"</option>";
		
	html +=	"			</select>"+
		"			</form>"+
		"	</div>";
		
		//INSERTO LA CABECERA DE LOS ACTOS
	html += "<div id='Concejalia_actos'>"+
			"		<table cellspacing='0' cellpadding='0'>"+
			"		 	<tr>"+
			"				<th width='10%'>"+
								textosEstaticos[21].F3015_Texto_Path+
			"				</th>"+
			"				<th width='10%' style='border-left-style: solid;border-left-width: 1px;border-right-style: solid;border-right-width: 1px;border-color: White;text-align: center;'>"+
								textosEstaticos[22].F3015_Texto_Path+
			"				</th>"+
			"				<th>"+
								textosEstaticos[23].F3015_Texto_Path+
			"				</th>"+
			"			</tr><indiceActos>";

		//INSERTO LOS ACTOS
		actos = datosConcejal.listaActos;
		for(i=0; i<actos.length; i++)
		{
			//Los pares tienen un fondo diferente
			if((i+1)%2 == 0)
				html += "<tr class='par' name='Concejalia_acto'>";
			else
				html += "<tr name='Concejalia_acto'>";
			
			html += "<td>"+
						actos[i].F2069_Fecha+
					"</td>"+
					"<td style='border-left-style: solid;border-left-width: 1px;border-right-style: solid;border-right-width: 1px;border-color: White;text-align: center;'>"+
						//El horario se presenta siempre en 3 lineas
						actos[i].F2069_IntervaloHoras.substring(0,actos[i].F2069_IntervaloHoras.indexOf("-")-1)+"<br/>-<br/>"+actos[i].F2069_IntervaloHoras.substring(actos[i].F2069_IntervaloHoras.indexOf("-")+1,actos[i].F2069_IntervaloHoras.length)+
					"</td>"+
					"<td>"+
						"<b>"+actos[i].E2069_F3009_Titulo_IDIOMA+"</b>. <i>("+actos[i].E2069_F3009_Lugar_IDIOMA+")</i><br/>"+
						actos[i].E2069_F3009_Descripcion_IDIOMA+
					"</td>";
		}
	
	html += "	</table>"+
			"</div><div id='Concejalia_navegacion' class='navegacion'></div>";		
	
	//Posteriormente asocio este como el innerHTML de la capa especificada
	capa.innerHTML = html;
}
//Maqueta en una capa una lista de enlaces y una de anexos
//PARAMS:
//capa: Capa (elemento HTML) en la que se van a montar los enlaces y anexos
//enlaces: Array de objetos tipo "enlace" con los datos de los enlaces
//anexos: Array de objetos tipo "anexo" con los datos de los anexos
//REMARKS:
//Se perderan los datos que hubiera en la capa.
//El metodo empleado es el de generar codigo HTML y establecerlo como el codigo interno de la capa
function MostrarEnlaces(capa, enlaces, anexos)
{
	var html = "";
	
	//ENLACES
	html += "<div class='Concejalia_tituloSecundario'>"+
				"Enlaces de interes"+
			"</div>"+
			"<div>"+
			"	<ul>";
	
	//Inserto los enlaces en la lista (son enlaces a url's externas q se muestran en pop-up)		
	for(i=0; i<enlaces.length; i++)
		html += "<li><a href='enlaces[i].F2013_Url' target='_blank'>"+ enlaces[i].E2013_F3009_Descripcion_IDIOMA+ "</a></li>";
	
	html += "	</ul>"+
			"</div>"+
			
	//DOCUMENTOS
			"<div class='Concejalia_tituloSecundario'>"+
				"Documentos de interes"+
			"</div>"+
			"<div>"+
			"	<ul>";
			
	//Inserto los anexos en la lista (son enlaces a ficheros en base de datos)		
	for(i=0; i<anexos.length; i++)
		html += "<li><img src='"+GetTipoDoc(anexos[i].binarioAnexo.F3007_Tipo)+"'/> <a href='javascript:PedirBinario("+ anexos[i].binarioAnexo.F3007_Id +",\""+ anexos[i].binarioAnexo.F3007_NombreFichero +"\");'>"+ anexos[i].E2027_F3009_Descripcion_IDIOMA + "</a> ("+anexos[i].F2027_Fecha+")</li>";
	
	//Montar datos en la capa
	capa.innerHTML = html;
}
//Pide al servidor una pagina de los actos de un concejal en un mes y un año
//PARAMS:
//idConcejal: Identificador del concejal en base de datos
//numPagina: Numero de la pagina que define desde que acto y hasta que acto de un mes y un año se muestra
//REMARKS:
//El numero de resultados por pagina lo define el servidor
function BuscarActos(numPagina)
{
	//TODOS los menus seleccionables almacenan el id del concejal
	var idConcejal = getElement("Concejalia_menuSeleccionado").getElementsByTagName("A")[0].getAttribute("concejal");
	var anyo = document.FormBuscarActos.anyo.value;
	var mes = document.FormBuscarActos.mes.value;
	
	//Solo se piden los datos al servidor si se hay un mes y un año seleccionados
	if(mes != "" && anyo != "")
	    GetPaginaActos_JS(idConcejal, numPagina, mes, anyo);

}
//Muestra una página de actos pedida através de servicio web
//PARAMS:
//numPagina: Número de la pagina de actos que se está viendo.
//aux: Objeto de tipo 'PaginaActos_Out' con los datos de una página de actos del concejal.
function MostrarPaginaActos(numPagina, aux)
{
    var capaActos = getElement("Concejalia_actos");
	var actos = aux.listaActos;
    var html = "";
	
	if(aux && capaActos)
	{
	    html += "<indiceActos>"; 
	    for(i=0; i<actos.length; i++)
	    {
		    //Los pares tienen un fondo diferente
		    if((i+1)%2 == 0)
			    html += "<tr class='par'>";
		    else
			    html += "<tr>";
    		
		    html += "<td>"+
					    actos[i].F2069_Fecha+
				    "</td>"+
				    "<td style='border-left-style: solid;border-left-width: 1px;border-right-style: solid;border-right-width: 1px;border-color: White;text-align: center;'>"+
					    //El horario se presenta siempre en 3 lineas
					    actos[i].F2069_IntervaloHoras.substring(0,actos[i].F2069_IntervaloHoras.indexOf("-")-1)+"<br/>-<br/>"+actos[i].F2069_IntervaloHoras.substring(actos[i].F2069_IntervaloHoras.indexOf("-")+1,actos[i].F2069_IntervaloHoras.length)+
				    "</td>"+
				    "<td>"+
					    "<b>"+actos[i].E2069_F3009_Titulo_IDIOMA+"</b>. <i>("+actos[i].E2069_F3009_Lugar_IDIOMA+")</i><br/>"+
					    actos[i].E2069_F3009_Descripcion_IDIOMA+
				    "</td></tr>";
	    }
    	
	    //Añado el codigo al final de la tabla (antes del </tbody>
	    html = capaActos.innerHTML.substring(0,capaActos.innerHTML.toLowerCase().indexOf("<indiceactos>")) + html + capaActos.innerHTML.substring(capaActos.innerHTML.toLowerCase().indexOf("</tbody>"),capaActos.innerHTML.length)
	    capaActos.innerHTML = html;
    	
	    //Añado el menu de navegacion a la capa
	    MontarNavegacion(getElement("Concejalia_navegacion"), numPagina, aux.numPaginas_CALCULADO, "BuscarActos");
    }
}
/**************LISTA GENERICA*****************/
//Innicializa la lista generica, creando la barra de navegacion
function InicializaLista()
{
	var lista = getElement("ListaGenerica");
	var paginas = lista.getAttribute("numPaginas");

	//La pagina visualizada es la primera
	MontarNavegacion(getElement("ListaGenerica_navegacion"), 1, paginas, "BuscarResultados");
	
}
//Busca una pagina de resultados en la lista generica
//REMARKS:
//El tipo de objeto mostrado en la lista y el numero de paginas se almacena en atributos en el elemento
//HTML principal del componente (id = "ListaGenerica")
function BuscarResultados(numPagina)
{
    var objeto = getElement("ListaGenerica").getAttribute("objeto");
    var zonaDatos = getElement("ListaGenerica_datos");
	var condicion = getElement("ListaGenerica").getAttribute("condicion");
	//Vacio lo que hubiera en la zona de datos
	if(zonaDatos)
		BorrarHijos(zonaDatos);
	
	//Pido al servidor la pagina de resultados en base al objeto actual
	GetPaginaListaGenerica_JS(numPagina,objeto,condicion);
}
//Pide al servidor un determinado objeto de la lista para mostrar los datos completos debajo de la lista
//PARAMS:
//objeto: Nombre del objeto que lo identifica en el servidor
//id: Identificador concreto del objeto en BD del cual se van a presentar los datos
//REMARKS:
//El servidor generará el XML del objeto, lo mezclará con una XSL y devolverá el código HTML y JS
//que el componente u objeto necesita para visualizarse con detalle.
//El HTML se inserta a continuacion de la lista y después se carga el JS para que se comporte correctamente.
function PedirObjeto(objeto,id)
{
	var zonaDatos = getElement("ListaGenerica");
	var zonaSeccion = getElement("Main_zonaCentral");

	//Si es la lista -> Se añade
	if(zonaDatos)
	{
	    zonaDatos = document.createElement("DIV");
		zonaDatos.setAttribute("id","ListaGenerica_datos");
		//La añado a la zona de seccion
		zonaSeccion.appendChild(zonaDatos);
	}
	else
	    zonaSeccion.innerHTML = "<div id='ListaGenerica_datos'></div>";
		
	if(objeto == "")
	    objeto = "Galeria";
	
	//Pido el codigo HTML y JS del objeto al servidor
	GetObjetoListaGen_JS(objeto,id);
}
/*********************ENCUESTA***********************/
//Realiza la validacion de los campos de una encuesta antes de que se envie al servidor
//La validacion consiste en comprobar que se contestan las preguntas requeridas y que el valor es coherente.
function ComprobarEncuesta()
{
	var encuesta = getElement("Encuesta");
	var preguntas = document.FormEncuesta.getElementsByTagName("LI");
	var ok = true;
	var error = "";
	var input,aux1,aux2;
	
	for(var i=0; i<preguntas.length; i++)
	{
		if(error != "")
			break;
		//No todos los LI de la encuesta son preguntas (las de tipo 8 y 9)
		if(preguntas[i].getAttribute("name") == "Encuesta_pregunta" && parseInt(preguntas[i].getAttribute("requerida"),10))
		{
			//La comprobación depende del tipo de pregunta
			switch(preguntas[i].getAttribute("tipo"))
			{
				case "1": //DATOS DEL USUARIO - ABIERTAS
					//El campo de texto debe contener valor
					input = preguntas[i].getElementsByTagName("INPUT")[0];
					if(!input.value)
					{
						error += "Existen campos requeridos que no tienen valor.\nPor favor, introduzca un valor para poder participar en la encuesta.\n";
						//Posiciono en el elemento
						input.focus();
					}
					break;
				case "2": //DATOS DEL USUARIO - CERRADAS
				case "4": //CERRADAS - DICOTÓMICAS - UNA A ELEGIR
				case "5": //CERRADAS - MÚLTIPLES OPCIONES - UNA A ELEGIR
					//Debe seleccionarse algún valor del combo
					input = preguntas[i].getElementsByTagName("SELECT")[0];
					if(input.value == -1)
					{
						error += "Debe seleccionar alguna de las respuestas posibles a la pregunta.\nPor favor, seleccione una de las opciones del desplegable para continuar.\n";
						//Posiciono en el elemento
						input.focus();
					}
					break;
				case "3": //ABIERTAS
					//El textarea debe contener valor
					//El campo de texto debe contener valor
					input = preguntas[i].getElementsByTagName("TEXTAREA")[0];
					if(!input.value)
					{
						error += "Existen campos requeridos que no tienen valor.\nPor favor, introduzca un valor para poder participar en la encuesta.\n";
						//Posiciono en el elemento
						input.focus();
					}
					break;
				
				case "6": //CERRADAS - MULTIPLES RESPUESTAS - VARIAS A ELEGIR
				case "7": //CERRADAS - MULTIPLES RESPUESTAS - VARIAS A ELEGIR - ITEM ABIERTO
					//Tiene que tener valor alguna de las respuestas (abierta o cerrada)
					input = preguntas[i].getElementsByTagName("INPUT");
					aux1 = 0;
					aux2 = false;
					for(var j=0; j<input.length; j++)
					{
						//En aux1 me quedo el numero de checkbox con que estan seleccionados
						if(input[j].type == "checkbox" && input[j].checked)
							aux1++;
						//Compruebo si alguno de los campos libres tiene valor
						else if(input[j].type == "text" && input[j].value)
							aux2 = true;
					}
					//Es correcto si se ha seleccionado alguno de los check o se ha introducido valor en el campo libre
					if(aux1 == 0 && !aux2)
					{
						error += "Debe seleccionar alguna de las opciones de la pregunta o proponer una respuesta.\n Revise los datos antes de continuar.\n";
						input[0].focus();
					}
					break;
				case "8": //CUADRO
				case "9": //CUADRO - ITEM ABIERTO
					input = preguntas[i].getElementsByTagName("SELECT");
					//Primero compruebo los
					for(var j=0; j<input.length; j++)
					{
						if((!input[j].tipo && input[j].value == -1) || (input[j].tipo == "abierta" && input[j].value == -1 && (preguntas[i].getElementsByTagName("INPUT")[0]).value))
						{	
							error += "Debe seleccionar alguna de las respuestas posibles a la pregunta.\nPor favor, seleccione una de las opciones del desplegable para continuar.\n";
							//Posiciono en el elemento
							input[j].focus();
							break;
						}
						
					}
					
					break;
			}
		}
	}
	
	//Compruebo si el formulario es correcto
	if(error != "")
	{
		ok = false;
		alert(error);
	}
	
	return ok;
}
/*************MARQUESINA (ALERTAS)*****************/
//Lanza la animacion de scroll de las alertas de la marquesina
function InicializaMarquesina()
{
	if(alertas != "")
	{
		var marquesina = getElement("Marquesina_alerta");
		var scroller = getElement("Marquesina_scroller");
		var mensajes = alertas.split('\n');
		
		//Establezco el primer mensaje de alerta en el scroller
		marquesina.setAttribute("alerta","0");
		
		scroller.innerHTML = mensajes[0];
		
		//Posiciono a la derecha de las alertas de la marquesina
		scroller.style.left = (marquesina.offsetWidth + 10)+"px";
		
		//Lanzo la animacion de scroll
		window.setInterval("ScrollScroller()",50);
	}
}
//Realiza la animacion del scroll de las alertas
function ScrollScroller()
{
	var marquesina = getElement("Marquesina_alerta");
	var scroller = getElement("Marquesina_scroller");
	var alerta = getElement("Marquesina_alerta");
	var i;

	//Comprobar fin desplazamiento
	if((scroller.offsetLeft + scroller.offsetWidth) < -20)
	{
		//Establecer el siguiente mensaje de alerta en el scroller
		var mensajes = alertas.split('\n');
		i = parseInt(alerta.getAttribute("alerta"),10);
		i++;
		if(i == mensajes.length)
			i = 0;
			
		scroller.innerHTML = mensajes[i];
		scroller.style.left = (marquesina.offsetWidth + 10)+"px";
		
		alerta.setAttribute("alerta",i+"");
	}
	
	//Desplazar scroller
	scroller.style.left = (scroller.offsetLeft - 2)+"px";

}
/******************** BUSCADOR ********************/
//OBJETO CAMPO
//Representa un campo para la busqueda de un objeto en base de datos.
//El campo puede tener otros vinculados, de manera que al cambiar su valor, cambian los posibles valores de los vinculados.
//PARAMS:
//Id: Identificador de base de datos
//Nombre: Categoria, fecha,...
//Tipo: texto, select o item
function Campo(id, nombre, tipo)
{
	this.id = id;
	this.nombre = nombre;
	this.tipo = tipo;
	//Campos vinculados (objetos de tipo Campo)
	this.valores = new Array();
}
//Gestiona el evento change en un select que va a llenar otro
//PARAMS:
//Campo: Nombre del campo (select) cuyo valor ha cambiado
function ManejadorBuscador(campo)
{
	//Obtengo los select de origen y destino
	var origen = document.formBuscador[campo];
	var destino = document.formBuscador[origen.getAttribute("relacionado")];
	var indice,option;
	
	if(origen.value != "-1")
	{
		//Obtengo los datos a insertar en el destino
		var datos = campos.valores[origen.value].valores;
		
		//Vacio el destino
		BorrarHijos(destino);
	
		//Creo las nuevas opciones
		option = document.createElement("OPTION");
		option.value = "-1";
		option.innerHTML = "--";
		destino.appendChild(option);
		for(indice in datos)
		{
			option = document.createElement("OPTION");
			option.value = (datos[indice].id)+"";
			option.innerHTML = (datos[indice].nombre)+"";
			destino.appendChild(option);			
		}
	}
}

/**************************************************/
/***********************VARIABLES GLOBALES**************************/
var browser = new Browser();
var tamFuente = 2;
var aux;
var cal;

//FOROS
var listaMensajes = null;
var foroActual; //Representa el foro sobre el que se estan viendo datos
var mensaje; //Mensaje del foro
var paginasForos; //Contiene el numero de paginas en cada foro

//GALERIA
var fotos;
var actual;
var imgSiguiente;
var intervaloPresentacion;
var intervaloAnimacion;
var opacidadEfecto;

//MENU NAVEGACION
var menuNavegacion;		

//MARQUESINA
var alertas;

//ORGANIGRAMA
var organo;
var organigrama;
var organigramaTextos;

//NAVEGACION
var historial = new Array(10);

//BUSCADOR
var campos;
var busqueda = new Array(3);
var winBuscador = null;

/***************************CONSTANTES******************************/
var canalHome = 2;
/*******************************************************************/