4-Day Ruaha Predators Safari (Start & End in Iringa)
Travelers
on
Select date
Get a Free Quote
Send us a Quote, and we will respond within 24 hours
Age at the end of the tour
This 4-day Ruaha Predators Safari is designed for travelers who want extended time tracking big cats and predators in Tanzania’s largest national park. The safari starts and ends in Iringa, making it ideal for overland travelers or those connecting via domestic flights.
Ruaha National Park is famous for its large lion prides, strong leopard population, seasonal African wild dogs, and dramatic baobab landscapes. With three full days inside the park, this itinerary maximizes wildlife encounters, especially during the dry season when animals gather around the Great Ruaha River.
Optional fly-out to Dar es Salaam or Zanzibar can be arranged at the end of the safari.
Tour Features
Mid-Range Tour
This mid-range tour uses comfortable lodges and permanent tented camps with private bathrooms.
Private Tour
This tour is organized exclusively for you and will not be shared with other travelers.
Can Start Any Day
If availability permits, this tour can start on any day of the year.
Fully Customizable
This tour can be completely customized based on your preferences and travel dates.
Fly-In Option Available
This tour can be operated using domestic flights to reduce travel time.
Activities & Transportation
Game Drives – Guided wildlife viewing in national parks and reserves.
Beach Extensions – Add Zanzibar, Mafia or Pemba for snorkeling and relaxation.
4×4 Safari Vehicle – Custom Land Cruiser with pop-up roof and window seats.
Private Safari Vehicle – Exclusive use of the car for your group.
Getting around: pop-up roof 4x4 vehicle
Accommodation & Meals
This tour is priced using Mid Range accommodations. Budget and Luxury options are available on request. Similar lodges or camps may be used depending on availability.
Day 1&2&3
All Meals Included
Rates Per Person
Start dates
Solo (1 room)
2 people (1 room)
3 people (2 rooms)
4 people (2 rooms)
5 people (3 rooms)
6 people (3 rooms)
7+ people
Rates Per Person (USD)
USD 1,650 /p.p
USD 1,450/ pp
USD 1,350/ pp
USD 1,300/ pp
USD 1,250/ pp
USD 1,200/ pp
Get Quote
Private 4x4 safari vehicle + professional driver-guide All park fees & conservation charges Drinking water on safari Accommodation & meals as listed
International flights & visas Tips & personal expenses Travel insurance
This tour starts and ends in Iringa.
Fly to Iringa Airport (ZNZ –
Check price )
Optional fly-out from Ruaha can be arranged at additional cost.
Day 1
Iringa – Ruaha National Park (Scenic Transfer & Afternoon Game Drive)
Morning pickup in Iringa town or airport.
Drive to Ruaha National Park (approx. 2.5–3 hours). The road passes through rolling hills, Maasai villages, and baobab-dotted landscapes.
Upon arrival at park gate:
Registration and entry formalities
Begin game drive immediately en route to lodge
Afternoon focus areas:
Great Ruaha River
Mwagusi sand river system
Known lion territories
Wildlife commonly seen:
Large lion prides
Elephants in family herds
Giraffes
Buffalo
Greater kudu
Impala and waterbuck
Dinner and overnight inside the park.
Wildlife in Iringa – Ruaha National Park (Scenic Transfer & Afternoon Game Drive)
Meals & Drinks:
Lunch and Dinner
Day 2
Full-Day Predator Tracking in Ruaha
Early breakfast followed by sunrise game drive.
Morning hours are prime time for:
Lion hunts
Leopard movement along riverine forests
Hyena clan activity
African wild dogs (seasonal)
Ruaha has one of the highest lion densities in East Africa and is known for cooperative pride behavior.
Midday:
Picnic lunch inside the park or return to lodge for rest.
Afternoon game drive explores:
Rocky escarpments (leopard habitat)
Open savannah plains (cheetah & hunting lions)
Baobab valleys
Return before sunset.
Dinner and overnight.
Wildlife in Full-Day Predator Tracking in Ruaha
Meals & Drinks:
All Meals Included
Day 3
Ruaha Wilderness Exploration
Full-day safari with extended range coverage.
Your guide may focus on:
Remote sections of the park with fewer vehicles
Elephant breeding herds
Crocodiles and hippos along the river
Birdlife (over 500 species recorded)
Optional (extra cost):
Walking safari ($50 per person)
Sundowner experience
Ruaha is less crowded than Serengeti, offering more private sightings.
Dinner and overnight.
Wildlife in Ruaha Wilderness Exploration
Meals & Drinks:
All Meals Included
Day 4
Morning Game Drive – Return to Iringa
Early morning short game drive before departure.
Return to lodge for breakfast.
Drive back to Iringa (arrival early afternoon).
Drop-off at:
Iringa town
Iringa Airport
Optional: Fly-out arrangement to Dar es Salaam or Zanzibar (additional cost).
End of safari.
Wildlife in Morning Game Drive – Return to Iringa
Meals & Drinks:
Breakfast
Next: Day by Day
Interested in This Tour?
Get a Free Quote
Send us a Quote, and we will respond within 24 hours
document.addEventListener('DOMContentLoaded', function() {
// Heart icon toggle
const heartBtn = document.querySelector('.btn-heart-hero');
if (heartBtn) {
heartBtn.addEventListener('click', function() {
const icon = this.querySelector('i');
if (this.classList.contains('favorited')) {
this.classList.remove('favorited');
icon.classList.remove('fa-solid');
icon.classList.add('fa-regular');
} else {
this.classList.add('favorited');
icon.classList.remove('fa-regular');
icon.classList.add('fa-solid');
}
});
}
// Tab switching functionality
const navLinks = document.querySelectorAll('.tour-nav-tabs .nav-link');
const overviewSections = document.querySelectorAll('.content-section:not(.day-by-day-content):not(.rates-content):not(.inclusions-content):not(.getting-there-content):not(.faq-content):not(.always-visible)');
const dayByDaySection = document.querySelector('.day-by-day-content');
const ratesSection = document.querySelector('.rates-content');
const inclusionsSection = document.querySelector('.inclusions-content');
const gettingThereSection = document.querySelector('.getting-there-content');
const faqSection = document.querySelector('.faq-content');
const alwaysVisibleSections = document.querySelectorAll('.always-visible');
// Ensure always-visible sections are always shown
function ensureAlwaysVisible() {
alwaysVisibleSections.forEach(section => {
section.style.display = 'block';
});
}
function showOverview() {
overviewSections.forEach(section => {
section.style.display = 'block';
});
if (dayByDaySection) {
dayByDaySection.style.display = 'none';
}
if (ratesSection) {
ratesSection.style.display = 'none';
}
if (inclusionsSection) {
inclusionsSection.style.display = 'none';
}
if (gettingThereSection) {
gettingThereSection.style.display = 'none';
}
ensureAlwaysVisible();
}
function showDayByDay() {
overviewSections.forEach(section => {
section.style.display = 'none';
});
if (dayByDaySection) {
dayByDaySection.style.display = 'block';
}
if (ratesSection) {
ratesSection.style.display = 'none';
}
if (inclusionsSection) {
inclusionsSection.style.display = 'none';
}
if (gettingThereSection) {
gettingThereSection.style.display = 'none';
}
if (faqSection) {
faqSection.style.display = 'none';
}
ensureAlwaysVisible();
}
function showRates() {
overviewSections.forEach(section => {
section.style.display = 'none';
});
if (dayByDaySection) {
dayByDaySection.style.display = 'none';
}
if (ratesSection) {
ratesSection.style.display = 'block';
}
if (inclusionsSection) {
inclusionsSection.style.display = 'none';
}
if (gettingThereSection) {
gettingThereSection.style.display = 'none';
}
ensureAlwaysVisible();
}
function showInclusions() {
overviewSections.forEach(section => {
section.style.display = 'none';
});
if (dayByDaySection) {
dayByDaySection.style.display = 'none';
}
if (ratesSection) {
ratesSection.style.display = 'none';
}
if (inclusionsSection) {
inclusionsSection.style.display = 'block';
}
if (gettingThereSection) {
gettingThereSection.style.display = 'none';
}
if (faqSection) {
faqSection.style.display = 'none';
}
ensureAlwaysVisible();
}
function showGettingThere() {
overviewSections.forEach(section => {
section.style.display = 'none';
});
if (dayByDaySection) {
dayByDaySection.style.display = 'none';
}
if (ratesSection) {
ratesSection.style.display = 'none';
}
if (inclusionsSection) {
inclusionsSection.style.display = 'none';
}
if (gettingThereSection) {
gettingThereSection.style.display = 'block';
}
ensureAlwaysVisible();
}
navLinks.forEach(link => {
link.addEventListener('click', function(e) {
e.preventDefault();
// Remove active class from all links
navLinks.forEach(l => l.classList.remove('active'));
// Add active class to clicked link
this.classList.add('active');
// Show/hide content based on tab
const href = this.getAttribute('href');
if (href === '#day-by-day') {
showDayByDay();
} else if (href === '#rates') {
showRates();
} else if (href === '#inclusions') {
showInclusions();
} else if (href === '#getting-there') {
showGettingThere();
} else if (href === '#faqs') {
showFAQs();
} else {
showOverview();
}
});
});
});
// Mobile menu toggle
document.addEventListener('DOMContentLoaded', function() {
const navbarToggle = document.getElementById('navbarToggle');
const navbarMenu = document.querySelector('.navbar-menu');
if (navbarToggle && navbarMenu) {
navbarToggle.addEventListener('click', function() {
navbarMenu.classList.toggle('active');
const icon = this.querySelector('i');
if (navbarMenu.classList.contains('active')) {
icon.classList.remove('fa-bars');
icon.classList.add('fa-times');
} else {
icon.classList.remove('fa-times');
icon.classList.add('fa-bars');
}
});
}
});
// Calendar and Travelers functionality for tour detail page
document.addEventListener('DOMContentLoaded', function() {
// Get URL parameters
const urlParams = new URLSearchParams(window.location.search);
const startDateParam = urlParams.get('start_date');
const adultsParam = urlParams.get('adults');
const childrenParam = urlParams.get('children');
// Travelers state (declare early to avoid temporal dead zone)
let adultsCount = 0;
let childrenCount = 0;
const childAgesSelectedDetail = [];
// Calendar elements
const dateField = document.querySelector('.quote-form-section-new .date-field');
const dateInput = dateField ? dateField.querySelector('.quote-input') : null;
const calendarPanel = dateField ? dateField.querySelector('.calendar-panel') : null;
const calendarCloseBtn = calendarPanel ? calendarPanel.querySelector('.calendar-close-btn') : null;
const calendarDays = calendarPanel ? calendarPanel.querySelector('.calendar-days') : null;
const calendarMonthYear = calendarPanel ? calendarPanel.querySelector('.calendar-month-year') : null;
const prevMonthBtn = calendarPanel ? calendarPanel.querySelector('.prev-month') : null;
const nextMonthBtn = calendarPanel ? calendarPanel.querySelector('.next-month') : null;
const dateFieldContent = dateField ? dateField.querySelector('.date-field-content') : null;
// Travelers elements
const travelersField = document.querySelector('.quote-form-section-new .travelers-field');
const travelersInput = travelersField ? travelersField.querySelector('.travelers-display-input') : null;
const travelersPanel = travelersField ? travelersField.querySelector('.travelers-panel') : null;
const travelersCloseBtn = travelersPanel ? travelersPanel.querySelector('.travelers-close-btn') : null;
const travelersDoneBtn = travelersPanel ? travelersPanel.querySelector('.travelers-done-btn') : null;
const travelersFieldContent = travelersField ? travelersField.querySelector('.travelers-field-content') : null;
const adultsCountInput = document.getElementById('adults-count-detail');
const childrenCountInput = document.getElementById('children-count-detail');
const childrenAgesContainer = document.getElementById('children-ages-detail');
const counterButtons = travelersPanel ? travelersPanel.querySelectorAll('.counter-btn') : [];
// Mobile meta elements
const mobileTravelersText = document.getElementById('mobile-travelers-text');
const mobileDateText = document.getElementById('mobile-date-text');
// Function to close all panels
function closeAllPanels() {
// Close calendar panel
if (dateField) {
dateField.classList.remove('active');
}
if (calendarPanel) {
calendarPanel.style.display = 'none';
calendarPanel.classList.remove('mobile-float');
calendarPanel.style.opacity = '';
calendarPanel.style.pointerEvents = '';
}
// Close travelers panel
if (travelersField) {
travelersField.classList.remove('active');
}
if (travelersPanel) {
travelersPanel.style.display = 'none';
travelersPanel.classList.remove('mobile-float');
}
}
// Calendar functionality
let currentDate = new Date();
let selectedDate = null;
let currentMonth = currentDate.getMonth();
let currentYear = currentDate.getFullYear();
// Parse date from URL parameter
function parseDateFromURL(dateString) {
if (!dateString) return null;
// Decode URL encoding
dateString = decodeURIComponent(dateString);
// Try different date formats
let date = new Date(dateString);
if (isNaN(date.getTime())) {
// Try format like "Dec 7, 2025" or "Dec 5, 2025"
const months = {
'Jan': 0, 'Feb': 1, 'Mar': 2, 'Apr': 3, 'May': 4, 'Jun': 5,
'Jul': 6, 'Aug': 7, 'Sep': 8, 'Oct': 9, 'Nov': 10, 'Dec': 11
};
const parts = dateString.trim().split(/\s+/);
if (parts.length >= 3) {
const month = months[parts[0]];
const day = parseInt(parts[1].replace(',', ''));
const year = parseInt(parts[2]);
if (month !== undefined && !isNaN(day) && !isNaN(year)) {
date = new Date(year, month, day);
}
}
}
if (isNaN(date.getTime())) {
return null;
}
return date;
}
// Pre-fill date from URL if provided (BEFORE rendering calendar)
if (startDateParam && dateInput) {
const parsedDate = parseDateFromURL(startDateParam);
if (parsedDate && !isNaN(parsedDate.getTime())) {
selectedDate = parsedDate;
const formattedDate = formatDate(selectedDate);
dateInput.value = formattedDate;
// Set calendar to show the selected date's month
currentMonth = parsedDate.getMonth();
currentYear = parsedDate.getFullYear();
if (typeof updateMobileMeta === 'function') {
updateMobileMeta();
}
}
}
function formatDate(date) {
if (!date) return '';
const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
return `${months[date.getMonth()]} ${date.getDate()}, ${date.getFullYear()}`;
}
function renderCalendar() {
if (!calendarDays || !calendarMonthYear) return;
const firstDay = new Date(currentYear, currentMonth, 1);
const lastDay = new Date(currentYear, currentMonth + 1, 0);
const daysInMonth = lastDay.getDate();
const startingDayOfWeek = (firstDay.getDay() + 6) % 7;
const monthNames = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
calendarMonthYear.textContent = `${monthNames[currentMonth]} ${currentYear}`;
calendarDays.innerHTML = '';
for (let i = 0; i < startingDayOfWeek; i++) {
const emptyDay = document.createElement('div');
emptyDay.className = 'calendar-day empty';
calendarDays.appendChild(emptyDay);
}
const today = new Date();
today.setHours(0, 0, 0, 0);
for (let day = 1; day <= daysInMonth; day++) {
const dayElement = document.createElement('div');
dayElement.className = 'calendar-day';
dayElement.textContent = day;
const cellDate = new Date(currentYear, currentMonth, day);
cellDate.setHours(0, 0, 0, 0);
if (cellDate < today) {
dayElement.classList.add('past');
} else {
dayElement.classList.add('available');
if (selectedDate && cellDate.getTime() === selectedDate.getTime()) {
dayElement.classList.add('selected');
}
dayElement.addEventListener('click', function(e) {
e.stopPropagation();
e.preventDefault();
selectedDate = new Date(currentYear, currentMonth, day);
const formattedDate = formatDate(selectedDate);
if (dateInput) {
dateInput.value = formattedDate;
}
if (typeof updateMobileMeta === 'function') {
updateMobileMeta();
}
closeCalendar();
// If mobile flyout is open, close it and restore panel
if (mobileCalPanel && mobileCalPanel.getAttribute('aria-hidden') === 'false') {
closeMobileCalendarFly();
}
});
}
calendarDays.appendChild(dayElement);
}
}
function openCalendar() {
closeAllPanels(); // Close other panels first
// Reset to current month when opening
currentMonth = currentDate.getMonth();
currentYear = currentDate.getFullYear();
renderCalendar();
if (dateField) {
dateField.classList.add('active');
}
if (calendarPanel) {
calendarPanel.style.display = 'block';
calendarPanel.style.opacity = '1';
calendarPanel.style.pointerEvents = 'auto';
}
}
function closeCalendar() {
if (dateField) dateField.classList.remove('active');
if (calendarPanel) {
calendarPanel.style.display = 'none';
calendarPanel.style.opacity = '';
calendarPanel.style.pointerEvents = '';
}
}
if (dateField && calendarPanel) {
// Use current month and year (or from URL if date was set)
if (!selectedDate) {
currentMonth = currentDate.getMonth();
currentYear = currentDate.getFullYear();
}
renderCalendar();
if (dateFieldContent) {
dateFieldContent.addEventListener('click', function(e) {
e.stopPropagation();
openCalendar();
});
}
dateField.addEventListener('click', function(e) {
openCalendar();
});
if (calendarCloseBtn) {
calendarCloseBtn.addEventListener('click', function(e) {
e.stopPropagation();
closeCalendar();
});
}
if (prevMonthBtn) {
prevMonthBtn.addEventListener('click', function(e) {
e.stopPropagation();
currentMonth--;
if (currentMonth < 0) {
currentMonth = 11;
currentYear--;
}
renderCalendar();
});
}
if (nextMonthBtn) {
nextMonthBtn.addEventListener('click', function(e) {
e.stopPropagation();
currentMonth++;
if (currentMonth > 11) {
currentMonth = 0;
currentYear++;
}
renderCalendar();
});
}
document.addEventListener('click', function(e) {
if (dateField && !dateField.contains(e.target)) {
closeCalendar();
}
});
}
// Pre-fill travelers from URL parameters (BEFORE updateTravelersDisplay is called)
if (adultsParam) {
adultsCount = parseInt(adultsParam) || 0;
}
if (childrenParam) {
childrenCount = parseInt(childrenParam) || 0;
}
function updateTravelersDisplay() {
let displayText = '';
if (adultsCount > 0) {
displayText = `${adultsCount} Adult${adultsCount > 1 ? 's' : ''}`;
}
if (childrenCount > 0) {
if (displayText) displayText += ', ';
displayText += `${childrenCount} Child${childrenCount > 1 ? 'ren' : ''}`;
}
if (!displayText) {
displayText = '2 travelers';
}
if (travelersInput) travelersInput.value = displayText;
// Also update the input fields
if (adultsCountInput) {
adultsCountInput.value = adultsCount;
}
if (childrenCountInput) {
childrenCountInput.value = childrenCount;
}
if (typeof updateMobileMeta === 'function') {
updateMobileMeta();
}
}
function attachAgeSelectListenersDetail(container) {
if (!container) return;
container.querySelectorAll('select.age-select').forEach((sel, idx) => {
sel.addEventListener('change', () => {
childAgesSelectedDetail[idx] = sel.value || '';
});
});
}
function updateChildrenAges() {
if (!childrenAgesContainer) return;
const previousValues = Array.from(childrenAgesContainer.querySelectorAll('select.age-select')).map(sel => sel.value || '');
childrenAgesContainer.innerHTML = '';
for (let i = 1; i <= childrenCount; i++) {
const ageGroup = document.createElement('div');
ageGroup.className = 'child-age-group';
const prevVal = previousValues[i - 1] || childAgesSelectedDetail[i - 1] || '';
ageGroup.innerHTML = `
<label class="child-label">Child ${i}:</label>
<select class="age-select" data-child="${i}">
<option value="">- Age -</option>
${Array.from({length: 18}, (_, j) => {
const val = j.toString();
const selected = prevVal === val ? 'selected' : '';
return `<option value="${val}" ${selected}>${j}</option>`;
}).join('')}
</select>
`;
childrenAgesContainer.appendChild(ageGroup);
}
attachAgeSelectListenersDetail(childrenAgesContainer);
}
function openTravelersPanel() {
closeAllPanels(); // Close other panels first
if (travelersField) {
travelersField.classList.add('active');
}
if (travelersPanel) {
travelersPanel.style.display = 'block';
travelersPanel.style.opacity = '1';
travelersPanel.style.pointerEvents = 'auto';
}
}
function closeTravelersPanel() {
if (travelersField) travelersField.classList.remove('active');
if (travelersPanel) {
travelersPanel.style.display = 'none';
travelersPanel.style.opacity = '';
travelersPanel.style.pointerEvents = '';
}
}
if (travelersField && travelersPanel) {
// Update display and children ages (will use pre-filled values from URL)
updateTravelersDisplay();
updateChildrenAges();
if (travelersFieldContent) {
travelersFieldContent.addEventListener('click', function(e) {
e.stopPropagation();
openTravelersPanel();
});
}
travelersField.addEventListener('click', function(e) {
openTravelersPanel();
});
if (travelersCloseBtn) {
travelersCloseBtn.addEventListener('click', function(e) {
e.stopPropagation();
closeTravelersPanel();
});
}
counterButtons.forEach(btn => {
btn.addEventListener('click', function(e) {
e.stopPropagation();
const type = this.getAttribute('data-type');
const isIncrease = this.classList.contains('counter-increase');
if (type === 'adults') {
if (isIncrease) {
adultsCount++;
} else {
if (adultsCount > 0) adultsCount--;
}
if (adultsCountInput) adultsCountInput.value = adultsCount;
} else if (type === 'children') {
if (isIncrease) {
childrenCount++;
} else {
if (childrenCount > 0) childrenCount--;
}
if (childrenCountInput) childrenCountInput.value = childrenCount;
updateChildrenAges();
}
const decreaseBtn = this.parentElement.querySelector('.counter-decrease');
if (type === 'adults') {
decreaseBtn.disabled = adultsCount <= 0;
} else {
decreaseBtn.disabled = childrenCount <= 0;
}
});
});
document.querySelectorAll('.counter-decrease').forEach(btn => {
const type = btn.getAttribute('data-type');
if (type === 'adults') {
btn.disabled = adultsCount <= 0;
} else {
btn.disabled = childrenCount <= 0;
}
});
if (travelersDoneBtn) {
travelersDoneBtn.addEventListener('click', function(e) {
e.stopPropagation();
updateTravelersDisplay();
closeTravelersPanel();
});
}
document.addEventListener('click', function(e) {
const clickedInsidePanel = travelersPanel && travelersPanel.contains(e.target);
const clickedInsideField = travelersField && travelersField.contains(e.target);
const mobileQuoteMeta = document.querySelector('.mobile-hero-quote .mobile-quote-meta');
const clickedInsideMobileMeta = mobileQuoteMeta && mobileQuoteMeta.contains(e.target);
if (!clickedInsideField && !clickedInsidePanel && !clickedInsideMobileMeta) {
closeTravelersPanel();
}
});
}
function updateMobileMeta() {
if (mobileTravelersText) {
const totalTravelers = (adultsCount || 0) + (childrenCount || 0);
mobileTravelersText.textContent = totalTravelers > 0 ? `${totalTravelers} traveler${totalTravelers > 1 ? 's' : ''}` : 'Travelers';
}
if (mobileDateText) {
mobileDateText.textContent = selectedDate ? formatDate(selectedDate) : 'Select date';
}
}
updateMobileMeta();
// Mobile meta click handlers: open mobile fly panels
const mobileTravelersItem = mobileTravelersText ? mobileTravelersText.closest('.meta-item') : null;
const mobileDateItem = mobileDateText ? mobileDateText.closest('.meta-item') : null;
const mobileTravPanel = document.getElementById('mobile-travelers-panel');
const mobileCalPanel = document.getElementById('mobile-calendar-panel');
const mobileTravBody = mobileTravPanel ? mobileTravPanel.querySelector('.mobile-fly-panel__body') : null;
const mobileCalBody = mobileCalPanel ? mobileCalPanel.querySelector('.mobile-fly-panel__body') : null;
const mobileTravClose = document.getElementById('mobile-travelers-close');
const mobileTravDone = document.getElementById('mobile-travelers-done');
const mobileCalClose = document.getElementById('mobile-calendar-close');
// Store original locations for moving panels into mobile overlays
const travOrigin = { parent: null, next: null };
const calOrigin = { parent: null, next: null };
function moveNodeInto(node, container, origin) {
if (!node || !container) return;
if (!origin.parent) {
origin.parent = node.parentNode;
origin.next = node.nextSibling;
}
container.innerHTML = '';
container.appendChild(node);
}
function restoreNode(node, origin) {
if (!node || !origin.parent) return;
if (origin.next) {
origin.parent.insertBefore(node, origin.next);
} else {
origin.parent.appendChild(node);
}
}
function openMobileFly(panel) {
if (!panel) return;
panel.style.display = 'flex';
panel.setAttribute('aria-hidden', 'false');
}
function closeMobileFly(panel) {
if (!panel) return;
panel.style.display = 'none';
panel.setAttribute('aria-hidden', 'true');
}
function bindMobileMetaClick(target, handler) {
if (!target || typeof handler !== 'function') return;
const invoke = (e) => {
e.preventDefault();
e.stopPropagation();
handler();
};
target.addEventListener('click', invoke);
target.addEventListener('touchstart', invoke, { passive: false });
}
function syncCountsFromInputs() {
adultsCount = parseInt((adultsCountInput && adultsCountInput.value) ? adultsCountInput.value : '0') || 0;
childrenCount = parseInt((childrenCountInput && childrenCountInput.value) ? childrenCountInput.value : '0') || 0;
}
function openMobileTravelersFly() {
if (!mobileTravPanel) return;
closeAllPanels();
console.log('Mobile travelers flyout open');
syncCountsFromInputs();
if (travelersPanel && mobileTravBody) {
moveNodeInto(travelersPanel, mobileTravBody, travOrigin);
travelersPanel.style.display = 'block';
travelersPanel.style.opacity = '1';
travelersPanel.style.pointerEvents = 'auto';
travelersPanel.classList.add('active');
// ensure age dropdowns reflect current children count
updateChildrenAges();
}
openMobileFly(mobileTravPanel);
}
function closeMobileTravelersFly() {
if (travelersPanel) {
console.log('Mobile travelers flyout close');
travelersPanel.style.display = 'none';
travelersPanel.style.opacity = '';
travelersPanel.style.pointerEvents = '';
travelersPanel.classList.remove('active');
restoreNode(travelersPanel, travOrigin);
}
closeMobileFly(mobileTravPanel);
}
function openMobileCalendarFly() {
if (!mobileCalPanel) return;
closeAllPanels();
console.log('Mobile calendar flyout open');
if (calendarPanel && mobileCalBody) {
moveNodeInto(calendarPanel, mobileCalBody, calOrigin);
calendarPanel.style.display = 'block';
calendarPanel.style.opacity = '1';
calendarPanel.style.pointerEvents = 'auto';
}
openMobileFly(mobileCalPanel);
}
function closeMobileCalendarFly() {
if (calendarPanel) {
console.log('Mobile calendar flyout close');
calendarPanel.style.display = 'none';
calendarPanel.style.opacity = '';
calendarPanel.style.pointerEvents = '';
restoreNode(calendarPanel, calOrigin);
}
closeMobileFly(mobileCalPanel);
}
bindMobileMetaClick(mobileTravelersText, openMobileTravelersFly);
bindMobileMetaClick(mobileTravelersItem, openMobileTravelersFly);
bindMobileMetaClick(mobileDateText, openMobileCalendarFly);
bindMobileMetaClick(mobileDateItem, openMobileCalendarFly);
if (mobileTravClose) {
mobileTravClose.addEventListener('click', (e) => {
e.preventDefault();
closeMobileTravelersFly();
});
}
if (mobileTravDone) {
mobileTravDone.addEventListener('click', (e) => {
e.preventDefault();
closeMobileTravelersFly();
// Sync to desktop counts
if (adultsCountInput) adultsCountInput.value = adultsCount;
if (childrenCountInput) childrenCountInput.value = childrenCount;
updateTravelersDisplay();
});
}
if (mobileCalClose) {
mobileCalClose.addEventListener('click', (e) => {
e.preventDefault();
closeMobileCalendarFly();
});
}
[mobileTravPanel, mobileCalPanel].forEach(panel => {
if (panel) {
panel.addEventListener('click', (e) => {
if (e.target === panel) {
closeMobileFly(panel);
}
});
}
});
// Next tab button handler
const tabNextBtn = document.querySelector('.tab-next-btn');
function updateNextButtonLabel() {
if (!tabNextBtn) return;
const tabs = Array.from(document.querySelectorAll('.tour-nav-tabs .nav-link'));
if (tabs.length === 0) return;
const activeIndex = tabs.findIndex(t => t.classList.contains('active'));
const nextIndex = activeIndex >= 0 ? (activeIndex + 1) % tabs.length : 1 % tabs.length;
const nextLabel = tabs[nextIndex].textContent.trim();
tabNextBtn.innerHTML = `Next: ${nextLabel} <i class="fa-solid fa-chevron-right ms-2"></i>`;
tabNextBtn.setAttribute('data-next-tab', tabs[nextIndex].getAttribute('href'));
}
function goToNextTab() {
const tabs = Array.from(document.querySelectorAll('.tour-nav-tabs .nav-link'));
if (tabs.length === 0) return;
const activeIndex = tabs.findIndex(t => t.classList.contains('active'));
const nextIndex = activeIndex >= 0 ? (activeIndex + 1) % tabs.length : 0;
const tabLink = tabs[nextIndex];
const targetId = tabLink.getAttribute('href');
if (tabLink) {
tabLink.click();
}
setTimeout(function() {
const targetContent = document.querySelector(targetId);
if (targetContent) {
targetContent.scrollIntoView({ behavior: 'smooth', block: 'start' });
}
updateNextButtonLabel();
}, 50);
}
if (tabNextBtn) {
tabNextBtn.addEventListener('click', function(e) {
e.preventDefault();
goToNextTab();
});
}
// Update label on load and when tabs change
updateNextButtonLabel();
document.querySelectorAll('.tour-nav-tabs .nav-link').forEach(link => {
link.addEventListener('click', () => {
setTimeout(updateNextButtonLabel, 50);
});
});
// FAQ two-column: switch active Q&A on nav link click
document.querySelectorAll('.faq-nav-link').forEach(link => {
link.addEventListener('click', function(e) {
e.preventDefault();
var idx = this.getAttribute('data-faq-index');
if (idx == null) return;
document.querySelectorAll('.faq-nav-col .faq-nav-link').forEach(function(l) { l.classList.remove('active'); });
this.classList.add('active');
document.querySelectorAll('.faq-detail-col .faq-item').forEach(function(item) {
item.classList.toggle('active', item.getAttribute('data-faq-index') === idx);
});
});
});
// Mobile floating quote button on scroll (show when hero section is out of view)
const mobileQuoteSection = document.querySelector('.mobile-hero-quote');
const mobileQuoteBtn = document.getElementById('get-quote-btn-mobile');
const mobileViewport = window.matchMedia('(max-width: 767.98px)');
function setFloatingQuoteBtn(isSectionVisible) {
if (!mobileQuoteBtn) return;
if (!mobileViewport.matches) {
mobileQuoteBtn.classList.remove('is-floating', 'hide');
return;
}
if (isSectionVisible) {
mobileQuoteBtn.classList.remove('is-floating');
} else {
mobileQuoteBtn.classList.add('is-floating');
mobileQuoteBtn.classList.remove('hide');
}
}
if (mobileQuoteSection && mobileQuoteBtn && 'IntersectionObserver' in window) {
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
setFloatingQuoteBtn(entry.isIntersecting);
});
}, { threshold: 0.1 });
observer.observe(mobileQuoteSection);
mobileViewport.addEventListener('change', () => setFloatingQuoteBtn(true));
}
// Handle "Get a Free Quote" button click
const quoteButtons = document.querySelectorAll('#get-quote-btn-detail, #get-quote-btn-mobile, #get-quote-btn-interested');
const checkoutBaseUrlPHP = "https:\/\/ottosafariguide.com\/tours-checkout\/?tour_id=14216";
if (quoteButtons.length > 0) {
quoteButtons.forEach(btn => {
btn.addEventListener('click', function(e) {
e.preventDefault();
// Get tour ID from URL or PHP variable
const tourId = 14216;
// Build checkout URL with parameters
const checkoutParams = {};
if (tourId) {
checkoutParams.tour_id = tourId;
}
if (selectedDate) {
checkoutParams.start_date = formatDate(selectedDate);
}
if (adultsCount > 0) {
checkoutParams.adults = adultsCount;
}
if (childrenCount > 0) {
checkoutParams.children = childrenCount;
}
// Build URL (prefer data attribute, fallback to PHP value, then origin)
const baseFromData = (btn.dataset.checkoutBase || '').trim();
let checkoutBaseUrl = baseFromData || (checkoutBaseUrlPHP || '').trim();
if (!checkoutBaseUrl) {
console.warn('Checkout base URL missing; aborting navigation.');
return;
}
let url;
try {
url = new URL(checkoutBaseUrl, window.location.origin);
} catch (err) {
console.warn('Invalid checkout URL, falling back to origin:', checkoutBaseUrl);
url = new URL(window.location.origin);
}
// Add parameters to URL
Object.keys(checkoutParams).forEach(key => {
url.searchParams.set(key, checkoutParams[key]);
});
const finalUrl = url.toString();
console.log('Navigating to checkout:', finalUrl);
// Navigate to checkout
window.location.assign(finalUrl);
});
});
}
});
// Gallery Modal Functionality
document.addEventListener('DOMContentLoaded', function() {
const galleryTriggers = document.querySelectorAll('[data-gallery-trigger]');
const galleryModal = document.getElementById('gallery-modal');
const galleryImages = ["https:\/\/ottosafariguide.com\/wp-content\/uploads\/2023\/11\/safari-by-air-to-ruaha.jpg","https:\/\/ottosafariguide.com\/wp-content\/uploads\/2023\/12\/WhatsApp-Image-2023-12-14-at-19.20.30-1.jpeg","https:\/\/ottosafariguide.com\/wp-content\/uploads\/2023\/12\/ruaha-national-park.jpg","https:\/\/ottosafariguide.com\/wp-content\/uploads\/2026\/02\/ruaha-np-2.jpeg","https:\/\/ottosafariguide.com\/wp-content\/uploads\/2025\/10\/cub-lion-ruaha--e1760088062899.jpg","https:\/\/ottosafariguide.com\/wp-content\/uploads\/2026\/02\/ruaha-np-6.jpeg"];
let currentImageIndex = 0;
if (!galleryModal || galleryImages.length === 0) return;
const galleryClose = galleryModal.querySelector('.gallery-modal-close');
const galleryOverlay = galleryModal.querySelector('.gallery-modal-overlay');
const galleryPrev = galleryModal.querySelector('.gallery-modal-prev');
const galleryNext = galleryModal.querySelector('.gallery-modal-next');
const galleryImage = galleryModal.querySelector('.gallery-modal-image');
const galleryThumbnails = galleryModal.querySelectorAll('.gallery-thumbnail');
const galleryCurrent = galleryModal.querySelector('.gallery-current');
function openGallery(index) {
currentImageIndex = index || 0;
updateGalleryImage();
galleryModal.classList.add('active');
document.body.style.overflow = 'hidden';
}
function closeGallery() {
galleryModal.classList.remove('active');
document.body.style.overflow = '';
}
function updateGalleryImage() {
if (galleryImages[currentImageIndex]) {
galleryImage.src = galleryImages[currentImageIndex];
galleryImage.alt = 'Gallery Image ' + (currentImageIndex + 1);
}
if (galleryCurrent) {
galleryCurrent.textContent = currentImageIndex + 1;
}
// Update thumbnails
galleryThumbnails.forEach((thumb, index) => {
if (index === currentImageIndex) {
thumb.classList.add('active');
} else {
thumb.classList.remove('active');
}
});
}
function showNextImage() {
if (currentImageIndex < galleryImages.length - 1) {
currentImageIndex++;
} else {
currentImageIndex = 0;
}
updateGalleryImage();
}
function showPrevImage() {
if (currentImageIndex > 0) {
currentImageIndex--;
} else {
currentImageIndex = galleryImages.length - 1;
}
updateGalleryImage();
}
// Open gallery on trigger click
galleryTriggers.forEach(trigger => {
trigger.addEventListener('click', function(e) {
e.preventDefault();
openGallery(0);
});
});
// Close gallery
if (galleryClose) {
galleryClose.addEventListener('click', function(e) {
e.preventDefault();
closeGallery();
});
}
if (galleryOverlay) {
galleryOverlay.addEventListener('click', function() {
closeGallery();
});
}
// Navigation
if (galleryNext) {
galleryNext.addEventListener('click', function(e) {
e.preventDefault();
e.stopPropagation();
showNextImage();
});
}
if (galleryPrev) {
galleryPrev.addEventListener('click', function(e) {
e.preventDefault();
e.stopPropagation();
showPrevImage();
});
}
// Thumbnail click
galleryThumbnails.forEach((thumb, index) => {
thumb.addEventListener('click', function() {
currentImageIndex = index;
updateGalleryImage();
});
});
// Keyboard navigation
document.addEventListener('keydown', function(e) {
if (!galleryModal.classList.contains('active')) return;
if (e.key === 'Escape') {
closeGallery();
} else if (e.key === 'ArrowRight') {
showNextImage();
} else if (e.key === 'ArrowLeft') {
showPrevImage();
}
});
});
// Force Font Awesome 6 on icons (fix for Elementor Font Awesome 4 conflict)
jQuery(document).ready(function($) {
function forceFontAwesome6() {
$('[class*="fa-"], [class^="fa-"]').each(function() {
var $icon = $(this);
var classes = $icon.attr('class') || '';
var hasFA6 = classes.indexOf('fa-solid') !== -1 || classes.indexOf('fa-regular') !== -1 || classes.indexOf('fa-brands') !== -1;
if (hasFA6) {
var existingStyle = $icon.attr('style') || '';
if (existingStyle.indexOf('font-family') === -1) {
$icon.attr('style', existingStyle + '; font-family: "Font Awesome 6 Free" !important; font-weight: 900 !important; font-style: normal !important;');
}
}
});
}
// Apply immediately and after delay
forceFontAwesome6();
setTimeout(forceFontAwesome6, 500);
setTimeout(forceFontAwesome6, 1500);
// Accommodation Gallery Popup
let currentGalleryImages = [];
let currentGalleryIndex = 0;
let currentGalleryName = '';
const galleryBackdrop = document.getElementById('accommodation-gallery-backdrop');
const galleryPopup = document.getElementById('accommodation-gallery-popup');
const galleryMainImg = document.getElementById('gallery-main-image');
const galleryName = document.getElementById('gallery-accommodation-name');
const galleryCounter = document.getElementById('gallery-counter');
const galleryThumbnails = document.getElementById('gallery-thumbnails');
const galleryClose = document.getElementById('gallery-close');
const galleryPrev = document.getElementById('gallery-prev');
const galleryNext = document.getElementById('gallery-next');
function openGallery(images, name, startIndex) {
currentGalleryImages = images;
currentGalleryIndex = startIndex || 0;
currentGalleryName = name;
updateGalleryDisplay();
if (galleryBackdrop) {
galleryBackdrop.style.display = 'block';
}
if (galleryPopup) {
galleryPopup.style.display = 'flex';
document.body.style.overflow = 'hidden';
}
}
function closeGallery() {
if (galleryBackdrop) {
galleryBackdrop.style.display = 'none';
}
if (galleryPopup) {
galleryPopup.style.display = 'none';
document.body.style.overflow = '';
}
}
function updateGalleryDisplay() {
if (currentGalleryImages.length === 0) return;
if (galleryMainImg) {
galleryMainImg.src = currentGalleryImages[currentGalleryIndex];
galleryMainImg.alt = currentGalleryName;
}
if (galleryName) {
galleryName.textContent = currentGalleryName;
}
if (galleryCounter) {
galleryCounter.textContent = (currentGalleryIndex + 1) + '/' + currentGalleryImages.length;
}
if (galleryThumbnails) {
galleryThumbnails.innerHTML = '';
currentGalleryImages.forEach((img, index) => {
const thumb = document.createElement('img');
thumb.src = img;
thumb.alt = currentGalleryName;
thumb.className = 'gallery-thumbnail' + (index === currentGalleryIndex ? ' active' : '');
thumb.addEventListener('click', () => {
currentGalleryIndex = index;
updateGalleryDisplay();
});
galleryThumbnails.appendChild(thumb);
});
}
// Update arrow visibility
if (galleryPrev) {
galleryPrev.style.display = currentGalleryImages.length > 1 ? 'flex' : 'none';
}
if (galleryNext) {
galleryNext.style.display = currentGalleryImages.length > 1 ? 'flex' : 'none';
}
}
function nextImage() {
if (currentGalleryIndex < currentGalleryImages.length - 1) {
currentGalleryIndex++;
} else {
currentGalleryIndex = 0;
}
updateGalleryDisplay();
}
function prevImage() {
if (currentGalleryIndex > 0) {
currentGalleryIndex--;
} else {
currentGalleryIndex = currentGalleryImages.length - 1;
}
updateGalleryDisplay();
}
// Event listeners
document.addEventListener('click', function(e) {
// Click on accommodation gallery images
if (e.target.classList.contains('accommodation-gallery-img')) {
const photosContainer = e.target.closest('.accommodation-photos');
if (photosContainer) {
const images = JSON.parse(photosContainer.getAttribute('data-images') || '[]');
const name = photosContainer.getAttribute('data-name') || '';
const index = parseInt(e.target.getAttribute('data-index') || '0');
openGallery(images, name, index);
}
}
// Click on photo link overlay
if (e.target.classList.contains('accommodation-gallery-trigger')) {
e.preventDefault();
const photosContainer = e.target.closest('.accommodation-photos');
if (photosContainer) {
const images = JSON.parse(photosContainer.getAttribute('data-images') || '[]');
const name = photosContainer.getAttribute('data-name') || '';
const index = parseInt(e.target.getAttribute('data-index') || '3');
openGallery(images, name, index);
}
}
});
if (galleryClose) {
galleryClose.addEventListener('click', closeGallery);
}
if (galleryPrev) {
galleryPrev.addEventListener('click', prevImage);
}
if (galleryNext) {
galleryNext.addEventListener('click', nextImage);
}
// Close on backdrop click
if (galleryBackdrop) {
galleryBackdrop.addEventListener('click', function(e) {
closeGallery();
});
}
// Keyboard navigation
document.addEventListener('keydown', function(e) {
if (galleryPopup && galleryPopup.style.display === 'flex' && galleryBackdrop && galleryBackdrop.style.display === 'block') {
if (e.key === 'Escape') {
closeGallery();
} else if (e.key === 'ArrowLeft') {
prevImage();
} else if (e.key === 'ArrowRight') {
nextImage();
}
}
});
});
const lazyloadRunObserver = () => {
const lazyloadBackgrounds = document.querySelectorAll( `.e-con.e-parent:not(.e-lazyloaded)` );
const lazyloadBackgroundObserver = new IntersectionObserver( ( entries ) => {
entries.forEach( ( entry ) => {
if ( entry.isIntersecting ) {
let lazyloadBackground = entry.target;
if( lazyloadBackground ) {
lazyloadBackground.classList.add( 'e-lazyloaded' );
}
lazyloadBackgroundObserver.unobserve( entry.target );
}
});
}, { rootMargin: '200px 0px 200px 0px' } );
lazyloadBackgrounds.forEach( ( lazyloadBackground ) => {
lazyloadBackgroundObserver.observe( lazyloadBackground );
} );
};
const events = [
'DOMContentLoaded',
'elementor/lazyload/observe',
];
events.forEach( ( event ) => {
document.addEventListener( event, lazyloadRunObserver );
} );
https://ottosafariguide.com/wp-content/plugins/business-reviews-wp/assets/js/app.min.js
https://ottosafariguide.com/wp-content/plugins/elementskit-lite/widgets/init/assets/js/widget-scripts.js
https://ottosafariguide.com/wp-content/plugins/wp-travel-engine/assets/lib/owl-carousel-2.3.4/owl.carousel.js
https://ottosafariguide.com/wp-content/plugins/wp-travel-engine/assets/lib/dropzone/dropzone.min.js
https://ottosafariguide.com/wp-content/plugins/wte-elementor-widgets/dist/js/wte-offcanvas.js
https://ottosafariguide.com/wp-content/plugins/wte-elementor-widgets/dist/js/wpte-animation.js
https://ottosafariguide.com/wp-content/plugins/wp-travel-engine/assets/lib/flatpickr-4.6.9/fpickr.js
https://ottosafariguide.com/wp-content/plugins/wp-travel-engine/assets/lib/flatpickr-4.6.9/l10n/en.js
https://ottosafariguide.com/wp-includes/js/dist/hooks.min.js
https://ottosafariguide.com/wp-includes/js/dist/i18n.min.js
wp.i18n.setLocaleData( { 'text direction\u0004ltr': [ 'ltr' ] } );
//# sourceURL=wp-i18n-js-after
;(function(){
var wte = window[wte] || {};
if(! window.wte){
window.wte = {"personFormat":"\/person","bookNow":"Book Now","totaltxt":"Total:","currency":{"code":"USD","symbol":"$"},"payments":[],"single_showtabs":false,"pax_labels":[],"booking_cutoff":{"enable":false,"cutoff":0,"unit":"days"}};
}
})();
;(function(){
var wte_account_page = window[wte_account_page] || {};
if(! window.wte_account_page){
window.wte_account_page = {"ajax_url":"https:\/\/ottosafariguide.com\/wp-admin\/admin-ajax.php","change_user_profile_msg":"Click here or Drop new image to update your profile picture"};
}
})();
;(function(){
var rtl = window[rtl] || {};
if(! window.rtl){
window.rtl = [];
}
})();
;(function(){
var wtePreFetch = window[wtePreFetch] || {};
if(! window.wtePreFetch){
window.wtePreFetch = {"tripID":13636,"wpapi":{"root":"https:\/\/ottosafariguide.com\/wp-json\/","nonce":"28dfece6df","versionString":"wp\/v2\/"},"iframe_url":""};
}
})();
;(function(){
var WTEAjaxData = window[WTEAjaxData] || {};
if(! window.WTEAjaxData){
window.WTEAjaxData = {"ajaxurl":"https:\/\/ottosafariguide.com\/wp-admin\/admin-ajax.php","nonce":"28dfece6df"};
}
})();
;(function(){
var wteL10n = window[wteL10n] || {};
if(! window.wteL10n){
window.wteL10n = {"version":"6.8.1","baseCurrency":"USD","baseCurrencySymbol":"$","currency":"USD","currencySymbol":"$","home_url":"https:\/\/ottosafariguide.com","_nonces":{"addtocart":"a5653f9672","downloadSystemInfo":"fa761ee9e5"},"wpapi":{"root":"https:\/\/ottosafariguide.com\/wp-json\/","nonce":"28dfece6df","versionString":"wp\/v2\/"},"wpxhr":{"root":"https:\/\/ottosafariguide.com\/wp-admin\/admin-ajax.php","nonce":"b4f310c4a6"},"format":{"number":{"decimal":"default","decimalSeparator":".","thousandSeparator":","},"price":"%CURRENCY_SYMBOL%%FORMATED_AMOUNT%","date":"F j, Y","time":"g:i a","datetime":{"date":"F j, Y","time":"g:i a","GMTOffset":"+00:00","timezone":""},"enableRound":false},"extensions":[],"locale":"en_US","l10n":{"invalidCartTraveler":"No. of Travellers' should be at least %s","availableSeatsExceed":"The number of pax can not exceed more than %s","invalidCartExtraReq":"%s selection is essential. Please specify a number.","invalidCartExtra":"Extra Services marked with * is essential. Please specify a number.","extraServicesTitle":"","checkout.submitButtonText":"Book Now","checkout.bookingSummary":"Booking Summary","checkout.totalPayable":"Total Payable Now"},"layout":{"showFeaturedTripsOnTop":true,"showoptionfilter":true},"rtl":false};
}
})();
//# sourceURL=wp-travel-engine-js-before
https://ottosafariguide.com/wp-content/plugins/wp-travel-engine/dist/public/wte-public.js
https://ottosafariguide.com/wp-content/plugins/wp-travel-engine/dist/public/trip-search/widgets-dropdown.js
https://ottosafariguide.com/wp-content/plugins/wp-travel-engine/dist/public/trip-search/widgets-slider.js
https://ottosafariguide.com/wp-content/plugins/contact-form-7/includes/swv/js/index.js
var wpcf7 = {
"api": {
"root": "https:\/\/ottosafariguide.com\/wp-json\/",
"namespace": "contact-form-7\/v1"
},
"cached": 1
};
//# sourceURL=contact-form-7-js-before
https://ottosafariguide.com/wp-content/plugins/contact-form-7/includes/js/index.js
https://ottosafariguide.com/wp-content/plugins/travel-booking-toolkit/public/js/travel-booking-toolkit-public.min.js
https://ottosafariguide.com/wp-content/plugins/travel-booking-toolkit/public/js/fontawesome/all.min.js
https://ottosafariguide.com/wp-content/plugins/travel-booking-toolkit/public/js/fontawesome/v4-shims.min.js
console.log("=== Custom Booking Debug Info ===");
console.log("Is Tour Detail Page: true");
console.log("Has Tour Query: true");
console.log("Tour Slug: 4-day-ruaha-predators-safari");
console.log("Tour ID: 14216");
console.log("Queried Object: WP_Post (ID: 13636, Type: page, Name: tour-detail)");
console.log("First post in query (what template uses): ID 13636, Type: page, Name: tour-detail");
console.log("query_vars.pagename: tour-detail");
console.log("Request URI path: tour-detail/southern-tanzania-safaris/ruaha/4-day-ruaha-predators-safari");
console.log("Is checkout URL by path: false");
console.log("Shortcode [custom_booking_checkout] in queried post content: NO");
console.log("Is 404: false");
console.log("Post Count: 1");
console.log("Global Tour ID: 14216");
console.log("Current URL: " + window.location.href);
console.log("--- Why checkout may not work ---");
console.log("N/A");
console.log("=== End Debug Info ===");
//# sourceURL=bootstrap-js-after
window.nfdPerformance = window.nfdPerformance || {};
window.nfdPerformance.imageOptimization = window.nfdPerformance.imageOptimization || {};
window.nfdPerformance.imageOptimization.lazyLoading = {"classes":["nfd-performance-not-lazy","a3-notlazy","disable-lazyload","no-lazy","no-lazyload","skip-lazy"],"attributes":["data-lazy-src","data-crazy-lazy=\"exclude\"","data-no-lazy","data-no-lazy=\"1\""]};
//# sourceURL=nfd-performance-lazy-loader-js-before
https://ottosafariguide.com/wp-content/plugins/mojo-marketplace-wp-plugin//vendor/newfold-labs/wp-module-performance/build/image-lazy-loader.min.js
var travel_monster_custom = {"url":"https://ottosafariguide.com/wp-admin/admin-ajax.php","rtl":"","sticky_widget":"1","ed_sticky_header":""};
//# sourceURL=travel-monster-custom-js-extra
https://ottosafariguide.com/wp-content/themes/travel-monster/js/custom.min.js