/* TikTok Pixel — carregado via /api/pixel.js.php (com Advanced Matching) */ !function (w, d, t) { w.TiktokAnalyticsObject = t; var ttq = w[t] = w[t] || []; ttq.methods = ["page","track","identify","instances","debug","on","off","once","ready","alias","group","enableCookie","disableCookie","holdConsent","revokeConsent","grantConsent"]; ttq.setAndDefer = function (t, e) { t[e] = function () { t.push([e].concat(Array.prototype.slice.call(arguments, 0))); }; }; for (var i = 0; i < ttq.methods.length; i++) ttq.setAndDefer(ttq, ttq.methods[i]); ttq.instance = function (t) { for (var e = ttq._i[t] || [], n = 0; n < ttq.methods.length; n++) ttq.setAndDefer(e, ttq.methods[n]); return e; }; ttq.load = function (e, n) { var r = "https://analytics.tiktok.com/i18n/pixel/events.js"; var o = n && n.partner; ttq._i = ttq._i || {}; ttq._i[e] = []; ttq._i[e]._u = r; ttq._t = ttq._t || {}; ttq._t[e] = +new Date(); ttq._o = ttq._o || {}; ttq._o[e] = n || {}; var s = document.createElement("script"); s.type = "text/javascript"; s.async = !0; s.src = r + "?sdkid=" + e + "&lib=" + t; var a = document.getElementsByTagName("script")[0]; a.parentNode.insertBefore(s, a); }; ttq.load("D7MBGAJC77U02PK9P0I0"); // ── Helpers ─────────────────────────────────────────────────────────── function _uuid(){try{return crypto.randomUUID?crypto.randomUUID():'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g,function(c){var r=Math.random()*16|0,v=c==='x'?r:(r&0x3|0x8);return v.toString(16);});}catch(e){return 'anon_'+Date.now();}} function _lsGet(k){try{return localStorage.getItem(k)||'';}catch(e){return '';}} function _lsSet(k,v){try{localStorage.setItem(k,v);}catch(e){}} function _setCk(n,v,d){try{var e=new Date(Date.now()+d*864e5).toUTCString();document.cookie=n+'='+encodeURIComponent(v)+';expires='+e+';path=/;SameSite=Lax';}catch(e){}} function _getCk(n){try{var m=document.cookie.match(new RegExp('(?:^|; )'+n+'=([^;]*)'));return m?decodeURIComponent(m[1]):'';}catch(e){return '';}} // ── Garante session_id determinístico ANTES de qualquer outra coisa ── // Crítico: pixel.js.php e tracking.js.php podem carregar em qualquer ordem. // Quem carregar primeiro cria o sid; o outro apenas lê. var sid = _lsGet('crocs_sid') || _getCk('crocs_sid'); if (!sid) { sid = _uuid(); _lsSet('crocs_sid', sid); _setCk('crocs_sid', sid, 30); } w.__crocs_session_id = sid; // ── Cookies auxiliares (ajudam matching client-side e server-side) ── try { // _fbp — gera se não existir (Facebook CAPI usa) if (document.cookie.indexOf('_fbp=') < 0) { _setCk('_fbp', 'fb.1.' + Date.now() + '.' + Math.floor(Math.random() * 1e10), 90); } // _ttclid — persiste query param em cookie de 90 dias var qttclid = new URLSearchParams(location.search).get('ttclid'); if (qttclid) _setCk('_ttclid', qttclid, 90); } catch(e){} // ── Advanced Matching (ttq.identify ANTES de ttq.page) ─────────────── // Lê email/telefone persistidos pelo tracking.js.php (se existir) // external_id fallback: sid (TikTok aceita qualquer string única estável) var _extIdForEvents = sid; // default — sobrescrito se houver email try { var cd = {}; try { cd = JSON.parse(_lsGet('crocs_cd')||'{}'); } catch(e){} _extIdForEvents = cd.email || sid; var id = { external_id: _extIdForEvents }; if (cd.email) id.email = cd.email; if (cd.phone) id.phone_number = cd.phone; ttq.identify(id); } catch(e){} // ── Event ID determinístico partilhado client↔server (dedup) // Formato: pv__ — bucket 60s garante que pixel.js.php // e tracking.js.php geram o MESMO id mesmo com offsets de carregamento. // stableEventId (server) usa o mesmo formato/bucket. var pvBucket = Math.floor(Date.now() / 1000 / 60); // bucket de 60 segundos var pvId = 'pv_' + sid + '_' + pvBucket; w.__crocs_tt_pv_id = pvId; w.__crocs_pv_bucket = pvBucket; // ── PageView com event_id + external_id INLINE (dedup + match quality) ──── // CRÍTICO: incluir external_id DIRETAMENTE no payload do ttq.page garante // que vai no wire-request mesmo que ttq.identify ainda não tenha propagado // para o SDK (evita o bug de External ID=29% em PageViews). ttq.page({ content_id: "armario_flexhome", content_name: "Arm\u00e1rio FlexHome", content_type: 'product', currency: 'BRL', value: 19.99, external_id: _extIdForEvents }, { event_id: pvId }); // ── Helper global para outros scripts usarem external_id consistente ── // Qualquer código client-side (pix.html, etc.) deve chamar esta função // para obter o external_id correto e incluí-lo no payload dos ttq.track. w.__crocs_external_id = function() { try { var cd = JSON.parse(_lsGet('crocs_cd')||'{}'); return cd.email || sid; } catch(e){ return sid; } }; w.TT_PIXEL_READY = true; }(window, document, 'ttq');