Spaces:
Sleeping
Sleeping
| // Mobile Navigation Toggle | |
| document.addEventListener('DOMContentLoaded', function() { | |
| const hamburger = document.querySelector('.hamburger'); | |
| const navMenu = document.querySelector('.nav-menu'); | |
| if (hamburger && navMenu) { | |
| hamburger.addEventListener('click', function() { | |
| navMenu.classList.toggle('active'); | |
| hamburger.classList.toggle('active'); | |
| }); | |
| // Close menu when clicking on a link | |
| const navLinks = document.querySelectorAll('.nav-menu a'); | |
| navLinks.forEach(link => { | |
| link.addEventListener('click', () => { | |
| navMenu.classList.remove('active'); | |
| hamburger.classList.remove('active'); | |
| }); | |
| }); | |
| // Close menu when clicking outside | |
| document.addEventListener('click', function(event) { | |
| if (!hamburger.contains(event.target) && !navMenu.contains(event.target)) { | |
| navMenu.classList.remove('active'); | |
| hamburger.classList.remove('active'); | |
| } | |
| }); | |
| } | |
| // Form Validation and Submission | |
| const signupForm = document.getElementById('signupForm'); | |
| if (signupForm) { | |
| signupForm.addEventListener('submit', function(e) { | |
| e.preventDefault(); | |
| // Clear previous errors | |
| clearErrors(); | |
| // Validate form | |
| let isValid = validateForm(); | |
| if (isValid) { | |
| // Show success message | |
| showSuccessMessage(); | |
| } | |
| }); | |
| // Real-time validation | |
| const inputs = signupForm.querySelectorAll('input'); | |
| inputs.forEach(input => { | |
| input.addEventListener('blur', function() { | |
| validateField(input); | |
| }); | |
| input.addEventListener('input', function() { | |
| // Clear error when user starts typing | |
| if (input.classList.contains('error')) { | |
| clearFieldError(input); | |
| } | |
| }); | |
| }); | |
| } | |
| }); | |
| // Validation Functions | |
| function validateForm() { | |
| const firstName = document.getElementById('firstName'); | |
| const lastName = document.getElementById('lastName'); | |
| const email = document.getElementById('email'); | |
| const phone = document.getElementById('phone'); | |
| const password = document.getElementById('password'); | |
| const confirmPassword = document.getElementById('confirmPassword'); | |
| const terms = document.getElementById('terms'); | |
| let isValid = true; | |
| // Validate First Name | |
| if (!validateField(firstName)) { | |
| isValid = false; | |
| } | |
| // Validate Last Name | |
| if (!validateField(lastName)) { | |
| isValid = false; | |
| } | |
| // Validate Email | |
| if (!validateEmail(email)) { | |
| isValid = false; | |
| } | |
| // Validate Phone (optional but if provided, should be valid) | |
| if (phone.value.trim() && !validatePhone(phone)) { | |
| isValid = false; | |
| } | |
| // Validate Password | |
| if (!validatePassword(password)) { | |
| isValid = false; | |
| } | |
| // Validate Confirm Password | |
| if (!validateConfirmPassword(password, confirmPassword)) { | |
| isValid = false; | |
| } | |
| // Validate Terms | |
| if (!terms.checked) { | |
| showError('terms', 'You must agree to the terms and conditions'); | |
| isValid = false; | |
| } | |
| return isValid; | |
| } | |
| function validateField(field) { | |
| const value = field.value.trim(); | |
| // Check if required field is empty | |
| if (field.hasAttribute('required') && !value) { | |
| showError(field.id, `${getFieldLabel(field.id)} is required`); | |
| return false; | |
| } | |
| // Check minimum length for password | |
| if (field.type === 'password' && field.id === 'password' && value.length < 8) { | |
| showError(field.id, 'Password must be at least 8 characters long'); | |
| return false; | |
| } | |
| clearFieldError(field); | |
| return true; | |
| } | |
| function validateEmail(emailField) { | |
| const email = emailField.value.trim(); | |
| const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; | |
| if (!email) { | |
| showError(emailField.id, 'Email is required'); | |
| return false; | |
| } | |
| if (!emailRegex.test(email)) { | |
| showError(emailField.id, 'Please enter a valid email address'); | |
| return false; | |
| } | |
| clearFieldError(emailField); | |
| return true; | |
| } | |
| function validatePhone(phoneField) { | |
| const phone = phoneField.value.trim(); | |
| const phoneRegex = /^[\d\s\-\(\)]+$/; | |
| if (phone && !phoneRegex.test(phone)) { | |
| showError(phoneField.id, 'Please enter a valid phone number'); | |
| return false; | |
| } | |
| clearFieldError(phoneField); | |
| return true; | |
| } | |
| function validatePassword(passwordField) { | |
| const password = passwordField.value; | |
| if (!password) { | |
| showError(passwordField.id, 'Password is required'); | |
| return false; | |
| } | |
| if (password.length < 8) { | |
| showError(passwordField.id, 'Password must be at least 8 characters long'); | |
| return false; | |
| } | |
| clearFieldError(passwordField); | |
| return true; | |
| } | |
| function validateConfirmPassword(passwordField, confirmPasswordField) { | |
| const password = passwordField.value; | |
| const confirmPassword = confirmPasswordField.value; | |
| if (!confirmPassword) { | |
| showError(confirmPasswordField.id, 'Please confirm your password'); | |
| return false; | |
| } | |
| if (password !== confirmPassword) { | |
| showError(confirmPasswordField.id, 'Passwords do not match'); | |
| return false; | |
| } | |
| clearFieldError(confirmPasswordField); | |
| return true; | |
| } | |
| function showError(fieldId, message) { | |
| const errorElement = document.getElementById(fieldId + 'Error'); | |
| const field = document.getElementById(fieldId); | |
| if (errorElement) { | |
| errorElement.textContent = message; | |
| } | |
| if (field) { | |
| field.classList.add('error'); | |
| field.style.borderColor = '#FF6B6B'; | |
| } | |
| } | |
| function clearFieldError(field) { | |
| const errorElement = document.getElementById(field.id + 'Error'); | |
| if (errorElement) { | |
| errorElement.textContent = ''; | |
| } | |
| field.classList.remove('error'); | |
| field.style.borderColor = ''; | |
| } | |
| function clearErrors() { | |
| const errorMessages = document.querySelectorAll('.error-message'); | |
| const errorFields = document.querySelectorAll('.error'); | |
| errorMessages.forEach(error => { | |
| error.textContent = ''; | |
| }); | |
| errorFields.forEach(field => { | |
| field.classList.remove('error'); | |
| field.style.borderColor = ''; | |
| }); | |
| } | |
| function getFieldLabel(fieldId) { | |
| const labels = { | |
| 'firstName': 'First Name', | |
| 'lastName': 'Last Name', | |
| 'email': 'Email', | |
| 'phone': 'Phone Number', | |
| 'password': 'Password', | |
| 'confirmPassword': 'Confirm Password', | |
| 'terms': 'Terms' | |
| }; | |
| return labels[fieldId] || fieldId; | |
| } | |
| function showSuccessMessage() { | |
| const form = document.getElementById('signupForm'); | |
| const successMessage = document.getElementById('successMessage'); | |
| if (form && successMessage) { | |
| form.style.display = 'none'; | |
| successMessage.style.display = 'block'; | |
| // Scroll to top of success message | |
| successMessage.scrollIntoView({ behavior: 'smooth', block: 'start' }); | |
| } | |
| } | |
| // Smooth scrolling 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' | |
| }); | |
| } | |
| }); | |
| }); | |
| // Add animation on scroll | |
| const observerOptions = { | |
| threshold: 0.1, | |
| rootMargin: '0px 0px -50px 0px' | |
| }; | |
| const observer = new IntersectionObserver(function(entries) { | |
| entries.forEach(entry => { | |
| if (entry.isIntersecting) { | |
| entry.target.style.opacity = '1'; | |
| entry.target.style.transform = 'translateY(0)'; | |
| } | |
| }); | |
| }, observerOptions); | |
| // Observe feature cards and other elements | |
| document.addEventListener('DOMContentLoaded', function() { | |
| const animatedElements = document.querySelectorAll('.feature-card, .offer-item, .about-section'); | |
| animatedElements.forEach(element => { | |
| element.style.opacity = '0'; | |
| element.style.transform = 'translateY(20px)'; | |
| element.style.transition = 'opacity 0.6s ease, transform 0.6s ease'; | |
| observer.observe(element); | |
| }); | |
| }); | |