/* Minification failed. Returning unminified contents.
(5881,17-18): run-time error JS1005: Expected '(': {
(5882,13-20): run-time error JS1009: Expected '}': console
(5882,13-20): run-time error JS1006: Expected ')': console
(5882,13-20): run-time error JS1008: Expected '{': console
(5882,20-21): run-time error JS1195: Expected expression: .
(5887,17-18): run-time error JS1005: Expected '(': {
(5888,13-20): run-time error JS1009: Expected '}': console
(5888,13-20): run-time error JS1006: Expected ')': console
(5888,13-20): run-time error JS1008: Expected '{': console
(5888,20-21): run-time error JS1195: Expected expression: .
 */
Bonnier.namespace("Bonnier.Fotbollskanalen.BrowserDetectionModule");

Bonnier.Fotbollskanalen.BrowserDetectionModule = (function () {
    var getBrowserAndVersion = function () {
        var ua = navigator.userAgent, tem,
        M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || [];
        if (ua.contains("Google Page Speed Insights")) return null;
        if (/trident/i.test(M[1])) {
            tem = /\brv[ :]+(\d+)/g.exec(ua) || [];
            return 'IE ' + (tem[1] || '');
        }
        if (M[1] === 'Chrome') {
            tem = ua.match(/\b(OPR|Edge)\/(\d+)/);
            if (tem != null) return tem.slice(1).join(' ').replace('OPR', 'Opera');
        }
        M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?'];
        if ((tem = ua.match(/version\/(\d+)/i)) != null) M.splice(1, 1, tem[1]);
        return M;
    };

    var init = function () {
        var browserAndVersion = getBrowserAndVersion();
        var version = parseInt(browserAndVersion[1], 10);
        var browser = browserAndVersion[0];
        if ((browser === "Firefox" && version <= 27) || (browser === "Chrome" && version <= 35) || (browser === "MSIE" && version <= 9) || (browser === "Safari" && version <= 6)) {
            if (Fotbollskanalen.CookieModule.getCookie('browserDetection') === 'true') return;
            $('[data-js="old-browser-screen"]').show();
            $('[data-js="old-browser-continue"]').on('click', function() {
                $('[data-js="old-browser-screen"]').remove();
                Fotbollskanalen.CookieModule.setCookie('browserDetection', 'true', 7);
            });
        }
    };

    return {
        Init: init
    };
})();


(window.$fk || $)(function () {
    var ua = navigator.userAgent;
    if (Bonnier.Fotbollskanalen.DeviceTypeModule.IsDesktop() && !ua.contains("Google Page Speed Insights")) {
        Bonnier.Fotbollskanalen.BrowserDetectionModule.Init();
    }
});;
Bonnier.namespace("Bonnier.Fotbollskanalen.CommentsModule");

Bonnier.Fotbollskanalen.CommentsModule = (function () {
    var disqusLoaded = false;

    var load = function (containerId, identifier, url, title, shortName) {

        // Remove existing Disqus thread if in DOM
        var disqusThread = window.document.getElementById('disqus_thread');
        if (disqusThread) {
            disqusThread.parentElement.removeChild(disqusThread);
        }

        // Create new disqus thread div below button
        disqusThread = window.document.createElement('div');
        disqusThread.id = 'disqus_thread';
        window.document.getElementById(containerId).appendChild(disqusThread);

        resetDisqus(identifier, url, title, shortName);
    };


    var resetDisqus = function (identifier, url, title, shortName) {
        if (!disqusLoaded) {
            window.disqus_config = function () {
                this.page.url = url;
                this.page.identifier = identifier;
                this.page.title = title;
            };
            initDisqus(shortName);
        } else {
            window.DISQUS.reset({
                reload: true,
                config: function () {
                    this.page.identifier = identifier;
                    this.page.url = url;
                    this.page.title = title;
                }
            });
        }
    };

    var initDisqus = function (shortName) {
        if (disqusLoaded) return;

        var dsq = document.createElement('script');
        dsq.type = 'text/javascript'; dsq.async = true;
        dsq.src = 'https://' + shortName + '.disqus.com/embed.js';
        dsq.setAttribute('date-timestamp', +new Date());
        dsq.id = "dsq_js";
        (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
        disqusLoaded = true;
    };

    return {
        Load: load
    };

})();
;
Bonnier.namespace("Bonnier.Fotbollskanalen.CookieAcceptModule");

Bonnier.Fotbollskanalen.CookieAcceptModule = (function () {
    var bindClickEvent = function () {
        $('[data-js="add-cookie"]').on('click', function () {
            Fotbollskanalen.CookieModule.setCookie('cookie_accept', 'true', 365);
            $('[data-js="cookie-accept"]').remove();
        });
    };

    var init = function () {
        if (Fotbollskanalen.CookieModule.hasCookie('cookie_accept')) return;
        $('[data-js="cookie-accept"]').show();
        bindClickEvent();
    };

    return {
        Init: init
    };
})();


(window.$fk || $)(function () {
    var ua = navigator.userAgent;
    if (!ua.contains("Google Page Speed Insights") && !location.search.contains('utm_')) {
        Bonnier.Fotbollskanalen.CookieAcceptModule.Init();
    }
});;
Bonnier.namespace("Bonnier.Fotbollskanalen.DesktopAdPageViewIdModule");

Bonnier.Fotbollskanalen.DesktopAdPageViewIdModule = (function() {
    var easPageviewid;

    function createUuid() {
        return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) {
            var r = Math.random() * 16 | 0, v = c == "x" ? r : (r & 0x3 | 0x8);
            return v.toString(16);
        });
    }

    function getPageViewId() {
        return easPageviewid;
    }

    function init() {
        easPageviewid = createUuid();
    }

    return {
        Init: init,
        GetPageViewId: getPageViewId
    }

})();

Bonnier.Fotbollskanalen.DesktopAdPageViewIdModule.Init();;
Bonnier.namespace("Bonnier.Fotbollskanalen.DeviceTypeModule");

Bonnier.Fotbollskanalen.DeviceTypeModule = (function () {

    var hasClass = function (element, cls) {
        return (' ' + element.className + ' ').indexOf(' ' + cls + ' ') > -1;
    }

    var isSmartPhone = function () {
        return hasClass(document.body, 'mobile');
    };

    var isTablet = function () {
        return hasClass(document.body, 'tablet');
    };

    var isSmartPhoneOrTablet = function () {
        return isSmartPhone() || isTablet();
    };

    var isDesktop = function () {
        return hasClass(document.body, 'desktop');
    };

    var isHighDensity = function () {
        return ((window.matchMedia && (window.matchMedia('only screen and (min-resolution: 124dpi), only screen and (min-resolution: 1.3dppx), only screen and (min-resolution: 48.8dpcm)').matches || window.matchMedia('only screen and (-webkit-min-device-pixel-ratio: 1.3), only screen and (-o-min-device-pixel-ratio: 2.6/2), only screen and (min--moz-device-pixel-ratio: 1.3), only screen and (min-device-pixel-ratio: 1.3)').matches)) || (window.devicePixelRatio && window.devicePixelRatio > 1.3));
    }

    return {
        IsSmartPhone: isSmartPhone,
        IsTablet: isTablet,
        IsSmartPhoneOrTablet: isSmartPhoneOrTablet,
        IsDesktop: isDesktop,
        IsHighDensity: isHighDensity
    };

})();
;
Bonnier.namespace("Bonnier.Fotbollskanalen.ForceUpdateModule");

Bonnier.Fotbollskanalen.ForceUpdateModule = (function () {
    var bannerAnimationDelay = 1500;
    var updateBanner, appStoreLink;
    var notifyIfOutdatedVersion = function (newestVersion, forced) {

        // Avoid force message on startpage because of async version cookie write on iOS.
        if (location.pathname === "/" || location.pathname === "") {
            return;
        }
        // If current version is lower then the newest one and the user hasn't already declined this optional offer
        if (Bonnier.Fotbollskanalen.NativeBridgeModule.CurrentVersionIsLowerThan(newestVersion) &&
            (forced || !Fotbollskanalen.CookieModule.hasDeclinedAppVersion(newestVersion))) {
            updateBanner = document.createElement('div');
            updateBanner.setAttribute('class', 'app-update-banner');
            if ($t.isIos) {
                updateBanner.innerHTML = '<div class="version-msg">Det finns en ny version (' + newestVersion + ') av Fotbollskanalen</div><div class="download-msg">Uppdatera nu</div>';
                appStoreLink = 'itms-apps://itunes.apple.com/se/app/id445591689?mt=8';
            } else {
                updateBanner.innerHTML = '<div class="version-msg">Det finns en ny version (' + newestVersion + ') av Fotbollskanalen</div><div class="download-msg">Uppdatera nu</div>';
                appStoreLink = 'https://play.google.com/store/apps/details?id=se.tv4.fotbollskanalen.ui&hl=sv';
            }
            updateBanner.onclick = function () {
                window.location = appStoreLink;
            };
            if (!forced) {
                var closeButton = document.createElement('div');
                closeButton.setAttribute('class','close-button');
                closeButton.innerHTML = '&times;';
                closeButton.onclick = function (evt) {
                    updateBanner.style.top = "-140px";
                    Fotbollskanalen.CookieModule.declineAppVersion(newestVersion);
                    evt.stopPropagation();
                };
                updateBanner.appendChild(closeButton);
            }
            document.body.appendChild(updateBanner);
            setTimeout(function () {
                updateBanner.style.top = "0px";
            }, bannerAnimationDelay);
        }
    };

    return {
        NotifyIfOutdatedVersion: notifyIfOutdatedVersion
    };
})();;
Bonnier.namespace("Bonnier.Fotbollskanalen.GlobalSearchModule");

GlobalSearchViewModel = function () {
    var self = this;
    self.query = ko.observable("");
    var $body = $(document.body);
    var $mobileMenu = $('[data-mobile-menu]');
    var $clearInput = $('[data-clear-input]');
    var $globalSearch = $('[data-global-search]');
    var $header = $('[data-header]');
    self.scrollPosition = 0;
    self.ArticleSearchResults = ko.observableArray();
    self.VideoSearchResults = ko.observableArray();
    self.MixedSearchResults = ko.observableArray();
    self.hasMoreArticles = ko.observable(false);
    self.hasMoreVideos = ko.observable(false);
    self.searchText = ko.observable("");
    self.articleCountText = ko.observable("");
    self.videoCountText = ko.observable("");
    self.SuggestedLeagues = ko.observableArray();
    self.SuggestedTeams = ko.observableArray();
    self.SuggestedPlayers = ko.observableArray();
    self.SuggestedBlogs = ko.observableArray();
    self.MyItems = ko.observableArray();
    self.MyItemsHasItems = ko.observable(false);
    var resultTimer = null;
    var loaderTimer = null;
    var showingLoader = false;
    var loaderStartTimestamp = false;
    var currentQuery = "";
    var hostname = "";
    if ($t.isBlog || $t.isBlogTest) {
        var ua = navigator.userAgent.toLowerCase();
        var hasCookie = Fotbollskanalen.CookieModule.getCookie('NativeCookie') !== "";
        if (hasCookie && (ua.indexOf("android") > -1)) {
            hostname = "https://android.fotbollskanalen.se";
        } else if (hasCookie && (ua.indexOf("ipad") > -1 || ua.indexOf("iphone") > -1)) {
            hostname = "https://ios.fotbollskanalen.se";
        } else {
            hostname = "https://www.fotbollskanalen.se";
        }
    }

    moment.locale('en', {
        relativeTime: {
            future: "in %s",
            past: "%s ago",
            s: "s",
            m: "1m",
            mm: "%dm",
            h: "1t",
            hh: "%dt",
            d: "1d",
            dd: "%dd",
            M: "1m",
            MM: "%dm",
            y: "1å",
            yy: "%då"
        }
    });

    self.computeDate = function (date) {
        date = moment(date);
        if (moment().diff(date, 'days') > 1) {
            return moment(date, "YYYY-MM-DD HH:mm").fromNow(true);
        } else {
            return zeroPad(date.hour()) + ":" + zeroPad(date.minutes());
        }
    };

    self.memberContent = function (nids) {
        return nids !== null && (nids.indexOf('fotbollskanalen-medlemmar-geoblock') !== -1 || nids.indexOf('fotbollskanalen-medlemmar-ej-geoblock') !== -1);
    }

    var mapping = {
        'Videos': {
            create: function (options) {
                var model = ko.mapping.fromJS(options.data);
                model.id = options.data.id;
                model.published_date_time = self.computeDate(options.data.published_date_time);
                model.member_content = self.memberContent(options.data.category_title_nids);
                model.url = hostname + options.data.url;
                return model;
            }
        },
        'Articles': {
            create: function (options) {
                var model = ko.mapping.fromJS(options.data);
                model.created = self.computeDate(options.data.created);
                model.url = hostname + options.data.url;
                return model;
            }
        },
        'LandingPages': {
            create: function (options) {
                var model = ko.mapping.fromJS(options.data);
                model.friendly_url = hostname + options.data.friendly_url;
                model.name = options.data.name.length <= 15 || !options.data.short_name ? options.data.name : options.data.short_name;
                return model;
            }
        },
        'SuggestedPlayers': {
            create: function (options) {
                var model = ko.mapping.fromJS(options.data);
                model.name = options.data.name;
                model.touch_line_id = function () {
                    return options.data.player_id;
                };

                return model;
            }
        },
        'SuggestedTeams': {
            create: function (options) {
                var model = ko.mapping.fromJS(options.data);
                model.name = options.data.nick_name || options.data.name;
                model.touch_line_id = function () {
                    return options.data.team_id;
                };

                return model;
            }
        },
        'SuggestedLeagues': {
            create: function (options) {
                var model = ko.mapping.fromJS(options.data);
                model.name = options.data.nick_name || options.data.name;
                return model;
            }
        },
        'SuggestedBlogs': {
            create: function (options) {
                var model = ko.mapping.fromJS(options.data);
                model.name = options.data.name;
                return model;
            }
        },
        'MyItems': {
            create: function (options) {
                var model = ko.mapping.fromJS(options.data);
                model.name = options.data.nick_name;
                if (!model.name) {
                    model.name = options.data.name.length <= 15 || !options.data.short_name ? options.data.name : options.data.short_name;
                }
                model.image_url = function () {
                    return options.data.image_url;
                };
                return model;
            }
        }
    };

    var killTimers = function () {
        if (resultTimer) {
            clearTimeout(resultTimer);
            resultTimer = null;
        }
        if (loaderTimer) {
            clearTimeout(loaderTimer);
            loaderTimer = null;
        }
    };

    var showSearchSuggestions = function () {
        self.searchText("Snabbsök genom att klicka på lag eller spelare");
        $('[data-js="global-search-suggestions"]').show();
        if (self.SuggestedTeams().length === 0) {
            $.get(hostname + "/api/globalsearchsuggestions/", {}, function (results) {
                ko.mapping.fromJS(results.leagues, mapping["SuggestedLeagues"], self.SuggestedLeagues);
                ko.mapping.fromJS(results.blogs, mapping["SuggestedBlogs"], self.SuggestedBlogs);
                ko.mapping.fromJS(results.teams, mapping["SuggestedTeams"], self.SuggestedTeams);
                ko.mapping.fromJS(results.players, mapping["SuggestedPlayers"], self.SuggestedPlayers);
                Bonnier.Fotbollskanalen.ImageLazyLoadModule.InitLazyLoad();
            }, "json");

            teamCookies = Fotbollskanalen.CookieModule.getPersonalizedTeams().join();
            playerCookies = Fotbollskanalen.CookieModule.getPersonalizedPlayers().join();

            $.when(
                teamCookies ? $.getJSON("/api/teams/filter/" + teamCookies) : [[]],
                playerCookies ? $.getJSON("/api/players/filter/" + playerCookies) : [[]]
            ).then(function (teamResponse, playerResponse) {
                var myItems = teamResponse[0].concat(playerResponse[0]);
                self.MyItemsHasItems(myItems.length > 0);
                ko.mapping.fromJS(myItems, mapping['MyItems'], self.MyItems);
                Bonnier.Fotbollskanalen.ImageLazyLoadModule.InitLazyLoad();
                });
        }
    };

    self.KillSearch = function () {
        $globalSearch.hide();
        $header.removeClass('header__search--open');
        self.Search("");
        $('[data-js="all"]').removeClass('all--hide');
        if (self.scrollPosition > 0) {
            document.documentElement.scrollTop = document.body.scrollTop = self.scrollPosition;
        }
    };

    self.OpenSearch = function () {
        $globalSearch.show();
        $header.addClass('header__search--open');
        self.scrollPosition = document.documentElement.scrollTop || document.body.scrollTop;
        if ($body.hasClass('hamburger--open')) {
            $body.removeClass('hamburger--open');
            $mobileMenu.addClass('hidden');
        }
        showSearchSuggestions();
        $('[data-js="all"]').addClass('all--hide');
    };

    self.showMoreArticles = function () {
        var page = ~~(self.ArticleSearchResults().length / 5) + 1;
        $.get(hostname + "/api/articlesearch/freetext/" + encodeURIComponent(currentQuery) + "/page/" + page, {}, function (results) {
            $.map(results.items, function (item) {
                item.created = self.computeDate(item.created);
                item.url = hostname + item.url;
            });
            self.ArticleSearchResults.push.apply(self.ArticleSearchResults, results.items);
            self.hasMoreArticles(self.ArticleSearchResults().length < results.count);
            self.articleCountText(self.ArticleSearchResults().length + " av " + results.count);
        }, "json");
    };

    self.showMoreVideos = function () {
        var page = ~~(self.VideoSearchResults().length / 5) + 1;
        $.get(hostname + "/api/videosearch/freetext/" + encodeURIComponent(currentQuery) + "/page/" + page, {}, function (results) {
            $.map(results.items, function (item) {
                item.published_date_time = self.computeDate(item.published_date_time);
                item.member_content = self.memberContent(item.category_title_nids);
                item.url = hostname + item.url;
            });
            self.VideoSearchResults.push.apply(self.VideoSearchResults, results.items);
            self.hasMoreVideos(self.VideoSearchResults().length < results.count);
            self.videoCountText(self.VideoSearchResults().length + " av " + results.count);
            Bonnier.Fotbollskanalen.ImageLazyLoadModule.LazyLoadWithinContainer("#globalSearch", true);
        }, "json");
    };

    self.clickOnArticleSearchResult = function (data, event) {
        event.preventDefault();
        Bonnier.Fotbollskanalen.TrackingModule.TrackMemberContentClick(data.url, "Globalsök", -1);
        Bonnier.Fotbollskanalen.TrackingModule.TrackGlobalSearch(self.query, data.page_name, 'article');
        window.location = data.url;
    };

    self.clickOnVideoSearchResult = function (data, event) {
        event.preventDefault();
        Bonnier.Fotbollskanalen.TrackingModule.TrackGlobalSearch(self.query, data.title, 'video');
        window.location = data.url;
    };

    self.clickOnTagResult = function (data, event) {
        event.preventDefault();
        Bonnier.Fotbollskanalen.TrackingModule.TrackGlobalSearch(self.query, data.name, 'tag');
        window.location = data.friendly_url;
    };

    self.clickedOnSuggestion = function(data, event) {
        event.preventDefault();
        Bonnier.Fotbollskanalen.TrackingModule.TrackGlobalSearch(self.query, data.name, 'suggestion');
        window.location = data.friendly_url();
    };

    self.Search = function (query) {

        query = query.removeSpecialCharacters();

        if (query === currentQuery) return;
        currentQuery = query;

        self.query = query;
        killTimers();

        if (query.length < 3) {
            self.MixedSearchResults([]);
        }

        if (query === "") {
            showingLoader = false;
            $('[data-js="global-search-spinner"]').hide();
            self.ArticleSearchResults([]);
            self.VideoSearchResults([]);
            self.articleCountText("");
            self.videoCountText("");
            self.hasMoreArticles(false);
            self.hasMoreVideos(false);
            showSearchSuggestions();
            return;
        }

        $('[data-js="global-search-suggestions"]').hide();
        $clearInput.addClass('search__input-clear-wrapper--open');

        loaderTimer = setTimeout(function () {
            loaderStartTimestamp = Date.now();
            self.ArticleSearchResults([]);
            self.VideoSearchResults([]);
            self.articleCountText("");
            self.videoCountText("");
            self.hasMoreArticles(false);
            self.hasMoreVideos(false);
            self.searchText("Söker på \"" + query + "\"");
            showingLoader = true;
            $('[data-js="global-search-spinner"]').show();
        }, 150);

        function searchSuccessCallback(result) {
            showingLoader = false;
            $('[data-js="global-search-spinner"]').hide();
            if (result === null || result === undefined || result.total_count === 0) {
                self.ArticleSearchResults([]);
                self.VideoSearchResults([]);
                self.articleCountText("");
                self.videoCountText("");
                self.hasMoreArticles(false);
                self.hasMoreVideos(false);
                self.searchText("0 resultat på din sökning \"" + query + "\"");
                Bonnier.Fotbollskanalen.TrackingModule.TrackNoResultGlobalSearch(query);
            } else {
                self.hasMoreArticles(result.article_search_result.items.length < result.article_search_result.count);
                self.hasMoreVideos(result.video_search_result.items.length < result.video_search_result.count);
                ko.mapping.fromJS(result.article_search_result.items, mapping["Articles"], self.ArticleSearchResults);
                ko.mapping.fromJS(result.video_search_result.items, mapping["Videos"], self.VideoSearchResults); // video mapping?
                self.searchText(result.total_count + " resultat på din sökning \"" + query + "\"");
                self.articleCountText(result.article_search_result.items.length + " av " + result.article_search_result.count);
                self.videoCountText(result.video_search_result.items.length + " av " + result.video_search_result.count);
                Bonnier.Fotbollskanalen.ImageLazyLoadModule.InitLazyLoad();
            }

        }

        $.get(hostname + "/api/search/freetext/" + encodeURIComponent(query), {}, function (results) {
            if (currentQuery !== query) {
                // Discard result unless latest search
                return;
            }
            killTimers();
            if (showingLoader) {
                var diff = 600 - (Date.now() - loaderStartTimestamp);
                if (diff > 0) {
                    resultTimer = setTimeout(function () {
                        searchSuccessCallback(results);
                    }, diff);
                } else {
                    searchSuccessCallback(results);
                }
            } else {
                searchSuccessCallback(results);
            }
        }, "json").fail(function () {
            killTimers();
            searchSuccessCallback(null);
        });

        if (query.length >= 3) {
            $.getJSON(hostname + "/api/mixed/autocomplete/" + encodeURIComponent(query), function (result) {
                if (currentQuery !== query) {
                    // Discard result unless latest search
                    return;
                }
                if (result.length > 3) result = result.slice(0, 3);
                ko.mapping.fromJS(result, mapping["LandingPages"], self.MixedSearchResults);
            });
        }
    };
};

(window.$fk || $)(function () {
    if ($t.exists("#globalSearch")) {
        Bonnier.Fotbollskanalen.GlobalSearchModule = new GlobalSearchViewModel();
        ko.applyBindings(Bonnier.Fotbollskanalen.GlobalSearchModule, document.getElementById('globalSearch'));
    }
});;
Bonnier.namespace("Bonnier.Fotbollskanalen.HideElementsModule");

Bonnier.Fotbollskanalen.HideElementsModule = (function () {

    var hideOverflowedResults = function () {
        if ($(window).width() < 980) return;
        $('[data-js="hideOverflowItems"]').each(function () {
            var count=0;
            var self = $(this);
            var groupes = $(this).find('[data-js="group-item"]');
            groupes.each(function() {
                count++;
                if (count + 1 > self.attr('data-limit')) {
                    $(this).hide();
                } else {
                    $(this).find('.match-list__group-item').each(function() {
                        count++;
                        if (count > self.attr('data-limit')) {
                            $(this).hide();
                        }
                    });
                }
            });
        });
    };

    return {
        HideOverflowedResults : hideOverflowedResults
    };

})();

(window.$fk || $)(function () {
    if ($t.exists('[data-js="hideOverflowItems"]')) {
        Bonnier.Fotbollskanalen.HideElementsModule.HideOverflowedResults();
    }
});
;
Bonnier.namespace("Bonnier.Fotbollskanalen.ImageLazyLoadModule");

Bonnier.Fotbollskanalen.ImageLazyLoadModule = (function (jQuery) {
    var threshold = 1250;

    var initLazyLoadTab = function (containerDiv) {
        var elements = jQuery(containerDiv).find('img.lazy');
        var doBreak = false;
        elements.each(function () {
            if ($(this).attr('src') === $(this).attr('data-original')) {
                doBreak = true;
                return;
            }
        });
        if (doBreak) return;

        jQuery("img.lazy").lazyload({
            threshold: threshold,
            skip_invisible: true,
            effect: "fadeIn",
            appear: function () {
                imageWillAppear(this);
            }
        });
    };

    var lazyLoadWithinContainer = function (selector, skipInvisible, effect) {
        if (skipInvisible === undefined) skipInvisible = true;
        if (effect === undefined) effect = "fadeIn";
        jQuery("img.lazy").lazyload({
            threshold: threshold,
            skip_invisible: skipInvisible,
            container: $(selector),
            effect: effect,
            appear: function () {
                imageWillAppear(this);
            }
        });
    };

    var initLegacyLazyLoad = function () {
        setTimeout(function () {
            jQuery("img.lazy").lazyload({
                threshold: threshold,
                skip_invisible: false,
                failure_limit: 10,
                appear: function () {
                    imageWillAppear(this);
                }
            });
        }, 10);
    };

    var imageWillAppear = function ($this) {
        var imageUrl = $this.getAttribute('data-original');

        if (imageUrl === null || imageUrl === undefined) return;
        if (imageUrl.contains('_width_')) {
            var width = Math.round($($this).parent()[0].getBoundingClientRect().width);
            imageUrl = imageUrl.replace('_width_', width);
            //imageUrl = imageUrl.replace('_height_', height); // height is removed in imageproxy
            if (navigator.userAgent.contains('AppleWebKit') && navigator.vendor === 'Google Inc.') {
                imageUrl += "&imformat=chrome";
            }
            $this.setAttribute('data-original', imageUrl);
        }
        $($this).removeClass('lazy');
        $($this).css('opacity', '1');
    };

    function initLazyLoad() {
        if ('IntersectionObserver' in window) {
            initIntersectionObserverLazyLoad();
        }
        else {
            (window.$fk || $)(function () {
                initLegacyLazyLoad();
            });
        }
    }

    function initIntersectionObserverLazyLoad() {
        var images = document.querySelectorAll('[data-original]');
        var config = {
            rootMargin: '0px 0px 0px 0px',
            threshold: 0
        };

        var observer = new IntersectionObserver(function (entries, self) {
            entries.forEach(function (entry) {
                if (entry.isIntersecting) {
                    preloadImage(entry.target);
                    self.unobserve(entry.target);
                }
            });
        }, config);

        images.forEach(function (image) {
            if (image.offsetParent === null) return;
            image.style.transition = "all 0.3s";
            observer.observe(image);
        });

        function preloadImage(img) {

            var imageUrl = img.getAttribute('data-original');

            if (imageUrl === null || imageUrl === undefined) return;
            if (imageUrl.contains('_width_')) {
                imageUrl = imageUrl.replace('_width_', img.parentElement.offsetWidth);
                //imageUrl = imageUrl.replace('_height_', img.parentElement.offsetHeight); // height is removed in imageproxy
                if (navigator.userAgent.contains('AppleWebKit') && navigator.vendor === 'Google Inc.') {
                    imageUrl += "&imformat=chrome";
                }
                // Retina is removed in the new a2d imageproxy api.
                //if (Bonnier.Fotbollskanalen.DeviceTypeModule.IsDesktop() && Bonnier.Fotbollskanalen.DeviceTypeModule.IsHighDensity()) {
                //    imageUrl += "&retina=true"
                //}
                img.setAttribute('data-original', imageUrl);
            }
            var src = imageUrl;
            if (!src) { return; }

            img.onload = function () { this.removeAttribute('data-original'); this.style.opacity = "1"; };
            img.onerror = function () { this.style.opacity = "1"; };
            img.src = src;
        }
    }

    return {
        LazyLoadWithinContainer: lazyLoadWithinContainer,
        InitLazyLoad: initLazyLoad,
        InitLazyLoadTab: initLazyLoadTab
    };

}(jQuery));

Bonnier.Fotbollskanalen.ImageLazyLoadModule.InitLazyLoad();
;
Bonnier.namespace("Bonnier.Fotbollskanalen.ImageSwitchModule");

Bonnier.Fotbollskanalen.ImageSwitchModule = (function () {
    var init = function () {
        setTimeout(function() {
            $('img.image-switch').each(function() {
                var imageUrl;
                if ($(this).is(':hidden')) return;
                if ($(window).width() < 640) {
                    imageUrl = $(this).attr('data-mobile-image');
                    if (imageUrl.contains('_width_')) {
                        imageUrl = imageUrl.replace('_width_', $(this).parent().outerWidth());
                        // height is removed in imageproxy
                    }
                    $(this).attr('src', imageUrl);
                } else {
                    imageUrl = $(this).attr('data-desktop-image');
                    if (imageUrl.contains('_width_')) {
                        imageUrl = imageUrl.replace('_width_', $(this).parent().outerWidth());
                        // height is removed in imageproxy
                    }
                    $(this).attr('src', imageUrl);
                }
            });
        }, 10);
    };

    return {
        Init: init
    };

}());

(window.$fk || $)(function () {
    if ($t.exists('.image-switch')) {
        Bonnier.Fotbollskanalen.ImageSwitchModule.Init();
    }
});

;
Bonnier.namespace("Bonnier.Fotbollskanalen.InnerTabNavigationModule");

Bonnier.Fotbollskanalen.InnerTabNavigationModule = (function () {

    var init = function () {
        $('[data-js="tabs-menu"]').on('click', '[data-js="tab-btn"]', function (e) {
            e.preventDefault();

            var $this = $(this),
                id = $(this).attr('href'),
                $previous = $this.parent().find('.selected');

            $previous.removeClass('selected');
            $this.addClass('selected');
            $(id).siblings().hide();
            $(id).show();
            Bonnier.Fotbollskanalen.TrackingModule.TrackIntraPageTabClick(window.location.pathname, id.replace('#', ''));
            Bonnier.Fotbollskanalen.ImageLazyLoadModule.InitLazyLoadTab(id);
            if ($('body').hasClass('mobile') && $this.parent().hasClass('tabs__menu-fixed')) {
                if (window.scrollY > 70) {
                    $(window).scrollTop(70);
                }
            }
        });
    };


    return {
        Init: init,
    };

})();

(window.$fk || $)(function () {
    if ($t.exists('[data-js="tabs"]') && $t.exists('[data-js="tabs-menu"]')) {
        Bonnier.Fotbollskanalen.InnerTabNavigationModule.Init();
    }
});;
Bonnier.namespace("Bonnier.Fotbollskanalen.LandingPageNewsModule");

var LandingPageNewsViewModel = function (type, id, pageSize) {
    var self = this;
    var currentPage = 2;
    self.ExtraArticles = ko.observableArray([]);
    self.HasMoreArticles = ko.observable(true);

    self.LoadMoreArticles = function () {
        $.getJSON("/api/articlesearch/" + type + "/" + id + "/page/" + currentPage + "/pagesize/" + pageSize, function (data) {
            for (var i = 0; i < data.items.length; i++) {
                self.ExtraArticles.push(data.items[i]);
            }
            Bonnier.Fotbollskanalen.ImageLazyLoadModule.InitLazyLoad();
            self.HasMoreArticles(self.ExtraArticles().length + pageSize < data.count);
            ++currentPage;

            if ($t.isNative) {
                Fotbollskanalen.ArticleHistoryModule.updateVisited();
            }
        });
    };
};

(window.$fk || $)(function () {
    if ($t.exists("#landing-page-news")) {
        var container = $("#landing-page-news");
        Bonnier.Fotbollskanalen.LandingPageNewsModule = new LandingPageNewsViewModel(container.attr('data-type'), container.attr('data-id'), parseInt(container.attr('data-page-size')));
        ko.applyBindings(Bonnier.Fotbollskanalen.LandingPageNewsModule, container[0]);
    }
});;
Bonnier.namespace("Bonnier.Fotbollskanalen.LatestTransfersModule");

var LatestTransfersViewModel = function (maxCount, leagueFilter) {
    var self = this;
    self.IsEmpty = ko.observable(true);
    self.Transfers = ko.observableArray([]);
    self.Message = ko.observableArray("");
    self.Transfers = ko.mapping.fromJS([],
    {
        key: function(data) {
            return ko.utils.unwrapObservable(data.transfer_id);
        },
        create: function(options) {
            var model = ko.mapping.fromJS(options.data);
            model.isNew = !self.IsEmpty();
            return model;
        }
    });

    var poll = function () {
        var url = "/api/transfers/latest/" + maxCount;
        if (leagueFilter) {
            url += "/leagues/" + leagueFilter;
        }
        $.getJSON(url , function (data) {
            ko.mapping.fromJS(data, self.Transfers);
            self.IsEmpty(data.length === 0);
            if (data.length === 0) self.Message("Det finns inga aktuella transfers");
        });
    };

    self.init = function () {
        poll();
        setInterval(poll, 120 * 1000);
    };

    self.init();
};;
var LiveMatchWidgetViewModel = function (matchId) {
    var self = this;
    self.status = ko.observable("");
    self.kickoffDate = ko.observable("");
    self.timer = ko.observable("");
    self.progress = ko.observable(0);
    self.homeTeam = ko.observable();
    self.awayTeam = ko.observable();
    self.attendance = ko.observable("");
    self.competitionAndRound = ko.observable("");
    self.homeTeamName = ko.observable("");
    self.homeTeamScore = ko.observable("");
    self.homeTeamAggScore = ko.observable("");
    self.awayTeamAggScore = ko.observable("");
    self.homeTeamPenaltyScore = ko.observable("");
    self.awayTeamPenaltyScore = ko.observable("");
    self.awayTeamName = ko.observable("");
    self.awayTeamScore = ko.observable("");
    self.goals = ko.observableArray([]);
    self.bookings = ko.observableArray([]);
    var POLLER_FREQUENCY = 33000; // Poll every 33 sec since max-age is 30
    var liveUpdatesPoller;
    var updateStatus = function (status) {
        if (status === "" || status === "Ssp" || status === "Psp") {
            self.status("before");
        } else if (status === "FT" || status === "AET" || status === "11M") {
            self.status("after");
        } else {
            self.status("during");
        }
    };
    var updateProgress = function (timer) {
        self.timer(timer);
        var t = parseInt(timer);
        var p = t > 90 ? t / 120 : t / 90;
        self.progress(p || 0); // p can be NaN 
    };
    var onLoadedLiveUpdates = function (data) {
        
        self.homeTeamScore(data.home_team_goals);
        self.awayTeamScore(data.away_team_goals);
        self.homeTeamAggScore(data.home_team_aggregated_score);
        self.awayTeamAggScore(data.away_team_aggregated_score);
        self.homeTeamPenaltyScore(data.home_team_penalty_score);
        self.awayTeamPenaltyScore(data.away_team_penalty_score);
        self.goals(data.events.filter(function (event) {
            return event.event_type === "Goal" ||
                event.event_type === "Penalty Goal" ||
                event.event_type === "Own Goal";
        }));
        self.bookings(data.events.filter(function (event) {
            return event.event_type === "Yellow Card" ||
                event.event_type === "Yellow Card Two" ||
                event.event_type === "Red Card";
        }));
        updateStatus(data.status.type);
        updateProgress(data.timer);
        if (self.status() === "after") {
            clearInterval(liveUpdatesPoller);
        }
    };
    $.getJSON("/api/matchinfo/" + matchId, function (data) {
        self.homeTeam(data.match_sheet.home_team);
        self.awayTeam(data.match_sheet.away_team);
        self.attendance(data.match_sheet.attendance_string);
        var groupOrRound = "";

        if (data.match_sheet.round_string) {
            groupOrRound = "Omgång " + data.match_sheet.round_string;
            self.competitionAndRound(data.match_sheet.competition_name ? data.match_sheet.competition_name + " - " + groupOrRound : groupOrRound);
            
        } else if (data.competition_table.group_info.group_name) {
            groupOrRound = data.competition_table.group_info.group_name;
            self.competitionAndRound(data.match_sheet.competition_name ? data.match_sheet.competition_name + " - " + groupOrRound : groupOrRound);
        } else {
            self.competitionAndRound(data.match_sheet.competition_name ? data.match_sheet.competition_name : "");
        }
       
        var date = data.match_sheet.game_date.date;
        self.kickoffDate(moment(date.year + "-" + date.month + "-" + date.day, "YYYY-MM-DD").locale('sv').format("ddd Do MMM YYYY").capitalize() + " kl " + date.time);
        liveUpdatesPoller = setInterval(function () {
            $.getJSON("/api/matchinfo/liveupdates/" + matchId, onLoadedLiveUpdates);
        }, POLLER_FREQUENCY);
        onLoadedLiveUpdates(data.live_updates);
    });
};

;
var LoadMoreLatestVideosViewModel = function (config) {
    var self = this;
    self.page = 2;
    self.pageSize = config.pageSize || 14;
    self.keywords = config.keywords;
    self.VideoSearchResults = ko.observableArray();
    self.hasMoreVideos = ko.observable(true);
    self.videoCountText = ko.observable("");
    
    moment.locale('en', {
        relativeTime: {
            future: "in %s",
            past: "%s ago",
            s: "s",
            m: "1m",
            mm: "%dm",
            h: "1t",
            hh: "%dt",
            d: "1d",
            dd: "%dd",
            M: "1m",
            MM: "%dm",
            y: "1å",
            yy: "%då"
        }
    });

    self.computeDate = function (date) {
        console.log(date);
        date = moment(date);
        if (moment().diff(date, 'days') > 1) {
            return moment(date, "YYYY-MM-DD HH:mm").fromNow(true);
        } else {
            return zeroPad(date.hour()) + ":" + zeroPad(date.minutes());
        }
    };

    self.showMoreVideos = function () {
        var url = self.keywords.length > 0 ?
            "/api/videosearch/keywords/" + self.keywords + "/pagesize/" + self.pageSize + "/page/" + self.page :
            "/api/videosearch/pagesize/" + self.pageSize + "/page/" + self.page;
        $.get(url, {}, function (results) {
            self.VideoSearchResults.push.apply(self.VideoSearchResults, results.items);
            self.hasMoreVideos(results.show_load_more);
            self.videoCountText(self.VideoSearchResults().length + " av " + results.count);
            Bonnier.Fotbollskanalen.ImageLazyLoadModule.InitLazyLoad();
        }, "json");
        self.page += 1;
    };

};



;
var LoginViewModel = function () {
    var self = this;
    self.HasState = ko.observable(false);
    self.Entitlements = ko.observableArray([]);
    self.Username = ko.observable("");
    self.IsLoggedIn = ko.observable(false);

    self.UpdateState = function (state) {
        self.Username(state.username);
        self.IsLoggedIn(state.isLoggedIn);
        ko.mapping.fromJS(state.entitlements, {}, self.Entitlements);
        self.HasState(true);
        $("[data-js='premiumSportItem']").removeClass('full-width').show();
        $("[data-js='premiumItem']").removeClass('full-width').show();
        state.entitlements.forEach(function(item) {
            if (item.id == 1104) {
                $("[data-js='premiumSportItem']").hide();
                $("[data-js='premiumItem']").hide();
            } else if (item.id == 7) {
                $("[data-js='premiumItem']").hide();
                $("[data-js='premiumSportItem']").addClass('full-width');
            }
        });

    };

};

(window.$fk || $)(function () {
    if ($t.exists("#login")) {
        Bonnier.namespace("Bonnier.Fotbollskanalen.LoginModule");
        Bonnier.Fotbollskanalen.LoginModule = new LoginViewModel();
        ko.applyBindings(Bonnier.Fotbollskanalen.LoginModule, document.getElementById('login'));
        Bonnier.Fotbollskanalen.NativeBridgeModule.RequestLoginState();
    }
});;
var MatcherFilterModule = function () {
    var self = this;
    self.toggleLeagueButton = ko.observable(false);
};
var MatchViewModel = function (id) {
    var self = this;
    var groupId = null;
    var lineupPoller = null;
    var liveUpdatesPoller = null;
    var groupPoller = null;
    var tablePoller = null;
    var homeStartingPlayers = [];
    var homeSubPlayers = [];
    var awayStartingPlayers = [];
    var awaySubPlayers = [];
    var playersAreFinal = false;
    self.Stadium = ko.observable("");
    self.Attendance = ko.observable("");
    self.Referee = ko.observable("");
    self.CompetitionName = ko.observable();
    self.CompetitionUrl = ko.observable();
    self.TableHeader = ko.observable();
    self.GroupName = ko.observable("");
    self.IsGroupStage = ko.observable(false);
    self.HomeTeam = ko.observable({ name: "", team_id: "", manager: "", team_landing_page_url: "", image_url: "" });
    self.AwayTeam = ko.observable({ name: "", team_id: "", manager: "", team_landing_page_url: "", image_url: "" });
    self.Date = ko.observable({ date: "", time: "", has_timestamp: "" });
    self.HomeScore = ko.observable();
    self.AwayScore = ko.observable();
    self.HomePenalties = ko.observable();
    self.AwayPenalties = ko.observable();
    self.AwayScore = ko.observable();
    self.HomeLastSix = ko.observableArray([]);
    self.AwayLastSix = ko.observableArray([]);
    self.HomeTeamStartingPlayers = ko.observableArray([]);
    self.HomeTeamSubPlayers = ko.observableArray([]);
    self.AwayTeamStartingPlayers = ko.observableArray([]);
    self.AwayTeamSubPlayers = ko.observableArray([]);
    self.Table = ko.observableArray([]);
    self.Statistics = ko.observable();
    self.HeadToHead = ko.observableArray([]);
    self.Events = ko.observableArray([]);
    self.IsLive = ko.observable(false);
    self.Timer = ko.observable("");
    self.AggregatedString = ko.observable("");
    self.TimerTicker = ko.observable(false);
    self.Progress = ko.observable(0);
    self.VideoHighlights = ko.observableArray([]);
    
    self.ShowOdds = ko.observable(false);
    self.HomeOdds = ko.observable("");
    self.AwayOdds = ko.observable("");
    self.DrawOdds = ko.observable("");

    self.TeamOddsVisible = ko.computed(function()  {
        //showOdds(), check if we received odds from the server
        //others checks the status of the current game.

        const queryString = window.location.search;
        const urlParams = new URLSearchParams(queryString);
        if (urlParams.has('forceOdds')) {
            return true; 
        }

        return self.ShowOdds() && ((self.IsGameFinished() == false) || self.IsLive());
    }, self);
    
    self.IsGameFinished = ko.observable(false)
    
    countDown: ko.observable();
    
    self.onLoadedHeadToHead = function (head_to_head) {
        head_to_head.matches.map(function (match) {
            var date = match.game_date.date;
            match.dateString = moment(date.year + "-" + date.month + "-" + date.day, "YYYY-MM-DD").locale("sv").format("LL");
        });
        self.HeadToHead(head_to_head.matches);
    };
    
    self.onLoadedOdds = function (odds) {
        console.log(odds);
        if (odds) {
            //depends on how the response changes from /odds or /liveupdates due to c# marshal rules.  
            let showOdds = (odds.hasOwnProperty("homeOdds")  || odds.hasOwnProperty("home_odds"))
                && (odds.hasOwnProperty("awayOdds") || odds.hasOwnProperty("away_odds")) 
                && (odds.hasOwnProperty("drawOdds") || odds.hasOwnProperty("draw_odds"));
            
            if (showOdds) {
                self.HomeOdds(odds.homeOdds || odds.home_odds)
                self.AwayOdds(odds.awayOdds || odds.away_odds)
                self.DrawOdds(odds.drawOdds || odds.draw_odds)
                self.ShowOdds(showOdds)
            }
        }
    }
    
    var playerSorter = function (playerA, playerB) {
        var pos = ['fw', 'mf', 'b', 'mv'];
        var posA = pos.indexOf(playerA.gen_pos_short);
        var posB = pos.indexOf(playerB.gen_pos_short);
        if (posA === posB) {
            if (!playerA.squad_no) return 1;
            if (!playerB.squad_no) return -1;
            return Number(playerA.squad_no) < Number(playerB.squad_no) ? -1 : 1;
        }
        return posA < posB ? 1 : -1;
    };

    var updateProgress = function (timer) {
        var t = parseInt(timer);
        var p = t > 90 ? t / 120 : t / 90;
        self.Progress(p || 0); // p can be NaN 
    };

    var updateLiveStatus = function (status) {
        if (status === "" || status === "Ssp" || status === "Psp" || status === "FT" || status === "AET" || status === "11M") {
            self.IsLive(false);
        } else {
            self.IsLive(true);
        }
    };

    var refineTeamPlayers = function (team) {
        var refiningMapper = function (player) {
            player.name = player.firstname + " " + player.surname;
            if (player.squad_no) {
                player.name = player.squad_no + ". " + player.name;
            }
            if (player.gen_pos_short && player.gen_pos_short !== "null") {
                player.name += " (" + player.gen_pos_short + ")";
            }
            player.yellow_cards = player.cards_yellow1 + player.cards_yellow2;
            // Remove time_off if it's not matching another player's time_on
            var match = false;
            team.substituted_players.forEach(function (sub_player) {
                if (player.time_off === sub_player.time_on) {
                    match = true;
                }
            });
            if (!match) {
                player.time_off = 0;
            }
        };
        team.starting_players.map(refiningMapper);
        team.starting_players.sort(playerSorter);

        team.substituted_players.map(refiningMapper);
        team.substituted_players.sort(playerSorter);

        if (team.substituted_players_not_used) {
            team.substituted_players_not_used.map(refiningMapper);
            team.substituted_players_not_used.sort(playerSorter);
        }
    };

    var getParsedDate = function (date) {
        var dateAndTime = {};
        dateAndTime.date = moment(date.year + "-" + date.month + "-" + date.day, "YYYY-MM-DD").locale('sv').format("ddd Do MMM YYYY").capitalize();
        dateAndTime.time = date.time;
        dateAndTime.has_timestamp = date.has_timestamp;

        return dateAndTime;
    };

    self.onLoadedTeams = function (homeTeam, awayTeam) {
        // If we have player data, refine it and abandon lineup polling
        if (homeTeam.starting_players.length > 0) {
            playersAreFinal = true;
            refineTeamPlayers(homeTeam);
            refineTeamPlayers(awayTeam);
            homeStartingPlayers = homeTeam.starting_players;
            awayStartingPlayers = awayTeam.starting_players;

            if (homeTeam.substituted_players_not_used) {
                homeSubPlayers = homeTeam.substituted_players.concat(homeTeam.substituted_players_not_used);
            } else {
                homeSubPlayers = homeTeam.substituted_players;
            }

            if (awayTeam.substituted_players_not_used) {
                awaySubPlayers = awayTeam.substituted_players.concat(awayTeam.substituted_players_not_used);
            } else {
                awaySubPlayers = awayTeam.substituted_players;
            }

            self.bindPlayerArrays();

            clearInterval(lineupPoller);
        }

        homeTeam.name = homeTeam.short_name && hasTooLongName(homeTeam.name.split(" ")) ? homeTeam.short_name : homeTeam.name;
        awayTeam.name = awayTeam.short_name && hasTooLongName(awayTeam.name.split(" ")) ? awayTeam.short_name : awayTeam.name;

        self.HomeTeam(homeTeam);
        self.AwayTeam(awayTeam);
    };

    self.load = function () {
        $.getJSON("/api/matchinfo/" + id, function (data) {

            // Schedule pollers

            if (id < 1000000) {
                liveUpdatesPoller = setInterval(self.loadLiveUpdates, 30000);
                lineupPoller = setInterval(self.loadLineups, 120000);
            }

            // Parse static initial data
            self.onLoadedHeadToHead(data.head_to_head);
            if (data.last6_matches) {
                ko.mapping.fromJS(data.last6_matches.home_team_history, {}, self.HomeLastSix);
                ko.mapping.fromJS(data.last6_matches.away_team_history, {}, self.AwayLastSix);
            }
            if (data.match_sheet.home_team && data.match_sheet.away_team) {
                self.onLoadedTeams(data.match_sheet.home_team, data.match_sheet.away_team);
            }
            competitionId = data.match_sheet.competition_id;
            groupId = data.competition_table.group_info.group_id;
            if (data.match_sheet.referee) {
                self.Referee(data.match_sheet.referee);
            }
            if (data.match_sheet.stadium) {
                self.Stadium(data.match_sheet.stadium);
            }
            if (data.match_sheet.attendance) {
                self.Attendance(data.match_sheet.attendance_string);
            }

            self.CompetitionName(data.match_sheet.competition_name);
            self.CompetitionUrl(data.match_sheet.competition_friendly_url);
            self.GroupName(data.match_sheet.round ? "Omgång " + data.match_sheet.round_string : (data.competition_table.group_info.group_name || ""));

            if (data.match_sheet.game_date && data.match_sheet.game_date.date) {
                self.Date(getParsedDate(data.match_sheet.game_date.date));
            }
            if (data.table.length > 0) {
                tablePoller = setInterval(self.loadTable, 120000);
                self.onLoadedTable(data.table);
                self.TableHeader(self.CompetitionName());
            } else if (groupId && data.competition_table.is_stage_group) {
                self.IsGroupStage(true);
                groupPoller = setInterval(self.loadGroupTable, 120000);
                self.onLoadedGroupTable(data.competition_table);
                self.TableHeader(data.competition_table.group_info.group_name);
            }
            
            // Parse initial data from pollables
            self.onLoadedLineups(data.line_ups);
            self.onLoadedLiveUpdates(data.live_updates);

            $('[data-js="match-spinner"]').remove();

        });
    };

    self.resetAllPlayers = function () {

        var playerFieldInflater = function (player) {
            if (player.squad_no) {
                player.name = player.squad_no + ". " + player.player;
            } else {
                player.name = player.player;
            }
            if (player.gen_pos_short && player.gen_pos_short !== "null") {
                player.name += " (" + player.gen_pos_short + ")";
            }
            player.goals = 0;
            player.own_goals = 0;
            player.yellow_cards = 0;
            player.cards_red = 0;
            player.time_off = 0;
            player.time_on = 0;
        };

        homeStartingPlayers.map(playerFieldInflater);
        homeSubPlayers.map(playerFieldInflater);
        awayStartingPlayers.map(playerFieldInflater);
        awaySubPlayers.map(playerFieldInflater);

    };

    self.getPlayerByEvent = function (event) {
        var byIdOrName = function (player) {
            return event.player_id && player.player_id === event.player_id || player.name === event.player;
        };
        var hit;
        if (event.team === "A") {
            hit = homeStartingPlayers.filter(byIdOrName);
            if (hit.length > 0) return hit[0];
            hit = homeSubPlayers.filter(byIdOrName);
            if (hit.length > 0) return hit[0];
        } else {
            hit = awayStartingPlayers.filter(byIdOrName);
            if (hit.length > 0) return hit[0];
            hit = awaySubPlayers.filter(byIdOrName);
            if (hit.length > 0) return hit[0];
        }
    };

    self.handlePlayerEvent = function (event) {
        var player = self.getPlayerByEvent(event);
        if (!player) return;
        switch (event.event_type) {
            case "Yellow Card":
                player.yellow_cards++; break;
            case "Yellow Card Two":
                player.yellow_cards = 2; break;
            case "Red Card":
                player.cards_red = 1; break;
            case "Goal":
            case "Penalty Goal":
                player.goals++; break;
            case "Own Goal":
                player.own_goals++; break;
            case "Substitution In":
                player.time_on = event.time; break;
            case "Substitution Out":
                player.time_off = event.time; break;
        }
    };

    self.bindPlayerArrays = function () {
        ko.mapping.fromJS(homeStartingPlayers, {}, self.HomeTeamStartingPlayers);
        ko.mapping.fromJS(homeSubPlayers, {}, self.HomeTeamSubPlayers);
        ko.mapping.fromJS(awayStartingPlayers, {}, self.AwayTeamStartingPlayers);
        ko.mapping.fromJS(awaySubPlayers, {}, self.AwayTeamSubPlayers);
    };

    self.onLoadedLiveUpdates = function (data) {
        if (data.events) {
            ko.mapping.fromJS(data.events, {}, self.Events);
        }
        if (!playersAreFinal && homeStartingPlayers.length > 0) {
            self.resetAllPlayers();
            for (var i = data.events.length - 1; i >= 0; i--) {
                self.handlePlayerEvent(data.events[i]);
            }
            self.bindPlayerArrays();
        }
        self.Statistics(data.statistics);
        self.HomeScore(data.home_team_goals);
        self.AwayScore(data.away_team_goals);

        //Odds
        if(data.odds) {
            self.onLoadedOdds(data.odds);
        }
        //Highlights
        if (data.highlights) {
            ko.mapping.fromJS(data.highlights, {}, self.VideoHighlights);
            Bonnier.Fotbollskanalen.ImageLazyLoadModule.InitLazyLoad()
        }

        if (data.home_team_aggregated_score !== null && data.home_team_penalty_score === null) {
            self.AggregatedString(data.home_team_aggregated_score + "-" + data.away_team_aggregated_score);
        } else {
            self.AggregatedString("");
        }

        self.AwayScore(data.away_team_goals);
        updateProgress(data.timer);
        if (!data.status) return;
        updateLiveStatus(data.status.type);
        switch (data.status.type.toLowerCase()) {
            case "ft":
                clearInterval(liveUpdatesPoller);
                clearInterval(tablePoller);
                clearInterval(groupPoller);
                self.Timer('FT');
                self.IsGameFinished(true);
                break;
            case "aet":
                clearInterval(liveUpdatesPoller);
                clearInterval(tablePoller);
                clearInterval(groupPoller);
                self.Timer('AET');
                self.IsGameFinished(false);
                break;
            case "ssp":
                clearInterval(liveUpdatesPoller);
                clearInterval(tablePoller);
                clearInterval(groupPoller);
                self.Timer('Susp.');
                self.IsGameFinished(true);
                break;
            case "psp":
                clearInterval(liveUpdatesPoller);
                clearInterval(tablePoller);
                clearInterval(groupPoller);
                self.Timer('Postp.');
                self.IsGameFinished(false);
                break;
            case "11m":
                clearInterval(liveUpdatesPoller);
                clearInterval(tablePoller);
                clearInterval(groupPoller);
                if (data.home_team_penalty_score !== null && data.away_team_penalty_score !== null) {
                    self.Timer("(" + data.home_team_penalty_score + "-" + data.away_team_penalty_score + " str)");
                }
                self.IsGameFinished(true);
                break;
            case "ht":
                self.Timer('HT');
                self.TimerTicker(false);
                self.IsGameFinished(false);
                break;
            case "pen":
                self.TimerTicker(true);
                if (data.match_sheet.home_team.penalties !== null && data.match_sheet.away_team.penalties !== null) {
                    self.Timer("(" + data.home_team_penalty_score + "-" + data.away_team_penalty_score + " str)");
                }
                self.IsGameFinished(true);
                break;
            default:
                if (!self.TimerTicker()) self.TimerTicker(true);
                self.Timer(data.timer);
        }
    };

    self.loadLiveUpdates = function () {
        $.getJSON("/api/matchinfo/liveupdates/" + id, self.onLoadedLiveUpdates);
    };

    self.onLoadedLineups = function (data) {

        // Don't repeat if we got data
        if (data && data.line_up_home_team.length > 0) {
            clearInterval(lineupPoller);
        } else {
            return;
        }

        // If players have been fetched in teams already, don't use this data
        //if (playersAreFinal) {
        //    return;
        //}

        homeStartingPlayers = data.line_up_home_team;

        homeSubPlayers = data.substitutes_home_team;
        awayStartingPlayers = data.line_up_away_team;
        awaySubPlayers = data.substitutes_away_team;

        homeStartingPlayers.sort(playerSorter);
        homeSubPlayers.sort(playerSorter);
        awayStartingPlayers.sort(playerSorter);
        awaySubPlayers.sort(playerSorter);

        self.resetAllPlayers();

        self.bindPlayerArrays();
    };

    self.loadLineups = function () {
        $.getJSON("/api/matchinfo/lineups/" + id, self.onLoadedLineups);
    };

    self.onLoadedTable = function (data) {
        ko.mapping.fromJS(data, {}, self.Table);
    };

    self.onLoadedGroupTable = function (data) {
        ko.mapping.fromJS(data.table, {}, self.Table);
    };

    self.loadTable = function () {
        $.getJSON("/api/table/" + competitionId, self.onLoadedTable);
    };

    self.loadGroupTable = function () {
        $.getJSON("/api/group/" + groupId, self.onLoadedTable);
    };

    self.loadOdds = function () {
        $.getJSON(`/api/matchinfo/${id}/odds`, self.onLoadedOdds)
    }

    self.load();
    self.loadOdds();
};

ko.bindingHandlers.stopBinding = {
    init: function () {
        return { controlsDescendantBindings: true };
    }
};

ko.bindingHandlers.timer = {
    update: function (element, valueAccessor) {
        /* Todo: se till att detta check görs bättre */
        var $timeHolder = $(element).find('> span');

        if (!$timeHolder.attr("target-timestamp")) {
            $(element).hide();
            return;
        }
        var targetDate = new Date($timeHolder.attr("target-timestamp"));

        var pad = function (number) {
            if (number < 10) {
                return "0" + number;
            } else {
                return number;
            }
        };

        var refreshCountDown = function () {
            var totalSeconds = Math.floor((targetDate.getTime() - Date.now()) / 1000);
            if (totalSeconds <= 0) {
                clearInterval(timer);
                $(element).text('Matchen startar');
                setTimeout(function () {
                    location.href += (location.href.indexOf('?') === -1 ? '?' : '&') + 'aver=' + ~~(Math.random() * 100000);
                }, 3000);
            } else {
                var days = Math.floor(totalSeconds / 86400);
                var hours = Math.floor((totalSeconds % 86400) / 3600);
                var minutes = Math.floor((totalSeconds % 3600) / 60);
                var seconds = totalSeconds % 60;


                var timetext = "Avspark om: " + days + "." + pad(hours) + ":" + pad(minutes) + ":" + pad(seconds);
                $timeHolder.text(timetext);
            }
        };
        refreshCountDown();
        var timer = setInterval(refreshCountDown, 1000);
    }
};;
var MyFeedViewModel = function () {
    var self = this;
    var cookieSearchString = "";
    var cookieSectionsSearchString = "";
    var regexpTime = /^([0-9]{2})\:([0-9]{2})$/;
    var nextArticlePage = 1;
    var nextVideoPage = 1;
    var feedPageSize = Bonnier.Fotbollskanalen.DeviceTypeModule.IsSmartPhone() ? 4 : 8;
    var hasMoreVideos = true;
    var hasMoreArticles = true;
    var hasInitiatedInfinteScroll = false;

    self.Articles = ko.observableArray([]);
    self.FetchedArticles = [];
    self.FetchedVideos = [];
    self.ArticlesShowMore = ko.observable(true);
    self.ArticlesCountLabel = ko.observable("");
    self.Videos = ko.observableArray([]);
    self.VideosShowMore = ko.observable(true);
    self.VideosShowMoreVisibility = ko.observable(false);
    self.ArticlesShowMoreVisibility = ko.observable(false);
    self.VideosCountLabel = ko.observable("");
    self.MatchSwipeList = ko.observableArray([]);
    self.ShowEmptyFeed = ko.observable(false);
    self.IsLoggedIn = ko.observable(false);
    self.AnyFavoritesSelected = ko.observable(false);

    var weekDays = ['Söndag', 'Måndag', 'Tisdag', 'Onsdag', 'Torsdag', 'Fredag', 'Lördag'];

    self.getDateString = function (date) {
        var today = moment();
        var tomorrow = moment().add(1, 'd');

        var momentDate = moment(date.year + "-" + date.month + "-" + date.day, "YYYY-MM-DD");

        if (today.isSame(momentDate, 'd')) {
            return "Idag";
        } else if (tomorrow.isSame(momentDate, 'd')) {
            return "Imorgon";
        }
        return weekDays[momentDate.weekday()] + " " + date.day + "/" + date.month;
    };

    self.isLive = function () {
        return false;
    };

    self.isHighlighted = function (date) {
        date = moment(date, "YYYY-MM-DD HH:mm");
        if (moment().diff(date, 'hours') < 6) {
            return true;
        } else {
            return false;
        }
    };

    matchBackground = function (item) {
        if (item === undefined) return '';
        return 'background-image: linear-gradient(120deg, ' + item.homeTeamColor + ' 0%, ' + item.homeTeamColor + ' var(--split), ' + item.awayTeamColor + ' var(--split), ' + item.awayTeamColor + ' 100%);'
    }

    futureMatch = function (item) {
        return isFutureMatch(item) ? 'future-match' : '';
    }

    isFutureMatch = function (item) {
        if (item === undefined) return '';
        var matchDate = moment(item.date(), "YYYY-MM-DDTHH:mm:ss");
        var nowTwoHoursBack = moment().add(-2, 'hours');
        return nowTwoHoursBack < matchDate;
    }

    fullscreenClick = function (item) {
        if ($t.isNative && Bonnier.Fotbollskanalen.NativeBridgeModule.CanIUse("fullscreen-video")) {
            Bonnier.Fotbollskanalen.NativeBridgeModule.SetVideoInfo(item.image_url, item.title, false);
            Bonnier.Fotbollskanalen.NativeBridgeModule.PlayVideo(item.video_id, true);
        } else {
            window.open(item.url, "_self");
        }
    }

    iconClicked = function (match, event) {
        if (match.video && match.video.external_url()) {
            window.open(match.video.external_url(), "_top");
        }
    };

    var mapping = {
        'Articles': {
            create: function (options) {
                var model = ko.mapping.fromJS(options.data);
                model.isHighlighted = regexpTime.test(options.data.publish_date);
                model.fullscreen_url = options.data.url + '?fullscreen=1';
                model.url = options.data.url;
                model.video_id = options.data.video_id;
                model.image_url = options.data.image_url;
                model.title = options.data.title;
                return model;
            }
        },
        'Videos': {
            create: function (options) {
                var model = ko.mapping.fromJS(options.data);
                model.isHighlighted = regexpTime.test(options.data.publish_date);
                model.fullscreen_url = options.data.url + '?fullscreen=1';
                model.url = options.data.url;
                model.video_id = options.data.video_id;
                model.image_url = options.data.image_url;
                model.title = options.data.title;
                return model;
            }
        },
        'MatchSwipeList': {
            create: function (options) {
                var model = ko.mapping.fromJS(options.data);
                model.homeTeamColor = options.data.home_team_color;
                model.awayTeamColor = options.data.away_team_color;
                return model;
            }
        }
    };

    self.getCookieSearchString = function () {
        var cookiesLeagues = Fotbollskanalen.CookieModule.getPersonalizedLeagues().sort().join();
        var cookiesTeams = Fotbollskanalen.CookieModule.getPersonalizedTeams().sort().join();
        var cookiesPlayers = Fotbollskanalen.CookieModule.getPersonalizedPlayers().sort().join();

        if (cookiesLeagues === "") {
            cookiesLeagues = "0";
        }
        if (cookiesTeams === "") {
            cookiesTeams = "0";
        }
        if (cookiesPlayers === "") {
            cookiesPlayers = "0";
        }
        return "/leagues/" + cookiesLeagues + "/teams/" + cookiesTeams + "/players/" + cookiesPlayers;
    };

    var getCookieSectionSearchString = function () {
        var cookiesSections = Fotbollskanalen.CookieModule.getPersonalizedSections().sort().join();
        if (cookiesSections === "") {
            return "/sections/0";
        }
        return "/sections/" + cookiesSections;
    };

    var updateArticlesCountLabel = function (count) {
        self.ArticlesCountLabel("Visar " + self.Articles().length + " av " + count);
    };

    self.loadMoreFeedItems = function () {
        if (self.FetchedArticles.length < feedPageSize && self.FetchedVideos.length < feedPageSize && hasMoreVideos && hasMoreArticles) {
            $.when(
                $.getJSON("/api/search/articles" + cookieSearchString + cookieSectionsSearchString + "/page/" + nextArticlePage + "/pagesize/" + feedPageSize),
                $.getJSON("/api/search/videos" + cookieSearchString + cookieSectionsSearchString + "/page/" + nextVideoPage + "/pagesize/" + feedPageSize)
            ).then(function (articleResponse, videoResponse) {
                hasMoreArticles = articleResponse[0].length == feedPageSize;
                hasMoreVideos = videoResponse[0].length == feedPageSize;

                if (articleResponse[0].length > 0) {
                    self.FetchedArticles = self.FetchedArticles.concat(articleResponse[0]);
                    nextArticlePage++;
                }

                if (videoResponse[0].length > 0) {
                    self.FetchedVideos = self.FetchedVideos.concat(videoResponse[0]);
                    nextVideoPage++;
                }

                self.sortAndPruneFeed(true);
            });
        } else if (self.FetchedArticles.length < feedPageSize && hasMoreArticles) {
            $.when(
                $.getJSON("/api/search/articles" + cookieSearchString + cookieSectionsSearchString + "/page/" + nextArticlePage + "/pagesize/" + feedPageSize),
            ).then(function (articleResponse) {
                hasMoreArticles = articleResponse.length == feedPageSize;
                if (articleResponse.length > 0) {
                    self.FetchedArticles = self.FetchedArticles.concat(articleResponse);
                    nextArticlePage++;
                }
                self.sortAndPruneFeed(true);
            });
        } else if (self.FetchedVideos.length < feedPageSize && hasMoreVideos) {
            $.when(
                $.getJSON("/api/search/videos" + cookieSearchString + cookieSectionsSearchString + "/page/" + nextVideoPage + "/pagesize/" + feedPageSize)
            ).then(function (videoResponse) {
                hasMoreVideos = videoResponse.length == feedPageSize;
                if (videoResponse.length > 0) {
                    self.FetchedVideos = self.FetchedVideos.concat(videoResponse);
                    nextVideoPage++;
                }
                self.sortAndPruneFeed(true);
            });
        } else {
            self.sortAndPruneFeed(true);
        }

    };

    self.loadAd = function (index) {
        $.ajax({
            url: '/api/ads/getad/' + index(),
            type: 'GET',
            dataType: 'json',
            success: function (data) {
                $('#ad-container-' + index()).append(data.html);
            },
        });
    }

    self.hasEmptyFeed = function () {
        return Fotbollskanalen.CookieModule.getPersonalizedLeagues()
            .concat(Fotbollskanalen.CookieModule.getPersonalizedTeams())
            .concat(Fotbollskanalen.CookieModule.getPersonalizedPlayers())
            .concat(Fotbollskanalen.CookieModule.getPersonalizedSections()).length === 0;
    }

    self.sortAndPruneFeed = function (append) {
        var combined = [];
        if (self.FetchedArticles.length == 0) {
            combined = combined.concat(self.FetchedVideos);
            self.FetchedVideos = [];
        } else if (self.FetchedVideos.length == 0) {
            combined = combined.concat(self.FetchedArticles);
            self.FetchedArticles = [];
        } else {
            var indexA = 0;
            var indexB = 0;
            while (combined.length < feedPageSize && self.FetchedArticles.length !== 0 && self.FetchedVideos.length !== 0) {
                var a = self.FetchedArticles[indexA];
                var b = self.FetchedVideos[indexB];
                if (new Date(a.publish_date) - new Date(b.publish_date) > 0) {
                    combined.push(a);
                    self.FetchedArticles.splice(indexA, 1);
                    if (indexA > 0) {
                        indexA--;
                    }
                } else {
                    combined.push(b);
                    self.FetchedVideos.splice(indexB, 1);
                    if (indexB > 0) {
                        indexB--;
                    }
                }
            }
        }

        if (append) {
            self.Articles.push.apply(self.Articles, ko.mapping.fromJS(combined, mapping['Articles'])());
        } else {
            ko.mapping.fromJS(combined, mapping['Articles'], self.Articles);
        }
        if (Bonnier.Fotbollskanalen.ImageLazyLoadModule) {
            Bonnier.Fotbollskanalen.ImageLazyLoadModule.InitLazyLoad();
        }
    }

    self.loadMyFeed = function () {
        var currentCookieString = self.getCookieSearchString();
        if (!Fotbollskanalen.AccountModule.isLoggedIn()) {
            Bonnier.Fotbollskanalen.PersonalizationEditModule.show();
            return;
        }

        if (self.hasEmptyFeed()) {
            Bonnier.Fotbollskanalen.PersonalizationEditModule.show();
        }

        var currentSectionsCookieString = getCookieSectionSearchString();
        self.ShowEmptyFeed(self.hasEmptyFeed());
        if (currentCookieString !== cookieSearchString || currentSectionsCookieString !== cookieSectionsSearchString) {
            cookieSearchString = currentCookieString;
            cookieSectionsSearchString = currentSectionsCookieString;
            if (self.hasEmptyFeed()) {
                self.Articles([]);
                self.Videos([]);
                self.MatchSwipeList([]);
                self.ArticlesCountLabel("");
                self.VideosCountLabel("");
                $('[data-js="myfeed-spinner"]').hide();
                return;
            }
            $('[data-js="myfeed-spinner"]').show();
            $.when(
                $.getJSON("/api/search/articles" + cookieSearchString + cookieSectionsSearchString + "/page/1/pagesize/" + feedPageSize),
                $.getJSON("/api/search/videos" + cookieSearchString + cookieSectionsSearchString + "/page/1/pagesize/" + feedPageSize),
                $.getJSON("/api/mymatchswipelist" + cookieSearchString),
            ).then(function (articleResponse, videoResponse, matchSwipeListResponse) {

                hasMoreArticles = articleResponse[0].length == feedPageSize;
                hasMoreVideos = videoResponse[0].length == feedPageSize;
                nextVideoPage = 2;
                nextArticlePage = 2;
                self.FetchedVideos = [];
                self.FetchedArticles = [];

                if (videoResponse[0].length > 0) {
                    self.FetchedVideos = videoResponse[0];
                }

                if (articleResponse[0].length > 0) {
                    self.FetchedArticles = articleResponse[0];
                }
                self.sortAndPruneFeed(false);

                ko.mapping.fromJS(matchSwipeListResponse[0], mapping['MatchSwipeList'], self.MatchSwipeList);
                $t.dispatchCustomEvent('matchlistloaded');

                if ($t.exists('.myfeed--matchswipe-wrapper') && $t.exists('.future-match')) {
                    $('.myfeed--matchswipe-wrapper')[0].scroll($('.future-match')[0].getBoundingClientRect().x - 30, 0);
                }
                self.ShowEmptyFeed(self.Videos().length === 0 && self.Articles().length === 0);

                updateArticlesCountLabel(articleResponse[0].count);

                if (Bonnier.Fotbollskanalen.ImageLazyLoadModule) {
                    Bonnier.Fotbollskanalen.ImageLazyLoadModule.InitLazyLoad();
                }
                $('[data-js="myfeed-spinner"]').hide();

                if (!hasInitiatedInfinteScroll) {
                    hasInitiatedInfinteScroll = true;

                    if ('IntersectionObserver' in window) {
                        initLoadMoreObserver();
                    } else {
                        initInViewObserver();
                    }
                }

            });
        }
    };

    initLoadMoreObserver = function () {
        var loadmoreContainer = document.querySelector('.myfeed-loadmore');
        var config = {
            rootMargin: '100px 0px 0px 0px',
            threshold: 0
        };

        var observer = new IntersectionObserver(function (entries, self) {
            entries.forEach(function (entry) {
                if (entry.isIntersecting) {
                    Bonnier.Fotbollskanalen.MyFeedModule.loadMoreFeedItems();
                }
            });
        }, config);
        observer.observe(loadmoreContainer);
    }

    initInViewObserver = function () {
        inView.offset({
            top: 500,
            right: 0,
            bottom: 0,
            left: 0
        });

        inView('.myfeed-loadmore').on('enter', function () {
            Bonnier.Fotbollskanalen.MyFeedModule.loadMoreFeedItems();
        });
    }

    self.loadMyFeedStartpage = function () {
        feedPageSize = 3;
        var currentCookieString = self.getCookieSearchString();
        if (!Fotbollskanalen.AccountModule.isLoggedIn()) {
            self.ShowEmptyFeed(true);
            self.IsLoggedIn(false);
            return;
        }
        self.AnyFavoritesSelected(self.hasEmptyFeed() === false);
        self.IsLoggedIn(true);
        self.ShowEmptyFeed(self.hasEmptyFeed());

        var currentSectionsCookieString = getCookieSectionSearchString();
        if (currentCookieString !== cookieSearchString || currentSectionsCookieString !== cookieSectionsSearchString) {
            cookieSearchString = currentCookieString;
            cookieSectionsSearchString = currentSectionsCookieString;
            if (self.hasEmptyFeed()) {
                self.Articles([]);
                self.ArticlesCountLabel("");
                $('[data-js="myfeed-spinner"]').hide();
                return;
            }
            $('[data-js="myfeed-spinner"]').show();
            self.reloadMyFeedStartpage();
        }
    };

    self.reloadMyFeedStartpage = function () {

        $.when(
            $.getJSON("/api/search/articles" + cookieSearchString + cookieSectionsSearchString + "/page/1/pagesize/" + feedPageSize),
            $.getJSON("/api/search/videos" + cookieSearchString + cookieSectionsSearchString + "/page/1/pagesize/" + feedPageSize)
        ).then(function (articleResponse, videoResponse) {
            hasMoreArticles = articleResponse[0].length == feedPageSize;
            hasMoreVideos = videoResponse[0].length == feedPageSize;
            nextVideoPage = 2;
            nextArticlePage = 2;
            self.FetchedVideos = [];
            self.FetchedArticles = [];

            if (videoResponse[0].length > 0) {
                self.FetchedVideos = videoResponse[0];
            }

            if (articleResponse[0].length > 0) {
                self.FetchedArticles = articleResponse[0];
            }

            if (videoResponse[0].length == 0 && articleResponse[0] == 0) {
                self.ShowEmptyFeed(true);
            }

            self.sortAndPruneFeed(false);

            $('[data-js="myfeed-spinner"]').hide();
        });
    }
};

(window.$fk || $)(function () {
    var initMyFeedStartPage = function () {
        Bonnier.namespace("Bonnier.Fotbollskanalen.MyFeedModule");
        Bonnier.Fotbollskanalen.MyFeedModule = new MyFeedViewModel();
        Bonnier.Fotbollskanalen.MyFeedModule.loadMyFeedStartpage();
        Bonnier.Fotbollskanalen.PersonalizationEditModule.init();
        ko.applyBindings(Bonnier.Fotbollskanalen.MyFeedModule, document.getElementById('myfeed-startpage'));
    }

    if ($t.exists("#myfeed")) {
        Bonnier.namespace("Bonnier.Fotbollskanalen.MyFeedModule");
        Bonnier.Fotbollskanalen.MyFeedModule = new MyFeedViewModel();
        Bonnier.Fotbollskanalen.MyFeedModule.loadMyFeed();
        ko.applyBindings(Bonnier.Fotbollskanalen.MyFeedModule, document.getElementById('myfeed'));
    }

    if ($t.exists("#myfeed-startpage")) {
        if (inView.is(document.getElementById("myfeed-startpage"))) {
            initMyFeedStartPage();
        }
        else {
            inView.offset(-150);
            inView("#myfeed-startpage").once('enter', function () {
                initMyFeedStartPage();
            });
        }

    }
});;
var MyLatestResultsModel = function () {
    var self = this;
    self.MatchList = ko.observableArray([]);
    self.Message = ko.observable("");
    self.ShowMyResults = ko.observable(false);
    self.HasPersonalization = ko.observable(false);
    var resultTimer = null;
    var loaderTimer = null;
    var showingLoader = false;
    var loaderStartTimestamp = false;

    self.getCookieSearchString = function () {
        var cookiesLeagues = Fotbollskanalen.CookieModule.getPersonalizedLeagues().sort().join();
        var cookiesTeams = Fotbollskanalen.CookieModule.getPersonalizedTeams().sort().join();
        var cookiesPlayers = Fotbollskanalen.CookieModule.getPersonalizedPlayers().sort().join();

        if (cookiesLeagues === "" && cookiesPlayers === "" && cookiesTeams === "") {
            return "";
        }

        if (cookiesLeagues === "") {
            cookiesLeagues = "0";
        }

        if (cookiesPlayers === "") {
            cookiesPlayers = "0";
        }

        if (cookiesTeams === "") {
            cookiesTeams = "0";
        }

        return "/leagues/" + cookiesLeagues + "/teams/" + cookiesTeams + "/players/" + cookiesPlayers;
    };

    var mapping = {
        'MyMatches': {
            create: function (options) {

                options.data.matches.map(function (match) {
                    if (match.status !== null && match.status !== 'undefined') {
                        switch (match.status.toLowerCase()) {
                            case "ht":
                                match.timer = match.status;
                                break;
                            case "pen":
                                match.timer = match.status;
                                break;
                            default:
                                match.timer = match.timer + "'";
                        }

                    }

                    match.round_title = match.round > 0 ? 'Omgång ' + match.round : ""
                    if (match.home_team_score != null && match.away_team_score != null) {
                        match.is_home_team_loser = match.home_team_score < match.away_team_score;
                        match.is_away_team_loser = match.home_team_score > match.away_team_score;
                    } else {
                        match.is_home_team_loser = false;
                        match.is_away_team_loser = false
                    }

                    if (match.home_team_penalties != null && match.away_team_penalties != null) {
                        match.is_home_team_penalty_loser = match.home_team_penalties < match.away_team_penalties;
                        match.is_away_team_penalty_loser = match.home_team_penalties > match.away_team_penalties;
                    } else {
                        match.is_home_team_penalty_loser = false;
                        match.is_away_team_penalty_loser = false
                    }

                });

                options.data.league_table_url = options.data.league_url + '?tab=tables';

                var model = ko.mapping.fromJS(options.data);
                return model;
            }
        }
    };

    self.reload = function (triggeredByPoller) {
        var hasPersonalization = Fotbollskanalen.CookieModule.hasPersonalization();
        self.HasPersonalization(hasPersonalization);
        $('.page-header__edit-area').find('[data-js="openPersonalizationEdit"]').show();

        var cookieSearchString = self.getCookieSearchString();

        if (cookieSearchString === "") {
            self.Message("Här kommer matcher visas för spelare, lag, ligor och turneringar som du följer.");
            $('.match__background-container').show();
            self.MatchList([]);
            return;
        }
        self.Message("");
        self.ShowMyResults(true);

        if (!triggeredByPoller) {
            loaderTimer = setTimeout(function () {
                loaderStartTimestamp = Date.now();
                showingLoader = true;
                $('[data-js="match-list-spinner"]').show();
            }, 150);
        }

        var myMatchResultCallback = function (data) {
            ko.mapping.fromJS(data, mapping["MyMatches"], self.MatchList);
            if (self.MatchList().length === 0) {
                self.Message("Dina ligor, spelare eller lag har inga matcher den kommande veckan");

            } else {
                $('[data-js="match-list"]').show();
                self.Message("");
            }
            Fotbollskanalen.StickyHeadingModule.setupStickyHeaders();
            $('[data-js="match-list-spinner"]').hide();
        };

        $.getJSON("/api/myresultlistbydate" + cookieSearchString, function (data) {
            clearTimeout(loaderTimer);

            if (showingLoader) {
                var diff = 600 - (Date.now() - loaderStartTimestamp);
                if (diff > 0) {
                    resultTimer = setTimeout(function () {
                        myMatchResultCallback(data);
                    }, diff);
                } else {
                    myMatchResultCallback(data);
                }
            } else {
                myMatchResultCallback(data);
            }
        });
    };

    self.reload();
    setInterval(function () {
        self.reload(true);
    }, 30000);
};

(window.$fk || $)(function () {
    Fotbollskanalen.StickyHeadingModule.init();

    if ($t.exists("#my-matchresults-list")) {
        Bonnier.namespace("Bonnier.Fotbollskanalen.MyLatestResultsModule");
        Bonnier.Fotbollskanalen.MyLatestResultsModel = new MyLatestResultsModel();
        ko.applyBindings(Bonnier.Fotbollskanalen.MyLatestResultsModel, document.getElementById('my-matchresults-list'));
        document.addEventListener('onRefreshPersonalization', function () {
            Bonnier.Fotbollskanalen.MyLatestResultsModel.reload();
        }, false);
    }
});

;
Bonnier.namespace("Bonnier.Fotbollskanalen.NativeBridgeModule");
Bonnier.Fotbollskanalen.NativeBridgeModule = (function () {

    var features = {
        // List all features here
        "trigger-sharing": {
            androidAppMinVersion: "1.5.2",
            iosAppMinVersion: "4.2"
        },
        "push-events": {
            androidAppMinVersion: "1.5.3",
            iosAppMinVersion: "4.3"
        },
        "hamburger-menu": {
            androidAppMinVersion: "1.7.0",
            androidAppMaxVersion: "1.11.0",
            iosAppMinVersion: "5.0",
            iosAppMaxVersion: "7.5"
        },
        "bottom-menu": {
            androidAppMinVersion: "1.11.1",
            iosAppMinVersion: "7.6"
        },
        "restore-video-image": {
            androidAppMinVersion: "1.8.5",
            iosAppMinVersion: "5.4"
        },
        "account-login": {
            androidAppMinVersion: "1.12.2",
            iosAppMinVersion: "8.6"
        },
        "vibrate": {
            androidAppMinVersion: "1.12.3",
            iosAppMinVersion: "8.8"
        },
        "sync-cookies": {
            androidAppMinVersion: "1.12.3",
            iosAppMinVersion: "8.8"
        },
        "video-playlist": {
            androidAppMinVersion: "1.14.3",
            iosAppMinVersion: "12.2"
        },
        "fullscreen-video": {
            androidAppMinVersion: "1.14.4",
            iosAppMinVersion: "12.3"
        },
        "fullscreen-popup": {
            androidAppMinVersion: "1.14.7",
            iosAppMinVersion: "12.5"
        },
        "consent": {
            androidAppMinVersion: "1.14.9",
            iosAppMinVersion: "12.9"
        },
        "floating-video": {
            androidAppMinVersion: "1.15.3",
            iosAppMinVersion: "13.1"
        },
        "commenting": {
            androidAppMinVersion: "1.15.3",
            iosAppMinVersion: "14.1"
        },
        "start-video-muted": {
            androidAppMinVersion: "1.16.1",
            iosAppMinVersion: "14.4"
        }
    };
    var defaultMaxVersion = "9999.9999.9999";

    var versionIsBetweenRequiredAndMax = function (version, minVersion, maxVersion) {
        if (maxVersion === undefined) {
            maxVersion = defaultMaxVersion;
        }
        var versionComponents = version.split('.'),
            minVersionComponents = minVersion.split('.'),
            maxVersionComponents = maxVersion.split('.');

        for (var i = 0; i < versionComponents.length; i++) {
            if (i >= minVersionComponents.length) break;
            var versionDigit = parseInt(versionComponents[i]),
                minVersionDigit = parseInt(minVersionComponents[i]);
            if (versionDigit > minVersionDigit) break;
            if (versionDigit < minVersionDigit) return false;
        }

        for (var j = 0; j < versionComponents.length; j++) {
            if (j >= maxVersionComponents.length) return true;
            versionDigit = parseInt(versionComponents[j]),
                maxVersionDigit = parseInt(maxVersionComponents[j]);
            if (versionDigit < maxVersionDigit) return true;
            if (versionDigit > maxVersionDigit) return false;
        }
        if (versionDigit.length < minVersionDigit.length) return false; // version B is longer
        return true; // Equal
    };

    var sharingText = null;
    var sharingUrl = null;

    var canIUse = function (feature) {
        if (!features[feature]) return false; // Shouldn't really happen but to avoid exceptions
        var currentVersion,
            requiredVersion;
        if ($t.isAndroid) {
            currentVersion = Fotbollskanalen.CookieModule.getAndroidAppVersion();
            requiredVersion = features[feature].androidAppMinVersion;
            requiredMaxVersion = features[feature].androidAppMaxVersion;
        } else if ($t.isIos) {
            currentVersion = Fotbollskanalen.CookieModule.getIosAppVersion();
            requiredVersion = features[feature].iosAppMinVersion;
            requiredMaxVersion = features[feature].iosAppMaxVersion;
            if (currentVersion === '') return true;
        } else {
            return false; // If you're on neither of the platforms you can't use a lot :)
        }
        return versionIsBetweenRequiredAndMax(currentVersion, requiredVersion, requiredMaxVersion || defaultMaxVersion);
    };

    var currentVersionIsLowerThan = function (version) {
        var currentVersion;
        if ($t.isAndroid) {
            currentVersion = Fotbollskanalen.CookieModule.getAndroidAppVersion();
        } else if ($t.isIos) {
            currentVersion = Fotbollskanalen.CookieModule.getIosAppVersion();
            if (currentVersion === '') return false;
        } else {
            return false;
        }
        return !versionIsBetweenRequiredAndMax(currentVersion, version);
    };

    var globalSearchInput = function (query) {
        Bonnier.Fotbollskanalen.GlobalSearchModule.Search(query);
    };

    var messageNative = function (url) {
        if ($t.isIos) {
            var iFrame = document.createElement("iframe");
            iFrame.setAttribute("src", url);
            document.body.appendChild(iFrame);
            iFrame.parentNode.removeChild(iFrame);
            iFrame = null;
        }
    };

    var killGlobalSearch = function () {
        Bonnier.Fotbollskanalen.GlobalSearchModule.KillSearch();
        messageNative("globalsearch://kill");
    };

    var openGlobalSearch = function () {
        Bonnier.Fotbollskanalen.GlobalSearchModule.OpenSearch();
        messageNative("globalsearch://open");
    };

    var openPersonalizationSearch = function () {
        Bonnier.Fotbollskanalen.PersonalizationEditModule.openPersonalizationSearch();
        messageNative("personalizationsearch://open");
        if (window.Android_JS && window.Android_JS.onPersonalizationSearchOpen) {
            window.Android_JS.onPersonalizationSearchOpen();
        }
    };

    var killPersonalizationSearch = function () {
        Bonnier.Fotbollskanalen.PersonalizationEditModule.ShowAllHideContainer();
        messageNative("personalizationsearch://kill");
        if (window.Android_JS && window.Android_JS.onPersonalizationSearchClose) {
            window.Android_JS.onPersonalizationSearchClose();
        }
    };

    var playVideo = function (videoId, useFullScreen, startMuted = false) {

        var playSettings = {
            videoId: videoId,
            useFloatingVideo: false,
            useFullscreen: useFullScreen,
            startMuted: startMuted,
            yPosition: 0,
            updatedPositionScript: '',
        };

        if (canIUse('fullscreen-video')) {

            if (useFullScreen) {
                if (startMuted && canIUse('start-video-muted')) {
                    messageNative('nativeplayvideo://' + videoId + '?useFullscreen=true&startMuted=true');
                } else {
                    messageNative('nativeplayvideo://' + videoId + '?useFullscreen=true');
                }
            } else {
                if (startMuted && canIUse('start-video-muted')) {
                    messageNative('nativeplayvideo://' + videoId + '?startMuted=true');
                } else {
                    messageNative('nativeplayvideo://' + videoId);
                }
            }

            if (canIUse('start-video-muted')) {
                if (window.Android_JS && window.Android_JS.onPlayVideo) {
                    window.Android_JS.onPlayVideo(JSON.stringify(playSettings));
                }
            } else {
                if (window.Android_JS && window.Android_JS.onPlayVideo) {
                    window.Android_JS.onPlayVideo(videoId, useFullScreen);
               }
            }
        } else {
            messageNative('nativeplayvideo://' + videoId);
            if (window.Android_JS && window.Android_JS.onPlayVideo) {
                window.Android_JS.onPlayVideo(videoId);
            }
        }
    };

    var playFloatingVideo = function (videoId, yPos, updatedPositionScript, startMuted = false) {
        var playSettings = {
            videoId: videoId,
            useFloatingVideo: true,
            useFullscreen: false,
            startMuted: startMuted,
            yPosition: yPos,
            updatedPositionScript: updatedPositionScript,
        };


        if (canIUse("floating-video")) {
            if (startMuted && canIUse('start-video-muted')) {
                messageNative('nativeplayvideo://' + videoId + '?yPosition=' + yPos + '&updatedPositionScript=' + encodeURIComponent(updatedPositionScript) + '&startMuted=true');
            } else {
                messageNative('nativeplayvideo://' + videoId + '?yPosition=' + yPos + '&updatedPositionScript=' + encodeURIComponent(updatedPositionScript));
            }

            if (canIUse('start-video-muted')) {
                if (window.Android_JS && window.Android_JS.onPlayVideo) {
                    window.Android_JS.onPlayVideo(JSON.stringify(playSettings));
                }
            } else {
                if (window.Android_JS && window.Android_JS.onPlayFloatingVideo) {
                    window.Android_JS.onPlayFloatingVideo(videoId, yPos, updatedPositionScript);
                }
            }

        } else {
            messageNative('nativeplayvideo://' + videoId);
            if (window.Android_JS && window.Android_JS.onPlayVideo) {
                window.Android_JS.onPlayVideo(videoId);
            }
        }
    }

    var openFullscreenPopup = function (path) {
        if (!canIUse("fullscreen-popup")) return;

        messageNative("openfullscreenpopup://?path=" + encodeURIComponent(path));
        if (window.Android_JS && window.Android_JS.openFullscreenPopup) {
            window.Android_JS.openFullscreenPopup(path);
        }
    };

    var closeFullscreenPopup = function (selectedTabIndex) {
        if (!canIUse("fullscreen-popup")) return;

        messageNative("closefullscreenpopup://?tab=" + selectedTabIndex);
        if (window.Android_JS && window.Android_JS.closeFullscreenPopup) {
            window.Android_JS.closeFullscreenPopup(selectedTabIndex);
        }
    };

    var setVideoPlayList = function (playList) {
        if (!canIUse("video-playlist")) return;
        if ($t.isIos && $t.isDefined('window.webkit.messageHandlers.videoPlayList.postMessage')) window.webkit.messageHandlers.videoPlayList.postMessage(playList);
        if ($t.isAndroid && $t.isDefined('window.Android_JS.videoPlayList')) window.Android_JS.videoPlayList(playList);
    };

    var setCommentInfo = function (commentInfo) {
        if (!canIUse("commenting")) return;
        if ($t.isIos && $t.isDefined('window.webkit.messageHandlers.commentInfo.postMessage')) window.webkit.messageHandlers.commentInfo.postMessage(JSON.stringify(commentInfo));
        //if ($t.isAndroid && $t.isDefined('window.Android_JS.videoPlayList')) window.Android_JS.videoPlayList(playList);
    };

    var setCurrentPlayListVideo = function (assetId) {
        $t.dispatchCustomEvent('currentplaylistvideo', { "detail": { "assetId": assetId } });
    }

    var openHamburgerMenu = function () {
        messageNative("hamburgermenu://open");
        if (window.Android_JS && window.Android_JS.onHamburgerMenuOpen) {
            window.Android_JS.onHamburgerMenuOpen();
        }
    };

    var closeHamburgerMenu = function () {
        messageNative("hamburgermenu://close");
        if (window.Android_JS && window.Android_JS.onHamburgerMenuClose) {
            window.Android_JS.onHamburgerMenuClose();
        }
    };

    var killHamburgerMenu = function () {
        var $body = $(document.body);
        if ($body.hasClass('hamburger--open')) {
            $body.removeClass('hamburger--open');
            $mobileMenu.addClass('hidden');
        }
    };

    var onVideoError = function (errorText) {
        if (errorText === "login") {
            $('#videoErrorMessage').text("Du behöver " + window.fotbollskanalen_premium_text + " för att spela upp den här videon.");
        } else if (errorText === "fetch") {
            $('#videoErrorMessage').text("Videon kunde inte spelas upp.");
        }
        $('#videoErrorContainer').show();
    };

    var enableSharing = function (text, url) {
        sharingText = text;
        sharingUrl = url || (location.protocol + "//www.fotbollskanalen.se" + location.pathname);
        messageNative("enablesharing://");
        if (window.Android_JS && window.Android_JS.onPassSharingInfo) {
            window.Android_JS.onPassSharingInfo(sharingText, sharingUrl);
        }
    };

    var triggerSharing = function () {
        messageNative("triggersharing://");
        if (window.Android_JS && window.Android_JS.onTriggerSharing) {
            window.Android_JS.onTriggerSharing();
        }
    };

    var syncCookies = function () {
        if (!canIUse("sync-cookies")) return;

        messageNative("syncCookies://");
        if (window.Android_JS && window.Android_JS.onSyncCookies) {
            window.Android_JS.onSyncCookies();
        }
    };

    var share = function (text, url) {
        enableSharing(text, url);
        setTimeout(function () {
            triggerSharing();
        }, 30);
    };

    var onPersonalizationChanged = function () {
        if (window.Android_JS && window.Android_JS.onPersonalizationChanged) {
            window.Android_JS.onPersonalizationChanged();
        }
    };

    var onPushEventChanged = function () {
        if (window.Android_JS && window.Android_JS.onPushEventChanged) {
            window.Android_JS.onPushEventChanged();
        }
    };

    var setVideoInfo = function (coverImageUrl, assetTitle, isLive) {
        messageNative("setvideoinfo://?coverimageurl=" + encodeURIComponent(coverImageUrl) + "&assettitle=" + encodeURIComponent(assetTitle) + "&islive=" + isLive);
        if (window.Android_JS && window.Android_JS.setVideoInfo) {

            currentVersion = Fotbollskanalen.CookieModule.getAndroidAppVersion();
            if (versionIsBetweenRequiredAndMax(currentVersion, '1.9.1')) {
                window.Android_JS.setVideoInfo(coverImageUrl, assetTitle, isLive);
            } else {
                window.Android_JS.setVideoInfo(coverImageUrl, assetTitle);
            }
        }
    };

    var getSharingText = function () {
        return sharingText;
    };

    var getSharingUrl = function () {
        return sharingUrl;
    };

    var enableRefresh = function () {
        //messageNative('enablerefresh://');
    };

    var disableRefresh = function () {
        //messageNative('disableRefresh://');
    };

    var refresh = function () {
        // TODO: Certain pages might want special handling here,
        // such as only refreshing some Ajax-based component instead of the whole page
        // Upon receiving a url here, the native app is expected load that url.
        // The reason we're not reloading via Javascript is that the webview browser
        // doesn't seem to keep the cache when doing so, causing much slower reload.
        // Cache doesn't have to be thrown away completely since we'll only want a reload
        // of the main document here, not its resources.
        // Override example:
        // if (location.search.indexOf('tab=senaste') !== -1) {
        //     senasteModule.refresh();
        //     return; // return empty if the refresh is consumed here.
        // }
        return window.location.href;
    };

    var refreshDisqus = function () {
        if (window.DISQUS) {
            window.DISQUS.reset({ reload: true });
        }
    };

    var requestLoginState = function () {
        messageNative("requestloginstate://");
        if (window.Android_JS && window.Android_JS.onLoginStateRequested) {
            window.Android_JS.onLoginStateRequested();
        }
    };

    var setLoginState = function (loginStateJSON) {
        // Pass this information to Login State Widget
        if (Bonnier.Fotbollskanalen.LoginModule) {
            Bonnier.Fotbollskanalen.LoginModule.UpdateState($.parseJSON(loginStateJSON));
        }
    };

    // Obsolete?
    var login = function () {
        messageNative("login://");
        if (window.Android_JS && window.Android_JS.doLogin) {
            window.Android_JS.doLogin();
        }
    };

    // Obsolete?
    var logout = function () {
        messageNative("logout://");
        if (window.Android_JS && window.Android_JS.doLogout) {
            window.Android_JS.doLogout();
        }
    };

    var requestPushNotificationState = function () {
        messageNative("requestpushnotificationstate://");
        if (window.Android_JS && window.Android_JS.onPushNotificationStateRequested) {
            window.Android_JS.onPushNotificationStateRequested();
        }
    };

    var setPushNotificationState = function (state) {
        Bonnier.Fotbollskanalen.PushModule.UpdateNativeState(state);
    };

    var goToPushNotificationSettings = function () {
        messageNative("gotonotificationsettings://");
        if (window.Android_JS && window.Android_JS.onGoToPushNotificationSettings) {
            window.Android_JS.onGoToPushNotificationSettings();
        }
    };

    var trackPageView = function () {
        Bonnier.Fotbollskanalen.TrackingModule.TrackAndroidPageView();
    };

    var onBackNavigation = function () {
        var event = new Event('onBackNavigation');
        document.dispatchEvent(event);

        Bonnier.Fotbollskanalen.TrackingModule.TrackNativeBackNavigatePageView();
    };

    var updateTextSize = function (percentage) {
        localStorage.setItem('nativeTextSize', percentage);
    }

    var restoreCoverImage = function () {
        var event = new Event('onBackNavigation');
        document.dispatchEvent(event);
    };

    var requestPushNextContent = function (assetId) {
        var pushNextContentModule = new Fotbollskanalen.PushNextContentModule();
        var callback = Bonnier.Fotbollskanalen.NativeBridgeModule.PushNextContentReceived;
        pushNextContentModule.getNextContentAssetId(parseInt(assetId), null, callback);
    };

    var pushNextContentReceived = function (nextContent) {
        currentNextContent = nextContent;
        messageNative("nextcontent://?id=" + nextContent.id + "&title=" + encodeURIComponent(nextContent.title) + "&image=" + encodeURIComponent(nextContent.image) + "&nextContentUrl=" + encodeURIComponent(nextContent.nextContentUrl));
        if (window.Android_JS && window.Android_JS.onPushNextContent) {
            window.Android_JS.onPushNextContent(nextContent.id.toString(), nextContent.title, nextContent.image, nextContent.nextContentUrl);
        }
    };

    var currentNextContent = undefined;

    var updateNextContentMetaData = function () {
        if (currentNextContent && location.pathname.startsWith('/video/')) {
            var videoplayerModule = new Fotbollskanalen.BonnierBroadcastingPlayerModule();
            videoplayerModule.setNextContentProperties(currentNextContent);
        }
        Fotbollskanalen.PushNextContentModule.setPlayedVideo(currentNextContent.id);
    };

    var activateTimers = function () {
        console.info('activateTimers');
        onBackNavigation();
    };

    var inactivateTimers = function () {
        console.info('onInactivateTimers');
        var event = new Event('onInactivateTimers');
        document.dispatchEvent(event);
    };

    var timeOut;
    var scrollToTop = function () {
        if (document.body.scrollTop !== 0 || document.documentElement.scrollTop !== 0) {
            window.scrollBy(0, -200);
            timeOut = setTimeout(scrollToTop, 20);
        }
        else clearTimeout(timeOut);
    };

    var mobileNavigationClick = function (menuAction, menuElement, menuIndex) {
        Bonnier.Fotbollskanalen.TrackingModule.MobileNavigationClick(menuAction, menuElement, menuIndex);
    };

    var storeCredentials = function (username, password) {
        if (!canIUse("account-login")) return;

        messageNative("storecredentials://?username=" + username + "&password=" + password);
        if (window.Android_JS && window.Android_JS.storeCredentials) {
            window.Android_JS.storeCredentials(username, password);
        }
    };

    var accountLoggedOut = function () {
        if (!canIUse("account-login")) return;

        messageNative("accountloggedout://");
        if (window.Android_JS && window.Android_JS.accountLoggedOut) {
            window.Android_JS.accountLoggedOut();
        }
    };

    var accountStatusUpdated = function (accountStatus) {
        if (!canIUse("account-login")) return;

        messageNative("accountstatusupdated://?" + serialize(accountStatus));
        if (window.Android_JS && window.Android_JS.accountStatusUpdated) {
            window.Android_JS.accountStatusUpdated(JSON.stringify(accountStatus));
        }
    };

    var reauthenticate = function () {
        Fotbollskanalen.AccountModule.reauthenticate(true);
    };

    var serialize = function (obj) {
        var str = [];
        for (var p in obj)
            if (obj.hasOwnProperty(p)) {
                str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
            }
        return str.join("&");
    };

    var hasRequestedCredentials = false;

    var getRequestedCredentials = function () {
        return hasRequestedCredentials;
    }

    var requestCredentials = function () {
        hasRequestedCredentials = true;
        if (!$t.isIos || !canIUse("account-login")) return;

        messageNative("requestcredentials://");
    };

    var returnCredentials = function (account, password) {
        $('input[name="username"]').val(account);
        $('input[name="password"]').val(password);
    };

    var vibrate = function () {
        if (!canIUse("vibrate")) return;

        messageNative("vibrate://");
        if (window.Android_JS && window.Android_JS.onVibrate) {
            window.Android_JS.onVibrate();
        }
    };

    var refreshPersonalization = function () {
        var event = new Event('onRefreshPersonalization');
        document.dispatchEvent(event);
    };

    var trackVideoStarted = function (id, title, autoplay) {
        Bonnier.Fotbollskanalen.TrackingModule.TrackVideoStarted(id, title, autoplay);
    };

    var trackEvent = function (category, action, label, value) {
        Bonnier.Fotbollskanalen.TrackingModule.TrackGenericEvent(category, action, label, value);
    };

    var trackVideoInitialized = function (id, title, autoplay) {
        Bonnier.Fotbollskanalen.TrackingModule.TrackVideoInitialized(id, title, autoplay);
    };

    var reachabilityChanged = function (reachabilityState) {
        localStorage.setItem('reachabilityState', reachabilityState);
        var event = new Event('reachabilityChanged');
        document.dispatchEvent(event);
    };

    var showConsentPreferences = function () {
        if (!canIUse("consent")) return;

        messageNative("consentsettings://");
        if (window.Android_JS && window.Android_JS.consentSettings) {
            window.Android_JS.consentSettings();
        }
    }

    return {
        CanIUse: canIUse,
        CurrentVersionIsLowerThan: currentVersionIsLowerThan,
        OpenPersonalizationSearch: openPersonalizationSearch,
        KillPersonalizationSearch: killPersonalizationSearch,
        KillGlobalSearch: killGlobalSearch,
        KillHamburgerMenu: killHamburgerMenu,
        OpenGlobalSearch: openGlobalSearch,
        GlobalSearchInput: globalSearchInput,
        PlayVideo: playVideo,
        PlayFloatingVideo: playFloatingVideo,
        SetVideoPlayList: setVideoPlayList,
        SetCommentInfo: setCommentInfo,
        SetCurrentPlayListVideo: setCurrentPlayListVideo,
        SetVideoInfo: setVideoInfo,
        OpenHamburgerMenu: openHamburgerMenu,
        CloseHamburgerMenu: closeHamburgerMenu,
        OnVideoError: onVideoError,
        EnableSharing: enableSharing,
        TriggerSharing: triggerSharing,
        GetSharingText: getSharingText,
        GetSharingUrl: getSharingUrl,
        EnableRefresh: enableRefresh,
        DisableRefresh: disableRefresh,
        Refresh: refresh,
        RefreshDisqus: refreshDisqus,
        RequestLoginState: requestLoginState,
        SetLoginState: setLoginState,
        Login: login,
        Logout: logout,
        RequestPushNotificationState: requestPushNotificationState,
        SetPushNotificationState: setPushNotificationState,
        GoToPushNotificationSettings: goToPushNotificationSettings,
        TrackPageView: trackPageView,
        OnPersonalizationChanged: onPersonalizationChanged,
        OnPushEventChanged: onPushEventChanged,
        OnBackNavigation: onBackNavigation,
        RestoreCoverImage: restoreCoverImage,
        RequestPushNextContent: requestPushNextContent,
        PushNextContentReceived: pushNextContentReceived,
        ActivateTimers: activateTimers,
        InactivateTimers: inactivateTimers,
        ScrollToTop: scrollToTop,
        MobileNavigationClick: mobileNavigationClick,
        Share: share,
        StoreCredentials: storeCredentials,
        AccountLoggedOut: accountLoggedOut,
        AccountStatusUpdated: accountStatusUpdated,
        Reauthenticate: reauthenticate,
        GetRequestedCredentials: getRequestedCredentials,
        RequestCredentials: requestCredentials,
        ReturnCredentials: returnCredentials,
        Vibrate: vibrate,
        RefreshPersonalization: refreshPersonalization,
        SyncCookies: syncCookies,
        TrackVideoStarted: trackVideoStarted,
        TrackVideoInitialized: trackVideoInitialized,
        UpdateNextContentMetaData: updateNextContentMetaData,
        ReachabilityChanged: reachabilityChanged,
        OpenFullscreenPopup: openFullscreenPopup,
        CloseFullscreenPopup: closeFullscreenPopup,
        ShowConsentPreferences: showConsentPreferences,
        UpdateTextSize: updateTextSize,
        TrackEvent: trackEvent,
    };

})();
;
Bonnier.namespace("Bonnier.Fotbollskanalen.PersonalizationEditModule");

Bonnier.Fotbollskanalen.PersonalizationEditModule = (function () {
    var personalizationEditModule = function () {
        var self = this;
        self.MyItems = ko.observableArray([]);
        self.Leagues = ko.observableArray([]);
        self.Teams = ko.observableArray([]);
        self.Players = ko.observableArray([]);
        self.Sections = ko.observableArray([]);
        self.query = ko.observable("");
        self.articleCountText = ("");
        self.isChecked = ko.observable();
        self.isSelected = ko.observable(false);
        self.SuggestedLeagues = ko.observableArray();
        self.SuggestedTeams = ko.observableArray();
        self.SuggestedPlayers = ko.observableArray();
        self.SuggestedSections = ko.observableArray();
        self.ErrorSectionMsg = ko.observable("");
        self.ErrorLeagueMsg = ko.observable("");
        self.ErrorPlayerMsg = ko.observable("");
        self.ErrorTeamMsg = ko.observable("");
        self.isPersonalizationArea = ko.observable(false);
        self.isFeedArea = ko.observable(false);
        self.isLoggedIn = ko.observable(false);
        var teamCookies, playerCookies, leagueCookies, sectionCookies;
        var onCompleteCallbacks = [];
        var onCloseDialogCompleteCallbacks = [];
        var playerItemLimit = Fotbollskanalen.CookieModule.playersMaxLimit;
        var teamItemLimit = Fotbollskanalen.CookieModule.teamsMaxLimit;
        var leagueItemLimit = Fotbollskanalen.CookieModule.leaguesMaxLimit;
        var sectionItemLimit = Fotbollskanalen.CookieModule.sectionsMaxLimit;
        var lastSearchQuery = "";
        var isInited = false;
        self.isFeed = false

        self.AddOnCompleteCallback = function (callback) {
            onCompleteCallbacks.push(callback);
        };

        self.AddOnCloseDialogCompleteCallback = function (callback) {
            onCloseDialogCompleteCallbacks.push(callback);
        };

        var fireOnComplete = function () {
            for (var i = 0; i < onCompleteCallbacks.length; i++) {
                onCompleteCallbacks[i]();
            }
        };

        var fireOnCloseDialogComplete = function () {
            for (var i = 0; i < onCloseDialogCompleteCallbacks.length; i++) {
                onCloseDialogCompleteCallbacks[i]();
            }
        };

        var checkAdd = function (id, array) {
            ko.utils.arrayForEach(array, function (item) {
                if (item.id() === id) {
                    item.isChecked(true);
                    return;
                }
            });
        };

        var mapping = {
            'MyItems': {
                create: function (options) {
                    var model = ko.mapping.fromJS(options.data);
                    model.touch_line_id = function () {
                        if (options.data.type === 'player') {
                            return options.data.player_id;
                        }
                        if (options.data.type === 'team') {
                            return options.data.team_id;
                        }
                        return options.data.league_id;
                    };

                    return model;
                }
            },
            'SearchPlayers': {
                create: function (options) {
                    var model = ko.mapping.fromJS(options.data);
                    model.isChecked = ko.observable(playerCookies.indexOf(options.data.id) > -1);
                    return model;
                }
            },
            'SearchTeams': {
                create: function (options) {
                    var model = ko.mapping.fromJS(options.data);

                    model.isChecked = ko.observable(teamCookies.indexOf(options.data.id) > -1);
                    return model;
                }
            },
            'SearchLeagues': {
                create: function (options) {
                    var model = ko.mapping.fromJS(options.data);

                    model.isChecked = ko.observable(leagueCookies.indexOf(options.data.id) > -1);
                    return model;
                }
            },
            'SearchSections': {
                create: function (options) {
                    var model = ko.mapping.fromJS(options.data);

                    model.isChecked = ko.observable(sectionCookies.indexOf(options.data.id) > -1);
                    return model;
                }
            },
            'SuggestedLeagues': {
                create: function (options) {
                    var model = ko.mapping.fromJS(options.data);
                    model.isChecked = ko.observable(leagueCookies.indexOf(options.data.id) > -1);
                    model.touch_line_id = function () {
                        return options.data.league_id;
                    };

                    return model;
                }
            },
            'SuggestedPlayers': {
                create: function (options) {
                    var model = ko.mapping.fromJS(options.data);
                    model.isChecked = ko.observable(playerCookies.indexOf(options.data.id) > -1);
                    model.touch_line_id = function () {
                        return options.data.player_id;
                    };

                    return model;
                }
            },
            'SuggestedTeams': {
                create: function (options) {
                    var model = ko.mapping.fromJS(options.data);
                    model.isChecked = ko.observable(teamCookies.indexOf(options.data.id) > -1);
                    model.touch_line_id = function () {
                        return options.data.team_id;
                    };

                    return model;
                }
            },
            'SuggestedSections': {
                create: function (options) {
                    var model = ko.mapping.fromJS(options.data);
                    model.isChecked = ko.observable(sectionCookies.indexOf(options.data.id) > -1);
                    model.section_id = function () {
                        return options.data.section_id;
                    };
                    return model;
                }
            }
        };

        // TODO:
        var showSuggestions = function () {
            $('[data-js="personalization-search-result"]').hide();
            $('[data-js="personalization-search-suggestions"]').show();
            if (self.SuggestedTeams().length === 0) {
                $.get("/api/suggestions/", {}, function (results) {
                    ko.mapping.fromJS(results.league_suggestions, mapping["SuggestedLeagues"], self.SuggestedLeagues);
                    ko.mapping.fromJS(results.team_suggestions, mapping["SuggestedTeams"], self.SuggestedTeams);
                    ko.mapping.fromJS(results.player_suggestions, mapping["SuggestedPlayers"], self.SuggestedPlayers);
                    ko.mapping.fromJS(results.section_suggestions, mapping["SuggestedSections"], self.SuggestedSections);
                }, "json");
            }
        };

        // TODO
        var hideSuggestions = function () {
            $('[data-js="personalization-search-suggestions"]').hide();
            $('[data-js="personalization-search-result"]').show();
        };

        var removeLeagueFromLists = function (leagueId) {

            ko.utils.arrayForEach(self.Leagues(), function (item) {
                if (item.id() === leagueId) {
                    item.isChecked(false);
                    return;
                }
            });

            ko.utils.arrayForEach(self.SuggestedLeagues(), function (item) {
                if (item.id() === leagueId) {
                    item.isChecked(false);
                    return;
                }
            });

            self.MyItems.remove(function (item) {
                return item.id() === leagueId;
            });

        };

        var removeTeamFromLists = function (teamId) {

            ko.utils.arrayForEach(self.Teams(), function (item) {
                if (item.id() === teamId) {
                    item.isChecked(false);
                    return;
                }
            });

            ko.utils.arrayForEach(self.SuggestedTeams(), function (item) {
                if (item.id() === teamId) {
                    item.isChecked(false);
                    return;
                }
            });

            self.MyItems.remove(function (item) {
                return item.id() === teamId;
            });

        };

        var removePlayerFromLists = function (playerId) {

            ko.utils.arrayForEach(self.Players(), function (item) {
                if (item.id() === playerId) {
                    item.isChecked(false);
                    return;
                }
            });

            ko.utils.arrayForEach(self.SuggestedPlayers(), function (item) {
                if (item.id() === playerId) {
                    item.isChecked(false);
                    return;
                }
            });

            self.MyItems.remove(function (item) {
                return item.id() === playerId;
            });

        };

        var removeSectionFromLists = function (sectionId) {

            ko.utils.arrayForEach(self.Sections(), function (item) {
                if (item.id() === sectionId) {
                    item.isChecked(false);
                    return;
                }
            });

            ko.utils.arrayForEach(self.SuggestedSections(), function (item) {
                if (item.id() === sectionId) {
                    item.isChecked(false);
                    return;
                }
            });

            self.MyItems.remove(function (item) {
                return item.id() === sectionId;
            });

        };

        self.openPersonalizationSearch = function (evt) {
            self.isFeedArea(self.isFeed);
            self.isLoggedIn(Fotbollskanalen.AccountModule.isLoggedIn());

            if (!Fotbollskanalen.AccountModule.isLoggedIn() && !this.isFeed) {
                Fotbollskanalen.AccountModule.loginSuccessCallback = function () {

                    var session = Fotbollskanalen.AccountModule.getAccountSession();
                    if (session.refreshToken) {
                        Fotbollskanalen.AccountModule.syncAccountStorage(session, function () {
                            Bonnier.Fotbollskanalen.NativeBridgeModule.SyncCookies();

                            self.HideAllShowContainer();
                            showSuggestions();
                        });
                    }
                    $('.login-wall').removeClass('show');
                };
                $('.login-wall').addClass('show');
                return;
            }
            self.HideAllShowContainer();
            showSuggestions();
        };

        self.ShowAllHideContainer = function () {
            $('[data-js="personalizationSearch"]').hide();
            $('[data-js="all"]').removeClass('all--hide');
            self.clearSearch();
            if (Bonnier.Fotbollskanalen.DeviceTypeModule.IsSmartPhoneOrTablet()) {
                $(window).scrollTop(0);
            }
            fireOnComplete();
            // Reload feed if it's on current page
            if (Bonnier.Fotbollskanalen.MyFeedModule) {
                if ($t.exists("#myfeed")) {
                    Bonnier.Fotbollskanalen.MyFeedModule.loadMyFeed();
                } else if ($t.exists("#myfeed-startpage")) {
                    Bonnier.Fotbollskanalen.MyFeedModule.loadMyFeedStartpage();
                }
            }
            // Reload PersonalizedMatchListModel if it's on the current page
            if (Bonnier.Fotbollskanalen.PersonalizedMatchListModule) {
                Bonnier.Fotbollskanalen.PersonalizedMatchListModule.reload();
            }
            // Reload MyLatestResultsModel if it's on the current page
            if (Bonnier.Fotbollskanalen.MyLatestResultsModel) {
                Bonnier.Fotbollskanalen.MyLatestResultsModel.reload();
            }
        };

        self.HideAllShowContainer = function () {
            /*Todo: change the fade with transition instead  */
            if (Bonnier.Fotbollskanalen.DeviceTypeModule.IsSmartPhoneOrTablet()) {
                $('[data-js="personalizationSearch"]').show();
                $(window).scrollTop(0);
            } else {
                $('[data-js="personalizationSearch"]').fadeIn();
                self.isSelected(true);
            }

            $('[data-js="all"]').addClass('all--hide');
        };

        self.openLogin = function () {
            if (!Fotbollskanalen.AccountModule.isLoggedIn() && self.isFeed) {
                Fotbollskanalen.AccountModule.loginSuccessCallback = function () {
//                    self.syncAndLoadMyTeamsAndPlayers(true);

                    Fotbollskanalen.AccountModule.syncAccountStorage(Fotbollskanalen.AccountModule.getAccountSession(), function () {
                        Bonnier.Fotbollskanalen.NativeBridgeModule.SyncCookies();
                        self.loadMyTeamsAndPlayers();

                        if ($t.exists('.native') && location.search.contains('fullscreen')) {
                            Bonnier.Fotbollskanalen.NativeBridgeModule.CloseFullscreenPopup(4);
                        } else {
                            $('.login-wall').removeClass('show');
                            self.closeDialog();
                        }
                    });


                };

                $.ajax({
                    url: '/api/account/darkloginview',
                    type: 'GET',
                    dataType: 'json',
                    success: function (data) {
                        $('.account-container').empty().append(data.html);
                        $('.login-wall').addClass('show');
                    },
                });

                return;
            }
        };

        self.killPersonalizationSearch = function () {
            if (Fotbollskanalen.AccountModule.isLoggedIn() && self.isFeed && self.MyItems().length === 0) return;

            if (Fotbollskanalen.AccountModule.isLoggedIn() && self.isFeed && self.MyItems().length !== 0 && !!sessionStorage.getItem('isLoggedInWithoutPersonalization')) {
                Bonnier.Fotbollskanalen.TrackingModule.TrackGenericEvent('red-bubble', 'registered_user_setup_feed');
            }

            if (!Fotbollskanalen.AccountModule.isLoggedIn() && self.isFeed && self.MyItems().length !== 0) {
                Fotbollskanalen.AccountModule.loginSuccessCallback = function () {
                    if ($t.exists('.native') && location.search.contains('fullscreen')) {
                        Bonnier.Fotbollskanalen.NativeBridgeModule.CloseFullscreenPopup(4);
                    } else {
                        $('.login-wall').removeClass('show');
                        self.closeDialog();
                    }
                };
                var viewUrl = '/api/account/darkregistrationview';
                if (localStorage.getItem('hasLoggedIn')) {
                    viewUrl = '/api/account/darkloginview';
                }
                $.ajax({
                    url: viewUrl,
                    type: 'GET',
                    dataType: 'json',
                    success: function (data) {
                        $('.account-container').empty().append(data.html);
                        $('.account-container h2').text('Spara inställningar');
                        $('.account-container .description').text('Logga in eller skapa ett gratiskonto för att spara dina inställningar.\nSamma login på Fotbollskanalen & TV4 Play.');
                        $('.login-wall').addClass('show');
                    },
                });
                return;
            }

            self.closeDialog();
        };

        self.closeDialog = function () {
            if ($t.isIos || $t.isAndroid) {
                Bonnier.Fotbollskanalen.NativeBridgeModule.KillPersonalizationSearch();
            } else {
                self.ShowAllHideContainer();
                self.isSelected(false);
            }
            fireOnCloseDialogComplete();
        };

        self.toggleButton = function () {
            self.isChecked(true);
        };

        self.clearSearch = function () {
            self.query("");
            self.Players([]);
            self.Teams([]);
            self.Leagues([]);
            showSuggestions();
        };

        self.getData = function (query) {
            if (query.length > 2) {
                hideSuggestions();
                $('.spinner-player , .spinner-team').show();

                playerCookies = Fotbollskanalen.CookieModule.getPersonalizedPlayers().join();

                $.getJSON("/api/sections/autocomplete/" + query, function (data) {
                    ko.mapping.fromJS(data, mapping['SearchSections'], self.Sections);
                    $('.spinner-section').hide();
                });
                $.getJSON("/api/leagues/autocomplete/" + query, function (data) {
                    ko.mapping.fromJS(data, mapping['SearchLeagues'], self.Leagues);
                    $('.spinner-league').hide();
                });
                $.getJSON("/api/teams/autocomplete/" + query, function (data) {
                    ko.mapping.fromJS(data, mapping['SearchTeams'], self.Teams);
                    $('.spinner-team').hide();
                });
                $.getJSON("/api/players/autocomplete/" + query, function (data) {
                    ko.mapping.fromJS(data, mapping['SearchPlayers'], self.Players);
                    $('.spinner-player').hide();
                });
            } else {
                self.Sections([]);
                self.Leagues([]);
                self.Teams([]);
                self.Players([]);
                showSuggestions();
            }
        };

        self.search = function () {
            var query = self.query();
            query = query.removeSpecialCharacters();
            if (query === lastSearchQuery) return true;
            lastSearchQuery = query;
            self.getData(query);
            return true;
        };

        self.addPlayer = function () {
            if (playerCookies.split(",").length >= playerItemLimit && !this.isChecked()) {
                self.ErrorPlayerMsg('Obs! maxgräns av ' + playerItemLimit + ' spelare har uppnåtts');
                return;
            }

            if (this.isChecked()) {
                self.removePlayer(this);
                return;
            }

            checkAdd(this.id(), self.Players());
            checkAdd(this.id(), self.SuggestedPlayers());
            self.MyItems.unshift(this);
            $('.personalization-top .personalization-list').scrollLeft(0);

            self.ErrorPlayerMsg('');
            Fotbollskanalen.CookieModule.addPersonalizedPlayer(this.id(), this.name());
            playerCookies = Fotbollskanalen.CookieModule.getPersonalizedPlayers().join();
            Fotbollskanalen.AccountModule.forceSyncAccountFavorites();
        };

        self.addTeam = function () {
            if (teamCookies.split(",").length >= teamItemLimit && !this.isChecked()) {
                self.ErrorTeamMsg('Obs! maxgräns av ' + teamItemLimit + ' lag har uppnåtts');
                return;
            }

            if (this.isChecked()) {
                self.removeTeam(this);
                return;
            }

            if (hasTooLongName(this.name().split(" ")) && this.short_name) this.name = this.short_name;

            checkAdd(this.id(), self.Teams());
            checkAdd(this.id(), self.SuggestedTeams());
            self.MyItems.unshift(this);
            $('.personalization-top .personalization-list').scrollLeft(0);

            self.ErrorTeamMsg("");
            Fotbollskanalen.CookieModule.addPersonalizedTeam(this.id(), this.name());
            teamCookies = Fotbollskanalen.CookieModule.getPersonalizedTeams().join();
            Fotbollskanalen.AccountModule.forceSyncAccountFavorites();
        };

        self.addLeague = function () {
            if (leagueCookies.split(",").length >= leagueItemLimit && !this.isChecked()) {
                self.ErrorLeagueMsg('Obs! maxgräns av ' + leagueItemLimit + ' ligor har uppnåtts');
                return;
            }

            if (this.isChecked()) {
                self.removeLeague(this);
                return;
            }

            if (hasTooLongName(this.name().split(" ")) && this.short_name) this.name = this.short_name;

            checkAdd(this.id(), self.Leagues());
            checkAdd(this.id(), self.SuggestedLeagues());
            self.MyItems.unshift(this);
            $('.personalization-top .personalization-list').scrollLeft(0);

            self.ErrorLeagueMsg("");
            Fotbollskanalen.CookieModule.addPersonalizedLeague(this.id(), this.name());
            leagueCookies = Fotbollskanalen.CookieModule.getPersonalizedLeagues().join();
            Fotbollskanalen.AccountModule.forceSyncAccountFavorites();
        };

        self.addSection = function () {
            if (sectionCookies.split(",").length >= sectionItemLimit && !this.isChecked()) {
                self.ErrorSectionMsg('Obs! maxgräns av ' + sectionItemLimit + ' bloggar & poddar har uppnåtts');
                return;
            }

            if (this.isChecked()) {
                self.removeSection(this);
                return;
            }

            if (hasTooLongName(this.name().split(" ")) && this.short_name) this.name = this.short_name;

            checkAdd(this.id(), self.Sections());
            checkAdd(this.id(), self.SuggestedSections());
            self.MyItems.unshift(this);
            $('.personalization-top .personalization-list').scrollLeft(0);

            self.ErrorSectionMsg("");
            Fotbollskanalen.CookieModule.addPersonalizedSection(this.id(), this.name());
            sectionCookies = Fotbollskanalen.CookieModule.getPersonalizedSections().join();
            Fotbollskanalen.AccountModule.forceSyncAccountFavorites();
        };

        self.removePlayer = function (thisPlayer) {

            var player = this;

            if (typeof thisPlayer === 'object') {
                player = thisPlayer;
            }

            if (player === null || player === 'undefined') return;

            removePlayerFromLists(player.id());

            self.ErrorPlayerMsg("");
            Fotbollskanalen.CookieModule.removePersonalizedPlayer(player.id(), player.name());
            playerCookies = Fotbollskanalen.CookieModule.getPersonalizedPlayers().join();
            Fotbollskanalen.AccountModule.forceSyncAccountFavorites();
        };

        self.removeTeam = function (thisTeam) {
            var team = this;

            if (typeof thisTeam === 'object') {
                team = thisTeam;
            }

            if (team === null || team === 'undefined') return;

            removeTeamFromLists(team.id());
            self.ErrorTeamMsg("");
            Fotbollskanalen.CookieModule.removePersonalizedTeam(team.id(), team.name());
            teamCookies = Fotbollskanalen.CookieModule.getPersonalizedTeams().join();
            Fotbollskanalen.AccountModule.forceSyncAccountFavorites();
        };

        self.removeLeague = function (thisLeague) {
            var league = this;

            if (typeof thisLeague === 'object') {
                league = thisLeague;
            }

            if (league === null || league === 'undefined') return;

            removeLeagueFromLists(league.id());
            self.ErrorLeagueMsg("");
            Fotbollskanalen.CookieModule.removePersonalizedLeague(league.id(), league.name());
            leagueCookies = Fotbollskanalen.CookieModule.getPersonalizedLeagues().join();
            Fotbollskanalen.AccountModule.forceSyncAccountFavorites();
        };

        self.removeSection = function (thisSection) {
            var section = this;

            if (typeof thisSection === 'object') {
                section = thisSection;
            }

            if (section === null || section === 'undefined') return;

            removeSectionFromLists(section.id());
            self.ErrorSectionMsg("");
            Fotbollskanalen.CookieModule.removePersonalizedSection(section.id(), section.name());
            sectionCookies = Fotbollskanalen.CookieModule.getPersonalizedSections().join();
            Fotbollskanalen.AccountModule.forceSyncAccountFavorites();
        };

        self.loadMyTeamsAndPlayers = function () {
            leagueCookies = Fotbollskanalen.CookieModule.getPersonalizedLeagues().join();
            teamCookies = Fotbollskanalen.CookieModule.getPersonalizedTeams().join();
            playerCookies = Fotbollskanalen.CookieModule.getPersonalizedPlayers().join();
            sectionCookies = Fotbollskanalen.CookieModule.getPersonalizedSections().join();

            $.when(
                leagueCookies ? $.getJSON("/api/leagues/filter/" + leagueCookies) : [[]],
                teamCookies ? $.getJSON("/api/teams/filter/" + teamCookies) : [[]],
                playerCookies ? $.getJSON("/api/players/filter/" + playerCookies) : [[]],
                sectionCookies ? $.getJSON("/api/sections/filter/" + sectionCookies) : [[]]
            ).then(function (leagueResponse, teamResponse, playerResponse, sectionResponse) {
                ko.mapping.fromJS(leagueResponse[0].concat(teamResponse[0].concat(playerResponse[0]).concat(sectionResponse[0])), mapping['MyItems'], self.MyItems);
                fireOnComplete();
            });
        };

        self.init = function () {
            var session = Fotbollskanalen.AccountModule.getAccountSession();
            Fotbollskanalen.AccountModule.syncAccountStorage(session, function () {
                Bonnier.Fotbollskanalen.NativeBridgeModule.SyncCookies();
                self.loadMyTeamsAndPlayers();
            });
        };

        self.show = function () {
 
            if (Fotbollskanalen.AccountModule.isLoggedIn()) {
                Fotbollskanalen.AccountModule.syncAccountStorage(Fotbollskanalen.AccountModule.getAccountSession(), function () {
                    Bonnier.Fotbollskanalen.NativeBridgeModule.SyncCookies();
                    self.loadMyTeamsAndPlayers();

                    if ($t.isIos || $t.isAndroid) {
                        Bonnier.Fotbollskanalen.NativeBridgeModule.OpenPersonalizationSearch();
                    } else {
                        self.openPersonalizationSearch();
                    }
                });
            } else {
                self.loadMyTeamsAndPlayers();

                if ($t.isIos || $t.isAndroid) {
                    Bonnier.Fotbollskanalen.NativeBridgeModule.OpenPersonalizationSearch();
                } else {
                    self.openPersonalizationSearch();
                }
            }
        };

    };
    return new personalizationEditModule();
})();

(window.$fk || $)(function () {
    if ($t.exists("#personalization-edit")) {
        ko.applyBindings(Bonnier.Fotbollskanalen.PersonalizationEditModule, document.getElementById('personalization-edit'));
    }
});;
Bonnier.namespace("Bonnier.Fotbollskanalen.PersonalizationFollowArticleTagModule");

Bonnier.Fotbollskanalen.PersonalizationFollowArticleTagModule = (function () {


    var followClicked = function (event) {
        event.preventDefault();

        var toggle = event.currentTarget;
        var dataId = $(event.currentTarget).data('id').toString();
        var dataType = $(event.currentTarget).data('type');
        var dataName = $(event.currentTarget).data('name');

        if (!Fotbollskanalen.AccountModule.isLoggedIn()) {
            Fotbollskanalen.AccountModule.loginSuccessCallback = function () {
                performedFollowToggle(dataId, dataType, dataName);
                $('.login-wall').removeClass('show');
                $t.dispatchCustomEvent('unlockMemberArticle');
            };
            $('.login-wall').addClass('show');
            return;
        }

        performedFollowToggle(toggle, dataId, dataType, dataName);
    };

    var performedFollowToggle = function (toggle, dataId, dataType, dataName) {

        var session = Fotbollskanalen.AccountModule.getAccountSession();
        if (session.refreshToken) {
            Fotbollskanalen.AccountModule.syncAccountStorage(session, function () {
                //Bonnier.Fotbollskanalen.NativeBridgeModule.SyncCookies();
                //updateFollowing();

                if (dataType === 'team') {
                    if (Fotbollskanalen.CookieModule.isFollowingTeam(dataId)) {
                        Fotbollskanalen.CookieModule.removePersonalizedTeam(dataId, dataName);
                    } else {
                        if (Fotbollskanalen.CookieModule.addPersonalizedTeam(dataId, dataName) === false) {
                            $(toggle).addClass("maxlimit");
                        }
                    }
                } else if (dataType === 'player') {
                    if (Fotbollskanalen.CookieModule.isFollowingPlayer(dataId)) {
                        Fotbollskanalen.CookieModule.removePersonalizedPlayer(dataId, dataName);
                    } else {
                        if (Fotbollskanalen.CookieModule.addPersonalizedPlayer(dataId, dataName) === false) {
                            $(toggle).addClass("maxlimit");
                        }
                    }
                } else if (dataType === 'league') {
                    if (Fotbollskanalen.CookieModule.isFollowingLeague(dataId)) {
                        Fotbollskanalen.CookieModule.removePersonalizedLeague(dataId, dataName);
                    } else {
                        if (Fotbollskanalen.CookieModule.addPersonalizedLeague(dataId, dataName) === false) {
                            $(toggle).addClass("maxlimit");
                        }
                    }
                }

                if (session.refreshToken) {
                    Fotbollskanalen.AccountModule.forceSyncAccountFavorites(function () {
                        Bonnier.Fotbollskanalen.NativeBridgeModule.SyncCookies();
                        updateFollowing();
                    });
                } else {
                    Bonnier.Fotbollskanalen.NativeBridgeModule.SyncCookies();
                    updateFollowing();
                }
            });
        }


    };

    var updateFollowing = function () {
        if ($t.exists($('[data-js=article-tags__follow-button]'))) {
            $('[data-js=article-tags__follow-button]').each(function () {
                setFollowing($(this));
            });
        }
    };

    var setFollowing = function (target) {
        var dataType = target.attr('data-type');
        var dataId = target.attr('data-id');
        if (dataType === 'team') {
            if (Fotbollskanalen.CookieModule.isFollowingTeam(dataId)) {
                target.addClass("following");
            } else {
                target.removeClass("following");
            }
        } else if (dataType === 'player') {
            if (Fotbollskanalen.CookieModule.isFollowingPlayer(dataId)) {
                target.addClass("following");
            } else {
                target.removeClass("following");
            }
        } else if (dataType === 'league') {
            if (Fotbollskanalen.CookieModule.isFollowingLeague(dataId)) {
                target.addClass("following");
            } else {
                target.removeClass("following");
            }
        }
    };

    return {
        UpdateFollowing: updateFollowing,
        FollowClicked: followClicked
    };
})();
;
Bonnier.namespace("Bonnier.Fotbollskanalen.PersonalizationShowModule");

var PersonalizedShowViewModel = function (showFeedResult) {
    var self = this;
   
    self.showFeedResult = showFeedResult;
    self.MyItems = ko.observableArray([]);
    self.HasNoItems = ko.observable(false);
    self.HasItems = ko.observable(false);

    self.openPersonalizationSearch = function () {
        Bonnier.Fotbollskanalen.PersonalizationEditModule.show();
    };

    self.update = function () {
        self.MyItems(Bonnier.Fotbollskanalen.PersonalizationEditModule.MyItems());
        self.HasNoItems(self.MyItems().length === 0);
        self.HasItems(!self.HasNoItems());
    };

    self.init = function () {
        Bonnier.Fotbollskanalen.PersonalizationEditModule.AddOnCompleteCallback(self.update);
        Bonnier.Fotbollskanalen.PersonalizationEditModule.isFeed = self.showFeedResult;
        Bonnier.Fotbollskanalen.PersonalizationEditModule.init();
    };

   self.init();
};

;
Bonnier.namespace("Bonnier.Fotbollskanalen.PersonalizationToggleModule");

Bonnier.Fotbollskanalen.PersonalizationToggleModule = (function () {
    var TYPES = {
        "team": {
            isFollowing: Fotbollskanalen.CookieModule.isFollowingTeam,
            follow: Fotbollskanalen.CookieModule.addPersonalizedTeam,
            unfollow: Fotbollskanalen.CookieModule.removePersonalizedTeam
        },
        "player": {
            isFollowing: Fotbollskanalen.CookieModule.isFollowingPlayer,
            follow: Fotbollskanalen.CookieModule.addPersonalizedPlayer,
            unfollow: Fotbollskanalen.CookieModule.removePersonalizedPlayer
        },
        "league": {
            isFollowing: Fotbollskanalen.CookieModule.isFollowingLeague,
            follow: Fotbollskanalen.CookieModule.addPersonalizedLeague,
            unfollow: Fotbollskanalen.CookieModule.removePersonalizedLeague
        },
        "section": {
            isFollowing: Fotbollskanalen.CookieModule.isFollowingSection,
            follow: Fotbollskanalen.CookieModule.addPersonalizedSection,
            unfollow: Fotbollskanalen.CookieModule.removePersonalizedSection
        }
    };

    var isFollowing = function (type, id) {
        return TYPES[type].isFollowing(id);
    };

    var followClicked = function (event) {
        var toggle = event.currentTarget;
        var dataId = $(event.currentTarget).data('id').toString();
        var dataType = $(event.currentTarget).data('type');
        var dataName = $(event.currentTarget).data('name');
        if (!Fotbollskanalen.AccountModule.isLoggedIn()) {
            Fotbollskanalen.AccountModule.loginSuccessCallback = function () {
                performFollowChange(toggle, dataId, dataType, dataName);
                $('.login-wall').removeClass('show');
            };
            $('.login-wall').addClass('show');
            return;
        }
        performFollowChange(toggle, dataId, dataType, dataName);
    };

    var performFollowChange = function (toggle, dataId, dataType, dataName) {
        var session = Fotbollskanalen.AccountModule.getAccountSession();
        if (session.refreshToken) {
            Fotbollskanalen.AccountModule.syncAccountStorage(session, function () {
                if (isFollowing(dataType, dataId)) {
                    TYPES[dataType].unfollow(dataId, dataName);
                } else {
                    if (TYPES[dataType].follow(dataId, dataName) === false) {
                        $(toggle).addClass("maxlimit");
                    }
                }
                setFollowing($(toggle));

                Fotbollskanalen.AccountModule.forceSyncAccountFavorites(function () {
                    Bonnier.Fotbollskanalen.NativeBridgeModule.SyncCookies();
                    updateFollowing();
                });

                Bonnier.Fotbollskanalen.NativeBridgeModule.SyncCookies();
            });
        } else {
            Bonnier.Fotbollskanalen.NativeBridgeModule.SyncCookies();
        }
    };

    var setButton = function (button) {
        button.click(followClicked);
        setFollowing(button);
    };

    var setFollowing = function (target) {
        var dataType = target.attr("data-type");
        var dataId = target.attr("data-id");
        if (isFollowing(dataType, dataId)) {
            target.addClass("following");
        } else {
            target.removeClass("following");
        }
    };

    var updateFollowing = function () {
        if ($t.exists($('[data-js=personalization-tag__follow-button]'))) {
            $('[data-js=personalization-tag__follow-button]').each(function () {
                setFollowing($(this));
            });
        }
    };

    return {
        SetButton: setButton,
        UpdateFollowing: updateFollowing,
        FollowClicked: followClicked
    };
})();
;
var PersonalizedMatchListModel = function () {
    var self = this;
    self.MatchList = ko.observableArray([]);
    self.Message = ko.observable("");
    self.ShowMyMatches = ko.observable(false);
    self.HasPersonalization = ko.observable(false);
    var resultTimer = null;
    var loaderTimer = null;
    var showingLoader = false;
    var loaderStartTimestamp = false;

    iconClicked = function (match, event) {
        console.log(match);
        if (match.video && match.video.external_url()) {
            window.open(match.video.external_url(), "_top");
        }
    };

    var mapping = {
        'MatchList': {
            create: function (options) {
                options.data.matches.map(function (match) {
                    match.title = match.home_team + " - " + match.away_team;
                    match.round_title = match.round > 0 ? 'Omgång ' + match.round : "";

                    if (match.home_team_score != null && match.away_team_score != null) {
                        match.is_home_team_loser = match.home_team_score < match.away_team_score;
                        match.is_away_team_loser = match.home_team_score > match.away_team_score;
                    } else {
                        match.is_home_team_loser = false;
                        match.is_away_team_loser = false
                    }

                    if (match.home_team_penalties != null && match.away_team_penalties != null) {
                        match.is_home_team_penalty_loser = match.home_team_penalties < match.away_team_penalties;
                        match.is_away_team_penalty_loser = match.home_team_penalties > match.away_team_penalties;
                    } else {
                        match.is_home_team_penalty_loser = false;
                        match.is_away_team_penalty_loser = false
                    }
                });

                options.data.league_table_url = options.data.league_url + '?tab=tables';

                var model = ko.mapping.fromJS(options.data);

                return model;
            }
        },
    };

    self.getCookieSearchString = function () {
        var cookiesLeagues = Fotbollskanalen.CookieModule.getPersonalizedLeagues().sort().join();
        var cookiesTeams = Fotbollskanalen.CookieModule.getPersonalizedTeams().sort().join();
        var cookiesPlayers = Fotbollskanalen.CookieModule.getPersonalizedPlayers().sort().join();

        if (cookiesLeagues === "" && cookiesPlayers === "" && cookiesTeams === "") {
            return "";
        }

        if (cookiesLeagues === "") {
            cookiesLeagues = "0";
        }

        if (cookiesPlayers === "") {
            cookiesPlayers = "0";
        }

        if (cookiesTeams === "") {
            cookiesTeams = "0";
        }

        return "/leagues/" + cookiesLeagues + "/teams/" + cookiesTeams + "/players/" + cookiesPlayers;
    };

    self.reload = function () {
        var hasPersonalization = Fotbollskanalen.CookieModule.hasPersonalization();
        self.HasPersonalization(hasPersonalization);
        $('.page-header__edit-area').find('[data-js="openPersonalizationEdit"]').show();

        var cookieSearchString = self.getCookieSearchString();

        if (cookieSearchString === "") {
            //self.Message("Här kommer matcher visas för spelare, lag, ligor och turneringar som du följer.");
            self.MatchList([]);
            return;
        }
        self.Message("");
        self.ShowMyMatches(true);

        loaderTimer = setTimeout(function () {
            loaderStartTimestamp = Date.now();
            showingLoader = true;
            $('[data-js="match-list-spinner"]').show();
        }, 150);

        var myMatchResultCallback = function (data) {
            ko.mapping.fromJS(data, mapping['MatchList'], self.MatchList);
            if (self.MatchList().length === 0) {
                self.Message("Dina ligor, spelare eller lag har inga matcher den kommande veckan.");
            } else {
                $('[data-js="match-list"]').show();
                self.Message("");
            }
            Fotbollskanalen.StickyHeadingModule.setupStickyHeaders();
            $('[data-js="match-list-spinner"]').hide();
        };

        $.getJSON("/api/mymatchlist" + cookieSearchString, function (data) {
            clearTimeout(loaderTimer);
            if (showingLoader) {
                var diff = 600 - (Date.now() - loaderStartTimestamp);
                if (diff > 0) {
                    resultTimer = setTimeout(function () {
                        myMatchResultCallback(data);
                    }, diff);
                } else {
                    myMatchResultCallback(data);
                }
            } else {
                myMatchResultCallback(data);
            }
        });
    };

    self.reload();
};

(window.$fk || $)(function () {
    Fotbollskanalen.StickyHeadingModule.init();

    if ($t.exists("#personalized-matchlist")) {
        Bonnier.namespace("Bonnier.Fotbollskanalen.PersonalizedMatchListModule");
        Bonnier.Fotbollskanalen.PersonalizedMatchListModule = new PersonalizedMatchListModel();
        ko.applyBindings(Bonnier.Fotbollskanalen.PersonalizedMatchListModule, document.getElementById('personalized-matchlist'));

        document.addEventListener('onRefreshPersonalization', function () {
            Bonnier.Fotbollskanalen.PersonalizedMatchListModule.reload();
        }, false);
    }
});;
var PickYourTeamListViewModel = function (widgetId) {
    var self = this;
    self.Teams = ko.observable("");
    self.SharedTeam = ko.observable("");

    self.currentPage = ko.observable(1);
    self.pageCount = ko.observable(1);
    self.pageSize = ko.observable(10);
    self.totalCount = ko.observable(1);
    self.firstItemIndex = ko.observable(1);
    self.lastItemIndex = ko.observable(10);

    self.scrolled = false;

    self.loadByShareId = function (shareId, callback) {
        if (shareId && !shareId.startsWith('#page-')) {
            var apiUrlSharedTeam = "/api/pickyourteam/getsharedteambyid/" + shareId;
            $.ajax({
                url: apiUrlSharedTeam,
                success: function (data) {
                    if (data === null || typeof data === 'undefined') {
                        return;
                    };
                    ko.mapping.fromJS(data, {}, self.SharedTeam);
                }
            }).done(function () {
                if (callback) callback();
                self.bindSharingButtons();
            });
        }
    }

    self.load = function (page) {
        if (page === undefined && location.hash.startsWith('#page-')) {
            page = location.hash.replace('#page-', '');
        }
        self.initialScrollToHashId();
        var apiUrl = "/api/pickyourteam/getpickedteams/" + widgetId;
        if (page) {
            apiUrl += "/page/" + page;
        }
        $.ajax({
            url: apiUrl,
            success: function (data) {
                if (data === null || typeof data === 'undefined') {
                    return;
                };
                ko.mapping.fromJS(data.data.teams, {}, self.Teams);
                self.currentPage(data.current_page);
                self.pageCount(data.page_count);
                self.pageSize(data.page_size);
                self.totalCount(data.total_count);
                self.firstItemIndex(data.first_item_index);
                self.lastItemIndex(data.last_item_index);
                self.createPagination();
            }
        }).done(function () {
            self.bindSharingButtons();
            Bonnier.Fotbollskanalen.ImageLazyLoadModule.InitLazyLoad();
            self.bindDeleteButtons();
        });
    }

    self.bindSharingButtons = function () {
        Bonnier.Fotbollskanalen.SocialShareModule.Init();
        if ($t.exists('[data-js="trigger-sharing-button"]') && Bonnier.Fotbollskanalen.NativeBridgeModule.CanIUse('trigger-sharing')) {
            $('[data-js="trigger-sharing-button"]').show();
        }
    }

    self.bindDeleteButtons = function () {
        $('[data-js=team-delete-button]').on("click", function () {
            this.parentElement.remove();
            var data = this.attributes["data-guid"].value;

            $.ajax({
                type: "delete",
                datatype: "jsonp",
                data: JSON.stringify(data),
                url: "/api/pickyourteam/deleteteam/",
                contentType: "application/json"
            });
        });
    }

    self.initialScrollToHashId = function () {
        if (self.scrolled) return;
        self.scrolled = true;
        self.loadByShareId(location.hash.replace('#pick-your-team-list-', ''), function () {
            var target = $(location.hash);
            if (target.length) {
                $('.single-shared-team-container').show();
                setTimeout(function () {
                    $('html, body').animate({
                        scrollTop: target.offset().top - 150
                    }, 1500, function () {
                        Bonnier.Fotbollskanalen.ImageLazyLoadModule.InitLazyLoad();
                    });

                }, 1500);
            };

        });
    };

    self.goToPage = function (page) {
        self.load(page);
    }

    self.createPagination = function () {
        $("#paginationHolder").pagination({
            pages: self.pageCount(),
            itemsOnPage: self.pageSize(),
            currentPage: self.currentPage(),
            onPageClick: self.goToPage,
            prevText: "Föreg.",
            nextText: "Nästa",
        });
    };

    self.load();
};
;
Bonnier.namespace("Bonnier.Fotbollskanalen.PickYourTeamModule");

Bonnier.Fotbollskanalen.PickYourTeamModule = (function () {
    var self = this;
    self.Player = $('.pick-your-team__player');
    self.Bench = $('.pick-your-team__squad-list');
    self.Pitch = $('.pitch__starting-eleven');
    self.StartingGoalKeeper = Pitch.filter('[data-position=pick-your-team-goalkeeper]');
    self.StartingDefenders = Pitch.filter('[data-position=pick-your-team-defender]');
    self.StartingMidfielders = Pitch.filter('[data-position=pick-your-team-midfielder]');
    self.StartingStrikers = Pitch.filter('[data-position=pick-your-team-striker]');
    self.ResetButton = $('[data-js=pick-your-team-reset-btn]');
    self.SaveButton = $('[data-js=pick-your-team-save-btn]');
    self.SaveButtonActive = false;
    self.TeamNameInput = $('[data-js=pick-your-team-name]');
    self.PitchHelpText = $('[data-js=pitch__help]');
    self.MAX_OUTFIELD_PLAYERS = 10;
    self.MAX_SQUAD_PLAYERS = 26;
    self.MAX_SQUAD_GOALKEEPERS = 3;

    var init = function (params) {
        self.WidgetId = params.widgetId;
        self.ListElementId = params.listElementId;
        self.PickSquad = params.pickSquad === true;
        AddPlayer();
        tabSwitch();
        teamNameInputTypeCheck();
        dataBindStoredTeams();
    };

    self.teamNameInputTypeCheck = function () {
        TeamNameInput.keyup(function () {
            validateInputReadyToSave();
        });
        TeamNameInput.onfocusout = function () {
            validateInputReadyToSave();
        };
    }

    self.dataBindStoredTeams = function () {
        self.viewModel = new PickYourTeamListViewModel(self.WidgetId);
        ko.applyBindings(self.viewModel, document.getElementById(self.ListElementId));
        $('#' + self.ListElementId).show();

        if (location.hash.length > 0) {
            var element = document.getElementById('your-own-team-list');
            ko.cleanNode(element);
            ko.applyBindings(self.viewModel, element);
        }
    }

    self.deactivateTeamSaveButton = function () {
        if (!self.SaveButtonActive) return;
        self.SaveButton.addClass("btn-disabled");
        self.SaveButton.addClass("grey-btn");
        self.SaveButton.removeClass("green-border-btn");
        self.SaveButton.off("click");
        self.SaveButtonActive = false;
    }

    self.activateTeamSaveButton = function () {
        if (SaveButtonActive) return;
        self.SaveButtonActive = true;
        self.SaveButton.removeClass("btn-disabled");
        self.SaveButton.removeClass("grey-btn");
        self.SaveButton.addClass("green-border-btn");

        self.SaveButton.on("click", function () {
            self.deactivateTeamSaveButton();
            var pickedTeam = {
                widget_id: self.WidgetId,
                team_data: {
                    team_pick_author: TeamNameInput.val(),
                    goalkeeper: $.map($('[data-position=pick-your-team-goalkeeper] > li'), getPlayerId),
                    defenders: $.map($('[data-position=pick-your-team-defender] > li'), getPlayerId),
                    midfielders: $.map($('[data-position=pick-your-team-midfielder] > li'), getPlayerId),
                    forwards: $.map($('[data-position=pick-your-team-striker] > li'), getPlayerId),
                }
            };

            $.ajax({
                type: "post",
                datatype: "jsonp",
                data: JSON.stringify(pickedTeam),
                url: "/api/pickyourteam/postteam/",
                contentType: "application/json"
            }).done(function (data) {
                self.viewModel.loadByShareId(data.guid, function () {
                    $('.single-shared-team-container').show();
                    if (!self.isBound('your-own-team-list')) {
                        var element = document.getElementById('your-own-team-list');
                        ko.applyBindings(self.viewModel, element);
                    }

                    self.resetAllPlayers();

                    window.history.pushState({}, data.team_pick_author, location.protocol + '//' + location.hostname + location.pathname + '#pick-your-team-list-' + data.guid);
                    self.viewModel.scrolled = false;
                    self.viewModel.initialScrollToHashId();

                });
            });
        });
    };

    self.isBound = function (id) {
        return !!ko.dataFor(document.getElementById(id));
    };

    self.resetAllPlayers = function () {
        $('.pitch__starting-eleven .pick-your-team__player').each(function () {
            var currentPlayer = $(this);
            HideCheckbox(currentPlayer);
            currentPlayer.remove();
            self.PitchHelpText.attr('data-show', 'true');
            self.PitchHelpText.show();
            TeamNameInput.val("");
        });
    };

    self.getPlayerId = function (li) {
        return parseInt($(li).attr('data-pageId'));
    }

    self.tabSwitch = function () {
        $('.pick-your-team_radio').on('click', function () {
            Bonnier.Fotbollskanalen.ImageLazyLoadModule.LazyLoadWithinContainer('.pick-your-team__container', true, "show");
        });
    }

    self.playerAlreadyAdded = function (currentPlayer) {
        return currentPlayer.attr('data-starting') == 'true';
    }

    self.showPitchText = function () {
        if (self.PitchHelpText.attr('data-show') == 'true') {
            self.PitchHelpText.attr('data-show', 'false');
            self.PitchHelpText.hide();
        }
    }

    self.AddPlayer = function () {
        self.Player.on("click", function () {
            var currentPlayer = $(this);

            if (playerAlreadyAdded(currentPlayer)) return;

            var playerClone = currentPlayer.clone();
            var position = playerClone.attr('data-position');
            playerClone.attr('onClick', 'RemovePlayer($(this));');

            showPitchText();

            addPlayerAtPosition(playerClone, currentPlayer, position);
        });
    };

    self.validateInputReadyToSave = function () {
        if (TotalNumberOfPlayers() === 11 && TeamNameInput[0].value.length > 0 && !self.PickSquad) {
            activateTeamSaveButton();
        } else if (GoalkeeperCount() === self.MAX_SQUAD_GOALKEEPERS && TotalNumberOfPlayers() === self.MAX_SQUAD_PLAYERS && self.PickSquad) {
            activateTeamSaveButton();
        }
        else {
            deactivateTeamSaveButton();
        }
    }

    self.addPlayerAtPosition = function (playerClone, currentPlayer, position) {
        if (self.PickSquad) {
            self.addSquadPlayerAtPosition(playerClone, currentPlayer, position)
        } else {
            self.addTeamPlayerAtPosition(playerClone, currentPlayer, position)
        }

        validateInputReadyToSave();
    }

    self.addSquadPlayerAtPosition = function (playerClone, currentPlayer, position) {
        if (TotalNumberOfPlayers() == self.MAX_SQUAD_PLAYERS) {
            validateInputReadyToSave();
            return;
        }
        if (position == 'pick-your-team-goalkeeper' && GoalkeeperCount() < self.MAX_SQUAD_GOALKEEPERS) {
            AddGoalKeeper(playerClone);
            ShowCheckbox(currentPlayer);
        }
        else if (position == 'pick-your-team-defender' && DefenderCount() < self.MAX_SQUAD_PLAYERS - self.MAX_SQUAD_GOALKEEPERS) {
            AddDefender(playerClone);
            ShowCheckbox(currentPlayer);
        }
        else if (position == 'pick-your-team-midfielder' && MidfielderCount() < self.MAX_SQUAD_PLAYERS - self.MAX_SQUAD_GOALKEEPERS) {
            AddMidfielder(playerClone);
            ShowCheckbox(currentPlayer);
        }
        else if (position == 'pick-your-team-striker' && StrikerCount() < self.MAX_SQUAD_PLAYERS - self.MAX_SQUAD_GOALKEEPERS) {
            AddStriker(playerClone);
            ShowCheckbox(currentPlayer);
        }
    }

    self.addTeamPlayerAtPosition = function (playerClone, currentPlayer, position) {
        if (TotalNumberOfPlayers() == 11) {
            validateInputReadyToSave();
        } else if (position == 'pick-your-team-goalkeeper') {
            if (GoalkeeperCount() == 0) {
                AddGoalKeeper(playerClone);
                ShowCheckbox(currentPlayer);
            }
        } else if (NumberOfOutfieldPlayersInStartingEleven() < self.MAX_OUTFIELD_PLAYERS) {
            if (position == 'pick-your-team-defender' && DefenderCount() < 5) {
                AddDefender(playerClone);
                ShowCheckbox(currentPlayer);
            }
            if (position == 'pick-your-team-midfielder' && MidfielderCount() < 5) {
                AddMidfielder(playerClone);
                ShowCheckbox(currentPlayer);
            }
            if (position == 'pick-your-team-striker' && StrikerCount() < 5) {
                AddStriker(playerClone);
                ShowCheckbox(currentPlayer);
            }
        }
    }

    self.RemovePlayer = function (currentPlayer) {
        HideCheckbox(currentPlayer);
        currentPlayer.remove();
        self.deactivateTeamSaveButton();
    };

    self.ShowCheckbox = function (player) {
        var playerId = '[data-playerId=' + player.attr('data-playerId') + ']';
        var original = self.Bench.find(playerId);
        original.find('[data-js=icon-check]').addClass('icon-check personalization-item__checkbox');
        original.attr('data-starting', 'true');
    };

    self.HideCheckbox = function (player) {
        var playerId = '[data-playerId=' + player.attr('data-playerId') + ']';
        var original = self.Bench.find(playerId);
        original.find('.icon-check').removeClass('personalization-item__checkbox');
        original.attr('data-starting', 'false');
    };

    self.GoalkeeperCount = function () {
        return self.StartingGoalKeeper.children().length;
    };

    self.DefenderCount = function () {
        return self.StartingDefenders.children().length;
    };

    self.MidfielderCount = function () {
        return self.StartingMidfielders.children().length;
    };

    self.StrikerCount = function () {
        return self.StartingStrikers.children().length;
    };

    self.NumberOfOutfieldPlayersInStartingEleven = function () {
        return (DefenderCount() + MidfielderCount() + StrikerCount());
    };

    self.TotalNumberOfPlayers = function () {
        return (GoalkeeperCount() + NumberOfOutfieldPlayersInStartingEleven());
    };

    self.AddGoalKeeper = function (player) {
        player.appendTo(self.StartingGoalKeeper);
    };

    self.AddDefender = function (player) {
        player.appendTo(self.StartingDefenders);
    };

    self.AddMidfielder = function (player) {
        player.appendTo(self.StartingMidfielders);
    };

    self.AddStriker = function (player) {
        player.appendTo(self.StartingStrikers);
    };

    return {
        Init: init
    };

})();;
'use strict';

Bonnier.namespace("Bonnier.Fotbollskanalen.PushModule");

Bonnier.Fotbollskanalen.PushModule = (function() {

    var bindEvents = function() {
        $('[data-js="push-option"]').on('click', function () {
            var pushEvent = $(this).attr('data-push-event');
            var $this = $(this);
            
            if ($this.hasClass('pressed')) {
                Fotbollskanalen.CookieModule.removePushEvent(pushEvent);
                $this.removeClass('pressed');
            } else {
                Fotbollskanalen.CookieModule.addPushEvent(pushEvent);
                $this.addClass('pressed');
            }
            Bonnier.Fotbollskanalen.NativeBridgeModule.Vibrate();
        });
        
        $('[data-js="push-option-reversed"]').on('click', function () {
            var pushEvent = $(this).attr('data-push-event');
            var $this = $(this);

            if ($this.hasClass('pressed')) {
                Fotbollskanalen.CookieModule.addPushEvent(pushEvent);
                $this.removeClass('pressed');
            } else {
                Fotbollskanalen.CookieModule.removePushEvent(pushEvent);
                $this.addClass('pressed');
            }
            Bonnier.Fotbollskanalen.NativeBridgeModule.Vibrate();
        });
        
        $('[data-js="push-option-rolldown"]').on('click', function () {
            var $this = $(this);
            var pushEvent = $this.attr('data-push-event');
            var $rollDown = $('[data-js="push-rolldown"]');
            var height = $rollDown.children(':first').outerHeight(true);
            var rollDownArray = $rollDown.find('[data-js="push-option"]');
            
            if ($this.hasClass('pressed')) {
                $this.removeClass('pressed');
                Fotbollskanalen.CookieModule.removePushEvent(pushEvent);
                $rollDown.height(0);
                rollDownArray.removeClass('pressed');
                for (var i = 0; typeof(rollDownArray[i]) !== 'undefined'; i++) {
                    Fotbollskanalen.CookieModule.removePushEvent(rollDownArray[i].getAttribute('data-push-event'));
                } 
                
            } else {
                $this.addClass('pressed');
                $rollDown.height(height);
                rollDownArray.addClass('pressed');
                Fotbollskanalen.CookieModule.addPushEvent(pushEvent);
                for (var j = 0; typeof (rollDownArray[j]) !== 'undefined'; j++) {
                    Fotbollskanalen.CookieModule.addPushEvent(rollDownArray[j].getAttribute('data-push-event'));
                }
            }
            Bonnier.Fotbollskanalen.NativeBridgeModule.Vibrate();
        });
    };
    
    var setOptionsState = function () {
        var pushEvents = Fotbollskanalen.CookieModule.getPushEvents();

        pushEvents.forEach(function (event) {
            var dataPushEventAttr = $('[data-push-event="' + event + '"]').attr('data-js');
            var isReversed = dataPushEventAttr === 'push-option-reversed';
            var isRolldownTrue = dataPushEventAttr === 'push-option-rolldown';
            
            if (isReversed) {
                $('[data-push-event="' + event + '"]').removeClass('pressed');
            } else {
                $('[data-push-event="' + event + '"]').addClass('pressed');
                if (isRolldownTrue) $('[data-js="push-rolldown"]').css({ 'height': 'auto' });
            }
        });
    };

    var updateNativeState = function (nativeState) {
        var infoContainer = $('#native-push-state-info');
        if (nativeState === "on") {
            infoContainer.hide();
        } else {
            infoContainer.show();
        }
        if (nativeState === "off_ios7") {
            $('#native-push-state-info-msg').html('Du har slagit av Fotbollskanalen-notiser i dina telefon-inställningar.<br/>Slå på det i Inställningar > Notiser');
        } else if (nativeState === "off_ios8+") {
            $('#native-push-state-info-msg').html('Du har slagit av Fotbollskanalen-notiser i dina telefon-inställningar.');
            $('#native-push-goto-button').css('display', 'inline-block');
        } else if (nativeState === "off_android") {
            $('#native-push-state-info-msg').html('Du har slagit av Fotbollskanalen-notiser i dina telefon-inställningar.');
            $('#native-push-goto-button').css('display', 'inline-block');
        } else if (nativeState === "error_android") {
            $('#native-push-state-info-msg').html('Det går inte att ta emot Fotbollskanalen-notiser i din mobil');
        }

    };

    var hideTogglesForNotLoggedInUsers = function () {
        if (!Fotbollskanalen.AccountModule.isLoggedIn()) {
            $('.push-group__item').hide();
            $('[data-js="push-breaking-news"]').show();
            $('[data-js="push-news"]').show();
            $('.push-group__item-disabled').css('display', 'table');
        }
    };

    var init = function () {
        Bonnier.Fotbollskanalen.NativeBridgeModule.RequestPushNotificationState();
        $('[data-js="push-module"]').show();
        hideTogglesForNotLoggedInUsers();
        bindEvents();
        setOptionsState();
    };

    return {        
        Init: init,
        UpdateNativeState: updateNativeState
    };
})();

(window.$fk || $)(function () {
    if ($t.exists('[data-js="push-module"]') && Bonnier.Fotbollskanalen.NativeBridgeModule.CanIUse('push-events')) {
        Bonnier.Fotbollskanalen.PushModule.Init();
    }
});;
Bonnier.namespace("Bonnier.Fotbollskanalen.PushNextArticleModule");

Bonnier.Fotbollskanalen.PushNextArticleModule = (function () {
    var bottomWidgetLoading = false;
    var nextLoading = false;
    var loadNextEnabled = true;
    var nextContentList = null;
    var currentArticleIndex = -1;
    var fetchPageIndex = 1;
    var maxFetchPageCount = 10;
    var maxNextContentList = 5;
    var baseArticleId;
    var nextArticleClicked = false;
    var lastScrollTop = 0;
    var trackedUrls = [];

    var createRepariedContentList = function (list) {
        if (list === undefined || list === null) return [];
        var result = [];
        list.forEach(function (nextContent) {
            if (nextContent.url && nextContent.url.length > 0) {
                result.push(nextContent);
            }
        });
        return result;
    };

    var createNonVisitedContentList = function (list) {
        if (list === undefined || list === null) return [];
        var result = [];
        var visitedArticleIds = Fotbollskanalen.ArticleHistoryModule.getAllIds();
        list.forEach(function (nextContent) {
            if (visitedArticleIds.indexOf(nextContent.page_id.toString()) === -1) {
                result.push(nextContent);
            }
        });
        return result;
    };

    var hasNextContentList = function () {
        return !(nextContentList === undefined || nextContentList === null);
    };

    var addPushNextArticleClick = function (articleId) {
        $('#article-next-' + articleId).on('click', function (e) {
            e.preventDefault();
            var currentArticleIndex = findCurrentArticleIndex($(window).height(), $(window).scrollTop());
            var nextContent = findNextContent(currentArticleIndex);
            if (nextContent === null) {
                return;
            }

            nextArticleClicked = true;

            var padding = 0;
            if (!$t.isNative) {
                padding = 70;
            }

            $('html, body').animate({
                scrollTop: $('#article_' + nextContent.page_id).offset().top - padding
            }, 800, 'swing', null);
        });
    };

    var addPushNextArticleSlideInScroll = function () {

        $(document).on('scroll', function () {

            var st = window.pageYOffset || document.documentElement.scrollTop;
            var downScroll = false;
            if (st > lastScrollTop) {
                downScroll = true;
            }

            lastScrollTop = st <= 0 ? 0 : st; // For Mobile or negative scrolling

            var foundArticleIndex = findCurrentArticleIndex($(window).height(), $(window).scrollTop());
            var currentArticleId = articleIdList[foundArticleIndex];
            var currentArticle = $('#article_' + articleIdList[foundArticleIndex]);

            if (foundArticleIndex !== currentArticleIndex) {
                if (currentArticleIndex !== -1) {
                    $('.article-next-slidein').css('height', '0');

                    $('.article-next-slidein__progress').each(function (index, element) {
                        var item = $(element);
                        item.css('opacity', '0');
                    });

                    updateHistory(currentArticle.data('title'), currentArticle.data('url'));
                    if ($t.isNative) {
                        Bonnier.Fotbollskanalen.NativeBridgeModule.EnableSharing(currentArticle.data('title'), currentArticle.data('shareurl'));
                    }

                    if ($t.isIos) {
                        var commentInfo = {
                            articleId: "article" + currentArticle.data('pagelinkid'),
                            customerId: "310889100",
                            alias: "true",
                            cssUrl: currentArticle.data('styleurl'),
                            articleUrl: currentArticle.data('shareurl'),
                            articleTitle: currentArticle.data('title'),
                            articleDescription: currentArticle.data('description'),
                            articleImage: currentArticle.data('image'), 
                            articleTags: currentArticle.data('articletags'),
                            articlePublishedTime: currentArticle.data('publishedtime')
                        }
                       Bonnier.Fotbollskanalen.NativeBridgeModule.SetCommentInfo(commentInfo);
                    }



                    Fotbollskanalen.ArticleHistoryModule.save(currentArticleId, currentArticleId, 7);
                    Fotbollskanalen.ArticleHistoryModule.removeOldHistory();

                    var url = currentArticle.data('url');
                    var pageName = currentArticle.data('pagename');
                    var pageType = currentArticle.data('pagetype');
                    var imageUrl = currentArticle.find('div[itemprop="image"]').find('meta[itemprop="url"]').attr('content');
                    Bonnier.Fotbollskanalen.TrackingModule.TrackPageviewLogginService(url, pageName, pageType, imageUrl);
                    if (!trackedUrls.includes(url)) {
                        if (nextArticleClicked) {
                            Bonnier.Fotbollskanalen.TrackingModule.TrackPushNextArticlePageViewByClick(url, pageName, pageType);
                        } else {
                            Bonnier.Fotbollskanalen.TrackingModule.TrackPushNextArticlePageView(url, pageName, pageType);
                        }
                        trackedUrls.push(url);
                    } else {
                        console.info('PNA Tracking duplicate was removed');
                    }
                }
                currentArticleIndex = foundArticleIndex;
                nextArticleClicked = false;
            }

            var windowScrollTop = $(window).scrollTop();
            var percentage = 0;

            if (currentArticleIndex > 0) {
                windowScrollTop += $(window).height() / 2;
                percentage = (windowScrollTop - currentArticle.offset().top) / (currentArticle.height()) * 100;
            } else {
                percentage = (windowScrollTop - currentArticle.offset().top) / (currentArticle.height() - $(window).height() / 2) * 100;
            }

            var nextContent = findNextContent(foundArticleIndex);
            if (nextContent === null) {

                if (loadNextEnabled && !nextLoading && percentage > 50) {
                    loadNextArticles();
                }
            }

            var articleSlidein = $('#article-next-' + currentArticleId + '.article-next-slidein');
            var progressBar = $('#article-next-' + currentArticleId + ' .article-next-slidein__progress');
            var title = $('#article-next-' + currentArticleId + ' .article-next-slidein__title');
            var thumbnail = $('#article-next-' + currentArticleId + ' .article-next-slidein__thumbnail img');
            var nativeAdArticle = currentArticle.parent().siblings('[data-adk-container="native-scroll"]');

            if (nextContent) {
                title.text(nextContent.title);
                thumbnail.attr('src', nextContent.image_url);
            }
            progressBar.css('width', '' + percentage + '%');

            if (nativeAdArticle.length > 0 && nativeAdArticle.offsetHeight > 0) {
                articleSlidein.css('height', '0');
            }
            else if (downScroll) {
                if (percentage <= 0) {
                    articleSlidein.css('height', '0');
                    progressBar.css('opacity', '0');
                } else if (percentage < 65) {
                    articleSlidein.css('height', '0');
                    progressBar.css('opacity', '1');
                } else if (percentage <= 100 && nextContent) {
                    articleSlidein.css('height', '80px');
                    thumbnail.removeClass('lazy');
                    progressBar.css('opacity', '1');
                } else if (percentage > 105) {
                    articleSlidein.css('height', '0');
                    progressBar.css('opacity', '0');
                }
            } else {
                if (percentage < 30) {
                    articleSlidein.css('height', '0');
                } else {
                    articleSlidein.css('height', '0');
                    progressBar.css('opacity', '1');
                }
            }

            if (percentage > 65 && nextContent) {
                if (!bottomWidgetLoading && !isArticlePageLoaded(nextContent.page_id)) {
                    bottomWidgetLoading = true;
                    if (nextContent.url && nextContent.url.length > 0) {
                        loadBottomWidgets(currentArticleId, nextContent.url + '?control=MainContent');
                    }
                }
            }

        });
    };

    var updateHistory = function (title, url) {
        document.title = title;
        window.history.replaceState({}, title, url);
    };

    var isArticlePageLoaded = function (articleId) {
        return articleIdList.indexOf(articleId.toString()) !== -1;
    };

    var findNextContent = function (index) {
        if (!hasNextContentList() || index >= nextContentList.length) {
            return null;
        }

        return nextContentList[index];
    };

    var findCurrentArticleIndex = function (windowHeight, scrollTop) {
        var i = 0;
        while (i + 1 < articleIdList.length) {
            var articleId = articleIdList[i + 1];
            var article = $('#article_' + articleId);
            if (scrollTop > article.offset().top - windowHeight / 2) {
                i++;
            } else {
                break;
            }
        }
        return i;
    };

    var setBaseArticleId = function (articleId) {
        baseArticleId = articleId;
    };

    var loadNextArticles = function () {

        if (baseArticleId === null) {
            console.log('baseArticleId is not set!');
            return;
        }

        if (fetchPageIndex > maxFetchPageCount) {
            console.log('Max number of pages fetched!');
            return;
        }

        if (nextContentList !== null && nextContentList !== undefined && nextContentList.length >= maxNextContentList) {
            console.log('Max number of pages loaded: ' + nextContentList.length);
            return;
        }

        nextLoading = true;
        $.ajax({
            url: '/api/relatedarticles/' + baseArticleId + '/page/' + fetchPageIndex,
            type: 'get',
            contentType: 'application/json'
        }).done(function (response) {

            if (!(response === undefined || response === null) && response.length > 0) {
                fetchPageIndex++;
            } else {
                loadNextEnabled = false;
                console.log('No more related articles to to fetch!');
            }
            nextLoading = false;

            var newList = createRepariedContentList(response);

            var nonVisitedList = createNonVisitedContentList(newList);
            if (hasNextContentList()) {
                nextContentList = nextContentList.concat(nonVisitedList);
            } else {
                nextContentList = nonVisitedList;
            }

            if (nextContentList.length >= maxNextContentList) {
                nextContentList.length = maxNextContentList;
            }

        });
    };

    var loadBottomWidgets = function (articleId, url) {
        var spinner = $('#article-' + articleId + '-bottom-widgets-content .spinner');
        spinner.show();

        $.ajax({
            url: url,
            type: 'GET',
            success: function (data) {
                var id = '#article-' + articleId + '-bottom-widgets-content';
                $(id).empty().append(data);
                Bonnier.Fotbollskanalen.ImageLazyLoadModule.InitLazyLoad();
                Bonnier.Fotbollskanalen.ImageSwitchModule.Init();
                Fotbollskanalen.PublishTimeModule.ApplyRelativeTimeNow(document);
                bottomWidgetLoading = false;
            }
        });
    };

    var getNextContentList = function () {
        return nextContentList;
    };

    return {
        AddPushNextArticleClick: addPushNextArticleClick,
        AddPushNextArticleSlideInScroll: addPushNextArticleSlideInScroll,
        LoadNextArticles: loadNextArticles,
        HasNextContentList: hasNextContentList,
        SetBaseArticleId: setBaseArticleId,
        GetNextContentList: getNextContentList
    };

})();

;
'use strict';

Bonnier.namespace("Bonnier.Fotbollskanalen.RegularClickModule");

Bonnier.Fotbollskanalen.RegularClickModule = (function () {

    var openPersonalizationEdit = function () {
        $('[data-js="openPersonalizationEdit"]').on('click', function (e) {
            e.preventDefault();
            Bonnier.Fotbollskanalen.PersonalizationEditModule.show();
        });
    };

    var showHiddenSiblings = function () {
        $('[data-js="showHiddenSiblings"]').on('click', function () {
            var el = $(this);
            var showmore = el.attr('data-showmore');
            var showless = el.attr('data-showless');
            var $hiddenHolder = el.siblings("[data-js='hiddenSibling']");
            if ($t.exists($hiddenHolder.find('.show'))) {
                $hiddenHolder.find('.show').removeClass('show').hide();
                el.text(showmore);
            } else {
                $hiddenHolder.find(':hidden').addClass('show').fadeIn();
                el.html(showless);
            }
        });
    };

    var toggleGlobalSearch = function () {
        var isOpen = false;
        $('[data-js="toggleGlobalSearch"]').on('click', function () {
            if (isOpen) {
                Bonnier.Fotbollskanalen.GlobalSearchModule.KillSearch();
                isOpen = false;
            } else {
                Bonnier.Fotbollskanalen.GlobalSearchModule.OpenSearch();
                isOpen = true;
            }
        });
    };

    var showFilterList = function () {
        $('[data-js="showFilterList"]').on('click', function () {
            var $this = $(this);
            var target = $this.attr('toggle-target');
            $('[data-js="' + target + '"]').toggleClass('filter-list-open');
            if (parseFloat(getAndroidVersion()) < 4.2) {
                var height = $('body').height();
                $('[data-js="' + target + '"]').css('height', height + 'px');
                $('body').scrollTop(0);
            }
        });

        if (Bonnier.Fotbollskanalen.DeviceTypeModule.IsDesktop()) {
            $('.filter-list').on('click', function (evt) {
                $(this).removeClass('filter-list-open');
                evt.stopPropagation();
            });
        } else {
            $('[ data-js="toggleFilterList"]').on('click', function (evt) {
                $(this).parent().parent().removeClass('filter-list-open');
                evt.stopPropagation();
            });
        }
    };

    return {
        ShowHiddenSiblings: showHiddenSiblings,
        ToggleGlobalSearch: toggleGlobalSearch,
        ShowFilterList: showFilterList,
        OpenPersonalizationEdit: openPersonalizationEdit,
    };
})();

(window.$fk || $)(function () {
    if ($t.exists('[data-js="showHiddenSiblings"]')) {
        Bonnier.Fotbollskanalen.RegularClickModule.ShowHiddenSiblings();
    }
    if ($t.exists('[data-js="toggleGlobalSearch"]')) {
        Bonnier.Fotbollskanalen.RegularClickModule.ToggleGlobalSearch();
    }
    if ($t.exists('[data-js="showFilterList"]')) {
        Bonnier.Fotbollskanalen.RegularClickModule.ShowFilterList();
    }
    if ($t.exists('[data-js="openPersonalizationEdit"]')) {
        Bonnier.Fotbollskanalen.RegularClickModule.OpenPersonalizationEdit();
    }
});;
Bonnier.namespace("Bonnier.Fotbollskanalen.ResultItemModule");

Bonnier.Fotbollskanalen.ResultItemModule = (function () {

    var updateItem = function (updatedMatch, $currentMatch) {
        $currentMatch.removeClass('animate-item');
        var $matchScoreHome = $currentMatch.find('[data-js="match-score-home"]');
        var $matchScoreAway = $currentMatch.find('[data-js="match-score-away"]');

        if (updatedMatch.is_live) {
            if (parseInt($matchScoreHome.html(), 10) !== updatedMatch.home_team_score || parseInt($matchScoreAway.html(), 10) !== updatedMatch.away_team_score) {
                $currentMatch.addClass('animate-item');
            }
            
            $currentMatch.find('[data-js="match-live"]').removeClass('group-item--hidden');
            $currentMatch.find('[data-js="match-time"]').addClass('group-item--hidden');
            $currentMatch.find('[data-js="match-score-status"]').addClass('group-item__score--live');
            $matchScoreHome.html(updatedMatch.home_team_score);
            $matchScoreAway.html(updatedMatch.away_team_score);
            
            switch (updatedMatch.status.toLowerCase()) {
                case "ht":
                    $currentMatch.find('[data-js="match-live-timer"]').html("HT");
                    break;
                case "pen":
                    $currentMatch.find('[data-js="match-live-timer"]').html(updatedMatch.status);
                    $currentMatch.find('[data-js="match-penalties"]').removeClass('group-item--hidden');
                    $currentMatch.find('[data-js="match-penalties-home"]').html(updatedMatch.home_team_penalties);
                    $currentMatch.find('[data-js="match-penalties-away"]').html(updatedMatch.away_team_penalties);
                    break;
                default:
                    $currentMatch.find('[data-js="match-live-timer"]').html(updatedMatch.timer + "<span class='timer-dot'>'</span>");
            }

        } else if (updatedMatch.is_finished) {
            
            $currentMatch.find('[data-js="match-live"]').addClass('group-item--hidden');
            $currentMatch.find('[data-js="match-score-status"]').removeClass('group-item__score--live');
            $matchScoreHome.html(updatedMatch.home_team_score);
            $matchScoreAway.html(updatedMatch.away_team_score);
            
            if (updatedMatch.status.toLowerCase() == "11m") {
                $currentMatch.find('[data-js="match-penalties"]').removeClass('group-item--hidden');
                $currentMatch.find('[data-js="match-penalties-home"]').html(updatedMatch.home_team_penalties);
                $currentMatch.find('[data-js="match-penalties-away"]').html(updatedMatch.away_team_penalties);
            }

        }
    };

    var getUpdatedResults = function () {
        $.getJSON(useWww("/api/liveresults/leagues/"), function (data) {
            data.forEach(function (match) {
                var $match = $("#match_" + match.match_id);
                var matchStatus = $match.attr('data-status');
                
                if (match.is_live || (matchStatus === "is_live" && match.is_finished)) {
                    updateItem(match, $match);
                }

            });
        });
    };

    var init = function () {
        getUpdatedResults();
        setInterval(getUpdatedResults, 60000);
    };

    return {
        Init: init
    };

})();

(window.$fk || $)(function () {
    if ($t.exists('[data-js="real-time-results"]')) {
        Bonnier.Fotbollskanalen.ResultItemModule.Init();
    } 
});;
Bonnier.namespace("Bonnier.Fotbollskanalen.SearchModule");

Bonnier.Fotbollskanalen.SearchModule = (function () {
	var searchActive = false;
	var self = this;
	var $body = $(document.body);
	var $clearInput = $('[data-clear-input]');
	var $closeSearch = $('[data-close-search]');
	var $globalSearch = $('[data-global-search]');
	var $mobilemenuTrigger = $('[data-hamburger]');
	var $header = $('[data-header]');
	var $headerSearch = $('[data-header-search]');
	var $searchInput = $('[data-search-input]');
	var $searchTrigger = $('[data-search-trigger]');
	var $mobileMenu = $('[data-mobile-menu]');

    this.toggleSearch = function (event) {
		$header.toggleClass('header__search--open');
		$globalSearch.toggle();
		$searchInput.focus();
		$searchTrigger.toggle();

        if (searchActive) {
            searchActive = false;
            Bonnier.Fotbollskanalen.GlobalSearchModule.KillSearch();
        }
		else {
            searchActive = true;
            Bonnier.Fotbollskanalen.GlobalSearchModule.OpenSearch();
            positionGlobalSearch();
            event.stopPropagation();
            event.preventDefault();
        }
    }

    this.positionGlobalSearch = function () {
        if ($(window).width() > 1024) {
            var left = $headerSearch.offset().left -10; //difference of length between the searchbutton and
			$globalSearch.css({ 'left': left + 'px' });
        }
    };
    
    $(window).resize(function () {
		if ($(window).width() > 1024 && Bonnier.Fotbollskanalen.GlobalSearchModule !== undefined && searchActive) {
            searchActive = false;
            $globalSearch.toggle();
            $header.removeClass('header__search--open');
            $searchTrigger.toggle();
			Bonnier.Fotbollskanalen.GlobalSearchModule.KillSearch && Bonnier.Fotbollskanalen.GlobalSearchModule.KillSearch();
        }
	});

    //The KeyDown event is triggered when the user presses a Key.
    this.searchInputKeydownHandler = function (event) {
        if (event.keyCode === 27/*ESC*/) {
            toggleSearch(event);
        }        
    }

    //The KeyUp event is triggered when the user releases a Key.
    this.searchInputKeyupHandler = function() {
		Bonnier.Fotbollskanalen.GlobalSearchModule.Search($(this).val());
    }

    var init = function () {

        $body.not($header).on('click', function (event) {
            if (searchActive) {
                searchActive = false;
                $globalSearch.toggle();
                $header.toggleClass('header__search--open');
                Bonnier.Fotbollskanalen.GlobalSearchModule.KillSearch();
                $searchTrigger.toggle();
                event.stopPropagation();
            }
        });

        $searchInput.click(function (event) {
            event = $.event.fix(event);
            event.stopPropagation();
		});

		$clearInput.on('click', function (event) {
			event.stopPropagation();
			$clearInput.val = "";
			$clearInput.removeClass('search__input-clear-wrapper--open');
			$searchInput.focus();
		});

        $globalSearch.click(function (event) {
            event = $.event.fix(event);
            event.stopPropagation();
        });

        if (!$t.isNative) {
            $('html').click(function () {
                if (searchActive) {
                    searchActive = false;
                    Bonnier.Fotbollskanalen.GlobalSearchModule.KillSearch && Bonnier.Fotbollskanalen.GlobalSearchModule.KillSearch();
                    toggleSearch(event);
                }
            });
        }

        $searchTrigger.on('click', function (event) {
            toggleSearch(event);
        });

        $searchInput.on({
            keydown: searchInputKeydownHandler,
            keyup: searchInputKeyupHandler,
        });

    };

    return {
        Init: init
    };

})();

(window.$fk || $)(function () {
    if (!($t.isAndroid || $t.isIos)) {
        Bonnier.Fotbollskanalen.SearchModule.Init();
    }
});;
Bonnier.namespace("Bonnier.Fotbollskanalen.SocialShareModule");

Bonnier.Fotbollskanalen.SocialShareModule = (function (jQuery, window) {

    var init = function() {
        bindEvents();
    };

    var bindEvents = function () {
        $('[data-js="share-btn"]').on("touchend click", function (event) { share(event); });
        $('[data-js="feed-on-facebook"]').on('click', function (event) { feedOnFacebook(event); });
        $('[data-js="share-on-twitter"]').on('click', function (event) { shareOnTwitter(event); });
    };

    var share = function (event) {
        event.preventDefault();
        var baseShareUrl = $(event.currentTarget).data('share-url');
        var customShareUrl = $(event.currentTarget).data('custom-share-url');
        var documentUrl = $(event.currentTarget).data('url');
        var shareUrl = customShareUrl || documentUrl;
        var url = baseShareUrl + encodeURIComponent(shareUrl);
        Bonnier.Fotbollskanalen.TrackingModule.TrackGenericEvent('article', 'share', document.title, url);
        var popup = popupWindow(url, 500, 500);
        var closeCheck = setInterval(function () {
            try {
                (popup == null || popup.closed) && (clearInterval(closeCheck));
            } catch (ex) {
            }
        }, 500);
        popup.focus();
    };

    var shareOnTwitter = function (event) {
        event.preventDefault();
        var baseShareUrl = $(event.currentTarget).data('share-url');
        var shareDescription = $(event.currentTarget).data('share-description');
        var documentUrl = $(event.currentTarget).data('url');

        var url = baseShareUrl + encodeURIComponent(shareDescription) + "&url=" + encodeURIComponent(documentUrl);
        var popup = popupWindow(url, 500, 500);
        var closeCheck = setInterval(function () {
            try {
                (popup == null || popup.closed) && (clearInterval(closeCheck));
            } catch (ex) {
            }
        }, 500);
        popup.focus();
    };

    var popupWindow = function(url, w, h) {
        return window.open(url, "_blank", 'width=' + w + ', height=' + h);
    };

    var getSharingUrl = function (elem) {
        var relUrl = $(elem).closest('.article-hybrid-widgets').siblings('.article').find('.article__main-container').data('url') || location.pathname;
        return 'https://www.fotbollskanalen.se' + relUrl;
    };

    return {
        Init: init,
        Share: share,
        ShareOnTwitter: shareOnTwitter,
        GetSharingUrl: getSharingUrl
    };

    

})(jQuery, window);


(window.$fk || $)(function () {
    if ($t.exists('[data-js="share-btn"]') || $t.exists('[data-js="feed-on-facebook"]') || $t.exists('[data-js="share-on-facebook"]') || $t.exists('[data-js="share-on-twitter"]')) {
        Bonnier.Fotbollskanalen.SocialShareModule.Init();
    }
});;
Bonnier.namespace("Bonnier.Fotbollskanalen.StickyAdModule");

Bonnier.Fotbollskanalen.StickyAdModule = (function () {

    var init = function () {
        setupStickyReloadActions();
    };

    var setupStickyReloadActions = function () {
        var interval_id;
        const reloadInterval = 15000;

        $(window).focus(function () {
            setupStickyIntervalReload();
        });

        $(window).blur(function () {
            clearStickyIntervalTimer();
        });

        $(window).scroll(function () {
            setupStickyIntervalReload();
        });

        $(window).mousemove(function () {
            setupStickyIntervalReload();
        });

        var setupStickyIntervalReload = function () {
            if (!interval_id) {
                interval_id = setTimeout(function () {
                    reloadStickyDesktopAd();
                    clearStickyIntervalTimer();
                }, reloadInterval);
            }
        };

        var clearStickyIntervalTimer = function () {
            clearInterval(interval_id);
            interval_id = 0;
        };
    };

    var reloadStickyDesktopAd = function () {
        $t.dispatchCustomEvent('reloadStickyDesktopAd');
    };

    return {
        Init: init
    };
});;
Bonnier.namespace("Bonnier.Fotbollskanalen.StickyTopAdModule");

Bonnier.Fotbollskanalen.StickyTopAdModule = (function () {

    //var stickyNav = function (cruId, section) {
    //    var scrollTop = $(window).scrollTop();
    //    if (scrollTop > 0 && scrollTop < 700) {
    //        showSticky(cruId, section);
    //    } else {
    //        hideSticky(cruId, section);
    //        if (screenTop > 700) {
    //            $(window).off("scroll", stickyNav(cruId, section));
    //        }
    //    }
    //};

    //var showSticky = function(cruId, section) {
    //    var stickyTopAd = $('#sticky-ad-' + cruId + '-' + section);
    //    var spaceFillTopAd = $('#ad-container-spacefiller-' + cruId + '-' + section);

    //    stickyTopAd.addClass('top-sticky');
    //    spaceFillTopAd.show();

    //    var scrollTop = $(window).scrollTop();
    //    var marginTop = - (scrollTop / 3);
    //    stickyTopAd.css('margin-top', marginTop);
    //    spaceFillTopAd.css('margin-top', marginTop);

    //    spaceFillTopAd.css('height', Math.floor(stickyTopAd.height()));
    //    spaceFillTopAd.css('width', Math.floor(stickyTopAd.width()));
    //}

    //var hideSticky = function (cruId, section) {
    //    $('#sticky-ad-' + cruId + '-' + section).removeClass('top-sticky');
    //    $('#ad-container-spacefiller-' + cruId + '-' + section).hide();
    //}

    var init = function (cruId, section) {
        //$(window).scroll(function () { 
        //    stickyNav(cruId, section);
        //});
    };
    
    return {
        Init: init
    };
});;
Bonnier.namespace("Bonnier.Fotbollskanalen.SubNavigationModule");

Bonnier.Fotbollskanalen.SubNavigationModule = (function () {
    var $subnavtab = $('[data-subnav-tab]');
    var $subnavLink = $('[data-subnav-link]');
    var $subnavContainer = $('[data-subnav-container]');

    var displayTab = function (tab, shouldScrollTop) {
        if (!tab) {
            return;
        }
        var section = tab.attr('data-section');
        $('.subnav__link.selected').removeClass('selected');
        tab.addClass('selected');
        $subnavContainer.children('section:not(' + section + ')').hide();
        $('#' + section).show();
        if (shouldScrollTop) {
           // $(window).scrollTop(0);
        } 

        Bonnier.Fotbollskanalen.ImageLazyLoadModule.InitLazyLoadTab(section);
        Bonnier.Fotbollskanalen.ImageSwitchModule.Init();
        Bonnier.Fotbollskanalen.AdIframeModule.RenderHiddenAd(section);
    };

    var init = function (event) {
        if ($t.exists($subnavtab) && $t.exists($subnavContainer)) {
            $subnavLink.data('top', 0).on('click', function (e) {
                e.preventDefault();
                var $this = $(this),
                    $previous = $this.parent().find('.selected').data('top', top);

                var backForwardLoad = event.persisted;
                Bonnier.Fotbollskanalen.DesktopAdPageViewIdModule.Init();
                displayTab($this, !backForwardLoad); //Scroll to top only on pageload not on back/forward load.

                var title = $this.text().trim();
                var section = $(this).attr('data-section');

                if ($this.attr('href') !== $previous.attr('href')) {
                    var filter = getParameterByName("filter");
                    filter = filter ? "&filter=" + filter : "";
                    window.history.pushState({}, title, window.location.pathname + '?tab=' + section + filter);
                    Bonnier.Fotbollskanalen.TrackingModule.TrackIntraPageTabClick(window.location.pathname, section);
                }
            });

            window.addEventListener('popstate', function (e) {
                var $tab;
                var param = getParameterByName('tab');
                if (!param) {
                    $tab = $subnavLink.first();
                } else {
                    $tab = $('[href="?tab=' + param + '"]');
                }
                displayTab($tab, false);
            });
        }
    };

    return {
        Init: init
    };

})();

if (!$t.isAndroid) {
    window.addEventListener('pageshow', function(event) {
        Bonnier.Fotbollskanalen.SubNavigationModule.Init(event);
    });
} else {
    window.addEventListener('load', function (event) {
        Bonnier.Fotbollskanalen.SubNavigationModule.Init(event);
    });
}
;
var SvSMatchViewModel = function (matchId, pageType, adDevice, userRandomKey) {
    var self = this;
    self.Description = ko.observable("");
    self.Outcomes = ko.observableArray();
    self.DateString = ko.observable("");
    self.TimeString = ko.observable("");
    self.NoOutcomeUrl = ko.observable("");
    self.Events = ko.observableArray();
    self.PageType = ko.observable("");
    self.UserRandomKey = ko.observable("");
    self.SvsBannerTheme = ko.observable("");
    self.MatchId = ko.observable(matchId);
    self.MatchStartDate = ko.observable("");
    self.ImpressionImageUrl = null;

    self.betClickHandler = function (data, event) {
        event.preventDefault();
        window.open(data.outcome_url());
    }

    self.load = function () {

        var svsBannerTheme = Fotbollskanalen.CookieModule.getCookie('svs-banner-theme');
        if (svsBannerTheme === '') {
            svsBannerTheme = 'A';
            if (Math.floor(Math.random() * 2) === 0) {
                svsBannerTheme = 'B';
            }
            Fotbollskanalen.CookieModule.setCookie('svs-banner-theme', svsBannerTheme, 21);
        }
        self.SvsBannerTheme(svsBannerTheme);

        var apiUrl = "/api/getdraw/pagetype/{0}/matchid/{1}/bannertheme/{2}".format(pageType, matchId, svsBannerTheme);

        if (!$t.isNative) {
            apiUrl += "?returnurl=" + encodeURIComponent(window.location.href);
        }
        $.getJSON(apiUrl, function (data) {
            if (data === null || typeof data === 'undefined') {
                return;
            };

            $('#svs-match_' + adDevice + '_' + matchId).show();

            if (data.live) {
                self.DateString("");
                self.TimeString("LIVE");
                self.MatchStartDate("LIVE");
                setTimeout(function () {
                    self.load();
                }, 60000);

            } else {
                self.DateString(data.close_time_day);
                self.MatchStartDate(data.match_start);
                self.TimeString(data.close_time_hour);
                var closeTime = new Date(data.close_time).getTime();

                var isLiveInterval = setInterval(function () {
                    var now = Date.now();

                    if (now > closeTime) {
                        clearInterval(isLiveInterval);
                        self.load();
                    }
                }, 5000);
            }

            self.Description(data.description);
            self.NoOutcomeUrl(data.no_outcome_url);
            self.PageType(pageType);
            self.UserRandomKey(userRandomKey);

            ko.mapping.fromJS(data.event.outcomes, {}, self.Outcomes);
        });
    };

    self.load();
};;
Bonnier.namespace("Bonnier.Fotbollskanalen.TableSorterModule");

Bonnier.Fotbollskanalen.TableSorterModule = (function () {

    var arbiterColumnName = 'data-sort-arbiter';
    var downwardsPolygonPoints = '0,0 5,10 10,0 5,3';
    var upwardsPolygonPoints = '0,10 5,0 10,10 5,7';
    var spanner = document.createElement('span');
    var svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
    svg.setAttribute("width", "10");
    svg.setAttribute("height", "10");
    svg.style.marginLeft = "5px";
    var triangle = document.createElementNS('http://www.w3.org/2000/svg', 'polygon');
    svg.appendChild(triangle);
    spanner.appendChild(svg);
    var lastSortAttribute = "";

    function sorterByAttribute(attr) {
        attr = attr ? 'data-sort-' + attr : arbiterColumnName;
        var reverse;
        if (lastSortAttribute === attr) {
            reverse = true;
            lastSortAttribute = "";
            triangle.setAttribute("points", upwardsPolygonPoints);
        } else {
            reverse = false;
            lastSortAttribute = attr;
            triangle.setAttribute("points", downwardsPolygonPoints);
        }
        return function (a, b) {
            var valA = a.getAttribute(attr),
                valB = b.getAttribute(attr),
                numericComparison = false,
                _reverse = reverse;
            if (valA === valB) {
                if (attr === arbiterColumnName) return 0;
                valA = a.getAttribute(arbiterColumnName);
                valB = b.getAttribute(arbiterColumnName);
                _reverse = false;
            }
            if (!isNaN(valA) && !isNaN(valB)) {
                valA = Number(valA);
                valB = Number(valB);
                numericComparison = true;
            }
            if (numericComparison) {
                return _reverse ? (valA > valB ? 1 : -1) : (valA > valB ? -1 : 1); // Numeric sort (High ot Low)
            }
            return _reverse ? (valA < valB ? 1 : -1) : (valA < valB ? -1 : 1); // Alphabetic sort (A - Z)
        };
    }

    function performSort() {
        $(spanner).appendTo($(this));
        var sortAction = $(this).attr('data-sort-action').split('|');
        var container = $('[data-sortable-list-id="' + sortAction[0] + '"]');
        container.find('tr').sort(sorterByAttribute(sortAction[1])).appendTo(container);
    };

    var listen = function () {
        $('[data-js="sort-header"]').on('click', performSort);
        var defaultSortHeader = $('[data-sort-default="true"]');
        if (defaultSortHeader.length > 0) performSort.apply(defaultSortHeader[0]);
    };

    return {
        Listen: listen
    };
})();

(window.$fk || $)(function () {
    Bonnier.Fotbollskanalen.TableSorterModule.Listen();
});;
Bonnier.namespace("Bonnier.Fotbollskanalen.TrackingModule");

Bonnier.Fotbollskanalen.TrackingModule = (function () {

    var trackFollowTeam = function (teamId, teamName) {
        dataLayer.push({
            'event': 'follow-team',
            'teamId': teamId,
            'teamName': teamName
        });
    };

    var trackFollowPlayer = function (playerId, playerName) {
        dataLayer.push({
            'event': 'follow-player',
            'playerId': playerId,
            'playerName': playerName
        });
    };

    var trackFollowLeague = function (leagueId, leagueName) {
        dataLayer.push({
            'event': 'follow-league',
            'leagueId': leagueId,
            'leagueName': leagueName
        });
    };

    var trackUnfollowTeam = function (teamId, teamName) {
        dataLayer.push({
            'event': 'unfollow-team',
            'teamId': teamId,
            'teamName': teamName
        });
    };

    var trackUnfollowPlayer = function (playerId, playerName) {
        dataLayer.push({
            'event': 'unfollow-player',
            'playerId': playerId,
            'playerName': playerName
        });
    };

    var trackUnfollowLeague = function (leagueId, leagueName) {
        dataLayer.push({
            'event': 'unfollow-league',
            'leagueId': leagueId,
            'leagueName': leagueName
        });
    };

    var trackIntraPageTabClick = function (pageName, tabName) {
        trackGenericEvent('tab', 'click', pageName, tabName);
    };

    var trackSponsoredTeaserImpression = function (sectionName, articleName) {
        dataLayer.push({
            'event': 'sponsored-teaser-impr',
            'sectionName': sectionName,
            'articleName': articleName
        });
    };

    var trackSponsoredArticleTeaserImpression = function (sectionName, articleName) {
        dataLayer.push({
            'event': 'sponsored-article-teaser-impr',
            'sectionName': sectionName,
            'articleName': articleName
        });
    };

    var trackSponsoredTeaserClick = function (sectionName, articleName) {
        dataLayer.push({
            'event': 'sponsored-teaser-click',
            'sectionName': sectionName,
            'articleName': articleName
        });
    };

    var trackArticleShowCommentsClick = function (articleName, pageType, source) {
        dataLayer.push({
            'event': 'article-show-comments-click',
            'articleName': articleName,
            'pageType': pageType,
            'source': source
        });
    };

    var trackSponsoredArticleTeaserClick = function (sectionName, articleName) {
        dataLayer.push({
            'event': 'sponsored-article-teaser-click',
            'sectionName': sectionName,
            'articleName': articleName
        });
    };

    var trackSponsoredArticleImpression = function (sectionName, articleName) {
        dataLayer.push({
            'event': 'sponsored-article-impr',
            'sectionName': sectionName,
            'articleName': articleName
        });
    };

    var trackSponsoredArticlePurchase = function (product, price, timeLeft, drawComment, gameSystem) {
        dataLayer.push({
            'event': 'sponsored-article-bet-purchase',
            'product': product,
            'drawComment': drawComment,
            'price': price,
            'timeLeft': timeLeft,
            'gameSystem': gameSystem
        });
    };

    function isFunction(functionToCheck) {
        return functionToCheck && {}.toString.call(functionToCheck) === '[object Function]';
    }

    var trackGlobalSearch = function (query, title, resultType) {
        dataLayer.push({
            'event': 'global-search-click',
            'globalSearchQuery': isFunction(query) ? 'suggestion' : query,
            'resultTitle': title,
            'resultType': resultType
        });
    };

    var trackNoResultGlobalSearch = function (query) {
        dataLayer.push({
            'event': 'global-search-no-result',
            'globalSearchQuery': query
        });
    };

    var trackAndroidPageView = function () {
        dataLayer.push({
            'event': 'track-android-pageview'
        });
    };

    var whenGoogleAnalyticsIsReady = function (callback) {
        if (window['google_tag_manager'].dataLayer && window['google_tag_manager'].dataLayer.gtmLoad) {
            callback();
        } else {
            setTimeout(whenGoogleAnalyticsIsReady, 500);
        }
    };

    var trackNativeBackNavigatePageView = function () {
        var log = {
            url: location.pathname,
            title: document.title,
            type: document.querySelector("meta[property='og:type']").getAttribute("content"),
            image: document.querySelector("meta[property='og:image']").getAttribute("content")
        }

        trackGoogleAnalytics(log.url, log.title, log.type, 'track-ios-back-navigate-pageview');
        trackLinkpulse(log.url, log.title, log.type, log.image);
        trackKilkaya(log.url, log.title, log.type, log.image);
    };

    var trackMobileWebBackNavigatePageView = function () {
        var log = {
            url: location.pathname,
            title: document.title,
            type: document.querySelector("meta[property='og:type']").getAttribute("content"),
            image: document.querySelector("meta[property='og:image']").getAttribute("content")
        }

        trackGoogleAnalytics(log.url, log.title, log.type, 'track-ios-back-navigate-pageview');
        trackKilkaya(log.url, log.title, log.type, log.image);
    };

    var trackPlayerIndexImpression = function () {
        dataLayer.push({
            'event': 'player-index-impression'
        });
    };

    var trackPlayerIndexViewableImpression = function () {
        if (window.hasRegisteredTrackedPlayerIndexViewableImpression === undefined) {
            window.hasRegisteredTrackedPlayerIndexViewableImpression = true;
            inView('.player-index-sponsor').once('enter', function () {
                dataLayer.push({
                    'event': 'player-index-viewable-impression'
                });
            });
        }
    };

    var trackPlayerIndexExpandClick = function (playerName) {
        dataLayer.push({
            'event': 'player-index-expand-click',
            'playerName': playerName
        });
    };

    var trackPlayerIndexExpandedDeeplinkClick = function (playerName) {
        dataLayer.push({
            'event': 'player-index-expanded-deeplink-click',
            'playerName': playerName
        });
    };

    var trackPlayerIndexClickBetsson = function () {
        dataLayer.push({
            'event': 'player-index-click-betsson'
        });
    };

    var trackPlayerIndexClickPlayer = function () {
        dataLayer.push({
            'event': 'player-index-click-player'
        });
    };

    var trackPlayerIndexClickTeam = function () {
        dataLayer.push({
            'event': 'player-index-click-team'
        });
    };

    var trackPlayerIndexClickShowMore = function () {
        dataLayer.push({
            'event': 'player-index-click-showmore'
        });
    };

    var trackStartPageClick = function (url, module, index) {
        dataLayer.push({
            'event': 'startpage-module-teaser-click',
            'module': module,
            'url': url,
            'index': index
        });
    };

    var trackMemberContentClick = function (url, module, index) {
        dataLayer.push({
            'event': 'member-content-click',
            'module': module,
            'url': url,
            'index': index
        });
    };

    var trackLoginSuccess = function () {
        dataLayer.push({
            'event': 'login-success'
        });

        if (sessionStorage.getItem('onBoarding')) {
            Bonnier.Fotbollskanalen.TrackingModule.TrackGenericEvent('onboarding_login', sessionStorage.getItem('onBoarding'));
        }

        if (sessionStorage.getItem('sessionOpenedMyFeedAfterBubbleShow')) {
            localStorage.setItem('userLoginAfterRedBubble', '1');
            Bonnier.Fotbollskanalen.TrackingModule.TrackGenericEvent('red-bubble', 'login_on_min_feed');
        }
    };

    var trackRegisterAccountSuccess = function () {
        dataLayer.push({
            'event': 'register-account-success'
        });

        if (sessionStorage.getItem('onBoarding')) {
            Bonnier.Fotbollskanalen.TrackingModule.TrackGenericEvent('onboarding_signup', sessionStorage.getItem('onBoarding'));
        }

        if (sessionStorage.getItem('sessionOpenedMyFeedAfterBubbleShow')) {
            localStorage.setItem('userRegisterAfterRedBubble', '1');
            Bonnier.Fotbollskanalen.TrackingModule.TrackGenericEvent('red-bubble', 'registered_on_min_feed');
        }
    };

    var trackLockArticleShown = function () {
        trackGenericEvent('locked-article', 'impression');
    }

    var trackPushNextArticlePageView = function (url, pageName, pageType) {
        trackGoogleAnalytics(url, pageName, pageType, 'push-next-article-pageview');
    };

    var trackPushNextArticlePageViewByClick = function (url, pageName, pageType) {
        trackGoogleAnalytics(url, pageName, pageType, 'push-next-article-pageview-by-click');
    };

    var trackPageviewLogginService = function (url, pageName, pageType, imageUrl) {
        try {
            trackLinkpulse(url, pageName, pageType, imageUrl);
        } catch {
            console.error('Linkpulse tracking request failed.');
        }

        try {
            trackKilkaya(url, pageName, pageType, imageUrl);
        } catch {
            console.error('Kilkaya tracking request failed.');
        }
    }

    var gaRetryTimer;

    var trackGoogleAnalytics = function (url, pageName, pageType, eventType) {

        trackGASend(url, pageName, pageType, eventType);

        if ($t.exists('.ga-retry')) {
            if ('serviceWorker' in navigator) {
                navigator.serviceWorker.addEventListener('message', serviceworkerMessage);

                clearTimeout(gaRetryTimer);
                gaRetryTimer = setTimeout(
                    function () {
                        trackGASend(url, pageName, pageType, 'track-ios-back-navigate-pageview');
                        console.log('Google Analytics retry sent.')
                    }, 5000);
            }
        }

    };

    var serviceworkerMessage = function (event) {
        if (event.data.msg === 'ga') {
            clearTimeout(gaRetryTimer);
            navigator.serviceWorker.removeEventListener('message', serviceworkerMessage);
        }
    }

    var trackGASend = function (url, pageName, pageType, eventType) {
        dataLayer.push({
            event: eventType,
            url: url,
            pageName: pageName,
            pageType: pageType
        });
    }

    var trackLinkpulse = function (url, pageName, pageType, imageUrl) {
        window.LP4 && window.LP4.logPageview({
            url: 'https://www.fotbollskanalen.se' + url,
            title: pageName,
            type: pageType,
            image: imageUrl
        });
    };

    var trackKilkaya = function (url, pageName, pageType, imageUrl) {
        var isMobile = $t.isNative || $t.isAndroidWeb || $t.isIosWeb;
        var channel = isMobile ? 'mobile' : 'desktop';
        var section = k5aMeta.section ? k5aMeta.section : '';

        kilkaya.pageview({
            'url': 'https://www.fotbollskanalen.se' + url,
            'type': pageType,
            'title': pageName,
            'image': imageUrl,
            'section': section,
            'channel': channel,
            'paid': 0
        });
    };

    var initStartPageClick = function () {
        $('[data-js="track"]').on('click', function () {
            var url = $(this).attr('href');
            var module = $(this).data('module');
            var itemIndex = $(this).data('itemindex');
            var memberContent = $(this).data('member-content');
            Bonnier.Fotbollskanalen.TrackingModule.TrackStartPageClick(url, module, itemIndex);
            if (memberContent === 'True') {
                Bonnier.Fotbollskanalen.TrackingModule.TrackMemberContentClick(url, module, itemIndex);
            }
        });
    };

    var openMobileMenu = function () {
        dataLayer.push({
            event: 'mobile-navigation',
            menuAction: 'Open mobile menu'
        });
    };

    var interactionInMobileMenu = function (clickedItemTitle) {
        dataLayer.push({
            event: 'mobile-navigation',
            menuAction: 'Interaction in mobile menu',
            menuElement: clickedItemTitle
        });
    };

    var closeMobileMenu = function () {
        dataLayer.push({
            event: 'mobile-navigation',
            menuAction: 'Close mobile menu'
        });
    };

    var interactionInDesktopMenu = function (menuElement, menuSubElement) {
        dataLayer.push({
            event: 'desktop-navigation',
            menuElement: menuElement,
            menuSubElement: menuSubElement
        });
    };

    var mobileNavigationClick = function (menuAction, menuElement, menuIndex) {

        dataLayer.push({
            event: 'mobile-navigation',
            menuAction: menuAction,
            menuElement: menuElement,
            menuIndex: menuIndex
        });
    };

    var trackMessageInteractionClick = function (action, title) {
        dataLayer.push({
            event: 'message-interaction',
            action: action,
            messageTitle: title
        });
    };

    var trackInAppMessageIncoming = function () {
        dataLayer.push({
            event: 'in-app-message-incoming',
        });
    };

    var trackInAppMessageShow = function () {
        dataLayer.push({
            event: 'in-app-message-show',
        });
    };

    var trackInAppMessageOpen = function () {
        dataLayer.push({
            event: 'in-app-message-open',
        });
    };

    var trackInAppMessageClose = function () {
        dataLayer.push({
            event: 'in-app-message-close',
        });
    };

    var trackGenericEvent = function (category, action, label, value) {
        dataLayer.push({
            event: 'generic-event',
            category: category,
            action: action,
            label: label,
            value: value
        });
    }

    var trackVideoStarted = function (id, title, autoplay) {
        dataLayer.push({
            event: "stream_start",
            content_asset_id: id,
            content_asset_title: title,
            player_is_autoplay: autoplay
        });
    };

    var trackVideoInitialized = function (id, title, autoplay) {
        dataLayer.push({
            event: "stream_start_init",
            content_asset_id: id,
            content_asset_title: title,
            player_is_autoplay: autoplay
        });
    };

    var trackArticleClick = function () {
        dataLayer.push({
            event: 'generic-event',
            category: 'article-widget',
            action: 'click'
        });
    };

    var trackFirstPageArticleClick = function () {
        dataLayer.push({ 'event': 'asset_click' });
    }

    return {
        TrackArticleWidgetClick: trackArticleClick,
        TrackFollowTeam: trackFollowTeam,
        TrackFollowPlayer: trackFollowPlayer,
        TrackUnfollowTeam: trackUnfollowTeam,
        TrackUnfollowPlayer: trackUnfollowPlayer,
        TrackGlobalSearch: trackGlobalSearch,
        TrackIntraPageTabClick: trackIntraPageTabClick,
        TrackSponsoredTeaserImpression: trackSponsoredTeaserImpression,
        TrackSponsoredArticleTeaserImpression: trackSponsoredArticleTeaserImpression,
        TrackSponsoredTeaserClick: trackSponsoredTeaserClick,
        TrackSponsoredArticleTeaserClick: trackSponsoredArticleTeaserClick,
        TrackSponsoredArticleImpression: trackSponsoredArticleImpression,
        TrackSponsoredArticlePurchase: trackSponsoredArticlePurchase,
        TrackNoResultGlobalSearch: trackNoResultGlobalSearch,
        TrackAndroidPageView: trackAndroidPageView,
        TrackNativeBackNavigatePageView: trackNativeBackNavigatePageView,
        TrackMobileWebBackNavigatePageView: trackMobileWebBackNavigatePageView,
        TrackPlayerIndexImpression: trackPlayerIndexImpression,
        TrackPlayerIndexViewableImpression: trackPlayerIndexViewableImpression,
        TrackPlayerIndexClickBetsson: trackPlayerIndexClickBetsson,
        TrackPlayerIndexClickPlayer: trackPlayerIndexClickPlayer,
        TrackPlayerIndexClickTeam: trackPlayerIndexClickTeam,
        TrackPlayerIndexExpandClick: trackPlayerIndexExpandClick,
        TrackPlayerIndexExpandedDeeplinkClick: trackPlayerIndexExpandedDeeplinkClick,
        TrackPlayerIndexClickShowMore: trackPlayerIndexClickShowMore,
        TrackStartPageClick: trackStartPageClick,
        TrackPushNextArticlePageView: trackPushNextArticlePageView,
        TrackPushNextArticlePageViewByClick: trackPushNextArticlePageViewByClick,
        TrackPageviewLogginService: trackPageviewLogginService,
        InitStartPageClick: initStartPageClick,
        OpenMobileMenu: openMobileMenu,
        InteractionInMobileMenu: interactionInMobileMenu,
        CloseMobileMenu: closeMobileMenu,
        InteractionInDesktopMenu: interactionInDesktopMenu,
        MobileNavigationClick: mobileNavigationClick,
        TrackMessageInteractionClick: trackMessageInteractionClick,
        TrackVideoStarted: trackVideoStarted,
        TrackVideoInitialized: trackVideoInitialized,
        TrackFollowLeague: trackFollowLeague,
        TrackUnfollowLeague: trackUnfollowLeague,
        TrackMemberContentClick: trackMemberContentClick,
        TrackLoginSuccess: trackLoginSuccess,
        TrackRegisterAccountSuccess: trackRegisterAccountSuccess,
        TrackArticleShowCommentsClick: trackArticleShowCommentsClick,
        TrackInAppMessageClose: trackInAppMessageClose,
        TrackInAppMessageOpen: trackInAppMessageOpen,
        TrackInAppMessageShow: trackInAppMessageShow,
        TrackInAppMessageIncoming: trackInAppMessageIncoming,
        TrackLockArticleShown: trackLockArticleShown,
        TrackGenericEvent: trackGenericEvent,
        TrackFirstPageArticleClick: trackFirstPageArticleClick
    };
})();

(window.$fk || $)(function () {
    Bonnier.Fotbollskanalen.TrackingModule.InitStartPageClick();
});
;
var videoModulePlayCoverId;

var VideoCountDownViewModel = function (callback = undefined) {
    CountDown = ko.observable();
};

ko.bindingHandlers.timer = {
    update: function (element) {
        /* Todo: se till att detta check görs bättre */
        var $timeHolder = $(element).find('> span');

        if (!$timeHolder.attr("target-timestamp")) {
            $(element).hide();
            return;
        }
        var targetDate = new Date($timeHolder.attr("target-timestamp"));

        var pad = function (number) {
            if (number < 10) {
                return "0" + number;
            } else {
                return number;
            }
        };

        var refreshCountDown = function () {
            var totalSeconds = Math.floor((targetDate.getTime() - Date.now() + serverLocalDiff) / 1000);
            if (totalSeconds <= 0) {
                clearInterval(timer);
                $(element).text('Sändningen startar');
                setTimeout(function () {
                    if (videoModulePlayCoverId !== undefined && videoModulePlayCoverId !== null) {
                        $('#videoCountDown').css('display', 'none');
                        $(videoModulePlayCoverId).click()
                    } else {
                        // We shouldn't do it this way, correct this 
                        location.href += (location.href.indexOf('?') === -1 ? '?' : '&') + 'aver=' + ~~(Math.random() * 100000);
                    }
                }, 3000);
            } else {
                var days = Math.floor(totalSeconds / 86400);
                var hours = Math.floor(totalSeconds % 86400 / 3600);
                var minutes = Math.floor(totalSeconds % 3600 / 60);
                var seconds = totalSeconds % 60;

                var timetext = "Sänds om: " + (days > 0 ? days + "d " : "") + pad(hours) + ":" + pad(minutes) + ":" + pad(seconds);

                $timeHolder.text(timetext);
            }
        };

        var serverTime, timer;
        var serverLocalDiff = 0;

        $.ajax({
            url: 'https://time.akamai.com/now?client=fotbollskanalen-web&format=rfc3339',
        }).done(function(data) {
            serverTime = moment.unix(data).toDate();
            serverLocalDiff = Date.now() - serverTime;
        }).always(function() {
            refreshCountDown();
            timer = setInterval(refreshCountDown, 1000);
        });
    }
};;
var VideoLandingPageTabViewModel = function (config) {
    var self = this;
    self.page = 1;
    self.pageSize = config.pageSize || 14;
    self.keywords = config.keywords;
    self.VideoSearchResults = ko.observableArray();
    self.hasMoreVideos = ko.observable(false);
    self.videoCountText = ko.observable("");
    
    moment.locale('en', {
        relativeTime: {
            future: "in %s",
            past: "%s ago",
            s: "s",
            m: "1m",
            mm: "%dm",
            h: "1t",
            hh: "%dt",
            d: "1d",
            dd: "%dd",
            M: "1m",
            MM: "%dm",
            y: "1å",
            yy: "%då"
        }
    });

    self.computeDate = function (date) {
        console.log(date);
        date = moment(date);
        if (moment().diff(date, 'days') > 1) {
            return moment(date, "YYYY-MM-DD HH:mm").fromNow(true);
        } else {
            return zeroPad(date.hour()) + ":" + zeroPad(date.minutes());
        }
    };

    self.showMoreVideos = function () {
        $.get("/api/videosearch/keywords/" + self.keywords + "/pagesize/" + self.pageSize + "/page/" + self.page, {}, function (results) {
            self.VideoSearchResults.push.apply(self.VideoSearchResults, results.items);
            self.hasMoreVideos(results.show_load_more);
            self.videoCountText(self.VideoSearchResults().length + " av " + results.count);
            Bonnier.Fotbollskanalen.ImageLazyLoadModule.LazyLoadWithinContainer("#landing-page-video-list", true);
        }, "json");
        self.page += 1;
    };

    self.showMoreVideos();
};



;
Bonnier.namespace("Bonnier.Fotbollskanalen.VideoPlayLoggerModule");

Bonnier.Fotbollskanalen.VideoPlayLoggerModule = (function (jQuery) {

    var logVideoStart = function (vmanId) {
        if (vmanId === undefined || vmanId === 0) return;

        var img = new Image();
        var statApiUrl = "https://fk-stat-{0}.herokuapp.com/visit?type=video&id={1}".format(
            $t.isProd ? "prod" : "stage",
            vmanId);

        img.src = statApiUrl;
    };

    return {
        LogVideoStart: logVideoStart
    };

}(jQuery));;
Bonnier.namespace("Bonnier.Fotbollskanalen.VideoPlayModule");

Bonnier.Fotbollskanalen.VideoPlayModule = (function () {
    var isDragging = false;
    var bbrPlayerModule = null;

    var registerPlayVideoClick = function (pageId, videoId) {
        var elmnt = $('#video-module-play-cover-' + pageId + '-' + videoId);
        if (elmnt === null || elmnt === undefined) return;

        elmnt.on('touchstart', function () {
            isDragging = false;
        });

        elmnt.on('touchmove', function () {
            isDragging = true;
        });

        elmnt.on('click', function () {
            if (!isDragging) {
                handleVideoPlayStarted(pageId, videoId);

                var isMemberContent = elmnt.attr('data-is-member-content') === 'true';
                if (isMemberContent && !Fotbollskanalen.AccountModule.isLoggedIn()) {
                    $([document.documentElement, document.body]).animate({
                        scrollTop: $(".locked-article").offset().top - $(".locked-article").outerHeight() / 2
                    }, 1000);
                }

            }
            isDragging = false;
        });

    };

    var handleVideoPlayStarted = function (pageId, videoId, fullscreen, startMuted) {
        var elmnt = $('#video-module-play-cover-' + pageId + '-' + videoId);
        if (elmnt === null || elmnt === undefined) return;

        var videoTitle = elmnt.attr('data-video-title');
        var playerVersion = elmnt.attr('data-player-version');
        var coverImageUrl = elmnt.attr('data-cover-image-url');
        var isLive = elmnt.attr('data-video-is-live');
        var showCoverImage = elmnt.attr('data-show-cover-image') === 'True';
        var usePushNextContent = elmnt.attr('data-use-push-next-content');

        var isMemberContent = elmnt.attr('data-is-member-content') === 'true';
        if (isMemberContent && !Fotbollskanalen.AccountModule.isLoggedIn()) {
            return;
        }

        $t.dispatchCustomEvent('currentplaylistvideo', { "detail": { "assetId": videoId } });

        if ($t.isNative) {
            if (!showCoverImage) {
                elmnt.hide();
            }
            Bonnier.Fotbollskanalen.NativeBridgeModule.SetVideoInfo(coverImageUrl, videoTitle, isLive);
            Bonnier.Fotbollskanalen.NativeBridgeModule.PlayVideo(videoId, fullscreen);
            Fotbollskanalen.PushNextContentModule.setPlayedVideo(parseInt(videoId));
        } else {

            if (bbrPlayerModule !== null) {
                bbrPlayerModule.destroy();
                bbrPlayerModule = null;
            }

            $('div[id^="video-module-play-cover"]').each(function () {
                $(this).show();
            });

            $('div[id^="bonnier-video-player"]').each(function () {
                $(this).empty();
            });

            if ($('#bonnier-video-player-' + pageId + '-' + videoId) !== null) {
                window.bbrPlayerModule = new Fotbollskanalen.BonnierBroadcastingPlayerModule(playerVersion, usePushNextContent);
                window.bbrPlayerModule.appendBbrStyleAndScriptToHead(function () {
                    window.bbrPlayerModule.playVideoAsset(videoId, true, pageId, startMuted);
                });
            }
        }

        Bonnier.Fotbollskanalen.VideoPlayLoggerModule.LogVideoStart(videoId);
    };

    var init = function (pageId, videoId) {
        var elmnt = $('#video-module-play-cover-' + pageId + '-' + videoId);
        if (elmnt === null || elmnt === undefined) return;

        registerPlayVideoClick(pageId, videoId);

        if (Bonnier.Fotbollskanalen.NativeBridgeModule.CanIUse("restore-video-image")) {
            document.addEventListener('onBackNavigation', function () {
                elmnt.show();
                Bonnier.Fotbollskanalen.ImageLazyLoadModule.LazyLoadWithinContainer('#video-module-play-cover-' + pageId + '-' + videoId, true);
            }, false);
        }
    };

    return {
        Init: init,
        HandleVideoPlayStarted: handleVideoPlayStarted
    };

})();
;
