// // Clarity v1.12 (22.11.2023) // Part of Chatium Platform // https://chatium.com // ;(function () { function getCookie(name) { const matches = document.cookie.match(new RegExp( "(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)" )); return matches ? decodeURIComponent(matches[1]) : undefined; } const cookieUid = getCookie('x-chtm-uid'); const cookieSid = getCookie('x-chtm-uid-sid'); const [visitorId, visitId, sessionId] = findGetcourseFormsVisitorVisitSession() const uid = cookieUid || "rvYmDFJ1iAUR6_YnsiIrZYPBncX5wqeV"; const sid = cookieSid || "vw5Vp7TDd_U1A4BzQLkxKoDq4OacnyVr:1706019033185"; const inferredUid = cookieUid ? false : true; const inferredSid = cookieSid ? false : true; document.cookie = `x-chtm-uid=${uid}; max-age=31536000; path=/;`; document.cookie = `x-chtm-uid-sid=${sid}; max-age=1800; path=/;`; const query = {}; const params = new URLSearchParams(location.search); [ 'utm_funnel', 'utm_node', 'utm_node_from', 'utm_action', 'utm_action_params', 'utm_action_param1', 'utm_action_param2', 'utm_action_param3', 'utm_action_param1_float', 'utm_action_param2_float', 'utm_action_param3_float', 'utm_action_param1_int', 'utm_action_param2_int', 'utm_action_param3_int', ].forEach(function (param) { if (params.get(param)) query[param] = params.get(param); }) let referer = '' try { referer = document.referrer || sessionStorage.getItem('x-chtm-rfr') || ''; sessionStorage.setItem('x-chtm-rfr-p', sessionStorage.getItem('x-chtm-rfr')); sessionStorage.setItem('x-chtm-rfr', window.location.href); } catch (_) {} function enrichUrl(url) { return url.startsWith('http://') || url.startsWith('https://') || url.startsWith('event://') ? url : 'event://custom/' + url } window.clrtIsReactive = false function appendSocketStoreToBody() { if (false || window.clrtReactivity === true) { if (window.clrtIsReactive === false) { window.clrtIsReactive = true console.log('🚀 Clarity reactivity enabled') const script = document.createElement('script'); script.src = "https://academy.makers.bz/chtm/s/metric/socket-bundle.8dU6jrcTp8rM8.js"; script.onload = function () { const socketStore = new SocketStore({ baseURL: 'wss://app.chatium.io/' }); socketStore.setToken(); if (clrtUserSocketId) { socketStore.subscribeToData(clrtUserSocketId).listen(function (params) { console.log('🛜 Clarity user socket', params) window.dispatchEvent(new CustomEvent('claritySocket', { detail: { ...params } } )); window.postMessage(JSON.stringify({ source: 'clarity', action: 'claritySocket', params })); }); } socketStore.subscribeToData(clrtSocketId).listen(function (params) { console.log('🛜 Clarity uid socket', params) window.dispatchEvent(new CustomEvent('claritySocket', { detail: { ...params } } )); window.postMessage(JSON.stringify({ source: 'clarity', action: 'claritySocket', params })); }); } document.body.appendChild(script) } } } var clarityInit = false function clarityTrack(params) { const img = document.createElement('img'); img.style.position = 'absolute'; img.style.left = '-1px'; img.style.top = '-1px'; img.style.width = '1px'; img.style.height = '1px'; img.src = getClarityImageUrl(typeof params === 'string' ? { url: enrichUrl(params) } : params); img.onload = function () { img.remove(); }; function appendTrackerToBody() { document.body.appendChild(img) try { if (clarityInit === false) { window.dispatchEvent(new CustomEvent('clarityInit', { detail: { ...params } } )); window.postMessage(JSON.stringify({ source: 'clarity', action: 'clarityInit', params })); } window.dispatchEvent(new CustomEvent('clarityTrack', { detail: { ...params, initial: clarityInit === false } } )); window.postMessage(JSON.stringify({ source: 'clarity', action: 'clarityTrack', params: { ...params, initial: clarityInit === false } })); } catch (error) { console.error(error) } try { if (clarityInit === false) { appendSocketStoreToBody() } } catch (error) { console.error(error) } clarityInit = true } if (document.body) { appendTrackerToBody() } else { window.addEventListener("DOMContentLoaded", appendTrackerToBody, { once: true }) } } function getClarityImageUrl(rewrite) { var baseUrl = "https://academy.makers.bz/chtm/s/metric/clarity.gif" var resultReferer = referer var resultUrl = document.location.href var resultDomain = document.location.hostname try { const params = new URLSearchParams(document.location.search) if (params.get('loc') !== null) { resultUrl = params.get('loc') var url = new URL(resultUrl) resultDomain = url.hostname } if (params.get('ref') !== null) { resultReferer = params.get('ref') } } catch (error) { console.error(error) } var params = { c: Date.now(), uid, sid, referer: resultReferer, url: resultUrl, domain: resultDomain, title: document.title, width: screen.width, height: screen.height, pr: window.devicePixelRatio, iuid: inferredUid, isid: inferredSid, visitor: visitorId, visit: visitId, session: sessionId, enc: window.chtmClarityEncoded ? window.chtmClarityEncoded : undefined, ...query, ...(rewrite || {}), } return baseUrl + '?' + Object.keys(params).map(function (param) { return params[param] ? param + "=" + encodeURIComponent(params[param]) : '' }).filter(Boolean).join('&'); } function findGetcourseFormsVisitorVisitSession() { try { const forms = Array.from(document.forms).filter(form => form.action && form.action.includes('gcVisitor')) if (forms.length > 0) { const action = forms[0].action const url = new URL(action) let visitorId = undefined let visitId = undefined let sessionId = undefined try { const gcVisitorParam = url.searchParams.get('gcVisitor') const gcVisitor = JSON.parse(gcVisitorParam) if (gcVisitor.id) visitorId = gcVisitor.id } catch (_) {} try { const gcVisitParam = url.searchParams.get('gcVisit') const gcVisit = JSON.parse(gcVisitParam) if (gcVisit.id) visitId = gcVisit.id if (gcVisit.sid) sessionId = gcVisit.sid } catch (_) {} return [visitorId, visitId, sessionId] } } catch (error) { console.error(error) } return [undefined, undefined, undefined] } window.chtmClarityTrack = clarityTrack; window.rfnl = clarityTrack; window.clrtTracked = false; window.clrtMakeReactive = function () { window.clrtReactivity = true; appendSocketStoreToBody(); } document.addEventListener('DOMContentLoaded', function (event) { if (window.clrtTracked === false) { window.clrtTracked = true if (window.gcUniqId !== undefined) { try { if (localStorage.getItem('visit')) { clarityTrack(); } else { const start = Date.now() const handler = setInterval(checkVisit, 500); function checkVisit() { if (localStorage.getItem('visit') || Date.now() - start > 1000 * 10) { clearInterval(handler); clarityTrack(); } } } } catch (_) { clarityTrack(); } } else { clarityTrack(); } } }, { once: true }) })();