1(function () { 2 'use strict'; 3 4 function config() { 5 return window.ghFormGuard || {}; 6 } 7 8 function getMessage() { 9 return config().message || ''; 10 } 11 12 // Détecte si l'échec de validation Contact Form 7 provient de la liste noire 13 // de mots-clés. On s'appuie en priorité sur l'indicateur explicite renvoyé par 14 // le serveur (gh_form_blocked), avec repli sur la comparaison du message. 15 function getBlacklistMessage(detail) { 16 if (!detail) { 17 return ''; 18 } 19 20 var api = detail.apiResponse || detail; 21 22 if (!api) { 23 return ''; 24 } 25 26 if (api.gh_form_blocked) { 27 return api.gh_form_message || getMessage(); 28 } 29 30 var message = getMessage(); 31 32 if (message && Array.isArray(api.invalid_fields)) { 33 var matched = api.invalid_fields.some(function (field) { 34 return field && field.message === message; 35 }); 36 37 if (matched) { 38 return message; 39 } 40 } 41 42 return ''; 43 } 44 45 function buildModal(message) { 46 if (document.querySelector('.gh-form-guard-overlay')) { 47 return; 48 } 49 50 var cfg = config(); 51 52 var overlay = document.createElement('div'); 53 overlay.className = 'gh-form-guard-overlay'; 54 overlay.setAttribute('role', 'dialog'); 55 overlay.setAttribute('aria-modal', 'true'); 56 57 var box = document.createElement('div'); 58 box.className = 'gh-form-guard-modal'; 59 60 var title = document.createElement('h2'); 61 title.className = 'gh-form-guard-title'; 62 title.textContent = cfg.title || 'Attention'; 63 64 var text = document.createElement('p'); 65 text.className = 'gh-form-guard-text'; 66 text.textContent = message; 67 68 var close = document.createElement('button'); 69 close.type = 'button'; 70 close.className = 'gh-form-guard-close'; 71 close.textContent = cfg.close || 'Jâai compris'; 72 73 function remove() { 74 if (overlay.parentNode) { 75 overlay.parentNode.removeChild(overlay); 76 } 77 document.removeEventListener('keydown', onKey); 78 } 79 80 function onKey(event) { 81 if (event.key === 'Escape' || event.keyCode === 27) { 82 remove(); 83 } 84 } 85 86 close.addEventListener('click', remove); 87 overlay.addEventListener('click', function (event) { 88 if (event.target === overlay) { 89 remove(); 90 } 91 }); 92 document.addEventListener('keydown', onKey); 93 94 box.appendChild(title); 95 box.appendChild(text); 96 box.appendChild(close); 97 overlay.appendChild(box); 98 document.body.appendChild(overlay); 99 close.focus(); 100 } 101 102 // Canal Contact Form 7 : le serveur invalide le formulaire et signale le blocage. 103 document.addEventListener('wpcf7invalid', function (event) { 104 var message = getBlacklistMessage(event.detail); 105 if (message) { 106 buildModal(message); 107 } 108 }, false); 109 110 // Canal formulaire de contact custom (form.php) : l'événement est déclenché 111 // par le script d'envoi lorsque le serveur répond un blocage (HTTP 422). 112 document.addEventListener('gh-form-guard-block', function (event) { 113 var message = (event.detail && event.detail.message) || getMessage(); 114 buildModal(message); 115 }, false); 116})();
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.