// Parse a numeric min/max attribute while preserving a legitimate 0. // `parseInt(el.getAttribute('max')) || 99` treated max="0" — what a sold-out // departure renders — as "unset" and fell back to the placeholder ceiling, so // the guest selector stayed usable and ignored the departure's real capacity. // Only an absent or non-numeric value may fall back. Installed once and shared // by every frontend script, so load order does not matter. if (typeof window.yatraNumOr !== 'function') { window.yatraNumOr = function (raw, fallback) { var parsed = parseInt(raw, 10); return isNaN(parsed) ? fallback : parsed; }; } function yatraScrollToBooking() { const bookingForm = document.querySelector('.yatra-booking-form'); if (bookingForm) { bookingForm.scrollIntoView({ behavior: 'smooth', block: 'center' }); } else { // Fallback to main sidebar const sidebar = document.querySelector('.yatra-trip-sidebar'); if (sidebar) { sidebar.scrollIntoView({ behavior: 'smooth', block: 'start' }); } } } function yatraScrollToContact() { const contactSection = document.querySelector('#contact') || document.querySelector('.yatra-contact-form'); if (contactSection) { contactSection.scrollIntoView({ behavior: 'smooth', block: 'center' }); } } function yatraCloseMobileSidebar() { const sidebar = document.getElementById('yatra-mobile-sticky-sidebar'); if (sidebar) { sidebar.classList.add('user-closed'); // Save closed state in sessionStorage (persists until page reload) sessionStorage.setItem('yatra-mobile-sidebar-closed', 'true'); // Hide sidebar with animation setTimeout(() => { sidebar.style.transform = 'translateY(100%)'; sidebar.style.opacity = '0'; }, 100); } } // Auto-show on page load (reset closed state) document.addEventListener('DOMContentLoaded', function() { const sidebar = document.getElementById('yatra-mobile-sticky-sidebar'); if (sidebar) { // Clear any previous closed state on page load sessionStorage.removeItem('yatra-mobile-sidebar-closed'); // Ensure sidebar is visible on page load (CSS will handle responsive) sidebar.classList.remove('user-closed'); sidebar.classList.remove('hidden'); } // Initialize mobile booking form functionality initializeMobileBookingForm(); }); function initializeMobileBookingForm() { // Mobile quantity controls const mobileMinusBtns = document.querySelectorAll('.yatra-mobile-quantity-minus'); const mobilePlusBtns = document.querySelectorAll('.yatra-mobile-quantity-plus'); mobileMinusBtns.forEach(btn => { btn.addEventListener('click', function() { const targetId = this.getAttribute('data-target'); const input = document.getElementById(targetId); if (input) { const current = parseInt(input.value) || 1; const min = window.yatraNumOr(input.getAttribute('min'), 1); if (current > min) { input.value = current - 1; updateMobileTotal(); } } }); }); mobilePlusBtns.forEach(btn => { btn.addEventListener('click', function() { const targetId = this.getAttribute('data-target'); const input = document.getElementById(targetId); if (input) { const current = parseInt(input.value) || 1; const max = window.yatraNumOr(input.getAttribute('max'), 20); if (current < max) { input.value = current + 1; updateMobileTotal(); } } }); }); // Mobile date picker - Initialize exactly like main date picker const mobileDateInput = document.getElementById('mobile_travel_date'); if (mobileDateInput && mobileDateInput.tagName === 'SELECT') { // Pro "date-as-dropdown" mode: native consumers (date-as-dropdown Pro mode) listen for // `change` — emit one so downstream handlers wake up. if (mainDate.tagName === 'SELECT') { mainDate.dispatchEvent(new Event('change', { bubbles: true })); } } } // Sync travelers const mobileTravelers = document.getElementById('mobile_num_travelers'); const mainTravelers = document.getElementById('num_travelers'); if (mobileTravelers && mainTravelers) { mainTravelers.value = mobileTravelers.value; } // Sync traveler-based pricing (mobile selector -> desktop selector) const mobileTravelerInputs = document.querySelectorAll('#mobile-quantity-selector input[id^="mobile_traveler_"]'); if (mobileTravelerInputs && mobileTravelerInputs.length > 0) { mobileTravelerInputs.forEach((input) => { const desktopId = input.id.replace(/^mobile_/, ''); const desktopInput = document.getElementById(desktopId); if (desktopInput) { desktopInput.value = input.value; } }); } } function updateMobileTotal() { const sidebar = document.getElementById('yatra-mobile-sticky-sidebar'); if (!sidebar) return; const pricingType = (window.yatraTripData && window.yatraTripData.pricingType) ? window.yatraTripData.pricingType : 'regular'; const mobileTotal = document.getElementById('mobile-total-amount'); if (!mobileTotal) return; let total = 0; if (pricingType === 'traveler_based') { // Traveler-based pricing: sum all category quantities × prices const travelerInputs = document.querySelectorAll('[id^="mobile_traveler_"]'); travelerInputs.forEach(input => { const qty = parseInt(input.value) || 0; const price = parseFloat(input.getAttribute('data-price')) || 0; total += qty * price; }); } else { // Regular pricing: simple multiplication const travelersInput = document.getElementById('mobile_num_travelers'); if (travelersInput) { const travelers = parseInt(travelersInput.value) || 1; const basePrice = parseFloat(travelersInput.getAttribute('data-price')) || 0; total = travelers * basePrice; } } // Format and update display (mobile total element has been removed) // The mobile total price display is no longer shown if (mobileTotal) { if (window.yatraTripData && window.yatraTripData.currencySymbol) { mobileTotal.textContent = window.yatraTripData.currencySymbol + total.toFixed(2); } else { mobileTotal.textContent = formatCurrency(total); } } // Also sync with main form total if it exists (main total also removed) const mainTotal = document.getElementById('total-amount'); if (mainTotal && window.yatraTripData && window.yatraTripData.currencySymbol) { mainTotal.textContent = window.yatraTripData.currencySymbol + total.toFixed(2); } } function formatCurrency(amount) { // Simple currency formatting (can be enhanced) return '$' + amount.toFixed(2); } // Auto-hide on scroll down, show on scroll up (also works for enquiry-only sticky) let lastScrollTop = 0; const mobileSidebar = document.getElementById('yatra-mobile-sticky-sidebar'); const scrollThreshold = 100; window.addEventListener('scroll', function() { if (!mobileSidebar) return; const scrollTop = window.pageYOffset || document.documentElement.scrollTop; if (scrollTop > lastScrollTop && scrollTop > scrollThreshold) { // Scrolling down - hide sidebar mobileSidebar.classList.add('hidden'); } else { // Scrolling up - show sidebar mobileSidebar.classList.remove('hidden'); } lastScrollTop = scrollTop <= 0 ? 0 : scrollTop; }, false);