(function() { var setCookieObj = {"idsite":"400","_userid":"AF1C8829-AD6C-46D7-91C0-590EBF7C576C"}; var trackerUrls; /* * Cross-browser helper function to add event handler */ function addEventListener(element, eventType, eventHandler, useCapture) { if (element.addEventListener) { element.addEventListener(eventType, eventHandler, useCapture); return true; } if (element.attachEvent) { return element.attachEvent('on' + eventType, eventHandler); } element['on' + eventType] = eventHandler; } function getImage(request, callback) { var image = new Image(1, 1); image.onload = function () { iterator = 0; // To avoid JSLint warning of empty block if (typeof callback === 'function') { callback(); } }; image.src = trackerUrls.transitionUrl + (trackerUrls.transitionUrl.indexOf('?') < 0 ? '?' : '&') + request; } function sendXmlHttpRequest(request, url, callback, async, requestType) { if (typeof async === 'undefined' || null === async) { async = true; } if (typeof requestType === 'undefined' || null === requestType) { requestType = 'POST'; } if (requestType === 'GET') { url = url + "?" + request; } try { // we use the progid Microsoft.XMLHTTP because // IE5.5 included MSXML 2.5; the progid MSXML2.XMLHTTP // is pinned to MSXML2.XMLHTTP.3.0 var xhr = window.XMLHttpRequest ? new window.XMLHttpRequest() : window.ActiveXObject ? new ActiveXObject('Microsoft.XMLHTTP') : null; xhr.withCredentials = true; xhr.open(requestType, url, async); if (async === true) { // fallback on error xhr.onreadystatechange = function () { if (this.readyState === 4 && !(this.status >= 200 && this.status < 300)) { getImage(request, callback); } else { if (typeof callback === 'function') { callback(); } } }; } xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8'); xhr.send(request); } catch (e) { // fallback getImage(request, callback); } } function getReferrer() { var referrer = ''; try { referrer = window.top.document.referrer; } catch (e) { if (window.parent) { try { referrer = window.parent.document.referrer; } catch (e2) { referrer = ''; } } } if (referrer === '') { referrer = document.referrer; } return referrer; } function getCookie(cookieName) { var cookiePattern = new RegExp('(^|;)[ ]*' + cookieName + '[^;]*' + '=([^;]*)'), cookieMatch = cookiePattern.exec(document.cookie); return cookieMatch ? window.decodeURIComponent(cookieMatch[2]) : 0; } function setCookie(cookieName, value, msToExpire, path, domain, secure) { // relative time to expire in milliseconds if (! msToExpire) { msToExpire = 10*365*24*60*60*1000; //10 years in milliseconds } var expireDate = new Date(); expireDate.setTime(expireDate.getTime() + msToExpire); if (! domain) { var parts = window.location.host.split('.'); if (parts.length >= 2) { domain = "." + parts[parts.length - 2] + "." + parts[parts.length - 1]; } } var c = cookieName + '=' + window.encodeURIComponent(value) + (msToExpire ? ';expires=' + expireDate.toGMTString() : '') + ';path=' + (path || '/') + (domain ? ';domain=' + domain : '') + (secure ? ';secure' : ''); document.cookie = c; } function getScriptBaseUrl() { var scripts = document.getElementsByTagName('script'); var index = scripts.length - 1; var myScript = scripts[index]; var url = myScript.src; var arr = url.split("/"); return "//" + arr[2] + "/"; }; function readTrackerUrls() { for (var i = 0; i < _paq.length; i++) { var methodName = _paq[i][0]; if (methodName === 'setTrackerUrls') { return _paq[i][1]; } } var u = getScriptBaseUrl(); return { transitionUrl: u+'stats/saveTransition/', impressionUrl: u+'stats/saveImpression/', clickUrl: u+'stats/saveClick/', customEventUrl: u+'stats/saveCustomEvent/' }; } function readConfig() { var idsite = setCookieObj.idsite, uuid = setCookieObj._userid; var config = { idsite: idsite, uuid: uuid, uid: '', customData: null }; for (var i = 0; i < _paq.length; i++) { var methodName = _paq[i][0]; if (methodName === 'setTrackerUrls') { config.trackerUrls = _paq[i][1]; } else if (methodName === 'setUserId') { config.uid = _paq[i][1]; } else if (methodName === 'setCustomData') { config.customData = _paq[i][1]; } } return config; } function initSetSiteIdAndUserCookie() { if (typeof setCookieObj !== 'undefined' && setCookieObj) { _paq.push(["setSiteId", setCookieObj.idsite]); //NOTE: this cookie is no longer relevant because we always overwrite _userid on the server //we set it for backward compatibility purposes if (!getCookie("_aa_userid")) { setCookie("_aa_userid", setCookieObj._userid); } } } trackerUrls = readTrackerUrls(); initSetSiteIdAndUserCookie(); var config = readConfig(), now = new Date(), devicePixelRatio = (new RegExp('Mac OS X.*Safari/')).test(navigator.userAgent) ? window.devicePixelRatio || 1 : 1, // screen resolution // - only Apple reports screen.* in device-independent-pixels (dips) // - devicePixelRatio is always 2 on MacOSX+Retina regardless of resolution set in Display Preferences res = screen.width * devicePixelRatio + 'x' + screen.height * devicePixelRatio, request = 'direction=enter' + '&idsite=' + config.idsite + '&h=' + now.getHours() + '&m=' + now.getMinutes() + '&s=' + now.getSeconds() + '&url=' + window.encodeURIComponent(window.location.href) + '&urlref=' + window.encodeURIComponent(getReferrer()) + '&uid=' + window.encodeURIComponent(config.uid) + '&_userid=' + //config.uuid + '&res=' + res; if (config.customData) { request += "&data=" + window.encodeURIComponent(JSON.stringify(config.customData)); } // console.log("sending transition=enter request: " + request); if (setCookieObj.suspend) { _paq.unshift(['initSuspend']); _paq.push(['trackPageView']); } else { sendXmlHttpRequest(request, trackerUrls.transitionUrl); } AdultiumAnalytic = AdultiumAnalyticsTimeTracker = (function(){ var intervalId = null; var totalViewTime = 0; var lastChunkStartTime = null; var wasFirstThresholdBilled = false; var urlOverrideImpl = null; function getTimeThreshold(itemType) { if (itemType === 'video') { return 15000; } return 3000; } function sendViewTimeEvent(viewTime, itemType, billable) { if (itemType === 'image' && totalViewTime >= 30000) { billable = false; } totalViewTime += viewTime; var url = window.encodeURIComponent(window.location.href); if (urlOverrideImpl) { url = urlOverrideImpl; } var customData = { event: 'custom_view_time', view_time: viewTime, billable: billable }; if (itemType) { customData.item_type = itemType; } if (viewTime >= getTimeThreshold(itemType)) { wasFirstThresholdBilled = true; } if (config.customData) { for(var i in config.customData) { customData[i] = config.customData[i]; } } var request = 'idsite=' + config.idsite + '&url=' + url + '&urlref=' + window.encodeURIComponent(getReferrer()) + '&_userid=' + config.uuid + '&data=' + window.encodeURIComponent(JSON.stringify(customData)); sendXmlHttpRequest(request, trackerUrls.customEventUrl); } function getIntervalHandler(itemType) { return function() { lastChunkStartTime = new Date(); var billable = true; sendViewTimeEvent(getTimeThreshold(itemType), itemType, billable); }; } addEventListener(window, 'load', function() { totalViewTime = 0; }, false); addEventListener(window, 'hashchange', function() { totalViewTime = 0; }, false); return { isFullyInitialized: false, getStatsServerUserId: function() { return setCookieObj._userid; }, startImageViewTimeTracking: function(urlOverride) { this.startViewTimeTracking(urlOverride, "image"); }, stopImageViewTimeTracking: function(urlOverride) { this.stopViewTimeTracking(urlOverride, "image"); }, startViewTimeTracking: function(urlOverride, itemType) { urlOverrideImpl = null; if (urlOverride) { urlOverrideImpl = urlOverride; } if (!itemType) { itemType = "video"; } lastChunkStartTime = new Date(); if (intervalId === null) { intervalId = setInterval(getIntervalHandler(itemType), getTimeThreshold(itemType)); } }, stopViewTimeTracking: function(urlOverride, itemType) { if (urlOverride) { urlOverrideImpl = urlOverride; } if (!itemType) { itemType = "video"; } if (intervalId !== null) { clearInterval(intervalId); } intervalId = null; if (lastChunkStartTime !== null) { // viewTime here is always <= 15000 (or 3000) var viewTime = new Date().getTime() - lastChunkStartTime.getTime(); // if viewTime <= 15000 (or 3000) but there were already at least 15 secs (or 3) billed for this video (or image) var billable = wasFirstThresholdBilled === true; sendViewTimeEvent(viewTime, itemType, billable); } lastChunkStartTime = null; } }; })(); })();