7-Day Southern Tanzania Safari from Zanzibar (Nyerere & Mikumi Adventure)
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 safari is designed for travelers already staying in Zanzibar who want to experience Tanzania’s wildlife without traveling to the Northern Circuit.
The itinerary combines the scenic landscapes of Mikumi National Park with the remote wilderness of Nyerere National Park.
Enjoy classic game drives, a boat safari along the Rufiji River, and optional walking safari experiences before returning to Zanzibar for departure or beach relaxation.
This is one of the best safari options for Zanzibar visitors seeking:
Short fly-in safari access
Fewer crowds
Diverse safari activities
Midrange or luxury bush experiences
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 Safari
This tour is a fly-in to the park, reducing time by road.
Safari From Zanzibar
This Tour Starting From Zanzibar
Activities & Transportation
Game Drives – Guided wildlife viewing in national parks and reserves.
Walking Safaris – Explore nature on foot with an armed ranger.
Boat Safaris – Water-based wildlife viewing on rivers and lakes.
Birdwatching Tours – Specialist birding excursions for enthusiasts.
Photographic Safaris – Designed for photographers with extra time at sightings.
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.
Domestic Flights – Fly-in to the parks .
Getting around: pop-up roof 4x4 vehicle
Accommodation & Meals
This tour is priced using Mid Range accommodations. Budgert and mid-range options are available on request. Similar lodges or camps may be used depending on availability.
Day 1 & 2
All Meals Included
Day 3&4&5&6
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
High Season (June–October & December–February)
$5,950
$4,250
$4,950
$4,950
$4,650
$4,650
Get Quote
Low Season (March–May)
$5,450
$4,850
$4,550
$4,550
$4,300
$4,300
Get Quote
Domestic flights (Zanzibar–Mikumi / Nyerere–Zanzibar) Park & conservation fees Safari vehicle & professional guide Boat Safari Walking Safari Airport transfers in Zanzibar Drinking water during game drives
International flights & visas Tips & personal expenses Travel insurance
This safari starts and ends in Zanzibar.
Travelers already staying in Zanzibar can easily connect to Southern Tanzania through scheduled domestic flights.
Flights operate between Zanzibar and safari airstrips near Mikumi National Park and Nyerere National Park.
This itinerary is ideal as a safari add-on to an existing Zanzibar beach holiday.
Day 1
Fly from Zanzibar to Mikumi National Park
Flight to Mikumi National Park & Afternoon Game Drive
After breakfast, transfer to Zanzibar Airport for your domestic flight to Mikumi National Park.
Upon arrival, begin your first game drive across the open plains of Mikumi, often compared to the Serengeti because of its wide savannah landscapes.
Wildlife commonly seen includes elephants, giraffes, zebras, buffalo, wildebeest, and lions.
Enjoy sunset views before arriving at your safari lodge for dinner and overnight stay.
Wildlife in Fly from Zanzibar to Mikumi National Park
Meals & Drinks:
Lunch and Dinner
Day 2
Full-Day Safari in Mikumi
Exploring the Wildlife of Mikumi National Park
Spend a full day exploring Mikumi National Park with morning and afternoon game drives.
The park is home to a variety of wildlife species and offers excellent opportunities for photography and birdwatching.
Your guide will search for predators including lions and hyenas while also exploring hippo pools and acacia woodlands.
Wildlife in Full-Day Safari in Mikumi
Meals & Drinks:
Breakfast Lunch and Dinner
Day 3
Transfer to Nyerere National Park
Journey to Nyerere National Park
After breakfast, drive toward Nyerere National Park, one of Africa’s largest protected wildlife areas.
The journey passes through rural landscapes, villages, and scenic bush environments before arriving in the Rufiji River ecosystem.
Enjoy evening relaxation at your safari camp surrounded by wilderness.
Wildlife in Transfer to Nyerere National Park
Meals & Drinks:
Breakfast,Lunch and Dinner
Day 4
Boat Safari on the Rufiji River
Boat Safari Experience in Nyerere
Today enjoy a boat safari along the Rufiji River, one of the most unique safari activities in Tanzania.
Boat safaris provide close encounters with:
Hippos
Crocodiles
Elephants along riverbanks
Birdlife and aquatic ecosystems
The river scenery and sunset atmosphere create exceptional photography opportunities.
Learn more here:
Boat Safari Tanzania
Wildlife in Boat Safari on the Rufiji River
Meals & Drinks:
Breakfast ,Lunch and Dinner
Day 5
Full-Day Game Drive & Walking Safari
Walking Safari & Wildlife Exploration
Spend the day exploring Nyerere National Park with extended game drives and optional walking safari activities.
Walking safaris allow you to experience the African bush on foot with an armed ranger while learning about animal tracks, plants, and smaller wildlife species.
Nyerere is also one of the best places in Tanzania to see African wild dogs.
Learn more:
Walking Safari Tanzania
Wildlife in Full-Day Game Drive & Walking Safari
Meals & Drinks:
Breakfast, Lunch and Dinner
Day 6
Leisure Safari Experience
Relaxed Safari Day in the Wilderness
Enjoy a flexible safari day with optional morning game drives, photography sessions, or relaxation at camp.
Many safari lodges in Nyerere overlook rivers or floodplains where wildlife can often be viewed directly from camp.
This slower pace provides a more immersive Southern Tanzania safari experience.
Wildlife in Leisure Safari Experience
Meals & Drinks:
Breakfast ,Lunch and Dinner
Day 7
Return Flight to Zanzibar
Flight Back to Zanzibar
After breakfast, transfer to the airstrip for your return flight to Zanzibar.
Upon arrival, continue with your beach holiday or connect with your international departure flight.
Wildlife in Return Flight to Zanzibar
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=16537";
if (quoteButtons.length > 0) {
quoteButtons.forEach(btn => {
btn.addEventListener('click', function(e) {
e.preventDefault();
// Get tour ID from URL or PHP variable
const tourId = 16537;
// 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\/2025\/07\/mikumi-safari-by-sgr.jpg","https:\/\/ottosafariguide.com\/wp-content\/uploads\/2023\/12\/mikumi-elephant-1.jpg","https:\/\/ottosafariguide.com\/wp-content\/uploads\/2023\/12\/WhatsApp-Image-2023-12-05-at-21.47.42.jpeg","https:\/\/ottosafariguide.com\/wp-content\/uploads\/2025\/07\/dogs-nyerere.jpg","https:\/\/ottosafariguide.com\/wp-content\/uploads\/2025\/07\/4-day-fly-in-safari-from-Zanzibar-to-Mikumi-and-Nyerere.jpg","https:\/\/ottosafariguide.com\/wp-content\/uploads\/2023\/12\/nyerere-elephant.jpg"];
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":"e97335d405","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":"e97335d405"};
}
})();
;(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":"bee3f23c32","downloadSystemInfo":"f7e6783827"},"wpapi":{"root":"https:\/\/ottosafariguide.com\/wp-json\/","nonce":"e97335d405","versionString":"wp\/v2\/"},"wpxhr":{"root":"https:\/\/ottosafariguide.com\/wp-admin\/admin-ajax.php","nonce":"486b33d9d8"},"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: 7-days-southern-tanzania-safari-from-zanzibar");
console.log("Tour ID: 16537");
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/7-days-southern-tanzania-safari-from-zanzibar");
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: 16537");
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