// cambiar la clase al body en funcion de la clase de #contenido-principal
$(function() {
	$('body').addClass( $.trim($('#contenido-principal').attr('className').replace('fichaHotel', '')) );
});

// funciones de AJAX de listado de hoteles
$(function() {
	$('.pestanasSecciones a').click(function(event) {
		var $t = $(this),
			anchor  = $t.attr('href').getAnchor(),
			idHotel = anchor.replace(/\D/g,''),
			type    = anchor.substring(1, anchor.indexOf('-')),
			$elem   = $(anchor);
		
		if ($elem.children().length <= 1) {
			$t.closest('ul').closest('li').addClass('loading');
			$.ajax({
				url: approot+'ajax/hotelLista' + type.charAt(0).toUpperCase() + type.slice(1) + '.php',
				data:'lang=' + lang + '&id=' + idHotel,
				type:'get',
				dataType:'html',
				complete:function(r) {
					$elem.append(r.responseText);
					prepararEventos($elem);
					$t.click().closest('ul').closest('li').removeClass('loading');
				},
				global: false
			});
			// si hacemos la llamada en AJAX paramos la propagacion del bubbling
			return false;	
		}
	});
});

// funciones especificas de GMaps
$('p.iconoMapa a').live('click', function() {
	// el objeto de mapa debe ser de ambito "document" y llamarse "mapa"
	var hotel=mapa.markers[this.href.getAnchor().substring(1)],
		$divMapa = $(mapa.elem);
    if (!hotel || hotel == undefined) {
        return false;
    }
	var info =hotel.markerInfo;
	if ($divMapa.hasClass('panel') && !$divMapa.hasClass('shown')) {
		$('.showPanel').eq($('.panel').index($divMapa)).click();
	}
	$('#contenido-principal').smoothAnchor( function() {
		mapa.GMap.closeInfoWindow();
		mapa.GMap.setCenter(new GLatLng(hotel.markerInfo.lat, hotel.markerInfo.lng), 13);
		hotel.openInfoWindow( buildInfoWindow(hotel.markerInfo) );
	});
	
	return false;
});

// autocompletado de buscador y funciones asociadas a #buscadorHotel
$(function() {
	var $formReservas = $('#buscadorReservas'),
		$input = $formReservas.find('input.principal'),
		$formDisponibilidad = $('#buscadorDisponibilidad');
	$input.autocomplete(approot+'ajax/hotelSuggestions.php?lang='+lang, {
        minChars: 3,
        max: 20,
        width: 180,
        scroll: false,
        formatItem: function(data) {
            return '<small class="floatRight">('+data[1]+')</small>'+data[0];
        }
    }).result(function(event, data, formatted) {
        $('#oldDestino').val(data[0]);
        $('#destinoTipo').val(data[2]);
        $('#destinoCodigo').val(data[3]);
        $('#destinoUrl').val(data[4]);
    });

	$formDisponibilidad.submit(function() {
		var actionRoot = approot;
        if ($formDisponibilidad.attr('rel') == 'external') {
            actionRoot = 'https://www.husa.es' + approot;
        }
		if ($('#fechaEntrada').val() && $('#fechaSalida').val()) {
			$formDisponibilidad.attr('action', actionRoot+lang + '/nuestros-hoteles/reservar-1');
        } else {
            if ($formDisponibilidad.attr('rel') == 'external') {
                $formDisponibilidad.removeAttr('rel');
                $formDisponibilidad.removeAttr('target');
    			$formDisponibilidad.attr('action', approot+lang);
            } else {
    			$formDisponibilidad.attr('action', approot+lang + '/nuestros-hoteles/hotel/v/u/'+$('#destinoUrl').val());
            }
        }
	})
});

// 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');
}



// validacion generica de formularios
function validarObl(campos) {
	var err = [];
	$(':input', campos).each(function() {
		var $t=$(this),
			className = $t.attr('className');
		if (!className) return;
		
		if ($t.hasClass('obl') && !$t.val()) {
			if ($t.is(':visible')) $t.effect('highlight', {color:'#793635'}, 2000);
			err.push('<li>',txtCampo, '<strong>', $t.closest('label').find('span:fisrt').text().replace('*', ''), '</strong>', txtEsObligatorio, '</li>');
		} else if ($t.hasClass('email') && $t.val() && !$t.val().testEmail()) {
			$t.effect('highlight', {color:'#793635'}, 2000);
			err.push('<li>',txtCampo, '<strong>', $t.closest('label').find('span:fisrt').text().replace('*', ''), '</strong>', txtNoEsEmail, '</li>');
		} else if (false){
			
		}
	});
	return err.length ? '<ul>'+err.join('')+'</ul>' : true;
}
// formulario de grupos
$(function() {
	var contexto = $('#contactoGrupos'); 
	if (!contexto.length) return false;

// ---------------------------------------------------------------------- DATOS DEL HOTEL:
	var $sel  = $('fieldset:eq(1) select', contexto),
		$pais = $sel.eq(0),
		$prov = $sel.eq(1),
		$ciud = $sel.eq(2),
		$cat  = $sel.eq(3),
		$hot  = $sel.eq(4);
	// creamos la cache
	$('option[class]', $sel).each(function() {
		eval('var claseOptions = '+this.className);
		for (i in claseOptions) {
			$(this).data(i, claseOptions[i]);
		}
	});
	// si cambia el pais comprobamos si hemos de cambiar la provincia
	$pais.change(function() {
//        if ($pais.val().toLowerCase().indexOf('spa')>=0) { // espanya
        if ($pais.val() == '202') { // espanya
            $prov.attr('disabled', false);
            setTimeout(function() {
                $prov.change();
            }, 50);
        } else {
            $prov.attr('disabled', 'disabled');
            setTimeout(function() {
                $prov.children(':first').attr('selected', 'selected').change();
            }, 50);
        }
	});
	// si cambia la provincia limitamos el numero de ciudades que aparecen
	$prov.change(function() {
// España es id = 202
//		var region = (!$pais.val() || $pais.val().toLowerCase().indexOf('spa')>=0) ? $prov.val() : $pais.val();
		var region = (!$pais.val() || $pais.val() == '202') ? $prov.val() : $pais.val();
		$ciud.find('option').each(function() {
			var $t = $(this);
			if (!region || $t.data('reg') == region) {
				$t.show();
			} else {
				$t.hide();
			}
		});
        setTimeout(function() {
            $ciud.children(':first').attr('selected', 'selected').change();
        }, 50);
	});
	// Si cambia la ciudad limitamos el numero de hoteles que aparecen
	// Hago notar que este evento se llama varias veces aunque el campo
	// hotel no cambie realmente, por lo que hemos de comprobar que
	// poblaciones estan realmente disponibles (visibles)
	$ciud.change(function() {
        var hotel = [];
		var ciudad = [this.value];
		if (!ciudad[0]) {
			ciudad = $ciud.find('option').map(function() {
				if (this.style.display != 'none') {
					return this.value;
				}
			});
		}
		// usaremos el Array "ciudad" para comprobar los hoteles que realmente pertenecen a el
		$hot.find('option').each( function() {
			var $t=$(this);
			if (!$t.val() || ($.inArray($t.data('pob'), ciudad) >= 0 && ($t.data('reg') == $pais.val() || $pais.val() == '202' || $pais.val() == '') ) ){
				$t.show();
				if ($t.val() && $.inArray($t.data('cat'), hotel) == -1) {
					hotel.push($t.data('cat'));
				}
			} else {
				$t.hide();
			}
		});
		// una vez mostrados/ocultados los hoteles tenemos un listado de las categorias disponibles
		$cat.find('option').each( function() {
			var $t=$(this);
			if (!$t.val() || $.inArray($t.val(), hotel) >= 0) {
				$t.show();
			} else {
				$t.hide();
			}
		});
        setTimeout(function() {
            $cat.children(':first').attr('selected', 'selected').change();
        }, 50);
	});
	// si cambia la categoria eliminamos los hoteles que no tocan 
	$cat.change(function() {
		 var currentCat = $(this).val();
         var currentPob = $ciud.val();
         var currentProv = $prov.val();
         var currentPais = $pais.val();
        var hotel = [];
		 $hot.children().each(function() {
		 	var $t = $(this);
			if ( (!currentCat || $t.data('cat')==currentCat) && 
                (!currentPob || $t.data('pob') == currentPob)  &&
                (!currentPais || $t.data('reg') == currentPais)  &&
                (!currentProv || $t.data('prov') == currentProv)){
				$t.show();
			} else {
				$t.hide();
			}
		 });
        setTimeout(function() {
            $hot.children(':first').attr('selected', 'selected').change();
        }, 50);
	});
	
// ---------------------------------------------------------------------- DATOS GRUPO:	
	// Dias del evento y habitaciones relacionadas
	var refrescarDiasEvento = function() {
		// comprobamos si mostramos el campo de habitaciones 
		var $input = $('#diasGrupo input'),
			ent   = $input.eq(0).val(),
			sal   = $input.eq(1).val(),
			$d    = $('#habGrupo');
		if (ent.testDate() && sal.testDate() && ent.toDate() < sal.toDate()) {
			$d.show(600);
		} else {
			$d.hide(600);
		}
		// enchufamos el texto
		$input.each( function() {
			var texto = this.value.testDate() ? this.value.toDate().fechaLocal() : ' ';
			texto = [texto.charAt(0).toUpperCase(), texto.substring(1)].join(''); 
			$(this).nextAll(':last').html(texto);	
		});
		// fechas de los salones
		var options = [];
		ent=ent.toDate();
		sal=sal.toDate();
		while (ent<=sal) {
			options.push('<label><input name="fechas_salon_#NUM#[]" type="checkbox" value="', ent.ddmmyyyy(), '" />', ent.fechaLocal(), '</label>');
			ent.setDate(ent.getDate()+1);
		}
		options=options.length ? options : ['<p><em>', txtSinFechas, '</em></p>'];
		$('#salonGrupo div.selFechas').html(options.join(''))
	}
	refrescarDiasEvento(); // llamamos la primera vez al preparar el DOM y preparamos el evento:
	$('#diasGrupo input.datepicker').datepicker('option', 'onClose', refrescarDiasEvento).css({width:0,padding:0,border:0,background:'none'});

	// Numero de salones
	var $salon = $('#salonGrupo'),
		$num   = $salon.find('select:first');
	$num.change(function() {
		var $modelo = $salon.find('div.gC-salon:fisrt'),
			$copias = $modelo.nextAll(),
			num     = parseInt($num.val()) || 0,
			fechas = $('#diasGrupo input'),
		// redefinimos fechas a un Array con los objetos Date
		fechas = [fechas.eq(0).val().toDate(), fechas.eq(1).val().toDate()];
		if ($copias.length>num) {
			$copias.eq(num).nextAll().andSelf().remove();
		} else if ($copias.length<num) {
			for (var i = $copias.length;i<num;++i) {
				$('<div class="gC-salon">' + $modelo.html().replace(/#NUM#/g, i+1)+'</div>').appendTo($salon).show(600)
			}
		}
	});
	
	// Restaurantes y tal
	var $rest = $('#restGrupo');
	$rest.find('input[type=radio]').change(function() {
		$rest.children('div').hide(600);
		$(this).closest('label').next('div').show(600);
	});

	// preparamos el objeto DForm
	var dForm = new DForm('contactoGrupos', {aniSpeed:1000});
	dForm.makeTabs();
	for (var i=0,l=dForm.field.length; i<l; ++i){
		dForm.addValidation(i, validarObl);
	}

});

/* Validacion de formulario normales y corrientes, concretamente
 * Registro de colectivos
 * Suscripcion a newsletter
 * Ver reserva
 * Ayudenos a mejorar
 */
var dForms = {};

$(function() {
	var $form = $('#registroColectivos, #verReserva, #formAyudenosAMejorar, #loginForm');
	if (!$form.length) {
		return false;
	}
	$form.each(function(index){
		var form = $form.get(index),
			booleanAJAX = true;
		if (form.id == 'verReserva' || form.id == 'loginForm') {
			booleanAJAX = false;
		}
		dForms[this.id] = new DForm(form, {useAJAX:booleanAJAX});
        for (var i=0,l=dForms[this.id].field.length; i<l; ++i){
            dForms[this.id].addValidation(i, validarObl);
        }
	});

});


//---------------------------------------------------------------------- FORMULARIO DE RESERVA:
/* RAMON ESTA USANDO:
 * todos los <input type="checkbox" ... /> y <select>
 * <input type="hidden" /> sin nombre que estan antes de los <select> 
 * <input name="adults" ... />
 * <input name="children" ... />
 * <input name="rooms[x][id]" ... />
 * <input name="rooms[x][cupo]" ... />
 * <input name="rooms[x][people o personasBase me da lo mismo]" ... />
 * <input name="rooms[x][supplements][x_xxx][incompatibles]" ... />
 * <input name="rooms[x][supplements][x_xxx][cupo]" ... />
 * <input name="rooms[x][supplements][x_xxx][aumentaUsoHabitacion]" ... />
 */
$(function() {
	var context  = '#formReserva-disponibilidad',
		filasCupo = $('tr.cupoHab', context),
		selectHab = $('tr.habitacion select'),
		hiddenSuplInputs  = $('input[name*=\[supplements\]]', context), 
		suplIncompatibles = hiddenSuplInputs.filter('[name*=\[incompatibles\]][value!=]').prevAll('select'),
		suplAumentaCupo   = hiddenSuplInputs.filter('[name*=\[aumentaUsoHabitacion\]][value=true]').prevAll('select'),
		suplConCupo       = hiddenSuplInputs.filter('[name*=\[cupo\]][value!=]').prevAll('select'),
	
	// variables relacionadas con CSS:
		cssCupoSel = 'cupoSeleccionado',
		cssHabSel  = 'habitacionSeleccionada',
		colorHabOff= '#F6F0D6',
		colorHabOn = '#FFFFFF',

	// enteros para validacion
		inputAdults = parseInt($('input[name=adults]', context).val(), 10),
		inputChildren= parseInt($('input[name=children]', context).val(), 10)
	
	// function interna para hallar selects de una misma habitacion (devuelve un objeto de jQuery)
		hallarSuplementosDeHabitacion = function(elSelect) {
			var $t = $(elSelect),
				ordenHab = $t.closest('label').parent().children().index($t.closest('label'));
			return $t.closest('ul').find('label:nth-child('+ (ordenHab+1) +')').children('select');	
		},
		
	
	// funcion interna para hallar los select que tienen 
		hallarIncompatibles = function(select) {
			var $sel = $(select),
				numHijo = parseInt($sel.prevAll('span').text().replace(/\D/g, ''))-1,
				inputIncompatibles = $sel.nextAll('[name*=\[incompatibles\]]'),
				idIncompatibles = null,
				$hermanitos = null;
			// comprobamos que sea del tipo que mola, de los que tienen incompatibles
			if (!inputIncompatibles.length) return false;
			// si tiramos palante reasignamos las variables 	
			idIncompatibles = inputIncompatibles.val().split(',');
			$hermanitos = $sel.closest('li').siblings().find('label:eq('+ numHijo +')').find('select').filter(function() {
				var id = $(this).attr('name');
				id = parseInt(id.substring(id.indexOf('_')+1));
				return ($.inArray(id+'', idIncompatibles) != -1);
			});
			return $hermanitos;
		},
		
		// como contexto se ha de pasar una coleccion de SELECTS correspondientes a una habitacion
		comprobarSuplCompl = function(contexto){
			var $supl = contexto;			
			$supl.filter('[class*=suplementosComplementarios_]').each(function() {
				var $t = $(this),
					$opt = $t.children(),
					$hermanitos= $('select.suplementosComplementarios_'+this.idBDD, $t.closest('ul')),
					cupoComplementario = parseInt($t.nextAll('[name*=\[cantidad\]]').val()),
					accion=null;
				$hermanitos.each(function() {
					cupoComplementario-=parseInt($(this).val());
				});
				cupoComplementario+=parseInt($t.val()); // sumamos uno para no obviar el value="0"
				for (var i=0,l=$opt.length;i<l;++i) {
					accion=(i>cupoComplementario)?'hide':'show';
					$opt.eq(i)[accion]();
				}
				
			});
		}
		
	//si no existe el contexto no seguimos, total pa que...
	if (!$(context).length) return false;
	
	// al cargar el DOM comprobamos los que tienen "check" para ponerles una clase y ocultamos los demas
	filasCupo.each( function() {
		var $t = $(this);
		if ($t.find(':checked').length) {
			$t.addClass(cssCupoSel);
		} else {
			$t.nextAll().hide();
		}
	});
	
	// ASIGNACION DE EVENTOS
	// siempre que sea posible la haremos a traves de delegación de eventos ("live") para mejorar el rendimiento
	
	// evento a la "clickMyRows"
	filasCupo.bind('click', function(evento){
		var $target = $(evento.target),
			$fila = $target.closest('tr'),
			$input =  $fila.find('input[type=checkbox]');
		if (!$target.is('input')) {
			if (!$input.get(0).checked) {
				$input.attr('checked', 'checked');
			} else {
				$input.attr('checked', '');
			}
			$input.triggerHandler('change');
		}
	});
	
	// anyadir clases y desplegar habitaciones por cupo
	filasCupo.find('input[type=checkbox]').change( function() {
		var $fila = $(this).closest('tr');
		if (this.checked) {
			$fila.addClass(cssCupoSel)
			.nextAll().stop(true, true).fadeIn('slow', function() {
				$(this).show();
			}); // mostramos todos
		} else {
			// id. que anterior pero tambien reseteamos los SELECTs a 0 y llamamos al evento change
			$fila.removeClass(cssCupoSel)
			.nextAll().stop(true, true).fadeOut('fast')
			.find('select').filter(function() {return ($(this).val()>0)}).val(0).change();
		}
	}).click(function() {
		var t = this;
		setTimeout(function() {
			$(t).triggerHandler('change');
		}), 50;
	});
	
	// control del cambio en el valor del SELECT de habitacion
	selectHab.bind('change', function() {
		var $t = $(this),
			idBDD = $t.next().val(),
			$fila = $t.closest('tr'),
			valor = parseInt($t.val(), 10)
			$psPanel = $fila.next().find('div.psPanel'),
			$mismaHab = selectHab.filter(function() {return ($(this).next().val()==idBDD)}),
			cupoRestante = parseInt($t.nextAll('[name*=\[cupo\]]').val(), 10);
		// Primero recalculamos el cupo por si tenemos que eliminar opciones
		$mismaHab.each(function() {
			cupoRestante-=$(this).val();
		}).each(function() {
			if (this==$t.get(0)) return;
			var $hab = $(this),
				numOpcionesIni = $hab.children().length,
				numOpcionesFin = parseInt($hab.val())+cupoRestante;
			// como el numero maximo de habitaciones reservables por uso es de 3 (+ no seleccionado)
			// limitamos a 3+1 el numOpcionesFin
			numOpcionesFin = Math.min(numOpcionesFin, 3)+1;
			// anyadimos las que toca
			for (var i=numOpcionesIni,l=numOpcionesFin;i<l;++i) {
				$hab.append('<option>'+ i +'</option>');
			}
			// nos cargamos las que sobran
			for (var i=numOpcionesIni,l=numOpcionesFin;i>l;--i) {
				$hab.children(':last').remove();
			}
		});
		
		// y ahora animaciones y similares
		if ($t.val() != 0) {
			// si es distinto de cero mostramos animacion, anyadimos la clase cssHabSel, ...
			$fila.add($fila.next()).children().animate({backgroundColor:colorHabOn}, 'slow', function() {this.style.backgroundColor = colorHabOn});
			$fila.addClass(cssHabSel);
			// replicamos los LABEL.multi en funcion del numero del SELECT ...
			$psPanel.find('div.accion:has(label.multi)').each(function() {
				var $label = $(this).find('label.multi'),
					$clon;
				// eliminamos los que sobran...
				$label.filter(':gt(' + (valor-1) + ')').remove();
				// o clonamos tantas veces como haga falta
				for (var i=$label.length, l=valor; i<l; ++i) {
					$clon = $label.eq(0).clone(true).appendTo($label.eq(0).parent());
					// cambiamos la etiqueta de "habitacion #"
					$clon.find('span').html( $clon.find('span').html().replace(/\d+/g, i+1) );
					// cambiamos el valor de los input
					$clon.find(':input').each(function() {
						this.name = this.name.replace('[supplements][0_', '[supplements]['+ i +'_');
					});
					// cambiamos el numero de habitacion
					$clon.find(':input[name*=\[room\]]').val(i);
				}
			});
			// y finalmente hacemos el slideDown del pseudo panel
			$psPanel.slideDown();
		} else {
			// si es igual a cero, ocultamos y reseteamos a cero todos los valores contenidos en su desplegable asociado
			$fila.add($fila.next()).children().animate({backgroundColor:colorHabOff}, 1200, function() {this.style.backgroundColor = colorHabOff});
			$fila.removeClass(cssHabSel);
			$fila.next().find('div.psPanel').slideUp(1200).find('select').val(0);
		}
		$('#formReserva').triggerHandler('submit');
	});
	
	// control del panel de suplementos
	$('tr.habitacion a.masInfo').bind('click', function() {
		var $t    = $(this),
			$fila = $t.closest('tr'),
			$psPanel = $fila.next().find('div.psPanel');
		
	});
	
	// suplementos que modifican el cupo de habitacion tienen que actualizar las opciones
	// que son relativas al numero de personas de esa habitacion
	suplAumentaCupo.change(function() {
		var $t= $(this),
			$selectHab = hallarSuplementosDeHabitacion(this),
			nuevoNumPax = parseInt($t.closest('tr').prev().find('input[name*=\[personasBase\]]').val());
		// recalculamos nuevoNumPax
		$selectHab.each(function() {
			var $THIS = $(this);
			if ($THIS.nextAll('[name*=aumentaUsoHabitacion]').val()=='true') {
				nuevoNumPax+=parseInt($THIS.val());
			}
		});
		// con el nuevo num pax tenemos que hacer las acciones pertinentes
		$selectHab.each(function() {
			var $sel = $(this),
				$opt = $sel.children(),
				numOpt = $opt.length,
				cantidad = 1,
				sTexto = txtPersonas;
			if ($sel.nextAll('[name*=\[usoSuplemento\]]').val()==1) {
				cantidad *= nuevoNumPax;
				if ($sel.nextAll('[name*=\[hambitoSuplemento\]]').val()==2) {
					cantidad *= $('#numNoches').val();
					sTexto = txtUnidades;
				}
				// sumamos uno por no obviar el valor 0
				cantidad++;
				if (numOpt > cantidad) {
					$opt.eq(cantidad-1).nextAll().remove();
				} else if (numOpt < cantidad) {
					for (var i=numOpt,l=cantidad;i<l;++i) {
						$sel.append('<option>'+ i + sTexto +'</option>')
					}
				}
				cantidad--;
			}
			// modificamos el cupo de los suplementos complementarios ...
			$sel.nextAll('[name*=\[cantidad\]]').val(cantidad);
		});
		// ... y recomprobamos OPTIONs
		comprobarSuplCompl($selectHab);
		$('#formReserva').triggerHandler('submit');
	});
	
	// Suplementos incompatibles
	suplIncompatibles.change(function() {
		var $incops = hallarIncompatibles(this),
			deshabilitar = ($(this).val() != 0) ? 'disabled':'';
		$incops.attr('disabled', deshabilitar);
	});
	
	// suplementos con cupo
	suplConCupo.change(function(){
		var $t = $(this),
			idBDD = $t.next().val(),
			$mismoSupl = $('select[name*=\[supplements\]]', context).filter(function() {return ($(this).next().val()==idBDD)}),
			cupoRestante = parseInt($t.nextAll('[name*=\[cupo\]]').val(), 10);
		// Primero recalculamos el cupo por si tenemos que ocultar opciones
		$mismoSupl.each(function(){
			cupoRestante-=$(this).val();
		});
		$mismoSupl.each(function() {
			var accion = null,
				$supl = $(this),
				$opt  = $supl.children(),
				numOpcionesFin = parseInt($supl.val(),10)+cupoRestante;
			if (numOpcionesFin<$opt.length) {
				for (var i=1,l=$opt.length;i<l;++i) {
					accion = (i<=numOpcionesFin)?'show':'hide';
					$opt[accion]();
				}
				if (numOpcionesFin==0) {
					$supl.attr('disabled', 'disabled');
				} else {
					$supl.attr('disabled', '');
				}
			}
		});
	});
	
	// suplementos complementarios
	$('select[name*=\[supplements\]]').each(function() {
		var $t = $(this),
			idBDD = $t.next().val(),
			$hermanitos = hallarSuplementosDeHabitacion(this);
		
		if ($hermanitos.filter(function() {return $(this).next().val()==idBDD;}).length>1) {
			this.idBDD = idBDD;
			$t.addClass('suplementosComplementarios_'+idBDD).change(function(){
				comprobarSuplCompl($hermanitos);
			});
		}
	});
	
	// CALCULOS DE SUBOTOTALES
	$('select', context).bind('change', function() {
		var stHab = 0,
			stSupl= 0,
			numNoches = parseInt($('#numNoches').val());
		$('select', context).each( function() {
			// iteramos por cada uno de los select y anyadimos al sumatorio correspondiente
			var $t = $(this),
				$inputPrecio = $t.prevAll('input[type=hidden]').length ? $t.prevAll('input[type=hidden]').eq(0) : $t.closest('label').prevAll('input[type=hidden]').eq(0),
				nTemp;
			nTemp =   parseInt( $t.val(), 10 ) // valor del SELECT
				  * parseFloat( $inputPrecio.val(), 10 ); // valor del INPUT type=hidden antes del SELECT
			if ($t.closest('tr.habitacion').length) {
				stHab += nTemp;
			} else {
				stSupl += nTemp;
			}
		});
		$('#stHab').html(stHab.aPrecio() + ' &euro;');
		$('#stSupl').html(stSupl.aPrecio() + ' &euro;');
		$('#precioMedio').html( ((stSupl + stHab) / numNoches).aPrecio() + ' &euro;');
		$('#ddTotal').html((stSupl + stHab).aPrecio() + ' &euro;');
	});

	// SUBMIT DEL FORMULARIO
	$(context).closest('form').submit(function() {
		// comprobamos CUPO == PAX
		var selectHab = $('tr.'+cssHabSel+' select', context),
			numPax = 0,
			aErr = [];
		// iteramos por las habitaciones a ver que tal va...
		selectHab.each(function() {
			var $t = $(this),
				numHab = parseInt($t.val(), 10);
			if (numHab != 0) {
				numPax += numHab * parseInt($t.nextAll('[name*=\[personasBase\]]').val());
			}
		});
		// y filtramos los aumenta uso habitacion en funcion de si tienen valor 'true' y...
		// su select anterior tiene valor != 0. Los sumamos a muerte
		numPax += suplAumentaCupo.filter(function() {return ($(this).val() != 0)}).length;
		if (numPax != (inputChildren + inputAdults)) {
			aErr.push(txtCupoNoCoincide.replace('#numPax#', numPax).replace('#numInputs#', (inputChildren + inputAdults)));
		}
		/* */
		// ahora toca el temita de comprobar que nos nos piruleen con los incompatibles
		suplIncompatibles.filter(function() {return $(this).val() != 0}).each(function() {
			var $t = $(this),
				$incomp = hallarIncompatibles(this);
			
			$incomp = $incomp.filter(function() {return $(this).val() != 0});
			if ($incomp.length) {
				aErr.push(txtSuplIncompat + $t.closest('li').find('h5').text() + ', ' + $incomp.eq(0).closest('li').find('h5').text());
				return false;
			}
		});
		/* */
		var $divSubmit = $('div.submit', context);
		if (aErr.length) {
			var sHtml = '<ul><li>' + aErr.join('</li><li>') + '</li></ul>',
				$divError = $divSubmit.children('div.ko');
			$divSubmit.find('div.ok').remove();
			if ($divError.length) {
				$divError.html(sHtml).fadeOut(400).fadeIn(400)
			} else {
				$('<div class="ko" style="display:none">'+sHtml+'</div>').appendTo($divSubmit).show(1200);
			}
			return false;
		}
		else {
			$divSubmit.find('div.ko').remove();
			$('<div class="ok" style="display:none"><ul><li>'+txtPaso1ReservaOK+'</li></ul></div>').appendTo($divSubmit).show(1200);
			return true;
		}
	});
});

$(function() {
	var context = '#formReserva.reservar-2';
	
	//si no existe el contexto no seguimos, total pa que...
	if (!$(context).length) return false;
	
	$('#tipoPago').change(function() {
		var elementos = $(this).val()=='fs05'?['fs02','fs05']:['fs05','fs02'];
		$('#pago_'+elementos[0]).show();
		$('#pago_'+elementos[1]).hide();
	}).triggerHandler('change');
	
	$(context).submit(function() {
		var $this = $(this),
		$fields = $('fieldset', context),
		reUL = /<\/?ul>/g,
		formElem,
		aErr = [],
		mixedTemp;
		
		// primer fieldset - datos personales
		var tipoDeDoc = $('select[name=client\[idKind\]]', context).val(),
			numDoc = $('input[name=client\[idNumber\]]', context).val();
		switch (tipoDeDoc) {
			case 'dni':
			if (!numDoc.testDNI()) {
				aErr.push('<li>', txtFormatDocInvalid,'</li>');
			}
			break;
			case 'nie':
			if (!numDoc.testNIE()) {
				aErr.push('<li>', txtFormatDocInvalid,'</li>');
			}
			break;
		}
		mixedTemp = validarObl($fields.get(0));
		if (mixedTemp !== true) aErr.push(mixedTemp.replace(reUL, ''));
		
		// segundo fieldset - datos de pago
		
		if ($('#tipoPago').val() != 'fs02') {
			// aqui tambien se entra si no existe el <input id="#tipoPago" ... />
			// validamos numero tarjeta
			var tipoTarjeta = $('select[name=creditCard\[kind\]]', context).val(),
				numTarjeta  = $('input[name=creditCard\[number\]]', context).val();
			switch (tipoTarjeta) {
				case 'VI':
				if (!numTarjeta.testVisa()) {
					aErr.push('<li>', txtNumTarjInvalid,'</li>');
				}
				break;
				case 'MC':
				if (!numTarjeta.testMasterCard()) {
					aErr.push('<li>', txtNumTarjInvalid,'</li>');
				}
				break;
				case 'AX':
				if (!numTarjeta.testAmericanExpress()) {
					aErr.push('<li>', txtNumTarjInvalid,'</li>');
				}
				break;
			}
			// validamos fecha de caducidad
			var caducaMes = parseInt($('[name=creditCard\[month\]]', context).val(), 10),
				caducaAno = parseInt($('[name=creditCard\[year\]]', context).val(), 10);
			if (!caducaMes || !caducaAno || new Date() > (new Date()).setFullYear(caducaAno+2000, caducaMes-1, 1)) {
				aErr.push('<li>',txtCaducidadKo,'</li>');
			}
			// validamos el numero de verificacion
			var secCode = $('[name=creditCard\[sec\]]', context).val();
			if (!secCode || secCode.length!=3 || parseInt(secCode, 10) != secCode) {
				aErr.push('<li>',txtCardCodeKo,'</li>');
			}
			
			mixedTemp = validarObl('#pago_fs05');
			if (mixedTemp !== true) aErr.push(mixedTemp.replace(reUL, ''));
		} else {
			// si esta marcado pago con bono validamos el campo que toca
			mixedTemp = validarObl('#pago_fs02'); 
			if (mixedTemp !== true) aErr.push(mixedTemp.replace(reUL, ''));
		}
		
		
		// tercer fieldset - he leido las cosas legales esas
		if (!$('[name=disclaimer]', context).is(':checked')) {
			aErr.push('<li>',txtLegalKo,'</li>');
		}
		
		/* comprobacion final ... */
		if (aErr.length) {
			var sHtml = '<ul><li>' + aErr.join('</li><li>') + '</li></ul>', $divSubmit = $('fieldset.submit', context)
			$divError = $divSubmit.children('div.ko');
			if ($divError.length) {
				$divError.html(sHtml).fadeOut(400).fadeIn(400)
			}
			else {
				$('<div class="ko floatLeft" style="display:none">' + sHtml + '</div>').prependTo($divSubmit).show(1200);
			}
			return false;
		}
		else {
			$('input[name=creditCard\[number\]]', context).val(numTarjeta.replace(/(\d)([\s\-])(\d)/g, '$1$3'));
			return true;
		}
	});
	
});

// Validacion NIF/NIE de newsletter
$(function() {
	var context = '#suscrNewsletter';
	if (!$(context).length) return false;
        formSuscr = new DForm($(context).get(0), {useAJAX:true});
	formSuscr.addValidation(0, function() {
		var $this = $(this),
		$fields = $('fieldset', context),
		reUL = /<\/?ul>/g,
		mixedTemp;

		mixedTemp = validarObl($fields.get(0));
        if (mixedTemp === true) {
            mixedTemp = '';
        } else {
            mixedTemp = mixedTemp.replace(reUL, '');
        }

        var checkedLeido = $('#leido', context).attr('checked');
        if (checkedLeido == false || checkedLeido == 'false') {
            mixedTemp += ('<li>' + txtFaltaCheckCondiciones + '</li>');
        }

		var tipoDeDoc = $('select[name=tipoid]', context).val(),
			numDoc = $('input[name=docid]', context).val();
		switch (tipoDeDoc) {
			case 'DNI':
                if (!numDoc.testDNI()) {
                    mixedTemp += ('<li>' + txtFormatDocInvalid + '</li>');
                }
                break;
			case 'NIE':
                if (!numDoc.testNIE()) {
                    mixedTemp += ('<li>' + txtFormatDocInvalid + '</li>');
                }
                break;
		}
		if (mixedTemp != '') {
			var sHtml = '<ul>' + mixedTemp + '</ul>';
			return sHtml;
		} else {
            return true;
        }
	});

});
