207 lines
6.0 KiB
JavaScript
207 lines
6.0 KiB
JavaScript
(function() {
|
|
'use strict';
|
|
|
|
// Navigation toggle
|
|
const navToggle = document.querySelector('.nav-toggle');
|
|
const navLinks = document.querySelector('.nav-links');
|
|
|
|
if (navToggle && navLinks) {
|
|
navToggle.addEventListener('click', () => {
|
|
const isOpen = navToggle.getAttribute('aria-expanded') === 'true';
|
|
navToggle.setAttribute('aria-expanded', !isOpen);
|
|
navLinks.classList.toggle('open');
|
|
document.body.style.overflow = isOpen ? '' : 'hidden';
|
|
});
|
|
|
|
// Close menu when clicking a link
|
|
navLinks.querySelectorAll('a').forEach(link => {
|
|
link.addEventListener('click', () => {
|
|
navToggle.setAttribute('aria-expanded', 'false');
|
|
navLinks.classList.remove('open');
|
|
document.body.style.overflow = '';
|
|
});
|
|
});
|
|
|
|
// Close on escape key
|
|
document.addEventListener('keydown', (e) => {
|
|
if (e.key === 'Escape' && navLinks.classList.contains('open')) {
|
|
navToggle.setAttribute('aria-expanded', 'false');
|
|
navLinks.classList.remove('open');
|
|
document.body.style.overflow = '';
|
|
navToggle.focus();
|
|
}
|
|
});
|
|
}
|
|
|
|
// Reveal animations
|
|
const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
|
|
|
|
if (!prefersReducedMotion) {
|
|
const revealElements = document.querySelectorAll('.reveal');
|
|
|
|
const revealObserver = new IntersectionObserver((entries) => {
|
|
entries.forEach(entry => {
|
|
if (entry.isIntersecting) {
|
|
entry.target.classList.add('visible');
|
|
revealObserver.unobserve(entry.target);
|
|
}
|
|
});
|
|
}, {
|
|
threshold: 0.1,
|
|
rootMargin: '0px 0px -50px 0px'
|
|
});
|
|
|
|
revealElements.forEach(el => revealObserver.observe(el));
|
|
} else {
|
|
document.querySelectorAll('.reveal').forEach(el => {
|
|
el.classList.add('visible');
|
|
});
|
|
}
|
|
|
|
// Stats counter animation
|
|
const stats = document.querySelectorAll('.stat-number');
|
|
|
|
if (!prefersReducedMotion && stats.length) {
|
|
const statsObserver = new IntersectionObserver((entries) => {
|
|
entries.forEach(entry => {
|
|
if (entry.isIntersecting) {
|
|
const target = parseInt(entry.target.getAttribute('data-target'), 10);
|
|
animateCounter(entry.target, target);
|
|
statsObserver.unobserve(entry.target);
|
|
}
|
|
});
|
|
}, { threshold: 0.5 });
|
|
|
|
stats.forEach(stat => statsObserver.observe(stat));
|
|
} else {
|
|
stats.forEach(stat => {
|
|
stat.textContent = stat.getAttribute('data-target');
|
|
});
|
|
}
|
|
|
|
function animateCounter(element, target) {
|
|
let current = 0;
|
|
const duration = 2000;
|
|
const step = target / (duration / 16);
|
|
|
|
function update() {
|
|
current += step;
|
|
if (current < target) {
|
|
element.textContent = Math.floor(current);
|
|
requestAnimationFrame(update);
|
|
} else {
|
|
element.textContent = target;
|
|
}
|
|
}
|
|
|
|
requestAnimationFrame(update);
|
|
}
|
|
|
|
// Set minimum date for booking form
|
|
const dateInput = document.getElementById('booking-date');
|
|
if (dateInput) {
|
|
const today = new Date();
|
|
const tomorrow = new Date(today);
|
|
tomorrow.setDate(tomorrow.getDate() + 1);
|
|
const minDate = tomorrow.toISOString().split('T')[0];
|
|
dateInput.setAttribute('min', minDate);
|
|
}
|
|
|
|
// Form handling
|
|
const bookingForm = document.getElementById('bookingForm');
|
|
const contactForm = document.getElementById('contactForm');
|
|
|
|
function showToast(message) {
|
|
const toast = document.getElementById('toast');
|
|
if (toast) {
|
|
toast.textContent = message;
|
|
toast.classList.add('show');
|
|
setTimeout(() => {
|
|
toast.classList.remove('show');
|
|
}, 4000);
|
|
}
|
|
}
|
|
|
|
function validatePhone(phone) {
|
|
const cleaned = phone.replace(/[-\s]/g, '');
|
|
return /^0[0-9]{9}$/.test(cleaned);
|
|
}
|
|
|
|
if (bookingForm) {
|
|
bookingForm.addEventListener('submit', (e) => {
|
|
e.preventDefault();
|
|
|
|
const phone = bookingForm.querySelector('[name="phone"]').value;
|
|
if (!validatePhone(phone)) {
|
|
showToast('מספר הטלפון לא תקין. נא להזין מספר ישראלי.');
|
|
return;
|
|
}
|
|
|
|
const formData = new FormData(bookingForm);
|
|
const data = Object.fromEntries(formData);
|
|
|
|
// Simulate form submission
|
|
console.log('Booking request:', data);
|
|
|
|
showToast('הבקשה נשלחה בהצלחה! נחזור אליך תוך 24 שעות.');
|
|
bookingForm.reset();
|
|
});
|
|
}
|
|
|
|
if (contactForm) {
|
|
contactForm.addEventListener('submit', (e) => {
|
|
e.preventDefault();
|
|
|
|
const phone = contactForm.querySelector('[name="phone"]').value;
|
|
if (!validatePhone(phone)) {
|
|
showToast('מספר הטלפון לא תקין. נא להזין מספר ישראלי.');
|
|
return;
|
|
}
|
|
|
|
const formData = new FormData(contactForm);
|
|
const data = Object.fromEntries(formData);
|
|
|
|
// Simulate form submission
|
|
console.log('Contact message:', data);
|
|
|
|
showToast('ההודעה נשלחה! נחזור אליך בהקדם.');
|
|
contactForm.reset();
|
|
});
|
|
}
|
|
|
|
// Smooth scroll for anchor links
|
|
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
|
|
anchor.addEventListener('click', function(e) {
|
|
const targetId = this.getAttribute('href');
|
|
if (targetId === '#') return;
|
|
|
|
const target = document.querySelector(targetId);
|
|
if (target) {
|
|
e.preventDefault();
|
|
const nav = document.querySelector('.main-nav');
|
|
const navHeight = nav ? nav.offsetHeight : 0;
|
|
const targetPosition = target.getBoundingClientRect().top + window.pageYOffset - navHeight;
|
|
|
|
window.scrollTo({
|
|
top: targetPosition,
|
|
behavior: prefersReducedMotion ? 'auto' : 'smooth'
|
|
});
|
|
}
|
|
});
|
|
});
|
|
|
|
// Nav shadow on scroll
|
|
const nav = document.querySelector('.main-nav');
|
|
|
|
if (nav) {
|
|
window.addEventListener('scroll', () => {
|
|
if (window.pageYOffset > 100) {
|
|
nav.style.boxShadow = 'var(--shadow-sm)';
|
|
} else {
|
|
nav.style.boxShadow = 'none';
|
|
}
|
|
}, { passive: true });
|
|
}
|
|
|
|
})();
|