// Add smooth scrolling for anchor links document.querySelectorAll('a[href^="#"]').forEach(anchor => { anchor.addEventListener('click', function (e) { e.preventDefault(); document.querySelector(this.getAttribute('href')).scrollIntoView({ behavior: 'smooth' }); }); }); // Navbar scroll behavior window.addEventListener('scroll', function() { const navbar = document.querySelector('.navbar'); if (window.scrollY > 50) { navbar.classList.add('navbar-scrolled'); } else { navbar.classList.remove('navbar-scrolled'); } }); // Add animation class to elements when they come into view const animateOnScroll = function() { const elements = document.querySelectorAll('.feature-card, .card'); elements.forEach(element => { const elementTop = element.getBoundingClientRect().top; const elementBottom = element.getBoundingClientRect().bottom; if (elementTop < window.innerHeight && elementBottom > 0) { element.classList.add('animate-fade-in'); } }); }; // Run animation check on scroll window.addEventListener('scroll', animateOnScroll); // Run animation check on page load window.addEventListener('load', animateOnScroll); // Form validation functions function validateName(name) { return name.trim().length >= 2; } function validateEmail(email) { const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; return emailRegex.test(email); } function validatePhone(phone) { const phoneRegex = /^[0-9]{10}$/; return phoneRegex.test(phone.replace(/[^0-9]/g, '')); } function validateCompany(company) { return company.trim().length >= 2; } function validateSubject(subject) { return subject.trim().length >= 5; } function validateMessage(message) { return message.trim().length >= 10; } function showError(inputElement, errorMessage) { inputElement.classList.add('is-invalid'); const errorDiv = document.getElementById(inputElement.id + 'Error'); if (errorDiv) { errorDiv.textContent = errorMessage; } } function clearError(inputElement) { inputElement.classList.remove('is-invalid'); const errorDiv = document.getElementById(inputElement.id + 'Error'); if (errorDiv) { errorDiv.textContent = ''; } } // Contact form submission document.addEventListener('DOMContentLoaded', function() { const contactForm = document.getElementById('contactForm'); if (contactForm) { // Add input event listeners for real-time validation const inputs = contactForm.querySelectorAll('input, textarea'); inputs.forEach(input => { input.addEventListener('input', function() { clearError(this); }); }); contactForm.addEventListener('submit', async function(e) { e.preventDefault(); let isValid = true; // Get form elements const nameInput = document.getElementById('name'); const emailInput = document.getElementById('email'); const phoneInput = document.getElementById('phone'); const companyInput = document.getElementById('company'); const subjectInput = document.getElementById('subject'); const messageInput = document.getElementById('message'); // Validate each field if (!validateName(nameInput.value)) { showError(nameInput, 'Please enter a valid name (at least 2 characters)'); isValid = false; } if (!validateEmail(emailInput.value)) { showError(emailInput, 'Please enter a valid email address'); isValid = false; } if (!validatePhone(phoneInput.value)) { showError(phoneInput, 'Please enter a valid 10-digit phone number'); isValid = false; } if (!validateCompany(companyInput.value)) { showError(companyInput, 'Please enter a valid company name (at least 2 characters)'); isValid = false; } if (!validateSubject(subjectInput.value)) { showError(subjectInput, 'Please enter a subject (at least 5 characters)'); isValid = false; } if (!validateMessage(messageInput.value)) { showError(messageInput, 'Please enter a message (at least 10 characters)'); isValid = false; } if (!isValid) { return; } // Get form data const formData = { name: nameInput.value, email: emailInput.value, mobileNumber: phoneInput.value, companyName: companyInput.value, subject: subjectInput.value, message: messageInput.value }; try { // Disable submit button and show loading state const submitButton = contactForm.querySelector('button[type="submit"]'); const originalButtonText = submitButton.textContent; submitButton.disabled = true; submitButton.textContent = 'Sending...'; // Make API call const response = await fetch('/api/v1/tenancy/enquiry', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(formData) }); if (!response.ok) { throw new Error('Failed to send message'); } // Show success message alert('Message sent successfully!'); contactForm.reset(); // Clear any remaining error states inputs.forEach(input => clearError(input)); } catch (error) { // Show error message alert('Failed to send message. Please try again later.'); console.error('Error:', error); } finally { // Re-enable submit button and restore original text const submitButton = contactForm.querySelector('button[type="submit"]'); submitButton.disabled = false; submitButton.textContent = originalButtonText; } }); } });