// JavaScript Document jQuery(document).ready(function ($) { var page_body = $('body'); var booking_panel = $('#booking-panel'); var booking_toggle = booking_panel.find('a#booking-panel-toggle'); var booking_panel_close = booking_panel.find('.panel-close'); var booking_toggle_mobile = $('.rf-book'); var city_select = $('#cities_select'); var hotel_select = $('#hotel_select'); var hotel_select_clone = $('#hotel_select_clone'); var p3_form = $('form#form_p3'); var num_rooms_elem = $('#room_indicator'); var p3_grid = $('fieldset#p3-grid'); var p3_cityid_elem = p3_form.find('input#city'); var p3_checkin_elem = p3_form.find('input#from_selector'); var p3_checkin_hidden_elem = p3_form.find('input#arrival'); var p3_num_nights_elem = p3_form.find('select#nights'); var p3_occupancy_numbers = p3_form.find('.occupancy_num'); var mobile_menu_toggle = $('nav#main-nav-mobile'); var current_city_id, current_city_name, num_hotels_in_city, booking_agent, current_booking_panel; var date_checkin, parts, parts2, parts_month, occupancy_array, occupancy_list; $(window).load(function () { // Initialise the booking panel on page load current_city_id = city_select.val(); if (current_city_id > 0) { // Hides irrelevant hotels from select (based on current city / location ---------------------------------- hide_hotels(current_city_id); // Displays the default "empty" option if more than one hotel in selected city / location ----------------- display_default_option(current_city_id); // Displays the correct booking engine depending on the data-agent value of the hotel selected ------------ booking_agent = hotel_select.find(':selected').data('agent'); if (typeof booking_agent === 'undefined') { display_booking_engine(booking_panel.data('agent')); } else { display_booking_engine(booking_agent); } } else if (current_city_id === 'x') { current_city_name = city_select.find('option:selected').text(); // Hides irrelevant hotels from select (based on current city / location ---------------------------------- hide_hotels_by_name(current_city_name); // Displays the default "empty" option if more than one hotel in selected city / location ----------------- display_default_option_by_name(current_city_name); // Displays the correct booking engine depending on the data-agent value of the hotel selected ------------ booking_agent = hotel_select.find(':selected').data('agent'); if (typeof booking_agent === 'undefined') { display_booking_engine(booking_panel.data('agent')); } else { display_booking_engine(booking_agent); } } // Toggles the booking panel ---------------------------------------------------------------------------------- booking_toggle.on('click', function (e) { e.preventDefault(); if (page_body.hasClass('booking-closed')) { booking_panel.find('#booking-form').slideDown('slow', function () { page_body.toggleClass('booking-closed'); }); } else { booking_panel.find('#booking-form').slideUp('slow', function () { page_body.toggleClass('booking-closed'); }); } }); // Toggles the MOBILE booking panel --------------------------------------------------------------------------- booking_toggle_mobile.add(booking_panel_close).on('click', function (e) { e.preventDefault(); if (mobile_menu_toggle.hasClass('open')) { mobile_menu_toggle.removeClass('open'); $('.site-inner').removeClass('off'); $('nav#mobile-menu').removeClass('open'); $('.menu-text-close').addClass('hide'); $('.menu-text').removeClass('hide'); } if (page_body.hasClass('booking-closed') || booking_panel.find('#booking-form').css('display') === 'none') { $('html, body').animate({scrollTop: 0}, 'slow'); booking_panel.find('#booking-form').slideDown('slow', function () { page_body.removeClass('booking-closed'); }); } else { booking_panel.find('#booking-form').slideUp('slow', function () { page_body.addClass('booking-closed'); }); } $('.rf-book .book-text-close').toggleClass('hide'); $('.rf-book .book-text').toggleClass('hide'); }); // WHEN THE NUMBER OF ROOMS IS UPDATED (P3) num_rooms_elem.on('change', function () { // Displays the correct number of rows based on selected value -------------------------------------------- display_room_rows($(this).val()); }); // WHEN THE CHECK-IN DATE IS CHANGED (P3) p3_checkin_elem.on('change', function () { // Convert date into "timestamp" version to pass to booking engine date_checkin = date_display_to_timestamp($(this).val(), 'default'); // Update hidden field with new date p3_checkin_hidden_elem.val(date_checkin); }); // WHEN THE NUMBER OF NIGHTS IS CHANGED (P3) p3_num_nights_elem.on('change', function () { // Grab value of check in date field date_checkin = p3_checkin_elem.val(); }); // SET ROOM MAXIMUM OCCUPANCY RATES WHEN PAGE LOADS occupancy_array = hotel_select.find(':selected').data('occupancy'); if (typeof occupancy_array !== 'undefined' && occupancy_array !== '' && occupancy_array !== 'no data') { reboot_occupancy(occupancy_array); } // WHEN NUMBER OF ADULTS, CHILDREN OR INFANTS CHANGES p3_occupancy_numbers.on('change', function () { occupancy_array = hotel_select.find(':selected').data('occupancy'); if (typeof occupancy_array !== 'undefined' && occupancy_array !== '' && occupancy_array !== 'no data') { update_occupancy(occupancy_array, $(this).attr('id')); } }); }); var adult_select_fields = $('.adults_select'); var child_select_fields = $('.children_select'); var infant_select_fields = $('.infants_select'); var i, max_adults, max_minors, adults_options, kids_options, infants_options, room_row, person_type; var num_adults, num_children, num_infants, num_minors, max_minors_adjusted, max_adults_adjusted; var max_adults_position, current_row_adults, current_row_children, current_row_infants, selected_string; var max_minors_extra, max_adults_extra, max_children_permitted, max_infants_permitted; // SET ROOM MAXIMUM OCCUPANCY RATES function reboot_occupancy(occupancy) { max_adults = ( occupancy.indexOf('x') / 2 ); max_minors = parseFloat(occupancy.charAt(0)); if (max_minors > 0 && max_adults <= 0) { max_adults = 6; } adults_options = build_occupancy_list(max_adults, 1, 1); kids_options = build_occupancy_list(max_minors, 0, 0); adult_select_fields.empty().append(adults_options); child_select_fields.empty().append(kids_options); infant_select_fields.empty().append(kids_options); } // UPDATE INDIVIDUAL ROOM OCCUPANCY RATES BASED ON CHANGES TO THAT ROOM ROW function update_occupancy(occupancy, elem_id) { occupancy_array = occupancy.split(','); person_type = elem_id.charAt(0); room_row = elem_id.charAt(elem_id.length - 1); max_adults = ( occupancy.indexOf('x') / 2 ); // Maximum possible number of ADULTS (assuming zero MINORS) max_minors = parseFloat(occupancy.charAt(0)); // Maximum possible number of MINORS (assuming 1 ADULT) if (max_minors > 0 && max_adults <= 0) { max_adults = 6; } current_row_adults = $('select#adults-' + room_row); current_row_children = $('select#children-' + room_row); current_row_infants = $('select#infants-' + room_row); num_adults = parseFloat(current_row_adults.val()); // Actual number of ADULTS num_children = parseFloat(current_row_children.val()); // Actual number of CHILDREN num_infants = parseFloat(current_row_infants.val()); // Actual number of INFANTS num_minors = num_children + num_infants; // Actual total number of MINORS max_adults_position = occupancy.lastIndexOf(num_minors); // Total number of ADULTS permitted based on actual number of MINORS if (max_adults_position === -1 && num_minors === 0) { max_adults_adjusted = max_adults; } else { max_adults_adjusted = ( max_adults_position / 2 ) + 1; } max_adults_extra = max_adults_adjusted - num_adults; // Number of additional ADULTS permitted based on actual number of MINORS max_minors_adjusted = occupancy_array[num_adults - 1]; // Total number of MINORS permitted based on actual number of ADULTS max_minors_extra = max_minors_adjusted - num_minors; // Number of additional MINORS permitted based on actual number of ADULTS max_children_permitted = num_children + max_minors_extra; // Total number of CHILDREN permitted based on actual number of ADULTS max_infants_permitted = num_infants + max_minors_extra; // Total number of INFANTS permitted based on actual number of ADULTS if (max_minors_extra > 0) { // If it's possible to add more MINORS... kids_options = build_occupancy_list(max_children_permitted, 0, num_children); current_row_children.empty().append(kids_options); infants_options = build_occupancy_list(max_infants_permitted, 0, num_infants); current_row_infants.empty().append(infants_options); } else if (max_minors_extra === 0) { // If it's NOT possible to add more MINORS... kids_options = build_occupancy_list(num_children, 0, num_children); current_row_children.empty().append(kids_options); infants_options = build_occupancy_list(num_infants, 0, num_infants); current_row_infants.empty().append(infants_options); } if (person_type === 'c' || person_type === 'i') { // When the ADULTS field is changed ------------------------ if (max_adults_extra > 0) { // If it's possible to add more ADULTS... adults_options = build_occupancy_list(max_adults_adjusted, 1, num_adults); current_row_adults.empty().append(adults_options); } else if (max_adults_extra === 0) { // If it's NOT possible to add more ADULTS... adults_options = build_occupancy_list(num_adults, 1, num_adults); current_row_adults.empty().append(adults_options); } } } // SET ROOM MAXIMUM OCCUPANCY RATES function build_occupancy_list(max_num, min_num, current_num) { occupancy_list = ''; i = min_num; while (i <= max_num) { if (i === current_num) { selected_string = ' selected="selected"'; } else { selected_string = ''; } occupancy_list += ''; i++; } return occupancy_list; } // Initialise the "From date" datepicker on the P3 form ########################################################### $('#from_selector').datepicker({ changeMonth: false, changeYear: false, dateFormat: 'dd M yy', minDate: 0 }); // DISPLAY ROOM ROWS function display_room_rows(number_of_rooms) { var current_row; var i = 1; while (i <= p3_grid.data('numrows')) { current_row = p3_grid.find('#row-' + i); if (current_row.css('display') === 'block') { if (i > number_of_rooms) { current_row.slideUp('slow'); } } else { if (i <= number_of_rooms) { current_row.slideDown('slow'); } } i++; } } // HIDE HOTELS function hide_hotels(current_city_id) { if (current_city_id > 0) { hotel_select.find('option').remove(); hotel_select_clone.find('option[data-city="' + current_city_id + '"]').each(function () { hotel_select.append($(this).clone()); }); // Populate 'City ID' hidden field on P3 form p3_cityid_elem.val(current_city_id); } else { hotel_select.find('option').remove(); hotel_select_clone.find('option').each(function () { hotel_select.append($(this).clone()); }); } } function hide_hotels_by_name(current_city_name) { if (current_city_name.length) { hotel_select.find('option').remove(); hotel_select_clone.find('option[data-city="' + current_city_name + '"]').each(function () { hotel_select.append($(this).clone()); }); // Populate 'City ID' hidden field on P3 form p3_cityid_elem.val('x'); } else { hotel_select.find('option').remove(); hotel_select_clone.find('option').each(function () { hotel_select.append($(this).clone()); }); } } // DISPLAY DEFAULT "EMPTY" OPTION function display_default_option(current_city_id) { num_hotels_in_city = hotel_select.find('option[data-city="' + current_city_id + '"]').length; if (num_hotels_in_city > 1) { hotel_select.prepend(hotel_select_clone.find('option[data-id="0"]').clone()); } } function display_default_option_by_name(current_city_name) { num_hotels_in_city = hotel_select.find('option[data-city="' + current_city_name + '"]').length; if (num_hotels_in_city > 1) { hotel_select.prepend(hotel_select_clone.find('option[data-id="0"]').clone()); } } // REVEAL HIDE RELEVANT BOOKING ENGINE function display_booking_engine(booking_engine) { if (typeof booking_engine === 'undefined') { } else { current_booking_panel = $('form#form_' + booking_engine); if (current_booking_panel.is(':hidden')) { booking_panel.find('form').css('display', 'none'); current_booking_panel.fadeIn(); } if (booking_engine === 'p3') { current_booking_panel.attr('action', current_booking_panel.data('p3action')); } else { current_booking_panel.attr('action', hotel_select.find(':selected').data('url')); } } } // CONVERT A DATE function date_display_to_timestamp(new_date, type) { if (type === 'extended') { parts2 = new_date.toString(); parts = parts2.split(' '); } else { parts = new_date.split(' '); } parts_month = parts[1]; switch (parts_month) { case "Jan": parts_month = '01'; break; case "Feb": parts_month = '02'; break; case "Mar": parts_month = '03'; break; case "Apr": parts_month = '04'; break; case "May": parts_month = '05'; break; case "Jun": parts_month = '06'; break; case "Jul": parts_month = '07'; break; case "Aug": parts_month = '08'; break; case "Sep": parts_month = '09'; break; case "Oct": parts_month = '10'; break; case "Nov": parts_month = '11'; break; case "Dec": parts_month = '12'; break; } if (type === 'extended') { return parts[3] + '-' + parts_month + '-' + parts[2]; } else { return parts[2] + '-' + parts_month + '-' + parts[0]; } } //GA utm tags ?utm_campaign=test&utm_source=test&utm_medium=test var getUrlParameter = function getUrlParameter(sParam) { var sPageURL = decodeURIComponent(window.location.search.substring(1)), sURLVariables = sPageURL.split('&'), sParameterName, i; for (i = 0; i < sURLVariables.length; i++) { sParameterName = sURLVariables[i].split('='); if (sParameterName[0] === sParam) { return sParameterName[1] === undefined ? true : sParameterName[1]; } } }; var gd_utm_campaign = getUrlParameter('utm_campaign'); var gd_utm_source = getUrlParameter('utm_source'); var gd_utm_medium = getUrlParameter('utm_medium'); if (gd_utm_campaign) { $('input[name=utm_campaign]').val(gd_utm_campaign).prop("disabled", false); } else if ($.cookie('utm_campaign')) { $('input[name=utm_campaign]').val($.cookie("utm_campaign")).prop("disabled", false); } if (gd_utm_source) { $('input[name=utm_source]').val(gd_utm_source).prop("disabled", false); } else if ($.cookie('utm_source')) { $('input[name=utm_source]').val($.cookie("utm_source")).prop("disabled", false); } if (gd_utm_medium) { $('input[name=utm_medium]').val(gd_utm_medium).prop("disabled", false); } else if ($.cookie('utm_medium')) { $('input[name=utm_medium]').val($.cookie("utm_medium")).prop("disabled", false); } });