(function () {
try {
// AQ-r2 (2026-06-09): respect the explicit-denial sentinel
// written by cookie-consent-harden.js writeATR() on any
// marketing-axis denial (payload.marketing === false; cycle-3 F1).
// Without this gate, the next page navigation re-creates
// gmx_first_touch from the current URL+referrer+utm_*+click_ids,
// silently undoing the reject-all deletion (sweep finding #1).
// The sentinel is cleared the moment the visitor grants
// marketing in the banner (analytics-only grant does NOT
// clear), restoring the writer path on the very next
// page load. Page-cache-safe: the sentinel is a
// browser-resident cookie checked in the inline script, so
// varnish/breeze-served HTML still hits this gate.
if (/(?:^|;\s*)gmx_consent_denied=1(?:;|$)/.test(document.cookie || '')) return;
var CLICK_IDS = ['gclid','fbclid','msclkid','ttclid','wbraid','gbraid','li_fat_id'];
var qs = new URLSearchParams(window.location.search);
var urlClickIdKey = null;
for (var i = 0; i < CLICK_IDS.length; i++) {
if (qs.get(CLICK_IDS[i])) { urlClickIdKey = CLICK_IDS[i]; break; }
}// Parse existing cookie.
var existing = null;
var match = document.cookie.match(/(?:^|;\s*)gmx_first_touch=([^;]+)/);
if (match) {
try { existing = JSON.parse(decodeURIComponent(match[1])); } catch (e) { existing = null; }
}// GWP-273 — referrer-enrichment branch.
// Keep existing unless either (a) URL carries a new click id
// the stored payload lacks (paid click is a higher-value
// signal and upgrades direct/organic), OR (b) the stored
// payload has empty referrer AND the current document.referrer
// is non-empty + external (Safari/ITP/policy-quirk catch:
// first-hit may have missed the referrer; later same-session
// page-loads can recover it).
var existingHasRef = !!(existing && existing.referrer && existing.referrer !== '');
var docRef = document.referrer || '';
var refHost = '';
if (docRef) {
try {
refHost = new URL(docRef).hostname.replace(/^www\./, '').toLowerCase();
} catch (e) { refHost = ''; }
}
var ownHost = (location.host || '').replace(/^www\./, '').toLowerCase();
var currentExternalRef = !!(refHost && refHost !== ownHost);
var canEnrichRef = !!existing && !existingHasRef && currentExternalRef;if (existing) {
if (!urlClickIdKey && !canEnrichRef) return;
if (urlClickIdKey && existing[urlClickIdKey] && !canEnrichRef) return;
}var utm_keys = [
'utm_source','utm_medium','utm_campaign','utm_content','utm_term',
'utm_adgroup','utm_matchtype','utm_network','utm_device','utm_placement'
];
// GWP-273 — merge-preserving base. When enriching an existing
// payload, retain its landing_url + ts + prior click ids /
// utms; only overlay referrer (and any click id appended below
// via the forEach). Branches with/without urlClickIdKey were
// collapsed — both produced the identical Object.assign — the
// click id is added uniformly later.
//
// GWP-273 design choice: "latest external referrer wins" —
// accepted edge case where a user opens a new external tab
// post-empty-first-touch and returns; low-volume, simple, no
// sentinel flag needed.
var data;
if (existing && canEnrichRef) {
data = Object.assign({}, existing, { referrer: docRef });
} else {
data = { landing_url: window.location.href, referrer: docRef, ts: Date.now() };
}
utm_keys.concat(CLICK_IDS).forEach(function (k) {
var v = qs.get(k);
if (v) data[k] = v;
});
var encoded = encodeURIComponent(JSON.stringify(data));
if (encoded.length > 3800) return;
var expires = new Date(Date.now() + 90 * 864e5).toUTCString(); // GWP-143 C1: match Google Ads 90-day attribution window
var secure = window.location.protocol === 'https:' ? '; Secure' : '';
document.cookie = 'gmx_first_touch=' + encoded + '; Path=/; Expires=' + expires + '; SameSite=Lax' + secure;
} catch (e) {}
})();
var breeze_prefetch = {"local_url":"https://gomixapp.co.il","ignore_remote_prefetch":"1","ignore_list":["/cart/","/checkout/","/my-account/","/(.)/u05d4u05d8u05d5u05e4u05e1-u05e0u05e9u05dcu05d7-u05d1u05d4u05e6u05dcu05d7u05d4/","wp-admin","wp-login.php"]};
//# sourceURL=breeze-prefetch-js-extra
צריכים מערכת שילוט דיגיטלי? לפרטים ושיחה עם נציג מלאו פרטים ונחזור אליכם
שירותי תוכן והפקה לשילוט דיגיטלי לעסקים, חברות וארגונים
לקמעונאות, שיווק ופרסום
שילוט דיגיטלי עם תוכן AI הוא הפתרון המהיר ביותר להפוך מסכים פסיביים לכלי מכירה עוצמתי. בנקודת המכירה, המערכת ממירה תמונת מוצר רגילה לסרטון יוקרתי – אדים עולים מכוס קפה חמה, תכשיט מנצנץ, דוגמן בתנועה. כך צופים הופכים לקונים, ישירות מול המדף, ובעלות הפקה נמוכה פי כמה מהפקה קונבנציונלית.
התוצאות מוכחות: הגדלת זמן השהייה מול המדף, עלייה ברכישות ספונטניות, וחיסכון משמעותי בעלויות לעומת הפקה קונבנציונלית. נכון ל-2026, יותר מ-300 חברות ישראליות כבר מפעילות מסכים דיגיטליים חכמים בחנויות ובמשרדים בעזרת מערכת GoMixApp.
למשאבי אנוש ותקשורת פנים-ארגונית
שילוט דיגיטלי לעסקים הוא ערוץ התקשורת החזק ביותר במסדרונות הארגון – בתנאי שהתוכן מרתק. מערכת שילוט דיגיטלי חכמה יוצרת תכנים לשילוט דיגיטלי פנים-ארגוניים שמחברים עובדים לחזון ולערכי החברה בצורה ויזואלית ומשפיעה. גלו גם את הפתרונות הדיגיטליים למשאבי אנוש שמשלימים את חווית העובד.
שימושים מובילים: סרטוני הוקרה לעובדים מצטיינים, הצגת יעדי חברה בגרפיקה דינמית, וקמפיינים פנימיים שמחזקים תרבות ארגונית ומחברים עובדים גם בסניפים מרוחקים – כולם מופקים בבינה מלאכותית ללא צורך בצוות הפקה.
לחברות ניהול נדל"ן ומגדלי יוקרה
הלובי הוא כרטיס הביקור של הבניין. מסכי LED ו-LCD חכמים עם ארט-וידאו מתחלף, עדכוני קהילה מעוצבים ותוכן יוקרתי מותאם אישית – הופכים כל כניסה לחוויה ברמה של לובי מלון בוטיק. מערכת ניהול תוכן דיגיטלי (CMS) מתקדמת מאפשרת עדכון תוכן בזמן אמת מכל מקום בעולם.
הפתרון מייצר תדמית יוקרתית לנכס, משפר את שביעות הרצון של הדיירים בתקשורת מודרנית, ומעביר מסרים בזמן אמת בהתאם לצרכי הדיירים.
חבילות תוכן גמישות
הצרכים שלכם משתנים מחודש לחודש – ולכן אין צורך להתחייב למנוי חודשי קבוע. ב-GoMixApp רוכשים חבילת שירותי תוכן דיגיטלי ומנצלים אותה בקצב ובעיתוי שמתאים לעסק, בגמישות מלאה. החבילות מתחילות ברמת כניסה נוחה ומגיעות לפתרונות ארגוניים מקיפים – כולל AI ליצירת וידאו, הנפשות ועיצוב גרפי ממוחשב.
היתרונות
מקסימום אימפקט ומעורבות צופים
תוכן וידאו ואנימציה מגדיל את תשומת הלב ב-400% לעומת תמונה סטטית ומבטיח שהמסר ייזכר לאורך זמן.
התייעלות תקציבית וחיסכון במשאבים
חוסכים את עלויות ימי הצילום וההפקה בעזרת AI, ומקבלים תוצאה של מותג-על במחיר נגיש.
ויזואליה ברמה של מותגי-על
הופכים תמונות סטטיות לוידאו פוטו-ריאליסטי יוקרתי (כמו אדים עולים מקפה) שמשדרג את המותג.
גמישות מלאה ללא התחייבות
עבודה בשיטת "בנק תוכן" ללא מנוי מחייב, לניצול לפי הצורך העסקי.
שילוב מנצח: בקרת איכות אנושית וטכנולוגיה
שילוב בין AI לבין מעצבים אנושיים מבטיח דיוק מותגי ונראות מושלמת בכל תוכן.
מהירות תגובה בזמן אמת
מגיבים למתחרים או לאירועים אקטואליים תוך שעות ספורות, במקום לחכות שבועות לעריכה.
מקרי לקוח, תוכן AI לשילוט דיגיטלי
דוגמאות ליצירת תכנים עם AI
שתי דוגמאות לתוכן ויזואלי שהפקנו באמצעות בינה מלאכותית עבור מסכי שילוט דיגיטליים — תפריט דיגיטלי ופרסום ויזואלי בחנות קמעונאית.
תוכן AI לתפריט דיגיטלי
תוכן ויזואלי שנוצר בעזרת בינה מלאכותית להצגת תפריט מסעדה על מסך שילוט דיגיטלי — תמונות מוצרים, מחירים ומבצעים מתחלפים אוטומטית.
תוכן AI לפרסום בחנות
תוכן ויזואלי שנוצר בעזרת AI לפרסום מוצרים על מסכי שילוט בחנות קמעונאית — קמפיינים ויזואליים מותאמים לעונה ולקהל היעד.
מקרי לקוח, תוכן AI לשילוט דיגיטלי
עוד דוגמאות לתוכן AI ויזואלי
שתי דוגמאות נוספות לתוכן AI על מסכי שילוט דיגיטליים — קמפיין פרסום על מסך LED ועמדת מידע אינטראקטיבית.
תוכן AI למסך LED
תוכן ויזואלי איכותי שהופק בבינה מלאכותית לקמפיין פרסום על מסך LED — אנימציות, גרפיקה ומסרים שיווקיים מותאמים.
תוכן AI לעמדת מידע
תוכן ויזואלי שנוצר ב-AI לעמדות מידע אינטראקטיביות — מצגות, אנימציות הסבר וגרפיקה דינמית שמושכת את עין המשתמש.
מה אפשר ליצור למסכים באמצעות AI?
פרזנטורים וירטואליים
יצירת תמונות
הפקת וידאו ב-AI
קריינות וסאונד
הנפשת תמונות סטטיות
רקעי אווירה ונוף
סרטוני מבצעים ומכר
תכנים לשבת, חגים ומועדים
התאמה לכל פורמט ורזולוציה – עומד, שוכב או מותאם אישית
בין אם מדובר במסך טלוויזיה סטנדרטי, טוטם אנכי, קיר LED במידות מיוחדות, או מסכנים דיגיטליים לחנויות בפורמטים שונים – המערכת מתאימה את התוכן לכל רזולוציה ויחס גובה-רוחב. כך כל שטח המסך מנוצל במלואו, תוך עמידה בתקנים בתעשיית השילוט הבינלאומיים.
פתרון קריינות AI כולל קריינות מקצועית ומוזיקת רקע שתואמת לאווירת המותג, בעברית, ערבית ואנגלית. שילוב הממד הקולי מעלה את מעורבות הקהל ב-46% בממוצע, לפי נתוני מחקרי שילוט דיגיטלי. זהו אחד מהיתרונות הבולטים של הפקת וידאו בינה מלאכותית לעומת הפקה מסורתית.
עיצוב פסקול וקריינות
שילוט דיגיטלי הוא לא רק ויזואלי. המערכת שלנו יודעת להפיק קריינות מקצועית ומוזיקת רקע שתואמת לאווירה, כדי שהמסר שלכם יישמע ברור – בין אם זה כרוז במבנה או מוזיקת אווירה נעימה בלובי.
לקוחות ממליצים
פנחס
ועד בית, רמלה
שירות:
★★★★★
מוצר:
★★★★★
המלצה:
★★★★★
"עם הסרטונים לחגים פשוט שיחקתם אותה – הדיירים ממש התלהבו!"
מור
מוסד אקדמי
שירות:
★★★★★
מוצר:
★★★★★
המלצה:
★★★★★
"לוח המודעות הדיגיטלי נראה מדהים, והכל עובד חלק!"
ענבר שמואלי
בעלת עסק
שירות:
★★★★★
מוצר:
★★★★★
המלצה:
★★★★★
"שרות אישי ומקצועי, מענה מהיר, מוצר מעולה, מרוצה מאוד"
הגיע הזמן לרענן את המסכים שלכם עם תוכן AI למסכים שמושך את העין
המסך יפה – אבל מה עם התוכן? עברו משקופיות סטטיות ומשעממות לתוכן וידאו דינמי ומודרני שמופק בבינה מלאכותית, שגורם לאנשים לעצור ולהסתכל. מסכנים דיגיטליים לחנויות ולמשרדים הפועלים עם תוכן חכם מגדילים מעורבות לקוחות בעשרות אחוזים.
צרו קשר עכשיו ונחזור אליכם עם מידע נוסף על יצירת תכנים לשילוט דיגיטלי בבינה מלאכותית!
רוצים לראות את הפתרון בפעולה? צפו בדוגמאות הפקת תוכן ויזואלי בבינה מלאכותית ובחרו חבילה שמתאימה לכם.
בין לקוחותינו
צריכים מערכת שילוט דיגיטלי? לפרטים ושיחה עם נציג מלאו פרטים ונחזור אליכם
למה עסקים בוחרים בהפקת תוכן חכם למסכים?
הפקת וידאו בינה מלאכותית מאפשרת לכל עסק – קמעונאי, ארגוני או מוסדי – ליצור תכנים ויזואליים ברמת שידור תוך שעות, ללא צוות הפקה ובעלות נמוכה משמעותית. בניגוד להפקה קונבנציונלית, עדכון התוכן מתבצע בזמן אמת דרך מערכת ניהול תוכן דיגיטלי (CMS) מרכזית – ניהול מרחוק של מסכים דיגיטליים מכל מקום בעולם.
יתרונות המפתח של מערכת שילוט דיגיטלי מבוססת AI:
עלות נמוכה של הפקת תוכן – חיסכון של עד 80% לעומת הפקה מסורתית
עדכון תוכן בזמן אמת – שינוי מסרים, מחירים ומבצעים תוך דקות
התאמה אישית לקהל יעד – תוכן שונה לשעות שונות, לסניפים שונים ולאירועים מיוחדים
פרזנטורים וירטואליים – דוברים דיגיטליים המתאימים לכל מותג ושפה
עיצוב גרפי ממוחשב – תבניות מקצועיות שמתעדכנות אוטומטית
ניהול מרחוק של מסכים דיגיטליים – שליטה מלאה ממכשיר אחד על כל רשת המסכים
תוכן מבוסס בינה מלאכותית מגביר מעורבות צופים ומשפר המרות בזמן אמת.
עדכון אוטומטי של מסכי שילוט חוסך זמן ומפחית עלויות תפעול שוטפות.
התאמה אישית דינמית של פרסומות לקהל היעד מעלה את אחוזי הקליקים.
ניתוח נתוני צופים בזמן אמת מאפשר אופטימיזציה מתמדת של קמפיינים ויזואליים.
שילוב פלטפורמות ענן עם מסכים חכמים מאפשר ניהול תוכן מרחוק ויעיל.
שאלות נפוצות
מה זה שילוט דיגיטלי עם תוכן AI ואיך זה עובד?
שילוט דיגיטלי עם תוכן AI הוא מערכת שמחברת מסכי LED ו-LCD לפלטפורמת הפקת תוכן מבוססת בינה מלאכותית. המערכת יוצרת סרטוני וידאו, פרזנטורים וירטואליים, קריינות וגרפיקה דינמית – ומעלה אותם אוטומטית למסכים בזמן אמת, ללא צורך בצוות הפקה.
כמה עולה הפקת תוכן לשילוט דיגיטלי בבינה מלאכותית?
עלות הפקת תוכן AI נמוכה בעד 80% לעומת הפקה קונבנציונלית. GoMixApp מציעה חבילות גמישות ללא מנוי חודשי קבוע – רוכשים חבילת תכנים ומנצלים אותה בקצב שמתאים לעסק. החבילות מתחילות ברמת כניסה נוחה ומגיעות לפתרונות ארגוניים מקיפים.
האם AI נחשב חלק ממדיה דיגיטלית?
כן. בינה מלאכותית היא כיום חלק בלתי נפרד ממדיה דיגיטלית. ב-2026, AI משמש ליצירה אוטומטית של תוכן, הנפשת תמונות, קריינות, עיצוב גרפי וניהול מרחוק של מסכים דיגיטליים – כולם נחשבים שירותי תוכן דיגיטלי מלאים.
איך יוצרים תוכן לשילוט דיגיטלי?
יוצרים תוכן לשילוט דיגיטלי בשלושה שלבים: בוחרים חבילת תוכן מתאימה, מעלים חומרי גלם (תמונות, מסרים, לוגו), ומערכת ה-AI מפיקה סרטונים, גרפיקה וקריינות מותאמים לפורמט המסך. לאחר אישור, התוכן עולה אוטומטית למסכים דרך מערכת ניהול תוכן דיגיטלי (CMS) מרכזית.
מהו ספק השילוט הדיגיטלי הטוב ביותר בישראל?
GoMixApp נחשבת לאחת הפלטפורמות המובילות בישראל לשילוט דיגיטלי עם תוכן AI – עם מאות לקוחות פעילים בקמעונאות, נדל"ן, ארגונים וגופים ציבוריים. המערכת כוללת הפקת וידאו, פרזנטורים וירטואליים, קריינות מקצועית וניהול מרחוק של מסכים בחבילה אחת גמישה.
שילוט דיגיטלי עם תוכן AI לעומת שיטות מסורתיות
קריטריון
שילוט סטטי מסורתי
שילוט דיגיטלי ללא AI
שילוט דיגיטלי עם תוכן AI
עדכון תוכן
✗דורש הדפסה מחדש בכל שינוי
✓עדכון ידני דרך ממשק
✓עדכון אוטומטי ומותאם אישית
התאמה למותג
חלקית – עיצוב חד-פעמי קבוע
חלקית – תבניות גנריות קבועות
✓ויזואליה מדויקת ברמת מותגי-על
עלות הפקת תוכן
גבוהה – עיצוב ידני ודפוס בכל פעם
בינונית – מצריך מעצב לכל קמפיין
נמוכה – חיסכון משמעותי במשאבים ותקציב
מעורבות צופים
נמוכה – תוכן סטטי ולא מושך
בינונית – תוכן דיגיטלי ללא התאמה
גבוהה – תוכן חכם ומרתק למקסימום אימפקט
גמישות וניהול חבילות
✗מבנה קשיח ללא גמישות
חלקית – גמישות טכנית בלבד
✓חבילות תוכן גמישות לכל סוג עסק
התייעלות תפעולית
✗תהליך ידני וגוזל זמן רב
חלקית – חוסכת זמן הדפסה בלבד
✓אוטומציה מלאה וחיסכון בכוח אדם
לסיכום – מסכים חכמים, תוצאות מוכחות
מערכת GoMixApp להפקת וידאו בינה מלאכותית מציעה את הפתרון המקיף ביותר לשירותי תוכן דיגיטלי בישראל: פרזנטורים וירטואליים, קריינות AI, הנפשת תמונות, עיצוב גרפי ממוחשב, ותכנים לשילוט דיגיטלי המותאמים לכל פורמט ורזולוציה. עסקים שעוברים לתוכן מבוסס AI מדווחים על חיסכון של עד 80% בעלויות הפקה ועלייה של עשרות אחוזים במעורבות לקוחות.
בין אם אתם מנהלים חנות קמעונאית, רשת סניפים, מגדל משרדים או מוסד ציבורי – הפתרון מתאים לכם. חבילות התוכן הגמישות מאפשרות להתחיל בקטן ולהתרחב, ללא התחייבות לטווח ארוך. נכון ל-2026, מאות ארגונים ישראלים כבר נהנים מניהול מרחוק של מסכים דיגיטליים עם תוכן שמתעדכן בזמן אמת.
אל תישארו מאחור – המתחרים שלכם כבר משדרגים את המסכים שלהם. צרו קשר עם צוות GoMixApp עוד היום ונבנה יחד את אסטרטגיית התוכן הדיגיטלי שתגדיל את המכירות ותחזק את המותג שלכם.
document.addEventListener('click', function(e) {
var el = e.target.closest('.gmx-lite-yt');
if (!el) return;
var vid = el.getAttribute('data-vid');
if (!vid) return;
var iframe = document.createElement('iframe');
iframe.src = 'https://www.youtube.com/embed/' + vid + '?autoplay=1';
iframe.style.cssText = 'position:absolute;top:0;left:0;width:100%;height:100%;border:0;';
iframe.allow = 'autoplay;encrypted-media';
iframe.allowFullscreen = true;
el.style.position = 'relative';
el.innerHTML = '';
el.appendChild(iframe);
});
(function () {
var c = document.body.className;
c = c.replace(/woocommerce-no-js/, 'woocommerce-js');
document.body.className = c;
})();
var gmxCf7LegacyUxI18n = {"errName":"Please enter a full name","errPhone":"Please enter a valid phone number","errEmail":"Please enter a valid email address","errRequired":"Required field"};
var gmxCf7LegacyUxI18n = {"errName":"Please enter a full name","errPhone":"Please enter a valid phone number","errEmail":"Please enter a valid email address","errRequired":"Required field"};
//# sourceURL=gmx-cf7-legacy-ux-js-extra
(function(){
function cleanUrl(url) {
// Strip query params embedded mid-path: /ID?params/file -> /ID/file
return url.replace(/\?[^\/]+\//g, '/');
}
function addWebPFallback(pic) {
if (pic.getAttribute('data-webp-fb')) return;
pic.setAttribute('data-webp-fb', '1');
var img = pic.querySelector('img');
if (!img) return;
img.onerror = function() {
this.onerror = null;
this.src = cleanUrl(this.src).replace('vi_webp','vi').replace('.webp','.jpg');
var sources = this.parentElement.querySelectorAll('source');
for (var i = 0; i < sources.length; i++) {
sources[i].srcset = cleanUrl(sources[i].srcset).replace('vi_webp','vi').replace('.webp','.jpg');
}
};
}
var observer = new MutationObserver(function() {
var pics = document.querySelectorAll('.video-seo-youtube-picture');
for (var i = 0; i < pics.length; i++) addWebPFallback(pics[i]);
});
observer.observe(document.documentElement, { childList: true, subtree: true });
})();
(function(){
var siteKey = "6Ldnu_gsAAAAAGpkh7vCd_h3L9BA193yFU59I4Do";
var action = "submit_lead_form";
var loaderUrl = "https:\/\/www.google.com\/recaptcha\/enterprise.js?render=6Ldnu_gsAAAAAGpkh7vCd_h3L9BA193yFU59I4Do";
// GWP-506 (perf): the reCAPTCHA Enterprise runtime costs ~900ms of main-thread
// work (PSI contactus TBT 660ms, perf 69). It was loaded eagerly on every page
// carrying a CF7 form. It now loads on the FIRST real page interaction
// (scroll/pointer/key/touch) — warming the runtime well before the user can
// reach submit — and never loads on a no-interaction (lab) page view, so the
// perf win holds. The token is still stamped on form focusin and refreshed at
// submit. IMPORTANT: the server gate is fail-CLOSED by default (GWP-412
// require_token) — a missing token at submit is treated as spam — so the
// runtime MUST be warm before submit; that is exactly why the warm trigger is
// first-page-interaction, NOT focusin-only (focusin-only left a race where a
// fast focus→submit could POST before the ~900ms download finished and drop a
// legit lead). The eager <script src> is gone.
var greReady = false, greWaiters = [], greLoadStarted = false;
function pollGre(attempts) {
if (typeof grecaptcha !== 'undefined' && grecaptcha.enterprise) {
greReady = true;
var queued = greWaiters;
greWaiters = [];
queued.forEach(function (fn) { try { fn(); } catch (e) {} });
return;
}
if (attempts > 200) {
// no-silent-failures: enterprise.js never became ready (network-blocked,
// consent/privacy blocker, or a Google outage). Surface it — a missing
// token fails CLOSED server-side (GWP-412) and drops the lead.
if (window.console && console.warn) {
console.warn('[GMX recaptcha] enterprise.js not ready after ~10s; token will be missing (submit fails closed).');
}
return; // give up after ~10s (200 * 50ms)
}
setTimeout(function () { pollGre(attempts + 1); }, 50);
}
function loadGre() {
if (greLoadStarted) return;
greLoadStarted = true;
var s = document.createElement('script');
s.src = loaderUrl;
s.async = true;
document.head.appendChild(s);
pollGre(0); // begin polling only once the runtime is actually loading
}
function whenGreReady(cb) {
if (greReady) return cb();
greWaiters.push(cb);
}
function stampToken(form) {
if (!form.querySelector('.wpcf7-form-control-wrap input[type="submit"], .wpcf7-submit')) return;
loadGre(); // lazy: kick off enterprise.js on demand (idempotent)
whenGreReady(function () {
grecaptcha.enterprise.ready(function () {
grecaptcha.enterprise.execute(siteKey, { action: action }).then(function (token) {
var hidden = form.querySelector('input[name="gmx_recaptcha_token"]');
if (!hidden) {
hidden = document.createElement('input');
hidden.type = 'hidden';
hidden.name = 'gmx_recaptcha_token';
form.appendChild(hidden);
}
hidden.value = token;
}).catch(function () {
// no-silent-failures: token generation failed; the server gate is
// fail-CLOSED (GWP-412), so this submit will be rejected as spam.
if (window.console && console.warn) {
console.warn('[GMX recaptcha] token execute failed; submit will fail closed.');
}
});
});
});
}
document.addEventListener('wpcf7submit', function (e) { stampToken(e.target); });
// Also stamp on first focus into any CF7 form (so token ready before submit).
// `whenGreReady()` queues the stamp until grecaptcha loads, so the once-
// listener stays safe even if grecaptcha isn't ready at focus-in time.
document.querySelectorAll('form.wpcf7-form').forEach(function (form) {
form.addEventListener('focusin', function once() {
form.removeEventListener('focusin', once);
stampToken(form);
});
});
// GWP-506: warm enterprise.js on the FIRST real page interaction so the ~900ms
// runtime is ready before the user reaches submit (closes the focusin-only race
// against the fail-CLOSED server gate, and covers AJAX/popup-injected forms that
// missed the focusin binding above). Never fires on a no-interaction (lab) view,
// so the perf win holds. Idempotent via loadGre()'s greLoadStarted guard.
var warmOpts = { passive: true, capture: true };
var warmEvents = ['pointerdown', 'keydown', 'touchstart', 'scroll'];
function warmGre() {
loadGre();
warmEvents.forEach(function (e) { window.removeEventListener(e, warmGre, warmOpts); });
}
warmEvents.forEach(function (e) { window.addEventListener(e, warmGre, warmOpts); });// GWP-507 (CONFIRMED LIVE: 19 real leads dropped in 8 days): capture-phase
// submit GATE. The warm/focusin logic above only *helps* the token be ready;
// it is NOT a guarantee. The race: a user whose FIRST interaction is clicking
// submit on an autofilled form (no prior scroll/field-touch to warm the
// ~900ms enterprise.js), or who submits before the runtime readies, serializes
// the AJAX POST with an EMPTY gmx_recaptcha_token → the fail-CLOSED server gate
// (GWP-412 require_token) drops the lead as spam. CF7's `wpcf7submit` fires
// AFTER the AJAX POST (too late), and CF7 exposes no documented pre-POST JS
// hook (verified: contactform7.com/dom-events). So the ONLY seam is to
// intercept the native DOM submit/click in CAPTURE phase, HOLD it until
// greReady + token stamped, then re-dispatch. grecaptcha token lifetime is
// 2 minutes, so holding briefly is safe.
//
// TIMEOUT-FALLBACK CHOICE (a): if enterprise.js never readies within the
// ~10s ceiling (network-blocked / consent-blocker / Google outage), we
// RE-ENABLE the button and let the submit proceed WITHOUT a token rather than
// hard-blocking the user. It will fail-CLOSED server-side (GWP-412), but the
// console.warn fires loudly (no-silent-failures) — we never trap a real user
// behind a spinner they can't escape.
var GATE_TIMEOUT_MS = 10000; // matches pollGre ceiling (200 * 50ms).
function gmxFormHasToken(form) {
var hidden = form.querySelector('input[name="gmx_recaptcha_token"]');
return !!(hidden && hidden.value);
}
function gmxSetVerifying(form, on) {
var btn = form.querySelector('.wpcf7-submit, input[type="submit"], button[type="submit"]');
if (!btn) return;
if (on) {
btn.disabled = true;
btn.setAttribute('data-gmx-verifying', '1');
} else {
btn.disabled = false;
btn.removeAttribute('data-gmx-verifying');
}
}
function gmxReleaseSubmit(form) {
// Mark released so the re-dispatched submit passes straight through the
// capture gate (no re-gate loop), re-enable UX, then re-trigger.
form.__gmxGateReleased = true;
gmxSetVerifying(form, false);
if (typeof form.requestSubmit === 'function') {
form.requestSubmit();
} else {
form.dispatchEvent(new Event('submit', { bubbles: true, cancelable: true }));
}
// GWP-507 finding-1 (BLOCKER fix): reset the release flag on the NEXT tick
// so any FUTURE user submit (user edits a field + resubmits) is re-gated and
// stamps a FRESH token. reCAPTCHA tokens are single-use with a ~2-min
// lifetime — without this reset, __gmxGateReleased stayed true forever after
// the first release, letting a second submit bypass the gate and POST a
// stale/used token. The setTimeout(0) lets the synchronous re-dispatch above
// complete (which short-circuits on the still-true flag) before we re-arm.
setTimeout(function () { form.__gmxGateReleased = false; }, 0);
}
function gmxSubmitGate(e) {
var form = e.currentTarget;
if (form.tagName !== 'FORM') { form = form.form || form.closest('form.wpcf7-form'); }
if (!form) return;
// Idempotent: a programmatic re-submit we already released proceeds. This is
// the ONLY pass-through — it lets the freshly-stamped re-dispatch reach CF7.
// (The flag is reset on the next tick in gmxReleaseSubmit, so the NEXT user
// submit is re-gated.)
if (form.__gmxGateReleased) return;
// GWP-507 finding-2 (stale/used token fix): every USER submit HOLDS + stamps
// a FRESH token — we do NOT early-return on an already-present token. A token
// already sitting in the hidden input may be stale or already used (single-
// use, ~2-min lifetime); proceeding on it would POST a dead token. enterprise.js
// is warm by submit time, so grecaptcha.enterprise.execute() resolves in
// ~100-300ms — the per-submit hold is brief. stampToken() OVERWRITES the
// hidden input value (hidden.value = token), so no stale token lingers.
// HOLD: block CF7's submit handler before the AJAX POST.
e.preventDefault();
e.stopImmediatePropagation();
if (form.__gmxGateWaiting) return; // a click + submit may both fire; hold once.
form.__gmxGateWaiting = true;
loadGre(); // kick the warm if not started.
gmxSetVerifying(form, true);
var released = false;
function release(missing) {
if (released) return;
released = true;
form.__gmxGateWaiting = false;
if (missing && window.console && console.warn) {
console.warn('[GMX recaptcha] submit gate timed out (~10s); releasing without token (submit fails closed).');
}
gmxReleaseSubmit(form);
}
var timer = setTimeout(function () { release(true); }, GATE_TIMEOUT_MS);
whenGreReady(function () {
stampToken(form);
// stampToken resolves the token asynchronously (enterprise.execute
// promise); poll briefly for the stamp, then release. Bounded by the
// same overall timer above.
(function awaitStamp(n) {
if (released) return;
if (gmxFormHasToken(form)) { clearTimeout(timer); release(false); return; }
if (n > 200) { clearTimeout(timer); release(true); return; } // ~10s (200*50ms)
setTimeout(function () { awaitStamp(n + 1); }, 50);
})(0);
});
}
// GWP-507 finding-4 (CF7 phase): WHY capture phase works. Our gate listener is
// registered in CAPTURE phase (3rd arg `true`), so it runs BEFORE CF7's own
// bubble-phase 'submit' handler on the same form. When we call
// e.stopImmediatePropagation() in the capture listener, the DOM spec stops ALL
// further listeners for that event on the target — including the later
// bubble-phase CF7 handler — so CF7's AJAX POST never fires until we re-dispatch
// with a fresh token. This capture-phase interception is the only documented
// pre-POST seam: CF7 exposes no pre-POST JS hook (wpcf7submit fires AFTER the
// AJAX POST). See contactform7.com/dom-events.
document.querySelectorAll('form.wpcf7-form').forEach(function (form) {
form.addEventListener('submit', gmxSubmitGate, true);
var btn = form.querySelector('.wpcf7-submit, input[type="submit"], button[type="submit"]');
if (btn) { btn.addEventListener('click', gmxSubmitGate, true); }
});
})();
(function(){
var loaded = false;
function loadUserWay() {
if (loaded) return;
loaded = true;
var el = document.createElement('script');
el.setAttribute('data-account', "UX40fo0Ctw");
el.setAttribute('data-language', "he");
el.setAttribute('src', 'https://cdn.userway.org/widget.js');
document.body.appendChild(el);
events.forEach(function(e){ window.removeEventListener(e, loadUserWay, {passive: true}); });
}
var events = ['scroll', 'mousemove', 'touchstart', 'click', 'keydown'];
events.forEach(function(e){ window.addEventListener(e, loadUserWay, {passive: true}); });
})();