8-Day Nyerere Safari with Zanzibar Extension (Southern Tanzania Bush & Beach Holiday)
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 8-day Tanzania itinerary combines the remote wilderness of Nyerere National Park with the tropical beaches of Zanzibar.
Unlike traditional northern safaris, Southern Tanzania offers a quieter and more authentic safari atmosphere with unique activities such as boat safaris and walking safaris. After your wildlife adventure, relax on Zanzibar’s white-sand beaches and enjoy the island’s Swahili culture and Indian Ocean scenery.
This itinerary is ideal for couples, honeymooners, and travelers looking for a balanced safari and beach experience without a very long holiday.
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.
Starts in Dar es Salaam
This tour starts from Dar es Salaam.
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.
Photographic Safaris – Designed for photographers with extra time at sightings.
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 Luxury accommodations. Budgert and mid-range options are available on request. Similar lodges or camps may be used depending on availability.
Day 2&3&4
All Meals Included
Day 5 & 6 & 7
Bed and Breakfast
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 1 – October 31 and December 20 – March 31
$4,250 p.p
$3,550 p.p
$3,150 p.p
$3,150 p.p
$2,850 p.p
$2,850 p.p
Get Quote
Low Season: 1 March – 31 May & November
$3,650 p.p
$3,050 p.p
$2,700 p.p
$2,700 p.p
$2,450 p.p
$2,450 p.p
Get Quote
Domestic flights (Nyerere/Zanzibar) Park & conservation fees Professional English-speaking guide All meals as Listed Safari activities
International flights & visas Tips & personal expenses Travel insurance Optional Activities
This safari starts in Dar es Salaam and ends in Zanzibar.
Travelers can arrive through Julius Nyerere International Airport (DAR) in Dar es Salaam.
Access to Nyerere National Park is available by :
Domestic flight from Dar es Salaam (recommended)
Road transfer (approximately 5–6 hours)
Flights from Nyerere to Zanzibar are operated by domestic airlines and usually connect through Dar es Salaam depending on schedule.
Day 1
Arrival in Dar es Salaam
Arrival in Dar es Salaam
Upon arrival at Julius Nyerere International Airport, you will meet our safari representative and transfer to your hotel for overnight stay.
Relax and prepare for your Southern Tanzania safari adventure.
Wildlife in Arrival in Dar es Salaam
Meals & Drinks:
Bed and Breakfast
Day 2
Transfer to Nyerere National Park
Journey to Nyerere National Park
After breakfast, transfer to Nyerere National Park either by road or scheduled domestic flight.
Formerly known as Selous Game Reserve, Nyerere is Africa’s largest protected wildlife area and one of Tanzania’s best safari destinations for remote wilderness experiences.
Enjoy your first game viewing experience upon arrival.
Wildlife in Transfer to Nyerere National Park
Meals & Drinks:
Lunch and Dinner
Day 3
Boat Safari Along the Rufiji River
Boat Safari Experience
Enjoy a scenic boat safari along the Rufiji River, one of the highlights of Southern Tanzania safaris.
Boat safaris provide close-up opportunities to view:
Hippos
Crocodiles
Elephants near riverbanks
Birdlife and river ecosystems
Read more:
Boat Safari Tanzania
Wildlife in Boat Safari Along the Rufiji River
Meals & Drinks:
Breakfast ,Lunch and Dinner
Day 4
Full-Day Game Drive & Walking Safari
Game Drives & Walking Safari
Spend the day exploring the wilderness of Nyerere National Park with game drives and optional walking safari activities.
Wildlife commonly seen includes lions, elephants, giraffes, buffalo, zebras, and African wild dogs.
Walking safaris offer a deeper connection to nature by exploring the bush on foot with an armed ranger.
Learn more here:
Walking Safari Tanzania
Wildlife in Full-Day Game Drive & Walking Safari
Meals & Drinks:
Breakfast, Lunch and Dinner
Fly to Zanzibar Island
After breakfast, transfer to the airstrip for your flight to Zanzibar.
Upon arrival, transfer to your beach resort and enjoy your first evening by the Indian Ocean.
Wildlife in Fly to Zanzibar
Meals & Drinks:
Bed and Breakfast
Day 6 & 7
Zanzibar Beach Relaxation
Zanzibar Beach Experience
Spend two days enjoying Zanzibar’s tropical beaches and optional island activities.
Snorkeling and diving
Dhow sunset cruises
Stone Town tours
Spice farm excursions
Swimming and beach relaxation
These days are designed for relaxation after your safari adventure.
Wildlife in Zanzibar Beach Relaxation
Meals & Drinks:
Bed and Breakfast
Departure from Zanzibar
After breakfast, transfer to Zanzibar Airport for your onward international flight.
Main Destination:
Departure
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=16523";
if (quoteButtons.length > 0) {
quoteButtons.forEach(btn => {
btn.addEventListener('click', function(e) {
e.preventDefault();
// Get tour ID from URL or PHP variable
const tourId = 16523;
// 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\/2026\/05\/nyerere-rufiji-river-boat-safari.webp","https:\/\/ottosafariguide.com\/wp-content\/uploads\/2025\/07\/giraffe-nyerere.jpg","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\/2026\/04\/Melia-Zanzibar-1.jpg","https:\/\/ottosafariguide.com\/wp-content\/uploads\/2026\/04\/Melia-Zanzibar.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: 8-days-nyerere-zanzibar-extension");
console.log("Tour ID: 16523");
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/nyerere/8-days-nyerere-zanzibar-extension");
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: 16523");
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