jQuery(document).ready(function($) {
let selectedTimeSlot = "";
let selectedDate = "";
let isProcessing = false;
let buttonCheckInterval;
// Check if input has valid date + time slot format
function isValidBookingFormat(value) {
if (!value || value.trim() === '') {
return false;
}
if (value.indexOf(' - ') === -1) {
return false;
}
var parts = value.split(' ');
if (parts.length < 3) {
return false;
}
var datePart = parts[0];
var dateRegex = /^\d{2}-\d{2}-\d{4}$/;
if (!dateRegex.test(datePart)) {
return false;
}
var timePart = parts.slice(1).join(' ');
if (!timePart.includes(' - ')) {
return false;
}
return true;
}
// Check if Gold package is selected
function isGoldPackageSelected() {
var selectedPackage = $('input[name="linked_packages[]"]:checked');
if (selectedPackage.length === 0) return false;
var packageId = selectedPackage.val();
var packageSlug = selectedPackage.data('package-slug');
return (packageId === '3' || packageSlug === 'gold');
}
// Validate Gold package service selection
function validateGoldPackageService() {
if (!isGoldPackageSelected()) {
return true; // Not gold package, validation passes
}
var goldService = $('select[name="gold_package_service"]').val();
var isValid = goldService && goldService !== '';
console.log(" Gold validation:", {
isGoldSelected: true,
dropdownValue: goldService,
isValid: isValid
});
return isValid;
}
// Update button state - INSTANT feedback
function updateAddToCartButton() {
var inputValue = $("#wps_booking_single_calendar_form").val();
var isValidDateTime = isValidBookingFormat(inputValue);
var button = $('.single_add_to_cart_button');
var packageSelected = $('input[name="linked_packages[]"]:checked').length > 0;
var goldServiceValid = validateGoldPackageService();
var allValid = isValidDateTime && packageSelected && goldServiceValid;
if (allValid) {
button.prop('disabled', false)
.removeClass('disabled-booking')
.css({
'opacity': '1',
'cursor': 'pointer',
'background-color': '',
'color': ''
})
.text('Add to cart');
console.log(" Button ENABLED");
} else {
var buttonText = 'Select Date & Time Slot';
if (!isValidDateTime) {
buttonText = 'Select Date & Time Slot';
} else if (!packageSelected) {
buttonText = 'Select Package';
} else if (!goldServiceValid) {
buttonText = 'Select Hot Food Platter';
}
button.prop('disabled', true)
.addClass('disabled-booking')
.css({
'opacity': '0.5',
'cursor': 'not-allowed',
'background-color': '#ccc',
'color': '#666'
})
.text(buttonText);
}
return allValid;
}
// Reset everything
function resetDateTimeSelection() {
$("#wps_booking_single_calendar_form").val("");
selectedTimeSlot = "";
selectedDate = "";
$(".time-slot").removeClass("selected active").removeAttr('style');
$("#formatted_booking_date").val("");
$('#hidden_booking_date').val("");
$('#hidden_booking_time').val("");
$('form.cart').attr('data-booking-date', '');
$('form.cart').attr('data-booking-time', '');
updateAddToCartButton();
}
// Monitor input changes
$("#wps_booking_single_calendar_form").on("input change keyup paste", function() {
updateAddToCartButton();
});
// INSTANT: Monitor package selection changes
$(document).on('change', 'input[name="linked_packages[]"]', function() {
console.log(" Package changed to:", $(this).val());
// If Gold is selected, show message
if (isGoldPackageSelected()) {
console.log(" Gold package selected - waiting for platter selection");
}
// Instantly update button
updateAddToCartButton();
});
// INSTANT: Monitor Gold service dropdown - MULTIPLE EVENTS
$(document).on('change input', 'select[name="gold_package_service"]', function() {
var selectedValue = $(this).val();
var selectedText = $(this).find('option:selected').text().trim();
console.log("🍽️ Gold service changed:", {
value: selectedValue,
text: selectedText
});
// Instantly update button
updateAddToCartButton();
});
// Handle calendar click
$("#wps_booking_single_calendar_form").on("click focus", function(e) {
var currentValue = $(this).val();
if (currentValue && isValidBookingFormat(currentValue)) {
resetDateTimeSelection();
if ($(this).datetimepicker) {
$(this).datetimepicker('resetDates');
}
}
});
// Time slot selection
$(document).off('click touchend', '.time-slot').on('click touchend', '.time-slot', function(e) {
e.preventDefault();
e.stopPropagation();
if ($(this).hasClass('disabled') || $(this).prop('disabled')) {
alert("This time slot is not available. Please select another time.");
return false;
}
var clickedTimeSlot = $(this).text().trim();
var currentDate = $("#wps_booking_single_calendar_form").val();
if (currentDate && currentDate.indexOf(' ') !== -1) {
currentDate = currentDate.split(' ')[0];
}
if (!currentDate || currentDate.trim() === '') {
alert("Please select a date first before choosing a time slot.");
return false;
}
selectedTimeSlot = clickedTimeSlot;
selectedDate = currentDate;
var combinedDateTime = currentDate + ' ' + clickedTimeSlot;
$("#wps_booking_single_calendar_form").val(combinedDateTime);
updateFormattedDate(currentDate, clickedTimeSlot);
$('form.cart').attr('data-booking-date', currentDate);
$('form.cart').attr('data-booking-time', clickedTimeSlot);
$("#wps_booking_single_calendar_form").trigger('change');
});
function updateFormattedDate(date, time) {
if (!date || !time) return;
var combinedDateTime = date + ' ' + time;
if ($('#formatted_booking_date').length === 0) {
$('form.cart').append('');
}
$('#formatted_booking_date').val(combinedDateTime);
if ($('#hidden_booking_date').length === 0) {
$('form.cart').append('');
$('form.cart').append('');
}
$('#hidden_booking_date').val(date);
$('#hidden_booking_time').val(time);
}
// Date change handler
$("#wps_booking_single_calendar_form").on("change", function() {
var newValue = $(this).val();
if (newValue && !isValidBookingFormat(newValue)) {
selectedTimeSlot = "";
$(".time-slot").removeClass("selected active").removeAttr('style');
}
updateAddToCartButton();
});
// Prevent form submission if disabled
$('form.cart').on('submit', function(e) {
e.preventDefault();
e.stopPropagation();
if ($('.single_add_to_cart_button').prop('disabled')) {
if (!validateGoldPackageService()) {
alert("Please select a hot food platter for the Gold Package before proceeding.");
} else {
alert("Please complete all required selections.");
}
return false;
}
$('.single_add_to_cart_button').trigger('click');
return false;
});
// Add to cart handler with validation
// Add to cart handler with validation
$('.single_add_to_cart_button').off('click').on('click', function(e) {
e.preventDefault();
e.stopPropagation();
if ($(this).prop('disabled')) {
alert("Please complete all required selections first.");
return false;
}
if (isProcessing) {
console.log(" Already processing...");
return false;
}
var inputValue = $("#wps_booking_single_calendar_form").val();
if (!isValidBookingFormat(inputValue)) {
alert("Please select both date and time slot in the correct format.");
return false;
}
var linked_packages = $('input[name="linked_packages[]"]:checked').val();
var packageName = $('input[name="linked_packages[]"]:checked').closest('label').text().trim();
if (!linked_packages) {
alert("Please select a package.");
return false;
}
// TRIPLE VALIDATION for Gold Package
if (linked_packages === '3' || $('input[name="linked_packages[]"]:checked').data('package-slug') === 'gold') {
if ($('select[name="gold_package_service"]').length === 0) {
console.error("Gold service dropdown not found");
alert("Error: Gold package service selector not found. Please refresh the page.");
return false;
}
var gold_service = $('select[name="gold_package_service"]').val();
if (!gold_service || gold_service === '') {
console.error("No gold service selected");
alert("Please select a hot food platter for the Gold Package.");
$('select[name="gold_package_service"]').focus().css({
'border': '3px solid red',
'box-shadow': '0 0 10px red'
});
setTimeout(function() {
$('select[name="gold_package_service"]').css({
'border': '',
'box-shadow': ''
});
}, 3000);
return false;
}
var selectedOption = $('select[name="gold_package_service"] option:selected');
if (selectedOption.length === 0 || selectedOption.val() === '') {
console.error("Invalid gold service option");
alert("Please select a valid hot food platter for the Gold Package.");
return false;
}
console.log(" Gold Package Validated:", {
serviceId: gold_service,
serviceName: selectedOption.text().trim()
});
}
// ✅ LOCK VALUES AT CLICK TIME - DOM dobara nahi padhenge
var lockedGoldService = '';
var lockedGoldServiceName = '';
if ($('select[name="gold_package_service"]').length > 0) {
lockedGoldService = $('select[name="gold_package_service"]').val() || '';
lockedGoldServiceName = $('select[name="gold_package_service"] option:selected').text().trim() || '';
}
console.log("🔒 Gold LOCKED at click time:", {
id: lockedGoldService,
name: lockedGoldServiceName
});
console.log(" All validations passed");
isProcessing = true;
$(this).prop('disabled', true).text('Verifying Availability...');
var productId = $(this).val();
var productName = $('h1.product_title').text().trim();
var currentSessionId = localStorage.getItem('booking_session_id_' + productId) || '';
// Double-check slot availability
$.ajax({
url: wc_add_to_cart_params.ajax_url,
type: 'POST',
dataType: 'json',
data: {
action: 'refresh_blocked_slots_with_timer',
product_id: productId,
client_session_id: currentSessionId
},
success: function(checkResponse) {
if (checkResponse.success && Array.isArray(checkResponse.data)) {
var slotStillAvailable = true;
var conflictFound = false;
checkResponse.data.forEach(function(slotData) {
if (slotData.slot === inputValue) {
if (!slotData.is_own) {
slotStillAvailable = false;
conflictFound = true;
}
}
});
if (!slotStillAvailable && conflictFound) {
alert('This slot was just booked by another customer. Please select a different time slot.');
isProcessing = false;
$('.single_add_to_cart_button').prop('disabled', false).text('Add to cart');
setTimeout(function() {
window.location.reload();
}, 1000);
return;
}
proceedWithSessionStorage(lockedGoldService, lockedGoldServiceName);
} else {
proceedWithSessionStorage(lockedGoldService, lockedGoldServiceName);
}
},
error: function(xhr, status, error) {
console.error('Verification failed:', error);
proceedWithSessionStorage(lockedGoldService, lockedGoldServiceName);
}
});
// Store booking data in session
function proceedWithSessionStorage(goldService, goldServiceName) {
$('.single_add_to_cart_button').text('Storing Booking Data...');
var linked_services = $('input[name="linked_services[]"]:checked').map(function() {
return $(this).val();
}).get();
var linked_services_names = $('input[name="linked_services[]"]:checked').map(function() {
return $(this).closest('label').text().trim();
}).get();
var linked_service_qty = {};
$('input[name="linked_services[]"]:checked').each(function() {
var serviceId = $(this).val();
var qtyInput = $('input[name="linked_service_qty[' + serviceId + ']"]');
if (qtyInput.length > 0) {
linked_service_qty[serviceId] = qtyInput.val();
}
});
var linked_services_packages_qty = {};
$('input[name^="linked_services_packages_qty"]').each(function() {
var packageId = $(this).attr('name').match(/\d+/)[0];
linked_services_packages_qty[packageId] = $(this).val();
});
// ✅ USE LOCKED VALUES - DOM se dobara nahi padha
var gold_package_service = goldService;
var gold_package_service_name = goldServiceName;
console.log("📦 Using LOCKED gold service in session:", {
id: gold_package_service,
name: gold_package_service_name
});
$.ajax({
url: wc_add_to_cart_params.ajax_url,
type: 'POST',
dataType: 'json',
timeout: 30000,
data: {
action: 'store_booking_data_in_session',
product_id: productId,
product_name: productName,
selected_date: selectedDate,
selected_time_slot: selectedTimeSlot,
linked_services: linked_services,
linked_services_names: linked_services_names,
selected_packages: linked_packages,
package_name: packageName,
linked_service_qty: linked_service_qty,
linked_services_packages_qty: linked_services_packages_qty,
gold_package_service: gold_package_service,
gold_package_service_name: gold_package_service_name,
formatted_booking_date: inputValue,
hidden_booking_date: selectedDate,
hidden_booking_time: selectedTimeSlot
},
success: function(sessionResponse) {
console.log('Data stored in session:', sessionResponse);
proceedWithCartAdd(goldService, goldServiceName);
},
error: function(xhr, status, error) {
console.error('Session Storage Error:', error);
alert('Error storing booking data. Please try again.');
isProcessing = false;
$('.single_add_to_cart_button').prop('disabled', false).text('Add to cart');
}
});
}
// Proceed with cart addition
function proceedWithCartAdd(goldService, goldServiceName) {
$('.single_add_to_cart_button').text('Adding to Cart...');
var linked_services = $('input[name="linked_services[]"]:checked').map(function() {
return $(this).val();
}).get();
var linked_services_names = $('input[name="linked_services[]"]:checked').map(function() {
return $(this).closest('label').text().trim();
}).get();
var linked_service_qty = {};
$('input[name="linked_services[]"]:checked').each(function() {
var serviceId = $(this).val();
var qtyInput = $('input[name="linked_service_qty[' + serviceId + ']"]');
if (qtyInput.length > 0) {
linked_service_qty[serviceId] = qtyInput.val();
}
});
var linked_services_packages_qty = {};
$('input[name^="linked_services_packages_qty"]').each(function() {
var packageId = $(this).attr('name').match(/\d+/)[0];
linked_services_packages_qty[packageId] = $(this).val();
});
// ✅ USE LOCKED VALUES - DOM se dobara nahi padha
var gold_package_service = goldService;
var gold_package_service_name = goldServiceName;
console.log("🛒 Using LOCKED gold service for cart:", {
id: gold_package_service,
name: gold_package_service_name
});
var cartData = {
action: 'add_to_cart',
product_id: productId,
product_name: productName,
selected_date: inputValue,
selected_time_slot: selectedTimeSlot,
linked_services: linked_services,
linked_services_names: linked_services_names,
selected_packages: linked_packages,
package_name: packageName,
linked_service_qty: linked_service_qty,
linked_services_packages_qty: linked_services_packages_qty,
gold_package_service: gold_package_service,
gold_package_service_name: gold_package_service_name,
formatted_booking_date: inputValue,
hidden_booking_date: selectedDate,
hidden_booking_time: selectedTimeSlot,
client_session_id: currentSessionId
};
console.log("🛒 Sending to cart:", cartData);
$.ajax({
url: wc_add_to_cart_params.ajax_url,
type: 'POST',
dataType: 'json',
timeout: 30000,
data: cartData,
success: function(response) {
console.log(' Cart response:', response);
if (response.success) {
localStorage.setItem('last_booking_selection', inputValue);
window.location.href = response.data.redirect_url;
} else {
console.error("Cart add failed:", response.data);
alert(response.data || 'This time slot is no longer available.');
isProcessing = false;
$('.single_add_to_cart_button').prop('disabled', false).text('Add to cart');
setTimeout(function() {
window.location.reload();
}, 1000);
}
},
error: function(xhr, status, error) {
console.error('Cart AJAX Error:', error);
alert('Error adding to cart. Please try again.');
isProcessing = false;
$('.single_add_to_cart_button').prop('disabled', false).text('Add to cart');
}
});
}
});
$('