
var ark_AI = {
    ready: false,
    Init: function (account) {
        ark.triggerEvent("arkGaInitStarted", account);
        if (account) {
            var appInsights = window.appInsights || function (config) {
                function i(config) { t[config] = function () { var i = arguments; t.queue.push(function () { t[config].apply(t, i) }) } } var t = { config: config }, u = document, e = window, o = "script", s = "AuthenticatedUserContext", h = "start", c = "stop", l = "Track", a = l + "Event", v = l + "Page", y = u.createElement(o), r, f; y.src = config.url || "https://az416426.vo.msecnd.net/scripts/a/ai.0.js"; u.getElementsByTagName(o)[0].parentNode.appendChild(y); try { t.cookie = u.cookie } catch (p) { } for (t.queue = [], t.version = "1.0", r = ["Event", "Exception", "Metric", "PageView", "Trace", "Dependency"]; r.length;) i("track" + r.pop()); return i("set" + s), i("clear" + s), i(h + a), i(c + a), i(h + v), i(c + v), i("flush"), config.disableExceptionTracking || (r = "onerror", i("_" + r), f = e[r], e[r] = function (config, i, u, e, o) { var s = f && f(config, i, u, e, o); return s !== !0 && t["_" + r](config, i, u, e, o), s }), t
            }({
                instrumentationKey: account
            });
            window.appInsights = appInsights;
            this.ready = true;
            ark.triggerEvent("arkAiReady", account);
        }
    },

    Event: function (eventData) {
        if (this.ready) {
            var data = this._normalizeData(eventData);
            ark.triggerEvent("arkAiOnEventSending", { data: data });
            appInsights.trackEvent("event", data);
            ark.triggerEvent("arkAiOnEventSended", { data: data });
        } else {
            ark.logging('Error: AI is not ready');
        }
    },

    Pageview: function (pageviewData) {
        function url_domain(data) {
            var a = document.createElement('a');
            a.href = data;
            return a.hostname;
        };
        if (this.ready) {
            var data = this._normalizeData(pageviewData);
            if (url_domain(window.location.href) !== url_domain(window.document.referrer)) {
                data.referrer = window.document.referrer;
            }
            ark.triggerEvent("arkAiOnPageviewSending", { data: data });
            appInsights.trackPageView(arkGaVirtualPages.getPage(), document.location.href, data);
            ark.triggerEvent("arkAiOnPageviewSended", { data: data });
        } else {
            ark.logging('Error: AI is not ready');
        }
    },

    _normalizeData: function (data) {
        try {
            var result = {};
            for (var prop in data) {
                var type = typeof (data[prop]);
                if (type == "function" || type == "object")
                    continue;
                result[prop] = data[prop];
            }
            return result;
        } catch (e) { return data; }
    }
}
ark_AI.Init(aiInstrumentationKey);
/*
google analytics helper
*/

function url_domain(data) {
    var a = document.createElement('a');
    a.href = data;
    return a.hostname;
}

var parentWindow = window;

var ark_Ga = {
    trackers: [],
    ready: false,
    eventsQueue: [],
    pageviewQueue: [],

    Init: function (accounts) {
        ark.triggerEvent("arkGaInitStarted", accounts);
        (function (i, s, o, g, r, a, m) {
            i['GoogleAnalyticsObject'] = r; i[r] = i[r] || function () {
                (i[r].q = i[r].q || []).push(arguments)
            }, i[r].l = 1 * new Date(); a = s.createElement(o),
            m = s.getElementsByTagName(o)[0]; a.async = 1; a.src = g; m.parentNode.insertBefore(a, m)
        })(window, document, 'script', '//www.google-analytics.com/analytics.js', '_arkGa');
        var i;
        for (i = 0; i < accounts.length; i++) {
            _arkGa('create', accounts[i].account_id, 'auto', accounts[i].name,
                {
                    sampleRate: accounts[i].sampleRate == "" ? '100' : accounts[i].sampleRate,
                });
            //if (url_domain(parentWindow.location.href) !== url_domain(parentWindow.document.referrer)) {
            //    _arkGa(accounts[i].name + '.set', 'referrer', parentWindow.document.referrer);
            //}
            this.trackers.push({ name: accounts[i].name, account_id: accounts[i].account_id });
        }

        this.ready = true;
        window.ark_AI = parentWindow.ark_AI;
        ark.logging('GA is ready');
        ark.triggerEvent("arkGaReady");
        ark_Ga.SetGlobalDimensions([{slot: "15", value: arkPage.user.isActive ? "1" : "0"}]);
        if (window.userBadges){
            ark_Ga.SetGlobalDimensions([{slot: "16", value: window.userBadges.map(function (t) { return t.Key }).join("|")}]);
        }
        var q;
        for (i = 0; i < window.ark_Ga.pageviewQueue.length; i++) {
            q = window.ark_Ga.pageviewQueue[i];
            this.Pageview(q.data.pageview, q.data.dimensions);
        }

        for (i = 0; i < window.ark_Ga.eventsQueue.length; i++) {
            q = this.eventsQueue[i];
            if (q.data.isInteractional) {
                this.Event(q.data.category, q.data.action, q.data.label, q.data.callback, q.data.dimensions);
            } else {
                this.EventNonInteractional(q.data.category,
                    q.data.action,
                    q.data.label,
                    q.data.callback,
                    q.data.dimensions);
            }
        }
    },
    
    getGaObject: function () {
        return _arkGa;
    },

    Event: function (category, action, label, callback, dimensions) {
        if (this.ready) {
            if (typeof (callback) != "function") {
                callback = function () { }
            }
            var eventData = {
                hitType: 'event',
                eventCategory: category,
                eventAction: action,
                eventLabel: label,
                nonInteraction: false,
                hitCallback: callback,
                location: parentWindow.location.href
            };
            if (typeof (dimensions) != undefined) {
                for (var j in dimensions) {
                    eventData['dimension' + dimensions[j].slot] = dimensions[j].value;
                }
            }
            for (var i = 0; i < this.trackers.length; i++) {
                ark.triggerEvent("arkGaOnEventSending", { data: eventData, account: this.trackers[i] });
                _arkGa(this.trackers[i].name + '.send', eventData);
                ark.triggerEvent("arkGaOnEventSended", { data: eventData, account: this.trackers[i] });
            }
            ark_AI.Event(eventData);
        } else {
            this.eventsQueue.push({
                data: {
                    isInteractional: true,
                    category: category,
                    action: action,
                    label: label,
                    callback: callback,
                    dimensions: dimensions
                }
            });
            ark.logging('Error: GA is not ready');
        }
    },

    EventNonInteractional: function (category, action, label, callback, dimensions) {
        if (this.ready) {
            if (typeof (callback) != "function") {
                callback = function () { }
            }
            var eventData = {
                hitType: 'event',
                eventCategory: category,
                eventAction: action,
                eventLabel: label,
                nonInteraction: true,
                hitCallback: callback,
                location: parentWindow.location.href
            };
            if (typeof (dimensions) != undefined) {
                for (var j in dimensions) {
                    eventData['dimension' + dimensions[j].slot] = dimensions[j].value;
                }
            }
            for (var i = 0; i < this.trackers.length; i++) {
                ark.triggerEvent("arkGaOnEventNonInteractionalSending", { data: eventData, account: this.trackers[i] });
                _arkGa(this.trackers[i].name + '.send', eventData);
                ark.triggerEvent("arkGaOnEventNonInteractionalSended", { data: eventData, account: this.trackers[i] });
            }
            ark_AI.Event(eventData);
        } else {
            this.eventsQueue.push({
                data: {
                    isInteractional: false,
                    category: category,
                    action: action,
                    label: label,
                    callback: callback,
                    dimensions: dimensions
                }
            });
            ark.logging('Error: GA is not ready');
        }
    },

    Pageview: function (pageview, dimensions) {
        if (this.ready) {
            var eventData = {
                hitType: 'pageview',
                title: pageview,
                location: parentWindow.location.href
            };
            if (typeof (dimensions) != undefined) {
                for (var j in dimensions) {
                    eventData['dimension' + dimensions[j].slot] = dimensions[j].value;
                }
            }
            for (var i = 0; i < this.trackers.length; i++) {
                ark.triggerEvent("arkGaOnPageviewSending", { data: eventData, account: this.trackers[i] });
                _arkGa(this.trackers[i].name + '.send', eventData);
                ark.triggerEvent("arkGaOnPageviewSended", { data: eventData, account: this.trackers[i] });
            }
            ark_AI.Pageview(eventData);
        } else {
            this.pageviewQueue.push({ func: window.ark_Ga.Pageview, data: { pageview: pageview, dimensions: dimensions } });
            ark.logging('Error: GA is not ready');
        }
    },

    AddTracker: function (account) {
        if (this.ready) {
            try {
                if (!this._checkIfAccountAdded(account)) {
                    if (account && typeof (account.account_id) == "string" && typeof (account.name) == "string") {

                        if (!account.sampleRate) account.sampleRate = "";

                        _arkGa('create', account.account_id, 'auto', account.name,
                                {
                                    sampleRate: account.sampleRate == "" ? '100' : account.sampleRate,
                                    cookieDomain: window.location.host,
                                    cookieName: account.cookieName
                                });

                        this.trackers.push({ name: account.name });
                    }
                }
            } catch (err) {
                ark.logging(err);
            }
        }
        else {
            ark.logging('Error: GA is not ready');
        }
    },

    SetGlobalDimensions: function (dimensions, customAccounts) {
        if (this.ready) {
            customAccounts = customAccounts || this.trackers;
            for (var i = 0; i < dimensions.length; i++) {
                try {
                    for (var j = 0; j < customAccounts.length; j++) {
                        if (this._checkIfAccountAdded(customAccounts[j])) {
                            _arkGa(customAccounts[j].name + '.set', 'dimension' + dimensions[i].slot, dimensions[i].value);
                        }
                    }
                } catch (err) {
                    ark.logging(err);
                }
            }
        }
        else {
            ark.logging('Error: GA is not ready');
        }
    },

    EventCustom: function (account, data) {
        if (this.ready) {
            //account = {
            //    account_id: "",
            //    name: "",
            //    sampleRate: "",
            //    cookieName: ""
            //}

            //data = {
            //    category: "",
            //    action: "",
            //    label: "",
            //    callback: "",
            //    nonInteraction: true,
            //    dimensions: [
            //        {
            //            slot: "",
            //            value: ""
            //        }
            //    ]
            //}

            _arkGa('create', account.account_id, 'auto', account.name,
            {
                sampleRate: !account.sampleRate || account.sampleRate == "" ? '100' : account.sampleRate,
                cookieDomain: window.location.host,
                cookieName: account.cookieName
            });

            var eventData = {
                hitType: 'event',
                eventCategory: data.category,
                eventAction: data.action,
                eventLabel: data.label,
                nonInteraction: data.nonInteraction,
                hitCallback: data.callback,
                location: window.parent.location.href
            };
            if (typeof (data.dimensions) != undefined) {
                for (var j in data.dimensions) {
                    eventData['dimension' + data.dimensions[j].slot] = data.dimensions[j].value;
                }
            }
            ark.triggerEvent("arkGaOnEventCustomSending", { data: eventData, account: account });
            _arkGa(account.name + '.send', eventData);
            ark.triggerEvent("arkGaOnEventCustomSended", { data: eventData, account: account });

        }
        else {
            ark.logging('Error: GA is not ready');
        }
    },

    PageviewCustom: function (account, data) {
        //account = {
        //    account_id: "",
        //    name: "",
        //    sampleRate: "",
        //    cookieName: ""
        //}

        //data = {
        //    pageview: "",
        //    dimensions: [
        //        { slot: "", value: "" }
        //    ]
        //}
        if (this.ready) {
            _arkGa('create', account.account_id, 'auto', account.name,
            {
                sampleRate: !account.sampleRate || account.sampleRate == "" ? '100' : account.sampleRate,
                cookieDomain: window.location.host,
                cookieName: account.cookieName
            });

            var eventData = {
                hitType: 'pageview',
                title: data.pageview,
                location: window.parent.location.href
            };

            if (typeof (data.dimensions) != undefined) {
                for (var j in data.dimensions) {
                    eventData['dimension' + data.dimensions[j].slot] = data.dimensions[j].value;
                }
            }
            ark.triggerEvent("arkGaOnPageviewCustomSending", { data: eventData, account: account });
            _arkGa(account.name + '.send', eventData);
            ark.triggerEvent("arkGaOnPageviewCustomSended", { data: eventData, account: account });

        }
        else {
            ark.logging('Error: GA is not ready');
        }
    },

    _checkIfAccountAdded: function (account) {
        for (var i = 0; i < this.trackers.length; i++) {
            if (this.trackers[i].account_id == account.account_id) {
                return true;
            }
        }
        return false;
    }
}
//window.parent.ark_Ga = ark_Ga;
ark.triggerEvent("arkGaHelperReady");


function arkGaInit() {
    if (typeof (accounts) != "undefined") {
        ark_Ga.Init(accounts);
    }
    else {
        ark_Ga.Init([]);
    }
}

/*
google analytics helper
*/
//common functions/extensions
function getElementOffset(el) {
    var _x = 0;
    var _y = 0;
    var res = {};
    while (el && !isNaN(el.offsetLeft) && !isNaN(el.offsetTop)) {
        _x += el.offsetLeft - el.scrollLeft;
        _y += el.offsetTop - el.scrollTop;
        el = el.offsetParent;
    }
    return { top: _y, left: _x };
}

function getElementViewabilityData(el) {
    var attrHeight = el.getAttribute("height");
    var attrWidth = el.getAttribute("width");

    return {
        height: attrHeight || el.clientHeight,
        width: attrWidth || el.clientWidth,
        isViewable: isScrolledIntoView(el) && el.offsetHeight > 0
    };
}

function isScrolledIntoView(elem) {
    var $elem = ark_jQuery(elem);
    var $window = ark_jQuery(window);

    var docViewTop = $window.scrollTop();
    var docViewBottom = docViewTop + $window.height();

    var elemTop = $elem.offset().top;
    var elemBottom = elemTop + $elem.height();

    return ((elemBottom <= docViewBottom || elemBottom - docViewBottom <= elem.clientHeight / 2 ) && (elemTop >= docViewTop || docViewTop - elemTop <= elem.clientHeight / 2));
}

function removeEmptyStrings(array) {
    var res = [];
    array.forEach(function (val, i, obj) {
        if (val != "") { res.push(val); }
    });
    return res;
}

function parseSearchQuery(qstr) {
    qstr = qstr.replace("?", "");
    var query = {};
    var a = qstr.split('&');
    for (var i = 0; i < a.length; i++) {
        var b = a[i].split('=');
        query[decodeURIComponent(b[0])] = decodeURIComponent(b[1] || '');
    }
    return query;
}

function getTimeOffset(startTime, endTime) {
    var elapsed = endTime.getTime() - startTime.getTime();
    return Math.floor((elapsed) / (1000));
}

function roundTime(timeSeconds, step) {
    step = step || 5;
    if (timeSeconds <= 1) {
        return "0";
    }
    else {
        var t = timeSeconds % step;
        if (t != 0) {
            timeSeconds += (step - t);
        }
        return timeSeconds;
    }
}

function getCookieByName(cname) {
    var name = cname + "=";
    var ca = document.cookie.split(';');
    for(var i = 0; i <ca.length; i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') {
            c = c.substring(1);
        }
        if (c.indexOf(name) == 0) {
            return c.substring(name.length,c.length);
        }
    }
    return "";
}

ark_jQuery.each(["show", "toggle", "toggleClass", "addClass", "removeClass"],
    function() {
        var _oldFn = ark_jQuery.fn[this];
        ark_jQuery.fn[this] = function() {
            var elements = arkGaEventsHandler.trackedElements;
            var hidden = [];
            for (var i = 0; i < elements.length; i++) {
                if (elements[i].element.offsetHeight <= 0) {
                    hidden.push(elements[i].element);
                }
            }
            var result = _oldFn.apply(this, arguments);
            for (var i = 0; i < hidden.length; i++) {
                if (hidden[i].offsetHeight > 0) {
                    ark_jQuery(hidden[i]).triggerHandler("show");
                }
            }
            return result;
        }
    });


var arkGaVirtualPages = {
    part1: "",
    part2: "",
    skipIGP: false,
    skipPreroll: false,
    firstVisit: null,
    arkPromo: null,

    routingRules: {
        games: function(p1, p2) {
            arkGaVirtualPages.setPart2(p2);
            if (arkPage.user.IsBookmarkBehavior() || arkPage.user.isPlayAgain()) {
                arkGaVirtualPages.setPart1("game start");
            } else {
                arkGaVirtualPages.setPart1("game details");
            }
        },
        arenaapi: function(p1,p2){
            arkGaVirtualPages.setPart2(p2);
            arkGaVirtualPages.setPart1("game start");
        },
        category: function (p1, p2) {
            arkGaVirtualPages.setPart2(p2);
            arkGaVirtualPages.setPart1("categories");
        },
        quizdetails: function (p1, p2) {
            arkGaVirtualPages.setPart2(parseSearchQuery(document.location.search)["game"]);
            arkGaVirtualPages.setPart1("game details");
        },
        quiz: function (p1, p2) {
            arkGaVirtualPages.setPart2(parseSearchQuery(document.location.search)["game"]);
            arkGaVirtualPages.setGameStart();
        },
        video: function (p1, p2) {
            arkGaVirtualPages.setPart2(p2);
            arkGaVirtualPages.setPart1("game details");
        },
        def: function (p1, p2) {
            arkGaVirtualPages.setPart2(p2);
            arkGaVirtualPages.setPart1(p1);
        },
    },
    init: function () {
        if (typeof (ark_Ga) == "undefined") {
            ark.addListener("arkGaHelperReady", function () {
                arkGaVirtualPages.init();
            });
            return;
        }
        this.registerListeners();

        var searhQuery = parseSearchQuery(document.location.search);

        var playAgain = searhQuery["playAgain"];
        var skipPrerollValue = searhQuery["skipPreroll"];
        this.skipIGP = playAgain == "1";
        this.skipPreroll = skipPrerollValue == "1";
        ark.triggerEvent("skipIGPChanged");
        this.arkPromo = searhQuery["arkpromo"];
        this.firstVisit = this.getUserData().firstVisit;

        
        var path = document.location.pathname;
        if (path === "/") {
            this.setPart1("arena home");
        }
        else {
            var p1 = "", p2 = "";
            var pageParts = removeEmptyStrings(path.split('/'));
            if (pageParts.length > 0) {
                p1 = pageParts[0].toLowerCase();
        }
            if (pageParts.length > 1) {
                p2 = pageParts[1].toLowerCase();
        }

            if (typeof (this.routingRules[p1]) == "function") {
                this.routingRules[p1](p1, p2);
            } else {
                this.routingRules["def"](p1, p2);
        }
        }
    },
    registerListeners: function () {

        ark.addListener('arkShowGameEndEvent',
            function (args) {
                if (arkGaVirtualPages.part1 != "game end") {
                    arkGaVirtualPages.setPart1("game end");
                }
                ark_Ga.EventNonInteractional("Funnel_End_Screen",
                    arkGaVirtualPages.part2,
                    arkGaVirtualPages.getFunnelEventLabel());
            });

        //arkVideoAdInitialized
        //video start
        ark.addListener("arkVideoStartEvent", function () {
            arkGaVirtualPages.setGameStart();
        });

        ark.addListener("ark:login", function () {
            if (arkPage.user && arkPage.user.isActive) {
                var event = ark_AI._normalizeData(arkPage.user);
                event.eventCategory = "User_Login_Info";
                event.eventLabel = arkGaVirtualPages.getFunnelEventLabel();
                event.hitType = "event";
                event.nonInteraction = true;
                ark_AI.Event(event);
            }
            ark_Ga.SetGlobalDimensions([{slot: 15, value: "1"}]);
        });

        ark.addListener("arkUserBadgeAwarded", function (arg) {
            var url = "/UserItems/UserBadgesInfo/";
            if (navigator.userAgent.indexOf("MSIE ") > -1 || navigator.userAgent.indexOf("Trident/") > -1 || navigator.userAgent.indexOf("Edge/") > -1) {
                url += "?v=" + Math.random(); //fix for IE to prevent caching
            }
            
            ark_jQuery.get(url, function(resp){
                if (resp.Result) {
                    var userBadges = resp.Result.filter(function (itm) {
                        return itm.IsUnlocked;
                    }).map(function (t) { return t.Key });
                    ark_Ga.Event("Profile_Badge", arg, arkGaVirtualPages.getFunnelEventLabel(), null, [{
                        slot: 16,
                        value: userBadges.join('|')
                    }]);

                }
            });
        });

        //TODO: video end
        //

        //PB quiz end
        ark.addListener("quiz_article_result", function () {
            arkGaVirtualPages.setGameEnd();
            ark.triggerEvent('arkShowGameEndEvent');
        });

        //TODO: ark quizzes end event
        //ark.addListener("quiz_end", function () { setGameEnd(); });


        //PageView Listener
        ark.addListener('arkVirtualPageViewChanged', function () {
            if (arkGaVirtualPages.part1 != '') {
                var dimensions = [];
                if (arkGaVirtualPages.arkPromo) {
                    dimensions.push({slot: "11", value: arkGaVirtualPages.arkPromo});
                }
                if (arkGaVirtualPages.firstVisit) {
                    dimensions.push({slot: "12", value: arkGaVirtualPages.firstVisit});
                }
                if (arkGaVirtualPages.part1 === "game start") {
                    arkGaVirtualPages._addGameplayStory(arkGaVirtualPages.part2);
                }

                var gameplayStory = getCookieByName("arkGaGameplayHistory");
                if (gameplayStory) {
                    dimensions.push({slot: "13", value: decodeURI(gameplayStory)});
                }

                try {
                    var userAgent = navigator.userAgent.length <= 2000 ? navigator.userAgent : navigator.userAgent.substr(0, 2000);
                    dimensions.push({slot: "14", value: userAgent});
                } catch (err) {
                }
                ark_Ga.Pageview(arkGaVirtualPages.getDomain() + ' | ' + arkGaVirtualPages.getPage(), dimensions);
            }
        });
    },
    setPart1: function (value) {
        if (this.part1 != value) {
            this.part1 = value;

            arkGaPageHelpers.def.execute();
            var pageExec = arkGaPageHelpers.get({ page: this.part1, func: "execute" });
            if (pageExec) {
                pageExec();
            }
            ark.triggerEvent('arkVirtualPageViewChanged');
        }
    },
    setPart2: function (value) {
        if (typeof (contentId) != "undefined") value = contentId;
        if (this.part2 != value) {
            this.part2 = value;
            ark.triggerEvent('arkVirtualPageViewChanged');
        }
    },
    getPage: function () {
        if(this.part1 && this.part2){
        return this.part1 + '/' + this.part2;
            }
        else if(this.part1){
            return  this.part1 + '/';
            }
        else if(this.part2){
            return this.part2;
            }
        return "";
    },
    getDomain: function () {
        return document.location.host;
    },
    getAdDisplayEventLabel: function () {
        return this.getDomain() + " | " + this.getPage();
    },
    getFunnelEventLabel: function () {
        return this.getDomain() + " | " + this.getPage();
    },
    setGameStart: function () {
        arkGaVirtualPages.setPart1("game start");
    },
    setGameEnd: function () {
        ark.triggerEvent("arkContentEndEvent");
        arkGaVirtualPages.setPart1("game end");
    },
    getUserData: function(){
        var gaCookie = getCookieByName("_ga");
        if (gaCookie != "") {
            var cookieValues = gaCookie.split(".");
            var fv = new Date(0);
            fv.setSeconds(parseInt(cookieValues[3]));
            return {
                id: cookieValues[2],
                firstVisit: fv.getDate() + "_" + (fv.getMonth() + 1) + "_" + fv.getFullYear()
            };
        }
        return { id: null, firstVisit: null };
    },

    _addGameplayStory: function (game) {
        var gameplays = ark_jQuery.cookie("arkGaGameplayHistory");//ark_jQuery.cookie("ark_begin_session", true, { path: '/' });
        var values = [];
        if (gameplays) {
            values = gameplays.split("|");
            if (values.indexOf(game) < 0) {
                values.push(game);
            }
        }
        else {
            values.push(game);
        }
        gameplays = values.join("|");

        var date = new Date();
        var minutes = 30;
        date.setTime(date.getTime() + (minutes * 60 * 1000));

        ark_jQuery.cookie("arkGaGameplayHistory", gameplays, { path: '/', expires: date });
    },

    _isLandingPage: function() {
        var referrer = document.location.referrer;
        if (referrer) {
            var a = document.createElement("a");
            a.href = referer;
            return a.domain
        }
        return true;
    }
};

var arkGaPageHelpers = {
    get: function (params) {
        var result = null;
        if (params && params.func) {
            if (params.page) {
                if (this[params.page] && typeof (this[params.page][params.func]) == "function") {
                    result = this[params.page][params.func];
                }
                else if (typeof (this['def'][params.func]) == "function") {
                    result = this['def'][params.func];
                }
                else {
                    console.log("function " + params.func + " not found");
                    result = null;
                }
            }
            else if (typeof (this['def'][params.func]) == "function") {
                result = this['def'][params.func];
            }
            else {
                console.log("function " + params.func + " not found");
                result = null;
            }
        }
        if (typeof(result) == "function") {
            if (params.exec != false) {
                result = result(params.params);
            }
        }
        return result;
    },

    def: {
        execute: function () { },

        getTopNavDimension: function () {
            var res = "";
            var title = ark_jQuery("#titleUrl");
            if (title) {
                res += "Title|";
            }
            var topNavElements = ark_jQuery('ark-ul.arena-nav-secondvariant-list > ark-li');
            for (var i = 0; i < topNavElements.length; i++) {
                var elem = topNavElements[i];
                if (elem.offsetHeight > 0) {
                    var topNavItem = ark_jQuery(elem).attr('menu-item');
                    if (topNavItem && topNavItem.length > 0) {
                        res += topNavItem + "|";
                    }
                }
            }
            res = res.substring(0, res.length - 1);
            var hamburger = ark_jQuery('.arena-nav-more');
            if (hamburger[0] && hamburger[0].offsetHeight > 0) {
                res += "|Hamburger";
            }
            return res;
        },

        getHamburgerGaDimension: function () {
            return "Hamburger|" + (ark_jQuery("ark-ul.arena-nav-secondvariant-list > ark-li").length + 1).toString();
        },

        hamburgerGaTrackCondition: function () {
            if (arkGaVirtualPages.getPage() != 'arena home/')
                return false;

            var hamburger = ark_jQuery('.arena-nav-more')[0];
            return ark_jQuery(hamburger).hasClass('arena-nav-more-active')
        },

        defaultTrackCondition: function () {
            return arkGaVirtualPages.getPage() == 'arena home/';
        },

        topNavTrackCondition: function(elName){
            if (arkGaVirtualPages.getPage() != 'arena home/')
                return false;

            var elem = ark_jQuery("ark-li[menu-item='" + elName + "']")[0];
            if (elem) {
                var parent = ark_jQuery(elem).parent();
                if (parent) {
                    return !parent.hasClass('arena-nav-dropdown');
                }
            }
            return true;
        },

        getPromoBoxDimension: function (promo) {
            var result = null;
            try {
                if (promo) {

                    var gameModules = [];

                    var categories = ark_jQuery('ark-cat-section');
                    for(var i = 0; i < categories.length; i++){
                        var category = ark_jQuery(categories[i]).attr('game-category');
                        if(category){
                            gameModules.push(category);
                        }
                    }

                    var position = gameModules.indexOf(promo);
                    if (position >= 0) {
                        var parentElement = ark_jQuery("ark-cat-section[game-category='" + promo + "']")[0];
                        var viewability = getElementViewabilityData(parentElement).isViewable ? "Yes" : "No";
                        result = arkGaVirtualPages.getPage() + "|" + promo + "|" + position + "|" + viewability;
                    }
                }
            }
            catch (err) { }
            return result;
        },

        getArenaPromoBoxDimension: function () {
            try {
                var gameModules = ark_jQuery('ark-cat-section');
                var result = "";
                for (var i = 0; i < gameModules.length; i++) {
                    var module = gameModules[i];
                    var category = ark_jQuery(module).attr('game-category');
                    if (category) {
                        result += category + "|";
                    }
                }
                result = result.substring(0, result.length - 1);
                return result;
            }
            catch (e) { return null; }
        },

        getPromoBoxSlotDimension: function (params) {
            var elem = params.elem;
            var game = params.game;
            var position = params.position;
            var result = null;
            if (elem && game && position) {
                try {
                    var promoBoxCategory = ark_jQuery(elem.element).attr("game-category");
                    if (promoBoxCategory) {
                        if (position >= 0) {

                            var viewability = getElementViewabilityData(elem.element).isViewable ? "Yes" : "No";
                            result = arkGaVirtualPages.getPage() + "|" + promoBoxCategory + "|" + game + "|" + position + "|" + viewability;
                        }
                    }

                }
                catch (err) { }
            }
            return result;
        },

        arenaPromoBoxCondition: function () {
            return arkGaVirtualPages.getPage() == 'arena home/' && ark_jQuery("ark-cat-section[game-category]").length > 0;
        }
    },

    "arena home": {
        execute: function () {
            arkGaEventsHandler.addElement('.arena-nav-more',
            {
                events: "click",
                category: "Top_Nav_Slots",
                dimensions: '[{slot: "3", value: function(){ return  arkGaPageHelpers.get({func: "getHamburgerGaDimension"}) } }]',
                condition: "arkGaPageHelpers.get({ func: 'hamburgerGaTrackCondition' })"
            });

            arkGaEventsHandler.addElement('#titleUrl',
            {
                events: "click",
                category: "Top_Nav_Slots",
                dimensions: '[{slot: "3", value: "Title|0"}]',
                condition: "arkGaPageHelpers.get({ func: 'defaultTrackCondition' })"
            });
        }
    }
}

function adLoaded(e) {
    var elemData = getElementViewabilityData(e);
    ark_Ga.EventNonInteractional(
        'OnPageDisp_' + (elemData.width < 100 ? '0' : '') + elemData.width + '' + (elemData.height < 100 ? '0' : '') + elemData.height + '_' + 'notrefresh',
        elemData.isViewable ? 'Viewable' : 'NA',
        arkGaVirtualPages.getAdDisplayEventLabel()
        );
}

function adRefreshed(el) {
    var elemData = getElementViewabilityData(el);
    ark_Ga.Event(
        'OnPageDisp_' + (elemData.width < 100 ? '0': '') + elemData.width + '' +(elemData.height < 100 ? '0' : '') + elemData.height + '_' + 'refresh',
        elemData.isViewable ? 'Viewable' : 'NA',
        arkGaVirtualPages.getAdDisplayEventLabel()
        );
}

function PrerollRequested() {
    ark_Ga.Event('Funnel_PreRoll_Request', 'Impression', arkGaVirtualPages.getFunnelEventLabel());
}

function MidrollRequested() {
    ark_Ga.Event('Funnel_MidRoll_Request', 'Impression', arkGaVirtualPages.getFunnelEventLabel());
}

function PostrollRequested() {
    ark_Ga.Event('Funnel_PostRoll_Request', 'Impression', arkGaVirtualPages.getFunnelEventLabel());
}

ark.addListener('login-click', function () {
    ark_Ga.Event('Funnel_End_Button_LoginRegister', 'Click', arkGaVirtualPages.getFunnelEventLabel());
});

ark.addListener('top-nav-login-click', function () {
    ark_Ga.Event('Top_Nav_Login_Link', 'Click', arkGaVirtualPages.getFunnelEventLabel());
});

ark.addListener('save-to-leaderboard-click', function () {
    ark_Ga.Event('Funnel_End_Button_Leaderboard', 'Click', arkGaVirtualPages.getFunnelEventLabel());
});

ark.addListener('post-to-fb-click', function () {
    ark_Ga.Event('Funnel_End_Button_SocialShare_Facebook', 'Click', arkGaVirtualPages.getFunnelEventLabel());
});

var arkGaEventsHandler = {
    init: function (parentNode) {
        if (typeof (ark_Ga) == "undefined") {
            ark.addListener("arkGaHelperReady", function () {
                arkGaEventsHandler.init(parentNode)
            });
            return;
        }
        parentNode = parentNode || document;
        var elements = parentNode.querySelectorAll('[ark-ga-track]');
        for (var i = 0; i < elements.length; i++) {
            this.addElement(elements[i]);
        }
        for (var i = 0; i < this.trackedElements.length; i++) {
            this._processElement(this.trackedElements[i]);
        }
    },
    actions: {
        click: function (el) {
            var elements = (typeof (el.element) == "string") ? ark_jQuery(el.element) : [el.element];
            for (var i = 0; i < elements.length; i++) {
                var element = elements[i];
                ark_jQuery(element).click(function () {
                    if (arkGaEventsHandler._checkCondition(el)) {
                        ark_Ga.Event(
                            el.trackingData.category,
                            'Click',
                            el.trackingData.label || arkGaVirtualPages.getFunnelEventLabel(),
                            null,
                            arkGaEventsHandler._processDimensions(el));
                    }
                });
            }
        },
        impression: function (el) {
            var elements = (typeof (el.element) == "string") ? ark_jQuery(el.element) : [el.element];
            for (var i = 0; i < elements.length; i++) {
                var element = elements[i];
                if (element.offsetHeight > 0) {
                    if (arkGaEventsHandler._checkCondition(el)) {
                        ark_Ga.EventNonInteractional(
                            el.trackingData.category,
                            'Impression',
                            el.trackingData.label || arkGaVirtualPages.getFunnelEventLabel(),
                            null,
                            arkGaEventsHandler._processDimensions(el));
                    }
                }
                else {
                    ark_jQuery(element).on("show", function () {
                        if (arkGaEventsHandler._checkCondition(el) && element.offsetHeight > 0) {
                            ark_Ga.EventNonInteractional(
                                el.trackingData.category,
                                'Impression',
                                el.trackingData.label || arkGaVirtualPages.getFunnelEventLabel(),
                                null,
                                arkGaEventsHandler._processDimensions(el));
                        }
                    });
                }
            }
        },

        'display-ad-impression': function (el) {
            var elements = (typeof (el.element) == "string") ? ark_jQuery(el.element) : [el.element];
            for (var i = 0; i < elements.length; i++) {
                adLoaded(elements[i])
            }
        },

        def: function (val) {
            ark.logging("function " + val + " is not supported.")
        }
    },

    trackedElements: [],

    addElement: function (el, trackingData) {
        var data;
        if (trackingData) {
            data = {
                element: el,
                trackingData: trackingData
            }
        } else {
            data = {
                element: el,
                trackingData: {
                    events: ark_jQuery(el).attr("ark-ga-track"),
                    category: ark_jQuery(el).attr("ark-ga-track-category"),
                    label: ark_jQuery(el).attr("ark-ga-track-label"),
                    dimensions: ark_jQuery(el).attr("ark-ga-track-dimensions"),
                    condition: ark_jQuery(el).attr("ark-ga-track-condition")
                }
            }
        }
        var dimensions = this._getDimensions(data);
        if (dimensions) {
            data.trackingData.dimensions = dimensions;
        }
        if (!this._checkIfElementProcessed(data.element) && !ark_jQuery(data.element).attr("ark-ga-included")) {
            ark_jQuery(data.element).attr("ark-ga-included", "");
            this.trackedElements.push(data);
        }
    },

    _processDimensions: function (el) {
        if (el.trackingData && el.trackingData.dimensions && el.element) {
            var dimensions = el.trackingData.dimensions;
            for (var i = 0; i < dimensions.length; i++) {
                var dimension = dimensions[i];
                if (typeof (dimension.slot) == "function") {
                    dimension.slot = dimension.slot(el.element);
                }
                if (typeof (dimension.value) == "function") {
                    dimension.value = dimension.value(el.element);
                }
            }
            return dimensions;
        }
        return null;
    },

    _getDimensions: function (el) {
        var dimensions = null;
        try {
            if (el && el.trackingData) {
                var atrValue = el.trackingData.dimensions;
                if (atrValue && atrValue != '') {
                    dimensions = new Function("return " + atrValue)();
                    for (var i = 0; i < dimensions.length; i++) {
                        var dimension = dimensions[i];
                        if (dimension.deffered == false) {
                            if (typeof (dimension.slot) == "function") {
                                dimension.slot = dimension.slot(el);
                            }
                            if (typeof (dimension.value) == "function") {
                                dimension.value = dimension.value(el);
                            }
                        }
                    }
                }
            }
        }
        catch (err) {
            console.log(err);
        }
        return dimensions;
    },

    _checkCondition: function (el) {
        var result = false;
        try {
            var atrValue = el.trackingData.condition
            if (atrValue && atrValue != '') {
                if ((new Function('return ' + atrValue)())) {
                    result = true;
                }
            }
            else {
                result = true;
            }
        }
        catch (e) { result = false; }
        return result;
    },

    _processElement: function (elem) {
        try {
            if (!this._checkIfElementProcessed(elem.element)) {
                var values = removeEmptyStrings(elem.trackingData.events.split(','));
                for (var j = 0; j < values.length; j++) {
                    var val = values[j];
                    if (typeof (arkGaEventsHandler.actions[val]) == "function") {
                        arkGaEventsHandler.actions[val](elem);
                    } else {
                        arkGaEventsHandler.actions["def"](val);
                    }
                }

                ark_jQuery(elem.element).attr("ark-ga-track", "");
                ark_jQuery(elem.element).removeAttr("ark-ga-track-category");
                ark_jQuery(elem.element).removeAttr("ark-ga-track-dimensions");
                ark_jQuery(elem.element).removeAttr("ark-ga-track-condition");
                ark_jQuery(elem.element).removeAttr("ark-ga-track-label");
                ark_jQuery(elem.element).removeAttr("ark-ga-included");

                ark_jQuery(elem.element).attr("ark-ga-processed", "");
            }
        }
        catch (err) { debugger; }
    },

    _checkIfElementProcessed: function (el) {
        return ark_jQuery(el).attr("ark-ga-processed") != undefined;
    }
};

arkGaVirtualPages.init();

ark_jQuery(document).on("ready",
    function() {
        if (typeof (ark_Ga) === "undefined") {
            ark.addListener("arkGaHelperReady",
                function() {
                    arkGaInit();
                    arkGaEventsHandler.init();
                });
        } else {
            arkGaInit();
            arkGaEventsHandler.init();
        }
    });

var arkGaTimeManager = {

    prerollStartTime: null,
    contentStartTime: null,
    midrollStartTime: null,
    postrollStartTime: null,

    init: function () {
        this.registerListeners();
    },
    registerListeners: function () {

        //preroll
        ark.addListener("arkPrerollAdGaStartEvent", function () {
            arkGaTimeManager.prerollStartTime = new Date();
            ark_Ga.EventNonInteractional("Funnel_PreRoll_Request", 'Impression', arkGaVirtualPages.getFunnelEventLabel());
        });

        ark.addListener("arkPrerollAdGaEndEvent", function () {
            var time = roundTime(getTimeOffset(arkGaTimeManager.prerollStartTime, new Date()));
            arkGaTimeManager.prerollStartTime = null;
            ark_Ga.Event("Funnel_PreRoll_End", time, arkGaVirtualPages.getFunnelEventLabel());
        });

        ark.addListener("arkPrerollAdSkipEvent", function () {
            ark_Ga.EventNonInteractional("Funnel_PreRoll_NewUserSkip", 'Impression', arkGaVirtualPages.getFunnelEventLabel());
        });

        //midroll
        ark.addListener("arkIntermediateAdGaStartEvent", function () {
            arkGaTimeManager.midrollStartTime = new Date();
            ark_Ga.Event("Funnel_MidRoll_Request", 'Impression', arkGaVirtualPages.getFunnelEventLabel());
        });

        ark.addListener("arkIntermediateAdGaEndEvent", function () {
            var time = roundTime(getTimeOffset(arkGaTimeManager.midrollStartTime, new Date()));
            arkGaTimeManager.midrollStartTime = null;
            ark_Ga.Event("Funnel_MidRoll_End", time, arkGaVirtualPages.getFunnelEventLabel());
        });

        ark.addListener("arkIntermediateAdSkipEvent", function () {
            ark_Ga.EventNonInteractional("Funnel_MidRoll_NewUserSkip", 'Impression', arkGaVirtualPages.getFunnelEventLabel());
        });

        //postroll
        ark.addListener("arkPostrollAdGaStartEvent", function () {
            arkGaTimeManager.postrollStartTime = new Date();
            ark_Ga.Event("Funnel_PostRoll_Request", 'Impression', arkGaVirtualPages.getFunnelEventLabel());
        });

        ark.addListener("arkPostrollAdGaEndEvent", function () {
            var time = roundTime(getTimeOffset(arkGaTimeManager.postrollStartTime, new Date()));
            arkGaTimeManager.postrollStartTime = null;
            ark_Ga.Event("Funnel_PostRoll_End", time, arkGaVirtualPages.getFunnelEventLabel());
        });

        ark.addListener("arkPostrollAdSkipEvent", function () {
            ark_Ga.EventNonInteractional("Funnel_PostRolll_NewUserSkip", 'Impression', arkGaVirtualPages.getFunnelEventLabel());
        });

        //Content start/end
        ark.addListener("arkVideoStartEvent", function () {
            //if (arkGaTimeManager.prerollStartTime != null) {
            //    ark.triggerEvent("arkPrerollAdEndEvent");
            //}
            ark.triggerEvent("arkContentStartEvent");
        });

        ark.addListener('arkGameStartEvent', function () {
            //if (arkGaTimeManager.prerollStartTime != null) {
            //    ark.triggerEvent("arkPrerollAdEndEvent");
            //}
            ark.triggerEvent("arkContentStartEvent");
        });

        ark.addListener('quiz_start', function () {
            //if (arkGaTimeManager.prerollStartTime != null) {
            //    ark.triggerEvent("arkPrerollAdEndEvent");
            //}
            ark.triggerEvent("arkContentStartEvent");
        });

        ark.addListener("arkContentStartEvent", function () {
            arkGaTimeManager.contentStartTime = new Date();
            ark_Ga.Event("Funnel_Content_Start", arkGaVirtualPages.part2, arkGaVirtualPages.getFunnelEventLabel());
        });

        ark.addListener("arkContentEndEvent", function () {
            if (arkGaTimeManager.contentStartTime != null) {
                var time = roundTime(getTimeOffset(arkGaTimeManager.contentStartTime, new Date()));
                arkGaTimeManager.contentStartTime = null;
                ark_Ga.Event("Funnel_Content_End", arkGaVirtualPages.part2 + "|" + time, arkGaVirtualPages.getFunnelEventLabel());
            }
        });
    }
};
arkGaTimeManager.init();
