{"version":3,"sources":["tla-min.js"],"names":["tlaInit","window","createGuid","s4","Math","floor","random","toString","substring","getTlaQuery","key","URLSearchParams","location","search","get","e","getTlaUserFp","newFp","_tla","execFunction","obj","args","shift","apply","checkProp","propId","test","getHostUrl","isIframe","refMacroUrl","length","toLowerCase","startsWith","unescape","hostUrl","document","href","refUrl","referrer","checkVisible","elementName","cont","getElementById","override","querySelector","isInViewport","hasParenWithClass","el","cls","parentNode","className","RegExp","addZoneClickTracker","container","respJson","zoneId","selfTrackingClick","addEventListener","tla","updateZoneViewStatus","setInterval","templateId","productId","campaignLineItemId","contentSetVersionId","campaignDeliveryTypeIds","join","elm","target","srcElement","aar","getElementsByTagName","j","processQueue","queue","execFnc","itm","Array","prototype","slice","call","ex","fnWrap","callback","getByXhr","uri","targetContainer","Xhr","XMLHttpRequest","request","open","withCredentials","setRequestHeader","onreadystatechange","readyState","status","responseText","send","postByXhr","data","postData","ImpressionTracker","setData","a","b","self","this","userSession","propertyId","timestamp","currPage","Date","getTimezoneOffset","navigator","product","appName","version","platform","characterSet","language","userAgent","body","clientWidth","clientHeight","screen","width","height","compatMode","colorDepth","pixelDepth","tlaServiceUri","scrollStop","Object","event","clientY","isScrolling","clearTimeout","setTimeout","elem","bounding","getBoundingClientRect","top","left","bottom","innerHeight","documentElement","right","innerWidth","domReady","arguments","tracker","multiFrame","fp","parent","viewedZones","initiated","context","initialise","tlaObject","tlaTs","create","track","iframe","getContent","setContext","templateContentClick","conversion","clientConversion","propOk","action","JSON","stringify","et","usid","pid","ts","url","tz","hn","hostname","hp","port","pt","protocol","hr","rf","cta","prid","cli","csv","zn","cdtv","isArray","arg1","val","valt","arg2","type","value","arg","receiveContent","response","parse","content","cntr","innerHTML","scripts","i","script","eval","tlaSelfTracking","encodeURI","eventType","tgt","id","nodeName","fid","fc","init"],"mappings":"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","file":"tla-min.js","sourcesContent":["var tlaInit = (function (window) {\r\n\r\n var tlaServiceUri = \"#{AppSettings.PublisherServiceUrl}api/v1/\";\r\n\r\n //Create new GUID for local/session storage\r\n function createGuid() {\r\n function s4() {\r\n return Math.floor((1 + Math.random()) * 0x10000)\r\n .toString(16)\r\n .substring(1);\r\n }\r\n\r\n return s4() + s4() + \"-\" + s4() + \"-\" + s4() + \"-\" + s4() + \"-\" + s4() + s4() + s4();\r\n }\r\n\r\n function getTlaQuery(key) {\r\n try {\r\n var urlParams = new URLSearchParams(window.location.search);\r\n return urlParams.get(key);\r\n } catch (e) {\r\n return null;\r\n }\r\n }\r\n\r\n // Get the tlaUserFp\r\n function getTlaUserFp() {\r\n // Generate new fp\r\n var newFp = createGuid();\r\n _tla(\"track\", \"fp\", newFp);\r\n\r\n return newFp;\r\n }\r\n\r\n function execFunction(obj, args) {\r\n //remove first argument as always key. Pass remaining args to function\r\n var key = args.shift();\r\n\r\n //if named function exists then apply it\r\n if (obj[key]) {\r\n //apply function listed in key\r\n obj[key].apply(obj, args);\r\n }\r\n }\r\n\r\n function checkProp(propId) {\r\n //Requires network-publisher-site\r\n var pattern = /^[a-z]{3}[0-9]{2}-[0-9a-f]{7}-[0-9a-f]{3}$/i;\r\n\r\n if (pattern.test(propId)) {\r\n void 0;\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n function getHostUrl(isIframe) {\r\n void 0;\r\n void 0;\r\n void 0;\r\n\r\n var refMacroUrl = window['_tlaRefMacro'];\r\n\r\n if (refMacroUrl && refMacroUrl.length > 0 && refMacroUrl.toLowerCase().startsWith(\"http\")) {\r\n\r\n return unescape(refMacroUrl);\r\n }\r\n\r\n var hostUrl = document.location.href;\r\n\r\n if (isIframe) {\r\n // Use Referrer to ge parent URL\r\n var refUrl = document.referrer;\r\n if (refUrl.length > 0) {\r\n hostUrl = refUrl;\r\n }\r\n }\r\n\r\n return hostUrl;\r\n }\r\n\r\n var scrollStop = function (callback) {\r\n // Make sure a valid callback was provided\r\n if (!callback || Object.prototype.toString.call(callback) !== '[object Function]') return;\r\n\r\n document.addEventListener('mouseout', function (event) {\r\n\r\n // Set an internal to run after \r\n setInterval(function () {\r\n if (event.clientY <= 0) {\r\n // Run the callback\r\n callback();\r\n }\r\n }, 66);\r\n });\r\n\r\n // Setup scrolling variable\r\n var isScrolling;\r\n\r\n // Listen for scroll events\r\n window.addEventListener('scroll', function (event) {\r\n\r\n // Clear our timeout throughout the scroll\r\n window.clearTimeout(isScrolling);\r\n\r\n // Set a timeout to run after scrolling ends\r\n isScrolling = setTimeout(function () {\r\n\r\n // Run the callback\r\n callback();\r\n\r\n }, 66);\r\n\r\n }, false);\r\n\r\n };\r\n\r\n // Check if a given element is visible in the viewport.\r\n var isInViewport = function (elem) {\r\n var bounding = elem.getBoundingClientRect();\r\n\r\n // Ensure element has height.\r\n if (bounding.height < 1) {\r\n return false;\r\n }\r\n\r\n return (\r\n bounding.top >= 0 &&\r\n bounding.left >= 0 &&\r\n bounding.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&\r\n bounding.right <= (window.innerWidth || document.documentElement.clientWidth)\r\n );\r\n };\r\n\r\n // Check if a given zone element is visible in the viewport.\r\n function checkVisible(elementName) {\r\n // Cross domain iframe functionality not implemented yet. Will always return visible for IFrame currently.\r\n var cont = document.getElementById(elementName);\r\n var override = cont.querySelector(\".tla-zv\");\r\n\r\n if (override === null) {\r\n return isInViewport(cont);\r\n } else {\r\n return isInViewport(override);\r\n }\r\n }\r\n\r\n // Check if a given element is has parent with a given class.\r\n function hasParenWithClass(el, cls) {\r\n // If we are here we didn't find the searched class in any parents node\r\n if (!el.parentNode) {\r\n return false;\r\n }\r\n\r\n // If the current node has the class return true, otherwise we will search\r\n // it in the parent node\r\n if (el.className && new RegExp(\"(\\\\s|^)\" + cls + \"(\\\\s|$)\").test(el.className)) {\r\n return true;\r\n }\r\n\r\n return hasParenWithClass(el.parentNode, cls);\r\n }\r\n\r\n // Add click event tracker on the zone container.\r\n function addZoneClickTracker(container, respJson, zoneId, selfTrackingClick) {\r\n var cont = document.getElementById(container);\r\n cont.addEventListener(\"click\", function (e) {\r\n tla.updateZoneViewStatus(container, respJson, zoneId);\r\n setInterval(function () { tla.updateZoneViewStatus(container, respJson, zoneId); }, 300);\r\n\r\n _tla(\"templateContentClick\", \"KeyPress\", e, respJson.templateId, respJson.productId, respJson.campaignLineItemId, respJson.contentSetVersionId, zoneId, respJson.campaignDeliveryTypeIds.join(\",\"));\r\n\r\n var elm = e.target || e.srcElement;\r\n if (!selfTrackingClick && hasParenWithClass(elm, \"tla-zc\")) {\r\n _tla(\"templateContentClick\", \"Click\", e, respJson.templateId, respJson.productId, respJson.campaignLineItemId, respJson.contentSetVersionId, zoneId, respJson.campaignDeliveryTypeIds.join(\",\"));\r\n }\r\n });\r\n\r\n var aar = cont.getElementsByTagName(\"a\");\r\n for (var j = 0; j < aar.length; j++) {\r\n aar[j].addEventListener(\"click\", function (e) {\r\n if (!selfTrackingClick) {\r\n _tla(\"templateContentClick\", \"Click\", e, respJson.templateId, respJson.productId, respJson.campaignLineItemId, respJson.contentSetVersionId, zoneId, respJson.campaignDeliveryTypeIds.join(\",\"));\r\n }\r\n });\r\n }\r\n }\r\n\r\n // Picks items off the global queue and executes them\r\n function processQueue(obj, queue, execFnc) {\r\n try {\r\n\r\n while (queue.length > 0) {\r\n //get the first item from the queue\r\n var itm = queue.shift();\r\n\r\n execFnc(obj, Array.prototype.slice.call(itm));\r\n\r\n } //loop\r\n } catch (ex) {\r\n void 0;\r\n }\r\n }\r\n\r\n // Add function to list\r\n function fnWrap(key, obj, callback) {\r\n //assign function to list \r\n obj[key] = callback;\r\n }\r\n\r\n // Get Content by AJAX.\r\n function getByXhr(uri, callback, targetContainer, zoneId) {\r\n var Xhr = window.XMLHttpRequest;\r\n void 0;\r\n if (!Xhr) return false;\r\n\r\n var request = new Xhr;\r\n\r\n if (!(\"withCredentials\" in request)) return false;\r\n\r\n request.open(\"GET\", uri, true);\r\n\r\n request.withCredentials = false;\r\n //Send as plain text rather than JSON to prevent preflight call\r\n //Also, senBeacon sends as plain text so consistent.\r\n request.setRequestHeader(\"Content-Type\", \"text/plain\");\r\n\r\n request.onreadystatechange = function () {\r\n if (4 === request.readyState && 200 === request.status) {\r\n callback(request.responseText, targetContainer, zoneId);\r\n request = null;\r\n }\r\n };\r\n\r\n request.send();\r\n\r\n return true;\r\n }\r\n\r\n // Send by AJAX.\r\n function postByXhr(uri, data) {\r\n var Xhr = window.XMLHttpRequest;\r\n void 0;\r\n if (!Xhr)\r\n return false;\r\n\r\n var request = new Xhr;\r\n\r\n if (!(\"withCredentials\" in request))\r\n return false;\r\n\r\n request.open(\"POST\", uri, true);\r\n\r\n request.withCredentials = false;\r\n //Send as plain text rather than JSON to prevent preflight call\r\n //Also, senBeacon sends as plain text so consistent.\r\n request.setRequestHeader(\"Content-Type\", \"text/plain\");\r\n request.onreadystatechange = function () {\r\n 4 === request.readyState && (request = null);\r\n };\r\n request.send(data);\r\n\r\n return true;\r\n }\r\n\r\n // Post the given data to the service API.\r\n function postData(uri, data) {\r\n //Try sending by each method\r\n if (8192 >= data.length) {\r\n void 0;\r\n postByXhr(uri, data);\r\n }\r\n }\r\n\r\n var domReady = function (callback) {\r\n document.readyState === \"interactive\" || document.readyState === \"complete\" ? callback() : document.addEventListener(\"DOMContentLoaded\", callback);\r\n };\r\n\r\n // BEGIN TLA OBJECT\r\n var tla = function () {\r\n void 0;\r\n //execute function request\r\n execFunction(tla, Array.prototype.slice.call(arguments));\r\n };\r\n\r\n tla.timestamp = 0; //var to hold timestamp passed in from publisher page. We can use this to compare against further timestamps for load speed etc\r\n tla.tracker; //object to hold tracking data for page impression recording\r\n tla.multiFrame = false; //used to prevent re-running setup/tracking where we have multipe IFrame instances on a page (multiple zones). Other than this, IFrame instances will not know about each other\r\n\r\n tla.propertyId = \"\"; //'PropertyId' represents a publisher property - format is NETWORK-PUBLISHER-WEBSITE [a-z]{3}[0-9]{2}-[0-9a-f]{7}-[0-9a-f]{3}\r\n tla.fp; // a GUID generated user Id\r\n tla.userSession; // a GUID for the user session generated here\r\n tla.isIframe = !(window === window.parent); //returns whether IFrame\r\n tla.currPage = getHostUrl(tla.isIframe); //returns the current URL/parent URL when IFrame\r\n\r\n tla.viewedZones = {}; //Dictionary object\r\n\r\n tla.initiated = false; //used to test if TLA object has already been assigned to _tla\r\n tla.context = \"\"; //Var to hold publisher context data if passed in\r\n\r\n tla.initialise = function () {\r\n //_tla is the global object name created in the page script that holds the command queue\r\n var tlaObject = window[\"_tla\"];\r\n\r\n //check for new instance - no need to do this if not\r\n if (!tlaObject.initiated) {\r\n //add intial page script vars to TLA object\r\n tla.queue = tlaObject.queue;\r\n\r\n var tlaTs = getTlaQuery('tlaTs');\r\n if (tlaTs) {\r\n tla.timestamp = tlaTs;\r\n } else {\r\n tla.timestamp = tlaObject.timestamp;\r\n }\r\n\r\n //Create array of client functions (so we can refer to by key later)\r\n fnWrap(\"create\", tla, tla.create);\r\n fnWrap(\"track\", tla, tla.track);\r\n fnWrap(\"iframe\", tla, tla.iframe);\r\n fnWrap(\"getContent\", tla, tla.getContent);\r\n fnWrap(\"setContext\", tla, tla.setContext);\r\n fnWrap(\"templateContentClick\", tla, tla.templateContentClick);\r\n fnWrap(\"conversion\", tla, tla.conversion);\r\n fnWrap(\"clientConversion\", tla, tla.clientConversion);\r\n //assign TLA to global obj\r\n window[\"_tla\"] = tla;\r\n //console.log(_tla.queue.length);\r\n\r\n //Now process the queue to handle commands set while js file was loading async\r\n processQueue(tla, tla.queue, execFunction);\r\n\r\n void 0;\r\n }\r\n };\r\n\r\n //Create - function sets up tracker\r\n tla.create = function (propId) {\r\n void 0;\r\n if (!tla.initiated && checkProp(propId)) {\r\n void 0;\r\n tla.propertyId = propId;\r\n tla.propOk = true;\r\n\r\n var userSession = createGuid();\r\n var fp = getTlaUserFp();\r\n //check if user id exists(multiple zones!-new uid could have been created but not yet stored) then read user localStorage GUID to get user id.\r\n tla.fp = tla.fp || fp || \"\";\r\n //check if user session exists, then read user sessionStorage GUID to get the user session id \r\n tla.userSession = tla.userSession || userSession || \"\";\r\n\r\n void 0;\r\n void 0;\r\n\r\n //##TODO - what else do we need to do here? ##\r\n\r\n tla.initiated = true;\r\n }\r\n };\r\n\r\n\r\n //Track - gathers tracking data into TLA object\r\n tla.track = function (action, args) {\r\n void 0;\r\n void 0;\r\n if (tla.propOk) {\r\n switch (action) {\r\n case \"event\":\r\n postData(tlaServiceUri + \"post/\", JSON.stringify(args));\r\n void 0;\r\n break;\r\n case \"page\":\r\n if (!tla.multiFrame) {\r\n void 0;\r\n var data = {\r\n et: \"Page\",\r\n fp: tla.fp,\r\n usid: tla.userSession,\r\n pid: tla.propertyId,\r\n ts: tla.timestamp,\r\n url: tla.currPage,\r\n tz: (new Date()).getTimezoneOffset() / 60,\r\n hn: document.location.hostname,\r\n hp: document.location.port,\r\n pt: document.location.protocol,\r\n hr: document.location.href,\r\n rf: document.referrer\r\n };\r\n //Send impression track to API\r\n postData(tlaServiceUri + \"post/\", JSON.stringify(data));\r\n }\r\n break;\r\n case \"fp\":\r\n void 0;\r\n tla.tracker = new ImpressionTracker(tla, args);\r\n //Send impression track to API\r\n postData(tlaServiceUri + \"post/\", JSON.stringify(tla.tracker.data));\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n };\r\n\r\n tla.updateZoneViewStatus = function (container, respJson, zoneId) {\r\n void 0;\r\n if (tla.viewedZones[zoneId] === false && (checkVisible(container) || tla.isIframe)) {\r\n setTimeout(function () {\r\n if (tla.viewedZones[zoneId] === false && (checkVisible(container) || tla.isIframe)) {\r\n //fire content viewed event\r\n void 0;\r\n tla.viewedZones[zoneId] = true;\r\n\r\n if (respJson.templateId) {\r\n var data = {\r\n et: \"AdvertView\",\r\n fp: tla.fp,\r\n usid: tla.userSession,\r\n pid: tla.propertyId,\r\n ts: tla.timestamp,\r\n url: tla.currPage,\r\n tz: (new Date()).getTimezoneOffset() / 60,\r\n cta: respJson.templateId,\r\n prid: respJson.productId,\r\n cli: respJson.campaignLineItemId,\r\n csv: respJson.contentSetVersionId,\r\n zn: zoneId,\r\n cdtv: respJson.campaignDeliveryTypeIds.join(\",\")\r\n };\r\n _tla(\"track\", \"event\", data);\r\n }\r\n }\r\n }, 300);\r\n }\r\n };\r\n\r\n tla.setContext = function () {\r\n tla.context = Array.prototype.slice.call(arguments);\r\n };\r\n\r\n tla.clientConversion = function (obj) {\r\n // Array = \r\n // 0 = Use query string vars\r\n // 1 = cta,\r\n // 2 = csv\r\n // 3 = zn\r\n // 4 = type\r\n // 5 = value\r\n var isObjArray = Array.isArray(obj);\r\n\r\n if (isObjArray) {\r\n var arg1 = {\r\n et: \"ClientConversion\",\r\n fp: tla.fp,\r\n usid: tla.userSession,\r\n pid: tla.propertyId,\r\n ts: tla.timestamp,\r\n url: tla.currPage,\r\n tz: (new Date()).getTimezoneOffset() / 60,\r\n cta: obj[1],\r\n csv: obj[2],\r\n zn: obj[3],\r\n val: obj[5],\r\n valt: obj[4]\r\n };\r\n\r\n _tla(\"track\", \"event\", arg1);\r\n } else {\r\n // Check the data is in the query string.\r\n var cta = getTlaQuery(\"tlaCta\"),\r\n csv = getTlaQuery(\"tlaCsv\"),\r\n zn = getTlaQuery(\"tlaZn\");\r\n\r\n if (cta && csv && zn) {\r\n var arg2 = {\r\n et: \"ClientConversion\",\r\n fp: tla.fp,\r\n usid: tla.userSession,\r\n pid: tla.propertyId,\r\n ts: tla.timestamp,\r\n url: tla.currPage,\r\n tz: (new Date()).getTimezoneOffset() / 60,\r\n cta: cta,\r\n csv: csv,\r\n zn: zn,\r\n val: tla.currPage,\r\n valt: type\r\n };\r\n\r\n _tla(\"track\", \"event\", arg2);\r\n }\r\n }\r\n };\r\n\r\n tla.conversion = function (type, value, cta, csv, zn) {\r\n var arg = {\r\n et: \"Conversion\",\r\n fp: tla.fp,\r\n usid: tla.userSession,\r\n pid: tla.propertyId,\r\n ts: tla.timestamp,\r\n url: tla.currPage,\r\n tz: (new Date()).getTimezoneOffset() / 60,\r\n cta: cta,\r\n csv: csv,\r\n zn: zn,\r\n val: value,\r\n valt: type\r\n };\r\n\r\n _tla(\"track\", \"event\", arg);\r\n };\r\n\r\n tla.receiveContent = function (response, container, zoneId) {\r\n void 0;\r\n var respJson = JSON.parse(response);\r\n if (respJson && respJson.content) {\r\n var cntr = document.getElementById(container);\r\n cntr.innerHTML = respJson.content;\r\n\r\n var scripts = cntr.getElementsByTagName(\"script\");\r\n for (var i = 0; i < scripts.length; ++i) {\r\n var script = scripts[i];\r\n eval(script.innerHTML);\r\n }\r\n\r\n if (respJson.templateId) {\r\n tla.viewedZones[zoneId] = false;\r\n\r\n var tlaSelfTracking = cntr.querySelector('input[name=\"tlaSelfTracking\"]') != null ? true : false;\r\n\r\n addZoneClickTracker(container, respJson, zoneId, tlaSelfTracking);\r\n\r\n var data = {\r\n et: \"AdvertLoad\",\r\n fp: tla.fp,\r\n usid: tla.userSession,\r\n pid: tla.propertyId,\r\n ts: tla.timestamp,\r\n url: tla.currPage,\r\n tz: (new Date()).getTimezoneOffset() / 60,\r\n cta: respJson.templateId,\r\n zn: zoneId,\r\n prid: respJson.productId,\r\n cli: respJson.campaignLineItemId,\r\n csv: respJson.contentSetVersionId,\r\n cdtv: respJson.campaignDeliveryTypeIds.join(\",\")\r\n };\r\n _tla(\"track\", \"event\", data);\r\n\r\n void 0;\r\n\r\n scrollStop(function () {\r\n tla.updateZoneViewStatus(container, respJson, zoneId);\r\n });\r\n\r\n if (tla.isIframe) {\r\n tla.updateZoneViewStatus(container, respJson, zoneId);\r\n }\r\n }\r\n }\r\n };\r\n\r\n tla.getContent = function (zoneId, container) {\r\n if (tla.propOk) {\r\n //##TODO: need to add check for no specified container in which case output HTML to parent element\r\n\r\n var fp = tla.fp;\r\n var uri = tlaServiceUri + \"content/?propertyid=\" + tla.propertyId + \"&fp=\" + fp + \"&zoneid=\" + zoneId + \"&ts=\" + tla.timestamp + \"&url=\" + encodeURI(tla.currPage) + \"&clientwidth=\" + document.body.clientWidth + \"&context=\" + encodeURI(tla.context);\r\n\r\n getByXhr(uri, tla.receiveContent, container, zoneId);\r\n }\r\n };\r\n\r\n tla.iframe = function (zoneId, multiFrame, top) {\r\n tla.multiFrame = multiFrame;\r\n void 0;\r\n };\r\n\r\n tla.templateContentClick = function (eventType, e, templateId, productId, campaignLineItemId, contentSetVersionId, zoneId, campaignDeliveryTypeIds) {\r\n e = e || window.event;\r\n var elm = e.target || e.srcElement;\r\n var cls = elm.className;\r\n if (typeof cls !== \"string\") {\r\n cls = \"\";\r\n }\r\n\r\n var arg = {\r\n et: eventType,\r\n fp: tla.fp,\r\n usid: tla.userSession,\r\n pid: tla.propertyId,\r\n ts: tla.timestamp,\r\n url: tla.currPage,\r\n tz: (new Date()).getTimezoneOffset() / 60,\r\n cta: templateId,\r\n prid: productId,\r\n cli: campaignLineItemId,\r\n csv: contentSetVersionId,\r\n zn: zoneId,\r\n tgt: elm.href || elm.id || cls || elm.nodeName,\r\n fid: elm.id || cls || elm.nodeName,\r\n fc: elm.nodeName,\r\n cdtv: campaignDeliveryTypeIds\r\n };\r\n _tla(\"track\", \"event\", arg);\r\n return true;\r\n };\r\n\r\n tla.propOk = false;\r\n //END TLA OBJECT\r\n\r\n //OTHER FUNCTIONS\r\n function ImpressionTracker(obj, args) {\r\n var self = this;\r\n\r\n function setData(a, b) {\r\n self.data[a] = b;\r\n }\r\n\r\n self.data = {};\r\n setData(\"et\", 8),\r\n setData(\"fp\", args),\r\n setData(\"usid\", obj.userSession),\r\n setData(\"pid\", obj.propertyId),\r\n setData(\"ts\", obj.timestamp),\r\n setData(\"url\", obj.currPage),\r\n setData(\"tz\", (new Date()).getTimezoneOffset() / 60),\r\n setData(\"pd\", navigator.product),\r\n setData(\"an\", navigator.appName),\r\n setData(\"vs\", navigator.version),\r\n setData(\"plt\", navigator.platform),\r\n setData(\"cs\", navigator.characterSet),\r\n setData(\"lg\", navigator.language),\r\n setData(\"ag\", navigator.userAgent),\r\n setData(\"cw\", document.body.clientWidth),\r\n setData(\"ch\", document.body.clientHeight),\r\n setData(\"sw\", screen.width),\r\n setData(\"sh\", screen.height),\r\n setData(\"cm\", document.compatMode),\r\n setData(\"cc\", screen.colorDepth),\r\n setData(\"pxd\", screen.pixelDepth);\r\n }\r\n\r\n return {\r\n init: function () {\r\n void 0;\r\n domReady(function () {\r\n var t = tla.initialise;\r\n t.apply();\r\n });\r\n\r\n //##TODO - need to add check for document visible and add listener so we don't try running tracking etc without document loaded.\r\n void 0;\r\n }\r\n };\r\n})(window);\r\n\r\ntlaInit.init();"]}