PageSourceSearch

https://www.reha-geilenkirchen.de/wp-content/plugins/mm-antispam/mm-antispam.js?ver=1785762334

js reha-geilenkirchen.de collected 2026-10-04 09:24:13 UTC 6,288 bytes, 154 lines download raw bytes

1/*
2	MM Antispam
3	(C) Minkenberg GmbH, Christoph Peters
4	https://www.minkenberg.de
5	Version: 1.35
6*/
7
8let mmAntispamUserActive = false;
9
10// Setzt in allen (oder einem gegebenen) Formularen das Aktivitaetsfeld auf "1".
11function mmAntispamSetActive(root) {
12    const scope = (root && typeof root.querySelectorAll === 'function') ? root : document;
13    scope.querySelectorAll('input[name=mm_asp_act]').forEach(function (input) {
14        if (input.value !== '1') input.value = '1';
15    });
16}
17
18// Globaler Aktivitaets-Handler (Window-Listener). Schneller Pfad ueber Merker,
19// setzt beim ersten echten Event alle vorhandenen Felder auf "1".
20function mmAntispamMarkActive() {
21    if (mmAntispamUserActive) return;
22    mmAntispamUserActive = true;
23    mmAntispamSetActive();
24}
25
26function mmAntispamWatchActivity() {
27    const events = ['mousemove', 'keydown', 'touchstart', 'scroll', 'pointerdown'];
28    events.forEach(function (ev) {
29        window.addEventListener(ev, mmAntispamMarkActive, { passive: true, capture: true });
30    });
31    // Commit-Momente (Capture-Phase => laeuft VOR dem Submit-Handler des Form-Builders):
32    // pointerdown feuert vor click/submit, submit als zweite Garantie. Beide setzen das
33    // Aktivitaetsfeld UNBEDINGT (ohne One-Shot-Gate). So ist ein vom Form-Builder frisch
34    // gerendertes/zurueckgesetztes Feld garantiert "1", wenn (z.B. Elementor per AJAX)
35    // serialisiert wird. Direkt-POST-Bots loesen diese Events in unserem JS nie aus.
36    document.addEventListener('pointerdown', function (e) {
37        mmAntispamUserActive = true;
38        const form = e.target && e.target.closest ? e.target.closest('form') : null;
39        if (form) mmAntispamSetActive(form); else mmAntispamSetActive();
40    }, { passive: true, capture: true });
41    document.addEventListener('submit', function (e) {
42        mmAntispamUserActive = true;
43        mmAntispamSetActive(e.target);
44    }, true);
45}
46
47// Bindet form-eigene Aktivitaets-Listener. Robust gegen Re-Render/Reset des
48// Aktivitaetsfeldes durch den Form-Builder: die Interaktion mit GENAU diesem Form setzt
49// sein Feld direkt - unabhaengig vom globalen Merker und davon, ob Window-Events durchkommen.
50function mmAntispamBindFormActivity(form) {
51    if (!form.dataset.mmAspActBound) {
52        form.dataset.mmAspActBound = '1';
53        const formEvents = ['pointerdown', 'keydown', 'input', 'focusin'];
54        formEvents.forEach(function (ev) {
55            form.addEventListener(ev, function () {
56                mmAntispamUserActive = true;
57                mmAntispamSetActive(form);
58            }, { passive: true });
59        });
60    }
61    // Falls global bereits Aktivitaet stattfand, ein evtl. frisch gerendertes/
62    // zurueckgesetztes Feld dieses Forms sofort nachziehen.
63    if (mmAntispamUserActive) mmAntispamSetActive(form);
64}
65
66function mmAntispamhandleForms(selector) {
67    const forms = document.querySelectorAll(selector);
68    if (forms.length === 0) return;
69    const fieldValue = btoa(location.host);
70    forms.forEach(form => {
71        if (!form.querySelector('input[name=mm_asp_jsdyn]')) {
72            const input = document.createElement('input');
73            input.type = 'hidden';
74            input.name = 'mm_asp_jsdyn';
75            input.value = fieldValue;
76            form.appendChild(input);
77        }
78        form.setAttribute('autocomplete', 'mm_asp_lastname');
79        const crtsInput = form.querySelector('input[name=mm_asp_crts]');
80        if (crtsInput && !crtsInput.dataset.mmAspFetched) {
81            crtsInput.dataset.mmAspFetched = '1';
82            fetch(ajax_postajax.ajaxurl + '?action=mm_antispam_getcrts')
83                .then(response => response.text())
84                .then(data => {
85                    crtsInput.value = data;
86                })
87                .catch(error => console.error('Error fetching crts:', error));
88        }
89        // Falls (z.B. fuer Bricks/Divi) das Aktivitaetsfeld noch nicht im Form ist, einfuegen
90        if (!form.querySelector('input[name=mm_asp_act]')) {
91            const actInput = document.createElement('input');
92            actInput.type = 'hidden';
93            actInput.name = 'mm_asp_act';
94            actInput.value = mmAntispamUserActive ? '1' : '0';
95            form.appendChild(actInput);
96        }
97        // Aktivitaets-Tracking fuer dieses Form scharf schalten (bzw. Feld nachziehen)
98        mmAntispamBindFormActivity(form);
99    });
100}
101
102function mmAntispamInjectFormFields(selector) {
103    const forms = document.querySelectorAll(selector);
104    if (forms.length === 0) return;
105    if (ajax_fields && ajax_fields.fields) {
106        const fieldsHtml = atob(ajax_fields.fields);
107        forms.forEach(form => {
108            if (form.dataset.mmAspInjected) return;
109            form.dataset.mmAspInjected = '1';
110            form.insertAdjacentHTML("beforeend", fieldsHtml);
111        });
112    }
113}
114
115// Backwards-Compat: alter Funktionsname wird intern weiterverwendet
116function mmAntispamInjectBrixForm(selector) {
117    mmAntispamInjectFormFields(selector);
118}
119
120function mmAntispamProcessAll() {
121    mmAntispamhandleForms('form.wpcf7-form');
122    mmAntispamhandleForms('form.elementor-form');
123    mmAntispamhandleForms('form.avia_ajax_form');
124    mmAntispamhandleForms('form.frm-fluent-form');
125
126    // Bricks: Antispam-Felder per JS einfuegen, dann handlen
127    mmAntispamInjectFormFields('form.brxe-form');
128    mmAntispamhandleForms('form.brxe-form');
129
130    // Divi (Divi 4 klassisch + Divi 5 React): Antispam-Felder per JS einfuegen, dann handlen
131    mmAntispamInjectFormFields('form.et_pb_contact_form');
132    mmAntispamhandleForms('form.et_pb_contact_form');
133}
134
135function mmAntispamObserveDOM() {
136    if (typeof MutationObserver !== 'function') return;
137    let scheduled = false;
138    const observer = new MutationObserver(function () {
139        if (scheduled) return;
140        scheduled = true;
141        // Per Microtask-Wartezeit Mehrfach-Auslösungen während eines Renders bündeln
142        setTimeout(function () {
143            scheduled = false;
144            mmAntispamProcessAll();
145        }, 100);
146    });
147    observer.observe(document.body, { childList: true, subtree: true });
148}
149
150document.addEventListener("DOMContentLoaded", function () {
151    mmAntispamWatchActivity();
152    mmAntispamProcessAll();
153    mmAntispamObserveDOM();
154});

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.