137 lines
4.4 KiB
JavaScript
137 lines
4.4 KiB
JavaScript
// Smooth scroll to section, ensuring title is visible
|
|
function scrollToSection(sectionId, e) {
|
|
const section = document.getElementById(sectionId);
|
|
if (!section) return;
|
|
|
|
e.preventDefault();
|
|
|
|
// Get header height for offset
|
|
const header = document.querySelector('.header');
|
|
const headerHeight = header ? header.offsetHeight : 0;
|
|
const padding = 40; // Extra padding to ensure title is fully visible
|
|
|
|
// Calculate position to show section with title visible
|
|
const sectionRect = section.getBoundingClientRect();
|
|
const sectionTop = sectionRect.top + window.pageYOffset;
|
|
|
|
// Scroll to position that shows the section title with proper spacing
|
|
const scrollPosition = sectionTop - headerHeight - padding;
|
|
|
|
window.scrollTo({
|
|
top: Math.max(0, scrollPosition),
|
|
behavior: 'smooth'
|
|
});
|
|
}
|
|
|
|
// Loading screen handler
|
|
function initLoadingScreen() {
|
|
const loadingScreen = document.getElementById('loading-screen');
|
|
if (!loadingScreen) return;
|
|
|
|
let isHiding = false;
|
|
|
|
function hideLoadingScreen() {
|
|
if (isHiding) return;
|
|
isHiding = true;
|
|
loadingScreen.classList.add('hidden');
|
|
setTimeout(function() {
|
|
loadingScreen.remove();
|
|
}, 1200);
|
|
window.removeEventListener('scroll', onScroll);
|
|
window.removeEventListener('wheel', onScroll);
|
|
window.removeEventListener('touchmove', onScroll);
|
|
}
|
|
|
|
function onScroll() {
|
|
hideLoadingScreen();
|
|
}
|
|
|
|
const skipButton = document.getElementById('skip-loading');
|
|
if (skipButton) {
|
|
skipButton.addEventListener('click', hideLoadingScreen);
|
|
}
|
|
|
|
window.addEventListener('scroll', onScroll, { passive: true });
|
|
window.addEventListener('wheel', onScroll, { passive: true });
|
|
window.addEventListener('touchmove', onScroll, { passive: true });
|
|
|
|
window.addEventListener('load', function() {
|
|
setTimeout(function() {
|
|
hideLoadingScreen();
|
|
}, 6500);
|
|
});
|
|
}
|
|
|
|
// Newsletter form submission handler
|
|
function initNewsletterForm() {
|
|
const form = document.getElementById('newsletter-form');
|
|
if (!form) return;
|
|
|
|
const emailInput = document.getElementById('newsletter-email');
|
|
const messageDiv = document.getElementById('newsletter-message');
|
|
const submitButton = form.querySelector('button[type="submit"]');
|
|
|
|
form.addEventListener('submit', async function(e) {
|
|
e.preventDefault();
|
|
|
|
submitButton.disabled = true;
|
|
submitButton.textContent = 'Subscribing...';
|
|
messageDiv.textContent = '';
|
|
messageDiv.className = 'newsletter-message';
|
|
|
|
const email = emailInput.value.trim();
|
|
|
|
if (!email || !email.includes('@')) {
|
|
showMessage('Please enter a valid email address.', 'error');
|
|
submitButton.disabled = false;
|
|
submitButton.textContent = 'Subscribe';
|
|
return;
|
|
}
|
|
|
|
try {
|
|
const response = await fetch('/api/newsletter', {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify({ email }),
|
|
});
|
|
|
|
const data = await response.json();
|
|
|
|
if (response.ok && data.success) {
|
|
showMessage('You\'re subscribed! We\'ll keep you updated.', 'success');
|
|
form.reset();
|
|
} else {
|
|
showMessage(data.error || 'Something went wrong. Please try again.', 'error');
|
|
}
|
|
} catch (error) {
|
|
console.error('Error subscribing:', error);
|
|
showMessage('Network error. Please try again.', 'error');
|
|
} finally {
|
|
submitButton.disabled = false;
|
|
submitButton.textContent = 'Subscribe';
|
|
}
|
|
});
|
|
|
|
function showMessage(message, type) {
|
|
messageDiv.textContent = message;
|
|
messageDiv.className = `newsletter-message ${type}`;
|
|
}
|
|
}
|
|
|
|
document.addEventListener('DOMContentLoaded', function() {
|
|
initLoadingScreen();
|
|
|
|
// Set up scroll handlers for anchor links
|
|
const registerLinks = document.querySelectorAll('a[href="#register"]');
|
|
registerLinks.forEach(link => {
|
|
link.addEventListener('click', (e) => scrollToSection('register', e));
|
|
});
|
|
|
|
const scheduleLinks = document.querySelectorAll('a[href="#schedule"]');
|
|
scheduleLinks.forEach(link => {
|
|
link.addEventListener('click', (e) => scrollToSection('schedule', e));
|
|
});
|
|
|
|
initNewsletterForm();
|
|
});
|