var CALENDARIO = {};

(function(){
	
	var etiquetas;
	
	CALENDARIO.setEtiquetas = function( etiq ){
		etiquetas = etiq;
	}
	
	function fCalenDevuelveValores(valoresJSON) {
		if( valoresJSON == 'KO' )
		{
			this.muestraValores( [] );
		}
		else
		{
			this.muestraValores( valoresJSON );
		}
	}
	
	function getMonthDate( sFecha ){
		return Number( sFecha.substring(3, 5)) - 1;// Los meses empiezan por 0 = Enero.
	}
	
	function getFullYearDate( sFecha ){
		return Number( sFecha.substring(6) );
	}
	
	function calendario( capa, idioma, fechaMin, fechaMax, destino, origen, familia, producto, fechaInicial, onClick, tcalendario, solohotel ) {
		
		
		this.dias = etiquetas.DIAS;
		this.meses = etiquetas.MESES;
		this.meses_pre = etiquetas.MESES_PRE;
		this.capa = '#' + capa;
		this.fechaMin = fechaMin;
		this.fechaMax = fechaMax;
		this.fechaInicial = fechaInicial;
		this.numMeses = 3;

		this.anyo = getFullYearDate( this.fechaInicial );
		this.mes = getMonthDate( this.fechaInicial ); // Los meses empiezan por 0 = Enero.

		this.destino = destino;
		this.origen = origen;
		this.familia = familia;
		this.producto = producto;
		this.tcalendario = tcalendario;
		this.solohotel = solohotel;

		//this.mostrar = fCalenMostrar;
		//this.cargaValores = fCalenCargaValores;
		this.devuelveValores = fCalenDevuelveValores;
		this.muestraValores = fCalenMuestraValores;
		this.cargaCalendario = fCargaCalendario;
		this.ocultaCapa = 'ocultaCapa';
		this.seleccionaFecha = onClick;
		this.cambiaMes = 'cambiaMes';
		this.cierraCalendario = fCerrarCalendarioInicio;
		this.puedeRetroceder = fPuedeRetroceder;
		this.puedeAvanzar = fPuedeAvanzar;
		this.diaTieneDescuento = fdiaTieneDescuento;
	}
	
	
	
	function mesSiguiente( calendAntiguo, salto){
		
		$("#selectdestSel").hide();
		$('#CalendarioFlotante div.cuerpoSeleccion').hide();
		$('#CalendarioFlotante div.cuerpoCargando').css('display','block');
		
		//Calculamos la fecha inicial del mes siguiente
		var fInicialNew = $gp.stringToDate( calendAntiguo.fechaInicial, formatoFecha  );
		fInicialNew.setDate( 1 );
		fInicialNew.setMonth( fInicialNew.getMonth() + salto );
		fInicialNew = $gp.dateToString( fInicialNew, formatoFecha );
		
		var calen = new calendario('areaCalendario', idioma.toLowerCase(), calendAntiguo.fechaMin , calendAntiguo.fechaMax, calendAntiguo.destino, calendAntiguo.origen, calendAntiguo.familia, calendAntiguo.producto, fInicialNew, calendAntiguo.seleccionaFecha, calendAntiguo.tcalendario, calendAntiguo.solohotel);
		calen.cargaCalendario();
		
	}

	function mesAnterior( calendAntiguo, salto ){
		
		$("#selectdestSel").hide();
		$('#CalendarioFlotante div.cuerpoSeleccion').hide();
		$('#CalendarioFlotante div.cuerpoCargando').css('display','block');
		
		//Calculamos la fecha inicial del mes anterior
		var fInicialNew = $gp.stringToDate( calendAntiguo.fechaInicial, formatoFecha  );
		fInicialNew.setDate( 1 );
		fInicialNew.setMonth( fInicialNew.getMonth() - salto );
		var dateMin = $gp.stringToDate( calendAntiguo.fechaMin, formatoFecha );
		if( fInicialNew > dateMin ){
			fInicialNew = $gp.dateToString( fInicialNew, formatoFecha );
		}
		else{
			fInicialNew = $gp.dateToString( dateMin, formatoFecha );
		}
		
		var calen = new calendario('areaCalendario', idioma.toLowerCase(), calendAntiguo.fechaMin , calendAntiguo.fechaMax , calendAntiguo.destino, calendAntiguo.origen, calendAntiguo.familia, calendAntiguo.producto, fInicialNew, calendAntiguo.seleccionaFecha, calendAntiguo.tcalendario, calendAntiguo.solohotel);
		calen.cargaCalendario();
	}

function defineColorboxCalendario(){
	$.colorbox({	
		inline:true,
		transition:"none", 
		speed:"500",
		opacity: '0.2',
		href:"CalendarioFlotante",
		'onComplete':function(){
			
			
			//$("#selectdestCar").css({display: 'none'});
			//$("#selectdestSel").css({display: 'block'});
			//$("#CalendarioVisual").open();
			
			$("#CalendarioFlotante").css({display: 'block'});
			//$("#footSeleccionCal").css({display: 'block'});
			
									
		},
		'onLoad':function(){
			
			$("#selectdestSel").css({display: 'none'});
			$("#selectdestDis").css({display: 'none'});
			$("#headSeleccionCal").css({display: 'block'});
			$("#CalendarioFlotante").css({display: 'none'});
			$("#CalendarioFlotante div.cuerpoCargando").css({display: 'block'});
			$("#CalendarioFlotante div.cuerpoSeleccion").css({display: 'none'});
			$("#CalendarioFlotante div.cuerpoDistribucion").css({display: 'none'});
			
			//$("#CalendarioVisual").close();
		},
		'onCleanup':function(){
			$("#CalendarioFlotante").css({display: "none"});
			$('#CalendarioFlotante').addClass('calendarioFlotante');
			$('#CalendarioFlotante').removeClass('distribucionFlotante');
			//$("#CalendarioVisual").close();
		},
		'onClose':function(){						
			$("#CalendarioFlotante").css({display: "none"});
			$.colorbox.close();
			this.remove();
		}}
	);
}	


CALENDARIO.MuestraCalendario = function( fechaMin, fechaMax, fechaInicial, idDestino, idOrigen, familia, producto, onClick, tcalendario, solohotel){
	
	//Asegura que se cargue el calendario a partir de la fecha menor permitida dentro del mes seleccionado
	var dateMin = $gp.stringToDate( fechaMin, formatoFecha );
	var dateInicial = $gp.stringToDate( fechaInicial, formatoFecha );
	dateInicial.setDate( 1 );
	if( dateInicial > dateMin ){
		fechaInicial = $gp.dateToString( dateInicial, formatoFecha );
	}
	else{
		fechaInicial = fechaMin;
	}
	
	var destino = $('#' + idDestino).val();
	var origen = "";
	if( "S" != solohotel){
		var origen = $('#' + idOrigen).val();
		
		if ( origen == null || origen == '' || origen == '-') {
			alert( etiquetas.FALTA_ORIGEN );
			return ;
		}
	}
	if ( destino == null ||destino == '') {
		alert( etiquetas.FALTA_DESTINO );
		return ;
	
	}
	if( destino == origen ) {
		alert( etiquetas.ORI_DEST_IGUALES );
		return;
	}
	if ( $( '#p_fecsal' ) == null || $( '#p_fecsal' ).val() == '') {
		alert( etiquetas.FECHA_INVALIDA );
		return;
	}
	
	defineColorboxCalendario();
	
	$("#calendarioTabla").html('');
	
	var calen = new calendario('areaCalendario', idioma.toLowerCase(), fechaMin, fechaMax, destino, origen, familia, producto, fechaInicial, onClick, tcalendario, solohotel);
	calen.cargaCalendario();//Carga el calendario a partir de la fechaInicial
		
}

function fCargaCalendario() {
	
		var url= appContext + "/slt/home/RecuperaPreciosCalendario";
		var calen=this;
		var datos={
						'fechaSalida':	this.fechaInicial,
						'destino':	this.destino,
						'origen':	this.origen,
						'familia': this.familia,
						'producto': this.producto,
						'solohotel': this.solohotel
				};
		$.ajax({
			type: 'GET',
			url: url,
			data: datos,
			dataType: 'json',
			success: function(xml) {					
					calen.devuelveValores(xml);
					$("#selectdestSel").css({display: 'block'});
					$("#CalendarioFlotante div.cuerpoCargando").css({display: 'none'});
					$("#CalendarioFlotante div.cuerpoSeleccion").css({display: 'block'});
				},
			error: function( objeto, quepaso, otroobj )
				{
					calen.cierraCalendario();
	     		}
		});
	
	}

	function fCerrarCalendarioInicio(){
		$.colorbox.close();
		alert( etiquetas.ERR_CARG_PREC );
	}
	

function formatearValor(valor) {

	if( valor == null )
	{
		return "0";
	}
	valor = valor.toString();
	valor = Math.round(valor.replace(',', '.')).toLocaleString();
	var coma = valor.indexOf(',');

	if (coma < 0) {
		todosSinImporte = false;
		return valor;
	}
	todosSinImporte = false;
	return valor.substring(0, coma);
	
}

function comparaFechas(fecha1, fecha2) {
	var date1 = $gp.stringToDate( fecha1, formatoFecha );
	var date2 = $gp.stringToDate( fecha2, formatoFecha )
	if( date1 > date2 ){
		return 1;
	}
	else if( date1 < date2 ){
		return -1;
	}
	else{
		return 0;
	}
}

function fdiaTieneDescuento(fecha){
	
	if( this.tcalendario != null ){
		var campos = fecha.split("/");
		var dia = Number(campos[0])-1;
		var mes = Number(campos[1]);
		
		var datosOrigen = this.tcalendario[this.origen]; 
		if( datosOrigen!=null ){
			var datosMes = datosOrigen[mes];
			if(datosMes!=null){
				var valorDia = datosMes[dia];
				if( valorDia!=null && ("O" == valorDia || "A" == valorDia)){
					return true;
				}
			}
		}
	}
	return false;
	
}

function fCalenMuestraValores( valores){
	var calen=this;
	try
	{

		var html = '';
		var claseMesSelec;
		var htmlMes;

		var diaActual = 1;
		var ultimoDiaMes = 32 - new Date(this.anyo, this.mes, 32).getDate();

		var diaSemanaPrimerDiaMes = (new Date(this.anyo, this.mes, 1)).getDay();
		diaSemanaPrimerDiaMes = diaSemanaPrimerDiaMes != 0 ? diaSemanaPrimerDiaMes : 7;
		var diaSemanaUltimoDiaMes = (new Date(this.anyo, this.mes, ultimoDiaMes)).getDay();
		diaSemanaUltimoDiaMes = diaSemanaUltimoDiaMes != 0 ? diaSemanaUltimoDiaMes : 7;

		var semanasMes;

		// Calculamos el número de semanas que tiene el mes.
		if (diaSemanaPrimerDiaMes == 1 && this.mes == 1 && ultimoDiaMes != 29) {
			semanasMes = 4;
		} else if (diaSemanaPrimerDiaMes < diaSemanaUltimoDiaMes || this.mes == 1) {
			semanasMes = 5;
		} else {
			semanasMes = 6;
		}

		var	diaSemana = diaSemanaPrimerDiaMes;

		var aValores = new Array( 32 );
		var aNoches = new Array( 32 );
		var aCias = new Array( 32 );

		$.each(valores, function(i, item) {
			var dia = Number(item.dia.substring(0, 2));
			var valorAFormatear = null;
			if( item.importe != null )
			{
				valorAFormatear = parseInt( item.importe ) + parseInt( item.importe_cia ) + parseInt( item.tasa );
			}
			var valorFormateado = formatearValor( valorAFormatear );
			aValores[dia] = valorFormateado;
			aNoches[dia] = item.noches;
			aCias[dia] = item.ciaaerea;

		});
		$( this.capa ).css( "background-color", "#FFFFFF" );
		
	
		//calculamos los meses a mostrar antes y después del actual
		var indpremes1 = (this.mes-1) % 12;
		if(indpremes1<0){
			indpremes1 = indpremes1 + 12; 
		}
		var indpremes2 = (this.mes-2) % 12;
		if(indpremes2<0){
			indpremes2 = indpremes2 + 12; 
		}
		var indpremes3 = (this.mes-3) % 12;
		if(indpremes3<0){
			indpremes3 = indpremes3 + 12; 
		}
		var indpremes4 = (this.mes-4) % 12;
		if(indpremes4<0){
			indpremes4 = indpremes4 + 12; 
		}
		var indpremes5 = (this.mes-5) % 12;
		if(indpremes5<0){
			indpremes5 = indpremes5 + 12; 
		}
		var indpostmes1 = (this.mes+1) % 12;
		if(indpostmes1<0){
			indpostmes1 = indpostmes1 + 12; 
		}
		var indpostmes2 = (this.mes+2) % 12;
		if(indpostmes2<0){
			indpostmes2 = indpostmes2 + 12; 
		}
		var indpostmes3 = (this.mes+3) % 12;
		if(indpostmes3<0){
			indpostmes3 = indpostmes3 + 12; 
		}
		var indpostmes4 = (this.mes+4) % 12;
		if(indpostmes4<0){
			indpostmes4 = indpostmes4 + 12; 
		}
		var indpostmes5 = (this.mes+5) % 12;
		if(indpostmes5<0){
			indpostmes5 = indpostmes5 + 12; 
		}
		
		var premes1 = '<span id="premes1" class="mesPequenoNavegacion">' + this.meses_pre[indpremes1] + '</span>';
		var premes2 = '<span id="premes2" class="mesPequenoNavegacion">' + this.meses_pre[indpremes2] + '</span>';
		var premes3 = '<span id="premes3" class="mesPequenoNavegacion">' + this.meses_pre[indpremes3] + '</span>';
		var premes4 = '<span id="premes4" class="mesPequenoNavegacion">' + this.meses_pre[indpremes4] + '</span>';
		var premes5 = '<span id="premes5" class="mesPequenoNavegacion">' + this.meses_pre[indpremes5] + '</span>';
		var postmes1 = '<span id="postmes1" class="mesPequenoNavegacion">' + this.meses_pre[indpostmes1] + '</span>';
		var postmes2 = '<span id="postmes2" class="mesPequenoNavegacion">' + this.meses_pre[indpostmes2] + '</span>';
		var postmes3 = '<span id="postmes3" class="mesPequenoNavegacion">' + this.meses_pre[indpostmes3] + '</span>';
		var postmes4 = '<span id="postmes4" class="mesPequenoNavegacion">' + this.meses_pre[indpostmes4] + '</span>';
		var postmes5 = '<span id="postmes5" class="mesPequenoNavegacion">' + this.meses_pre[indpostmes5] + '</span>';
		
		html += '<table cellSpacing="0" border-collapse="none" id="mes" class="calendarioValores"><thead>';
		
		html +='<div class="meses"><span id="mesAnterior"><</span><span id="contenedorMesNombre">' + premes5 +premes4 + premes3 + premes2 + premes1 + '<span id="mesNombre">' + this.meses_pre[this.mes] + '/' + new String(this.anyo).substring(2) + '</span>' + postmes1 + postmes2 + postmes3 + postmes4 + postmes5 + '</span><span id="mesSiguiente">></span></div>';
		
		html +='<tr>';
		
		
		for (var i = 0; i < this.dias.length; i++) {
			html += '<th>' + this.dias[i] + '</th>';
		}
		
		
		html += '</tr></thead><tbody>';
	
		for (var i = 1; i <= semanasMes; i++) {
			
			html += '<tr>';

			// Si es la primera semana puede ser que el primer día no comience en lunes	
			if (i == 1) {
				for (var j = 1; j < diaSemana; j++) {
					var claseDia = '';
					if( j == 1){
						claseDia = ' primDiaSem';
					}
					html += '<td class="' + claseDia + '">&nbsp;</td>';
				}
			} else {
				diaSemana = 1;
			}

			var fechaActual;
			var dia;
			var celda;
			var fechaComparable = this.fechaMin;
			var resultadoCompara;

			for (var j = diaSemana; j <= this.dias.length; j++) {

				dia = '0' + diaActual;
				fechaActual = dia.substring(dia.length, dia.length - 2) + this.fechaInicial.substring(2);

				resultadoCompara = comparaFechas(fechaActual, fechaComparable);
				//alert("Compara: "+ resultadoCompara + ", 1: " + fechaActual + ", y 2: " + fechaComparable);
				if (resultadoCompara == 1 || resultadoCompara == 0) {
					
					var estiloDescuento = '';
					if( this.diaTieneDescuento( fechaActual )){
						estiloDescuento = 'diaConDescuento'
					}
					
					//JGR
					if ( aValores[diaActual] != undefined && aValores[diaActual] != '0' && aValores[diaActual] != 0 ) {
					//
					
					//celda = '<a class=\"tip\" href="javascript:' + "mostrarAcomodacion" + '(\'' + fechaActual + '\', \'' + aNoches[diaActual] + '\');' +
					
					celda = '<a class=\"tip ' + estiloDescuento +  '\" href="javascript:'+ this.seleccionaFecha + '(\'' + fechaActual + '\',\'' +  aValores[diaActual] + '\', \'' + aNoches[diaActual] + '\' );' +
							/*this.ocultaCapa + '(\'' + this.capa + '\');*/'"><div class="numdia">' + diaActual + '</div>';
					//alert("Valores para :" + diaActual + " -> " + aValores[diaActual]);
					//JGR if ( aValores[diaActual] != undefined && aValores[diaActual] != '0' && aValores[diaActual] != 0 ) {
						if( aCias[diaActual]== null || aCias[diaActual]== "" ){
							celda += '<span>Sujeto a disponibilidad aérea</span>';//<-- Está comentado el estilo css que se encargava de visualizarlo dentro de 14_buscador-ofertas-seleccion.css, 'a.tip:hover' y 'a.tip:hover span'
							celda += '<div class="valor">' + 
									 '<div class="precio">'+	aValores[diaActual] + '<div class="euro">&euro;</div></div></div>';
						}else{
							celda += '<span>Precio final con ' + aCias[diaActual] + '</span>';//<-- Está comentado el estilo css que se encargava de visualizarlo dentro de 14_buscador-ofertas-seleccion.css, 'a.tip:hover' y 'a.tip:hover span'
							celda += '<div class="valorCia">' + 
									 '<div class="precio">'+ aValores[diaActual] + '<div class="euro">&euro;</div></div></div>';
						}
					//JGR }

					celda += '</a>';
					//JGR
					} else {
						celda = '<div class="numdia">' + diaActual + '</div>';
					}
					//
				} else {
					celda = '<div class="numdia">' + diaActual + '</div>';
				}
				
				var claseDia = '';
				if( j == 1){
					claseDia = ' primDiaSem';
				}
				
				html += '<td class="cal' + claseDia + '">' + celda + '</td>';
				diaActual++;
				if (diaActual > ultimoDiaMes) {
					break;
				}
			}

			if (j <= this.dias.length) {
				for (var k = j + 1; k <= this.dias.length; k++) {
					html += '<td>&nbsp;</td>';
				}
			}

			html += '</tr>';
		}
		html += '<tr>';
		html += '<td class="primDiaSem vacio">&nbsp;</td>';
		for (var k=2; k <= this.dias.length; k++) {
			html += '<td class="vacio">&nbsp;</td>';
		}
		html += '</tr>';
		html += '</tbody></table>';// +
		//'<span style="font-size: 10px"></span></div>';
	
		incluirNochesLeyenda(valores);
		
		$("#calendarioTabla").html(html);
		//$('#mesSiguiente').click( this.mesSiguiente );
		if( calen.puedeAvanzar(1) ){
			$('#mesSiguiente').click( function(){ mesSiguiente(calen, 1);} );
			$('#mesSiguiente').removeClass('noVisible');
			
			$('#postmes1').click( function(){ mesSiguiente(calen, 1);} );
			$('#postmes1').removeClass('noVisible');
		}
		else{
			$('#mesSiguiente').addClass('noVisible');
			
			$('#postmes1').addClass('noVisible');
		}
		if( calen.puedeAvanzar(2) ){
			$('#postmes2').click( function(){ mesSiguiente(calen, 2);} );
			$('#postmes2').removeClass('noVisible');
		}
		else{
			$('#postmes2').addClass('noVisible');
		}
		if( calen.puedeAvanzar(3) ){
			$('#postmes3').click( function(){ mesSiguiente(calen, 3);} );
			$('#postmes3').removeClass('noVisible');
		}
		else{
			$('#postmes3').addClass('noVisible');
		}
		if( calen.puedeAvanzar(4) ){
			$('#postmes4').click( function(){ mesSiguiente(calen, 4);} );
			$('#postmes4').removeClass('noVisible');
		}
		else{
			$('#postmes4').addClass('noVisible');
		}
		if( calen.puedeAvanzar(5) ){
			$('#postmes5').click( function(){ mesSiguiente(calen, 5);} );
			$('#postmes5').removeClass('noVisible');
		}
		else{
			$('#postmes5').addClass('noVisible');
		}
		
		if( calen.puedeRetroceder(1) ){
			$('#mesAnterior').click( function(){ mesAnterior(calen, 1);} );
			$('#mesAnterior').removeClass('noVisible');
			
			$('#premes1').click( function(){ mesAnterior(calen, 1);} );
			$('#premes1').removeClass('noVisible');
		}
		else{
			$('#mesAnterior').addClass('noVisible');
			
			$('#premes1').addClass('noVisible');
		}
		if( calen.puedeRetroceder(2) ){
			$('#premes2').click( function(){ mesAnterior(calen, 2);} );
			$('#premes2').removeClass('noVisible');
		}
		else{
			$('#premes2').addClass('noVisible');
		}
		if( calen.puedeRetroceder(3) ){
			$('#premes3').click( function(){ mesAnterior(calen, 3);} );
			$('#premes3').removeClass('noVisible');
		}
		else{
			$('#premes3').addClass('noVisible');
		}
		if( calen.puedeRetroceder(4) ){
			$('#premes4').click( function(){ mesAnterior(calen, 4);} );
			$('#premes4').removeClass('noVisible');
		}
		else{
			$('#premes4').addClass('noVisible');
		}
		if( calen.puedeRetroceder(5) ){
			$('#premes5').click( function(){ mesAnterior(calen, 5);} );
			$('#premes5').removeClass('noVisible');
		}
		else{
			$('#premes5').addClass('noVisible');
		}
		
	}
	catch( e )
	{
		calen.cierraCalendario();
	}
	
}
	function fPuedeRetroceder( numMeses){
		var dateAux = $gp.stringToDate( this.fechaInicial, formatoFecha );
		var dateMin = $gp.stringToDate( this.fechaMin, formatoFecha );
		dateAux.setDate( 1 );
		dateAux.setMonth( dateAux.getMonth() - numMeses );
		dateMin.setDate( 1 );
		if( dateAux <  dateMin){
			return false;
		}
		else{
			return true;
		}
	}
	
	function fPuedeAvanzar( numMeses ){
		if( this.fechaMax==null || this.fechaMax.length == 0 ){
			return true;
		}
		var dateAux = $gp.stringToDate( this.fechaInicial, formatoFecha );
		var dateMax = $gp.stringToDate( this.fechaMax, formatoFecha );
		dateAux.setDate( 1 );
		dateAux.setMonth( dateAux.getMonth() + numMeses );
		dateMax.setDate( 1 );
		if( dateAux >  dateMax){
			return false;
		}
		else{
			return true;
		}
	}

	function incluirNochesLeyenda(valores){
		if( valores.length > 0 ){
			$('#leyendaCalendario').show();
			var primerDia = valores[0];
			var noches = primerDia.noches;
			$('#leyendaNoches').html( noches );
		}
		else{
			 eliminarLeyenda();
		}
	}
	
	function eliminarLeyenda(){
		$('#leyendaCalendario').hide();
	}
	
})();
