PageSourceSearch

https://www.gironde-habitat.fr/wp-content/themes/gironde-habitat/assets/js/form-guard.js?ver=1.0.0

js gironde-habitat.fr collected 2026-09-24 10:27:33 UTC 2,938 bytes, 116 lines download raw bytes

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.