(function(){
if(!window.ckcTracker||!window.FormData) return;
var cfg=window.ckcTracker;
var state={
maxScroll: 0,
exitSent: false,
visitKey: '',
consentMode: getConsentMode()
};
function readCookie(name){
var match=document.cookie.match(new RegExp('(?:^|;)' + name.replace(/([.$?*|{}()[\]\\/+^])/g, '\\$1') + '=([^;]*)'));
return match ? decodeURIComponent(match[1]):'';
}
function getConsentMode(){
if(Number(cfg.analyticsChoiceEnabled)!==1) return 'essential';
if(readCookie('ckc_consent')==='1'){
return readCookie('ckc_consent_analytics')==='1' ? 'accepted':'refused';
}
return 'pending';
}
function allowsDetail(){
return getConsentMode()==='accepted';
}
function safeStorage(){
try {
return window.sessionStorage;
} catch (e){
return null;
}}
function generateId(prefix){
return prefix + '-' + Date.now().toString(36) + '-' + Math.random().toString(36).slice(2, 10);
}
function getSessionKey(){
var storage=safeStorage();
if(!storage) return '';
var key=storage.getItem('ckcTrackerSession');
if(!key){
key=generateId('sess');
storage.setItem('ckcTrackerSession', key);
}
return key;
}
function getVisitKey(){
if(!allowsDetail()) return '';
if(!state.visitKey){
state.visitKey=generateId('visit');
}
return state.visitKey;
}
function detectDeviceType(){
var ua=(navigator.userAgent||'').toLowerCase();
if(/ipad|tablet/.test(ua)) return 'tablet';
if(/mobile|iphone|android/.test(ua)) return 'mobile';
return 'desktop';
}
function detectBrowser(){
var ua=(navigator.userAgent||'').toLowerCase();
if(ua.indexOf('edg/')!==-1) return 'Edge';
if(ua.indexOf('opr/')!==-1) return 'Opera';
if(ua.indexOf('chrome/')!==-1) return 'Chrome';
if(ua.indexOf('firefox/')!==-1) return 'Firefox';
if(ua.indexOf('safari/')!==-1) return 'Safari';
return 'Inconnu';
}
function detectOs(){
var ua=(navigator.userAgent||'').toLowerCase();
if(ua.indexOf('windows')!==-1) return 'Windows';
if(ua.indexOf('iphone')!==-1) return 'iPhone';
if(ua.indexOf('ipad')!==-1) return 'iPadOS';
if(ua.indexOf('android')!==-1) return 'Android';
if(ua.indexOf('mac os')!==-1) return 'macOS';
if(ua.indexOf('linux')!==-1) return 'Linux';
return 'Inconnu';
}
function buildPayload(eventType, extra){
var detailed=allowsDetail();
var payload={
action: 'ckc_track_event',
nonce: cfg.nonce,
event_type: eventType,
page_url: window.location.href,
page_path: cfg.pagePath||window.location.pathname,
page_title: document.title||cfg.pageTitle||'',
referrer: document.referrer||'',
device_type: detectDeviceType(),
browser: detectBrowser(),
os: detectOs(),
screen_resolution: (window.screen ? window.screen.width + 'x' + window.screen.height:''),
language: navigator.language||'',
is_product: Number(cfg.isProduct)===1 ? 1:0,
session_key: getSessionKey(),
visit_key: detailed ? getVisitKey():''
};
if(extra){
Object.keys(extra).forEach(function(key){
payload[key]=extra[key];
});
}
return payload;
}
function send(eventType, extra, options){
var payload=buildPayload(eventType, extra);
var formData=new FormData();
Object.keys(payload).forEach(function(key){
if(payload[key]===undefined||payload[key]===null) return;
formData.append(key, payload[key]);
});
if(options&&options.beacon&&navigator.sendBeacon){
navigator.sendBeacon(cfg.ajax, formData);
return Promise.resolve();
}
return fetch(cfg.ajax, {
method: 'POST',
body: formData,
credentials: 'same-origin',
keepalive: !!(options&&options.keepalive)
}).catch(function(){});
}
function updateScroll(){
var doc=document.documentElement;
var body=document.body;
var scrollTop=window.pageYOffset||doc.scrollTop||body.scrollTop||0;
var scrollHeight=Math.max(body.scrollHeight, doc.scrollHeight, body.offsetHeight, doc.offsetHeight, doc.clientHeight);
var viewport=window.innerHeight||doc.clientHeight||0;
var value=scrollHeight > viewport ? Math.round(((scrollTop + viewport) / scrollHeight) * 100):100;
state.maxScroll=Math.max(state.maxScroll, Math.min(value, 100));
}
function sendHeartbeat(){
if(document.visibilityState!=='visible') return;
updateScroll();
send('heartbeat', {
seconds: 15,
max_scroll: state.maxScroll
});
}
function isCtaElement(el){
if(!el||!el.matches) return false;
return el.matches('.button, .btn, .et_pb_button, [data-cta], button, input[type="submit"], input[type="button"], a[role="button"]');
}
function nearestClickable(target){
if(!target||!target.closest) return null;
return target.closest('a, button, [role="button"], input[type="submit"], input[type="button"]');
}
function markFormStarted(form){
if(!form||form.dataset.ckcFormStarted==='1') return;
form.dataset.ckcFormStarted='1';
send('form_start');
}
function sendExit(){
if(state.exitSent) return;
state.exitSent=true;
updateScroll();
send('page_exit', {
max_scroll: state.maxScroll
}, {
beacon: true,
keepalive: true
});
}
document.addEventListener('click', function(event){
var clickable=nearestClickable(event.target);
if(!clickable) return;
send('click', {
is_cta: isCtaElement(clickable) ? 1:0
});
}, true);
document.addEventListener('focusin', function(event){
if(!event.target||!event.target.form) return;
markFormStarted(event.target.form);
}, true);
document.addEventListener('submit', function(event){
if(event.target&&event.target.tagName==='FORM'){
markFormStarted(event.target);
send('form_submit');
}}, true);
window.addEventListener('scroll', updateScroll, { passive: true });
window.addEventListener('resize', updateScroll, { passive: true });
window.addEventListener('pagehide', sendExit);
window.addEventListener('beforeunload', sendExit);
document.addEventListener('visibilitychange', function(){
if(document.visibilityState==='hidden'){
updateScroll();
}});
document.addEventListener('ckc:consent-saved', function(event){
state.consentMode=getConsentMode();
if(event.detail&&event.detail.analytics){
state.visitKey='';
send('consent_upgrade');
}});
updateScroll();
send('page_view');
window.setInterval(sendHeartbeat, 15000);
})();