document.addEventListener('DOMContentLoaded', () => { const burgerMenu = document.getElementById('burger-menu'); const navMenu = document.getElementById('nav-menu'); const navLinks = document.querySelectorAll('.nav-link'); burgerMenu.addEventListener('click', () => { navMenu.classList.toggle('active'); const isExpanded = burgerMenu.getAttribute('aria-expanded') === 'true'; burgerMenu.setAttribute('aria-expanded', !isExpanded); }); navLinks.forEach(link => { link.addEventListener('click', () => { navMenu.classList.remove('active'); burgerMenu.setAttribute('aria-expanded', 'false'); }); }); const modal = document.getElementById('game-modal'); const openModalButtons = document.querySelectorAll('[data-action="open-modal"]'); const closeModalElements = document.querySelectorAll('[data-action="close-modal"]'); const gameIframe = document.getElementById('game-iframe'); const focusableElementsString = 'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'; let firstFocusableElement, lastFocusableElement; const openModal = () => { if (gameIframe.getAttribute('src') === '') { gameIframe.src = '/game'; } modal.hidden = false; document.body.classList.add('no-scroll'); const focusableElements = modal.querySelectorAll(focusableElementsString); firstFocusableElement = focusableElements[0]; lastFocusableElement = focusableElements[focusableElements.length - 1]; firstFocusableElement.focus(); modal.addEventListener('keydown', trapFocus); }; const closeModal = () => { modal.hidden = true; document.body.classList.remove('no-scroll'); modal.removeEventListener('keydown', trapFocus); }; const trapFocus = (e) => { const isTabPressed = e.key === 'Tab'; if (!isTabPressed) { return; } if (e.shiftKey) { if (document.activeElement === firstFocusableElement) { lastFocusableElement.focus(); e.preventDefault(); } } else { if (document.activeElement === lastFocusableElement) { firstFocusableElement.focus(); e.preventDefault(); } } }; openModalButtons.forEach(button => button.addEventListener('click', openModal)); closeModalElements.forEach(el => el.addEventListener('click', closeModal)); document.addEventListener('keydown', (e) => { if (e.key === 'Escape' && !modal.hidden) { closeModal(); } }); const contactForm = document.getElementById('contact-form'); const formFeedback = document.getElementById('form-feedback'); contactForm.addEventListener('submit', (e) => { e.preventDefault(); let isValid = true; const inputs = contactForm.querySelectorAll('input[required], textarea[required]'); inputs.forEach(input => { input.classList.remove('invalid'); if (!input.value.trim() || (input.type === 'email' && !validateEmail(input.value)) || (input.type === 'checkbox' && !input.checked)) { isValid = false; input.classList.add('invalid'); } }); if (isValid) { formFeedback.textContent = 'Sender melding...'; formFeedback.className = 'success'; formFeedback.style.display = 'block'; setTimeout(() => { formFeedback.textContent = 'Takk for din henvendelse! Vi kontakter deg snart.'; contactForm.reset(); }, 1500); } else { formFeedback.textContent = 'Vennligst fyll ut alle obligatoriske felt korrekt.'; formFeedback.className = 'error'; formFeedback.style.display = 'block'; } }); function validateEmail(email) { const re = /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; return re.test(String(email).toLowerCase()); } const animatedElements = document.querySelectorAll('.fade-in'); const observer = new IntersectionObserver((entries) => { entries.forEach(entry => { if (entry.isIntersecting) { entry.target.classList.add('is-visible'); observer.unobserve(entry.target); } }); }, { threshold: 0.1 }); animatedElements.forEach(el => { observer.observe(el); }); const faqItems = document.querySelectorAll('.faq-item'); faqItems.forEach(item => { const question = item.querySelector('.faq-question'); const answer = item.querySelector('.faq-answer'); question.addEventListener('click', () => { const isExpanded = question.getAttribute('aria-expanded') === 'true'; faqItems.forEach(otherItem => { otherItem.querySelector('.faq-question').setAttribute('aria-expanded', 'false'); otherItem.querySelector('.faq-answer').style.maxHeight = null; }); if (!isExpanded) { question.setAttribute('aria-expanded', 'true'); answer.style.maxHeight = answer.scrollHeight + 'px'; } }); }); });