10-Day Nyerere Safari & Zanzibar Beach Holiday (Southern Tanzania Escape)
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 Southern Tanzania itinerary combines the untamed wilderness of Nyerere National Park with the tropical beaches of Zanzibar.
Formerly part of the Selous Game Reserve, Nyerere National Park is Africa’s largest protected wildlife area and offers a more exclusive safari experience compared to the busy northern parks.
This itinerary includes:
Boat safaris on the Rufiji River
Walking safaris with armed rangers
Traditional game drives
Relaxing Zanzibar beach stay
Perfect for travelers seeking a quieter, more authentic Tanzania safari and beach 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.
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 2&3&4&5
All Meals Included
Day 6 & 7 & 8 & 9
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
$6,450p.p
$5,150p.p
$4,750p.p
$4,750p.p
$4,400p.p
$4,400p.p
Get Quote
Low Season: 1 March – 31 May & November
$5,750p.p
$4,550p.p
$4,150p.p
$4,150p.p
$3,850p.p
$3,850p.p
Get Quote
Domestic flights Park & conservation fees Professional English-speaking guide Private 4x4 safari vehicle Bottled water during game drives Meals as listed
International flights & visas Tips & personal expenses Travel insurance Optional Activities
This safari starts in Dar es Salaam and ends in Zanzibar.
International travelers can arrive through:
Julius Nyerere International Airport (DAR) in Dar es Salaam
Zanzibar International Airport (ZNZ) for beach extensions
Access to Nyerere National Park is possible either by:
Domestic scheduled flights from Dar es Salaam (recommended for comfort and time-saving)
Road transfer from Dar es Salaam (approximately 5–6 hours depending on road conditions)
Flights between Nyerere and Zanzibar are operated by domestic airlines and usually include scenic aerial views of the Tanzanian coastline and bush landscapes.
Day 1
Arrival in Dar es Salaam
Arrival in Dar es Salaam – Welcome to Tanzania
Upon arrival at Julius Nyerere International Airport in Dar es Salaam, you will be welcomed by our safari representative and transferred to your hotel for overnight stay.
Depending on your arrival time, you may relax at the hotel, explore the city coastline, or prepare for your Southern Tanzania safari adventure.
Dar es Salaam serves as the gateway to the remote wilderness areas of Southern Tanzania including
Nyerere National Park and Ruaha.
Wildlife in Arrival in Dar es Salaam
Meals & Drinks:
Breakfast
Day 2
Transfer to Nyerere National Park
Drive or Fly to Nyerere National Park
After breakfast, depart for Nyerere National Park, formerly known as Selous Game Reserve, one of Africa’s largest protected wildlife areas.
Upon arrival, enjoy your first safari activity with game viewing around the Rufiji River ecosystem, home to elephants, giraffes, buffalo, hippos, crocodiles, and a variety of bird species.
The park offers a quieter and more exclusive safari atmosphere compared to Northern Tanzania parks.
Wildlife in Transfer to Nyerere National Park
Meals & Drinks:
Breakfast , Lunch and Dinner
Day 3
Boat Safari Experience
Boat Safari Along the Rufiji River
Today enjoy one of Southern Tanzania’s most unique safari activities — a boat safari along the Rufiji River.
Unlike traditional game drives, boat safaris allow close viewing of hippos, crocodiles, elephants, and water birds directly from the river channels.
Sunset boat safaris are especially popular for photography and wildlife viewing.
Learn more about this activity here:
Boat Safari Tanzania
Wildlife in Boat Safari Experience
Meals & Drinks:
Breakfast,Lunch and Dinner
Day 4
Full-Day Game Drive
Full-Day Game Drive in Nyerere National Park
Spend the day exploring the vast wilderness of Nyerere National Park with your professional safari guide.
Wildlife commonly seen includes:
Lions
Leopards
Wild dogs
Elephants
Large buffalo herds
The park’s remote nature provides excellent opportunities for uncrowded wildlife encounters and authentic safari experiences.
Wildlife in Full-Day Game Drive
Meals & Drinks:
Breakfast, Lunch and Dinner
Day 5
Walking Safari Adventure
Walking Safari in the African Wilderness
Experience the African bush from ground level during a guided walking safari accompanied by an armed ranger.
Walking safaris offer a completely different perspective of the ecosystem by focusing on animal tracks, plants, insects, and smaller wildlife often missed during game drives.
This activity creates a deeper connection with nature and is one of the highlights of Southern Tanzania safaris.
Read more here:
Walking Safari Tanzania
Wildlife in Walking Safari Adventure
Meals & Drinks:
Breakfast ,Lunch and Dinner
Day 6
Relaxed Safari & Sunset Experience
Leisure Safari Day & Sunset Wildlife Viewing
Enjoy a flexible safari day with optional morning game drives, relaxation at camp, or photography-focused wildlife excursions.
Many camps in Nyerere overlook rivers or floodplains, allowing wildlife viewing directly from the lodge.
In the evening, enjoy a classic African sunset surrounded by the sounds of the wilderness.
Wildlife in Relaxed Safari & Sunset Experience
Meals & Drinks:
Fly from Nyerere to Zanzibar Island
After breakfast, transfer to the airstrip for your scenic flight to Zanzibar Island.
Upon arrival, transfer to your beach resort and enjoy the rest of the day relaxing along the Indian Ocean coastline.
Zanzibar is famous for white-sand beaches, turquoise waters, spice farms, and Swahili culture.
Wildlife in Fly to Zanzibar
Meals & Drinks:
Bed and Breakfast
Day 8 & 9
Zanzibar Beach Relaxation
Zanzibar Beach Escape
Spend two full days relaxing on Zanzibar’s tropical beaches.
Optional activities include:
Snorkeling and diving
Stone Town cultural tours
Dhow sunset cruises
Spice farm excursions
Swimming and beach relaxation
These days are intentionally flexible, allowing you to relax after your safari adventure.
Wildlife in Zanzibar Beach Relaxation
Meals & Drinks:
Bed and Breakfast
Departure from Zanzibar
After breakfast, transfer to Zanzibar International Airport for your onward international flight.
Depending on your departure schedule, optional late checkout or additional excursions can be arranged.
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=16484";
if (quoteButtons.length > 0) {
quoteButtons.forEach(btn => {
btn.addEventListener('click', function(e) {
e.preventDefault();
// Get tour ID from URL or PHP variable
const tourId = 16484;
// 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\/02\/nyerere-tented-lodge-3.jpeg","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\/2025\/07\/dogs-nyerere.jpg","https:\/\/ottosafariguide.com\/wp-content\/uploads\/2025\/06\/safari-nyerere-from-dar.jpg","https:\/\/ottosafariguide.com\/wp-content\/uploads\/2025\/06\/selous-nyerere-boat-tour-1.jpg","https:\/\/ottosafariguide.com\/wp-content\/uploads\/2023\/12\/nyerere-hippo-e1702388362750.jpg","https:\/\/ottosafariguide.com\/wp-content\/uploads\/2025\/07\/3-day-safari-from-Zanzibar-to-Nyerere-National-Park.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: 10-days-nyerere-safari-zanzibar");
console.log("Tour ID: 16484");
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/10-days-nyerere-safari-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: 16484");
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