🏨 Hotel Booking Enhancements: - Implemented Eagle Booking Advanced Pricing add-on - Added Booking.com-style rate management system - Created professional calendar interface for pricing - Integrated deals and discounts functionality 💰 Advanced Pricing Features: - Dynamic pricing models (per room, per person, per adult) - Base rates, adult rates, and child rates management - Length of stay discounts and early bird deals - Mobile rates and secret deals implementation - Seasonal promotions and flash sales 📅 Availability Management: - Real-time availability tracking - Stop sell and restriction controls - Closed to arrival/departure functionality - Minimum/maximum stay requirements - Automatic sold-out management 💳 Payment Integration: - Maintained Redsys payment gateway integration - Seamless integration with existing Eagle Booking - No modifications to core Eagle Booking plugin 🛠️ Technical Implementation: - Custom database tables for advanced pricing - WordPress hooks and filters integration - AJAX-powered admin interface - Data migration from existing Eagle Booking - Professional calendar view for revenue management 📊 Admin Interface: - Booking.com-style management dashboard - Visual rate and availability calendar - Bulk operations for date ranges - Statistics and analytics dashboard - Modal dialogs for quick editing 🔧 Code Quality: - WordPress coding standards compliance - Secure database operations with prepared statements - Proper input validation and sanitization - Error handling and logging - Responsive admin interface 🤖 Generated with Claude Code (https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
1105 lines
33 KiB
JavaScript
1105 lines
33 KiB
JavaScript
/*================================================
|
|
* Plugin Name: Eagle Booking
|
|
* Version: 1.3.3.6
|
|
* Author: Eagle Themes (Jomin Muskaj)
|
|
* Author URI: eagle-booking.com
|
|
=================================================*/
|
|
|
|
/**
|
|
* Functions that can be called by external files
|
|
* Use jQuery instead of $
|
|
*/
|
|
|
|
/**
|
|
* Button Animation
|
|
* Version: 1.0
|
|
* Can be called externally
|
|
*/
|
|
function eb_button_loading( btn_id, btn_action = '' ) {
|
|
|
|
var btn = jQuery( btn_id );
|
|
|
|
if ( btn_action === 'hide' ) {
|
|
|
|
btn.find('.eb-btn-loader').remove();
|
|
btn.find('.eb-btn-text').show();
|
|
btn.css('pointer-events','');
|
|
btn.blur();
|
|
|
|
} else {
|
|
|
|
var eb_loader_dom = '<span class="eb-btn-loader"><span class="eb-spinner spinner1"></span><span class="eb-spinner spinner2"></span><span class="eb-spinner spinner3"></span><span class="eb-spinner spinner4"></span><span class="eb-spinner spinner5"></span></span>';
|
|
|
|
btn.append( eb_loader_dom );
|
|
btn.find('.eb-btn-text').hide();
|
|
btn.find('i').hide();
|
|
btn.css('pointer-events','none');
|
|
|
|
}
|
|
|
|
// Firefox fix: on "Go Back"
|
|
jQuery(window).unload(function () { jQuery(window).unbind('unload'); });
|
|
|
|
}
|
|
|
|
/**
|
|
* Fixed sidebar
|
|
* Version: 1.0.1
|
|
* Can be called externally
|
|
*/
|
|
var adminbar = jQuery('#wpadminbar');
|
|
var header = jQuery('header');
|
|
var stickysidebar = jQuery('.sticky-sidebar');
|
|
|
|
if (adminbar.length && adminbar.is(':visible')) {
|
|
var adminsidebarfixed = adminbar.height();
|
|
} else {
|
|
var adminsidebarfixed = 0;
|
|
}
|
|
|
|
if (header.hasClass("fixed")) {
|
|
var headersidebarfixed = header.height();
|
|
} else {
|
|
var headersidebarfixed = 10;
|
|
}
|
|
|
|
var sidebarfixed = adminsidebarfixed + headersidebarfixed;
|
|
|
|
if (stickysidebar.length) {
|
|
|
|
var sidebar = new StickySidebar('.sticky-sidebar', {
|
|
topSpacing: sidebarfixed + 20,
|
|
bottomSpacing: 0,
|
|
containerSelector: '.eb-sticky-sidebar-container',
|
|
minWidth: 991
|
|
});
|
|
|
|
}
|
|
|
|
// Re-initialize fixed sidebar
|
|
function eb_update_fixed_sidebar() {
|
|
|
|
if ( stickysidebar.length ) {
|
|
|
|
sidebar.updateSticky();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
(function ($) {
|
|
|
|
"use strict";
|
|
|
|
/* Document is Raedy */
|
|
$(document).ready(function () {
|
|
|
|
// =============================================
|
|
// PAYMENT TABS
|
|
// =============================================
|
|
var checkout_tabs = $(".checkout-payment-tabs");
|
|
if (checkout_tabs.length) {
|
|
checkout_tabs.tabs();
|
|
}
|
|
|
|
// =============================================
|
|
// ROOM SERVICES ON HOVER
|
|
// =============================================
|
|
$(".room-item .room-image").on({
|
|
mouseenter: function () {
|
|
$(this).parent().find('.room-services').addClass('active');
|
|
},
|
|
});
|
|
|
|
$(".room-item").on({
|
|
mouseleave: function () {
|
|
$(this).parent().find('.room-services').removeClass('active');
|
|
}
|
|
});
|
|
|
|
|
|
// =============================================
|
|
// Magnific Popup - Room Details Page Slider
|
|
// =============================================
|
|
$('.eb-image-gallery').magnificPopup({
|
|
delegate: '.swiper-slide:not(.swiper-slide-duplicate) a',
|
|
type: 'image',
|
|
fixedContentPos: true,
|
|
gallery: {
|
|
enabled: true,
|
|
preload: [0,1],
|
|
navigateByImgClick: true,
|
|
tPrev: eb_js_settings.eb_magnific_previous,
|
|
tNext: eb_js_settings.eb_magnific_next,
|
|
tCounter: '%curr%' + ' ' + eb_js_settings.eb_magnific_counter + ' ' + '%total%'
|
|
|
|
},
|
|
removalDelay: 300,
|
|
mainClass: 'mfp-fade',
|
|
retina: {
|
|
ratio: 1,
|
|
replaceSrc: function(item, ratio) {
|
|
return item.src.replace(/\.\w+$/, function(m) {
|
|
return '@2x' + m;
|
|
});
|
|
}
|
|
},
|
|
|
|
tClose: eb_js_settings.eb_magnific_close,
|
|
tLoading: eb_js_settings.eb_magnific_loading,
|
|
|
|
});
|
|
|
|
// =============================================
|
|
// Room Details Page Slider
|
|
// =============================================
|
|
var eb_room_slider_autplay = eb_js_settings.eb_room_slider_autoplay;
|
|
var eb_room_slider_loop = eb_js_settings.eb_room_slider_loop;
|
|
|
|
if ( eb_room_slider_autplay == 1 ) {
|
|
eb_room_slider_autplay = true;
|
|
} else {
|
|
eb_room_slider_autplay = false;
|
|
}
|
|
|
|
if ( eb_room_slider_loop == 1 ) {
|
|
eb_room_slider_loop = true;
|
|
} else {
|
|
eb_room_slider_loop = false;
|
|
}
|
|
|
|
if ( $('#eb-room-slider-thumbs').length ) {
|
|
|
|
var thumbsSlider = new Swiper('#eb-room-slider-thumbs', {
|
|
spaceBetween: 15,
|
|
slidesPerView: 6,
|
|
loop: eb_room_slider_loop,
|
|
freeMode: false,
|
|
loopedSlides: 5,
|
|
breakpoints: {
|
|
360: {
|
|
slidesPerView: 3,
|
|
spaceBetween: 10
|
|
},
|
|
|
|
480: {
|
|
slidesPerView: 4,
|
|
spaceBetween: 10
|
|
},
|
|
|
|
640: {
|
|
slidesPerView: 5,
|
|
spaceBetween: 10
|
|
}
|
|
},
|
|
watchSlidesVisibility: false,
|
|
watchSlidesProgress: false
|
|
});
|
|
|
|
}
|
|
|
|
if ( $('#eb-room-slider').length ) {
|
|
|
|
var mainSlider = new Swiper('#eb-room-slider', {
|
|
spaceBetween: 15,
|
|
loop: true,
|
|
preloadImages: false,
|
|
loopedSlides: 5,
|
|
navigation: {
|
|
nextEl: '.swiper-next',
|
|
prevEl: '.swiper-prev',
|
|
},
|
|
thumbs: {
|
|
swiper: thumbsSlider,
|
|
},
|
|
|
|
autoplay: eb_room_slider_autplay,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
// Check if exist first
|
|
if ( $('#eb-room-full-slider').length ) {
|
|
|
|
$('.eb-room-page').addClass('full-slider-is-used');
|
|
|
|
var fullslider = new Swiper('#eb-room-full-slider', {
|
|
spaceBetween: 20,
|
|
grabCursor: true,
|
|
slidesPerView: 4,
|
|
centeredSlides: true,
|
|
loop: true,
|
|
preloadImages: false,
|
|
loopedSlides: 5,
|
|
breakpoints: {
|
|
360: {
|
|
slidesPerView: 1,
|
|
spaceBetween: 10
|
|
},
|
|
|
|
480: {
|
|
slidesPerView: 1,
|
|
spaceBetween: 10
|
|
},
|
|
|
|
992: {
|
|
slidesPerView: 2,
|
|
spaceBetween: 10
|
|
}
|
|
},
|
|
navigation: {
|
|
nextEl: '.swiper-next',
|
|
prevEl: '.swiper-prev',
|
|
},
|
|
pagination: {
|
|
el: '.swiper-pagination',
|
|
clickable: true,
|
|
},
|
|
|
|
autoplay: eb_room_slider_autplay,
|
|
|
|
on: {
|
|
init: function () {
|
|
|
|
// // Update sticky sidebar
|
|
// if (stickysidebar.length) {
|
|
// sidebar.updateSticky();
|
|
// }
|
|
|
|
eb_update_fixed_sidebar();
|
|
|
|
}
|
|
},
|
|
|
|
|
|
});
|
|
}
|
|
|
|
// ============================================================================================
|
|
// VALIDATE HOMEPAGE & ROMM PAGE FORM / CHANGE THE OUTPUT FORMAT BASED ON THE BOOKING SYSTEM
|
|
// ============================================================================================
|
|
$("#room-booking-form, #search-form").on('submit', function (e) {
|
|
|
|
var calendar = $(this).find(".eb-datepicker");
|
|
|
|
if ( calendar.val() === '') {
|
|
|
|
e.preventDefault();
|
|
calendar.click();
|
|
|
|
} else {
|
|
|
|
var button = $(this).find('#eb_search_form');
|
|
|
|
eb_button_loading(button);
|
|
|
|
var eb_booking_type = eb_js_settings.eb_booking_type;
|
|
var eb_custom_date_format = eb_js_settings.eb_custom_date_format;
|
|
var eb_date_format = eb_js_settings.eagle_booking_date_format.toUpperCase();
|
|
var eb_output_checkin = $(this).find('.eb_checkin').val();
|
|
var eb_output_checkout = $(this).find('.eb_checkout').val();
|
|
|
|
if (eb_booking_type === 'builtin') {
|
|
|
|
// Single Room
|
|
if ( $('form').hasClass('room-booking-form') ) {
|
|
|
|
var eb_output_format = 'MM/DD/YYYY';
|
|
|
|
// Search Form
|
|
} else {
|
|
|
|
var eb_output_format = 'MM-DD-YYYY';
|
|
|
|
}
|
|
|
|
} else if (eb_booking_type === 'booking') {
|
|
|
|
var eb_output_format = 'YYYY-MM-DD';
|
|
|
|
} else if (eb_booking_type === 'airbnb') {
|
|
|
|
var eb_output_format = 'YYYY-MM-DD';
|
|
|
|
} else if (eb_booking_type === 'tripadvisor') {
|
|
|
|
var eb_output_format = 'MM-DD-YYYY';
|
|
|
|
} else if (eb_booking_type === 'custom') {
|
|
|
|
var eb_output_format = eb_custom_date_format;
|
|
|
|
}
|
|
|
|
var eb_output_checkin_formated = moment(eb_output_checkin, eb_date_format).format(eb_output_format);
|
|
var eb_output_checkout_formated = moment(eb_output_checkout, eb_date_format).format(eb_output_format);
|
|
|
|
$(this).find('.eb_checkin').val(eb_output_checkin_formated);
|
|
$(this).find('.eb_checkout').val(eb_output_checkout_formated);
|
|
|
|
}
|
|
|
|
})
|
|
|
|
// =============================================
|
|
// DATERANGEPICKER
|
|
// =============================================
|
|
var eb_calendar_min_date = new Date();
|
|
var eb_calendar_max_date = moment(eb_calendar_min_date).add(eb_js_settings.eb_calendar_availability_period, 'M').endOf('month');
|
|
var eagle_booking_date_format = eb_js_settings.eagle_booking_date_format.toUpperCase();
|
|
|
|
var eb_signle_room = false;
|
|
|
|
// Check if calendar is on single room
|
|
if ( $('form').hasClass('room-booking-form') ) {
|
|
|
|
eb_signle_room = true;
|
|
|
|
}
|
|
|
|
$(".eb-datepicker").each(function () {
|
|
|
|
var calendar = $(this),
|
|
search_form = calendar.parent().parent().parent().parent().parent().parent().find('.eb-search-form'),
|
|
position = calendar.offset(),
|
|
bottom_space = window.innerHeight - position.top,
|
|
screen_width = $(window).width();
|
|
|
|
|
|
if ( bottom_space > 500 || screen_width < 767 || $('.eb-search-form').hasClass('drops-down') ) {
|
|
|
|
var drops = 'down';
|
|
|
|
$(this).parent().parent().find('.eb-guestspicker-content, .eb-select-list').addClass('dropdown');
|
|
|
|
} else {
|
|
|
|
var drops = 'up';
|
|
|
|
$(this).parent().parent().find('.eb-guestspicker-content, .eb-select-list').addClass('up');
|
|
|
|
}
|
|
|
|
// For slideup form
|
|
if ( search_form.hasClass('eb-slide-search-form') ) var drops = 'up';
|
|
|
|
// If sidebar (eb-left-sidebar) open calendar left else open right
|
|
if ( $('.eb-sidebar').hasClass('eb-right-sidebar') ) {
|
|
|
|
var opens = 'left';
|
|
|
|
} else {
|
|
|
|
var opens = 'right';
|
|
}
|
|
|
|
$(calendar).daterangepicker({
|
|
|
|
autoUpdateInput: false,
|
|
autoApply: true,
|
|
opens: opens,
|
|
alwaysShowCalendars: true,
|
|
linkedCalendars: true,
|
|
drops: drops,
|
|
|
|
isInvalidDate: function(date) {
|
|
|
|
if ( typeof eb_booked_dates !== 'undefined' && eb_booked_dates != '' ) {
|
|
|
|
|
|
for( var i = 0; i <= eb_booked_dates.length; i++ ){
|
|
|
|
if (date.format('YYYY/MM/DD') == eb_booked_dates[i]){
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
minDate: eb_calendar_min_date,
|
|
maxDate: eb_calendar_max_date,
|
|
locale: {
|
|
format: eagle_booking_date_format,
|
|
separator: " → ",
|
|
"daysOfWeek": [
|
|
eb_js_settings.eb_calendar_sunday,
|
|
eb_js_settings.eb_calendar_monday,
|
|
eb_js_settings.eb_calendar_tuesday,
|
|
eb_js_settings.eb_calendar_wednesday,
|
|
eb_js_settings.eb_calendar_thursday,
|
|
eb_js_settings.eb_calendar_friday,
|
|
eb_js_settings.eb_calendar_saturday,
|
|
],
|
|
"monthNames": [
|
|
eb_js_settings.eb_calendar_january,
|
|
eb_js_settings.eb_calendar_february,
|
|
eb_js_settings.eb_calendar_march,
|
|
eb_js_settings.eb_calendar_april,
|
|
eb_js_settings.eb_calendar_may,
|
|
eb_js_settings.eb_calendar_june,
|
|
eb_js_settings.eb_calendar_july,
|
|
eb_js_settings.eb_calendar_august,
|
|
eb_js_settings.eb_calendar_september,
|
|
eb_js_settings.eb_calendar_october,
|
|
eb_js_settings.eb_calendar_november,
|
|
eb_js_settings.eb_calendar_december,
|
|
],
|
|
"firstDay": 1
|
|
}
|
|
}),
|
|
|
|
$(calendar).on("apply.daterangepicker", function () {
|
|
|
|
// Displayd Format
|
|
var checkin = $(calendar).data('daterangepicker').startDate.format(eagle_booking_date_format);
|
|
var checkout = $(calendar).data('daterangepicker').endDate.format(eagle_booking_date_format);
|
|
|
|
// Display Date
|
|
$(this).val(checkin + " " + " " + " → " + " " + " " + checkout);
|
|
|
|
// Add value to hidden inouts
|
|
$('.eb_checkin').val(checkin);
|
|
$('.eb_checkout').val(checkout);
|
|
|
|
// Update Booking Filters only for the search page (filters)
|
|
if ($("div").hasClass("search-filters")) {
|
|
eb_search_filters();
|
|
}
|
|
|
|
if ($("div").hasClass("search-filters") || $("div").hasClass("calendar")) {
|
|
eb_get_nights(calendar);
|
|
}
|
|
|
|
// Disable all booked & blocked room on the signle room calendar
|
|
if ( eb_signle_room == true ) {
|
|
|
|
var i, eb_booked_date;
|
|
|
|
// Loop all booked dates until the condition
|
|
for( i = 0; i < eb_booked_dates.length; i++ ) {
|
|
|
|
eb_booked_date = moment(eb_booked_dates[i]).format('YYYY/MM/DD');
|
|
|
|
var checkin_new = $(calendar).data('daterangepicker').startDate.format('YYYY-MM-DD');
|
|
var checkout_new = $(calendar).data('daterangepicker').endDate.format('YYYY-MM-DD');
|
|
|
|
if ( moment(eb_booked_date).isBetween(checkin_new, checkout_new) ) {
|
|
|
|
$(this).data('daterangepicker').setStartDate(checkout);
|
|
$(this).val("").focus();
|
|
|
|
// Break loop on the first match
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}),
|
|
|
|
// Live Booking Nights
|
|
$(calendar).on("show.daterangepicker", function () {
|
|
|
|
var live_checkin = $(this).next('.eb_checkin').val();
|
|
var live_checkout = $(this).next('.eb_checkout').val();
|
|
|
|
if ( live_checkin != '' && typeof live_checkin !== 'undefined' && live_checkout != '' && typeof live_checkout !== 'undefined' ) {
|
|
var eagle_booking_nights_div = $('<div class="booking-nights">' + live_checkin + ' ' + ' → ' + ' ' + live_checkout + ' (' + eb_get_nights(calendar) + ' ' + eb_js_settings.eb_booking_nights + ')</div>');
|
|
$(".booking-nights").remove();
|
|
$(".daterangepicker").append(eagle_booking_nights_div);
|
|
}
|
|
|
|
$(document).on('mouseenter', '.start-date', function () {
|
|
live_checkin = $(this).attr('data-date');
|
|
live_checkin = moment(live_checkin, 'MM/DD/YYYY').format(eb_js_settings.eagle_booking_date_format.toUpperCase());
|
|
$('.eb_checkin').val(live_checkin)
|
|
})
|
|
|
|
$(document).on('mouseenter', '.in-range', function () {
|
|
live_checkout = $(this).attr('data-date');
|
|
live_checkout = moment(live_checkout, 'MM/DD/YYYY').format(eb_js_settings.eagle_booking_date_format.toUpperCase());
|
|
$('.eb_checkout').val(live_checkout)
|
|
})
|
|
|
|
$(document).on('mouseenter', '.start-date, .in-range', function () {
|
|
|
|
live_checkout = $(this).attr('data-date');
|
|
live_checkout = moment(live_checkout, 'MM/DD/YYYY').format(eb_js_settings.eagle_booking_date_format.toUpperCase());
|
|
|
|
var eagle_booking_nights_div = $('<div class="booking-nights">' + live_checkin + ' ' + ' → ' + ' ' + live_checkout + ' (' + eb_get_nights(calendar) + ' ' + eb_js_settings.eb_booking_nights + ')</div>');
|
|
$(".booking-nights").remove();
|
|
$(".daterangepicker").append(eagle_booking_nights_div);
|
|
})
|
|
|
|
});
|
|
|
|
})
|
|
|
|
// Close Full Screen Calendar
|
|
var calendar_close = $('<span class="eb-close-calendar"><i class="icon-close"></i></span>');
|
|
|
|
$('.daterangepicker').prepend(calendar_close);
|
|
|
|
$( '.eb-close-calendar' ).on('click', function (event) {
|
|
|
|
$(this).closest('.daterangepicker').find('.cancelBtn').click();
|
|
|
|
})
|
|
|
|
|
|
// =============================================
|
|
// CALCULATE NIGHTS NUMBER
|
|
// =============================================
|
|
function eb_get_nights( calendar ) {
|
|
|
|
var eagle_booking_checkin = $(calendar).parent().find('.eb_checkin').val();
|
|
var eagle_booking_checkout = $(calendar).parent().find('.eb_checkout').val();
|
|
|
|
var eagle_booking_start_date = moment(eagle_booking_checkin, eb_js_settings.eagle_booking_date_format.toUpperCase()).format('YYYY-MM-DD');;
|
|
var eagle_booking_end_date = moment(eagle_booking_checkout, eb_js_settings.eagle_booking_date_format.toUpperCase()).format('YYYY-MM-DD');;
|
|
|
|
var booking_nights = (new Date(eagle_booking_end_date)) - (new Date(eagle_booking_start_date));
|
|
var eagle_booking_nights_number = booking_nights / (1000 * 60 * 60 * 24);
|
|
if (eagle_booking_nights_number < 0) {
|
|
var eagle_booking_nights_number = '0';
|
|
}
|
|
|
|
return eagle_booking_nights_number;
|
|
|
|
}
|
|
|
|
// =============================================
|
|
// Guests Picker
|
|
// =============================================
|
|
$('.eb-guestspicker').on('click', function (event) {
|
|
|
|
$(this).addClass('active');
|
|
|
|
$(this).find('.eb-select-list').removeClass('active');
|
|
|
|
event.preventDefault();
|
|
|
|
// Close brach selector
|
|
$('.eb-select-list').removeClass('active');
|
|
|
|
});
|
|
|
|
// Close Guest Picker
|
|
$(window).click(function () {
|
|
$('.eb-guestspicker').removeClass('active');
|
|
});
|
|
|
|
$('.eb-guestspicker').on('click', function (event) {
|
|
event.stopPropagation();
|
|
});
|
|
|
|
function guestsSum( current ) {
|
|
|
|
var arr = $(current).closest('.eb-guestspicker').find('.booking-guests');
|
|
|
|
var guests = 0;
|
|
|
|
for (var i = 0; i < arr.length; i++) {
|
|
if (parseInt(arr[i].value, 10))
|
|
guests += parseInt(arr[i].value, 10);
|
|
}
|
|
|
|
if ( guests > 0 ) {
|
|
|
|
$(current).closest('.eb-guestspicker').find('.gueststotal').text(guests);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function guestsPicker() {
|
|
|
|
$(".eb-guestspicker .plus, .eb-guestspicker .minus").on("click", function (event) {
|
|
|
|
// Get the max value from data-max
|
|
var oldValue = $(this).parent().find("input").val();
|
|
|
|
var max_value = parseFloat($(this).parent().find("input").data('max'));
|
|
var min_value = parseFloat($(this).parent().find("input").data('min'));
|
|
|
|
if ( $(this).hasClass('plus') && max_value > 0 ) {
|
|
|
|
if (oldValue < max_value) {
|
|
|
|
var newVal = parseFloat(oldValue) + 1;
|
|
|
|
} else {
|
|
|
|
newVal = oldValue;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (oldValue > min_value) {
|
|
var newVal = parseFloat(oldValue) - 1;
|
|
} else {
|
|
newVal = min_value;
|
|
}
|
|
|
|
}
|
|
|
|
$(this).parent().find("input").val(newVal);
|
|
|
|
// Get guests sum
|
|
guestsSum( $(this) );
|
|
|
|
// Search Page
|
|
if ( $('form').hasClass('booking-search-form') ) {
|
|
|
|
// Refresh filters
|
|
eb_search_filters();
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
// Execute
|
|
guestsPicker();
|
|
|
|
// =============================================
|
|
// Styled Radio Box
|
|
// =============================================
|
|
$('.eb-radio-box').on('click', function() {
|
|
|
|
// Remove any previous selected option & reset the previous checked radiobox
|
|
$('.eb-radio-box').removeClass('selected');
|
|
$('.eb-radio-box').find('input').prop('checked', false);
|
|
|
|
// Add selected class to this & check it
|
|
$(this).addClass('selected');
|
|
$(this).find('input').prop('checked', true);
|
|
|
|
});
|
|
|
|
// =============================================
|
|
// Branches Selector
|
|
// =============================================
|
|
$('.eb-select').on('click', function (event) {
|
|
|
|
$(this).find('.eb-select-list').toggleClass('active');
|
|
$('.eb-search-form').find('.eb-field').removeClass('active');
|
|
|
|
event.stopPropagation();
|
|
|
|
});
|
|
|
|
$(window).click(function () {
|
|
$('.eb-select-list').removeClass('active');
|
|
});
|
|
|
|
$('.eb-select-list li').on('click', function (event) {
|
|
|
|
// Remove any previous
|
|
$('.eb-select-list li').removeClass('selected');
|
|
$(this).toggleClass('selected');
|
|
|
|
var selected_branch = $('.eb-select-list li.selected').text();
|
|
var selected_branch_id = $('.eb-select-list li.selected').data('branch-id');
|
|
|
|
$(this).parent().parent().find('#branch_text').text(selected_branch);
|
|
$(this).parent().parent().find('#eb_branch').val( selected_branch_id );
|
|
|
|
});
|
|
|
|
// =============================================
|
|
// EB Dropdown
|
|
// =============================================
|
|
$('.eb-dropdown-toggle').on('click', function(event) {
|
|
event.stopPropagation();
|
|
$(this).next('.eb-dropdown-menu').toggleClass('open');
|
|
});
|
|
|
|
$(window).click(function() {
|
|
$('.eb-dropdown-menu').removeClass('open');
|
|
});
|
|
|
|
// =============================================
|
|
// Button Loading Effect on search page
|
|
// =============================================
|
|
$('body').on('click', '.eb-proceed-btn', function(event) {
|
|
eb_button_loading(this);
|
|
});
|
|
|
|
// EB Forms
|
|
/* Add 'active' class on keydown
|
|
------------------------------------- */
|
|
function checkForInput(element) {
|
|
|
|
var label = $(element).siblings('label');
|
|
if ( $(element).val().length > 0 ) {
|
|
|
|
label.addClass('input-has-value');
|
|
|
|
} else {
|
|
|
|
label.removeClass('input-has-value');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// The lines below are executed on page load
|
|
$('.eb-form-col input, #eb_guest_phone').each(function() {
|
|
checkForInput(this);
|
|
});
|
|
|
|
$('.eb-form-col input, #eb_guest_phone').on('change keydown focus', function() {
|
|
checkForInput(this);
|
|
});
|
|
|
|
// =============================================
|
|
// Room Breakpoint
|
|
// =============================================
|
|
$(document).on('click', '.toggle-room-breakpoint', function () {
|
|
|
|
$(this).closest('.room-list-item').addClass('open');
|
|
$(this).closest('.room-list-item').find('.room-quick-details').toggleClass('open');
|
|
|
|
$(this).closest('.room-list-item').find('.room-quick-details').toggleClass(function(){
|
|
return $(this).is('.slideup, .slidedown') ? 'slideup slidedown' : 'slideup';
|
|
})
|
|
|
|
$(this).toggleClass('open');
|
|
$(this).find('i').toggleClass('fa-angle-down fa-angle-up');
|
|
});
|
|
|
|
// =============================================
|
|
// SlideUp Search Form
|
|
// =============================================
|
|
if ( eb_js_settings.eb_slide_up_search_form == true ) {
|
|
|
|
$('.eb-slide-search-form').find('.eb-guestspicker-content').addClass('up');
|
|
|
|
var amountScrolled = 1200;
|
|
var slide_form_btn = $('.eb-popup-search-form-btn');
|
|
var slide_form = $('.eb-slide-search-form');
|
|
var slide_form_text = slide_form_btn.find('.btn-text');
|
|
|
|
$(window).on('scroll', function() {
|
|
|
|
var scroll = $(window).scrollTop() + $(window).height();
|
|
var anchorPoint = $("footer").offset().top;
|
|
|
|
if ( $(window).scrollTop() > amountScrolled && scroll < anchorPoint ) {
|
|
|
|
// If open on scroll, or on mobile (< 768 px ), is enabled then show the close button/icon
|
|
if ( eb_js_settings.eb_slide_up_search_form_style === 'onscroll' ) {
|
|
|
|
// Show the form after amountscrolled
|
|
slide_form.addClass('open');
|
|
|
|
// If open on click is enabled then don't show the form and show the open button/icon
|
|
} else {
|
|
|
|
slide_form_btn.addClass('active');
|
|
// show the open button
|
|
slide_form_text.css('display','block');
|
|
}
|
|
|
|
} else {
|
|
|
|
slide_form_btn.removeClass('active');
|
|
|
|
slide_form.removeClass('open');
|
|
|
|
// on form slide down reset btn
|
|
slide_form_btn.find('i').toggleClass('icon-close icon-calendar');
|
|
|
|
slide_form_text.css('display','none');
|
|
|
|
}
|
|
|
|
});
|
|
|
|
$('.eb-popup-search-form-btn').on('click', '', function () {
|
|
|
|
$(this).toggleClass('open');
|
|
var btn = $(this).find('i');
|
|
|
|
btn.toggleClass('icon-calendar icon-close');
|
|
|
|
$('.eb-slide-search-form').toggleClass('open');
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
// console.log('the slide up search form is not enabled');
|
|
|
|
}
|
|
|
|
});
|
|
|
|
// =============================================
|
|
// Rooms
|
|
// =============================================
|
|
function eb_room_info() {
|
|
|
|
$(".room-item").each(function () {
|
|
|
|
var room_width = $(this).width();
|
|
|
|
if ( room_width < 350 ) {
|
|
|
|
$(this).addClass('small-item');
|
|
|
|
} else {
|
|
|
|
$(this).removeClass('small-item');
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
eb_room_info();
|
|
|
|
$(window).resize(function() {
|
|
|
|
eb_room_info();
|
|
|
|
})
|
|
|
|
// =============================================
|
|
// Availability Calendar
|
|
// =============================================
|
|
var pluginName = "simpleCalendar",
|
|
defaults = {
|
|
days: [
|
|
eb_js_settings.eb_calendar_sunday,
|
|
eb_js_settings.eb_calendar_monday,
|
|
eb_js_settings.eb_calendar_tuesday,
|
|
eb_js_settings.eb_calendar_wednesday,
|
|
eb_js_settings.eb_calendar_thursday,
|
|
eb_js_settings.eb_calendar_friday,
|
|
eb_js_settings.eb_calendar_saturday,
|
|
],
|
|
months: [
|
|
eb_js_settings.eb_calendar_january,
|
|
eb_js_settings.eb_calendar_february,
|
|
eb_js_settings.eb_calendar_march,
|
|
eb_js_settings.eb_calendar_april,
|
|
eb_js_settings.eb_calendar_may,
|
|
eb_js_settings.eb_calendar_june,
|
|
eb_js_settings.eb_calendar_july,
|
|
eb_js_settings.eb_calendar_august,
|
|
eb_js_settings.eb_calendar_september,
|
|
eb_js_settings.eb_calendar_october,
|
|
eb_js_settings.eb_calendar_november,
|
|
eb_js_settings.eb_calendar_december,
|
|
],
|
|
minDate: "YYYY/MM/DD",
|
|
maxDate: "YYYY/MM/DD",
|
|
insertEvent: true,
|
|
displayEvent: true,
|
|
fixedStartDay: true,
|
|
events: [],
|
|
insertCallback: function () {}
|
|
};
|
|
|
|
// The actual plugin constructor
|
|
function Plugin(element, options) {
|
|
this.element = element;
|
|
this.settings = $.extend({}, defaults, options);
|
|
this._defaults = defaults;
|
|
this._name = pluginName;
|
|
this.currentDate = new Date();
|
|
this.events = options.events;
|
|
this.init();
|
|
}
|
|
|
|
// Avoid Plugin.prototype conflicts
|
|
$.extend(Plugin.prototype, {
|
|
init: function () {
|
|
var container = $(this.element);
|
|
var todayDate = this.currentDate;
|
|
var events = this.events;
|
|
var calendar = $('<div class="availability-calendar"></div>');
|
|
var header = $('<div class="availability-calendar-header">' +
|
|
'<span class="btn-prev"><i class="fa fa-chevron-left" aria-hidden="true"></i></span>' +
|
|
'<span class="month"></span>' +
|
|
'<span class="btn-next"><i class="fa fa-chevron-right" aria-hidden="true"></i></span>' +
|
|
'</div class="availability-calendar-header">');
|
|
|
|
this.updateHeader(todayDate, header);
|
|
calendar.append(header);
|
|
this.buildCalendar(todayDate, calendar);
|
|
container.append(calendar);
|
|
this.bindEvents();
|
|
},
|
|
|
|
// Update the current month & year header
|
|
updateHeader: function (date, header) {
|
|
header.find('.month').html(this.settings.months[date.getMonth()] + ' ' + date.getFullYear());
|
|
},
|
|
|
|
//Build calendar of a month from date
|
|
buildCalendar: function (fromDate, calendar) {
|
|
var plugin = this;
|
|
|
|
calendar.find('table').remove();
|
|
|
|
var body = $('<table class="calendar"></table>');
|
|
var thead = $('<thead></thead>');
|
|
var tbody = $('<tbody></tbody>');
|
|
|
|
//Header day in a week ( (1 to 8) % 7 to start the week by monday)
|
|
for (var i = 1; i <= this.settings.days.length; i++) {
|
|
thead.append($('<td class="day-name">' + this.settings.days[i % 7].substring(0, 3) + '</td>'));
|
|
}
|
|
|
|
//setting current year and month
|
|
var y = fromDate.getFullYear(),
|
|
m = fromDate.getMonth();
|
|
|
|
//first day of the month
|
|
var firstDay = new Date(y, m, 1);
|
|
//If not monday set to previous monday
|
|
while (firstDay.getDay() != 1) {
|
|
firstDay.setDate(firstDay.getDate() - 1);
|
|
}
|
|
//last day of the month
|
|
var lastDay = new Date(y, m + 1, 0);
|
|
//If not sunday set to next sunday
|
|
while (lastDay.getDay() != 0) {
|
|
lastDay.setDate(lastDay.getDate() + 1);
|
|
}
|
|
|
|
for (var day = firstDay; day <= lastDay; day.setDate(day.getDate())) {
|
|
var tr = $('<tr></tr>');
|
|
//For each row
|
|
for (var i = 0; i < 7; i++) {
|
|
|
|
// var td = $('<td><span class="day">' + day.getDate() + '<span class="room-price">12$</span>' + '</span></td>');
|
|
var td = $('<td><span class="day"><span class="number">' + day.getDate() + '</span></span></td>');
|
|
//if today is this day
|
|
|
|
var ymd = day.getFullYear() + '-' + day.getMonth() + '-' + day.getDay();
|
|
var ymd = this.formatToYYYYMMDD(day);
|
|
// console.log(ymd);
|
|
|
|
if ($.inArray(this.formatToYYYYMMDD(day), plugin.events) !== -1) {
|
|
|
|
// console.log('found');
|
|
td.find(".day").addClass("event");
|
|
|
|
}
|
|
|
|
// if ( $.inArray( this.formatToYYYYMMDD(day), plugin.events ) == 0) {
|
|
|
|
// td.find(".day").addClass("semi-available");
|
|
|
|
// }
|
|
|
|
//if day is previous day
|
|
if (day < (new Date())) {
|
|
td.find(".day").addClass("wrong-day");
|
|
}
|
|
|
|
if (day.toDateString() === (new Date).toDateString()) {
|
|
td.find(".day").addClass("today");
|
|
td.find(".day").removeClass("wrong-day");
|
|
}
|
|
//if day is not in this month
|
|
if (day.getMonth() != fromDate.getMonth()) {
|
|
td.find(".day").addClass("wrong-month");
|
|
}
|
|
|
|
//Binding day event
|
|
td.on('click', function (e) {
|
|
});
|
|
|
|
tr.append(td);
|
|
day.setDate(day.getDate() + 1);
|
|
}
|
|
tbody.append(tr);
|
|
}
|
|
|
|
body.append(thead);
|
|
body.append(tbody);
|
|
|
|
var eventContainer = $('<div class="event-container"></div>');
|
|
|
|
calendar.append(body);
|
|
calendar.append(eventContainer);
|
|
},
|
|
|
|
// Init global events listeners
|
|
bindEvents: function () {
|
|
var eb_end_period = eb_js_settings.eb_calendar_availability_period;
|
|
var plugin = this;
|
|
var container = $(this.element);
|
|
var counter = '';
|
|
var startMoth = plugin.currentDate.getMonth();
|
|
var endMonth = startMoth + (eb_end_period - 0);
|
|
var currentMonth = startMoth;
|
|
|
|
|
|
// Click previous month
|
|
container.find('.btn-prev').on('click', function () {
|
|
if (currentMonth > startMoth) {
|
|
plugin.currentDate.setMonth(plugin.currentDate.getMonth() - 1);
|
|
plugin.buildCalendar(plugin.currentDate, container.find('.availability-calendar'));
|
|
plugin.updateHeader(plugin.currentDate, container.find('.availability-calendar .availability-calendar-header'));
|
|
|
|
currentMonth--;
|
|
}
|
|
|
|
});
|
|
|
|
// Click next month
|
|
container.find('.btn-next').on('click', function () {
|
|
if (currentMonth < endMonth) {
|
|
plugin.currentDate.setMonth(plugin.currentDate.getMonth() + 1);
|
|
plugin.buildCalendar(plugin.currentDate, container.find('.availability-calendar'));
|
|
plugin.updateHeader(plugin.currentDate, container.find('.availability-calendar .availability-calendar-header'));
|
|
|
|
currentMonth++;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
},
|
|
|
|
formatToYYYYMMDD: function (date) {
|
|
var d = new Date(date),
|
|
month = '' + (d.getMonth() + 1),
|
|
day = '' + d.getDate(),
|
|
year = d.getFullYear();
|
|
|
|
if (month.length < 2) month = '0' + month;
|
|
if (day.length < 2) day = '0' + day;
|
|
|
|
return [year, month, day].join('/');
|
|
}
|
|
|
|
});
|
|
|
|
// preventing against multiple instantiations
|
|
$.fn[pluginName] = function (options) {
|
|
return this.each(function () {
|
|
if (!$.data(this, "plugin_" + pluginName)) {
|
|
$.data(this, "plugin_" + pluginName, new Plugin(this, options));
|
|
}
|
|
});
|
|
};
|
|
|
|
})(jQuery); |