/** * Objeto con las variables que se van proporcionando en el proceso de reserva */ var json = {}; /** * Muestra un mensaje de alerta por pantalla * @param txt Texto del mensaje */ function _alert ( txt ) { Growl.Smoke ( { //Growl.Bezel ( { title : 'Error', text : txt, image : 'images/dialog-warning.png', duration : 5 } ); } /** * Devuelve $ ( id ).value, es decir, document.getElementById ( id ).value */ function $F ( id ) { return $ ( id ).value; } /* sobrecargamos la función que controla la selección de una fecha en el calendario * para recalcular el número de noches * la función original está en includes/js/joomla.javascript.js * cal Object objeto calendario */ function selected ( cal, date ) { /* es vive * formato de fecha d-m-Y */ /* var aFecha = date.split ( '-' ); cal.sel.value = aFecha[ 2 ] + '-' + aFecha[ 1 ] + '-' + aFecha[ 0 ]; */ cal.sel.value = date; /* ocultamos el calendario */ closeHandler ( cal ); /* recalculamos el número de noches */ calculaNoches(); } /** * Calcula el número de noches entre la fecha de entrada y la de salida * @param Object id Puede ser "Fe", "Fs" o null (buscador) u "OfertaFe" u "OfertaFs" (oferta principal) * La fecha está en formato dd-mm-y */ function calculaNoches ( id ) { /* obtenemos los identificadores de los campos que contienen las fechas a comprobar */ var sFe, sFs, sNoches; if ( id == 'OfertaFe' || id == 'OfertaFs' ) { /* datos de la oferta */ sFe = 'OfertaFe'; sFs = 'OfertaFs'; sNoches = 'OfertaNoches'; } else /* datos del buscador */ { sFe = 'Fe'; sFs = 'Fs'; sNoches = 'Noches'; } /* obtenemos las fechas: dd-mm-y */ var aFe = $F ( sFe ).split ( '-' ); var aFs = $F ( sFs ).split ( '-' ); if ( aFe != '' && aFs != '' ) { var ms_per_day = 86400000; var dFe = new Date ( aFe[ 2 ], aFe[ 1 ] - 1, aFe[ 0 ] ); var dFs = new Date ( aFs[ 2 ], aFs[ 1 ] - 1, aFs[ 0 ] ); var num_noches = Math.ceil ( ( dFs.getTime () - dFe.getTime () ) / ms_per_day ); if ( num_noches > 0 ) { $ ( sNoches ).innerHTML = num_noches + ' Noches'; } else /* error! */ { _alert ( 'La fecha de salida debe ser posterior a la fecha de entrada' ); $ ( sFs ).value = ''; $ ( sNoches ).value = ''; } } /* end if comprobacion de que hemos obtenido dos fechas para luego compararlas */ } function calculaRegimenes ( id ) { if ( !window.ie7 ) { var pars = 'id=' + id; var url = 'modules/mod_buscador_regimenes.php'; var log = $ ( 'SelectTp' ).empty ().addClass ( 'ajax-loading' ); new Ajax ( url, { method : 'post', data : pars, onFailure : showError, onComplete : function () { log.removeClass ( 'ajax-loading' ); }, update : log, evalScripts : true } ).request (); } } /** * Comienza el proceso de reserva de la oferta seleccionada */ function reservarOferta () { /* recogemos los valores de la oferta */ json = {}; /* fecha de entrada: dd-mm-y */ json.fe = $F ( 'OfertaFe' ); /* fecha de salida: dd-mm-y */ json.fs = $F ( 'OfertaFs' ); /* id del hotel */ json.id_hotel = $F ( 'OfertaEst' ); /* tipo de regimen */ json.regimen = $F ( 'OfertaTp' ); /* idioma */ json.lang = 'ES'; /* habitaciones */ json.habitaciones = []; json.habitaciones[ 0 ] = {}; /* identificador de la habitacion */ json.habitaciones[ 0 ].id = $F ( 'OfertaHabitacion' ); /* número de habitaciones */ json.habitaciones[ 0 ].num = $F ( 'OfertaNumHabitaciones' ); /* identificador del precio */ json.habitaciones[ 0 ].id_precio = $F ( 'OfertaIdPrecio' ); mostrarResultados (); } /** * Comienza el proceso de reserva a partir de los resultados del buscador */ function reservarBuscador () { /* recogemos los valores del buscador */ json = {}; /* fecha de entrada: dd-mm-y */ json.fe = $F ( 'Fe' ); /* fecha de salida: dd-mm-y */ json.fs = $F ( 'Fs' ); /* id del hotel */ json.id_hotel = $F ( 'SelectEst' ); /* tipo de regimen */ json.regimen = $F ( 'SelectTp' ); /* idioma */ json.lang = 'ES'; /* habitaciones */ json.habitaciones = []; mostrarResultados(); } /** * Muestra la pantalla con los resultados de la búsqueda */ function mostrarResultados() { if ( !json.fe || !json.fs ) { _alert ( 'La fecha de salida debe ser posterior a la fecha de entrada' ); return; } /* .toJSONString(); json.js tiene conflictos con mootools.js */ var pars = 'json=' + Json.toString ( json ); var url = 'modules/mod_buscador_resultado.php'; var log = $ ( 'Content' ).empty ().addClass ( 'ajax-loading' ); new Ajax ( url, { method : 'post', data : pars, onFailure : showError, onComplete : function () { log.removeClass ( 'ajax-loading' ); }, update : log, evalScripts : true } ).request (); /* borramos el banner si está presente */ if ( $ ( 'banner' ) ) { $ ( 'banner' ).remove (); } } /** * Muestra la pantalla de detalle de la reserva y distribucion de ocupación de las habitaciones * @param JSON Object obj Objeto JSON que contiene las variables necesarias */ function mostrarDetalle () { // var nhab = Element.getElementsByClassName( 'nhab' ); // select (before mootools v1.11) /* numero de habitaciones, es un */ var id_precio = document.getElements ( '.id_precio' ); /* para controlar si ha seleccionado por lo menos una habitación */ var modificado = false; // si venimos de un paso posterior recogemos los datos que ya teniamos de las habitaciones // si no, creamos el array de habitaciones json.habitaciones = nhab == '' ? json.habitaciones : []; for ( var i = 0, j = 0; i < nhab.length; i++) { if ( nhab[ i ].value > 0 ) { modificado = true; json.habitaciones[ j ] = { 'id' : nhab[ i ].id, 'num' : nhab[ i ].value, 'id_precio' : id_precio[ i ].value }; j++; } } /* si no lo hemos modificado y no venimos de un paso posterior devolvemos un error */ if ( !modificado && !json.habitaciones.length ) { _alert ( 'Debe seleccionar al menos una habitación' ); return; } /* si venimos de un paso posterior debemos borrar la capa de inserción de datos personales */ if ( $ ( 'Datos' ) ) { $ ( 'Datos' ).remove (); } //alert ( Json.toString ( json ) ); /* .toJSONString (); json.js tiene conflictos con mootools.js */ var pars = 'json=' + Json.toString ( json ); var url = 'modules/mod_buscador_detalle.php'; var log = $ ( 'Esquerra' ).empty ().addClass( 'ajax-loading' ); new Ajax ( url, { method : 'post', data : pars, onFailure : showError, onComplete : function () { log.removeClass ( 'ajax-loading' ); }, update : log, evalScripts : true } ).request (); } /** * Muestra la pantalla de inserción de datos de la persona que realiza la reserva * los campos que contienen el número de adultos tienen la clase: ahab_ * Para los de los niños y bebés: nhab_ y bhab_ */ function mostrarCliente () { // var ahab = document.getElementsByClassName( 'ahab' ); // select (before mootools v1.11) // var nhab = document.getElementsByClassName( 'nhab' ); // select (before mootools v1.11) // var bhab = document.getElementsByClassName( 'bhab' ); // select (before mootools v1.11) var ahab = document.getElements ( '.ahab' ); // select (class="ahab") var nhab = document.getElements ( '.nhab' ); // select var bhab = document.getElements ( '.bhab' ); // select var l = json.habitaciones.length; for ( var i = 0, k = 0; i < l; i++ ) { json.habitaciones[ i ].adultos = []; json.habitaciones[ i ].ninos = []; json.habitaciones[ i ].bebes = []; var m = json.habitaciones[ i ].num; for ( var j = 0; j < m; j++ ) { /* si existe pero no tiene valor significa que es un habitacion individual (no editable) */ json.habitaciones[ i ].adultos[ j ] = ahab[ k ].value || 1; json.habitaciones[ i ].ninos[ j ] = nhab[ k ].value || 0; json.habitaciones[ i ].bebes[ j ] = bhab[ k ].value || 0; k++; } /* end for */ } /* end for */ var pars = 'json=' + Json.toString ( json ); var url = 'modules/mod_buscador_cliente.php'; var log = $ ( 'resultatsCerca' ).empty ().addClass( 'ajax-loading' ); new Ajax ( url, { method : 'post', data : pars, onFailure : showError, onComplete : function () { log.removeClass ( 'ajax-loading' ); }, update : log, evalScripts : true } ).request (); } /** * Recoge los datos personales de la persona que reserva y muestra el voucher final para confirmar la reserva */ function confirmarReserva () { /* comprobamos que estamos en la pantalla de edición de datos personales */ if ( $ ( 'nombre_cliente' ) ) { /* todos los campos son obligatorios */ if ( !$F ( 'nombre_cliente' ) || !$F ( 'email_cliente' ) || !$F ( 'tlf_cliente' ) ) { _alert ( 'Debe rellenar los campos obligatorios, marcados con un asterisco (*)' ); return; } /* validamos el email * http://gollum.inforg.uniovi.es/aii/valida_regexp.php */ var patron = '(^[0-9a-zA-Z]+(?:[._][0-9a-zA-Z]+)*)@([0-9a-zA-Z]+(?:[._-][0-9a-zA-Z]+)*\.[0-9a-zA-Z]{2,3})$'; var re = new RegExp ( patron ); if ( !re.test ( $F ( 'email_cliente' ) ) ) { _alert ( 'Debe proporcionar un email válido' ); $ ( 'email_cliente' ).value = ''; return; } } /* Hacemos visibles las condiciones de reserva */ if ( $ ( 'condiciones' ) ) { /* 1 == visible (MooTools) */ $ ( 'condiciones' ).setOpacity ( 1 ); } /* pedimos confirmación */ /* es vive var label = document.createElement ( 'h4' ); label.id = 'nombre_cliente'; label.innerHTML = $F ( 'nombre_cliente' ); $ ( 'nombre_cliente' ).replaceWith ( $ ( label ).clone () ); label.id = 'email_cliente'; label.innerHTML = $F ( 'email_cliente' ); $ ( 'email_cliente' ).replaceWith ( label.clone () ); label.innerHTML = $F ( 'tlf_cliente' ); label.id = 'tlf_cliente'; $ ( 'tlf_cliente' ).replaceWith ( label.clone () ); */ /* es vive: quitamos un paso en la reserva */ if ( !$ ( 'check_legales' ).checked ) { _alert ( 'Debe aceptar las condiciones de la reserva' ); return; } /* actualizamos el json */ /* estos campos ahora son

, no */ /* es vive json.nombre_cliente = $ ( 'nombre_cliente' ).innerHTML; json.email_cliente = $ ( 'email_cliente' ).innerHTML; json.tlf_cliente = $ ( 'tlf_cliente' ).innerHTML; */ json.nombre_cliente = $ ( 'nombre_cliente' ).value; json.email_cliente = $ ( 'email_cliente' ).value; json.tlf_cliente = $ ( 'tlf_cliente' ).value; /* confirmar pasa a ser el botón de reserva */ /* es vive $ ( 'confirmar' ).onclick = reservar; $ ( 'confirmar' ).innerHTML = 'Reservar'; */ /* el botón anterior pasa a llamar la función que convertirá en editables los campos de datos personales */ /* es vive $ ( 'anterior' ).onclick = editarDatosPersonales; */ var pars = 'json=' + Json.toString ( json ); var url = 'modules/mod_buscador_pago.php'; new Ajax ( url, { method : 'post', data : pars, onFailure : showError, onComplete : submitTPV } ).request (); } /* end function confirmarReserva */ /** * Permite modificar los datos personales introducidos por el usuario antes de confirmar la reserva */ function editarDatosPersonales () { /* Hacemos invisibles las condiciones de reserva */ /* 0 == hidden (MooTools) */ $ ( 'condiciones' ).setOpacity ( 0 ); var input = document.createElement ( 'input' ); input.id = 'nombre_cliente'; input.value = json.nombre_cliente; $ ( 'nombre_cliente' ).replaceWith ( input.clone () ); input.id = 'email_cliente'; input.value = json.email_cliente; $ ( 'email_cliente' ).replaceWith ( input.clone () ); input.id = 'tlf_cliente'; input.value = json.tlf_cliente; $ ( 'tlf_cliente' ).replaceWith ( input.clone () ); /* el boton de reserva pasa a ser el de confirmar */ $ ( 'confirmar' ).onclick = confirmarReserva; $ ( 'confirmar' ).innerHTML = 'Confirmar'; /* el boton de anterior pasa a ser el que lleva a la distribucion de personas */ $ ( 'anterior' ).onclick = mostrarDetalle; } /** * Comprueba que se haya marcado la casilla de las condiciones legales. En caso de ser así, actualiza la tabla de reservas, * decrementa el cupo de la oferta y carga un iframe con la pasarela del banco */ function reservar () { if ( !$ ( 'check_legales' ).checked ) { _alert ( 'Debe aceptar las condiciones de la reserva' ); return; } // new Ajax(url, { postBody : json, evalScripts : false }).request(); var pars = 'json=' + Json.toString ( json ); var url = 'modules/mod_buscador_pago.php'; new Ajax ( url, { method : "post", data : pars, onFailure : showError, onComplete : submitTPV } ).request (); } /** * Envía los datos al TPV para realizar el pago */ function submitTPV ( response ) { /* si los datos son correctos, recibimos el localizador y la firma y vamos a la pagina del tpv virtual */ var localizador = response.split ( "##" )[ 0 ]; $ ( 'Num_operacion' ).value = localizador; $ ( 'Firma' ).value = response.split ( "##" )[ 1 ]; $ ( 'URL_OK' ).value += '&localizador=' + localizador; $ ( 'URL_NOK' ).value += '&localizador=' + localizador; $ ( 'tpvform' ).submit (); } /** * Muestra la pantalla del bono */ function mostrarBono ( r, localizador ) { /* var pars = 'json=' + Json.toString ( json ); */ var pars = 'r=' + r + '&localizador=' + localizador; var url = 'modules/mod_buscador_acabar.php'; var log = $ ( 'Content' ).empty ().addClass ( 'ajax-loading' ); new Ajax ( url, { method : 'post', data : pars, onFailure : showError, onComplete : function () { log.removeClass ( 'ajax-loading' ); }, update : log, evalScripts : true } ).request (); } /** * Devuelve true si la combinación de adultos y niños está permitida * @param Object ad Número de adultos * @param Object ni Número de niños * @param Object be Número de bebes */ function combinacionPermitida ( ad, ni, be ) { /* 3 adultos sin niños ni bebés ó * 1 adulto sin niños ni bebés ó * 2 adultos y 0 ó 1 niños y 0 ó 1 bebés */ return ( ad == 3 && ni == 0 && be == 0 || ad == 1 && ni == 0 && be == 0 || ad == 2 && ni < 2 && be < 2 ); } /** * Calcula el precio por persona, incluyendo los descuentos aplicables, en caso de ser 'por persona y noche' * Los campos que contienen el precio por habitacion tiene la clase: preu * Los campos que tienen el número de adultos tienen la clase: ahab * Los campos que tienen el número de niños tienen la clase: nhab * Los campos que tienen el número de bebes tienen la clase: bhab * @param Object dtoAdulto (de 0 a 100) Dto para el 3er adulto * @param Object dtoBebe (de 0 a 100) Dto para los niños de 1º categoría, de 0 a 2 años, por ejemplo. * @param Object dtoNino (de 0 a 100) Dto para los niños de 2º categoria, de 2 a 12 años, por ejemplo. */ function cambiarPrecioPersonas ( dtoAdulto, dtoNino, dtoBebe ) { dtoAdulto = parseFloat ( dtoAdulto ) || 0; dtoNino = parseFloat ( dtoNino ) || 0; dtoBebe = parseFloat ( dtoBebe ) || 0; var total = 0; // var ahab = document.getElementsByClassName( 'ahab' ); // select (before mootools v1.11) // var nhab = document.getElementsByClassName( 'nhab' ); // select (before mootools v1.11) // var bhab = document.getElementsByClassName( 'bhab' ); // select (before mootools v1.11) // var preu = document.getElementsByClassName( 'preu' ); // input (before mootools v1.11) /* estos campos son */ var preu = document.getElements( '.preu' ); for ( var i = 0; i < ahab.length; i++ ) { /* alert ( ahab + '-' + nhab + '-' + bhab + '-' + preu ); */ if ( combinacionPermitida ( ahab[ i ].value, nhab[ i ].value, bhab[ i ].value ) ) { var precio = parseFloat ( preu[ i ].value ); var numAdultos = ahab[ i ].value == 3 ? 3.0 - ( dtoAdulto / 100.0 ) : parseFloat ( ahab[ i ].value ); var numNinos = parseFloat ( nhab[ i ].value ) * ( ( 100.0 - dtoNino ) / 100.0 ); var numBebes = parseFloat ( bhab[ i ].value ) * ( ( 100.0 - dtoBebe ) / 100.0 ); total += ( numAdultos + numNinos + numBebes ) * precio; /* alert ( precio + '-' + numAdultos + '-' + numNinos + '-' + numBebes ); */ } else { _alert ( 'Esta combinación de adultos y menores no es válida' ); /* recalculamos el precio */ $ ( nhab[ i ] ).value = 0; $ ( bhab[ i ] ).value = 0; cambiarPrecioPersonas ( dtoAdulto, dtoNino, dtoBebe ); return; } } $ ( 'total' ).innerHTML = Math.round ( total * 100 ) / 100; } /** * Realiza una petición al servidor para mostrar las condiciones legales */ function recuperaNotaLegal () { new Ajax ( 'modules/mod_buscador_condiciones_legales.php', { postBody : '', onComplete : showLegal, update : 'notas' } ).request (); } /** * Muestra las condiciones legales */ function showLegal ( req ) { $ ( 'notas' ).style.height = '300px'; var el = $ ( 'ver' ); el.blur (); el.innerHTML = 'Ocultar las condiciones de la reserva'; $ ( 'ver' ).onclick = hideLegal; } /** * Oculta las condiciones legales */ function hideLegal () { $ ( 'notas' ).innerHTML = ''; $ ( 'notas' ).style.height = '0px'; var el = $ ( 'ver' ); el.blur (); el.innerHTML = 'Ver condiciones de la reserva'; el.onclick = recuperaNotaLegal; return false; } /** * Muestra un mensaje de error * @param Object req */ function showError ( req ) { /* alert ( req ); */ $ ( 'Content' ).innerHTML = 'Se ha producido un error inesperado. Inténtelo de nuevo más tarde.'; }