


var calendarioEntrada;
var calendarioSalida;
var calendarioSalidaDoble;
var isDentroCalendario = false;

//textos de los calendarios.
var textoFechaEntrada = "Fecha entrada";
var textoFechaSalida = "Fecha salida";

//argumentos para pasarle a los calendarios.
var argsCalendarioFechaEntrada = null;
var argsCalendarioFechaSalida = null;
var argsCalendarioFechaSalidaDoble = null;

//identificador (tag id) del div que contiene los respectivos calendarios.
var idContenedorCalendarioFechaEntrada = "idCalendarioContenedorFechaEntrada";
var idContenedorCalendarioFechaSalida = "idCalendarioContenedorFechaSalida";
var idContenedorCalendarioFechaSalidaDoble = "idCalendarioContenedorFechaSalidaDoble";

//identificador (tag id) de los propios calendarios.
var idCalendarioEntrada = "idCalendarioEntrada";
var idCalendarioSalida = "idCalendarioSalida";
var idCalendarioSalidaDoble = "idCalendarioSalidaDoble";

//identificador (tag id) de los botones que muestran los calendarios.
var idBotonFechaEntrada = "idBotonFechaEntrada";
var idBotonFechaSalida = "idBotonFechaSalida";


//identificadores (tag id) de los combos que tienen los selectores de fecha para entrada y salida.
var idFechaEntradaDia = "diaFechaEntrada";
var idFechaEntradaMes = "mesFechaEntrada";
var idFechaEntradaAny = "anyFechaEntrada";
var idFechaSalidaDia = "diaFechaSalida";
var idFechaSalidaMes = "mesFechaSalida";
var idFechaSalidaAny = "anyFechaSalida";



//identificador (tag id) de los textos donde irá las fechas.
var idTextoFechaEntrada = "idTextoFechaEntrada";
var idTextoFechaSalida = "idTextoFechaSalida";

//posiciones en el array 'argsCalendarioFechaEntrada/argsCalendarioFechaSalida' de los distintos calendarios.
var posicionArgsCalendario = 0;
var posicionArgsIdContenedorCalendario = 1;
var posicionArgsIdTextofechaCalendario = 2;
var posicionArgsIdPanelCalendario = 3;
//--solo valido para args fecha de salida
var posicionArgsCalendarioDoble = 4;
var posicionArgsIdPanelCalendarioDoble = 5;

//variables de operacion con dias (sumar/restar) y otros generales al calendario.
var DIAS_SUMAR = "+";
var DIAS_RESTAR = "-";
var rangoMaximoDiasFechaEntrada_Salida = 14;
var separadorFecha = "/";
var fechaEntradaTemp = null;
var anyTopeMaximoSeleccionar = 2;
var COMBO_TIPO_FECHA_ENTRADA = "E";
var COMBO_TIPO_FECHA_SALIDA = "S";

//configuracion paneles contenedores de calendarios.
var panel_fechaEntrada = null;
var panel_fechaSalida = null;
var panel_fechaSalidaDoble = null;
var idPanel_fechaEntrada = "idPanel_fechaEntrada";
var idPanel_fechaSalida = "idPanel_fechaSalida";
var idPanel_fechaSalidaDoble = "idPanel_fechaSalidaDoble";
var widthPanel =200;
var heightPanel =265;
var widthPanelDoble =379;
var heightPanelDoble =265;
//chivato para saber que calendario de salida (normal o doble) esta abierto o funcionando.
var calendarioSalidaDobleActivo = false;



//********************************init()*****************************************
function init() {
		
	//configuramos calendario de fecha entrada.
	calendarioEntrada = new YAHOO.widget.Calendar(idCalendarioEntrada,idContenedorCalendarioFechaEntrada);

	
	//configuramos calendario de fecha salida.
	calendarioSalida = new YAHOO.widget.Calendar(idCalendarioSalida,idContenedorCalendarioFechaSalida);
	
	
	//configuramos calendario de fecha salida doble.
	calendarioSalidaDoble = new YAHOO.widget.CalendarGroup(idCalendarioSalidaDoble,idContenedorCalendarioFechaSalidaDoble);
	
	
	
	//configuramos el panel que contiene a la fecha de salida doble.
	panel_fechaSalidaDoble = new YAHOO.widget.Panel(idPanel_fechaSalidaDoble, 
					{ 
						close:true,  
						visible:false,
						width:widthPanelDoble,
						height:heightPanelDoble,
						effect:{effect:YAHOO.widget.ContainerEffect.FADE, duration: 0.3}, 
						draggable:false
					} 
				); 
	
	
	
	//configuramos el panel que contiene a la fecha de entrada.
	panel_fechaEntrada = new YAHOO.widget.Panel(idPanel_fechaEntrada, 
					{ 
						close:true,  
						visible:false,
						width:widthPanel,
						height:heightPanel,
						effect:{effect:YAHOO.widget.ContainerEffect.FADE, duration: 0.1}, 
						draggable:false
					} 
				); 
				
	//configuramos el panel que contiene a la fecha de entrada.
	panel_fechaSalida = new YAHOO.widget.Panel(idPanel_fechaSalida, 
					{ 
						close:true,  
						visible:false,
						width:widthPanel,
						height:heightPanel,
						effect:{effect:YAHOO.widget.ContainerEffect.FADE, duration: 0.3}, 
						draggable:false
					} 
				); 
	
	//configuramos el calendario
	configCalendario(calendarioEntrada);
	configCalendario(calendarioSalida);
	configCalendario(calendarioSalidaDoble);
	
	//argumentos para pasar a los metodos con info de cada calendario.
  argsCalendarioFechaEntrada = new Array(calendarioEntrada,idContenedorCalendarioFechaEntrada,idTextoFechaEntrada,panel_fechaEntrada);
  
  //fecha salida incluye objetos calendario y panel del calendario doble.
  argsCalendarioFechaSalida = new Array(calendarioSalida,idContenedorCalendarioFechaSalida,idTextoFechaSalida,panel_fechaSalida,calendarioSalidaDoble,panel_fechaSalidaDoble); 
	
	argsCalendarioFechaSalidaDoble = new Array(calendarioSalidaDoble,idContenedorCalendarioFechaSalidaDoble,idTextoFechaSalida,panel_fechaSalidaDoble); 
	
	
 	//registramos los eventos 'selectEvent' (seleccionar en el calendario) y 'renderEvent' (procesar o renderizar...
 	//...el calendario). Esto para calendario de fecha entrada.
  calendarioEntrada.selectEvent.subscribe(getFecha, argsCalendarioFechaEntrada, true);
  calendarioEntrada.renderEvent.subscribe(setupListenersFechaEntrada, argsCalendarioFechaEntrada, true);
  
  //registramos los eventos 'selectEvent' (seleccionar en el calendario) y 'renderEvent' (procesar o renderizar...
 	//...el calendario). Esto para el calendario de fecha de salida.
  calendarioSalida.selectEvent.subscribe(getFecha, argsCalendarioFechaSalida, true);
  calendarioSalida.renderEvent.subscribe(setupListenersFechaSalida, argsCalendarioFechaSalida, true);
  
  
  //registramos los eventos 'selectEvent' (seleccionar en el calendario) y 'renderEvent' (procesar o renderizar...
 	//...el calendario). Esto para el calendario de fecha de salida.
  calendarioSalidaDoble.selectEvent.subscribe(getFecha, argsCalendarioFechaSalidaDoble, true);
  calendarioSalidaDoble.renderEvent.subscribe(setupListenersFechaSalidaDoble, argsCalendarioFechaSalidaDoble, true);
  
  
 
  //registramos listener para el boton de nombre en la variable 'idBotonFechaEntrada'. 
  //vamos se registra los eventos 'mouseup' y 'blur' para el boton que abre el calendario de fecha entrada.
//  YAHOO.util.Event.addListener(idBotonFechaEntrada, 'mouseup', onVerCalendario,argsCalendarioFechaEntrada);
//  YAHOO.util.Event.addListener(idBotonFechaEntrada, 'blur', onCerrarCalendario,argsCalendarioFechaEntrada);
  
  //registramos listener para el boton de nombre en la variable 'idBotonFechaSalida'.
  //vamos se registra los eventos 'mouseup' y 'blur' para el boton que abre el calendario de fecha salida.
//  YAHOO.util.Event.addListener(idBotonFechaSalida, 'mouseup', onVerCalendario,argsCalendarioFechaSalida);
//  YAHOO.util.Event.addListener(idBotonFechaSalida, 'blur', onCerrarCalendario,argsCalendarioFechaSalida);
  
  //registrmos el evento "change" sobre los combos de fecha entrada y salida para pasar los datos a los calendarios.
  //YAHOO.util.Event.addListener([idFechaEntradaDia,idFechaEntradaMes,idFechaEntradaAny], "change", onActualizarCalendario,argsCalendarioFechaEntrada);
	//YAHOO.util.Event.addListener([idFechaSalidaDia,idFechaSalidaMes,idFechaSalidaAny], "change", onActualizarCalendario,argsCalendarioFechaSalida);
  
  
  //YAHOO.util.Event.addListener(idBotonFechaEntrada, 'click', onActualizarCalendario,argsCalendarioFechaEntrada);
  
 
  //procesamos los calendarios
  calendarioEntrada.render();
  calendarioSalida.render();
  calendarioSalidaDoble.render();
    
  //procesamos los panel
  panel_fechaEntrada.render();
  panel_fechaSalida.render();
  panel_fechaSalidaDoble.render();
  
}


//********************************setupListenersFechaSalidaDoble()*****************************************
function setupListenersFechaSalidaDoble() {
	YAHOO.util.Event.addListener(idContenedorCalendarioFechaSalidaDoble, 'mouseover', dentroCalendario);
  YAHOO.util.Event.addListener(idContenedorCalendarioFechaSalidaDoble, 'mouseout', fueraCalendario);
}

//********************************setupListenersFechaEntrada()*****************************************
function setupListenersFechaEntrada() {
	YAHOO.util.Event.addListener(idContenedorCalendarioFechaEntrada, 'mouseover', dentroCalendario);
  YAHOO.util.Event.addListener(idContenedorCalendarioFechaEntrada, 'mouseout', fueraCalendario);
}


//********************************setupListenersFechaSalida()*****************************************
function setupListenersFechaSalida() {
  YAHOO.util.Event.addListener(idContenedorCalendarioFechaSalida, 'mouseover', dentroCalendario);
  YAHOO.util.Event.addListener(idContenedorCalendarioFechaSalida, 'mouseout', fueraCalendario);
}


//********************************getFecha(type,args,argsCalendario)*****************************************
function getFecha(type,args,argsCalendario) {
	
	var txtDate;
	var cmbDia;
	var cmbMes;
	var cmbAny;
	var fechaCalendario;
	var fechaSalida;
	var fechaEntrada;
	var fechaMinimaSeleccionable;
	var fechaMaximaSeleccionable;
	var diasDeDiferenciaEntreFechas;
	//recojemos los argumentos del calendario
	var calendario = argsCalendario[posicionArgsCalendario];
	var idContenedorCalendario = argsCalendario[posicionArgsIdContenedorCalendario];
	var idTextoFecha = argsCalendario[posicionArgsIdTextofechaCalendario];
	var panelCalendario = argsCalendario[posicionArgsIdPanelCalendario];
	
	//recogemos la fecha seleccionada.
	var dates = args[0];  
	var date = dates[0];
	var year = date[0];
	var month = date[1];
	var day = date[2];
	



	//txtDate = document.getElementById(idTextoFecha);
	if (calendario.id==idCalendarioEntrada){
		cmbDia = document.getElementById(idFechaEntradaDia);
		cmbMes = document.getElementById(idFechaEntradaMes);
		cmbAny = document.getElementById(idFechaEntradaAny);
		//alert(validarFechaOK(2007,2,30));
	} else if (calendario.id==idCalendarioSalida || calendario.id==idCalendarioSalidaDoble){
		cmbDia = document.getElementById(idFechaSalidaDia);
		cmbMes = document.getElementById(idFechaSalidaMes);
		cmbAny = document.getElementById(idFechaSalidaAny);
	}
	/*var dayText = day;
	var monthText = month;
	if (day<10){
		dayText = "0" + day;
	}
	
	if (month<10){
		monthText = "0" + month;
	}*/
	
	
	
	
	//en la web son 3 combos
	cmbDia.value  = day;
	cmbMes.value  = month;
	cmbAny.value  = year;
	
	//txtDate.value =  dayText + "/" + monthText + "/" + year; 
	
	
	fechaCalendario = obtenerFecha(year,month,day); 
  isDentroCalendario = false;
  
  if (calendario.id==idCalendarioEntrada){
  //si es el calendario de entrada establecemos el rango de dias seleccionables para la fecha salida.
  	fechaEntrada = fechaCalendario;
		fechaSalida = calendarioSalida.getSelectedDates()[0];
		
		///OBRAS AQUI
		//isDateOOB = calendario.isDateOOB(obtenerFecha(year,month,day));
		if (fechaSalida==null){
			fechaSalida=operarDias(fechaEntrada,1,DIAS_SUMAR);
		}
		//----------------------------------
		
		fechaMinimaSeleccionable = operarDias(fechaEntrada,1,DIAS_SUMAR);
		fechaMaximaSeleccionable = operarDias(fechaEntrada,rangoMaximoDiasFechaEntrada_Salida,DIAS_SUMAR);
		
		//establecemos el minimo y maximo de el calendario de salida.
	  calendarioSalida.cfg.setProperty("mindate",fechaMinimaSeleccionable);
	  calendarioSalida.cfg.setProperty("maxdate",fechaMaximaSeleccionable);
	  //establecemos el minimo y maximo de el calendario de salida doble.
	  calendarioSalidaDoble.cfg.setProperty("mindate",fechaMinimaSeleccionable);
	  calendarioSalidaDoble.cfg.setProperty("maxdate",fechaMaximaSeleccionable);
	  
	  
	  //si la fecha de salida no tiene un valor despues que la fecha de entrada, es decir,...
	  //...es menor o igual a la fecha de entrada situamos la fecha de salida 1dia+ a la fecha entrada.
	  if (!YAHOO.widget.DateMath.after(fechaSalida,fechaEntrada)){
			calendarioSalida.select(fechaMinimaSeleccionable);
			calendarioSalida.cfg.setProperty("pagedate", (fechaMinimaSeleccionable.getMonth()+1) + separadorFecha + fechaMinimaSeleccionable.getFullYear());   
			calendarioSalidaDoble.select(fechaMinimaSeleccionable);
			calendarioSalidaDoble.cfg.setProperty("pagedate", (fechaMinimaSeleccionable.getMonth()+1) + separadorFecha + fechaMinimaSeleccionable.getFullYear());   
			
			/*if (calendarioSalida.isDateOOB(fechaMinimaSeleccionable)){
				calendarioSalida.deselectAll();
				calendarioSalidaDoble.deselectAll();
			}*/
			
		} else if (fechaEntradaTemp>fechaEntrada){
	 		calendarioSalida.select(fechaMinimaSeleccionable);
			calendarioSalida.cfg.setProperty("pagedate", (fechaMinimaSeleccionable.getMonth()+1) + separadorFecha + fechaMinimaSeleccionable.getFullYear());
	  	calendarioSalidaDoble.select(fechaMinimaSeleccionable);
			calendarioSalidaDoble.cfg.setProperty("pagedate", (fechaMinimaSeleccionable.getMonth()+1) + separadorFecha + fechaMinimaSeleccionable.getFullYear());
			
			/*if (calendarioSalida.isDateOOB(fechaMinimaSeleccionable)){
				calendarioSalida.deselectAll();
				calendarioSalidaDoble.deselectAll();
			}*/
			
	  }
	  fechaEntradaTemp = fechaEntrada;
	  
	 	calendarioSalida.render();
	 	
	 	calendarioSalidaDoble.render();
	 
	  
	} else if (calendario.id==idCalendarioSalida){
		//fechaSalida = fechaCalendario;
		//fechaEntrada = calendarioEntrada.getSelectedDates()[0];
		//sDate = fechaSalida.getDate() + separadorFecha + (fechaSalida.getMonth()+1) + separadorFecha + fechaSalida.getFullYear();
	 
	}
	
	
  calendario.render();
 
  cerrarCalendario(panelCalendario,calendario); 
  calcula_dies();
}


//********************************onCerrarCalendario(event,args)*****************************************
function onCerrarCalendario(event,args){
	
	var calendario = null;
	var panelCalendario = null;
	
	
	//por defecto cogemos estos valores.
	calendario = args[posicionArgsCalendario];
	panelCalendario = args[posicionArgsIdPanelCalendario];
	
	
	if (calendario.id==idCalendarioSalida){
		if (calendarioSalidaDobleActivo){
			calendario = args[posicionArgsCalendarioDoble];
			panelCalendario = args[posicionArgsIdPanelCalendarioDoble];
			calendarioSalidaDobleActivo = false;
		}
	}
	cerrarCalendario(panelCalendario,calendario);
}



//********************************cerrarCalendario(panelCalendario,calendario)*****************************************
function cerrarCalendario(panelCalendario,calendario){
	 
	 if (!isDentroCalendario) {
		panelCalendario.hide();
		calendario.hide();
	}
}


//********************************onVerCalendario(event,args)*****************************************
function onVerCalendario(event,args){
		
	var objEvento = null;
	var calendario = null;
	var panelCalendario = null;
	var fechaCalendario = null;
	var fechaCalendarioCombo = null;
	var fechaCalendarioComboDate = null;
	var xy = null;
	

	//por defecto cogemos estos valores.
	calendario = args[posicionArgsCalendario];
	panelCalendario = args[posicionArgsIdPanelCalendario];
	
	if (calendario.id==idCalendarioSalida){
		//SI ES CALENDARIO DE SALIDA.
		//obtenemos la fecha del calendario de entrada.
		fechaCalendario = calendarioEntrada.getSelectedDates()[0];
		//cogemos la fecha de entrada del combo de fecha de entrada.
		fechaCalendarioCombo = obtenerFechaCombo(COMBO_TIPO_FECHA_ENTRADA);
		if (fechaCalendario!=null){
			//convertimos la fecha string de fecha en objeto Date.
			fechaCalendarioComboDate = obtenerFecha(fechaCalendario.getFullYear(),fechaCalendario.getMonth(),fechaCalendario.getDate());
			//comparamos la fecha del calendario de entrada con la fecha del combo de entrada.
			//si las fechas son distintas implica que la fecha del combo no es la misma que la seleccionada....
			//...en el calendario y al abrir el calendario se recargará este con la fecha del combo.
			//Por tanto ponenemos 'fechaCalendario' a null para que coja la fecha del combo.
			if (fechaCalendario!=fechaCalendarioComboDate){
				fechaCalendario = null;
			}
		}
		if (fechaCalendario==null){
			fechaCalendario = fechaCalendarioCombo;
		}
		if (fechaCalendario!=null){
			if (fechaRangos2MesesDistintos(fechaCalendario)){
				calendario = args[posicionArgsCalendarioDoble];
				panelCalendario = args[posicionArgsIdPanelCalendarioDoble];
				calendarioSalidaDobleActivo = true;
			}
		}
	}
	onActualizarCalendario(args);
	if(window.event){
		objEvento=window.event.srcElement;
	} else{
		objEvento=event.target.id;
	}
/*
var x=objEvento.pageX;
if(!x&&0!==x) x=objEvento.clientX||0;
alert(x);
if(YAHOO.env.ua.ie)
{
	x+=m_getScroll()[1];
}
*/
	xy = YAHOO.util.Dom.getXY(objEvento);
  xy[1] = xy[1] - 10;
//  panelCalendario.cfg.setProperty("xy",xy);
  //mostramos el calendario y su panel que lo contiene.
  calendario.show();
  panelCalendario.show();
}

//********************************fechaRangos2MesesDistintos(fecha)*****************************************
function fechaRangos2MesesDistintos(fecha){
	
	var fechaMax;
	var mesIni = 0;
	var mesFin = 0;
	var seCumpleCondicion = false;
	var fechaFinalMes;
	
	fechaMax = operarDias(fecha,rangoMaximoDiasFechaEntrada_Salida,DIAS_SUMAR);
	
	//le sumamos un dia más para saber si estamos situado en el último dia del mes y así mostramos....
	//...el calendario doble.
	fechaFinalMes = operarDias(fechaMax,1,DIAS_SUMAR);
	
	//alert('fecha -->' + fecha);
	//alert('fechaMax -->' + fechaMax);
	//alert(fechaMax.getDate());
	mesIni = fecha.getMonth();
	mesFin = fechaMax.getMonth();
	if (mesIni!=mesFin || (fechaFinalMes.getDate()==1) ){
		seCumpleCondicion = true;
	}
	
	return seCumpleCondicion; 
	
}

//********************************dentroCalendario()*****************************************
function dentroCalendario() {   
	isDentroCalendario = true;   
}   


//********************************fueraCalendario()*****************************************
function fueraCalendario() {   
	isDentroCalendario = false;   
}   


//********************************configCalendario(calendario)*****************************************
function configCalendario(calendario){
	
	//---------formato: dd/mm/yyyy de la fecha----------------
	
	
	var fechaMinimaSeleccionable = null;
	var fechaMaximaSeleccionable = null;
	var fechaHoy;
	var cmbDia;
	var cmbMes;
	var cmbAny;
	
	if (calendario.id==idCalendarioEntrada){
		fechaHoy = new Date();
	} else if (calendario.id==idCalendarioSalida || calendario.id==idCalendarioSalidaDoble){
		cmbDia = document.getElementById(idFechaEntradaDia);
		cmbMes = document.getElementById(idFechaEntradaMes);
		cmbAny = document.getElementById(idFechaEntradaAny);
		fechaHoy = obtenerFecha(cmbAny.value,cmbMes.value,cmbDia.value);
	}
	

	
	if (calendario.id==idCalendarioEntrada){
		calendario.cfg.setProperty("title","",false);
		fechaMinimaSeleccionable = fechaHoy
		calendario.select(fechaMinimaSeleccionable);
		fechaEntradaTemp = fechaMinimaSeleccionable;
		calendario.cfg.setProperty("pagedate", (fechaMinimaSeleccionable.getMonth()+1) + separadorFecha + fechaMinimaSeleccionable.getFullYear());
		//maximo seleccionable para la fecha de entrada , el año actual y el siguiente completos.
		fechaMaximaSeleccionable = new Date(fechaHoy.getFullYear()+ anyTopeMaximoSeleccionar,11,31);

	} else if (calendario.id==idCalendarioSalida || calendario.id==idCalendarioSalidaDoble){
		calendario.cfg.setProperty("title","",false);
		fechaMinimaSeleccionable = operarDias(fechaHoy,1,DIAS_SUMAR);
		fechaMaximaSeleccionable = operarDias(fechaHoy,rangoMaximoDiasFechaEntrada_Salida,DIAS_SUMAR);
		calendario.select(fechaMinimaSeleccionable);
		calendario.cfg.setProperty("pagedate", (fechaMinimaSeleccionable.getMonth()+1) + separadorFecha + fechaMinimaSeleccionable.getFullYear());
	} else{
		calendario.cfg.setProperty("title","",false);
		fechaMinimaSeleccionable = fechaHoy;
	}
	
	
	//fecha minima desde la que se podrá seleccionar, usamos el today del propio calendario....
	//...porque se instancia con la fecha actual.
	if (fechaMinimaSeleccionable!=null){
		calendario.cfg.setProperty("mindate",fechaMinimaSeleccionable);
	}
	
	//fecha máxima desde la que se podrá seleccionar, usamos el today del propio calendario....
	//...porque se instancia con la fecha actual.
	if (fechaMaximaSeleccionable!=null){
		calendario.cfg.setProperty("maxdate",fechaMaximaSeleccionable);
	}
	
	
	//mostrar cerrar en el calendario.
	calendario.cfg.setProperty("close",false);
	
	//separador de dias/mes/año
	calendario.cfg.setProperty("DATE_FIELD_DELIMITER", separadorFecha);

	//posiciones del dia/mes y año en la fecha.
	//---------formato: dd/mm/yyyy de la fecha----------------
	calendario.cfg.setProperty("MDY_DAY_POSITION", 1);
	calendario.cfg.setProperty("MDY_MONTH_POSITION", 2);
	calendario.cfg.setProperty("MDY_YEAR_POSITION", 3);
	
	//establecemos el tipo de letra a ver para los dias de la semana.
	calendario.cfg.setProperty("LOCALE_WEEKDAYS", "medium");
	//la semana empieza en el dia 1 (lunes) porque el 0 es domingo.
	//calendario.cfg.setProperty("START_WEEKDAY", 1);
	//no permitimos multiselect, seleccionar varias fechas en el calendario.
	calendario.cfg.setProperty("MULTI_SELECT", false);
	
	var idioma = "2"; //por defecto en ingles.
	var idiomaCalendario =  document.getElementById("idiomaCalendario");
	if (idiomaCalendario!=null){
		idioma = idiomaCalendario.value;
	}
	inicializarCalendarioIdioma(calendario,idioma);

	//textos para españa de las semanas y los meses.
	//calendario.cfg.setProperty("MONTHS_SHORT",   ["Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dec"]);
	//calendario.cfg.setProperty("MONTHS_LONG",    ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"]);
	//calendario.cfg.setProperty("WEEKDAYS_1CHAR", ["L", "M", "X", "J", "V", "S", "D"]);
	//calendario.cfg.setProperty("WEEKDAYS_SHORT", ["Do", "Lu", "Ma", "Mi", "Ju", "Vi", "Sa"]);
	//calendario.cfg.setProperty("WEEKDAYS_MEDIUM",["Dom", "Lun", "Mar", "Mie", "Jue", "Vie", "Sab"]);
	//calendario.cfg.setProperty("WEEKDAYS_LONG",  [ "Domingo","Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sabado"]);
}

//********************************inicializarCalendarioIdioma(calendario,idioma)*****************************************
function inicializarCalendarioIdioma(calendario,idioma){
	
		//hay que recordar que el calendario funciona por defecto en calendario ingles.
		if (idioma=="1"){
		//español
			//la semana empieza en el dia 1 (lunes) porque el 0 es domingo.
			calendario.cfg.setProperty("START_WEEKDAY", 1);
			//textos para españa de las semanas y los meses.
			calendario.cfg.setProperty("MONTHS_SHORT",   ["Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dec"]);
			calendario.cfg.setProperty("MONTHS_LONG",    ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"]);
			calendario.cfg.setProperty("WEEKDAYS_1CHAR", ["L", "M", "X", "J", "V", "S", "D"]);
			calendario.cfg.setProperty("WEEKDAYS_SHORT", ["Do", "Lu", "Ma", "Mi", "Ju", "Vi", "Sa"]);
			calendario.cfg.setProperty("WEEKDAYS_MEDIUM",["Dom", "Lun", "Mar", "Mie", "Jue", "Vie", "Sab"]);
			calendario.cfg.setProperty("WEEKDAYS_LONG",  [ "Domingo","Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sabado"]);
		}else if(idioma=="2"){
		//ingles
			//la semana empieza en el dia 0 porque el 0 es domingo y es en ingles.
			calendario.cfg.setProperty("START_WEEKDAY", 0);
			//textos para ingles de las semanas y los meses.
			calendario.cfg.setProperty("MONTHS_SHORT",   ["Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dec"]);
			calendario.cfg.setProperty("MONTHS_LONG",    ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]);
			calendario.cfg.setProperty("WEEKDAYS_1CHAR", ["S", "M", "T", "W", "T", "F", "S"]);
			calendario.cfg.setProperty("WEEKDAYS_SHORT", ["Su", "Mo", "Tue", "We", "Th", "Fr", "Sa"]);
			calendario.cfg.setProperty("WEEKDAYS_MEDIUM",["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]);
			calendario.cfg.setProperty("WEEKDAYS_LONG",  [ "Sunday","Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]);
			
		}else if(idioma=="3"){
		//
			calendario.cfg.setProperty("START_WEEKDAY", 0);
			calendario.cfg.setProperty("MONTHS_SHORT",   ["Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dec"]);
			calendario.cfg.setProperty("MONTHS_LONG",    ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]);
			calendario.cfg.setProperty("WEEKDAYS_1CHAR", ["S", "M", "T", "W", "T", "F", "S"]);
			calendario.cfg.setProperty("WEEKDAYS_SHORT", ["Su", "Mo", "Tue", "We", "Th", "Fr", "Sa"]);
			calendario.cfg.setProperty("WEEKDAYS_MEDIUM",["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]);
			calendario.cfg.setProperty("WEEKDAYS_LONG",  [ "Sunday","Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]);

		}else if(idioma=="4"){
		//
			calendario.cfg.setProperty("START_WEEKDAY", 0);
			calendario.cfg.setProperty("MONTHS_SHORT",   ["Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dec"]);
			calendario.cfg.setProperty("MONTHS_LONG",    ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]);
			calendario.cfg.setProperty("WEEKDAYS_1CHAR", ["S", "M", "T", "W", "T", "F", "S"]);
			calendario.cfg.setProperty("WEEKDAYS_SHORT", ["Su", "Mo", "Tue", "We", "Th", "Fr", "Sa"]);
			calendario.cfg.setProperty("WEEKDAYS_MEDIUM",["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]);
			calendario.cfg.setProperty("WEEKDAYS_LONG",  [ "Sunday","Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]);

		}else if(idioma=="5"){
		//
			calendario.cfg.setProperty("START_WEEKDAY", 0);
			calendario.cfg.setProperty("MONTHS_SHORT",   ["Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dec"]);
			calendario.cfg.setProperty("MONTHS_LONG",    ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]);
			calendario.cfg.setProperty("WEEKDAYS_1CHAR", ["S", "M", "T", "W", "T", "F", "S"]);
			calendario.cfg.setProperty("WEEKDAYS_SHORT", ["Su", "Mo", "Tue", "We", "Th", "Fr", "Sa"]);
			calendario.cfg.setProperty("WEEKDAYS_MEDIUM",["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]);
			calendario.cfg.setProperty("WEEKDAYS_LONG",  [ "Sunday","Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]);

		}else if(idioma=="6"){
		//
			calendario.cfg.setProperty("START_WEEKDAY", 0);
			calendario.cfg.setProperty("MONTHS_SHORT",   ["Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dec"]);
			calendario.cfg.setProperty("MONTHS_LONG",    ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]);
			calendario.cfg.setProperty("WEEKDAYS_1CHAR", ["S", "M", "T", "W", "T", "F", "S"]);
			calendario.cfg.setProperty("WEEKDAYS_SHORT", ["Su", "Mo", "Tue", "We", "Th", "Fr", "Sa"]);
			calendario.cfg.setProperty("WEEKDAYS_MEDIUM",["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]);
			calendario.cfg.setProperty("WEEKDAYS_LONG",  [ "Sunday","Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]);

		} else{
			
			calendario.cfg.setProperty("START_WEEKDAY", 0);
			calendario.cfg.setProperty("MONTHS_SHORT",   ["Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dec"]);
			calendario.cfg.setProperty("MONTHS_LONG",    ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]);
			calendario.cfg.setProperty("WEEKDAYS_1CHAR", ["S", "M", "T", "W", "T", "F", "S"]);
			calendario.cfg.setProperty("WEEKDAYS_SHORT", ["Su", "Mo", "Tue", "We", "Th", "Fr", "Sa"]);
			calendario.cfg.setProperty("WEEKDAYS_MEDIUM",["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]);
			calendario.cfg.setProperty("WEEKDAYS_LONG",  [ "Sunday","Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]);

		}
}


//********************************operarDias(fecha,dias,operacion)*****************************************
function operarDias(fecha,dias,operacion){
	
	var milisegundosDias = 0;
	var tiempoMilisegundosFecha = 0;
	var fechaTemp = null;
	
	fechaTemp = new Date(fecha.getFullYear(),fecha.getMonth(),fecha.getDate());
	
	fechaTemp = YAHOO.widget.DateMath.clearTime(fechaTemp);
	//alert(fechaTemp);
	
	milisegundosDias = parseInt(dias*YAHOO.widget.DateMath.ONE_DAY_MS);
	tiempoMilisegundosFecha = fechaTemp.getTime();
	
	
	if (operacion=="+"){
		fechaTemp.setTime(parseInt(tiempoMilisegundosFecha + milisegundosDias));
	}else if(operacion=="-"){
		fechaTemp.setTime(parseInt(tiempoMilisegundosFecha - milisegundosDias));
	}
	
	fechaTemp = YAHOO.widget.DateMath.clearTime(fechaTemp);
	//alert(fechaTemp);
	return fechaTemp;
	
}



//********************************obtenerFecha(y,m,d)*****************************************
function obtenerFecha(y,m,d){
	//devolvemos un objeto date segun lo recibido por parametro.
	//el mes (m) se recibe en formato 1-12 , para generar un date necesitamos tenerlo en 0-11.
	//formateamos la fecha segun 'patronFormatoFecha'.
	
	//obtenemos formato 0-11
	var mes = eval(m);
	if (mes>0){
		m = mes -1;
	}
	//obtenemos la fecha con 'patronFormatoFecha'.
	var fecha = new Date(y,m,d);
	//devolvemos un objeto date (esta en formato 0-11).
	YAHOO.widget.DateMath.clearTime(fecha);
	
	return fecha;
}


//********************************diferenciaDias(fechaIni,fechaFin)*****************************************
function diferenciaDias(fechaIni,fechaFin){
	
	//milisegundosDias = parseInt(dias*YAHOO.widget.DateMath.ONE_DAY_MS);
	//tiempoMilisegundosFecha = fechaTemp.getTime();
	YAHOO.widget.DateMath.clearTime(fechaFin);
	YAHOO.widget.DateMath.clearTime(fechaIni);
	
	var diferencia = fechaFin.getTime() - fechaIni.getTime();
  var dias = Math.floor(diferencia / YAHOO.widget.DateMath.ONE_DAY_MS);
   if (diferencia/dias>YAHOO.widget.DateMath.ONE_DAY_MS){
     //hay milesimas de mas se perdio una hora y no llega al siguiente dia.
     if (dias+1<=7){
      dias = dias +1;
     }
   }
	//alert(dias);
	return dias;
}

//********************************validarFechaOK(y,m,d)*****************************************
function validarFechaOK(y,m,d){
	//comprobamos si la fecha enviada es correcta, y/m/d son valores numéricos.
	//se recibe en formato mes 1-12.
	
	var fechaOK = true;
	
	
	
	if((y < 2000) || (y > 2015) || (m < 1) || (m > 12) || (d < 1) || (d > 31)){
	 	fechaOK = false;
	} else{
		if((y%4 != 0) && (m == 2) && (d > 28)){  
			fechaOK = false;// Año no bisiesto y es febrero y el dia es mayor a 28.
		} else{
			if ((((m == 4) || (m == 6) || (m == 9) || (m==11)) && (d>30)) || ((m==2) && (d>29))){
				fechaOK = false;    				  	 
			}
		} 
	}
	return fechaOK;
}



//********************************onActualizarCalendario(args)*****************************************
function onActualizarCalendario(args) {
	
	
	var fecha;
	var calendario = args[posicionArgsCalendario];
	var isDateOOB = false;
	
	
	
	if (calendario.id==idCalendarioEntrada){
	 	fecha = obtenerFechaCombo(COMBO_TIPO_FECHA_ENTRADA);
	} else if (calendario.id==idCalendarioSalida || calendario.id==idCalendarioSalidaDoble){
	 	fecha = obtenerFechaCombo(COMBO_TIPO_FECHA_SALIDA);
	}
	
	if (fecha!=null){
		//comprobamos si la fecha esta fuera de rango o bloqueada (isDateOOB).
		isDateOOB = calendario.isDateOOB(fecha);
		if (calendarioSalidaDobleActivo){
			calendario = args[posicionArgsCalendarioDoble];
		}
		
		if (!isDateOOB){
			//sino es una fecha bloqueada o seleccionable pues la seleccionamos y nos situamos en ella.
			calendario.select(fecha);
			calendario.cfg.setProperty("pagedate", (fecha.getMonth()+1) + separadorFecha + fecha.getFullYear());
		} else{
			//si la fecha no es valida situamos el calendario a dia actual fecha entrada y fecha salida a dia actual +1.
			//esto sucederá cuando en los combos de fecha pongamos una fecha errónea, automáticamente el calendario....
			//...se pondrá a la fecha actual de hoy y pondrá la fecha correcta en los combos de fechas.
			calendario.deselectAll();
			reiniciarCalendarios(calendario);
			//calendario.select(fecha);
			calendario.cfg.setProperty("pagedate",  (fecha.getMonth()+1) + separadorFecha + fecha.getFullYear());
			
		}
		calendario.render();
	}
}

//********************************reiniciarCalendarios()*****************************************

function reiniciarCalendarios(calendario){
	
	var fechaCombo;
	var fechaHoy;
	
	
	
	if (calendario.id==idCalendarioEntrada){
		//CALENDARIO DE ENTRADA.
		fechaHoy = new Date();
	} else if (calendario.id==idCalendarioSalida || calendario.id==idCalendarioSalidaDoble){
		//CALENDARIO DE SALIDA ( SIMPLE O DOBLE).
		//cogemos la fecha seleccionada del calendario de entrada.
		fechaHoy = calendarioEntrada.getSelectedDates()[0];
		//cogemos la fecha del combo de fecha de entrada.
		fechaCombo = obtenerFechaCombo(COMBO_TIPO_FECHA_ENTRADA);
		//comparar las dos fechas
		if (fechaHoy!=null){
			fechaHoyDate = obtenerFecha(fechaHoy.getFullYear(),fechaHoy.getMonth(),fechaHoy.getDate());
			//si la fecha seleccionada en el calendario de entrada es distinta que la fecha del combo de entrada....
			//...es que el calendario aun no se ha recargado con esta fecha entonces ponemos 'fechaHoy' a null...
			//...para usar la fecha del combo de entrada.
			if (fechaCombo!=fechaHoyDate){
				fechaHoy = null;
			}
		}

		//si la fecha del calendario de entrada es nula, no esta seleccionado cogemos ...
		//...la fecha de entrada de los combos de fecha de entrada.
		if (fechaHoy==null){
			fechaHoy = obtenerFechaCombo(COMBO_TIPO_FECHA_ENTRADA);
			//si la fecha obtenida de los combos de la fecha de entrada es OOB (bloqueada) cogemos...
			//...la fecha de hoy.
			if (calendarioEntrada.isDateOOB(fechaHoy)){
				//y en el peor de los casos cogemos la fecha actual.
				fechaHoy = new Date();
			}
		}
	}
	
	
	if (calendario.id==idCalendarioEntrada){
		//CALENDARIO ENTRADA
		fechaMinimaSeleccionable = fechaHoy
		//maximo seleccionable para la fecha de entrada , el año actual y el siguiente completos.
		fechaMaximaSeleccionable = new Date(fechaHoy.getFullYear()+ anyTopeMaximoSeleccionar ,11,31);
		calendarioEntrada.cfg.setProperty("mindate",fechaMinimaSeleccionable);
		calendarioEntrada.cfg.setProperty("maxdate",fechaMaximaSeleccionable);
	} else if (calendario.id==idCalendarioSalida || calendario.id==idCalendarioSalidaDoble){
		//CALENDARIO SALIDA (simple y doble)
		fechaMinimaSeleccionable = operarDias(fechaHoy,1,DIAS_SUMAR);
		fechaMaximaSeleccionable = operarDias(fechaHoy,rangoMaximoDiasFechaEntrada_Salida,DIAS_SUMAR);
		//maximo seleccionable para la fecha de salida (simple y doble) , el año actual y el siguiente completos.
		calendarioSalida.cfg.setProperty("pagedate", (fechaMinimaSeleccionable.getMonth()+1) + separadorFecha + fechaMinimaSeleccionable.getFullYear());
		calendarioSalida.cfg.setProperty("mindate",fechaMinimaSeleccionable);
		calendarioSalida.cfg.setProperty("maxdate",fechaMaximaSeleccionable);
		calendarioSalidaDoble.cfg.setProperty("pagedate", (fechaMinimaSeleccionable.getMonth()+1) + separadorFecha + fechaMinimaSeleccionable.getFullYear());
		calendarioSalidaDoble.cfg.setProperty("mindate",fechaMinimaSeleccionable);
		calendarioSalidaDoble.cfg.setProperty("maxdate",fechaMaximaSeleccionable);
		fechaCombo = obtenerFechaCombo(COMBO_TIPO_FECHA_SALIDA);
		calendarioSalida.select(fechaCombo);
		calendarioSalidaDoble.select(fechaCombo);
	}
}

//********************************obtenerFechaCombo(tipoCombo)*****************************************
function obtenerFechaCombo(tipoCombo){
	
	var selMonth = null;
	var selDay = null;
	var selYear = null;
	var month = null;
	var day = null;
	var year = null;
	var fecha = null;
	
	if (tipoCombo==COMBO_TIPO_FECHA_ENTRADA){
		selMonth = document.getElementById(idFechaEntradaMes);
		selDay = document.getElementById(idFechaEntradaDia);
		selYear = document.getElementById(idFechaEntradaAny);
	} else if (tipoCombo==COMBO_TIPO_FECHA_SALIDA){
		selMonth = document.getElementById(idFechaSalidaMes);
	 	selDay = document.getElementById(idFechaSalidaDia);
	 	selYear = document.getElementById(idFechaSalidaAny);
	}
	if(selMonth!=null && selDay!=null && selYear!=null){
		month = parseInt(selMonth.options[selMonth.selectedIndex].text);
		day = parseInt(selDay.options[selDay.selectedIndex].value);
		year = parseInt(selYear.options[selYear.selectedIndex].value);
		fecha = obtenerFecha(year,month,day);
	}
	return fecha;
}


YAHOO.util.Event.addListener(window, 'load', init);

