// FUNCIONES PASADAS A reservas.js (para sincronizar el calendario dinámico y el datepicker)
// actualizarCalendarioDisp, seleccionarFecha, revisarFechaES, actualizarResumenReserva, numeroNoches, revisarFechaES


// function para acondicionar las clases de .calendariosDinamicos
function clasesCalendario(contexto) {
	var $td = $('td', contexto);
	$td.filter(':nth-child(odd)').addClass('impar').next().addClass('par');
	$td.filter(':empty').removeClass('impar par');
}
$(function() {
	clasesCalendario('div.calendariosDinamicos');
});

function submitBuscadorReservas() {
	var $buscador = $('#buscadorReservas');
	if ($buscador.length == 0) {
		$buscador = $('#buscadorDisponibilidad');
	}
    $buscador.submit();
}
$('#comprobarDisponibilidad').live('click', function(){
	if (this.type != 'submit') {
		submitBuscadorReservas();
	}
});
$('button.comprobarDisponibilidadAjax').live('click', function(){
	var $t = $(this);
	if ($t.is('.noDisponible')) return false;
	// si no rompemos el comportamiento:
	var $context = $t.closest('div[id*=calendario-hotel]').find('div.calendariosDinamicos');
    $('#destinoTipo').val('HOT');
    $('#destinoCodigo').val($('[name=idHotel]', $context).val());
    $('#searchDestinoHotel,#oldDestino').val($('[name=nombreHotelCalendario]', $context).val());
    $('#destinoUrl').val($('[name=urlHotelCalendario]', $context).val());
	submitBuscadorReservas();
});

$('div.calendariosDinamicos td:parent').live('click', function(){
	var $this   = $(this),
		$div    = $this.closest('.calendariosDinamicos'),
		$celdas = $div.find('td:parent'),
		$selecc = $celdas.filter('.seleccionado'),
		limites = [ $celdas.index($selecc.get(0)), $celdas.index($selecc.get(1)) ];
	/* paramos si se cumple una de las siguientes condiciones:
	 * la celda esta vacia
	 * la celda contiene la clase "noDisponible" o "sinCupo" no seleccionados
	 */

	if ($.trim($this.html()) == '' || $this.hasClass('noDisponible') || ($this.hasClass('sinCupo') && !$this.hasClass('seleccionado') )) return false

	// control de clase "seleccionado"
	if ($this.hasClass('seleccionado')) {
		// si tenia la clase se la quitamos
		$this.removeClass('seleccionado');
	} else {
		if ($this.hasClass('enSeleccion')) {
			// si esta en el interior de la seleccion se la quitamos al de alante...
			if ( (limites[1]-limites[0])/2 >= limites[1] - $celdas.index(this) ) {
				$selecc.eq(1).removeClass('seleccionado');
			} else {
				$selecc.eq(0).removeClass('seleccionado');
			}
		} else {
			if ($selecc.length >= 2) {
				if ($this.hasClass('sinCupo')) { // no permitimos seleccionar si no tiene cupo, solo deseleccionar
					return false;
				}
// Si no es interior, mirar si es anterior o posterior al intervalo actual para quitar seleccion del inicio o del final segun corresponda
				var diaIni = $selecc.eq(0).attr('title').toDate('', 0, 0).getTime();
				var diaFin = $selecc.eq(1).attr('title').toDate('', 0, 0).getTime();
				var diaSel = $this.attr('title').toDate('', 0, 0).getTime();
				if (diaSel > diaFin) {
					$selecc.eq(1).removeClass('seleccionado');
				} else if (diaSel < diaIni) {
					$selecc.eq(0).removeClass('seleccionado');
				}
			}
		}
		// ... y se la ponemos a este.
		$this.addClass('seleccionado');
	}
	// redefinimos $selecc a traves de los limites de la seleccion
	$selecc = $celdas.filter('.seleccionado');
    var $inicioSelecc = null;
    var $finalSelecc = null;
    if ($selecc.length >= 1) {
        $inicioSelecc = $selecc[0];
    }
    if ($selecc.length >= 2) {
        $finalSelecc = $selecc[1];
    }
	limites[0] = $celdas.index($selecc.get(0));
	limites[1] = $celdas.index($selecc.get(1));
	$selecc = $celdas.filter( [':lt(', limites[1], '):gt(', limites[0], ')'].join('') )


	$celdas.removeClass('enSeleccion jsError');
	$selecc.filter('[title]').addClass('enSeleccion')
	.filter('.sinCupo').addClass('jsError');
    var $fecEntrada = $('#fechaEntrada');
    var $fecSalida = $('#fechaSalida');
	var $botones = ($('button.comprobarDisponibilidadAjax').length > 0) ? $('button.comprobarDisponibilidadAjax') : $('#comprobarDisponibilidad');
	// comprobamos si el boton de enviar tiene que estar deshabilitado
	if ($inicioSelecc == null || $finalSelecc == null || $selecc.hasClass('jsError')) {
        $botones.addClass('noDisponible');
        if ($inicioSelecc == null || $selecc.hasClass('jsError')) {
            $fecEntrada.val('');
        } else {
            $fecEntrada.val(revisarFechaES($inicioSelecc.title));
        }
        if ($finalSelecc == null || $selecc.hasClass('jsError')) {
            $fecSalida.val('');
        } else {
            $fecSalida.val(revisarFechaES($finalSelecc.title));
        }
	} else {
        $botones.removeClass('noDisponible');
        $fecEntrada.val(revisarFechaES($inicioSelecc.title));
        $fecSalida.val(revisarFechaES($finalSelecc.title));
	}
    actualizarResumenReserva();
	comprobarFechasHotelCerrado();

});

$('button.borrarSeleccion').live('click', function() {
		var $this   = $(this),
		$div    = $this.closest('div.fBox').find('div.calendariosDinamicos'),
		$selecc = $div.find('td.seleccionado');
	$selecc.click();
});

// funcion para mover/cargar nuevos meses
var FlagCalendarios = false;
$('div.calendariosDinamicos caption img').live('click', function() {
	var $this       = $(this),
		divCalendarios        = $this.closest('.calendariosDinamicos'),
		nuevoMes    = this.alt,
		posicion    = $this.closest('table').attr('className');

	if (FlagCalendarios) return false;
	FlagCalendarios = true;

	if ($this.css('cursor') == 'default') return false;
    cargarCalendarios(nuevoMes, divCalendarios, posicion, $this.parent().attr('title'));

});

function cargarCalendarios(nuevoMes, divCalendarios, posicion, tituloCaption) {
    var idHotel = divCalendarios.find('input[name=idHotel]').val();
    var meses       = {};
	var factNuevoMes = eval(nuevoMes.replace('/', '+12*'));
	var factHoy = new Date().getMonth() +1 + (12 * new Date().getFullYear());
	var factLim = eval(divCalendarios.find('input[name=calLimite]').val().substring(0,7).replace('-','*12+'));
	var aHtml;
	if (!$('caption[title='+nuevoMes+']', divCalendarios).length && (factNuevoMes<factHoy || factNuevoMes>factLim)) {
		divCalendarios.find('table.'+posicion)[posicion=='primerMes'?'before':'after'](['<table class="', posicion=='primerMes'?'pasado':'futuro','"><caption title="', nuevoMes, '">', $.datepicker.regional[lang].monthNames[parseInt(nuevoMes.substring(0,2), 10) - 1], ' ', nuevoMes.substring(3,7), '</caption><tbody><tr><td><img src="', moduleRoot, 'img/mesNoDisponible.gif" alt="" /></td></tbody></table>'].join(''));
	}
	if ( $('caption[title='+nuevoMes+']', divCalendarios).length ) {
		if ('primerMes' == posicion) {
			meses.primer = nuevoMes;
			meses.segundo= tituloCaption;
		} else {
			meses.primer = tituloCaption;
			meses.segundo= nuevoMes;
		}
		animarCalendarios(divCalendarios, meses);
	} else {
		ajaxCalendarios(nuevoMes, idHotel, divCalendarios, posicion);
	}
}
function ajaxCalendarios(nuevoMes, idHotel, divCalendarios, posicion) {
	// posicion debe tener como valor 'primerMes' o 'segundoMes'
	contenedorAjaxLoader = divCalendarios;
	$.ajax({
		url:moduleRoot+'ajax/mesCalendario.json.php',
		type:'get',
		data: {
			mes: nuevoMes,
			id: idHotel
		},
		dataType: 'json',
		error: function() {
			alert('An error has ocurred, please try again. If the error persists please contact the site admin. ');
            FlagCalendarios = false;
		},
		success: function(datos) {
			var textos    = $.datepicker.regional[lang],
				auxiliar  = null,
				aHtml     = [],
				mes       = nuevoMes.substring(0, 2),
				ano       = nuevoMes.substring(3),
				hoy       = new Date().setHours(0,0,0,0);
			var diaIterar = ('01/'+nuevoMes).toDate();
			var dia15 = '15/'+mes+'/'+ano;
			if (lang == 'en') {
				dia15 = mes + '/15/'+ano;
				diaIterar = (mes + '/01/' + ano).toDate();
			}
			var mesAnterior = dia15.toDate('',0,-1).ddmmyyyy().substring(3);
			var mesSiguiente = dia15.toDate('',0,1).ddmmyyyy().substring(3);

			/* parse del JSON para convertirlo en una tabla con la siguiente estructura
			 * (como ejemplo pondre febrero de 2030)
			 * <table class="primerMes/segundoMes">
			 *  <caption title="02/2030">
			 *   <img src="img/icoAnterior.gif" alt="01/2030" class="anterior" />
			 *   <img src="img/icoAnterior.gif" alt="03/2030" class="siguiente" />
			 *  </caption>
			 *  <thead>
			 *   <tr>
			 *    <th scope="col" title="Siete dias de la semana">7 d</th>...
			 *   </tr>
			 *  </thead>
			 *  <tbody>
			 *   6x(
			 *   <tr>
			 *    <td title="01/2030"></td>...
			 *   <tr>
			 *   )
			 *  </tbody>
			 * </table>
			 */
			if ($(divCalendarios).find('table').length < 2) {
				auxiliar = posicion;
			} else if ('primerMes' == posicion) {
				auxiliar = 'pasado';
			} else if('segundoMes' == posicion) {
				auxiliar = 'futuro';
			} else {
				return false;
			}
			// ponemos el dia para iterar en el primer lunes que encontremos yendo hacia atras desde el dia 1
			diaIterar.setDate(2-(diaIterar.getDay()||7));

			// creamos la primera parte, etiquetas, HTML CAPTION THEAD y el primer TR
			aHtml = ['<table class="', auxiliar,'"><caption title="', nuevoMes, '"><img src="', moduleRoot, 'img/icoAnterior.gif" alt="', mesAnterior, '" class="anterior" />', textos.monthNames[parseInt(mes, 10) - 1], ' ', ano, '<img src="', moduleRoot, 'img/icoSiguiente.gif" alt="', mesSiguiente, '" class="siguiente" /></caption><thead><tr>'];
			// insertamos el contenido del THEAD
			for (var i=0; i<7; ++i) {
				auxiliar = 6 == i ? 0:i+1;
				aHtml.push('<th scope="col" title="', textos.dayNames[auxiliar], '">', textos.dayNamesShort[auxiliar], '</th>');
			}
			aHtml.push('</tr></thead><tbody>');
			// creamos las seis filas del TBODY
			for (var i=0; i<6; ++i) {
				aHtml.push('<tr>');
				for (var j=0; j<7; ++j) {
					if (parseInt(mes, 10)-1 != diaIterar.getMonth()) {
						aHtml.push('<td></td>');
					} else {
// Utilizamos X y C para distinguir sinCupo y cerrado (cerrado es necesario para saber si la selección de fechas incluye días cerrados)
						auxiliar = (hoy>diaIterar) ? 'noDisponible' :
							('X' == datos[diaIterar.getDate()] ? 'sinCupo' :
							('C' == datos[diaIterar.getDate()] ? 'sinCupo cerrado' : '')) ;
                        var titulo = diaIterar.ddmmyyyy();
						if ('C' == datos[diaIterar.getDate()]) {
							datos[diaIterar.getDate()] = 'X';
						}
						aHtml.push('<td class="', auxiliar, '" title="', titulo , '">', diaIterar.getDate(), '<strong>', datos[diaIterar.getDate()],'</strong></td>');
					}
					diaIterar.setDate(diaIterar.getDate()+1);
				}
				aHtml.push('</tr>');
			}
			aHtml.push('</tbody></table>');

			// insertamos la tabla en su lugar y asignamos a la variable auxiliar los meses que se deben mostrar
			if ('primerMes' == posicion) {
				clasesCalendario( $(aHtml.join('')).insertBefore(divCalendarios.find('table.primerMes')) );
				auxiliar = {
					primer : nuevoMes,
					segundo: mesSiguiente
				}
			} else {
				clasesCalendario(  $(aHtml.join('')).insertAfter(divCalendarios.find('table.segundoMes')) );
				auxiliar = {
					primer : mesAnterior,
					segundo: nuevoMes
				}
			}

			if ($('table', divCalendarios).length >= 2) {
				animarCalendarios(divCalendarios, auxiliar);
			}
		}
	});
}

function animarCalendarios(contexto, meses) {
	var $primer  = $('caption[title='+ meses.primer +']', contexto).closest('table'),
		$segundo = $('caption[title='+ meses.segundo +']', contexto).closest('table'),
		$pasado  = $primer.prev('.primerMes'),
		$futuro  = $segundo.next('.segundoMes'),
		marginStep = parseInt($('table.segundoMes').css('marginLeft'), 10);
		vel = 600,
		eas = 'easeInOutCirc';
	// tema tablas
    $pasado.animate({marginLeft:(-marginStep)  +'px'}, vel, eas, function() {this.className = 'pasado'});
    $futuro.animate({marginLeft:(marginStep*2) +'px'}, vel, eas, function() {this.className = 'futuro'});
	$primer.animate({marginLeft:'0px'}, vel, eas, function() {this.className = 'primerMes'});
	$segundo.animate({marginLeft:marginStep    +'px'}, vel, eas, function() {this.className = 'segundoMes'});

	// tema flechicas
	$primer.find('img.siguiente').fadeTo(vel/3, 0);
	$primer.find('img.anterior').fadeTo(vel/3, 1);
	$segundo.find('img.anterior').fadeTo(vel/3, 0);
	$segundo.find('img.siguiente').fadeTo(vel/3, 1);
	setTimeout('finalAnimacionCalendarios()', vel);
}
function finalAnimacionCalendarios() {
    FlagCalendarios=false;
    var entrada = $('#fechaEntrada').val();
    if (entrada != '') {
        seleccionarFecha(entrada);
    }
    var salida = $('#fechaSalida').val();
    if (salida != '') {
        seleccionarFecha(salida);
    }
}
/* -----------------------------------------------------------------------------------------------------------
                                   FIN DEL TEMA CALENDARISMO DINAMICO
----------------------------------------------------------------------------------------------------------- */


