valley-commons/main.js

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();
});