/* ========================================================================== Allo Véronica — script.js Menu mobile + envoi des formulaires (devis / contact) en AJAX vers processform.php, avec repli automatique sur un lien mailto en cas d'échec (hébergement sans PHP actif, erreur réseau, etc.) ========================================================================== */ document.addEventListener('DOMContentLoaded', function () { /* ---------- Menu mobile ---------- */ var toggle = document.getElementById('navToggle'); var nav = document.getElementById('mainNav'); if (toggle && nav) { toggle.addEventListener('click', function () { nav.classList.toggle('open'); }); nav.querySelectorAll('a').forEach(function (link) { link.addEventListener('click', function () { nav.classList.remove('open'); }); }); } /* ---------- Formulaires (devis + contact) ---------- */ var forms = document.querySelectorAll('form[data-ajax-form]'); forms.forEach(function (form) { var msgBox = form.querySelector('.form-msg'); var submitBtn = form.querySelector('button[type="submit"]'); var destEmail = 'contact@alloveronica.fr'; form.addEventListener('submit', function (e) { e.preventDefault(); // Anti-spam : champ piège "website" doit rester vide var honeypot = form.querySelector('input[name="website"]'); if (honeypot && honeypot.value.trim() !== '') { return; // requête silencieusement ignorée (probable robot) } // Validation native du navigateur if (!form.checkValidity()) { form.reportValidity(); return; } var formData = new FormData(form); var originalBtnText = submitBtn ? submitBtn.innerHTML : ''; if (submitBtn) { submitBtn.disabled = true; submitBtn.innerHTML = ' Envoi en cours...'; } fetch('processform.php', { method: 'POST', body: formData, headers: { 'X-Requested-With': 'XMLHttpRequest' } }) .then(function (response) { if (!response.ok) { throw new Error('Réponse serveur invalide'); } return response.json(); }) .then(function (data) { if (data && data.success) { showMessage(true, "Merci ! Votre demande a bien été envoyée. Nous vous recontactons rapidement."); form.reset(); } else { throw new Error((data && data.message) || 'Échec de l\'envoi'); } }) .catch(function () { // Repli : ouverture du client mail avec les infos pré-remplies sendViaMailto(); showMessage(true, "Votre client mail va s'ouvrir pour finaliser l'envoi de votre demande à " + destEmail + "."); }) .finally(function () { if (submitBtn) { submitBtn.disabled = false; submitBtn.innerHTML = originalBtnText; } }); function sendViaMailto() { var subject = form.dataset.subject || 'Demande depuis le site Allo Véronica'; var lines = []; formData.forEach(function (value, key) { if (key === 'website') return; // ne pas inclure le champ piège if (value) lines.push(key + ' : ' + value); }); var body = encodeURIComponent(lines.join('\n')); window.location.href = 'mailto:' + destEmail + '?subject=' + encodeURIComponent(subject) + '&body=' + body; } function showMessage(success, text) { if (!msgBox) return; msgBox.textContent = text; msgBox.classList.remove('success', 'error'); msgBox.classList.add(success ? 'success' : 'error', 'show'); msgBox.scrollIntoView({ behavior: 'smooth', block: 'center' }); } }); }); });