(function(w,d,sid,api,orderApi){ var lastSentUrl=''; // ── 1. SESSION & VISITOR MANAGEMENT ── var vidKey = '_sd_vid_' + sid; var sessionKey = '_sd_ses_' + sid; // Safe wrappers — localStorage/sessionStorage may throw in private/incognito mode function lsGet(k) { try { return localStorage.getItem(k); } catch(e) { return null; } } function lsSet(k, v) { try { localStorage.setItem(k, v); } catch(e) {} } function ssGet(k) { try { return sessionStorage.getItem(k); } catch(e) { return null; } } function ssSet(k, v) { try { sessionStorage.setItem(k, v); } catch(e) {} } var vid = lsGet(vidKey); var isNewVisitor = !vid; if (!vid) { vid = 'v' + Math.random().toString(36).slice(2) + '_' + Date.now().toString(36); lsSet(vidKey, vid); } var isNewSession = !ssGet(sessionKey); var visitorStatusKey = '_sd_vs_' + sid; // 'n' or 'rv' or '' (already reported for pageview) if (isNewSession) { ssSet(sessionKey, '1'); // שמור את הסטטוס הראשוני של המבקר לכל הסשן ssSet(visitorStatusKey, isNewVisitor ? 'n' : 'rv'); } var sessionVisitorStatus = ssGet(visitorStatusKey); // 'n', 'rv', or 'reported' // דגל זה יירד מיד אחרי צפיית העמוד הראשונה בסשן (לא thankyou) var shouldReportVisitorStatus = isNewSession; // ── 2. TRAFFIC SOURCE TRACKING (Persisted correctly) ── var srcKey = '_sd_src_' + sid; var savedSrc = ssGet(srcKey); if (isNewSession || !savedSrc) { var urlParams = new URLSearchParams(w.location.search); var utm = urlParams.get('utm_source'); if (utm) { savedSrc = utm; } else { var ref = d.referrer || ''; var host = w.location.hostname || ''; if (ref && !ref.toLowerCase().includes(host)) { var r = ref.toLowerCase(); if (r.includes('google')) savedSrc = 'google'; else if (r.includes('facebook') || r.includes('fb.com')) savedSrc = 'facebook'; else if (r.includes('instagram')) savedSrc = 'instagram'; else if (r.includes('tiktok')) savedSrc = 'tiktok'; else if (r.includes('youtube')) savedSrc = 'youtube'; else savedSrc = 'other'; } else { savedSrc = 'direct'; } } ssSet(srcKey, savedSrc); } // ── 3. DETECT PAGE TYPES ── var is404 = false; var c404 = "העמוד המבוקש לא נמצא."; function check404() { var t = d.title.toLowerCase(), b = d.body ? d.body.innerText.toLowerCase() : ''; if (t.includes('404') || t.includes('page not found') || t.includes('לא נמצא')) is404 = true; if (!is404 && c404.length >= 3 && (t.includes(c404.toLowerCase()) || b.includes(c404.toLowerCase()))) is404 = true; } var isTY = /thank[-_]?you|order[-_]?received|success|order[-_]?complete|confirmation|תודה|הזמנה/i.test(w.location.pathname + ' ' + w.location.href); var orderIdSelector = ".woocommerce-order-overview__order"; var orderTotalSelector = ".woocommerce-order-overview__total .woocommerce-Price-amount"; // ── 4. THE SEND FUNCTION ── function send(evt, extra) { var ts = Date.now(), tk = btoa(sid + '_' + ts).slice(0, 32); var uUrl = w.location.href; if (savedSrc && savedSrc !== 'direct' && !uUrl.includes('utm_source')) { uUrl += (uUrl.includes('?') ? '&' : '?') + 'utm_source=' + encodeURIComponent(savedSrc); } var payload = { s: sid, v: vid, u: uUrl, t: d.title, e: evt, ts: ts, tk: tk }; if (evt === 'thankyou') { // באירוע thankyou תמיד נדווח את הסטטוס כפי שנקבע בתחילת הסשן payload.n = sessionVisitorStatus === 'n' ? 1 : 0; payload.rv = sessionVisitorStatus === 'rv' ? 1 : 0; } else if (evt === 'pageview' && shouldReportVisitorStatus) { // רק ב-pageview הראשון בסשן payload.n = isNewVisitor ? 1 : 0; payload.rv = isNewVisitor ? 0 : 1; ssSet(visitorStatusKey, 'reported'); // סמן שדווח כבר ל-pageview shouldReportVisitorStatus = false; } else { payload.n = 0; payload.rv = 0; } // שלח את מקור ההגעה המקורי תמיד — השרת ישתמש בו רק בכניסה לאתר ובעמוד תודה if (savedSrc) payload.src = savedSrc; if (d.referrer) payload.r = d.referrer; if (is404) payload.i4 = 1; if (extra) Object.assign(payload, extra); fetch(api, { method: 'POST', keepalive: true, headers: { 'Content-Type': 'application/json', 'X-Pulse-Token': tk }, body: JSON.stringify(payload) }).catch(function(){}); // שידור רכישה אם מדובר בעמוד תודה עם מזהה var orderId = extra ? extra.oid : null; var orderAmount = extra ? extra.amt : 0; if (evt === 'thankyou' && orderId) { var oTs = Date.now(), oTk = btoa(sid + '_' + oTs).slice(0, 32); var oPayload = { s: sid, v: vid, u: uUrl, oid: orderId, ts: oTs, tk: oTk, r: '', n: sessionVisitorStatus === 'n' ? 1 : 0, rv: sessionVisitorStatus === 'rv' ? 1 : 0, dt: /mobile|android|iphone|ipad|windows phone/i.test(navigator.userAgent) ? 'mobile' : 'desktop' }; if (orderAmount > 0) oPayload.amt = orderAmount; if (savedSrc) oPayload.src = savedSrc; fetch(orderApi, { method: 'POST', keepalive: true, headers: { 'Content-Type': 'application/json', 'X-Pulse-Token': oTk }, body: JSON.stringify(oPayload) }).catch(function(){}); } } // ── 5. PAGE VIEW TRIGGERS (הפרדה מוחלטת) ── var pageViewSent = false; function firePageView() { if (pageViewSent) return; var currentUrl = w.location.href; if (lastSentUrl === currentUrl) return; lastSentUrl = currentUrl; pageViewSent = true; check404(); send('pageview'); } function fireThankYou() { if (pageViewSent) return; var currentUrl = w.location.href; if (lastSentUrl === currentUrl) return; lastSentUrl = currentUrl; pageViewSent = true; check404(); var oid = null, amt = 0; if (w.Shopify && w.Shopify.checkout) { oid = w.Shopify.checkout.order_name; amt = parseFloat(w.Shopify.checkout.total_price); } else if (w.dataLayer) { try { for (var i = 0; i < w.dataLayer.length; i++) { var ev = w.dataLayer[i]; if (ev && ev.ecommerce && ev.ecommerce.purchase && ev.ecommerce.purchase.actionField) { oid = ev.ecommerce.purchase.actionField.id; amt = parseFloat(ev.ecommerce.purchase.actionField.revenue); break; } } } catch(e) {} } if (!oid) { var wcMatch = currentUrl.match(/order[-_]?received\/(\d+)/i); if (wcMatch) { oid = wcMatch[1]; } } if (!oid && orderIdSelector) { try { var el = d.querySelector(orderIdSelector); if (el) oid = (el.innerText || '').replace(/[^\d]/g, ''); } catch(e) {} } if (!amt && orderTotalSelector) { try { var el2 = d.querySelector(orderTotalSelector); if (el2) amt = parseFloat((el2.innerText || '').replace(/[^\d.]/g, '')); } catch(e) {} } // אם הסכום עדיין 0, נחכה קצת ונסה שוב if (!amt && orderTotalSelector) { var capturedOid = oid; setTimeout(function() { var retryAmt = 0; try { var el3 = d.querySelector(orderTotalSelector); if (el3) retryAmt = parseFloat((el3.innerText || '').replace(/[^\d.]/g, '')); } catch(e) {} send('thankyou', { oid: capturedOid, amt: retryAmt || 0 }); }, 1500); return; } send('thankyou', { oid: oid, amt: amt }); } // החלטת ביצוע: יורה מיד בעמוד רגיל, או ממתין בעמוד קופה לטעינה מלאה if (isTY) { w.addEventListener('load', fireThankYou); } else { firePageView(); } })(window, document, '699c934eee98ef49d34549c0', 'https://store-watch-now.base44.app/api/apps/6982f5151d59902d46b423cf/functions/ingestData', 'https://store-watch-now.base44.app/api/apps/6982f5151d59902d46b423cf/functions/recordOrder');