Plugin Directory

Changeset 3465729


Ignore:
Timestamp:
02/20/2026 11:13:29 AM (5 weeks ago)
Author:
forge12
Message:

2.3.5

  • Fix [Fluent Forms]: Fixed JavaScript protection failing for Conversational Forms ([fluentform type="conversational"]). Conversational Forms render as a Vue.js app inside a <div> instead of a <form> element, so the regular render_item_submit_button hook and the JS form discovery (querySelectorAll("form")) never fired. Timing fields (php_start_time, js_start_time, js_end_time) are now injected via jQuery.ajaxPrefilter directly into the inner data POST parameter where the PHP backend expects them. Hooks into both wp_footer (embedded forms) and fluentform/conversational_frame_footer (standalone pages).
Location:
captcha-for-contact-form-7/trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • captcha-for-contact-form-7/trunk/Readme.txt

    r3465567 r3465729  
    66Tested up to: 6.9.1
    77Requires PHP: 7.4
    8 Stable tag: 2.3.4
     8Stable tag: 2.3.5
    99License: GPLv3
    1010License URI: http://www.gnu.org/licenses/gpl-3.0.html
     
    175175
    176176== Changelog ==
     177= 2.3.5 =
     178- Fix [Fluent Forms]: Fixed JavaScript protection failing for Conversational Forms (`[fluentform type="conversational"]`). Conversational Forms render as a Vue.js app inside a `<div>` instead of a `<form>` element, so the regular `render_item_submit_button` hook and the JS form discovery (`querySelectorAll("form")`) never fired. Timing fields (`php_start_time`, `js_start_time`, `js_end_time`) are now injected via `jQuery.ajaxPrefilter` directly into the inner `data` POST parameter where the PHP backend expects them. Hooks into both `wp_footer` (embedded forms) and `fluentform/conversational_frame_footer` (standalone pages).
     179
    177180= 2.3.4 =
    178 - Fix [Templates]: Reload button inline styles (background color, padding, border radius, border) were stripped by `wp_kses()` because the `style` attribute was missing from the `<a>` tag whitelist. Per-form and per-integration overrides for reload button appearance now work correctly.
     181- Fix [Templates]: Reload button inline styles were stripped by `wp_kses()` CSS property filtering (`safecss_filter_attr`), causing `display:inline-flex`, `align-items`, `box-sizing` etc. to be removed. Reload button HTML is now output directly (all values are escaped at construction via `esc_attr`/`esc_url`), ensuring per-form and per-integration style overrides work correctly.
     182- Fix [CSS]: Removed hardcoded `width:32px; height:32px; display:flex; background-color` from template-1 `.c-reload a` CSS rule that overrode per-form settings. All visual properties are now controlled exclusively via inline styles from `get_reload_button()`.
    179183- Fix [CSS]: Removed `!important` declarations on reload button icon dimensions in template-1 CSS that prevented per-form icon size overrides from taking effect.
    180 - Fix [CSS]: Removed redundant global inline CSS (`wp_add_inline_style`) for reload button styling that conflicted with the hierarchical settings resolution (form > module > global). Styling is now handled exclusively via inline styles from `get_reload_button()`.
     184- Fix [CSS]: Removed redundant global inline CSS (`wp_add_inline_style`) for reload button styling that conflicted with the hierarchical settings resolution (form > module > global).
    181185- Fix [CSS]: Reload button icon is now vertically centered using flexbox (`display:inline-flex; align-items:center`) instead of `margin-top:5px`.
     186- Improvement [CSS]: All reload button inline styles now use `!important` to prevent theme and plugin CSS from overriding configured values (background-color, padding, border-radius, display, icon dimensions, margin, max-width).
    182187- Fix [Core]: Replaced deprecated `CF7Captcha::getInstance()` calls in UI_Extended with `CF7Captcha::get_instance()`.
    183188
  • captcha-for-contact-form-7/trunk/compatibility/fluentform/ControllerFluentform.class.php

    r3460786 r3465729  
    2121        ['type' => 'action', 'hook' => 'fluentform/render_item_submit_button', 'method' => 'wp_add_spam_protection', 'priority' => 5, 'args' => 2],
    2222        ['type' => 'filter', 'hook' => 'fluentform/validation_errors', 'method' => 'wp_is_spam', 'priority' => 10, 'args' => 4],
     23        ['type' => 'action', 'hook' => 'wp_footer', 'method' => 'wp_conversational_form_js_protection'],
     24        ['type' => 'action', 'hook' => 'fluentform/conversational_frame_footer', 'method' => 'wp_conversational_form_js_protection'],
    2325    ];
    2426
     
    8486        return $errors;
    8587    }
     88
     89    /**
     90     * Outputs a JS snippet for Fluent Forms Conversational Forms.
     91     *
     92     * Conversational Forms render as a Vue.js app inside a <div>, not a <form>.
     93     * The regular render_item_submit_button hook and the JS form discovery
     94     * (querySelectorAll("form")) do not fire. This method injects the timing
     95     * fields via jQuery.ajaxPrefilter directly into the inner "data" POST
     96     * parameter where the PHP backend expects them.
     97     */
     98    public function wp_conversational_form_js_protection(): void
     99    {
     100        $php_start_time = microtime( true );
     101        ?>
     102        <script>
     103        (function () {
     104            if (typeof jQuery === 'undefined') { return; }
     105            var phpStart = <?php echo wp_json_encode( $php_start_time ); ?>;
     106            jQuery.ajaxPrefilter(function (options, originalOptions) {
     107                if (typeof options.data !== 'string') { return; }
     108                var params = new URLSearchParams(options.data);
     109                var innerData = params.get('data');
     110                if (innerData === null) { return; }
     111                var inner = new URLSearchParams(innerData);
     112                if (inner.has('php_start_time')) { return; }
     113                var now = Date.now() / 1000;
     114                inner.set('php_start_time', phpStart);
     115                inner.set('js_start_time', phpStart + 0.001);
     116                inner.set('js_end_time', now);
     117                params.set('data', inner.toString());
     118                options.data = params.toString();
     119            });
     120        })();
     121        </script>
     122        <?php
     123    }
    86124}
  • captcha-for-contact-form-7/trunk/core/assets/f12-cf7-captcha-cf7.js

    r3460786 r3465729  
    1 !function(){"use strict";const e=function(){const e=new URLSearchParams(window.location.search).has("silentshield-debug");function r(e){return["[SilentShield]"].concat(Array.from(e))}return{log:(...t)=>e&&console.log(...r(t)),debug:(...t)=>e&&console.debug(...r(t)),warn:(...t)=>e&&console.warn(...r(t)),error:(...t)=>e&&console.error(...r(t))}}();class r{constructor(e,r={}){this.container=e,this.options=Object.assign({className:"f12-captcha-overlay",autoPosition:!0,debug:!1},r)}show(){const{className:r,autoPosition:t}=this.options,o=window.getComputedStyle(this.container);if(t&&"static"===o.position&&(this.container.style.position="relative"),!this.container.querySelector(`.${r}`)){const t=document.createElement("div");t.className=r,this.container.appendChild(t),e.log("Overlay hinzugefügt",this.container)}}hide(){const{className:r}=this.options,t=this.container.querySelector(`.${r}`);t&&t.remove(),e.log("Overlay entfernt",this.container)}}function t(r){if(e.debug("[ensureFormId] aufgerufen",r),window.jQuery&&r instanceof window.jQuery&&(e.debug("[ensureFormId] jQuery-Objekt erkannt → form[0] wird verwendet"),r=r[0]),!(r instanceof HTMLFormElement))return e.error("[ensureFormId] Ungültiges Formular-Element übergeben:",r),null;let t=r.id;return t&&""!==t.trim()||(t="f12-form-"+Math.random().toString(36).substring(2,10),r.id=t,e.debug("[ensureFormId] Formular ohne ID erkannt → generische ID vergeben:",t)),t}const o=new class{constructor(){this.events={}}on(r,t){this.events[r]||(this.events[r]=[]),this.events[r].push(t),e.debug(`[EventBus] Listener registriert für: ${r}`)}off(e,r){this.events[e]&&(this.events[e]=this.events[e].filter(e=>e!==r))}emit(r,t={}){e.debug(`[EventBus] Event ausgelöst: ${r}`,t),this.events[r]&&this.events[r].forEach(o=>{try{o(t)}catch(n){e.error(`[EventBus] Fehler im Listener für ${r}`,n)}})}};new class{constructor(){o.on("captcha:reloadRequested",({formId:r,captchaInputId:t})=>{e.debug("[EventBus] captcha:reloadRequested empfangen",{formId:r,captchaInputId:t}),t?this.reloadSingleCaptchaById(t,r):this.reloadCaptcha(r)}),o.on("captcha:reloadAllRequested",()=>{e.debug("[EventBus] captcha:reloadAllRequested empfangen"),this.reloadAllCaptchas()})}reloadAllCaptchas(){e.debug("Reload all Captchas"),document.querySelectorAll(".f12-captcha").forEach(r=>{const o=r.querySelector(".f12c");if(o&&o.id){var n=t(r.closest("form"));e.debug("Reload Captcha gestartet",n),this.reloadSingleCaptchaById(o.id,n)}})}reloadCaptcha(r){var t=document.getElementById(r);if(!t)return void e.error("Form not found",r);e.debug("Reload Captcha für Formular gestartet",r);const o=t.querySelectorAll(".f12-captcha");o.length?o.forEach(e=>{const t=e.querySelector(".f12c");t&&t.id&&this.reloadSingleCaptchaById(t.id,r)}):e.error("Captcha container not found in form:",r)}async reloadSingleCaptchaById(t,n){e.debug("Reload einzelnes Captcha gestartet",{captchaInputId:t,formId:n});const s=document.getElementById(t);if(!s)return void e.error("Captcha-Input nicht gefunden",t);const i=s.closest(".f12-captcha");if(!i)return void e.error("Captcha-Container nicht gefunden für Input",t);const a=new r(i);a.show();const c="hash_"+t,m=document.getElementById(c),d=i.querySelector(".c-data"),u=s.dataset.method;e.log("Captcha Reload AJAX",{method:u,captchaInputId:t});try{const r=await fetch(f12_cf7_captcha.resturl+"captcha/reload",{method:"POST",headers:{"Content-Type":"application/json","X-WP-Nonce":f12_cf7_captcha.restnonce},body:JSON.stringify({captchamethod:u})});if(!r.ok)throw new Error(`HTTP ${r.status}`);const o=await r.json();if("image"===u){const r=d.querySelector(".captcha-image");r&&(e.debug("Ersetze Captcha-Bild",{captchaInputId:t,newLabel:o.label.substring(0,100)}),r.outerHTML=o.label)}if("math"===u){const e=d.querySelector(".captcha-calculation");e&&(e.outerHTML=o.label)}m&&(m.value=o.hash),e.log("Captcha neu gesetzt",{method:u,captchaInputId:t,hash:o.hash})}catch(l){e.error("Captcha reload Fehler",l)}finally{a.hide(),o.emit("captcha:reloaded",{formId:n,captchaInputId:t})}}};new class{constructor(){o.on("captcha:reloaded",({formId:r})=>{e.debug("[EventBus] captcha:reloaded empfangen",r),this.reloadTimer(r)})}reloadAllTimers(){document.querySelectorAll("form").forEach(e=>{const r=t(e);this.reloadTimer(r)})}reloadTimer(r){var t=document.getElementById(r);if(!t)return void e.error("Form not found");e.debug("Reload Timer started",r);const o=t.querySelectorAll(".f12t");o.length?o.forEach(async r=>{const t=r.querySelector(".f12_timer");if(t)try{const r=await fetch(f12_cf7_captcha.resturl+"timer/reload",{method:"POST",headers:{"Content-Type":"application/json","X-WP-Nonce":f12_cf7_captcha.restnonce},body:JSON.stringify({})});if(!r.ok)throw new Error(`HTTP ${r.status}`);const o=await r.json();t.value=o.hash,e.log("Timer neu gesetzt",o.hash)}catch(o){e.error("Timer reload Fehler",o)}else e.warn("Kein Timer-Feld gefunden in",r)}):e.warn("Keine Timer-Container gefunden im Formular",r)}};new class{constructor(){o.on("captcha:initForm",({form:r,formId:t})=>{e.debug("[EventBus] captcha:initForm received",t),this.setStartTime(t)}),o.on("captcha:handleVerify",({form:r,formId:t,originalEvent:o})=>{e.debug("[EventBus] captcha:handleVerify received",t),this.setEndTime(t)}),o.on("captcha:JavaScriptProtection:setStartTimeRequested",({formId:r})=>{e.debug("[EventBus] captcha:JavaScriptProtection:setStartTimeRequested received",r),this.setStartTime(r)})}setStartTime(r){var t=document.getElementById(r);if(!t)return void e.error("Form not found");e.debug("js_start_time started");const o=Date.now()/1e3,n=t.querySelector(".js_start_time");n?(n.value=o,e.log("js_start_time set",o,t)):e.error("js_start_time field not found")}setEndTime(r){var t=document.getElementById(r);if(!t)return e.error("Form not found"),void o.emit("submit:ready",{formId:r,module:"JavaScriptProtection"});e.debug("js_end_time started");const n=Date.now()/1e3,s=t.querySelector(".js_end_time");if(!s)return e.error("js_end_time field not found"),void o.emit("submit:ready",{formId:r,module:"JavaScriptProtection"});s.value=n,e.log("js_end_time set",n,t),o.emit("submit:ready",{formId:r,module:"JavaScriptProtection"})}};new class{constructor(r=["JavaScriptProtection"]){this.requiredModules=r,this.pending=new Map,this.activeSubmits=new WeakSet,o.on("captcha:verifyRequested",async({form:r,formId:t,originalEvent:n,continue:s})=>{this.activeSubmits.has(r)?e.debug("[SubmitGuard] Submit already in progress",t):(e.debug("[SubmitGuard] verifyRequested",{form:r,formId:t,originalEvent:n}),this.startBarrier(r,t,n,s),o.emit("captcha:handleVerify",{form:r,formId:t,originalEvent:n}))}),o.on("submit:ready",({formId:e,module:r})=>{this.markReady(e,r)})}startBarrier(r,t,o,n){this.pending.set(t,{next:()=>{this.activeSubmits.add(r),e.debug("[SubmitGuard] Manual submit started",t),Promise.resolve().then(()=>n()),setTimeout(()=>this.activeSubmits.delete(r),500)},waiting:new Set(this.requiredModules)}),e.debug(`[SubmitGuard] Barrier started for ${t}:`,this.requiredModules)}markReady(r,t){const o=this.pending.get(r);o&&(o.waiting.delete(t),e.debug(`[SubmitGuard] Modul "${t}" ready → waiting for: ${[...o.waiting].join(", ")}`),0===o.waiting.size&&(e.debug(`[SubmitGuard] All modules ready → Submit for ${r}`),o.next(),this.pending.delete(r)))}};new class{constructor(){this.enabled=!1,o.on("captcha:component:enable",r=>{"default"!==r&&"ControllerComments"!==r&&"ControllerJetForm"!==r&&"ControllerUltimateMember"!==r||this.enabled||(this.enabled=!0,e.debug("[DefaultForms] Aktiviert durch component:enable"),this.register())})}register(){o.on("captcha:init",()=>{this.enabled&&(e.debug("[EventBus][DefaultForms] captcha:init received"),this.init())})}isKnownFrameworkForm(e){var r,t;return e.closest(".wpcf7")||e.closest(".fusion-form")||(null==(r=e.id)?void 0:r.startsWith("avada-form-"))||e.closest(".frm-fluent-form")||e.closest(".gform_wrapper")||(null==(t=e.id)?void 0:t.startsWith("gform_"))||e.hasAttribute("data-formid")||e.closest(".elementor-form")||e.hasAttribute("data-elementor-id")||e.classList.contains("woocommerce-form")||e.classList.contains("woocommerce-form-login")||e.classList.contains("woocommerce-form-register")||e.classList.contains("woocommerce-ResetPassword")||e.classList.contains("woocommerce-checkout")||e.closest("form.checkout")||"loginform"===e.id||"registerform"===e.id||"lostpasswordform"===e.id||e.closest("#login")||e.closest(".login")||e.closest(".register")}init(){e.debug("[DefaultForms] init"),document.querySelectorAll("form").forEach(r=>{if(this.isKnownFrameworkForm(r))return void e.debug("[DefaultForms] Übersprungen (bekanntes Framework)",r);const n=t(r);e.debug(`[DefaultForms] Initialisiert für ${n}`);o.emit("captcha:verifyRequested",{form:r,formId:n,originalEvent:null,continue:()=>{r.dataset.ssManualSubmit="1",e.debug(`[DefaultForms] Continue submit for ${n}`)}})})}};new class{constructor(){this.enabled=!1,this.recentSubmits=new WeakSet,o.on("captcha:component:enable",r=>{"ControllerCF7"===r&&(this.enabled=!0,e.debug("[ContactForm7] Aktiviert durch component:enable"),this.register())})}register(){o.on("captcha:init",()=>{this.enabled&&(e.debug("[ContactForm7] captcha:init received"),this.init())})}getFormFromCF7Event(r){var t,o,n;const s=null==(t=null==r?void 0:r.detail)?void 0:t.contactFormId,i=null==(n=null==(o=null==r?void 0:r.detail)?void 0:o.apiResponse)?void 0:n.into,a=i&&document.querySelector(i)||s&&document.querySelector(`div.wpcf7[id^="wpcf7-f${s}-"]`)||null;if(!a)return e.warn("[ContactForm7] Kein WPCF7-Container gefunden",{formId:s,intoSelector:i}),null;const c=a.querySelector("form");return c||(e.warn("[ContactForm7] Kein <form> im WPCF7-Container gefunden",a),null)}init(){const r=this;e.debug("[ContactForm7] init");const n=document.querySelectorAll(".wpcf7 form");n.length?(n.forEach(r=>{const n=t(r);"1"!==r.dataset.ssBound&&(r.dataset.ssBound="1",e.debug("[ContactForm7] native submit listener gebunden",n),r.addEventListener("submit",t=>{var s;if("1"===r.dataset.ssManualSubmit||(null==(s=this.recentSubmits)?void 0:s.has(r)))return e.debug("[ContactForm7] Ignoriere manuellen oder laufenden Submit",n),void delete r.dataset.ssManualSubmit;t.preventDefault(),t.stopImmediatePropagation(),e.debug("[ContactForm7] native submit intercepted (before CF7)",n);o.emit("captcha:verifyRequested",{form:r,formId:n,originalEvent:t,continue:()=>{var t;e.debug("[ContactForm7] Captcha validiert → starte CF7 Submit",n),r.dataset.ssManualSubmit="1",null==(t=this.recentSubmits)||t.add(r),setTimeout(()=>{var e;null==(e=this.recentSubmits)||e.delete(r),delete r.dataset.ssManualSubmit},2e3),window.wpcf7&&"function"==typeof window.wpcf7.submit?window.wpcf7.submit(r):(e.warn("[ContactForm7] Kein window.wpcf7.submit gefunden → Fallback form.submit()",n),r.submit())}})},!0))}),document.addEventListener("wpcf7mailsent",n=>{const s=r.getFormFromCF7Event(n);if(!s)return e.debug("[ContactForm7] wpcf7mailsent: Kein Formular gefunden → reloadAll"),void o.emit("captcha:reloadAllRequested");const i=t(s);o.emit("captcha:reloadRequested",{formId:i}),e.log("wpcf7mailsent → Captcha reloaded",i)},!1),document.addEventListener("wpcf7submit",n=>{const s=r.getFormFromCF7Event(n);if(!s)return e.debug("[ContactForm7] wpcf7submit: Kein Formular gefunden → reloadAll"),void o.emit("captcha:reloadAllRequested");const i=t(s);o.emit("captcha:reloadRequested",{formId:i}),e.log("wpcf7submit → Captcha reloaded",i)},!1),document.addEventListener("wpcf7spam",n=>{const s=r.getFormFromCF7Event(n);if(!s)return void o.emit("captcha:reloadAllRequested");s.querySelectorAll(".f12c").forEach(e=>{e.classList.add("wpcf7-not-valid","not-valid")});const i=t(s);e.warn("wpcf7spam → Captcha als not-valid markiert",i)},!1)):e.debug("[ContactForm7] keine wpcf7-Formulare gefunden")}};new class{constructor(){this.enabled=!1,o.on("captcha:component:enable",r=>{"ControllerElementor"===r&&(this.enabled=!0,e.debug("[ElementorForms] Aktiviert durch component:enable"),this.register())})}register(){o.on("captcha:init",()=>{this.enabled&&(e.debug("[EventBus][ElementorForms] captcha:init received"),this.waitForElementor())})}waitForElementor(r=0){if(!window.elementorFrontend)return r>=20?void e.warn("[ElementorForms] Elementor Frontend nach 20 Versuchen nicht gefunden – Abbruch"):(e.debug("[ElementorForms] Elementor Frontend nicht vorhanden – retry in 300ms"),void setTimeout(()=>this.waitForElementor(r+1),300));if(elementorFrontend.hooks)return e.debug("[ElementorForms] Elementor hooks vorhanden → sofort registrieren"),void this.registerHook();e.debug("[ElementorForms] Elementor hooks fehlen → warte aktiv auf Initialisierung"),document.addEventListener("elementor/frontend/init",()=>{e.debug("[ElementorForms] Elementor init Event empfangen → registriere Hook"),this.registerHook()});let t=0;const o=setInterval(()=>{elementorFrontend.hooks?(clearInterval(o),e.debug("[ElementorForms] Elementor hooks durch Polling gefunden → registriere Hook"),this.registerHook()):t++>20&&(clearInterval(o),e.warn("[ElementorForms] Elementor hooks nach 20 Versuchen nicht gefunden"))},300)}registerHook(){e.debug("[ElementorForms] Initializing Elementor form hooks"),"undefined"!=typeof elementorFrontend&&elementorFrontend.hooks&&"function"==typeof elementorFrontend.hooks.addAction?(elementorFrontend.hooks.addAction("frontend/element_ready/form.default",r=>{e.debug("[ElementorForms] Elementor form widget ready → bind forms");const t=r instanceof HTMLElement?r:(null==r?void 0:r[0])??document;e.debug(r),this.bindForms(t)}),this.bindForms(document),this.startFormObserver(document)):e.warn("[ElementorForms] Elementor frontend hooks not available")}startFormObserver(r=document){this._formObserver||(this._formObserver=new MutationObserver(r=>{var t,o;let n=!1;for(const e of r){if(null==(o=(t=e.target).closest)?void 0:o.call(t,".f12-captcha"))return;if("childList"===e.type&&(e.addedNodes.length||e.removedNodes.length)){n=!0;break}}n&&(e.debug("[ElementorForms] DOM changed → rebinding forms"),this.bindForms(document,!0))}),this._formObserver.observe(r,{childList:!0,subtree:!0}),e.debug("[ElementorForms] Form MutationObserver started"))}bindForms(r=document,n=!1){const s=r.querySelectorAll("form.elementor-form");s.length?(e.debug(s),s.forEach(r=>{if("1"===r.dataset.ssBound&&!1===n)return;r.dataset.ssBound="1";const s=t(r);e.debug("[ElementorForms] Formular gebunden",s),r.dataset.ssCaptchaInitialized||(r.dataset.ssCaptchaInitialized="1",o.emit("captcha:reloadRequested",{formId:s}),e.debug("[ElementorForms] Initial captcha load",s)),r.addEventListener("submit",n=>{if("1"===r.dataset.ssSubmitting)return;const s=t(r);e.debug("[ElementorForms] submit abgefangen",s),n.preventDefault(),n.stopImmediatePropagation();o.emit("captcha:verifyRequested",{form:r,formId:s,originalEvent:n,continue:()=>{var t,o,n,i;e.debug("[ElementorForms] Submit wieder freigegeben",s),r.dataset.ssSubmitting="1";const a=jQuery(r);if(!((null==(o=null==(t=window.elementorProFrontend)?void 0:t.modules)?void 0:o.forms)||(null==(i=null==(n=window.elementorProFrontend)?void 0:n.modules)?void 0:i.form)))return e.error("[ElementorForms] Kein Formularmodul gefunden → Fallback native submit"),void r.submit();e.debug("[ElementorForms] Aktives Elementor Modul erkannt"),e.debug("[ElementorForms] AJAX-Handler aktiv → trigger submit"),a.trigger("submit"),setTimeout(()=>delete r.dataset.ssSubmitting,500)}})},!0)}),e.debug("[ElementorForms] Elementor Formular gebunden")):e.debug("[ElementorForms] keine Formulare im Scope gefunden")}};new class{constructor(){this.enabled=!1,o.on("captcha:component:enable",r=>{"ControllerAvada"===r&&(this.enabled=!0,e.debug("[AvadaForms] Aktiviert durch component:enable"),this.register())})}register(){o.on("captcha:init",()=>{this.enabled&&(e.debug("[EventBus][AvadaForms] captcha:init received"),this.patchAvadaSubmit(),this.registerJqueryEvents(),this.observeAjaxComplete())}),o.on("captcha:avada:error",({formId:r,form:t,response:o})=>{this.enabled&&(e.debug("[EventBus][AvadaForms] captcha:avada:error received",r,o),this.showErrors(o,t))}),o.on("captcha:avada:success",({formId:r,form:t,response:o})=>{this.enabled&&(e.debug("[EventBus][AvadaForms] captcha:avada:success received",r,o),this.removeErrors(t))})}removeErrors(e){e.find(".f12-captcha-error").remove(),e.find(".fusion-form-error").removeClass("fusion-form-error")}showErrors(e,r){e&&e.errors&&(r.find(".f12-captcha-error").remove(),jQuery.each(e.errors,function(e,t){var o=r.find('[name="'+e+'"]');o.length?(o.after('<span class="f12-captcha-error fusion-form-error-message">'+t+"</span>"),o.addClass("fusion-form-error")):r.prepend('<div class="f12-captcha-error fusion-form-error-message">'+t+"</div>")}))}observeAjaxComplete(r=0){if(!window.jQuery)return r>=20?void e.warn("[AvadaForms] jQuery nicht gefunden – ajaxComplete deaktiviert"):setTimeout(()=>this.observeAjaxComplete(r+1),300);const t=window.jQuery;e.debug("[AvadaForms] Registriere globales ajaxComplete-Event"),t(document).ajaxComplete((r,n,s)=>{try{const r=JSON.parse(n.responseText);if(!r||!r.status)return;const i=t((null==s?void 0:s.context)||"form.fusion-form");"error"===r.status&&r.errors&&(e.debug("[AvadaForms] AJAX error → Captcha-Reload ausgelöst"),o.emit("captcha:avada:error",{formId:i.attr("id"),form:i,response:r}),o.emit("captcha:reloadRequested",{formId:i.attr("id")})),"success"===r.status&&(o.emit("captcha:avada:success",{formId:i.attr("id"),form:i,response:r}),e.debug("[AvadaForms] AJAX success → Fehler entfernt"))}catch(i){}})}registerJqueryEvents(r=0){if(!window.jQuery)return r>=20?void e.warn("[AvadaForms] jQuery nicht gefunden – Events deaktiviert"):(e.debug(`[AvadaForms] jQuery noch nicht verfügbar – retry in 300ms (Versuch ${r+1}/20)`),setTimeout(()=>this.registerJqueryEvents(r+1),300));const t=window.jQuery;e.debug("[AvadaForms] Registriere jQuery Events → fusion-form-ajax-submitted"),t(window).on("fusion-form-ajax-submitted",(r,n)=>{var s;const i=null==(s=null==n?void 0:n.formConfig)?void 0:s.form_id;if(!i)return void e.warn("[AvadaForms] Keine form_id in payload gefunden",n);const a=t(`#avada-form-${i},\n         #fusion-form-${i},\n         .fusion-form-${i},\n         form[data-form-id="${i}"]`);let c=a.filter("form").first();if(!c.length&&a.length&&a.each(function(){const e=t(this).find("form.fusion-form").first();e.length&&!c.length&&(c=e)}),!c.length){const r=`avada-form-${i}`;return e.warn("[AvadaForms] Kein Formular im DOM gefunden, Fallback-ID verwendet:",r),void o.emit("captcha:reloadRequested",{formId:r})}const m=c.attr("id")||`avada-form-${i}`;e.debug("[AvadaForms] fusion-form-ajax-submitted erkannt → Formular-ID:",m),o.emit("captcha:reloadRequested",{formId:m})})}patchAvadaSubmit(r=0){if(!window.fusionForms||"function"!=typeof window.fusionForms.submitForm)return r>=20?void e.warn("[AvadaForms] jQuery nicht gefunden – Events deaktiviert"):(e.debug("[AvadaForms] fusionForms noch nicht geladen – retry in 300ms"),setTimeout(()=>this.patchAvadaSubmit(r+1),300));e.debug("[AvadaForms] Patche fusionForms.submitForm");const n=window.fusionForms.submitForm;window.fusionForms.submitForm=(r,s)=>{const i=s instanceof jQuery?s[0]:s,a=t(i);e.debug("[AvadaForms] Intercepted submitForm()",a),r.preventDefault(),r.stopImmediatePropagation();o.emit("captcha:verifyRequested",{form:i,formId:a,originalEvent:r,continue:()=>{e.debug("[AvadaForms] Weiter mit original Avada submitForm()",a),n.call(window.fusionForms,r,s)}})}}};new class{constructor(){this.enabled=!1,o.on("captcha:component:enable",r=>{"ControllerFluentform"===r&&(this.enabled=!0,e.debug("[FluentForms] Aktiviert durch component:enable"),this.register())})}register(){o.on("captcha:init",()=>{this.enabled&&(e.debug("[EventBus][FluentForms] captcha:init received"),this.patchFluentForms(),this.registerFluentFormEvents())}),o.on("captcha:fluent:error",({formId:r,form:t,response:o})=>{this.enabled&&(e.debug("[EventBus][FluentForms] captcha:fluent:error received",r,o),this.showErrors(o,t))}),o.on("captcha:fluent:success",({formId:r,form:t,response:o})=>{this.enabled&&(e.debug("[EventBus][FluentForms] captcha:fluent:success received",r,o),this.removeErrors(t))})}getFormElementFromEventArg(r){const t=window.jQuery;if(!t)return null;if(r instanceof HTMLFormElement)return t(r);if(r&&r.jquery)return r;if(r&&r.form){if(r.form instanceof HTMLFormElement)return t(r.form);if(r.form&&r.form.jquery)return r.form}if("string"==typeof r){const e=t(`#${r}`);if(e.length)return e}return e.warn("[FluentForms] getFormElementFromEventArg(): Kein gültiges Formular erkannt",r),null}removeErrors(r){const t=window.jQuery;if(!t||!r||!r.length)return;const o=r.attr("id")||"(unknown)";e.debug("[FluentForms] removeErrors() gestartet",o);try{r.find(".f12-captcha-error").remove(),r.find(".ff-el-is-error").removeClass("ff-el-is-error"),r.find(".ff_has_error").removeClass("ff_has_error"),r.find(".error.text-danger").remove(),r.find("div.error").remove(),r.parent().find(".ff-errors-in-stack").hide().empty();const n=r.attr("id");n&&(t(`#${n}_success`).remove(),t(`#${n}_errors`).html("")),r.find('[aria-invalid="true"]').attr("aria-invalid","false"),r.removeClass("ff_submitting ff_force_hide"),e.debug("[FluentForms] removeErrors() abgeschlossen",o)}catch(n){e.error("[FluentForms] Fehler in removeErrors()",n)}}showErrors(e,r){const t=window.jQuery;t&&r&&e&&e.errors&&(r.find(".f12-captcha-error").remove(),t.each(e.errors,function(e,t){const o=r.find(`[name="${e}"]`);o.length?(o.after(`<span class="f12-captcha-error ff-el-is-error">${t}</span>`),o.addClass("ff-el-is-error")):r.prepend(`<div class="f12-captcha-error ff-el-is-error">${t}</div>`)}))}patchFluentForms(r=0){const n=window.jQuery;if(!n)return r>=20?void e.warn("[FluentForms] jQuery nicht gefunden – patch deaktiviert"):(e.debug(`[FluentForms] jQuery noch nicht verfügbar – retry in 300ms (Versuch ${r+1}/20)`),setTimeout(()=>this.patchFluentForms(r+1),300));e.debug("[FluentForms] Registriere globalen submit-Interceptor"),n(document).on("submit","form.frm-fluent-form",r=>{const s=n(r.currentTarget),i=s[0],a=t(i);if(s.data("f12-captcha-in-progress"))return e.debug("[FluentForms] Submit bereits in Bearbeitung, blockiert",a),r.preventDefault(),r.stopImmediatePropagation(),!1;e.debug("[FluentForms] Intercepted native submit",a),r.preventDefault(),r.stopImmediatePropagation(),s.data("f12-captcha-in-progress",!0);o.emit("captcha:verifyRequested",{form:i,formId:a,originalEvent:r,continue:()=>{const r=(0,window.jQuery)(i),t=i.getAttribute("id");e.debug("[FluentForms] continueSubmit()",t),r.data("f12-captcha-in-progress",!1);try{const o=window.fluentFormApp(r);if(o&&"function"==typeof o.sendData){e.debug("[FluentForms] using fluentFormApp.sendData()",t);const n={data:r.serialize(),action:"fluentform_submit",form_id:r.data("form_id")};return o.sendData(r,n),void this.removeErrors(r)}e.warn("[FluentForms] Kein app.sendData() – fallback auf native Trigger",t),window.ff_sumitting_form=!1,r.trigger("submit")}catch(o){e.error("[FluentForms] Fehler beim continueSubmit()",o),i.submit()}}})}),n(document).on("fluentform_before_submit",r=>{if(n(null==r?void 0:r.target).closest("form.frm-fluent-form").data("f12-captcha-in-progress"))return e.debug("[FluentForms] fluentform_before_submit abgefangen (Captcha läuft)"),r.preventDefault(),r.stopImmediatePropagation(),!1})}registerFluentFormEvents(r=0){const n=window.jQuery;if(!n)return r>=20?void e.warn("[FluentForms] jQuery nicht gefunden – Events deaktiviert"):(e.debug(`[FluentForms] jQuery noch nicht verfügbar – retry in 300ms (Versuch ${r+1}/20)`),setTimeout(()=>this.registerFluentFormEvents(r+1),300));e.debug("[FluentForms] Registriere Event-Handler für submission_success & submission_failed"),n(document).on("fluentform_submission_success",(r,n,s)=>{const i=this.getFormElementFromEventArg(n),a=(null==s?void 0:s.response)||s;if(!i||!i.length)return void e.warn("[FluentForms] submission_success → kein gültiges Formularobjekt erkannt",n);const c=t(i[0]);e.debug("[FluentForms] fluentform_submission_success erkannt",c),this.removeErrors(i),o.emit("captcha:reloadRequested",{formId:c}),o.emit("captcha:fluent:success",{formId:c,form:i,response:a})}),n(document).on("fluentform_submission_failed",(r,n,s)=>{const i=this.getFormElementFromEventArg(n),a=(null==s?void 0:s.response)||s;if(!i||!i.length)return void e.warn("[FluentForms] submission_failed → kein gültiges Formularobjekt erkannt",n);const c=t(i[0]);e.debug("[FluentForms] fluentform_submission_failed erkannt",c,a),this.showErrors(a,i),o.emit("captcha:reloadRequested",{formId:c}),o.emit("captcha:fluent:error",{formId:c,form:i,response:a})})}};new class{constructor(){this.enabled=!1,o.on("captcha:component:enable",r=>{"ControllerGravityForms"===r&&(this.enabled=!0,e.debug("[GravityForms] Aktiviert durch component:enable"),this.register())})}register(){o.on("captcha:init",()=>{this.enabled&&(e.debug("[EventBus][GravityForms] captcha:init received"),this.registerGravityFormEvents(),this.initialScan(),this.patchGravityForms())}),o.on("captcha:gravity:error",({formId:r,form:t,response:o})=>{this.enabled&&(e.debug("[EventBus][GravityForms] captcha:gravity:error received",r,o),this.showErrors(o,t))}),o.on("captcha:gravity:success",({formId:r,form:t,response:o})=>{this.enabled&&(e.debug("[EventBus][GravityForms] captcha:gravity:success received",r,o),this.removeErrors(t))})}removeErrors(r){if(!window.jQuery||!r||!r.length)return;const t=r.attr("id")||"(unknown)";e.debug("[GravityForms] removeErrors() gestartet",t);try{r.find(".f12-captcha-error").remove(),r.find(".gfield_error").removeClass("gfield_error"),r.find(".validation_message").remove(),r.find(".validation_error").remove(),r.find('[aria-invalid="true"]').attr("aria-invalid","false"),e.debug("[GravityForms] removeErrors() abgeschlossen",t)}catch(o){e.error("[GravityForms] Fehler in removeErrors()",o)}}showErrors(e,r){const t=window.jQuery;t&&r&&e&&e.errors&&(r.find(".f12-captcha-error").remove(),t.each(e.errors,function(e,t){const o=r.find(`[name="${e}"]`);o.length?(o.after(`<div class="f12-captcha-error validation_message">${t}</div>`),o.closest(".gfield").addClass("gfield_error")):r.prepend(`<div class="f12-captcha-error validation_message">${t}</div>`)}))}handleReload(r,t=0){const n=(0,window.jQuery)(`#${r=`gform_${r}`}`);if(!n.length)return e.warn("[GravityForms] handleReload(): kein Formular gefunden (vermutlich nach DOM-Replace)",r),void(t<10?(e.debug(`[GravityForms] handleReload(): #gform_${r} nicht gefunden (Versuch ${t+1})`),setTimeout(()=>this.handleReload(r,t+1),300)):e.debug(`[GravityForms] handleReload(): #gform_${r} nicht gefunden (Versuch ${t+1})`));e.debug("[GravityForms] handleReload()",r),this.removeErrors(n),setTimeout(()=>{o.emit("captcha:reloadRequested",{formId:r}),o.emit("captcha:JavaScriptProtection:setStartTimeRequested",{formId:r})},150)}initialScan(){const r=window.jQuery;if(!r)return e.warn("[GravityForms] jQuery nicht verfügbar – initialScan übersprungen");r(document).ready(()=>{r(".gform_wrapper form").each((_,e)=>{var t;const o=(null==(t=r(e).attr("id"))?void 0:t.replace("gform_",""))||"(unknown)";this.handleReload(o)})})}registerGravityFormEvents(r=0){const t=window.jQuery;if(!t)return r>=20?e.warn("[GravityForms] jQuery nicht verfügbar – Events deaktiviert"):(e.debug(`[GravityForms] retry in 300ms (${r+1}/20)`),setTimeout(()=>this.registerGravityFormEvents(r+1),300));e.debug("[GravityForms] Registriere GF-Events"),t(document).on("gform_pre_submission",(r,n)=>{const s=t(`#gform_${n}`)[0];return e.debug("[GravityForms] gform_pre_submission",n),o.emit("captcha:verifyRequested",{form:s,formId:n,originalEvent:r,continue:()=>{e.debug("[GravityForms] continueSubmit()",n),HTMLFormElement.prototype.submit.call(s)}}),r.preventDefault(),r.stopImmediatePropagation(),!1}),t(document).on("gform_post_render gform_confirmation_loaded",(e,r)=>{this.handleReload(r)})}patchGravityForms(r=0){const n=window.jQuery;if(!n)return r>=20?e.warn("[GravityForms] jQuery nicht gefunden – Submit-Intercept deaktiviert"):(e.debug(`[GravityForms] jQuery noch nicht verfügbar – retry in 300ms (Versuch ${r+1}/20)`),setTimeout(()=>this.patchGravityForms(r+1),300));e.debug("[GravityForms] Registriere globalen Submit-Interceptor"),n(document).on("submit",'form[id^="gform_"]',r=>{const s=n(r.currentTarget),i=s[0],a=t(i);if(s.data("f12-captcha-in-progress"))return e.debug("[GravityForms] Submit bereits in Bearbeitung – blockiert",a),r.preventDefault(),r.stopImmediatePropagation(),!1;e.debug("[GravityForms] Intercepted native submit",a),r.preventDefault(),r.stopImmediatePropagation(),s.data("f12-captcha-in-progress",!0);o.emit("captcha:verifyRequested",{form:i,formId:a,originalEvent:r,continue:()=>{e.debug("[GravityForms] continueSubmit()",a),s.data("f12-captcha-in-progress",!1);try{if(window.gform&&window.gform.submit)return e.debug("[GravityForms] using gform.submit()",a),void window.gform.submit(a);e.warn("[GravityForms] Kein gform.submit() – fallback auf native submit()",a),HTMLFormElement.prototype.submit.call(i)}catch(r){e.error("[GravityForms] Fehler beim continueSubmit()",r),HTMLFormElement.prototype.submit.call(i)}}})})}};new class{constructor(){this.enabled=!1,o.on("captcha:component:enable",r=>{"ControllerWPForms"===r&&(this.enabled=!0,e.debug("[WPForms] Aktiviert durch component:enable"),this.register())})}register(){o.on("captcha:init",()=>{this.enabled&&(e.debug("[WPForms] captcha:init received"),this.registerHooks(),this.observeAjax())})}registerHooks(r=0){const n=window.jQuery;if(!window.wpforms||!window.jQuery)return r>=20?void e.warn("[WPForms] wpforms nicht gefunden – Hooks deaktiviert"):(e.debug(`[WPForms] retry in 300ms (${r+1}/20)`),setTimeout(()=>this.registerHooks(r+1),300));e.debug("[WPForms] Registriere Event-Hooks"),n(document).on("wpformsBeforeFormSubmit",(r,s)=>{const i=n(s),a=t(s);if(e.debug("[WPForms] wpformsBeforeFormSubmit",a),1===i.data("ssManualSubmit"))return e.debug("[WPForms] Bypass aktiv → normaler Submit",a),void i.data("ssManualSubmit",0);r.preventDefault(),r.stopImmediatePropagation();o.emit("captcha:verifyRequested",{form:s,formId:a,originalEvent:r,continue:()=>{e.debug("[WPForms] Captcha OK → Weiter mit Original-Submit",a),i.data("ssManualSubmit",1),window.wpforms.formSubmit(s)}})}),n(document).on("wpformsAjaxSubmitSuccess",(r,s)=>{const i=n(r.target).closest("form.wpforms-form"),a=t(i[0]);e.debug("[WPForms] AJAX success",a,s),o.emit("captcha:wpforms:success",{formId:a,form:i,response:s}),o.emit("captcha:reloadRequested",{formId:a})}),n(document).on("wpformsAjaxSubmitFailed",(r,s)=>{const i=n(r.target).closest("form.wpforms-form"),a=t(i[0]);e.debug("[WPForms] AJAX failed",a,s),o.emit("captcha:wpforms:error",{formId:a,form:i,response:s}),o.emit("captcha:reloadRequested",{formId:a})})}observeAjax(r=0){const n=window.jQuery;if(!window.jQuery)return r>=20?void e.warn("[WPForms] jQuery nicht gefunden – ajaxComplete deaktiviert"):setTimeout(()=>this.observeAjax(r+1),300);n(document).ajaxComplete((r,s,i)=>{try{const r=JSON.parse(s.responseText);if(!r||void 0===r.success)return;const a=n((null==i?void 0:i.context)||"form.wpforms-form");if(!a||!a.length)return void e.debug("[WPForms] Kein Formular im Context gefunden → Event abgebrochen");const c=a[0];if(!(c&&c instanceof HTMLFormElement))return void e.debug("[WPForms] Ungültiges Form-Element → Event abgebrochen",c);const m=t(c);if(!m)return void e.debug("[WPForms] Konnte keine gültige formId ermitteln → Event abgebrochen");o.emit("captcha:reloadRequested",{formId:m})}catch(a){e.debug("[WPForms] AJAX Response konnte nicht geparst werden – ignoriert",a)}})}};new class{constructor(){this.enabled=!1,o.on("captcha:component:enable",r=>{"ControllerWoocommerceLogin"!==r&&"ControllerWoocommerceRegistration"!==r||this.enabled||(this.enabled=!0,e.debug("[WooCommerceForms] Aktiviert durch component:enable"),this.register())})}register(){o.on("captcha:init",()=>{this.enabled&&(e.debug("[EventBus][WooCommerceForms] captcha:init received"),this.registerSubmitInterceptor(),this.observeAjaxResponses())}),o.on("captcha:woocommerce:error",({formId:r,form:t,response:o})=>{this.enabled&&(e.debug("[WooCommerceForms] captcha:woocommerce:error received",r,o),this.showErrors(o,t))}),o.on("captcha:woocommerce:success",({formId:r,form:t,response:o})=>{this.enabled&&(e.debug("[WooCommerceForms] captcha:woocommerce:success received",r,o),this.removeErrors(t))})}removeErrors(e){e.find(".f12-captcha-error").remove(),e.find(".woocommerce-error, .woocommerce-message").removeClass("fusion-form-error")}showErrors(e,r){e&&e.errors&&(r.find(".f12-captcha-error").remove(),jQuery.each(e.errors,function(e,t){const o=r.find(`[name="${e}"]`);o.length?(o.after('<div class="f12-captcha-error woocommerce-error">'+t+"</div>"),o.addClass("fusion-form-error")):r.prepend('<div class="f12-captcha-error woocommerce-error">'+t+"</div>")}))}observeAjaxResponses(r=0){if(!window.jQuery)return r>=20?void e.warn("[WooCommerceForms] jQuery nicht gefunden – observeAjaxResponses deaktiviert"):setTimeout(()=>this.observeAjaxResponses(r+1),300);const t=window.jQuery;e.debug("[WooCommerceForms] Registriere globales ajaxComplete-Event"),t(document).ajaxComplete((r,n,s)=>{try{const r=JSON.parse(n.responseText);if(!r||!r.status)return;const i=t((null==s?void 0:s.context)||"form.woocommerce-form, form.checkout");"error"===r.status&&r.errors&&(e.debug("[WooCommerceForms] AJAX error → Captcha-Reload ausgelöst"),o.emit("captcha:woocommerce:error",{formId:i.attr("id"),form:i,response:r}),o.emit("captcha:reloadRequested",{formId:i.attr("id")})),"success"===r.status&&(o.emit("captcha:woocommerce:success",{formId:i.attr("id"),form:i,response:r}),e.debug("[WooCommerceForms] AJAX success → Fehler entfernt"))}catch(i){}})}registerSubmitInterceptor(r=0){if(!window.jQuery)return r>=20?void e.warn("[WooCommerceForms] jQuery nicht gefunden – Events deaktiviert"):setTimeout(()=>this.registerSubmitInterceptor(r+1),300);const n=window.jQuery;e.debug("[WooCommerceForms] Registriere Submit-Interceptor für WooCommerce"),n(document).on("submit","form.woocommerce-form",r=>{const s=r.currentTarget;n(s).data("f12-submit-finished",!0);const i=t(s);n(s).data("captcha-verified")?n(s).data("captcha-verified",!1):(e.debug("[WooCommerceForms] Intercepted WooCommerce submit",i),o.emit("captcha:verifyRequested",{form:s,formId:i,originalEvent:r,continue:()=>{e.debug("[WooCommerceForms] Captcha verified → continue native submit",i),n(s).data("captcha-verified",!0);const r=s.querySelector('[type="submit"]:not([disabled])')||s.querySelector("button:not([disabled])");r?(e.debug("[WooCommerceForms] Trigger submit button click()",i),r.click()):(e.debug("[WooCommerceForms] Kein sichtbarer Submit-Button → native submit()",i),HTMLFormElement.prototype.submit.call(s)),setTimeout(()=>{if(!n(s).data("f12-submit-finished")){e.debug("[WooCommerceForms] Fallback → erzwinge native submit()",i);try{HTMLFormElement.prototype.submit.call(s)}catch(r){e.error("[WooCommerceForms] Fehler bei fallback submit()",r)}}},500)}}))})}};new class{constructor(){this.enabled=!1,o.on("captcha:component:enable",r=>{"ControllerWoocommerceCheckout"===r&&(this.enabled=!0,e.debug("[WooCommerceCheckoutForm] Aktiviert durch component:enable"),this.register())})}register(){o.on("captcha:init",()=>{this.enabled&&(e.debug("[EventBus][WooCommerceCheckoutForm] captcha:init received"),this.registerCheckoutInterceptor(),this.observeAjaxResponses())}),o.on("captcha:woocommerce:error",({formId:r,form:t,response:o})=>{this.enabled&&(e.debug("[WooCommerceCheckoutForm] captcha:woocommerce:error received",r,o),this.showErrors(o,t))}),o.on("captcha:woocommerce:success",({formId:r,form:t,response:o})=>{this.enabled&&(e.debug("[WooCommerceCheckoutForm] captcha:woocommerce:success received",r,o),this.removeErrors(t))})}removeErrors(e){e.find(".f12-captcha-error").remove(),e.find(".woocommerce-error, .woocommerce-message").removeClass("fusion-form-error")}showErrors(e,r){e&&e.errors&&(r.find(".f12-captcha-error").remove(),jQuery.each(e.errors,function(e,t){const o=r.find(`[name="${e}"]`);o.length?(o.after(`<div class="f12-captcha-error woocommerce-error">${t}</div>`),o.addClass("fusion-form-error")):r.prepend(`<div class="f12-captcha-error woocommerce-error">${t}</div>`)}))}injectJsTimestampsIntoBody(e){const r=String(Date.now()/1e3),t=document.querySelector("form.checkout"),o=null==t?void 0:t.querySelector('[name="js_start_time"]'),n=(null==o?void 0:o.value)||r;return e instanceof FormData?(e.get("js_end_time")||e.set("js_end_time",r),e.get("js_start_time")||e.set("js_start_time",n)):"string"==typeof e&&(/(?:^|&)js_end_time=(?=&|$)/.test(e)?e=e.replace(/((?:^|&)js_end_time)=(?=&|$)/,`$1=${encodeURIComponent(r)}`):e.includes("js_end_time=")||(e+=`&js_end_time=${encodeURIComponent(r)}`),/(?:^|&)js_start_time=(?=&|$)/.test(e)?e=e.replace(/((?:^|&)js_start_time)=(?=&|$)/,`$1=${encodeURIComponent(n)}`):e.includes("js_start_time=")||(e+=`&js_start_time=${encodeURIComponent(n)}`)),e}injectJsTimestamps(e){const r=e[1];return r&&r.body&&(r.body=this.injectJsTimestampsIntoBody(r.body)),e}observeAjaxResponses(r=0){var t;if(!document.querySelector("form.checkout"))return void e.debug("[WooCommerceCheckoutForm] Kein <form.checkout> gefunden → skip observeAjaxResponses");const n=this,s=e=>{try{const r=new URL(e,location.href);return"checkout"===r.searchParams.get("wc-ajax")||(!(!r.pathname.includes("/wp-json/wc/store/")&&!r.pathname.includes("/wp-json/wc/v3/"))||!(!r.pathname.endsWith("/admin-ajax.php")||!(r.searchParams.get("action")||"").includes("checkout")))}catch{return!1}},i=(r,t="unknown")=>{const n=window.jQuery?jQuery("form.checkout"):null,s=null==n?void 0:n.attr("id");if(r&&"object"==typeof r&&("result"in r||"redirect"in r||"messages"in r)){if("failure"===r.result||r.messages)return e.debug(`[WooCommerceCheckoutForm] ${t} classic → FAILURE`,r),o.emit("captcha:woocommerce:error",{formId:s,form:n,response:r}),void o.emit("captcha:reloadRequested",{formId:s});if("success"===r.result||r.redirect)return e.debug(`[WooCommerceCheckoutForm] ${t} classic → SUCCESS`,r),void o.emit("captcha:woocommerce:success",{formId:s,form:n,response:r})}if(r&&"object"==typeof r&&("status"in r||"code"in r||"message"in r)){return"error"===r.status||r.code||r.data&&r.data.status>=400?(e.debug(`[WooCommerceCheckoutForm] ${t} store-api → ERROR`,r),o.emit("captcha:woocommerce:error",{formId:s,form:n,response:r}),void o.emit("captcha:reloadRequested",{formId:s})):(e.debug(`[WooCommerceCheckoutForm] ${t} store-api → SUCCESS`,r),void o.emit("captcha:woocommerce:success",{formId:s,form:n,response:r}))}e.debug(`[WooCommerceCheckoutForm] ${t} unbekanntes Format – keine Aktion`,r)};if(!window._f12FetchPatched){const r=null==(t=window.fetch)?void 0:t.bind(window);r?(window.fetch=async(...t)=>{try{const o=t[0],a="string"==typeof o?o:(null==o?void 0:o.url)||"";s(a)&&(t=n.injectJsTimestamps(t));const c=await r(...t);if(s(a)){const r=c.clone();let t="";try{t=await r.text()}catch{}let o=null;try{o=t?JSON.parse(t):null}catch{}o?i(o,"fetch/json"):t&&t.includes("woocommerce-error")?i({result:"failure",messages:t},"fetch/html"):e.debug("[WooCommerceCheckoutForm] fetch response (kein JSON, kein WC-HTML)",{snippet:null==t?void 0:t.slice(0,200)})}return c}catch(o){return e.warn("[WooCommerceCheckoutForm] fetch interception error",o),await(window.fetch?window.fetch(...t):Promise.reject(o))}},window._f12FetchPatched=!0,e.debug("[WooCommerceCheckoutForm] fetch() interception aktiv")):e.debug("[WooCommerceCheckoutForm] fetch() nicht verfügbar – überspringe fetch patch")}if(!window._f12XhrPatched&&window.XMLHttpRequest){const r=window.XMLHttpRequest,t=r.prototype.open,o=r.prototype.send;r.prototype.open=function(e,r,...o){return this._f12url=r,t.apply(this,[e,r,...o])},r.prototype.send=function(r){return s(this._f12url)&&(r=n.injectJsTimestampsIntoBody(r),this.addEventListener("readystatechange",()=>{if(4===this.readyState)try{const t=this.getResponseHeader("Content-Type")||"",o=this.responseText||"";if(t.includes("application/json"))try{const e=JSON.parse(o);i(e,"xhr/json")}catch(r){e.debug("[WooCommerceCheckoutForm] xhr JSON parse fail",r)}else o.includes("woocommerce-error")?i({result:"failure",messages:o},"xhr/html"):e.debug("[WooCommerceCheckoutForm] xhr response (kein JSON, kein WC-HTML)",{snippet:o.slice(0,200)})}catch(r){e.warn("[WooCommerceCheckoutForm] xhr interception error",r)}})),o.apply(this,[r])},window._f12XhrPatched=!0,e.debug("[WooCommerceCheckoutForm] XMLHttpRequest interception aktiv")}}registerCheckoutInterceptor(r=0){if(!window.jQuery)return r>=20?void e.warn("[WooCommerceCheckoutForm] jQuery nicht gefunden – Events deaktiviert"):setTimeout(()=>this.registerCheckoutInterceptor(r+1),300);const n=window.jQuery;e.debug("[WooCommerceCheckoutForm] Registriere Click-Interceptor für #place_order"),n(document).off("click.f12Captcha","form.checkout #place_order"),n(document).on("click.f12Captcha","form.checkout #place_order",r=>{const s=r.currentTarget.closest("form.checkout"),i=n(s),a=t(s);if(i.data("captcha-verified"))return i.removeData("captcha-verified"),e.debug("[WooCommerceCheckoutForm] Captcha bereits validiert → WooCommerce darf fortfahren",a),!0;r.preventDefault(),r.stopImmediatePropagation(),e.debug("[WooCommerceCheckoutForm] Klick auf #place_order abgefangen → CAPTCHA prüfen",a),o.emit("captcha:verifyRequested",{form:s,formId:a,originalEvent:r,continue:()=>{i.data("captcha-verified",!0),e.debug("[WooCommerceCheckoutForm] Captcha OK → löse Button-Klick erneut aus",a);const t=new MouseEvent("click",r);s.querySelector("#place_order").dispatchEvent(t)}})})}};new class{constructor(){this.enabled=!1,o.on("captcha:component:enable",r=>{"ControllerWordpressLogin"===r&&(this.enabled||(this.enabled=!0,e.debug("[WordPressLoginForms] Aktiviert durch component:enable"),this.register()))})}register(){o.on("captcha:init",()=>{this.enabled&&(e.debug("[WordPressLoginForms] captcha:init received"),this.registerSubmitInterceptor(),this.observeAjaxResponses())}),o.on("captcha:wp-login:error",({formId:e,form:r,response:t})=>{this.enabled&&this.showErrors(t,r)}),o.on("captcha:wp-login:success",({formId:e,form:r,response:t})=>{this.enabled&&this.removeErrors(r)})}removeErrors(e){e.querySelectorAll(".f12-captcha-error").forEach(e=>e.remove())}showErrors(e,r){e&&e.errors&&(this.removeErrors(r),Object.entries(e.errors).forEach(([e,t])=>{const o=r.querySelector(`[name="${e}"]`);if(o){const e=document.createElement("div");e.className="f12-captcha-error",e.style.color="#d63638",e.style.marginTop="5px",e.innerHTML=t,o.insertAdjacentElement("afterend",e)}else{const e=document.createElement("div");e.className="f12-captcha-error",e.style.color="#d63638",e.style.marginBottom="10px",e.innerHTML=t,r.prepend(e)}}))}observeAjaxResponses(){}registerSubmitInterceptor(){e.debug("[WordPressLoginForms] Registriere Submit-Interceptor"),document.addEventListener("submit",r=>{const n=r.target.closest("form#loginform");if(!n)return;const s=t(n);n.dataset.captchaVerified?delete n.dataset.captchaVerified:(e.debug("[WordPressLoginForms] Intercepted WP login submit",s),r.preventDefault(),r.stopImmediatePropagation(),o.emit("captcha:verifyRequested",{form:n,formId:s,originalEvent:r,continue:()=>{e.debug("[WordPressLoginForms] Captcha verified → continue submit",s),n.dataset.captchaVerified="1";const r=n.querySelector('[type="submit"]');r?r.click():n.submit(),setTimeout(()=>{if(!n.dataset.submitFinished){e.debug("[WordPressLoginForms] Fallback → native submit()",s);try{n.submit()}catch(r){e.error("[WordPressLoginForms] fallback submit error",r)}}},300)}}))})}};new class{constructor(){this.enabled=!1,o.on("captcha:component:enable",r=>{"ControllerWordpressRegistration"===r&&(this.enabled||(this.enabled=!0,e.debug("[WordPressRegistrationForms] Aktiviert durch component:enable"),this.register()))})}register(){o.on("captcha:init",()=>{this.enabled&&(e.debug("[WordPressRegistrationForms] captcha:init received"),this.registerSubmitInterceptor(),this.observeAjaxResponses())}),o.on("captcha:wp-registration:error",({formId:e,form:r,response:t})=>{this.enabled&&this.showErrors(t,r)}),o.on("captcha:wp-registration:success",({formId:e,form:r,response:t})=>{this.enabled&&this.removeErrors(r)})}removeErrors(e){e.querySelectorAll(".f12-captcha-error").forEach(e=>e.remove())}showErrors(e,r){e&&e.errors&&(this.removeErrors(r),Object.entries(e.errors).forEach(([e,t])=>{const o=r.querySelector(`[name="${e}"]`);if(o){const e=document.createElement("div");e.className="f12-captcha-error",e.style.color="#d63638",e.style.marginTop="5px",e.innerHTML=t,o.insertAdjacentElement("afterend",e)}else{const e=document.createElement("div");e.className="f12-captcha-error",e.style.color="#d63638",e.style.marginBottom="10px",e.innerHTML=t,r.prepend(e)}}))}observeAjaxResponses(){}registerSubmitInterceptor(){e.debug("[WordPressRegistrationForms] Registriere Submit-Interceptor"),document.addEventListener("submit",r=>{const n=r.target.closest("form#registerform");if(!n)return;const s=t(n);n.dataset.captchaVerified?delete n.dataset.captchaVerified:(e.debug("[WordPressRegistrationForms] Intercepted WP login submit",s),r.preventDefault(),r.stopImmediatePropagation(),o.emit("captcha:verifyRequested",{form:n,formId:s,originalEvent:r,continue:()=>{e.debug("[WordPressRegistrationForms] Captcha verified → continue submit",s),n.dataset.captchaVerified="1";const r=n.querySelector('[type="submit"]');r?r.click():n.submit(),setTimeout(()=>{if(!n.dataset.submitFinished){e.debug("[WordPressRegistrationForms] Fallback → native submit()",s);try{n.submit()}catch(r){e.error("[WordPressRegistrationForms] fallback submit error",r)}}},300)}}))})}},window.f12cf7captcha_cf7={logger:e,reloadAllCaptchas:function(){e.debug("Reload all Captchas"),o.emit("captcha:reloadAllRequested")},init:function(){this.logger.log("Init gestartet");(window.f12_cf7_captcha&&f12_cf7_captcha.components||[]).forEach(r=>{e.debug(`[Init] Aktiviere Komponente: ${r}`),o.emit("captcha:component:enable",r)}),document.addEventListener("DOMContentLoaded",()=>{e.debug("DOM ready -> init all forms"),document.querySelectorAll("form").forEach(r=>{const n=t(r);void 0!==o&&o.emit("captcha:initForm",{form:r,formId:n}),e.debug("Form initialized",n)}),o.emit("captcha:init")}),document.addEventListener("click",r=>{if(!(r.target.closest(".cf7.captcha-reload")||r.target.closest(".c-reload")))return;e.debug("Reload-Button geklickt",r.target),r.preventDefault(),r.stopPropagation();const n=r.target.closest(".f12-captcha");if(!n)return void e.error("Kein Captcha-Container gefunden");const s=n.querySelector(".f12c");if(!s||!s.id)return void e.error("Kein Captcha-Input mit ID gefunden");const i=s.id;e.debug("Captcha-Input-ID gefunden",i);const a=r.target.closest("form");if(!a)return void e.error("Kein Formular für Captcha gefunden");const c=t(a);e.debug("Formular-ID",c),o.emit("captcha:reloadRequested",{formId:c,captchaInputId:i})})}},window.f12cf7captcha_cf7.init()}();
     1!function(){"use strict";const e=function(){const e=new URLSearchParams(window.location.search).has("silentshield-debug");function r(e){return["[SilentShield]"].concat(Array.from(e))}return{log:(...t)=>e&&console.log(...r(t)),debug:(...t)=>e&&console.debug(...r(t)),warn:(...t)=>e&&console.warn(...r(t)),error:(...t)=>e&&console.error(...r(t))}}();class r{constructor(e,r={}){this.container=e,this.options=Object.assign({className:"f12-captcha-overlay",autoPosition:!0,debug:!1},r)}show(){const{className:r,autoPosition:t}=this.options,o=window.getComputedStyle(this.container);if(t&&"static"===o.position&&(this.container.style.position="relative"),!this.container.querySelector(`.${r}`)){const t=document.createElement("div");t.className=r,this.container.appendChild(t),e.log("Overlay hinzugefügt",this.container)}}hide(){const{className:r}=this.options,t=this.container.querySelector(`.${r}`);t&&t.remove(),e.log("Overlay entfernt",this.container)}}function t(r){if(e.debug("[ensureFormId] aufgerufen",r),window.jQuery&&r instanceof window.jQuery&&(e.debug("[ensureFormId] jQuery-Objekt erkannt → form[0] wird verwendet"),r=r[0]),!(r instanceof HTMLFormElement))return e.error("[ensureFormId] Ungültiges Formular-Element übergeben:",r),null;let t=r.id;return t&&""!==t.trim()||(t="f12-form-"+Math.random().toString(36).substring(2,10),r.id=t,e.debug("[ensureFormId] Formular ohne ID erkannt → generische ID vergeben:",t)),t}const o=new class{constructor(){this.events={}}on(r,t){this.events[r]||(this.events[r]=[]),this.events[r].push(t),e.debug(`[EventBus] Listener registriert für: ${r}`)}off(e,r){this.events[e]&&(this.events[e]=this.events[e].filter(e=>e!==r))}emit(r,t={}){e.debug(`[EventBus] Event ausgelöst: ${r}`,t),this.events[r]&&this.events[r].forEach(o=>{try{o(t)}catch(n){e.error(`[EventBus] Fehler im Listener für ${r}`,n)}})}};new class{constructor(){o.on("captcha:reloadRequested",({formId:r,captchaInputId:t})=>{e.debug("[EventBus] captcha:reloadRequested empfangen",{formId:r,captchaInputId:t}),t?this.reloadSingleCaptchaById(t,r):this.reloadCaptcha(r)}),o.on("captcha:reloadAllRequested",()=>{e.debug("[EventBus] captcha:reloadAllRequested empfangen"),this.reloadAllCaptchas()})}reloadAllCaptchas(){e.debug("Reload all Captchas"),document.querySelectorAll(".f12-captcha").forEach(r=>{const o=r.querySelector(".f12c");if(o&&o.id){var n=t(r.closest("form"));e.debug("Reload Captcha gestartet",n),this.reloadSingleCaptchaById(o.id,n)}})}reloadCaptcha(r){var t=document.getElementById(r);if(!t)return void e.error("Form not found",r);e.debug("Reload Captcha für Formular gestartet",r);const o=t.querySelectorAll(".f12-captcha");o.length?o.forEach(e=>{const t=e.querySelector(".f12c");t&&t.id&&this.reloadSingleCaptchaById(t.id,r)}):e.debug("No captcha container in form (JS-only protection):",r)}async reloadSingleCaptchaById(t,n){e.debug("Reload einzelnes Captcha gestartet",{captchaInputId:t,formId:n});const s=document.getElementById(t);if(!s)return void e.error("Captcha-Input nicht gefunden",t);const i=s.closest(".f12-captcha");if(!i)return void e.error("Captcha-Container nicht gefunden für Input",t);const a=new r(i);a.show();const c="hash_"+t,m=document.getElementById(c),d=i.querySelector(".c-data"),u=s.dataset.method;e.log("Captcha Reload AJAX",{method:u,captchaInputId:t});try{const r=await fetch(f12_cf7_captcha.resturl+"captcha/reload",{method:"POST",headers:{"Content-Type":"application/json","X-WP-Nonce":f12_cf7_captcha.restnonce},body:JSON.stringify({captchamethod:u})});if(!r.ok)throw new Error(`HTTP ${r.status}`);const o=await r.json();if("image"===u){const r=d.querySelector(".captcha-image");r&&(e.debug("Ersetze Captcha-Bild",{captchaInputId:t,newLabel:o.label.substring(0,100)}),r.outerHTML=o.label)}if("math"===u){const e=d.querySelector(".captcha-calculation");e&&(e.outerHTML=o.label)}m&&(m.value=o.hash),e.log("Captcha neu gesetzt",{method:u,captchaInputId:t,hash:o.hash})}catch(l){e.error("Captcha reload Fehler",l)}finally{a.hide(),o.emit("captcha:reloaded",{formId:n,captchaInputId:t})}}};new class{constructor(){o.on("captcha:reloaded",({formId:r})=>{e.debug("[EventBus] captcha:reloaded empfangen",r),this.reloadTimer(r)})}reloadAllTimers(){document.querySelectorAll("form").forEach(e=>{const r=t(e);this.reloadTimer(r)})}reloadTimer(r){var t=document.getElementById(r);if(!t)return void e.error("Form not found");e.debug("Reload Timer started",r);const o=t.querySelectorAll(".f12t");o.length?o.forEach(async r=>{const t=r.querySelector(".f12_timer");if(t)try{const r=await fetch(f12_cf7_captcha.resturl+"timer/reload",{method:"POST",headers:{"Content-Type":"application/json","X-WP-Nonce":f12_cf7_captcha.restnonce},body:JSON.stringify({})});if(!r.ok)throw new Error(`HTTP ${r.status}`);const o=await r.json();t.value=o.hash,e.log("Timer neu gesetzt",o.hash)}catch(o){e.error("Timer reload Fehler",o)}else e.warn("Kein Timer-Feld gefunden in",r)}):e.warn("Keine Timer-Container gefunden im Formular",r)}};new class{constructor(){o.on("captcha:initForm",({form:r,formId:t})=>{e.debug("[EventBus] captcha:initForm received",t),this.setStartTime(t)}),o.on("captcha:handleVerify",({form:r,formId:t,originalEvent:o})=>{e.debug("[EventBus] captcha:handleVerify received",t),this.setEndTime(t)}),o.on("captcha:JavaScriptProtection:setStartTimeRequested",({formId:r})=>{e.debug("[EventBus] captcha:JavaScriptProtection:setStartTimeRequested received",r),this.setStartTime(r)})}setStartTime(r){var t=document.getElementById(r);if(!t)return void e.error("Form not found");e.debug("js_start_time started");const o=Date.now()/1e3,n=t.querySelector(".js_start_time");n?(n.value=o,e.log("js_start_time set",o,t)):e.error("js_start_time field not found")}setEndTime(r){var t=document.getElementById(r);if(!t)return e.error("Form not found"),void o.emit("submit:ready",{formId:r,module:"JavaScriptProtection"});e.debug("js_end_time started");const n=Date.now()/1e3,s=t.querySelector(".js_end_time");if(!s)return e.error("js_end_time field not found"),void o.emit("submit:ready",{formId:r,module:"JavaScriptProtection"});s.value=n,e.log("js_end_time set",n,t),o.emit("submit:ready",{formId:r,module:"JavaScriptProtection"})}};new class{constructor(r=["JavaScriptProtection"]){this.requiredModules=r,this.pending=new Map,this.activeSubmits=new WeakSet,o.on("captcha:verifyRequested",async({form:r,formId:t,originalEvent:n,continue:s})=>{this.activeSubmits.has(r)?e.debug("[SubmitGuard] Submit already in progress",t):(e.debug("[SubmitGuard] verifyRequested",{form:r,formId:t,originalEvent:n}),this.startBarrier(r,t,n,s),o.emit("captcha:handleVerify",{form:r,formId:t,originalEvent:n}))}),o.on("submit:ready",({formId:e,module:r})=>{this.markReady(e,r)})}startBarrier(r,t,o,n){this.pending.set(t,{next:()=>{this.activeSubmits.add(r),e.debug("[SubmitGuard] Manual submit started",t),Promise.resolve().then(()=>n()),setTimeout(()=>this.activeSubmits.delete(r),500)},waiting:new Set(this.requiredModules)}),e.debug(`[SubmitGuard] Barrier started for ${t}:`,this.requiredModules)}markReady(r,t){const o=this.pending.get(r);o&&(o.waiting.delete(t),e.debug(`[SubmitGuard] Modul "${t}" ready → waiting for: ${[...o.waiting].join(", ")}`),0===o.waiting.size&&(e.debug(`[SubmitGuard] All modules ready → Submit for ${r}`),o.next(),this.pending.delete(r)))}};new class{constructor(){this.enabled=!1,o.on("captcha:component:enable",r=>{"default"!==r&&"ControllerComments"!==r&&"ControllerJetForm"!==r&&"ControllerUltimateMember"!==r||this.enabled||(this.enabled=!0,e.debug("[DefaultForms] Aktiviert durch component:enable"),this.register())})}register(){o.on("captcha:init",()=>{this.enabled&&(e.debug("[EventBus][DefaultForms] captcha:init received"),this.init())})}isKnownFrameworkForm(e){var r,t;return e.closest(".wpcf7")||e.closest(".fusion-form")||(null==(r=e.id)?void 0:r.startsWith("avada-form-"))||e.closest(".frm-fluent-form")||e.closest(".gform_wrapper")||(null==(t=e.id)?void 0:t.startsWith("gform_"))||e.hasAttribute("data-formid")||e.closest(".elementor-form")||e.hasAttribute("data-elementor-id")||e.classList.contains("woocommerce-form")||e.classList.contains("woocommerce-form-login")||e.classList.contains("woocommerce-form-register")||e.classList.contains("woocommerce-ResetPassword")||e.classList.contains("woocommerce-checkout")||e.closest("form.checkout")||"loginform"===e.id||"registerform"===e.id||"lostpasswordform"===e.id||e.closest("#login")||e.closest(".login")||e.closest(".register")}init(){e.debug("[DefaultForms] init"),document.querySelectorAll("form").forEach(r=>{if(this.isKnownFrameworkForm(r))return void e.debug("[DefaultForms] Übersprungen (bekanntes Framework)",r);const n=t(r);e.debug(`[DefaultForms] Initialisiert für ${n}`);o.emit("captcha:verifyRequested",{form:r,formId:n,originalEvent:null,continue:()=>{r.dataset.ssManualSubmit="1",e.debug(`[DefaultForms] Continue submit for ${n}`)}})})}};new class{constructor(){this.enabled=!1,this.recentSubmits=new WeakSet,o.on("captcha:component:enable",r=>{"ControllerCF7"===r&&(this.enabled=!0,e.debug("[ContactForm7] Aktiviert durch component:enable"),this.register())})}register(){o.on("captcha:init",()=>{this.enabled&&(e.debug("[ContactForm7] captcha:init received"),this.init())})}getFormFromCF7Event(r){var t,o,n;const s=null==(t=null==r?void 0:r.detail)?void 0:t.contactFormId,i=null==(n=null==(o=null==r?void 0:r.detail)?void 0:o.apiResponse)?void 0:n.into,a=i&&document.querySelector(i)||s&&document.querySelector(`div.wpcf7[id^="wpcf7-f${s}-"]`)||null;if(!a)return e.warn("[ContactForm7] Kein WPCF7-Container gefunden",{formId:s,intoSelector:i}),null;const c=a.querySelector("form");return c||(e.warn("[ContactForm7] Kein <form> im WPCF7-Container gefunden",a),null)}init(){const r=this;e.debug("[ContactForm7] init");const n=document.querySelectorAll(".wpcf7 form");n.length?(n.forEach(r=>{const n=t(r);"1"!==r.dataset.ssBound&&(r.dataset.ssBound="1",e.debug("[ContactForm7] native submit listener gebunden",n),r.addEventListener("submit",t=>{var s;if("1"===r.dataset.ssManualSubmit||(null==(s=this.recentSubmits)?void 0:s.has(r)))return e.debug("[ContactForm7] Ignoriere manuellen oder laufenden Submit",n),void delete r.dataset.ssManualSubmit;t.preventDefault(),t.stopImmediatePropagation(),e.debug("[ContactForm7] native submit intercepted (before CF7)",n);o.emit("captcha:verifyRequested",{form:r,formId:n,originalEvent:t,continue:()=>{var t;e.debug("[ContactForm7] Captcha validiert → starte CF7 Submit",n),r.dataset.ssManualSubmit="1",null==(t=this.recentSubmits)||t.add(r),setTimeout(()=>{var e;null==(e=this.recentSubmits)||e.delete(r),delete r.dataset.ssManualSubmit},2e3),window.wpcf7&&"function"==typeof window.wpcf7.submit?window.wpcf7.submit(r):(e.warn("[ContactForm7] Kein window.wpcf7.submit gefunden → Fallback form.submit()",n),r.submit())}})},!0))}),document.addEventListener("wpcf7mailsent",n=>{const s=r.getFormFromCF7Event(n);if(!s)return e.debug("[ContactForm7] wpcf7mailsent: Kein Formular gefunden → reloadAll"),void o.emit("captcha:reloadAllRequested");const i=t(s);o.emit("captcha:reloadRequested",{formId:i}),e.log("wpcf7mailsent → Captcha reloaded",i)},!1),document.addEventListener("wpcf7submit",n=>{const s=r.getFormFromCF7Event(n);if(!s)return e.debug("[ContactForm7] wpcf7submit: Kein Formular gefunden → reloadAll"),void o.emit("captcha:reloadAllRequested");const i=t(s);o.emit("captcha:reloadRequested",{formId:i}),e.log("wpcf7submit → Captcha reloaded",i)},!1),document.addEventListener("wpcf7spam",n=>{const s=r.getFormFromCF7Event(n);if(!s)return void o.emit("captcha:reloadAllRequested");s.querySelectorAll(".f12c").forEach(e=>{e.classList.add("wpcf7-not-valid","not-valid")});const i=t(s);e.warn("wpcf7spam → Captcha als not-valid markiert",i)},!1)):e.debug("[ContactForm7] keine wpcf7-Formulare gefunden")}};new class{constructor(){this.enabled=!1,o.on("captcha:component:enable",r=>{"ControllerElementor"===r&&(this.enabled=!0,e.debug("[ElementorForms] Aktiviert durch component:enable"),this.register())})}register(){o.on("captcha:init",()=>{this.enabled&&(e.debug("[EventBus][ElementorForms] captcha:init received"),this.waitForElementor())})}waitForElementor(r=0){if(!window.elementorFrontend)return r>=20?void e.warn("[ElementorForms] Elementor Frontend nach 20 Versuchen nicht gefunden – Abbruch"):(e.debug("[ElementorForms] Elementor Frontend nicht vorhanden – retry in 300ms"),void setTimeout(()=>this.waitForElementor(r+1),300));if(elementorFrontend.hooks)return e.debug("[ElementorForms] Elementor hooks vorhanden → sofort registrieren"),void this.registerHook();e.debug("[ElementorForms] Elementor hooks fehlen → warte aktiv auf Initialisierung"),document.addEventListener("elementor/frontend/init",()=>{e.debug("[ElementorForms] Elementor init Event empfangen → registriere Hook"),this.registerHook()});let t=0;const o=setInterval(()=>{elementorFrontend.hooks?(clearInterval(o),e.debug("[ElementorForms] Elementor hooks durch Polling gefunden → registriere Hook"),this.registerHook()):t++>20&&(clearInterval(o),e.warn("[ElementorForms] Elementor hooks nach 20 Versuchen nicht gefunden"))},300)}registerHook(){e.debug("[ElementorForms] Initializing Elementor form hooks"),"undefined"!=typeof elementorFrontend&&elementorFrontend.hooks&&"function"==typeof elementorFrontend.hooks.addAction?(elementorFrontend.hooks.addAction("frontend/element_ready/form.default",r=>{e.debug("[ElementorForms] Elementor form widget ready → bind forms");const t=r instanceof HTMLElement?r:(null==r?void 0:r[0])??document;e.debug(r),this.bindForms(t)}),this.bindForms(document),this.startFormObserver(document)):e.warn("[ElementorForms] Elementor frontend hooks not available")}startFormObserver(r=document){this._formObserver||(this._formObserver=new MutationObserver(r=>{var t,o;let n=!1;for(const e of r){if(null==(o=(t=e.target).closest)?void 0:o.call(t,".f12-captcha"))return;if("childList"===e.type&&(e.addedNodes.length||e.removedNodes.length)){n=!0;break}}n&&(e.debug("[ElementorForms] DOM changed → rebinding forms"),this.bindForms(document,!0))}),this._formObserver.observe(r,{childList:!0,subtree:!0}),e.debug("[ElementorForms] Form MutationObserver started"))}bindForms(r=document,n=!1){const s=r.querySelectorAll("form.elementor-form");s.length?(e.debug(s),s.forEach(r=>{if("1"===r.dataset.ssBound&&!1===n)return;r.dataset.ssBound="1";const s=t(r);e.debug("[ElementorForms] Formular gebunden",s),r.dataset.ssCaptchaInitialized||(r.dataset.ssCaptchaInitialized="1",o.emit("captcha:reloadRequested",{formId:s}),e.debug("[ElementorForms] Initial captcha load",s)),r.addEventListener("submit",n=>{if("1"===r.dataset.ssSubmitting)return;const s=t(r);e.debug("[ElementorForms] submit abgefangen",s),n.preventDefault(),n.stopImmediatePropagation();o.emit("captcha:verifyRequested",{form:r,formId:s,originalEvent:n,continue:()=>{var t,o,n,i;e.debug("[ElementorForms] Submit wieder freigegeben",s),r.dataset.ssSubmitting="1";const a=jQuery(r);if(!((null==(o=null==(t=window.elementorProFrontend)?void 0:t.modules)?void 0:o.forms)||(null==(i=null==(n=window.elementorProFrontend)?void 0:n.modules)?void 0:i.form)))return e.error("[ElementorForms] Kein Formularmodul gefunden → Fallback native submit"),void r.submit();e.debug("[ElementorForms] Aktives Elementor Modul erkannt"),e.debug("[ElementorForms] AJAX-Handler aktiv → trigger submit"),a.trigger("submit"),setTimeout(()=>delete r.dataset.ssSubmitting,500)}})},!0)}),e.debug("[ElementorForms] Elementor Formular gebunden")):e.debug("[ElementorForms] keine Formulare im Scope gefunden")}};new class{constructor(){this.enabled=!1,o.on("captcha:component:enable",r=>{"ControllerAvada"===r&&(this.enabled=!0,e.debug("[AvadaForms] Aktiviert durch component:enable"),this.register())})}register(){o.on("captcha:init",()=>{this.enabled&&(e.debug("[EventBus][AvadaForms] captcha:init received"),this.patchAvadaSubmit(),this.registerJqueryEvents(),this.observeAjaxComplete())}),o.on("captcha:avada:error",({formId:r,form:t,response:o})=>{this.enabled&&(e.debug("[EventBus][AvadaForms] captcha:avada:error received",r,o),this.showErrors(o,t))}),o.on("captcha:avada:success",({formId:r,form:t,response:o})=>{this.enabled&&(e.debug("[EventBus][AvadaForms] captcha:avada:success received",r,o),this.removeErrors(t))})}removeErrors(e){e.find(".f12-captcha-error").remove(),e.find(".fusion-form-error").removeClass("fusion-form-error")}showErrors(e,r){e&&e.errors&&(r.find(".f12-captcha-error").remove(),jQuery.each(e.errors,function(e,t){var o=r.find('[name="'+e+'"]');o.length?(o.after('<span class="f12-captcha-error fusion-form-error-message">'+t+"</span>"),o.addClass("fusion-form-error")):r.prepend('<div class="f12-captcha-error fusion-form-error-message">'+t+"</div>")}))}observeAjaxComplete(r=0){if(!window.jQuery)return r>=20?void e.warn("[AvadaForms] jQuery nicht gefunden – ajaxComplete deaktiviert"):setTimeout(()=>this.observeAjaxComplete(r+1),300);const t=window.jQuery;e.debug("[AvadaForms] Registriere globales ajaxComplete-Event"),t(document).ajaxComplete((r,n,s)=>{try{const r=JSON.parse(n.responseText);if(!r||!r.status)return;const i=t((null==s?void 0:s.context)||"form.fusion-form");"error"===r.status&&r.errors&&(e.debug("[AvadaForms] AJAX error → Captcha-Reload ausgelöst"),o.emit("captcha:avada:error",{formId:i.attr("id"),form:i,response:r}),o.emit("captcha:reloadRequested",{formId:i.attr("id")})),"success"===r.status&&(o.emit("captcha:avada:success",{formId:i.attr("id"),form:i,response:r}),e.debug("[AvadaForms] AJAX success → Fehler entfernt"))}catch(i){}})}registerJqueryEvents(r=0){if(!window.jQuery)return r>=20?void e.warn("[AvadaForms] jQuery nicht gefunden – Events deaktiviert"):(e.debug(`[AvadaForms] jQuery noch nicht verfügbar – retry in 300ms (Versuch ${r+1}/20)`),setTimeout(()=>this.registerJqueryEvents(r+1),300));const t=window.jQuery;e.debug("[AvadaForms] Registriere jQuery Events → fusion-form-ajax-submitted"),t(window).on("fusion-form-ajax-submitted",(r,n)=>{var s;const i=null==(s=null==n?void 0:n.formConfig)?void 0:s.form_id;if(!i)return void e.warn("[AvadaForms] Keine form_id in payload gefunden",n);const a=t(`#avada-form-${i},\n         #fusion-form-${i},\n         .fusion-form-${i},\n         form[data-form-id="${i}"]`);let c=a.filter("form").first();if(!c.length&&a.length&&a.each(function(){const e=t(this).find("form.fusion-form").first();e.length&&!c.length&&(c=e)}),!c.length){const r=`avada-form-${i}`;return e.warn("[AvadaForms] Kein Formular im DOM gefunden, Fallback-ID verwendet:",r),void o.emit("captcha:reloadRequested",{formId:r})}const m=c.attr("id")||`avada-form-${i}`;e.debug("[AvadaForms] fusion-form-ajax-submitted erkannt → Formular-ID:",m),o.emit("captcha:reloadRequested",{formId:m})})}patchAvadaSubmit(r=0){if(!window.fusionForms||"function"!=typeof window.fusionForms.submitForm)return r>=20?void e.warn("[AvadaForms] jQuery nicht gefunden – Events deaktiviert"):(e.debug("[AvadaForms] fusionForms noch nicht geladen – retry in 300ms"),setTimeout(()=>this.patchAvadaSubmit(r+1),300));e.debug("[AvadaForms] Patche fusionForms.submitForm");const n=window.fusionForms.submitForm;window.fusionForms.submitForm=(r,s)=>{const i=s instanceof jQuery?s[0]:s,a=t(i);e.debug("[AvadaForms] Intercepted submitForm()",a),r.preventDefault(),r.stopImmediatePropagation();o.emit("captcha:verifyRequested",{form:i,formId:a,originalEvent:r,continue:()=>{e.debug("[AvadaForms] Weiter mit original Avada submitForm()",a),n.call(window.fusionForms,r,s)}})}}};new class{constructor(){this.enabled=!1,o.on("captcha:component:enable",r=>{"ControllerFluentform"===r&&(this.enabled=!0,e.debug("[FluentForms] Aktiviert durch component:enable"),this.register())})}register(){o.on("captcha:init",()=>{this.enabled&&(e.debug("[EventBus][FluentForms] captcha:init received"),this.patchFluentForms(),this.registerFluentFormEvents())}),o.on("captcha:fluent:error",({formId:r,form:t,response:o})=>{this.enabled&&(e.debug("[EventBus][FluentForms] captcha:fluent:error received",r,o),this.showErrors(o,t))}),o.on("captcha:fluent:success",({formId:r,form:t,response:o})=>{this.enabled&&(e.debug("[EventBus][FluentForms] captcha:fluent:success received",r,o),this.removeErrors(t))})}getFormElementFromEventArg(r){const t=window.jQuery;if(!t)return null;if(r instanceof HTMLFormElement)return t(r);if(r&&r.jquery)return r;if(r&&r.form){if(r.form instanceof HTMLFormElement)return t(r.form);if(r.form&&r.form.jquery)return r.form}if("string"==typeof r){const e=t(`#${r}`);if(e.length)return e}return e.warn("[FluentForms] getFormElementFromEventArg(): Kein gültiges Formular erkannt",r),null}removeErrors(r){const t=window.jQuery;if(!t||!r||!r.length)return;const o=r.attr("id")||"(unknown)";e.debug("[FluentForms] removeErrors() gestartet",o);try{r.find(".f12-captcha-error").remove(),r.find(".ff-el-is-error").removeClass("ff-el-is-error"),r.find(".ff_has_error").removeClass("ff_has_error"),r.find(".error.text-danger").remove(),r.find("div.error").remove(),r.parent().find(".ff-errors-in-stack").hide().empty();const n=r.attr("id");n&&(t(`#${n}_success`).remove(),t(`#${n}_errors`).html("")),r.find('[aria-invalid="true"]').attr("aria-invalid","false"),r.removeClass("ff_submitting ff_force_hide"),e.debug("[FluentForms] removeErrors() abgeschlossen",o)}catch(n){e.error("[FluentForms] Fehler in removeErrors()",n)}}showErrors(e,r){const t=window.jQuery;t&&r&&e&&e.errors&&(r.find(".f12-captcha-error").remove(),t.each(e.errors,function(e,t){const o=r.find(`[name="${e}"]`);o.length?(o.after(`<span class="f12-captcha-error ff-el-is-error">${t}</span>`),o.addClass("ff-el-is-error")):r.prepend(`<div class="f12-captcha-error ff-el-is-error">${t}</div>`)}))}patchFluentForms(r=0){const n=window.jQuery;if(!n)return r>=20?void e.warn("[FluentForms] jQuery nicht gefunden – patch deaktiviert"):(e.debug(`[FluentForms] jQuery noch nicht verfügbar – retry in 300ms (Versuch ${r+1}/20)`),setTimeout(()=>this.patchFluentForms(r+1),300));e.debug("[FluentForms] Registriere globalen submit-Interceptor"),n(document).on("submit","form.frm-fluent-form",r=>{const s=n(r.currentTarget),i=s[0],a=t(i);if(s.data("f12-captcha-in-progress"))return e.debug("[FluentForms] Submit bereits in Bearbeitung, blockiert",a),r.preventDefault(),r.stopImmediatePropagation(),!1;e.debug("[FluentForms] Intercepted native submit",a),r.preventDefault(),r.stopImmediatePropagation(),s.data("f12-captcha-in-progress",!0);o.emit("captcha:verifyRequested",{form:i,formId:a,originalEvent:r,continue:()=>{const r=(0,window.jQuery)(i),t=i.getAttribute("id");e.debug("[FluentForms] continueSubmit()",t),r.data("f12-captcha-in-progress",!1);try{const o=window.fluentFormApp(r);if(o&&"function"==typeof o.sendData){e.debug("[FluentForms] using fluentFormApp.sendData()",t);const n={data:r.serialize(),action:"fluentform_submit",form_id:r.data("form_id")};return o.sendData(r,n),void this.removeErrors(r)}e.warn("[FluentForms] Kein app.sendData() – fallback auf native Trigger",t),window.ff_sumitting_form=!1,r.trigger("submit")}catch(o){e.error("[FluentForms] Fehler beim continueSubmit()",o),i.submit()}}})}),n(document).on("fluentform_before_submit",r=>{if(n(null==r?void 0:r.target).closest("form.frm-fluent-form").data("f12-captcha-in-progress"))return e.debug("[FluentForms] fluentform_before_submit abgefangen (Captcha läuft)"),r.preventDefault(),r.stopImmediatePropagation(),!1})}registerFluentFormEvents(r=0){const n=window.jQuery;if(!n)return r>=20?void e.warn("[FluentForms] jQuery nicht gefunden – Events deaktiviert"):(e.debug(`[FluentForms] jQuery noch nicht verfügbar – retry in 300ms (Versuch ${r+1}/20)`),setTimeout(()=>this.registerFluentFormEvents(r+1),300));e.debug("[FluentForms] Registriere Event-Handler für submission_success & submission_failed"),n(document).on("fluentform_submission_success",(r,n,s)=>{const i=this.getFormElementFromEventArg(n),a=(null==s?void 0:s.response)||s;if(!i||!i.length)return void e.warn("[FluentForms] submission_success → kein gültiges Formularobjekt erkannt",n);const c=t(i[0]);e.debug("[FluentForms] fluentform_submission_success erkannt",c),this.removeErrors(i),o.emit("captcha:reloadRequested",{formId:c}),o.emit("captcha:fluent:success",{formId:c,form:i,response:a})}),n(document).on("fluentform_submission_failed",(r,n,s)=>{const i=this.getFormElementFromEventArg(n),a=(null==s?void 0:s.response)||s;if(!i||!i.length)return void e.warn("[FluentForms] submission_failed → kein gültiges Formularobjekt erkannt",n);const c=t(i[0]);e.debug("[FluentForms] fluentform_submission_failed erkannt",c,a),this.showErrors(a,i),o.emit("captcha:reloadRequested",{formId:c}),o.emit("captcha:fluent:error",{formId:c,form:i,response:a})})}};new class{constructor(){this.enabled=!1,o.on("captcha:component:enable",r=>{"ControllerGravityForms"===r&&(this.enabled=!0,e.debug("[GravityForms] Aktiviert durch component:enable"),this.register())})}register(){o.on("captcha:init",()=>{this.enabled&&(e.debug("[EventBus][GravityForms] captcha:init received"),this.registerGravityFormEvents(),this.initialScan(),this.patchGravityForms())}),o.on("captcha:gravity:error",({formId:r,form:t,response:o})=>{this.enabled&&(e.debug("[EventBus][GravityForms] captcha:gravity:error received",r,o),this.showErrors(o,t))}),o.on("captcha:gravity:success",({formId:r,form:t,response:o})=>{this.enabled&&(e.debug("[EventBus][GravityForms] captcha:gravity:success received",r,o),this.removeErrors(t))})}removeErrors(r){if(!window.jQuery||!r||!r.length)return;const t=r.attr("id")||"(unknown)";e.debug("[GravityForms] removeErrors() gestartet",t);try{r.find(".f12-captcha-error").remove(),r.find(".gfield_error").removeClass("gfield_error"),r.find(".validation_message").remove(),r.find(".validation_error").remove(),r.find('[aria-invalid="true"]').attr("aria-invalid","false"),e.debug("[GravityForms] removeErrors() abgeschlossen",t)}catch(o){e.error("[GravityForms] Fehler in removeErrors()",o)}}showErrors(e,r){const t=window.jQuery;t&&r&&e&&e.errors&&(r.find(".f12-captcha-error").remove(),t.each(e.errors,function(e,t){const o=r.find(`[name="${e}"]`);o.length?(o.after(`<div class="f12-captcha-error validation_message">${t}</div>`),o.closest(".gfield").addClass("gfield_error")):r.prepend(`<div class="f12-captcha-error validation_message">${t}</div>`)}))}handleReload(r,t=0){const n=(0,window.jQuery)(`#${r=`gform_${r}`}`);if(!n.length)return e.warn("[GravityForms] handleReload(): kein Formular gefunden (vermutlich nach DOM-Replace)",r),void(t<10?(e.debug(`[GravityForms] handleReload(): #gform_${r} nicht gefunden (Versuch ${t+1})`),setTimeout(()=>this.handleReload(r,t+1),300)):e.debug(`[GravityForms] handleReload(): #gform_${r} nicht gefunden (Versuch ${t+1})`));e.debug("[GravityForms] handleReload()",r),this.removeErrors(n),setTimeout(()=>{o.emit("captcha:reloadRequested",{formId:r}),o.emit("captcha:JavaScriptProtection:setStartTimeRequested",{formId:r})},150)}initialScan(){const r=window.jQuery;if(!r)return e.warn("[GravityForms] jQuery nicht verfügbar – initialScan übersprungen");r(document).ready(()=>{r(".gform_wrapper form").each((_,e)=>{var t;const o=(null==(t=r(e).attr("id"))?void 0:t.replace("gform_",""))||"(unknown)";this.handleReload(o)})})}registerGravityFormEvents(r=0){const t=window.jQuery;if(!t)return r>=20?e.warn("[GravityForms] jQuery nicht verfügbar – Events deaktiviert"):(e.debug(`[GravityForms] retry in 300ms (${r+1}/20)`),setTimeout(()=>this.registerGravityFormEvents(r+1),300));e.debug("[GravityForms] Registriere GF-Events"),t(document).on("gform_pre_submission",(r,n)=>{const s=t(`#gform_${n}`)[0];return e.debug("[GravityForms] gform_pre_submission",n),o.emit("captcha:verifyRequested",{form:s,formId:n,originalEvent:r,continue:()=>{e.debug("[GravityForms] continueSubmit()",n),HTMLFormElement.prototype.submit.call(s)}}),r.preventDefault(),r.stopImmediatePropagation(),!1}),t(document).on("gform_post_render gform_confirmation_loaded",(e,r)=>{this.handleReload(r)})}patchGravityForms(r=0){const n=window.jQuery;if(!n)return r>=20?e.warn("[GravityForms] jQuery nicht gefunden – Submit-Intercept deaktiviert"):(e.debug(`[GravityForms] jQuery noch nicht verfügbar – retry in 300ms (Versuch ${r+1}/20)`),setTimeout(()=>this.patchGravityForms(r+1),300));e.debug("[GravityForms] Registriere globalen Submit-Interceptor"),n(document).on("submit",'form[id^="gform_"]',r=>{const s=n(r.currentTarget),i=s[0],a=t(i);if(s.data("f12-captcha-in-progress"))return e.debug("[GravityForms] Submit bereits in Bearbeitung – blockiert",a),r.preventDefault(),r.stopImmediatePropagation(),!1;e.debug("[GravityForms] Intercepted native submit",a),r.preventDefault(),r.stopImmediatePropagation(),s.data("f12-captcha-in-progress",!0);o.emit("captcha:verifyRequested",{form:i,formId:a,originalEvent:r,continue:()=>{e.debug("[GravityForms] continueSubmit()",a),s.data("f12-captcha-in-progress",!1);try{if(window.gform&&window.gform.submit)return e.debug("[GravityForms] using gform.submit()",a),void window.gform.submit(a);e.warn("[GravityForms] Kein gform.submit() – fallback auf native submit()",a),HTMLFormElement.prototype.submit.call(i)}catch(r){e.error("[GravityForms] Fehler beim continueSubmit()",r),HTMLFormElement.prototype.submit.call(i)}}})})}};new class{constructor(){this.enabled=!1,o.on("captcha:component:enable",r=>{"ControllerWPForms"===r&&(this.enabled=!0,e.debug("[WPForms] Aktiviert durch component:enable"),this.register())})}register(){o.on("captcha:init",()=>{this.enabled&&(e.debug("[WPForms] captcha:init received"),this.registerHooks(),this.observeAjax())})}registerHooks(r=0){const n=window.jQuery;if(!window.wpforms||!window.jQuery)return r>=20?void e.warn("[WPForms] wpforms nicht gefunden – Hooks deaktiviert"):(e.debug(`[WPForms] retry in 300ms (${r+1}/20)`),setTimeout(()=>this.registerHooks(r+1),300));e.debug("[WPForms] Registriere Event-Hooks"),n(document).on("wpformsBeforeFormSubmit",(r,s)=>{const i=n(s),a=t(s);if(e.debug("[WPForms] wpformsBeforeFormSubmit",a),1===i.data("ssManualSubmit"))return e.debug("[WPForms] Bypass aktiv → normaler Submit",a),void i.data("ssManualSubmit",0);r.preventDefault(),r.stopImmediatePropagation();o.emit("captcha:verifyRequested",{form:s,formId:a,originalEvent:r,continue:()=>{e.debug("[WPForms] Captcha OK → Weiter mit Original-Submit",a),i.data("ssManualSubmit",1),window.wpforms.formSubmit(s)}})}),n(document).on("wpformsAjaxSubmitSuccess",(r,s)=>{const i=n(r.target).closest("form.wpforms-form"),a=t(i[0]);e.debug("[WPForms] AJAX success",a,s),o.emit("captcha:wpforms:success",{formId:a,form:i,response:s}),o.emit("captcha:reloadRequested",{formId:a})}),n(document).on("wpformsAjaxSubmitFailed",(r,s)=>{const i=n(r.target).closest("form.wpforms-form"),a=t(i[0]);e.debug("[WPForms] AJAX failed",a,s),o.emit("captcha:wpforms:error",{formId:a,form:i,response:s}),o.emit("captcha:reloadRequested",{formId:a})})}observeAjax(r=0){const n=window.jQuery;if(!window.jQuery)return r>=20?void e.warn("[WPForms] jQuery nicht gefunden – ajaxComplete deaktiviert"):setTimeout(()=>this.observeAjax(r+1),300);n(document).ajaxComplete((r,s,i)=>{try{const r=JSON.parse(s.responseText);if(!r||void 0===r.success)return;const a=n((null==i?void 0:i.context)||"form.wpforms-form");if(!a||!a.length)return void e.debug("[WPForms] Kein Formular im Context gefunden → Event abgebrochen");const c=a[0];if(!(c&&c instanceof HTMLFormElement))return void e.debug("[WPForms] Ungültiges Form-Element → Event abgebrochen",c);const m=t(c);if(!m)return void e.debug("[WPForms] Konnte keine gültige formId ermitteln → Event abgebrochen");o.emit("captcha:reloadRequested",{formId:m})}catch(a){e.debug("[WPForms] AJAX Response konnte nicht geparst werden – ignoriert",a)}})}};new class{constructor(){this.enabled=!1,o.on("captcha:component:enable",r=>{"ControllerWoocommerceLogin"!==r&&"ControllerWoocommerceRegistration"!==r||this.enabled||(this.enabled=!0,e.debug("[WooCommerceForms] Aktiviert durch component:enable"),this.register())})}register(){o.on("captcha:init",()=>{this.enabled&&(e.debug("[EventBus][WooCommerceForms] captcha:init received"),this.registerSubmitInterceptor(),this.observeAjaxResponses())}),o.on("captcha:woocommerce:error",({formId:r,form:t,response:o})=>{this.enabled&&(e.debug("[WooCommerceForms] captcha:woocommerce:error received",r,o),this.showErrors(o,t))}),o.on("captcha:woocommerce:success",({formId:r,form:t,response:o})=>{this.enabled&&(e.debug("[WooCommerceForms] captcha:woocommerce:success received",r,o),this.removeErrors(t))})}removeErrors(e){e.find(".f12-captcha-error").remove(),e.find(".woocommerce-error, .woocommerce-message").removeClass("fusion-form-error")}showErrors(e,r){e&&e.errors&&(r.find(".f12-captcha-error").remove(),jQuery.each(e.errors,function(e,t){const o=r.find(`[name="${e}"]`);o.length?(o.after('<div class="f12-captcha-error woocommerce-error">'+t+"</div>"),o.addClass("fusion-form-error")):r.prepend('<div class="f12-captcha-error woocommerce-error">'+t+"</div>")}))}observeAjaxResponses(r=0){if(!window.jQuery)return r>=20?void e.warn("[WooCommerceForms] jQuery nicht gefunden – observeAjaxResponses deaktiviert"):setTimeout(()=>this.observeAjaxResponses(r+1),300);const t=window.jQuery;e.debug("[WooCommerceForms] Registriere globales ajaxComplete-Event"),t(document).ajaxComplete((r,n,s)=>{try{const r=JSON.parse(n.responseText);if(!r||!r.status)return;const i=t((null==s?void 0:s.context)||"form.woocommerce-form, form.checkout");"error"===r.status&&r.errors&&(e.debug("[WooCommerceForms] AJAX error → Captcha-Reload ausgelöst"),o.emit("captcha:woocommerce:error",{formId:i.attr("id"),form:i,response:r}),o.emit("captcha:reloadRequested",{formId:i.attr("id")})),"success"===r.status&&(o.emit("captcha:woocommerce:success",{formId:i.attr("id"),form:i,response:r}),e.debug("[WooCommerceForms] AJAX success → Fehler entfernt"))}catch(i){}})}registerSubmitInterceptor(r=0){if(!window.jQuery)return r>=20?void e.warn("[WooCommerceForms] jQuery nicht gefunden – Events deaktiviert"):setTimeout(()=>this.registerSubmitInterceptor(r+1),300);const n=window.jQuery;e.debug("[WooCommerceForms] Registriere Submit-Interceptor für WooCommerce"),n(document).on("submit","form.woocommerce-form",r=>{const s=r.currentTarget;n(s).data("f12-submit-finished",!0);const i=t(s);n(s).data("captcha-verified")?n(s).data("captcha-verified",!1):(e.debug("[WooCommerceForms] Intercepted WooCommerce submit",i),o.emit("captcha:verifyRequested",{form:s,formId:i,originalEvent:r,continue:()=>{e.debug("[WooCommerceForms] Captcha verified → continue native submit",i),n(s).data("captcha-verified",!0);const r=s.querySelector('[type="submit"]:not([disabled])')||s.querySelector("button:not([disabled])");r?(e.debug("[WooCommerceForms] Trigger submit button click()",i),r.click()):(e.debug("[WooCommerceForms] Kein sichtbarer Submit-Button → native submit()",i),HTMLFormElement.prototype.submit.call(s)),setTimeout(()=>{if(!n(s).data("f12-submit-finished")){e.debug("[WooCommerceForms] Fallback → erzwinge native submit()",i);try{HTMLFormElement.prototype.submit.call(s)}catch(r){e.error("[WooCommerceForms] Fehler bei fallback submit()",r)}}},500)}}))})}};new class{constructor(){this.enabled=!1,o.on("captcha:component:enable",r=>{"ControllerWoocommerceCheckout"===r&&(this.enabled=!0,e.debug("[WooCommerceCheckoutForm] Aktiviert durch component:enable"),this.register())})}register(){o.on("captcha:init",()=>{this.enabled&&(e.debug("[EventBus][WooCommerceCheckoutForm] captcha:init received"),this.registerCheckoutInterceptor(),this.observeAjaxResponses())}),o.on("captcha:woocommerce:error",({formId:r,form:t,response:o})=>{this.enabled&&(e.debug("[WooCommerceCheckoutForm] captcha:woocommerce:error received",r,o),this.showErrors(o,t))}),o.on("captcha:woocommerce:success",({formId:r,form:t,response:o})=>{this.enabled&&(e.debug("[WooCommerceCheckoutForm] captcha:woocommerce:success received",r,o),this.removeErrors(t))})}removeErrors(e){e.find(".f12-captcha-error").remove(),e.find(".woocommerce-error, .woocommerce-message").removeClass("fusion-form-error")}showErrors(e,r){e&&e.errors&&(r.find(".f12-captcha-error").remove(),jQuery.each(e.errors,function(e,t){const o=r.find(`[name="${e}"]`);o.length?(o.after(`<div class="f12-captcha-error woocommerce-error">${t}</div>`),o.addClass("fusion-form-error")):r.prepend(`<div class="f12-captcha-error woocommerce-error">${t}</div>`)}))}injectJsTimestampsIntoBody(e){const r=String(Date.now()/1e3),t=document.querySelector("form.checkout"),o=null==t?void 0:t.querySelector('[name="js_start_time"]'),n=(null==o?void 0:o.value)||r;return e instanceof FormData?(e.get("js_end_time")||e.set("js_end_time",r),e.get("js_start_time")||e.set("js_start_time",n)):"string"==typeof e&&(/(?:^|&)js_end_time=(?=&|$)/.test(e)?e=e.replace(/((?:^|&)js_end_time)=(?=&|$)/,`$1=${encodeURIComponent(r)}`):e.includes("js_end_time=")||(e+=`&js_end_time=${encodeURIComponent(r)}`),/(?:^|&)js_start_time=(?=&|$)/.test(e)?e=e.replace(/((?:^|&)js_start_time)=(?=&|$)/,`$1=${encodeURIComponent(n)}`):e.includes("js_start_time=")||(e+=`&js_start_time=${encodeURIComponent(n)}`)),e}injectJsTimestamps(e){const r=e[1];return r&&r.body&&(r.body=this.injectJsTimestampsIntoBody(r.body)),e}observeAjaxResponses(r=0){var t;if(!document.querySelector("form.checkout"))return void e.debug("[WooCommerceCheckoutForm] Kein <form.checkout> gefunden → skip observeAjaxResponses");const n=this,s=e=>{try{const r=new URL(e,location.href);return"checkout"===r.searchParams.get("wc-ajax")||(!(!r.pathname.includes("/wp-json/wc/store/")&&!r.pathname.includes("/wp-json/wc/v3/"))||!(!r.pathname.endsWith("/admin-ajax.php")||!(r.searchParams.get("action")||"").includes("checkout")))}catch{return!1}},i=(r,t="unknown")=>{const n=window.jQuery?jQuery("form.checkout"):null,s=null==n?void 0:n.attr("id");if(r&&"object"==typeof r&&("result"in r||"redirect"in r||"messages"in r)){if("failure"===r.result||r.messages)return e.debug(`[WooCommerceCheckoutForm] ${t} classic → FAILURE`,r),o.emit("captcha:woocommerce:error",{formId:s,form:n,response:r}),void o.emit("captcha:reloadRequested",{formId:s});if("success"===r.result||r.redirect)return e.debug(`[WooCommerceCheckoutForm] ${t} classic → SUCCESS`,r),void o.emit("captcha:woocommerce:success",{formId:s,form:n,response:r})}if(r&&"object"==typeof r&&("status"in r||"code"in r||"message"in r)){return"error"===r.status||r.code||r.data&&r.data.status>=400?(e.debug(`[WooCommerceCheckoutForm] ${t} store-api → ERROR`,r),o.emit("captcha:woocommerce:error",{formId:s,form:n,response:r}),void o.emit("captcha:reloadRequested",{formId:s})):(e.debug(`[WooCommerceCheckoutForm] ${t} store-api → SUCCESS`,r),void o.emit("captcha:woocommerce:success",{formId:s,form:n,response:r}))}e.debug(`[WooCommerceCheckoutForm] ${t} unbekanntes Format – keine Aktion`,r)};if(!window._f12FetchPatched){const r=null==(t=window.fetch)?void 0:t.bind(window);r?(window.fetch=async(...t)=>{try{const o=t[0],a="string"==typeof o?o:(null==o?void 0:o.url)||"";s(a)&&(t=n.injectJsTimestamps(t));const c=await r(...t);if(s(a)){const r=c.clone();let t="";try{t=await r.text()}catch{}let o=null;try{o=t?JSON.parse(t):null}catch{}o?i(o,"fetch/json"):t&&t.includes("woocommerce-error")?i({result:"failure",messages:t},"fetch/html"):e.debug("[WooCommerceCheckoutForm] fetch response (kein JSON, kein WC-HTML)",{snippet:null==t?void 0:t.slice(0,200)})}return c}catch(o){return e.warn("[WooCommerceCheckoutForm] fetch interception error",o),await(window.fetch?window.fetch(...t):Promise.reject(o))}},window._f12FetchPatched=!0,e.debug("[WooCommerceCheckoutForm] fetch() interception aktiv")):e.debug("[WooCommerceCheckoutForm] fetch() nicht verfügbar – überspringe fetch patch")}if(!window._f12XhrPatched&&window.XMLHttpRequest){const r=window.XMLHttpRequest,t=r.prototype.open,o=r.prototype.send;r.prototype.open=function(e,r,...o){return this._f12url=r,t.apply(this,[e,r,...o])},r.prototype.send=function(r){return s(this._f12url)&&(r=n.injectJsTimestampsIntoBody(r),this.addEventListener("readystatechange",()=>{if(4===this.readyState)try{const t=this.getResponseHeader("Content-Type")||"",o=this.responseText||"";if(t.includes("application/json"))try{const e=JSON.parse(o);i(e,"xhr/json")}catch(r){e.debug("[WooCommerceCheckoutForm] xhr JSON parse fail",r)}else o.includes("woocommerce-error")?i({result:"failure",messages:o},"xhr/html"):e.debug("[WooCommerceCheckoutForm] xhr response (kein JSON, kein WC-HTML)",{snippet:o.slice(0,200)})}catch(r){e.warn("[WooCommerceCheckoutForm] xhr interception error",r)}})),o.apply(this,[r])},window._f12XhrPatched=!0,e.debug("[WooCommerceCheckoutForm] XMLHttpRequest interception aktiv")}}registerCheckoutInterceptor(r=0){if(!window.jQuery)return r>=20?void e.warn("[WooCommerceCheckoutForm] jQuery nicht gefunden – Events deaktiviert"):setTimeout(()=>this.registerCheckoutInterceptor(r+1),300);const n=window.jQuery;e.debug("[WooCommerceCheckoutForm] Registriere Click-Interceptor für #place_order"),n(document).off("click.f12Captcha","form.checkout #place_order"),n(document).on("click.f12Captcha","form.checkout #place_order",r=>{const s=r.currentTarget.closest("form.checkout"),i=n(s),a=t(s);if(i.data("captcha-verified"))return i.removeData("captcha-verified"),e.debug("[WooCommerceCheckoutForm] Captcha bereits validiert → WooCommerce darf fortfahren",a),!0;r.preventDefault(),r.stopImmediatePropagation(),e.debug("[WooCommerceCheckoutForm] Klick auf #place_order abgefangen → CAPTCHA prüfen",a),o.emit("captcha:verifyRequested",{form:s,formId:a,originalEvent:r,continue:()=>{i.data("captcha-verified",!0),e.debug("[WooCommerceCheckoutForm] Captcha OK → löse Button-Klick erneut aus",a);const t=new MouseEvent("click",r);s.querySelector("#place_order").dispatchEvent(t)}})})}};new class{constructor(){this.enabled=!1,o.on("captcha:component:enable",r=>{"ControllerWordpressLogin"===r&&(this.enabled||(this.enabled=!0,e.debug("[WordPressLoginForms] Aktiviert durch component:enable"),this.register()))})}register(){o.on("captcha:init",()=>{this.enabled&&(e.debug("[WordPressLoginForms] captcha:init received"),this.registerSubmitInterceptor(),this.observeAjaxResponses())}),o.on("captcha:wp-login:error",({formId:e,form:r,response:t})=>{this.enabled&&this.showErrors(t,r)}),o.on("captcha:wp-login:success",({formId:e,form:r,response:t})=>{this.enabled&&this.removeErrors(r)})}removeErrors(e){e.querySelectorAll(".f12-captcha-error").forEach(e=>e.remove())}showErrors(e,r){e&&e.errors&&(this.removeErrors(r),Object.entries(e.errors).forEach(([e,t])=>{const o=r.querySelector(`[name="${e}"]`);if(o){const e=document.createElement("div");e.className="f12-captcha-error",e.style.color="#d63638",e.style.marginTop="5px",e.innerHTML=t,o.insertAdjacentElement("afterend",e)}else{const e=document.createElement("div");e.className="f12-captcha-error",e.style.color="#d63638",e.style.marginBottom="10px",e.innerHTML=t,r.prepend(e)}}))}observeAjaxResponses(){}registerSubmitInterceptor(){e.debug("[WordPressLoginForms] Registriere Submit-Interceptor"),document.addEventListener("submit",r=>{const n=r.target.closest("form#loginform");if(!n)return;const s=t(n);n.dataset.captchaVerified?delete n.dataset.captchaVerified:(e.debug("[WordPressLoginForms] Intercepted WP login submit",s),r.preventDefault(),r.stopImmediatePropagation(),o.emit("captcha:verifyRequested",{form:n,formId:s,originalEvent:r,continue:()=>{e.debug("[WordPressLoginForms] Captcha verified → continue submit",s),n.dataset.captchaVerified="1";const r=n.querySelector('[type="submit"]');r?r.click():n.submit(),setTimeout(()=>{if(!n.dataset.submitFinished){e.debug("[WordPressLoginForms] Fallback → native submit()",s);try{n.submit()}catch(r){e.error("[WordPressLoginForms] fallback submit error",r)}}},300)}}))})}};new class{constructor(){this.enabled=!1,o.on("captcha:component:enable",r=>{"ControllerWordpressRegistration"===r&&(this.enabled||(this.enabled=!0,e.debug("[WordPressRegistrationForms] Aktiviert durch component:enable"),this.register()))})}register(){o.on("captcha:init",()=>{this.enabled&&(e.debug("[WordPressRegistrationForms] captcha:init received"),this.registerSubmitInterceptor(),this.observeAjaxResponses())}),o.on("captcha:wp-registration:error",({formId:e,form:r,response:t})=>{this.enabled&&this.showErrors(t,r)}),o.on("captcha:wp-registration:success",({formId:e,form:r,response:t})=>{this.enabled&&this.removeErrors(r)})}removeErrors(e){e.querySelectorAll(".f12-captcha-error").forEach(e=>e.remove())}showErrors(e,r){e&&e.errors&&(this.removeErrors(r),Object.entries(e.errors).forEach(([e,t])=>{const o=r.querySelector(`[name="${e}"]`);if(o){const e=document.createElement("div");e.className="f12-captcha-error",e.style.color="#d63638",e.style.marginTop="5px",e.innerHTML=t,o.insertAdjacentElement("afterend",e)}else{const e=document.createElement("div");e.className="f12-captcha-error",e.style.color="#d63638",e.style.marginBottom="10px",e.innerHTML=t,r.prepend(e)}}))}observeAjaxResponses(){}registerSubmitInterceptor(){e.debug("[WordPressRegistrationForms] Registriere Submit-Interceptor"),document.addEventListener("submit",r=>{const n=r.target.closest("form#registerform");if(!n)return;const s=t(n);n.dataset.captchaVerified?delete n.dataset.captchaVerified:(e.debug("[WordPressRegistrationForms] Intercepted WP login submit",s),r.preventDefault(),r.stopImmediatePropagation(),o.emit("captcha:verifyRequested",{form:n,formId:s,originalEvent:r,continue:()=>{e.debug("[WordPressRegistrationForms] Captcha verified → continue submit",s),n.dataset.captchaVerified="1";const r=n.querySelector('[type="submit"]');r?r.click():n.submit(),setTimeout(()=>{if(!n.dataset.submitFinished){e.debug("[WordPressRegistrationForms] Fallback → native submit()",s);try{n.submit()}catch(r){e.error("[WordPressRegistrationForms] fallback submit error",r)}}},300)}}))})}},window.f12cf7captcha_cf7={logger:e,reloadAllCaptchas:function(){e.debug("Reload all Captchas"),o.emit("captcha:reloadAllRequested")},init:function(){this.logger.log("Init gestartet");(window.f12_cf7_captcha&&f12_cf7_captcha.components||[]).forEach(r=>{e.debug(`[Init] Aktiviere Komponente: ${r}`),o.emit("captcha:component:enable",r)}),document.addEventListener("DOMContentLoaded",()=>{e.debug("DOM ready -> init all forms"),document.querySelectorAll("form").forEach(r=>{const n=t(r);void 0!==o&&o.emit("captcha:initForm",{form:r,formId:n}),e.debug("Form initialized",n)}),o.emit("captcha:init")}),document.addEventListener("click",r=>{if(!(r.target.closest(".cf7.captcha-reload")||r.target.closest(".c-reload")))return;e.debug("Reload-Button geklickt",r.target),r.preventDefault(),r.stopPropagation();const n=r.target.closest(".f12-captcha");if(!n)return void e.error("Kein Captcha-Container gefunden");const s=n.querySelector(".f12c");if(!s||!s.id)return void e.error("Kein Captcha-Input mit ID gefunden");const i=s.id;e.debug("Captcha-Input-ID gefunden",i);const a=r.target.closest("form");if(!a)return void e.error("Kein Formular für Captcha gefunden");const c=t(a);e.debug("Formular-ID",c),o.emit("captcha:reloadRequested",{formId:c,captchaInputId:i})})}},window.f12cf7captcha_cf7.init()}();
  • captcha-for-contact-form-7/trunk/f12-cf7-captcha.php

    r3465567 r3465729  
    44 * Plugin URI: https://www.forge12.com/product/wordpress-captcha/
    55 * Description: SilentShield is an all-in-one spam protection plugin. Protects WordPress login, registration, comments, and popular form plugins (CF7, WPForms, Elementor, WooCommerce) with captcha, honeypot, blacklist, IP blocking, and whitelisting for logged-in users.
    6  * Version: 2.3.4
     6 * Version: 2.3.5
    77 * Requires PHP: 7.4
    88 * Author: Forge12 Interactive GmbH
     
    1414
    1515
    16 define( 'FORGE12_CAPTCHA_VERSION', '2.3.4' );
     16define( 'FORGE12_CAPTCHA_VERSION', '2.3.5' );
    1717define( 'FORGE12_CAPTCHA_SLUG', 'f12-cf7-captcha' );
    1818define( 'FORGE12_CAPTCHA_BASENAME', plugin_basename( __FILE__ ) );
Note: See TracChangeset for help on using the changeset viewer.