// 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("capaParadasValue");
	
	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(){
		
	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);
	
	//nodo que contiene el texto del item del selector
	this.nodoTexto  = document.getElementById(this.identificadorCapa+"Texto").firstChild;
	
	// iframe que se despliega bajo la capa para ocultar cualquier elemento que pueda superponerse
	this.nIframe = document.getElementById(sIdentificadorCapa+"Iframe");
	
	// nodo strong donde se escribe el texto
	this.nodoStrong = null;
	
	//caja contenedora de la capa
	this.divElement = document.getElementById(this.identificadorCapa);
	
	

	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.arrZonasParadas = new Array();

	//objeto selector hijo
	this.oSelectorHijo = null;
	
	//Idioma actual (Se necesita para construir los destinos de los enlaces)	
	this.idioma = idioma;
	
	
	
	/* 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');
		
		/* NO SIEMPRE TENEMOS UN INPUT OCULTO ASOCIADO A UNA CAPA*/
		if(inputOculto != undefined){
			inputOculto.value = 'noTiene';	
		}
		
		
		
		if (this.flagEstado == true){
			//lo desactivamos
			this.flagEstado = false;
			this.identificadorSelector.className = "selectorOff";
			
		}
	}
	
	
	
	/* plegar/desplegar la capa */
	this.despliega = function (){
		//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.eliminaParada = function(capa , parada){
		
	}
	
	
	this.fillParadas = function (sIdentificadorStrong){
		/* sIdentificadorStrong es de la forma "zona3" */
				
		var regExp = /\d+$/;
		
		// parseamos la zona para quedarnos con el identificador
		var zonaParadas = sIdentificadorStrong.match(regExp).toString();
		
		// Referenciamos al nodo de la lista que contiene las paradas
		var nodoLista = document.getElementById(sIdentificadorCapa+"Listado");		
		
		
		/* Array con las paradas para la zona seleccionada */
		var arrParadas = this.arrZonasParadas[zonaParadas];
		
		//alert(this.arrZonasParadas);
		
		var str = '';
		
		//borramos hijos antes de añadir de nuevos
		while (nodoLista.hasChildNodes()){
            nodoLista.removeChild(nodoLista.lastChild)
		}

		var primeraParada = null;
		for (parada in arrParadas){
		    if (!primeraParada){
                primeraParada = parada;    
		    }
		    this.insertaParada(sIdentificadorCapa,arrParadas[parada],nodoLista);
		}
		if (primeraParada){
		  this.seleccionaParada('parada'+arrParadas[primeraParada].id,arrParadas[primeraParada].nombre);
		}
		
		/*
		nTextoSelector = document.getElementById(this.identificadorCapa+'Texto');
		nTextoSelector.firstChild.nodeValue = valorTextoInicial;
		*/
		/*return arrParadas; */
		
	}

	
	this.insertaParada = function (sIdentificadorCapa , parada, nodoLista){
		

		var nodoLista = nodoLista;
		var liElement = document.createElement("li");
		var spanElement = document.createElement("span");
		var anchorElement = document.createElement("a");
		var anchorTexto = document.createElement("a");
		var strongTexto = document.createElement("strong");
		
		if(parada.id>=10 && parada.id<=100){
			spanElement.className="dosDig";
		}else if(parada.id>=100){
			spanElement.className="tresDig";	
		}
		
		anchorElement.href="javascript:void(0);";
		textoInAnchor = document.createTextNode(parada.id);
		anchorElement.appendChild(textoInAnchor);
		
		spanElement.appendChild(anchorElement);
		
		anchorTexto.className = "txt";
		
		strongTexto.id="parada"+parada.id;
		textoInStrong = document.createTextNode(parada.nombre);
		
		anchorTexto.parada = parada;
		anchorTexto.padre = this;
		

		//construimos los parámetros para seleccionaItem
		var idStrong = 'parada'+parada.id;
		var idSelector = 'selector'+sIdentificadorCapa;
	
		var nombre = parada.nombre;
		var idParada = parada.id;
		
		anchorTexto.idStrong = idStrong;
		anchorTexto.idSelector = idSelector;
		anchorTexto.nombre = nombre;
		
		anchorTexto.onclick= function(){
			this.padre.seleccionaParada(this.idStrong, this.nombre);
			return false;			
		}

		strongTexto.appendChild(textoInStrong);
		anchorTexto.appendChild (strongTexto);
				
		liElement.appendChild(spanElement);
		liElement.appendChild(anchorTexto);

		nodoLista.appendChild(liElement);
		
	}
	
		
	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";
		}
	}
	
	this.resetea = function(sCadena){
		this.nodoTexto.nodeValue = sCadena;
	}

		
	this.preseleccionaCombos = function (zonaDesde, paradaDesde, zonaHasta, paradaHasta){
	}


	this.seleccionaItem = function (identificadorStrong, identificadorSelector, valor){
		
		 //este es el texto que esta dentro del strong
		 this.nodoStrong = document.getElementById(identificadorStrong);
		
		 if (identificadorSelector){
		 	nodoSelector = document.getElementById(identificadorSelector);			 	
		 }
		 
		 // Si la capa es de zonas, necesito rellenar los items de la capa de paradas
		 if (this.identificadorCapa == 'capaZonas'){
		 	this.fillParadas('desplegableParadas', 'capaParadas', identificadorStrong);
		 }else if(this.identificadorCapa == 'capaZonasD'){
		 	this.fillParadas('desplegableParadasD','capaParadasD', identificadorStrong);
		 }
		 
		 this.nodoTexto.nodeValue = valor;
		 this.oculta();
	
	}

	
	this.seleccionaParada = function (idStrong, valor){
		
		var regExp = /\d+$/;
		var codigoParada = idStrong.match(regExp).toString();
		selector = document.getElementById('selector'+this.identificadorCapa);
		var inputOculto = document.getElementById(this.identificadorCapa+'Value');
				
		nTextoSelector = document.getElementById(this.identificadorCapa+'Texto');
		nTextoSelector.firstChild.nodeValue = valor;
		
		// Oculta Todas las capas
		ocultarCapasAbiertas(this.todasCapas);

		inputOculto.value = codigoParada;
	
		return false;	
	
	}
	
	
		
	this.seleccionaZona = function (idStrong, valor){
		 
		// Buscamos el objeto que debe rellenarse con las paradas
		if (this.identificadorCapa == 'capaZonas'){
			var nombreObjeto = 'desplegableParadas';
		}else if (this.identificadorCapa == 'capaZonasD'){
			var nombreObjeto = 'desplegableParadasD';
		}
		 
		/* TODO: Ahora debemos decirle al objeto de paradas que comience a rellenarse con las paradas */
	
		this.oSelectorHijo.fillParadas(idStrong);
		
		
		// Escribimos el nombre de la zona en el selector y cerramos la capa de zona
		selector = document.getElementById('selector'+this.identificadorCapa);
			
		// Seleccionamos el nodo de texto del selector donde se ha de "pintar" la seleccion
		nTextoSelector = document.getElementById(this.identificadorCapa+'Texto');
		nTextoSelector.firstChild.nodeValue = valor;
	
		this.oculta();
		
	}
	
			
	this.seleccionaPtoInteres = function (idStrong, valor){


		
		var regExp = /\d+$/;
		var codigoPunto = idStrong.match(regExp).toString();
		// Escribimos el nombre de la zona en el selector y cerramos la capa de zona
		selector = document.getElementById('selector'+this.identificadorCapa);
		var inputOculto = document.getElementById(this.identificadorCapa+'Value');
			
		// Seleccionamos el nodo de texto del selector donde se ha de "pintar" la seleccion
		nTextoSelector = document.getElementById(this.identificadorCapa+'Texto');
		nTextoSelector.firstChild.nodeValue = valor;
	
		inputOculto.value = (codigoPunto);
		
		this.oculta();
		
	}

	
	
	/* Para los objetos de capa de paradas, se fija el array que relaciona zonas con paradas */
	this.setZonasParadas = function(zonasParadas){
		this.arrZonasParadas = zonasParadas;
	}
	
	this.setSelectorHijo = function (oSelHijo){
	    this.oSelectorHijo = oSelHijo;
	}

}


/********** FIN OBJETO DESPLEGABLE ****************/

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;
	
	
}





/*******************************************************************************************/
/******************* Fin objeto manejador de los selects "simulados" ***********************/
/*******************************************************************************************/


/*******************************************************************************************/
/******************* 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;
	
	
	/*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");
		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);
	
		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){
        
		
		// 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 ;
    		
    		/* 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;
}




/**
 * 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";
	}
}
