// Variables globales.
var GECKO = false;
var MSIE = false;


/*******************************************************************************************/
/********************* Funciones para el módulo de portada  ********************************/
/*******************************************************************************************/
function handleTab(contenedorTab){
	//referenciamos a las pestañas
	var nContainer1 = document.getElementById("id1");
	var nContainer2 = document.getElementById("id2");
	var nContenido1 = document.getElementById("seleccionLugares");
	var nContenido2 = document.getElementById("seleccionParadas");
	//si se pasa por parametro el identificador del primer contenedor (primera pestaña)

	//var ptoInteres = document.getElementById("capaPtoInteresValue");
	//var parada = document.getElementById("paradaDClaveParada");

	if (contenedorTab == 'id1'){
		//cambiamos las clases correspondientes
		nContainer1.className = "pestanaActiva";
		nContainer2.className = "pestana";
		nContenido1.style.display = "block";
		nContenido2.style.display = "none";
		//parada.value = "noTiene";
		//idem para la pestaña 2
	}else if (contenedorTab == 'id2'){
		nContainer2.className = "pestanaActiva";
		nContainer1.className = "pestana";
		nContenido2.style.display = "block";
		nContenido1.style.display = "none"
		//ptoInteres.value = "noTiene";
	}
	return false;
}
/*******************************************************************************************/
/********************* Fin Funciones para el módulo de portada  ****************************/
/*******************************************************************************************/


/*******************************************************************************************/
/******** Funciones para el módulo de itinerario (mapas de linea generados vía CSS) ********/
/*******************************************************************************************/




function desplegarTodasParadas(arrParadas){

	var i = 0;
	var nodo,nodoPadre;
	var tam = arrParadas.length;

	for (i = 0; i < tam; i++){

		nodo = document.getElementById(arrParadas[i]);
		if(nodo != null) {
			if (typeof(nodo) != null){
				nodoPadre = nodo.parentNode;
				if( nodoPadre ){
					if (typeof(nodoPadre) != null){
						if (nodoPadre.className == "estadoNormal"){
							nodoPadre.className = "estadoDesplegada";
						}
					}
				}
			}
		}
	}
	//	return false;
}


function ocultarTodasParadas(arrParadas){
	var i = 0;
	try {
		for (i = 0; i<arrParadas.length; i++){
			nodo = document.getElementById(arrParadas[i]);
			if (nodo != null){
				if( nodoPadre = nodo.parentNode ){
					nodoPadre = nodo.parentNode;
					if (nodoPadre.className == "estadoDesplegada"){
						nodoPadre.className = "estadoNormal";
					}
				}
			}
		}
	}catch (e){
		alert(e);
	}

	return false;
}



/*** módulo itinerario, ocultar todas las paradas ***/


/*******************************************************************************************/
/***************************** Fin funciones módulo itinerario *****************************/
/*******************************************************************************************/



/*******************************************************************************************/
/********************* Funciones para el mapa web desplegable  *****************************/
/*******************************************************************************************/

/*** funcion que pliega/despliega los items de la pagina del mapa del web ***/
function despliegaSubmenu(sIdentificador, sItem){
	var nSubmenu = document.getElementById(sIdentificador);
	var nItem = document.getElementById(sItem);
	if (nItem.className=="expandible"){
		nSubmenu.style.display = "block";
		nItem.className = "expandido";
	}else if (nItem.className == "expandido"){
		nSubmenu.style.display = "none";
		nItem.className = "expandible";
	}
	return false;
}
/*******************************************************************************************/
/********************* Funciones para el mapa web desplegable  *****************************/
/*******************************************************************************************/


/*******************************************************************************************/
/********************* Funciones para el listado de líneas  ********************************/
/*******************************************************************************************/
function desplegarLinea(idItemLista){
	var nodoDesplegar = document.getElementById(idItemLista);
	var nodoH1 = nodoH1;
	var regExp = /^on/;
	// var titular = document.getElementById("avisosTitular");
	//titular.style.display= "block";
	//si la clase del li está a on, deberiamos plegar la informacion de la linea
	if (nodoDesplegar.className.match(regExp)){
		/* reeemplazamos la clase */
		nodoDesplegar.className = "";
		//si el li no tiene clase, la construimos
	}else{
		nodoDesplegar.className = "on "+nodoDesplegar.id;
		//      titular.style.display= "none";
	}
	return false;
}

/* repliega la capa de informacion de la linea desde el boton cerrar en la capa de informacion extendida */
function replegarInfo(id){
	var nodoLi = document.getElementById("line"+id);
	nodoLi.className = "";
	return false;
}

/******************************************************************/
/*********Objeto Marquesina de avisos *****************************/
/******************************************************************/
function Aviso(aParadasAfectadas ,aLineasAfectadas, clave, descripcion, bTextoAdicional){

	this.strLineasAfectadas = "";
	this.strParadasAfectadas = "";
	this.locale;
	this.clave=clave;
	this.claveLineaEnlace = null;
	this.descripcion=descripcion;
	this.descripcionFinal='';
	this.bTextoAdicional = bTextoAdicional;
	this.aParadas = aParadasAfectadas;
	this.aLineas = aLineasAfectadas;

}
//mètodo que construye el aviso
Aviso.prototype.construyeAviso = function (aLocale){

	this.locale=aLocale;

	if (typeof(this.locale)=='undefined'){
		return;
	}

	// Numero de parada
	if (this.aParadas){
		this.strParadasAfectadas = this.locale['paradas_afectadas']+' '+this.aParadas.join(", ") + ". ";
	}

	if (this.aLineas){
		// Numero de linea
		this.strLineasAfectadas = this.locale['lineas_afectadas']+' '+this.aLineas.join(", ") + ". ";
	}

	// Descripcion del aviso
	// Si tiene paradas o lineas afectadas han de concatenarse;


	this.descripcionFinal = this.strParadasAfectadas;
	if (this.descripcionFinal){
		this.descripcionFinal+=' ';
	}
	this.descripcionFinal+= this.strLineasAfectadas + this.descripcion;

	// Booleano que marca si se ha de formatear la descripción de la incidencia
	this.formateoTexto = this.bTextoAdicional;

}




// Objeto que maneja la marquesina de avisos:
// param aAviso: array de objetos Aviso
// param idNodoTexto: nodo donde se escribira el aviso

function MarquesinaAvisos(arrayAvisos, idNodoTexto, idioma, aLocale){

	//locale
	this.aLocale = aLocale;


	// Array de avisos para cada linea
	this.aAvisos = arrayAvisos;

	// Numero de avisos para la linea
	this.numeroAvisos = arrayAvisos.length;

	// contador de los avisos para una linea
	this.contadorAvisos = 0;

	// nodo donde se escribira el aviso
	this.nodoTexto = document.getElementById(idNodoTexto);

	// Maxima longitud a mostrar
	this.maxLength = 70;

	// idioma
	this.idioma = idioma;
	// obtenemos los textos del locale en el idioma especificado

	//fijamos una referencia al locale de la marquesina para cada aviso en el contructor de la marquesina
	for (var i=0;i<this.aAvisos.length;i++)	{
		this.aAvisos[i].construyeAviso(this.aLocale);
	}


}

MarquesinaAvisos.prototype.setEnlace = function (sTipo, claveLinea){

	this.tipoEnlace = sTipo;
	this.claveLineaEnlace = claveLinea;
}

MarquesinaAvisos.prototype.muestra = function(){

	// Si no hay avisos, paramos la ejecución del método
	if(this.aAvisos.length==0){
		return false
	}

	// Cuando hay avisos
	this.avisoActual = this.aAvisos[this.contadorAvisos];

	this.nodoTexto.innerHTML = "";

	if (this.avisoActual.descripcion.length > this.maxLength){

		this.nodoTexto.innerHTML = this.avisoActual.descripcionFinal.substring(0, this.maxLength)+"...";
	}else{
		this.nodoTexto.innerHTML = this.avisoActual.descripcionFinal;
	}

	// Si el enlace apunta al listado de avisos
	if (this.tipoEnlace == 'listado'){
		this.nodoTexto.href="incidencias."+this.idioma+".svr";
		// Si ha de apuntar a un aviso en particular
	}else if(this.tipoEnlace == 'incidencia'){
		this.nodoTexto.href="."+this.idioma+".svr";
	}else if(this.tipoEnlace == 'linea'){
		// Si ha de apuntar al listado de avisos para una linea
		//this.nodoTexto.href="incidencias."+this.idioma+".svr?accion=entrada&clave_linea="+this.avisoActual.aLineas[0];
		this.nodoTexto.href="incidencias."+this.idioma+".svr?accion=entrada&clave_linea="+this.claveLineaEnlace;
	}

}


/*** Métodos ***/

/* Muestra la descripcion del aviso */
MarquesinaAvisos.prototype.siguienteAviso = function(){

	this.muestra();

	this.contadorAvisos++;

	// Reseteo del contador
	if (this.contadorAvisos == this.aAvisos.length){
		this.contadorAvisos = 0;
	}
}

/*** Fija la longitud máxima a mostrar ***/
MarquesinaAvisos.prototype.setMaxLength = function (longitudMaxima){
	this.maxLength = longitudMaxima;
}

// Funcion que llama al método de las marquesinas
// (no es posible utilizar setInterval con un método, pero sí con una función)

function actualizarMarquesinas(aMarquesinas){
	for (i in aMarquesinas){
		aMarquesinas[i].siguienteAviso();
	}
}


// actualiza una unica marquesina
function actualizarMarquesina(aMarquesina){
	aMarquesina.siguienteAviso();
}

/*******************************************************************************************/
/********************* Fin funciones para el listado de líneas  ****************************/
/*******************************************************************************************/


/*******************************************************************************************/
/**** Functiones para Acciones de las paradas en la ficha de punto de interes **************/
/*******************************************************************************************/

/* muestra la capa de acciones a realizar sobre una parada en la pagina de ficha de punto de interes */
function mostrarAcciones(identificador){
	var nodoAcciones = document.getElementById("acciones"+identificador);
	var displayCapa = nodoAcciones.style.display;
	nodoAcciones.style.display = "none";
	if (nodoAcciones.style.display == "none"){
		nodoAcciones.style.display = "block";
	}
}
function ocultarAcciones(identificadorCapa){
	var nodoAcciones = document.getElementById(identificadorCapa);
	nodoAcciones.style.display = "none";
}
/*******************************************************************************************/
/**** Functiones para Acciones de las paradas en la ficha de punto de interes **************/
/*******************************************************************************************/





/*******************************************************************************************/
/******************* Objeto manejador de los selects "simulados" ***************************/
/*******************************************************************************************/
function Desplegable(sIdentificadorCapa, arrCapas, idioma){

	// identificador de la capa desplegable
	this.identificadorCapa = sIdentificadorCapa;

	// identificador del selector que despliega la capa
	this.identificadorSelector = document.getElementById("selector"+this.identificadorCapa);


	// iframe que se despliega bajo la capa para ocultar cualquier elemento que pueda superponerse
	this.nIframe = document.getElementById(sIdentificadorCapa+"Iframe");

	// Lista de elementos
	this.oLista = document.createElement("ul");

	//caja contenedora de la capa
	this.divElement = document.getElementById(this.identificadorCapa);

	// Insertamos la lista en la capa
	this.divElement.appendChild(this.oLista);

	this.capaSelect = null;

	/* Flag de estado (activo/noactivo) del objeto. Si está a true, el objeto está activo. Si está a false, el objeto no está activo */
	this.flagEstado = true;

	/* Flag de estado (desplegado/no desplegado) del objeto. Si está a true, el objeto está visible. Si está a false, el objeto no está visible */
	this.desplegado = false;

	// array con todas las capas desplegables
	this.todasCapas = arrCapas;


	this.arrTiposPuntos = new Array();

	// Formulario asociado
	this.formAsociado = null;

	// Input de paradas asociado
	this.inputParadasAsociado = null;
	// Input con la clave de la parada del input asociado
	this.inputClaveParadaAsociado = null;

	this.inputLatitudAsociado = null;
	this.inputLongitudAsociado = null;

	// Clave tipo punto de interes
	this.claveTipoPunto = null;

	// Array de puntos de interes
	this.arrPuntosInteres = new Array();

	// Cadenas Auxiliares
	this.arrCadenasAuxiliares = new Array();

	//Idioma actual (Se necesita para construir los destinos de los enlaces)
	this.idioma = idioma;

	this.arrAnchors = new Array();


	/* activa una capa desplegable */
	this.activa = function (){
		//si el objeto esta desactivado
		if (this.flagEstado == false){
			//lo activamos
			this.flagEstado = true;
			this.identificadorSelector.className = "selector";
		}
	}


	/* desactiva una capa desplegable */
	this.desactiva = function (){
		//si el objeto esta activado

		/* obtenemos la referencia al input oculto que guarda la clave */

		var inputOculto = document.getElementById(this.identificadorCapa+'Value');
		this.inputOculto = inputOculto;

		/* NO SIEMPRE TENEMOS UN INPUT OCULTO ASOCIADO A UNA CAPA*/
		if(this.inputOculto != undefined){
			this.inputOculto.value = 'noTiene';
		}

		if (this.flagEstado == true){
			//lo desactivamos
			this.flagEstado = false;
			this.identificadorSelector.className = "selectorOff";

		}
	}



	/* plegar/desplegar la capa */
	this.despliega = function (){

		// si hay input de paradas asociado, lo reseteamos
		if(this.inputParadasAsociado != null && this.inputClaveParadaAsociado != null){
			this.inputClaveParadaAsociado.value = "noTiene";
			this.inputParadasAsociado.value = this.arrCadenasAuxiliares['seleccion_parada_'+this.idioma];

		}

		// inicializamos el display
		var display = this.divElement.style.display ? this.divElement.style.display : "none";

		// ocultamos todas las capas abiertas en ese momento
		ocultarCapasAbiertas(this.todasCapas);

		//si el desplegable esta activo
		if (this.flagEstado == true){

			//si el valor está a none
			if (display=="none"){

				//la mostramos
				this.divElement.style.display="block";
				this.desplegado = true;
				if (this.nIframe != null){
					this.nIframe.style.display = "block";
				}
				//si se esta mostrando
			}else if (display=="block"){
				//la ocultamos
				this.divElement.style.display="none";
				this.desplegado = false;
				if 	(this.nIframe != null){
					this.nIframe.style.display = "none";
				}
			}
		}
	}

	/* ocultar la capa */
	this.oculta = function (){

		this.divElement.style.display = "none";
		// si se ha necesitado un iframe, hemos de ocultarlo
		if (this.nIframe != null){
			this.nIframe.style.display = "none";
		}
	}


	/* Popula los selectores simulados de puntos de interes */
	this.populaPuntosInteres = function(claveTipoPunto, arrPuntos){

		// Eliminamos los items que hayan sido populados con anterioridad
		while (this.oLista.hasChildNodes()){
			this.oLista.removeChild(this.oLista.lastChild);
		}

		if (claveTipoPunto == 'noTiene'){
			// Si no hay ningun punto de interes seleccionado, populamos el selector con TODOS los puntos de interes
			for (var i in arrPuntos){
				for (var j in arrPuntos[i]){
					var oItem = document.createElement("li");
					var oCajaItem = document.createElement("div");
					var oThis = this;
					// Comprobamos si el item que pintamos tiene imagen
					if (arrPuntos[i][j].imagen != "" ){
						var hasImage = true;
						var oCajaImagen = document.createElement("div");
						oCajaImagen.className = "imagen";
						oCajaImagen.innerHTML = arrPuntos[i][j].imagen ;
						oCajaItem.className = "conImagen";
						oCajaItem.appendChild(oCajaImagen);

					}else{
						var hasImage = false;
						oCajaItem.className = "sinImagen";
					}

					// Creamos el contenedor para el texto
					var oCajaTexto = document.createElement("div");
					oCajaTexto.className = "texto";

					/* Enlace */
					var oAbloque = document.createElement("a");
					oAbloque.href="javascript:void(0);";
					oAbloque.id = this.identificadorCapa+'_' + arrPuntos[i][j].id;
					oAbloque.texto = arrPuntos[i][j].nombre;
					oAbloque.latitud = arrPuntos[i][j].lat;
					oAbloque.longitud = arrPuntos[i][j].lon;
					oAbloque.onclick = function(){
						oThis.seleccionaPuntoInteres(this,this.texto);
					}

					this.arrAnchors[oAbloque.id] = oAbloque;

					/* Texto del punto y descripcion */
					var oSpanNombre = document.createElement("span");
					oSpanNombre.className = "nombre";
					var oSpanDescripcion = document.createElement("span");
					oSpanDescripcion.className = "descripcion";
					var txtNombre = document.createTextNode(oAbloque.texto+'\n');
					var txtDescripcion = document.createTextNode(arrPuntos[i][j].descripcion);
					oSpanNombre.appendChild(txtNombre);
					oSpanDescripcion.appendChild(txtDescripcion);

					var oBreak = document.createElement("br");

					// Insertamos las capas
					oItem.appendChild(oCajaItem);
					oCajaItem.appendChild(oCajaTexto);
					oCajaItem.appendChild(oAbloque);
					oCajaTexto.appendChild(oSpanNombre);
					oCajaTexto.appendChild(oBreak);
					oCajaTexto.appendChild(oSpanDescripcion);
					oAbloque.appendChild(oCajaTexto);
					this.oLista.appendChild(oItem);
				}
			}
		}else{
			// Recorremos los puntos de interes que corresponden al tipo de punto seleccionado
			for (var i in arrPuntos[claveTipoPunto]){
				var oItem = document.createElement("li");
				var oCajaItem = document.createElement("div");
				var oThis = this;
				// Comprobamos si el item que pintamos tiene imagen
				if (arrPuntos[claveTipoPunto][i].imagen != "" ){
					var hasImage = true;
					var oCajaImagen = document.createElement("div");
					oCajaImagen.className = "imagen";
					oCajaImagen.innerHTML = arrPuntos[claveTipoPunto][i].imagen ;
					oCajaItem.className = "conImagen";
					oCajaItem.appendChild(oCajaImagen);

				}else{
					var hasImage = false;
					oCajaItem.className = "sinImagen";
				}

				// Creamos el contenedor para el texto
				var oCajaTexto = document.createElement("div");
				oCajaTexto.className = "texto";

				/* Enlace */
				var oAbloque = document.createElement("a");
				oAbloque.href="javascript:void(0);";
				oAbloque.id = this.identificadorCapa+'_' + arrPuntos[claveTipoPunto][i].id;
				oAbloque.texto = arrPuntos[claveTipoPunto][i].nombre;
				oAbloque.latitud = arrPuntos[claveTipoPunto][i].lat;
				oAbloque.longitud = arrPuntos[claveTipoPunto][i].lon;
				oAbloque.onclick = function(){
					oThis.seleccionaPuntoInteres(this,this.texto);
				}

				this.arrAnchors[oAbloque.id] = oAbloque;

				/* Texto del punto y descripcion */
				var oSpanNombre = document.createElement("span");
				oSpanNombre.className = "nombre";
				var oSpanDescripcion = document.createElement("span");
				oSpanDescripcion.className = "descripcion";
				var txtNombre = document.createTextNode(oAbloque.texto+'\n');
				var txtDescripcion = document.createTextNode(arrPuntos[claveTipoPunto][i].descripcion);
				oSpanNombre.appendChild(txtNombre);
				oSpanDescripcion.appendChild(txtDescripcion);

				var oBreak = document.createElement("br");

				// Insertamos las capas
				oItem.appendChild(oCajaItem);
				oCajaItem.appendChild(oCajaTexto);
				oCajaItem.appendChild(oAbloque);
				oCajaTexto.appendChild(oSpanNombre);
				oCajaTexto.appendChild(oBreak);
				oCajaTexto.appendChild(oSpanDescripcion);
				oAbloque.appendChild(oCajaTexto);
				this.oLista.appendChild(oItem);

			}
		}
	}



	/* Popula los selectores simulados de tipos de puntos */
	this.populaTiposPuntos = function(arrTiposPuntos){

		var oThis = this;
		for (var i in arrTiposPuntos){
			var oItem = document.createElement("li");
			var oAnchor = document.createElement("a");
			//oAnchor.className = "tipoPunto";
			var oSpan = document.createElement("span");
			oAnchor.href="javascript:void(0);";
			oAnchor.id = this.identificadorCapa+'_'+i;
			oAnchor.texto = arrTiposPuntos[i];
			oAnchor.onclick = function(){
				oThis.seleccionaTipoPunto(this,this.texto);
			}
			var oTextoInSpan = document.createTextNode(arrTiposPuntos[i]);
			oSpan.appendChild(oTextoInSpan);
			oAnchor.appendChild(oSpan)
			oItem.appendChild(oAnchor);
			this.oLista.appendChild(oItem);
		}
		this.divElement.appendChild(this.oLista);
	}


	/* Preselecciona un valor para un desplegable de tipos de puntos de interes */
	this.preseleccionaTipoPuntoInteres = function(arrPuntos, arrTiposPuntos, clavePunto){

		var nombreTipoPunto;
		var claveTipoPunto;
		for (var i in arrPuntos){
			for (var j in arrPuntos[i]){
				if (arrPuntos[i][j].id == clavePunto){
					nombreTipoPunto = arrTiposPuntos[i];
					claveTipoPunto = i;
				}
			}
		}
		// Seleccionamos el nodo de texto del selector donde se ha de "pintar" la seleccion
		var nTextoSelector = document.getElementById(this.identificadorCapa+'Texto');
		nTextoSelector.firstChild.nodeValue = nombreTipoPunto;

		// referencia al input oculto de la clave
		var inputOculto = document.getElementById(this.identificadorCapa+'Value');
		inputOculto.value = claveTipoPunto;
	}

	/* Preselecciona un valor para el tipo de punto de interes */
	this.preseleccionaTipoPuntoInteresSimple = function(arrTiposPuntos,claveTipoPunto){
		var nombreTipoPunto;
		var claveTipoPunto;

		nombreTipoPunto = arrTiposPuntos[claveTipoPunto];
		// Seleccionamos el nodo de texto del selector donde se ha de "pintar" la seleccion
		var nTextoSelector = document.getElementById(this.identificadorCapa+'Texto');
		nTextoSelector.firstChild.nodeValue = nombreTipoPunto;

		// referencia al input oculto de la clave
		var inputOculto = document.getElementById(this.identificadorCapa+'Value');
		inputOculto.value = claveTipoPunto;

	}

	/* Preselecciona un valor para un desplegable de punto de interes */
	this.preseleccionaPuntoInteres = function(clavePunto,arrPuntos,arrTiposPuntos){

		// Seleccionamos el nodo de texto del selector donde se ha de "pintar" la seleccion
		var nTextoSelector = document.getElementById(this.identificadorCapa+'Texto');

		// referencia al input oculto de la clave
		var inputOculto = document.getElementById(this.identificadorCapa+'Value');
		inputOculto.value = clavePunto;
		var nombrePunto;
		for (var i in arrPuntos){
			for (var j in arrPuntos[i]){
				if (arrPuntos[i][j].id == clavePunto){
					nombrePunto = arrPuntos[i][j].nombre;
					nombreTipoPunto = arrTiposPuntos[i];
				}
			}
		}
		nTextoSelector.firstChild.nodeValue = nombrePunto;
	}



	// Resetea los desplegables de punto de interes, asi como los valores de los inputs asociados
	this.reseteaPuntosInteres = function (claveTipoPuntos, arrPuntos){


		// Seleccionamos el nodo de texto del selector donde se ha de "pintar" la seleccion
		var nTextoSelector = document.getElementById(this.identificadorCapa+'Texto');

		// referencia al input oculto de la clave
		var inputOculto = document.getElementById(this.identificadorCapa+'Value');


		// Fijamos los valores
		inputOculto.value = "noTiene";


		/* Si estamos reseteando sin popular */
		if(claveTipoPuntos == undefined && arrPuntos == undefined){

			nTextoSelector.firstChild.nodeValue = this.arrCadenasAuxiliares['seleccion_punto_'+this.idioma];

		}else{

			// referencia al selector
			selector = document.getElementById('selector'+this.identificadorCapa);

			// Fijamos los valores
			inputOculto.value = "noTiene";


			// Seleccionamos el nodo de texto del selector donde se ha de "pintar" la seleccion
			nTextoSelector = document.getElementById(this.identificadorCapa+'Texto');

			if ( arrPuntos[claveTipoPuntos].length == 1){
				cadenaAuxiliar = arrPuntos[claveTipoPuntos].length + this.arrCadenasAuxiliares['item_'+this.idioma];
			}else{
				cadenaAuxiliar = arrPuntos[claveTipoPuntos].length + this.arrCadenasAuxiliares['items_'+this.idioma];
			}
			nTextoSelector.firstChild.nodeValue = cadenaAuxiliar;
		}

	}

	/* Resetea un selector de tipo de punto de interes */
	this.reseteaTiposPuntosInteres = function (){

		// referencia al input oculto de la clave
		var inputOculto = document.getElementById(this.identificadorCapa+'Value');

		// referencia al selector
		selector = document.getElementById('selector'+this.identificadorCapa);

		// Fijamos los valores
		inputOculto.value = "noTiene";

		// Seleccionamos el nodo de texto del selector donde se ha de "pintar" la seleccion
		nTextoSelector = document.getElementById(this.identificadorCapa+'Texto');

		nTextoSelector.firstChild.nodeValue = this.arrCadenasAuxiliares['seleccion_tipo_'+this.idioma];

		if(this.selectorPuntosAsociado){
			this.selectorPuntosAsociado.reseteaPuntosInteres();
		}

	}

	/* Selecciona un punto de interés */
	this.seleccionaPuntoInteres = function (oItem, texto){

		//obtenemos la clave del tipo de punto
		var regExp = /\d+$/;
		var clave = oItem.id.match(regExp).toString();
		this.clavePunto = clave;
		// referencia al input oculto de la clave
		var inputOculto = document.getElementById(this.identificadorCapa+'Value');
		// referencia al selector
		selector = document.getElementById('selector'+this.identificadorCapa);

		// Fijamos los valores
		inputOculto.value = clave;

		// Seleccionamos el nodo de texto del selector donde se ha de "pintar" la seleccion
		nTextoSelector = document.getElementById(this.identificadorCapa+'Texto');
		nTextoSelector.firstChild.nodeValue = texto;

		if(this.inputLatitudAsociado){
			//this.inputLatitudAsociado.value = oItem.latitud;
			document.forms[0].latitud.value = oItem.latitud;
		}

		if(this.inputLongitudAsociado){
			//alert( this.inputLongitudAsociado.name );
			//this.inputLongitudAsociado.value = oItem.longitud;
			document.forms[0].longitud.value = oItem.longitud;
		}

		this.enviaForm();

	}

	this.enviaForm = function(){

	}

	/* Selecciona un tipo de punto de interes (se utilizará su clave) */
	this.seleccionaTipoPunto = function(oItem, texto){

		//obtenemos la clave del tipo de punto
		var regExp = /\d+$/;
		var clave = oItem.id.match(regExp).toString();

		// referencia al input oculto de la clave
		var inputOculto = document.getElementById(this.identificadorCapa+'Value');
		// referencia al selector
		selector = document.getElementById('selector'+this.identificadorCapa);

		// Fijamos los valores
		inputOculto.value = clave;

		//Clave del tipo de punto de interes
		this.claveTipoPunto = clave;

		// Seleccionamos el nodo de texto del selector donde se ha de "pintar" la seleccion
		nTextoSelector = document.getElementById(this.identificadorCapa+'Texto');
		nTextoSelector.firstChild.nodeValue = texto;

		// Envia el formulario asociado si lo hay
		if(this.formAsociado != null){
			this.formAsociado.submit();
		}

		// Si tiene asociado un selector de puntos de interes
		if(this.selectorPuntosAsociado != null){
			this.selectorPuntosAsociado.populaPuntosInteres(this.claveTipoPunto, this.arrPuntosInteres);
			this.selectorPuntosAsociado.reseteaPuntosInteres(this.claveTipoPunto, this.arrPuntosInteres);
		}

		this.customAction();

	}


	/** Acción customizable **/
	this.customAction = function(){
	}

	/* Asocia una capa de puntos de interes a una capa de tipos de puntos de interes */
	this.setSelectorPuntosAsociado = function(oDesplegablePuntos, arrPuntosInteres){
		this.selectorPuntosAsociado = oDesplegablePuntos;
		this.arrPuntosInteres = arrPuntosInteres;
	}

	/* Fija un formulario asociado a un selector */
	this.setFormAsociado = function(idForm){
		this.formAsociado = document.getElementById(idForm);
	}


	/* Para los objetos de capa de punto de interes, se fija el array que relaciona tipos de puntos con puntos */
	this.setTiposPuntos = function(tiposPuntos){
		this.arrTiposPuntos = tiposPuntos;
	}

	/* Para los objetos de capa de punto de interes, se fija el array que relaciona tipos de puntos con puntos */
	this.setInputLatitudAsociado = function(idInputLatitud){
		this.inputLatitudAsociado = document.getElementById(idInputLatitud);

	}
	this.setInputLongitudAsociado = function(idInputLongitud){
		this.inputLongitudAsociado = document.getElementById(idInputLongitud);

	}

	/* Cadenas Auxiliares */
	this.setCadenasAuxiliares = function(arrCadenas){
		this.arrCadenasAuxiliares = arrCadenas;
	}

	/* Si hay un input de paradas que debe eliminar la seleccion de los input de tipos de puntos o puntos */
	this.setInputParadasAsociado = function(idInput){
		this.inputParadasAsociado = document.getElementById(idInput);
		this.inputClaveParadaAsociado = document.getElementById(idInput+'ClaveParada')
	}

}

/* Preselección en el SAYT de paradas */
function preseleccionaParada(claveParada, idInputParada, arrDirecciones){


	// Referenciamos al input oculto
	var inputOculto = document.getElementById(idInputParada+'ClaveParada');

	// Referenciamos al input visible
	var inputVisible = document.getElementById(idInputParada);

	inputOculto.value = claveParada;

	inputVisible.value = arrDirecciones[claveParada][0];

}


function ocultarCapasAbiertas(arrayDesplegables){
	for ( var i in arrayDesplegables ){
		arrayDesplegables[i].oculta();
	}
}

/********** FIN OBJETO DESPLEGABLE ****************/

function localizarEnMapa(nodoAnchor, identificadorParada, identificadorPtoInteres, idioma){
	/* referencias a los nodos */
	nodoParada = document.getElementById(identificadorParada);
	nodoPtoInteres = document.getElementById(identificadorPtoInteres);

	/* valores del input */
	valorParada = nodoParada.value;
	valorPtoInteres = nodoPtoInteres.value;

	var expReg = /D$/;
	var origenDestino = null;
	var txtCodParada = null;
	// Si el identificador acaba en "D"
	if (nodoAnchor.id.match(expReg)){
		origenDestino = 'destino';
		txtCodParada = 'codParadaDesde';
		txtCodPtoInteres = 'codPtoInteresDesde';

	}else{
		origenDestino = 'origen';
		txtCodParada = 'codParadaHasta';
		txtCodPtoInteres = 'codPtoInteresHasta';
	}
	var str = origenDestino+'&'+txtCodParada+'='+valorParada + '&' +txtCodPtoInteres+'='+valorPtoInteres;

	nodoAnchor.href='donde_estoy.'+idioma+'.svr?accion=cargatodas'+'&donde='+str;


}


/*******************************************************************************************/
/******************* Functiones para los formularios   *************************************/
/*******************************************************************************************/

function preseleccionaFecha(idSelectDia, idSelectMes){

	var selectDia = document.getElementById(idSelectDia);
	var selectMes = document.getElementById(idSelectMes);
	var fecha = getDatosFecha();
	marcarSelect(selectDia, fecha[1]);
	marcarSelect(selectMes, fecha[2]);

}

/* marca un select pasado su id y el value */
function marcarSelect( sel, value ){
	for( var i=0; i<sel.options.length; i++ ){
		if( sel.options[i].value == value ){
			sel.selectedIndex = i;
		}
	}
}

function reseteaForm(aTextos){


	document.forms[0].reset();
	var ptoOrigen = document.getElementById('puntoOrigen');
	var ptoOrigenD = document.getElementById('puntoOrigenD');
	var paradaOrigen = document.getElementById('paradaOrigenD');
	var paradaOrigenD = document.getElementById('paradaOrigenD');
	ptoOrigen.checked = true;
	ptoOrigenD.checked = true;

	//desactivamos los selectores de zona y parada y reseteamos los "select"
	desplegablePtoInteres.activa();
	desplegablePtoInteres.resetea(aTextos['ptoInteres']);

	desplegablePtoInteresD.activa();
	desplegablePtoInteresD.resetea(aTextos['ptoInteres']);

	desplegableZonas.desactiva();
	desplegableZonas.resetea(aTextos['zona']);

	desplegableZonasD.desactiva();
	desplegableZonasD.resetea(aTextos['zona']);

	desplegableParadas.desactiva();
	desplegableParadas.resetea(aTextos['parada']);

	desplegableParadasD.desactiva();
	desplegableParadasD.resetea(aTextos['parada']);
}

/*******************************************************************************************/
/******************* Fin Functiones para los formularios   *********************************/
/*******************************************************************************************/


/*******************************************************************************************/
/******************* Functiones para las fechas   ******************************************/
/*******************************************************************************************/


/* devuelve un array con los datos referentes a la fecha actual: hora, dia, mes, mesTexto, meses */
function getDatosFecha(){
	var fechaHoy = new Date();
	var diaActual = fechaHoy.getDate();
	var mesActual = fechaHoy.getMonth();
	var horaActual = fechaHoy.getHours();
	var minutosActual = fechaHoy.getMinutes();
	var arrResultado = new Array();
	var meses = new Array();
	var mesTexto = meses[mesActual];
	//si pasamos de la media hora...
	if (minutosActual >= 30){
		//consideramos más proxima la hora siguiente
		horaActual += 1;
	}
	//si se obtiene 0 como la hora, traducimos a 24
	horaActual == 0 ? horaActual = 24 : horaActual = horaActual;
	//marcamos el item correspondiente el el grupo de radios
	radioHoraActual = document.getElementById("hora_"+horaActual);
	//marcamos el item correspondiente el el grupo de radios
	radioHoraActual.checked = "checked";
	if (minutosActual >= 30){
		//consideramos más proxima la hora siguiente
		horaActual += 1;
	}
	//construimos el array con los datos necesarios
	arrResultado = [horaActual, diaActual, mesActual];
	return arrResultado;
}

/** reinicia el formulario de fechas **/
function reiniciarFechas(){
	var nodoMes = document.getElementById("mes");
	var nodoDia = document.getElementById("dia");
	var nodoHora = document.forms[0].hora;
	for (i=0;i<nodoHora.length;i++){
		if (nodoHora[i].checked == true){
			nodoHora[i].checked = false;
		}
	}
	marcarSelect (nodoMes, "");
	marcarSelect (nodoDia, "");
}
/*******************************************************************************************/
/******************* Fin Functiones para las fechas   **************************************/
/*******************************************************************************************/



/* Itinerario. DespliegaParada */
function despliegaParada(id){
	var nodo = document.getElementById(id);

	if (nodo.className == "estadoNormal"){
		nodo.className = "estadoDesplegada";
	}else {
		nodo.className = "estadoNormal";
	}
	return false;
}

function CapaAcciones(arrTextos){

	/* identificador */
	this.identificador = null;

	/* nodo anchor que activa la capa */
	this.nEnlace = null;

	/* Array de textos */
	this.textos = arrTextos;

	/* guardamos el identificador de la parada */
	this.codigoParada = null;

	/* capa doble conteniendo el div con clase oculta y dentro de éste, el div con clase paradaPtoInteres */
	/* nodo de la capa de acciones */
	this.nCapaAcciones = null;

	/* capa padre de la capa de acciones */
	this.capaPadre = null;

	/* idenfiticador de la capa oculta */
	this.idCapaOculta = null;

	/* estado de la capa */
	this.estadoCapa;

	/* almacenara el codigo de la parada */
	this.codigoParada = null;
	/* almacenara el codigo de la parada */
	this.codigoPuntoInteres = null;


	/* referencias a los elementos DOM */

	this.listaAcciones = null;
	this.liPuntoInteres = null;
	this.liSituar = null;


	/*referencias a los enlaces a las acciones*/

	this.listaAcciones = null;
	this.linkSituar = null;
	this.linkFijarOrigen = null;
	this.linkFijarRecorrido = null;
	this.linkTiempoEspera =  null;
	this.linkPuntoInteres =  null;
	this.itemPtoInteres = null;
}

/* crea Dinamicamente la capa oculta con las opciones */
CapaAcciones.prototype.creaCapaOculta = function(){

	/* creamos la capa oculta */
	var capaOculta   = document.createElement('div');

	/* le asignamos la case "capaOculta" */
	capaOculta.className = "capaOculta";
	/* le asignamos el id */
	capaOculta.id = "accionesParada";

	/* capa de acciones */
	var capaAcciones = document.createElement('div');

	/* le aplicamos la clase */
	capaAcciones.className = "paradaPtoInteres";

	divTitulo = document.createElement("div");
	divTitulo.className= "cabeceraCapa";

	nH3 = document.createElement("h3");
	nH3.id = 'nombreParada';
	txtInH3 = document.createTextNode('');
	nH3.appendChild(txtInH3);
	divTitulo.appendChild(nH3);


	/* Listado de acciones sobre una parada */
	listaAcciones = document.createElement("ul");
	listaAcciones.className = "acciones";
	listaAcciones.id = "listaAcciones";

	this.listaAcciones = listaAcciones;

	
	liSituar = document.createElement("li");
	liSituar.id = "liSituar";
	this.liSituar = liSituar;
	
	aSituar = document.createElement("a");
	aSituar.id = 'situar';
	txtInAsituar = document.createTextNode(this.textos['situar']);
	aSituar.appendChild(txtInAsituar);
	liSituar.appendChild(aSituar);


	liOrigen = document.createElement("li");
	aOrigen = document.createElement("a");
	aOrigen.id = 'fijarOrigen';
	txtInAorigen = document.createTextNode(this.textos['fijarOrigen']);
	aOrigen.appendChild(txtInAorigen);
	liOrigen.appendChild(aOrigen);


	liDestino = document.createElement("li");
	aDestino = document.createElement("a");
	aDestino.id = 'fijarDestino';
	txtInAdestino = document.createTextNode(this.textos['fijarDestino']);
	aDestino.appendChild(txtInAdestino);
	liDestino.appendChild(aDestino);

	// De momento se desactiva el link para "Tiempo de espera para este bus"
	/*
	liTpoEspera = document.createElement("li");
	aTpoEspera = document.createElement("a");
	aTpoEspera.id = 'tiempoEspera';
	txtInAtpoespera = document.createTextNode(this.textos['tiempoEspera']);
	aTpoEspera.appendChild(txtInAtpoespera);
	liTpoEspera.appendChild(aTpoEspera);
	*/

	listaAcciones.appendChild(liSituar);
	listaAcciones.appendChild(liOrigen);
	listaAcciones.appendChild(liDestino);
	//listaAcciones.appendChild(liTpoEspera);


	/* enlace para cerrar la capa */
	aCancelar = document.createElement("a");
	aCancelar.className = 'cancelar';
	aCancelar.id = 'cancelarAcciones';
	aCancelar.href = 'javascript:void(0);';
	txtInAcancelar = document.createTextNode(this.textos['cancelar']);
	aCancelar.appendChild(txtInAcancelar);


	/* Separador */
	nSeparador = document.createElement("div");
	nSeparador.className = "separadorH";


	capaAcciones.appendChild(divTitulo);
	capaAcciones.appendChild(listaAcciones);
	capaAcciones.appendChild(aCancelar);
	capaAcciones.appendChild(nSeparador);


	/* insertamos la capa de acciones dentro de la capa oculta */
	capaOculta.appendChild(capaAcciones);
	this.nCapaAcciones = capaOculta;

	/*this.listaAcciones = document.getElementById('listaAcciones');*/
	/* inicializamos el style del conjunto de capas */
	this.nCapaAcciones.style.display = "block";

}

/* posiciona la capa bajo el enlace que la ha activado */
CapaAcciones.prototype.posicionaCapa = function(enlaceActiva , sIdPadre , oPtoInteres,mostrarSituaMapa){
	

	// Eliminamos el elemento de la lista con enlace a ficha de punto de interes
	if(this.liPuntoInteres){
		this.listaAcciones.removeChild(this.liPuntoInteres);
		this.liPuntoInteres = null;
	}

	// Si la parada es de interes, debe mostrarse el enlace a su ficha
	if(oPtoInteres.id != -1){
		// Creamos el elemento de la lista de acciones con destino a la ficha del punto de interes
		liPtoInteres = document.createElement("li");
		liPtoInteres.id = "itemPtoInteres";
		aPtoInteres = document.createElement("a");
		aPtoInteres.id = "fichaInteres";
		aPtoInteres.href = "puntointeres."+ this.textos['idioma'] +".svr?accion=obtenerpunto&clave_punto="+oPtoInteres.id;
		txtInaPtoInteres = document.createTextNode(this.textos['fichaInteres']+': '+oPtoInteres.nombre);
		aPtoInteres.appendChild(txtInaPtoInteres);
		liPtoInteres.appendChild(aPtoInteres);
		this.liPuntoInteres = liPtoInteres;

		// Añadimos el item a la lista
		this.listaAcciones.appendChild(this.liPuntoInteres);
	}

	//obtenemos el codigo de la parada en funcion del nodo que activa la capa, que es del formato "parada_234"
	this.codigoParada = enlaceActiva.id.substr(enlaceActiva.id.indexOf("_")+1);

	/* obtenemos la referencia del padre de la capa : dummyLayer[codigo de parada] */
	var capaPadre = document.getElementById(sIdPadre);

	if( this.nCapaAcciones.parentNode != capaPadre ){
		if( this.nCapaAcciones.parentNode ){
			this.ocultaCapa(this.nCapaAcciones.parentNode,this.nCapaAcciones);
		}

		/* se la pasamos a nuestro objeto */
		this.capaPadre = capaPadre;

		/* insertamos dentro nuestra capa */
		this.capaPadre.appendChild(this.nCapaAcciones);

		this.listaAcciones = document.getElementById('listaAcciones');

		/* referenciamos al nombre de la parada (a) */
		var nNombreParada = document.getElementById("nombreParada");
		/* copiamos el nombre de la parada del mapa de itinerario a nuesteo h3 de nuestra capa */
		nNombreParada.firstChild.nodeValue = enlaceActiva.firstChild.nextSibling.nodeValue;

		/* obtenemos el codigo de la parada para saber apuntar las acciones posterior */

		var nodoPuntoInteres = document.getElementById("itemPtoInteres");

		// Si la parada actual no es un punto de interes
				
		this.linkSituar = document.getElementById("situar");
		this.linkFijarOrigen = document.getElementById("fijarOrigen");
		this.linkFijarDestino = document.getElementById("fijarDestino");
		//this.linkTiempoEspera = document.getElementById("tiempoEspera");
		
		this.linkSituar.href = 'donde_estoy.' + this.textos['idioma'] + ".svr?accion=cargauna&codParada="+this.codigoParada;
		this.linkFijarOrigen.href = 'como_ir.' + this.textos['idioma'] + ".svr?donde=origen&codPtoInteresDesde=noTiene&codParadaDesde=" +this.codigoParada;
		this.linkFijarDestino.href = 'como_ir.' + this.textos['idioma'] + ".svr?donde=destino&codPtoInteresHasta=noTiene&codParadaHasta=" +this.codigoParada ;
		
		this.liSituar.style.display = 'block';
		if(!mostrarSituaMapa){
				this.liSituar.style.display = 'none';
		}
		

		/* obtenemos la referencia al enlace de cerrar la capa */
		var enlaceCerrar = document.getElementById('cancelarAcciones');
		enlaceCerrar.parent = this;

		/* el evento onclick ocultara la capa */
		enlaceCerrar.onclick = function (){
			this.parent.ocultaCapa(this.parent.capaPadre, this.parent.nCapaAcciones);
		}
	}else{
		if( this.nCapaAcciones.parentNode ){
			this.ocultaCapa(this.nCapaAcciones.parentNode,this.nCapaAcciones);
		}
	}
}


/* oculta la capa */
CapaAcciones.prototype.ocultaCapa = function(nodoPadre, nodoHijo){

	//antes de ocultar la capa, hacemos el append del item del punto de interes, para dejar la lista como debe estar al crearse (con todos los items);
	nodoPadre.removeChild(nodoHijo);
}

/* destruye la capa oculta */
CapaAcciones.prototype.destruyeCapa = function(){
}

//----------------------------------------------------------------

/**

Mapa del web. Los enlaces son non-javascript friendly.
Han de abrirse en su opener (si aun sigue abierto) o en nueva ventana

**/

function loadInOpener(href){
	windowopen=1;
	if (!top.opener || top.opener.closed)
	windowopen=0;
	else if (!top.opener.top)
	windowopen=0;
	else if (top.opener.top.closed)
	windowopen=0;
	else if (!top.opener.top.location)
	windowopen=0;

	if (windowopen == 1){

		top.opener.top.location.href=href;
		top.blur();
		top.opener.top.focus();
	}else{
		window.open(href,"", "resizable, toolbar, scrollbars, menubar, status");
	}
	return false;
}

// Funciones de posicionamiento
function detectarNavegador(){
	if( navigator.userAgent.indexOf('MSIE')!=-1){
		MSIE = true;
	}else if( navigator.userAgent.indexOf('Gecko')!=-1 ){
		GECKO = true;
	}else{
		GECKO = true;
	}
}

function getOffsetLeft (el) {
	var ol = el.offsetLeft;
	while ((el = el.offsetParent) != null){
		ol += el.offsetLeft;
	}
	return ol;
}

//----------------------------------------------------------------

function getOffsetTop (el) {
	var ot = el.offsetTop;
	while((el = el.offsetParent) != null){
		ot += el.offsetTop;
	}
	return ot;
}

//----------------------------------------------------------------

function getOrigenX( obj ){
	if( GECKO == true ){
		return window.pageXOffset;
	} else if( MSIE == true ){
		return document.documentElement.scrollLeft;
	}
}

//----------------------------------------------------------------

function getOrigenY(){
	if( GECKO == true ){
		return window.pageYOffset;
	} else if( MSIE == true ){
		return document.documentElement.scrollTop;
	}
}


/*******************************************************************************************/
/********************* Funciones para el listado de tarifas  ********************************/
/*******************************************************************************************/
function desplegarTarifa(idItemLista,idItemFlecha){
	var nodoDesplegar = document.getElementById(idItemLista);
	var flechaDesplegar = document.getElementById(idItemFlecha);
	var nodoH1 = nodoH1;
	var regExp = /^on/;
	var regExpFecha = /^up/;
	//si la clase del li está a on, deberiamos plegar la informacion de la linea
	if (nodoDesplegar.className.match(regExp)){
		/* reeemplazamos la clase */
		nodoDesplegar.className = "off";
		//si el li no tiene clase, la construimos
	}else{
		nodoDesplegar.className = "on "+nodoDesplegar.id;
		//      titular.style.display= "none";
	}
	
	if (flechaDesplegar.className.match(regExpFecha)){
		/* reeemplazamos la clase */
		flechaDesplegar.className = "down";
		//si el li no tiene clase, la construimos
	}else{
		flechaDesplegar.className = "up";
	}
	
	
	return false;
}


/*******************************************************************************************/
/********************* Funciones para buscador de noticias  ********************************/
/*******************************************************************************************/
function borrarFormularioBuscarNoticias() {
	form = document.getElementById('formfiltroNoticias');
	form.reset();

	objetoVacioInput(form, 'textoBuscador');
	objetoVacioSelect(form, 'seccion');
	objetoVacioSelect(form, 'tematica');
}

function objetoVacioSelect(objForm, nom_camp) {
	var obj_sele = objForm.elements[nom_camp];
	obj_sele.options[0].selected = true;
	return true;
}

function objetoVacioInput(objForm, nom_camp) {
	var obj_input = objForm.elements[nom_camp];
	obj_input.value = '';
	return true;
}



/**
 * Funcion igual que el a:hover pero que evita los problemas de flicker en IE6
 */
function linkOver( a ){
	if ( a.className == "over" ) {
		a.className = null;
	} else {
		a.className = "over";
	}
}
