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'); } }); } }); $('