Do Dham with 16 Seater from Delhi  ( 7 Days )
7 days From ₹63000

Do Dham with 16 Seater from Delhi ( 7 Days )

Overview

Do Dham Yatra

Do Dham Yatra

The Do Dham Yatra refers to a popular pilgrimage circuit in India that involves visiting two out of the four sacred Hindu pilgrimage sites in Uttarakhand. These four sites are collectively known as the Char Dham, and they hold significant religious importance in Hinduism. The Do Dham Yatra is considered a spiritually rewarding journey and is less time-consuming compared to the Chota Char Dham Yatra, which covers all four pilgrimage sites.

The two pilgrimage sites included in the Do Dham Yatra are:

  1. Badrinath: Located in the Chamoli district of Uttarakhand, Badrinath is dedicated to Lord Vishnu and is one of the holiest temples in Hinduism. The temple enshrines a black stone idol of Lord Vishnu in a meditative posture. It is situated at an altitude of approximately 3,133 meters (10,279 feet) above sea level, along the banks of the Alaknanda River.

  2. Kedarnath: Kedarnath, situated in the Rudraprayag district of Uttarakhand, is dedicated to Lord Shiva. It is one of the twelve Jyotirlingas, and the temple is believed to have been established by the Pandavas from the ancient Indian epic, Mahabharata. Pilgrims have to undertake a challenging trek of about 16 kilometers (10 miles) from Gaurikund to reach the temple, which is situated at an elevation of approximately 3,583 meters (11,755 feet) above sea level.

The Do Dham Yatra typically starts from Haridwar or Rishikesh, from where pilgrims proceed to the first destination, usually Badrinath, and then continue to Kedarnath. The journey takes visitors through scenic landscapes, lush valleys, and picturesque mountains, offering a serene and spiritually enriching experience.

The yatra is usually undertaken during the summer months when the temples are open for devotees, from late April to early November. During the winter season, both Badrinath and Kedarnath temples remain closed due to heavy snowfall, and the region becomes inaccessible.

The Do Dham Yatra holds immense religious significance for Hindus, and many devotees undertake this pilgrimage to seek blessings, cleanse their sins, and attain spiritual fulfillment. It offers an opportunity to connect with nature, experience the divinity of the sacred sites, and immerse in the rich cultural heritage of India.

Tour Amenities

  • Comfortable Vehicle with ample space for luggage.
  • Exclusive vehicle for the duration of the trip.
  • Inclusive of all state taxes and tolls.
  • Driver’s night allowance and all associated fees covered.
  • Parking charges to be borne separately.

Tour Itinerary

Day 1: Delhi to Haridwar & Rishikesh Sightseeing

Day 1: Delhi to Haridwar & Rishikesh Sightseeing

Early Morning: Departure from Delhi: Start early from Delhi to Haridwar (around 4-5 hours by road).

Late Morning: Check-in: Arrive in Haridwar and check in at your hotel. Freshen up for the day’s activities.

Midday: Drive to Rishikesh: Depart for Rishikesh (approximately 1-hour drive from Haridwar).

Sightseeing in Rishikesh:

  • Triveni Ghat: Begin with a visit to Triveni Ghat, a sacred spot where pilgrims take a holy dip. It’s also a peaceful place to soak in the spiritual atmosphere.
  • Lakshman Jhula: Explore the iconic Lakshman Jhula, a suspension bridge that offers scenic views of the Ganges River. You can also visit nearby attractions like the Lakshman Temple and Tera Manzil Temple.
  • Ram Jhula: Walk across Ram Jhula, another famous suspension bridge. This area is bustling with ashrams, temples, and local markets.
  • The Beatles Ashram (Optional): If time permits, visit The Beatles Ashram, known for its tranquil environment and artistic graffiti.

Afternoon: Parmarth Niketan Ashram: Visit Parmarth Niketan Ashram, one of the largest ashrams in Rishikesh, where you can enjoy a peaceful environment and explore the ashram grounds.

Evening: Ganga Aarti at Parmarth Niketan: Attend the evening Ganga Aarti at Parmarth Niketan, a serene and spiritual experience by the river. Return to Haridwar: After the Aarti, drive back to Haridwar.

Night:

Sightseeing in Haridwar:

  • Mansa Devi Temple: Visit Mansa Devi Temple, located atop Bilwa Parvat. You can reach the temple by a cable car ride.
  • Chandi Devi Temple: Head to Chandi Devi Temple on Neel Parvat, accessible by a cable car or a short trek.
  • Ganga Aarti at Har Ki Pauri: Conclude your day by witnessing the famous Ganga Aarti at Har Ki Pauri, a mesmerizing spiritual ritual that takes place on the banks of the Ganges.

Overnight Stay: Return to Hotel: After the Ganga Aarti, return to your hotel in Haridwar for an overnight stay.





Day 2:*Morning:* Early breakfast and depart for Sonprayag.- *On the way:* - *Devprayag:* Visit the confluence of the Alaknanda and Bhagirathi rivers, forming the Ganges. - *Rudraprayag:* Another significant confluence of the Alaknanda and Mandakini rivers.- *Evening:* Arrive in Sonprayag and check into your hotel.- *Overnight stay:* Sonprayag.<BR><BR><BR><BR><title>Day 3:*Morning:* Early start to Gaurikund (5 km drive from Sonprayag), the starting point of the trek.- *Trek:* Begin the 16 km trek to Kedarnath. Pony or helicopter services are available for convenience.- *Afternoon:* Arrive in Kedarnath and check into the camp or guesthouse.- *Sightseeing:* - *Kedarnath Temple:* Attend the evening aarti at this sacred temple dedicated to Lord Shiva.- *Overnight stay:* Kedarnath.<BR><BR><BR><BR><title>Day 4:*Morning:* Participate in the early morning aarti and explore the temple surroundings.- *Trek:* Trek back to Gaurikund.- *Afternoon:* Drive back to Sonprayag.- *Evening:* Rest and relax at your hotel.- *Overnight stay:* Sonprayag.<BR><BR><BR><BR><title>Day 5:*Morning:* After breakfast, depart for Chopta.- *On the way:* - *Ukhimath:* Visit the winter seat of Kedarnath.- *Afternoon:* Arrive in Chopta, known as the \"Mini Switzerland of India.- *Sightseeing:* - *Tungnath Temple:* If time permits, trek to the Tungnath Temple, the highest Shiva temple in the world (3.5 km trek).- *Evening:* Explore the meadows and enjoy the serene environment.- *Overnight stay:* Chopta.<BR><BR><BR><BR><title>Day 6:*Morning:* Early breakfast and depart for Badrinath.- *On the way:* - *Chopta Meadows:* Enjoy the beautiful scenery and take photos.- *Afternoon:* Arrive in Badrinath and check into your hotel.- *Sightseeing:* - *Narsingh Temple:* Visit this ancient temple dedicated to Lord Narasimha at Joshimath - *Auli:* If time permits, take the cable car to Auli, a famous skiing destination.- *Overnight stay:* Badrinath..<BR><BR><BR><BR><title>Day 7:*Early Morning:* Depart for Badrinath (45 km / 2 hours).- *Sightseeing:* - *Badrinath Temple:* Attend the morning darshan at this holy temple dedicated to Lord Vishnu. - *Mana Village:* The last village before the Tibet border, visit the Vyas Gufa and Ganesh Gufa.- *Afternoon:* Return to Joshimath and continue towards Delhi.- *On the way:* - *Dhari Devi Temple:* Visit the temple located on the banks of the Alaknanda River. - *Panch Prayag:* Drive through and briefly stop at the five confluences (Devprayag, Rudraprayag, Karnaprayag, Nandaprayag, and Vishnuprayag).- *Night:* Continue Journey to Delhi. <title>Day 2:*Morning:* Early breakfast and depart for Sonprayag.- *On the way:* - *Devprayag:* Visit the confluence of the Alaknanda and Bhagirathi rivers, forming the Ganges. - *Rudraprayag:* Another significant confluence of the Alaknanda and Mandakini rivers.- *Evening:* Arrive in Sonprayag and check into your hotel.- *Overnight stay:* Sonprayag. <title>Day 3:*Morning:* Early start to Gaurikund (5 km drive from Sonprayag), the starting point of the trek.- *Trek:* Begin the 16 km trek to Kedarnath. Pony or helicopter services are available for convenience.- *Afternoon:* Arrive in Kedarnath and check into the camp or guesthouse.- *Sightseeing:* - *Kedarnath Temple:* Attend the evening aarti at this sacred temple dedicated to Lord Shiva.- *Overnight stay:* Kedarnath. <title>Day 4:*Morning:* Participate in the early morning aarti and explore the temple surroundings.- *Trek:* Trek back to Gaurikund.- *Afternoon:* Drive back to Sonprayag.- *Evening:* Rest and relax at your hotel.- *Overnight stay:* Sonprayag. <title>Day 5:*Morning:* After breakfast, depart for Chopta.- *On the way:* - *Ukhimath:* Visit the winter seat of Kedarnath.- *Afternoon:* Arrive in Chopta, known as the \"Mini Switzerland of India.- *Sightseeing:* - *Tungnath Temple:* If time permits, trek to the Tungnath Temple, the highest Shiva temple in the world (3.5 km trek).- *Evening:* Explore the meadows and enjoy the serene environment.- *Overnight stay:* Chopta. <title>Day 6:*Morning:* Early breakfast and depart for Badrinath.- *On the way:* - *Chopta Meadows:* Enjoy the beautiful scenery and take photos.- *Afternoon:* Arrive in Badrinath and check into your hotel.- *Sightseeing:* - *Narsingh Temple:* Visit this ancient temple dedicated to Lord Narasimha at Joshimath - *Auli:* If time permits, take the cable car to Auli, a famous skiing destination.- *Overnight stay:* Badrinath. <title>Day 7:*Early Morning:* Depart for Badrinath (45 km / 2 hours).- *Sightseeing:* - *Badrinath Temple:* Attend the morning darshan at this holy temple dedicated to Lord Vishnu. - *Mana Village:* The last village before the Tibet border, visit the Vyas Gufa and Ganesh Gufa.- *Afternoon:* Return to Joshimath and continue towards Delhi.- *On the way:* - *Dhari Devi Temple:* Visit the temple located on the banks of the Alaknanda River. - *Panch Prayag:* Drive through and briefly stop at the five confluences (Devprayag, Rudraprayag, Karnaprayag, Nandaprayag, and Vishnuprayag).- *Night:* Continue Journey to Delhi. </div> </div> </div> <!-- Booking Form --> <div class="col-lg-4"> <div class="card border-0 rounded-4 shadow sticky-sidebar"> <div class="card-body p-4"> <h3 class="card-title text-center mb-4 text-primary"> <i class="fas fa-bookmark me-2"></i>Book Now </h3> <!-- Price Display --> <div class="text-center mb-4 p-3 bg-custom-light rounded-3"> <h2 class="display-6 mb-2 text-primary">₹<span id="totalPrice">63000</span></h2> <p class="text-muted small mb-2">Total Cost</p> <div class="badge badge-custom p-2"> <i class="fas fa-wallet me-1"></i> Booking Amount: ₹<span id="bookingPrice">2000</span> </div> </div> <!-- Coupon Form --> <div class="bg-light p-3 rounded-4 mb-4"> <form id="applyCouponForm" class="needs-validation" novalidate> <div class="mb-3"> <label for="promoCode" class="form-label text-muted"> <i class="fas fa-ticket-alt me-2"></i>Promo Code </label> <input type="text" class="form-control border-0 bg-white" id="promoCode" required> <div class="invalid-feedback">Please enter a promo code.</div> </div> <button type="submit" class="btn btn-outline-primary w-100"> <i class="fas fa-check-circle me-2"></i>Apply Code </button> </form> <div id="couponMessage" class="alert mt-3" role="alert" style="display: none;"></div> <img id="tourImage" src="" alt="Promo Image" class="img-fluid mt-3 rounded" style="display: none;width:100%;height:80px;"> </div> <!-- Booking Form --> <form action="phonepe.php" class="needs-validation" novalidate> <div class="mb-3"> <div class="input-group"> <span class="input-group-text bg-white border-0"> <i class="fas fa-user text-primary"></i> </span> <input type="text" class="form-control border-0 bg-white ps-0" id="name" name="name" placeholder="Full Name" required> </div> <div class="invalid-feedback">Please enter your name.</div> </div> <div class="mb-3"> <div class="input-group"> <span class="input-group-text bg-white border-0"> <i class="fas fa-envelope text-primary"></i> </span> <input type="email" class="form-control border-0 bg-white ps-0" id="email" name="email" placeholder="Email Address" required> </div> <div class="invalid-feedback">Please enter a valid email.</div> </div> <div class="mb-3"> <div class="input-group"> <span class="input-group-text bg-white border-0"> <i class="fas fa-phone text-primary"></i> </span> <input type="tel" class="form-control border-0 bg-white ps-0" id="phone" name="phone" placeholder="Phone Number" required> </div> <div class="invalid-feedback">Please enter your phone number.</div> </div> <input type="hidden" name="amount" value="2000"> <input type="hidden" name="package" value="Do Dham with 16 Seater from Delhi ( 7 Days ) "> <input type="hidden" name="totalprice" value="63000"> <!-- Payment Terms Collapsible Section --> <div class="payment-terms mt-3"> <div class="d-flex justify-content-between align-items-center bg-light p-3 rounded" onclick="togglePaymentTerms()" style="cursor: pointer;"> <h5 class="mb-0">Payment Terms</h5> <i class="fas fa-chevron-down" id="paymentArrow"></i> </div> <div id="paymentDetails" class="mt-2 p-3 bg-light rounded" style="display: none;"> <p>✅ Pay <strong>70%</strong> at the time of pickup.</p> <p>✅ Pay <strong>30%</strong> at the start of the return journey.</p> </div> </div> <div class="booking-section"> <p class="alert alert-info"> Pay ₹2,000/- booking price for instant booking </p> <button type="submit" class="btn btn-primary w-100 py-3 rounded-3"> <i class="fas fa-lock me-2"></i>Proceed to Payment </button> </form> </div> </div> </div> </div> </div> </section> <script> // Initialize variables const initialData = { totalPrice: "63000", promoMessage: "Congratulations Happy 2024 Yatra !", promoImage: "1714876015Coupons_20240505_074909_0000 (1).png", validCodes: "YATRA2024", discount: "3000"}; // Coupon form validation and handling document.addEventListener('DOMContentLoaded', function() { const couponForm = document.getElementById('applyCouponForm'); const couponMessage = document.getElementById('couponMessage'); const tourImage = document.getElementById('tourImage'); // Coupon handling couponForm.addEventListener('submit', function(event) { event.preventDefault(); event.stopPropagation(); if (this.checkValidity()) { const promoCode = document.getElementById('promoCode').value.trim(); if (initialData.validCodes.includes(promoCode)) { // Valid coupon: Apply discount const discountedPrice = initialData.totalPrice - initialData.discount; document.getElementById('totalPrice').textContent = discountedPrice; // Show success message couponMessage.className = 'alert alert-success mt-3'; couponMessage.style.display = 'block'; couponMessage.textContent = initialData.promoMessage; // Show promo image tourImage.src = `upload/${initialData.promoImage}`; tourImage.style.display = 'block'; } else { // Invalid coupon couponMessage.className = 'alert alert-danger mt-3'; couponMessage.style.display = 'block'; couponMessage.textContent = 'Invalid promo code. Please try again.'; // Reset price and hide image document.getElementById('totalPrice').textContent = initialData.totalPrice; tourImage.style.display = 'none'; } } this.classList.add('was-validated'); }); }); </script> <!-- Footer --> <footer style="background-color: #e6f2ff; color: #000; border-top: 2px solid #b3d9ff; border-bottom: 2px solid #b3d9ff;" class="py-5 mt-5"> <div class="container-fluid ps-3 px-0"> <div class="row"> <!-- Company Info --> <div class="col-lg-3 my-0 mb-4"> <a href="index.php" style="text-decoration: none; display: flex; align-items: center; gap: 10px;"> <img src="https://bookmerigadi.com/img/logo.png" alt="BookMeRigadi Logo" style="height: 50px; background-color: #fff; padding: 4px; border-radius: 5px;"> <span style="font-size: 1.2rem; font-weight: bold; color: #007B8A;">BookMeriGadi</span> </a> <p class="mb-3 mt-3">Your trusted travel partner for booking flights, hotels, and bus tickets. We provide the best deals and instant confirmations for all your travel needs.</p> <div class="social-links mt-2"> <a href="https://www.facebook.com/book.meri.gadi.2025/" class="me-3 text-primary fs-5 social-hover"><i class="fab fa-facebook-f"></i></a> <a href="https://api.whatsapp.com/send/?phone=%2B919289285800&text&type=phone_number&app_absent=0" class="me-3 text-success fs-5 social-hover"><i class="fab fa-whatsapp"></i></a> <a href="https://www.instagram.com/bookmerigadi_india" class="me-3 text-danger fs-5 social-hover"><i class="fab fa-instagram"></i></a> <a href="https://www.youtube.com/channel/UCY9FWTNsgd0W9ZY1x5fJ6lQ" class="text-danger fs-5 social-hover"><i class="fab fa-youtube"></i></a> </div> </div> <!-- Quick Links --> <div class="col-lg-2 col-md-6 mb-4"> <h6 class="text-primary mb-3" style="display: inline-block; border-bottom: 2px solid #b3d9ff;">Quick Links</h6> <ul class="list-unstyled"> <li><a href="index.php" class="text-dark text-decoration-none">Home</a></li> <li><a href="aboutus.php" class="text-dark text-decoration-none">About Us</a></li> <li><a href="contactus.php" class="text-dark text-decoration-none">Contact Us</a></li> <li><a href="career.php" class="text-dark text-decoration-none">Career</a></li> </ul> </div> <!-- Services --> <div class="col-lg-2 col-md-6 mb-4"> <h6 class="text-primary mb-3" style="display: inline-block; border-bottom: 2px solid #b3d9ff;">Services</h6> <ul class="list-unstyled"> <li><a href="#" class="text-dark text-decoration-none">Flight Booking</a></li> <li><a href="#" class="text-dark text-decoration-none">Hotel Booking</a></li> <li><a href="#" class="text-dark text-decoration-none">Bus Booking</a></li> <li><a href="outstationtaxi.php" class="text-dark text-decoration-none">Out Station Taxi</a></li> <li><a href="carrental.php" class="text-dark text-decoration-none">Car Rental</a></li> <li><a href="oneway.php" class="text-dark text-decoration-none">One Way cabs</a></li> <li><a href="corporatecarrental.php" class="text-dark text-decoration-none">Corporate Car Rental</a></li> </ul> </div> <!-- Support --> <div class="col-lg-2 col-md-6 mb-4"> <h6 class="text-primary mb-3" style="display: inline-block; border-bottom: 2px solid #b3d9ff;">Company</h6> <ul class="list-unstyled"> <li><a href="aboutus.php" class="text-dark text-decoration-none">About Us</a></li> <li><a href="privacy_policy.php" class="text-dark text-decoration-none">Privacy Policy</a></li> <li><a href="term.php" class="text-dark text-decoration-none">Terms And Conditions</a></li> <li><a href="shippinganddelivery.php" class="text-dark text-decoration-none">Shipping And Delivery</a></li> <li><a href="cancell.php" class="text-dark text-decoration-none"> Cancellation And Refund</a></li> </ul> </div> <!-- Contact Info --> <div class="col-lg-3 col-md-6 mb-4"> <h6 class="text-primary mb-3" style="display: inline-block; border-bottom: 2px solid #b3d9ff;">Contact Info</h6> <ul class="list-unstyled"> <li class="mb-2"> <i class="fas fa-map-marker-alt text-primary me-2"></i> Head Office: D 19b, Dwarka sector 1A, New Delhi </li> <li class="mb-2"> <i class="fas fa-phone text-primary me-2"></i> +91 9289285800 </li> <i class="fas fa-phone text-primary me-2"></i> +91 9289286968 </li> <i class="fas fa-phone text-primary me-2"></i> +91 9289286967 </li> <i class="fas fa-phone text-primary me-2"></i> +91 8700941654 </li> <li class="mb-2"> <i class="fas fa-envelope text-primary me-2"></i> bookmerigadi@gmail.com </li> <li class="mb-2"> <i class="fas fa-clock text-primary me-2"></i> 24/7 Customer Support </li> <li class="mb-2"> <i class="fas fa-clock text-primary me-2"></i> GST Number:07BVFPG9564A4ZK </li> </ul> </div> </div> <!-- Newsletter Subscription --> <div class="row mt-4"> <div class="col-12"> <div class="bg-primary bg-opacity-10 rounded p-4 shadow-lg"> <div class="row align-items-center"> <div class="col-md-6"> <h5 class="text-primary mb-2">Subscribe to Get Update On Whatsapp</h5> <p class="mb-0">Get The latest Travel Deals And Updates Directly On Your Whatsapp.</p> </div> <div class="col-md-6"> <form class="d-flex mt-3 mt-md-0"> <input type="number" class="form-control me-2" placeholder="Enter Your Number" required> <button class="btn btn-primary" type="submit">Subscribe</button> </form> </div> </div> </div> </div> </div> <!-- Trust Badges --> <div class="row mt-4"> <div class="col-12"> <div class="text-center"> <h6 class="text-primary mb-3">Trusted & Secure</h6> <div class="d-flex justify-content-center align-items-center flex-wrap"> <span class="badge bg-success me-3 mb-2 shadow-sm"> <i class="fas fa-shield-alt me-1"></i>SSL Secured </span> <span class="badge bg-info me-3 mb-2 shadow-sm"> <i class="fas fa-award me-1"></i>Best Service Award </span> <span class="badge bg-warning me-3 mb-2 shadow-sm"> <i class="fas fa-users me-1"></i>1M+ Happy Customers </span> <span class="badge bg-danger me-3 mb-2 shadow-sm"> <i class="fas fa-clock me-1"></i>24/7 Support </span> </div> </div> </div> </div> </div> <!-- Copyright --> <div class="border-top mt-4 pt-4"> <div class="container"> <div class="row"> <div> © 2025 Bookmerigadi.com. All Rights Reserved. | Designed with <span style="color: #df57bc;">❤️</span> by <a href="https://webookweb.com" target="_blank" class="border rounded px-2 py-1 bg-white text-decoration-none d-inline-block"> <span class="text-primary fw-bold">WeBook</span><span class="text-warning fw-bold">Web</span> </a> </div> <div class="col-md-6 text-md-end"> <p class="mb-0"> <a href="#" class="text-dark text-decoration-none me-3">Privacy Policy</a> <a href="#" class="text-dark text-decoration-none me-3">Terms of Service</a> <a href="#" class="text-dark text-decoration-none">Sitemap</a> </p> </div> </div> </div> </div> </footer> <!-- Back to Top Button --> <button class="btn btn-primary position-fixed bottom-0 end-0 m-4 rounded-circle" id="backToTop" style="display: none; z-index: 1000;"> <i class="fas fa-arrow-up"></i> </button> <!-- Scripts --> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script> <script src="https://unpkg.com/aos@2.3.1/dist/aos.js"></script> <!-- Google Places API --> <script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyB0F4Yf0ERMSt5OwSDyxHezMyLC9aeMM7E&libraries=places&callback=initGooglePlaces" async defer></script> <script> // Initialize AOS AOS.init({ duration: 600, once: true, offset: 80, easing: 'ease-out-cubic' }); // Flight Airport Autocomplete System class FlightAutocomplete { constructor(inputElement, suggestionsElement, hiddenInputElement) { this.input = inputElement; this.suggestions = suggestionsElement; this.hiddenInput = hiddenInputElement; this.init(); } init() { this.input.addEventListener('input', this.debounce(this.handleInput.bind(this), 300)); this.input.addEventListener('blur', this.handleBlur.bind(this)); this.input.addEventListener('focus', this.handleFocus.bind(this)); // Add loading indicator this.loadingDiv = document.createElement('div'); this.loadingDiv.className = 'autocomplete-loading'; this.loadingDiv.style.display = 'none'; this.loadingDiv.innerHTML = '<div class="spinner-border spinner-border-sm" role="status"></div>'; this.input.parentNode.appendChild(this.loadingDiv); } debounce(func, wait) { let timeout; return function executedFunction(...args) { const later = () => { clearTimeout(timeout); func(...args); }; clearTimeout(timeout); timeout = setTimeout(later, wait); }; } async handleInput() { const query = this.input.value.trim(); if (query.length < 2) { this.hideSuggestions(); this.hiddenInput.value = ''; this.loadingDiv.style.display = 'none'; return; } this.loadingDiv.style.display = 'block'; this.hideSuggestions(); try { // IMPORTANT: Update this path to match your file structure const response = await fetch(`flight_search_api.php?search=${encodeURIComponent(query)}`); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } const data = await response.json(); if (data.error) { console.error('API Error:', data.error); showNotification('Error loading airport data: ' + data.error, 'error'); return; } this.showSuggestions(data); } catch (error) { console.error('Error fetching airport data:', error); showNotification('Error loading airport data. Please try again.', 'error'); } finally { this.loadingDiv.style.display = 'none'; } } showSuggestions(airports) { if (airports.length === 0) { this.hideSuggestions(); showNotification('No airports found. Try a different search term.', 'error'); return; } this.suggestions.innerHTML = airports.map(airport => ` <div class="suggestion-item" data-iata="${airport.iata}" data-name="${airport.name}" data-city="${airport.city}" data-country="${airport.country}"> <div class="suggestion-main"> <strong>${airport.name} (${airport.iata})</strong> </div> <div class="suggestion-details"> ${airport.city}, ${airport.country} </div> </div> `).join(''); this.suggestions.style.display = 'block'; // Add click handlers to suggestions this.suggestions.querySelectorAll('.suggestion-item').forEach(item => { item.addEventListener('mousedown', (e) => { e.preventDefault(); this.selectSuggestion(item); }); }); } selectSuggestion(item) { const iata = item.getAttribute('data-iata'); const name = item.getAttribute('data-name'); const city = item.getAttribute('data-city'); const country = item.getAttribute('data-country'); // Set the display value this.input.value = `${city} (${iata})`; // Set the hidden value (only IATA code) this.hiddenInput.value = iata; this.hideSuggestions(); showNotification(`Selected: ${name} (${iata})`, 'success'); } hideSuggestions() { this.suggestions.style.display = 'none'; } handleBlur() { // Delay hiding to allow for click events setTimeout(() => { this.hideSuggestions(); }, 200); } handleFocus() { if (this.input.value.length >= 2) { this.handleInput(); } } } // Initialize flight autocomplete system function initFlightAutocomplete() { const flightFromInput = document.getElementById('flightFrom'); const flightFromSuggestions = document.getElementById('flightFromSuggestions'); const fromAirportCode = document.getElementById('fromAirportCode'); const flightToInput = document.getElementById('flightTo'); const flightToSuggestions = document.getElementById('flightToSuggestions'); const toAirportCode = document.getElementById('toAirportCode'); if (flightFromInput && flightFromSuggestions && fromAirportCode) { new FlightAutocomplete(flightFromInput, flightFromSuggestions, fromAirportCode); } if (flightToInput && flightToSuggestions && toAirportCode) { new FlightAutocomplete(flightToInput, flightToSuggestions, toAirportCode); } // Form validation to ensure airport codes are selected const flightForm = document.getElementById('flightBookingForm'); if (flightForm) { flightForm.addEventListener('submit', function(e) { e.preventDefault(); // Prevent default submission first // Get the input elements const fromInput = document.getElementById('flightFrom'); const toInput = document.getElementById('flightTo'); // Get current values const fromValue = fromInput.value; const toValue = toInput.value; // Extract airport codes using regex const fromMatch = fromValue.match(/\(([A-Z]{3})\)/); const toMatch = toValue.match(/\(([A-Z]{3})\)/); // Check if valid codes were extracted // if (!fromMatch || !toMatch) { // showNotification('Please select valid airports from the suggestions', 'error'); // return false; // } // Replace the display values with just the codes fromInput.value = fromMatch[1]; toInput.value = toMatch[1]; console.log('Submitting flight form with codes:', { from: fromInput.value, to: toInput.value }); // Set form action and method before submitting flightForm.action = 'flights/flight-search-backend.php'; flightForm.method = 'POST'; // Now actually submit the form flightForm.submit(); }); } } // Google Places Autocomplete (for other forms - kept intact) let autocompleteInstances = []; function initGooglePlaces() { console.log('Google Places API loaded'); // Initialize autocomplete for all location inputs (except flight inputs) const locationInputs = document.querySelectorAll('.location-autocomplete'); locationInputs.forEach((input, index) => { // Skip if it's a flight input if (input.classList.contains('flight-autocomplete')) { return; } const autocomplete = new google.maps.places.Autocomplete(input, { types: ['(cities)'], componentRestrictions: { country: 'in' } }); autocompleteInstances.push(autocomplete); // Add loading indicator const loadingDiv = document.createElement('div'); loadingDiv.className = 'autocomplete-loading'; loadingDiv.style.display = 'none'; loadingDiv.innerHTML = '<div class="spinner-border spinner-border-sm" role="status"></div>'; input.parentNode.appendChild(loadingDiv); // Show loading when user starts typing input.addEventListener('input', function() { if (this.value.length > 1) { loadingDiv.style.display = 'block'; } else { loadingDiv.style.display = 'none'; } }); // Hide loading when place is selected autocomplete.addListener('place_changed', function() { loadingDiv.style.display = 'none'; const place = autocomplete.getPlace(); if (place && place.formatted_address) { console.log('Place selected:', place.formatted_address); showNotification(`Location selected: ${place.name}`, 'success'); } }); // Hide loading when user stops typing let typingTimer; input.addEventListener('keyup', function() { clearTimeout(typingTimer); typingTimer = setTimeout(() => { loadingDiv.style.display = 'none'; }, 1000); }); }); console.log(`Initialized ${autocompleteInstances.length} autocomplete instances`); } // Initialize both systems when DOM is ready function initAllAutocompleteSystems() { // Initialize our custom flight autocomplete initFlightAutocomplete(); // Initialize Google Places for other forms if available if (typeof google !== 'undefined' && google.maps && google.maps.places) { initGooglePlaces(); } } // Mobile Sidebar Toggle function toggleSidebar() { const sidebar = document.getElementById('mobileSidebar'); const overlay = document.getElementById('sidebarOverlay'); sidebar.classList.toggle('active'); overlay.classList.toggle('active'); } function closeSidebar() { const sidebar = document.getElementById('mobileSidebar'); const overlay = document.getElementById('sidebarOverlay'); sidebar.classList.remove('active'); overlay.classList.remove('active'); } // Modal Functions function showModal() { const modal = document.getElementById('comingSoonModal'); modal.classList.add('active'); document.body.style.overflow = 'hidden'; } function closeModal() { const modal = document.getElementById('comingSoonModal'); modal.classList.remove('active'); document.body.style.overflow = ''; } // Handle Coming Soon for Hotel, Flight, and Bus function handleComingSoon(event) { event.preventDefault(); showModal(); return false; } // Close modal when clicking outside document.getElementById('comingSoonModal')?.addEventListener('click', function(e) { if (e.target === this) { closeModal(); } }); // Typing Animation const phrases = [ "Yatra Packages", "Adventure Packages", "International Packages", "Vehicle only packages", "Religious packages" ]; let phraseIndex = 0; let charIndex = 0; let isDeleting = false; let typingSpeed = 80; function typeText() { const currentPhrase = phrases[phraseIndex]; const typedElement = document.getElementById('typedText'); if (!typedElement) return; if (isDeleting) { typedElement.textContent = currentPhrase.substring(0, charIndex - 1); charIndex--; typingSpeed = 50; } else { typedElement.textContent = currentPhrase.substring(0, charIndex + 1); charIndex++; typingSpeed = 80; } if (!isDeleting && charIndex === currentPhrase.length) { isDeleting = true; typingSpeed = 2000; } else if (isDeleting && charIndex === 0) { isDeleting = false; phraseIndex = (phraseIndex + 1) % phrases.length; } setTimeout(typeText, typingSpeed); } // Tab Switching function switchTab(tabName) { document.querySelectorAll('.booking-tab').forEach(tab => tab.classList.remove('active')); document.querySelectorAll('.tab-pane').forEach(pane => pane.classList.remove('active')); const activeTab = document.querySelector(`[data-tab="${tabName}"]`); const activeForm = document.getElementById(`${tabName}-form`); if (activeTab) activeTab.classList.add('active'); if (activeForm) activeForm.classList.add('active'); // Reinitialize autocomplete systems for the active tab setTimeout(() => { if (tabName === 'flight') { initFlightAutocomplete(); } else if (typeof google !== 'undefined' && google.maps && google.maps.places) { initGooglePlaces(); } }, 300); } // Cab Type Switching function switchCabType(type) { document.querySelectorAll('.sub-tab').forEach(tab => tab.classList.remove('active')); document.querySelectorAll('.cab-pane').forEach(pane => pane.classList.remove('active')); const activeTab = document.querySelector(`[data-cab="${type}"]`); const activeForm = document.getElementById(`${type}-form`); if (activeTab) activeTab.classList.add('active'); if (activeForm) activeForm.classList.add('active'); // Reinitialize Google Places for the active cab pane setTimeout(() => { if (typeof google !== 'undefined' && google.maps && google.maps.places) { initGooglePlaces(); } }, 300); } // Trip Type function setTripType(type) { const tripTypeInput = document.getElementById('tripTypeInput'); const returnContainer = document.getElementById('returnDateContainer'); const buttons = document.querySelectorAll('.trip-type-btn'); if (tripTypeInput) tripTypeInput.value = type; buttons.forEach(btn => btn.classList.remove('active')); if (type === 1) { buttons[0]?.classList.add('active'); if (returnContainer) returnContainer.style.display = 'none'; } else { buttons[1]?.classList.add('active'); if (returnContainer) returnContainer.style.display = 'block'; } } // Route Functions function updateRouteName() { const routeSelect = document.getElementById('route_id'); const routeNameInput = document.getElementById('route_name'); if (!routeSelect || !routeNameInput) return; const selectedOption = routeSelect.options[routeSelect.selectedIndex]; if (selectedOption && selectedOption.dataset.routeName) { routeNameInput.value = selectedOption.dataset.routeName; } } // Notification System function showNotification(message, type = 'success') { const existing = document.querySelector('.notification'); if (existing) existing.remove(); const notification = document.createElement('div'); notification.className = `notification notification-${type}`; notification.innerHTML = ` <div class="notification-content"> <i class="fas fa-${type === 'success' ? 'check-circle' : 'exclamation-circle'}"></i> <span>${message}</span> </div> `; document.body.appendChild(notification); setTimeout(() => notification.classList.add('show'), 10); setTimeout(() => { notification.classList.remove('show'); setTimeout(() => notification.remove(), 300); }, 3000); } // Form Validation function validateForm(form) { let isValid = true; const inputs = form.querySelectorAll('[required]'); inputs.forEach(input => { if (!input.value.trim()) { input.classList.add('error'); isValid = false; } else { input.classList.remove('error'); } }); return isValid; } function setLoadingState(button, isLoading) { if (isLoading) { button.dataset.originalText = button.innerHTML; button.innerHTML = '<span class="loader"></span> Processing...'; button.disabled = true; button.classList.add('loading'); } else { button.innerHTML = button.dataset.originalText; button.disabled = false; button.classList.remove('loading'); } } // Contact Form Submission const contactForm = document.getElementById('contactForm'); if (contactForm) { contactForm.addEventListener('submit', function(e) { e.preventDefault(); if (!validateForm(this)) { showNotification('Please fill all required fields', 'error'); return; } const submitBtn = this.querySelector('button[type="submit"]'); setLoadingState(submitBtn, true); setTimeout(() => { setLoadingState(submitBtn, false); showNotification('Message sent successfully!', 'success'); this.reset(); }, 1500); }); } // Date Constraints const today = new Date().toISOString().split('T')[0]; document.querySelectorAll('input[type="date"]').forEach(input => { input.setAttribute('min', today); }); // Parallax Effect let ticking = false; window.addEventListener('scroll', () => { if (!ticking) { window.requestAnimationFrame(() => { const scrolled = window.pageYOffset; const parallax = document.querySelector('.hero-bg'); if (parallax && scrolled < window.innerHeight) { parallax.style.transform = `translateY(${scrolled * 0.5}px)`; } ticking = false; }); ticking = true; } }); // Remove Input Error on Change document.addEventListener('DOMContentLoaded', function() { const inputs = document.querySelectorAll('.form-control, .form-select'); inputs.forEach(input => { input.addEventListener('input', function() { this.classList.remove('error'); }); input.addEventListener('change', function() { this.classList.remove('error'); }); }); }); // Bottom Nav Active State document.querySelectorAll('.bottom-nav-item').forEach(item => { item.addEventListener('click', function(e) { if (this.getAttribute('href').startsWith('#')) { document.querySelectorAll('.bottom-nav-item').forEach(nav => nav.classList.remove('active')); this.classList.add('active'); } }); }); // Smooth scroll to booking form on page load window.addEventListener('load', function() { setTimeout(() => { const bookingCard = document.querySelector('.booking-card'); if (bookingCard) { const rect = bookingCard.getBoundingClientRect(); const isVisible = ( rect.top >= 0 && rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) ); if (!isVisible) { bookingCard.scrollIntoView({ behavior: 'smooth', block: 'center' }); } } }, 100); }); // Handle Google Places API loading errors window.gm_authFailure = function() { showNotification('Google Maps service is currently unavailable. You can still use flight search.', 'error'); console.error('Google Maps authentication failed'); }; // Fallback for Google Places API setTimeout(() => { if (typeof google === 'undefined' || !google.maps || !google.maps.places) { console.warn('Google Places API failed to load, using fallback for non-flight forms'); showNotification('Location services loading slowly. Flight search is available.', 'error'); } }, 5000); // Flight form trip type handling document.addEventListener('DOMContentLoaded', function() { const onewayRadio = document.getElementById('oneway'); const roundtripRadio = document.getElementById('roundtrip'); const returnDateInput = document.getElementById('returnDate'); function handleTripTypeChange() { if (roundtripRadio.checked) { returnDateInput.disabled = false; returnDateInput.required = true; } else { returnDateInput.disabled = true; returnDateInput.required = false; returnDateInput.value = ''; } } onewayRadio?.addEventListener('change', handleTripTypeChange); roundtripRadio?.addEventListener('change', handleTripTypeChange); // Initialize handleTripTypeChange(); // Set minimum dates const today = new Date().toISOString().split('T')[0]; document.querySelectorAll('input[type="date"]').forEach(input => { input.setAttribute('min', today); }); }); // Navigation Controller class NavigationController { constructor() { // DOM Elements this.mainNav = document.getElementById('mainNav'); this.mobileMenuToggle = document.getElementById('mobileMenuToggle'); this.navigationMenu = document.getElementById('navigationMenu'); this.mobileOverlay = document.getElementById('mobileOverlay'); this.navLinks = document.querySelectorAll('.nav-menu-link'); this.dropdownItems = document.querySelectorAll('.nav-menu-item'); // State this.isMobile = window.innerWidth < 992; this.isMenuOpen = false; this.scrollThreshold = 50; this.lastScrollTop = 0; // Initialize this.init(); } init() { this.setupScrollEffects(); this.setupMobileMenu(); this.setupDropdowns(); this.setupActiveLinks(); this.setupSmoothScroll(); this.setupResizeHandler(); this.setupKeyboardNavigation(); } setupScrollEffects() { let ticking = false; const handleScroll = () => { const scrollTop = window.pageYOffset || document.documentElement.scrollTop; if (!ticking) { window.requestAnimationFrame(() => { if (scrollTop > this.scrollThreshold) { this.mainNav.classList.add('scrolled'); } else { this.mainNav.classList.remove('scrolled'); } this.lastScrollTop = scrollTop; ticking = false; }); ticking = true; } }; window.addEventListener('scroll', handleScroll, { passive: true }); } setupMobileMenu() { if (!this.mobileMenuToggle) return; // Toggle menu this.mobileMenuToggle.addEventListener('click', () => { this.toggleMobileMenu(); }); // Close on overlay click this.mobileOverlay?.addEventListener('click', () => { this.closeMobileMenu(); }); // Close on link click (non-dropdown) this.navLinks.forEach(link => { if (!link.querySelector('i.fa-chevron-down')) { link.addEventListener('click', () => { if (this.isMobile) { this.closeMobileMenu(); } }); } }); // Handle mobile dropdown toggles if (this.isMobile) { this.setupMobileDropdowns(); } } toggleMobileMenu() { this.isMenuOpen = !this.isMenuOpen; if (this.isMenuOpen) { this.openMobileMenu(); } else { this.closeMobileMenu(); } } openMobileMenu() { this.navigationMenu?.classList.add('active'); this.mobileOverlay?.classList.add('active'); this.mobileMenuToggle?.setAttribute('aria-expanded', 'true'); document.body.style.overflow = 'hidden'; this.isMenuOpen = true; } closeMobileMenu() { this.navigationMenu?.classList.remove('active'); this.mobileOverlay?.classList.remove('active'); this.mobileMenuToggle?.setAttribute('aria-expanded', 'false'); document.body.style.overflow = ''; this.isMenuOpen = false; } setupMobileDropdowns() { this.dropdownItems.forEach(item => { const link = item.querySelector('.nav-menu-link'); const hasDropdown = item.querySelector('.dropdown-menu-wrapper'); if (hasDropdown && link) { link.addEventListener('click', (e) => { if (this.isMobile) { e.preventDefault(); e.stopPropagation(); const isActive = item.classList.contains('active'); // Close all dropdowns at the same level const parent = item.parentElement; const siblings = parent.querySelectorAll(':scope > .nav-menu-item, :scope > .dropdown-menu-item'); siblings.forEach(sibling => { if (sibling !== item) { sibling.classList.remove('active'); } }); // Toggle current dropdown item.classList.toggle('active', !isActive); } }); } }); // Handle nested dropdowns in mobile document.querySelectorAll('.dropdown-menu-item.has-submenu').forEach(item => { const link = item.querySelector('.dropdown-menu-link'); if (link) { link.addEventListener('click', (e) => { if (this.isMobile) { e.preventDefault(); e.stopPropagation(); const isActive = item.classList.contains('active'); // Close sibling dropdowns const parent = item.parentElement; const siblings = parent.querySelectorAll(':scope > .dropdown-menu-item'); siblings.forEach(sibling => { if (sibling !== item) { sibling.classList.remove('active'); } }); item.classList.toggle('active', !isActive); } }); } }); } setupDropdowns() { if (!this.isMobile) { // Desktop: Hover works via CSS this.dropdownItems.forEach(item => { const link = item.querySelector('.nav-menu-link'); const hasDropdown = item.querySelector('.dropdown-menu-wrapper'); if (hasDropdown && link) { link.addEventListener('click', (e) => { const href = link.getAttribute('href'); if (!href || href === '#' || href === 'spclpackages.php') { e.preventDefault(); } }); } }); // Handle nested dropdown clicks document.querySelectorAll('.dropdown-menu-item.has-submenu > .dropdown-menu-link').forEach(link => { link.addEventListener('click', (e) => { e.preventDefault(); }); }); } // Prevent dropdown menu from closing when clicking inside document.querySelectorAll('.dropdown-menu-wrapper').forEach(menu => { menu.addEventListener('click', (e) => { e.stopPropagation(); }); }); } setupActiveLinks() { const currentPath = window.location.pathname; const currentFile = currentPath.split('/').pop() || 'index.php'; this.navLinks.forEach(link => { const href = link.getAttribute('href'); if (href) { const linkFile = href.split('/').pop(); if (linkFile === currentFile) { link.classList.add('active'); } else if (link.classList.contains('active') && linkFile !== currentFile) { link.classList.remove('active'); } } }); } setupSmoothScroll() { document.querySelectorAll('a[href^="#"]').forEach(anchor => { anchor.addEventListener('click', (e) => { const href = anchor.getAttribute('href'); if (href && href !== '#' && href !== '#support') { const target = document.querySelector(href); if (target) { e.preventDefault(); const offsetTop = target.offsetTop - this.mainNav.offsetHeight; window.scrollTo({ top: offsetTop, behavior: 'smooth' }); if (this.isMobile && this.isMenuOpen) { this.closeMobileMenu(); } } } }); }); } setupResizeHandler() { let resizeTimer; window.addEventListener('resize', () => { clearTimeout(resizeTimer); resizeTimer = setTimeout(() => { const wasMobile = this.isMobile; this.isMobile = window.innerWidth < 992; if (wasMobile !== this.isMobile) { // Close mobile menu when switching to desktop if (!this.isMobile && this.isMenuOpen) { this.closeMobileMenu(); } // Clear active states this.dropdownItems.forEach(item => { item.classList.remove('active'); }); // Re-setup dropdown handlers if (this.isMobile) { this.setupMobileDropdowns(); } else { this.setupDropdowns(); } } }, 250); }); } setupKeyboardNavigation() { // Close mobile menu with Escape key document.addEventListener('keydown', (e) => { if (e.key === 'Escape' && this.isMenuOpen) { this.closeMobileMenu(); } }); // Arrow key navigation in dropdowns this.dropdownItems.forEach(item => { const links = item.querySelectorAll('.dropdown-menu-link'); links.forEach((link, index) => { link.addEventListener('keydown', (e) => { if (e.key === 'ArrowDown') { e.preventDefault(); const nextLink = links[index + 1]; nextLink?.focus(); } else if (e.key === 'ArrowUp') { e.preventDefault(); const prevLink = links[index - 1]; prevLink?.focus(); } }); }); }); } } // Initialize everything when DOM is loaded document.addEventListener('DOMContentLoaded', () => { // Start typing animation typeText(); // Initialize navigation controller const navController = new NavigationController(); // Initialize all autocomplete systems initAllAutocompleteSystems(); // Initialize route functions const reverseBtn = document.getElementById('reverse-route'); if (reverseBtn) { reverseBtn.addEventListener('click', function() { const routeSelect = document.getElementById('route_id'); const reversedInput = document.getElementById('reversedRouteInput'); if (!routeSelect || !reversedInput) return; const selectedOption = routeSelect.options[routeSelect.selectedIndex]; if (selectedOption && selectedOption.dataset.routeName) { const routeName = selectedOption.dataset.routeName; const routeParts = routeName.split(' to '); if (routeParts.length === 2) { const reversedRoute = routeParts[1] + ' to ' + routeParts[0]; reversedInput.value = reversedRoute; selectedOption.textContent = reversedRoute; selectedOption.dataset.routeName = reversedRoute; showNotification('Route reversed successfully', 'success'); } } }); } updateRouteName(); // Set current year in footer const yearElement = document.getElementById("currentYear"); if (yearElement) { yearElement.textContent = new Date().getFullYear(); } // Back to top button const backToTopBtn = document.getElementById('backToTop'); if (backToTopBtn) { window.addEventListener('scroll', function() { if (window.pageYOffset > 300) { backToTopBtn.style.display = 'block'; } else { backToTopBtn.style.display = 'none'; } }); backToTopBtn.addEventListener('click', function() { window.scrollTo({ top: 0, behavior: 'smooth' }); }); } // Security measures document.addEventListener('contextmenu', function(event) { event.preventDefault(); }); document.addEventListener('keydown', function(event) { if (event.keyCode == 123 || (event.ctrlKey && event.shiftKey && (event.key === 'I' || event.key === 'i'))) { event.preventDefault(); } if (event.keyCode == 123 || (event.ctrlKey && (event.key === 'U' || event.key === 'u'))) { event.preventDefault(); } }); console.log('%c🚀 BookMeriGadi System Initialized Successfully!', 'color: #667eea; font-size: 14px; font-weight: bold;'); }); </script> </body> </html>