(function($){
"use strict";
$(document).ready(function(){
var inputClicked=false;
if(typeof listeo!=='undefined'&&listeo.breakdown_collapsed){
$('.booking-estimated-cost').addClass('listeo-breakdown-collapsed')
.find('.listeo-breakdown-details').hide();
}
$(document).on('click', '.listeo-breakdown-toggle', function(){
var $wrap=$(this).closest('.booking-estimated-cost');
$wrap.toggleClass('listeo-breakdown-collapsed');
$wrap.find('.listeo-breakdown-details').slideToggle(150);
});
$("a.booking-confirmation-btn").on("click", function (e){
e.preventDefault();
var bookingForm=$("#booking-confirmation");
if(bookingForm[0].checkValidity()){
var button=$(this);
button.addClass("loading");
$("#booking-confirmation").submit();
}else{
bookingForm[0].reportValidity();
}});
function loadStatesForCountry(country){
if(!country){
return;
}
$.ajax({
url: listeo.ajaxurl,
type: "POST",
data: {
action: "listeo_get_booking_states",
country: country,
nonce: listeoBookings.states_nonce,
},
success: function (response){
if(response.success&&response.data){
var states=response.data;
var stateField=$('[name="billing_state"]');
if(Object.keys(states).length > 0){
var selectHtml='<select name="billing_state" id="billing_state" class="address-field" required>';
selectHtml +='<option value="">' + listeoBookings.select_state_text + '</option>';
$.each(states, function (code, name){
selectHtml +='<option value="' + code + '">' + name + '</option>';
});
selectHtml +='</select>';
stateField.replaceWith(selectHtml);
}else{
var inputHtml='<input type="text" name="billing_state" id="billing_state" class="input-text" value="" placeholder="' + listeoBookings.state_placeholder + '">';
stateField.replaceWith(inputHtml);
}}
},
});
}
$("#billing_country").change(function (){
loadStatesForCountry($(this).val());
});
$(document).ready(function (){
var countryField=$("#billing_country");
if(countryField.length > 0){
var country=countryField.val();
if(country&&$('[name="billing_state"]').is('input[type="text"]')){
loadStatesForCountry(country);
}}
});
$(document).bind("change", function (e){
if(e.target.checkValidity&&!e.target.checkValidity()){
$(e.target).parent().addClass("invalid");
}else{
$(e.target).parent().removeClass("invalid");
}});
$("#listeo-coupon-link").on("click", function (e){
e.preventDefault();
$(".coupon-form").toggle();
});
var lastBookingBreakdown=null;
function renderBookingBreakdown(breakdown){
var $list=$("#booking-price-breakdown");
if(!$list.length) return;
var visibleLines=(breakdown&&breakdown.lines) ? breakdown.lines.filter(function (line){
var amt=parseFloat(line.amount);
return line.is_discount||isNaN(amt)||Math.abs(amt) >=0.005;
}):[];
var hasCoupon = !!(breakdown&&breakdown.coupon&&breakdown.coupon.amount_formatted);
lastBookingBreakdown=(visibleLines.length||hasCoupon) ? breakdown:null;
if(!visibleLines.length&&!hasCoupon){
$list.hide();
return;
}
$("#booking-mandatory-fees").hide();
var html="";
visibleLines.forEach(function (line){
var keyClass=line.key ? " booking-breakdown-line--" + line.key:"";
var discountClass=line.is_discount ? " booking-breakdown-line--discount":"";
var sublabel=line.sublabel
? '<span class="booking-breakdown-line-sublabel">' + escapeHtml(line.sublabel) + "</span>"
: "";
html +=
'<li class="booking-breakdown-line' + keyClass + discountClass + '">' +
'<div class="booking-breakdown-line-text">' +
'<span class="booking-breakdown-line-label">' + escapeHtml(line.label||"") + "</span>" +
sublabel +
"</div>" +
'<span class="booking-breakdown-line-amount">' + (line.amount_formatted||"") + "</span>" +
"</li>";
});
if(breakdown.coupon&&breakdown.coupon.amount_formatted){
html +=
'<li class="booking-breakdown-line booking-breakdown-line--coupon booking-breakdown-line--discount">' +
'<div class="booking-breakdown-line-text">' +
'<span class="booking-breakdown-line-label">' + escapeHtml(breakdown.coupon.label||"Coupon") + "</span>" +
"</div>" +
'<span class="booking-breakdown-line-amount">' + (breakdown.coupon.amount_formatted||"") + "</span>" +
"</li>";
}
$list.html(html).show();
}
function escapeHtml(str){
if(str===null||typeof str==="undefined") return "";
return String(str)
.replace(/&/g, "&amp;")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;")
.replace(/"/g, "&quot;")
.replace(/'/g, "&#039;");
}
(function (){
if(!$("#booking-mandatory-fees").length) return;
function formatPrice(value){
var decimals =
(typeof listeoBookings!=="undefined"&&listeoBookings.number_decimals)||2;
return Number(value).toFixed(decimals);
}
function findTotalNode(){
var $step2=$("li.total-costs[data-price]");
if($step2.length){
return { $el: $step2, $span: $step2.find("span").first() };}
var $step1=$(".listeo-widget-total-cost[data-price]");
if($step1.length){
return { $el: $step1, $span: $step1 };}
return null;
}
function getOptionalAmounts(){
var unchecked=0;
$("#booking-mandatory-fees")
.find(".listeo-fee-row-optional input.listeo-optional-fee-checkbox")
.each(function (){
if(!$(this).is(":checked")){
var $row=$(this).closest(".listeo-fee-row");
var amt=parseFloat($row.attr("data-fee-amount"));
if(!isNaN(amt)) unchecked +=amt;
}});
return unchecked;
}
function updateTotal(){
var target=findTotalNode();
if(!target) return;
var basePrice=parseFloat(target.$el.attr("data-price"));
if(isNaN(basePrice)) return;
var newTotal=basePrice - getOptionalAmounts();
target.$span.text(function (_, current){
var prefix=current.match(/^\s*\D+/);
var suffix=current.match(/\D+\s*$/);
var left=prefix ? prefix[0]:"";
var right=suffix ? suffix[0]:"";
return left + formatPrice(newTotal) + (left ? "":right);
});
}
$(document).on("change", ".listeo-optional-fee-checkbox", function (){
var $row=$(this).closest(".listeo-fee-row");
$row.toggleClass("listeo-fee-row-disabled", !this.checked);
updateTotal();
});
})();
function validate_coupon(listing_id, price){
var current_codes=$("#coupon_code").val();
if(current_codes){
var codes=current_codes.split(",");
$.each(codes, function (index, item){
console.log(item);
var ajax_data={
listing_id: listing_id,
coupon: item,
coupons: codes,
price: price,
action: "listeo_validate_coupon",
nonce: listeo.coupon_nonce,
};
$.ajax({
type: "POST",
dataType: "json",
url: listeo.ajaxurl,
data: ajax_data,
success: function (data){
if(data.success){
}else{
$("#coupon-widget-wrapper-output div.error")
.html(data.message)
.show();
$(
'#coupon-widget-wrapper-applied-coupons span[data-coupon="' +
item +
'"] i'
).trigger("click");
$("#apply_new_coupon").val("");
$("#coupon-widget-wrapper-output .error").delay(3500).hide(500);
}
$("a.listeo-booking-widget-apply_new_coupon").removeClass("active");
},
});
});
}}
$("a.listeo-booking-widget-apply_new_coupon").on("click", function (e){
e.preventDefault();
$(this).addClass("active");
$("#coupon-widget-wrapper-output div").hide();
var price=$(".booking-estimated-cost").data("price");
if(typeof price==="undefined"||price===null){
price=$(".total-costs").data("price");
}
var current_codes=$("#coupon_code").val();
var result=current_codes.split(",");
var arraycontainscoupon=result.indexOf($("#apply_new_coupon").val()) > -1;
var ajax_data={
listing_id: $("#listing_id").val(),
coupon: $("#apply_new_coupon").val(),
coupons: current_codes,
price: price,
action: "listeo_validate_coupon",
nonce: listeo.coupon_nonce,
};
$("#coupon-widget-wrapper-output div").hide();
if(arraycontainscoupon){
$(this).removeClass("active");
$("input#apply_new_coupon").removeClass("bounce").addClass("bounce");
return;
}
$.ajax({
type: "POST",
dataType: "json",
url: listeo.ajaxurl,
data: ajax_data,
success: function (data){
if(data.success){
if(current_codes.length > 0){
$("#coupon_code").val(current_codes + "," + data.coupon);
}else{
$("#coupon_code").val(data.coupon);
}
$("#apply_new_coupon").val("");
$("#coupon-widget-wrapper-applied-coupons").append("<span data-coupon=" +
data.coupon +
">" +
data.coupon +
"<i class='fa fa-times'></i></span>"
);
$("#coupon-widget-wrapper-output .success").show();
if($("#booking-confirmation-summary").length > 0){
calculate_booking_form_price();
}else{
if($("#form-booking").hasClass("form-booking-tickets")){
calculate_price();
}else{
check_booking();
}}
$("#coupon-widget-wrapper-output .success").delay(3500).hide(500);
}else{
$("input#apply_new_coupon").removeClass("bounce").addClass("bounce");
$("#coupon-widget-wrapper-output div.error")
.html(data.message)
.show();
$("#apply_new_coupon").val("");
$("#coupon-widget-wrapper-output .error").delay(3500).hide(500);
}
$("a.listeo-booking-widget-apply_new_coupon").removeClass("active");
},
});
});
$("#coupon-widget-wrapper-applied-coupons").on("click",
"span i",
function (e){
var coupon=$(this).parent().data("coupon");
var coupons=$("#coupon_code").val();
var coupons_array=coupons.split(",");
coupons_array=coupons_array.filter(function (item){
return item!==coupon;
});
$("#coupon_code").val(coupons_array.join(","));
$(this).parent().remove();
if($("#booking-confirmation-summary").length > 0){
calculate_booking_form_price();
}else{
check_booking();
calculate_price();
}}
);
var _eventDateFormats=["DD.MM.YYYY HH:mm", "DD/MM/YYYY HH:mm", "MM/DD/YYYY HH:mm", "YYYY-MM-DD HH:mm:ss", "DD.MM.YYYY", "DD/MM/YYYY", "MM/DD/YYYY", "YYYY-MM-DD", "DD-MM-YYYY"];
function listeo_resolve_event_date(){
var $span=$(".booking-event-date span");
var result;
if($span.length&&$span.attr("data-date-iso")){
result=$span.attr("data-date-iso");
if(result&&/^\d{4}-\d{2}-\d{2}/.test(result)) return result.substring(0, 10);
}
if($span.length&&$span.text().trim()){
var text=$span.text().trim();
var wpFormat=(typeof wordpress_date_format!=="undefined"&&wordpress_date_format.date) ? wordpress_date_format.date:null;
if(wpFormat){
var m=moment(text, wpFormat);
if(m.isValid()) return m.format("YYYY-MM-DD");
}
for (var i=0; i < _eventDateFormats.length; i++){
var m2=moment(text, _eventDateFormats[i], true);
if(m2.isValid()) return m2.format("YYYY-MM-DD");
}}
var pickerVal=$("#date-picker").val();
if(pickerVal){
for (var j=0; j < _eventDateFormats.length; j++){
var m3=moment(pickerVal, _eventDateFormats[j], true);
if(m3.isValid()) return m3.format("YYYY-MM-DD");
}}
return null;
}
window._listeo_booking_submitted=false;
window._listeo_widget_user_action=false;
$(".listing-widget").on("click", "a.book-now", function (e){
var button=$(this);
e.preventDefault();
window._listeo_widget_user_action=true;
$(".booking-error-message").stop(true, true).hide();
var missingMsg="";
var _bookingType=$("#listing_type").val();
var _isEventType=_bookingType==="tickets"||_bookingType==="event";
if(!_isEventType&&!$("#date-picker").val()){
inputClicked=false;
missingMsg=listeo_core.select_date_first;
}else{
inputClicked=true;
if($(".time-picker").length&&!$(".time-picker").val()){
inputClicked=false;
missingMsg=listeo_core.select_time_first;
}
if($("#slot").length&&!$("#slot").val()){
inputClicked=false;
missingMsg=listeo_core.select_slot_first;
}
if(inputClicked){
check_booking();
}}
if(inputClicked==false){
if(missingMsg){
$(".booking-error-message").html(missingMsg).fadeIn();
}
$(
".time-picker,.time-slots-dropdown,.date-picker-listing-date_range"
).addClass("bounce");
setTimeout(function (){
$(
".time-picker,.time-slots-dropdown,.date-picker-listing-date_range"
).removeClass("bounce");
}, 3000);
return false;
}
button.addClass("loading");
var freeplaces=button.data("freeplaces");
setTimeout(function (){
button.removeClass("loading");
$(
".time-picker,.time-slots-dropdown,.date-picker-listing-date_range"
).removeClass("bounce");
}, 3000);
try {
var adults=parseInt($(".adults").val())||0;
var children=parseInt($("input[name=childrenQtyInput]").val())||0;
var infants=parseInt($("input[name=infantsQtyInput]").val())||0;
var animals=parseInt($("input[name=animalsQtyInput]").val())||0;
var maxGuests=parseInt($(".adults").data("max"));
var totalCountingGuests=adults + children;
if(totalCountingGuests > maxGuests){
$(".booking-error-message").html(listeo_core.exceed_guests_limit).fadeIn();
return false;
}
if(freeplaces > 0){
if($("#date-picker").data("rental-timepicker")){
var timeFormat=is24Hour ? "HH:mm":"hh:mm A";
var startDataSql=moment(
$("#date-picker").data("daterangepicker").startDate,
["MM/DD/YYYY " + timeFormat]
).format("YYYY-MM-DD HH:mm:ss");
var endDataSql=moment(
$("#date-picker").data("daterangepicker").endDate,
["MM/DD/YYYY " + timeFormat]
).format("YYYY-MM-DD HH:mm:ss");
}else{
var startDataSql=moment(
$("#date-picker").data("daterangepicker").startDate,
["MM/DD/YYYY"]
).format("YYYY-MM-DD");
var endDataSql=moment(
$("#date-picker").data("daterangepicker").endDate,
["MM/DD/YYYY"]
).format("YYYY-MM-DD");
}
var ajax_data={
listing_type: $("#listing_type").val(),
listing_id: $("#listing_id").val(),
};
var invalid=false;
if(startDataSql) ajax_data.date_start=startDataSql;
if(endDataSql) ajax_data.date_end=endDataSql;
if($("input#slot").val()) ajax_data.slot=$("input#slot").val();
if($(".time-picker#_hour").val())
ajax_data._hour=$(".time-picker#_hour").val();
if($(".time-picker#_hour_end").val())
ajax_data._hour_end=$(".time-picker#_hour_end").val();
if($(".adults").val()) ajax_data.adults=$(".adults").val();
if($("input[name=childrenQtyInput]").val()) ajax_data.children=$("input[name=childrenQtyInput]").val();
if($("input[name=infantsQtyInput]").val()) ajax_data.infants=$("input[name=infantsQtyInput]").val();
if($("input[name=animalsQtyInput]").val()) ajax_data.animals=$("input[name=animalsQtyInput]").val();
if($("#tickets").val()) ajax_data.tickets=$("#tickets").val();
if($("#coupon_code").val()) ajax_data.coupon=$("#coupon_code").val();
var listing_type=$("#listing_type").val();
var type_config=listeo_core.listing_types_config&&listeo_core.listing_types_config[listing_type];
var supports_time_slots=type_config ? type_config.supports_time_slots:(listing_type=="single_day");
if(supports_time_slots){
if($("input#slot").val()==undefined ||
$("input#slot").val()==""
){
inputClicked=false;
invalid=true;
}
if($(".time-picker").length){
invalid=false;
}}
if(invalid==false){
var services=[];
$.each($("input.bookable-service-checkbox:checked"), function (){
var quantity=$(this)
.parent()
.find("input.bookable-service-quantity")
.val();
services.push({ service: $(this).val(), value: quantity });
});
ajax_data.services=services;
if(lastBookingBreakdown) ajax_data.breakdown=lastBookingBreakdown;
$("input#booking").val(JSON.stringify(ajax_data));
$("#form-booking").submit();
}}
} catch (e){
console.log(e);
}
var listing_type=$("#listing_type").val();
var type_config=listeo_core.listing_types_config&&listeo_core.listing_types_config[listing_type];
var is_event_type=type_config ? !type_config.supports_time_slots:(listing_type=="event"||listing_type=="tickets");
if(is_event_type&&!window._listeo_booking_submitted){
var eventDateParsed=listeo_resolve_event_date();
if(!eventDateParsed){
alert(listeo_core.dateParseError||"Could not determine event date. Please contact support.");
return;
}
var ajax_data={
listing_type: listing_type,
listing_id: $("input#listing_id").val(),
date_start: eventDateParsed,
date_end: eventDateParsed,
};
if($("#coupon_code").val()) ajax_data.coupon=$("#coupon_code").val();
var services=[];
$.each($("input.bookable-service-checkbox:checked"), function (){
var quantity=$(this)
.parent()
.find("input.bookable-service-quantity")
.val();
services.push({ service: $(this).val(), value: quantity });
});
ajax_data.services=services;
if(lastBookingBreakdown) ajax_data.breakdown=lastBookingBreakdown;
if($("#tickets").val()) ajax_data.tickets=$("#tickets").val();
$("input#booking").val(JSON.stringify(ajax_data));
$("#form-booking").submit();
}});
if(Boolean(listeo_core.clockformat)){
var dateformat_even=wordpress_date_format.date + " HH:mm";
}else{
var dateformat_even=wordpress_date_format.date + " hh:mm A";
}
function updateCounter(){
var len=$(".bookable-services input[type='checkbox']:checked").length;
if(len > 0){
$(".booking-services span.services-counter").text("" + len + "");
$(".booking-services span.services-counter").addClass("counter-visible");
}else{
$(".booking-services span.services-counter").removeClass("counter-visible"
);
$(".booking-services span.services-counter").text("0");
}}
$(".single-service").on("click", function (){
updateCounter();
$(".booking-services span.services-counter").addClass("rotate-x");
setTimeout(function (){
$(".booking-services span.services-counter").removeClass("rotate-x");
}, 300);
});
function listeoBkListingId(){
return $("#listing_id").val()||$("#form-booking").data("post_id")||"";
}
function listeoBkKey(name){
return "listeo_bk_" + name + "_" + listeoBkListingId();
}
function listeoBkSave(){
if(!listeoBkListingId()||typeof Cookies==="undefined"){
return;
}
var slot=$("#slot").length ? ($("#slot").val()||""):"";
if(slot){
Cookies.set(listeoBkKey("slot"), slot, { expires: 1 });
}else{
Cookies.remove(listeoBkKey("slot"));
}
var svc=[];
$("input.bookable-service-checkbox:checked").each(function (){
var $cb=$(this);
svc.push({
v: $cb.val(),
q: $cb.closest(".single-service").find("input.bookable-service-quantity").val()||"1",
});
});
if(svc.length){
Cookies.set(listeoBkKey("services"), JSON.stringify(svc), { expires: 1 });
}else{
Cookies.remove(listeoBkKey("services"));
}}
$(document).on("change",
"input.bookable-service-checkbox, input.bookable-service-quantity, input#slot",
function (){ setTimeout(listeoBkSave, 60); }
);
$(document).on("click",
".time-slots-carousel-container .calendar-slot-available, .panel-dropdown-scrollable .time-slot, .lbp-ms-slot:not(.is-unavailable)",
function (){ setTimeout(listeoBkSave, 150); }
);
function listeoBkApplySlot(slotValue, rawJson){
var $grid=$(".time-slots-carousel-container .calendar-slot-available").filter(function (){
return String($(this).data("slot-value"))===String(slotValue);
});
if($grid.length){ $grid.first().trigger("click"); return true; }
var $radio=$(".panel-dropdown-scrollable .time-slot input[value='" + slotValue + "']");
if($radio.length){
$radio.prop("checked", true).trigger("change");
$("#slot").val(rawJson);
if(typeof check_booking==="function"){ check_booking(); }
return true;
}
var idxPart=String(slotValue).split("|");
if(idxPart.length===2){
var $ms=$(".lbp-ms-slot[data-slot-index='" + idxPart[1] + "']:not(.is-unavailable)");
if($ms.length){ $ms.first().trigger("click"); return true; }}
return false;
}
function listeoBkRestore(){
if(!listeoBkListingId()||typeof Cookies==="undefined"){
return;
}
var svcRaw=Cookies.get(listeoBkKey("services"));
var $restoredServices=$();
if(svcRaw){
try {
var svc=JSON.parse(svcRaw);
$.each(svc, function (_, it){
var $cb=$("input.bookable-service-checkbox").filter(function (){
return $(this).val()===it.v;
});
if($cb.length){
$cb.prop("checked", true);
var $q=$cb.closest(".single-service").find("input.bookable-service-quantity");
if($q.length&&it.q){ $q.val(it.q); }
$restoredServices=$restoredServices.add($cb);
}});
if(typeof updateCounter==="function"){ updateCounter(); }
if($restoredServices.length){ $restoredServices.trigger("change"); }} catch (e){}}
var savedSlot=Cookies.get("listeo_rental_startdate")
? Cookies.get(listeoBkKey("slot"))
: null;
if(savedSlot){
var parsed=null;
try { parsed=JSON.parse(savedSlot); } catch (e){ parsed=null; }
if(parsed&&parsed.length >=2){
var tries=0;
var iv=setInterval(function (){
tries++;
if(listeoBkApplySlot(parsed[1], savedSlot)||tries > 30){
clearInterval(iv);
if(typeof check_booking==="function"){ check_booking(); }}
}, 200);
}}else if($restoredServices.length&&typeof check_booking==="function"){
check_booking();
}}
setTimeout(listeoBkRestore, 600);
window.initializeDateRangePicker=function ($context=$(document)){
$context.find(".input-datetime").each(function (){
if(!$(this).data("daterangepicker")){
$(this).daterangepicker({
opens: "left",
singleDatePicker: true,
timePicker: true,
autoUpdateInput: false,
timePicker24Hour: Boolean(listeo_core.clockformat),
minDate: moment().subtract(0, "days"),
locale: {
format: dateformat_even,
firstDay: parseInt(wordpress_date_format.day),
applyLabel: listeo_core.applyLabel,
cancelLabel: listeo_core.cancelLabel,
fromLabel: listeo_core.fromLabel,
toLabel: listeo_core.toLabel,
customRangeLabel: listeo_core.customRangeLabel,
daysOfWeek: [
listeo_core.day_short_su,
listeo_core.day_short_mo,
listeo_core.day_short_tu,
listeo_core.day_short_we,
listeo_core.day_short_th,
listeo_core.day_short_fr,
listeo_core.day_short_sa,
],
monthNames: [
listeo_core.january,
listeo_core.february,
listeo_core.march,
listeo_core.april,
listeo_core.may,
listeo_core.june,
listeo_core.july,
listeo_core.august,
listeo_core.september,
listeo_core.october,
listeo_core.november,
listeo_core.december,
],
},
});
}});
};
initializeDateRangePicker();
$(".input-datetime").on("apply.daterangepicker", function (ev, picker){
$(this).val(picker.startDate.format(dateformat_even));
var end_date=$("#_event_date_end").length;
if(end_date){
$(".input-datetime#_event_date_end")
.data("daterangepicker")
.setMinDate(picker.startDate.format(dateformat_even));
}});
$(".input-datetime").on("cancel.daterangepicker", function (ev, picker){
$(this).val("");
});
$(".input-date").daterangepicker({
opens: "left",
singleDatePicker: true,
timePicker: false,
autoUpdateInput: false,
minDate: moment().subtract(0, "days"),
locale: {
format: dateformat_even,
firstDay: parseInt(wordpress_date_format.day),
applyLabel: listeo_core.applyLabel,
cancelLabel: listeo_core.cancelLabel,
fromLabel: listeo_core.fromLabel,
toLabel: listeo_core.toLabel,
customRangeLabel: listeo_core.customRangeLabel,
daysOfWeek: [
listeo_core.day_short_su,
listeo_core.day_short_mo,
listeo_core.day_short_tu,
listeo_core.day_short_we,
listeo_core.day_short_th,
listeo_core.day_short_fr,
listeo_core.day_short_sa,
],
monthNames: [
listeo_core.january,
listeo_core.february,
listeo_core.march,
listeo_core.april,
listeo_core.may,
listeo_core.june,
listeo_core.july,
listeo_core.august,
listeo_core.september,
listeo_core.october,
listeo_core.november,
listeo_core.december,
],
},
});
$(".input-date").on("apply.daterangepicker", function (ev, picker){
$(this).val(picker.startDate.format("YYYY-MM-DD"));
});
$(".input-date").on("cancel.daterangepicker", function (ev, picker){
$(this).val("");
});
function wpkGetThisDateSlots(date){
var slots={
isFirstSlotTaken: false,
isSecondSlotTaken: false,
};
var listing_type=$("#listing_type").val();
var type_config=listeo_core.listing_types_config&&listeo_core.listing_types_config[listing_type];
var supports_time_slots=type_config ? type_config.supports_time_slots:(listing_type!="event");
if(!supports_time_slots) return slots;
var dateString=date.format("YYYY-MM-DD");
if(typeof disabledDates!=="undefined"){
if(wpkIsDateInArray(date, disabledDates)){
slots.isFirstSlotTaken=slots.isSecondSlotTaken=true;
console.log("Date " + dateString + " is in disabled dates");
return slots;
}}
if(typeof wpkStartDates!="undefined"&&typeof wpkEndDates!="undefined"){
slots.isSecondSlotTaken=wpkIsDateInArray(date, wpkStartDates);
slots.isFirstSlotTaken=wpkIsDateInArray(date, wpkEndDates);
}
return slots;
}
function wpkIsDateInArray(date, array){
var dateString=date.format("YYYY-MM-DD");
var isInArray=false;
if(Array.isArray(array)){
isInArray=array.indexOf(dateString)!==-1;
}else if(typeof array==='object'){
var arrayValues=Object.values(array);
isInArray=arrayValues.indexOf(dateString)!==-1;
}
return isInArray;
}
let startDate=Cookies.get("listeo_rental_startdate");
let endDate=Cookies.get("listeo_rental_enddate");
let minSpan=$("#date-picker").data("minspan");
let maxSpan=$("#date-picker").data("maxspan");
let availableHours=[];
var is24Hour=Boolean(listeo_core.clockformat);
var timePickerIncrement=$("#date-picker").data("time-increment");
let autoUpdateInput=true;
if(startDate===undefined){
autoUpdateInput=false;
}
let daterangepicker_options={
opens: "left",
autoUpdateInput: autoUpdateInput,
singleDatePicker: function(){
var listing_type=$("#date-picker").data("listing_type");
var type_config=listeo_core.listing_types_config&&listeo_core.listing_types_config[listing_type];
return type_config
? type_config.supports_time_slots
: listing_type!="date_range";
}(),
timePicker: $("#date-picker").data("rental-timepicker")==true ? true:false,
minDate: moment().subtract(0, "days"),
timePicker24Hour: is24Hour,
timePickerIncrement: timePickerIncrement,
minSpan: { days: minSpan },
startDate: startDate ? startDate:moment(),
endDate: endDate ? endDate:moment().add(minSpan, "days"),
locale: {
format: $("#date-picker").data("rental-timepicker")==true
? wordpress_date_format.date + " " + (is24Hour ? "HH:mm":"hh:mm A")
: wordpress_date_format.date,
firstDay: parseInt(wordpress_date_format.day),
applyLabel: listeo_core.applyLabel,
cancelLabel: listeo_core.cancelLabel,
fromLabel: listeo_core.fromLabel,
toLabel: listeo_core.toLabel,
customRangeLabel: listeo_core.customRangeLabel,
daysOfWeek: [
listeo_core.day_short_su,
listeo_core.day_short_mo,
listeo_core.day_short_tu,
listeo_core.day_short_we,
listeo_core.day_short_th,
listeo_core.day_short_fr,
listeo_core.day_short_sa,
],
monthNames: [
listeo_core.january,
listeo_core.february,
listeo_core.march,
listeo_core.april,
listeo_core.may,
listeo_core.june,
listeo_core.july,
listeo_core.august,
listeo_core.september,
listeo_core.october,
listeo_core.november,
listeo_core.december,
],
},
isCustomDate: function (date){
if($("#date-picker").data("rental-timepicker")==true){
var dateString=date.format("YYYY-MM-DD");
if(partialBookedDates&&partialBookedDates[dateString]){
var isFullyBooked=isDateFullyBooked(partialBookedDates[dateString]);
if(isFullyBooked){
return "fully-booked";
}
return "partially-booked";
}
return "available";
}else{
var slots=wpkGetThisDateSlots(date);
if(!slots.isFirstSlotTaken&&!slots.isSecondSlotTaken) return [];
if(slots.isFirstSlotTaken&&!slots.isSecondSlotTaken){
return ["first-slot-taken"];
}
if(slots.isSecondSlotTaken&&!slots.isFirstSlotTaken){
return ["second-slot-taken"];
}
if(slots.isFirstSlotTaken&&slots.isSecondSlotTaken){
return ["fully-booked"];
}}
},
isInvalidDate: function (date){
var listing_type=$("#listing_type").val();
var type_config=listeo_core.listing_types_config&&listeo_core.listing_types_config[listing_type];
var is_event_type=type_config ? !type_config.supports_time_slots:(listing_type=="event");
if(is_event_type){
if(typeof window.listeoEventIsInvalidDate==="function"){
return !!window.listeoEventIsInvalidDate(date);
}
return false;
}
if($("#listing_type").val()=="single_day"&&typeof disabledDates!=="undefined"){
if(jQuery.inArray(date.format("YYYY-MM-DD"), disabledDates)!==-1){
return true;
}}
if($(".time-slots-dropdown").length){
var timeslotdays=$(".time-slots-dropdown").data("slots-days").toString();
var timeslotdaysArray=timeslotdays.split(",");
if(timeslotdaysArray.includes(moment(date).day().toString())){
return false;
}else{
return true;
}}
if($("#listing_type").val()=="date_range"){
if($("#date-picker").data("rental-timepicker")==true){
var dateString=date.format("YYYY-MM-DD");
if(typeof disabledDates!=="undefined" &&
disabledDates.indexOf(dateString) > -1
){
return true;
}
return false;
}else{
var slots=wpkGetThisDateSlots(date);
return slots.isFirstSlotTaken&&slots.isSecondSlotTaken;
}}
return false;
},
};
$("#date-picker").daterangepicker(daterangepicker_options);
$("#date-picker").on("show.daterangepicker", function (ev, picker){
$(".daterangepicker").addClass("calendar-visible calendar-animated");
$(".daterangepicker").removeClass("calendar-hidden");
});
$("#date-picker").on("hide.daterangepicker", function (ev, picker){
$(".daterangepicker").removeClass("calendar-visible");
$(".daterangepicker").addClass("calendar-hidden");
});
$(".date-picker-listing-date_range").on("showCalendar.daterangepicker",
function (ev, picker){
if($("#date-picker").data("rental-timepicker")==true){
setTimeout(function (){
updateTimePicker(picker);
}, 50);
}}
);
$(".date-picker-listing-date_range").on("show.daterangepicker",
function (ev, picker){
if($("#date-picker").data("rental-timepicker")==true){
updateTimePicker(picker);
$(picker.container)
.find(".calendar-time")
.on("mousedown", function (){
updateTimePicker(picker);
});
}}
);
$(".date-picker-listing-date_range").on("show.daterangepicker",
function (ev, picker){
if($("#date-picker").data("rental-timepicker")==true){
setTimeout(function (){
picker.container.find(".calendar-time").each(function (index){
var $timeContainer=$(this);
if(!$timeContainer.prev().hasClass("calendar-time-label")){
var label =
index===0
? listeo_core.start_time_label
: listeo_core.end_time_label;
$timeContainer.before('<div class="calendar-time-label">' + label + "</div>"
);
}});
}, 0);
}}
);
function updateTimePicker(picker){
var startDate=picker.startDate.format("YYYY-MM-DD");
var endDate=picker.endDate.format("YYYY-MM-DD");
var startTimes=getAvailableTimes(
startDate,
partialBookedDates[startDate],
"check-in"
);
var endTimes=getAvailableTimes(
endDate,
partialBookedDates[endDate],
"check-out"
);
var startContainer=$(picker.container).find(".calendar-time").first();
var endContainer=$(picker.container).find(".calendar-time").last();
updateTimeSelectors(startContainer, startTimes, picker.startDate);
updateTimeSelectors(endContainer, endTimes, picker.endDate);
}
function updateTimeSelectors(container, availableTimes, currentDate){
var hourSelect=container.find(".hourselect");
var minuteSelect=container.find(".minuteselect");
var availableHours=[
...new Set(availableTimes.map((time)=> parseInt(time.split(":")[0]))),
].sort((a, b)=> a - b);
hourSelect.empty();
availableHours.forEach((hour)=> {
hourSelect.append($("<option>", {
value: hour,
text: ("0" + hour).slice(-2),
})
);
});
var currentHour=currentDate.hour();
if(!availableHours.includes(currentHour)){
hourSelect.val(availableHours[0]);
currentDate.hour(availableHours[0]);
}else{
hourSelect.val(currentHour);
}
updateMinutes(hourSelect, minuteSelect, availableTimes, currentDate);
hourSelect.off("change").on("change", function (){
updateMinutes(hourSelect, minuteSelect, availableTimes, currentDate);
});
}
function updateMinutes(
hourSelect,
minuteSelect,
availableTimes,
currentDate
){
var selectedHour=parseInt(hourSelect.val());
var availableMinutes=availableTimes
.filter((time)=> parseInt(time.split(":")[0])===selectedHour)
.map((time)=> parseInt(time.split(":")[1]))
.sort((a, b)=> a - b);
minuteSelect.empty();
availableMinutes.forEach((minute)=> {
minuteSelect.append($("<option>", {
value: minute,
text: ("0" + minute).slice(-2),
})
);
});
var currentMinute=currentDate.minute();
if(!availableMinutes.includes(currentMinute)){
minuteSelect.val(availableMinutes[0]);
currentDate.minute(availableMinutes[0]);
}else{
minuteSelect.val(currentMinute);
}}
function getAvailableTimes(date, bookedTimes, type){
var times=[];
var startHour=type==="check-in" ? 7:10;
var endHour=type==="check-out" ? 20:17;
for (var hour=startHour; hour <=endHour; hour++){
for (var minute=0; minute < 60; minute +=timePickerIncrement){
var timeStr=("0" + hour).slice(-2) + ":" + ("0" + minute).slice(-2);
if(!isTimeBooked(timeStr, bookedTimes)){
times.push(timeStr);
}}
}
return times;
}
function isTimeBooked(timeStr, bookedTimes){
if(!bookedTimes) return false;
return bookedTimes.some(function (booking){
return (
timeToMinutes(timeStr) >=timeToMinutes(booking.start) &&
timeToMinutes(timeStr) <=timeToMinutes(booking.end)
);
});
}
function isDateFullyBooked(bookings){
var timeBlocks=mergeTimeBlocks(bookings);
return timeBlocks.some(function (block){
return block.start==="00:00"&&block.end==="23:59";
});
}
function mergeTimeBlocks(bookings){
if(!bookings||!bookings.length) return [];
var sorted=bookings.sort(function (a, b){
return a.start.localeCompare(b.start);
});
var merged=[];
var current=sorted[0];
for (var i=1; i < sorted.length; i++){
if(timeToMinutes(current.end) >=timeToMinutes(sorted[i].start)){
if(timeToMinutes(sorted[i].end) > timeToMinutes(current.end)){
current.end=sorted[i].end;
}}else{
merged.push(current);
current=sorted[i];
}}
merged.push(current);
return merged;
}
function timeToMinutes(timeStr){
var parts=timeStr.split(":");
return parseInt(parts[0]) * 60 + parseInt(parts[1]);
}
$(".date-picker-listing-date_range").on("apply.daterangepicker",
function (ev, picker){
if($("#date-picker").data("rental-timepicker")==true){
if(picker.startDate&&picker.endDate){
var timeFormat=is24Hour ? "HH:mm":"hh:mm A";
var startFormatted =
picker.startDate.format(wordpress_date_format.date) +
" " +
picker.startDate.format(timeFormat);
var endFormatted =
picker.endDate.format(wordpress_date_format.date) +
" " +
picker.endDate.format(timeFormat);
$(this).val(startFormatted + " - " + endFormatted);
}}else{
$(this).val(picker.startDate.format(wordpress_date_format.date) +
" - " +
picker.endDate.format(wordpress_date_format.date)
);
}}
);
$(".date-picker-listing-single_day").on("apply.daterangepicker",
function (ev, picker){
$(this).val(picker.startDate.format(wordpress_date_format.date));
}
);
function updateTimePicker(picker){
var startDate=picker.startDate.format("YYYY-MM-DD");
var endDate=picker.endDate.format("YYYY-MM-DD");
var startTimes=getAvailableTimes(
startDate,
partialBookedDates[startDate],
"check-in"
);
var endTimes=getAvailableTimes(
endDate,
partialBookedDates[endDate],
"check-out"
);
var startContainer=$(picker.container).find(".calendar-time").first();
var endContainer=$(picker.container).find(".calendar-time").last();
updateTimeSelectors(startContainer, startTimes, picker.startDate);
updateTimeSelectors(endContainer, endTimes, picker.endDate);
}
function updateTimeSelectors(container, availableTimes, currentDate){
var is24Hour=Boolean(listeo_core.clockformat);
var hourSelect=container.find(".hourselect");
var minuteSelect=container.find(".minuteselect");
var ampmSelect=container.find(".ampmselect");
var currentHour24=currentDate.hour();
var currentMinute=currentDate.minute();
var isPM=currentHour24 >=12;
function updateHourOptions(){
var availableHours24=[
...new Set(availableTimes.map((time)=> parseInt(time.split(":")[0]))),
].sort((a, b)=> a - b);
if(!is24Hour){
var selectedIsPM=ampmSelect.val()==="PM";
availableHours24=availableHours24.filter((hour)=> {
return selectedIsPM ? hour >=12:hour < 12;
});
}
hourSelect.empty();
availableHours24.forEach((hour24)=> {
var displayHour=is24Hour ? hour24:hour24 % 12||12;
hourSelect.append($("<option>", {
value: hour24,
text: ("0" + displayHour).slice(-2),
})
);
});
if(availableHours24.length > 0){
var currentHourExists=availableHours24.includes(currentHour24);
var hourToSet=currentHourExists ? currentHour24:availableHours24[0];
hourSelect.val(hourToSet);
currentDate.hour(hourToSet);
return hourToSet;
}
return null;
}
var selectedHour24=updateHourOptions();
function updateMinutes(hour24){
if(hour24===null) return;
var availableMinutes=availableTimes
.filter((time)=> parseInt(time.split(":")[0])===hour24)
.map((time)=> parseInt(time.split(":")[1]))
.sort((a, b)=> a - b);
minuteSelect.empty();
availableMinutes.forEach((minute)=> {
minuteSelect.append($("<option>", {
value: minute,
text: ("0" + minute).slice(-2),
})
);
});
if(availableMinutes.length > 0){
if(availableMinutes.includes(currentMinute)){
minuteSelect.val(currentMinute);
}else{
minuteSelect.val(availableMinutes[0]);
currentDate.minute(availableMinutes[0]);
}}
}
updateMinutes(selectedHour24);
if(!is24Hour){
ampmSelect.off("change").on("change", function (){
var newHour24=updateHourOptions();
updateMinutes(newHour24);
});
}
hourSelect.off("change").on("change", function (){
var selectedHour24=parseInt($(this).val());
currentDate.hour(selectedHour24);
updateMinutes(selectedHour24);
});
minuteSelect.off("change").on("change", function (){
currentDate.minute(parseInt($(this).val()));
});
if(!is24Hour){
ampmSelect.val(isPM ? "PM":"AM");
}}
function getAvailableTimes(date, bookedTimes, type){
var times=[];
console.log(availableDays);
if(typeof availableDays==="undefined" ||
availableDays===null ||
availableDays===""
){
var listingOpeningHours=[];
}else{
var listingOpeningHours=JSON.parse(availableDays);
}
var dayOfWeek=moment(date).isoWeekday();
var dayIndex=dayOfWeek - 1;
var dayHours=listingOpeningHours[dayIndex];
console.log(dayHours);
if(!dayHours ||
!dayHours.opening ||
!dayHours.closing ||
dayHours.opening[0]==="" ||
dayHours.closing[0]===""
){
dayHours={
opening: ["00:00"],
closing: ["23:59"],
};}
for (var i=0; i < dayHours.opening.length; i++){
var openTime=dayHours.opening[i];
var closeTime=dayHours.closing[i];
if(!openTime||!closeTime) continue;
var openHour=parseInt(openTime.split(":")[0]);
var closeHour=parseInt(closeTime.split(":")[0]);
var openMinute=parseInt(openTime.split(":")[1]);
var closeMinute=parseInt(closeTime.split(":")[1]);
var currentHour=openHour;
var currentMinute =
currentHour===openHour
? Math.ceil(openMinute / timePickerIncrement) * timePickerIncrement
: 0;
var endTimeInMinutes=closeHour * 60 + closeMinute;
while (currentHour * 60 + currentMinute <=endTimeInMinutes){
var timeStr =
("0" + currentHour).slice(-2) + ":" + ("0" + currentMinute).slice(-2);
if(!isTimeBooked(timeStr, bookedTimes)){
times.push(timeStr);
}
currentMinute +=timePickerIncrement;
if(currentMinute >=60){
currentMinute=0;
currentHour++;
}}
}
return times.sort();
}
function isTimeBooked(timeStr, bookedTimes){
if(!bookedTimes) return false;
return bookedTimes.some(function (booking){
return (
timeToMinutes(timeStr) >=timeToMinutes(booking.start) &&
timeToMinutes(timeStr) <=timeToMinutes(booking.end)
);
});
}
function timeToMinutes(timeStr){
var parts=timeStr.split(":");
return parseInt(parts[0]) * 60 + parseInt(parts[1]);
}
function updateSelectOptions($select, options){
$select.empty();
options.forEach(function (option){
$select.append($("<option>", {
value: option.value,
text: option.text,
})
);
});
$select.selectpicker("refresh");
}
function calculate_price(){
var ajax_data={
action: "calculate_price",
listing_type: $("#date-picker").data("listing_type"),
listing_id: $("input#listing_id").val(),
tickets: $("input#tickets").val(),
coupon: $("input#coupon_code").val(),
};
if($(".qtyButtons.children input").length){
ajax_data.children=$(".qtyButtons.children input").val();
}
if($(".qtyButtons.animals input").length){
ajax_data.animals=$(".qtyButtons.animals input").val();
}
var services=[];
$.each($("input.bookable-service-checkbox:checked"), function (){
var quantity=$(this)
.parent()
.find("input.bookable-service-quantity")
.val();
services.push({ service: $(this).val(), value: quantity });
});
ajax_data.services=services;
$.ajax({
type: "POST",
dataType: "json",
url: listeo.ajaxurl,
data: ajax_data,
success: function (data){
$("#negative-feedback").fadeOut();
$("a.book-now").removeClass("inactive");
if(data.data.price){
if(listeo_core.currency_position=="before"){
$(".booking-estimated-cost span").html(listeo_core.currency_symbol + " " + data.data.price
);
}else{
$(".booking-estimated-cost span").html(data.data.price + " " + listeo_core.currency_symbol
);
}
$(".booking-estimated-cost").data("price", data.data.price);
$(".booking-estimated-cost").fadeIn();
renderBookingBreakdown(data.data.breakdown);
}
if(data.data.price_discount){
if(listeo_core.currency_position=="before"){
$(".booking-estimated-discount-cost span").html(listeo_core.currency_symbol + " " + data.data.price_discount
);
}else{
$(".booking-estimated-discount-cost span").html(data.data.price_discount + " " + listeo_core.currency_symbol
);
}
$(".booking-estimated-cost").addClass("estimated-with-discount");
$(".booking-estimated-discount-cost").fadeIn();
}else{
$(".booking-estimated-cost").removeClass("estimated-with-discount");
$(".booking-estimated-discount-cost").fadeOut();
}},
});
}
function calculate_booking_form_price(){
var ajax_data={
action: "listeo_calculate_booking_form_price",
coupon: $("input#coupon_code").val(),
price: $("li.total-costs").data("price"),
nonce: listeo.coupon_nonce,
};
$.ajax({
type: "POST",
dataType: "json",
url: listeo.ajaxurl,
data: ajax_data,
success: function (data){
if(data.price >=0){
if(listeo_core.currency_position=="before"){
$(".total-discounted_costs span").html(listeo_core.currency_symbol + " " + data.price
);
}else{
$(".total-discounted_costs span").html(data.price + " " + listeo_core.currency_symbol
);
}
$(".total-discounted_costs").fadeIn();
$(".total-costs").addClass("estimated-with-discount");
}else{
$(".total-discounted_costs ").fadeOut();
$(".total-costs").removeClass("estimated-with-discount");
}},
});
}
function check_booking(){
inputClicked=true;
if(is_open===false) return 0;
if(!$("#date-picker").length||!$("#date-picker").data("daterangepicker")){
return;
}
if($("#date-picker").data("listing_type")=="service" &&
!$("input#slot").val() &&
!$(".time-picker").val()
){
$("#negative-feedback").fadeIn();
return;
}
if($("#date-picker").data("rental-timepicker")){
var timeFormat=is24Hour ? "HH:mm":"hh:mm A";
Cookies.set("listeo_rental_picker_startdate",
$("#date-picker")
.data("daterangepicker")
.startDate.format(wordpress_date_format.date + " " + timeFormat)
);
Cookies.set("listeo_rental_picker_enddate",
$("#date-picker")
.data("daterangepicker")
.endDate.format(wordpress_date_format.date + " " + timeFormat)
);
var startDataSql=moment(
$("#date-picker").data("daterangepicker").startDate,
["MM/DD/YYYY " + timeFormat]
).format("YYYY-MM-DD HH:mm:ss");
var endDataSql=moment(
$("#date-picker").data("daterangepicker").endDate,
["MM/DD/YYYY " + timeFormat]
).format("YYYY-MM-DD HH:mm:ss");
}else{
Cookies.set("listeo_rental_startdate",
$("#date-picker")
.data("daterangepicker")
.startDate.format(wordpress_date_format.date)
);
Cookies.set("listeo_rental_enddate",
$("#date-picker")
.data("daterangepicker")
.endDate.format(wordpress_date_format.date)
);
var startDataSql=moment(
$("#date-picker").data("daterangepicker").startDate,
["MM/DD/YYYY"]
).format("YYYY-MM-DD");
var endDataSql=moment(
$("#date-picker").data("daterangepicker").endDate,
["MM/DD/YYYY"]
).format("YYYY-MM-DD");
}
var ajax_data={
action: "check_avaliabity",
listing_type: $("#date-picker").data("listing_type"),
listing_id: $("input#listing_id").val(),
coupon: $("input#coupon_code").val(),
date_start: startDataSql,
date_end: endDataSql,
};
var services=[];
$.each($("input.bookable-service-checkbox:checked"), function (){
var quantity=$(this)
.parent()
.find("input.bookable-service-quantity")
.val();
services.push({ service: $(this).val(), value: quantity });
});
ajax_data.services=services;
if($("input#slot").val()) ajax_data.slot=$("input#slot").val();
if($("input.adults").val()) ajax_data.adults=$("input.adults").val();
if($(".time-picker").val()) ajax_data.hour=$(".time-picker").val();
if($(".time-picker-end-hour").val())
ajax_data.end_hour=$(".time-picker-end-hour").val();
if($(".qtyButtons input.children ").length){
ajax_data.children=$(".qtyButtons input.children ").val();
}
if($(".qtyButtons input.animals ").length){
ajax_data.animals=$(".qtyButtons input.animals").val();
}
if($("input#tickets").length){
ajax_data.tickets=$("input#tickets").val();
}
$("a.book-now").addClass("loading");
$("a.book-now-notloggedin").addClass("loading");
$.ajax({
type: "POST",
dataType: "json",
url: listeo.ajaxurl,
data: ajax_data,
success: function (data){
var default_error_message=$(".booking-error-message").data("default-message");
$(".booking-error-message").html(default_error_message);
if(data.success==true &&
(!$(".time-picker").length||is_open!=false)
){
if(data.data.free_places > 0){
$("a.book-now,a.book-now-notloggedin").data("freeplaces",
data.data.free_places
);
$(".booking-error-message").fadeOut();
$("a.book-now").removeClass("inactive");
if(data.data.price){
if(listeo_core.currency_position=="before"){
$(".booking-estimated-cost span").html(listeo_core.currency_symbol + " " + data.data.price
);
}else{
$(".booking-estimated-cost span").html(data.data.price + " " + listeo_core.currency_symbol
);
}
$(".booking-estimated-cost").data("price", data.data.price);
$(".booking-estimated-cost").fadeIn();
renderBookingBreakdown(data.data.breakdown);
}else{
$(".booking-estimated-cost span").html("0 " + listeo_core.currency_symbol
);
$(".booking-estimated-cost").fadeOut();
}
if(data.data.price_discount){
if(listeo_core.currency_position=="before"){
$(".booking-estimated-discount-cost span").html(listeo_core.currency_symbol + " " + data.data.price_discount
);
}else{
$(".booking-estimated-discount-cost span").html(data.data.price_discount + " " + listeo_core.currency_symbol
);
}
$(".booking-estimated-cost").addClass("estimated-with-discount");
$(".booking-estimated-discount-cost").fadeIn();
}else{
$(".booking-estimated-cost").removeClass("estimated-with-discount"
);
$(".booking-estimated-discount-cost").fadeOut();
}
validate_coupon($("input#listing_id").val(), data.data.price);
$(".coupon-widget-wrapper").fadeIn();
if($("input#tickets").length&&window._listeo_widget_user_action){
var eventDate=listeo_resolve_event_date();
if(!eventDate){
$("a.book-now,a.book-now-notloggedin").data("freeplaces", data.data.free_places);
}else{
var booking_data={
listing_type: $("#listing_type").val(),
listing_id: $("input#listing_id").val(),
date_start: eventDate,
date_end: eventDate,
tickets: $("#tickets").val()
};
if($("#coupon_code").val()) booking_data.coupon=$("#coupon_code").val();
if(ajax_data.services&&ajax_data.services.length > 0){
booking_data.services=ajax_data.services;
}
$("input#booking").val(JSON.stringify(booking_data));
window._listeo_booking_submitted=true;
$("#form-booking").submit();
}}
}else{
$("a.book-now,a.book-now-notloggedin").data("freeplaces", 0);
$(".booking-error-message").fadeIn();
$(".booking-estimated-cost").fadeOut();
$(".booking-estimated-cost span").html("");
}}else{
if(data.error){
$(".booking-error-message").html(data.error);
}
$(".booking-error-message").fadeIn();
$(".booking-estimated-cost").fadeOut();
}
$("a.book-now").removeClass("loading");
$("a.book-now-notloggedin").removeClass("loading");
},
});
}
var is_open=true;
var lastDayOfWeek;
function update_booking_widget(){
if($("#date-picker").data("listing_type")!="single_day") return;
$("a.book-now").addClass("loading");
$("a.book-now-notloggedin").addClass("loading");
var date=$("#date-picker").data("daterangepicker").endDate._d;
var dayOfWeek=date.getDay() - 1;
if(date.getDay()==0){
dayOfWeek=6;
}
var startDataSql=moment(
$("#date-picker").data("daterangepicker").startDate,
["MM/DD/YYYY"]
).format("YYYY-MM-DD");
var endDataSql=moment($("#date-picker").data("daterangepicker").endDate, [
"MM/DD/YYYY",
]).format("YYYY-MM-DD");
var ajax_data={
action: "update_slots",
listing_id: $("input#listing_id").val(),
date_start: startDataSql,
date_end: endDataSql,
slot: dayOfWeek,
};
$.ajax({
type: "POST",
dataType: "json",
url: listeo.ajaxurl,
data: ajax_data,
success: function (data){
$(".time-slots-dropdown .panel-dropdown-scrollable").html(data.data);
if(dayOfWeek!=lastDayOfWeek){
$(".panel-dropdown-scrollable .time-slot input").prop("checked",
false
);
$(".panel-dropdown.time-slots-dropdown input#slot").val("");
$(".panel-dropdown.time-slots-dropdown a").html($(".panel-dropdown.time-slots-dropdown a").attr("placeholder")
);
$(" .booking-estimated-cost span").html(" ");
}
lastDayOfWeek=dayOfWeek;
if(!$(".panel-dropdown-scrollable .time-slot[day='" + dayOfWeek + "']")
.length
){
$(".no-slots-information").show();
$(".panel-dropdown.time-slots-dropdown a").html($(".no-slots-information").html()
);
}else{
$(".no-slots-information").hide();
$(".panel-dropdown.time-slots-dropdown a").html($(".panel-dropdown.time-slots-dropdown a").attr("placeholder")
);
$(" .booking-estimated-cost span").html(" ");
}
$(".panel-dropdown-scrollable .time-slot").hide();
$(
".panel-dropdown-scrollable .time-slot[day='" + dayOfWeek + "']"
).show();
$(".time-slot").each(function (){
var timeSlot=$(this);
$(this)
.find("input")
.on("change", function (){
var timeSlotVal=timeSlot.find("strong").text();
var slotArray=[
timeSlot.find("strong").text(),
timeSlot.find("input").val(),
];
$(".panel-dropdown.time-slots-dropdown input#slot").val(JSON.stringify(slotArray)
);
$(".panel-dropdown.time-slots-dropdown a").html(timeSlotVal);
$(".panel-dropdown").removeClass("active");
check_booking();
});
});
$("a.book-now").removeClass("loading");
$("a.book-now-notloggedin").removeClass("loading");
},
});
if($(".time-picker").length){
if(availableDays){
var availableDays=JSON.parse(availableDays);
if(availableDays[dayOfWeek].opening=="Closed" ||
availableDays[dayOfWeek].closing=="Closed"
){
$("#negative-feedback").fadeIn();
is_open=false;
return;
}
var opening_hour=moment(availableDays[dayOfWeek].opening, [
"h:mm A",
]).format("HH:mm");
var closing_hour=moment(availableDays[dayOfWeek].closing, [
"h:mm A",
]).format("HH:mm");
var current_hour=$(".time-picker").val();
if(current_hour >=opening_hour&&current_hour <=closing_hour){
is_open=true;
$("#negative-feedback").fadeOut();
$("a.book-now").attr("href", "#").css("background-color", "#f30c0c");
check_booking();
}else{
is_open=false;
$("#negative-feedback").fadeIn();
$(".booking-estimated-cost span").html("");
}}else{
check_booking();
}}
}
if($(".time-slot").length){
update_booking_widget();
}
$("#date-picker").on("apply.daterangepicker", update_booking_widget);
$("#date-picker").on("change", function (){
check_booking();
});
$("#date-picker").on("apply.daterangepicker", function (){
window._listeo_widget_user_action=true;
});
$("#date-picker").on("apply.daterangepicker", check_booking);
$("#date-picker").on("cancel.daterangepicker", check_booking);
$(document).on("change",
"input#slot,input.adults,.panel-with-children input, input.bookable-service-quantity, .form-booking-single_day input.bookable-service-checkbox,.form-booking-date_range input.bookable-service-checkbox",
function (event){
if($("#form-booking").hasClass("form-booking-tickets")){
calculate_price();
return;
}
check_booking();
}
);
$("input#tickets,.form-booking-tickets input.bookable-service-checkbox").on("change",
function (e){
calculate_price();
}
);
if($(".time-picker").length){
var time24=false;
if(listeo_core.clockformat){
time24=true;
}
const calendars=$(".time-picker").flatpickr({
enableTime: true,
noCalendar: true,
dateFormat: "H:i",
time_24hr: time24,
disableMobile: "true",
minuteIncrement: timePickerIncrement,
onClose: function (selectedDates, dateStr, instance){
update_booking_widget();
check_booking();
},
});
if($("#_hour_end").length){
var lcEndLocked =
typeof listeo_core!=="undefined" &&
!!listeo_core.lock_end_time_to_services;
var lcSumServiceDurations=function (){
var total=0;
$("input.bookable-service-checkbox:checked").each(function (){
var $row=$(this).closest(".single-service");
var min=parseInt($row.attr("data-duration-minutes"), 10)||0;
if(min > 0){
var qty=parseInt($row.find("input.bookable-service-quantity").val(), 10)||1;
total +=min * qty;
}});
return total;
};
var lcEndLockCss={
"background-color": "#f2f2f2",
opacity: "0.7",
cursor: "not-allowed",
"pointer-events": "none",
};
var lcEndUnlockCss={
"background-color": "",
opacity: "",
cursor: "",
"pointer-events": "",
};
var lcApplyEndLockState=function (hasDuration){
if(!lcEndLocked||!calendars[1]) return;
var $end=$("#_hour_end");
if(hasDuration){
calendars[1].set("clickOpens", false);
$end.addClass("time-picker-locked").css(lcEndLockCss);
}else{
calendars[1].set("clickOpens", true);
$end.removeClass("time-picker-locked").css(lcEndUnlockCss);
}};
var lcPrefillEndFromDurations=function (){
var minutes=lcSumServiceDurations();
var hasDuration=minutes > 0;
lcApplyEndLockState(hasDuration);
if(!hasDuration) return;
var startDates=calendars[0].selectedDates;
if(!startDates||!startDates.length) return;
var end=new Date(startDates[0].getTime() + minutes * 60000);
var dayEnd=new Date(startDates[0]);
dayEnd.setHours(23, 59, 0, 0);
if(end > dayEnd) end=dayEnd;
calendars[1].setDate(end, true);
};
calendars[0].config.onClose=[
()=> {
if(lcEndLocked&&lcSumServiceDurations() > 0) return;
setTimeout(()=> calendars[1].open(), 1);
},
];
calendars[0].config.onChange=[
(selDates)=> {
calendars[1].set("minDate", selDates[0]);
},
];
calendars[1].config.onChange=[
(selDates)=> {
calendars[0].set("maxDate", selDates[0]);
},
];
calendars[0].config.onChange.push(function (){
setTimeout(lcPrefillEndFromDurations, 1);
});
$(document).on("change",
"input.bookable-service-checkbox, input.bookable-service-quantity",
function (){
setTimeout(lcPrefillEndFromDurations, 70);
}
);
lcApplyEndLockState(lcSumServiceDurations() > 0);
}}
$(".booking-services").on("click", ".qtyInc", function (){
var $button=$(this);
var oldValue=$button.parent().find("input").val();
if(oldValue==2){
$button
.parents(".single-service")
.find("input.bookable-service-checkbox")
.prop("checked", true);
updateCounter();
}
if($("#form-booking").hasClass("form-booking-tickets")){
calculate_price();
}else{
check_booking();
}});
if($("#booking-date-range").length){
var bookingsOffset=0;
var bookingsLimit=5;
function listeo_bookings_manage(page){
if($("#booking-date-range").data("daterangepicker")){
var startDataSql=moment(
$("#booking-date-range").data("daterangepicker").startDate,
["MM/DD/YYYY"]
).format("YYYY-MM-DD");
var endDataSql=moment(
$("#booking-date-range").data("daterangepicker").endDate,
["MM/DD/YYYY"]
).format("YYYY-MM-DD");
}else{
var startDataSql="";
var endDataSql="";
}
if(!page){
page=1;
}
if(page=="prev"){
var current=$("div.pagination-container li.current").data("paged");
page=current - 1;
}
if(page=="next"){
var current=$("div.pagination-container li.current").data("paged");
page=current + 1;
}
var ajax_data={
action: "listeo_bookings_manage",
security: typeof listeoBookingsManage!=="undefined" ? listeoBookingsManage.nonce:"",
date_start: startDataSql,
date_end: endDataSql,
listing_id: $("#listing_id").val(),
listing_status: $("#listing_status").val(),
booking_author: $("#booking_author").val(),
dashboard_type: $("#dashboard_type").val(),
limit: bookingsLimit,
offset: bookingsOffset,
page: page,
};
$(".dashboard-list-box").addClass("loading");
$.ajax({
type: "POST",
dataType: "json",
url: listeo.ajaxurl,
data: ajax_data,
success: function (data){
$(".dashboard-list-box").removeClass("loading");
if(data.data.html){
$("#no-bookings-information").hide();
$("ul#booking-requests").html(data.data.html);
$(".pagination-container").html(data.data.pagination);
}else{
$("ul#booking-requests").empty();
$(".pagination-container").empty();
$("#no-bookings-information").show();
}},
});
}
$("#dashboard-booking-author-search").autocomplete({
source: function (req, response){
$.getJSON(listeo_core.ajax_url +
"?callback=?&action=listeo_core_incremental_listing_suggest",
req,
response
);
},
select: function (event, ui){
window.location.href=ui.item.link;
},
minLength: 3,
});
$("#booking-date-range").on("apply.daterangepicker", function (e){
listeo_bookings_manage();
});
$("#listing_id").on("change", function (e){
listeo_bookings_manage();
});
$("#listing_status").on("change", function (e){
listeo_bookings_manage();
});
$("#booking_author").on("change", function (e){
listeo_bookings_manage();
});
$("div.pagination-container").on("click", "a", function (e){
e.preventDefault();
var page=$(this).parent().data("paged");
listeo_bookings_manage(page);
$("body, html").animate({
scrollTop: $(".dashboard-list-box").offset().top,
},
600
);
return false;
});
$(document).on("click", ".reject, .cancel", function (e){
e.preventDefault();
if(window.confirm(listeo_core.areyousure)){
var $this=$(this);
$this.parents("li").addClass("loading");
var status="confirmed";
if($(this).hasClass("reject")) status="cancelled";
if($(this).hasClass("cancel")) status="cancelled";
var ajax_data={
action: "listeo_bookings_manage",
security: typeof listeoBookingsManage!=="undefined" ? listeoBookingsManage.nonce:"",
booking_id: $(this).data("booking_id"),
status: status,
};
$.ajax({
type: "POST",
dataType: "json",
url: listeo.ajaxurl,
data: ajax_data,
success: function (data){
$this.parents("li").removeClass("loading");
listeo_bookings_manage();
},
});
}});
$(document).on("click", ".delete", function (e){
e.preventDefault();
if(window.confirm(listeo_core.areyousure)){
var $this=$(this);
$this.parents("li").addClass("loading");
var status="deleted";
var ajax_data={
action: "listeo_bookings_manage",
security: typeof listeoBookingsManage!=="undefined" ? listeoBookingsManage.nonce:"",
booking_id: $(this).data("booking_id"),
status: status,
};
$.ajax({
type: "POST",
dataType: "json",
url: listeo.ajaxurl,
data: ajax_data,
success: function (data){
$this.parents("li").removeClass("loading");
listeo_bookings_manage();
},
});
}});
$(document).on("click", ".renew_booking", function (e){
e.preventDefault();
if(window.confirm(listeo_core.areyousure)){
var $this=$(this);
$this.parents("li").addClass("loading");
var ajax_data={
action: "listeo_bookings_renew_booking",
booking_id: $(this).data("booking_id"),
security: typeof listeoBookingsManage!=="undefined" ? listeoBookingsManage.nonce:"",
};
$.ajax({
type: "POST",
dataType: "json",
url: listeo.ajaxurl,
data: ajax_data,
success: function (data){
if(data.success){
}else{
alert(listeo_core.booked_dates);
}
$this.parents("li").removeClass("loading");
listeo_bookings_manage();
},
});
}});
$(document).on("click", ".approve", function (e){
e.preventDefault();
var $this=$(this);
$this.parents("li").addClass("loading");
var status="confirmed";
if($(this).hasClass("reject")) status="cancelled";
if($(this).hasClass("cancel")) status="cancelled";
var ajax_data={
action: "listeo_bookings_manage",
security: typeof listeoBookingsManage!=="undefined" ? listeoBookingsManage.nonce:"",
booking_id: $(this).data("booking_id"),
status: status,
};
$.ajax({
type: "POST",
dataType: "json",
url: listeo.ajaxurl,
data: ajax_data,
success: function (data){
$this.parents("li").removeClass("loading");
listeo_bookings_manage();
},
});
});
$(document).on("click", ".mark-as-paid", function (e){
e.preventDefault();
var $this=$(this);
$this.parents("li").addClass("loading");
var status="paid";
var ajax_data={
action: "listeo_bookings_manage",
security: typeof listeoBookingsManage!=="undefined" ? listeoBookingsManage.nonce:"",
booking_id: $(this).data("booking_id"),
status: status,
};
$.ajax({
type: "POST",
dataType: "json",
url: listeo.ajaxurl,
data: ajax_data,
success: function (data){
$this.parents("li").removeClass("loading");
listeo_bookings_manage();
},
});
});
var start=moment().subtract(30, "days");
var end=moment();
function cb(start, end){
$("#booking-date-range span,#chart-date-range span").html(start.format("MMMM D, YYYY") + " - " + end.format("MMMM D, YYYY")
);
}
var ranges=new Object();
ranges[listeo_core.today]=[moment().subtract(1, "days"), moment()];
ranges[listeo_core.yesterday]=[
moment().subtract(1, "days"),
moment().subtract(1, "days"),
];
ranges[listeo_core.last_7_days]=[moment().subtract(6, "days"), moment()];
ranges[listeo_core.last_30_days]=[
moment().subtract(29, "days"),
moment(),
];
ranges[listeo_core.this_month]=[
moment().startOf("month"),
moment().endOf("month"),
];
ranges[listeo_core.last_month]=[
moment().subtract(1, "month").startOf("month"),
moment().subtract(1, "month").endOf("month"),
];
var today=listeo_core.today;
$("#booking-date-range-enabler").on("click", function (e){
e.preventDefault();
$(this).hide();
cb(start, end);
$("#booking-date-range,#chart-date-range")
.show()
.daterangepicker({
opens: "left",
autoUpdateInput: false,
alwaysShowCalendars: true,
startDate: start,
endDate: end,
ranges: ranges,
locale: {
format: wordpress_date_format.date,
firstDay: parseInt(wordpress_date_format.day),
applyLabel: listeo_core.applyLabel,
cancelLabel: listeo_core.cancelLabel,
fromLabel: listeo_core.fromLabel,
toLabel: listeo_core.toLabel,
customRangeLabel: listeo_core.customRangeLabel,
daysOfWeek: [
listeo_core.day_short_su,
listeo_core.day_short_mo,
listeo_core.day_short_tu,
listeo_core.day_short_we,
listeo_core.day_short_th,
listeo_core.day_short_fr,
listeo_core.day_short_sa,
],
monthNames: [
listeo_core.january,
listeo_core.february,
listeo_core.march,
listeo_core.april,
listeo_core.may,
listeo_core.june,
listeo_core.july,
listeo_core.august,
listeo_core.september,
listeo_core.october,
listeo_core.november,
listeo_core.december,
],
},
},
cb
)
.trigger("click");
cb(start, end);
});
$("#booking-date-range").on("show.daterangepicker", function (ev, picker){
$(".daterangepicker").addClass("calendar-visible calendar-animated bordered-style"
);
$(".daterangepicker").removeClass("calendar-hidden");
});
$("#booking-date-range").on("hide.daterangepicker", function (ev, picker){
$(".daterangepicker").removeClass("calendar-visible");
$(".daterangepicker").addClass("calendar-hidden");
});
}
if($('.time-slots-carousel-container').length){
var currentPosition=0;
var $track=$('.slot-carousel-track');
var $columns=$('.slot-carousel-day-column');
var columnWidth=0;
var visibleColumns=3;
var maxPosition=0;
if(typeof moment!=='undefined'&&typeof listeo_core!=='undefined'&&listeo_core.wp_locale){
moment.locale(listeo_core.wp_locale);
}
initializeCarousel();
$('.time-slots-carousel-container').on('click', '.calendar-slot-available', function(e){
e.preventDefault();
$('.calendar-slot').removeClass('selected');
$(this).addClass('selected');
var slotValue=$(this).data('slot-value');
var slotTime=$(this).data('slot-time');
var selectedDate=$(this).closest('.slot-carousel-day-column').data('date');
$('#slot').val(JSON.stringify([slotTime, slotValue]));
if($('#date-picker').length&&selectedDate){
var datePicker=$('#date-picker').data('daterangepicker');
if(datePicker&&typeof moment!=='undefined'){
var momentDate=moment(selectedDate);
datePicker.setStartDate(momentDate);
datePicker.setEndDate(momentDate);
}}
if(typeof check_booking==='function'){
check_booking();
}});
$('.slot-carousel-nav-btn.prev-day').on('click', function(){
if(currentPosition > 0){
currentPosition=Math.max(0, currentPosition - visibleColumns);
updateCarouselPosition();
}});
$('.slot-carousel-nav-btn.next-day').on('click', function(){
if(currentPosition < maxPosition){
currentPosition=Math.min(maxPosition, currentPosition + visibleColumns);
updateCarouselPosition();
var totalColumns=$columns.length;
var daysFromEnd=totalColumns - (currentPosition + visibleColumns);
if(daysFromEnd <=7){
appendMoreDays(14);
}}
});
function appendMoreDays(daysToAdd){
if(typeof moment==='undefined') return;
var $container=$('.time-slots-carousel-container');
var lastLoadedDate=$container.data('availability-loaded-until');
if(!lastLoadedDate){
var $lastColumn=$('.slot-carousel-day-column').last();
if(!$lastColumn.length) return;
lastLoadedDate=$lastColumn.data('date');
}
var startDate=moment(lastLoadedDate).add(1, 'days');
var endDate=moment(startDate).add(daysToAdd - 1, 'days');
$.ajax({
type: 'POST',
url: listeo.ajaxurl,
data: {
action: 'get_carousel_slots_availability',
listing_id: $('#listing_id').val(),
date_start: startDate.format('YYYY-MM-DD'),
date_end: endDate.format('YYYY-MM-DD')
},
success: function(response){
if(response.success&&response.data){
var availabilityData=response.data;
for (var dateStr in availabilityData){
if(!availabilityData.hasOwnProperty(dateStr)) continue;
var currentDate=moment(dateStr);
var dayOfWeek=(currentDate.isoWeekday() % 7);
var daySlots=availabilityData[dateStr];
var hasSlots=Array.isArray(daySlots)&&daySlots.length > 0;
var dayName=currentDate.format('ddd,');
var monthNames=[
listeo_core.month_abbrev_jan, listeo_core.month_abbrev_feb, listeo_core.month_abbrev_mar,
listeo_core.month_abbrev_apr, listeo_core.month_abbrev_may, listeo_core.month_abbrev_jun,
listeo_core.month_abbrev_jul, listeo_core.month_abbrev_aug, listeo_core.month_abbrev_sep,
listeo_core.month_abbrev_oct, listeo_core.month_abbrev_nov, listeo_core.month_abbrev_dec
];
var monthIndex=currentDate.month();
var dateShort=currentDate.format('D') + ' ' + monthNames[monthIndex];
var columnHtml='<div class="slot-carousel-day-column" data-day="' + dayOfWeek + '" data-date="' + dateStr + '">';
columnHtml +='<div class="calendar-day ' + (hasSlots ? 'day-available':'day-placeholder') + '">';
columnHtml +='<div class="calendar-day-date">';
columnHtml +='<p class="day-name">' + dayName + '</p>';
columnHtml +='<p class="day-date">' + dateShort + '</p>';
columnHtml +='</div>';
columnHtml +='<div class="calendar-day-slots">';
columnHtml +='<ul class="calendar-day-slots-list">';
if(hasSlots){
var maxVisible=10;
var totalSlots=daySlots.length;
for (var j=0; j < totalSlots; j++){
var slot=daySlots[j];
var timeRange=slot.time;
var available=slot.available;
var slotKey=slot.slot_key;
var slotDayOfWeek=slot.day_of_week;
var isBooked=slot.is_booked||false;
var timeParts=timeRange.split('-');
var startTime=timeParts[0].trim();
var hiddenClass=(j >=maxVisible) ? ' hidden-slot':'';
var slotClass=isBooked ? 'calendar-slot calendar-slot-booked':'calendar-slot calendar-slot-available';
var slotDisabled=isBooked ? ' disabled':'';
columnHtml +='<li class="calendar-day-slots-list-item' + hiddenClass + '">';
columnHtml +='<button type="button" class="' + slotClass + '"';
columnHtml +=' data-slot-value="' + slotDayOfWeek + '|' + slotKey + '"';
columnHtml +=' data-slot-time="' + timeRange + '"' + slotDisabled + '>';
columnHtml +=startTime;
columnHtml +='</button>';
columnHtml +='</li>';
}
if(totalSlots > maxVisible){
var moreCount=totalSlots - maxVisible;
var showMoreText=(typeof listeo_core!=='undefined'&&listeo_core.show_more_slots)
? listeo_core.show_more_slots.replace('%d', moreCount)
: 'Show ' + moreCount + ' more';
columnHtml +='<li class="calendar-day-slots-list-item show-more-item">';
columnHtml +='<button type="button" class="calendar-slot-show-more">';
columnHtml +=showMoreText;
columnHtml +='</button>';
columnHtml +='</li>';
}}else{
for (var p=0; p < 6; p++){
columnHtml +='<li class="calendar-day-slots-list-item">';
columnHtml +='<button type="button" class="calendar-slot calendar-slot-placeholder" disabled tabindex="-1">-</button>';
columnHtml +='</li>';
}}
columnHtml +='</ul>';
columnHtml +='</div>';
columnHtml +='</div>';
columnHtml +='</div>';
$('.slot-carousel-track').append(columnHtml);
}
$container.data('availability-loaded-until', endDate.format('YYYY-MM-DD'));
$container.attr('data-availability-loaded-until', endDate.format('YYYY-MM-DD'));
setTimeout(function(){
$columns=$('.slot-carousel-day-column');
calculateDimensions();
updateCarouselHeight();
}, 100);
}},
error: function(xhr, status, error){
console.error('Failed to load more carousel days:', error);
}});
}
function initializeCarousel(){
calculateDimensions();
updateCarouselPosition();
setTimeout(function(){
updateCarouselHeight();
$('.time-slots-carousel-container').addClass('slot-carousel-loaded');
}, 100);
$(window).on('resize', debounce(function(){
calculateDimensions();
updateCarouselPosition();
}, 250));
}
function calculateDimensions(){
var viewportWidth=$('.slot-carousel-viewport').width();
if($(window).width() <=1360){
visibleColumns=2;
}else{
visibleColumns=3;
}
if($columns.length > 0){
var firstColumn=$columns.first();
var columnActualWidth=firstColumn.outerWidth();
var gap=15;
columnWidth=columnActualWidth + gap;
}else{
columnWidth=viewportWidth / visibleColumns;
}
var totalColumns=$columns.length;
maxPosition=Math.max(0, totalColumns - visibleColumns);
if(currentPosition > maxPosition){
currentPosition=maxPosition;
}}
function updateCarouselPosition(){
var translateX=-(currentPosition * columnWidth);
$track.css('transform', 'translateX(' + translateX + 'px)');
$('.slot-carousel-nav-btn.prev-day').prop('disabled', currentPosition===0);
$('.slot-carousel-nav-btn.next-day').prop('disabled', currentPosition >=maxPosition);
updateCarouselHeight();
}
function updateCarouselHeight(){
var maxHeight=0;
var visibleStart=currentPosition;
var visibleEnd=currentPosition + visibleColumns;
$columns=$('.slot-carousel-day-column');
var $visibleColumnElements=$columns.slice(visibleStart, visibleEnd);
if($visibleColumnElements.length===0) return;
$visibleColumnElements.each(function(){
var $calendarDay=$(this).find('.calendar-day');
if(!$calendarDay.length||!$calendarDay[0]) return;
var height=$calendarDay[0].offsetHeight;
var marginTop=parseInt($(this).css('margin-top'))||0;
var marginBottom=parseInt($(this).css('margin-bottom'))||0;
var columnHeight=height + marginTop + marginBottom;
if(columnHeight > maxHeight){
maxHeight=columnHeight;
}});
var $viewport=$('.slot-carousel-viewport');
var viewportPaddingTop=parseInt($viewport.css('padding-top'))||0;
var viewportPaddingBottom=parseInt($viewport.css('padding-bottom'))||0;
var totalPadding=viewportPaddingTop + viewportPaddingBottom;
if(maxHeight > 0){
$viewport.css('height', (maxHeight + totalPadding) + 'px');
}}
function debounce(func, wait){
var timeout;
return function(){
var context=this, args=arguments;
clearTimeout(timeout);
timeout=setTimeout(function(){
func.apply(context, args);
}, wait);
};}
$('.time-slots-carousel-container').on('click', '.calendar-slot-show-more', function(e){
e.preventDefault();
var $calendarDay=$(this).closest('.calendar-day');
$calendarDay.addClass('expanded');
setTimeout(function(){
updateCarouselHeight();
}, 50);
});
$('#date-picker').on('apply.daterangepicker', function(ev, picker){
if($('.time-slots-carousel-container').length){
var selectedDate=picker.startDate;
var targetDateStr=selectedDate.format('YYYY-MM-DD');
var $targetColumn=$('.carousel-day-column[data-date="' + targetDateStr + '"]');
if($targetColumn.length){
var targetIndex=$targetColumn.index();
currentPosition=Math.max(0, Math.min(targetIndex, maxPosition));
updateCarouselPosition();
}}
});
}
if($("#manual-booking-dialog").length){
var mbI18n=(typeof listeoBookings!=="undefined"&&listeoBookings.manual_booking_i18n)||{};
var mbConfig=null;
var mbPriceDirty=false;
var mbPreviewTimer=null;
var mbPreviewXhr=null;
var mbDateFormat =
typeof wordpress_date_format!=="undefined"&&wordpress_date_format.date
? wordpress_date_format.date
: "YYYY-MM-DD";
function mbPickerLocale(){
var locale={ format: mbDateFormat };
if(typeof wordpress_date_format!=="undefined"){
locale.firstDay=parseInt(wordpress_date_format.day);
}
if(typeof listeo_core!=="undefined"){
locale.applyLabel=listeo_core.applyLabel;
locale.cancelLabel=listeo_core.cancelLabel;
locale.fromLabel=listeo_core.fromLabel;
locale.toLabel=listeo_core.toLabel;
locale.customRangeLabel=listeo_core.customRangeLabel;
locale.daysOfWeek=[
listeo_core.day_short_su,
listeo_core.day_short_mo,
listeo_core.day_short_tu,
listeo_core.day_short_we,
listeo_core.day_short_th,
listeo_core.day_short_fr,
listeo_core.day_short_sa,
];
locale.monthNames=[
listeo_core.january,
listeo_core.february,
listeo_core.march,
listeo_core.april,
listeo_core.may,
listeo_core.june,
listeo_core.july,
listeo_core.august,
listeo_core.september,
listeo_core.october,
listeo_core.november,
listeo_core.december,
];
}
return locale;
}
if(typeof $.fn.daterangepicker==="function"&&typeof moment!=="undefined"){
$("#mb-date-range-input").daterangepicker({
opens: "right",
singleDatePicker: false,
timePicker: false,
autoUpdateInput: false,
locale: mbPickerLocale(),
});
$("#mb-date-range-input").on("apply.daterangepicker", function (ev, picker){
$(this)
.val(picker.startDate.format(mbDateFormat) + " - " + picker.endDate.format(mbDateFormat))
.attr("data-start", picker.startDate.format("YYYY-MM-DD"))
.attr("data-end", picker.endDate.format("YYYY-MM-DD"));
mbSchedulePreview();
});
$("#mb-date-range-input").on("cancel.daterangepicker", function (){
$(this).val("").removeAttr("data-start").removeAttr("data-end");
mbFeedback("");
});
$("#mb-date").daterangepicker({
opens: "right",
singleDatePicker: true,
timePicker: false,
autoUpdateInput: false,
locale: mbPickerLocale(),
});
$("#mb-date").on("apply.daterangepicker", function (ev, picker){
$(this)
.val(picker.startDate.format(mbDateFormat))
.attr("data-date", picker.startDate.format("YYYY-MM-DD"));
mbUpdateSlots();
mbSchedulePreview();
});
$("#mb-date").on("cancel.daterangepicker", function (){
$(this).val("").removeAttr("data-date");
mbFeedback("");
});
}
if(typeof $.fn.flatpickr==="function"){
var mbTime24 = !!(typeof listeo_core!=="undefined"&&listeo_core.clockformat);
var mbTimeOpts={
enableTime: true,
noCalendar: true,
dateFormat: "H:i",
time_24hr: mbTime24,
disableMobile: true,
minuteIncrement: typeof timePickerIncrement!=="undefined" ? timePickerIncrement:30,
};
if(!mbTime24){
mbTimeOpts.altInput=true;
mbTimeOpts.altFormat="h:i K";
}
$("#mb-hour-start").flatpickr($.extend({}, mbTimeOpts, {
onChange: function (selected){
var endEl=document.querySelector("#mb-hour-end");
if(endEl&&endEl._flatpickr&&selected[0]){
endEl._flatpickr.set("minTime", selected[0]);
}},
onClose: function (){
mbSchedulePreview();
},
})
);
$("#mb-hour-end").flatpickr($.extend({}, mbTimeOpts, {
onClose: function (){
mbSchedulePreview();
},
})
);
}
function mbClearDates(){
$("#mb-date-range-input").val("").removeAttr("data-start").removeAttr("data-end");
$("#mb-date").val("").removeAttr("data-date");
}
if(typeof $.fn.select2==="function"){
$("#mb-listing").select2({
dropdownParent: $("#mb-listing-row"),
width: "100%",
placeholder: $("#mb-listing").data("placeholder")||"",
minimumInputLength: 0,
language: {
noResults: function (){
return (typeof listeo_core!=="undefined"&&listeo_core.no_results_text)||"No results found";
},
},
ajax: {
url: listeo.ajaxurl,
type: "POST",
dataType: "json",
delay: 250,
cache: true,
data: function (params){
return {
action: "listeo_manual_booking_search_listings",
nonce: listeoBookings.manual_booking_nonce,
search: params.term||"",
page: params.page||1,
};},
processResults: function (data, params){
params.page=params.page||1;
return {
results: (data&&data.results)||[],
pagination: { more: !!(data&&data.pagination&&data.pagination.more) },
};},
},
});
}
function mbSections(show){
$("#manual-booking-dialog .mb-section").hide();
(show||[]).forEach(function (id){
$(id).show();
});
$("#mb-booking-details").toggle(!!(show&&show.length));
}
function mbFeedback(text, ok){
var $box=$("#mb-availability");
if(!text){
$box.hide();
return;
}
$box
.removeClass("mb-ok mb-bad")
.addClass(ok ? "mb-ok":"mb-bad")
.text(text)
.show();
}
function mbError(text){
var $box=$("#mb-error");
if(!text){
$box.hide();
return;
}
$box.text(text).show();
}
function mbUpdateSlots(){
if(!mbConfig||!mbConfig.has_slots) return;
var date=$("#mb-date").attr("data-date");
var $slot=$("#mb-slot").empty();
if(!date){
$slot.append($("<option>", { value: "", text: mbI18n.pick_date||"" }));
return;
}
var day=(new Date(date + "T00:00:00").getDay() + 6) % 7;
var found=0;
mbConfig.slots.forEach(function (slot){
if(slot.day===day){
$slot.append($("<option>", { value: slot.value, text: slot.hours }));
found++;
}});
if(!found){
$slot.append($("<option>", { value: "", text: mbI18n.no_slots||"" }));
}}
function mbRenderServices(services){
var $list=$("#mb-services-list").empty();
(services||[]).forEach(function (svc){
var $row=$('<label class="mb-service"></label>');
var $check=$('<input type="checkbox" class="mb-service-check">').val(svc.slug);
var $name=$('<span class="mb-service-name"></span>').text(svc.name);
var $price=$('<span class="mb-service-price"></span>').text(svc.price_formatted||"");
$row.append($check, $name, $price);
if(svc.quantity){
var $qty=$('<input type="number" class="mb-service-qty" min="1" step="1" value="1">');
if(svc.quantity_max) $qty.attr("max", svc.quantity_max);
$row.append($qty);
}
$list.append($row);
});
}
function mbCollectServices(){
var out=[];
$("#mb-services-list .mb-service-check:checked").each(function (){
var $row=$(this).closest(".mb-service");
var qty=parseInt($row.find(".mb-service-qty").val(), 10);
out.push({ service: $(this).val(), value: qty > 0 ? qty:1 });
});
return out;
}
function mbCollectBookingFields(){
if(!mbConfig) return null;
var data={
listing_id: $("#mb-listing").val(),
resource_id: $("#mb-resource").val()||0,
adults: $("#mb-adults").val()||1,
children: $("#mb-children").val()||0,
tickets: $("#mb-tickets").val()||1,
nonce: listeoBookings.manual_booking_nonce,
};
var services=mbCollectServices();
if(services.length){
data.services=services;
}
if(mbConfig.booking_type==="date_range"||mbConfig.booking_type==="rental"){
data.date_start=$("#mb-date-range-input").attr("data-start")||"";
data.date_end=$("#mb-date-range-input").attr("data-end")||"";
}else{
data.date_start=$("#mb-date").attr("data-date")||"";
if(mbConfig.has_slots){
data.slot=$("#mb-slot").val();
}else if(mbConfig.count_by_hour){
data.hour_start=$("#mb-hour-start").val();
data.hour_end=$("#mb-hour-end").val();
}}
return data;
}
function mbReadyForPreview(data){
if(!data||!data.listing_id||!data.date_start) return false;
if(mbConfig.has_slots&&!data.slot) return false;
if(!mbConfig.has_slots &&
mbConfig.count_by_hour &&
mbConfig.booking_type!=="date_range" &&
mbConfig.booking_type!=="rental" &&
(!data.hour_start||!data.hour_end)
){
return false;
}
return true;
}
function mbPreview(){
var data=mbCollectBookingFields();
mbError("");
if(!mbReadyForPreview(data)){
mbFeedback("");
return;
}
data.action="listeo_manual_booking_preview";
mbFeedback(mbI18n.checking||"...", true);
if(mbPreviewXhr) mbPreviewXhr.abort();
mbPreviewXhr=$.post(listeo.ajaxurl, data, function (response){
if(response&&response.success){
if(response.data.available){
var text=(mbI18n.available||"") + ". " + (mbI18n.suggested||"") + " " + response.data.price_formatted;
mbFeedback(text, true);
if(!mbPriceDirty){
$("#mb-price").val(response.data.price);
}}else{
mbFeedback(response.data.message, false);
}}else{
mbFeedback((response&&response.data&&response.data.message)||mbI18n.error||"", false);
}}, "json");
}
function mbSchedulePreview(){
clearTimeout(mbPreviewTimer);
mbPreviewTimer=setTimeout(mbPreview, 400);
}
$("#mb-listing").on("change", function (){
var listingId=$(this).val();
mbConfig=null;
mbFeedback("");
mbError("");
mbPriceDirty=false;
$("#mb-price").val("");
mbClearDates();
mbSections([]);
if(!listingId) return;
$.post(listeo.ajaxurl,
{
action: "listeo_manual_booking_listing_data",
listing_id: listingId,
nonce: listeoBookings.manual_booking_nonce,
},
function (response){
if(!response||!response.success){
mbError((response&&response.data&&response.data.message)||mbI18n.error||"");
return;
}
mbConfig=response.data;
var show=[];
if(mbConfig.booking_type==="date_range"||mbConfig.booking_type==="rental"){
show.push("#mb-date-range-section", "#mb-guests-section");
}else if(mbConfig.booking_type==="tickets"||mbConfig.booking_type==="event"){
show.push("#mb-single-date-section", "#mb-tickets-section");
if(mbConfig.event_date){
$("#mb-date").attr("data-date", mbConfig.event_date);
if(typeof moment!=="undefined"){
var eventMoment=moment(mbConfig.event_date, "YYYY-MM-DD");
$("#mb-date").val(eventMoment.format(mbDateFormat));
var eventPicker=$("#mb-date").data("daterangepicker");
if(eventPicker){
eventPicker.setStartDate(eventMoment);
eventPicker.setEndDate(eventMoment);
}}else{
$("#mb-date").val(mbConfig.event_date);
}}
}else{
show.push("#mb-single-date-section", "#mb-guests-section");
if(mbConfig.has_slots){
show.push("#mb-slot-section");
mbUpdateSlots();
}else{
show.push("#mb-hours-section");
}}
if(mbConfig.resources&&mbConfig.resources.length){
var $resource=$("#mb-resource").empty();
$resource.append($("<option>", { value: 0, text: mbI18n.any_resource||"" }));
mbConfig.resources.forEach(function (resource){
$resource.append($("<option>", { value: resource.id, text: resource.name }));
});
$("#mb-resource-label").text(mbConfig.resource_label);
show.push("#mb-resource-section");
}
if(mbConfig.services&&mbConfig.services.length){
mbRenderServices(mbConfig.services);
show.push("#mb-services-section");
}else{
$("#mb-services-list").empty();
}
mbSections(show);
mbSchedulePreview();
},
"json"
);
});
$("#manual-booking-dialog").on("change",
"#mb-slot, #mb-hour-start, #mb-hour-end, #mb-adults, #mb-children, #mb-tickets, #mb-resource",
function (){
mbSchedulePreview();
}
);
$("#manual-booking-dialog").on("change input",
"#mb-services-list .mb-service-check, #mb-services-list .mb-service-qty",
function (){
mbSchedulePreview();
}
);
$("#mb-price").on("input", function (){
mbPriceDirty=$(this).val()!=="";
});
$("#mb-email").on("input", function (){
$("#mb-notify-row").toggle($(this).val()!=="");
});
$("#manual-booking-dialog").on("click", "#mb-cancel", function (e){
e.preventDefault();
if($.magnificPopup&&$.magnificPopup.instance){
$.magnificPopup.close();
}});
$("#manual-booking-form").on("submit", function (e){
e.preventDefault();
var data=mbCollectBookingFields();
if(!data||!data.listing_id){
mbError(mbI18n.select_listing||"");
return;
}
data.action="listeo_manual_booking_create";
data.first_name=$("#mb-first-name").val();
data.last_name=$("#mb-last-name").val();
data.email=$("#mb-email").val();
data.phone=$("#mb-phone").val();
data.note=$("#mb-note").val();
data.price=$("#mb-price").val();
data.status=$("#mb-status").val();
if($("#mb-notify").is(":checked")&&data.email){
data.notify_guest=1;
}
var $button=$("#mb-submit");
if($button.hasClass("loading")) return;
$button.addClass("loading");
mbError("");
$.post(listeo.ajaxurl, data, function (response){
$button.removeClass("loading");
if(response&&response.success){
if($.magnificPopup&&$.magnificPopup.instance){
$.magnificPopup.close();
}
window.location.reload();
}else{
mbError((response&&response.data&&response.data.message)||mbI18n.error||"");
}}, "json").fail(function (){
$button.removeClass("loading");
mbError(mbI18n.error||"");
});
});
}});
})(this.jQuery);
(function ($){
"use strict";
$(document).ready(function (){
var defaultCategories=[
{
label: "Default",
children: [{ label: "Item 1" }, { label: "Item 2" }],
},
];
function hasRealChildren(item){
if(!item.children||item.children.length===0){
return false;
}
if(item.children.length===1){
var child=item.children[0];
if(child.value===item.value&&child.id===item.id){
return false;
}
if(child.label==="All in " + item.label){
return false;
}}
return true;
}
$(".drilldown-menu").each(function (){
var $menu=$(this);
var selectedItems=[];
var menuStack=[];
var initialized=false;
var singleSelect=$menu.data("single-select")===true;
var categories=$menu.data("categories");
if(typeof categories==="string"){
try {
categories=JSON.parse(categories);
} catch (e){
categories=defaultCategories;
}}else if(!categories){
categories=defaultCategories;
}
var $menuToggle=$menu.find(".menu-toggle");
var $menuPanel=$menu.find(".menu-panel");
var $menuLevelsContainer=$menu.find(".menu-levels");
var $menuLabel=$menu.find(".menu-label");
var $menuLabelText=$menu.data("label");
var $resetButton=$menu.find(".reset-button");
function itemMatchesSearch(item, searchTerm){
if($.trim(searchTerm)==="") return true;
var lowerSearch=searchTerm.toLowerCase();
if(item.label.toLowerCase().indexOf(lowerSearch)!==-1){
return true;
}
if(item.children&&item.children.length > 0){
for (var i=0; i < item.children.length; i++){
if(itemMatchesSearch(item.children[i], searchTerm)){
return true;
}}
}
return false;
}
function initMenu(){
menuStack=[];
menuStack.push({ data: categories, parent: null });
$menuLevelsContainer.empty();
var $levelElement=createMenuLevel(categories, 0);
$menuLevelsContainer.append($levelElement);
updateMenuLevelPosition();
updateMenuHeight();
initializePreselectedValues();
}
function createMenuLevel(data, levelIndex){
var $levelDiv=$("<div/>")
.addClass("menu-level")
.attr("data-level", levelIndex);
if(levelIndex > 0){
var $backButton=$("<button/>")
.addClass("back-button")
.text(listeo_core.back)
.on("click", function (e){
e.stopPropagation();
drillUp();
});
$levelDiv.append($backButton);
}
var $searchInput=$("<input/>", {
type: "text",
placeholder: listeo_core.search,
class: "menu-search",
}).on("input", function (){
filterMenuLevel($levelDiv, $searchInput.val());
});
$levelDiv.append($searchInput);
var $itemsContainer=$("<div/>").addClass("menu-items");
$levelDiv.append($itemsContainer);
$.each(data, function (i, item){
var $itemDiv=$("<div/>")
.addClass("menu-item")
.attr("data-label", item.label);
if(item.value){
$itemDiv.attr("data-value", item.value);
}
if(item.id){
$itemDiv.attr("data-id", item.id);
}
$itemDiv.data("item", item);
var $labelSpan=$("<span/>")
.addClass("item-label")
.text(item.label);
$itemDiv.append($labelSpan);
if(hasRealChildren(item)){
var $arrowSpan=$("<span/>").addClass("arrow");
$itemDiv.append($arrowSpan);
$itemDiv.on("click", function (e){
e.stopPropagation();
drillDown(item);
});
}else{
$itemDiv.on("click", function (e){
e.stopPropagation();
$(".category-item").removeClass("active");
var menuId=$menu.attr("id");
if(menuId&&menuId.startsWith("listeo-drilldown-tax-")){
var taxonomyName=menuId.replace("listeo-drilldown-tax-", "");
var sliderInputName="tax-" + taxonomyName;
$("#listeo_core-search-form")
.find('input[name="' + sliderInputName + '"]:not([name*="["])')
.remove();
}
toggleSelection(item, $itemDiv);
});
if(isSelected(item)){
$itemDiv.addClass("selected");
}}
$itemsContainer.append($itemDiv);
});
return $levelDiv;
}
function filterMenuLevel($levelDiv, searchTerm){
var $itemsContainer=$levelDiv.find(".menu-items");
var $items=$itemsContainer.find(".menu-item");
var anyVisible=false;
$levelDiv.find(".no-results").remove();
$items.each(function (){
var $item=$(this);
var itemObj=$item.data("item");
var label=itemObj.label;
var lowerSearch=$.trim(searchTerm).toLowerCase();
var directMatch =
lowerSearch!=="" &&
label.toLowerCase().indexOf(lowerSearch) > -1;
var matches=itemMatchesSearch(itemObj, searchTerm);
if(matches){
$item.css("display", "flex");
anyVisible=true;
var $labelSpan=$item.find(".item-label");
$item.removeClass("child-match");
$labelSpan.text(label);
if($.trim(searchTerm)!==""){
if(directMatch){
var regex=new RegExp(
"(" + escapeRegExp(searchTerm) + ")",
"gi"
);
$labelSpan.html(label.replace(regex, "<mark>$1</mark>"));
}else{
$item.addClass("child-match");
}}
}else{
$item.css("display", "none");
}});
if(!anyVisible){
var $noResults=$("<div/>")
.addClass("no-results")
.text("No results");
$itemsContainer.append($noResults);
}
updateMenuHeight();
}
function escapeRegExp(string){
return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
}
function drillDown(category){
if(!category.children||category.children.length===0) return;
var $currentLevel=$menuLevelsContainer.children().last();
var parentSearchTerm=$currentLevel.find(".menu-search").val();
menuStack.push({ data: category.children, parent: category });
var levelIndex=menuStack.length - 1;
var $newLevel=createMenuLevel(category.children, levelIndex);
$newLevel.find(".menu-search").val(parentSearchTerm);
filterMenuLevel($newLevel, parentSearchTerm);
$menuLevelsContainer.append($newLevel);
updateMenuLevelPosition();
setTimeout(updateMenuHeight, 0);
}
function drillUp(){
if(menuStack.length <=1) return;
menuStack.pop();
$menuLevelsContainer.children().last().remove();
updateMenuLevelPosition();
updateMenuHeight();
}
function findItemByValue(categories, value){
for (var i=0; i < categories.length; i++){
var item=categories[i];
if($("#submit-listing-form").length){
if(item.id==value){
return item;
}}else{
if(item.id==value){
return item;
}
var directMatch=item.value===value;
var prefixedMatch=item.value===("listing_category:" + value);
var labelMatch = !item.value&&item.label===value;
if(directMatch||prefixedMatch||labelMatch){
return item;
}}
if(item.children&&item.children.length > 0){
var found=findItemByValue(item.children, value);
if(found) return found;
}}
return null;
}
if(!window.ListeoDrilldown) window.ListeoDrilldown={};
window.ListeoDrilldown[$menu.attr("id")]={
initMenu: initMenu,
selectById: function (categoryId){
initMenu();
setTimeout(function (){
const item=findItemByValue(categories, categoryId);
if(item){
const $fake=$("<div>")
.addClass("menu-item")
.attr("data-id", categoryId);
toggleSelection(item, $fake);
}else{
resetSelections();
}}, 20);
},
selectListingType: function (slug){
initMenu();
setTimeout(function (){
var typeValue="all_" + slug;
var parent =
findItemByValue(categories, typeValue) ||
findItemByValue(categories, slug);
if(parent){
var target=parent;
if(parent.children&&parent.children.length){
var allChild=parent.children.find(function (c){
return c.value==="type" + slug;
});
if(allChild){
target=allChild;
}}
var $fake=jQuery("<div>").addClass("menu-item");
toggleSelection(target, $fake);
}else{
resetSelections();
}}, 20);
},
};
function updateVisualSelection(){
$menu.find(".menu-item.selected").removeClass("selected");
selectedItems.forEach(function(item){
$menu
.find('.menu-item[data-value="' + (item.value||item.label) + '"]')
.addClass("selected");
if(item.id){
$menu
.find('.menu-item[data-id="' + item.id + '"]')
.addClass("selected");
}});
}
function initializePreselectedValues(){
selectedItems=[];
var inputName=$menu.data("name");
console.log("Initializing preselected values for input name:", inputName);
var $existingInputs=$menu.find("input.drilldown-values");
console.log("Found existing inputs:", $existingInputs.length);
$existingInputs.each(function (){
var value=$(this).val();
if(value&&value.trim()!==''){
console.log("Found existing input value:", value);
var item=findItemByValue(categories, value.trim());
if(item){
selectedItems.push(item);
}}
});
if(selectedItems.length > 0){
updateMainButton();
updateHiddenInput();
updateVisualSelection();
}}
function updateHiddenInput(){
var inputName=$menu.data("name");
$menu.find("input.drilldown-values").remove();
$menu.find("input.drilldown-generated").remove();
selectedItems.forEach(function (item){
if($("#submit-listing-form").length){
var value=item.id;
}else{
var value=item.value||item.label;
}
var menuId=$menu.attr("id");
if(menuId&&menuId.startsWith("listeo-drilldown-tax-")&&!menuId.includes("listing-types")){
if(typeof value==='string'&&value.includes(':')){
var parts=value.split(':');
if(parts.length===2){
value=parts[1];
}}
}
$("<input>", {
type: "hidden",
name: inputName + "[]",
value: value,
"data-label": item.label,
class: "drilldown-values drilldown-generated",
}).appendTo($menu);
});
var target=$("div#listeo-listings-container");
target.triggerHandler("update_results", [1, false]);
$menu.trigger("drilldown-updated");
}
function updateMenuLevelPosition(){
var levelIndex=menuStack.length - 1;
$menuLevelsContainer.css("transform",
"translateX(-" + levelIndex * 100 + "%)"
);
}
function updateMenuHeight(){
var $levels=$menuLevelsContainer.children();
if($levels.length===0) return;
var $activeLevel=$levels.last();
$menuPanel.height($activeLevel[0].scrollHeight);
}
function toggleSelection(item, $itemDiv){
var index=selectedItems.findIndex(function (selected){
if($("#submit-listing-form").length){
if(item.id&&selected.id){
return selected.id===item.id;
}}else{
if(item.value&&selected.value){
return selected.value===item.value;
}}
return selected.label===item.label;
});
if(index > -1){
selectedItems.splice(index, 1);
$itemDiv.removeClass("selected");
$menu
.find('.menu-item[data-value="' + (item.value||item.label) + '"]'
)
.removeClass("selected");
if(item.id){
$menu
.find('.menu-item[data-id="' + item.id + '"]')
.removeClass("selected");
}}else{
if(singleSelect){
$menu.find(".menu-item.selected").removeClass("selected");
selectedItems=[];
}
if(!isSelected(item)){
selectedItems.push(item);
}
$itemDiv.addClass("selected");
$menu
.find('.menu-item[data-value="' + (item.value||item.label) + '"]'
)
.addClass("selected");
if(item.id){
$menu
.find('.menu-item[data-id="' + item.id + '"]')
.addClass("selected");
}}
updateMainButton();
updateHiddenInput();
}
function isSelected(item){
return selectedItems.some(function (selected){
if($("#submit-listing-form").length){
if(item.id&&selected.id){
return selected.id===item.id;
}}else{
if(item.value&&selected.value){
return selected.value===item.value;
}}
return selected.label===item.label;
});
}
function updateMainButton(){
var searchTerm =
$menuLevelsContainer.children().last().find(".menu-search").val() ||
"";
if(selectedItems.length===0){
$menuLabel.html($menuLabelText);
$resetButton.hide();
$menuToggle.removeClass("dd-chosen");
}else if(selectedItems.length===1){
var label=selectedItems[0].label;
if($.trim(searchTerm)!==""){
var regex=new RegExp(
"(" + escapeRegExp(searchTerm) + ")",
"gi"
);
label=label.replace(regex, "<mark>$1</mark>");
}
$menuLabel.html(label);
$resetButton.show();
$menuToggle.addClass("dd-chosen");
}else{
var label=selectedItems[0].label;
if($.trim(searchTerm)!==""){
var regex=new RegExp(
"(" + escapeRegExp(searchTerm) + ")",
"gi"
);
label=label.replace(regex, "<mark>$1</mark>");
}
$menuLabel.html(label + " +" + (selectedItems.length - 1));
$resetButton.show();
$menuToggle.addClass("dd-chosen");
}}
function resetSelections(){
selectedItems=[];
$menu.find(".menu-item.selected").removeClass("selected");
$menuLevelsContainer
.find(".menu-item.selected")
.removeClass("selected");
console.log("$menuLabel:", $menuLabel);
console.log("$menuLabelText:", $menuLabelText);
console.log("Current label HTML:", $menuLabel.html());
if($menuLabelText){
$menuLabel.html($menuLabelText);
}else{
var originalText =
$menu.data("label") ||
$menu.attr("data-label") ||
"Select an option";
console.log("Using fallback text:", originalText);
$menuLabel.html(originalText);
}
$resetButton.hide();
$menuToggle.removeClass("dd-chosen");
updateHiddenInput();
}
function openMenu(){
$(".drilldown-menu")
.not($menu)
.each(function (){
$(this).find(".menu-panel").removeClass("open");
$(this).find(".menu-toggle").removeClass("dd-active");
});
if($.fn.selectpicker){
$(".bootstrap-select.show").each(function (){
$(this).removeClass("show");
$(this).find(".dropdown-menu").removeClass("show");
});
$(".bootstrap-select.open").each(function (){
$(this).removeClass("open");
$(this).find(".dropdown-menu").removeClass("open");
});
}
$menuPanel.addClass("open");
$menuToggle.addClass("dd-active");
if(!initialized){
initMenu();
initialized=true;
}else{
restoreSelectedState();
}}
function restoreSelectedState(){
selectedItems.forEach(function (selectedItem){
var selector="";
if(selectedItem.id){
selector='[data-id="' + selectedItem.id + '"]';
}else if(selectedItem.value){
selector='[data-value="' + selectedItem.value + '"]';
}else{
selector='[data-label="' + selectedItem.label + '"]';
}
$menu.find(".menu-item" + selector).addClass("selected");
});
updateMainButton();
}
function closeMenu(){
$menuPanel.removeClass("open");
$menuToggle.removeClass("dd-active");
}
$menuToggle.on("click", function (e){
e.stopPropagation();
if($menuPanel.hasClass("open")){
closeMenu();
}else{
openMenu();
}});
$resetButton.on("click", function (e){
e.stopPropagation();
resetSelections();
$(".category-item").removeClass("active");
});
$(document).on("click", function (e){
if(!$menu.is(e.target)&&$menu.has(e.target).length===0){
closeMenu();
}});
if($menu.find("input.drilldown-values[value!='']").length > 0){
initMenu();
initialized=true;
}});
window.selectDrilldownCategoryById=function (categoryId){
$(".drilldown-menu").each(function (){
var $menu=$(this);
var $matchingItem=$menu.find('.menu-item[data-id="${categoryId}"]');
console.log("Matching item:", $matchingItem);
if($matchingItem.length){
$matchingItem.trigger("click");
console.log("Item clicked:", $matchingItem.text());
}});
};});
})(this.jQuery);
(function($){
'use strict';
$(document).ready(function(){
if($('#my-listings-category').length > 0){
if($.fn.select2){
$('#my-listings-category').select2({
width: '100%',
minimumResultsForSearch: 10,
dropdownPosition: "below",
placeholder: $('#my-listings-category option:first').text()
});
}}
$('#my-listings-search').on('keypress', function(e){
if(e.which===13){
$('#my-listings-search-form').submit();
}});
});
})(jQuery);