// Smooth scroll to section
function scrollToSection(sectionId) {
const section = document.getElementById(sectionId);
if (section) {
section.scrollIntoView({ behavior: 'smooth' });
}
}
// Interactive World Map
const locationData = {
'Paris, France': {
description: 'The City of Light captivated us with its romantic ambiance, world-class museums, and exquisite cuisine. From the Eiffel Tower to the charming streets of Montmartre, Paris never fails to enchant.',
date: 'Visited: March 2023',
highlights: ['Louvre Museum', 'Eiffel Tower', 'Seine River Cruise']
},
'Bali, Indonesia': {
description: 'Bali offered a perfect blend of spiritual temples, terraced rice paddies, and pristine beaches. The warm hospitality and rich culture made this island paradise unforgettable.',
date: 'Visited: January 2023',
highlights: ['Tanah Lot Temple', 'Ubud Rice Terraces', 'Seminyak Beach']
},
'Tokyo, Japan': {
description: 'Tokyo is a city of contrasts where ancient traditions meet cutting-edge technology. From serene temples to neon-lit streets, every corner tells a different story.',
date: 'Visited: May 2023',
highlights: ['Senso-ji Temple', 'Shibuya Crossing', 'Mount Fuji Day Trip']
},
'New York, USA': {
description: 'The city that never sleeps delivered on its promise of endless energy and iconic experiences. Broadway shows, world museums, and diverse neighborhoods made this trip memorable.',
date: 'Visited: December 2022',
highlights: ['Times Square', 'Central Park', 'Brooklyn Bridge']
},
'Reykjavik, Iceland': {
description: 'Iceland\'s dramatic landscapes and the magical Northern Lights left us speechless. From geothermal hot springs to glacier hikes, adventure awaited at every turn.',
date: 'Visited: September 2022',
highlights: ['Northern Lights', 'Blue Lagoon', 'Golden Circle Tour']
},
'Serengeti, Tanzania': {
description: 'Witnessing the Great Migration and coming face to face with the Big Five was a life-changing experience. The vast savanna and abundant wildlife created memories that last forever.',
date: 'Visited: July 2022',
highlights: ['Great Migration', 'Ngorongoro Crater', 'Hot Air Balloon Safari']
}
};
// Initialize map interactions
document.addEventListener('DOMContentLoaded', function() {
const locationMarkers = document.querySelectorAll('.location-marker');
const locationInfo = document.getElementById('locationInfo');
locationMarkers.forEach(marker => {
marker.addEventListener('click', function() {
const location = this.getAttribute('data-location');
const data = locationData[location];
if (data) {
locationInfo.querySelector('h3').textContent = location;
locationInfo.querySelector('p').innerHTML = `
${data.description}
${data.date}
Highlights: ${data.highlights.join(', ')}
`;
locationInfo.classList.remove('hidden');
// Scroll to info if needed
locationInfo.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
}
});
});
});
// Newsletter subscription
document.getElementById('subscriptionForm').addEventListener('submit', function(e) {
e.preventDefault();
const emailInput = document.getElementById('emailInput');
const messageDiv = document.getElementById('subscriptionMessage');
// Simulate subscription process
const submitButton = this.querySelector('button[type="submit"]');
const originalText = submitButton.textContent;
submitButton.innerHTML = ' Subscribing...';
submitButton.disabled = true;
setTimeout(() => {
// Show success message
messageDiv.classList.remove('hidden');
// Reset form
emailInput.value = '';
submitButton.textContent = originalText;
submitButton.disabled = false;
// Hide message after 5 seconds
setTimeout(() => {
messageDiv.classList.add('hidden');
}, 5000);
// In a real app, you would send the email to your backend
console.log('Subscribed email:', emailInput.value);
}, 1500);
});
// Intersection Observer for fade-in animations
const observerOptions = {
threshold: 0.1,
rootMargin: '0px 0px -50px 0px'
};
const observer = new IntersectionObserver(function(entries) {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.classList.add('is-visible');
}
});
}, observerOptions);
// Observe all sections with fade-in class
document.addEventListener('DOMContentLoaded', function() {
const fadeSections = document.querySelectorAll('section');
fadeSections.forEach(section => {
section.classList.add('fade-in-section');
observer.observe(section);
});
});
// Add parallax effect to hero section
window.addEventListener('scroll', function() {
const scrolled = window.pageYOffset;
const heroImage = document.querySelector('.hero-image');
if (heroImage) {
heroImage.style.transform = `translateY(${scrolled * 0.5}px)`;
}
});
// Mobile menu toggle (if needed)
function toggleMobileMenu() {
const mobileMenu = document.getElementById('mobileMenu');
if (mobileMenu) {
mobileMenu.classList.toggle('hidden');
}
}
// Lazy loading for images
document.addEventListener('DOMContentLoaded', function() {
const images = document.querySelectorAll('img[data-src]');
const imageObserver = new IntersectionObserver((entries, observer) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
const img = entry.target;
img.src = img.dataset.src;
img.classList.remove('lazy');
imageObserver.unobserve(img);
}
});
});
images.forEach(img => imageObserver.observe(img));
});
// Add year to footer
function updateYear() {
const yearElements = document.querySelectorAll('.current-year');
const currentYear = new Date().getFullYear();
yearElements.forEach(element => {
element.textContent = currentYear;
});
}
document.addEventListener('DOMContentLoaded', updateYear);
// Smooth scroll for anchor links
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
anchor.addEventListener('click', function (e) {
e.preventDefault();
const target = document.querySelector(this.getAttribute('href'));
if (target) {
target.scrollIntoView({
behavior: 'smooth',
block: 'start'
});
}
});
});
// Search functionality (placeholder)
function searchStories(query) {
console.log('Searching for:', query);
// Implement search logic here
}
// Filter stories by category
function filterByCategory(category) {
const stories = document.querySelectorAll('[data-category]');
stories.forEach(story => {
if (category === 'all' || story.dataset.category === category) {
story.style.display = 'block';
} else {
story.style.display = 'none';
}
});
}
// Add to favorites
function addToFavorites(storyId) {
let favorites = JSON.parse(localStorage.getItem('favorites') || '[]');
if (!favorites.includes(storyId)) {
favorites.push(storyId);
localStorage.setItem('favorites', JSON.stringify(favorites));
console.log('Added to favorites:', storyId);
}
}
// Dark mode toggle (if implementing)
function toggleDarkMode() {
document.body.classList.toggle('dark-mode');
localStorage.setItem('darkMode', document.body.classList.contains('dark-mode'));
}
// Load dark mode preference
document.addEventListener('DOMContentLoaded', function() {
const darkMode = localStorage.getItem('darkMode') === 'true';
if (darkMode) {
document.body.classList.add('dark-mode');
}
});