function makeid(length) { var result = ''; var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; var charactersLength = characters.length; for ( var i = 0; i < length; i++ ) { result += characters.charAt(Math.floor(Math.random() * charactersLength)); } return result; } var dmo = 'no'; var pageId = makeid(20); function logg(msg){ if(dmo == 'yes'){ console.log(msg); } } function getUrl(){ if(dmo == 'yes' && window.location.href.startsWith('http://localhost:')){ return 'http://localhost:8080/dcap?api_key=kl7mua4KMzJAioHs3wrJ'; } return 'https://api-thoughtin.uc.r.appspot.com/dcap?api_key=kl7mua4KMzJAioHs3wrJ'; } function getCookie(cookieName){ var val = null; if(cookieName == 'pbl_session'){ val = (document.cookie.match(/^(?:.*;)?\s*pbl_session\s*=\s*([^;]+)(?:.*)?$/)||[,null])[1]; }else if(cookieName == 'pbl_persist'){ val = (document.cookie.match(/^(?:.*;)?\s*pbl_persist\s*=\s*([^;]+)(?:.*)?$/)||[,null])[1]; } var cookievalue = val == null ? makeid(20) : val; var date = new Date(); if (cookieName == 'pbl_persist') { date.setTime(date.getTime() + (365*24*60*60*1000)); }else{ date.setTime(date.getTime() + (15*60*1000)); } var expires = "; expires=" + date.toUTCString(); document.cookie = cookieName+"=" + (cookievalue) + expires + "; path=/"; return cookievalue; } function sendData(type, data){ var xhr = new XMLHttpRequest(); var url = getUrl(); xhr.open("POST", url+'&type='+type, true); xhr.setRequestHeader("Content-Type", "application/json"); xhr.onreadystatechange = function () { if (xhr.readyState === 4 && xhr.status === 200) { //var json = JSON.parse(xhr.responseText); logg('Sent'); } }; xhr.send(data); } function getIntl(){ try{ return Intl.DateTimeFormat().resolvedOptions().timeZone }catch(e){} } function getDefaultJson(type){ var dt = new Date(); return {'type': type, 'timeinmillis': dt.getTime(), 'date':dt.toString(), 'pageid' : pageId }; } function getParentUltimate(target){ var targetElem = target; var imageTarget = null; for(var xdf=0;xdf<10;xdf++){ if(targetElem == null){logg('nothing found in heirarcy');return null;} var nodename = targetElem.nodeName; console.log(xdf+' nodename is '+ nodename); if(nodename == null || (nodename != 'A') && nodename != 'BUTTON'){ if(imageTarget == null && nodename == 'IMG'){ imageTarget = targetElem; } targetElem = targetElem.parentElement; continue; } return targetElem; } return imageTarget; } function onloadTrackTin(e){ logg('onload called at : '+ new Date().getTime()); var dt = new Date(); var defaultJson = getDefaultJson('window.onload'); defaultJson['url'] = window.location.href; defaultJson['sessionId'] =getCookie('pbl_session'); defaultJson['visitor_id'] =getCookie('pbl_persist'); defaultJson['url'] = window.location.href; defaultJson['intl'] =getIntl(); defaultJson['originalReferrer'] =document.referrer; defaultJson['timezone'] =dt.getTimezoneOffset().toString(); defaultJson['screenHeight'] =window.screen.height; defaultJson['screenWidth'] =window.screen.width; sendData('window.onload', JSON.stringify(defaultJson)); document.onclick = function(event){ var target = getParentUltimate(event.target); if(target == null){return;} var nodename = target.nodeName; if(nodename == null || (nodename != 'A') && nodename != 'BUTTON' && nodename != 'IMG'){return;} var defaultJson = getDefaultJson('click'); var textContent = event.target.textContent; var json = {}; defaultJson['nodename'] = nodename; defaultJson['textcontent'] = textContent; defaultJson['value'] = nodename == 'IMG' ? event.target.getAttribute('src'): ( nodename == 'A' ? event.target.getAttribute('href'): "" ); defaultJson['id'] = event.target.getAttribute('id'); console.log(JSON.stringify(defaultJson)); sendData('click', JSON.stringify(defaultJson)); }; console.log('loaded'); } //window.addEventListener('load', onloadTrackTin, {once: true}); //window.addEventListener('blur', function(){sendData('window.blur', JSON.stringify(getDefaultJson('window.blur')))}); //window.addEventListener('focus', function(){sendData('window.focus',JSON.stringify(getDefaultJson('window.focus')))}); window.addEventListener('beforeunload', function(){sendData('window.beforeunload',JSON.stringify(getDefaultJson('window.beforeunload')))}); function sendScrollTrack(num){ logg('scrolled at '+num+' at : '+ new Date().getTime()); var defaultJson = getDefaultJson('scroll'); defaultJson['value'] = num; sendData('scroll', JSON.stringify(defaultJson)); } var ScrollTrack = (function ($window, $document){ var options = { triggerEventsFraction: 20 } var $documentElement; var documentHeight, windowHeight, scrollableHeight, eventsPercentages = [], triggeredEvents = [], subscribedCallbacks = {}; var cacheDom = function (){ $documentElement = $document.documentElement; } var calculateHeights = function (){ documentHeight = Math.max( $documentElement.scrollHeight, $documentElement.offsetHeight, $documentElement.clientHeight, $documentElement.scrollHeight, $documentElement.offsetHeight ); windowHeight = $window.innerHeight; scrollableHeight = documentHeight - windowHeight; } var createEventsPercentagesByFraction = function (){ var totalEventsPercentages = parseInt(100 / options.triggerEventsFraction); for(var i = 1; i <= totalEventsPercentages; i++) { eventsPercentages.push(i * options.triggerEventsFraction) } } var scrolledPercentage = function (){ var scrollTop = $window.pageYOffset || $documentElement.scrollTop || document.body.scrollTop || 0; return (scrollTop * 100) / scrollableHeight; } var triggerEvents = function (){ var freezedScrolledPercentage = scrolledPercentage(); var totalEventsPercentages = eventsPercentages.length; for (var i = 0; i < totalEventsPercentages; i ++) { var percentage = eventsPercentages[i]; if ( freezedScrolledPercentage >= percentage && eventNotFiredYet(percentage) ) { triggerEvent(percentage); } } } var triggerEvent = function(percentage) { triggeredEvents.push(percentage); runCallbacks(percentage); } var bindEvents = function (){ $window.addEventListener('scroll', triggerEvents); } var eventNotFiredYet = function (percentage) { var totalTriggeredEvents = triggeredEvents.length; for (var i = 0; i < totalTriggeredEvents; i++ ) { if (triggeredEvents[i] == percentage) { return false } } return true; } var setTriggerEventsFraction = function (value){ options.triggerEventsFraction = parseInt(value * 100); } var subscribeCallback = function (percentage, callback){ var percentageString = parseInt(percentage * 100).toString(); if (typeof(subscribedCallbacks[percentageString]) === 'undefined') { subscribedCallbacks[percentageString] = []; } subscribedCallbacks[percentageString].push(callback); } var runCallbacks = function (percentage) { var percentageString = percentage.toString(); if (typeof(subscribedCallbacks[percentageString]) !== 'undefined') { var percentageCallbacks = subscribedCallbacks[percentageString], totalCallbacks = percentageCallbacks.length; for (var i = 0; i < totalCallbacks; i++) { var callback = percentageCallbacks[i]; callback(percentage); } } } // initializers cacheDom(); calculateHeights(); createEventsPercentagesByFraction(); return { setTriggerEventsFraction: setTriggerEventsFraction, bindEvents: bindEvents, subscribeCallback: subscribeCallback } })(window, document) ScrollTrack.setTriggerEventsFraction(0.20); ScrollTrack.bindEvents(); ScrollTrack.subscribeCallback(0.20, function (){ sendScrollTrack(20); }); ScrollTrack.subscribeCallback(0.40, function (){ ;sendScrollTrack(40); }); ScrollTrack.subscribeCallback(0.60, function (){ sendScrollTrack(60); }); ScrollTrack.subscribeCallback(0.80, function (){ sendScrollTrack(80); }); ScrollTrack.subscribeCallback(1.0, function (){ sendScrollTrack(100); }); onloadTrackTin();