/* Minification failed. Returning unminified contents.
(9024,47-48): run-time error JS1195: Expected expression: >
(9024,85-86): run-time error JS1195: Expected expression: )
(9026,9-10): run-time error JS1002: Syntax error: }
(9028,43-44): run-time error JS1195: Expected expression: )
(9028,45-46): run-time error JS1004: Expected ';': {
(10050,5-6): run-time error JS1002: Syntax error: }
(10056,249-250): run-time error JS1197: Too many errors. The file might not be a JavaScript file: ,
 */
(function () {
    md5 = function (string) {

        function cmn(q, a, b, x, s, t) {
            a = add32(add32(a, q), add32(x, t));
            return add32((a << s) | (a >>> (32 - s)), b);
        }


        function ff(a, b, c, d, x, s, t) {
            return cmn((b & c) | ((~b) & d), a, b, x, s, t);
        }

        function gg(a, b, c, d, x, s, t) {
            return cmn((b & d) | (c & (~d)), a, b, x, s, t);
        }

        function hh(a, b, c, d, x, s, t) {
            return cmn(b ^ c ^ d, a, b, x, s, t);
        }

        function ii(a, b, c, d, x, s, t) {
            return cmn(c ^ (b | (~d)), a, b, x, s, t);
        }



        function md5cycle(x, k) {
            var a = x[0], b = x[1], c = x[2], d = x[3];

            a = ff(a, b, c, d, k[0], 7, -680876936);
            d = ff(d, a, b, c, k[1], 12, -389564586);
            c = ff(c, d, a, b, k[2], 17, 606105819);
            b = ff(b, c, d, a, k[3], 22, -1044525330);
            a = ff(a, b, c, d, k[4], 7, -176418897);
            d = ff(d, a, b, c, k[5], 12, 1200080426);
            c = ff(c, d, a, b, k[6], 17, -1473231341);
            b = ff(b, c, d, a, k[7], 22, -45705983);
            a = ff(a, b, c, d, k[8], 7, 1770035416);
            d = ff(d, a, b, c, k[9], 12, -1958414417);
            c = ff(c, d, a, b, k[10], 17, -42063);
            b = ff(b, c, d, a, k[11], 22, -1990404162);
            a = ff(a, b, c, d, k[12], 7, 1804603682);
            d = ff(d, a, b, c, k[13], 12, -40341101);
            c = ff(c, d, a, b, k[14], 17, -1502002290);
            b = ff(b, c, d, a, k[15], 22, 1236535329);

            a = gg(a, b, c, d, k[1], 5, -165796510);
            d = gg(d, a, b, c, k[6], 9, -1069501632);
            c = gg(c, d, a, b, k[11], 14, 643717713);
            b = gg(b, c, d, a, k[0], 20, -373897302);
            a = gg(a, b, c, d, k[5], 5, -701558691);
            d = gg(d, a, b, c, k[10], 9, 38016083);
            c = gg(c, d, a, b, k[15], 14, -660478335);
            b = gg(b, c, d, a, k[4], 20, -405537848);
            a = gg(a, b, c, d, k[9], 5, 568446438);
            d = gg(d, a, b, c, k[14], 9, -1019803690);
            c = gg(c, d, a, b, k[3], 14, -187363961);
            b = gg(b, c, d, a, k[8], 20, 1163531501);
            a = gg(a, b, c, d, k[13], 5, -1444681467);
            d = gg(d, a, b, c, k[2], 9, -51403784);
            c = gg(c, d, a, b, k[7], 14, 1735328473);
            b = gg(b, c, d, a, k[12], 20, -1926607734);

            a = hh(a, b, c, d, k[5], 4, -378558);
            d = hh(d, a, b, c, k[8], 11, -2022574463);
            c = hh(c, d, a, b, k[11], 16, 1839030562);
            b = hh(b, c, d, a, k[14], 23, -35309556);
            a = hh(a, b, c, d, k[1], 4, -1530992060);
            d = hh(d, a, b, c, k[4], 11, 1272893353);
            c = hh(c, d, a, b, k[7], 16, -155497632);
            b = hh(b, c, d, a, k[10], 23, -1094730640);
            a = hh(a, b, c, d, k[13], 4, 681279174);
            d = hh(d, a, b, c, k[0], 11, -358537222);
            c = hh(c, d, a, b, k[3], 16, -722521979);
            b = hh(b, c, d, a, k[6], 23, 76029189);
            a = hh(a, b, c, d, k[9], 4, -640364487);
            d = hh(d, a, b, c, k[12], 11, -421815835);
            c = hh(c, d, a, b, k[15], 16, 530742520);
            b = hh(b, c, d, a, k[2], 23, -995338651);

            a = ii(a, b, c, d, k[0], 6, -198630844);
            d = ii(d, a, b, c, k[7], 10, 1126891415);
            c = ii(c, d, a, b, k[14], 15, -1416354905);
            b = ii(b, c, d, a, k[5], 21, -57434055);
            a = ii(a, b, c, d, k[12], 6, 1700485571);
            d = ii(d, a, b, c, k[3], 10, -1894986606);
            c = ii(c, d, a, b, k[10], 15, -1051523);
            b = ii(b, c, d, a, k[1], 21, -2054922799);
            a = ii(a, b, c, d, k[8], 6, 1873313359);
            d = ii(d, a, b, c, k[15], 10, -30611744);
            c = ii(c, d, a, b, k[6], 15, -1560198380);
            b = ii(b, c, d, a, k[13], 21, 1309151649);
            a = ii(a, b, c, d, k[4], 6, -145523070);
            d = ii(d, a, b, c, k[11], 10, -1120210379);
            c = ii(c, d, a, b, k[2], 15, 718787259);
            b = ii(b, c, d, a, k[9], 21, -343485551);

            x[0] = add32(a, x[0]);
            x[1] = add32(b, x[1]);
            x[2] = add32(c, x[2]);
            x[3] = add32(d, x[3]);

        }


        function md51(s) {
            txt = '';
            var n = s.length,
			state = [1732584193, -271733879, -1732584194, 271733878], i;
            for (i = 64; i <= n; i += 64) {
                md5cycle(state, md5blk(s.substring(i - 64, i)));
            }
            s = s.substring(i - 64);
            var tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], sl = s.length;
            for (i = 0; i < sl; i++) tail[i >> 2] |= s.charCodeAt(i) << ((i % 4) << 3);
            tail[i >> 2] |= 0x80 << ((i % 4) << 3);
            if (i > 55) {
                md5cycle(state, tail);
                i = 16;
                while (i--) { tail[i] = 0 }
                //			for (i=0; i<16; i++) tail[i] = 0;
            }
            tail[14] = n * 8;
            md5cycle(state, tail);
            return state;
        }

        /* there needs to be support for Unicode here,
		 * unless we pretend that we can redefine the MD-5
		 * algorithm for multi-byte characters (perhaps
		 * by adding every four 16-bit characters and
		 * shortening the sum to 32 bits). Otherwise
		 * I suggest performing MD-5 as if every character
		 * was two bytes--e.g., 0040 0025 = @%--but then
		 * how will an ordinary MD-5 sum be matched?
		 * There is no way to standardize text to something
		 * like UTF-8 before transformation; speed cost is
		 * utterly prohibitive. The JavaScript standard
		 * itself needs to look at this: it should start
		 * providing access to strings as preformed UTF-8
		 * 8-bit unsigned value arrays.
		 */
        function md5blk(s) { 		/* I figured global was faster.   */
            var md5blks = [], i; 	/* Andy King said do it this way. */
            for (i = 0; i < 64; i += 4) {
                md5blks[i >> 2] = s.charCodeAt(i)
                + (s.charCodeAt(i + 1) << 8)
                + (s.charCodeAt(i + 2) << 16)
                + (s.charCodeAt(i + 3) << 24);
            }
            return md5blks;
        }

        var hex_chr = '0123456789abcdef'.split('');

        function rhex(n) {
            var s = '', j = 0;
            for (; j < 4; j++) s += hex_chr[(n >> (j * 8 + 4)) & 0x0F] + hex_chr[(n >> (j * 8)) & 0x0F];
            return s;
        }

        function hex(x) {
            var l = x.length;
            for (var i = 0; i < l; i++) x[i] = rhex(x[i]);
            return x.join('');
        }

        /* this function is much faster,
		so if possible we use it. Some IEs
		are the only ones I know of that
		need the idiotic second function,
		generated by an if clause.  */

        function add32(a, b) {
            return (a + b) & 0xFFFFFFFF;
        }

        if (hex(md51("hello")) != "5d41402abc4b2a76b9719d911017c592") {
            function add32(x, y) {
                var lsw = (x & 0xFFFF) + (y & 0xFFFF),
				msw = (x >> 16) + (y >> 16) + (lsw >> 16);
                return (msw << 16) | (lsw & 0xFFFF);
            }
        }

        return hex(md51(string));
    }
})();
;
window.PPconfig = {
    urlLabelPosition: 1,
    urlServer: "https://webapi.casino-pp.net/",
    urlContentServer: "https://clientapi.casino-pp.net/Services/CMSHelper.svc/",
    urlClientHelperService: "https://clientapi.casino-pp.net/Services/ClientHelper.svc/",
	urlLogsHelperService: "https://clientapi.casino-pp.net/Services/LogsHelper.svc/",
	
    urlFront: "https://www.progressplay.net/",
    urlCDNGames: "https://data.progressplay.net/content/games/mobin/",	
    urlCDNImages: "https://data.progressplay.net/content/general/",
	urlCDNData: "https://data.progressplay.net/content/general/",
    urlCDNDataSrv: "https://data.progressplay.net/content/general/",
    urlCDNPromotions: "https://data.progressplay.net/content/promotions/",
    urlGamesImages: "https://data.progressplay.net/games/",
    urlGeneralImages: "https://data.progressplay.net/content/general/icons/",

    urlMobile: "https://m.progressplay.net/",	
	
    urlPlayMGS: "https://redirector3.valueactive.eu/Casino/Default.aspx?applicationid=[APPID]&serverid=[CSID]&variant=MAL&[TOKENPARAM]gameid=[GAMEID]&ul=[LANG]",
	urlPlayMGSAppID: "4023",
	urlPlayMGSAppIDUK: "2023",	
	urlPlayMGSAppIDSweden: "9423",
    urlPlayMGSCSIDDemo: "1471&sext1=demo&sext2=demo",
	urlPlayMGSCSIDDemoUK: "31679&sext1=demo&sext2=demo",
    urlPlayMGSCSIDReal: "1471",
	urlPlayMGSCSIDRealUK: "1471",		
	urlPlayMGSCSIDRealSweden: "28723",		
	urlPlayMGSMobile: "https://mobile2.gameassists.co.uk/MobileWebServices_40/casino/game/launch/[LOBBYNAME]/[GAMEID]/en?casinoId=[CSID]&currency=[CURRENCY]&lobbyurl=[LOBBYURL]&loginType=VanguardSessionToken&isPracticePlay=[ISDEMO]&[TOKENPARAM]isRGI=true&languageCode=[LANG]",			
	urlPlayMGSMobileLobbyName: "ProgressPlay",
	urlPlayMGSMobileLobbyNameUK: "ProgressPlay",
    urlPlayMGSMobileCSIDDemo: "1471&sext1=demo&sext2=demo",
	urlPlayMGSMobileCSIDDemoUK: "31679&sext1=demo&sext2=demo",
    urlPlayMGSMobileCSIDReal: "1471",
	urlPlayMGSMobileCSIDRealUK: "1471",
    urlPlayMGSPartners: "https://redirector3.valueactive.eu/Casino/Default.aspx?",

    urlPlayNYX: "https://nogs-gl.nyxmalta.com/game/?nogsgameid=[GAMEID]&nogsoperatorid=[CSID]&nogscurrency=[CURRENCY]&nogslang=[LANG]&nogsmode=[MODE][REALMODE]&jurisdiction=[JURISDICTION]",
    urlPlayNYXRealPart: "&accountid=[PLAYERID]&sessionid=[TOKEN]",
    urlPlayNYXCSID: "268",
    urlPlayNYXMobile: "https://nogs-gl.nyxmalta.com/game/",
	
    urlPlayNETENTstatic: "https://progressplay-static.casinomodule.com/",
    urlPlayNETENTgame: "https://progressplay-game.casinomodule.com/",
	urlPlayNETENTlivegame: "progressplay-livegame.casinomodule.com",
    urlSessionPluginNETENT: "https://www.casino-pp.net/SessionPlugin.html?intervalMinutes={{interval}}&durationSeconds={{duration}}&=bankingUrl={{bankingUrl}}",
    	
	urlPlayEyecon: "https://play.eyecongames.com/launch/prpl?cur=[CURRENCY]&lang=[LANG]&gameid=[GAMEID]&brand=PRPL&mode=[MODE][REALMODE]",
    urlPlayEyeconRealPart: "&uid=[PLAYERID]&alias=[PLAYERNAME]&guid=[TOKEN]&nid=ABCNET001&sid=ABCSKN001&affid=ABCAFF001",

    urlPlayWazdanPartnerCode: "d4sr45fw",
    urlPlayWazdanPartnerName: "progressplay",
				
    urlPlayWazdan: "https://gamelaunch.wazdan.com/iouthf3q/gamelauncher?operator=progressplay&platform=[PLATFORM]&game=[GAMEID]&lang=[LANG]&mode=[MODE][REALMODE]&lobbyUrl=[LOBBYURL]",
    urlPlayWazdanRealPart: "&token=[TOKEN]&license=[LICENSE]&currency=[CURRENCY]",
	
    urlSportsBookAmelco: "https://betsteve-dev2.amelcobetting.com/[LANG]/home[REALMODE]",
    
	urlSportsBookBC: "https://sportsbook[PLATFORM].casino-pp.net/js/partnerinit.js?containerID=sportsbookcontainer&AuthToken=[TOKEN]&lang=[LANG]&UserId=[PLAYERID]&callbackName=sbcallback",

    urlPlayGrooveOperatorId: "400",
	urlPlayGrooveOperatorIdCuracao: "2145",
	urlPlayGroove: "https://gprouter.groovegaming.com/game/?nogsgameid=[GAMEID]&nogsoperatorid=[OPERATORID]&sessionid=[TOKEN]&nogscurrency=[CURRENCY]&nogslang=[LANG]&nogsmode=[MODE]&accountid=[PLAYERID]&homeurl=[LOBBYURL]&device_type=[DEVICETYPE]&country=[PLAYERCOUNTRY]&is_test_account=false&license=[LICENSE]",
    //urlPlayGroove: "https://routerstg.groovegaming.com/game/?nogsgameid=[GAMEID]&nogsoperatorid=[OPERATORID]&sessionid=[TOKEN]&nogscurrency=[CURRENCY]&nogslang=[LANG]&nogsmode=[MODE]&accountid=[PLAYERID]&homeurl=[LOBBYURL]&device_type=[DEVICETYPE]&country=[PLAYERCOUNTRY]&is_test_account=false&license=[LICENSE]",
    
    urlPlayGenii: "https://progressplaylimited-godwebclient.geniigaming.net/[MOBILE]GamesOnDemand/Type2[MODE]?GameId=[GAMEID]&Locale=[LOCALE][REALMODE]",
    urlPlayGeniiRealPart: "&accountid=[PLAYERID]&SessionId=[TOKEN]",
    urlPlayGeniiCSID: "268",	

    urlLivePerson: "https://server.iad.liveperson.net/hc/55738640/?cmd=file&file=visitorWantsToChat&site=55738640&SV!skill={{skill}}&LEAppKey=f907f2d9acd64b7f8c00b83bed3c2822&referrer=<$pageurl$>&bId=22",
    
    urlFundsInfoUrl: "https://www.gamblingcommission.gov.uk/Consumers/Protection-of-customer-funds.aspx",
    addNameToURL: false,
    intercomAppId: "xkgg9m10",
    lobbyName: "ProgressPlay",
    MGSCasinoId: 1471,
	MGSCasinoIdDemo: 1867,
    NYXCasinoId: 268,
    contactUsEmail: "customersupport@instantgamesupport.com",
	contactUsEmailJapan: "customersupport.jp@instantgamesupport.com",
		
	paypalv2: true
};;
/*! loglevel - v1.6.1 - https://github.com/pimterry/loglevel - (c) 2018 Tim Perry - licensed MIT */
(function (root, definition) {
    "use strict";
    if (typeof define === 'function' && define.amd) {
        define(definition);
    } else if (typeof module === 'object' && module.exports) {
        module.exports = definition();
    } else {
        root.log = definition();
    }
}(this, function () {
    "use strict";

    // Slightly dubious tricks to cut down minimized file size
    var noop = function () { };
    var undefinedType = "undefined";

    var logMethods = [
        { name: "trace", level: 0 },
        { name: "debug", level: 1 }, 
        { name: "info", level: 2 },
        { name: "warn", level: 3 },
        { name: "error", level: 4 }
    ];

    var logAppenders = [ 
        { id: 1, name: 'ClientGeneral' },
        { id: 2, name: 'ClientCashier' }, 
        { id: 3, name: 'ClientAccount' },
        { id: 4, name: 'ClientContactUs' },
        { id: 5, name: 'ClientLogin' },
        { id: 6, name: 'ClientLobbyGames' },
        { id: 7, name: 'ClientPushNotifications' }
    ];


    var LogsManager = (function () {

        function sendLogsToServer() {
            if (logMessageLines.length > 0) {
                postLogs(logMessageLines);
                logMessageLines = [];
            }
        }

        return {
            sendLogsToServer: sendLogsToServer
        }
    })();

    var logMessageLines = [];

    setInterval(LogsManager.sendLogsToServer, 2000);


    function postLogs(logItems) {
        var xmlhttp;
        if (window.XMLHttpRequest) {
            // code for modern browsers
            xmlhttp = new XMLHttpRequest();
        } else {
            // code for old IE browsers
            xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
        }
        xmlhttp.open("POST", window.PPconfig.urlLogsHelperService + 'WriteLogs');
        xmlhttp.setRequestHeader("Content-Type", "application/json");
        xmlhttp.send(JSON.stringify({Logs: logItems, Appender: 11}));
    }

    // Cross-browser bind equivalent that works at least back to IE6
    function bindMethod(obj, methodName) {
        var method = obj[methodName];
        if (typeof method.bind === 'function') {
            return method.bind(obj);
        } else {
            try {
                return Function.prototype.bind.call(method, obj);
            } catch (e) {
                // Missing bind shim or IE8 + Modernizr, fallback to wrapping
                return function () {
                    return Function.prototype.apply.apply(method, [obj, arguments]);
                };
            }
        }
    }

    // Build the best logging method possible for this env
    // Wherever possible we want to bind, not wrap, to preserve stack traces
    function realMethod(methodName) {
        if (methodName === 'debug') {
            methodName = 'log';
        }

        if (typeof console === undefinedType) {
            return false; // No method possible, for now - fixed later by enableLoggingWhenConsoleArrives
        } else if (console[methodName] !== undefined) {
            return bindMethod(console, methodName);
        } else if (console.log !== undefined) {
            return bindMethod(console, 'log');
        } else {
            return noop;
        }
    }

    // These private functions always need `this` to be set properly

    function replaceLoggingMethods(level, loggerName) {
        /*jshint validthis:true */
        for (var i = 0; i < logMethods.length; i++) {
            var methodName = logMethods[i].name;
            this[methodName] = (i < level) ?
                noop :
                this.methodFactory(methodName, logMethods[i].level, loggerName);
        }

        // Define log.log as an alias for log.debug
        this.log = this.debug;
    }

    // In old IE versions, the console isn't present until you first open it.
    // We build realMethod() replacements here that regenerate logging methods
    function enableLoggingWhenConsoleArrives(methodName, level, loggerName) {
        return function () {
            if (typeof console !== undefinedType) {
                replaceLoggingMethods.call(this, level, loggerName);
                this[methodName].apply(this, arguments);
            }
        };
    }

    /*By default, we use closely bound real methods wherever possible, and
    otherwise we wait for a console to appear, and then try again.*/
    function defaultMethodFactory(methodName, level, loggerName) {
        /*jshint validthis:true */
        return realMethod(methodName) ||
               enableLoggingWhenConsoleArrives.apply(this, arguments);
    }


    function saveLogToFile(methodName, logLevel, loggerName) {

        return function (message, exception) {

            var logAppender;

            //var logAppenderFilter = logAppenders.filter(function (l) { return l.name === loggerName });
            //if (logAppenderFilter.length > 0)
            //logAppender = logAppenderFilter[0];

            //if (logAppender === undefined) {
            //console.log("Cannot save log! there is no log appender for " + loggerName);
            //return;
            //}
            var eventLogDateTime = new Date();
            var logItem = {
                Message: "PlayerID: " + ((typeof (playerObj) == 'undefined' || playerObj == null) ? "not logged in" : playerObj.PlayerId) + ". " + message,
                Level: logLevel,
                Exception: (typeof exception !== "undefined") ? exception.stack : null
            };
            logMessageLines.push(logItem);

        };
        log.setLevel(log.getLevel());
    }


    function Logger(name, defaultLevel, factory) {
        
        var logAppenderFilter = logAppenders.filter(function (l) { return l.name === name });
        if (logAppenderFilter.length == 0 && name !== undefined) {
            console.log("there is no log appender for " + name);
            return null;
        }

        var self = this;
        var currentLevel;
        var storageKey = "loglevel";
        if (name) {
            storageKey += ":" + name;
        }

        function persistLevelIfPossible(levelNum) {
            var levelName = (logMethods[levelNum].name || 'silent').toUpperCase();

            if (typeof window === undefinedType) return;

            // Use localStorage if available
            try {
                window.localStorage[storageKey] = levelName;
                return;
            } catch (ignore) { }

            // Use session cookie as fallback
            try {
                window.document.cookie =
                  encodeURIComponent(storageKey) + "=" + levelName + ";";
            } catch (ignore) { }
        }

        function getPersistedLevel() {
            var storedLevel;

            if (typeof window === undefinedType) return;

            try {
                storedLevel = window.localStorage[storageKey];
            } catch (ignore) { }

            // Fallback to cookies if local storage gives us nothing
            if (typeof storedLevel === undefinedType) {
                try {
                    var cookie = window.document.cookie;
                    var location = cookie.indexOf(
                        encodeURIComponent(storageKey) + "=");
                    if (location !== -1) {
                        storedLevel = /^([^;]+)/.exec(cookie.slice(location))[1];
                    }
                } catch (ignore) { }
            }

            // If the stored level is not valid, treat it as if nothing was stored.
            if (self.levels[storedLevel] === undefined) {
                storedLevel = undefined;
            }

            return storedLevel;
        }

        /*
         *
         * Public logger API - see https://github.com/pimterry/loglevel for details
         *
         */

        self.name = name;

        self.levels = {
            "TRACE": 0, "DEBUG": 1, "INFO": 2, "WARN": 3,
            "ERROR": 4, "SILENT": 5
        };

        self.methodFactory = saveLogToFile;


        //factory || defaultMethodFactory;

        self.getLevel = function () {
            return currentLevel;
        };

        self.setLevel = function (level, persist) {
            if (typeof level === "string" && self.levels[level.toUpperCase()] !== undefined) {
                level = self.levels[level.toUpperCase()];
            }
            if (typeof level === "number" && level >= 0 && level <= self.levels.SILENT) {
                currentLevel = level;
                if (persist !== false) {  // defaults to true
                    persistLevelIfPossible(level);
                }
                replaceLoggingMethods.call(self, level, name);
                if (typeof console === undefinedType && level < self.levels.SILENT) {
                    return "No console available for logging";
                }
            } else {
                throw "log.setLevel() called with invalid level: " + level;
            }
        };

        self.setDefaultLevel = function (level) {
            if (!getPersistedLevel()) {
                self.setLevel(level, false);
            }
        };

        self.enableAll = function (persist) {
            self.setLevel(self.levels.TRACE, persist);
        };

        self.disableAll = function (persist) {
            self.setLevel(self.levels.SILENT, persist);
        };

        // Initialize with the right level
        var initialLevel = getPersistedLevel();
        if (initialLevel == null) {
            initialLevel = defaultLevel == null ? "INFO" : defaultLevel;
        }
        self.setLevel(initialLevel, false);

        self.sendLogsToServer = function () {
            LogsManager.sendLogsToServer();
        };
    }

    /*
     *
     * Top-level API
     *
     */

    var defaultLogger = new Logger();

    var _loggersByName = {};
    defaultLogger.getLogger = function getLogger(name) {
        if (typeof name !== "string" || name === "") {
            throw new TypeError("You must supply a name when creating a logger.");
        }

        var logger = _loggersByName[name];
        if (!logger) {
            var response = new Logger(name, defaultLogger.getLevel(), defaultLogger.methodFactory);
            if (JSON.stringify(response) !== JSON.stringify({}))
                logger = _loggersByName[name] = response;
            else
                return;
        }
        return logger;
    };

    // Grab the current global log variable in case of overwrite
    var _log = (typeof window !== undefinedType) ? window.log : undefined;
    defaultLogger.noConflict = function () {
        if (typeof window !== undefinedType &&
               window.log === defaultLogger) {
            window.log = _log;
        }

        return defaultLogger;
    };

    defaultLogger.getLoggers = function getLoggers() {
        return _loggersByName;
    };

    return defaultLogger;
}));;
document.addEventListener('invalid', (function () { return function (e) { e.preventDefault(); }; })(), true);

function bindEvent(element, eventName, eventHandler) {
    if (element.addEventListener) {
        element.addEventListener(eventName, eventHandler, true);
    } else if (element.attachEvent) {
        element.attachEvent('on' + eventName, eventHandler);
    }
}

function removeEvent(element, eventName, eventHandler) {
    if (element.removeEventListener) {
        element.removeEventListener(eventName, eventHandler, true);
    } else if (element.detachEvent) {
        element.detachEvent('on' + eventName, eventHandler);
    }
}
function sendMessageToSw(msg) {
    
    return new Promise(function(resolve, reject){
        var msg_chan = new MessageChannel();

        msg_chan.port1.onmessage = function(event){
            if(event.data.error){
                reject(event.data.error);
            }else{
                resolve(event.data);
            }
        };
        if (navigator.serviceWorker && navigator.serviceWorker.controller)
            navigator.serviceWorker.controller.postMessage(msg, [msg_chan.port2]);
    });
}
if (!Array.prototype.includes) {
  Object.defineProperty(Array.prototype, "includes", {
    enumerable: false,
    value: function(obj) {
        var newArr = this.filter(function(el) {
          return el == obj;
        });
        return newArr.length > 0;
      }
  });
}

Array.prototype.findIndex = Array.prototype.findIndex || function (callback) {
    if (this === null) {
        throw new TypeError('Array.prototype.findIndex called on null or undefined');
    } else if (typeof callback !== 'function') {
        throw new TypeError('callback must be a function');
    }
    var list = Object(this);
    // Makes sures is always has an positive integer as length.
    var length = list.length >>> 0;
    var thisArg = arguments[1];
    for (var i = 0; i < length; i++) {
        if (callback.call(thisArg, list[i], i, list)) {
            return i;
        }
    }
    return -1;
};

if (document.addEventListener) {
    document.addEventListener('swRegistrationLoaded', checkPushNotificationsPrompt, false);
} else {
    document.attachEvent('swRegistrationLoaded', checkPushNotificationsPrompt);
}

function checkPushNotificationsPrompt() {
    logger.info(uniqueSessionId + ' - checkPushNotificationsPrompt() called in loader.js');
    var loaderCtr = angular.element(document.getElementById('loaders_controller')).scope();
    if (loaderCtr && loaderCtr.checkPushNotificationsPrompt)
        loaderCtr.checkPushNotificationsPrompt();
}



logger = log.getLogger("ClientGeneral");

window.onerror = function (msg, url, lineNo, columnNo, error) {
    try {
        //logger.error('Message from window.error event: ' + 'Error message: ' + msg + ', URL: ' + url + ', Line Number: ' + lineNo + ', Column Number: ' + columnNo + ', Stack trace: ' + (error !== null ? error.stack : ''));
    }
    catch (e) { };
}

window.onbeforeunload = function (event) {
    logger.sendLogsToServer();
};

var _warn = console.warn,
_error = console.error;

console.warn = function () {
    //logger.warn('Message from console.warn: ' + Array.prototype.slice.call(arguments).join(',Warn: '));
    return _warn.apply(console, arguments);
};

console.error = function () {
    //logger.error('Message from console.error: ' + Array.prototype.slice.call(arguments).join(',Error: '));
    return _error.apply(console, arguments);
};


var Base64 = {
    _keyStr: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", encode: function (r) { var t, e, o, a, h, n, d, C = "", i = 0; for (r = Base64._utf8_encode(r); i < r.length;) a = (t = r.charCodeAt(i++)) >> 2, h = (3 & t) << 4 | (e = r.charCodeAt(i++)) >> 4, n = (15 & e) << 2 | (o = r.charCodeAt(i++)) >> 6, d = 63 & o, isNaN(e) ? n = d = 64 : isNaN(o) && (d = 64), C = C + this._keyStr.charAt(a) + this._keyStr.charAt(h) + this._keyStr.charAt(n) + this._keyStr.charAt(d); return C }, decode: function (r) { var t, e, o, a, h, n, d = "", C = 0; for (r = r.replace(/\\+\\+[++^A-Za-z0-9+/=]/g, ""); C < r.length;) t = this._keyStr.indexOf(r.charAt(C++)) << 2 | (a = this._keyStr.indexOf(r.charAt(C++))) >> 4, e = (15 & a) << 4 | (h = this._keyStr.indexOf(r.charAt(C++))) >> 2, o = (3 & h) << 6 | (n = this._keyStr.indexOf(r.charAt(C++))), d += String.fromCharCode(t), 64 != h && (d += String.fromCharCode(e)), 64 != n && (d += String.fromCharCode(o)); return d = Base64._utf8_decode(d) }, _utf8_encode: function (r) { r = r.replace(/\r\n/g, "n"); for (var t = "", e = 0; e < r.length; e++) { var o = r.charCodeAt(e); o < 128 ? t += String.fromCharCode(o) : (127 < o && o < 2048 ? t += String.fromCharCode(o >> 6 | 192) : (t += String.fromCharCode(o >> 12 | 224), t += String.fromCharCode(o >> 6 & 63 | 128)), t += String.fromCharCode(63 & o | 128)) } return t }, _utf8_decode: function (r) { for (var t, e, o = "", a = 0, h = t = 0; a < r.length;) (h = r.charCodeAt(a)) < 128 ? (o += String.fromCharCode(h), a++) : 191 < h && h < 224 ? (t = r.charCodeAt(a + 1), o += String.fromCharCode((31 & h) << 6 | 63 & t), a += 2) : (t = r.charCodeAt(a + 1), e = r.charCodeAt(a + 2), o += String.fromCharCode((15 & h) << 12 | (63 & t) << 6 | 63 & e), a += 3); return o }
};;
'use strict';
var progressPlayApp = angular.module('progressPlayApp', ['ngRoute', 'ngSanitize', 'ngCookies', 'ngDialog', 'angularLoad', 'acute.select']);
progressPlayApp.config(['$routeProvider', '$httpProvider', function (routeProvider, httpProvider) {
    routeProvider.when('/lobby', {
        templateUrl: '/templates/lobby.html?v=912',
        controller: 'lobbyController'
    });

    routeProvider.when('/sport', {
        templateUrl: '/templates/lobby.html?v=912',
        controller: 'lobbyController',
        resolve: { initialPlayMode: function () { return 'sport'; } }
    });

    routeProvider.when('/sport-login', {
        templateUrl: '/templates/lobby.html?v=912',
        controller: 'lobbyController',
        resolve: { initialPlayMode: function () { return 'sport'; }, initialForm: function () { return 'login'; } }
    });

    routeProvider.when('/sport-registration', {
        templateUrl: '/templates/lobby.html?v=912',
        controller: 'lobbyController',
        resolve: { initialPlayMode: function () { return 'sport'; }, initialForm: function () { return 'registration1'; } }
    });

    routeProvider.when('/sport-promotions', {
        templateUrl: '/templates/lobby.html?v=912',
        controller: 'lobbyController',
        resolve: { initialPlayMode: function () { return 'sport'; }, initialForm: function () { return 'promotions'; } }
    });

    routeProvider.when('/sport-promotions/:param', {
        templateUrl: '/templates/lobby.html?v=912',
        controller: 'lobbyController',
        resolve: { initialPlayMode: function () { return 'sport'; }, initialForm: function () { return 'promotions'; } }
    });

    routeProvider.when('/sport/:param', {
        templateUrl: '/templates/lobby.html?v=912',
        controller: 'lobbyController',
        resolve: { initialPlayMode: function () { return 'sport'; }, initialForm: function () { return 'sport'; } }
    });

    routeProvider.when('/casino', {
        templateUrl: '/templates/lobby.html?v=912',
        controller: 'lobbyController',
        resolve: { initialPlayMode: function () { return 'casino'; }, initialForm: function () { return 'casino'; } }
    });


    routeProvider.when('/casino-login', {
        templateUrl: '/templates/lobby.html?v=912',
        controller: 'lobbyController',
        resolve: { initialPlayMode: function () { return 'casino'; }, initialForm: function () { return 'login'; } }
    });

    routeProvider.when('/casino-registration', {
        templateUrl: '/templates/lobby.html?v=912',
        controller: 'lobbyController',
        resolve: { initialPlayMode: function () { return 'casino'; }, initialForm: function () { return 'registration1'; } }
    });

    routeProvider.when('/casino-promotions', {
        templateUrl: '/templates/lobby.html?v=912',
        controller: 'lobbyController',
        resolve: { initialPlayMode: function () { return 'casino'; }, initialForm: function () { return 'promotions'; } }
    });

    routeProvider.when('/casino-promotions/:param', {
        templateUrl: '/templates/lobby.html?v=912',
        controller: 'lobbyController',
        resolve: { initialPlayMode: function () { return 'casino'; }, initialForm: function () { return 'promotions'; } }
    });

    routeProvider.when('/login', {
        templateUrl: '/templates/lobby.html?v=912',
        controller: 'lobbyController',
        resolve: { initialForm: function () { return 'login'; } }
    });

    routeProvider.when('/registration', {
        templateUrl: '/templates/lobby.html?v=912',
        controller: 'lobbyController',
        resolve: { initialForm: function () { return 'registration1'; } }
    });

    routeProvider.when('/paypal-connect', {
        templateUrl: '/templates/lobby.html?v=912',
        controller: 'lobbyController',
        resolve: { initialForm: function () { return 'paypal-connect'; } }
    });


    routeProvider.when('/paypal-registration/:param', {
        templateUrl: '/templates/lobby.html?v=912',
        controller: 'lobbyController',
        resolve: { initialForm: function () { return 'paypal-registration'; } }
    });

    routeProvider.when('/trustly-registration/:param', {
        templateUrl: '/templates/lobby.html?v=912',
        controller: 'lobbyController',
        resolve: { initialForm: function () { return 'trustly-registration'; } }
    });

    routeProvider.when('/trustly-login/:param', {
        templateUrl: '/templates/lobby.html?v=912',
        controller: 'lobbyController',
        resolve: { initialForm: function () { return 'trustly-login'; } }
    });

    routeProvider.when('/trustly-deposit/:param', {
        templateUrl: '/templates/lobby.html?v=912',
        controller: 'lobbyController',
        resolve: { initialForm: function () { return 'trustly-deposit'; } }
    });

    routeProvider.when('/trustly-fail/:param', {
        templateUrl: '/templates/lobby.html?v=912',
        controller: 'lobbyController',
        resolve: { initialForm: function () { return 'trustly-fail'; } }
    });

    routeProvider.when('/promotions', {
        templateUrl: '/templates/lobby.html?v=912',
        controller: 'lobbyController',
        resolve: { initialForm: function () { return 'promotions'; } }
    });

    routeProvider.when('/promotions/:param', {
        templateUrl: '/templates/lobby.html?v=912',
        controller: 'lobbyController',
        resolve: { initialForm: function () { return 'promotions'; } }
    });

    routeProvider.when('/contact-us', {
        templateUrl: '/templates/lobby.html?v=912',
        controller: 'lobbyController',
        resolve: { initialForm: function () { return 'contact-us'; } }
    });


    routeProvider.when('/contact-us/:param', {
        templateUrl: '/templates/lobby.html?v=912',
        controller: 'lobbyController',
        resolve: { initialForm: function () { return 'contact-us'; } }
    });

    routeProvider.when('/info/:param', {
        templateUrl: '/templates/lobby.html?v=912',
        controller: 'lobbyController',
        resolve: { initialForm: function () { return 'info-main'; } }
    });

    routeProvider.when('/deposit', {
        templateUrl: '/templates/lobby.html?v=912',
        controller: 'lobbyController',
        resolve: { initialForm: function () { return 'deposit'; } }
    });
	
	routeProvider.when('/deposit/:param', {
        templateUrl: '/templates/lobby.html?v=912',
        controller: 'lobbyController',
        resolve: { initialForm: function () { return 'deposit'; } }
    });

    routeProvider.when('/withdrawal', {
        templateUrl: '/templates/lobby.html?v=912',
        controller: 'lobbyController',
        resolve: { initialForm: function () { return 'withdrawal'; } }
    });

    routeProvider.when('/gamehistory', {
        templateUrl: '/templates/lobby.html?v=912',
        controller: 'lobbyController',
        resolve: { initialForm: function () { return 'gamehistory'; } }
    });

    routeProvider.when('/responsible', {
        templateUrl: '/templates/lobby.html?v=912',
        controller: 'lobbyController',
        resolve: { initialForm: function () { return 'responsible'; } }
    });

    routeProvider.when('/responsible/:playerId/:token', {
        templateUrl: '/templates/responsible.html?v=912',
        resolve: {}
    });

    routeProvider.when('/play/:param', {
        templateUrl: '/templates/lobby.html?v=912',
        controller: 'lobbyController',
        resolve: { initialForm: function () { return 'play'; } }
    });

    routeProvider.when('/playdemo/:param', {
        templateUrl: '/templates/lobby.html?v=912',
        controller: 'lobbyController',
        resolve: { initialForm: function () { return 'playdemo'; } }
    });


    routeProvider.when('/playrefresh/:param', {
        templateUrl: '/templates/lobby.html?v=912',
        controller: 'lobbyController',
        resolve: { initialForm: function () { return 'playrefresh'; } }
    });

    routeProvider.when('/chat', {
        templateUrl: '/templates/lobby.html?v=912',
        controller: 'lobbyController',
        resolve: { initialForm: function () { return 'chat'; } }
    });

    routeProvider.when('/verifyid/:playerId/:token/:showUploadWizard/:showUploadWizardPopup', {
        templateUrl: '/templates/verify-id-choose-type.html?v=912',
        resolve: {
        }
    });

    routeProvider.when('/vipclub/:playerId/:token', {
        templateUrl: '/templates/vip.html?v=912',
        resolve: {
        }
    });

    routeProvider.when('/forgotpassword/:email', {
        templateUrl: '/templates/forgot-password.html?v=912',
        resolve: {
        }
    });

    routeProvider.when('/unsubscribe/:encryptedName/:playerId/:email_unique_id', {
        templateUrl: '/templates/unsubscribe.html?v=912',
        resolve: {
        }
    });

    routeProvider.otherwise({
        redirectTo: '/lobby'
    });

    httpProvider.interceptors.push(appInterceptor);
}]);

progressPlayApp.run(['$rootScope', '$timeout', '$interval', '$window', '$route', '$routeParams', '$location', '$sce', '$filter', '$compile', 'generalService', 'storageService', 'contentService', 'eventServices', 'MessagingData', 'AnalyticManager', 'dataService', 'popupServices', '$log', '$cookies', 'ngDialog', 'angularLoad', '$q',
    function ($rootScope, $timeout, $interval, $window, $route, $routeParams, $location, $sce, $filter, $compile, generalService, storageService, contentService, eventServices, MessagingData, AnalyticManager, dataService, popupServices, $log, $cookies, ngDialog, angularLoad, $q) {
        $rootScope.labelName;
        $rootScope.label;
        $rootScope.country;
        $rootScope.locale;
        $rootScope.languageId;
        $rootScope.jurisdictionId;
        $rootScope.tracker;
        $rootScope.dynamic;
        $rootScope.clickid;
        $rootScope.btag;
        $rootScope.idfa;
        $rootScope.durationPopupInterval = 3600;
        $rootScope.inGame;
        $rootScope.game;
        $rootScope.mode;
        $rootScope.iframeOpen = false;
        $rootScope.chatOpen = false;
        $rootScope.sideMenuOpen = false;
        $rootScope.showBanner = true;
        $rootScope.PPconfig = window.PPconfig;
        $rootScope.showPushNotificationsPrompt = false;
        $rootScope.ds_url = '';
        //#region Main

        $rootScope.init = function () {
            postToAnalytics('ClientSite', 'App Init', 'Application init');
            $rootScope.labelName = labelName.toLowerCase();
            $rootScope.labelLogo = labelLogo;
            $rootScope.label = label;
           
            $rootScope.country = country;
			$rootScope.currency = currency;
            $rootScope.jurisdictionId = country.JurisdictionId;
            $rootScope.locale = locale;
 
            $rootScope.headerTemplate = 'templates/components/header.html?v=921';
            $rootScope.footerTemplate = 'templates/components/footer.html?v=920';
            $rootScope.popupsTemplate = 'templates/components/popups.html?v=920';
            $rootScope.overlayTemplate = 'templates/components/overlay.html?v=920';

            $rootScope.setLocale();
            //$rootScope.setLanguage();
            $rootScope.getPlayerTracking();
			dataService.Professions();
            if ($rootScope.isSportEnabled()) {
                if ($rootScope.getCookie("playMode") && ($rootScope.getCookie("playMode") == "sport" || $rootScope.getCookie("playMode") == "casino")) {
                    $rootScope.playMode = $rootScope.getCookie("playMode");
                    postToAnalytics('ClientSite', 'PlayMode', 'Application play mode from cookie: ' + $rootScope.playMode);
                }
                else {
                    $rootScope.playMode = ($rootScope.label.default_playmode == 707 ? 'sport' : 'casino');
                    $rootScope.setCookie("playMode", $rootScope.playMode);
                    postToAnalytics('ClientSite', 'PlayMode', 'Application play mode default: ' + $rootScope.playMode);
                }
            }
            else {
                $rootScope.playMode = 'casino';
                $rootScope.setCookie("playMode", "casino");
                postToAnalytics('ClientSite', 'PlayMode', 'Application play mode sport disabled: ' + $rootScope.playMode);
            }


            $rootScope.globalParams = dataService.getParams();
            $rootScope.analyticParams = dataService.getAnalyticParams();


            var player = $rootScope.getPlayer();
            if (player) {
                if (typeof (_smartico) != 'undefined' && _smartico.identify)
                    _smartico.identify(player.PlayerId);
                $rootScope.getPlayerBalance();
                $timeout(function () {
                    $rootScope.setDurationPopup();
                }, 1000);
                dataService.setParam("userLoggedIn", true);
                $rootScope.popupSetInterval(true);
            }

            var forgotpasswordguid;
            forgotpasswordguid = getQueryStringValue("forgotpasswordguid");
            if (forgotpasswordguid) {
                $rootScope.openModalForm("forgot-password", forgotpasswordguid);
                postToAnalytics('ClientSite', 'ForgotPassword', 'Player clicked on forgot password');
            }

            $timeout(function () {
                //dataService.Promotions();
                $rootScope.openInitialForm();
                document.getElementById("firstLoadOverlay").style.display = "none";
            }, 500);

            if (!storageService.getItem('acceptCookies')) {
                $timeout(function () {
                    $rootScope.cookiesDisclaimer = $rootScope.lexicon["cookies_disclaimer"];
                    $rootScope.cookiesDisclaimerClass = "cookies_law_open";
                }, 1000);
            }
			
            if ($rootScope.playMode == 'sport') {
                $rootScope.openSport();
                postToAnalytics('ClientSite', 'OpenSport', 'Player clicked on open sport');
            }
			else {
				dataService.Games(null);
			}

            $rootScope.applePaySupported = false;
            if (window.ApplePaySession) {
                var merchantIdentifier = 'merchant.progressplay.com.adyen.MerchantAccount.test';
                var promise = ApplePaySession.canMakePaymentsWithActiveCard(merchantIdentifier);
                promise.then(function (canMakePayments) {
                    if (canMakePayments) {
                        $rootScope.applePaySupported = true;
                    }
                });
            }

            var popupMustApprove = storageService.getSessionItem('mustApprovePopup', true);
            if (popupMustApprove) {
                setTimeout(function () {
                    showConfirmPopup(popupMustApprove);
                }, 300);
            }
        }

        $rootScope.loginPlayer = function (player, firstTime) {

            if (typeof (_smartico) != 'undefined' && _smartico.identify) {
                _smartico.identify(player.PlayerId);
                _smartico.login($rootScope.locale.split('-')[0]);
            }
            firstTime = firstTime || false;
            storageService.setItem('loginUserData', { email: player.Email, time: new Date().toDateString() }, true);
            storageService.setItem('login_time', (new Date()).toString("yyyy/MM/dd T hh:mm:ss"));
            playerObj = player;

            $rootScope.savePlayer(player);
            $rootScope.getPlayerPaymentMethods();
            $rootScope.getPlayerPaymentMethodsCreditCards();
            $rootScope.getPlayerClubLevel();
            $rootScope.getPlayerLimits();

            $rootScope.Token = player.Token;
            $rootScope.playerCurrency = player.Currency.CurrencySymbol;
            $rootScope.country = player.Country;
            $rootScope.jurisdictionId = $rootScope.country.JurisdictionId;

            $rootScope.updatePlayerTracking(player);
            $rootScope.getPlayerBalance();

            dataService.setParam("userLoggedIn", true);
            dataService.setParam("playerCurrency", $rootScope.playerCurrency);
			dataService.Countries();
            dataService.Promotions();
            $rootScope.closeModalForm();

            if (firstTime == true && $rootScope.jurisdictionId == 722) {
                popupServices.openMessage({ title: $rootScope.lexicon['responsibleGaming'], text1: $rootScope.lexicon['mga_responsible_gaming'].replace("[NAME]", player.FirstName).replace("[LABEL_NAME]", $rootScope.label.label_name) }, this, false);
            }

            if (player.PendingRestrictions && player.PendingRestrictions.indexOf("|") >= 0) {
                $rootScope.checkPendingRestrictions(player.PendingRestrictions);
            }

            if (player.MigrationMessage && player.MigrationMessage == true) {
                var post = '';
                if ([68, 78, 137, 172].includes(player.WhiteLabelId)) {
                    post = '_2';
                }
                popupServices.openConfirm({
                    title: $rootScope.lexicon['migration_license'],
                    text1: $rootScope.lexicon['migration_license_text' + post].replace("[TERMS]", ($rootScope.label ? $rootScope.label.UrlTerms : '#')),
                    button1Text: $rootScope.lexicon['confirm'],
                    isMigration: true
                }, this, false, true, function () {
                    generalService.authentication.updateMigrationMessage({ PlayerId: $rootScope.getPlayer().PlayerId }).then(
                        function (data) {
                            if ($rootScope.checkResponse({ response: data, location: 'login', closeOnError: false })) {
                                popupServices.openMessage({ title: 'migration_license', text1: 'migartion_agree' }, this);
                            }
                        });
                });
            }

            if (player.ActivationDays) {
                $rootScope.openModalPopupForm('account-validation');
                postToAnalytics('ClientSite', 'AccountValidation', 'Popup opened with account validation');
            }

            if (player.ShowPromotionsAlert) {
                popupServices.openMediaSelect({
                    title: 'recievePromo_alert_title',
                    text1: 'registration_promotion_media_popup_text',
                    button1Text: 'confirm',
                    showButton2: true,
                    button2Text: 'noThanks',
                    partnerEnabled: $rootScope.label.promotions_enabled
                }, this, true, true, function (user) {
                    generalService.authentication.updateMediaSelect({
                        PlayerId: player.PlayerId,
                        ReceiveEmail: user.ReceiveEmail,
                        ReceiveSMS: user.ReceiveSMS,
                        ReceivePhone: user.ReceivePhone,
                        ReceivePost: user.ReceivePost,
                        ReceivePartner: user.ReceivePartner
                    }).then(
                        function (data) {
                            //if ($rootScope.checkResponse({ response: data, location: 'login', closeOnError: false })) {
                            //    popupServices.openMessage({ title: 'recievePromo_alert_title', text1: 'recievePromo_alert_confirm' }, this);
                            //}
                        });
                });
            }

            if ($rootScope.jurisdictionId == 721 && (!player.ProfessionId && player.ProfessionId != -1)) {
                popupServices.openOccupationSelect({
                    title: 'occupation_alert_title',
                    text1: 'occupation_popup_text',
                    button1Text: 'confirm',
                    showButton2: false
                }, this, function (data) {
                    generalService.authentication.updateProfessionSelect({
                        PlayerId: player.PlayerId,
                        ItemId: data.ProfessionId
                    }).then(
                        function (data) {

                        });
                });
            }
           
            dataService.Games(null);
            if (storageService.getItem('registrationStep1PlayerId')) {
                storageService.removeItem('registrationStep1PlayerId');
            }
            else {
                dataService.trackAnalyticEvent($rootScope.getPlayer(), ["pageUrl", "event"], [$location.path(), "loginComplete"]);
            }
            $rootScope.$broadcast('loggedIn');
            $rootScope.popupSetInterval(true);
            $rootScope.setDurationPopup();
            if ($rootScope.playMode == 'sport') {
                $rootScope.openSport();
                postToAnalytics('ClientSite', 'openSportOnLogin', 'Sport is opened after login');
            }
            else {
                var startupgame = storageService.getSessionItem('startupgame', true);
                if (startupgame && startupgame.game && !$rootScope.isMobile()) {
                    postToAnalytics('ClientSite', 'StartupGame', 'Startup game after login is: ' + startupgame.mode + '' + startupgame.game);
                    $rootScope.gameClicked(startupgame.mode, startupgame.game);
                }
            }
            $rootScope.checkAndShowFreeSpins(player.FreeSpinsOffer);
            firEvent('swRegistrationLoaded');
			
			var iInitialForm = storageService.getSessionItem('openInitialForm', true);
            if (iInitialForm) {
                storageService.removeSessionItem('openInitialForm');
                $rootScope.openInitialForm(iInitialForm.modal, iInitialForm.param);
            }
        };

        $rootScope.setDurationPopup = function () {
            var playerData = $rootScope.getPlayer();
            if (playerData && $rootScope.jurisdictionId == 721) {
                var sec = $rootScope.getSecondsFromLogin();
                var secTillPopup = $rootScope.durationPopupInterval;

                var hours = Math.floor(sec / secTillPopup);

                var durationPopupCount = storageService.getSessionItem('durationPopupCount');
                storageService.setSessionItem('durationPopupCount', durationPopupCount || hours.toString(), false);

                if (sec < $rootScope.durationPopupInterval) {
                    secTillPopup = $rootScope.durationPopupInterval - sec;
                }
                else {
                    durationPopupCount = storageService.getSessionItem('durationPopupCount');
                    if (durationPopupCount) {
                        durationPopupCount = parseInt(durationPopupCount);
                        if (durationPopupCount < hours)
                            secTillPopup = 0.5;
                        else
                            secTillPopup = $rootScope.durationPopupInterval - (sec % $rootScope.durationPopupInterval);
                    }
                    else
                        secTillPopup = 0.5;
                }
                $timeout($rootScope.showDurationPopup, secTillPopup * 1000);
            }
        }

        $rootScope.showDurationPopup = function () {
            var playerData = $rootScope.getPlayer();
            if (playerData) {
                var sec = $rootScope.getSecondsFromLogin();
                var hours = Math.floor(sec / $rootScope.durationPopupInterval);
                if (hours > 0 && hours <= 10) {
                    //$rootScope.hours++;
                    popupServices.openConfirm({
                        title: $rootScope.lexicon['duration_alert_popup_title'],
                        text1: $rootScope.lexicon['duration_alert_popup_text'].replace("[HOURS]", hours),
                        button1Text: $rootScope.lexicon['yes'],
                        showButton2: true,
                        button2Text: $rootScope.lexicon['no']
                    }, this, false, true, function () {
                        generalService.authentication.updateGameLimitEncountered({ PlayerId: playerData.PlayerId, ItemString: "PlayTimeAlertUpdate", ItemId: hours }).then(function (data) {
                            $rootScope.setDurationPopup();
                        });
                        storageService.setSessionItem('durationPopupCount', hours, false);
                    },
                        function () {
                            generalService.authentication.updateGameLimitEncountered({ PlayerId: playerData.PlayerId, ItemString: "PlayTimeAlertUpdate", ItemId: -hours }).then(function (data) {
                                $rootScope.setDurationPopup();
                            });
                            storageService.removeSessionItem('durationPopupCount', false);
                            $rootScope.logoutAction();
                        });
                }
                else {
                    $rootScope.setDurationPopup();
                }
            }
        }

        $rootScope.openInitialForm = function (form, param) {
            $rootScope.initialForm = undefined;
            $rootScope.initialFormParam = undefined;
            if (form && form != '') {
                $rootScope.initialForm = form;
                $rootScope.initialFormParam = param;
            }
            else if ($route.current.$$route.resolve && $route.current.$$route.resolve.initialForm) {
                $rootScope.initialForm = $route.current.$$route.resolve.initialForm();
                $rootScope.initialFormParam = ($routeParams.param ? $routeParams.param.replace(':', '') : null);
            }
            if ($rootScope.initialForm && $rootScope.initialForm != '') {

                postToAnalytics('ClientSite', 'InitialForm', 'Player initial form is: ' + $rootScope.initialForm);

                if ($route.current.$$route.resolve && $route.current.$$route.resolve.initialPlayMode && (typeof $route.current.$$route.resolve.initialPlayMode === "function"))
                    $rootScope.initialPlayMode = $route.current.$$route.resolve.initialPlayMode();

                postToAnalytics('ClientSite', 'InitialPlayMode', 'Player initial play mode is: ' + $rootScope.initialPlayMode);
                switch ($rootScope.initialPlayMode) {
                    case "casino":
                        $rootScope.playMode = $rootScope.initialPlayMode;
                        $rootScope.setCookie("playMode", $rootScope.playMode);
                        break;
                    case "sport":
                        if ($rootScope.isSportEnabled()) {
                            $rootScope.playMode = $rootScope.initialPlayMode;
                            $rootScope.setCookie("playMode", $rootScope.playMode);
                            if ($rootScope.initialFormParam != '') {
                                $rootScope.setCookie("sportParams", $rootScope.initialFormParam);
                            }
                        }
                        break;
                }

                switch ($rootScope.initialForm) {
                    case "info-main":
                        $rootScope.openModalPopupForm($rootScope.initialForm, $rootScope.initialFormParam);
                        break;
                    case "promotions":
                        $rootScope.setForm($rootScope.initialForm, $rootScope.initialFormParam, 'modal_content_wide')
                        break;
                    case "responsible":
                        $rootScope.setForm("account-menu", "responsible");
                        break;
                    case "deposit":
                        $rootScope.depositClicked($rootScope.initialFormParam);
                        break;
                    case "withdrawal":
                        $rootScope.setForm("cashier-menu", "withdrawal");
                        break;
                    case "gamehistory":
                        $rootScope.setForm("cashier-menu", "table-games");
                        break;
                    case "play":
                        $rootScope.openInitialGame('real', $rootScope.initialFormParam);
                        break;
                    case "playdemo":
                        $rootScope.openInitialGame('demo', $rootScope.initialFormParam);
                        break;

                    case "paypal-connect":
                        var code = getQueryStringValue("code");
                        var scope = getQueryStringValue("scope");

                        generalService.authentication.registerFromPaypalStep1({ Email: code, WhiteLabelId: $rootScope.label.label_id}).then(
                            function (data) {
                                playerData.Token = data;
                                $rootScope.savePlayer(playerData);
                                $rootScope.openInitialGame('real', $rootScope.initialFormParam);
                            },
                            function (err) {
                                alert(err);
                            }
                        );

                        break;

                    case "paypal-registration":
                        if ($rootScope.initialFormParam != '') {
                            $rootScope.setForm($rootScope.initialForm, $rootScope.initialFormParam);
                        }
                        break;

                    case "trustly-registration":
                        if ($rootScope.initialFormParam != '') {
                            var params = Base64.decode($rootScope.initialFormParam);
                            var arrparams = params.split(":");
                            if (arrparams[0] && arrparams[1]) {
                                $rootScope.initialFormParam = "";
                                dataService.SetTrustlyStatus(arrparams[0], arrparams[1], "Registration");
                                $rootScope.setForm($rootScope.initialForm, $rootScope.initialFormParam);
                                break;
                            }
                        }
                        break;
                    case "trustly-login":
                        if ($rootScope.initialFormParam != '') {
                            $rootScope.getPlayerByInitialParams($rootScope.initialFormParam,
                                function (data) {
                                    if ($rootScope.checkResponse({ response: data, location: 'login', closeOnError: false })) {
                                        $rootScope.loginPlayer(data);
                                    }
                                });
                        }
                    case "trustly-deposit":
                        if ($rootScope.initialFormParam != '') {
                            $rootScope.getPlayerByInitialParams($rootScope.initialFormParam,
                                function (data) {
                                    if ($rootScope.checkResponse({ response: data, location: 'login', closeOnError: false })) {
                                        $rootScope.loginPlayer(data);
                                        $rootScope.closeAllModals();
                                        $rootScope.afterSuccessfulDeposit(0, "trustly", 0);
                                    }
                                });
                        }

                        break;
                    case "trustly-fail":
                        $rootScope.closeAllModals();
                        break;
                    case "sport":
                    case "casino":
                        break;

                    case "playrefresh":
                        var playerData = $rootScope.getPlayer();
                        if (playerData) {
                            generalService.authentication.refreshToken({ PlayerId: playerData.PlayerId, Token: playerData.Token, ItemString: "NEW" }).then(
                                function (data) {
                                    playerData.Token = data;
                                    $rootScope.savePlayer(playerData);
                                    $rootScope.openInitialGame('real', $rootScope.initialFormParam);
                                },
                                function (err) {
                                    alert(err);
                                }
                            );
                        }
                        break;
                    case "chat":
                        $timeout(function () {
                            $rootScope.openChat();
                        }, 50);

                        break;
                    default:
                        $rootScope.setForm($rootScope.initialForm, $rootScope.initialFormParam);
                        break;
                }
                $location.path('/');
            }
        }

        $rootScope.getPlayerByInitialParams = function (params, callback) {
            var params = Base64.decode(params);
            var arrparams = params.split(":");
            if (arrparams[0] && arrparams[1]) {
                $rootScope.initialFormParam = "";
                generalService.authentication.getPlayer({ PlayerId: arrparams[0], Token: arrparams[1] }).then(callback);
            }
        }

        $rootScope.afterSuccessfulDeposit = function (amount, method, info) {
            postToAnalytics('ClientSite', 'SuccessfulDeposit', 'Player deposited successfully. Amount: ' + amount + ', Method: ' + method);
            $rootScope.updatePlayer();
            $rootScope.getPlayerBalance();
            $rootScope.getPlayerPaymentMethods();
            $rootScope.getPlayerPaymentMethodsCreditCards();
            $rootScope.closeModalForm();
            dataService.Promotions();
            popupServices.openMessage({
                title: 'deposit', text1: 'deposit_success'
            }, this).closePromise.then(
                function (data) {
                    $rootScope.checkAndShowFreeSpins(data.FreeSpinsOffer);
                });
            dataService.trackAnalyticEvent($rootScope.getPlayer(), ["pageUrl", "event", "eventAmount", "eventType", "eventInfo"], [$location.path(), "depositComplete", amount, method, info]);
        }

        $rootScope.checkResponse = function (params) {
            var is_error = false;
            var error_title;
            var error_text;

            error_title = ($rootScope.lexicon[params.location] ? params.location : 'error_oops');

            if (params.response || params.response == 0) {
                if (params.response.Message) {
                    if (params.response.Message.indexOf("|") < 0) {
                        if (params.response.Message.indexOf("em_") == 0) {
                            error_text = params.response.Message;
                            is_error = true;
                            if (params.response.Message.indexOf("em_PleaseSignInAgain") == 0 || params.response.Message.indexOf("em_SessionTimeoutLogout") == 0) {
                                params.closeOnError = true;
                                params.logoutError = true;
                            }
                        }
                        else {
                            error_text = 'em_UnexpectedError';
                            is_error = true;
                        }
                    }
                }
				
                if (params.response.ErrorMessage) {
                    error_text = params.response.ErrorMessage;
                    is_error = true;
                }				
            }
            else {
                is_error = true;
                error_text = 'error_no_server';
                $rootScope.clearPlayer();
                $rootScope.closeAllModals();
            }


            params.noMessage = (params.noMessage && params.noMessage == true);

            if (is_error && !params.noMessage) {

                if (params.response && params.response.Message && params.response.Message.indexOf("em_PleaseSignInAgain") == 0 && !$rootScope.isLoggedIn()) {
                    return !is_error;
                }

                popupServices.openMessage({ title: error_title, text1: error_text }, this).closePromise.then(
                    function (data) {
                        if (params.closeOnError) {
                            if (params.logoutError) {
                                $rootScope.clearPlayer();
                            }
                            $timeout(function () {
                                $rootScope.closeAllModals();
                            }, 50);
                        }
                    });
            }

            return !is_error;
        }

        $rootScope.getPlayer = function () {
            return storageService.getSessionItem('playerData', true);
        };

        $rootScope.isSportEnabled = function () {
            return $rootScope.label.sport_enabled && $rootScope.country.IsoCode != 'DE';
        };

        $rootScope.savePlayer = function (data) {
            storageService.setSessionItem('playerData', data, true);
        };

        $rootScope.clearPlayer = function () {
            storageService.removeSessionItem('playerData', true);
            storageService.removeSessionItem('PaymentMethods', true);
            storageService.removeSessionItem('PaymentMethodsCreditCards', true);

            dataService.setParam("userLoggedIn", false);

            storageService.removeSessionItem('madeWithdrawal');
            storageService.removeSessionItem('ClubLevel');
            $rootScope.Token = null;
        };

        $rootScope.updatePlayer = function () {
            var playerData = $rootScope.getPlayer();
            if (playerData) {
                generalService.authentication.getPlayer({ PlayerId: playerData.PlayerId, Token: playerData.Token }).then(
                    function (data) {
                        $rootScope.savePlayer(data);
                        dataService.Promotions();
                    },
                    function (err) {
                        alert(err);
                    }
                );
            }
        };

        $rootScope.refreshPlayerToken = function () {
            var playerData = $rootScope.getPlayer();
            if (playerData) {
                generalService.authentication.refreshToken({ PlayerId: playerData.PlayerId, Token: playerData.Token }).then(
                    function (data) {
                        $rootScope.checkResponse({ response: data, location: 'general', closeOnError: true });
                    },
                    function (err) {
                        alert(err);
                    }
                );
            }

        }

        $rootScope.getPlayerBalance = function () {
            var playerData = $rootScope.getPlayer();
            if (playerData) {
                generalService.cashier.GetPlayerBalances({ "PlayerId": $rootScope.getPlayer().PlayerId }).then(
                    function (data) {
                        if (data && data.Message && data.Message.indexOf("em_GameLimitEncountered") == 0) {
                            popupServices.openConfirm({
                                title: $rootScope.lexicon['em_GameLimitEncountered'],
                                text1: $rootScope.lexicon[data.Message],
                                button1Text: $rootScope.lexicon['approve']
                            }, this, false, true, function () {
                                generalService.authentication.updateGameLimitEncountered({ PlayerId: playerData.PlayerId }).then(
                                    function (data) {
                                        $rootScope.closeAllModals();
                                    });
                            });
                        }
                        else {
                            if (data.Message && data.Message.indexOf("em_PleaseSignInAgain") == 0) {

                                $rootScope.closeAllModals();
                                $rootScope.logoutAction();
                            }

                            if ($rootScope.checkResponse({ response: data, location: 'general', closeOnError: true })) {
                                $rootScope.updatePlayerBalance(data);
                            }
                        }
                    });
            }
        };

        $rootScope.updatePlayerBalance = function (accountInfo) {
            var player = $rootScope.getPlayer();
            player.Account = accountInfo;
            if (!player.IsFTD) {
                player.IsFTD = (player.Account.TotalDeposits > 0);
            }
            player.Account.Balance = $rootScope.getPlayerBalanceCurrency(player, player.Account.GameBalance);
            player.Account.AccountBalanceF = $rootScope.getPlayerBalanceCurrency(player, player.Account.AccountBalance);
            player.Account.BonusBalanceF = $rootScope.getPlayerBalanceCurrency(player, player.Account.BonusBalance);
            player.Account.BonusBalanceSportF = $rootScope.getPlayerBalanceCurrency(player, player.Account.BonusBalanceSport);
            player.Account.TotalNetF = $rootScope.getPlayerBalanceCurrency(player, player.Account.TotalDeposits - player.Account.TotalWithdrawals);
            player.Account.PendingWithdrawalsF = $rootScope.getPlayerBalanceCurrency(player, player.Account.PendingWithdrawals);
            player.Account.HasPendingWithdrawals = (player.Account.PendingWithdrawals > 0);
            if ($rootScope.jurisdictionId == 721) {
            if (dataService.getParam("inGame") && ($rootScope.game.ProviderID == 1 || $rootScope.game.ProviderID == 3 || $rootScope.game.ProviderID == 7 || $rootScope.game.ProviderID == 12) && player.Account.BetSourceChangedTo > 0 && player.Account.SourceChangedBalance != player.Account.GameBalance) {
                    $interval.cancel($rootScope.getPlayerBalancePromise);
                    var source = (player.Account.BetSourceChangedTo == 1 ? 'Real' : 'Bonus');
                    popupServices.openConfirm({
                        title: $rootScope.lexicon['betSourceChangeTitle' + source],
                        text1: $rootScope.lexicon["betSourceChangeText" + source],
                        button1Text: $rootScope.lexicon['OK'],
                    }, this, false, true,
                        function () {
                            generalService.authentication.updateGameLimitEncountered({ PlayerId: player.PlayerId, ItemString: "BetSourceChangeUpdate" }).then(function (data) { });
                            $rootScope.getPlayerBalancePromise = $interval($rootScope.getPlayerBalance, 5000);
                        },
                        function () {
                            $rootScope.getPlayerBalancePromise = $interval($rootScope.getPlayerBalance, 5000);
                        });
                }
            }
            $rootScope.savePlayer(player);
            dataService.setBalance(player.Account.GameBalance);

        };

        $rootScope.getPlayerBalanceCurrency = function (player, balance) {
            var result;
            if (player.Currency.CurrencyCode == "SEK") {
                result = $filter('currency')(balance, '') + player.Currency.CurrencySymbol;
            }
            else {
                result = $filter('currency')(balance, player.Currency.CurrencySymbol);
            }
            return result;
        }

        $rootScope.getPlayerTracking = function () {

            $rootScope.putCookieFromQueryString('tracker');
            $rootScope.putCookieFromQueryString('dynamic');
            $rootScope.putCookieFromQueryString('clickid');
            $rootScope.putCookieFromQueryString('btag');
            $rootScope.putCookieFromQueryString('idfa');

            $rootScope.tracker = $rootScope.getCookie('tracker');
            $rootScope.dynamic = $rootScope.getCookie('dynamic');
            $rootScope.clickid = $rootScope.getCookie('clickid');
            $rootScope.btag = $rootScope.getCookie('btag');
            $rootScope.idfa = $rootScope.getCookie('idfa');

        }

        $rootScope.updatePlayerTracking = function (player) {
            $rootScope.putCookieGeneral('tracker', player.Tracker);
            $rootScope.putCookieGeneral('dynamic', player.Dynamic);
            $rootScope.putCookieGeneral('clickid', player.ClickId);
            $rootScope.putCookieGeneral('btag', player.ClickId);
            $rootScope.putCookieGeneral('idfa', player.ClickId);
            $rootScope.tracker = player.Tracker;
            $rootScope.dynamic = player.Dynamic;
            $rootScope.clickid = player.ClickId;
            $rootScope.btag = player.ClickId;
            $rootScope.idfa = player.ClickId;
        }

        $rootScope.logout = function () {
            postToAnalytics('ClientSite', 'Logout', 'Player logged out from Client');
            popupServices.openConfirm({
                title: 'logout',
                text1: 'logout_confirmation',
                button1Text: 'yes',
                button2Text: 'no',
                showButton2: true
            }, this, true, false,
                function () {
                    $rootScope.logoutAction();
                });
        };

        $rootScope.logoutAction = function () {
            var player = $rootScope.getPlayer();
            if (player) {
                dataService.trackAnalyticEvent($rootScope.getPlayer(), ["pageUrl", "event"], [$location.path(), "logout"]);

                generalService.authentication.logout({ "PlayerId": $rootScope.getPlayer().PlayerId }).then(
                    function (data) {
                    });
            }
            $rootScope.sideMenuOpened = false;
            $rootScope.closeAllModals();
            $rootScope.clearPlayer();
            dataService.Promotions();
            if ($rootScope.playMode == 'casino') {
                dataService.Games(null);
            }
            if ($rootScope.playMode == 'sport') {
                $rootScope.openSport();
            }
            if ($rootScope.showDurationPopupPromise)
                $interval.cancel($rootScope.showDurationPopupPromise);
            $rootScope.$broadcast('loggedOut');

            if (typeof (_smartico) != 'undefined' && _smartico.identify) {
                _smartico.identify(player.PlayerId);
                _smartico.logout();
            }

			$rootScope.init();
            if (typeof ($solitics) !== 'undefined') { $solitics.onLogout(); }
        }

        $rootScope.isLoggedIn = function () {
            return dataService.getParam("userLoggedIn");
        }

        $rootScope.checkPendingRestrictions = function (pendingRestrictions) {
            var pendings = pendingRestrictions.split('|');
            var text = "";
            for (var i = 0; i <= pendings.length - 1; i++) {
                var pending = pendings[i];
                if (pending && pending.indexOf(":") >= 0) {
                    var pendingData = pending.split(":");
                    switch (pendingData[1]) {
                        case "SessionTimeout":
                        case "RealityCheck":
                            text += $rootScope.lexicon['limits_PendingApprovalItem'].replace("[LIMIT_NAME]", $rootScope.lexicon["limits_" + pendingData[1]]).replace("[LIMIT_VALUE]", (pendingData[3] ? pendingData[3] : $rootScope.lexicon["limits_unlimited"])) + "<br/>";
                            break;
                        default:
                            text += $rootScope.lexicon['limits_PendingApprovalItem'].replace("[LIMIT_NAME]", $rootScope.lexicon["limits_" + pendingData[1]]).replace("[LIMIT_VALUE]", (pendingData[3] ? $filter('currency')(pendingData[3], $rootScope.playerCurrency, 0) : $rootScope.lexicon["limits_unlimited"])) + "<br/>";
                            break;
                    }
                }
            }
            popupServices.openConfirm({
                title: $rootScope.lexicon['limits_PendingApprovalTitle'],
                text1: $rootScope.lexicon['limits_PendingApprovalText'],
                text2: text,
                button1Text: $rootScope.lexicon['approve'],
                showButton2: true,
                button2Text: $rootScope.lexicon['discard']
            }, this, false, true,
                function () {
                    generalService.authentication.updatePendingRestrictions({ PlayerId: $rootScope.getPlayer().PlayerId, ItemId: 1 }).then(
                        function (data) {
                            if ($rootScope.checkResponse({ response: data, location: 'login', closeOnError: false })) {
                                popupServices.openMessage({
                                    title: 'limits_PendingApprovalTitle', text1: 'limits_PendingApprovalApproved'
                                }, this);
                            }
                        });
                },
                function () {
                    generalService.authentication.updatePendingRestrictions({ PlayerId: $rootScope.getPlayer().PlayerId, ItemId: 0 }).then(
                        function (data) {
                            if ($rootScope.checkResponse({ response: data, location: 'login', closeOnError: false })) {
                                popupServices.openMessage({
                                    title: 'limits_PendingApprovalTitle', text1: 'limits_PendingApprovalDiscarded'
                                }, this);
                            }
                        });
                }
            );

        }

        $rootScope.checkAndShowFreeSpins = function (freespins) {
            if (freespins && freespins.FreeSpinsOfferId) {
                dataService.GamesDictIDs(freespins.GameId).then(function (game) {
                    if (freespins.GameId == 1219 || game) {
                        if (game && game.GameName) {
                            var title = $rootScope.lexicon['freeSpins']
                            var text = $rootScope.lexicon["freeSpins_text"].replace("[SPINS]", freespins.SpinsLeft).replace("[GAME]", game.GameName);
                        }
                        else {
                            var title = $rootScope.lexicon['freeBet']
                            var text = $rootScope.lexicon["freeBet_text"].replace("[SPINS]", freespins.SpinsLeft).replace("[CURRENCY]", $rootScope.getPlayer().Currency.CurrencySymbol);
                        }

                        if (!$rootScope.freeSpinsShow) {
                            $rootScope.freeSpinsShow = true;
                            $rootScope.freeSpins = freespins;
                            popupServices.openConfirm({
                                title: title,
                                text1: text,
                                button1Text: $rootScope.lexicon['playNow'],
                                button2Text: $rootScope.lexicon['cancel'],
                                showButton2: true
                            }, this, false, false, function () {
                                if (freespins.GameId != 1219) {
                                    $rootScope.openGame('real', game);
                                    $rootScope.freeSpinsShow = false;
                                }
                                else {
                                    var playerData = playerData = $rootScope.getPlayer();
                                    generalService.authentication.refreshToken({ PlayerId: playerData.PlayerId, Token: playerData.Token, ItemString: "NEW" }).then(
                                        function (data) {
                                            playerData.Token = data;
                                            $rootScope.savePlayer(playerData);
                                            $rootScope.openSport();
                                            $rootScope.closeAllModals();
                                        },
                                        function (err) {
                                            alert(err);
                                        }
                                    );
                                }
                            }, function () { $rootScope.freeSpinsShow = false; });
                        }
                    }
                });

            }

        }

        $rootScope.getPlayerPaymentMethods = function () {
            generalService.cashier.getPlayerPaymentMethods({ "PlayerId": $rootScope.getPlayer().PlayerId }).then(
                function (data) {
                    if ($rootScope.checkResponse({ response: data, location: 'general', closeOnError: false })) {
                        var dict = {};
                        for (var i = 0; i <= data.length - 1; i++) {
                            dict[data[i].SysName] = data[i];
                        }
                        storageService.setSessionItem('PaymentMethods', dict, true);
                    }
                });
        }

        $rootScope.getPlayerPaymentMethodsCreditCards = function () {
            generalService.cashier.getPlayerPaymentMethodsCreditCards({ "PlayerId": $rootScope.getPlayer().PlayerId }).then(
                function (data) {
                    if ($rootScope.checkResponse({ response: data, location: 'general', closeOnError: false })) {
                        var dict = {};
                        for (var i = 0; i <= data.length - 1; i++) {
                            dict[data[i].MethodId] = data[i];
                            if (data[i].MethodLastUsed) {
                                storageService.setSessionItem('PaymentMethodsCreditCardsLastUsed', data[i].MethodId);
                            }
                        }
                        storageService.setSessionItem('PaymentMethodsCreditCards', dict, true);
                    }
                });
        }

        $rootScope.getPlayerClubLevel = function () {
            generalService.cashier.getPlayerClubLevel({ "PlayerId": $rootScope.getPlayer().PlayerId }).then(
                function (data) {
                    if ($rootScope.checkResponse({ response: data, location: 'general', closeOnError: false })) {
                        $rootScope.ClubLevel = data;
                        //storageService.setSessionItem('ClubLevelPointsToNext', ($rootScope.ClubLevel.LevelOrder - 1) * 20 + (($rootScope.ClubLevel.NextLevelPoints - $rootScope.ClubLevel.PointsToNextLevel) / $rootScope.ClubLevel.NextLevelPoints * 20) + '%', false);
                        storageService.setSessionItem('ClubLevel', data, true);
                    }
                });
        }

        $rootScope.getPlayerLimits = function () {
            generalService.cashier.getPlayerLimits({ "PlayerId": $rootScope.getPlayer().PlayerId }).then(
                function (data) {
                    if ($rootScope.checkResponse({ response: data, location: 'general', closeOnError: false })) {
                        var dict = {};
                        for (var i = 0; i <= data.length - 1; i++) {
                            dict[data[i].LimitName] = data[i];
                        }
                        storageService.setSessionItem('PlayerLimits', dict, true);
                    }
                });
        }

        $rootScope.getPopups = function () {
            var playerData = $rootScope.getPlayer();
            if (playerData) {
                generalService.cashier.GetPlayerPopups({ PlayerId: playerData.PlayerId, Token: playerData.Token }).then(
                    function (data) {
                        if (data && data.length > 0) {
                            if ($rootScope.checkResponse({ response: data, location: 'general', closeOnError: true })) {

                                postToAnalytics('ClientSite', 'GetPlayerPopups', 'Player popups are: ' + JSON.stringify(data));

                                if (data[0].FreeSpinsOffer && data[0].FreeSpinsOffer.FreeSpinsOfferId) {

                                    $rootScope.checkAndShowFreeSpins(data[0].FreeSpinsOffer);
                                }
                                else {
                                    for (var i = 0; i < data.length; i++) {
                                        var popup = data[i];
                                        showConfirmPopup(popup);
                                    }
                                }
                            }
                        }
                    });
            }
        };

        function showConfirmPopup(popup) {
            if (popup.Title && popup.Text1) {

                if (popup.Button1) {
                    var actionFunc1 = $rootScope.popupSetButtonAction(popup.Button1Action, (popup.MustApprove ? popup.NotificationID : undefined));
                }

                if (popup.Button2) {
                    var actionFunc2 = $rootScope.popupSetButtonAction(popup.Button2Action);
                }
                if (popup.MustApprove) {
                    $rootScope.isApprovedOptIn = false;
                    storageService.setSessionItem('mustApprovePopup', popup, true);
                }

                if (!popup.PlayMode || popup.PlayMode == 0 || popup.PlayMode == $rootScope.playModeID()) {
                    popupServices.openConfirm({ title: popup.Title, text1: popup.Text1, text2: popup.Text2, button1Text: popup.Button1, button2Text: popup.Button2, showButton2: (popup.Button2), isOptIn: popup.IsOptIn, optInText: popup.OptInText }, this, false, popup.MustApprove, actionFunc1, actionFunc2);
                }
            }
        }

        $rootScope.popupSetButtonAction = function (action, mustApproveNotificationID) {
            var actionFunc;
            var actionName = (action.indexOf("|") > 0 ? action.split("|")[0] : action);
            var param = (action.indexOf("|") > 0 ? action.split("|")[1] : "");

            switch (actionName) {
                case "Deposit":
                    actionFunc = function () {
                        $rootScope.popupActionDeposit(param);
                    }
                    break;
                case "Play":
                    if (param != '') {
                        storageService.setSessionItem('gameCode', param);
                    }
                    actionFunc = $rootScope.popupActionPlay;
                    break;
                case "Custom":
                    if (param != '') {
                        storageService.setSessionItem('customCode', param);
                    }
                    actionFunc = $rootScope.popupActionCustom;
                    break;
                case "Close":
                    actionFunc = $rootScope.popupActionClose;
                    break;
                case "Approve":
                    storageService.setSessionItem('mustApproveNotificationID', mustApproveNotificationID);
                    actionFunc = $rootScope.popupActionApproveToServer;
                    break;
                case "VerifyId":
					storageService.setSessionItem('mustApproveNotificationID', mustApproveNotificationID);
                    actionFunc = $rootScope.openVerifyIDFromPopup;
                    break;	
				case "VerifyIdNoPopup":
					storageService.setSessionItem('mustApproveNotificationID', mustApproveNotificationID);
                    actionFunc = function () { $rootScope.openVerifyIDFromPopup(false); }
                    break;					
                default:
                    actionFunc = $rootScope.popupActionClose;
                    break;
            } 
            return actionFunc;
        }
				
        $rootScope.openVerifyIDFromPopup = function (showUploadWizardPopup) {
			$rootScope.popupActionApproveToServer();
			$rootScope.openVerifyIDWizard(showUploadWizardPopup);
		}
			
		$rootScope.openVerifyIDWizard = function (showUploadWizardPopup) {
            showUploadWizardPopup = typeof (showUploadWizardPopup) == 'undefined' ? true : showUploadWizardPopup;
            $rootScope.openModalPopupForm('verify-id-choose-type', { showUploadWizard: true, showUploadWizardPopup: showUploadWizardPopup });
        }


        $rootScope.popupActionDeposit = function (depositCode) {
            postToAnalytics('ClientSite', 'PopupActionDeposit', 'Popup with action deposit button was clicked');
            $rootScope.depositClicked(depositCode);
        }

        $rootScope.popupActionApproveToServer = function () {
            postToAnalytics('ClientSite', 'popupActionApproveToServer', 'Popup with action must approve was clicked');
            var mustApproveNotificationID = storageService.getSessionItem('mustApproveNotificationID');
            if (mustApproveNotificationID != undefined && mustApproveNotificationID != null) {
                $rootScope.isApprovedOptIn = false;
                $rootScope.setPopupAsApproved(mustApproveNotificationID, true);
            }
        }

        $rootScope.popupActionPlay = function () {
            postToAnalytics('ClientSite', 'PopupActionPlay', 'Popup with action play button was clicked');
            //var jackpotId = param.split(".")[0];
            //var providerId = parseInt(param.split(".")[1]);
            //var gameUrl = $rootScope.getGameUrlReal(jackpotId, providerId);
        }

        $rootScope.popupActionCustom = function () {

        }

        $rootScope.popupActionClose = function () {
            postToAnalytics('ClientSite', 'PopupActionClose', 'Popup with action close button was clicked');
            //$rootScope.closeAllModals();
        }

        $rootScope.popupSetInterval = function (seton) {
            if (seton && ($rootScope.getPopupPromise == undefined || $rootScope.getPopupPromise.valueOf().$$state.status == 2)) {
                $rootScope.getPopups();
                $rootScope.getPopupPromise = $interval($rootScope.getPopups, 30000);
            }
            else if (!seton) {
                $interval.cancel($rootScope.getPopupPromise);
            }
        }

        $rootScope.setPopupAsApproved = function (notificationID, hasApproved) {
            storageService.removeSessionItem('mustApprovePopup', true);
            storageService.removeSessionItem('mustApproveNotificationID', true);
            generalService.general.updatePopupEventApproval({ PlayerId: $rootScope.getPlayer().PlayerId, NotificationID: notificationID, HasApproved: hasApproved }).then(
                function (data) {
                    $rootScope.checkResponse({ response: data, location: 'general', closeOnError: true });
                },
                function (err) {
                    $rootScope.checkResponse({ response: data, location: 'general', closeOnError: true });
                });
        }


        $rootScope.acceptCookiesDisclaimer = function () {
            postToAnalytics('ClientSite', 'AcceptCookiesDisclaimer', 'Player accepted cookies disclaimer');
            $rootScope.cookiesDisclaimerClass = "cookies_law_close";
            $timeout(function () {
                storageService.setItem('acceptCookies', true);
                $rootScope.acceptCookies = true;
            }, 200);
        }

        $rootScope.playModeID = function () {
            return ($rootScope.playMode == 'casino' ? 706 : 707);
        }

        $rootScope.openCasino = function () {
            postToAnalytics('ClientSite', 'OpenCasino', 'Player opened Casino mode');
            //$rootScope.closeAllModals();
            if ($rootScope.playMode != 'casino') {
				dataService.Games(null);
                $rootScope.playMode = 'casino';
                $rootScope.setCookie("playMode", $rootScope.playMode);

                $window.scrollTo(0, 1);
                dataService.Promotions();
            }
            $rootScope.sideMenuOpened = false;
        }

        $rootScope.openSport = function () {
            postToAnalytics('ClientSite', 'OpenSport', 'Player opened Sport mode');
            if ($rootScope.isSportEnabled()) {
                if ($rootScope.playMode != 'sport') {
                    $rootScope.playMode = 'sport';
                    $rootScope.setCookie("playMode", $rootScope.playMode);
                    dataService.Promotions();
                }
                $rootScope.initSport();
                $window.scrollTo(0, 1);
                //$rootScope.closeAllModals();
            }
            $rootScope.sideMenuOpened = false;
        }

        function handleMessageFromSportIframe(e) {
            if (e.origin.indexOf("sportsbook") > 0) {
                console.log(e);
                console.log(e.data.type + "-" + e.data.value);

                postToAnalytics('ClientSite', 'MessageFromSportIframe', 'Sport Iframed sent a message to be handled. Message: ' + e.data.type + "-" + e.data.value);

                switch (e.data.type) {
                    case "applicationReady":
                        break;
                    case "login":
                        $rootScope.setForm('login');
                        break;
                    case "register":
                        $rootScope.openRegistration()
                        break;
                    case "deposit":
                        $rootScope.setForm('cashier-menu', 'deposit');
                        break;
                    case "balance":
                        $rootScope.getPlayerBalance();
                        break;
                    case "windowSize":
                        console.log("iframe size:" + e.data.value.width + "x" + e.data.value.height);
                        break;
                    case "bodyHeight":
                        console.log("iframe body height changed to:" + e.data.value);
                        break;
                }
            }
        }
        function convertRemToPixels(rem) {
            return rem * parseFloat(getComputedStyle(document.documentElement).fontSize);
        }
		
        $rootScope.initSport = function () {
            try {
                document.domain = window.location.hostname; // "luckyprocasino.com"; // "casino-pp.net";	
            }
            catch (e) {

            }

            if ($rootScope.isLoggedIn()) {
                var playerData = $rootScope.getPlayer();
            }

			var currlng;

			switch ($rootScope.locale.toLowerCase()) {
				case "de-de":
					currlng = "ger";
					break;
				case "sv-sv":
					currlng = "swe";
					break;
				case "ar-ar":
					currlng = "arb";
					break;
				case "ja-jp":
					currlng = "jpn";
					break;
				default:
					currlng = "eng";
					break;
			}
			var url = window.PPconfig.urlSportsBookBC.replace("[PLATFORM]", ($rootScope.isMobile() ? "mobile" : "web")).replace("[PLAYERID]", (playerData ? playerData.PlayerId : "")).replace("[TOKEN]", (playerData ? playerData.Token : "anonymous"));
			url = url.replace("[LANG]", currlng);
			var sportParams = $rootScope.getCookie("sportParams");
			if (sportParams != null && typeof sportParams != undefined && sportParams !== "") {
				try {
					url += '&' + Base64.decode(decodeURIComponent(sportParams));
					$rootScope.setCookie("sportParams", "");
				}
				catch (e) {
					logger.error("Error while trying to decode sportParams.", e);
				}
			}

			angular.element(document.getElementById('sportsbookcontainer')).empty();
			$rootScope.loadScriptSport(url, true, 'bcsportsbook');

			$rootScope.gamesMinHeight = (window.document.documentElement.clientHeight - ($rootScope.headerHeightNumber() * parseFloat(getComputedStyle(document.documentElement).fontSize))) + 'px';

            bindEvent(window, 'message', handleMessageFromSportIframe);

            $rootScope.setRealityCheck();

            $rootScope.getPlayerBalancePromise = $interval($rootScope.getPlayerBalance, 5000);
        }

        $rootScope.initSportDS = function () {
            document.domain = "casino-pp.net";
            if ($rootScope.isLoggedIn()) {
                var playerData = $rootScope.getPlayer();
                $rootScope.setCookie('sb', playerData.Token);
            }

            var url = window.PPconfig.urlSportsBookDS.replace("[PLATFORM]", ($rootScope.isMobile() ? "sb" : "sb"));
            //angular.element(document.getElementById('sportsbookcontainer')).empty();
            //$rootScope.loadScriptSport(url, true, 'bcsportsbook');
     
            $rootScope.ds_url = $sce.trustAsResourceUrl(url);
            $rootScope.gamesMinHeight = (window.document.documentElement.clientHeight - ($rootScope.headerHeightNumber() * parseFloat(getComputedStyle(document.documentElement).fontSize))) + 'px';

            $rootScope.setRealityCheck();

            $rootScope.getPlayerBalancePromise = $interval($rootScope.getPlayerBalance, 5000);
        }

        $rootScope.loadScriptSport = function (url, override, id, type, charset) {
            if (type === undefined) type = 'text/javascript';
            if (url) {
                var script = document.querySelector("script[id*='" + id + "']");
                if (!script || override) {
                    var heads = document.getElementsByTagName("head");
                    if (heads && heads.length) {
                        var head = heads[0];
                        if (head) {
                            if (script && override) {
                                head.removeChild(script);
                            }

                            script = document.createElement('script');
                            if (id) {
                                script.setAttribute('id', id);
                            }
                            script.setAttribute('src', url);
                            script.setAttribute('type', type);
                            script.setAttribute('defer', 'defer');
                            if (charset) script.setAttribute('charset', charset);
                            head.appendChild(script);
                        }
                    }
                }
                return script;
            }
        };

        //#endregion

        //#region Modals

        $rootScope.initPage = function (validateToken) {
        }

        $rootScope.setForm = function (form, params, className) {
			postToAnalytics('ClientSite', 'SetForm', 'Player changed form to: ' + form + '. params: ' + params);

            if (typeof ($solitics) !== 'undefined')
                $solitics.onPageEnter(form, null);

            if (typeof (_smartico) != 'undefined' && _smartico.identify)
                _smartico.event('client_action', { action: 'setForm', form: form, params: params })

            if (className != 'side_menu') {
                $rootScope.sideMenuOpened = false;
            }

            if ($rootScope.currentForm == form && (params == null || params == '') || form == 'lobby') {
                if ($rootScope.formOpen) {
                    $rootScope.closeModalForm();
                }
            }
            else {
                $rootScope.openModalForm(form, params, className);
            }
        }
		
		$rootScope.redirectTo = function (form) {
            $window.location.href = '/#/' + form;
        }

        $rootScope.openModalForm = function (form, params, className) {

            if (form.indexOf("registration") >= 0 && [67, 115, 138, 152, 153, 154, 170, 171, 144, 145].includes($rootScope.label.label_id)) {
                popupServices.openMessage({ title: 'registration', text1: 'registration_not_allowed' }, this);
                return;
            }

            if ($rootScope.isLoggedIn()) {
                $rootScope.getPlayerBalance();
            }

            if ($rootScope.formPopupOpen) {
                $rootScope.closeModalPopupForm();
            }

            $rootScope.currentForm = form;

            $rootScope.bodyClass = "body_no_scroll";// + ($rootScope.isApple() ? "_apple" : "");
            $rootScope.formOpen = true;
            $rootScope.modalFormClass = (form == "registration1" ? 'reg_promo reg_promo_' + $rootScope.playMode : "");
            if ($rootScope.isSmallMobileAndLoggedIn()) {
                $rootScope.modalFormClass += " top_after_big_header"
            }
            if ($rootScope.gameOpen) {
                $rootScope.modalFormClass += " top_abs"
            }



            $rootScope.formOpen = true;
            $rootScope.modalContentClass = (className ? className : (form.indexOf("-menu") > 0 ? 'modal_content_container_menu' : ''));
            $rootScope.formParams = params;

            dataService.trackAnalyticEvent($rootScope.getPlayer(), ["pageUrl", "event", "eventInfo", "eventType"], [$location.path(), "openForm", $rootScope.currentForm, $rootScope.formParams]);
            $rootScope.formTemplate = 'templates/' + form + '.html?v=915';

            //if (typeof ($solitics) !== 'undefined')
                //$solitics.onPageEnter(form + (params ? ('-' + params) : ''), null);

            if (typeof (_smartico) != 'undefined' && _smartico.identify)
                _smartico.event('client_action', { action: 'openModalForm', form: form, params: params })
        }

        $rootScope.closeModalForm = function () {
            $rootScope.formOpen = false;
            $rootScope.formTemplate = '';
            $rootScope.currentForm = 'lobby';

            $rootScope.bodyClass = "body_scroll";

            if ($rootScope.showRealityCheckAccountOpen) {
                $rootScope.showRealityCheckAccountOpen = false;
                $rootScope.realityCheckContinue();
            }
        }

        $rootScope.openModalPopupForm = function (action, params) {
			if (!$rootScope.formPopupOpen){
				openForm(action, params);
			}
			else{
				$rootScope.closeModalPopupForm();
				setTimeout(function () {
					openForm(action, params);
				}, 10);
			}
        }
		
		function openForm(action, params){
			$rootScope.formPopupOpen = true;
			$rootScope.modalPopupContentClass = "modalPopupContent";
			$rootScope.formParams = params;
			$rootScope.formPopupTemplate = 'templates/' + action + '.html?v=912';

			if (typeof ($solitics) !== 'undefined')
				$solitics.onPageEnter(action + (params ? ('-' + params) : ''), null);

			if (typeof (_smartico) != 'undefined' && _smartico.identify)
				_smartico.event('client_action', { action: 'openModalPopupForm', form: action, params: params });
		}

        $rootScope.closeModalPopupForm = function () {
            $rootScope.formPopupOpen = false;
            $rootScope.formPopupTemplate = '';
            $rootScope.currentForm = 'lobby';
            //$timeout(function () { $window.dispatchEvent(new Event("resize")); }, 50);
        }

        $rootScope.openModal = function (url, title) {

            var modalCaption = document.querySelectorAll("#modalCaption")[0];
            var modalFrame = document.querySelectorAll("#modalFrame")[0];
            var modalIFrame = document.querySelectorAll("#modalIFrame")[0];

            var header = document.querySelectorAll("#header")[0];
            modalFrame.style.top = header.style.height;
            modalFrame.style.display = "block";
            modalIFrame.src = url;
            modalCaption.innerHTML = title;
        }

        $rootScope.closeModal = function () {
            var modalFrame = document.querySelectorAll("#modalFrame")[0];
            var modalIFrame = document.querySelectorAll("#modalIFrame")[0];
            $rootScope.currentForm = 'lobby';
            modalIFrame.src = '';
            modalFrame.style.display = "none";
            dataService.setParam("inGame", false);
        }

        $rootScope.openModalIFrame = function (title, url, style) {
            postToAnalytics('ClientSite', 'OpenModalIFrame', 'iFrame is opened with title: ' + title + ', URL: ' + url);
            $rootScope.iframeOpen = true;
            $rootScope.iframeUrl = $sce.trustAsResourceUrl(url);
            $rootScope.iframeCaption = $rootScope.lexicon[title];
            if (style) {
                $rootScope.iframeStyle = style;
            }

            if (typeof ($solitics) !== 'undefined')
                $solitics.onPageEnter(title + '-' + url, null);

            if (typeof (_smartico) != 'undefined' && _smartico.identify)
                _smartico.event('client_action', { action: 'openModalIFrame', form: url, title: title })
        }

        $rootScope.closeModalIFrame = function (title, url) {
            if (title || url)
                postToAnalytics('ClientSite', 'CloseModalIFrame', 'iFrame is closed with title: ' + title + ', URL: ' + $sce.valueOf(url));
            $rootScope.iframeOpen = false;
            $rootScope.iframeUrl = '';
            $rootScope.currentForm = 'lobby';
        }

        $rootScope.scrollModalToTop = function () {
            angular.element(document.getElementById('modalForm'))[0].scrollTop = 0;
        }

        $rootScope.closeAllModals = function () {
            $rootScope.currentForm = 'lobby';
            if ($rootScope.formOpen) {
                $rootScope.closeModalForm();
            }
            if ($rootScope.formPopupOpen) {
                $rootScope.closeModalPopupForm();
            }
            if ($rootScope.iframeOpen) {
                $rootScope.closeModalIFrame();
            }
        }

        $rootScope.closeSideMenu = function () {
            $rootScope.sideMenuOpened = false;
        }

        $rootScope.isModalOpen = function () {
            return ($rootScope.formOpen || $rootScope.formPopupOpen || $rootScope.gameOpen || $rootScope.iframeOpen || $rootScope.sideMenuOpened);
        }

        $rootScope.bodyClass = function () {
            return (isModalOpen() ? (isApple() ? "body_no_scroll_apple" : "body_no_scroll") : "");
        }


        $rootScope.openInfoWindow = function (code) {
            window.open($rootScope.getLobbyUrl() + "/#info/" + code);
        }

        //#endregion

        //#region Games

        $rootScope.openInitialGame = function (mode, game) {
            if (!$rootScope.Games) {
                $timeout(function () { $rootScope.openInitialGame(mode, game); }, 1000); return;
            }
            $rootScope.gameClicked(mode, game);
        }

        $rootScope.validateOpenGame = function (mode, game) {
            var result = false;
            if (!game.GameName) {
                return dataService.GamesDict(game).then(function (data) {
                    return new $q(function (resolve) {
                        resolve(validateOpenGamePrivate(game, mode));
                    });
                });
            }
            else if (game) {
                return new $q(function (resolve) { resolve(validateOpenGamePrivate(game, mode)); });
            }
        }

        function validateOpenGamePrivate(game, mode) {
            var result = false;

            if (!$rootScope.isLoggedIn()) {
                if ($rootScope.jurisdictionId == 721 || mode == 'real') {
                    storageService.setSessionItem('startupgame', { mode: mode, game: game.ServerGameID }, true);
                    if (storageService.getItem('loginUserData', true)) {
                        $rootScope.setForm('login');
                    }
                    else {
                        $rootScope.openRegistration()
                    }
                }
                else {
                    result = true;
                }
            }
            else {
                var player = $rootScope.getPlayer();
                if (player.Account.GameBalance <= 0 && game.GameID != player.FreeGameID && mode == 'real') {
                    $rootScope.setForm('cashier-menu', 'deposit');
                }
                else if (mode == 'demo' && (!player.IsFTD && $rootScope.jurisdictionId == 721)) {
                    $rootScope.setForm('cashier-menu', 'deposit');
                }
                else if ((game.GameTypeID == 3 || game.GameTypeID == 6) && !player.IsFTD) {
                    popupServices.openConfirm({ title: 'playReal', text1: 'only_real_play', button1Text: 'depositNow', button2Text: 'cancel', showButton2: true }, this, true, false,
                        function () {
                            $rootScope.setForm('cashier-menu', 'deposit');
                        });
                }
                else {
                    result = true;
                }

            }
            return result;
        }

        $rootScope.gameClicked = function (mode, game) {

            switch (mode) {
                case 'demo':
                case 'real':
                    $rootScope.validateOpenGame(mode, game).then(function (response) {
                        if (response == true)
                            $rootScope.openGame(mode, game);
                    });
                    break;
                case 'popup':
                    if ($rootScope.isMobile()) {
                        $rootScope.openGamePopup(game);
                    }
                    break;
            }

            if (typeof ($solitics) !== 'undefined')
                $solitics.onPageEnter(game, null);

            if (typeof (_smartico) != 'undefined' && _smartico.identify)
                _smartico.event('client_action', { action: 'gameClicked', mode: mode, game: game })
        }

        $rootScope.checkPlayerSoftBlock = function () {
            var playerData = $rootScope.getPlayer();
            if (playerData && playerData.BlockType == 'SoftBlock') {
                popupServices.openMessage({ title: 'softBlock_title', text1: 'softBlock_text' }, this);
                postToAnalytics('ClientSite', 'PlayerSoftBlock', 'Player is Soft blocked');
                return true;
            }
            return false;
        }

        $rootScope.openGameByID = function (mode, gameid) {
            dataService.GamesDictIDs(gameid).then(function (game) { $rootScope.openGame(mode, game); });
        }


        $rootScope.openGame = function (mode, game) {
            if (!$rootScope.checkPlayerSoftBlock()) {
                if (!game.GameName) {
                    dataService.GamesDict(game).then(function (game) {
                        openGamePrivate(game, mode);
                    });
                }
                else if (game) {
                    openGamePrivate(game, mode);
                }
            }
        }

        function openGamePrivate(game, mode) {
            $rootScope.closeAllModals();
            dataService.trackAnalyticEvent($rootScope.getPlayer(), ["pageUrl", "event", "eventInfo", "eventType"], [$location.path(), "openGame", game.GameName, mode]);
            if (!$rootScope.isMobile()) {

                if (game.BonusBetDisabled) {
                    popupServices.openMessage({ title: 'bonusBetDisabled_title', text1: 'bonusBetDisabled_text' }, this, true);
                }
                var modalFrame = document.querySelectorAll("#modalFrame")[0];
                $rootScope.mode = mode;
                $rootScope.game = game;
                $rootScope.gameOpen = true;
                $rootScope.playClass = "play_open";
                $rootScope.bodyClass = "body_no_scroll" + ($rootScope.isApple() ? "_apple" : "");
                modalFrame.style.display = "block";
                dataService.setParam("inGame", true);
                $rootScope.gameViewTemplate = 'templates/components/play' + ($rootScope.isMobile() ? '-mobile' : '') + '.html?v=912';
                if (game.ProviderID != 2 && game.ProviderID != 10 && game.ProviderID != 11) {
                    $rootScope.setRealityCheck();
                }
                $rootScope.getPlayerBalancePromise = $interval($rootScope.getPlayerBalance, 5000);
                $rootScope.$broadcast('gameSet');
            }
            else {
                $rootScope.showLoader();
                window.location.href = $rootScope.prepareGameUrlNEW(mode, game);
            }
        }


        $rootScope.setRealityCheck = function () {
            var playerData = $rootScope.getPlayer();
            if (playerData && playerData.SessionLimit && playerData.SessionLimit >= 1) {
                if ($rootScope.showRealityCheckPromise == undefined || $rootScope.showRealityCheckPromise.valueOf().$$state.status == 2) {
                    $rootScope.sessionLimit = playerData.SessionLimit * 60;
                    $rootScope.sessionElapsed = $rootScope.getSecondsFromLogin();
                    if ($rootScope.sessionLimit > $rootScope.sessionElapsed) {
                        $rootScope.sessionLeft = $rootScope.sessionLimit - $rootScope.sessionElapsed;
                    }
                    else {
                        $rootScope.sessionLeft = $rootScope.sessionLimit - ($rootScope.sessionElapsed % $rootScope.sessionLimit);
                    }
                    $rootScope.showRealityCheckPromise = $timeout($rootScope.showRealityCheck, $rootScope.sessionLeft * 1000);
                }
            }

        }

        $rootScope.validateFeatureAvailableToUser = function (formName) {
            if (!isActiveCountry) {
                popupServices.openMessage({ title: 'feature_not_allowed_in_region_title', text1: 'feature_not_allowed_in_region_text' }, this);
            }
            else {
                $rootScope.setForm(formName);
            }
        }

        $rootScope.openRegistration = function () {
            $rootScope.validateFeatureAvailableToUser('registration1');
        }

        $rootScope.openTrustly = function () {
            var tpi = dataService.GetTrustlyStatus();
            if (tpi && tpi.Status == "Registration") {
                $rootScope.setForm('trustly-registration');
            }
            else {
                $rootScope.setForm('trustly-cashier');
            }
        }

        $rootScope.depositClicked = function (depositCode, amount) {
            var isOk = false;
            if (!$rootScope.isLoggedIn()) {
                if (storageService.getItem('loginUserData', true)) {
                    $rootScope.setForm('login');
                }
                else {
                    $rootScope.openRegistration();
                }
				storageService.setSessionItem('openInitialForm', { modal: 'deposit', param: depositCode }, true, 4);
            }
             else {
                if ($rootScope.formOpen) {
                    $rootScope.closeModalForm();
                    setTimeout(function () {
                        $rootScope.setForm('cashier-menu', { modal: 'deposit', depositCode: depositCode, amount: amount });
                    }, 10);
                }
                else
                    $rootScope.setForm('cashier-menu', { modal: 'deposit', depositCode: depositCode, amount: amount });                
            }
        }


        $rootScope.verifyIdClicked = function () {
            var isOk = false;
            if (!$rootScope.isLoggedIn()) {
                if (storageService.getItem('loginUserData', true)) {
                    $rootScope.setForm('login');
                }
                else {
                    $rootScope.openRegistration();
                }
            }
            else {
                $rootScope.setForm('cashier-menu', 'verify-id');
            }
        }

        $rootScope.showDepositRedirectIframe = function (data) {
            postToAnalytics('ClientSite', 'DepositRedirectIframe', 'Player is redirected to 3D deposit iframe');
            $rootScope.$broadcast('showDepositRedirectIframe', data);
        }

        $rootScope.prepareGameUrlNEW = function (mode, game) {
            var playerData = $rootScope.getPlayer();
            var currlng = ($rootScope.locale.split('-')[0]).toLowerCase();
            var lobbyUrl = $rootScope.getLobbyUrl();
            var isMobile = $rootScope.isMobile();
            var currency = (playerData && playerData.Currency.CurrencyCode ? playerData.Currency.CurrencyCode : $rootScope.currency);
            var country = (playerData && playerData.Country.CountryIntlCode ? playerData.Country.CountryIntlCode : $rootScope.country.CountryIntlCode);

            switch (game.ProviderID) {
                case 1:
                    var gameid = game.ProviderTitle;
                    var tokenparam = (mode == 'real' ? "AuthToken=" + playerData.Token + "&" : "");

                    var csiddemo = window.PPconfig.urlPlayMGSCSIDDemo;
                    if ($rootScope.jurisdictionId == 721) {
                        var csid = window.PPconfig.urlPlayMGSCSIDRealUK;
                        var appid = window.PPconfig.urlPlayMGSAppIDUK;
                    }
                    else {
                        var csid = window.PPconfig.urlPlayMGSCSIDReal;
                        var appid = window.PPconfig.urlPlayMGSAppID;
                    }
                    if (!isMobile && game.ServerGameID.indexOf("HTML5") == -1) {
                        var url = window.PPconfig.urlPlayMGS;
                        url = url.replace("[CSID]", (mode == 'real' ? csid : csiddemo));
                        url = url.replace("[TOKENPARAM]", tokenparam);
                        url = url.replace("[APPID]", appid);
                        url = url.replace("[GAMEID]", gameid);
                        url = url.replace("[LANG]", currlng.toUpperCase());
                    }
                    else {
                        var url = window.PPconfig.urlPlayMGSMobile;
                        var lobbyname = ($rootScope.jurisdictionId == 721 ? window.PPconfig.urlPlayMGSMobileLobbyNameUK : window.PPconfig.urlPlayMGSMobileLobbyName);
                        url = url.replace("[LOBBYNAME]", lobbyname);
                        url = url.replace("[CSID]", (mode == 'real' ? csid : csiddemo));
                        url = url.replace("[TOKENPARAM]", tokenparam);
                        url = url.replace("[GAMEID]", gameid);
                        url = url.replace("[LANG]", currlng.toUpperCase());
                        url = url.replace("[CURRENCY]", currency);
                        url = url.replace("[LOBBYURL]", lobbyUrl);
                        url = url.replace("[BANKINGURL]", lobbyUrl + '/#deposit');
                        url = url.replace("[ISDEMO]", mode == 'demo');

                        if (playerData) {
                            $rootScope.putCookieGeneralOnDomain("ppplayerid", playerData.PlayerId);
                            $rootScope.putCookieGeneralOnDomain("pptoken", playerData.Token);
                            if (playerData.SessionLimit && playerData.SessionLimit >= 1) {
                                $rootScope.putCookieGeneralOnDomain("pplogintime", storageService.getItem('login_time'));
                                $rootScope.putCookieGeneralOnDomain("ppsessionlimit", playerData.SessionLimit);
                            }
                            if ($rootScope.jurisdictionId == 721) {
                                $rootScope.putCookieGeneralOnDomain("ppcheckfundschange", 'true');
                                $rootScope.putCookieGeneralOnDomain("ppcheckfundsdetailsurl", lobbyUrl + "#/info/bonus");
                            }
                        }
                    }
                    break;
                case 2:
                    var url = window.PPconfig.urlPlayNYX;
					var jurisdiction;
                    var nyxlang = (currlng == "sv" ? "sv_se" : (currlng == "de" ? "de_de" : (currlng == "ar" ? "ar_ar" : "en_gb")));
                    var realpart = (mode == 'real' && playerData ? window.PPconfig.urlPlayNYXRealPart.replace("[PLAYERID]", playerData.PlayerId).replace("[TOKEN]", playerData.Token) : "");
					
					switch ($rootScope.jurisdictionId) {
						case 721:
						jurisdiction = "UK";
						break;
						case 722:
						jurisdiction = "MT";
						break;
						case 723:
						jurisdiction = "CW";
						break;
					}

                    url = url.replace("[CURRENCY]", currency);
                    url = url.replace("[LANG]", nyxlang);
                    url = url.replace("[GAMEID]", game.ProviderTitle);
                    url = url.replace("[CSID]", window.PPconfig.urlPlayNYXCSID);
                    url = url.replace("[MODE]", mode);
                    url = url.replace("[REALMODE]", realpart);
					url = url.replace("[JURISDICTION]", jurisdiction);


                    if (isMobile || game.OpenDesktopAsMobile) {
                        url = url + "&clienttype=html5"; //&lobbyurl=" + lobbyUrl + "&responsiblegaming_url=" + encodeURIComponent(lobbyUrl + '/#responsible');
                        if (isMobile) {
                            url = url + "&lobbyurl=" + lobbyUrl + "&responsiblegaming_url=" + encodeURIComponent(lobbyUrl + '/#responsible');
                        }
                        if (playerData && playerData.SessionLimit && playerData.SessionLimit >= 1) {
                            var sessionLimit = playerData.SessionLimit * 60;
                            var sessionElapsed = $rootScope.getSecondsFromLogin();
                            sessionElapsed = (sessionElapsed % sessionLimit);
                            url = url + "&realitycheck_uk_elapsed=" + Math.round(sessionElapsed) + "&realitycheck_uk_limit=" + sessionLimit + "&realitycheck_uk_proceed=&realitycheck_uk_exit=&realitycheck_uk_history=" + lobbyUrl;
                        }
                    }

                    break;
                case 3:
                    url = "netent.html?game=" + game.ServerGameID + "&token=" + (mode == "demo" ? "DEMO-" : "") + (playerData ? playerData.GameToken : "1234567890-" + currency) + "&isdemo=" + (mode == "real" ? "false" : "true") + "&curr=" + currency + "&lang=" + currlng + "&lobby=" + encodeURIComponent(lobbyUrl) + "&playerid=" + (playerData ? playerData.PlayerId : '') + "&playertoken=" + (playerData ? playerData.Token : '') + "&isuk=" + ($rootScope.jurisdictionId == 721);
                    if (isMobile) {
                        url = url + "&ismobile=true";
                        if (playerData && playerData.SessionLimit && playerData.SessionLimit >= 1) {
                            url += "&session=" + playerData.SessionLimit + "&sessionseconds=" + $rootScope.getSecondsFromLogin();
                        }
                    }

                    if (game.ServerGameID != game.ProviderTitle) {
                        url += "&liveid=" + game.ProviderTitle;
                    }
                    break;
                case 4:
                    var url = window.PPconfig.urlPlayEyecon;
                    var realpart = (mode == 'real' && playerData ? window.PPconfig.urlPlayEyeconRealPart.replace("[PLAYERID]", playerData.PlayerId).replace("[TOKEN]", playerData.Token).replace("[PLAYERNAME]", playerData.FirstName) : "");

                    url = url.replace("[CURRENCY]", currency);
                    url = url.replace("[LANG]", currlng);
                    url = url.replace("[GAMEID]", game.ProviderTitle);
                    url = url.replace("[MODE]", (mode == 'real' ? 'cash' : 'demo'));
                    url = url.replace("[REALMODE]", realpart);

                    if (isMobile) {
                        url = url + "&homeURL=" + lobbyUrl;
                        if (playerData && playerData.SessionLimit && playerData.SessionLimit >= 1) {
                            var sessionLimit = playerData.SessionLimit * 60;
                            var sessionElapsed = $rootScope.getSecondsFromLogin();
                            sessionElapsed = (sessionElapsed % sessionLimit);
                            url = url + "&RealityCheckRemaining=" + sessionElapsed + "&RealityCheckFrequency=" + Math.round(sessionLimit) + "&SessionDuration=" + sessionElapsed;
                        }
                        else {
                            url = url + "&RealityCheckFrequency=-1";
                        }
                    }


                    if ($rootScope.freeSpins && $rootScope.freeSpins.GameId == game.GameID) {
                        url = url + "&bonusPlayPromotionCode=" + $rootScope.freeSpins.OfferName + "&bonusReason=" + $rootScope.freeSpins.FreeSpinsOfferId;
                        $rootScope.freeSpins = {};
                    }
                    if ($rootScope.jurisdictionId == 721) {
                        url = url + "&bnstcurl=" + decodeURIComponent(lobbyUrl + "#/info/bonus");
                    }

                    break;
                case 5:
                    var url = window.PPconfig.urlSportsBook.replace("[PLAYERID]", (mode == 'real' ? playerData.PlayerId : "")).replace("[TOKEN]", (mode == 'real' ? playerData.Token : ""));
                    url = url.replace("[LANG]", currlng);
                    break;
                case 6:
                    var url = window.PPconfig.urlPlayWazdan;
                    var realpart = (mode == 'real' && playerData ? window.PPconfig.urlPlayWazdanRealPart.replace("[LICENSE]", ($rootScope.jurisdictionId == 721 ? "ukgc" : "mga")).replace("[TOKEN]", playerData.Token) : "");
                    url = url.replace("[GAMEID]", game.ProviderTitle);
                    url = url.replace("[MODE]", mode);
                    url = url.replace("[LANG]", currlng);
                    url = url.replace("[PLATFORM]", (isMobile ? "mobile" : "desktop"));
                    url = url.replace("[LOBBYURL]", lobbyUrl);
                    url = url.replace("[REALMODE]", realpart);
                    url = url.replace("[CURRENCY]", currency);


                    if (isMobile && playerData && playerData.SessionLimit && playerData.SessionLimit >= 1) {
                        var sessionLimit = playerData.SessionLimit;
                        var sessionElapsed = $rootScope.getSecondsFromLogin() / 60;
                        sessionElapsed = (sessionElapsed % sessionLimit);
                        realitycheck = "&rc_startInterval=" + Math.round(sessionElapsed) + "&rc_interval=" + Math.round(sessionLimit) + "&rc_transactionUrl=" + encodeURIComponent(lobbyUrl + '/#gamehistory') + "&rc_closeGameUrl=" + encodeURIComponent(lobbyUrl);

                        url = url + realitycheck;
                    }

                    break;
                case 7:
                    url = "tomhorn.html?game=" + game.ServerGameID + "&isdemo=" + (mode == "real" ? "false" : "true") + "&curr=" + currency + "&lang=" + currlng + "&playerid=" + (playerData ? playerData.PlayerId : '111111') + "&playertoken=" + (playerData ? playerData.Token : 'xxxxxx') + "&isuk=" + ($rootScope.jurisdictionId == 721) + (isMobile ? "&ismobile=true" : "") + "&lobby=" + lobbyUrl;
                    break;
                case 8:
                    url = "magnet.html?game=" + game.ServerGameID + "&isdemo=" + (mode == "real" ? "false" : "true") + "&curr=" + currency + "&lang=" + currlng + "&playerid=" + (playerData ? playerData.PlayerId : '111111') + "&playertoken=" + (playerData ? playerData.Token : 'xxxxxx') + "&isuk=" + ($rootScope.jurisdictionId == 721)  + "&lobby=" + lobbyUrl;
                    break;

                case 9:
                    var groovelang = "en_us";// $rootScope.locale.replace("-", "_");// (currlng == "sv" ? "sv_se" : (currlng == "de" ? "de_de" : (currlng == "ar" ? "ar_ar" : "en_gb")));
                    var url = window.PPconfig.urlPlayGroove;
                    var opId;

                    var timestamp = new Date();
					var jur = "UK";
					switch ($rootScope.jurisdictionId) {
						case 721:
						jur="UK";
						opId = window.PPconfig.urlPlayGrooveOperatorId;
						break;
						case 722:
						jur="Malta";
						opId = window.PPconfig.urlPlayGrooveOperatorId;
						break;
						case 723:
						jur="Curacao";
						opId = window.PPconfig.urlPlayGrooveOperatorIdCuracao;
						break;
						
					}

                    url = url.replace("[OPERATORID]", opId);
                    url = url.replace("[PLAYERID]", (playerData ? playerData.PlayerId : "9999999"));
                    url = url.replace("[TOKEN]", opId + "_" + (playerData ? playerData.Token : "9999999") + "_" + timestamp.getTime());
                    url = url.replace("[PLAYERCOUNTRY]", country);
                    url = url.replace("[LICENSE]", jur);
                    url = url.replace("[CURRENCY]", currency);
                    url = url.replace("[LANG]", groovelang);
                    url = url.replace("[GAMEID]", game.ProviderTitle);
                    url = url.replace("[MODE]", mode);
                    url = url.replace("[LOBBYURL]", lobbyUrl);
                    url = url.replace("[DEVICETYPE]", (isMobile ? "mobile" : "desktop"));
                    url = url.replace("[REALMODE]", realpart);
                    break;
                case 10:
                    var url = window.PPconfig.urlPlayGenii;
                    var locale = $rootScope.locale;//(currlng == "sv" ? "sv-se" : (currlng == "de" ? "de-de" : "en-gb"));
                    var realpart = (mode == 'real' && playerData ? window.PPconfig.urlPlayGeniiRealPart.replace("[PLAYERID]", playerData.PlayerId).replace("[TOKEN]", playerData.Token) : "");


                    url = url.replace("[MODE]", (mode == 'real' ? "" : "/Demo"));
                    url = url.replace("[MOBILE]", (isMobile ? "mobile/" : ""));
                    if (isMobile) {
                        url = url + (isMobile ? "&ReturnUrl=" + encodeURIComponent(lobbyUrl) : "");
                    }

                    url = url.replace("[LOCALE]", locale);
                    url = url.replace("[GAMEID]", game.ProviderTitle);
                    url = url.replace("[REALMODE]", realpart);

                    if ($rootScope.jurisdictionId == 721) {
                        url = url + "&PromotionUrl=" + decodeURIComponent(lobbyUrl + "#/info/bonus");
                        if (playerData && playerData.SessionLimit && playerData.SessionLimit >= 1) {
                            url = url + "&RealityCheckPeriodMinutes=" + playerData.SessionLimit;
                        }
                    }
                    break;
                case 11:
                    var realitycheck = "";
                    if (playerData && playerData.SessionLimit && playerData.SessionLimit >= 1) {
                        var sessionLimit = playerData.SessionLimit * 60;
                        var sessionElapsed = $rootScope.getSecondsFromLogin();
                        sessionElapsed = (sessionElapsed % sessionLimit);
                        realitycheck = "&rccurrentsessiontime=" + sessionElapsed + "&rcintervaltime=" + Math.round(sessionLimit) + "&rcaccounthistoryurl=" + encodeURIComponent(lobbyUrl + '/#gamehistory') + "&rchistoryurlmode=open&rcmga=" + playerData.SessionLimit;

                        realitycheck = "&realitycheck=" + encodeURIComponent(realitycheck);
                    }


                    url = "playngo.html?game=" + game.ProviderTitle + "&gameid=" + game.ServerGameID + "&token=" + (playerData ? playerData.GameToken : "111") + "&isdemo=" + (mode == "real" ? "false" : "true") + "&curr=" + currency + "&countrycode=" + country + "&lang=" + currlng + "&lobby=" + lobbyUrl + "&ismobile=" + isMobile + "&playerid=" + (playerData ? playerData.PlayerId : '') + "&playertoken=" + (playerData ? playerData.Token : '') + "&isuk=" + ($rootScope.jurisdictionId == 721 ? 'true' : 'false') + realitycheck;


                    break;
                case 12:
                    url = "anakatech.html?game=" + game.ServerGameID + "&isdemo=" + (mode == "real" ? "false" : "true") + "&name=" + (playerData ? playerData.FirstName : "") + "&balance=" + (playerData ? playerData.Account.GameBalance : "0") + "&country=" + country + "&curr=" + currency + "&lang=" + currlng + "&lobby=" + lobbyUrl + "&ismobile=" + isMobile + "&playerid=" + (playerData ? playerData.PlayerId : '') + "&token=" + (playerData ? playerData.Token : '');
                    if (isMobile && playerData && playerData.SessionLimit && playerData.SessionLimit >= 1) {
                        var sessionLimit = playerData.SessionLimit;
                        var sessionElapsed = $rootScope.getSecondsFromLogin() / 60;
                        sessionElapsed = (sessionElapsed % sessionLimit);
                        realitycheck = "&sessionseconds=" + Math.round(sessionElapsed) + "&session=" + Math.round(sessionLimit);

                        url = url + realitycheck;
                    }

                    break;
            }

            return url;
        }

        $rootScope.openGamePopup = function (game) {
            popupServices.openGame({ button1Text: $rootScope.lexicon['playReal'], button2Text: $rootScope.lexicon['playDemo'], game: game, imageUrl: $rootScope.getGamesImagesUrl() + 'lobby/' + game.ImageID + '.jpg' }, this, function (mode) {
                $rootScope.gameClicked(mode, game);
            });
        }

        $rootScope.toggleFavouriteGame = function (game) {
            var player = $rootScope.getPlayer();
            game.IsFavourite = !game.IsFavourite;

            generalService.general.toggleFavouriteGame({
                "playerId": player.PlayerId, "gameId": game.GameID, "Token": player.Token
            }).then(
                function (data) {
                },
                function (data) {
                });
        }

        $rootScope.showRealityCheck = function () {
            $interval.cancel($rootScope.showRealityCheckPromise);
            if ($rootScope.isLoggedIn() && (dataService.getParam("inGame") || $rootScope.playMode == 'sport')) {
                if (document.getElementById('playIFrame')) {
                    var eyeconGameFrame = document.getElementById('playIFrame').contentWindow;
                    if (eyeconGameFrame) {
                        eyeconGameFrame.postMessage({ "name": "stopAutoplay" }, "*");
                    }
                }
                var message = $rootScope.lexicon['limits_RealityCheck_message'].replace("[SESSIONLIMIT]", $rootScope.sessionLimit / 60).replace("[SESSIONELAPSED]", Math.ceil($rootScope.getSecondsFromLogin() / 60));
                popupServices.openConfirm({ title: $rootScope.lexicon['limits_RealityCheck'], text1: message, button1Text: $rootScope.lexicon['limits_RealityCheck_close'], button2Text: $rootScope.lexicon['limits_RealityCheck_continue'], showButton3: true, button3Text: $rootScope.lexicon['limits_RealityCheck_account'], showButton2: true }, this, false, true, $rootScope.realityCheckAction, $rootScope.realityCheckContinue);
            }
        }

        $rootScope.realityCheckAction = function (action) {
            switch (action) {
                case 1:
                    if ($rootScope.playMode == 'sport') {
                        $rootScope.logoutAction();
                    }
                    else {
                        $rootScope.closeGame();
                    }
                    break;
                case 2:
                    $rootScope.showRealityCheckAccountOpen = true;
                    $rootScope.setForm('cashier-menu', 'table-games');
                    break;
            }
        }

        $rootScope.realityCheckContinue = function () {
            $interval.cancel($rootScope.showRealityCheckPromise);
            if ($rootScope.isLoggedIn()) {
                $rootScope.showRealityCheckPromise = $interval($rootScope.showRealityCheck, ($rootScope.getSecondsFromLogin() % $rootScope.sessionLimit) * 1000);
            }
        }

        $rootScope.closeGame = function () {
            postToAnalytics('ClientSite', 'CloseGame', 'Player closed the current opened game');
            $interval.cancel($rootScope.getPlayerBalancePromise);
            $interval.cancel($rootScope.showRealityCheckPromise);
            dataService.setParam("inGame", false);
            $rootScope.playClass = "play_close";
            $timeout(function () {
                $rootScope.gameViewTemplate = '';
                $rootScope.gameOpen = false;
                $rootScope.bodyClass = "body_scroll";
                $rootScope.formTemplate = '';
                $rootScope.getPlayerBalance();
            }, 50);
        }

        //#endregion

        //#region Helpers

        $rootScope.showLoader = function (loaderText) {
            dataService.setParam("showLoader", true);
            if (typeof loaderText !== 'undefined')
                dataService.setParam("loaderText", loaderText);
        }

        $rootScope.hideLoader = function () {
            dataService.setParam("showLoader", false);
            dataService.setParam("loaderText", null);
        }

        $rootScope.putCookieFromQueryString = function (name) {
            var value;
            value = getQueryStringValue(name);
            if (value != undefined && value.length > 0) {
                if (!$cookies.get($rootScope.labelName + '_' + name) || $rootScope.label.is_last_click_tracking) {
                    var expireDate = new Date();
                    expireDate.setDate(expireDate.getDate() + 30);
                    $cookies.put($rootScope.labelName + '_' + name, value, {
                        'expires': expireDate
                    });
                }
            }
        };

        $rootScope.getCookie = function (name) {
            if ($cookies.get($rootScope.labelName + '_' + name)) {
                return $cookies.get($rootScope.labelName + '_' + name);
            }
            else {
                return '';
            }
        };

        $rootScope.setCookie = function (name, value) {
            if (value != undefined && value.length > 0) {
                var expireDate = new Date();
                expireDate.setDate(expireDate.getDate() + 30);
                $cookies.put($rootScope.labelName + '_' + name, value, {
                    'expires': expireDate
                });
            }
        };








        $rootScope.putCookieGeneral = function (name, value) {
            if (value != undefined) {
                var expireDate = new Date();
                expireDate.setDate(expireDate.getDate() + 30);
                $cookies.put(name, value, {
                    'expires': expireDate
                });
                $cookies.put(name, value);
            }
        };

        $rootScope.putCookieGeneralOnDomain = function (name, value) {
            if (value != undefined) {
                var expireDate = new Date();
                expireDate.setDate(expireDate.getDate() + 30);
                $cookies.put(name, value, {
                    'expires': expireDate, 'domain': 'casino-pp.net'
                });
                $cookies.put(name, value);
            }
        };

        $rootScope.loadScript = function (url, override, id, type, charset) {
            if (type === undefined) type = 'text/javascript';
            if (url) {
                var script = document.querySelector("script[src*='" + url + "']");
                if (!script || override) {
                    var heads = document.getElementsByTagName("head");
                    if (heads && heads.length) {
                        var head = heads[0];
                        if (head) {
                            if (script && override) {
                                head.removeChild(script);
                            }

                            script = document.createElement('script');
                            if (id) {
                                script.setAttribute('id', id);
                            }
                            script.setAttribute('src', url);
                            script.setAttribute('type', type);
                            if (charset) script.setAttribute('charset', charset);
                            head.appendChild(script);
                        }
                    }
                }
                return script;
            }
        };

        $rootScope.changeLanguage = function (lng) {
            postToAnalytics('ClientSite', 'ChangeLanguage', 'Player changed language to: ' + lng);
            document.location = $rootScope.getLobbyUrl() + '&lang=' + lng;
        }

        $rootScope.setLocale = function () {
            var locale = ($rootScope.locale ? $rootScope.locale : 'en-gb');

            postToAnalytics('ClientSite', 'setLocale', 'Player language is: ' + locale);
            storageService.setItem('locale', locale);
            $rootScope.languageId = locales[locale];
            $rootScope.lexicon = lexicon;
        };

        $rootScope.onChangeLocale = function (loc) {
            if (loc != $rootScope.locale) {
                postToAnalytics('ClientSite', 'onChangeLocale', 'Player changed locale to: ' + loc);
                document.location = $rootScope.getLobbyUrl() + '&lang=' + loc;
            }
        }

        $rootScope.getLobbyUrl = function () {
            var lobbyUrl = window.location.protocol + "//" + window.location.host + (window.PPconfig.addNameToURL ? "/" + $rootScope.labelName : "") + "?s=1";
            if (getQueryStringValue("tracker").length > 0) {
                lobbyUrl = lobbyUrl + "&tracker=" + getQueryStringValue("tracker");
            }
            if (getQueryStringValue("dynamic").length > 0) {
                lobbyUrl = lobbyUrl + "&dynamic=" + getQueryStringValue("dynamic");
            }
            if (getQueryStringValue("clickid").length > 0) {
                lobbyUrl = lobbyUrl + "&clickid=" + getQueryStringValue("clickid");
            }
            if (getQueryStringValue("btag").length > 0) {
                lobbyUrl = lobbyUrl + "&btag=" + getQueryStringValue("btag");
            }
            if (getQueryStringValue("idfa").length > 0) {
                lobbyUrl = lobbyUrl + "&idfa=" + getQueryStringValue("idfa");
            }
            return lobbyUrl;
        }

        $rootScope.openChat = function () {
            try {
                postToAnalytics('ClientSite', 'OpenChat', 'Player opened chat');
                var elem = document.getElementById('comm100-button').childNodes[0].contentWindow.document.getElementsByClassName("chatButton")[0];
                if (elem && elem.click) {
                    elem.click();
                }
            }
            catch (e) { }
            if (typeof ($solitics) !== 'undefined')
                $solitics.onPageEnter('Chat', null);

            if (typeof (_smartico) != 'undefined' && _smartico.identify)
                _smartico.event('client_action', { action: 'openChat' })
        }

        $rootScope.isMobile = function () {
            return isMobileDevice;
        }

        $rootScope.isApple = function () {
            var isApple = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream;
            //postToAnalytics('ClientSite', 'IsAppleDevice', 'Player device is Apple: ' + isApple ? 'Yes' : 'No');
            return isApple;
        };

        $rootScope.isSmallMobile = function () {
            return (window.innerWidth <= 700);
        }

        $rootScope.isSmallMobileAndLoggedIn = function () {
            return $rootScope.isSmallMobile() && $rootScope.isLoggedIn();
        }

        $rootScope.bannerHeight = function () {
            var height = 350;
            if (!$rootScope.showBanner) {
                height = 20;
            }
            else {
                if (window.innerWidth <= 800) {
                    height = 250;
                }
                else if (window.innerWidth <= 1024) {
                    height = 250;
                }
                else if (window.innerWidth <= 1280) {
                    height = 300;
                }
                else if (window.innerWidth <= 1560) {
                    height = 350;
                }
            }
            return height;
        }

        $rootScope.headerHeight = function () {
            return $rootScope.headerHeightNumber() + 'rem';
        }

        $rootScope.headerHeightNumber = function () {
            var height = 11.8;

            if ($rootScope.isSmallMobileAndLoggedIn()) {
                height += 11.8;
            }

            if ($rootScope.isMobile() && $rootScope.isSportEnabled()) {
                height += 5;
            }

            return height;
        }


        $rootScope.getSecondsFromLogin = function () {
            var login_time = storageService.getItem('login_time');
            var dtLogin = new Date(login_time);
            var dtNow = new Date();
            var timeDiff = dtNow - dtLogin;
            timeDiff /= 1000;
            var seconds = Math.round(timeDiff);
            return seconds;
        }

        $rootScope.toggleFullscreen = function () {
            $rootScope.globalParams.fullScreen = !$rootScope.globalParams.fullScreen;
            if (!document.fullscreenElement && !document.mozFullScreenElement && !document.webkitFullscreenElement && !document.msRequestFullScreen) {
                if (document.documentElement.requestFullscreen) {
                    document.documentElement.requestFullscreen();
                } else if (document.documentElement.msRequestFullScreen) {
                    document.documentElement.msRequestFullScreen();
                } else if (document.documentElement.mozRequestFullScreen) {
                    document.documentElement.mozRequestFullScreen();
                } else if (document.documentElement.webkitRequestFullscreen) {
                    document.documentElement.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT);
                }
            } else {
                if (document.cancelFullScreen) {
                    document.cancelFullScreen();
                } else if (document.documentElement.msCancelFullScreen) {
                    document.documentElement.msCancelFullScreen();
                } else if (document.mozCancelFullScreen) {
                    document.mozCancelFullScreen();
                } else if (document.webkitCancelFullScreen) {
                    document.webkitCancelFullScreen();
                }
            }
        }

        $rootScope.getGeneralImage = function (type, name, local) {
            if (name) {
                if (local) {
                    return window.location.origin + '/img/vip/' + name.toUpperCase() + '.png';
                }
                else {
                    return window.PPconfig.urlCDNImages + type + '/' + name + '.png';
                }
            }
        }

        $rootScope.getGamesImagesUrl = function () {
            return window.PPconfig.urlGamesImages + ($rootScope.jurisdictionId == 723 ? 'curacao/' : '');
        }

        function getQueryStringValue(key) {
            return unescape(window.location.search.replace(new RegExp("^(?:.*[&\\?]" + escape(key).replace(/[\.\+\*]/g, "\\$&") + "(?:\\=([^&]*))?)?.*$", "i"), "$1"));
        }

        //#endregion

    }]);;
'use srtict';

function CreditCardBins() {
    var ukCreditCardBins = [370024
							,370053
							,370055
							,370259
							,370279
							,371781
							,371782
							,371783
							,371784
							,371785
							,371786
							,371787
							,371788
							,371789
							,371790
							,371791
							,374200
							,374201
							,374202
							,374203
							,374204
							,374205
							,374206
							,374207
							,374208
							,374209
							,374210
							,374211
							,374212
							,374213
							,374214
							,374215
							,374216
							,374217
							,374218
							,374219
							,374220
							,374221
							,374222
							,374223
							,374224
							,374225
							,374226
							,374227
							,374228
							,374229
							,374230
							,374231
							,374232
							,374234
							,374235
							,374236
							,374237
							,374238
							,374239
							,374240
							,374241
							,374242
							,374243
							,374244
							,374245
							,374246
							,374247
							,374248
							,374249
							,374250
							,374251
							,374252
							,374253
							,374254
							,374255
							,374256
							,374257
							,374258
							,374259
							,374260
							,374261
							,374262
							,374263
							,374264
							,374266
							,374268
							,374269
							,374270
							,374271
							,374272
							,374273
							,374274
							,374275
							,374276
							,374277
							,374279
							,374280
							,374281
							,374282
							,374283
							,374284
							,374285
							,374286
							,374287
							,374288
							,374289
							,374290
							,374291
							,374292
							,374293
							,374294
							,374295
							,374296
							,374297
							,374298
							,374299
							,374323
							,374383
							,374388
							,374396
							,374397
							,374398
							,374500
							,374501
							,374503
							,374507
							,374520
							,374521
							,374522
							,374523
							,374542
							,374544
							,374555
							,374560
							,374562
							,374570
							,374576
							,374580
							,374581
							,374582
							,374585
							,374587
							,374588
							,374590
							,374591
							,374592
							,374596
							,374600
							,374601
							,374602
							,374603
							,374604
							,374605
							,374606
							,374607
							,374608
							,374609
							,374614
							,374690
							,374691
							,374692
							,374693
							,374788
							,376013
							,376014
							,376015
							,376469
							,376682
							,376683
							,376684
							,377064
							,377065
							,377130
							,377131
							,377132
							,377311
							,377312
							,377313
							,377383
							,377384
							,377385
							,377386
							,377387
							,377388
							,377389
							,377390
							,377391
							,377393
							,379100
							,379101
							,379102
							,379103
							,379104
							,379105
							,379106
							,379107
							,379108
							,379109
							,379196
							,379372
							,379399
							,379881
							,379883
							,379884
							,379918
							,379921
							,400880
							,401039
							,401040
							,401066
							,401343
							,401344
							,402014
							,402193
							,402396
							,402397
							,402399
							,403543
							,403620
							,404783
							,404970
							,404971
							,404972
							,407461
							,408265
							,408267
							,408268
							,410094
							,410610
							,410785
							,410970
							,411298
							,412983
							,412984
							,412985
							,413761
							,414257
							,414258
							,414259
							,414260
							,414691
							,415373
							,415929
							,416368
							,417467
							,417727
							,420350
							,420570
							,422278
							,422279
							,423346
							,424242
							,425719
							,425749
							,425757
							,425854
							,426353
							,426393
							,426510
							,427300
							,427342
							,427700
							,430000
							,430001
							,430567
							,431980
							,434578
							,434713
							,434714
							,434715
							,434716
							,434963
							,439744
							,442162
							,442260
							,442401
							,443227
							,443604
							,444005
							,444006
							,445536
							,445537
							,445958
							,445974
							,446234
							,447773
							,447810
							,447814
							,448405
							,448407
							,448411
							,448445
							,448448
							,448463
							,448527
							,448570
							,448957
							,448958
							,449352
							,449353
							,450197
							,450198
							,450199
							,450303
							,450783
							,450823
							,450906
							,450924
							,450925
							,451171
							,451172
							,453910
							,453929
							,453937
							,453953
							,453975
							,453976
							,454103
							,454305
							,454312
							,454361
							,454365
							,454369
							,454420
							,454438
							,454443
							,454495
							,454634
							,454638
							,455025
							,455206
							,455279
							,455280
							,455281
							,455299
							,455572
							,455598
							,455647
							,455653
							,455783
							,455796
							,455861
							,456000
							,456072
							,456073
							,456849
							,456983
							,459394
							,459569
							,460191
							,460900
							,461015
							,461208
							,462719
							,462726
							,463221
							,463222
							,465590
							,465659
							,465959
							,465960
							,467062
							,469751
							,469752
							,469846
							,471505
							,471507
							,471521
							,471522
							,471530
							,471532
							,471558
							,471559
							,471565
							,471566
							,471567
							,474341
							,474342
							,474535
							,477106
							,477591
							,477596
							,477597
							,477916
							,477917
							,478599
							,479295
							,479741
							,479742
							,480240
							,480925
							,481132
							,481565
							,481690
							,481691
							,481692
							,481693
							,481694
							,481695
							,481696
							,481697
							,481698
							,481744
							,481747
							,481749
							,481918
							,481919
							,481920
							,482171
							,482172
							,482173
							,482181
							,482186
							,482187
							,482188
							,482194
							,482443
							,482872
							,482873
							,483209
							,483210
							,485473
							,485474
							,485738
							,485766
							,486403
							,486404
							,486416
							,486430
							,486446
							,486450
							,486451
							,486459
							,486483
							,486484
							,486485
							,486496
							,489054
							,489394
							,489396
							,490918
							,491007
							,491600
							,491601
							,491605
							,491624
							,491795
							,491834
							,492083
							,492902
							,492906
							,492910
							,492912
							,492913
							,492914
							,492915
							,492916
							,492919
							,492920
							,492928
							,492929
							,492930
							,492933
							,492937
							,492938
							,492939
							,492940
							,492941
							,492942
							,492943
							,492944
							,492945
							,492946
							,492947
							,492948
							,492949
							,492950
							,492951
							,492952
							,492953
							,492954
							,492955
							,492956
							,492957
							,492958
							,492959
							,492960
							,492970
							,492971
							,492972
							,492973
							,492974
							,492975
							,492976
							,492977
							,492978
							,492979
							,492980
							,492981
							,492982
							,492983
							,492984
							,492985
							,492986
							,492987
							,492988
							,492989
							,492990
							,492991
							,492992
							,492993
							,492994
							,492995
							,492996
							,492997
							,492998
							,492999
							,493844
							,493847
							,493848
							,494120
							,496668
							,498823
							,498834
							,499921
							,499922
							,510108
							,510111
							,510141
							,511580
							,511689
							,511691
							,512006
							,512428
							,512591
							,512687
							,513082
							,513371
							,513388
							,513796
							,515111
							,515454
							,515469
							,515471
							,515481
							,515484
							,515487
							,515494
							,515496
							,515497
							,515503
							,515506
							,515515
							,515522
							,515524
							,515527
							,515528
							,515535
							,515541
							,515552
							,516146
							,516362
							,516363
							,516428
							,516489
							,516569
							,517204
							,517205
							,517229
							,517233
							,517234
							,517235
							,517236
							,517237
							,517238
							,517239
							,517240
							,517249
							,517264
							,517382
							,517383
							,517384
							,518027
							,518055
							,518084
							,518085
							,518142
							,518581
							,518625
							,518645
							,518652
							,518675
							,518791
							,519159
							,519345
							,519660
							,519763
							,519958
							,520311
							,520326
							,520641
							,520650
							,520675
							,520933
							,520941
							,520954
							,521028
							,521045
							,521401
							,521421
							,521422
							,521424
							,521434
							,521436
							,521539
							,521540
							,521541
							,521542
							,521543
							,521544
							,521545
							,521546
							,521548
							,521549
							,521550
							,521754
							,521804
							,522438
							,522634
							,522948
							,523067
							,523257
							,523642
							,523749
							,524679
							,524819
							,524830
							,524848
							,524850
							,524851
							,525302
							,525303
							,525641
							,525659
							,525682
							,525685
							,525730
							,526800
							,526812
							,527154
							,527252
							,527264
							,527273
							,527476
							,527669
							,528166
							,528181
							,528183
							,528186
							,528189
							,528190
							,528191
							,528192
							,528193
							,528194
							,528682
							,528683
							,528684
							,528689
							,529012
							,529494
							,529505
							,529507
							,529511
							,529513
							,529514
							,529916
							,529930
							,529932
							,530120
							,530121
							,530122
							,530123
							,530124
							,530125
							,530126
							,530127
							,530128
							,530268
							,530418
							,530788
							,530850
							,530855
							,530928
							,530958
							,531007
							,531045
							,531049
							,531065
							,531200
							,531214
							,531387
							,531546
							,531672
							,531710
							,531713
							,531726
							,532123
							,532150
							,532823
							,532865
							,532866
							,532927
							,532941
							,532956
							,533033
							,533039
							,533040
							,533141
							,533142
							,533143
							,533144
							,533145
							,533161
							,533162
							,533163
							,533165
							,533200
							,534552
							,535823
							,536386
							,536839
							,537034
							,537648
							,537681
							,538015
							,538090
							,538149
							,539162
							,540011
							,540055
							,540100
							,540152
							,540153
							,540222
							,540242
							,540243
							,540245
							,540438
							,540439
							,540440
							,540441
							,540442
							,540453
							,540454
							,540458
							,540463
							,540575
							,540585
							,540591
							,540635
							,540758
							,540964
							,541002
							,541170
							,541361
							,541603
							,541647
							,541674
							,541914
							,542004
							,542006
							,542011
							,542195
							,542348
							,542463
							,542502
							,542554
							,542598
							,542615
							,542786
							,542851
							,542854
							,543035
							,543046
							,543105
							,543228
							,543245
							,543268
							,543269
							,543298
							,543394
							,543429
							,543458
							,543460
							,543468
							,543470
							,543474
							,543477
							,543478
							,543480
							,543482
							,543484
							,543556
							,543557
							,543699
							,543731
							,543824
							,544182
							,544388
							,544559
							,544568
							,544608
							,544626
							,544630
							,544806
							,544853
							,544920
							,544939
							,544954
							,545043
							,545100
							,545140
							,545141
							,545142
							,545147
							,545156
							,545186
							,545329
							,545415
							,545442
							,545452
							,545460
							,545494
							,545570
							,545578
							,545605
							,545627
							,545664
							,545668
							,545673
							,545710
							,545836
							,545843
							,545852
							,545960
							,545975
							,545995
							,546014
							,546016
							,546019
							,546083
							,546096
							,546097
							,546259
							,546260
							,546261
							,546262
							,546780
							,546811
							,546895
							,547116
							,547183
							,547184
							,547185
							,547186
							,547187
							,547188
							,547198
							,547347
							,547353
							,547354
							,547356
							,547367
							,547410
							,547676
							,547853
							,548019
							,548023
							,548041
							,548099
							,548507
							,548786
							,549023
							,549205
							,549289
							,549430
							,549440
							,549550
							,549732
							,550142
							,550450
							,550534
							,550566
							,552068
							,552073
							,552085
							,552148
							,552157
							,552188
							,552213
							,552516
							,552560
							,552562
							,552585
							,552766
							,552774
							,552779
							,552788
							,552895
							,552936
							,553014
							,553017
							,553018
							,553027
							,553248
							,553267
							,553285
							,553297
							,553298
							,553299
							,553300
							,553314
							,553315
							,553325
							,553326
							,553371
							,553397
							,553403
							,553408
							,553411
							,553412
							,553421
							,553422
							,553459
							,553480
							,553482
							,553483
							,553485
							,553497
							,553502
							,553503
							,553504
							,553505
							,553506
							,553507
							,553508
							,553509
							,553510
							,553518
							,553519
							,553521
							,553529
							,553536
							,553538
							,553541
							,553542
							,553543
							,553545
							,553546
							,553547
							,553549
							,553551
							,553554
							,553556
							,553558
							,553560
							,553562
							,553564
							,553566
							,553568
							,553570
							,553572
							,553575
							,553577
							,553580
							,554381
							,554397
							,554475
							,554536
							,554539
							,554544
							,554756
							,554987
							,555026
							,555045
							,555146
							,555147
							,555274
							,555277
							,555278
							,555279
							,555374
							,555880
							,555901
							,556084
							,556085
							,556092
							,556093
							,556103
							,556107
							,556110
							,556311
							,556314
							,556335
							,556343
							,556352
							,556354
							,556360
							,556362
							,556592
							,556625
							,556677
							,556740
							,556755
							,556793
							,556799
							,556851
							,556852
							,556892
							,556902
							,556950
							,556951
							,556969
							,557098
							,557806
							,557824
							,557843
							,557894
							,558364
							,558709
							,558717
							,558718
							,558719
							,558721
							,558722
							,558731
							,558734
							,558736
							,558754
							,558764
							,558773
							,558798
							,559097
							,559523
							,559525
							,559529
							,559530
							,559534
							,559538
							,559539
							,559541
							,559542
							,559543
							,559670
							,559890
							,559941
							,559960
							,559978]

	this.getUkBins = function () { return ukCreditCardBins };
};
;
'use strict';

let isSubscribed = false;
let swRegistration = null;
var swRegistrationLoaded = new Event('swRegistrationLoaded');

function firEvent(eventName) {
    var event;

    if (document.createEvent) {
        event = document.createEvent("HTMLEvents");
        event.initEvent(eventName, true, true);
    } else {
        event = document.createEventObject();
        event.eventType = eventName;
    }

    event.eventName = eventName;

    if (document.createEvent) {
        document.dispatchEvent(event);
    } else {
        document.fireEvent("on" + event.eventType, event);
    }
}

var uniqueSessionId = Math.floor((Math.random() * 1000000000000000) + 1);

function initializeWebPushUI(playerId, caller) {
    swRegistration.pushManager.getSubscription()
    .then(function (subscription) {
        isSubscribed = !(subscription === null);
        if (!isSubscribed)
            subscribeUser(playerId, caller);
        else
            updateSubscriptionOnServer(subscription, null, 'initializeWebPushUI');
    });
}

function subscribeUser(playerId, caller) {
    logger.info(uniqueSessionId + ' - Player is not subscribed yet. Asking for player permission.');
    postToAnalytics('PushNotification', 'AskPlayerPermission', 'Player: ' + playerId + ' - Browser shows prompt for allowing push notifications');
    sendMessageToSw('publicKeyForBrowser').then(function (applicationServerKey) {
        swRegistration.pushManager.subscribe({
            userVisibleOnly: true,
            applicationServerKey: applicationServerKey
        })
        .then(function (subscription) {
            updateSubscriptionOnServer(subscription, playerId, caller);
            isSubscribed = true;
            document.getElementsByClassName('pushNotificationsOverlay')[0].classList.add("ng-hide");
            logger.info(uniqueSessionId + ' - Player ' + playerId + ' is subscribed. Subscription: ' + JSON.stringify(subscription));
            postToAnalytics('PushNotification', 'PlayerApprovedPermission', 'Succeeded to subscribe the player ' + playerId);
			
			if (typeof (_smartico) != 'undefined' && _smartico.identify)
                _smartico.requestPushPermissions();
        })
        .catch(function (err) {
            document.getElementsByClassName('pushNotificationsOverlay')[0].classList.add("ng-hide");
            postToAnalytics('PushNotification', 'PlayerFailedPermission', 'Failed to subscribe the player ' + playerId);
            logger.error(uniqueSessionId + ' - Player ' + playerId + ' Failed to subscribe the player: ', JSON.stringify(err));
			
			if (typeof (_smartico) != 'undefined' && _smartico.identify)
                _smartico.requestPushPermissions();
        });
    });
}

function updateSubscriptionOnServer(subscription, playerId, caller) {
    document.getElementsByClassName('pushNotificationsOverlay')[0].classList.add("ng-hide");
    if (subscription) {
        var promise1 = sendMessageToSw('browser')
        var promise2 = sendMessageToSw('deviceType');
        Promise.all([promise1, promise2]).then(function (values) {
            var browserInfo = {
                browser_version: values[0].name,
                user_agent: navigator.userAgent,
                language: navigator.language,
                host: location.host,
                device: values[1],
                pe_ref_url: location.origin
            };
            var request = { playerId: playerId, browserInfo: JSON.stringify(browserInfo), isMobile: (values[1] == 'mobile' ? true : false), caller: caller };
            MakeAjaxRequest("/GetPlayerPushNotificationsToken", null, function (response) {
                if (response && response !== '') {
                    swRegistration.pushManager.getSubscription().then(function (subscription) {
                        request.guid = response;
                        request.subscription = JSON.stringify(subscription);
                        request.token = getCookie("gameServiceToken");
                        MakeAjaxRequest("/SubscribePlayerToPushNotifications", JSON.stringify(request), function (success) {
                            if (success)
                                postToAnalytics('PushNotification', 'SaveOrUpdatePlayerSubscriptionSuccess', 'Player ' + (request.playerId ? request.playerId : '(logged out)') + ' push notifications is allowed and saved on database');
                            else
                                postToAnalytics('PushNotification', 'SaveOrUpdatePlayerSubscriptionFailed', 'Player ' + (request.playerId ? request.playerId : '(logged out)') + ' push notifications faild to save to DB. No Guid in DB');
                        })
                    });
                }
                else
                    postToAnalytics('PushNotification', 'SaveOrUpdatePlayerSubscriptionGetTokenFailed', 'Player ' + (request.playerId ? request.playerId : '(logged out)') + ' push notifications get guid(token) request failed');
            });


        });
    }
}

var timeInterval;
var counter = 0;
setTimeout(function () {
    switch ('Chrome') {//should get it from browser function
        case "Safari":
            //if ('safari' in window && 'pushNotification' in window.safari) {
            //    //var perD = window.safari.pushNotification.permission(_peSd.safari.pushId);
            //    //if (perD.permission === 'default' || perD.permission === 'granted') {
            //    safariPermission(perD, function (perD) {
            //        if (perD.permission === 'granted') {
            //            permissionGranted(perD.deviceToken);
            //        }
            //    });
            //    //}
            //}
            break;
        default:
            //Notification.requestPermission().then(function (status) {
            //switch (status) {
            //case "granted":
            timeInterval = setInterval(function(){
                if (isGADefined() || counter == 10) {
                    clearInterval(timeInterval);
                    initSw();
                }
                else
                    counter++;
            }, 500);
            //}
            //});
            break;
    }
}, 2000);

var safariPermission = function (permissionData, callback) {
    window.safari.pushNotification.requestPermission(_peSd.api.safariApi, _peSd.safari.pushId, {
        "app_id": '3476hfgjgfhdj58903fgjhdk4590gdhg34859'
    }, callback)
};

var isGADefined = function(){
    return (typeof ga != 'undefined');
}

var initSw = function () {
	try {
		ga('create', 'UA-50289270-53', 'auto', 'WebPushNotifications');
		ga('WebPushNotifications.send', 'pageview');
	}
	catch (e) { }
    if ('serviceWorker' in navigator && 'PushManager' in window) {

        navigator.serviceWorker.addEventListener('message', function handler(event) {
            switch (event.data.command) {
                case 'logInfo':
                    logger.info(uniqueSessionId + ' - ' + event.data.message);
                    break;
                case 'logError':
                    logger.error(uniqueSessionId + ' - ' + event.data.message);
                    break;
                case 'analytics':
                    postToAnalytics('PushNotification', event.data.gaAction, event.data.gaLabel);
                    break;
            }
        });
        postToAnalytics('PushNotification', 'PushNotificationsSupported', navigator.userAgent);
        logger.info(uniqueSessionId + ' - Service Worker and Push is supported');
        navigator.serviceWorker.register('/sw.js?v=57')
        .then(function () {
            return navigator.serviceWorker.ready;
        })
        .then(function (swReg) {
            logger.info(uniqueSessionId + ' - Service Worker is registered.');
            swRegistration = swReg;

            try {
                firEvent('swRegistrationLoaded');
            }
            catch (e) {
                logger.error(uniqueSessionId + ' - firEvent("swRegistrationLoaded"); failed. Exception: ' + JSON.stringify(e));
            }
            //initializeWebPushUI();
        })
        .catch(function (error) {
            logger.error(uniqueSessionId + ' - Service Worker Error: ' + JSON.stringify(error));
        });
    } else {
        var _navigator = {};
        for (var i in navigator) _navigator[i] = navigator[i];
        logger.info(uniqueSessionId + ' - Push messaging is not supported. Browser navigator object: ' + JSON.stringify(_navigator));
        postToAnalytics('PushNotification', 'PushNotificationsNotSupported', navigator.userAgent);
    }
};

var postToAnalytics = function (category, action, label) {
    try {
        var playerId = (typeof playerObj !== 'undefined' && playerObj) ? playerObj.PlayerId : 'Not logged in';
        var message = 'Client session id: ' + uniqueSessionId + ', WL: ' + (typeof labelName == 'undefined' ? 'NaN' : labelName) + ', PlayerID: ' + playerId + '. ' + (label ? label : '')
        if (typeof ga !== 'undefined') {
            ga('WebPushNotifications.send', 'event', category, action, message);
        }
        //if (category !== 'PushNotification') {
            var callerTxt = getCallerMethod(3);
            logger.info(callerTxt + '. Action: ' + action + '. Message: ' + 'Client session id: ' + uniqueSessionId + ', WhiteLabel: ' + (typeof labelName == 'undefined' ? 'NaN' : labelName) + '. ' + (label ? label : ''));
        //}
    }
    catch (e) { }
}

function getCallerMethod (rowIndex) {
    try {
        throw new Error();
    }
    catch (e) {
        try {
            var methodRow = e.stack.split('at ')[rowIndex];
            var methodName = methodRow.split(' ')[0];
            if (methodName == 'postToAnalytics')
                return getCallerMethod(++rowIndex);
            return methodName.indexOf('http') > -1 ? '' : ('Method: ' + methodName);
        } catch (e) {
            return '';
        }
    }
}

var permissionGranted = function (subscription) {
    var promise1 = sendMessageToSw('browser')
    var promise2 = sendMessageToSw('deviceType');
    Promise.all([promise1, promise2]).then(function (values) {
        var browserInfo = {
            browser_version: values[0].name,
            user_agent: navigator.userAgent,
            language: navigator.language,
            host: location.host,
            device: values[1],
            pe_ref_url: location.origin
        };
        var subscription = JSON.stringify(subscription)
        var request = { playerId: playerId ? playerId : null, subscription: JSON.stringify(subscription), browserInfo: JSON.stringify(browserInfo) };

        MakeAjaxRequest("/GetPlayerToPushNotifications", JSON.stringify(request), function (response) {
            if (response && response !== '') {
                request.guid = response;

                MakeAjaxRequest("/SubscribePlayerToPushNotifications", JSON.stringify(request), function (success) {
                    if (success)
                        postToAnalytics('PushNotification', 'permissionGranted', 'Player ' + (request.playerId ? request.playerId : '(logged out)') + ' push notifications faild to save to DB. No Guid in DB');
                    else
                        postToAnalytics('PushNotification', 'permissionGranted', 'Player ' + (request.playerId ? request.playerId : '(logged out)') + ' push notifications is allowed and saved on database');
                })

            }
        });
    });
};


function MakeAjaxRequest(method, request, callback, isAsync, extraParams) {
    logger.info(uniqueSessionId + ' - MakeAjaxRequest called with method: ' + method + '. Request: ' + request);
    sendMessageToSw('serviceUrl').then(function (data) {
        var serviceUrl = data + 'Services/PushSubscriptionHelper.svc';
        logger.info(uniqueSessionId + ' - MakeAjaxRequest serviceUrl: ' + serviceUrl);
        try {
            var xmlhttp;
            if (window.XMLHttpRequest) {
                // code for modern browsers
                xmlhttp = new XMLHttpRequest();
            } else {
                // code for old IE browsers
                xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
            }
            xmlhttp.open("POST", serviceUrl + method);
            xmlhttp.setRequestHeader("Content-Type", "application/json");
            xmlhttp.send(request);

            xmlhttp.onreadystatechange = function () {
                if (xmlhttp.readyState === 4) {
                    if (xmlhttp.status === 200) {
                        var resp = xmlhttp.responseText;
                        var respJson = JSON.parse(resp);
                        callback(respJson);
                    } else {
                        callback(null);
                    }
                } else {
                }
            }
        } catch (err) {
            logger.error(uniqueSessionId + ' - MakeAjaxRequest failed! Error: ' + JSON.stringify(err));
        }
    });
}

function getCookie(name) {
    var v = document.cookie.match('(^|;) ?' + name + '=([^;]*)(;|$)');
    return v ? v[2] : null;
};
'use strict';

function isEmpty(value) {
    return angular.isUndefined(value) || value === '' || value === null || value !== value;
}
Math.log2 = Math.log2 || function (x) { return Math.log(x) * Math.LOG2E; };

progressPlayApp
    .directive('ngBlur', ['$parse', function ($parse) {
        return function (scope, element, attr) {
            /*         var fn = $parse(attr['ngBlur']);
                    element.bind('blur', function (event) {
                        scope.$apply(function () {
                            fn(scope, { $event: event });
                        });
                    }); */
        }
    }])

    .directive('ngFocus', ['$parse', function ($parse) {
        return function (scope, element, attr) {
            /*         var fn = $parse(attr['ngFocus']);
                    element.bind('focus', function (event) {
                        scope.$apply(function () {
                            fn(scope, { $event: event });
                        });
                    }); */
        }
    }])

    .directive('restrictPattern', function () {
        return {
            restrict: 'A',
            require: 'ngModel',
            link: function (scope, iElement, iAttrs, controller) {
                controller.$parsers.push(function (inputValue) {
                    if (inputValue == undefined) return '';
                    //var transformedInput = inputValue.replace(/[^a-z]/g, '');
                    var transformedInput = inputValue.replace(new RegExp(iAttrs.restrictPattern, 'g'), '');
                    if (transformedInput !== inputValue) {
                        controller.$setViewValue(transformedInput);
                        controller.$render();
                    }
                    return transformedInput;
                });
            }
        }
    })

    .directive('ngMultiple', function () {
        return {
            restrict: 'A',
            scope: {
                ngMultiple: '='
            },
            link: function (scope, element) {
                var unwatch = scope.$watch('ngMultiple', function (newValue) {
                    if (newValue) {
                        element.attr('multiple', 'multiple');
                    } else {
                        element.removeAttr('multiple');
                    }
                });
            }
        };
    })

    .filter('toArray', function () {
        return function (obj, addKey) {
            if (!angular.isObject(obj)) return obj;
            if (addKey === false) {
                return Object.keys(obj).map(function (key) {
                    return obj[key];
                });
            } else {
                return Object.keys(obj).map(function (key) {
                    var value = obj[key];
                    return angular.isObject(value) ?
                        Object.defineProperty(value, '$key', {
                            enumerable: false,
                            value: key
                        }) : {
                            $key: key,
                            $value: value
                        };
                });
            }
        };
    })

    .filter('numOfKeys', function () {
        return function (object) {
            return Object.keys(object).length;
        }
    })

    .filter('orderByPositiveFirst', [function () {
        return function (array, sortPredicate, reverseOrder) {
            if (!Array.isArray(array)) return array;
            if (!sortPredicate) return array;

            array.sort(function (a, b) {
                var valueA = a[sortPredicate];
                var valueB = b[sortPredicate];

                if (valueA < 1) return 1;
                if (valueA === valueB) return 0;
                if (valueA > valueB) return 2;

                return -1;

            });

            return array;
        }
    }])

    .filter('orderWithFirstValue', [function () {
        return function (dict, sortPredicate, reverseOrder) {
            if (!dict instanceof Object) return dict;
            if (!sortPredicate) return dict;

            var orderedList = {};
            orderedList[sortPredicate] = dict[sortPredicate];

            for (var key in dict) {
                if (dict.hasOwnProperty(key) && key != sortPredicate) {
                    orderedList[key] = dict[key];
                }
            }
            return orderedList;
        }
    }])

    .filter('trusted', ['$sce', function ($sce) {
        return function (url) {
            return $sce.trustAsResourceUrl(url);
        };
    }])

    .filter('getByProperty', function () {
        return function (propertyName, propertyValue, collection) {
            var i = 0,
                len = collection.length;
            for (; i < len; i++) {
                if (collection[i][propertyName] == +propertyValue) {
                    return collection[i];
                }
            }
            return null;
        }
    })

    .filter('startFrom', function () {
        return function (input, start) {
            start = +start; //parse to int
            return input.slice(start);
        }
    })

    .directive('topClass', ['$window', function ($window) {
        return {
            restrict: 'A',

            link: function (scope, element, attrs) {
                var topClass = attrs.topClass,
                    topAdd = attrs.topAdd,
                    topAfter = attrs.topAfter,
                    topPlatform = attrs.topPlatform;

                if (topPlatform == "both" || (topPlatform == "web" && !scope.$root.isMobile()) || (topPlatform == "mobile" && scope.$root.isMobile())) {
                    angular.element($window).on('scroll', function (e) {
                        var elem = $window.document.getElementById(topAfter);
                        if (elem) {
                            var height = elem.getBoundingClientRect().height;
                        }
                        else {
                            height = 1;
                        }


                        if ($window.pageYOffset > height - topAdd) {
                            element.addClass(topClass);
                        } else {
                            element.removeClass(topClass);
                        }
                    });
                }
            }
        };
    }])

    .directive('pcPromotions', function () {
        return {
            scope: {
                mode: '@'
            },
            templateUrl: '/templates/components/promotions.html?v=925'
        };
    })


    .directive('pcLeaderboard', function () {
        return {
            scope: {
                mode: '@',
                leaderboardId: '='
            },
            templateUrl: '/templates/table-leaderboard.html?v=925'
        };
    })




    .directive('pcSportFeed', function () {
        return {
            restrict: 'E',
            scope: {
                sportFeed: '=',
                feedType: '=',
                openSport: '&onOpenSport'
            },
            templateUrl: '/templates/directives/sport-feed.directive.template.html',
            link: {
                post: function (scope, element, attrs) {
                    scope.limit = 0;
                    scope.startIndex = 0;
                    if (scope.sportFeed && scope.sportFeed.length > 0) {
                        scope.count = scope.sportFeed[scope.feedType].Games.length;

                        scope.shiftGames = function () {

                            scope.startIndex += 1;
                            if (scope.startIndex + 3 > scope.count) {
                                scope.startIndex = 0;
                            }
                            scope.$digest();
                        }

                        var beginInterval = setInterval(scope.shiftGames, 1000 * 5);
                    }
                }
            }
        }
    })


    .directive('bindHtmlCompile', ['$compile', function ($compile) {
        return {
            restrict: 'A',
            link: function (scope, element, attrs) {
                scope.$watch(function () {
                    return scope.$eval(attrs.bindHtmlCompile);
                }, function (value) {
                    element.html(value);
                    $compile(element.contents())(scope);
                });
            }
        };
    }])

    .directive('linkAction', function () {
        return {
            restrict: 'A',
            link: function (scope, elem, attrs) {
                //if (attrs.ngClick || attrs.href === '' || attrs.href === '#') {
                elem.on('click', function (e) {

                    if (attrs.linkAction != "undefined") {

                        switch (attrs.linkAction) {
                            case "form":
                                switch (attrs.linkParam) {
                                    case "deposit":
                                        scope.$root.depositClicked(attrs.depositCode);
                                        break;
                                    case "chat":
                                        scope.$root.openChat();
                                        break;
                                    default:
                                        scope.$root.setForm(attrs.linkParam);
                                        break;
                                }

                                break;
                            case "info":
                                scope.go(attrs.linkParam);
                                break;
                            case "info-new":
                                scope.$root.openModalPopupForm('info-main', attrs.linkParam);
                                break;
                            case "info-window":
                                scope.$root.openInfoWindow(attrs.linkParam);
                                break;
                            case "play":
                                scope.$root.closeModalForm();
                                scope.$root.gameClicked('real', attrs.linkParam);
                                break;
                            case "sport":
                                scope.$root.closeModalForm();
                                scope.$root.setCookie("sportParams", attrs.linkParam);
                                scope.$root.openSport();
                                break;
                        }
                    }
                    scope.$root.$digest();
                    e.preventDefault();
                });
            }
            //}
        };
    })

    .directive('scrollTo', function () {

        return {
            restrict: 'A',
            scope: {
                scrollTo: "@"
            },
            link: function (scope, $elm, attr) {
                $elm.on('click', function (e) {
                    var container = angular.element(document.getElementById('infoContent'));
                    var to = document.getElementById(scope.scrollTo);
                    angular.element(container)[0].scrollTop = angular.element(to)[0].offsetTop - 70;
                    e.preventDefault();
                });
            }
        }
    })

    .directive('match', ['$parse', function ($parse) {
        return {
            require: 'ngModel',
            link: function (scope, elem, attrs, ctrl) {
                scope.$watch(function () {
                    return $parse(attrs.match)(scope) === ctrl.$modelValue;
                }, function (currentValue) {
                    ctrl.$setValidity('mismatch', currentValue);
                });
            }
        };
    }])

    .directive('translate', ['$rootScope', function ($rootScope) {
        return {
            restrict: 'A',
            link: function (scope, elem, attrs) {
                if ($rootScope.lexicon == undefined)
                    elem[0].innerText = attrs.translate;
                else {
                    var target = $rootScope.lexicon[attrs.translate];
                    elem[0].innerText = target != undefined ? getTranslationWithPlaceholders(target) : attrs.translate;
                }

                function getTranslationWithPlaceholders(translation) {
                    if (translation.indexOf("[LABEL_TITLE]") > -1) {
                        var trans = $rootScope.lexicon["LabelTitle_" + $rootScope.label.label_id];
                        return translation.replace('[LABEL_TITLE]', (trans || $rootScope.label.label_title));
                    }
                    return translation;
                }

            }

        }
    }])

    .directive('ngMin', function () {
        return {
            restrict: 'A',
            require: 'ngModel',
            link: function (scope, elem, attr, ctrl) {

                var minValidator = function (value) {
                    var min = scope.$eval(attr.ngMin) || 0;
                    if (!isEmpty(value) && value < min) {
                        ctrl.$setValidity('ngMin', false);
                        return undefined;
                    } else {
                        ctrl.$setValidity('ngMin', true);
                        return value;
                    }
                };

                ctrl.$parsers.push(minValidator);
                ctrl.$formatters.push(minValidator);
            }
        };
    })

    .directive('ngMax', function () {
        return {
            restrict: 'A',
            require: 'ngModel',
            link: function (scope, elem, attr, ctrl) {

                var maxValidator = function (value) {
                    var max = scope.$eval(attr.ngMax) || Infinity;
                    if (!isEmpty(value) && value > max) {
                        ctrl.$setValidity('ngMax', false);
                        return undefined;
                    } else {
                        ctrl.$setValidity('ngMax', true);
                        return value;
                    }
                };

                ctrl.$parsers.push(maxValidator);
                ctrl.$formatters.push(maxValidator);
            }
        };
    })

    .directive('scriptLoad', ['angularLoad', function (angularLoad) {
        return {
            restrict: 'E',
            link: function (scope, elem, attr, ctrl) {
                if (typeof (attr.refresh) !== undefined)
                    attr.src = attr.src + '?v=' + (Math.floor(Math.random() * 100000) + 1);
                angularLoad.loadScript(attr.src);
                scope.$evalAsync();
            }
        };
    }])

    .filter('startFrom', function () {
        return function a(input, start) {
            start = +start; //parse to int
            if (input) {
                return input.slice(start);
            } else {
                return {

                };
            }
        }
    })

    .directive('carousel', ['$rootScope', 'storageService', '$window', '$timeout', function ($rootScope, storageService, $window, $timeout) {
        return {
            restrict: 'E',
            transclude: true,
            scope: {
                items: '=',
                imageUrlBuilder: '&',
                openPromotions: '&onOpenPromotions',
                promotionAction: '=',
                promotionClicked: '&onPromotionClicked',
                isVideoFile: '&isVideoFile',
                mode: '=',
                openInfo: '&onOpenInfo',
                showArrows: '=',
                autoplay: '='
            },
            templateUrl: '/templates/directives/carousel.directive.template.html?v=925',
            link: {
                post: function (scope, element, attrs) {
                    var play;
                    scope.showCarousel = false;
                    scope.currentPane = 0;

                    scope.$on('promotionsArrived', function (event, msg) {
                        $timeout(function () { scope.init(); }, 50);
                    })

                    scope.$on('loggedIn', function (event, msg) {
                        $timeout(function () { scope.init(); }, 50);
                    });

                    scope.$on('loggedOut', function (event, msg) {
                        $timeout(function () { scope.init(); }, 50);
                    });

                    angular.element($window).bind('load resize orientationchange', function () {
                        scope.initWidth();
                    });

                    scope.init = function () {
                        scope.showAllImages = false;
                        scope.initWidth();
                        scope.play();
                    };

                    scope.isImage = function (item) {
                        var url = scope.imageUrlBuilder({ promotion: item });
                        if (url.indexOf(".jpg") > 0 || url.indexOf(".png") > 0 || url.indexOf(".jpeg") > 0) {
                            return true;
                        }
                        return false;
                    };

                    scope.promotionCaption = function (promotion) {
                        if (promotion && promotion.promotion) {
                            return ($rootScope.isLoggedIn() ? (promotion.promotion.code.indexOf("-GAME:") > 0 ? $rootScope.lexicon["playNow"] : $rootScope.lexicon["depositNow"]) : ((storageService.getItem('loginUserData', true)) ? $rootScope.lexicon["loginNow"] : $rootScope.lexicon["joinNow"]));
                        }
                    }

                    scope.initWidth = function () {
                        scope.currentPane = 0;
                        scope.container = element.children()[0];
                        scope.panes = element.children().children()[0];
                        scope.paneWidth = scope.container.offsetWidth;
                        scope.paneCount = scope.items.length;
                        scope.indicators = new Array(scope.paneCount);
                        angular.forEach(scope.panes.children, function (pane, key) {
                            pane.style.width = scope.paneWidth + 'px';
                        })
                        scope.showCarousel = true;
                        scope.panes.style.left = '0px';
                        scope.showPane();
                    }

                    scope.promotionWidth = function () {
                        return scope.paneWidth + 'px';
                    }

                    function autoplay() {
                        scope.showAllImages = true;
                        if (scope.autoplay === true) {
                            scope.nextPane();
                        }
                    }

                    scope.play = function () {
                        play = setTimeout(autoplay, 7000);
                    };

                    scope.stop = function () {
                        clearTimeout(play);
                    };

                    scope.showPane = function () {

                        scope.panes.style.left = (-scope.currentPane * scope.paneWidth) + 'px';

                    }

                    scope.showPaneByIndex = function (index) {
                        scope.showAllImages = true;
                        if (index >= 0)
                            scope.currentPane = index;
                        scope.stop();
                        scope.showPane();
                        scope.play();
                    }

                    scope.nextPane = function () {
                        scope.showAllImages = true;
                        scope.stop();
                        scope.currentPane++;
                        if (scope.currentPane >= scope.items.length) { scope.currentPane = 0 }
                        scope.$evalAsync(scope.showPane());
                        scope.play();
                    };

                    scope.prevPane = function () {
                        scope.showAllImages = true;
                        scope.stop();
                        scope.currentPane--;
                        if (scope.currentPane <= -1) { scope.currentPane = scope.items.length - 1 }
                        scope.$evalAsync(scope.showPane());
                        scope.play();
                    };

                    scope.init();

                }
            }
        }
    }])
    .directive("gameBox", function () {
        return {
            link: function (scope, element) {
                element[0].style.height = element[0].style.width;
            }
        }
    })


    .directive('promotionsMenu', function () {
        return {
            restrict: 'E',
            scope: {
                items: '=',
                openChat: '&onOpenChat',
                closePromotions: '&onClosePromotions',
                openPromotion: '&onOpenPromotion',
                imageUrlBuilder: '&imageUrlBuilder',
                isVideoFile: '&isVideoFile',
                openInfo: '&onOpenInfo',
                slide: '&onSlide',
                currPromotion: '=',
                termsAndConditions: '=',
                promotionOpen: '=',
                bannerHeight: '=',
                bannerHeightMenu: '=',
                isApple: '=',
                loadJS: '&onLoadJS'
            },
            templateUrl: '/templates/directives/promotions-menu.directive.template.html?v=925'
        }
    })



    .directive('bigWinners', function () {
        return {
            restrict: 'E',
            scope: {
                winners: '=',
                openGame: '&onOpenGame'
            },
            templateUrl: '/templates/directives/big-winners.directive.template.html',
            link: function (scope, element) {
                scope.limit = 0;
                scope.begin = 0;
                var limitInterval, beginInterval;
                var delayUnit = 1000;

                function limitIntervalCallback() {
                    //if (scope.limit !== 1) {
                    //    scope.limit+=2;
                    //} else {
                    //    clearInterval(limitInterval);
                    //}
                    //scope.$digest();
                };

                function beginIntervalCallback() {
                    //scope.limit = 0;
                    if (scope.winners) {
                        if (scope.begin < scope.winners.length) {
                            scope.begin += 2;
                        } else {
                            scope.begin = 0;
                        }
                        //limitInterval = setInterval(limitIntervalCallback, delayUnit);
                        scope.$digest();
                    }
                }

                beginInterval = setInterval(beginIntervalCallback, delayUnit * 4);

                angular.element(element).bind('mouseenter', onMouseEnter);
                angular.element(element).bind('mouseleave', onMouseLeave);

                function onMouseEnter() {
                    clearInterval(beginInterval);
                    clearInterval(limitInterval);
                }

                function onMouseLeave() {
                    beginInterval = setInterval(beginIntervalCallback, delayUnit * 4);
                }

            }
        }
    })

    .directive('sideMenu', function () {
        return {
            restrict: 'E',
            templateUrl: '/templates/directives/side-menu.directive.template.html?v=925',
            controller: 'headerController'
        };
    })



    .directive('mediaSelect', function () {
        return {
            restrict: 'E',
            templateUrl: '/templates/directives/media-select.directive.template.html?v=925',
            scope: {
                jurisdictionId: '=',
                user: '=',
                showPartner: '=',
                lexicon: '='
            }
        };
    })




    .directive('languagesMenu', function () {
        return {
            restrict: 'E',
            templateUrl: '/templates/directives/languages-menu.directive.template.html?v=925',
            scope: {
                language: '=',
                onChangeLanguage: '&',
                showLanguageNames: '=',
                showLanguageFlags: '=',
                showLanguages: '='
            },
            controller: ['$scope', function ($scope) {

                $scope.changeLanguage = function (params) {
                    $scope.onChangeLanguage(params);
                    $scope.showLanguages = false;
                }
                $scope.expandLanguages = function (expand) {
                    if (!$scope.showLanguageNames) {
                        $scope.showLanguages = expand;
                    }
                };
                $scope.nameLang = function (lang) {
                    switch (lang) {
                        case 'en':
                            return 'english';
                        case 'de':
                            return 'german';
                        case 'sv':
                            return 'swedish';
                    }
                };
            }]
        }
    })

    .directive('localesMenu', ['$rootScope', function ($rootScope) {
        return {
            restrict: 'E',
            templateUrl: '/templates/directives/locales-menu.directive.template.html?v=925',
            scope: {
                locale: '=',
                locales: '=',
                onLocaleChanged: '=',
                showLocaleNames: '=',
                showLocaleFlags: '=',
                showLocales: '=',
            },
            controller: ['$scope', function ($scope) {
                $scope.changeLocale = function (param) {
                    $scope.onLocaleChanged(param);
                    $scope.showLocales = false;
                }
                $scope.locales = locales;
                $scope.isMobile = $rootScope.isMobile();
            }]
        }
    }])

    .directive('clickOff', ['$window', '$parse', function ($window, $parse) {
        return {
            restrict: 'A',
            link: function (scope, el, attr) {
                if (!attr.clickOff) {
                    return;
                }

                var ignore;
                if (attr.ignoreIf) {
                    ignore = $parse(attr.ignoreIf);
                }

                var nakedEl = el[0];
                var fn = $parse(attr.clickOff);

                var handler = function (e) {
                    if (nakedEl === e.target || nakedEl.contains(e.target) || (ignore && ignore(scope))) {
                        return;
                    }

                    scope.$apply(fn);
                };

                $window.addEventListener('click', handler, true);

                scope.$on('$destroy', function (e) {
                    $window.removeEventListener('click', handler);
                });
            }
        };
    }])

    .directive('numbersOnly', function () {
        return {
            require: 'ngModel',
            link: function (scope, element, attr, ngModelCtrl) {
                function fromUser(text) {
                    if (text) {
                        var transformedInput = text.replace(/[^0-9]/g, '');

                        if (transformedInput !== text) {
                            ngModelCtrl.$setViewValue(transformedInput);
                            ngModelCtrl.$render();
                        }
                        return transformedInput;
                    }
                    return undefined;
                }
                ngModelCtrl.$parsers.push(fromUser);
            }
        };
    })

    .directive('ccDashesInput', function () {
        return {
            require: 'ngModel',
            link: function (scope, element, attr, ngModelCtrl) {
                function fromUser(text) {

                    var transformedInput = text.replace(/\s+/g, '').replace(/[^0-9]/gi, '')
                    var matches = transformedInput.match(/\d{4,17}/g);
                    var match = matches && matches[0] || ''
                    var parts = []
                    for (var i = 0, len = match.length; i < len; i += 4) {
                        parts.push(match.substring(i, i + 4))
                    }

                    if (parts.length) {
                        transformedInput = parts.join('-');
                    }
                    ngModelCtrl.$setViewValue(transformedInput);
                    ngModelCtrl.$render();
                    return transformedInput;
                }
                ngModelCtrl.$parsers.push(fromUser);
            }
        };
    })

    .directive('fileDropzone', function () {
        return {
            restrict: 'A',
            scope: {
                file: '=',
                fileName: '='
            },
            link: function (scope, element, attrs) {
                var checkSize,
                    isTypeValid,
                    processDragOverOrEnter,
                    validMimeTypes;

                processDragOverOrEnter = function (event) {
                    if (event != null) {
                        event.preventDefault();
                    }
                    event.dataTransfer.effectAllowed = 'copy';
                    return false;
                };

                validMimeTypes = attrs.fileDropzone;

                checkSize = function (size) {
                    var _ref;
                    if (((_ref = attrs.maxFileSize) === (void 0) || _ref === '') || (size / 1024) / 1024 < attrs.maxFileSize) {
                        return true;
                    } else {
                        alert("File must be smaller than " + attrs.maxFileSize + " MB");
                        return false;
                    }
                };

                isTypeValid = function (type) {
                    if ((validMimeTypes === (void 0) || validMimeTypes === '') || validMimeTypes.indexOf(type) > -1) {
                        return true;
                    } else {
                        alert("Invalid file type.  File must be one of following types " + validMimeTypes);
                        return false;
                    }
                };

                element.bind('dragover', processDragOverOrEnter);
                element.bind('dragenter', processDragOverOrEnter);

                return element.bind('drop', function (event) {
                    var file, name, reader, size, type;
                    if (event != null) {
                        event.preventDefault();
                    }
                    reader = new FileReader();
                    reader.onload = function (evt) {
                        if (checkSize(size) && isTypeValid(type)) {
                            return scope.$apply(function () {
                                scope.file = evt.target.result;
                                if (angular.isString(scope.fileName)) {
                                    return scope.fileName = name;
                                }
                            });
                        }
                    };
                    file = event.dataTransfer.files[0];
                    name = file.name;
                    type = file.type;
                    size = file.size;
                    reader.readAsDataURL(file);
                    return false;
                });
            }
        };
    })


    .directive("fileread", function () {
        return {
            scope: {
                fileread: "="
            },
            link: function (scope, element, attributes) {
                element.bind("change", function (changeEvent) {
                    var reader = new FileReader();
                    reader.onload = function (loadEvent) {
                        scope.$apply(function () {
                            scope.fileread = loadEvent.target.result;
                        });
                    }
                    reader.readAsDataURL(changeEvent.target.files[0]);
                });
            }
        }
    })
;
progressPlayApp.factory('storageService', ['$rootScope', function ($rootScope) {
    'use strict';

    function checkStorageSupport() {
        try {
            var hasstorage = false;

            if ('sessionStorage' in window && window['sessionStorage'] !== null) {
                try {
                    sessionStorage.Check = 1;
                    return true;
                } catch (e) {
                    return false;
                }
            }
            else {
                return false;
            }

            if ('localStorage' in window && window['localStorage'] !== null) {
                try {
                    localStorage.Check = 1;
                }
                catch (e) {
                    return false;
                }
            }
            else {
                return false;
            }
            
        }
        catch (e) {
            return false;
        }
    }

    function getName(name) {
        return $rootScope.labelName + '-' + name;
    }

    function getValue(value, isObject, expires) {
        return (isObject ? JSON.stringify(value) : value) + (expires ? "expires:" + expires : "");
    }

    function set(name, value, isObject, isSession, hours) {
        if (typeof value !== 'undefined' && value != null && value.toString() != '' && (value.constructor !== Object || Object.keys(value).length > 0)) {
            var expires = "";
            if (hours) {
                var date = new Date();
                date.setTime(date.getTime() + (hours * 60 * 60 * 1000));
                var expires = date.getTime();
            }
            var compressed;
            if (value && value !== "")
                compressed = LZString.compressToBase64(encodeURI(getValue(value, isObject, expires)));
            else
                compressed = value;

            if (checkStorageSupport()) {
                if (isSession === true) {
                    sessionStorage.setItem(getName(name), compressed);
                }
                else {
                    localStorage.setItem(getName(name), compressed);
                }
            }
            else {
                document.cookie = getName(name) + "=" + getValue(value, isObject) + expires + "; path=/";
            }
        }
    }

    function getLocalValue(name, isSession) {
        if (isSession === true)
            return sessionStorage.getItem(getName(name));
        return localStorage.getItem(getName(name));
    }

    function get(name, isObject, isSession) {
        var value;
        if (checkStorageSupport()) {
            value = getLocalValue(name, isSession);
            if (value && value !== "")
                value = decodeURI(LZString.decompressFromBase64(value));
            if (value == 'null'){
                try {
                    value = decodeURI(getLocalValue(name, isSession));
                }
                catch (e) {
                    value = getLocalValue(name, isSession);
                }
			}
        }
        else {
            var nameEQ = name + "=";
            var ca = document.cookie.split(';');
            for (var i = 0; i < ca.length; i++) {
                var c = ca[i];
                while (c.charAt(0) == ' ') c = c.substring(1, c.length);
                if (c.indexOf(nameEQ) == 0) {
                    value = c.substring(nameEQ.length, c.length);
                }
            }
        }

        if (value) {
            var splitByExpiry = value.split('expires:');
            if (splitByExpiry.length > 0 && parseInt(splitByExpiry[1]) < new Date().getTime()) {
                if (isSession === true)
                    value = sessionStorage.removeItem(getName(name));
                else
                    value = localStorage.removeItem(getName(name));
                return null;
            }
            value = splitByExpiry[0];
        }

        switch (value) {
            case 'true':
                return true;
            case 'false':
                return false;
            default:
                try {
                    return (isObject && value !== "" ? JSON.parse(value) : value);
                }
                catch (e) { return null; }
        }
    }

    function remove(name, isSession) {

        if (checkStorageSupport()) {
            if (isSession === true) {
                sessionStorage.removeItem(getName(name));
            }
            else {
                localStorage.removeItem(getName(name));
            }
        }
        else {
            setItem(name, "", -1);
        }
    }

    return {
        setItem: function (name, value, isObject) {
            set(name, value, isObject, false);
        },

        getItem: function (name, isObject) {
            return get(name, isObject, false);
        },

        removeItem: function (name) {
            remove(name, false);
        },

        setSessionItem: function (name, value, isObject, hours) {
            set(name, value, isObject, true, hours);
        },

        getSessionItem: function (name, isObject) {
            return get(name, isObject, true);
        },

        removeSessionItem: function (name) {
            remove(name, true);
        }
    };
}]);


;
'use strict';

progressPlayApp.factory('dataService', ['$rootScope', '$filter', '$q', 'storageService', 'generalService', 'contentService', function ($rootScope, $filter, $q, storageService, generalService, contentService) {

    //$rootScope.labelName = ($rootScope.labelName = "undefined" ? window.location.pathname.split("/")[window.PPconfig.urlLabelPosition] : $rootScope.labelName);

    var analyticParams = {
        labelName: "",
        pageUrl: "",
        playerLoggedIn: false,
        playerId: 0,
        playerCurrency: "",
        playerType: "",
        playerCountry: "",
        playerGender: "",
        playerZip: "",
        playerTracker: "",
        playerDynamic: "",
        playerClickId: "",
        event: "",
        eventType: "",
        eventType2: "",
        eventAmount: "",
        eventInfo: ""
    }


    var globalParams = {
        hostName: window.location.pathname.split("/")[window.PPconfig.urlLabelPosition],
        showHeaderFooter: true,
        showLobby: true,
        userLoggedIn: false,
        showLoader: false,
        loaderText: null,
        userName: '',
        focusInProgress: false,
        goToLobby: false,
        madeWithdrawal: storageService.getSessionItem('madeWithdrawal') || false,
        backFromGame: storageService.getSessionItem('backFromGame') || false,
        loginUserData: storageService.getItem('loginUserData', true),

        bonusId: 0,
        removeGiud: false,
        customBanners: false,
        welcomeBonusDesc: '',
        login_time: null,
        inGame: false,
        fullScreen: false,
        allowedLanguages: "en|sv|de|ja|ar"
    };

    var creditCardsTypes = [
        { "cardTypeName": "Visa", "cardTypeId": "1" },
        { "cardTypeName": "Visa Debit", "cardTypeId": "1" },
        { "cardTypeName": "Visa Electron", "cardTypeId": "1" },
        { "cardTypeName": "Visa Delta", "cardTypeId": "1" },
        { "cardTypeName": "MasterCard", "cardTypeId": "2" },
        { "cardTypeName": "Maestro International", "cardTypeId": "6" },
        { "cardTypeName": "Maestro UK", "cardTypeId": "6" },
        { "cardTypeName": "JCB", "cardTypeId": "1" },
        { "cardTypeName": "Solo", "cardTypeId": "1" },
        { "cardTypeName": "Switch", "cardTypeId": "1" },
        { "cardTypeName": "Diners", "cardTypeId": "4" },
        { "cardTypeName": "Discover", "cardTypeId": "5" }];

    var paymentMethods = [
        { "paymentMethodName": "Credit card", "paymentMethodId": "486" },
        { "paymentMethodName": "Bank transfer", "paymentMethodId": "487" },
        { "paymentMethodName": "Cheque", "paymentMethodId": "488" },
        { "paymentMethodName": "Ukash", "paymentMethodId": "575" }];

    var genderList = [
        { "genderName": "Male", "genderId": "358" },
        { "genderName": "Female", "genderId": "359" }];






    var genderList = [
        { "genderName": "Male", "genderId": "358" },
        { "genderName": "Female", "genderId": "359" }];

    var queryParams = [];

    if (globalParams.playerData && globalParams.playerData.Account) {
        var currentBalance = globalParams.playerData.Account.GameBalance;
    }

    function setUrlVars() {
        var hash;
        var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
        for (var i = 0; i < hashes.length; i++) {
            hash = hashes[i].split('=');
            queryParams.push(hash[0]);
            queryParams[hash[0]] = hash[1];
        }
    };

    var GeneralData = {
        Countries: [],
        Currencies: [],
        Label: {},
        Games: [],

        Promotions: [],
        SportFeed: [],

        SettlementCompaniesByCountry: null
    }

    var numberOfTries = 0;
    var gamesarrived = false;
    var metaarrived = false;


    return {
        GeneralData: function () {
            return GeneralData;
        },
        Countries: function () {
            var countries = storageService.getSessionItem('GeneralData.Countries_' + $rootScope.label.label_id, true);
            if (countries)
                return new $q(function (resolve) { resolve(countries); });
            return generalService.general.countriesByLabel($rootScope.label.label_id).then(
                function (data) {
                    if ($rootScope.checkResponse({ response: data, location: 'general', closeOnError: false })) {
                        storageService.setSessionItem('GeneralData.Countries_' + $rootScope.label.label_id, data, true, 24);
                        return data;
                    }
                },
                function (data) {
                    reject(data);
                });
        },
        Professions: function () {
            var professions = storageService.getSessionItem('GeneralData.Professions', true);
            if (professions)
                return new $q(function (resolve) { resolve(professions); });
            return generalService.general.professions().then(
                function (data) {
                    if ($rootScope.checkResponse({ response: data, location: 'general', closeOnError: false })) {
                        storageService.setSessionItem('GeneralData.Professions', data, true, 24);
                        return data;
                    }
                },
                function (data) {
                    reject(data);
                });
        },
        CountriesDict: function (countryId) {
            var countries = storageService.getSessionItem('GeneralData.Countries_' + $rootScope.label.label_id, true);
            return $filter('filter')($filter('toArray')(countries), { CountryId: countryId })[0];
        },
        Currencies: function () {
            var currencies = storageService.getSessionItem('GeneralData.Currencies_' + $rootScope.languageId, true);
            if (currencies)
                return new $q(function (resolve) { resolve(currencies); });
            return generalService.general.currencies($rootScope.languageId).then(
                function (data) {
                    if ($rootScope.checkResponse({ response: data, location: 'general', closeOnError: false })) {
                        storageService.setSessionItem('GeneralData.Currencies_' + $rootScope.languageId, data, true, 24);
                        return data;
                    }
                },
                function (data) {
                    reject(data);
                });
        },
        CurrenciesOfCountry: function () {
            var currencies = storageService.getSessionItem('GeneralData.CurrenciesOfCountry_' + $rootScope.country.CountryID, true);
            if (currencies)
                return new $q(function (resolve) { resolve(currencies); });
            return generalService.general.currenciesByCountry($rootScope.country.CountryID).then(
                function (data) {
                    if ($rootScope.checkResponse({ response: data, location: 'general', closeOnError: false })) {
                        storageService.setSessionItem('GeneralData.CurrenciesOfCountry_' + $rootScope.country.CountryID, data, true, 24);
                        return data;
                    }
                },
                function (data) {
                    reject(data);
                });
        },
        Label: function () {

            var label = storageService.getSessionItem('GeneralData.Label_' + $rootScope.languageId + '_' + $rootScope.tracker, true);
            if (label) {
                $rootScope.$broadcast('labelArrived');
                return new $q(function (resolve) { resolve(label); });
            }
            else if ($rootScope.tracker && $rootScope.tracker.length < 1) {
                var label = storageService.getSessionItem('GeneralData.Label_' + $rootScope.languageId, true);
                if (label) {
                    $rootScope.$broadcast('labelArrived');
                    return new $q(function (resolve) { resolve(label); });
                }
            }
            if ($rootScope.tracker && $rootScope.tracker.length > 0) {
                return generalService.general.whiteLabelWithTracker($rootScope.labelName, $rootScope.tracker, $rootScope.languageId).then(
                    function (data) {
                        storageService.setSessionItem('GeneralData.Label_' + $rootScope.languageId + '_' + $rootScope.tracker, data, true, 24);
                        $rootScope.$broadcast('labelArrived');
                        return data;
                    },
                    function (data) {
                        reject(data);
                    });
            }
            else {
                return generalService.general.whiteLabel($rootScope.labelName, $rootScope.languageId).then(
                    function (data) {
                        storageService.setSessionItem('GeneralData.Label_' + $rootScope.languageId, data, true, 24);
                        $rootScope.$broadcast('labelArrived');
                        return data;
                    },
                    function (data) {
                        reject(data);
                    });
            }

        },
        SettlementCompaniesByCountry: function (countryId) {
            var player = ($rootScope.getPlayer() && $rootScope.isLoggedIn() ? $rootScope.getPlayer() : null);
            if (countryId === undefined)
                countryId = player ? player.Country.CountryId : $rootScope.country.CountryID;

            var settlementCompanies = storageService.getSessionItem('GeneralData.SettlementCompanies_' + countryId, true);
            if (settlementCompanies) {
                $rootScope.$broadcast('settlementCompaniesArrived', settlementCompanies);
                return new $q(function (resolve) { resolve(settlementCompanies); });
            }
            return generalService.general.getSettlementCompaniesByCountry({ "CountryId": countryId }).then(
                function (data) {
                    if ($rootScope.checkResponse({ response: data, location: 'general', closeOnError: false })) {
                        var dict = {};
                        for (var i = 0; i <= data.length - 1; i++) {
                            dict[data[i].SysName] = data[i];
                        }
                        storageService.setSessionItem('GeneralData.SettlementCompanies_' + countryId, dict, true, 24);
                        $rootScope.$broadcast('settlementCompaniesArrived', dict);
                        return dict;
                    }
                    else
                        reject(data);
                });
        },
        Games: function (filterId) {

            var player = ($rootScope.getPlayer() && $rootScope.isLoggedIn() ? $rootScope.getPlayer() : null);
            var countryId = player ? player.Country.CountryId : $rootScope.country.CountryID;

            var request = {
                "PlayerId": (player ? player.PlayerId : 0),
                "CountryId": countryId,
                "LabelId": $rootScope.label.label_id,
                "LanguageId": $rootScope.languageId,
                "IsMobile": $rootScope.isMobile()
            };

            var games = storageService.getSessionItem('GeneralData.Games_' + request.PlayerId + '_' + countryId + '_' + $rootScope.languageId, true);
            if (games) {
                $rootScope.Games = games;
                $rootScope.$broadcast('gamesArrived');
                return new $q(function (resolve) { resolve(games); });
            }
            return generalService.general.gamesData(request).then(
                function (data) {
                    if ($rootScope.checkResponse({ response: data, location: 'general', closeOnError: false, noMessage: true })) {

                        data.GameTypes.unshift({ ID: -2, Key: "featured", Name: "Featured" })
                        data.GameTypes.unshift({ ID: -1, Key: "new", Name: "New" });
                        data.GameTypes.push({ ID: 0, Key: "all", Name: "All" });
                        data.GameTypes.push({ ID: -3, Key: "favourite", Name: "Favourite" });


                        storageService.setSessionItem('GeneralData.Games_' + request.PlayerId + '_' + countryId + '_' + $rootScope.languageId, data, true, 24);
                        $rootScope.Games = data;

                        $rootScope.$broadcast('gamesArrived');
                        return data;
                    }
                    else {
                        numberOfTries++;
                        reject();
                        return;
                    }
                },
                function (data) {
                    reject(data);
                });

        },
        GamesDict: function (serverGameID) {
            return this.Games().then(function (data) {
                return new $q(function (resolve) {
                    resolve($filter('filter')($filter('toArray')(data.Games), { ServerGameID: serverGameID }, true)[0]);
                });
            });
        },
        GamesDictIDs: function (gameID) {
            return this.Games().then(function (data) {
                return new $q(function (resolve) {
                    resolve($filter('filter')($filter('toArray')(data.Games), { GameID: gameID }, true)[0]);
                });
            });
        },
        GamesDictIDsDirect: function (gameID) {
            var player = ($rootScope.getPlayer() && $rootScope.isLoggedIn() ? $rootScope.getPlayer() : null);
            var countryId = player ? player.Country.CountryId : $rootScope.country.CountryID;

            var games = storageService.getSessionItem('GeneralData.Games_' + (player ? player.PlayerId : 0) + '_' + countryId + '_' + $rootScope.languageId, true).Games;
            return $filter('filter')($filter('toArray')(games), { GameID: gameID })[0];
        },
        Promotions: function (broadcast, isWelcome) {
            var tracker = ($rootScope.tracker && $rootScope.tracker != '0' && $rootScope.tracker.length > 0 ? $rootScope.tracker : '');
            var depositscount;
            var countrycode = $rootScope.country ? $rootScope.country.CountryIntlCode : '';
            var currencyId = $rootScope.country ? $rootScope.country.DefaultCurrencyID : '';
            var ranking;
            var isloggedin = false;
            var playMode = $rootScope.playMode;

            if (isWelcome) {
                if (playMode == 'sport')
                    playMode = 'casino';
                else if (playMode == 'casino')
                    playMode = 'sport';
            }

            var key = tracker + $rootScope.languageId + playMode + isWelcome;

            var player = $rootScope.getPlayer();
            if (player && $rootScope.isLoggedIn()) {
                isloggedin = true;
                depositscount = ($rootScope.playMode == 'sport' ? player.Account.DepositsCountSport : player.Account.DepositsCountCasino);
                countrycode = player.Country.CountryIntlCode;
                currencyId = player.CurrencyId;
                ranking = player.Account.Ranking;
                key += countrycode + depositscount + player.Account.Ranking;
            }

            var promotions = storageService.getSessionItem('GeneralData.Promotions' + '_' + key, true);
            if (promotions) {
                if (typeof broadcast === 'undefined' || broadcast)
                    $rootScope.$broadcast('promotionsArrived', promotions);
                return new $q(function (resolve) { resolve(promotions); });
            }
            return contentService.promotions($rootScope.label.label_id,
                $rootScope.tracker,
                $rootScope.locale.toLowerCase(),
                ($rootScope.isMobile() ? "mobile" : "desktop"),
                $rootScope.playMode,
                isloggedin,
                countrycode,
                currencyId,
                depositscount,
                ranking,
                isWelcome).then(
                    function (data) {
                        storageService.setSessionItem('GeneralData.Promotions' + '_' + key, data, true, 24);
                        if (typeof broadcast === 'undefined' || broadcast)
                            $rootScope.$broadcast('promotionsArrived', data);
                        return data;
                    });
        },
        PromotionById: function (id) {
            var tracker = ($rootScope.tracker && $rootScope.tracker != '0' && $rootScope.tracker.length > 0 ? $rootScope.tracker : '');
            var depositscount;
            var countrycode = $rootScope.country ? $rootScope.country.CountryIntlCode : '';
            var currencyId = $rootScope.country ? $rootScope.country.DefaultCurrencyID : '';
            var ranking;
            var isloggedin = false;
            var playMode = $rootScope.playMode;

            var key = tracker + $rootScope.languageId + playMode;

            var player = $rootScope.getPlayer();
            if (player && $rootScope.isLoggedIn()) {
                isloggedin = true;
                depositscount = ($rootScope.playMode == 'sport' ? player.Account.DepositsCountSport : player.Account.DepositsCountCasino);
                countrycode = player.Country.CountryIntlCode;
                currencyId = player.CurrencyId;
                ranking = player.Account.Ranking;
                key += countrycode + depositscount + player.Account.Ranking;
            }

            return contentService.promotionGetById(id,
                $rootScope.label.label_id,
                $rootScope.tracker,
                $rootScope.locale.toLowerCase(),
                ($rootScope.isMobile() ? "mobile" : "desktop"),
                $rootScope.playMode,
                isloggedin,
                countrycode,
                currencyId,
                depositscount,
                ranking
            ).then(function (data) { return data; });
        },
        BigWinners: function () {
            var bigWinners = storageService.getSessionItem('GeneralData.BigWinners', true);
            if (bigWinners)
                return new $q(function (resolve) { resolve(bigWinners); });
            return contentService.bigwinners($rootScope.label.label_id).then(
                function (data) {
                    storageService.setSessionItem('GeneralData.BigWinners', data, true, 24);
                    return data;
                });
        },
        SportFeed: function () {
            contentService.sportfeed($rootScope.label.label_id).then(
                function (data) {
                    storageService.setSessionItem('GeneralData.SportFeed', data, true, 24);
                });
        },
        TermsAndConditions: function (labelId, code, language, tracker) {
            var terms = storageService.getSessionItem('GeneralData.TermsAndConditions_' + code + '_' + $rootScope.languageId + '_' + $rootScope.tracker, true, 24);
            if (terms)
                return new $q(function (resolve) { resolve(terms); });

            var countrycode = $rootScope.country ? $rootScope.country.CountryIntlCode : '';
            var currencyId = $rootScope.country ? $rootScope.country.DefaultCurrencyID : '';

            var player = $rootScope.getPlayer();
            if (player && $rootScope.isLoggedIn()) {
                countrycode = player.Country.CountryIntlCode;
                currencyId = player.CurrencyId;
            }
            return contentService.content(labelId, code, language, tracker, countrycode, currencyId).then(
                function (data) {
                    if (data !== null && data.length > 0) {
                        storageService.setSessionItem('GeneralData.TermsAndConditions_' + code + '_' + $rootScope.languageId + '_' + $rootScope.tracker, data, true, 24);
                        return data;
                    }
                });
        },

        ContentInfo: function (code) {
            var content = storageService.getSessionItem('GeneralData.ContentInfo' + code + '_' + $rootScope.languageId, true, 24);
            if (content)
                return new $q(function (resolve) { resolve(content); });

            var countrycode = $rootScope.country ? $rootScope.country.CountryIntlCode : '';
            var currencyId = $rootScope.country ? $rootScope.country.DefaultCurrencyID : '';

            var player = $rootScope.getPlayer();
            if (player && $rootScope.isLoggedIn()) {
                countrycode = player.Country.CountryIntlCode;
                currencyId = player.CurrencyId;
            }
            return contentService.content($rootScope.label.label_id, code, $rootScope.locale, '', countrycode, currencyId).then(
                function (data) {
                    if (data !== null && data.length > 0) {
                        storageService.setSessionItem('GeneralData.ContentInfo_' + code + '_' + $rootScope.languageId, data, true, 24);
                        return data;
                    }
                });
        },


        getParams: function () {
            return globalParams;
        },
        getParam: function (param) {
            return globalParams[param];
        },
        setParam: function (param, value) {
            globalParams[param] = value;
            return this.getParam(param);
        },
        setMultipleParams: function (paramsArr, valuesArr) {
            for (var i = 0; i < paramsArr.length; i++) {
                globalParams[paramsArr[i]] = valuesArr[i];
            }
        },
        getAnalyticParams: function () {
            return analyticParams;
        },
        getAnalyticParam: function (param) {
            return analyticParams[param];
        },
        setAnalyticParam: function (param, value) {
            analyticParams[param] = value;
            return this.getParam(param);
        },
        setAnalyticMultipleParams: function (paramsArr, valuesArr) {
            for (var i = 0; i < paramsArr.length; i++) {
                analyticParams[paramsArr[i]] = valuesArr[i];
            }
        },
        trackAnalyticEvent: function (player, paramsArr, valuesArr) {
            try {
                if (player) {
                    analyticParams["playerEmail"] = player.Email;
                    analyticParams["playerId"] = player.PlayerId;
                    analyticParams["playerType"] = (player.Account && player.Account.TotalDeposits > 0 ? "r" : "f");
                    analyticParams["playerCountry"] = (player.Country ? player.Country.CountryName : player.CountryId);
                    analyticParams["playerZip"] = player.ZipCode;
                    analyticParams["playerCurrency"] = (player.Currency ? player.Currency.CurrencyCode : player.CurrencyId);
                    analyticParams["playerGender"] = (player.GenderID == 358 ? "m" : "f");
                    analyticParams["playerTracker"] = player.Tracker;
                    analyticParams["playerDynamic"] = player.Dynamic;
                    analyticParams["playerClickId"] = player.ClickId;
                    analyticParams["playerPromotionalMailEnabled"] = player.PromotionalMailEnabled;
                    analyticParams["playerPromotionalSMSEnabled"] = player.PromotionalSMSEnabled;
                }
                else {
                    analyticParams["playerEmail"] = "";
                    analyticParams["playerId"] = "";
                    analyticParams["event"] = "";
                    analyticParams["eventType"] = "";
                    analyticParams["eventType2"] = "";
                    analyticParams["eventInfo"] = "";
                    analyticParams["eventAmount"] = "";
                    analyticParams["playerTracker"] = $rootScope.tracker;
                    analyticParams["playerDynamic"] = $rootScope.dynamic;
                    analyticParams["playerClickId"] = $rootScope.btag ? $rootScope.btag : ($rootScope.idfa ? $rootScope.idfa : $rootScope.clickid);
                }

                analyticParams["playerPlatform"] = ($rootScope.isMobile() ? "mobile" : "web");
                analyticParams["playerPlayMode"] = $rootScope.playMode;

                if (player) {
                    playerObj = player;
                    playerObj.LastEvent = analyticParams["event"];
                    playerObj.LastEventType = analyticParams["eventType"];
                    playerObj.LastEventInfo = analyticParams["eventInfo"];
                    playerObj.LastEventTime = new Date();
                    playerObj.Platform = analyticParams["playerPlatform"];
                    playerObj.PlayMode = analyticParams["playerPlayMode"];
                }


                for (var i = 0; i < paramsArr.length; i++) {
                    analyticParams[paramsArr[i]] = valuesArr[i];
                }

                if (typeof (trackEvent) == "function") {
                    trackEvent(analyticParams);
                }

                if (typeof (_itq) != 'undefined' && typeof (_itq.push) == "function") {
                    var params = analyticParams;
                    var eventData = {};
                    var eventName;
                    var eventInfo;
                    var userEvent = true;

                    if (params["playerEmail"] != '') {
                        eventData.Customer = {
                            PlayerID: params["playerId"],
                            Email: params["playerEmail"],
                            Subscribed: params["playerPromotionalMailEnabled"],
                            "SMS Subscribed": params["playerPromotionalSMSEnabled"]
                        };
                    }
                    eventData.Info = {};

                    if (params["event"] != '') {
                        eventName = params["event"];
                        eventData.Event = params["event"];
                        switch (params["event"]) {

                            case "loginComplete":
                                eventName = "sign in";
                                break;
                            case "logout":
                                eventName = "sign out";
                                break;
                            case "openGame":
                                eventName = "open game";
                                eventData.Info = {
                                    Name: params["eventInfo"],
                                    Mode: params["eventType"]
                                };
                                break;
                            case "depositComplete":
                                //eventName = "deposit";
                                eventData.Info = {
                                    Amount: params["eventAmount"],
                                    Method: params["eventType"],
                                    Balance: params["eventInfo"]
                                };
                                break;
                            case "openForm":
                                _itq.push(['_trackPageview', params["eventInfo"] + '-' + params["eventType"]]);
                                userEvent = false;
                                break;
                            default:
                                eventData.Info = {
                                    Info: params["eventInfo"],
                                    Type: params["eventType"]
                                };
                                break;

                        }
                    }
                    if (userEvent) {
                        _itq.push(['_trackUserEvent', eventName, {
                            "Customer": eventData.Customer,
                            "Data": (eventData.Info ? eventData.Info : eventData.Event)
                        }, eventData.Event]);
                    }
                }
            }
            catch (e) {
                console.log(e);
            }
        },

        setBalance: function (param) {
            currentBalance = param;
            $rootScope.$broadcast("currentBalance", currentBalance);
        },
        getBalance: function () {
            currentBalance = parseFloat(currentBalance);
            return currentBalance;
        },
        getCreditCardsList: function () {
            return creditCardsTypes;
        },
        getGenderList: function () {
            return genderList;
        },
        getPaymentMethods: function () {
            return paymentMethods;
        },
        getSettlementCompanies: function () {
            return settlementCompanies;
        },

        getQueryParam: function (param) {
            if (queryParams.length == 0 || !queryParams[param]) {
                setUrlVars();
            }
            return queryParams[param];
        },

        getBirthdayObject: function () {
            var birthdayObject = {
                years: [],
                months: [],
                days: [],
                selectedYear: "",
                selectedMonth: "",
                selectedDay: "",
                maxBirthday: null
            };
            var today = new Date();
            var currentYear = today.getFullYear();
            var currentMonth = today.getMonth();
            var currentDay = today.getDate();
            var yearsCounter = 0;


            for (var i = 1; i <= 31; i++) {
                birthdayObject.days[i - 1] = (i < 10) ? "0" + i : i + "";
            }
            for (var i = 1; i <= 12; i++) {
                birthdayObject.months[i - 1] = (i < 10) ? "0" + i : i + "";
            }
            for (var i = (currentYear - 18); i >= (currentYear - 100); i--) {

                birthdayObject.years[yearsCounter] = i;
                yearsCounter++;
            }
            //birthdayObject.selectedYear = (currentYear - 18);
            //birthdayObject.selectedMonth = (currentMonth < 9) ? "0" + (currentMonth + 1) : (currentMonth + 1) + "";
            //birthdayObject.selectedDay = (currentDay < 10) ? "0" + currentDay : currentDay + "";
            birthdayObject.maxBirthday = new Date((today.getFullYear() - 18), today.getMonth(), today.getDate());

            return birthdayObject;
        },

        getTimeStamp: function () {
            return Date().getTime();
        },

        SetTrustlyStatus: function (playerId, token, status) {
            $rootScope.setCookie("tpi", JSON.stringify({ PlayerId: playerId, Token: token, Status: status }));
        },
        GetTrustlyStatus: function () {
            var obj = {};
            var tpi = $rootScope.getCookie("tpi");
            if (tpi) {
                obj = JSON.parse(tpi);
            }
            return obj;
        },

        GetCardType: function (number) {
            // Switch
            if (number.match(new RegExp("^(4903|4905|4911|4936|6333|6759)|(4903|4905|4911|4936|6333|6759)|(4903|4905|4911|4936|6333|6759)|564182|564182|564182|633110|633110|633110")) != null)
                return "1|Switch";

            // Visa Electron
            if (number.match(new RegExp("^(4026|417500|4508|4844|491(3|7))")) != null)
                return "1|VisaElectron";

            // Visa
            if (number.match(new RegExp("^(4)")) != null)
                return "1|Visa";

            // Mastercard
            if (number.match(new RegExp("^(51|52|53|54|55)")) != null)
                return "2|Mastercard";

            // Maestro
            if (number.match(new RegExp("^(5018|5020|5038|6304|6759|6761|6763)")) != null)
                return "6|Maestro";

            // Solo
            if (number.match(new RegExp("^(6334|6767)|(6334|6767)|(6334|6767)")) != null)
                return "1|Solo";

            // AMEX
            if (number.match(new RegExp("^(34|37)")) != null)
                return "3|AMEX";

            // Discover
            if (number.match(new RegExp("^(6011|622|64|65)")) != null)
                return "5|Discover";

            // Diners
            if (number.match(new RegExp("^3(?:0[0-5]|[68][0-9])")) != null)
                return "4|Diners";

            // JCB
            if (number.match(new RegExp("^(35)")) != null)
                return "1|JCB";

            return "1|Generic";
        }
    };

}]);;
progressPlayApp.factory('AnalyticManager', ['$rootScope', 'dataService', function ($rootScope, dataService) {
    'use strict';
    return {
        track: function () {
            var params = dataService.getAnalyticParams();
			if (typeof(trackEvent) == "function")
			{
				trackEvent(params);
			}
        }
    };
}]);


;
progressPlayApp.factory('contentService', ['HttpUtil', '$http', '$q', '$log', '$rootScope', '$location', function (HttpUtil, $http, $q, $log, $rootScope, $location) {
    'use strict';
    return {
        promotions: function (labelid, tracker, lang, platform, playmode, isloggedin, countrycode, currencyId, depositscount, ranking, iswelcome) {
            var playerParams = '&isloggedin=' + isloggedin + '&country=' + countrycode + (currencyId ? ('&currencyId=' + currencyId) : '') + (depositscount ? ('&depositcount=' + depositscount) : '') + (ranking ? ('&ranking=' + ranking) : '');
            var isWelcomeQ = (iswelcome ? "&iswelcome=" + iswelcome : '');
            var trackerQ = tracker ? ('&tracker=' + tracker) : '';
            var url = window.PPconfig.urlContentServer + 'GetPromotionsInfo' + '?whitelabelid=' + labelid + trackerQ + '&lang=' + lang + '&platform=' + platform + '&playmode=' + playmode + '&isExcludeTerms=true&showHtml=false' + playerParams + isWelcomeQ;
            return HttpUtil.GET(url, {}, { 'Content-Type': 'application/json' });
        },
        promotionGetById: function (id, labelid, tracker, lang, platform, playmode, isloggedin, countrycode, currencyId, depositscount, ranking) {
            var playerParams = '&isloggedin=' + isloggedin + '&country=' + countrycode + (currencyId ? ('&currencyId=' + currencyId) : '') + (depositscount ? ('&depositcount=' + depositscount) : '') + (ranking ? ('&ranking=' + ranking) : '');
            var trackerQ = tracker ? ('&tracker=' + tracker) : '';
            var url = window.PPconfig.urlContentServer + 'GetPromotionInfoById' + '?id=' + id + '&whitelabelid=' + labelid + trackerQ + '&lang=' + lang + '&platform=' + platform + '&playmode=' + playmode + '&isExcludeTerms=true&showHtml=true' + playerParams;
            return HttpUtil.GET(url, {}, { 'Content-Type': 'application/json' });
        },
        content: function (labelid, code, currlng, tracker, country, currencyId) {
			var trackerQ = tracker ? ('&tracker=' + tracker) : '';
            var url = window.PPconfig.urlContentServer + 'GetInfoContentByCode' + '?whitelabelid=' + labelid + trackerQ + '&lang=' + currlng + '&code=' + code + '&country=' + country + '&currencyId=' + currencyId;
            return HttpUtil.GET(url, {}, { 'Content-Type': 'application/json' });
        },
        bigwinners: function (labelid) {
            var url = window.PPconfig.urlContentServer + 'api/winner' + '?whitelabelid=' + labelid + '&maxResults=10';
            return HttpUtil.GET(url, {}, { 'Content-Type': 'application/json' });
        },
        sportfeed: function (labelid) {
            var url = window.PPconfig.urlContentServer + 'api/sportfeed?whitelabelId=' + labelid;
            return HttpUtil.GET(url, {}, { 'Content-Type': 'application/json' });
        }
    };
}]);;
/* jshint devel: true */
/* global ltvApp */
progressPlayApp.factory('generalService', ['HttpUtil', '$http', '$q', '$log', '$rootScope', '$location', '$injector', '$timeout', 'storageService', function (HttpUtil, $http, $q, $log, $rootScope, $location, $injector, $timeout, storageService) {
    'use strict';
    var url = window.PPconfig.urlServer;
    var clientHelperUrl = window.PPconfig.urlClientHelperService;

    function buildUrl(resource) {
        return url + resource;
    }

    function buildClientHelperUrl(resource, params) {
        var url = clientHelperUrl + resource;
        if (typeof params != "undefined") {
            url += '?' + Object.keys(params).map(function (k) { return k + '=' + params[k]; }).join('&');
        }
        return url;
    }

    function getSessionParams(isAsync) {
        var params = $rootScope.Token;
        return {
            headers: {
                'Content-Type': 'application/json'
            },
            isAsync: (typeof isAsync !== 'undefined' && isAsync) ? true : false
        };
    }

    function addToken(params) {
        if ($rootScope.getPlayer() && $rootScope.getPlayer().Token) {
            params.Token = $rootScope.getPlayer().Token;
        }
        return params;
    }

    return {
        authentication: {
            registerStep1: function (params) {
                var config = getSessionParams();
                return HttpUtil.POST(buildUrl('player/RegisterStep1'), params, config);
            },
            updateStep1: function (params) {
                var config = getSessionParams();
                return HttpUtil.POST(buildUrl('player/UpdateStep1'), params, config);
            },
            registerStep2: function (params) {
                var config = getSessionParams();
                return HttpUtil.POST(buildUrl('player/RegisterStep2'), params, config);
            },
            registerAfterKYC: function (params) {
                var config = getSessionParams();
                return HttpUtil.POST(buildUrl('player/registerAfterKYC'), params, config);
            },
            getAddressByZipCode: function (params) {
                var config = getSessionParams(true);
                return HttpUtil.POST(buildUrl('player/GetAddressByZipcode'), params, config);
            },
            loginNew: function (params) {
                var config = getSessionParams();
                config.headers.include = 'true';
                return HttpUtil.POST(buildUrl('player/LoginNew'), params, config);
            },
            logout: function (params) {
                var config = getSessionParams(true);
                config.headers.include = 'true';
                var params = addToken(params);
                return HttpUtil.POST(buildUrl('player/Logout'), params, config);
            },

            getPlayer: function (params) {
                var config = getSessionParams(true);
                config.headers.include = 'true';
                return HttpUtil.POST(buildUrl('player/GetPlayer'), params, config);
            },


            refreshToken: function (params) {
                var config = getSessionParams(true);
                return HttpUtil.POST(buildUrl('player/RefreshToken'), params, config);
            },
            forgotPassword: function (params) {
                return HttpUtil.POST(buildUrl('player/ForgotPassword'), params, getSessionParams());
            },
            forgotPasswordValidateNumber: function (params) {
                return HttpUtil.POST(buildUrl('/player/ForgotPasswordValidateNumber/'), params, getSessionParams());
            },
            forgotPasswordChangePassword: function (params) {
                return HttpUtil.POST(buildUrl('player/ForgotPasswordChangePassword'), params, getSessionParams());
            },
            updateDetails: function (params) {
                var config = getSessionParams();
                params = addToken(params);
                return HttpUtil.POST(buildUrl('player/UpdateDetails'), params, config);
            },

            updateMediaSelect: function (params) {
                var config = getSessionParams();
                params = addToken(params);
                return HttpUtil.POST(buildUrl('player/UpdateMediaSelect'), params, config);
            },
            updateProfessionSelect: function (params) {
                var config = getSessionParams();
                params = addToken(params);
                return HttpUtil.POST(buildUrl('player/UpdateProfessionSelect'), params, config);
            },

            activation: function (params) {
                var config = getSessionParams();
                params = addToken(params);
                return HttpUtil.POST(buildUrl('player/ReSendActivationEmail'), params, config);
            },
            activatePlayer: function (params) {
                var config = getSessionParams();
                params = addToken(params);
                return HttpUtil.POST(buildUrl('player/ActivatePlayer'), params, config);
            },
            updateGameLimitEncountered: function (params) {
                var config = getSessionParams();
                params = addToken(params);
                return HttpUtil.POST(buildUrl('player/UpdateGameLimitEncountered'), params, config);
            },
            updateMigrationMessage: function (params) {
                var config = getSessionParams();
                params = addToken(params);
                return HttpUtil.POST(buildUrl('player/UpdateMigrationMessage'), params, config);
            },
            updatePromotionsEnabled: function (params) {
                var config = getSessionParams();
                params = addToken(params);
                return HttpUtil.POST(buildUrl('player/UpdatePromotionsEnabled'), params, config);
            },

            updatePendingRestrictions: function (params) {
                var config = getSessionParams();
                params = addToken(params);
                return HttpUtil.POST(buildUrl('player/UpdatePendingRestrictions'), params, config);
            },

            checkDepositCodeValid: function (params) {
                var config = getSessionParams();
                params = addToken(params);
                return HttpUtil.POST(buildUrl('player/CheckDepositCodeValid'), params, config);
            },


            updateMobileNumber: function (params) {
                var config = getSessionParams();
                params = addToken(params);
                return HttpUtil.POST(buildUrl('player/UpdateMobileNumber'), params, config);
            },
            validateMobileNumber: function (params) {
                var config = getSessionParams();
                return HttpUtil.POST(buildUrl('player/ValidateMobileNumber'), params, config);
            },
            resendMobileValidationNumber: function (params) {
                var config = getSessionParams();
                params = addToken(params);
                return HttpUtil.POST(buildUrl('player/ReSendMobileValidationNumber'), params, config);
            },
            supportRequest: function (params) {
                var config = getSessionParams();
                return HttpUtil.POST(buildUrl('player/SupportRequest'), params, config);
            },
            unsubscribe: function (params) {
                var config = getSessionParams();
                return HttpUtil.POST(buildUrl('player/UnsubscribePromotionalMedia'), params, config);
            },
            getNetentConnectToken: function (params) {
                var config = getSessionParams(true);
                return HttpUtil.POST(buildUrl('player/GetNetentConnectToken'), params, config);
            },
        },
        cashier: {
            GetPlayerBalance: function (params) {
                var config = getSessionParams(true);
                params = addToken(params);
                return HttpUtil.POST(buildUrl('player/GetPlayerBalance'), params, config);
            },

            GetPlayerBalances: function (params) {
                var config = getSessionParams(true);
                params = addToken(params);
                return HttpUtil.POST(buildUrl('player/GetPlayerBalances'), params, config);
            },



            GetPlayerPopups: function (params) {
                var config = getSessionParams(true);
                params = addToken(params);
                return HttpUtil.POST(buildUrl('player/GetPlayerPopups'), params, config);
            },
            getPlayerPaymentMethods: function (params) {
                var config = getSessionParams(true);
                params = addToken(params);
                return HttpUtil.POST(buildUrl('player/GetPlayerSettlementCompanies'), params, config);
            },
            getPlayerPaymentMethodsCreditCards: function (params) {
                var config = getSessionParams(true);
                params = addToken(params);
                return HttpUtil.POST(buildUrl('player/GetPlayerSettlementCompaniesCreditCards'), params, config);
            },
            //getSettlementCompanies: function (currencyId) {
            //    var config = getSessionParams();
            //    var params = addToken({ currencyId: currencyId });
            //    return HttpUtil.GET(buildUrl('info/SettlementCompanyByCurrency/' + currencyId), {}, config);
            //},
            deposit: function (params) {
                var config = getSessionParams();
                params = addToken(params);
                return HttpUtil.POST(buildUrl('player/Deposit'), params, config);
            },
            depositAfterRedirect: function (params) {
                var config = getSessionParams();
                params = addToken(params);
                return HttpUtil.POST(buildUrl('player/DepositAfterRedirect'), params, config);
            },
            depositAfterPartial: function (params, isAsync) {
                var config = getSessionParams(isAsync);
                params = addToken(params);
                return HttpUtil.POST(buildUrl('player/DoneDepositAfterPartial'), params, config);
            },
            getDepositBonusOffer: function (params) {
                var config = getSessionParams();
                params = addToken(params);
                return HttpUtil.POST(buildUrl('player/GetDepositBonusOffer'), params, config);
            },
            validateExternalTransaction: function (params) {
                var config = getSessionParams();
                params = addToken(params);
                return HttpUtil.POST(buildUrl('player/ValidateExternalTransaction'), params, config);
            },
            prepareExternalTransactionUrl: function (params) {
                var config = getSessionParams();
                params = addToken(params);
                return HttpUtil.POST(buildUrl('player/PrepareExternalTransactionUrl'), params, config);
            },
            prepareExternalTransactionUrlTrustlyRegister: function (params) {
                var config = getSessionParams();
                return HttpUtil.POST(buildUrl('player/PrepareExternalTransactionUrlTrustlyRegister'), params, config);
            },
            prepareExternalTransactionUrlTrustlyLogin: function (params) {
                var config = getSessionParams();
                return HttpUtil.POST(buildUrl('player/PrepareExternalTransactionUrlTrustlyLogin'), params, config);
            },

            getTrustlyPaynplayUrl: function (params) {
                var config = getSessionParams();
                return HttpUtil.POST(buildUrl('player/GetTrustlyPaynplayUrl'), params, config);
            },

            withdrawal: function (params) {
                var config = getSessionParams();
                params = addToken(params);
                return HttpUtil.POST(buildUrl('player/Withdrawal'), params, config);
            },
            cancelWithdrawal: function (params) {
                var config = getSessionParams();
                params = addToken(params);
                return HttpUtil.POST(buildUrl('player/CancelWithdrawal'), params, config);
            },

            cancelBonus: function (params) {
                var config = getSessionParams();
                params = addToken(params);
                return HttpUtil.POST(buildUrl('player/CancelBonus'), params, config);
            },


            addPaymentMethod: function (methodName, params) {
                var selectedMethod;

                switch (methodName) {
                    case "creditcard":
                        selectedMethod = "CreditCard";
                        break;
                    case "paybyphone":
                        selectedMethod = "Fonix";
                        break;
                    case "skrill":
                    case "neteller":
                    case "paysafecard":
                    case "trustly":
                    case "bitpay":

                    default:
                        selectedMethod = methodName.charAt(0).toUpperCase() + methodName.substr(1).toLowerCase()
                        break;
                }

                var config = getSessionParams(false);
                params = addToken(params);
                return HttpUtil.POST(buildUrl('player/AddMethod' + selectedMethod), params, config);
            },
            getPlayerLimits: function (params) {
                var config = getSessionParams();
                params = addToken(params);
                return HttpUtil.POST(buildUrl('player/GetPlayerLimits'), params, config);
            },
            setPlayerLimits: function (params) {
                var config = getSessionParams();
                params = addToken(params);
                return HttpUtil.POST(buildUrl('player/SetPlayerLimits'), params, config);
            },
            setPlayerExclusion: function (params) {
                var config = getSessionParams();
                params = addToken(params);
                return HttpUtil.POST(buildUrl('player/SetPlayerExclusion'), params, config);
            },
            setPlayerTimeOut: function (params) {
                var config = getSessionParams();
                params = addToken(params);
                return HttpUtil.POST(buildUrl('player/SetPlayerTimeOut'), params, config);
            },
            getTransactions: function (params) {
                var config = getSessionParams();
                params = addToken(params);
                return HttpUtil.POST(buildUrl('player/GetTransactions'), params, config);
            },

            getPaymentHistory: function (params) {
                var config = getSessionParams();
                params = addToken(params);
                return HttpUtil.POST(buildUrl('player/GetDataPaymentHistory'), params, config);
            },
            getPendingWithdrawals: function (params) {
                var config = getSessionParams();
                params = addToken(params);
                return HttpUtil.POST(buildUrl('player/GetDataPendingWithdrawals'), params, config);
            },

            getPlayHistory: function (params) {
                var config = getSessionParams();
                params = addToken(params);
                return HttpUtil.POST(buildUrl('player/GetDataPlayHistory'), params, config);
            },

            getPlaySportHistory: function (params) {
                var config = getSessionParams();
                params = addToken(params);
                return HttpUtil.POST(buildUrl('player/GetDataPlaySportHistory'), params, config);
            },

            getBonusHistory: function (params) {
                var config = getSessionParams();
                params = addToken(params);
                return HttpUtil.POST(buildUrl('player/GetDataBonusHistory'), params, config);
            },
            getLeaderboardResult: function (params) {
                var config = getSessionParams();
                params = addToken(params);
                return HttpUtil.POST(buildUrl('player/GetDataLeaderboards'), params, config);
            },
            getPlayerClubLevel: function (params) {
                var config = getSessionParams();
                params = addToken(params);
                return HttpUtil.POST(buildUrl('player/GetPlayerClubLevel'), params, config);
            },
            getClubPointsTransactions: function (params) {
                var config = getSessionParams();
                params = addToken(params);
                return HttpUtil.POST(buildUrl('player/GetClubPointsTransactions'), params, config);
            },
            convertClubPoints: function (params) {
                var config = getSessionParams();
                params = addToken(params);
                return HttpUtil.POST(buildUrl('player/ConvertClubPoints'), params, config);
            },
            uploadUserDocuments: function (params) {
                var config = {
                    transformRequest: angular.identity,
                    headers: {
                        'Content-Type': undefined
                    }
                }
                return HttpUtil.POST(buildUrl('player/UploadUserDocuments'), params, config);
            },

            uploadUserDocumentsToIDScan: function (params) {
                var config = {
                    transformRequest: angular.identity,
                    headers: {
                        'Content-Type': undefined
                    }
                }
                return HttpUtil.POST("Services/IDScan/IDScanProvider.aspx", params, config);
            },


            getUserNumberOfDocuments: function (params) {
                var config = getSessionParams();
                params = addToken(params);
                return HttpUtil.POST(buildUrl('player/GetUserNumberOfDocuments'), params, config);
            },

            deleteUserDocuments: function (params) {
                var config = getSessionParams();
                params = addToken(params);
                return HttpUtil.POST(buildUrl('player/DeleteUserDocuments'), params, config);
            },
            getVerifyIdDocumentTypes: function (params) {
                var config = getSessionParams(true);
                params = addToken(params);
                return HttpUtil.POST(buildUrl('player/GetVerifyIdDocumentTypes'), params, config);
            },
            getVerifyIdDocumentTypesStatuses: function (params) {
                var config = getSessionParams();
                params = addToken(params);
                return HttpUtil.POST(buildUrl('player/GetVerifyIdDocumentTypesStatuses'), params, config);
            },
            getCommonParametersByType: function (params) {
                var config = getSessionParams(true);
                params = addToken(params);
                return HttpUtil.POST(buildUrl('player/GetCommonParametersByType'), params, config);
            }

        },
        personalInfo: {
            changePassword: function (params) {
                var config = getSessionParams();
                params = addToken(params);
                return HttpUtil.POST(buildUrl('player/ChangePassword'), params, config);
            },
            updateInfo: function (params) {
                var config = getSessionParams();
                params = addToken(params);
                return HttpUtil.POST(buildUrl('player/UpdateDetails'), params, config);
            },
            getPlayerDetails: function (params) {
                var config = getSessionParams(true);
                params = addToken(params);
                return HttpUtil.POST(buildUrl('player/GetPlayerDetails'), params, config);
            },
            updatePushNotificationsPromptFlag: function (params) {
                var config = getSessionParams(true);
                params = addToken(params);
                return HttpUtil.POST(buildUrl('player/UpdatePushNotificationsPromptFlag'), params, config);
            }
        },
        general: {
            info: function (url) {
                return HttpUtil.GET(url + "?v=900");
            },
            gamesData: function (params) {
                var config = getSessionParams(true);
                return HttpUtil.GET(buildClientHelperUrl('GetGames'), params, config);
            },
            toggleFavouriteGame: function (params) {
                var config = getSessionParams(true);
                params = addToken(params);
                return HttpUtil.GET(buildClientHelperUrl('TogglePlayerFavoriteGame'), params, config);
            },
            countries: function () {
                var config = getSessionParams(true);
                return HttpUtil.GET(buildClientHelperUrl('GetCountries'), {}, config, true);
            },
            professions: function () {
                var config = getSessionParams(true);
                return HttpUtil.GET(buildClientHelperUrl('GetProfessions'), {}, config, true);
            },
            countriesByLabel: function (labelId) {
                var config = getSessionParams(true);
                return HttpUtil.GET(buildClientHelperUrl('GetCountriesByLabel'), { "whiteLabelId": labelId }, config);
            },
            currencies: function (languageId) {
                var config = getSessionParams(true);
                return HttpUtil.GET(buildClientHelperUrl('GetCurrencies'), { "languageId": languageId }, config);
            },
            currenciesByCountry: function (countryId) {
                var config = getSessionParams(true);
                return HttpUtil.GET(buildClientHelperUrl('GetCurrenciesByCountry'), { "countryId": countryId }, config);
            },
            whiteLabel: function (hostName, languageId) {
                var config = getSessionParams(true);
                return HttpUtil.GET(buildClientHelperUrl('GetWhiteLabelByLanguage'), { "whiteLabelName": hostName, "languageId": languageId }, config);
            },
            whiteLabelWithTracker: function (hostName, tracker, languageId) {
                var config = getSessionParams(true);
                return HttpUtil.GET(buildClientHelperUrl('WhiteLabelWithTrackerByLanguage'), { "whiteLabelName": hostName, "tracker": tracker, "languageId": languageId }, config);
            },
            getSettlementCompaniesByCountry: function (params) {
                var config = getSessionParams(true);
                return HttpUtil.GET(buildClientHelperUrl('GetSettlementCompaniesByCountry'), params, config);
            },
            redirectInternal: function (action, params, menuMode) {
                if (typeof (menuMode) === 'undefined')
                    menuMode = 'cashier-menu';
                var dataService = $injector.get('dataService');
                dataService.trackAnalyticEvent($rootScope.getPlayer(), ["pageUrl", "event", "eventInfo", "eventType"], [$location.path(), "openForm", menuMode, action]);
                $timeout(function () {
                    $location.path(action);//.search(params);
                }, 100);
            },
            getIDScanAuthToken: function (params) {
                var config = getSessionParams(true);
                return HttpUtil.POST(buildUrl('player/GetIDScanAuthToken'), params, config);
            },
            updatePopupEventApproval: function (params) {
                var config = getSessionParams();
                params = addToken(params);
                return HttpUtil.POST(buildUrl('player/UpdatePopupEventApproval'), params, config);
            }
        }
    };
}]);;
/* jshint devel: true */
/* global ltvApp */

progressPlayApp.factory('HttpUtil', ['$http', '$q', '$log', '$rootScope', function ($http, $q, $log, $rootScope) {
    'use strict';

    var self = this;

    /**
     * make the error handle form the server in one spot
     * send the message text to the
     * @error code - the error code id
     * @error message - the text message from the server
     */
    self.errorHandle = function (errorId, errorMassage, headersSent, body) {
        alert('Error Massage: ' + errorMassage + ' Error Id: ' + errorId);
   };

    self.showSpinner=function(){
    };

    self.hideSpinner=function(){
    };

    return {

        /**
         * make http GET connections and retrive information
         * @url - the remote server url.
         * @listParams - the data to be sent in the request.
         */
        GET: function (url, listParams, config) {

            self.showSpinner();
            var defferd = $q.defer();
            if (config != undefined) {
                config.params = listParams;
            }
            $http.get(url, config).
                success(function (data, status, headers, config) {
                    if(headers('Error-Message')){
                       self.errorHandle(headers('Error-Code'),headers('Error-Message'), JSON.stringify(config.headers), JSON.stringify(data));
                    } else {
                        defferd.resolve(data);
                    }
                    self.hideSpinner();
                }).

                error(function (data, status, headers, config) {

                    $log.error('cant connect to remote server and retrive information, url ' + url + ' status: ' + status);
                    defferd.reject(status);
                    self.hideSpinner();

                });

            return defferd.promise;
        },

        /**
         * make http POST connections and retrive information
         * @url - the remote server url.
         * @data - the data to be sent in the request.
         */
        POST: function (url, data, headers) {
            self.showSpinner();
            var defferd = $q.defer();

            $http.post(url, data, headers).

                success(function (data, status, headers, config) {
                    if(headers('Error-Message')){
                       self.errorHandle(headers('Error-Code'),headers('Error-Message'), JSON.stringify(config.headers), JSON.stringify(data));
                    } else {
                       
                        defferd.resolve(data);
                    }
                    self.hideSpinner();
                }).

                error(function (data, status, headers, config) {
                    $log.error('cant connect to remote server to post data, url ' + url + ' status: ' + status);
                    defferd.resolve(data);
                    self.hideSpinner();
                });

            return defferd.promise;
        },

        /**
         * make http PUT connections and retrive information
         * @url - the remote server url.
         * @data - the data to be sent in the request.
         */
        PUT: function (url, data) {
            self.showSpinner();
            var defferd = $q.defer();
            $http.put(url, data).

                success(function (data, status, headers, config) {
                    defferd.resolve(data);
                    self.hideSpinner();
                }).

                error(function (data, status, headers, config) {
                    $log.error('cant connect to remote server to update data, url ' + url + ' status: ' + status);
                    defferd.reject(status);
                    self.hideSpinner();
                });

            return defferd.promise;
        },

        /**
         * make http DELETE connections and retrive information
         * @url - the remote server url.
         * @data - the data to be sent in the request.
         */
        DELETE: function (url, listParams, config) {
            self.showSpinner();
            var defferd = $q.defer();

            if (config != undefined) {
                config.params = listParams;
            }

            $http.delete(url, config).

                success(function (data, status, headers, config) {
                    defferd.resolve(data);
                    self.hideSpinner();
                }).

                error(function (data, status, headers, config) {
                    $log.error('cant connect to remote server to post data, url ' + url + ' status: ' + status);
                    defferd.reject(status);
                    self.hideSpinner();
                });

            return defferd.promise;
        }



    };
}]);


;
progressPlayApp.factory('eventServices',['$rootScope', '$timeout', '$window', 'dataService', '$log', function ($rootScope, $timeout, $window, dataService, $log) {
    'use strict';
    return {
        onInputFocus: function (e) {

            //mixpanel.track(data.event);

            if ($rootScope.isMobile()) {
                //if (e.target) {
                //    e.target.scrollIntoView({ behavior: "smooth" });
                //}
                ////$timeout(function () {
                //dataService.setParam("showHeaderFooter", false); //}, 50);
            }
        },
        onInputBlur: function (e) {
            //if ($rootScope.isMobile()) {
            //    dataService.setParam("showHeaderFooter", true);
            //}
        }
    };
}]);


;
progressPlayApp.factory('popupServices', ['$rootScope', '$timeout', '$window', '$log', 'dataService', 'storageService', 'generalService', '$location', 'ngDialog', 'angularLoad', function ($rootScope, $timeout, $window, $log, dataService, storageService, generalService, $location, ngDialog, angularLoad) {
    'use strict';

    var popups = [];

    function setData(data, isLexicon) {
        var fixedData = angular.copy(data);
        if (isLexicon == null || isLexicon) {
            fixedData.title = $rootScope.lexicon[data.title] || data.title;
            fixedData.text1 = $rootScope.lexicon[data.text1] || data.text1;
            fixedData.button1Text = (data.button1Text ? $rootScope.lexicon[data.button1Text] : $rootScope.lexicon['ok']);
            fixedData.button2Text = (data.button2Text ? $rootScope.lexicon[data.button2Text] : $rootScope.lexicon['cancel']);
            fixedData.optInText = (data.optInText ? $rootScope.lexicon[data.optInText] : null);
            fixedData.linkText = (data.linkText ? $rootScope.lexicon[data.linkText] : $rootScope.lexicon['empty']);
        }
        else {
            fixedData.button1Text = (data.button1Text ? data.button1Text : $rootScope.lexicon['ok']);
            fixedData.button2Text = (data.button2Text ? data.button2Text : $rootScope.lexicon['cancel']);
            fixedData.optInText = (data.optInText ? data.optInText : null);
        }
        if (fixedData.text1 && fixedData.text1.indexOf("[NAME]") >= 0) {
            fixedData.text1 = fixedData.text1.replace("[NAME]", $rootScope.getPlayer().FirstName);
        }
        return fixedData;
    }

    function addToQueue(popup, method) {
        popups.push({ method: method, data: popup });
    }

    function manageQueue(poupData, method) {
        addToQueue(poupData, method);
        if (popups.length === 1) {
            $rootScope.popupSetInterval(false);
            return true;
        }
        return false;
    }

    $rootScope.$on('ngDialog.closed', function (target, elem, buttonPressed) {
        popups.shift();
        if (popups.length > 0) {
            ngDialog[popups[0].method](popups[0].data);
        }
        else
            $rootScope.popupSetInterval(true);
    });


    return {
        openMessage: function (data, ctrl, isLexicon, disableClose) {
            postToAnalytics('ClientSite', 'openMessage', 'Open message popup opened with data: ' + JSON.stringify(data));
            var cls = "ngdialog-theme-default" + " " + (data.styleType ? data.styleType : "");
            var fixedData = setData(data, isLexicon);
            disableClose = (disableClose ? true : false);
            var popupData = { template: 'dialogMessage', controller: ctrl, data: fixedData, showClose: !disableClose, closeByDocument: !disableClose, closeByEscape: !disableClose, className: cls };
            if (manageQueue(popupData, 'open')) {
                var dialog = ngDialog.open(popupData);
                //dialog.closePromise.then(function (popup) { dialogClosed(popupData); });
                return dialog;
            }
        },

        openConfirm: function (data, ctrl, isLexicon, disableClose, onOK, onCancel) {
            postToAnalytics('ClientSite', 'openConfirm', 'Confirmation popup opened with data: ' + JSON.stringify(data));
            var cls = "ngdialog-theme-default" + " " + (data.styleType ? data.styleType : "");
            var fixedData = setData(data, isLexicon);
            disableClose = (disableClose ? true : false);
            var popupData = { template: 'dialogConfirm', controller: ctrl, data: fixedData, showClose: !disableClose, closeByDocument: !disableClose, closeByEscape: !disableClose, className: cls };
            if (manageQueue(popupData, 'openConfirm')) {
                var dialog = ngDialog.openConfirm(popupData).then(function (obj) {
                    $solitics.onClick('Popup - ' + popupData.data.title, { details: 'Ok' });
                    onOK(obj);
                }, function (obj) {
                    $solitics.onClick('Popup - ' + popupData.data.title, { details: 'Cancel' });
                    if (onCancel)
                        onCancel(obj);
                });
                return dialog;
            }
        },

        openGame: function (data, ctrl, onOK, onCancel) {
            postToAnalytics('ClientSite', 'openGame', 'Open game popup opened with data: ' + JSON.stringify(data));
            var cls = "ngdialog-theme-default game-dialog";
            var popupData = { template: 'dialogGame', controller: ctrl, data: data, showClose: true, closeByDocument: true, closeByEscape: true, className: cls };
            if (manageQueue(popupData, 'openConfirm')) {
                var dialog = ngDialog.openConfirm(popupData).then(function (obj) {
                    $solitics.onClick('Popup - ' + popupData.data.title, { details: 'Ok' });
                    onOK(obj);
                }, function (obj) {
                    $solitics.onClick('Popup - ' + popupData.data.title, { details: 'Cancel' });
                    if (onCancel)
                        onCancel(obj);
                });
                return dialog;
            }

        },

        openOptions: function (data, scope, isLexicon, disableClose, onOK, onCancel) {
            postToAnalytics('ClientSite', 'openOptions', 'Open options popup opened with data: ' + JSON.stringify(data));
            var fixedData = setData(data, isLexicon);
            disableClose = (disableClose ? true : false);
            var popupData = { template: 'dialogOptions', scope: scope, data: fixedData, showClose: !disableClose, closeByDocument: !disableClose, closeByEscape: !disableClose };
            if (manageQueue(popupData, 'openConfirm')) {
                var dialog = ngDialog.openConfirm(popupData).then(function (obj) {
                    $solitics.onClick('Popup - ' + popupData.data.title, { details: 'Ok' });
                    onOK(obj);
                }, function (obj) {
                    $solitics.onClick('Popup - ' + popupData.data.title, { details: 'Cancel' });
                    if (onCancel)
                        onCancel(obj);
                });
                return dialog;
            }
        },

        openMediaSelect: function (data, scope, isLexicon, disableClose, onOK, onCancel) {
            postToAnalytics('ClientSite', 'openMediaSelect', 'Open media select popup opened with data: ' + JSON.stringify(data));
            var fixedData = setData(data, isLexicon);
            disableClose = (disableClose ? true : false);
            var popupData = { template: 'dialogMediaSelect', scope: scope, data: fixedData, showClose: !disableClose, closeByDocument: !disableClose, closeByEscape: !disableClose };
            if (manageQueue(popupData, 'openConfirm')) {
                var dialog = ngDialog.openConfirm(popupData).then(function (obj) {
                    $solitics.onClick('Popup - ' + popupData.data.title, { details: 'Ok' });
                    onOK(obj);
                }, function (obj) {
                    $solitics.onClick('Popup - ' + popupData.data.title, { details: 'Cancel' });
                    if (onCancel)
                        onCancel(obj);
                });
                return dialog;
            }
        },


        openOccupationSelect: function (data, scope, onOK, onCancel) {
            postToAnalytics('ClientSite', 'openOccupationSelect', 'Open Occupation select popup opened with data: ' + JSON.stringify(data));
            var fixedData = setData(data, true);
            angularLoad.loadCSS('/Content/acute.select.css');
            fixedData.Professions = storageService.getSessionItem('GeneralData.Professions', true);
            scope.profession = { SelectedProfession: null };

            var popupData = { template: 'dialogOccupationSelect', scope: scope, data: fixedData, showClose: false, closeByDocument: false, closeByEscape: false };
            if (manageQueue(popupData, 'openConfirm')) {
                var dialog = ngDialog.openConfirm(popupData).then(function (obj) {
                    $solitics.onClick('Popup - ' + popupData.data.title, { details: 'Ok' });
                    onOK(scope.profession.SelectedProfession);
                }, function (obj) {
                    $solitics.onClick('Popup - ' + popupData.data.title, { details: 'Cancel' });
                    if (onCancel)
                        onCancel(obj);
                });
                return dialog;
            }
        }

    };
}]);


;
progressPlayApp.factory('MessagingData',['$rootScope', 'AnalyticManager', function ($rootScope, AnalyticManager) {
    'use strict';

    return {
        send: function (destination, msg) {
            $rootScope.$broadcast(destination, msg);
        },

        trackAnalytic: function() {
            AnalyticManager.track();
        }
    };
}]);



;
var appInterceptor = (['$q', '$rootScope', function ($q, $rootScope) {


    var openConnections = 0;

    return {
        request: function (config) {
            //var isAsync = getParameterByName('isAsync', config.url);
            if ((config.url.indexOf('.html') < 0) && !config.isAsync) {
                openConnections++;
                $rootScope.showLoader();
            }
            return config;
        },
        requestError: function (rejection) {
            if ((rejection.config.url.indexOf('.html') < 0) && !rejection.config.isAsync) {
                openConnections--;
                if (openConnections <= 0) {
                    $rootScope.hideLoader();
                }
            }
            //logger.error("Error with server request: " + JSON.stringify(rejection));
            return $q.reject(rejection);
        },
        response: function (result) {
            if ((result.config.url.indexOf('.html') < 0) && !result.config.isAsync) {
                openConnections--;
                if (openConnections <= 0) {
                    $rootScope.hideLoader();
                }
            }
            return $q.resolve(result);
        },
        responseError: function (response) {
            if ((response.config.url.indexOf('.html') < 0) && !response.config.isAsync) {
                openConnections--;
                if (openConnections <= 0) {
                    $rootScope.hideLoader();
                }
            }
            logger.error("Error with server response. Response: " + JSON.stringify(response));
            return $q.reject(response);
        }
    }

    function getParameterByName(name, url) {
        if (!url) url = window.location.href;
        name = name.replace(/[\[\]]/g, '\\$&');
        var regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'),
            results = regex.exec(url);
        if (!results) return null;
        if (!results[2]) return '';
        return decodeURIComponent(results[2].replace(/\+/g, ' '));
    }
}]);;
'use srtict';

progressPlayApp.controller('headerController', ['$scope', '$location', '$window', '$filter', 'dataService', 'storageService', '$rootScope', 'generalService', 'eventServices', 'popupServices', '$log', '$timeout', '$interval', 'MessagingData', function headerController($scope, $location, $window, $filter, dataService, storageService, $rootScope, generalService, eventServices, popupServices, $log, $timeout, $interval, MessagingData) {
    $rootScope.sideBarOpened = false;
    $scope.eventServices = eventServices;
    $scope.locale = $rootScope.locale;
    $scope.locales = locales;
    $scope.globalParams = dataService.getParams();
    $scope.showLocales = !$scope.globalParams.userLoggedIn && (Object.keys(locales).length > 1);

    $scope.playerData = $rootScope.getPlayer();

    $scope.setSubMenu = function (type) {



        $scope.subMenu = ($scope.subMenu == type ? '' : type);
        if ($scope.subMenu != '') {
            $scope.subMenuOpen = true;
            $scope.subMenuClass = "contentIn";
        }
        else {

            $scope.subMenuClass = "contentOut";
            $timeout(function () {
                $scope.subMenuOpen = false;

            }, 500);
        }

    }

    $scope.init = function () {
        $scope.depositTemplate = '/templates/cashier.html?v=900';
        $scope.loginInclude = "/templates/login.html?v=900";

        //$scope.globalParams.showHeaderFooter = false;
        $scope.updateBalance();

    }

    $scope.updateBalance = function () {
        $scope.playerData = $rootScope.getPlayer();
        if ($scope.playerData) {
            if ($scope.playerData.Currency.CurrencyCode == "SEK") {
                $scope.playerBalance = $filter('currency')($scope.playerData.Account.GameBalance, '') + $scope.playerData.Currency.CurrencySymbol;
            }
            else {
                $scope.playerBalance = $filter('currency')($scope.playerData.Account.GameBalance, $scope.playerData.Currency.CurrencySymbol);
            }
        }
    }

    $scope.$on("currentBalance", function (event, currentBalance) {
        $scope.playerData = $rootScope.getPlayer();
    });

    $scope.$on("loggedIn", function (event, currentBalance) {
        $scope.updateBalance();
    });

    $scope.toggleSideBar = function (_param) {
        $rootScope.sideMenuOpened = !$rootScope.sideMenuOpened;

        //$rootScope.sideMenuOpened ? $rootScope.bodyClass = 'body_no_scroll' : $rootScope.bodyClass = 'body_scroll';

        if ($rootScope.sideMenuOpened)
            $rootScope.closeAllModals();
    }

    $scope.closeSideBar = function () {
        $rootScope.sideMenuOpened = false;
    }
}]);;
'use srtict';

progressPlayApp.controller('footerController', ['$scope', '$rootScope', 'dataService', 'contentService', '$window', '$timeout',
function footerController($scope, $rootScope, dataService, contentService, $window, $timeout) {
    $scope.closeFooter = ($rootScope.isMobile() && $rootScope.playMode == 'sport');
    $scope.showFooter = true;
    $scope.expandText = "Collapse";
    $scope.$on('settlementCompaniesArrived', function (event, obj) {
        $scope.settlementCompanies = obj;
    });

    $scope.toggleFooter = function () {
        $scope.showFooter = !$scope.showFooter;
        $scope.expandText = $scope.showFooter ? $rootScope.lexicon["collapse"] : $rootScope.lexicon["expand"];
        if ($scope.showFooter) {
            $timeout(function () {
                $window.scrollBy(0, 220);
            }, 50);
        }
    }

    $scope.init = function () {
        $scope.disclaimerText = $rootScope.label.label_title + ' <span>is operated by ProgressPlay Limited of Level 3 (suite no. 1258), Tower Business Centre, Tower Street, Swatar, Birkirkara, BKR 4013, Malta. ProgressPlay is a limited liability company registered in Malta (C58305), that is licensed and regulated by Malta Gaming Authority <span>and operates under a License Number of MGA/B2C/231/2012 issued on 16th April, 2013</span>; and is licensed and regulated by the <a href="http://www.gamblingcommission.gov.uk/" target="_blank">Gambling Commission</a>, License Number 000-039335-R-319313-012.&nbsp;<span>Persons from Great Britain&nbsp;wagering </span>via the website are doing so in reliance on the license issued by the Gambling Commission. Gambling can be addictive. Play responsibly.</span></div>';
        dataService.SettlementCompaniesByCountry().then(function (data) {
            $scope.settlementCompanies = data;
        });


        dataService.TermsAndConditions($rootScope.label.label_id, "footertext", $rootScope.locale, $rootScope.tracker).then(function (data) {
            if (data[0].hasOwnProperty('Html'))
                $scope.disclaimerText = data[0].Html;
        });

        dataService.ContentInfo("footerIcons").then(function (data) {
            if (data[0].hasOwnProperty('Html'))
                $scope.footerIcons = data[0].Html;
        });

    }


    $scope.init();
}]);;
'use srtict';

progressPlayApp.controller('loginController', ['$scope', '$location', '$window', 'eventServices', 'dataService', 'storageService', '$rootScope', 'generalService', 'popupServices', '$log', '$timeout', '$interval', 'MessagingData', '$compile',
    function loginController($scope, $location, $window, eventServices, dataService, storageService, $rootScope, generalService, popupServices, $log, $timeout, $interval, MessagingData, $compile) {

        $rootScope.initPage();
        $scope.eventServices = eventServices;
        $scope.loginUserData = storageService.getItem('loginUserData', true);
        $scope.userEmail;
        $scope.userPassword;
        $scope.mode = 'popup';

        if ($scope.loginUserData) {
            $scope.userEmail = $scope.loginUserData.email;
        }

        $scope.loginSubmit = function (form_login) {
            $scope.formSubmitted = true;
            if (form_login.$valid) {

                postToAnalytics('ClientSite', 'LoginSubmit', 'Player is trying to login');

                var encriptedPass = md5($scope.userPassword);
                var userAgent = $window.navigator.userAgent + "|" + $rootScope.isMobile();
                document.activeElement.blur();
                generalService.authentication.loginNew({
                    Email: $scope.userEmail,
                    Password: encriptedPass,
                    WhiteLabelId: $rootScope.label.label_id,
                    UserAgent: userAgent,
                    PlayMode: $rootScope.playModeID(),
                    PlatformType: 750
                }).then(
                    function (data) {
                        $scope.formSubmitted = false;
                        if (data && data.Message && data.Message == 'em_InvalidUsernameOrPassword') {
                            $scope.openMessage();
                        }
                        else if (data && data.Message && data.Message == 'em_GamStopPositive') {
                            $rootScope.clearPlayer();
                            $rootScope.closeAllModals();
                            popupServices.openMessage({ title: 'login', text1: 'login_alert_gamstop_positive' }, this);
                            postToAnalytics('ClientSite', 'setForm - registration2', 'Player login with em_GamStopPositive');
                        }
                        else if (data && data.Message && (data.Message.indexOf('em_LoginNeedToCompleteRegistration|') == 0)) {
                            var arr = data.Message.split("|");
                            storageService.setItem('registrationStep1PlayerId', arr[1]);
                            $rootScope.setForm('registration2', null, 'reg_page2');
                            postToAnalytics('ClientSite', 'setForm - registration2', 'Player login with em_LoginNeedToCompleteRegistration');
                        }
                        else {
                            if ($rootScope.checkResponse({ response: data, location: 'login', closeOnError: false })) {
                                generalService.authentication.getNetentConnectToken({ 'PlayerId': data.PlayerId, 'Token': data.Token }).then(function (gameToken) {
                                    if (data && data != '') {
                                        data.GameToken = gameToken;
                                        if (storageService.getSessionItem('startupgame', true))
                                            $rootScope.loginPlayer(data);
                                        else
                                            $rootScope.savePlayer(data);
                                    }
                                });
                                if (!storageService.getSessionItem('startupgame', true))
                                    $rootScope.loginPlayer(data);
                                postToAnalytics('ClientSite', 'LoginSuccess', 'Player is logged in');
                                if (typeof ($solitics) !== 'undefined') {
                                    $solitics.onLoginSuccess(data.PlayerId, data.Email, 'oNWpvACVZdfmQRBhzYwFCWY7');
                                    $solitics.init_popup('Tkm8GKNHpxTK447Pp5ZU59cd');
                                }
                                // if (data.ActionID !== null && data.ActionID != 0) {
                                // var popup = popupsAction[data.ActionID];
                                // if (!popup) {
                                // console.error("Missing login popup: " + data.ActionID);
                                // }
                                // else
                                // popupServices.openConfirm({ title: popup.title, text1: popup.text1, button1Text: popup.button1Text, showButton2: true }, this, false, true, popup.buttonAction);

                                // }

                                dataService.SettlementCompaniesByCountry(data.Country.CountryId);

                                firEvent('swRegistrationLoaded');
                            }
                        }
                    });
            }

        }

        $scope.openMessage = function () {
            popupServices.openConfirm({ title: 'login', text1: 'login_header_invalid', button1Text: 'ok', showButton2: false, showLink: true, linkText: 'password_forgot' }, this, true, false, null).then(
                function (value) {
                    if (value == 'link') {
                        $rootScope.setForm('forgot-password');
                    }
                }
            );
        }

        function openVerifyIDPage() {
            postToAnalytics('ClientSite', 'OpenVerifyIDPage', 'Player opened verify id wizard with a popup action: ' + $rootScope.lexicon.login_edd_required_popup_title);
            $rootScope.openModalPopupForm('verify-id-choose-type', { showUploadWizard: true, showUploadWizardPopup: false });
        }

        var popupsAction = {
            719: {
                title: $rootScope.lexicon.login_edd_required_popup_title || 'login_edd_required_popup_title',
                text1: $rootScope.lexicon.login_edd_required_popup_text || 'login_edd_required_popup_text',
                button1Text: $rootScope.lexicon.ok,
                buttonAction: openVerifyIDPage
            }
        }

    }]);


;
'use srtict';
progressPlayApp.controller('lobbyController', ['$scope', '$rootScope', '$filter', '$window', '$location', 'popupServices', 'dataService', 'storageService', 'generalService', '$log', 'MessagingData', '$timeout', '$interval', 'ngDialog',
    function lobbyController($scope, $rootScope, $filter, $window, $location, popupServices, dataService, storageService, generalService, $log, MessagingData, $timeout, $interval, ngDialog) {


        $scope.limitItems = 30;
        $scope.dataLoaded = false;
        $scope.tabs;
        $scope.selectedTab;
        $scope.selectedTabIndex = 1;
        $scope.lastSelectedTabIndex = -1;
        $scope.tabsOnScreen = 4;
        $scope.tabsCenterOffset = Math.log2($scope.tabsOnScreen) - 0.5;
        $scope.tabsStick = true;
        $scope.gamesCount = 0;
        $scope.gamesFound = false;
        $scope.selectedFilter;
        $scope.searchGame = '';
        $scope.selectedProvider = '';
        $scope.lastWindowWidth;
        $scope.globalParams = dataService.getParams();

        $scope.gameFilters = {
            "new": 1,
            "featured": 2
        };

        $scope.isFavourite = false;
        $scope.backFromGame = dataService.getParam("backFromGame");

        $scope.tabCaption = function (tab) {
            return $rootScope.lexicon['game_type_' + tab.Key.trim()];
        }

        $scope.filterCaption = function (filter) {
            return $rootScope.lexicon['game_filter_' + filter.Key.trim()];
        }

        $scope.sortCaption = function (sort) {
            return $rootScope.lexicon['game_sort_' + sort.Key.trim()];
        }

        $scope.gamesTabs = angular.element(document.querySelector('#gamesTabs'))[0];
        $scope.gamesTabsFrame = angular.element(document.querySelector('#gamesTabsFrame'))[0];

        $scope.$on('gamesArrived', function (event, msg) {
            if (!$scope.dataLoaded) {
                $scope.dataLoaded = true;
                $scope.tabs = $rootScope.Games.GameTypes;

                $scope.allProvidersCaption = $rootScope.lexicon['game_filter_providers'];
                $scope.searchGameCaption = $rootScope.lexicon["search_game"];
                $scope.filterAllCaption = $rootScope.lexicon['game_filter_all'];
                $scope.noResultsCaption = $rootScope.lexicon["games_no_result"];
                $scope.showMoreCaption = $rootScope.lexicon["showmore"];

                $scope.setGamesTabs(true);
            }
        });

        $scope.$on('loggedIn', function (event, msg) {
            $scope.playerData = $rootScope.getPlayer();
        })

        $scope.$on('loggedOut', function (event, msg) {
            $scope.playerData = $rootScope.getPlayer();
        })

        $scope.openSportFromFeed = function (game) {
            $rootScope.setCookie("sportParams", game.QueryParams.split('#/sport/')[1]);
            $rootScope.openSport();
        }



        angular.element($window).bind('load resize orientationchange', function () {
            if ($window.innerWidth != $scope.lastWindowWidth) {
                $scope.$apply(function () {
                    $scope.setGamesTabs(false);
                });
            }
            $scope.lastWindowWidth = $window.innerWidth;
        });

        $scope.setSelectedTab = function () {
            $scope.selectedTab = $scope.tabs[$scope.selectedTabIndex];
            $scope.tabClicked($scope.selectedTab, $scope.selectedTabIndex);

        }

        function convertRemToPixels(rem) {
            return rem * parseFloat(getComputedStyle(document.documentElement).fontSize);
        }

        $scope.setGamesTabs = function (setSelected) {
            $scope.dataLoaded = true;
            if ($scope.tabs) {
                $scope.tabsNumber = $scope.tabs.length;
                $scope.tabWidth = (100 / $scope.tabsNumber) + '%';
                $scope.tabsWidth = "100%";

                var lobbyBanner = angular.element(document.querySelector('#lobbyBanner'))[0];
                if (typeof lobbyBanner !== 'undefined')
                    $scope.lobbyBannerHeight = lobbyBanner.getBoundingClientRect().height;
                var gamesMenu = angular.element(document.querySelector('#gamesMenu'))[0];
                if (typeof gamesMenu !== 'undefined')
                    $scope.gamesMenuHeight = gamesMenu.getBoundingClientRect().height;

                $scope.gamesMinHeight = (window.document.documentElement.clientHeight - convertRemToPixels($rootScope.headerHeightNumber())) + 'px';
                if ($rootScope.isMobile()) {
                    $scope.tabsOnScreen = ($rootScope.isSmallMobile() ? 2 : 4);
                    $scope.tabsCenterOffset = Math.log2($scope.tabsOnScreen) - 0.5;
                    $scope.tabWidthNumber = window.document.body.clientWidth / $scope.tabsOnScreen;
                    $scope.tabWidth = $scope.tabWidthNumber + "px";
                    $scope.tabsWidthNumber = ($scope.tabs.length) * $scope.tabWidthNumber;
                    $scope.tabsWidth = $scope.tabsWidthNumber + 'px';
                }

                $timeout(function () { $scope.setSelectedTab(); }, 1)
            }
        }

        $scope.tabClicked = function (tab, index) {
            count = 1;
            var oldTab = $scope.selectedTab;
            var filterId = -1;
            var typeId = -1;

            switch (index) {
                case -200:
                    index = $scope.selectedTabIndex - 1;
                    if (index < 0) {
                        index = $scope.tabsNumber - 1;
                    }
                    tab = $scope.tabs[index];
                    break;
                case 200:
                    index = $scope.selectedTabIndex + 1;
                    if (index > $scope.tabsNumber - 1) {
                        index = 0;
                    }
                    tab = $scope.tabs[index];
                    break;
            }

            $scope.containerClass = "games_container_exit";
            $scope.selectedTab = tab;
            $scope.selectedTabIndex = index;
            $scope.lastSelectedTabIndex = index;

            $rootScope.showBanner = true;

            switch ($scope.selectedTab.Key) {
                case "new":
                case "featured":
                    filterId = $scope.gameFilters[$scope.selectedTab.Key];
                    break;
                case "favourite":
                    break;
                case "all":
                    break;
                default:
                    typeId = $scope.selectedTab.ID;
                    break;
            }
			
			
			var countryId = ($scope.playerData ? $scope.playerData.Country.CountryID : $rootScope.country.CountryID);

            var sortingFound;// = $rootScope.Games.GamesSorting[0];
            for (var i = $rootScope.Games.GamesSorting.length - 1; i >= 0; i--) {
                var sorting = $rootScope.Games.GamesSorting[i];
				if (sorting) {
                if ((sorting.CountryID == -1 || sorting.CountryID == $scope.country.CountryID) &&
                    (sorting.JurisdictionID == -1 || sorting.JurisdictionID == $rootScope.jurisdictionId) &&
                    (sorting.LabelID == -1 || sorting.LabelID == $rootScope.label.label_id) &&
                    (sorting.GameFilterID == filterId) &&
                    (sorting.GameTypeID == typeId)) {
                    sortingFound = sorting;
                    break;
					}
                }
            }
            if (sortingFound) {
                var order = angular.fromJson(sortingFound.SortOrder);
                for (var i = 0; i <= order.length - 1; i++) {
                    var currid = order[i];
                    var currgame = $filter('filter')($rootScope.Games.Games, { GameID: currid })[0];
                    if (currgame) {
                        currgame.GameOrder = i;
                    }
                }
            }
            else {
                $scope.games = $rootScope.Games;
            }
            $scope.searchGame = '';
            $scope.gamesTabsFrame.scrollLeft = $scope.tabsLeft();

            $timeout(function () {
                $scope.filterClicked('all');
            }, 10);
        }

        $scope.filterClicked = function (filter) {
            $scope.selectedFilter = filter;
            $scope.filteredGames = (filter == 'all' ? null : $filter('filter')($rootScope.Games.GameFilter, { GameFilterID: $scope.selectedFilter.GameFilterID }));
            $scope.gamesChanged();
        }

        $scope.clearSearch = function () {
            $scope.searchGame = '';
            $scope.gamesChanged();
        }

        $scope.gamesChanged = function () {
            $scope.noResultsCaption = $rootScope.lexicon["games_no_result"];
            $scope.gamesFound = false;
            $scope.gamesCount = 0;
            //$scope.games.count;
            //if (!$rootScope.isMobile()) {
            if ($window.scrollY > $rootScope.bannerHeight() + 1) {
                $window.scrollTo(0, $rootScope.bannerHeight() + 1);
            }
            //}
        }

        $scope.scrollToTop = function () {
            $window.scrollTo(0, $rootScope.bannerHeight() + 1);
        }

        $scope.tabsFilter = function (tab) {
            return tab;
        }


        $scope.showDemo = function (game) {
            return game.DemoEnabled && $scope.playerData && ($scope.playerData.IsFTD || $scope.playerData.Country.JurisdictionId != 721);
        }

        $scope.gamesRibbon = function (game) {
            var gameFilters = $filter('filter')($rootScope.Games.GamesThemes, { GameID: game.GameID }, true);
            if (gameFilters && gameFilters.length > 0) {
                switch (gameFilters[0].GameFilterID) {
                    case 1:
                        return $rootScope.lexicon["game_filter_new"];
                        break;
                    case 2:
                        return $rootScope.lexicon["game_filter_featured"];
                        break;
                }
            }
        }
        var count = 1;
        $scope.gamesFilter = function (game) {
            var result = null;
            if (game) {
                if ($scope.selectedTab) {

                    if ($scope.searchGame && $scope.searchGame.length > 0) {
                        result = ((!$scope.searchGame || $scope.searchGame.length == 0 || game.GameName.toLowerCase().indexOf($scope.searchGame.toLowerCase()) >= 0) ? game : null);
                    }
                    else if ($scope.selectedProvider) {
                        result = ((!$scope.selectedProvider || $scope.selectedProvider == game.SubProviderID) ? game : null);
                    }
                    else {
                        switch ($scope.selectedTab.Key) {
                            case "new":
                                $scope.filteredGames = $filter('filter')($rootScope.Games.GameFilter, { GameFilterID: 1 }, true);
                                if ($scope.filteredGames) {
                                    var filteredGame = $scope.filteredGames.find(function (fg) { return fg.GameID == game.GameID });
                                    if (filteredGame) {
                                        result = game;
                                    }
                                }
                                break;
                            case "featured":
                                $scope.filteredGames = $filter('filter')($rootScope.Games.GameFilter, { GameFilterID: 2 }, true);
                                if ($scope.filteredGames) {
                                    var filteredGame = $scope.filteredGames.find(function (fg) { return fg.GameID == game.GameID });
                                    if (filteredGame) {
                                        result = game;
                                    }
                                }
                                break;
                            case "favourite":
                                $scope.noResultsCaption = $rootScope.lexicon["favourites_info"];
                                result = (game.IsFavourite ? game : null);
                                break;
                            case "all":
                                result = game;
                                break;
                            default:
                                if ($scope.selectedTab.ID == game.GameTypeID) {
                                    if ($scope.filteredGames) {
                                        var filteredGame = $scope.filteredGames.find(function (fg) { return fg.GameID == game.GameID });
                                        result = (filteredGame ? game : null);
                                    }
                                    else {
                                        result = game;
                                    }
                                }
                                break;
                        }

                    }
                }
                if (result) {
                    $scope.gamesCount++;
                    $scope.gamesFound = true;
                }

                return result;
            }
        }

        $scope.tabsLeft = function () {
            var left;
            if (!$rootScope.isMobile()) {
                return 0;
            }
            if ($scope.selectedTabIndex <= Math.log2($scope.tabsOnScreen / 2) && $scope.tabsStick) {
                left = 0;
            }
            else if ($scope.selectedTabIndex >= $scope.tabsNumber - 1 - Math.log2($scope.tabsOnScreen / 2) && $scope.tabsStick) {
                left = $scope.tabsWidthNumber - window.document.body.clientWidth;
            }
            else {
                left = ((1 * ($scope.selectedTabIndex * $scope.tabWidthNumber)) - ($scope.tabWidthNumber * $scope.tabsCenterOffset));
            }

            return left;
        }

    }]);

;
'use srtict';

progressPlayApp.controller('registrationController', ['$scope', '$location', '$window', '$rootScope', '$timeout', '$interval', '$compile', '$filter', 'eventServices', 'popupServices', 'generalService', 'storageService', 'dataService', 'MessagingData', 'ngDialog', 'angularLoad',
    function registrationController($scope, $location, $window, $rootScope, $timeout, $interval, $compile, $filter, eventServices, popupServices, generalService, storageService, dataService, MessagingData, ngDialog, angularLoad) {
        $rootScope.initPage();
        $scope.eventServices = eventServices;
        $scope.user = {};
        $scope.profession = { SelectedProfession: null };
        $scope.birthdayDropdown = {};
        $scope.formSubmitted = false;
        $scope.step1PlayerId;
        $scope.currentStep = 1;
        $scope.sugaddress = '';
        $scope.currencyModel = { currencyId: null };

        $scope.welcomeBonusDescCasino;
        $scope.welcomeBonusDescSport;

        $scope.$on('promotionsArrived', function (event, data) {
            $scope.promotions = data;
            if ($scope.promotions) {
                $scope.currPromotion = $filter('filter')($scope.promotions, { isWelcome: true })[0];
                $rootScope.modalFormClass = 'reg_promo reg_promo_' + $rootScope.playMode;
                $timeout(function () { $scope.openPromotion = true; }, 500);
            }
        });

        $scope.$on('$destroy', function () {
            if ($scope.checkAddressInterval) {
                $interval.cancel($scope.checkAddressInterval);
            }
        });



        $scope.init = function (step) {
            $rootScope.scrollModalToTop();
            $scope.currentStep = step;
			
            dataService.Countries();
            dataService.Professions();
			
            $scope.initCountries();

            if ($scope.currentStep == 1) {
                dataService.Promotions(false).then(function (data) {
                    $scope.currPromotion = $filter('filter')(data, { isWelcome: true })[0];
                    if ($rootScope.playMode == 'casino')
                        $scope.welcomeBonusDescCasino = $scope.currPromotion.title + '|' + $scope.currPromotion.code;
                    else
                        $scope.welcomeBonusDescSport = $scope.currPromotion.title + '|' + $scope.currPromotion.code;
                    $scope.openPromotion = true;
                })
                if ($rootScope.isSportEnabled()) {
                    dataService.Promotions(false, true).then(function (data) {
                        var curr = $filter('filter')(data, { isWelcome: true })[0];
                        if (curr) {
                            if ($rootScope.playMode == 'casino')
                                $scope.welcomeBonusDescSport = curr.title + '|' + curr.code;
                            else
                                $scope.welcomeBonusDescCasino = curr.title + '|' + curr.code;
                        }
                    })
                }
            }
            else {
                if ($scope.user.CountryId != "103") {
                    angularLoad.loadScript('/lib/loqate.js').then(function () {
                        $timeout(function () {
                            if (pca) {
                                pca.load();
                                //if (!$scope.checkAddressInterval) {
                                //    $scope.checkAddressInterval = $interval($scope.checkAddressChange, 500);
                                //}
                            }
                        }, 500);
                    });
                }

                angularLoad.loadCSS('/Content/acute.select.css');

                document.getElementById("Line1").onchange = function () {
                    $scope.checkAddressChange();
                };

                document.getElementById("City").onchange = function () {
                    $scope.checkAddressChange();
                };

                document.getElementById("Postcode").onchange = function () {
                    $scope.checkAddressChange();
                };


                $scope.PartnerPromotionsEnabled = $rootScope.label.promotions_enabled;

                $scope.birthdayDropdown = dataService.getBirthdayObject();
                //$scope.user.CurrencyId = ($scope.user.CurrencyId ? $scope.user.CurrencyId : $rootScope.country.DefaultCurrencyID);
                $scope.updateBirthday();

                $scope.user.jurisdictionId = $rootScope.jurisdictionId;
                $scope.user.ReceiveEmail = ($rootScope.jurisdictionId == 723);
                $scope.user.ReceiveSMS = ($rootScope.jurisdictionId == 723);
                $scope.user.ReceivePhone = ($rootScope.jurisdictionId == 723);
                $scope.user.ReceivePost = ($rootScope.jurisdictionId == 723);
                $scope.user.ReceivePartner = ($rootScope.jurisdictionId == 723);
                $scope.user.promotionsChecked = ($rootScope.jurisdictionId == 723);
                if ($rootScope.jurisdictionId == 721) {
                    $scope.Professions = storageService.getSessionItem('GeneralData.Professions', true);
                }
            }

            $scope.user.WhiteLabelId = $rootScope.label.label_id;
            $scope.user.Language = $rootScope.locale;
            $scope.user.LanguageId = $rootScope.languageId;
            $scope.user.Platform = $rootScope.userAgent;
            $scope.user.Tracker = $rootScope.tracker;
            $scope.user.Dynamic = $rootScope.dynamic;
            $scope.user.ClickId = $rootScope.clickid;
            $scope.user.Btag = $rootScope.btag;
            $scope.user.UserAgent = $window.navigator.userAgent;
            $scope.user.JurisdictionId = $rootScope.jurisdictionId;

            $scope.step1PlayerId = storageService.getItem('registrationStep1PlayerId');
            if ($scope.step1PlayerId && $scope.step1PlayerId > 0) {
                if ($rootScope.currentForm != 'registration2') {
                    $rootScope.setForm('registration2', null, 'reg_page2');
                    return;
                }

                if (storageService.getItem('registrationStep1CountryId')) {
                    $scope.user.CountryId = storageService.getItem('registrationStep1CountryId');

                    var country = $filter('filter')($scope.Countries, { CountryId: parseInt($scope.user.CountryId) })[0];
                    if (country && country.DefaultCurrencyID && country.DefaultCurrencyID > 0) {
                        $scope.user.CurrencyId = country.DefaultCurrencyID + '';
                    }
                }
            }
        }

        $scope.step1Submit = function (form_reg) {
            $scope.formSubmitted = true;
            $scope.step1PlayerId = storageService.getItem('registrationStep1PlayerId');

            if (form_reg.$valid) {

                postToAnalytics('ClientSite', 'RegistrationStep1Submit', 'Player submitted step 1 in registration');

                $scope.user.Password = md5($scope.user.TempPass);
                document.activeElement.blur();
                var country = $filter('filter')($scope.Countries, { CountryId: parseInt($scope.user.CountryId) })[0];

                var params = {
                    Email: $scope.user.Email,
                    CountryId: $scope.user.CountryId,
                    CellphoneNumber: $scope.user.CellphoneNumber,
                    Password: $scope.user.Password,
                    CurrencyId: $scope.user.CurrencyId ? $scope.user.CurrencyId : 2,
                    Time: new Date().toDateString(),
                    WhiteLabelId: $rootScope.label.label_id,
                    LanguageId: $rootScope.languageId,
                    UserAgent: $window.navigator.userAgent + "|" + $rootScope.isMobile(),
                    Tracker: $rootScope.tracker,
                    Dynamic: $rootScope.dynamic,
                    ClickId: $rootScope.clickid && $rootScope.clickid.length > 0 ? $rootScope.clickid : ($rootScope.btag && $rootScope.btag.length > 0) ? $rootScope.btag : "",
                    RegistrationPlayMode: $rootScope.playModeID(),
                    WelcomeBonusDesc: $scope.welcomeBonusDescCasino,
                    WelcomeBonusDescSport: $scope.welcomeBonusDescSport
                }
                var country = $filter('filter')($scope.Countries, { CountryId: parseInt($scope.user.CountryId) })[0];
                dataService.trackAnalyticEvent($scope.user, ["pageUrl", "event", "playerCountry"], [$location.path(), "registrationStep1Submit", country.CountryName]);


                generalService.authentication.registerStep1(params).then(
                    function (data) {
                        if ($rootScope.checkResponse({ response: data, location: 'registration', closeOnError: false })) {
                            storageService.setItem('registrationStep1PlayerId', data);
                            storageService.setItem('registrationStep1CountryId', $scope.user.CountryId);
                            storageService.setItem('loginUserData', { email: $scope.user.Email, time: new Date().toDateString() }, true);

                            dataService.trackAnalyticEvent($scope.user, ["pageUrl", "event", "playerId", "playerCountry"], [$location.path(), "registrationStep1Complete", data, country.CountryName]);

                            if ($scope.user.CountryId == "221") {
                                $scope.openZipcode();
                            }
                            $rootScope.setForm('registration2', null, 'reg_page2');

                            dataService.SettlementCompaniesByCountry($scope.user.CountryId);

                        }
                        else {
                            dataService.trackAnalyticEvent($scope.user, ["pageUrl", "event", "eventInfo"], [$location.path(), "registrationStep1Failed", data.Message]);
                        }
                    });
            }

        }

        $scope.checkAddressChange = function () {

            $timeout(function () {
                $scope.user.Address = document.getElementById("Line1").value;
                $scope.user.City = document.getElementById("City").value;
                $scope.user.ZipCode = document.getElementById("Postcode").value;
                $scope.$evalAsync();
            }, 500);
        }

        $scope.step2Submit = function (form_reg) {
            $scope.formSubmitted = true;
            $scope.step1PlayerId = storageService.getItem('registrationStep1PlayerId');

            if (form_reg.$valid && $scope.user.Over18 && $scope.step1PlayerId) {

                postToAnalytics('ClientSite', 'RegistrationStep2Submit', 'Player submitted step 2 in registration. PlayerID: ' + $scope.step1PlayerId);

                $scope.updateBirthday();
                var params = {
                    PlayerId: $scope.step1PlayerId,
                    CurrencyId: $scope.user.CurrencyId,
                    FirstName: $scope.user.FirstName,
                    LastName: $scope.user.LastName,
                    Address: $scope.user.Address,
                    City: $scope.user.City,
                    ZipCode: $scope.user.ZipCode,
                    Birthday: $scope.user.Birthday,
                    GenderId: $scope.user.GenderId,
                    ProfessionId: ($scope.profession && $scope.profession.SelectedProfession) ? $scope.profession.SelectedProfession.ProfessionId : null,
                    PromotionCode: $scope.user.PromotionCode,
                    ReceiveEmail: $scope.user.ReceiveEmail,
                    ReceiveSMS: $scope.user.ReceiveSMS,
                    ReceivePhone: $scope.user.ReceivePhone,
                    ReceivePost: $scope.user.ReceivePost,
                    ReceivePartner: $scope.user.ReceivePartner,
                    UserAgent: $window.navigator.userAgent + "|" + $rootScope.isMobile()
                }

                dataService.trackAnalyticEvent($scope.user, ["pageUrl", "event", "playerId"], [$location.path(), "registrationStep2Submit", $scope.step1PlayerId]);


                generalService.authentication.registerStep2(params).then(
                    function (data) {
                        if ($rootScope.checkResponse({ response: data, location: 'registration', closeOnError: false })) {

                            postToAnalytics('ClientSite', 'RegistrationStep2Success', 'Player registration step 2 succeeded. PlayerID: ' + $scope.step1PlayerId);

                            //storageService.removeItem('registrationStep1PlayerId');
                            storageService.removeItem('registrationStep1CountryId');

                            dataService.trackAnalyticEvent(data, ["pageUrl", "event"], [$location.path(), "registrationStep2Complete"]);

                            $rootScope.loginPlayer(data, true);

                        }
                        else {
                            postToAnalytics('ClientSite', 'RegistrationStep2Failed', 'Player registration step 2 failed. PlayerID: ' + $scope.step1PlayerId);
                            dataService.trackAnalyticEvent($scope.user, ["pageUrl", "event", "eventInfo"], [$location.path(), "registrationStep2Failed", data.Message]);
                        }
                    });
            }
        }

        $scope.isUserCurrencyExistInList = function () {
            var currency = $filter('filter')($scope.Currencies, { CurrencyId: parseInt(userCurrencyId) });
            if (currency > 0)
                $scope.currencyModel = currency;
        }

        $scope.initCountries = function () {
            $scope.Countries = storageService.getSessionItem('GeneralData.Countries_' + $rootScope.label.label_id, true);
            //$scope.Currencies = storageService.getSessionItem('GeneralData.Currencies_' + $rootScope.languageId, true);
            $scope.Currencies = currencies;// storageService.getSessionItem('GeneralData.CurrenciesOfCountry_' + $rootScope.country.CountryID, true);

            if (!$scope.Countries) { $timeout(function () { $scope.initCountries(); }, 1000); return; }

            if ([68, 78, 137, 172, 184, 218].includes($rootScope.label.label_id)) {
                $scope.Countries = $filter('filter')($scope.Countries, function (item) {
                    return [78, 85, 99, 100, 104, 221].includes(item.CountryId);
                });
            }

            if (!$scope.user.CountryId) {
                if ($rootScope.country && $rootScope.country.CountryID > 0) {
                    $scope.user.CountryId = $rootScope.country.CountryID + '';
                }
                //if ($rootScope.country && $rootScope.country.DefaultCurrencyID > 0) {
                //$scope.user.CurrencyId = $rootScope.country.DefaultCurrencyID;
                if ($rootScope.country && $rootScope.country.DefaultCurrencyID > 0) {
                    var defcur = parseInt($rootScope.country.DefaultCurrencyID);
                    if ($scope.Currencies[defcur])
                        $scope.user.CurrencyId = defcur;
                    else
                        $scope.user.CurrencyId = '';

                }
            }
        }

        $scope.countryFilter = function (country) {
            return country;
        }

        $scope.updateBirthday = function () {
            $scope.user.Birthday = $scope.birthdayDropdown.selectedYear + "-" + $scope.birthdayDropdown.selectedMonth + "-" + $scope.birthdayDropdown.selectedDay + "T00:00:00";
        }

        $scope.checkBirthday = function (form_reg) {
            var birthday = new Date($scope.birthdayDropdown.selectedYear, $scope.birthdayDropdown.selectedMonth - 1, $scope.birthdayDropdown.selectedDay);
            form_reg.day.$setValidity("below18", (birthday <= $scope.birthdayDropdown.maxBirthday));
        }

        $scope.openZipcode = function () {
            $scope.currentPage = 1;
            $scope.zipcodeOpen = true;
            $scope.zipcodeClass = "modalPopupContent";
        }

        $scope.closeZipcode = function () {

            $scope.zipcodeClass = "modalPopupContentClose";
            $scope.zipcodeOpen = false;
        }

        $scope.zipcodeSubmit = function (form) {
            $scope.formZipCodeSubmitted = true;
            $scope.step1PlayerId = storageService.getItem('registrationStep1PlayerId');

            if (form.$valid) {
                generalService.authentication.getAddressByZipCode({ ZipCode: $scope.user.ZipCode }).then(
                    function (data) {
                        if ($rootScope.checkResponse({ response: data, location: 'find_address', closeOnError: false })) {
                            $scope.suggestedAddresses = data;
                            if ($scope.suggestedAddresses && $scope.suggestedAddresses.length > 1) {
                                $scope.currentPage = 2;
                            }
                            else {
                                popupServices.openConfirm({
                                    title: 'find_address',
                                    text1: 'find_address_not_found',
                                    button1Text: 'find_address_try_again',
                                    button2Text: 'find_address_enter_manually',
                                    showButton2: true
                                }, this, true, false,
                                    function () {

                                    },
                                    function () {
                                        $scope.closeZipcode();
                                    });
                            }
                        }
                    });
            }
        }

        $scope.addressSelected = function () {
            var address = JSON.parse($scope.user.suggestedAddress);
            $scope.sugaddress = JSON.parse($scope.user.suggestedAddress);
            $scope.user.Address = address.Address1 + (address.Address2 ? " " + address.Address2 : "");
            $scope.user.City = address.Town;
            $scope.zipcodeOpen = false;
            $scope.zipcodeClass = "";
            $scope.$evalAsync();
        }
    }]);

;

'use srtict';

progressPlayApp.controller('responsibleController', ['$scope', '$location', 'eventServices', 'generalService', 'storageService', '$window', '$rootScope', '$timeout', '$filter', 'popupServices', 'dataService', 'MessagingData', 'ngDialog', '$routeParams', 
    function responsibleController($scope, $location, eventServices, generalService, storageService, $window, $rootScope, $timeout, $filter, popupServices, dataService, MessagingData, ngDialog, $routeParams) {


        $scope.init = function (data) {
            $scope.userData = data;
            $scope.userUK = ($rootScope.jurisdictionId == 721);
            $scope.userCuracao = ($rootScope.jurisdictionId == 723);
            $scope.userJapan = ($scope.userData.Country.CountryId == 103);
        }


        if (!angular.equals($routeParams, {})) {
            $rootScope.init(true);
            $rootScope.labelName = labelName.toLowerCase();
            $scope.userData = { PlayerId: $routeParams.playerId, Token: $routeParams.token };
            $rootScope.Token = $routeParams.token;
            $rootScope.headerTemplate = null;
            $rootScope.footerTemplate = null;
            generalService.authentication.getPlayer({ "PlayerId": $scope.userData.PlayerId, "Token": $rootScope.Token }).then(function (data) {
                $scope.init(data);
            });
        }
        else {
            $rootScope.initPage(true);
            $scope.init($rootScope.getPlayer());
        }
        $scope.eventServices = eventServices;
        $scope.openSection = 0;
        $scope.sessionTimeoutOptions = ['X', 20, 60, 120];
        $scope.realityCheckOptions = ['X', 20, 60, 120];
        $scope.exclusionOptions = ['X', 6, 9, 12];

        $scope.limits;
        $scope.newLimits;

        $scope.getPlayerLimits = function () {
            generalService.cashier.getPlayerLimits({ "PlayerId": $scope.userData.PlayerId, "Token": $rootScope.Token }).then(
                function (data) {
                    var dict = {};
                    var limit;
                    var limitName;
                    var limitValue;
                    var limitDate;

                    for (var i = 0; i <= data.length - 1; i++) {
                        limit = data[i];

                        limit.LimitValue = (limit.LimitValue == 0 ? null : limit.LimitValue);
                        limit.NewValue = limit.LimitValue;
                        if (limit.HasPending) {
                            limitName = $rootScope.lexicon["limits_" + limit.LimitName];
                            limitValue = (limit.PendingFutureValue ? (limit.LimitName.indexOf("SessionTimeout") == 0 || limit.LimitName.indexOf("RealityCheck") == 0 ? limit.PendingFutureValue : $filter('currency')(limit.PendingFutureValue, $scope.userData.Currency.CurrencySymbol, 0)) : $rootScope.lexicon["limits_unlimited"]);
                            limitDate = $filter('date')(new Date(limit.PendingActivationDate), 'MMM dd yyyy HH:mm')
                            limit.PendingText = $rootScope.lexicon["limits_PendingMessage"].replace("[LIMIT_NAME]", limitName).replace("[LIMIT_VALUE]", limitValue).replace("[LIMIT_DATE]", limitDate);
                        }

                        dict[limit.LimitName] = limit;
                    }
                    $scope.limits = dict;
                    $scope.limits.SessionTimeoutOption = ($scope.limits.SessionTimeout.LimitValue ? $scope.limits.SessionTimeout.LimitValue : "X");
                    $scope.limits.RealityCheckOption = ($scope.limits.RealityCheck.LimitValue ? $scope.limits.RealityCheck.LimitValue : "X");
                });
        }

        $scope.init = function () {
            $scope.getPlayerLimits();
            $scope.limitsNotes = $rootScope.lexicon["limits_PendingTimeNote"].replace("[TIME]", $rootScope.lexicon["limits_PendingTime_" + ($scope.userUK ? "" : "NON") + "UK"]);
            $scope.exclusionNotes = $rootScope.lexicon["limits_ExclusionLimits"].replace("[PERIOD]", $rootScope.lexicon["limits_ExclusionPeriod_" + ($scope.userUK ? "" : "NON") + "UK"]);

            $scope.exclusionMin = ($scope.userUK ? 6 : 1);
            $scope.exclusionMax = ($scope.userUK ? 12 : 1825);
            $scope.exclusionErrorMin = $rootScope.lexicon["em_ExclusionIsBelowZero" + ($scope.userUK ? "" : "NONUK")];
            $scope.exclusionErrorMax = $rootScope.lexicon["em_ExclusionIsAboveMax" + ($scope.userUK ? "" : "NONUK")];

        }

        $scope.submit = function (form, clear) {
            $scope.formSubmitted = true;
            var type = form.$name.replace("form_", "");
            if ((form.$valid && (clear || form.$dirty)) || (type == "Exclusion" && $scope.limits.ExclusionTotal)) {
                document.activeElement.blur();
                $scope.showConfirmation(form, clear);
            }
        }

        $scope.showConfirmation = function (form, clear) {
            var type = form.$name.replace("form_", "");
            var cur = $scope.userData.Currency.CurrencySymbol;
            var title = $rootScope.lexicon["limits_title"];
            var sub_title = $rootScope.lexicon["limits_" + type + "Limits"] + $rootScope.lexicon["limits_willBeSetTo"];
            var newLimits = { "PlayerId": $scope.userData.PlayerId, "LimitsName": type };
            var prevLimits = {};
            var changed = false;
            var text1 = '';

            switch (type) {
                case "Deposit":
                    newLimits.ValuePerDay = (clear ? null : $scope.limits.DepositPerDay.NewValue);
                    newLimits.ValuePerWeek = (clear ? null : $scope.limits.DepositPerWeek.NewValue);
                    newLimits.ValuePerMonth = (clear ? null : $scope.limits.DepositPerMonth.NewValue);
                    prevLimits.ValuePerDay = $scope.limits.DepositPerDay.LimitValue;
                    prevLimits.ValuePerWeek = $scope.limits.DepositPerWeek.LimitValue;
                    prevLimits.ValuePerMonth = $scope.limits.DepositPerMonth.LimitValue;
                    break;
                case "Wager":
                    newLimits.ValuePerDay = (clear ? null : $scope.limits.WagerPerDay.NewValue);
                    newLimits.ValuePerWeek = (clear ? null : $scope.limits.WagerPerWeek.NewValue);
                    newLimits.ValuePerMonth = (clear ? null : $scope.limits.WagerPerMonth.NewValue);
                    prevLimits.ValuePerDay = $scope.limits.WagerPerDay.LimitValue;
                    prevLimits.ValuePerWeek = $scope.limits.WagerPerWeek.LimitValue;
                    prevLimits.ValuePerMonth = $scope.limits.WagerPerMonth.LimitValue;
                    break;
                case "Loss":
                    newLimits.ValuePerDay = (clear ? null : $scope.limits.LossPerDay.NewValue);
                    newLimits.ValuePerWeek = (clear ? null : $scope.limits.LossPerWeek.NewValue);
                    newLimits.ValuePerMonth = (clear ? null : $scope.limits.LossPerMonth.NewValue);
                    prevLimits.ValuePerDay = $scope.limits.LossPerDay.LimitValue;
                    prevLimits.ValuePerWeek = $scope.limits.LossPerWeek.LimitValue;
                    prevLimits.ValuePerMonth = $scope.limits.LossPerMonth.LimitValue;
                    break;
                case "SessionTimeout":
                    newLimits.ValuePerDay = $scope.limits.SessionTimeout.NewValue;
                    prevLimits.ValuePerDay = $scope.limits.SessionTimeout.LimitValue;
                    changed = true;
                    break;
                case "RealityCheck":
                    newLimits.ValuePerDay = $scope.limits.RealityCheck.NewValue;
                    prevLimits.ValuePerDay = $scope.limits.RealityCheck.LimitValue;
                    changed = true;
                    break;
                case "TimeOut":
                    newLimits.ValuePerDay = $scope.limits.TimeOut;
                    break;
                case "Exclusion":
                    newLimits.ValuePerDay = $scope.limits.Exclusion;
                    break;
            }

            switch (type) {
                case "Deposit":
                case "Wager":
                case "Loss":
                    if (newLimits.ValuePerDay != prevLimits.ValuePerDay) {
                        text1 += $rootScope.lexicon["limits_" + type + "PerDay"] + " : " + (newLimits.ValuePerDay ? $filter('currency')(newLimits.ValuePerDay, cur, 0) : (type == "Deposit" ? $filter('currency')($scope.limits.DepositPerDay.LimitDefaultValue, cur, 0) : $rootScope.lexicon["limits_unlimited"])) + "<br/>";
                    }
                    if (newLimits.ValuePerWeek != prevLimits.ValuePerWeek) {
                        text1 += $rootScope.lexicon["limits_" + type + "PerWeek"] + " : " + (newLimits.ValuePerWeek ? $filter('currency')(newLimits.ValuePerWeek, cur, 0) : (type == "Deposit" ? $filter('currency')($scope.limits.DepositPerWeek.LimitDefaultValue, cur, 0) : $rootScope.lexicon["limits_unlimited"])) + "<br/>";
                    }
                    if (newLimits.ValuePerMonth != prevLimits.ValuePerMonth) {
                        text1 += $rootScope.lexicon["limits_" + type + "PerMonth"] + " : " + (newLimits.ValuePerMonth ? $filter('currency')(newLimits.ValuePerMonth, cur, 0) : (type == "Deposit" ? $filter('currency')($scope.limits.DepositPerMonth.LimitDefaultValue, cur, 0) : $rootScope.lexicon["limits_unlimited"])) + "<br/>";
                    }
                    break;
                case "SessionTimeout":
                case "RealityCheck":
                    if (newLimits.ValuePerDay != prevLimits.ValuePerDay) {
                        sub_title = $rootScope.lexicon["limits_" + type + "Limits"] + $rootScope.lexicon["limits_willBeSetTo"] + (newLimits.ValuePerDay ? newLimits.ValuePerDay : $rootScope.lexicon["limits_unlimited"]);
                        text1 = " ";
                    }
                    break;
                case "Exclusion":
                case "TimeOut":
                    if (newLimits.ValuePerDay >= 1 || (type == 'Exclusion' && $scope.limits.ExclusionTotal)) {
                        sub_title = $rootScope.lexicon["limits_" + type + "Limits"].replace("[PERIOD]", $rootScope.lexicon["limits_ExclusionPeriod_" + ($scope.userUK ? "" : "NON") + "UK"]) + ": " + (newLimits.ValuePerDay ? newLimits.ValuePerDay : $rootScope.lexicon["limits_unlimited"]);
                        text1 += $rootScope.lexicon["limits_TimeOut_Approve"];
                    }
                    break;
            }

            changed = (text1.length > 0);
            if (changed) {
                $scope.newLimits = newLimits;
                ngDialog.openConfirm({ template: 'dialogConfirm', controller: this, scope: $scope, data: { title: title, sub_title: sub_title, text1: text1, button1Text: $rootScope.lexicon["confirm"], button2Text: $rootScope.lexicon["cancel"], showButton2: true } }).then($scope.setLimits, $scope.setLimitsCancelled);
            }
        }

        $scope.setLimits = function (value) {
            switch ($scope.newLimits.LimitsName) {
                case "Deposit":
                case "Wager":
                case "Loss":
                case "SessionTimeout":
                case "RealityCheck":
                    $scope.newLimits.Token = $rootScope.Token;
                    generalService.cashier.setPlayerLimits($scope.newLimits).then(
                        function (data) {
                            if (data.Message) {
                                popupServices.openMessage({ title: 'limits_title', text1: data.Message }, this);
                            }
                            else {
                                if ($scope.newLimits.LimitsName == 'RealityCheck') {
                                    $rootScope.logoutAction();
                                    return;
                                }
                            }
                            $scope.getPlayerLimits();
                        });
                    break;
                case "TimeOut":
                case "Exclusion":
                    $scope.newLimits.ItemId = $scope.newLimits.ValuePerDay;
                    $rootScope.openModalPopupForm('account-change-approval', $scope.newLimits.LimitsName + "|" + $scope.newLimits.ItemId);
                    break;
            }
        }

        $scope.setLimitsCancelled = function () {
        }

        $scope.sessionTimeoutPicked = function () {
            $scope.limits.SessionTimeout.NewValue = parseInt($scope.limits.SessionTimeoutOption);
        }

        $scope.sessionTimeoutChanged = function () {
            $scope.limits.SessionTimeoutOption = ($scope.limits.SessionTimeout.NewValue ? $scope.limits.SessionTimeout.NewValue : "X");
        }

        $scope.realityCheckPicked = function () {
            $scope.limits.RealityCheck.NewValue = parseInt($scope.limits.RealityCheckOption);
        }

        $scope.realityCheckChanged = function () {
            $scope.limits.RealityCheckOption = ($scope.limits.RealityCheck.LimitValue ? $scope.limits.RealityCheck.LimitValue : "X");
        }



        $scope.exclusionPicked = function () {
            $scope.limits.ExclusionTotal = false;
            $scope.limits.Exclusion = parseInt($scope.limits.ExclusionOption);
        }

        $scope.totalExclusionPicked = function () {
            $scope.limits.ExclusionOption = "X";
            $scope.limits.Exclusion = parseInt($scope.limits.ExclusionOption);
        }

        $scope.exclusionChanged = function () {
            $scope.limits.ExclusionOption = ($scope.limits.Exclusion ? $scope.limits.Exclusion : "X");
        }


    }]);



;
'use srtict';

progressPlayApp.controller('loadersController', ['$scope', '$rootScope', 'storageService', 'generalService', 'dataService', 'popupServices', function loadersController($scope, $rootScope, storageService, generalService, dataService, popupServices) {

    $scope.showPushNotificationsOverlay = false;
    $scope.globalParms = dataService.getParams();

    $scope.getPushOfferText = function () {
		if ($rootScope.lexicon && $rootScope.lexicon.push_notifications_offer)
			return $rootScope.lexicon.push_notifications_offer.replace('[LABELNAME]', $rootScope.labelName);
		return "";
    }

    $scope.checkPushNotificationsPrompt = function () {
        logger.info(uniqueSessionId + ' - checkPushNotificationsPrompt() called in loaderController.js. swRegistration is ' + (swRegistration ? '' : 'not ') + 'existing');
        var player = $rootScope.getPlayer();
        if (!swRegistration) return;
        swRegistration.pushManager.getSubscription().then(function (subscription) {
            logger.info(uniqueSessionId + ' - checkPushNotificationsPrompt getSubscription() subscription is: ' + JSON.stringify(subscription));
            var prerssedPushNotificationsPrompt = storageService.getItem('prerssedPushNotificationsPrompt', true);
            logger.info(uniqueSessionId + ' - checkPushNotificationsPrompt storageService.getItem("prerssedPushNotificationsPrompt") is: ' + (prerssedPushNotificationsPrompt ? (prerssedPushNotificationsPrompt.value + ' and saved on: ' + new Date(prerssedPushNotificationsPrompt.timestamp).toString()) : 'null'));
            if ((!prerssedPushNotificationsPrompt || !prerssedPushNotificationsPrompt.value)
                || (prerssedPushNotificationsPrompt && prerssedPushNotificationsPrompt.timestamp < new Date().getTime()))
            {
                if (subscription == null && player && player.ShowPushNotificationsPrompt === true) {
                    $scope.showPushNotificationsPrompt = true;
                    //$scope.showPushNotificationsOverlay = true;
                    $scope.$evalAsync();
                }
                logger.info(uniqueSessionId + ' - checkPushNotificationsPrompt $scope.showPushNotificationsPrompt is: ' + $scope.showPushNotificationsPrompt);

            }
            if (subscription && player) {
                updateSubscriptionOnServer(subscription, player.PlayerId, 'general');
                logger.info(uniqueSessionId + ' - checkPushNotificationsPrompt updateSubscriptionOnServer() was called for player id: ' + player.PlayerId);
            }
        });
    }

    $scope.acceptPushNotifications = function () {
        $scope.showPushNotificationsOverlay = true;
        initializeWebPushUI($rootScope.getPlayer().PlayerId, 'acceptPNPressed');
        storageService.setItem('prerssedPushNotificationsPrompt', { value: true, timestamp: new Date().setDate(new Date().getDate() + 14) }, true);
        $scope.showPushNotificationsPrompt = false;
        $scope.$evalAsync();
        //updatePlayerPushFlag(false);
        postToAnalytics('PushNotification', 'PlayerAcceptedNotificationsInternalPrompt', 'Player accepted notifications internal prompt. player: ' + $rootScope.getPlayer().PlayerId);
    }

    $scope.denyPushNotifications = function () {
        storageService.setItem('prerssedPushNotificationsPrompt', { value: true, timestamp: new Date().setDate(new Date().getDate() + 3) }, true);
        $scope.showPushNotificationsPrompt = false;
        //$scope.showPushNotificationsOverlay = false;
        $scope.$evalAsync();
        //updatePlayerPushFlag(false);
        postToAnalytics('PushNotification', 'PlayerDeniedNotificationsInternalPrompt', 'Player denied notifications internal prompt. player: ' + $rootScope.getPlayer().PlayerId);
    }

    $scope.removePushPrompt = function () {
        storageService.setItem('prerssedPushNotificationsPrompt', { value: true, timestamp: new Date().setDate(new Date().getDate() + 1) }, true);
        $scope.showPushNotificationsPrompt = false;
        //$scope.showPushNotificationsOverlay = false;
        $scope.$evalAsync();
        postToAnalytics('PushNotification', 'PlayerRemovedNotificationsInternalPrompt', 'Player removed (clicked X) notifications internal prompt. player: ' + $rootScope.getPlayer().PlayerId);
    }

    function updatePlayerPushFlag(showPushPrompt) {
        var player = $rootScope.getPlayer();
        if (player) {
            generalService.personalInfo.updatePushNotificationsPromptFlag({ PlayerId: player.PlayerId, PushNotificationsFlag: showPushPrompt });
        }
    }
}]);;
'use srtict';

progressPlayApp.controller('menuController', ['$scope', '$rootScope', '$location', '$window', '$timeout', 'dataService', 'storageService', 'popupServices', function menuController($scope, $rootScope, $location, $window, $timeout, dataService, storageService, popupServices) {
    $rootScope.initPage(true);

    $scope.playerData = $rootScope.getPlayer();

    $scope.init = true;
    $scope.menuMode;
    $scope.depositMode;
    $scope.globalParams = dataService.getParams();
    

    $scope.menuOpen = true;


    $scope.init = function (menuMode) {
        $scope.menuMode = menuMode;

        switch ($scope.menuMode)
        {
            case 'cashier-menu':
                if ($rootScope.formParams) {
                    $scope.go($rootScope.formParams);
                    //$rootScope.formParams = '';
                }
                else {
                    if ($rootScope.isMobile() && window.innerWidth <= 800) {
                        $scope.menuOpen = true;
                    }
                    else {
                        $scope.go('deposit');
                    }
                }
                break;
            case 'account':
                if ($rootScope.formParams) {
                    $scope.go($rootScope.formParams);
                    $rootScope.formParams = '';
                }
                else {
                    if ($rootScope.isMobile() && window.innerWidth <= 800) {
                        $scope.menuOpen = true;
                    }
                    else {
                        $scope.go('account-details');
                    }
                }

               
                break;
        } 
    }

    $scope.go = function (action) {

        var actionModal = '';
        if (typeof action == 'object') {
            actionModal = action.modal;
            $rootScope.formParams = action;
        }
        else actionModal = action;
        if ($scope.currentPage != actionModal) {
            $scope.currentPage = actionModal;

            if (actionModal == "deposit" || actionModal == "withdrawal") {
                $scope.cashierMode = actionModal;
                actionModal = 'cashier';
            }
            $scope.menuOpen = false;
            $scope.cashierTemplate = '';
            if (!$scope.init) {
                dataService.trackAnalyticEvent($rootScope.getPlayer(), ["pageUrl", "event", "eventInfo", "eventType"], [$location.path(), "openForm", $scope.menuMode, actionModal]);
            }
            $scope.init = false;
            $timeout(function () {
                $scope.cashierTemplate = '/templates/' + actionModal + '.html?v=908';
            }, 100);
        }
        else {
            if ($rootScope.isMobile()) {
                $scope.menuOpen = !$scope.menuOpen;
            }


        }
        
    };
}]);


;
'use srtict';
progressPlayApp.controller('cashierController', ['$rootScope', '$scope', '$location', '$window', '$filter', '$log', '$timeout', '$interval', 'dataService', 'storageService', 'generalService', 'eventServices', 'popupServices', 'MessagingData', 'ngDialog', 'angularLoad',
    function cashierController($rootScope, $scope, $location, $window, $filter, $log, $timeout, $interval, dataService, storageService, generalService, eventServices, popupServices, MessagingData, ngDialog, angularLoad) {

        $rootScope.initPage(true);
        $scope.eventServices = eventServices;
        $scope.playerData = $rootScope.getPlayer();

        $scope.cardTypes = dataService.getCreditCardsList();
        $scope.methodParams = {};
        $scope.selectedMethod;
        $scope.paymentMethods;
        $scope.paymentMethodsCreditCards;
        $scope.currentMethods;
        $scope.formSubmitted = false;
        $scope.isExistingMethod = false;
        $scope.existingMethodId;
        $scope.noExistingMethod;
        $scope.cashierMode;
        $scope.methodsOpen = false;
        $scope.cashierMethodsFrame = angular.element(document.querySelector('#cashierMethodsFrame'))[0];
        $scope.payPalRendered = false;
        $scope.creditCardTypeClass = "credit_card_type_Generic";
        $scope.isUKCCTypeDebitOnly = false;
        $scope.cardIsNotAccepted = false;
        $scope.existingCardIsNotAccepted = false;
        $scope.savedIdentifier = null;

        $scope.paypalv2 = window.PPconfig.paypalv2;

        var ukBinsOfCreditCardTypeList = [];

        $scope.formParams = $rootScope.formParams;
        $rootScope.formParams = '';

        $scope.$on('$destroy', function () {
            removeEvent(window, "message", handleMessageRecievedFromIframe);
            showDepositRedirectIframeEvent();
        });

        var showDepositRedirectIframeEvent = $scope.$on('showDepositRedirectIframe', function (event, data) {
            if (data.ThreeDRedirect.RedirectUrl == null || data.ThreeDRedirect.RedirectUrl == '')
                return;
            if ((data.ThreeDRedirect.PaRequestKey3d == null || data.ThreeDRedirect.PaRequestKey3d == '')
                && (data.ThreeDRedirect.MdRequestKey3d == null || data.ThreeDRedirect.MdRequestKey3d == '')
                && (data.ThreeDRedirect.MethodPayload == null || data.ThreeDRedirect.MethodPayload == '')
                && (data.ThreeDRedirect.CReqKey3d == null || data.ThreeDRedirect.CReqKey3d == ''))
                url = data.ThreeDRedirect.RedirectUrl;
            else {
                var redirectObj = null;
                var style = undefined;
                if (data.ThreeDRedirect.MethodPayload != null && data.ThreeDRedirect.MethodPayload != '') {
                    $rootScope.showLoader();
                    redirectObj = {
                        threeDSMethodData: data.ThreeDRedirect.MethodPayload
                    };
                    postToUrl(data.ThreeDRedirect.RedirectUrl, redirectObj, 'POST');
                    $scope.threeDMethodCompletionInterval = setTimeout(function () {
                        $scope.threeDMethodCompletionInterval = undefined;
                        depositAfterRedirect({ ThreeDMethodCompletionInd: 'N' });
                    }, 10000);
                    return;
                }
                else {
                    redirectObj = {
                        'redirectUrl': data.ThreeDRedirect.RedirectUrl
                    }
                    if (data.ThreeDRedirect.CReqKey3d != null && data.ThreeDRedirect.CReqKey3d != '')
                        redirectObj.creq = data.ThreeDRedirect.CReqKey3d;
                    else {
                        redirectObj.PaReq = data.ThreeDRedirect.PaRequestKey3d;
                        if (data.ThreeDRedirect.MdRequestKey3d && data.ThreeDRedirect.MdRequestKey3d != '')
                            redirectObj.MD = data.ThreeDRedirect.MdRequestKey3d
                    }
                }
                var url = buildQueryParams("Services/RedirectProvider.aspx", redirectObj);
            }
            $rootScope.openModalIFrame('verifyYourCard', url, style);
        });

        function handleMessageRecievedFromIframe(e) {

            try {
                if (e && typeof e !== 'undefined' && e.data)
                    postToAnalytics('ClientSite', 'handleMessageRecievedFromIframe', 'Player returned from depoit redirect. Message response: ' + JSON.stringify(e));

                try {
                    if ('source' in e && 'PAYPAL' in e.source)
                        return;
                }
                catch (ex) { }
                var data = JSON.parse(e.data);

                if (data.Source && data.Source == '3dsecure') {
                    if (data.ThreeDSMethodData && data.ThreeDSMethodData != '') {
                        if ($scope.threeDMethodCompletionInterval != undefined) {
                            clearTimeout($scope.threeDMethodCompletionInterval);
                            data.ThreeDMethodCompletionInd = 'Y';
                        }
                        else return;
                    }
                    depositAfterRedirect(data);
                    $scope.$apply(function () {
                        $rootScope.closeModalIFrame();
                    });
                }
                else if (data.Source == 'ChildWindowRedirect') {
                    $rootScope.closeModalIFrame();
                    handleChildWindowRedirect(data.IsSuccess, $scope.methodParams.cashierAmount, $scope.selectedMethod.SysName, data.IsWithdrawalMethod);
                }
                else if (data.Source && data.Source == 'trustly') {

                }
            }
            catch (ex) {
                postToAnalytics('ClientSite', 'handleMessageRecievedFromIframeError', 'Player returned from depoit redirect and got an error in client side. Error: ' + JSON.stringify(ex));
                return;
            }
        }

        function handleChildWindowRedirect(status, amount, methodName, isWithdrawalMethod) {
            if (childWindow)
                childWindow.close();
            if (status == 0) {
                var popupObj = { title: 'deposit', text1: 'em_FailedToDeposit' };
                if (isWithdrawalMethod)
                    popupObj = { title: 'withdrawal', text1: 'em_FailedWithrawal' };
                popupServices.openMessage(popupObj, this);
                dataService.trackAnalyticEvent($scope.playerData, ["pageUrl", "event", "eventAmount", "eventType", "eventInfo"], [$location.path(), "depositFail", amount, methodName, '']);
            }
            else if (status == 1) {
                if (isWithdrawalMethod) {
                    //var withdrawalParams = storageService.getSessionItem('withdrawalParams', true);
                    //if (withdrawalParams) {
                    //    $scope.params = withdrawalParams;
                    //    $scope.params.ReturnedFromProvider = true;
                    //    $scope.withdrawal();
                    //}
                    popupServices.openMessage({ title: 'withdrawal', text1: 'withdrawal_success' }, this);
                }
                else {
                    $rootScope.afterSuccessfulDeposit(amount, methodName);
                    var intervalCounter = 0;
                    var interval = setInterval(function () {
                        $rootScope.getPlayerBalance();
                        intervalCounter++;
                        if (intervalCounter == 5)
                            clearInterval(interval);
                    }, 1000);
                }
            }
            else if (status == 2) {
                bodyText = lexicon['em_DepositPending_' + methodName] || lexicon['em_DepositPending'];
                popupServices.openMessage({ title: lexicon['deposit'], text1: bodyText }, this, false);
            }
        }

        $scope.init = function () {
            if ($scope.playerData == null || !$rootScope.isLoggedIn()) {
                $rootScope.logoutAction();
                return;
            }
            bindEvent(window, 'message', handleMessageRecievedFromIframe);

            postToAnalytics('ClientSite', 'CashierMode', 'Player entered cashier with mode: ' + $scope.cashierMode);

            var redirectDeposit = storageService.getSessionItem('redirectDeposit', true);
            if (redirectDeposit) {
                var status = sessionStorage.getItem('redirectDepositIsSuccess');
                storageService.removeSessionItem('redirectDeposit');
                storageService.removeSessionItem('redirectDepositIsSuccess');
                handleChildWindowRedirect(status, redirectDeposit.Amount, redirectDeposit.Method);
            }

            if ($scope.playerData.Country.JurisdictionId == 721 || $scope.playerData.Country.CountryId == 99) {
                angularLoad.loadScript('https://www.paypalobjects.com/api/checkout.min.js').then(function () { });
                angularLoad.loadScript('https://js.braintreegateway.com/web/3.39.0/js/client.min.js');
                angularLoad.loadScript('https://js.braintreegateway.com/web/3.39.0/js/paypal-checkout.min.js');
            }

            $rootScope.showLoader();
            $scope.initMethods();

            $rootScope.hideLoader();
            var depositCodeSession = storageService.getSessionItem('depositCode');
            if (depositCodeSession != null && depositCodeSession != '' && depositCodeSession.length > 0 && depositCodeSession != 'deposit') {
                $scope.methodParams.depositCode = depositCodeSession;
                storageService.removeSessionItem('depositCode')
            }
            if ($scope.methodParams.depositCode != '' && $scope.formParams && (typeof $scope.formParams == 'object') && $scope.formParams.depositCode && $scope.formParams.depositCode != '')
                $scope.methodParams.depositCode = $scope.formParams.depositCode;

            $scope.methodParams.cashierAmount = $scope.formParams ? $scope.formParams.amount : undefined;

			$scope.methodParams.depositCodeChecked = false;


            $scope.amountTitle = $rootScope.lexicon[($scope.cashierMode + "_amount")];
            $scope.submitTitle = $rootScope.lexicon[$scope.cashierMode];
            $scope.formTitle = $rootScope.lexicon[$scope.cashierMode];
            $scope.amountPattern = ($scope.cashierMode == 'withdrawal' ? '[0-9]+(\.[0-9]{1,2})?$' : '[0-9]+$');
            $scope.paybyphoneShowValidation = ($scope.playerData.MobileNumberValidation && $scope.playerData.MobileNumberValidation != '');
            $scope.methodParams.mobileNumber = $scope.playerData.CellphoneNumber;
            $scope.methodParams.phoneCode = "+" + $scope.playerData.Country.PhoneCode;

            $scope.initExpiration();

            if ($scope.cashierMode == 'withdrawal') {
                if ($scope.playerData.Account.AccountBalance == 0) {
                    $scope.amountReadonly = true;
                }
                $scope.withdrawalText = $rootScope.lexicon["withdrawal_available"].replace("[AMOUNT]", $rootScope.getPlayerBalanceCurrency($scope.playerData, $scope.playerData.Account.AccountBalance)) + "<br/>";
                if ($scope.playerData.Country.JurisdictionId == 721 && $rootScope.lexicon["withdrawal_uk_cancel_notice"]) {
                    $scope.withdrawalText += "<br/>" + $rootScope.lexicon["withdrawal_uk_cancel_notice"] + "<br/>";
                    $scope.withdrawalText += "<br/>" + $rootScope.lexicon["withdrawal_fee_text"].replace("[FEE]", $rootScope.getPlayerBalanceCurrency($scope.playerData, ($scope.playerData.Currency.CurrencyCode == "SEK" ? 25 : 2.5)));
                }

                if ($scope.playerData.Account.BonusBalance > 0) {
                    $scope.withdrawalText += "<br/>" + $rootScope.lexicon["current_bonus_balance"].replace("[AMOUNT]", $rootScope.getPlayerBalanceCurrency($scope.playerData, $scope.playerData.Account.BonusBalance)) + "<br/><br/>" + $rootScope.lexicon["withdrawal_bonus_warning"] + "<br/>";

                }
            }

            //These numbers are first 6 digits of credit cards of type Credit. Credit type cards are not allowed, only debit, so we need to verify that the used card for deposite does not contain first 6 digits from this list 
            ukBinsOfCreditCardTypeList = new CreditCardBins().getUkBins();


            if ($scope.currentMethods.find(m => m.SysName.toLowerCase() == 'paypal'))
                renderPaypalButton();
        };

        $scope.initExpiration = function () {
            $scope.expirationDropdown = { years: [], months: [], currentYear: "", currentMonth: "" };
            for (var i = 1; i <= 12; i++) { $scope.expirationDropdown.months[i - 1] = (i < 10) ? "0" + i : i + ""; }
            var today = new Date();
            var currentYear = today.getFullYear();
            var currentMonth = (today.getMonth() + 1);
            var maxYear = currentYear + 20;
            var minYear = currentYear;
            var yearsCounter = 0;
            for (var i = minYear; i <= maxYear; i++) { $scope.expirationDropdown.years[yearsCounter] = i; yearsCounter++; }
            $scope.expirationDropdown.currentYear = currentYear;
            $scope.expirationDropdown.currentMonth = currentMonth;
        }

        $scope.initMethods = function () {
            $scope.paymentMethods = storageService.getSessionItem("PaymentMethods", true);
            $scope.paymentMethodsCreditCards = storageService.getSessionItem("PaymentMethodsCreditCards", true);

            if (!$scope.paymentMethods) { $timeout(function () { $scope.initMethods(); }, 1000); return; }

            //var appleSessionExist = false;;
            if ($scope.paymentMethods.hasOwnProperty('applepay') && !$rootScope.applePaySupported) {
                delete $scope.paymentMethods.applepay;
            }
            //    if (window.ApplePaySession) {

            //        appleSessionExist = true;
            //        var merchantIdentifier = 'merchant.progressplay.com.adyen.MerchantAccount.test';
            //        var promise = ApplePaySession.canMakePaymentsWithActiveCard(merchantIdentifier);

            //        promise.then(function (canMakePayments) {
            //            if (!canMakePayments) {
            //                delete $scope.paymentMethods.applepay;
            //            }
            //            $scope.currentMethods = $filter('filter')($filter('toArray')($scope.paymentMethods), ($scope.cashierMode == "deposit" ? { ShowInDeposit: true } : { ShowInWithdrawal: true }));
            //            $scope.methodChanged(getSelectedMethod($scope.paymentMethods));
            //            $timeout(function () { $scope.initMethodsFrame(); }, 1);
            //        });
            //    }
            //    else {
            //        delete $scope.paymentMethods.applepay;
            //    }
            //}

            $scope.currentMethods = $filter('filter')($filter('toArray')($scope.paymentMethods), ($scope.cashierMode == "deposit" ? { ShowInDeposit: true } : { ShowInWithdrawal: true }));
            $scope.methodChanged(getSelectedMethod($scope.paymentMethods));
            $timeout(function () { $scope.initMethodsFrame(); }, 1);

        }

        $scope.initMethodsFrame = function () {
            $scope.tabsOnScreen = ($rootScope.isSmallMobile() ? 2 : 4);
            $scope.tabsCenterOffset = Math.log2($scope.tabsOnScreen) - 0.5;
            $scope.tabWidthNumber = $scope.cashierMethodsFrame.clientWidth / ($scope.tabsOnScreen + 0.5);
            $scope.tabWidth = $scope.tabWidthNumber + "px";
            $scope.tabsWidthNumber = ($scope.currentMethods.length) * $scope.tabWidthNumber;
            $scope.tabsWidth = $scope.tabsWidthNumber + 'px';
        }

        angular.element($window).bind('load resize orientationchange', function () {
            $scope.$apply(function () {
                $scope.initMethodsFrame();
                $scope.methodChanged($scope.selectedMethod, $scope.selectedTabIndex);
            });
        });

        var getSelectedMethod = function (methods) {
            var lastUsed = $filter('filter')($filter('toArray')($scope.paymentMethods), ($scope.cashierMode == "deposit" ? { ShowInDeposit: true, MethodLastUsed: true } : { ShowInWithdrawal: true, MethodLastUsed: true }))
            if (!lastUsed || lastUsed.length == 0)
                return $filter('filter')($filter('toArray')(methods))[0];
            return lastUsed[0];
        }

        $scope.filterMethod = function (method) {
            return (($scope.cashierMode == 'deposit' && method.ShowInDeposit) || ($scope.cashierMode != 'deposit' && method.ShowInWithdrawal) ? method : null)
        }

        $scope.methodChanged = function (method, index, setDefaultAmount) {
            if (method) {
                if ($scope.selectedMethod != method) {

                    //removeEvent(window, "message", handleMessageRecievedFromIframe);
                    $scope.menuOpen = false;
                    $scope.selectedMethod = method;
                    $scope.selectedTabIndex = index;
                    $scope.methodTemplate = (!method.IsGeneric ? '/templates/payment-methods/' + method.SysName + '.html?v=902' : '');

                    $scope.selectedMethod.Name = ($rootScope.lexicon[method.SysName] ? $rootScope.lexicon[method.SysName] : method.SysName);

                    $scope.methodName = $rootScope.lexicon[method.SysName];

                    $scope.methodInfo = $rootScope.lexicon[method.SysName + '_Info'] ? $rootScope.lexicon[method.SysName + '_Info'] : "";

                    postToAnalytics('ClientSite', 'DepositMethodChanged', 'Player changed deposit method to: ' + $scope.selectedMethod.Name);

                    if ($scope.cashierMode == "deposit") {
                        $scope.minDeposit = method.MinDeposit;
                        $scope.maxDeposit = method.MaxDeposit;
                        $scope.amountReadonly = false;
                        $timeout(function () {
                            $scope.amountOptions = (method.AmountOptions ? method.AmountOptions.split("|") : null);

                            if ($scope.playerData.Currency.CurrencyMultiplier > 1) {
                                for (var i = 0; i <= $scope.amountOptions.length - 1; i++) {
                                    $scope.amountOptions[i] *= $scope.playerData.Currency.CurrencyMultiplier;
                                }
                            }

                            if (setDefaultAmount)
                                $scope.methodParams.cashierAmount = null;
                            $scope.methodParams.cashierAmount = $scope.methodParams.cashierAmount || (method.AmountDefault * $scope.playerData.Currency.CurrencyMultiplier);
                            $scope.methodParams.cashierAmountOption = $scope.methodParams.cashierAmount.toString();
                        }, 1);

                    }
                    else {
                        $scope.amountOptions = [];
                        $scope.methodParams.cashierAmount = null;
                        $scope.minDeposit = ($scope.playerData.Country.JurisdictionId == 721 ? 2.5 * $scope.playerData.Currency.CurrencyMultiplier : method.MinWithdrawal);
                        $scope.maxDeposit = $scope.playerData.Account.AccountBalance; // method.MaxWithdrawal;
                    }

                    if (!method.IsGeneric && method.MethodExisting) {
                        $scope.savedIdentifier = method.MethodIdentifier;
                        switch ($scope.selectedMethod.SysName) {
                            case "creditcard":
                                $scope.isExistingMethod = ($scope.paymentMethodsCreditCards && Object.keys($scope.paymentMethodsCreditCards).length > 0);
                                if ($scope.isExistingMethod) {
                                    $scope.noExistingMethod = false;

                                    var lastUsedID = storageService.getSessionItem('PaymentMethodsCreditCardsLastUsed');
                                    if (lastUsedID) {
                                        $scope.methodParams.creditcardChosenId = lastUsedID;
                                    }
                                    else {
                                        $scope.methodParams.creditcardChosenId = Object.keys($scope.paymentMethodsCreditCards)[0];
                                    }
                                    // Listen to message from child window (for 3D redirect use)
                                    //bindEvent(window, 'message', handleMessageRecievedFromIframe);
                                }
                                break;
                            case "neteller":
                                $scope.isExistingMethod = true;
                                $scope.methodParams.netellerAccountNumber = method.MethodIdentifier;
                                break;
                            case "skrill":
                                $scope.isExistingMethod = true;
                                $scope.PaymentMethodId = method;
                                $scope.methodParams.skrillEmail = method.MethodIdentifier;
                                break;
                            case "trustly":
                                $scope.isExistingMethod = true;
                                $scope.PaymentMethodId = method;
                                break;
                            case "qiwi":
                                $scope.isExistingMethod = true;
                                $scope.PaymentMethodId = method;
                                $scope.methodParams.qiwiNumber = method.MethodIdentifier;
                                break;
                            case "webmoney":
                                $scope.isExistingMethod = true;
                                $scope.PaymentMethodId = method;
                                $scope.methodParams.webmoneyAccountId = method.MethodIdentifier;
                                break;
                            case "ecopayz":
                                $scope.isExistingMethod = true;
                                $scope.PaymentMethodId = method;
                                $scope.methodParams.ecopayzAccountId = method.MethodIdentifier;
                                break;
                            case "paypal":
                                $scope.isExistingMethod = true;
                                $scope.PaymentMethodId = method;
                                $scope.methodParams.paypalVault = (method.MethodIdentifier == "True");
                                break;
                            case "payForFun":
                                // Listen to message from child window (for 3D redirect use)
                                //bindEvent(window, 'message', handleMessageRecievedFromIframe);
                                break;
                            case "fastbanktransfer":
                                $scope.isExistingMethod = true;
                                $scope.PaymentMethodId = method;
                                details = JSON.parse(method.MethodDetails);

                                $scope.methodParams.btBankName = details.PaymentMethod.FastBankTransfer.BankName;
                                $scope.methodParams.btAccountNumber = details.PaymentMethod.FastBankTransfer.BankAccountNumber;
                                $scope.methodParams.btSwift = details.PaymentMethod.FastBankTransfer.Swift;
                                $scope.methodParams.btIban = details.PaymentMethod.FastBankTransfer.Iban;
                                $scope.methodParams.btBranchCode = details.PaymentMethod.FastBankTransfer.BranchCode;
                                break;
                            default:
                                $scope.noExistingMethod = true;
                                $scope.isExistingMethod = false;
                                break;
                        }
                    }
                    else {
                        switch ($scope.selectedMethod.SysName) {
                            case "creditcard":
                                //If new added partameter called: "isUkCCTypeDebitOnly" is true AND the player is from the UK => then $scope.isUKCCTypeDebitOnly = true;
                                getCommonParametersByType({ "PlayerId": $scope.playerData.PlayerId, "ParameterType": 2 });
                                break;
                            case "paybyphone":
                                $scope.amountReadonly = true;
                                break;
                            case "paypal":
                                $scope.methodParams.paypalVault = true;
                                $scope.isExistingMethod = false;
                                $scope.PaymentMethodId = -1;
                                break;


                        }
                        $scope.noExistingMethod = true;
                        $scope.isExistingMethod = false;
                    }

                    if ($scope.selectedMethod.SysName == "paypal") {
                        if ($scope.payPalCanRender && !$scope.payPalRendered) {
                            setTimeout(function () { $scope.paypalVaultChange(); }, 10);
                        }
                    }
                    else {
                        $scope.payPalRendered = false;
                    }
                }

                $timeout(function () {
                    $scope.cashierMethodsFrame.scrollLeft = $scope.tabsLeft();
                }, 10);
            }
        };

        function renderPaypalButton() {
            $scope.params = {
                "PlayerId": $scope.playerData.PlayerId,
                "Amount": $scope.methodParams.cashierAmount,
                "PaymentMethodId": -1,
                "DetailsXml": "PlayMode:" + $rootScope.playModeID(),
                "CCNumber": "",
                "ValidationItem": "",
                "CouponCode": $scope.methodParams.depositCode,
                "BonusDepositOfferId": 0,
                "PlayModeId": $rootScope.playModeID()
            };

            if (!$scope.params.Amount || $scope.params.Amount == 0)
                $scope.params.Amount = 10;

            generalService.cashier.validateExternalTransaction($scope.params, true).then(function (data) {
                if ($rootScope.checkResponse({ response: data, location: $scope.cashierMode, closeOnError: false })) {
                    if (data.Action !== null) {
                        $scope.methodChanged(getSelectedMethod($scope.paymentMethods));
                        var popup = popupsAction[data.Action.ActionID];
                        if (!popup) {
                            var redirect = redirectsAction[data.Action.ActionID];
                            if (!redirect) {
                                console.error("Missing popup or redirects " + data.Action.ActionID);
                                return;
                            }
                            redirect.action();
                        }
                        else
                            popupServices.openConfirm({
                                title: popup.title,
                                text1: typeof popup.text1 == 'function' ? popup.text1(data) : popup.text1,
                                button1Text: popup.button1Text,
                                button2Text: popup.button2Text,
                                button1Action: popup.button1Action,
                                button2Action: popup.button2Action,
                                showButton2: popup.showButton2
                            }, this, (popup.isLexicon == undefined ? true : popup.isLexicon), true,
                                function () { popup.button1Action(data); }, function () { if (popup.button2Action) popup.button2Action(data); });
                    }
                    else {
                        $scope.payPalCanRender = true;
                    }
                }
            });
        }

        $scope.paypalVaultChange = function () {
            $scope.payPalRenderButton($scope.methodParams.paypalVault ? $scope.selectedMethod.MethodToken : $scope.selectedMethod.MethodToken2);
        }

        $scope.payPalRenderButton = function (token) {

            var paypalbuttonDiv = angular.element(document.querySelector('#paypalbutton'))[0];

            angular.element(paypalbuttonDiv).empty();

            paypal.Button.render({
                braintree: braintree,
                client: { production: token },
                env: 'production',
                commit: true,
                payment: $scope.payPalPayment,
                onAuthorize: $scope.payPalAuthorize,
                style: {
                    size: 'responsive',
                    color: 'gold',
                    shape: 'rect',
                    label: 'checkout',
                    tagline: 'false'
                }
            }, '#paypalbutton');
            $scope.payPalRendered = true;
        }

        $scope.payPalPayment = function (data, actions) {
            return actions.braintree.create({
                flow: ($scope.methodParams.paypalVault ? 'vault' : 'checkout'),
                intent: 'sale',
                amount: $scope.methodParams.cashierAmount,
                currency: $scope.playerData.Currency.CurrencyCode
            });
        }

        $scope.payPalAuthorize = function (payload) {
            $scope.methodParams.payload = payload;
            $scope.submit(form_cashier);
            console.log(payload);
        }

        $scope.tabsLeft = function () {
            var left;

            if ($scope.selectedTabIndex <= Math.log2($scope.tabsOnScreen / 2) && $scope.tabsStick) {
                left = 0;
            }
            else if ($scope.selectedTabIndex >= $scope.tabsNumber - 1 - Math.log2($scope.tabsOnScreen / 2) && $scope.tabsStick) {
                left = $scope.tabsWidthNumber - window.document.body.clientWidth;
            }
            else {
                left = ((1 * ($scope.selectedTabIndex * $scope.tabWidthNumber)) - ($scope.tabWidthNumber * $scope.tabsCenterOffset));
            }

            return left;
        }

        $scope.getMethodParamsObj = function () {
            var params = {
                "PlayerId": $scope.playerData.PlayerId
            };

            if (!$scope.selectedMethod.IsGeneric) {
                switch ($scope.selectedMethod.SysName) {
                    case "creditcard":
                        var params = {
                            "PlayerId": $scope.playerData.PlayerId,
                            "TypeId": $scope.methodParams.creditcardType.split("|")[0],
                            "TypeCaption": $scope.methodParams.creditcardType.split("|")[1],
                            "Number": "" + $scope.methodParams.creditcardNumber.replace(/-/g, ''),
                            "ExpirationMonth": $scope.methodParams.creditcardMonth,
                            "ExpirationYear": $scope.methodParams.creditcardYear
                        };
                        break;
                    case "neteller":
                        var params = {
                            "PlayerId": $scope.playerData.PlayerId,
                            "AccountNumber": "" + $scope.methodParams.netellerAccountNumber
                        };
                        break;
                    case "skrill":
                        var params = {
                            "PlayerId": $scope.playerData.PlayerId,
                            "Email": "" + $scope.methodParams.skrillEmail
                        };
                        break;
                    case "paybyphone":
                        var params = {
                            "PlayerId": $scope.playerData.PlayerId,
                            "ItemString": "" + $scope.methodParams.paybyphoneValidation
                        };
                        break;
                    case "qiwi":
                        var params = {
                            "PlayerId": $scope.playerData.PlayerId,
                            "PhoneNumber": $scope.methodParams.qiwiNumber
                        };
                        break;
                    case "webmoney":
                        var params = {
                            "PlayerId": $scope.playerData.PlayerId,
                            "AccountId": $scope.methodParams.webmoneyAccountId
                        };
                        break;
                    case "ecopayz":
                        var params = {
                            "PlayerId": $scope.playerData.PlayerId,
                            "AccountId": $scope.methodParams.ecopayzAccountId
                        };
                        break;
                    case "paypal":
                        var params = {
                            "PlayerId": $scope.playerData.PlayerId,
                            "Nonce": $scope.methodParams.payload.nonce,
                            "OrderId": $scope.methodParams.payload.orderID,
                            "IsVault": $scope.methodParams.paypalVault
                        };
                        break;
                    case "payForFun":
                        var params = {
                            "PlayerId": $scope.playerData.PlayerId,
                            "WhiteLabelLogoUrl": labelLogo,
                            "WhiteLabelColor": $scope.rgbToHex(getComputedStyle(document.getElementsByClassName('button_normal')[0]).getPropertyValue('background-color')),
                            "Email": $scope.cashierMode == 'withdrawal' ? $scope.methodParams.payForFunUserEmail : null
                        };
                        break;
                    case "fastbanktransfer":
                        var params = {
                            "PlayerId": $scope.playerData.PlayerId,
                            "BankName": $scope.methodParams.btBankName,
                            "BankAccountNumber": $scope.methodParams.btAccountNumber,
                            "Swift": $scope.methodParams.btSwift,
                            "Iban": $scope.methodParams.btIban,
                            "BranchCode": $scope.methodParams.btBranchCode
                        };
                        break;

                }
            }
            return params;
        }

        $scope.componentToHex = function (c) {
            var hex = c.toString(16);
            return hex.length == 1 ? "0" + hex : hex;
        }

        $scope.rgbToHex = function (rgbStr) {
            try {
                var rgbParts = rgbStr.replace('rgb(', '').replace(')', '').split(',');
                return "#" + $scope.componentToHex(parseInt(rgbParts[0].trim())) + $scope.componentToHex(parseInt(rgbParts[1].trim())) + $scope.componentToHex(parseInt(rgbParts[2].trim()));
            }
            catch (e) {
                return '';
            }
        }

        $scope.submit = function (form_cashier) {
            var extraDetails = { details: 'Player is soft blocked' };
            if ($scope.cashierMode == 'withdrawal' || !$rootScope.checkPlayerSoftBlock()) {
                $scope.formSubmitted = true;
                extraDetails.details = 'Form is not valid';
                if ($scope.form_cashier.$valid) {
                    extraDetails.details = 'Form is valid';
                    if ($scope.playerData.FundsApprove) {
                        popupServices.openConfirm({ title: $rootScope.lexicon['fundsApprove_protection'], text1: $rootScope.lexicon['fundsApprove_text'].replace("[FUNDSURL]", window.PPconfig.urlFundsInfoUrl), button1Text: $rootScope.lexicon['approve'] }, this, false, false, $scope.submitPreAction, null);
                        extraDetails.details = 'Need to approve funds';
                    }
                    else {
                        $scope.submitPreAction();
                    }
                }
            }
            if (typeof ($solitics) !== 'undefined')
                $solitics.onClick('Cashier - ' + $scope.cashierMode, extraDetails);

            if (typeof (_smartico) != 'undefined' && _smartico.identify)
                _smartico.event('client_action', { action: 'cashierSubmitClicked', mode: $scope.cashierMode, details: extraDetails })
        }

        $scope.submitPreAction = function () {
            if ($scope.playerData.FundsApprove) {
                $scope.playerData.FundsApprove = false;
                $rootScope.savePlayer($scope.playerData);
            }

            if ($scope.isExistingMethod) {
                $scope.submitAction($scope.chosenMethod().MethodId);
            }
            else {
                generalService.cashier.addPaymentMethod($scope.selectedMethod.SysName, $scope.getMethodParamsObj()).then(
                    function (data) {
                        if ($rootScope.checkResponse({ response: data, location: $scope.cashierMode, closeOnError: false })) {
                            if (!isNaN(data)) {
                                if ($scope.selectedMethod.SysName == "paybyphone") {
                                    $scope.playerData.MobileNumberValidation = '';
                                    $rootScope.savePlayer($scope.playerData);
                                    $scope.paybyphoneShowValidation = false;
                                }
                                $scope.submitAction(data);
                            }
                        }
                    });
            }

        }

        $scope.submitAction = function (paymentMethodId) {
            $scope.paymentMethodId = paymentMethodId;
            $scope.setMethodValidationItem();

            $scope.params = {
                "PlayerId": $scope.playerData.PlayerId,
                "Amount": $scope.methodParams.cashierAmount,
                "PaymentMethodId": $scope.paymentMethodId,
                "DetailsXml": "PlayMode:" + $rootScope.playModeID(),
                "CCNumber": "",
                "ValidationItem": $scope.selectedMethodValidationItem,
                "CouponCode": $scope.methodParams.depositCode,
                "BonusDepositOfferId": 0,
                "PlayModeId": $rootScope.playModeID(),
                "ClientBaseURL": location.origin
            };
            document.activeElement.blur();
            switch ($scope.cashierMode) {
                case "deposit":
                    postToAnalytics('ClientSite', 'DepositSubmit', 'Player submitted deposit');
                    $scope.deposit();
                    break;
                case "withdrawal":
                    postToAnalytics('ClientSite', 'WithdrawalSubmit', 'Player submitted withdraw');
                    popupServices.openConfirm({ title: 'withdrawal_' + ($scope.playerData.Country.JurisdictionId == 721 ? 'uk' : 'bonus') + '_warning_alert_title', text1: 'withdrawal_' + ($scope.playerData.Country.JurisdictionId == 721 ? 'uk' : 'bonus') + '_warning_alert_text', button1Text: 'approve', showButton2: true, button2Text: 'discard' }, this, true, false, $scope.withdrawal);
                    break;
            }
        }

        $scope.showDepositBonuseOffer = function () {
            generalService.cashier.getDepositBonusOffer({ "PlayerId": $scope.playerData.PlayerId, "ItemAmount": $scope.methodParams.cashierAmount }).then(
                function (data) {
                    if ($rootScope.checkResponse({ response: data, location: $scope.cashierMode, closeOnError: false })) {
                        var offer0 = $rootScope.lexicon["deposit_extraBonus_optionNone"];
                        var offer1 = $rootScope.lexicon["deposit_extraBonus_option"].replace("[OFFER_ADD]", $filter('currency')(data.Offer1Add, $scope.playerData.Currency.CurrencySymbol)).replace("[OFFER_GAIN]", $filter('currency')(data.Offer1Gain, $scope.playerData.Currency.CurrencySymbol));
                        var offer2 = $rootScope.lexicon["deposit_extraBonus_option"].replace("[OFFER_ADD]", $filter('currency')(data.Offer2Add, $scope.playerData.Currency.CurrencySymbol)).replace("[OFFER_GAIN]", $filter('currency')(data.Offer2Gain, $scope.playerData.Currency.CurrencySymbol));
                        var offer3 = $rootScope.lexicon["deposit_extraBonus_option"].replace("[OFFER_ADD]", $filter('currency')(data.Offer3Add, $scope.playerData.Currency.CurrencySymbol)).replace("[OFFER_GAIN]", $filter('currency')(data.Offer3Gain, $scope.playerData.Currency.CurrencySymbol));
                        var offers = [{ id: 0, text: offer0 }, { id: 1, text: offer1 }, { id: 2, text: offer2 }, { id: 3, text: offer3 }];
                        var data = { title: $rootScope.lexicon["deposit_extraBonus_title"], sub_title: $rootScope.lexicon["deposit_extraBonus_text"], text1: '', button1Text: $rootScope.lexicon["deposit"], options: offers, styleType: 'wide', selectedOption: 0 };

                        ngDialog.openConfirm({ template: 'dialogOptions', scope: $scope, data: data, showClose: true, closeByDocument: false, closeByEscape: false, className: "ngdialog-theme-default ngdialog-theme-big" }).then(
                            function (value) {
                                $scope.params.BonusDepositOfferId = value;
                                $scope.deposit();
                            }
                        );
                    }
                });
        }

        var childWindow = null;
        $scope.deposit = function () {
            if ($scope.selectedMethod.OpenMode == 0) {
                $scope.params.BrowserDetails = getBrowserDetails();
                generalService.cashier.deposit($scope.params).then(
                    function (data) {
                        if ($rootScope.checkResponse({ response: data, location: $scope.cashierMode, closeOnError: false })) {
                            if (data.Action !== null) {
                                var popup = popupsAction[data.Action.ActionID];
                                if (!popup) {
                                    var redirect = redirectsAction[data.Action.ActionID];
                                    if (!redirect) {
                                        console.error("Missing popup or redirects " + data.Action.ActionID);
                                        return;
                                    }
                                    redirect.action();
                                }
                                else {
                                    popupServices.openConfirm({
                                        title: popup.title,
                                        text1: typeof popup.text1 == 'function' ? popup.text1(data) : popup.text1,
                                        button1Text: popup.button1Text,
                                        button2Text: popup.button2Text,
                                        button1Action: popup.button1Action,
                                        button2Action: popup.button2Action,
                                        showButton2: popup.showButton2
                                    }, this, (popup.isLexicon == undefined ? true : popup.isLexicon), true,
                                        function () { popup.button1Action(data); }, function () { if (popup.button2Action) popup.button2Action(data); });
                                }
                            }
                            else if (data.ThreeDRedirect !== null) {
                                //redirect to 3D page
                                handleDepositRedirect(data);
                            }
                            else if (data.ExternalPayment != null) {
                                if (data.ExternalPayment.IsForm) {
                                    var request = { 'redirectUrl': data.ExternalPayment.URL };
                                    angular.extend(request, data.ExternalPayment.Parameters);
                                    url = buildQueryParams("Services/RedirectProvider.aspx", request);
                                }
                                else
                                    url = data.ExternalPayment.URL;

                                handleRedirectExternalForm(url, 2);
                            }
                            else {
                                $rootScope.afterSuccessfulDeposit($scope.methodParams.cashierAmount, $scope.selectedMethod.SysName, data.Balance);
                            }
                        }
                        else {
                            dataService.trackAnalyticEvent($scope.playerData, ["pageUrl", "event", "eventAmount", "eventType", "eventInfo"], [$location.path(), "depositFail", $scope.methodParams.cashierAmount, $scope.selectedMethod.SysName, data.ErrorMessage]);
                        }
                    });
            }
            else {
                var url = '';
                generalService.cashier.validateExternalTransaction($scope.params).then(function (data) {
                    if ($rootScope.checkResponse({ response: data, location: $scope.cashierMode, closeOnError: false })) {
                        if (data.Action !== null) {
                            var popup = popupsAction[data.Action.ActionID];
                            if (!popup) {
                                var redirect = redirectsAction[data.Action.ActionID];
                                if (!redirect) {
                                    console.error("Missing popup or redirects " + data.Action.ActionID);
                                    return;
                                }
                                redirect.action();
                            }
                            else
                                popupServices.openConfirm({
                                    title: popup.title,
                                    text1: typeof popup.text1 == 'function' ? popup.text1(data) : popup.text1,
                                    button1Text: popup.button1Text,
                                    button2Text: popup.button2Text,
                                    button1Action: popup.button1Action,
                                    button2Action: popup.button2Action,
                                    showButton2: popup.showButton2
                                }, this, (popup.isLexicon == undefined ? true : popup.isLexicon), true,
                                    function () { popup.button1Action(data); }, function () { if (popup.button2Action) popup.button2Action(data); });
                        }
                        else {
                            switch ($scope.selectedMethod.SysName) {
                                case "skrill":
                                    url = window.PPconfig.urlFront + 'MoneyBookersRequest.aspx?player_id=' + $scope.playerData.PlayerId + '&token=' + $scope.playerData.Token + '&payment_method_id=' + $scope.paymentMethodId + '&email=' + $scope.methodParams.skrillEmail + '&sum=' + $scope.methodParams.cashierAmount + '&coupon_code=' + $scope.methodParams.depositCode;
                                    $rootScope.openModalIFrame($scope.selectedMethod.SysName, url);
                                    break;
                                case "ideal":
                                    url = window.PPconfig.urlFront + 'IdealRequest.aspx?player_id=' + $scope.playerData.PlayerId + '&token=' + $scope.playerData.Token + '&payment_method_id=' + $scope.paymentMethodId + '&amount=' + $scope.methodParams.cashierAmount + '&coupon_code=' + $scope.methodParams.depositCode;
                                    $rootScope.openModalIFrame($scope.selectedMethod.SysName, url);
                                    break;
                                default:
                                    generalService.cashier.prepareExternalTransactionUrl($scope.params).then(
                                        function (data) {
                                            if ($rootScope.checkResponse({ response: data, location: $scope.cashierMode, closeOnError: false })) {
                                                if (data.IsForm === true) {
                                                    var request = { 'redirectUrl': data.URL };
                                                    angular.extend(request, data.Parameters);
                                                    url = buildQueryParams("Services/RedirectProvider.aspx", request);
                                                }
                                                else {
                                                    if (data.URL) {
                                                        url = data.URL;
                                                    }
                                                    else {
                                                        if (res.TransactionID) {
                                                            $scope.params = {
                                                                "PlayerId": $scope.playerData.PlayerId,
                                                                "Amount": $scope.methodParams.cashierAmount,
                                                                "PaymentMethodId": $scope.paymentMethodId,
                                                                "DetailsXml": res.TransactionID,
                                                                "CCNumber": "",
                                                                "ValidationItem": $scope.selectedMethodValidationItem,
                                                                "CouponCode": $scope.methodParams.depositCode,
                                                                "BonusDepositOfferId": $scope.BonusDepositOfferId
                                                            };
                                                            $scope.selectedMethod.OpenMode = 0;
                                                            $scope.deposit();
                                                        }
                                                    }
                                                }
                                                handleRedirectExternalForm(url);
                                            }
                                        });
                                    break;
                            }
                        }
                    }
                });
            }
        }

        function handleRedirectExternalForm(url, openMode) {
            openMode = openMode || $scope.selectedMethod.OpenMode;
            if (openMode == 1) {
                storageService.setSessionItem('redirectDeposit', { Amount: $scope.methodParams.cashierAmount, Method: $scope.selectedMethod.SysName }, true);
                $rootScope.openModalIFrame($scope.selectedMethod.SysName, url, ($scope.selectedMethod.SysName == "trustly" && !$rootScope.isMobile() ? "iframe_trustly" : "iframe"));
            }
            else if (openMode == 2) {
                if ($rootScope.isMobile()) {
                    storageService.setSessionItem('redirectDeposit', { Amount: $scope.methodParams.cashierAmount, Method: $scope.selectedMethod.SysName }, true);
                    window.location.href = url;
                }
                else {
                    var left = (screen.width / 2) - (800 / 2);
                    var top = (screen.height / 2) - (1000 / 2);
                    childWindow = window.open(url, '', 'menubar=no,resizable=no,location=no,directories=no,titlebar=no,toolbar=no,width=800,height=1000, top=' + top + ', left=' + left);
                }
            }
        }

        function getBrowserDetails() {
            return {
                acceptHeader: 'text/html,application/xhtml+xml',//'application/json, text/plain, */*',
                javaEnabled: 'TRUE',
                javaScriptEnabled: 'TRUE',
                language: navigator.language,
                colorDepth: screen.colorDepth.toString(),
                screenHeight: screen.height.toString(),
                screenWidth: screen.width.toString(),
                timeZone: new Date().getTimezoneOffset().toString(),
                userAgent: navigator.userAgent
            };
        }

        function depositAfterRedirect(data) {
            data.TransactionID = storageService.getSessionItem('3dtransactionid');
            postToAnalytics('ClientSite', 'DepositAfterRedirect', 'Player returned from depoit redirect and will deposit now automatically. RedirectData: ' + JSON.stringify(data));
            data.PlayerId = $scope.playerData.PlayerId;
            data.ClientBaseURL = location.origin;
            data.BrowserDetails = getBrowserDetails();
            $rootScope.hideLoader();
            generalService.cashier.depositAfterRedirect(data).then(
                function (data) {
                    if ($rootScope.checkResponse({ response: data, location: $scope.cashierMode, closeOnError: false })) {
                        if (data.ThreeDRedirect !== null) {
                            //redirect to 3D page
                            handleDepositRedirect(data);
                        }
                        else
                            $rootScope.afterSuccessfulDeposit($scope.methodParams.cashierAmount, $scope.selectedMethod.SysName, data.Balance);
                    }
                    else {
                        dataService.trackAnalyticEvent($scope.playerData, ["pageUrl", "event", "eventAmount", "eventType", "eventInfo"], [$location.path(), "depositFail", $scope.methodParams.cashierAmount, $scope.selectedMethod.SysName, data.ErrorMessage]);
                    }
                });
            storageService.removeSessionItem('3dtransactionid');
        }

        function handleDepositRedirect(data) {
            storageService.setSessionItem('3dtransactionid', data.TransactionID);
            $rootScope.showDepositRedirectIframe(data);
        }

        function buildQueryParams(url, params) {
            if (typeof params != "undefined") {
                encodeURI(url += '?' + Object.keys(params).map(function (k) { return k + '=%%%' + params[k]; }).join('&'));
            }
            return url;
        }

        $scope.withdrawal = function () {
            postToAnalytics('ClientSite', 'WithdrawalRequest', 'Player requested to withdraw');
            generalService.cashier.withdrawal($scope.params).then(
                function (data) {
                    if ($rootScope.checkResponse({ response: data, location: $scope.cashierMode, closeOnError: false })) {
                        if (data.indexOf('http') > -1) {
                            //var orderId = null;
                            //try {
                            //    orderId = (new URL(data)).searchParams.get('OrderID');
                            //}
                            //catch (e) { }
                            //$scope.params.ValidationItem = orderId || $scope.params.ValidationItem;
                            //storageService.setSessionItem('withdrawalParams', $scope.params, true);
                            handleRedirectExternalForm(data);
                        }
                        else {
                            $rootScope.getPlayerBalance();
                            $rootScope.getPlayerPaymentMethods();
                            $rootScope.getPlayerPaymentMethodsCreditCards();
                            $rootScope.closeAllModals();
                            popupServices.openMessage({ title: 'withdrawal', text1: 'withdrawal_success' }, this);
                        }
                    }
                }, function (data) {
                    $rootScope.getPlayerBalance();
                    $rootScope.closeAllModals();
                    popupServices.openMessage({ title: 'withdrawal', text1: 'withdrawal_failed' }, this);
                });
        }

        $scope.setMethodValidationItem = function () {
            if (!$scope.selectedMethod.IsGeneric) {
                switch ($scope.selectedMethod.SysName) {
                    case "creditcard":
                        $scope.selectedMethodValidationItem = $scope.methodParams.creditcardCvv;
                        break;
                    case "neteller":
                        $scope.selectedMethodValidationItem = $scope.methodParams.netellerSecureId;
                        break;
                    case "payForFun":
                        $scope.selectedMethodValidationItem = $scope.methodParams.payForFunUserEmail;
                        break;
                }
            }
        }

        $scope.resendMobileValidationNumber = function () {
            generalService.authentication.resendMobileValidationNumber({ PlayerId: $scope.playerData.PlayerId }).then(
                function (data) {
                    if ($rootScope.checkResponse({ response: data, location: 'deposit', closeOnError: false })) {

                        popupServices.openMessage({ title: 'paybyphone_validation', text1: 'paybyphone_validation_resend_success' }, this);
                    }
                });
        }

        $scope.updateMobileNumber = function (frm) {
            if (!frm.mobile.$invalid) {
                generalService.authentication.updateMobileNumber({ PlayerId: $scope.playerData.PlayerId, ItemString: $scope.methodParams.mobileNumber }).then(
                    function (data) {
                        if ($rootScope.checkResponse({ response: data, location: 'deposit', closeOnError: false })) {
                            $scope.methodParams.paybyphoneValidation = '';
                            $scope.playerData.MobileNumberValidation = '1234';
                            $rootScope.savePlayer($scope.playerData);
                            $scope.paybyphoneShowValidation = true;
                            popupServices.openMessage({ title: 'mobile_number_update', text1: 'mobile_number_updated' }, this);
                        }
                    });
            }
        }

        $scope.chosenMethod = function () {
            var result;
            switch ($scope.selectedMethod.SysName) {
                case "creditcard":
                    result = $scope.paymentMethodsCreditCards[$scope.methodParams.creditcardChosenId];
                    break;
                default:
                    result = $scope.selectedMethod;
                    break;
            }

            return result;
        }

        $scope.cashierAmountOptionPicked = function (val) {
            postToAnalytics('ClientSite', 'DepositAmountOptionPicked', 'Player selected a deposit amount from options: ' + $scope.methodParams.cashierAmountOption);
            $scope.methodParams.cashierAmount = parseInt($scope.methodParams.cashierAmountOption);
        }

        $scope.cashierAmountChanged = function (val) {
            postToAnalytics('ClientSite', 'DepositAmountChanged', 'Player changed the deposit amount to: ' + $scope.methodParams.cashierAmount);
            $scope.methodParams.cashierAmountOption = $scope.methodParams.cashierAmount;
        }

        $scope.addNewCard = function () {
            $scope.methodParams.creditcardChosenId = '';
            $scope.isExistingMethod = false;
            if ($scope.methodParams.creditcardNumber != null) {
                $scope.validateCardNumberIsDebit();
            }
            //$scope.isExistingMethod = ($scope.methodParams.creditcardChosenId != '');
        }

        $scope.editFastBankTransfer = function () {
            $scope.isExistingMethod = false;
        }

        $scope.selectedCardChanges = function (form_cashier) {
            $scope.form_cashier = form_cashier;
            $scope.isExistingMethod = ($scope.methodParams.creditcardChosenId != '');
            if (!$scope.isExistingMethod) {
                $scope.existingCardIsNotAccepted = false;
            }
            else {
                validateExistingCardType();
            }
        }

        $scope.initFormCardNumber = function () {
            getCommonParametersByType({ "PlayerId": $scope.playerData.PlayerId, "ParameterType": 2 }, validateExistingCardType);
        }

        validateExistingCardType = function () {
            if ($scope.isUKCCTypeDebitOnly && $scope.playerData.FirstName != "Tester") {
                var pMethod = $scope.paymentMethodsCreditCards[$scope.methodParams.creditcardChosenId];
                if (pMethod && pMethod.CardType != null && pMethod.CardType.toLowerCase() == "credit") {
                    $scope.existingCardIsNotAccepted = true;
                    return;
                }
            }
            $timeout(function () {
                $scope.existingCardIsNotAccepted = false;
            }, 100);
        }

        $scope.setCreditCardType = function (form_cashier) {
            //set by this number 
            var ccNumber = $scope.methodParams.creditcardNumber != null ? $scope.methodParams.creditcardNumber.toString() : "";
            $scope.methodParams.creditcardType = dataService.GetCardType(ccNumber);
            $scope.creditCardTypeClass = "credit_card_type_" + $scope.methodParams.creditcardType.split("|")[1];
        }

        $scope.validateCardNumberIsDebit = function () {
            if ($scope.isUKCCTypeDebitOnly && $scope.playerData.FirstName != "Tester") {
                var ccNumber = $scope.methodParams.creditcardNumber != null ? $scope.methodParams.creditcardNumber.toString() : "";
                var firstSixCardDigits = ccNumber.replace('-', '').substring(0, 6);
                if (ccNumber.length >= 7 && ukBinsOfCreditCardTypeList.indexOf(parseInt(firstSixCardDigits)) >= 0) {
                    $scope.cardIsNotAccepted = true;
                    return;
                }
            }
            $scope.cardIsNotAccepted = false;
        }

        $scope.getNumOfDashesInCC = function (form_cashier) {
            if ($scope.methodParams.creditcardNumber) {
                var matches = $scope.methodParams.creditcardNumber.match(/-/g);
                return matches != null ? matches.length : 0;
            }
            return 0;
        }

        $scope.checkValidExpiration = function (form_cashier) {
            if ($scope.methodParams.creditcardYear) {
                if ($scope.methodParams.creditcardYear == $scope.expirationDropdown.currentYear) {
                    if ($scope.methodParams.creditcardMonth) {
                        if ($scope.methodParams.creditcardMonth < $scope.expirationDropdown.currentMonth) {
                            form_cashier.ccmonth.$setValidity("expirationInvalid", false);
                            return;
                        }
                    }
                }
                form_cashier.ccmonth.$setValidity("expirationInvalid", true);
            }
        }

        $scope.cancelPartialDeposit = function (data) {
            depositAfterPartial(data, false);
        }

        $scope.ApprovePartialDeposit = function (data) {
            depositAfterPartial(data, true);
        }


        $scope.validateDepositCode = function () {
            generalService.authentication.checkDepositCodeValid({ PlayerId: $scope.playerData.PlayerId, ItemString: $scope.methodParams.depositCode }).then(
                function (data) {
                    if ($rootScope.checkResponse({ response: data, location: 'validate_your_account', closeOnError: false })) {
						$scope.methodParams.depositCodeChecked = true;
                        $scope.methodParams.depositCodeValid = data;
                    }
                });
        }




        function depositAfterPartial(data, isPlayerApproved) {
            var request = { TransactionID: data.TransactionID, IsPlayerApproved: isPlayerApproved, PlayerId: $scope.playerData.PlayerId };
            postToAnalytics('ClientSite', 'depositAfterPartial', 'Player clicked on partial approval with value: ' + isPlayerApproved + ' and will continue to deposit/void now.');
            generalService.cashier.depositAfterPartial(request, !isPlayerApproved).then(
                function (data) {
                    if (data != null) {
                        if ($rootScope.checkResponse({ response: data, location: $scope.cashierMode, closeOnError: false })) {
                            $rootScope.afterSuccessfulDeposit($scope.methodParams.cashierAmount, $scope.selectedMethod.SysName, data.Balance);
                        }
                        else {
                            dataService.trackAnalyticEvent($scope.playerData, ["pageUrl", "event", "eventAmount", "eventType", "eventInfo"], [$location.path(), "depositFail", $scope.methodParams.cashierAmount, $scope.selectedMethod.SysName, data.ErrorMessage]);
                        }
                    }
                });
        }

        function openVerifyIDPage() {
            $rootScope.openVerifyIDWizard();
        }

        function getCommonParametersByType(params, callback) {
            generalService.cashier.getCommonParametersByType(params).then(
                function (paramsDictionary) {
                    $scope.isUKCCTypeDebitOnly = paramsDictionary && paramsDictionary["IsUkCCTypeDebitOnlyClientSide"] == "1" && $scope.playerData.Country.JurisdictionId == 721;  //721 represents UK jurisdiction
                    if (callback) {
                        callback();
                    }
                });
        }

        function postToUrl(path, params, method) {
            method = method || "post";
            var ifrm = document.createElement("iframe");
            document.body.appendChild(ifrm);

            var doc = ifrm.contentDocument ? ifrm.contentDocument : ifrm.contentWindow.document;

            var form = doc.createElement("form");
            form.setAttribute("method", method);
            form.setAttribute("action", path);

            for (var key in params) {
                if (params.hasOwnProperty(key)) {
                    var hiddenField = document.createElement("input");
                    hiddenField.setAttribute("type", "hidden");
                    hiddenField.setAttribute("name", key);
                    hiddenField.setAttribute("value", params[key]);

                    form.appendChild(hiddenField);
                }
            }

            doc.body.appendChild(form);
            doc.forms[0].submit();
        }

        var popupsAction = {
            718: {
                title: 'PendingVerificationDocuments',
                text1: 'VerificationDocumentsBeingVerified',
                button1Text: 'close',
                button1Action: $rootScope.closeModalPopupForm
            },
            720: {
                title: $rootScope.lexicon['PartialyApprovedDepositTitle'],
                text1: function (data) {
                    return $rootScope.lexicon['PartialyApprovedDepositText'].replace('[partialAmount]',
                        $rootScope.getPlayerBalanceCurrency($scope.playerData, data.ApprovedAmount));
                },
                button1Text: $rootScope.lexicon['ok'],
                button2Text: $rootScope.lexicon['cancelTransaction'],
                button1Action: $scope.ApprovePartialDeposit,
                button2Action: $scope.cancelPartialDeposit,
                showButton2: true,
                isLexicon: false
            }
        }

        var redirectsAction = {
            278: {
                action: openVerifyIDPage
            }
        };

    }]);



;
'use srtict';
progressPlayApp.controller('paypalController', ['$rootScope', '$scope', '$location', '$window', '$filter', '$log', '$timeout', '$interval', '$sce', 'dataService', 'storageService', 'generalService', 'eventServices', 'popupServices', 'MessagingData', 'ngDialog', 
    function paypalController($rootScope, $scope, $location, $window, $filter, $log, $timeout, $interval, $sce, dataService, storageService, generalService, eventServices, popupServices, MessagingData, ngDialog) {
    $rootScope.initPage(false);
    $scope.eventServices = eventServices;
    $scope.showRegistration = false;
    $scope.paypalUrl = '';
    $scope.user = {};

    $scope.$on('$destroy', function () {
        removeEvent(window, "message", handleMessageRecievedFromIframe);
      
    });


    function handleMessageRecievedFromIframe(e) {
        if ('source' in e && e.source && 'PAYPAL' in e.source)
            return;

        var data = JSON.parse(e.data);
        if (data.Source && data.Source == 'paypal') {
            console.log(data);
        }

    }

    $scope.initRegistration = function () {
        //var tpi = dataService.GetpaypalStatus();
        //$scope.initCountries();

        if ($rootScope.formParams) {
            $scope.PartnerPromotionsEnabled = $rootScope.label.promotions_enabled;

            $scope.birthdayDropdown = dataService.getBirthdayObject();
            //$scope.user.CurrencyId = ($scope.user.CurrencyId ? $scope.user.CurrencyId : $rootScope.country.DefaultCurrencyID);
            $scope.updateBirthday();
            $scope.user.ReceiveEmail = false;
            $scope.user.ReceiveSMS = false;
            $scope.user.ReceivePhone = false;
            $scope.user.ReceivePost = false;
            $scope.user.ReceivePartner = false;
            $scope.initCountries();
        }
    }

    $scope.initCountries = function () {
        $scope.Countries = storageService.getSessionItem('GeneralData.Countries_' + $rootScope.label.label_id, true);

        if (!$scope.Countries) { $timeout(function () { $scope.initCountries(); }, 1000); return; }

        generalService.authentication.getPlayer({ PlayerId: $rootScope.formParams, Token: "paypallead" }).then(
            function (data) {
                if ($rootScope.checkResponse({ response: data, location: 'registration', closeOnError: true })) {
                    $scope.user = data;
                    $scope.user.CountryId = $scope.user.CountryId + '';
                    $scope.playerDetails = $rootScope.lexicon["paypal_player_introduction"].replace("[NAME]", $scope.user.FirstName).replace("[LABEL]", $rootScope.labelName);
                    $scope.showRegistration = true;
                }
            },
            function (err) {
                alert(err);
            }
        );
    }

    $scope.countryFilter = function (country) {
        return country;
    }

    $scope.updateBirthday = function () {
        $scope.user.Birthday = $scope.birthdayDropdown.selectedYear + "-" + $scope.birthdayDropdown.selectedMonth + "-" + $scope.birthdayDropdown.selectedDay + "T00:00:00";
    }

    $scope.checkBirthday = function (form_reg) {
        var birthday = new Date($scope.birthdayDropdown.selectedYear, $scope.birthdayDropdown.selectedMonth - 1, $scope.birthdayDropdown.selectedDay);
        form_reg.day.$setValidity("below18", (birthday <= $scope.birthdayDropdown.maxBirthday));
    }
    $scope.submit = function (form_reg) {
        $scope.formSubmitted = true;

        if (form_reg.$valid) {
            $scope.user.Password = md5($scope.user.TempPass);
            document.activeElement.blur();

            var params = {
                PlayerId: $scope.user.PlayerId,
                CellphoneNumber: $scope.user.CellphoneNumber,
                Password: $scope.user.Password,
                Birthday: $scope.user.Birthday,
                GenderId: $scope.user.GenderId,
                PromotionCode: $scope.user.PromotionCode,
                ReceiveEmail: $scope.user.ReceiveEmail,
                ReceiveSMS: $scope.user.ReceiveSMS,
                ReceivePhone: $scope.user.ReceivePhone,
                ReceivePost: $scope.user.ReceivePost,
                ReceivePartner: $scope.user.ReceivePartner,
                UserAgent: $window.navigator.userAgent + "|" + $rootScope.isMobile(),
                Time: new Date().toDateString()
            }

            generalService.authentication.RegisterFromPaypalStep2(params).then(
                function (data) {
                    if ($rootScope.checkResponse({ response: data, location: 'registration', closeOnError: false })) {
                        $rootScope.loginPlayer(data);
                        dataService.trackAnalyticEvent(data, ["pageUrl", "event"], [$location.path(), "registrationComplete"]);
                    }
                });
        }

    }

}]);


;
'use srtict';

progressPlayApp.controller('playController', ['$scope', '$sce', '$location', '$window', 'dataService', 'storageService', '$rootScope', 'generalService', 'eventServices', 'popupServices', '$log', '$timeout', '$interval', 'MessagingData',
    function playController($scope, $sce, $location, $window, dataService, storageService, $rootScope, generalService, eventServices, popupServices, $log, $timeout, $interval, MessagingData) {

        $scope.globalParams = dataService.getParams();
        $scope.playerData = $rootScope.getPlayer();

        $scope.game;
        $scope.game_url;
        $scope.mode;
        $scope.depositOpen = true;
        $scope.cancelWithdrawalOpen = true;
        $scope.gameSideOpen = true;

        var playIFrame = document.querySelectorAll("#playIFrame")[0];


        $scope.init = function () {
            var gameContainer = document.querySelectorAll("#play_view")[0];
            gameContainer.style.backgroundImage = "url(" + $rootScope.getGamesImagesUrl() + "lobby/background/" + $rootScope.game.ImageID + ".jpg" + ")";

            if ($scope.playerData && $rootScope.isLoggedIn()) {
                $scope.mode = $rootScope.mode;
                $scope.game = $rootScope.game;
                postToAnalytics('ClientSite', 'PlayGameInit', 'Play game init. Game: ' + $scope.game + ', Mode: ' + $scope.mode);
            }


            $scope.game_url = $sce.trustAsResourceUrl($rootScope.prepareGameUrlNEW($scope.mode, $scope.game));
            //$rootScope.bodyClass = "body_no_scroll";
            $scope.cashierMode = 'deposit';
            $scope.depositMiniMode = true;
            $scope.depositTemplate = '/templates/cashier.html?v=900';
            $scope.depositOpen = false;
            $scope.cancelWithdrawalOpen = false;
            $scope.promotionsOpen = true;


            $scope.cancelWithdrawalMiniMode = true;
            $scope.cancelWithdrawalTemplate = '/templates/table-pending-withdrawals.html?v=900';

            $scope.tick();
            $interval($scope.tick, 1000);

            $timeout(function () {

                $window.dispatchEvent(new Event("resize"));
            }, 200);


            //$timeout(function () { $window.dispatchEvent(new Event("resize")); }, 200);
        }

        $scope.$on('gameSet', function (event, msg) {
            $scope.init();
        })

        $scope.tick = function () {
            $scope.clock = Date.now();
        }

        $scope.toggleGameSide = function (state) {
            if (!state) {
                $scope.promotionsOpen = false;
            }
            $scope.gameSideOpen = state;
        }

        $scope.$on("currentBalance", function (event, currentBalance) {
            $scope.playerData = $rootScope.getPlayer();
        });

        $scope.togglePromotions = function () {
            $scope.promotionsOpen = !$scope.promotionsOpen;
            if ($scope.promotionsOpen) {
                $timeout(function () { $window.dispatchEvent(new Event("resize")); }, 150);
            }
        }

        $scope.toggleQuickDeposit = function () {
            $scope.depositOpen = !$scope.depositOpen;
            postToAnalytics('ClientSite', 'ToggleQuickDeposit', 'Quick deposit is: '($scope.depositOpen ? 'open' : 'close'));
            if ($scope.depositOpen) {
                $scope.cancelWithdrawalOpen = false;
            }
            $timeout(function () { $window.dispatchEvent(new Event("resize")); }, 150);
        }

        $scope.toggleCancelWithdrawal = function () {
            $scope.cancelWithdrawalOpen = !$scope.cancelWithdrawalOpen;
            if ($scope.cancelWithdrawalOpen) {
                $scope.depositOpen = false;
            }
            $timeout(function () { $window.dispatchEvent(new Event("resize")); }, 150);
        }


        $scope.switchToReal = function () {
            $rootScope.validateOpenGame('real', $rootScope.game).then(function (response) {
                if (response == true) {
                    $rootScope.mode = 'real';
                    $scope.init();
                }
            });
        }

        $scope.openCashier = function () {
            $rootScope.setForm('cashier-menu', 'deposit');
        }

        $scope.toggleFavouriteGame = function () {
            $scope.game.IsFavourite = !$scope.game.IsFavourite;
            generalService.lobby.toggleFavouriteGame({ "PlayerId": $scope.playerData.PlayerId, "ItemID": $scope.game.GameID, "Token": $scope.playerData.Token }).then(
                function (data) {
                },
                function (data) {
                });
        }


        function EyeconInit() {
            window.addEventListener('message', function (msg) {
                if (msg && msg.data && msg.data.name) {
                    switch (msg.data.name) {
                        case "gameClose":
                            $rootScope.closeGame();
                            break;
                    }
                }
                console.log('MESSAGE RECEIVED:', msg);
            });
        }




        function messageOpened() {
            var playIFrame = document.querySelectorAll("#playIFrame")[0];

            switch ($scope.game.ProviderID) {
                case 1:
                    playIFrame.contentWindow.postMessage("StopGamePlay", "https://quickfire2.gameassists.co.uk/");
                    break;
                case 2:
                    break;
                case 3:
                    playIFrame.contentWindow.postMessage('StopGamePlay', 'http://m3.progressplay.net/');
                    break;
            }
        }

        function messageClosed() {
            var playIFrame = document.querySelectorAll("#playIFrame")[0];
            switch (game.ProviderID) {
                case 1:
                    playIFrame.contentWindow.postMessage("ReStartGamePlay", "https://quickfire2.gameassists.co.uk/");
                    break;
                case 2:
                    break;
                case 3:
                    break;
            }
        }
    }]);;

'use srtict';

progressPlayApp.controller('vipController', ['$scope', '$location', 'generalService', 'storageService', '$window', '$rootScope', '$timeout', '$filter', 'popupServices', 'dataService', 'MessagingData', '$routeParams',
    function registrationController($scope, $location, generalService, storageService, $window, $rootScope, $timeout, $filter, popupServices, dataService, MessagingData, $routeParams) {
        if (!angular.equals($routeParams, {})) {
            $scope.playerData = { PlayerId: $routeParams.playerId, Token: $routeParams.token };
            $rootScope.Token = $routeParams.token;
            $rootScope.labelName = labelName.toLowerCase();
            $rootScope.init(true);
            $rootScope.headerTemplate = null;
            $rootScope.footerTemplate = null;
        }
        else {
            $scope.playerData = $rootScope.getPlayer();
        }

        $scope.sortField = 'UpdatedDate';
        $scope.sortReverse = true;
        $scope.currentPage = 0;
        $scope.pageSize = 10;
        $scope.params = {};
        $scope.params.pointsToConvert = 0;
      

        $scope.getPlayerClubLevel = function () {
            generalService.cashier.getPlayerClubLevel({ "PlayerId": $scope.playerData.PlayerId, "Token": $rootScope.Token }).then(
               function (data) {
                   if ($rootScope.checkResponse({ response: data, location: 'vip', closeOnError: false })) {
                       $scope.clubLevel = data;

                       $scope.pointsToNextLevel = $scope.clubLevel.PointsToNextLevel;
                       $scope.playerCurrency = $rootScope.playerCurrency;                   
                       $scope.pointsBalance = $rootScope.lexicon["vipclub_points_balance"].replace("[BALANCE]", $scope.clubLevel.Balance);
                       if ($scope.clubLevel.NextLevelName != '') {
                           $scope.pointsToNext = $rootScope.lexicon["vipclub_points_to_next_level"].replace("[POINTS]", $scope.clubLevel.PointsToNextLevel).replace("[NEXTLEVEL]", $rootScope.lexicon["vipclub_" + $scope.clubLevel.NextLevelName]);
                       }
                       $scope.pointsConvertTitle = $rootScope.lexicon["vipclub_convertTitle"].replace("[POINTS]", $scope.clubLevel.RedemptionRate).replace("[MONEY]", $filter('currency')(1, $scope.playerData.Currency.CurrencySymbol));
                       $scope.clubLevelCaption = $rootScope.lexicon["vipclub_" + $scope.clubLevel.LevelName]
                       $timeout(function () {
                           $scope.pointsPercent = ($scope.clubLevel.LevelOrder - 1) * 20 + (($scope.clubLevel.NextLevelPoints - $scope.clubLevel.PointsToNextLevel) / $scope.clubLevel.NextLevelPoints * 20) + '%';
                       });
                   }
               });
        }

        $scope.getTransactions = function () {
            generalService.cashier.getClubPointsTransactions({ "PlayerId": $scope.playerData.PlayerId, "Token": $rootScope.Token, "Type": "", "OrderBy": "", "MaxResults": 150 }).then(
                function (data) {
                    if ($rootScope.checkResponse({ response: data, location: 'vip', closeOnError: false })) {
                        $scope.clubTrans = data;
                    }
                });
        }

        $scope.init = function () {
			$scope.getPlayerClubLevel();
            $scope.getTransactions();
        }

        $scope.convertPoints = function (frm) {
            $scope.formSubmitted = true;
            if (frm.$valid) {
                document.activeElement.blur();
                if ($scope.params.pointsToConvert && $scope.params.pointsToConvert > 0) {
                    generalService.cashier.convertClubPoints({ "PlayerId": $scope.playerData.PlayerId, "ItemAmount": $scope.params.pointsToConvert, "Token": $rootScope.Token }).then(
                        function (data) {
                            if ($rootScope.checkResponse({ response: data, location: 'vip', closeOnError: false })) {
                                $rootScope.getPlayerBalance();
                                
								//$scope.clubLevel.Balance -=  $scope.params.pointsToConvert;
                                $scope.getTransactions();
                                $scope.params.pointsToConvert = '';
                                $scope.formSubmitted = false;

                                $timeout(function () { $scope.playerData = $rootScope.getPlayer(); }, 200);
                            }
                        });
                }
            }
        }

        $scope.numberOfPages = function () {
            return ($scope.clubTrans ? Math.ceil($scope.clubTrans.length / $scope.pageSize) : 0);
        }
    }]);


;
'use srtict';

progressPlayApp.controller('infoController', ['$rootScope', '$scope', '$location', '$timeout', '$compile', 'dataService', 'generalService', 'contentService', 'storageService', 'MessagingData', '$routeParams', '$window',
    function infoController($rootScope, $scope, $location, $timeout, $compile, dataService, generalService, contentService, storageService, MessagingData, $routeParams, $window) {

        $scope.code;
        $scope.content;

        $scope.go = function (code) {

            $scope.code = code;

            if ($scope.code == "bonus" || $scope.code == "withdrawal_policy") {
                $scope.code = "terms";
            }

            dataService.TermsAndConditions($rootScope.label.label_id, $scope.code, $rootScope.locale, $rootScope.tracker).then(function (data) {
                if (data && data.length > 0 && data[0]) {
                    var container = angular.element(document.getElementById('infoContent'));
                    container.empty();
                    if (data[0].Code == 'payouts_site') {
                        data[0].Html = getPayoutsTable(data[0].Html);
                    }
                    container.html(data[0].Html)

                    $compile(container.contents())($scope);

                    $scope.infoTitle = $rootScope.lexicon[data[0].Code];

                    angular.element(container)[0].scrollTop = 0;
                }
            });

            return false;
        };

        function getPayoutsTable(htmlWithPH) {

            var html = '<table class="tableStyle"><thead><tr><th>' + $rootScope.lexicon.payoutsGameName + '</th><th>' + $rootScope.lexicon.payoutsPercentage + '</th></tr></thead><tbody>';

            var sortedGames = $rootScope.Games['Games'].sort(function (a, b) { return a.GameName.localeCompare(b.GameName) });

            sortedGames.forEach(function (item, index) {
                html += '<tr><td>' + item.GameName + '</td><td>' + ((item.PayoutLow != item.PayoutHigh) ?
                    (getFixedNumber(item.PayoutLow) + '%-' + getFixedNumber(item.PayoutHigh) + '%') : (getFixedNumber(item.PayoutHigh) + '%')) + '</td></tr>';
            });
            html += '</tbody></table>';

            return htmlWithPH.replace('sitePlaceholder_GamePayoutTable', html);
        };

        function getFixedNumber(n) {
            return (n % 1 === 0) ? n : n.toFixed(2);
        }

        $scope.init = function () {
            if ($rootScope.formParams) {
                $scope.go($rootScope.formParams);
            }
        };

    }]);


;
'use srtict';

progressPlayApp.controller('tableDataController', ['$scope', '$rootScope', '$location', '$routeParams', '$window', '$filter', 'dataService', 'generalService', 'storageService', 'popupServices',
    function tableDataController($scope, $rootScope, $location, $routeParams, $window, $filter, dataService, generalService, storageService, popupServices) {
        $rootScope.initPage(true);
        $scope.playerData = $rootScope.getPlayer();


        $scope.dataTable;
        $scope.sortField = 'UpdatedDate';
        $scope.sortReverse = true;
        $scope.currentPage = 0;
        $scope.pageSize = 10;
        $scope.selectedPeriod = "90";

        $scope.init = function (mode) {
            if ($scope.playerData) {
                $scope.playerCurrency = $scope.playerData.Currency.CurrencySymbol;
            }
            $scope.loaded = false;
            var now = new Date();
            var dateFrom = new Date();
            if ($scope.selectedPeriod) {
                dateFrom.setDate(dateFrom.getDate() - parseInt($scope.selectedPeriod));
            }

            switch (mode) {
                case "game":
                    $scope.sortField = 'CreationDate';
                    generalService.cashier.getPlayHistory({ "PlayerId": $scope.playerData.PlayerId, "Type": "", "OrderBy": "", "MaxResults": 10000, "DateFrom": dateFrom }).then(
                        function (data) {
                            if ($rootScope.checkResponse({ response: data, location: 'gamesHistory', closeOnError: false })) {
                                $scope.onLoad(data);
                            }
                        });
                    break;

                case "game-sport":
                    $scope.sortField = 'BetDate';
                    generalService.cashier.getPlaySportHistory({ "PlayerId": $scope.playerData.PlayerId, "Type": "", "OrderBy": "", "MaxResults": 10000, "DateFrom": dateFrom }).then(
                        function (data) {
                            if ($rootScope.checkResponse({ response: data, location: 'gamesSportHistory', closeOnError: false })) {
                                $scope.onLoad(data);
                            }
                        });
                    break;

                case "payment":
                    generalService.cashier.getPaymentHistory({ "PlayerId": $scope.playerData.PlayerId, "Type": "Transactions", "OrderBy": "", "MaxResults": 10000, "DateFrom": dateFrom }).then(
                        function (data) {
                            if ($rootScope.checkResponse({ response: data, location: 'paymentsHistory', closeOnError: false })) {
                                $scope.onLoad(data);
                                if (data[0]) {
                                    $scope.totalNet = data[0].TotalNet;
                                    $scope.totalNetF = $rootScope.lexicon["totalNet"] + $rootScope.getPlayerBalanceCurrency($scope.playerData, $scope.totalNet)
                                }
                            }
                        });
                    break;
                case "bonus":
                    $scope.sortReverse = false;
                    $scope.sortField = 'StatusOrder';
                    generalService.cashier.getBonusHistory({ "PlayerId": $scope.playerData.PlayerId, "Type": "", "OrderBy": "", "MaxResults": 10000, "DateFrom": dateFrom }).then(
                        function (data) {
                            if ($rootScope.checkResponse({ response: data, location: 'bonusesHistory', closeOnError: false })) {
                                $scope.onLoad(data);
                            }
                        });
                    break;

                case "leaderboard":

                    $scope.hasResults = false;
                    generalService.cashier.getLeaderboardResult({ "PlayerId": ($scope.playerData ? $scope.playerData.PlayerId : null), "ItemId": $scope.leaderboardId }).then(
                        function (data) {
                            if ($rootScope.checkResponse({ response: data, location: 'leaderboardHistory', closeOnError: false })) {
                                $scope.leaderboardType = $rootScope.lexicon["leaderboardType" + data.Type];
                                $scope.hasResults = true;
                                $scope.onLoad(data);
                            }
                        });


                    break;


                case "pending-withdrawals":
                    generalService.cashier.getPendingWithdrawals({ "PlayerId": $scope.playerData.PlayerId, "Type": "", "OrderBy": "", "MaxResults": 10000, "DateFrom": dateFrom }).then(
                        function (data) {
                            if ($rootScope.checkResponse({ response: data, location: 'general', closeOnError: false })) {

                                $scope.onLoad(data);
                                if (data && data[0]) {
                                    if ($scope.cancelWithdrawalMiniMode) {
                                        $scope.cancelWithdrawalMiniText = $rootScope.lexicon["withdrawal_pending_info"].replace("[DATE]", $filter('date')(new Date(data[0].UpdatedDate), 'MMM dd yyyy HH:mm')).replace("[AMOUNT]", $filter('currency')(data[0].Amount, $scope.playerData.Currency.CurrencySymbol));
                                    }
                                }
                            }
                        });

                    break;
            }

        };

        $scope.getTableDate = function (row) {
            if (row.TransactionId == 0) {
                return $rootScope.lexicon["total_net"];
            }
            else {
                return $filter('date')(new Date(row.UpdatedDate), 'MMM dd yyyy HH:mm')
            }
        }

        $scope.canceWithdrawal = function (TransactionId) {

            if ($scope.playerData.Country.JurisdictionId == 721) {
                popupServices.openMessage({ title: 'no_cancel_withdrawal_title', text1: 'no_cancel_withdrawal_text' }, this);
                return;
            }
            generalService.cashier.cancelWithdrawal({ "PlayerId": $scope.playerData.PlayerId, "ItemId": TransactionId }).then(
                function (data) {
                    if ($rootScope.checkResponse({ response: data, location: 'withdrawal_cancel', closeOnError: false })) {
                        $rootScope.getPlayerBalance();

                        popupServices.openMessage({ title: 'withdrawal_cancel', text1: 'withdrawal_cancel_success' }, this);


                        $scope.init("pending-withdrawals");
                    }
                });
        }

        $scope.cancelBonus = function (bonus) {
            popupServices.openConfirm({
                title: $rootScope.lexicon['bonus_title'],
                text1: $rootScope.lexicon['bonus_cancel_confirm'].replace("[BONUSNAME]", bonus.BonusName),
                button1Text: $rootScope.lexicon['yes'],
                button2Text: $rootScope.lexicon['no'],
                showButton2: true
            }, this, false, false, function () {
                generalService.cashier.cancelBonus({ "PlayerId": $scope.playerData.PlayerId, "ItemId": bonus.BonusBalanceID }).then(
                    function (data) {
                        if ($rootScope.checkResponse({ response: data, location: 'bonus_cancel', closeOnError: false })) {
                            $rootScope.getPlayerBalance();
                            $scope.init("bonus");
                            popupServices.openMessage({ title: 'bonus_title', text1: 'bonus_cancel_success' }, this);
                        }
                    });
            });
        }

        $scope.openGameFreeSpins = function (row) {
            if (row.FreeGameID == 1219) {
                var playerData = playerData = $rootScope.getPlayer();
                generalService.authentication.refreshToken({ PlayerId: playerData.PlayerId, Token: playerData.Token, ItemString: "NEW" }).then(
					function (data) {
					    playerData.Token = data;
					    $rootScope.savePlayer(playerData);
					    $rootScope.openSport();
					    $rootScope.closeAllModals();
					},
					function (err) {
					    alert(err);
					}
				);

            }
            else {
                dataService.GamesDictIDs(row.FreeGameID).then(function (game) {
                    if (game && game.GameName) {
                        $rootScope.freeSpins = {};
                        $rootScope.freeSpins.GameId = row.FreeGameID;
                        $rootScope.freeSpins.OfferName = row.FreeGameOffer;
                        $rootScope.freeSpins.FreeSpinsOfferId = row.FreeGamePlayerID;
                        if ($rootScope.freeSpins.GameId == 1219) {
                            $rootScope.openSport();
                        }
                        else {
                            $rootScope.openCasino();
                            $rootScope.openGame('real', game);
                        }
                        $rootScope.closeAllModals();
                    }
                });
            }
        }
		
		$scope.redeposit = function (amount) {
            postToAnalytics('ClientSite', 'Redeposit', 'Player clicked redeposit button from history. transaction amount: ' + amount);
            $rootScope.depositClicked(undefined, amount);
        }

        $scope.onLoad = function (data) {
            $scope.loaded = true;
            $scope.dataTable = data;
        }

        $scope.numberOfPages = function () {
            return ($scope.dataTable ? Math.ceil($scope.dataTable.length / $scope.pageSize) : 0);
        }
    }]);



;
'use srtict';

progressPlayApp.controller('accountController', ['$scope', '$rootScope', '$location', '$timeout', 'eventServices', 'dataService', 'storageService', 'MessagingData', '$window', '$filter', 'popupServices', 'generalService',
    function accountController($scope, $rootScope, $location, $timeout, eventServices, dataService, storageService, MessagingData, $window, $filter, popupServices, generalService) {

        $rootScope.initPage(true);
        $scope.eventServices = eventServices;
        $scope.formSubmitted = false;
        $scope.formPasswordSubmitted = false;
        $scope.submitFlag = 0;
        $scope.submitFlagPassword = 0;
        $scope.player = $rootScope.getPlayer();

        $scope.genderList = dataService.getGenderList();
        $scope.birthdayDropdown = dataService.getBirthdayObject();

        $scope.Countries = storageService.getSessionItem('GeneralData.Countries_' + $rootScope.label.label_id, true);

        $scope.init = function (mode) {
            postToAnalytics('ClientSite', 'AccountPage', 'Account page init with mode: ' + mode);
            switch (mode) {
                case "details":
                    generalService.personalInfo.getPlayerDetails({ "PlayerId": $scope.player.PlayerId, "Token": $scope.player.Token }).then(
                        function (data) {
                            if (data.PlayerId > 0) {								
                                $scope.user = data;
								$scope.user.jurisdictionId = $rootScope.jurisdictionId;
                                $scope.user.GenderId = $scope.user.GenderID.toString();
                                $scope.user.CountryId = $scope.user.Country.CountryId.toString();
                                $scope.user.Birthday = ($scope.user.Birthday.indexOf("T") > 0 ? $scope.user.Birthday.split("T")[0] : $scope.user.Birthday);
                                $scope.user.promotionsChecked = ($scope.user.ReceiveEmail || $scope.user.ReceiveSMS || $scope.user.ReceivePhone || $scope.user.ReceivePost);
                                if ($scope.user.Birthday) {
                                    var date = $scope.user.Birthday.split("T")[0];
                                    var dateArr = date.split("-");
                                    $scope.birthdayDropdown.selectedDay = dateArr[2];
                                    $scope.birthdayDropdown.selectedMonth = dateArr[1];
                                    $scope.birthdayDropdown.selectedYear = dateArr[0];
                                }

                                $scope.user.Password = "xxxxxxxx";
                                $scope.countryModel = $scope.user.Country.CountryName;
                                $scope.PartnerPromotionsEnabled = $rootScope.label.promotions_enabled;
                            }
                        });
                    break;
                case "activation":
                    generalService.personalInfo.getPlayerDetails({ "PlayerId": $scope.player.PlayerId, "Token": $scope.player.Token }).then(
                        function (data) {
                            if (data.PlayerId > 0) {
                                $scope.player.CellphoneNumber = '+' + $scope.player.Country.PhoneCode + ' ' + data.CellphoneNumber;
                                $scope.activationText = $rootScope.lexicon["activation_text2"].replace("[DAYS]", $scope.player.ActivationDays).replace("[LABEL_NAME]", $rootScope.label.label_title);
                            }
                        });
                    break;
                case "password":
                    break;
            }
        }

        $scope.submit = function (form_account) {
            $scope.formSubmitted = true;
            if (form_account.$valid) {
                postToAnalytics('ClientSite', 'PlayerUpdateDetails', 'Player details updated. Submiting the changes');
                if ($scope.submitFlag == 0) {
                    document.activeElement.blur();
                    $scope.submitFlag++;
                    generalService.authentication.updateDetails($scope.user).then(function (data) {
                        if (data.Message) {
                            popupServices.openMessage({ title: 'account_details', text1: data.Message }, this);
                        }
                        else {
                            popupServices.openMessage({ title: 'account_details', text1: 'accountDetails_updated' }, this);
                            $rootScope.updatePlayer();
                            if ($scope.user.Country.CountryId.toString() != $scope.user.CountryId) {
                                $rootScope.getPlayerPaymentMethods();
                            }
                        }
                        $scope.submitFlag = 0;
                    })
                }
            }
        }

        $scope.submitPassword = function (form_password) {
            $scope.formPasswordSubmitted = true;
            if (form_password.$valid) {
                if ($scope.submitFlagPassword == 0) {
                    document.activeElement.blur();
                    $scope.submitFlagPassword++;

                    var request = {
                        "PlayerId": $scope.player.PlayerId,
                        "OldPassword": md5($scope.user.OldPassword),
                        "NewPassword": md5($scope.user.NewPassword)
                    };

                    generalService.personalInfo.changePassword(request).then(function (data) {
                        if (data) {
                            if (data == true) {
                                popupServices.openMessage({ title: 'password_change', text1: 'password_change_success' }, this);
                                $rootScope.closeModalPopupForm();
                            }
                            else {
                                popupServices.openMessage({ title: 'password_change', text1: data.Message }, this);
                            }

                            $scope.submitFlagPassword = 0;
                        }
                    });
                }

            }
        }

        $scope.submitActivation = function (frm) {
            //$rootScope.closeAllModals();
            postToAnalytics('ClientSite', 'PlayerSubmitActivation', 'Player activation was submited');
            $scope.validationFormSubmitted = true;
            if (frm.$valid) {

                generalService.authentication.activatePlayer({ PlayerId: $scope.player.PlayerId, ItemString: $scope.validationNumber }).then(
                    function (data) {
                        if ($rootScope.checkResponse({ response: data, location: 'activation_title', closeOnError: false })) {
                            if (data) {
                                popupServices.openMessage({ title: 'activation_title', text1: 'activation_number_succeeded', isLexicon: true }, this);
                                $scope.activationClose();
                                //$rootScope.closeAllModals();
                            }
                            else {
                                popupServices.openMessage({ title: 'activation_title', text1: 'em_MobileNumberValidationFailed', isLexicon: true }, this);
                            }




                        }
                    });
            }
        }

        $scope.activationClose = function () {
            postToAnalytics('ClientSite', 'PlayerActivationClose', 'Player closed activation popup');
            if ($rootScope.label.label_id == 147 && !$scope.player.IsFTD) {
                $rootScope.setForm('cashier-menu', 'deposit');
            }
            $rootScope.closeModalPopupForm();
        }
        //$scope.submitValidation = function (frm) {
        //    $scope.validationFormSubmitted = true;
        //    if (frm.$valid) {
        //        document.activeElement.blur();

        //        generalService.authentication.validateMobileNumber({ PlayerId: $scope.player.PlayerId, ItemString: $scope.validationNumber, Token: '' }).then(
        //             function (data) {
        //                 if ($rootScope.checkResponse({ response: data, location: 'validate_your_account', closeOnError: false })) {
        //                     if (data) {
        //                         popupServices.openMessage({ title: 'validate_your_account', text1: 'validation_number_succeeded', isLexicon: true }, this);
        //                         $rootScope.closeAllModals();
        //                     }
        //                     else {
        //                         popupServices.openMessage({ title: 'validate_your_account', text1: 'em_MobileNumberValidationFailed', isLexicon: true }, this);
        //                     }
        //                 }
        //             });
        //    }
        //}

        $scope.activationResend = function () {
            generalService.authentication.activation({ PlayerId: $scope.player.PlayerId }).then(
                function (data) {
                    if ($rootScope.checkResponse({ response: data, location: 'activation_title', closeOnError: false })) {
                        popupServices.openMessage({ title: 'activation_title', text1: 'activation_alert_activationSent' }, this);
                    }
                });
        }


        $scope.submitChangeApproval = function (frm) {
            if (frm.$valid) {
                var LimitName = $rootScope.formParams.split('|')[0];
                var LimitValue = $rootScope.formParams.split('|')[1];

                var params = { "PlayerId": $scope.player.PlayerId, "ItemId": parseInt(LimitValue), "ItemString": md5($scope.user.OldPassword) };

                switch (LimitName) {
                    case "Exclusion":
                        generalService.cashier.setPlayerExclusion(params).then(
                            function (data) {
                                if (data.Message) {
                                    popupServices.openMessage({ title: 'limits_title', text1: data.Message }, this);
                                }
                                else {
                                    $rootScope.logoutAction();
                                }
                            });
                        breal;
                    case "TimeOut":
                        generalService.cashier.setPlayerTimeOut(params).then(
                            function (data) {
                                if (data.Message) {
                                    popupServices.openMessage({ title: 'limits_title', text1: data.Message }, this);
                                }
                                else {
                                    $rootScope.logoutAction();
                                }
                            });
                        break;
                }
            }
        }

        $scope.countryChanged = function () {
            postToAnalytics('ClientSite', 'CountryChanged', 'Player changed is country to: ' + $scope.countryModel);
            $scope.user.CountryId = $scope.countryModel;
        }

        $scope.updateBirthday = function () {
            $scope.user.Birthday = $scope.birthdayDropdown.selectedYear + "-" + $scope.birthdayDropdown.selectedMonth + "-" + $scope.birthdayDropdown.selectedDay + "T00:00:00";
            postToAnalytics('ClientSite', 'UpdateBirthday', 'Player updated his birthday to: ' + $scope.user.Birthday);
        }

        $scope.checkBirthday = function (form_account) {
            var birthday = new Date($scope.birthdayDropdown.selectedYear, $scope.birthdayDropdown.selectedMonth - 1, $scope.birthdayDropdown.selectedDay);
            form_account.day.$setValidity("below18", (birthday < $scope.birthdayDropdown.maxBirthday));
        }
    }]);


;
/// <reference path="../services/generalService.js" />
'use srtict';

progressPlayApp.controller('promotionsController', ['$routeParams', '$scope', '$rootScope', '$window', '$location', '$timeout', '$interval', '$filter', '$compile', 'dataService', 'contentService', 'storageService',
    function promotionsController($routeParams, $scope, $rootScope, $window, $location, $timeout, $interval, $filter, $compile, dataService, contentService, storageService) {
        $rootScope.initPage();
        $scope.cdnUrl = window.PPconfig.urlCDNPromotions;
        $scope.promotions = [];
        $scope.promotionsCount;
        $scope.welcomePromotion;
        $scope.currPromotion;
        $scope.promotionsLoaded;
        $scope.promotionOpen;
        $scope.isMobile = $rootScope.isMobile();
        $scope.isApple = $rootScope.isApple();
        $scope.currPromotionIndex = 0;
        $scope.playerData = $rootScope.getPlayer();

        $scope.$on('promotionsArrived', function (event, data) {
            $scope.initPromotions();
        })

        $scope.$watch('currPromotion', function (newValue, oldValue) {
            if (newValue != oldValue)
                setPromotionTNC($scope.currPromotion);
        });

        $scope.initPromotions = function () {
            $scope.promotionsArrived = true;
            dataService.Promotions(false).then(function (data) {
                $scope.playerData = $rootScope.getPlayer();
                $scope.promotions = data;
                $scope.currPromotionIndex = 0;
                if ($rootScope.isLoggedIn() && $scope.playerData) {
                    //$scope.promotions = $scope.promotions.filter(function (promotion) { return $scope.playerData.IsFTD ? promotion.show2Real : promotion.show2Fun; });
                    $scope.promotions = $scope.promotions.filter(function (promotion) { return (promotion.depositCount == null || $scope.playerData.Account.DepositsCount == promotion.depositCount) });
                }

                $scope.screenWidth = window.innerWidth + 'px';

                switch ($scope.mode) {
                    case "lobby":
                        $scope.bannerHeight = $rootScope.bannerHeight() - 60 + 'px';
                        $scope.promotions = $scope.promotions.filter(function (promotion) { return promotion.showInLobby; });
                        if ($scope.promotions[$scope.currPromotionIndex].htmlSummary == null) {
                            dataService.PromotionById($scope.promotions[$scope.currPromotionIndex].id).then(function (data) {
                                $scope.promotions[$scope.currPromotionIndex].htmlSummary = data.htmlSummary;
                                $scope.currPromotion = $scope.promotions[$scope.currPromotionIndex];
                                setPromotionTNC($scope.promotions[$scope.currPromotionIndex]);
                                $timeout(function () {
                                    $scope.$evalAsync();
                                }, 200);
                            });
                        }
                        else
                            $scope.currPromotion = $scope.promotions[$scope.currPromotionIndex];
                        break;
                    case "game":
                        $timeout(function () {
                            $scope.promotions = $scope.promotions.filter(function (promotion) { return promotion.showInGame; });
                            $scope.currPromotion = $scope.promotions[$scope.currPromotionIndex];
                        }, 200);

                        break;
                    case "page":
                        //$scope.promotions = $scope.promotions.filter(function (promotion) { return promotion.showInPromotionPage; });
                        $scope.bannerHeight = $rootScope.bannerHeight() + 'px';
                        $scope.bannerHeightMenu = $rootScope.bannerHeight() / (window.innerWidth <= 1024 ? 1 : 2) + 'px';
                        if ($rootScope.formParams) {
                            if ($rootScope.formParams.code) {
                                $scope.currPromotion = $rootScope.formParams;
                            }
                            else {
                                if ($rootScope.formParams == "welcome") {
                                    $scope.currPromotion = $scope.promotions.filter(function (promotion) { return (promotion.isWelcome ? promotion : null); })[0];
                                }
                                else {
                                    $scope.currPromotion = $scope.promotions.filter(function (promotion) { return (promotion.code == $rootScope.formParams ? promotion : null); })[0];
                                }
                            }
                            if ($scope.currPromotion) {
                                $scope.singleMode = true;
                                $scope.openPromotion($scope.currPromotion);
                                $rootScope.formParams = null;
                            }
                        }
                        break;
                    case "view":

                        $scope.showArrows = true;
                        break;
                }

                $scope.promotionsCount = Object.keys($scope.promotions).length;
                $scope.showArrows = $scope.promotionsCount > 1;
                $scope.$evalAsync();

            })

        }

        $scope.init = function () {
            //if ($scope.mode != 'lobby') {
                $scope.initPromotions();
            //}
        };
		
	    $scope.promotionCaption = function (promotion) {
            if (promotion) {
				return ($rootScope.isLoggedIn() ? (promotion.code.indexOf("-GAME:") > 0 ? $rootScope.lexicon["playNow"] : $rootScope.lexicon["depositNow"]) : ((storageService.getItem('loginUserData', true)) ? $rootScope.lexicon["loginNow"] : $rootScope.lexicon["joinNow"]));			
            }
        }

        $scope.promotionImageUrl = function (promotion) {
            if (promotion) {
                var url = (window.innerWidth <= 800 ? promotion.imageSmallUrl : ($scope.mode == 'game' ? promotion.imagePortraitUrl : promotion.imageNormalUrl));
                if (url.indexOf('.gif') > 0) {
                    var fileName = url.substr(0, url.lastIndexOf("."));
                    return fileName + '.mp4';
                }
                return url;
            }
        }

        $scope.isVideoFile = function (promotion) {
            if (promotion) {
                var url = $scope.promotionImageUrl(promotion);
                if (url.indexOf(".mp4") > 0) {
                    return true;
                }
            }
            return false;
        }

        $scope.promotionsFilter = function (promotion) {
            if (!promotion.depositCount || promotion.depositCount == 0 || ($scope.playerData && $scope.playerData.DepositsCount == promotion.depositCount)) {
                return promotion;
            }
        }

        $scope.openGame = function (gameName) {
            postToAnalytics('ClientSite', 'PromotionsOpenGame', 'Player opened demo game from promotions page. Game: ' + gameName);
            var popupMustApprove = storageService.getSessionItem('mustApprovePopup', true);
            if (popupMustApprove) {
                showConfirmPopup(popupMustApprove);
            }
            else
                $rootScope.openGame('demo', gameName);
        }

        $scope.openChat = function () {
            postToAnalytics('ClientSite', 'PromotionsOpenChat', 'Player opened chat from promotions page');
            $rootScope.openChat();
        }

        $scope.openInfo = function (page) {
            postToAnalytics('ClientSite', 'PromotionsOpenInfo', 'Player opened info from promotions page');
            $rootScope.openModalPopupForm('info-main', page);
        }

        $scope.slide = function (dir) {
            if (!dir || (dir != 1 && dir != -1)) dir = 1;
            $scope.currPromotionIndex += dir;
            if ($scope.currPromotionIndex == $scope.promotionsCount) {
                $scope.currPromotionIndex = 0;
            }
            if ($scope.currPromotionIndex == -1) {
                $scope.currPromotionIndex = $scope.promotionsCount - 1;
            }

            $scope.currPromotion = $scope.promotions[$scope.currPromotionIndex];
            if ($scope.mode == 'page') {
				if (!$scope.currPromotion.showInPromotionPage) {
                    $scope.slide(dir);
                    return;
                }
                dataService.PromotionById($scope.currPromotion.id).then(function (data) {
					$scope.currPromotion = data;
                    setPromotionTNC(data);
                    $timeout(function () {
                        $scope.$evalAsync();
                    }, 200);
                });
            }

        }

        $scope.openPromotion = function (promotion) {
            postToAnalytics('ClientSite', 'PromotionsOpenPromotion', 'Player opened promotion: ' + promotion.name);
            $rootScope.scrollModalToTop();
            if (promotion) {
                dataService.PromotionById(promotion.id).then(function (data) {
                    promotion = data;
                    $scope.currPromotion = promotion;
                    setPromotionTNC(promotion);
                    $timeout(function () {
                        $scope.$evalAsync();
                    }, 200);
                });
            }
            if ($scope.promotionOpen) {
                $scope.promotionOpen = false;
            }
            else {
                $scope.promotionOpen = true;
            }
        }

        $scope.closePromotions = function () {
            $rootScope.scrollModalToTop();
            if (!$scope.promotionOpen || $scope.singleMode) {
                $rootScope.closeModalForm();
            }
            else {
                $scope.promotionOpen = false;
            }
        }

        $scope.openPromotions = function (promotion) {
            if (!promotion) {
                $scope.currPromotion = $scope.promotions[$scope.currPromotionIndex];
            }
            $rootScope.setForm('promotions', promotion, 'modal_content_wide');
        }
        $scope.promotionClicked = function (promotion) {
            if (!$rootScope.isLoggedIn()) {
                if (storageService.getItem('loginUserData', true)) {
                    $rootScope.openModalForm('login');
                    postToAnalytics('ClientSite', 'PromotionClickedCTALogin', 'Player clicked om promotion CTA button and redirected to login');
                }
                else {
                    $rootScope.openRegistration();
                    postToAnalytics('ClientSite', 'PromotionClickedCTARegister', 'Player clicked om promotion CTA button and redirected to registration');
                }
            }
            else {
                if (promotion.code.indexOf("-GAME:") > 0) {
                    var gameid = promotion.code.substring(promotion.code.indexOf("-GAME:") + 6);
                    $rootScope.openGameByID('real', gameid);
                }
                else {
                    $rootScope.openModalForm('cashier-menu', 'deposit');
                }
                postToAnalytics('ClientSite', 'PromotionClickedCTADeposit', 'Player clicked om promotion CTA button and redirected to deposit');
            }
            if (typeof ($solitics) !== 'undefined')
                $solitics.onClick('PromotionBannerDeposit', { details: $rootScope.isLoggedIn() ? 'LoggedIn' : 'NotLoggedIn' });

            if (typeof (_smartico) != 'undefined' && _smartico.identify)
                _smartico.event('client_action', { action: 'PromotionBannerDeposit', mode: $scope.cashierMode, promotion: promotion })
        }

        function setPromotionTNC(promotion) {
            try {
                dataService.TermsAndConditions($rootScope.label.label_id, 'terms', $rootScope.locale, $rootScope.tracker).then(function (data) {
                    if (data.length > 0 && data[0].hasOwnProperty('Html')) {
                        var div = document.createElement('div');
                        div.innerHTML = promotion.htmlSummary ? promotion.htmlSummary.trim() : '';
                        var htmlDiv = document.createElement('div');
                        htmlDiv.innerHTML = data[0].Html.trim();
                        var article = div.getElementsByClassName('tnc');
                        if (article.length > 0) {
                            var details = article[0].getElementsByTagName('details');
                            if (details.length > 0 && details[details.length - 1].lastChild.innerText && htmlDiv.innerText
                                    && details[details.length - 1].lastChild.innerText.trim().substr(-200) != htmlDiv.innerText.trim().substr(-200))
                                details[details.length - 1].appendChild(htmlDiv);
                        }
                        $scope.currPromotion.htmlSummary = div.innerHTML;
                        $scope.$evalAsync();
                    }
                });
            }
            catch (ex) { }
        }
    }]);
;

'use srtict';

progressPlayApp.controller('forgotPasswordController', ['$scope', '$routeParams', '$location', 'dataService', 'storageService', 'MessagingData', '$window', '$filter', 'eventServices', 'popupServices', 'generalService', '$timeout', '$rootScope', '$routeParams',
    function forgotPasswordController($scope, $routeParams, $location, dataService, storageService, MessagingData, $window, $filter, eventServices, popupServices, generalService, $timeout, $rootScope, $routeParams) {
        $scope.params = {};
        $scope.showCloseButton = true;

        if (!angular.equals($routeParams, {})) {
            $scope.params.email = $routeParams.email;
            $scope.showCloseButton = false;
            $rootScope.init(true);
            $rootScope.headerTemplate = null;
            $rootScope.footerTemplate = null;
        }
        else {
            if ($scope.loginUserData) {
                $scope.params.email = $scope.loginUserData.email;
            }
        }

        $rootScope.initPage();


        $scope.loginUserData = storageService.getItem('loginUserData', true);
        $scope.step = 1;
        $scope.playerId;
        $scope.Subjects = [];
        $scope.init = function () {
            if ($rootScope.formParams && $rootScope.formParams.indexOf("-") > 0) {
                $scope.playerId = $rootScope.formParams.split("-")[1];
                $scope.params.validationNumber = $rootScope.formParams.split("-")[0];
                $location.path('/');
                $scope.validateNumber();
            }



            for (i = 0; i < 10; i++) {
				if ($rootScope.lexicon["contactUsSubjectDD_" + (i + 1)])
					$scope.Subjects[i] = $rootScope.lexicon["contactUsSubjectDD_" + (i + 1)];
            }

        }


        $scope.sendSupportRequest = function (frm) {
            $scope.formSubmitted = true;
            if (frm.$valid) {
                $scope.playerData = $rootScope.getPlayer();
                var body = encodeURIComponent($scope.params.body) + "%0A%0A%0AFrom:" + $rootScope.label.label_name + "%0APlayerId:" + ($scope.playerData ? $scope.playerData.PlayerId : "unknown");
                var result = "mailto:" + ($rootScope.country.CountryIntlCode == 'JP' ? window.PPconfig.contactUsEmailJapan : window.PPconfig.contactUsEmail) + "?subject=" + encodeURIComponent($scope.params.subject) + "&body=" + body;				
				if ($rootScope.isApple()) {
					window.location.href = result;
				}
				else {
					window.open(result);	
				}
            }
        }

        $scope.send = function (form_forgot) {
            $scope.formSubmitted = true;
            if (form_forgot.$valid) {

                switch($scope.step)
                {
                    case 1:
                        generalService.authentication.forgotPassword({ email: $scope.params.email, password: '', whiteLabelId: $rootScope.label.label_id }).then(
                            function (data) {
                                if ($rootScope.checkResponse({ response: data, location: 'password_forgot', closeOnError: false })) {
                                    $scope.playerId = data;
                                    $scope.formSubmitted = false;
                                    $scope.step = 2;
                                }
                            });
                        break;
                    case 2:
                        $scope.validateNumber();
                        break;

                    case 3:
                        generalService.authentication.forgotPasswordChangePassword({ PlayerId: $scope.playerId, ItemString: md5($scope.params.newPassword), "NewPassword": md5($scope.params.newPassword) }).then(
                            function (data) {
                                if (data) {
                                    if ($rootScope.checkResponse({ response: data, location: 'password_forgot', closeOnError: false })) {
                                        if (data) {
                                            $scope.formSubmitted = false;
                                            popupServices.openMessage({ title: 'password_change', text1: 'password_change_success' }, this);
                                            
                                            //$rootScope.setForm('login');
                                            $rootScope.closeModalForm();
                                        }
                                        else {
                                            popupServices.openMessage({ title: 'password_change', text1: data.Message }, this);
                                        }
                                    }
                                }
                            });
                        break;
                }
            }
        }

        $scope.validateNumber = function () {
            generalService.authentication.forgotPasswordValidateNumber({ PlayerId: $scope.playerId, ItemString: $scope.params.validationNumber }).then(
                function (data) {
                    if ($rootScope.checkResponse({ response: data, location: 'password_forgot', closeOnError: false })) {
                        if (data) {
                            $scope.formSubmitted = false;
                            $scope.step = 3;
                        }
                        else {
                            popupServices.openMessage({ title: 'password_forgot', text1: 'em_MobileNumberValidationFailed' }, this);
                        }
                    }
                });
        }
    }]); 


;

'use srtict';

progressPlayApp.controller('unsubscribeController', ['$scope', '$routeParams', '$location', 'dataService', 'storageService', 'MessagingData', '$window', '$filter', 'eventServices', 'popupServices', 'generalService', '$timeout', '$rootScope', '$routeParams',
    function unsubscribeController($scope, $routeParams, $location, dataService, storageService, MessagingData, $window, $filter, eventServices, popupServices, generalService, $timeout, $rootScope, $routeParams) {
        $scope.params = {};
        $scope.formSubmitted = false;

        if (!angular.equals($routeParams, {})) {
            $scope.params.encryptedName = $routeParams.encryptedName;
            $scope.params.playerId = $routeParams.playerId;
            $scope.params.email_unique_id = $routeParams.email_unique_id;
            $scope.showCloseButton = false;
            $rootScope.init(true);
        }

        $rootScope.initPage();


        $scope.playerId;
        $scope.Subjects = [];
        $scope.init = function () {
            if ($rootScope.formParams && $rootScope.formParams.indexOf("-") > 0) {
                $scope.playerId = $rootScope.formParams.split("-")[1];
                $scope.params.validationNumber = $rootScope.formParams.split("-")[0];
                $location.path('/');
            }
        }

        $scope.send = function (form_forgot) {
            if (form_forgot.$valid) {
                generalService.authentication.unsubscribe({
                    EncryptedName: $scope.params.encryptedName,
                    PlayerId: $scope.params.playerId,
                    LabelId: $rootScope.label.label_id,
                    EncryptedEmail: $scope.params.email_unique_id
                }).then(
                    function (data) {
                        if ($rootScope.checkResponse({ response: data, location: 'unsubscribe', closeOnError: false })) {
                            $scope.formSubmitted = true;
                        }
                    });
            }
        }

    }]);


;
'use srtict';

progressPlayApp.controller('verifyIdController', ['$scope', '$location', '$window', 'eventServices', 'dataService', 'storageService', '$rootScope', '$filter', 'generalService', 'popupServices', '$log', '$timeout', '$interval', '$compile', 'MessagingData', '$routeParams',
    function verifyIdController($scope, $location, $window, eventServices, dataService, storageService, $rootScope, $filter, generalService, popupServices, $log, $timeout, $interval, $compile, MessagingData, $routeParams) {
        if (!angular.equals($routeParams, {})) {
            $scope.showUploadWizard = $routeParams.showUploadWizard === 'true';
            $scope.showUploadWizardPopup = $routeParams.showUploadWizardPopup === 'true';
            $scope.playerData = { PlayerId: $routeParams.playerId, Token: $routeParams.token };
            $rootScope.Token = $routeParams.token;
            $rootScope.labelName = labelName.toLowerCase();
            $rootScope.init(true);
            $rootScope.headerTemplate = null;
            $rootScope.footerTemplate = null;
        }
        else {
			if ($rootScope.formParams) {
				$scope.showUploadWizard = $rootScope.formParams.showUploadWizard == true;
				$scope.showUploadWizardPopup = $rootScope.formParams.showUploadWizardPopup == true;
			}
			else {
				$scope.showUploadWizard = false;
				$scope.showUploadWizardPopup = false;
			}
        }
        $scope.eventServices = eventServices;
        $scope.loginUserData = storageService.getItem('loginUserData', true);
        $scope.userEmail;
        $scope.userPassword;
        $scope.cashierPath = null;
        $scope.selectedDocumentType = null;
        $scope.commonParameters = {};
        $scope.userDocumentTypesStatuses = null;
        $scope.documentTypes = null;
        $scope.generalPageErrors = [];
        $scope.selectedSubType = { Id: 1 };
        $scope.approvalPageStatus = null;
        var dragBoxText;

        

        $scope.init = function () {

            logger.info("verifyIdController - player init(); isMobile: " + $rootScope.isMobile());

            logger.info("verifyIdController - showUploadWizard: " + $scope.showUploadWizard);

            postToAnalytics('ClientSite', 'VerifyIDPageInit', 'starting verify id page. IsWizard: ' + JSON.parse($scope.showUploadWizard));

            if ($scope.showUploadWizard && $scope.showUploadWizardPopup === true) {
                $timeout(function () {
                    popupServices.openMessage({
                        title: $rootScope.lexicon.VerificationDocumentsWizardPopupTitle,
                        text1: $rootScope.lexicon.VerificationDocumentsWizardPopupText, button1Text: $rootScope.lexicon.ok
                    }, this, false);
                }, 100);
            }

            if (!$scope.playerData)
                $scope.playerData = $rootScope.getPlayer();
            if ($scope.playerData == null) {
                logger.info("verifyIdController - playerData not found. logging player out");
                $rootScope.logoutAction();
                return;
            }

            $scope.steps = [{
                id: 1,
                documentType: 713,
                Title: $rootScope.lexicon.verifyIDProofOfIdentityTitle,
                SubTitle: $rootScope.lexicon.verifyIDProofOfIdentitySubTitle,
                SubTitleExplanation: $rootScope.lexicon.verifyIDProofOfIdentityText,
                documentText: $rootScope.lexicon.verifyIDIdentityFront || 'Front side',
                buttonText: $rootScope.lexicon.verifyIDNextStep || 'Continue',
                buttonAction: $scope.nextStep,
                cssClass: 'id_front',
                allowMultipleFiles: false,
                subTypes: [{ Id: 1, Text: $rootScope.lexicon.verifyIDDrivingLicense, Checked: true, SkipStepID: [2,3] }, { Id: 2, Text: $rootScope.lexicon.verifyIDPassport, Checked: false, SkipStepID: [2] }, { Id: 3, Text: $rootScope.lexicon.verifyIDIdentityCard, Checked: false }]
            }, {
                id: 2,
                documentType: 713,
                Title: $rootScope.lexicon.verifyIDProofOfIdentityTitle,
                SubTitle: $rootScope.lexicon.verifyIDProofOfIdentitySubTitle,
                SubTitleExplanation: $rootScope.lexicon.verifyIDProofOfIdentityText,
                documentText: $rootScope.lexicon.verifyIDIdentityBack || 'Back side',
                buttonText: $rootScope.lexicon.verifyIDNextStep || 'Continue',
                buttonAction: $scope.nextStep,
                allowMultipleFiles: false,
                cssClass: 'id_back'
            }, {
                id: 3,
                documentType: 714,
                Title: $rootScope.lexicon.verifyIDProofOfAddressTitle,
                SubTitle: $rootScope.lexicon.verifyIDProofOfAddressSubTitle,
                SubTitleExplanation: $rootScope.lexicon.verifyIDProofOfAddressText,
                documentText: null,//$rootScope.lexicon.verifyIDAddress || 'Address',
                buttonText: $rootScope.lexicon.verifyIDNextStep || 'Continue',
                buttonAction: $scope.nextStep,
                allowMultipleFiles: true,
                cssClass: 'address'
            }, {
                id: 4,
                documentType: 715,
                Title: $rootScope.lexicon.verifyIDProofOfPaymentTitle,
                SubTitle: $rootScope.lexicon.verifyIDProofOfPaymentSubTitle,
                SubTitleExplanation: $rootScope.lexicon.verifyIDProofOfPaymentText,
                documentText: null,//$rootScope.lexicon.verifyIDPayment || 'Payment',
                buttonText: $rootScope.lexicon.upload_document_btn_txt || 'Upload',
                buttonAction: $scope.uploadFile,
                cssClass: 'payment',
                allowMultipleFiles: true,
                skipIfWizard: true
            }, {
                id: 5,
                documentType: 716,
                Title: $rootScope.lexicon.verifyIDOtherTitle,
                SubTitle: $rootScope.lexicon.verifyIDOtherSubTitle,
                SubTitleExplanation: $rootScope.lexicon.verifyIDOtherText,
                documentText: null,
                buttonText: $rootScope.lexicon.upload_document_btn_txt || 'Upload',
                buttonAction: $scope.uploadFile,
                cssClass: 'other',
                allowMultipleFiles: true,
                skipIfWizard: true
            }, {
                id: 6,
                documentType: -1,
                Title: $rootScope.lexicon.verifyIDApprovalTitle || "verifyIDApprovalTitle",
                SubTitle: $rootScope.lexicon.verifyIDApprovalSubTitle || "verifyIDApprovalSubTitle",
                documentText: $rootScope.lexicon.verifyIDApprovalText || "verifyIDApprovalText",
                buttonText: $rootScope.lexicon.close || 'Close',
                buttonAction: $scope.closePage,
                cssClass: 'approval',
            }];

            $scope.steps = $scope.steps.filter(function (s) { return !$scope.showUploadWizard || ($scope.showUploadWizard && !s.skipIfWizard); });

            $scope.steps[0].subTypes[0].Checked = true;

            $scope.canUpload = false;

            $scope.mode = 'popup';
            $rootScope.formParams = '';
            $scope.formTitle = $rootScope.lexicon.verifyIdTitle;
            $scope.verifyIdSubTitle = $rootScope.lexicon.verifyIdSubTitle;

            if ($scope.loginUserData) {
                $scope.userEmail = $scope.loginUserData.email;
            }

            getUserDocumentTypesStatuses(false);
            getDocumentTypes();
            getCommonParametersByType();
            getUserNumberOfDocuments();
        }

        $scope.initVerifyIdPage = function () {
            createFileInput();
            $scope.filesError = [];
            $scope.comment = { text: '' };
            $scope.showCommentTextbox = false;
            $scope.filesUploadedServerError = [];
            $scope.base64Files = [];
            $scope.files = [];

            if ($rootScope.isMobile()) {
                dragBoxText = $rootScope.lexicon.clickToAddFiles;
            }
            else {
                dragBoxText = $rootScope.lexicon.clickOrFragFilesHere;
            }
            $scope.dropText = dragBoxText

            $scope.addParentDropBoxEvents();

            addInputFileClickEvent();
            //============== DRAG & DROP =============

        }

        function addInputFileClickEvent() {
            var input = document.getElementById('fileToUpload');
            input.addEventListener("change", setFiles, false);
        }

        function dragOverHandler(evt) {
            evt.stopPropagation()
            evt.preventDefault()
            var clazz = 'not-available'
            var ok = evt.dataTransfer && evt.dataTransfer.types && evt.dataTransfer.types.indexOf('Files') >= 0
            $scope.$apply(function () {
                $scope.dropText = ok ? dragBoxText : $rootScope.lexicon.onlyFilesAllowed
                $scope.dropClass = ok ? 'over' : 'not-available'
            })
        }

        function dropEventHandler(evt) {
            console.log('drop evt:', JSON.parse(JSON.stringify(evt.dataTransfer)))
            evt.stopPropagation()
            evt.preventDefault()
            $scope.$apply(function () {
                $scope.dropText = dragBoxText
                $scope.dropClass = ''
            })
            var files = evt.dataTransfer.files
            if (files.length > 0) {
                if (!checkMultipleFilesAllowed())
                    return;
                $scope.$apply(function () {
                    pushFiles(Array.from(files));
                })
            }
        }

        // init event handlers
        function dragEnterLeave(evt) {
            evt.stopPropagation()
            evt.preventDefault()
            $scope.$apply(function () {
                $scope.dropText = dragBoxText
                $scope.dropClass = ''
            })
        }

        $scope.addParentDropBoxEvents = function () {
            var dropbox = document.getElementsByClassName("dropbox")
            for (var i = 0; i < dropbox.length; i++) {
                dropbox[i].addEventListener("dragenter", dragEnterLeave, false);
                dropbox[i].addEventListener("dragleave", dragEnterLeave, false);
                dropbox[i].addEventListener("dragover", dragOverHandler, false);
                dropbox[i].addEventListener("drop", dropEventHandler, false);
            }
        }

        var setFiles = function (element) {
            $scope.$apply(function ($scope) {

                if (checkMultipleFilesAllowed()) {

                    // Turn the FileList object into an Array
                    $scope.filesError = getValidationError(element.srcElement.files);
                    var elementFiles = Array.from(element.srcElement.files);
                    if ($scope.filesError.length > 0) {
                        if ($scope.filesError[0].FileName === null) {
                            elementFiles = [];
                            return;
                        }
                        $scope.filesError.forEach(function (file) {
                            elementFiles.splice(elementFiles.findIndex(function (f) { return f.name === file.Name }), 1);
                            postToAnalytics('ClientSite', 'VerifyIDValidationFileError', 'File error: ' + file.Error);
                        });
                    }
                    pushFiles(elementFiles);
                }
                else
                    $scope.filesError.push({ FileName: null, Error: "%oneFileAllowedInThisStep%" });
                $timeout(function () {
                    element.srcElement.remove();
                    createFileInput();
                }, 500);
            });
        };


        var commonParamsInterval = undefined;
        var createFileInput = function () {
            var commonParams = $scope.commonParameters["DocumentsUploadFileTypesAllowed"];
            if (commonParams) {
                clearInterval(commonParamsInterval);
                var fileTypes = $scope.commonParameters["DocumentsUploadFileTypesAllowed"].split('|');

                var input = '<input type="file" accept=".' + fileTypes.join(',.') + '" ng-model-instant id="fileToUpload" ng-multiple="selectedStep.allowMultipleFiles" />';
                var elem = document.getElementById("file-input-container");
                if (elem) {
                    elem.innerHTML += input
                    addInputFileClickEvent();
                    $compile(elem)($scope);
                }
            }
            else if (commonParamsInterval == undefined) {
                commonParamsInterval = setInterval(createFileInput, 300);
            }
        }

        var checkMultipleFilesAllowed = function () {
            if (!$scope.selectedStep.allowMultipleFiles) {
                var selectedStepFiles = $scope.files.find(function (f) { return f.stepId === $scope.selectedStep.id });
                return !selectedStepFiles;
            }
            return true;
        }

        $scope.uploadFile = function () {
            if ($scope.files.length === 0) {
                $scope.filesError.push({ FileName: null, Error: "%noFileHasBeenChoosen%" });
                return;
            }
            logger.info("verifyIdController - Start to upload files. Count: " + $scope.files.length);
            postToAnalytics('ClientSite', 'VerifyIDUploadFiles', 'Upload files submited. files count: ' + $scope.files.length);
            var form = new FormData();
            form.append('Token', $scope.playerData.Token);
            form.append('PlayerId', $scope.playerData.PlayerId);
            form.append('Comment', $scope.comment.text);

            for (var i in $scope.files) {
                form.append('form-key', $scope.files[i].file);
                form.append($scope.files[i].file.name, $scope.files[i].documentType);
            }
            $rootScope.showLoader($rootScope.lexicon.verifyIDUploadFilesLoaderText || "Please bare with us..");
            generalService.cashier.uploadUserDocuments(form).then(
                function (data) {
                    $rootScope.hideLoader();
                    if ($rootScope.checkResponse({ response: data, location: $scope.cashierMode, closeOnError: false })) {
                        postToAnalytics('ClientSite', 'VerifyIDUploadFilesSuccess', 'Upload files succeeded');
                        logger.info("verifyIdController - Done uploading files. Response: " + JSON.stringify(data));
                        if (data != null && !angular.equals(data, {})) {
                            if (!angular.equals(data.m_Item1, {})) {
                                $scope.filesUploadedServerError = data.m_Item1;
                                for (var key in data.m_Item1) {
                                    $scope.removeFile({
                                        name: key
                                    });
                                }
                            }
                            else if (data.m_Item2 !== null && data.m_Item2 === true) //if player has beed verified successfully with IDScan
                            {
                                goToApprovalPage(data.m_Item2);
                                getUserDocumentTypesStatuses(true);
                            }
                            else {
                                goToApprovalPage(data.m_Item2);
                                getUserDocumentTypesStatuses(true);
                            }
                        }
                    }
                    else uploadFailed();
                }, function (data) {
                    $rootScope.hideLoader();
                });
        }

        $scope.isNaN = function (text) {
            return isNaN(text);
        }

        $scope.hasFilesForDocType = function () {
            return $scope.files.findIndex(function (f) { return f.stepId === $scope.selectedStep.id }) > -1;
        }

        function pushFiles(files) {
            var promises = [];
            files.forEach(function (file) {
                if ($scope.files.findIndex(function (f) {
                    return f.file.name === file.name
                }) < 0) {
                    logger.info("verifyIdController - player added file: " + file.name + ". Step: " + $scope.selectedStep.documentText);
                    $scope.files.push({ file: file, documentType: $scope.selectedStep.documentType, stepId: $scope.selectedStep.id })
                    promises.push(getBase64(file));
                }
                else
                    $scope.filesError.push({
                        FileName: file.name, Error: "%fileAlreadyChoosen%"
                    });
            });
            Promise.all(promises).then(function (data) {
                $scope.$apply(function ($scope) {
                    data.forEach(function (data) {
                        $scope.base64Files.push({
                            'src': data ? data.base64 : null, 'name': data.name, 'size': data.size, 'step': $scope.selectedStep.id
                        })
                    });
                });
            })
        }

        function getValidationError(files) {
            var filesErrors = [];
            //var returnErrors = { Messages: [], FileNames: [] };
            if (($scope.userNumOfDocuments + files.length) > parseInt($scope.commonParameters["MaxDocumentsUploadForUser"])) {
                filesErrors.push({
                    FileName: null, Error: "%maxUploadedFilesPerUser%"
                });
                logger.error("verifyIdController - player failed to add file. Error: " + $rootScope.lexicon.maxUploadedFilesPerUser);
                return filesErrors;
            }
            if (($scope.files.length + files.length) > parseInt($scope.commonParameters["MaxDocumentsUploadInPage"])) {
                filesErrors.push({
                    FileName: null, Error: "%maxUploadedFilesPerUpload%"
                });
                logger.error("verifyIdController - player failed to add file. Error: " + $rootScope.lexicon.maxUploadedFilesPerUser);
                return filesErrors;
            }
            for (var i = 0; i < files.length; i++) {
                var file = files[i];
                logger.info("verifyIdController - validating added file. Name: " + file.name);
                if (file.size <= 0) {
                    filesErrors.push({
                        FileName: file.name, Error: "%fileIsEmptyError%"
                    });
                    logger.error("verifyIdController - player failed to add file. Error: " + $rootScope.lexicon.fileIsEmptyError);
                }
                if ((file.size / 1024 / 1024) > parseInt($scope.commonParameters["MaxDocumentsFileUploadSizeMB"])) {
                    filesErrors.push({
                        FileName: file.name, Error: "%fileSizeError%"
                    });
                    logger.error("verifyIdController - player failed to add file. Error: " + $rootScope.lexicon.fileSizeError);
                }
                if ($scope.commonParameters["DocumentsUploadFileTypesAllowed"].split('|').indexOf(file.type.split('/')[1]) < 0) {
                    filesErrors.push({
                        FileName: file.name, Error: "%fileTypeError%"
                    });
                    logger.error("verifyIdController - player failed to add file. Error: " + $rootScope.lexicon.fileTypeError);
                }
            }
            if (filesErrors.length > 0) {
                var errorsList = [];
                console.log("Error while trying to upload files: " + JSON.stringify(filesErrors));
                filesErrors.forEach(function (fileError) {
                    filesErrors.filter(function (file) {
                        if (file.Error !== fileError.Error) {
                            errorsList.push(fileError);
                        }
                    });
                });
            }
            return filesErrors || errorsList;
        }

        function uploadFailed(evt) {
            postToAnalytics('ClientSite', 'VerifyIDUploadFilesFailed', 'Upload files failed');
            console.log("There was an error attempting to upload the file.");
            logger.error("verifyIdController - Failed uploading files");
        }

        function getUserNumberOfDocuments() {
            generalService.cashier.getUserNumberOfDocuments({ "PlayerId": $scope.playerData.PlayerId, "Token": $rootScope.Token }).then(
                function (data) {
                    $scope.userNumOfDocuments = data;
                    logger.info("verifyIdController - getUserNumberOfDocuments(). Count: " + $scope.userNumOfDocuments);
                });
        }

        function deleteUserDocuments(files) {
            generalService.cashier.deleteUserDocuments({ "PlayerId": $scope.playerData.PlayerId, "Token": $rootScope.Token, "Files": files }).then(
                function (data) {
                });
        }

        function getDocumentTypes() {
            generalService.cashier.getVerifyIdDocumentTypes({ "PlayerId": $scope.playerData.PlayerId, "Token": $rootScope.Token }).then(
                function (data) {
                    $scope.documentTypes = data;
                });
        }

        function getUserDocumentTypesStatuses(isApprovalPage) {
            generalService.cashier.getVerifyIdDocumentTypesStatuses({ "PlayerId": $scope.playerData.PlayerId, "Token": $rootScope.Token }).then(
                function (data) {
                    $scope.userDocumentTypesStatuses = data;
                    logger.info("verifyIdController - getUserDocumentTypesStatuses(). Json: " + JSON.stringify($scope.userDocumentTypesStatuses));
                    if ($scope.showUploadWizard && !isApprovalPage)
                        startWizardForm(data);
                });
        }

        function startWizardForm(data) {
            logger.info("verifyIdController - startWizardForm()");
            var steps = filterStepsByStatus(data);
            if (steps.length < 2)
                return;
            $scope.stepsToShow = steps;
            $scope.selectedStep = $scope.stepsToShow[0];
            $scope.documentTypeSelected(null, 'verify-id-upload');
            $scope.handleSubTypeRadioClick({ Id: $scope.selectedStep.subTypes[0].Id, SkipStepID: $scope.selectedStep.subTypes[0].SkipStepID });
        }

        function filterStepsByStatus(typesStatuses) {
            var filtered = [];
            $scope.steps.forEach(function (step) {
                if (typesStatuses.findIndex(function (s) { return s.Id === step.documentType }) == -1)
                    filtered.push(step);

                if (typesStatuses.findIndex(function (s) { return s.Id === step.documentType && (s.Status === 'Rejected' || s.Status === 'Failed'); }) > -1)
                    filtered.push(step);
            });
            return filtered;
        }

        function getCommonParametersByType() {
            generalService.cashier.getCommonParametersByType({ "PlayerId": $scope.playerData.PlayerId, "Token": $rootScope.Token, "ParameterType": 1 }).then(
                function (data) {
                    $scope.commonParameters = data;
                });
        }

        $scope.showBackButton = function () {
            return $scope.approvalPage == null && (!$scope.showUploadWizard || ($scope.showUploadWizard && $scope.selectedStep !== $scope.stepsToShow[0]));
        }

        $scope.showCloseButton = function () {
            return $scope.showUploadWizard || (!$scope.showUploadWizard && $scope.selectedStep.documentType !== -1);
        }


        $scope.getStatusColor = function (doc) {
            if (doc.Status.indexOf('Rejected') > -1)
                return 'rejected';
            if (doc.Status.indexOf('Approved') > -1)
                return 'approved';
            return '';
        }

        $scope.getStatusIcon = function (doc) {
            if (doc.Status.indexOf('Rejected') > -1)
                return 'fa-ban red';
            if (doc.Status.indexOf('Approved') > -1)
                return 'fa-check green';
            return 'fa-clock-o grey';
        }

        $scope.getStatusTypeColor = function (docType) {
            var userDocumentTypesStatusIndex = $scope.userDocumentTypesStatuses.findIndex(function (s) { return s.Id === docType.Id })
            if (userDocumentTypesStatusIndex == -1)
                return "";
            return $scope.getStatusColor($scope.userDocumentTypesStatuses[userDocumentTypesStatusIndex]);
        }

        $scope.getStatusTypeIcon = function (docType) {
            var userDocumentTypesStatusIndex = $scope.userDocumentTypesStatuses.findIndex(function (s) { return s.Id === docType.Id })
            if (userDocumentTypesStatusIndex == -1)
                return "";
            return $scope.getStatusIcon($scope.userDocumentTypesStatuses[userDocumentTypesStatusIndex]);
        }

        $scope.getStatusTypeText = function (docType) {
            var userDocumentTypesStatusIndex = $scope.userDocumentTypesStatuses.findIndex(function (s) { return s.Id === docType.Id })
            if (userDocumentTypesStatusIndex == -1)
                return "";
            var doc = $scope.userDocumentTypesStatuses[userDocumentTypesStatusIndex];
            if (doc.Status.indexOf('Rejected') > -1)
                return $rootScope.lexicon.documentTypeStatusFailed || 'Failed';
            if (doc.Status.indexOf('Approved') > -1)
                return $rootScope.lexicon.documentTypeStatusApproved || 'Verified';
            return $rootScope.lexicon.documentTypeStatusPending || 'Verifying';
        }

        $scope.handleSubTypeRadioClick = function (subType) {
            $scope.selectedSubType = subType;
            $scope.files = [];
            $scope.base64Files = [];

            if ($scope.showUploadWizard)
                $scope.stepsToShow = filterStepsByStatus($scope.userDocumentTypesStatuses);

            $scope.stepsToShow.forEach(function (step) {
                if (step.hasOwnProperty('subTypes')) {
                    step.subTypes.forEach(function (stepSubType) {
                        if (stepSubType.Id === subType.Id)
                            stepSubType.Checked = true;
                        else
                            stepSubType.Checked = false;
                    });
                }
            });

            if (!subType.SkipStepID) {
                var stepsToShowCopy = angular.copy($scope.stepsToShow);
                $scope.documentTypeSelected({ Id: $scope.selectedStep.documentType, pass: true });

                $scope.stepsToShow.forEach(function (step) {
                    if (stepsToShowCopy.findIndex(function (s) { return s.id === step.id }) === -1)
                        stepsToShowCopy.splice(step.id - 1, 0, step);
                });
                $scope.stepsToShow = stepsToShowCopy;
                setStepsButton();
            }
            else {
                $scope.stepsToShow = filterStepsBySkipID(subType.SkipStepID);
                setStepsButton();
            }
            $scope.selectedStep = $scope.stepsToShow[0];
        }

        function filterStepsBySkipID(skipStepID) {
            return $scope.stepsToShow.filter(function (s) {
                return skipStepID.indexOf(s.id) === -1;
            });
        }

        $scope.documentTypeSelected = function (docType, action) {
            //redirect to verify id with type
            if (docType) {
                logger.info("verifyIdController - documentTypeSelected(). Document Type: " + JSON.stringify(docType));
                postToAnalytics('ClientSite', 'VerifyIDDocumentTypeSelected', 'Document type selected: ' + JSON.stringify(docType));
                $scope.stepsToShow = $scope.steps.filter(function (s) {
                    return s.documentType === docType.Id || s.documentType === -1
                });

                if (docType.Id === 713 && docType.pass !== true)
                    $scope.handleSubTypeRadioClick({ Id: 1, SkipStepID: [2, 3] });
            }
            setStepsButton();
            $scope.selectedStep = $scope.stepsToShow[0];
            //$scope.formText = $rootScope.lexicon["verifyIdText_" + docType.SysName];
            if (action)
                $scope.cashierPath = '/templates/' + action + '.html?v=908';
        }

        function setStepsButton() {
            if ($scope.stepsToShow.length > 0) {
                $scope.stepsToShow.forEach(function (step) {
                    if (step.documentType !== -1) {
                        step.buttonText = $rootScope.lexicon.verifyIDNext || 'Continue';
                        step.buttonAction = $scope.nextStep;
                    }
                });
                if ($scope.stepsToShow.length < 2) {
                    $scope.showUploadWizard = false;
                    goToChooseDocTypePage();
                }
                else {
                    $scope.stepsToShow[$scope.stepsToShow.length - 2].buttonText = $rootScope.lexicon.verifyIDUpload || 'Upload';
                    $scope.stepsToShow[$scope.stepsToShow.length - 2].buttonAction = $scope.uploadFile;
                }
            }
        }

        $scope.nextStep = function () {
            var base64Index = $scope.base64Files.findIndex(function (item) {
                return item.step == $scope.selectedStep.id
            });
            if (base64Index == -1) {
                var errorObj = { FileName: null, Error: "%noFileHasBeenChoosen%" };

                if ($scope.filesError.findIndex(function (s) { return s.Error === errorObj.Error }) === -1)
                    $scope.filesError.push(errorObj);
                return;
            }
            var stepIndex = $scope.stepsToShow.findIndex(function (s) {
                return s.id === $scope.selectedStep.id
            });
            $scope.selectedStep = $scope.stepsToShow[stepIndex + 1];
        }

        $scope.stepBack = function () {
            var stepIndex = $scope.stepsToShow.findIndex(function (s) {
                return s.id === $scope.selectedStep.id
            });
            if (stepIndex == 0) {
                goToChooseDocTypePage();
                return;
            }
            setStepsButton();
            $scope.selectedStep = $scope.stepsToShow[stepIndex - 1];
        }

        $scope.closePage = function () {
            logger.info("verifyIdController - closePage()");
            if ($scope.showUploadWizard) {
                $rootScope.closeModalPopupForm();
            }
            else {
                goToChooseDocTypePage();
                $scope.approvalPage = null;
                $scope.approvalPageStatus = null;
            }
        }

        var goToChooseDocTypePage = function () {
            //$scope.formText = $rootScope.lexicon["verifyIdText"];
            $scope.selectedStep = null;
            $scope.cashierPath = null;
        }

        var goToApprovalPage = function (data) {
            logger.info("verifyIdController - goToApprovalPage()");
            $scope.approvalPageStatus = data;
            $scope.nextStep();
            if (data)
			{
                $scope.selectedStep.SubTitle = $rootScope.lexicon.verifyIDApprovalSuccessSubTitle;
				$scope.selectedStep.buttonText = $rootScope.lexicon.verifyIDNextStep;
			}
             $scope.approvalPage = true;
			 $scope.$evalAsync();
        }



        $scope.toggleShowCommentTextbox = function () {
            $scope.showCommentTextbox = !$scope.showCommentTextbox;
            $scope.comment.text = '';
        }

        $scope.removeFile = function (file) {
            var removeFilesIndex = $scope.files.findIndex(function (item) {
                return item.file.name == file.name
            });
            var removeBase64Index = $scope.base64Files.findIndex(function (item) {
                return item.name == file.name
            });
            if (removeFilesIndex > -1) {
                $scope.files.splice(removeFilesIndex, 1);
                if (removeBase64Index > -1) {
                    $scope.base64Files.splice(removeBase64Index, 1);
                }
            }
        }

        $scope.getErrorMessage = function (error) {
            var placeholder;
            var extract = error.match(/%(.*)%/);
            if (extract === null) {
                return $rootScope.lexicon["fileGeneralError"]
            }
            placeholder = extract.pop();
            return error.replace("%" + placeholder + "%", $rootScope.lexicon[placeholder]);
        }

        function getBase64(file) {
            return new Promise(function (resolve, reject) {
                if (file.type === 'application/pdf') {
                    return resolve(false);
                }
                const reader = new FileReader();
                reader.readAsDataURL(file);
                reader.onload = function () {
                    return resolve({
                        base64: reader.result, name: file.name, size: file.size, type: file.type
                    });
                };
                reader.onerror = error = function () {
                    return reject(error);
                };
            });
        }

        function sendToScanID(files) {
            generalService.general.getIDScanAuthToken({ "PlayerId": $scope.playerData.PlayerId, "Token": $scope.playerData.Token }).then(function (token) {
                if (token === null || token === '')
                    return;

                var config = {
                    backendUrl: 'https://progressplay-poc.idscan.cloud',
                    auth: true
                };
                var service;
                service = new IDScan.JourneyManager(config);
                service.initialize();
                service.injectToken(token);

                var journey, id;

                id = service.createJourney();
                journey = service.getJourney(id);

                journey.continue({ imgList: files })
                    .then(function (result) {
                        var gg = 0;
                        //your logic, such as show action attempt
                    })
                    .catch(function (err) {
                        console.error(err);
                    });
            });

        }

        
    }]);


;
'use srtict';
progressPlayApp.controller('trustlyController', ['$rootScope', '$scope', '$location', '$window', '$filter', '$log', '$timeout', '$interval', '$sce', 'dataService', 'storageService', 'generalService', 'eventServices', 'popupServices', 'MessagingData', 'ngDialog', 
    function trustlyController($rootScope, $scope, $location, $window, $filter, $log, $timeout, $interval, $sce, dataService, storageService, generalService, eventServices, popupServices, MessagingData, ngDialog) {
    $rootScope.initPage(false);
    $scope.eventServices = eventServices;
    $scope.showRegistration = false;
    $scope.trustlyUrl = '';
    $scope.user = {};

    $scope.$on('$destroy', function () {
        removeEvent(window, "message", handleMessageRecievedFromIframe);
      
    });


    function handleMessageRecievedFromIframe(e) {
        if ('source' in e && e.source && 'PAYPAL' in e.source)
            return;

        var data = JSON.parse(e.data);
        if (data.Source && data.Source == 'trustly') {
            console.log(data);
        }

    }

    $scope.initDeposit = function () {
        var email;
        //var tpi = dataService.GetTrustlyStatus();
        if (storageService.getItem('loginUserData', true)) {
            email = storageService.getItem('loginUserData', true).email;
        }
        postToAnalytics('ClientSite', 'TrustlyInitDeposit', 'starting deposit with trustly');
        generalService.cashier.getTrustlyPaynplayUrl({ WhiteLabelId: $rootScope.label.label_id, Email: email, InitialAmount: 100 }).then(
            function (url) {
                if ($rootScope.checkResponse({ response: url, location: 'login', closeOnError: false })) {

                    storageService.setItem("TrustlyUrl", url, false)
                    bindEvent(window, 'message', handleMessageRecievedFromIframe);
                    $scope.trustlyUrl = $sce.trustAsResourceUrl(url);

                }
            });

        //var url = storageService.getSessionItem("TrustlyUrl", false)
        //if (url) {
        //    bindEvent(window, 'message', handleMessageRecievedFromIframe);
        //    $scope.trustlyUrl = $sce.trustAsResourceUrl(url);
        //}
        //else {


        //}





        //if (tpi && tpi.PlayerId && tpi.Status == "Finished") {

        //}
        //else {
        //    $scope.params = {
        //        PlayerId: -1,
        //        WhiteLabelId: $rootScope.labelId,
        //        CountryId: $rootScope.defaultCountryId,
        //        CurrencyId: $rootScope.defaultCurrencyId,
        //        LanguageId: $rootScope.languageId,
        //        UserAgent: $window.navigator.userAgent + "|" + $rootScope.isMobile(),
        //        Tracker: $rootScope.tracker,
        //        Dynamic: $rootScope.dynamic,
        //        ClickId: $rootScope.btag ? $rootScope.btag : ($rootScope.idfa ? $rootScope.idfa : $rootScope.clickid),
        //        RegistrationPlayMode: $rootScope.playModeID()
        //    };

        //    generalService.cashier.prepareExternalTransactionUrlTrustlyRegister($scope.params).then(
        //        function (data) {
        //            if ($rootScope.checkResponse({ response: data, location: 'registration', closeOnError: false })) {
        //                if (data.IsSuccess) {
        //                    dataService.SetTrustlyStatus(data.PlayerId, null, "Initial");
        //                    $scope.trustlyUrl = $sce.trustAsResourceUrl(data.RedirectUrl);
        //                }
        //            }
        //        });
        //}

    };

    $scope.initRegistration = function () {
        var tpi = dataService.GetTrustlyStatus();
        $scope.initCountries();
        generalService.authentication.getPlayer({ PlayerId: tpi.PlayerId, Token: tpi.Token }).then(
            function (data) {
                if ($rootScope.checkResponse({ response: data, location: 'registration', closeOnError: true })) {
                    $scope.user = data;
                    $scope.user.CountryId = $scope.user.CountryId + '';
                    $scope.playerDetails = $rootScope.lexicon["trustly_player_introduction"].replace("[NAME]", $scope.user.FirstName).replace("[BALANCE]", $rootScope.getPlayerBalanceCurrency($scope.user, $scope.user.Account.AccountBalance));
                    $scope.showRegistration = true;
                }
            },
            function (err) {
                alert(err);
            }
        );

    }

    $scope.initCountries = function () {
        $scope.Countries = storageService.getSessionItem('GeneralData.Countries_' + $rootScope.label.label_id, true);

        if (!$scope.Countries) { $timeout(function () { $scope.initCountries(); }, 1000); return; }
    }

    $scope.submit = function (form_reg) {
        $scope.formSubmitted = true;

        if (form_reg.$valid) {
            $scope.user.Password = md5($scope.user.TempPass);
            document.activeElement.blur();

            var params = {
                PlayerId: $scope.user.PlayerId,
                Email: $scope.user.Email,
                CellphoneNumber: $scope.user.CellphoneNumber,
                Password: $scope.user.Password,
                PromotionCode: $scope.user.PromotionCode,
                ReceiveEmail: $scope.user.ReceiveEmail,
                ReceiveSMS: $scope.user.ReceiveSMS,
                ReceivePhone: $scope.user.ReceivePhone,
                ReceivePost: $scope.user.ReceivePost,
                ReceivePartner: $scope.user.ReceivePartner,
                UserAgent: $window.navigator.userAgent + "|" + $rootScope.isMobile(),
                Time: new Date().toDateString()
            }

            generalService.authentication.registerAfterKYC(params).then(
                function (data) {
                    if ($rootScope.checkResponse({ response: data, location: 'registration', closeOnError: false })) {
                        dataService.SetTrustlyStatus(data.PlayerId, null, "Finished");
                        $rootScope.loginPlayer(data);

                        dataService.trackAnalyticEvent(data, ["pageUrl", "event"], [$location.path(), "registrationComplete"]);
                    }
                });
        }

    }

}]);


;
'use srtict';
progressPlayApp.controller('applepayController', ['$rootScope', '$controller', '$scope', '$location', '$window', '$filter', '$log', '$timeout', '$interval', '$sce', 'dataService', 'storageService', 'generalService', 'eventServices', 'popupServices', 'MessagingData', 'ngDialog', 'angularLoad',
    function applepayController($rootScope, $controller, $scope, $location, $window, $filter, $log, $timeout, $interval, $sce, dataService, storageService, generalService, eventServices, popupServices, MessagingData, ngDialog, angularLoad) {
        //$controller('cashierController', { $scope: $scope });
        //$rootScope.initPage(false);
        //$scope.eventServices = eventServices;
        //$scope.showRegistration = false;
        
        $controller('cashierController', { $scope: $scope });

        function init() {
            angularLoad.loadScript('https://checkoutshopper-live.adyen.com/checkoutshopper/sdk/3.3.0/adyen.js').then(function () {
                var checkout = new AdyenCheckout(configuration);

                try{
                    var appleNode = document.getElementById("applepay-field");
                    var applepay = checkout.create("applepay", {

                        currencyCode: $rootScope.getPlayer().Currency.CurrencyCode,
                        amount: $scope.$parent.methodParams.cashierAmount,
                        countryCode: $rootScope.language,
                        configuration: {
                            merchantName: "Adyen Test merchant",
                            merchantIdentifier: "merchant.progressplay.com.adyen.MerchantAccount.test"
                        },
                        // Button config
                        buttonType: "plain", // Optional. The type of button you want to be displayed in the payments form
                        buttonColor: "black", // Optional. Specify the color of the button
                        onValidateMerchant: function(resolve, reject, validationURL) {
                            // Call the validation endpoint with validationURL.
                            // Call resolve(MERCHANTSESSION) or reject() to complete merchant validation.
                        }
                    });


                    applepay.isAvailable().then(function () {
                        alert('applepay.isAvailable');
                        applepay.mount("#applepay-container");
                    })
                    .catch(function () {
                        alert('applepay not available');
                    });
                }
                catch (e) {
                    alert(e);
                }

            });
            angularLoad.loadCSS('https://checkoutshopper-live.adyen.com/checkoutshopper/sdk/3.3.0/adyen.css');
        }

        function handleOnChange(state, component) {
            alert('handleOnChange called. state: ' + JSON.stringify(state));
            debugger;
            state.isValid // True or false. Specifies if all the information that the shopper provided is valid.
            state.data // Provides the data that you need to pass in the `/payments` call.
            component // Provides the active component instance that called this event.
        }

        function handleOnAdditionalDetails(state, component) {
            alert('handleOnAdditionalDetails called. state: ' + JSON.stringify(state));
            debugger;
            state.data // Provides the data that you need to pass in the `/payments/details` call.
            component // Provides the active component instance that called this event.
        }

        var configuration = {
            locale: getLocalStr($rootScope.language),
            environment: "test",
            originKey: "pub.v2.7814666499260032.aHR0cHM6Ly9zaWxlbnRjbGllbnQuY2FzaW5vLXBwLm5ldA.GDurFSF4DrEJ-N2xti3EHWc2ZOvSyIIYI0ypqzHCLEo",
            paymentMethodsResponse: paymentMethodsResponse,
            onChange: handleOnChange,
            onAdditionalDetails: handleOnAdditionalDetails
        };

        function getLocalStr(language){
            switch (language.toLowerCase()){
                case "en":
                    return 'en_GB'
                case "de":
                    return 'de_DE'
                case "fi":
                    return 'fi';
                case "pt":
                    return "pt-BR";
            }
        }

        function paymentMethodsResponse(data) {
            alert('paymentMethodsResponse called. state: ' + JSON.stringify(data));
            debugger;
        }

        init();

    }]);


;
