{"version":3,"file":"js/8419.1dd73858afe139ea.js","mappings":"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","sources":["webpack://@sazka/web/./js/app/casino/ng-casino/casino-game-type.ts","webpack://@sazka/web/./js/app/casino/ng-casino/ng-casino-analytics.ts","webpack://@sazka/web/./js/app/casino/ng-casino/ng-casino-game-list.ts","webpack://@sazka/web/./js/app/casino/ng-casino/split-screen/splitscreen-game-types.ts","webpack://@sazka/web/./js/app/casino/ng-casino/split-screen/splitscreen.ts","webpack://@sazka/web/./js/app/casino/ng-casino/ng-casino-utils.ts","webpack://@sazka/web/./js/app/casino/ng-casino/split-screen/split-screen.vue?a348","webpack://@sazka/web/./js/app/casino/ng-casino/split-screen/split-screen.vue","webpack://@sazka/web/./js/app/casino/ng-casino/split-screen/split-screen.vue?99e5","webpack://@sazka/web/./js/app/casino/ng-casino/components/casino-game-header.vue?d90a","webpack://@sazka/web/./js/app/casino/ng-casino/components/casino-game-header.vue","webpack://@sazka/web/./js/app/casino/ng-casino/components/casino-game-header.vue?5403","webpack://@sazka/web/./js/app/casino/ng-casino/components/casino-game-footer-etickets.vue?4594","webpack://@sazka/web/./js/app/casino/ng-casino/components/casino-game-footer-etickets.vue","webpack://@sazka/web/./js/app/casino/ng-casino/components/casino-game-footer-etickets.vue?1385","webpack://@sazka/web/./js/app/casino/ng-casino/components/casino-game-footer-games.vue?6dcc","webpack://@sazka/web/./js/app/casino/ng-casino/components/casino-game-footer-games.vue","webpack://@sazka/web/./js/app/casino/ng-casino/components/casino-game-footer-games.vue?9046","webpack://@sazka/web/./js/app/casino/ng-casino/components/casino-game-footer-dealer.vue?4ce5","webpack://@sazka/web/./js/app/casino/ng-casino/components/casino-game-footer-dealer.vue","webpack://@sazka/web/./js/app/casino/ng-casino/components/casino-game-footer-dealer.vue?b76a","webpack://@sazka/web/./js/app/casino/ng-casino/components/casino-game-footer.vue?a623","webpack://@sazka/web/./js/app/casino/ng-casino/components/casino-game-footer.vue","webpack://@sazka/web/./js/app/casino/ng-casino/components/casino-game-footer.vue?8d54","webpack://@sazka/web/./js/app/casino/ng-casino/casino-game-layer.vue?d82b","webpack://@sazka/web/./js/app/casino/ng-casino/casino-game-layer.vue","webpack://@sazka/web/./js/app/casino/ng-casino/casino-game-layer.vue?78d7","webpack://@sazka/web/./js/app/shared/utils/age-confirmation.ts","webpack://@sazka/web/./js/app/casino/ng-casino/ng-casino-module.ts","webpack://@sazka/web/./js/app/floating/use-floating-preload.ts","webpack://@sazka/web/./js/app/shared/components/master-page/self-exclusion.ts","webpack://@sazka/web/../../libs/utils/string-utils.ts","webpack://@sazka/web/./js/app/shared/components/panic-button.vue?d6af","webpack://@sazka/web/./js/app/shared/components/panic-button.vue"],"sourcesContent":["export enum CasinoGameType {\r\n    eticket = \"Eticket\",\r\n    game = \"Game\",\r\n    livedealer = \"LiveDealer\",\r\n}\r\n","import { CasinoGameType } from \"./casino-game-type\";\r\n\r\n/**\r\n * Pushes game open event to datalayer,\r\n * @param type Type of game - scrapper or game\r\n * @param analyticsGameCode analytics game code from CMS\r\n * @param moneyMode flag if games is played for money or in demo mode\r\n */\r\nexport const analyticsCasinoGameDetail = (\r\n    type: CasinoGameType,\r\n    analyticsGameCode: string,\r\n    moneyMode: boolean,\r\n    gameId: number,\r\n    manufacturer: string = null,\r\n    placement: string = null,\r\n    position = 0,\r\n    ngGameDefinition: any = null\r\n): void => {\r\n    let typeDl = \"\";\r\n    if (type == CasinoGameType.game) {\r\n        typeDl = \"hry\";\r\n    } else if (type == CasinoGameType.eticket) {\r\n        typeDl = \"elosy\";\r\n    } else if (type == CasinoGameType.livedealer) {\r\n        typeDl = \"hry-live\";\r\n    }\r\n\r\n    const page = {\r\n        type: \"game.detail\",\r\n        verticalCode: typeDl,\r\n        verticalCodeStrict: typeDl,\r\n        gameCode: analyticsGameCode,\r\n        gameCodeStrict: analyticsGameCode,\r\n        gameMode: moneyMode ? \"money\" : \"fun\",\r\n        gameid: gameId,\r\n    };\r\n\r\n    if (type == CasinoGameType.eticket && ngGameDefinition) {\r\n        page[\"externalGameProvider\"] = ngGameDefinition.externalGameProvider;\r\n        page[\"externalGameSubProvider\"] = ngGameDefinition.externalGameSubProvider;\r\n    }\r\n\r\n    if (type == CasinoGameType.game && manufacturer) {\r\n        page[\"supplier\"] = manufacturer;\r\n    }\r\n\r\n    if (placement) {\r\n        page[\"placement\"] = placement;\r\n        page[\"position\"] = position;\r\n    }\r\n\r\n    dataLayer.push({\r\n        page: page,\r\n        event: \"page\",\r\n    });\r\n};\r\n\r\n/**\r\n * Pushes deposit button click to datalayer\r\n */\r\nexport const analyticsCasinoDepositClick = (): void => {\r\n    dataLayer.push({\r\n        event: \"action.click.hry\",\r\n        action: {\r\n            click: {\r\n                type: \"inGameDeposit\",\r\n            },\r\n        },\r\n    });\r\n};\r\n\r\n/**\r\n * Pushes analytics money mode toggle click to datalayer\r\n */\r\nexport const analyticsCasinoToggleMoneyMode = (playForMoney: boolean): void => {\r\n    dataLayer.push({\r\n        event: \"action.click.hry\",\r\n        action: {\r\n            click: {\r\n                type: playForMoney ? \"money\" : \"fun\",\r\n            },\r\n        },\r\n    });\r\n};\r\n","interface NgGameDefinition {\r\n    PJPs: any;\r\n    appealingForChildren: \"0\" | any;\r\n    /** eg. \"1.641026\" */\r\n    aspectRatio: string;\r\n    /** eg. \"https://cdn-sazka.neogames.com/Brands/Generic/GameBackgroundImages/80.jpg\" sometimes url throws 404 - do not use */\r\n    backgroundImageUrl: string;\r\n    /** eg. [2, 5, 10, 20, 30, 50, 100, 200, 500] */\r\n    betDenominations: number[];\r\n    /** eg. \"iSoftBet\" */\r\n    externalGameProvider: string;\r\n    /** eg. \"Thunderkick\" */\r\n    externalGameSubProvider: string;\r\n    /** eg. \"5\" */\r\n    externalProviderID: string;\r\n    /** eg. \"72214\" */\r\n    gameId: string;\r\n    /** eg. [\"New\"], usually empty array */\r\n    gameConfig: string[];\r\n    /** eg. \"2010-12-01 00:00:00\" */\r\n    gameReleaseDate: string;\r\n    /** eg. 246 */\r\n    gameVerticalId: number;\r\n    /** eg. 80 */\r\n    id: number;\r\n    /** Pretty lame product card image, sometimes url throws 404 - do not use */\r\n    images: { default?: string };\r\n    /** 🤔🤐 - usually undefined */\r\n    maxPrize: any;\r\n    /** eg. \"Esqueleto Explosivo\" */\r\n    name: string;\r\n    /** Available play modes */\r\n    playModes: (\"Money\" | \"Demo\")[];\r\n}\r\n\r\ninterface NgGameList {\r\n    categories: any; // usesless\r\n    games: {\r\n        instant: NgGameDefinition[];\r\n    };\r\n}\r\n\r\nlet gameList: NgGameDefinition[] = null;\r\nlet gameListReadyPromiseResolve: (value: NgGameDefinition[]) => void = null;\r\n\r\nconst loadGameList = () => {\r\n    return new Promise((res) => {\r\n        if (gameList) {\r\n            res(gameList);\r\n        } else {\r\n            gameListReadyPromiseResolve = res;\r\n            ng_fw.updateGamesList();\r\n        }\r\n    });\r\n};\r\n\r\n/**\r\n * Called by NG on game list ready\r\n */\r\nconst gameListReady = (list: NgGameList) => {\r\n    gameList = list?.games?.instant || null;\r\n    // NG sometimes fires game list updated, without our loadGameList being called\r\n    // so in that case, promise is null\r\n    if (gameListReadyPromiseResolve) {\r\n        gameListReadyPromiseResolve(gameList);\r\n    }\r\n};\r\n\r\n/**\r\n * Finds game by id in NG game list\r\n */\r\nconst getGameFromNgList = (id: number) => gameList.find((game) => game.id == id);\r\n\r\n/**\r\n * Fetches game definition from NG by id\r\n */\r\nconst fetchNgGameDefinition = async (id: number): Promise<NgGameDefinition> => {\r\n    await loadGameList();\r\n    return getGameFromNgList(id);\r\n};\r\n\r\nexport const useNgCasinoGameList = () => ({\r\n    gameListReady,\r\n    fetchNgGameDefinition,\r\n});\r\n","import { SplitScreenGame } from \"./split-screen-game\";\r\n\r\nexport const splitscreenGames: SplitScreenGame[] = [\r\n    {\r\n        cssClass: \"lumberjack\",\r\n        id: -10,\r\n        gameData: [\r\n            { link: \"/hry/Lumberjack-5\", gameId: 2888 },\r\n            { link: \"/hry/Lumberjack-7\", gameId: 2889 },\r\n            { link: \"/hry/Lumberjack-20\", gameId: 2887 },\r\n        ],\r\n    },\r\n    {\r\n        cssClass: \"spacefruits\",\r\n        id: -11,\r\n        gameData: [\r\n            { link: \"/hry/27-space-fruits\", gameId: 2875 },\r\n            { link: \"/hry/81-space-fruits\", gameId: 2876 },\r\n            { link: \"/hry/243-space-fruits\", gameId: 2877 },\r\n        ],\r\n    },\r\n    {\r\n        cssClass: \"cert-a-kaca\",\r\n        id: -12,\r\n        gameData: [\r\n            { link: \"/hry/cert-a-kaca-game\", gameId: 2878 },\r\n            { link: \"/hry/cert-a-kaca-cesta-z-pekla\", gameId: 2879 },\r\n        ],\r\n    },\r\n    {\r\n        cssClass: \"hot-wild\",\r\n        id: -13,\r\n        gameData: [\r\n            { link: \"/hry/hot-wild-5\", gameId: 2880 },\r\n            { link: \"/hry/hot-wild-10\", gameId: 2881 },\r\n            { link: \"/hry/hot-wild-20\", gameId: 2882 },\r\n            { link: \"/hry/hot-wild-40\", gameId: 2883 },\r\n        ],\r\n    },\r\n    {\r\n        cssClass: \"simply-ways\",\r\n        id: -14,\r\n        gameData: [\r\n            { link: \"/hry/27-simply-ways\", gameId: 2884 },\r\n            { link: \"/hry/81-simply-ways\", gameId: 2885 },\r\n            { link: \"/hry/243-simply-ways\", gameId: 2886 },\r\n        ],\r\n    },\r\n    {\r\n        cssClass: \"book-of-adventure\",\r\n        id: -15,\r\n        gameData: [\r\n            { link: \"/hry/book-of-adventure-death\", gameId: 2894 },\r\n            { link: \"/hry/book-of-adventure-life\", gameId: 2893 },\r\n            { link: \"/hry/book-of-adventure-classic\", gameId: 2892 },\r\n        ],\r\n    },\r\n    {\r\n        cssClass: \"wild-joker\",\r\n        id: -16,\r\n        gameData: [\r\n            { link: \"/hry/wild-joker-25\", gameId: 2901 },\r\n            { link: \"/hry/wild-joker-40\", gameId: 2902 },\r\n            { link: \"/hry/wild-joker-50\", gameId: 2903 },\r\n        ],\r\n    },\r\n    {\r\n        cssClass: \"joker-crown\",\r\n        id: -17,\r\n        gameData: [\r\n            { link: \"/hry/joker-crown-5\", gameId: 2890 },\r\n            { link: \"/hry/joker-crown-10\", gameId: 2891 },\r\n        ],\r\n    },\r\n    {\r\n        cssClass: \"wild-diamonds\",\r\n        id: -18,\r\n        gameData: [\r\n            { link: \"/hry/wild-diamonds-25\", gameId: 2897 },\r\n            { link: \"/hry/wild-diamonds-40\", gameId: 2898 },\r\n            { link: \"/hry/wild-diamonds-50\", gameId: 2899 },\r\n        ],\r\n    },\r\n    {\r\n        cssClass: \"fruit-hell\",\r\n        id: -19,\r\n        gameData: [\r\n            { link: \"/hry/fruit-hell-classic\", gameId: 2895 },\r\n            { link: \"/hry/fruit-hell-plus\", gameId: 2896 },\r\n        ],\r\n    },\r\n    {\r\n        cssClass: \"forest-fruit\",\r\n        id: -20,\r\n        gameData: [\r\n            { link: \"/hry/forest-fruit-3\", gameId: 2912 },\r\n            { link: \"/hry/forest-fruit-5\", gameId: 2913 },\r\n            { link: \"/hry/forest-fruit-7\", gameId: 2911 },\r\n        ],\r\n    },\r\n    {\r\n        cssClass: \"diamonds\",\r\n        id: -21,\r\n        gameData: [\r\n            { link: \"/hry/27-diamonds\", gameId: 2914 },\r\n            { link: \"/hry/81-diamonds\", gameId: 2915 },\r\n            { link: \"/hry/243-diamonds\", gameId: 2916 },\r\n        ],\r\n    },\r\n];\r\n","import { splitscreenGames } from \"./splitscreen-game-types\";\r\n\r\nexport const useSplitscreen = (id: number) => {\r\n    const filtered = splitscreenGames.filter((x) => x.id == id);\r\n    return filtered.length > 0 ? filtered[0] : null;\r\n};\r\n\r\nconst aspectRatioDesktop: number = 1920 / 1080;\r\nconst aspectRatioMobile: number = 1080 / 880;\r\n\r\nexport const splitscreenAspectRatio = () =>\r\n    window.matchMedia(\"(max-width: 897px)\").matches ? aspectRatioMobile : aspectRatioDesktop;\r\n","import { ngFrameworkLoaded } from \"@sazka/ng/ng-integration\";\r\nimport { debounce } from \"@sazka/utils/debounce\";\r\nimport { computed, onMounted, onUnmounted, ref } from \"vue\";\r\n\r\n// TODO: Remove after (or if) the official 1007px breakpoint gets added.\r\nconst MOBILE_BREAKPOINT = 1007;\r\n\r\nexport function useNgCasinoUtils() {\r\n    const viewportWidth = ref<number>(window.innerWidth);\r\n\r\n    const isMobile = computed(() => {\r\n        return viewportWidth.value < MOBILE_BREAKPOINT;\r\n    });\r\n\r\n    const updateSize = () => {\r\n        viewportWidth.value = window.innerWidth;\r\n    };\r\n\r\n    const debouncedUpdateSize = debounce(updateSize, 50);\r\n\r\n    const startDeposit = async () => {\r\n        await ngFrameworkLoaded();\r\n        ng_fw.showDeposit();\r\n    };\r\n\r\n    onMounted(() => {\r\n        updateSize();\r\n        window.addEventListener(\"resize\", debouncedUpdateSize);\r\n    });\r\n\r\n    onUnmounted(() => {\r\n        window.removeEventListener(\"resize\", debouncedUpdateSize);\r\n    });\r\n\r\n    return {\r\n        isMobile,\r\n        viewportWidth,\r\n        startDeposit,\r\n    };\r\n}\r\n","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, normalizeClass as _normalizeClass } from \"vue\"\n\nconst _hoisted_1 = [\"data-game-id\", \"href\"]\n\nimport { useNgCasino } from \"@/casino/ng-casino/ng-casino-module\";\r\n\r\n\nexport default /*@__PURE__*/_defineComponent({\n  __name: 'split-screen',\n  setup(__props) {\n\r\nconst { splitscreenData } = useNgCasino();\r\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createElementBlock(\"div\", {\n    class: _normalizeClass([\"splitscreen__wrapper\", _unref(splitscreenData).cssClass]),\n    id: \"splitscreen-wrapper\"\n  }, [\n    (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_unref(splitscreenData).gameData, (data, i) => {\n      return (_openBlock(), _createElementBlock(\"a\", {\n        class: _normalizeClass([\"casino game-launcher splitscreen__col\", `${_unref(splitscreenData).cssClass} v${i + 1}`]),\n        \"data-game-id\": data.gameId,\n        href: data.link,\n        key: i\n      }, null, 10, _hoisted_1))\n    }), 128))\n  ], 2))\n}\n}\n\n})","<template>\r\n    <div class=\"splitscreen__wrapper\" :class=\"splitscreenData.cssClass\" id=\"splitscreen-wrapper\">\r\n        <a\r\n            class=\"casino game-launcher splitscreen__col\"\r\n            :class=\"`${splitscreenData.cssClass} v${i + 1}`\"\r\n            :data-game-id=\"data.gameId\"\r\n            :href=\"data.link\"\r\n            v-for=\"(data, i) in splitscreenData.gameData\"\r\n            :key=\"i\"\r\n        >\r\n        </a>\r\n    </div>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { useNgCasino } from \"@/casino/ng-casino/ng-casino-module\";\r\n\r\nconst { splitscreenData } = useNgCasino();\r\n</script>\r\n","import script from \"./split-screen.vue?vue&type=script&lang=ts&setup=true\"\nexport * from \"./split-screen.vue?vue&type=script&lang=ts&setup=true\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, createElementVNode as _createElementVNode, createElementBlock as _createElementBlock, createTextVNode as _createTextVNode, withCtx as _withCtx, createVNode as _createVNode, Fragment as _Fragment } from \"vue\"\n\nconst _hoisted_1 = {\n  key: 0,\n  class: \"toggler\"\n}\nconst _hoisted_2 = [\"checked\"]\n\nimport { computed, onMounted, onUnmounted, ref } from \"vue\";\r\nimport { CasinoGameType } from \"@/casino/ng-casino/casino-game-type\";\r\nimport { OnlineGameDetail } from \"@/casino/ng-casino/online-game-detail\";\r\nimport { useNgCasino } from \"../ng-casino-module\";\r\nimport { debounce } from \"@sazka/utils/debounce\";\r\nimport { useNgCasinoUtils } from \"../ng-casino-utils\";\r\nimport DsButton from \"@sazka/design-system/src/button/ds-button.vue\";\r\nimport PanicButton from \"@/shared/components/panic-button.vue\";\r\n\r\n\nexport default /*@__PURE__*/_defineComponent({\n  __name: 'casino-game-header',\n  props: {\n    gameData: {}\n  },\n  setup(__props: any, { expose: __expose }) {\n\r\nconst props = __props;\r\n\r\nconst wrapper = ref<HTMLDivElement>();\r\nconst height = ref<number>();\r\n\r\n__expose({\r\n    height,\r\n});\r\n\r\nconst { isMobile } = useNgCasinoUtils();\r\nconst { playForMoney, closeGame, toggleMoneyMode, splitscreenData } = useNgCasino();\r\n\r\nconst isLiveDealer = computed(() => props.gameData?.type == CasinoGameType.livedealer);\r\n\r\nconst moneyTogglerEnabled = computed(() => {\r\n    return !splitscreenData.value && !isLiveDealer.value;\r\n});\r\n\r\nconst updateHeight = () => {\r\n    if (wrapper.value) {\r\n        height.value = wrapper.value.clientHeight;\r\n    }\r\n};\r\n\r\nconst debouncedUpdateHeight = debounce(updateHeight, 100);\r\n\r\nonMounted(() => {\r\n    updateHeight();\r\n\r\n    window.addEventListener(\"resize\", debouncedUpdateHeight);\r\n});\r\n\r\nonUnmounted(() => {\r\n    window.removeEventListener(\"resize\", debouncedUpdateHeight);\r\n});\r\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createElementBlock(\"div\", {\n    ref_key: \"wrapper\",\n    ref: wrapper,\n    class: \"casino-game-header\"\n  }, [\n    (_unref(isMobile))\n      ? (_openBlock(), _createBlock(PanicButton, {\n          key: 0,\n          class: \"panic-button--in-game-header\",\n          \"game-name\": _ctx.gameData.codeName\n        }, null, 8, [\"game-name\"]))\n      : (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n          (moneyTogglerEnabled.value)\n            ? (_openBlock(), _createElementBlock(\"label\", _hoisted_1, [\n                _createElementVNode(\"input\", {\n                  type: \"checkbox\",\n                  checked: _unref(playForMoney),\n                  onClick: _cache[0] || (_cache[0] = \n//@ts-ignore\n(...args) => (_unref(toggleMoneyMode) && _unref(toggleMoneyMode)(...args)))\n                }, null, 8, _hoisted_2),\n                _cache[2] || (_cache[2] = _createElementVNode(\"span\", { class: \"left\" }, \"Pro zábavu\", -1)),\n                _cache[3] || (_cache[3] = _createElementVNode(\"span\", { class: \"right\" }, \"Za peníze\", -1))\n              ]))\n            : _createCommentVNode(\"\", true),\n          _createVNode(DsButton, {\n            class: \"casino-game-header__button-close\",\n            type: \"text\",\n            theme: \"dark\",\n            id: \"casino-close\",\n            \"icon-left\": \"cross\",\n            onClick: _cache[1] || (_cache[1] = ($event: any) => (_unref(closeGame)()))\n          }, {\n            default: _withCtx(() => _cache[4] || (_cache[4] = [\n              _createTextVNode(\" Zavřít \")\n            ])),\n            _: 1\n          })\n        ], 64))\n  ], 512))\n}\n}\n\n})","<template>\r\n    <div ref=\"wrapper\" class=\"casino-game-header\">\r\n        <PanicButton v-if=\"isMobile\" class=\"panic-button--in-game-header\" :game-name=\"gameData.codeName\" />\r\n\r\n        <template v-else>\r\n            <label class=\"toggler\" v-if=\"moneyTogglerEnabled\">\r\n                <input type=\"checkbox\" :checked=\"playForMoney\" @click=\"toggleMoneyMode\" />\r\n                <span class=\"left\">Pro zábavu</span>\r\n                <span class=\"right\">Za peníze</span>\r\n            </label>\r\n            <DsButton\r\n                class=\"casino-game-header__button-close\"\r\n                type=\"text\"\r\n                theme=\"dark\"\r\n                id=\"casino-close\"\r\n                icon-left=\"cross\"\r\n                @click=\"closeGame()\"\r\n            >\r\n                Zavřít\r\n            </DsButton>\r\n        </template>\r\n    </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed, onMounted, onUnmounted, ref } from \"vue\";\r\nimport { CasinoGameType } from \"@/casino/ng-casino/casino-game-type\";\r\nimport { OnlineGameDetail } from \"@/casino/ng-casino/online-game-detail\";\r\nimport { useNgCasino } from \"../ng-casino-module\";\r\nimport { debounce } from \"@sazka/utils/debounce\";\r\nimport { useNgCasinoUtils } from \"../ng-casino-utils\";\r\nimport DsButton from \"@sazka/design-system/src/button/ds-button.vue\";\r\nimport PanicButton from \"@/shared/components/panic-button.vue\";\r\n\r\nconst props = defineProps<{\r\n    gameData: OnlineGameDetail;\r\n}>();\r\n\r\nconst wrapper = ref<HTMLDivElement>();\r\nconst height = ref<number>();\r\n\r\ndefineExpose({\r\n    height,\r\n});\r\n\r\nconst { isMobile } = useNgCasinoUtils();\r\nconst { playForMoney, closeGame, toggleMoneyMode, splitscreenData } = useNgCasino();\r\n\r\nconst isLiveDealer = computed(() => props.gameData?.type == CasinoGameType.livedealer);\r\n\r\nconst moneyTogglerEnabled = computed(() => {\r\n    return !splitscreenData.value && !isLiveDealer.value;\r\n});\r\n\r\nconst updateHeight = () => {\r\n    if (wrapper.value) {\r\n        height.value = wrapper.value.clientHeight;\r\n    }\r\n};\r\n\r\nconst debouncedUpdateHeight = debounce(updateHeight, 100);\r\n\r\nonMounted(() => {\r\n    updateHeight();\r\n\r\n    window.addEventListener(\"resize\", debouncedUpdateHeight);\r\n});\r\n\r\nonUnmounted(() => {\r\n    window.removeEventListener(\"resize\", debouncedUpdateHeight);\r\n});\r\n</script>\r\n","import script from \"./casino-game-header.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./casino-game-header.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, toDisplayString as _toDisplayString, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, createElementVNode as _createElementVNode, createBlock as _createBlock, createTextVNode as _createTextVNode, withCtx as _withCtx } from \"vue\"\n\nconst _hoisted_1 = { class: \"casino-game-footer-etickets\" }\nconst _hoisted_2 = { class: \"casino-game-footer__row\" }\nconst _hoisted_3 = { class: \"casino-game-footer__section casino-game-footer__section--etickets\" }\nconst _hoisted_4 = {\n  key: 0,\n  class: \"casino-game-footer__login-time\"\n}\nconst _hoisted_5 = [\"href\"]\nconst _hoisted_6 = {\n  key: 0,\n  class: \"casino-game-footer__row\"\n}\n\nimport { OnlineGameDetail } from \"../online-game-detail\";\r\nimport { useNgCasinoUtils } from \"../ng-casino-utils\";\r\nimport { useNgSession } from \"@sazka/ng/ng-session\";\r\nimport PanicButton from \"@/shared/components/panic-button.vue\";\r\nimport DsButton from \"@sazka/design-system/src/button/ds-button.vue\";\r\n\r\n\nexport default /*@__PURE__*/_defineComponent({\n  __name: 'casino-game-footer-etickets',\n  props: {\n    gameData: {}\n  },\n  setup(__props: any) {\n\r\n\r\n\r\nconst isInAppView = environment.isInAppView ?? false;\r\n\r\nconst { loginDurationFormatted, isLoggedIn } = useNgSession();\r\n\r\nconst { isMobile, startDeposit } = useNgCasinoUtils();\r\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    _createElementVNode(\"div\", _hoisted_2, [\n      _createElementVNode(\"div\", _hoisted_3, [\n        (_unref(isLoggedIn))\n          ? (_openBlock(), _createElementBlock(\"span\", _hoisted_4, \" Přihlášen \" + _toDisplayString(_unref(loginDurationFormatted)), 1))\n          : _createCommentVNode(\"\", true),\n        _createElementVNode(\"a\", {\n          href: _ctx.gameData.infoUrl,\n          target: \"_blank\",\n          class: \"casino-game-footer__ticket-info\"\n        }, \"Informace k losu\", 8, _hoisted_5)\n      ]),\n      (!_unref(isMobile))\n        ? (_openBlock(), _createBlock(PanicButton, {\n            key: 0,\n            class: \"panic-button--in-game-footer casino-game-footer__panic-button\",\n            \"game-name\": _ctx.gameData.codeName\n          }, null, 8, [\"game-name\"]))\n        : _createCommentVNode(\"\", true),\n      (_unref(isMobile) && _unref(isLoggedIn) && !_unref(isInAppView))\n        ? (_openBlock(), _createBlock(DsButton, {\n            key: 1,\n            onClick: _cache[0] || (_cache[0] = ($event: any) => (_unref(startDeposit)())),\n            size: \"sm\",\n            type: \"secondary\",\n            \"icon-left\": \"plus-circle\",\n            theme: \"dark\",\n            class: \"casino-game-footer__deposit\"\n          }, {\n            default: _withCtx(() => _cache[1] || (_cache[1] = [\n              _createTextVNode(\"VKLAD\")\n            ])),\n            _: 1\n          }))\n        : _createCommentVNode(\"\", true)\n    ]),\n    (!_unref(isInAppView) && !_unref(isMobile))\n      ? (_openBlock(), _createElementBlock(\"div\", _hoisted_6, _cache[2] || (_cache[2] = [\n          _createElementVNode(\"a\", {\n            class: \"casino-game-footer__section\",\n            href: \"https://www.hrajsrozumem.cz/\",\n            target: \"_blank\"\n          }, \"Hraj s rozumem\", -1),\n          _createElementVNode(\"a\", {\n            class: \"casino-game-footer__section\",\n            href: \"/zodpovedne-hrani/herni-limity\",\n            target: \"_blank\"\n          }, [\n            _createElementVNode(\"strong\", null, \"Varování: \"),\n            _createTextVNode(\"Účast na hazardní hře může být škodlivá. | 18+ \")\n          ], -1)\n        ])))\n      : _createCommentVNode(\"\", true)\n  ]))\n}\n}\n\n})","<template>\r\n    <div class=\"casino-game-footer-etickets\">\r\n        <div class=\"casino-game-footer__row\">\r\n            <div class=\"casino-game-footer__section casino-game-footer__section--etickets\">\r\n                <span v-if=\"isLoggedIn\" class=\"casino-game-footer__login-time\">\r\n                    Přihlášen {{ loginDurationFormatted }}\r\n                </span>\r\n                <a :href=\"gameData.infoUrl\" target=\"_blank\" class=\"casino-game-footer__ticket-info\">Informace k losu</a>\r\n            </div>\r\n\r\n            <PanicButton\r\n                v-if=\"!isMobile\"\r\n                class=\"panic-button--in-game-footer casino-game-footer__panic-button\"\r\n                :game-name=\"gameData.codeName\"\r\n            />\r\n            <DsButton\r\n                v-if=\"isMobile && isLoggedIn && !isInAppView\"\r\n                @click=\"startDeposit()\"\r\n                size=\"sm\"\r\n                type=\"secondary\"\r\n                icon-left=\"plus-circle\"\r\n                theme=\"dark\"\r\n                class=\"casino-game-footer__deposit\"\r\n                >VKLAD</DsButton\r\n            >\r\n        </div>\r\n\r\n        <div v-if=\"!isInAppView && !isMobile\" class=\"casino-game-footer__row\">\r\n            <a class=\"casino-game-footer__section\" href=\"https://www.hrajsrozumem.cz/\" target=\"_blank\"\r\n                >Hraj s rozumem</a\r\n            >\r\n            <a class=\"casino-game-footer__section\" href=\"/zodpovedne-hrani/herni-limity\" target=\"_blank\">\r\n                <strong>Varování: </strong>Účast na hazardní hře může být škodlivá. | 18+\r\n            </a>\r\n        </div>\r\n    </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { OnlineGameDetail } from \"../online-game-detail\";\r\nimport { useNgCasinoUtils } from \"../ng-casino-utils\";\r\nimport { useNgSession } from \"@sazka/ng/ng-session\";\r\nimport PanicButton from \"@/shared/components/panic-button.vue\";\r\nimport DsButton from \"@sazka/design-system/src/button/ds-button.vue\";\r\n\r\ndefineProps<{\r\n    gameData: OnlineGameDetail;\r\n}>();\r\n\r\nconst isInAppView = environment.isInAppView ?? false;\r\n\r\nconst { loginDurationFormatted, isLoggedIn } = useNgSession();\r\n\r\nconst { isMobile, startDeposit } = useNgCasinoUtils();\r\n</script>\r\n","import script from \"./casino-game-footer-etickets.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./casino-game-footer-etickets.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, toDisplayString as _toDisplayString, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, createElementVNode as _createElementVNode, createBlock as _createBlock, createTextVNode as _createTextVNode, withCtx as _withCtx } from \"vue\"\n\nconst _hoisted_1 = { class: \"casino-game-footer-games\" }\nconst _hoisted_2 = { class: \"casino-game-footer__row\" }\nconst _hoisted_3 = { class: \"casino-game-footer__section casino-game-footer__section--games\" }\nconst _hoisted_4 = {\n  key: 0,\n  class: \"casino-game-footer__login-time\"\n}\nconst _hoisted_5 = {\n  key: 1,\n  class: \"casino-game-footer__balance\"\n}\nconst _hoisted_6 = {\n  key: 2,\n  class: \"casino-game-footer__legal\"\n}\nconst _hoisted_7 = {\n  key: 0,\n  class: \"casino-game-footer__row\"\n}\n\nimport { useNgCasinoUtils } from \"../ng-casino-utils\";\r\nimport { OnlineGameDetail } from \"../online-game-detail\";\r\nimport { useNgSession } from \"@sazka/ng/ng-session\";\r\nimport { useNgCasino } from \"../ng-casino-module\";\r\nimport { StringUtils } from \"@sazka/utils/string-utils\";\r\nimport { computed } from \"vue\";\r\nimport PanicButton from \"@/shared/components/panic-button.vue\";\r\nimport DsButton from \"@sazka/design-system/src/button/ds-button.vue\";\r\n\r\n\nexport default /*@__PURE__*/_defineComponent({\n  __name: 'casino-game-footer-games',\n  props: {\n    gameData: {}\n  },\n  setup(__props: any) {\n\r\n\r\n\r\nconst isInAppView = environment.isInAppView ?? false;\r\n\r\nconst { loginDurationFormatted, isLoggedIn } = useNgSession();\r\nconst { netLoss } = useNgCasino();\r\n\r\nconst balanceValue = computed(() => {\r\n    return StringUtils.formatCurrency(netLoss.value, false);\r\n});\r\n\r\nconst { isMobile, startDeposit } = useNgCasinoUtils();\r\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    _createElementVNode(\"div\", _hoisted_2, [\n      _createElementVNode(\"div\", _hoisted_3, [\n        (_unref(isLoggedIn))\n          ? (_openBlock(), _createElementBlock(\"span\", _hoisted_4, \" Přihlášen \" + _toDisplayString(_unref(loginDurationFormatted)), 1))\n          : _createCommentVNode(\"\", true),\n        (_unref(netLoss) && _unref(isLoggedIn))\n          ? (_openBlock(), _createElementBlock(\"span\", _hoisted_5, \"Bilance: \" + _toDisplayString(balanceValue.value), 1))\n          : _createCommentVNode(\"\", true),\n        (_unref(isMobile))\n          ? (_openBlock(), _createElementBlock(\"span\", _hoisted_6, \"Účast na hazardní hře může být škodlivá. | 18+\"))\n          : _createCommentVNode(\"\", true)\n      ]),\n      (!_unref(isMobile))\n        ? (_openBlock(), _createBlock(PanicButton, {\n            key: 0,\n            class: \"panic-button--in-game-footer casino-game-footer__panic-button\",\n            \"game-name\": _ctx.gameData.codeName\n          }, null, 8, [\"game-name\"]))\n        : _createCommentVNode(\"\", true),\n      (_unref(isMobile) && _unref(isLoggedIn) && !_unref(isInAppView))\n        ? (_openBlock(), _createBlock(DsButton, {\n            key: 1,\n            onClick: _cache[0] || (_cache[0] = ($event: any) => (_unref(startDeposit)())),\n            size: \"sm\",\n            type: \"secondary\",\n            \"icon-left\": \"plus-circle\",\n            theme: \"dark\",\n            class: \"casino-game-footer__deposit\"\n          }, {\n            default: _withCtx(() => _cache[1] || (_cache[1] = [\n              _createTextVNode(\"VKLAD\")\n            ])),\n            _: 1\n          }))\n        : _createCommentVNode(\"\", true)\n    ]),\n    (!_unref(isInAppView) && !_unref(isMobile))\n      ? (_openBlock(), _createElementBlock(\"div\", _hoisted_7, _cache[2] || (_cache[2] = [\n          _createElementVNode(\"a\", {\n            class: \"casino-game-footer__section\",\n            href: \"https://www.hrajsrozumem.cz/\",\n            target: \"_blank\"\n          }, \"Hraj s rozumem\", -1),\n          _createElementVNode(\"a\", {\n            class: \"casino-game-footer__section\",\n            href: \"/zodpovedne-hrani/herni-limity\",\n            target: \"_blank\"\n          }, [\n            _createElementVNode(\"strong\", null, \"Varování: \"),\n            _createTextVNode(\"Účast na hazardní hře může být škodlivá. | 18+ \")\n          ], -1)\n        ])))\n      : _createCommentVNode(\"\", true)\n  ]))\n}\n}\n\n})","<template>\r\n    <div class=\"casino-game-footer-games\">\r\n        <div class=\"casino-game-footer__row\">\r\n            <div class=\"casino-game-footer__section casino-game-footer__section--games\">\r\n                <span v-if=\"isLoggedIn\" class=\"casino-game-footer__login-time\">\r\n                    Přihlášen {{ loginDurationFormatted }}\r\n                </span>\r\n                <span v-if=\"netLoss && isLoggedIn\" class=\"casino-game-footer__balance\"\r\n                    >Bilance: {{ balanceValue }}</span\r\n                >\r\n                <span v-if=\"isMobile\" class=\"casino-game-footer__legal\"\r\n                    >Účast na hazardní hře může být škodlivá. | 18+</span\r\n                >\r\n            </div>\r\n\r\n            <PanicButton\r\n                v-if=\"!isMobile\"\r\n                class=\"panic-button--in-game-footer casino-game-footer__panic-button\"\r\n                :game-name=\"gameData.codeName\"\r\n            />\r\n\r\n            <DsButton\r\n                v-if=\"isMobile && isLoggedIn && !isInAppView\"\r\n                @click=\"startDeposit()\"\r\n                size=\"sm\"\r\n                type=\"secondary\"\r\n                icon-left=\"plus-circle\"\r\n                theme=\"dark\"\r\n                class=\"casino-game-footer__deposit\"\r\n                >VKLAD</DsButton\r\n            >\r\n        </div>\r\n\r\n        <div v-if=\"!isInAppView && !isMobile\" class=\"casino-game-footer__row\">\r\n            <a class=\"casino-game-footer__section\" href=\"https://www.hrajsrozumem.cz/\" target=\"_blank\"\r\n                >Hraj s rozumem</a\r\n            >\r\n            <a class=\"casino-game-footer__section\" href=\"/zodpovedne-hrani/herni-limity\" target=\"_blank\">\r\n                <strong>Varování: </strong>Účast na hazardní hře může být škodlivá. | 18+\r\n            </a>\r\n        </div>\r\n    </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { useNgCasinoUtils } from \"../ng-casino-utils\";\r\nimport { OnlineGameDetail } from \"../online-game-detail\";\r\nimport { useNgSession } from \"@sazka/ng/ng-session\";\r\nimport { useNgCasino } from \"../ng-casino-module\";\r\nimport { StringUtils } from \"@sazka/utils/string-utils\";\r\nimport { computed } from \"vue\";\r\nimport PanicButton from \"@/shared/components/panic-button.vue\";\r\nimport DsButton from \"@sazka/design-system/src/button/ds-button.vue\";\r\n\r\ndefineProps<{\r\n    gameData: OnlineGameDetail;\r\n}>();\r\n\r\nconst isInAppView = environment.isInAppView ?? false;\r\n\r\nconst { loginDurationFormatted, isLoggedIn } = useNgSession();\r\nconst { netLoss } = useNgCasino();\r\n\r\nconst balanceValue = computed(() => {\r\n    return StringUtils.formatCurrency(netLoss.value, false);\r\n});\r\n\r\nconst { isMobile, startDeposit } = useNgCasinoUtils();\r\n</script>\r\n","import script from \"./casino-game-footer-games.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./casino-game-footer-games.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, createTextVNode as _createTextVNode, withCtx as _withCtx, createBlock as _createBlock, createVNode as _createVNode } from \"vue\"\n\nconst _hoisted_1 = { class: \"casino-game-footer-dealer\" }\nconst _hoisted_2 = { class: \"casino-game-footer__row\" }\nconst _hoisted_3 = { class: \"casino-game-footer__section casino-game-footer__section--dealer\" }\nconst _hoisted_4 = {\n  key: 0,\n  class: \"casino-game-footer__login-time\"\n}\nconst _hoisted_5 = {\n  key: 1,\n  href: \"https://www.hrajsrozumem.cz/\",\n  target: \"_blank\"\n}\nconst _hoisted_6 = {\n  key: 2,\n  href: \"/zodpovedne-hrani/herni-limity\",\n  target: \"_blank\"\n}\nconst _hoisted_7 = {\n  key: 3,\n  class: \"casino-game-footer__address\"\n}\nconst _hoisted_8 = {\n  key: 0,\n  class: \"casino-game-footer__row casino-game-footer__row--dealer\"\n}\nconst _hoisted_9 = {\n  key: 0,\n  class: \"casino-game-footer__address\"\n}\nconst _hoisted_10 = {\n  key: 1,\n  href: \"/zodpovedne-hrani/herni-limity\",\n  target: \"_blank\"\n}\n\nimport { OnlineGameDetail } from \"../online-game-detail\";\r\nimport { useNgCasinoUtils } from \"../ng-casino-utils\";\r\nimport { useNgSession } from \"@sazka/ng/ng-session\";\r\nimport { useBreakpoints } from \"@sazka/utils/composables/use-breakpoints\";\r\nimport PanicButton from \"@/shared/components/panic-button.vue\";\r\nimport DsButton from \"@sazka/design-system/src/button/ds-button.vue\";\r\n\r\n\nexport default /*@__PURE__*/_defineComponent({\n  __name: 'casino-game-footer-dealer',\n  props: {\n    gameData: {}\n  },\n  setup(__props: any) {\n\r\n\r\n\r\nconst isInAppView = environment.isInAppView ?? false;\r\n\r\nconst { loginDurationFormatted, isLoggedIn } = useNgSession();\r\nconst { isMobile, startDeposit } = useNgCasinoUtils();\r\nconst isMdOrLarger = useBreakpoints(\"md\");\r\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    _createElementVNode(\"div\", _hoisted_2, [\n      _createElementVNode(\"div\", _hoisted_3, [\n        (_unref(isLoggedIn) && !_unref(isInAppView))\n          ? (_openBlock(), _createElementBlock(\"p\", _hoisted_4, [\n              _createElementVNode(\"strong\", null, \"Přihlášen: \" + _toDisplayString(_unref(loginDurationFormatted)), 1)\n            ]))\n          : _createCommentVNode(\"\", true),\n        (!_unref(isMobile) && !_unref(isInAppView))\n          ? (_openBlock(), _createElementBlock(\"a\", _hoisted_5, \"Hraj s rozumem\"))\n          : _createCommentVNode(\"\", true),\n        (_unref(isMdOrLarger))\n          ? (_openBlock(), _createElementBlock(\"a\", _hoisted_6, _cache[1] || (_cache[1] = [\n              _createElementVNode(\"strong\", null, \"Varování: \", -1),\n              _createTextVNode(\"Účast na hazardní hře může být škodlivá. | 18+ \")\n            ])))\n          : _createCommentVNode(\"\", true),\n        (!_unref(isMdOrLarger))\n          ? (_openBlock(), _createElementBlock(\"p\", _hoisted_7, _toDisplayString(_ctx.gameData.studioAddress), 1))\n          : _createCommentVNode(\"\", true)\n      ]),\n      (_unref(isMobile) && _unref(isLoggedIn) && !_unref(isInAppView))\n        ? (_openBlock(), _createBlock(DsButton, {\n            key: 0,\n            onClick: _cache[0] || (_cache[0] = ($event: any) => (_unref(startDeposit)())),\n            size: \"sm\",\n            type: \"secondary\",\n            \"icon-left\": \"plus-circle\",\n            theme: \"dark\",\n            class: \"casino-game-footer__deposit\"\n          }, {\n            default: _withCtx(() => _cache[2] || (_cache[2] = [\n              _createTextVNode(\"VKLAD\")\n            ])),\n            _: 1\n          }))\n        : _createCommentVNode(\"\", true)\n    ]),\n    (!_unref(isMobile) && !_unref(isInAppView))\n      ? (_openBlock(), _createElementBlock(\"div\", _hoisted_8, [\n          (_unref(isMdOrLarger))\n            ? (_openBlock(), _createElementBlock(\"p\", _hoisted_9, _toDisplayString(_ctx.gameData.studioAddress), 1))\n            : (_openBlock(), _createElementBlock(\"a\", _hoisted_10, _cache[3] || (_cache[3] = [\n                _createElementVNode(\"strong\", null, \"Varování: \", -1),\n                _createTextVNode(\"Účast na hazardní hře může být škodlivá. | 18+ \")\n              ]))),\n          _createVNode(PanicButton, {\n            class: \"panic-button--in-game-footer casino-game-footer__panic-button casino-game-footer__panic-button--dealer\",\n            \"game-name\": _ctx.gameData.codeName\n          }, null, 8, [\"game-name\"])\n        ]))\n      : _createCommentVNode(\"\", true)\n  ]))\n}\n}\n\n})","<template>\r\n    <div class=\"casino-game-footer-dealer\">\r\n        <div class=\"casino-game-footer__row\">\r\n            <div class=\"casino-game-footer__section casino-game-footer__section--dealer\">\r\n                <p v-if=\"isLoggedIn && !isInAppView\" class=\"casino-game-footer__login-time\">\r\n                    <strong>Přihlášen: {{ loginDurationFormatted }}</strong>\r\n                </p>\r\n                <a v-if=\"!isMobile && !isInAppView\" href=\"https://www.hrajsrozumem.cz/\" target=\"_blank\"\r\n                    >Hraj s rozumem</a\r\n                >\r\n                <a v-if=\"isMdOrLarger\" href=\"/zodpovedne-hrani/herni-limity\" target=\"_blank\">\r\n                    <strong>Varování: </strong>Účast na hazardní hře může být škodlivá. | 18+\r\n                </a>\r\n                <p v-if=\"!isMdOrLarger\" class=\"casino-game-footer__address\">{{ gameData.studioAddress }}</p>\r\n            </div>\r\n            <DsButton\r\n                v-if=\"isMobile && isLoggedIn && !isInAppView\"\r\n                @click=\"startDeposit()\"\r\n                size=\"sm\"\r\n                type=\"secondary\"\r\n                icon-left=\"plus-circle\"\r\n                theme=\"dark\"\r\n                class=\"casino-game-footer__deposit\"\r\n                >VKLAD</DsButton\r\n            >\r\n        </div>\r\n\r\n        <div v-if=\"!isMobile && !isInAppView\" class=\"casino-game-footer__row casino-game-footer__row--dealer\">\r\n            <p v-if=\"isMdOrLarger\" class=\"casino-game-footer__address\">{{ gameData.studioAddress }}</p>\r\n            <a v-else href=\"/zodpovedne-hrani/herni-limity\" target=\"_blank\">\r\n                <strong>Varování: </strong>Účast na hazardní hře může být škodlivá. | 18+\r\n            </a>\r\n\r\n            <PanicButton\r\n                class=\"panic-button--in-game-footer casino-game-footer__panic-button casino-game-footer__panic-button--dealer\"\r\n                :game-name=\"gameData.codeName\"\r\n            />\r\n        </div>\r\n    </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { OnlineGameDetail } from \"../online-game-detail\";\r\nimport { useNgCasinoUtils } from \"../ng-casino-utils\";\r\nimport { useNgSession } from \"@sazka/ng/ng-session\";\r\nimport { useBreakpoints } from \"@sazka/utils/composables/use-breakpoints\";\r\nimport PanicButton from \"@/shared/components/panic-button.vue\";\r\nimport DsButton from \"@sazka/design-system/src/button/ds-button.vue\";\r\n\r\ndefineProps<{\r\n    gameData: OnlineGameDetail;\r\n}>();\r\n\r\nconst isInAppView = environment.isInAppView ?? false;\r\n\r\nconst { loginDurationFormatted, isLoggedIn } = useNgSession();\r\nconst { isMobile, startDeposit } = useNgCasinoUtils();\r\nconst isMdOrLarger = useBreakpoints(\"md\");\r\n</script>\r\n","import script from \"./casino-game-footer-dealer.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./casino-game-footer-dealer.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, resolveDynamicComponent as _resolveDynamicComponent, openBlock as _openBlock, createBlock as _createBlock, normalizeClass as _normalizeClass, normalizeStyle as _normalizeStyle, createElementBlock as _createElementBlock } from \"vue\"\n\nimport { computed, onMounted, onUnmounted, ref, useTemplateRef } from \"vue\";\r\nimport { OnlineGameDetail } from \"../online-game-detail\";\r\nimport { CasinoGameType } from \"@/casino/ng-casino/casino-game-type\";\r\nimport { debounce } from \"@sazka/utils/debounce\";\r\nimport CasinoGameFooterEtickets from \"./casino-game-footer-etickets.vue\";\r\nimport CasinoGameFooterGames from \"./casino-game-footer-games.vue\";\r\nimport CasinoGameFooterDealer from \"./casino-game-footer-dealer.vue\";\r\n\r\n\nexport default /*@__PURE__*/_defineComponent({\n  __name: 'casino-game-footer',\n  props: {\n    gameData: {}\n  },\n  setup(__props: any, { expose: __expose }) {\n\r\nconst props = __props;\r\n\r\nconst wrapper = useTemplateRef(\"wrapper\");\r\nconst footerHeight = ref<number>();\r\n\r\nconst footerComponent = computed(() => {\r\n    switch (props.gameData.type) {\r\n        case CasinoGameType.eticket:\r\n            return CasinoGameFooterEtickets;\r\n        case CasinoGameType.game:\r\n            return CasinoGameFooterGames;\r\n        case CasinoGameType.livedealer:\r\n            return CasinoGameFooterDealer;\r\n        default:\r\n            return null;\r\n    }\r\n});\r\n\r\nconst updateSize = () => {\r\n    if (wrapper.value) {\r\n        footerHeight.value = wrapper.value.clientHeight;\r\n    }\r\n};\r\n\r\nconst debouncedUpdateHeight = debounce(updateSize, 100);\r\n\r\n__expose({\r\n    height: footerHeight,\r\n});\r\n\r\nonMounted(() => {\r\n    updateSize();\r\n    window.addEventListener(\"resize\", debouncedUpdateHeight);\r\n});\r\n\r\nonUnmounted(() => {\r\n    window.removeEventListener(\"resize\", debouncedUpdateHeight);\r\n});\r\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createElementBlock(\"div\", {\n    ref_key: \"wrapper\",\n    ref: wrapper,\n    class: _normalizeClass(['casino-game-footer', { 'casino-game-footer--dealer': _ctx.gameData.type === _unref(CasinoGameType).livedealer }]),\n    style: _normalizeStyle({ '--info-color': _ctx.gameData.infoColor || '' })\n  }, [\n    (_openBlock(), _createBlock(_resolveDynamicComponent(footerComponent.value), { \"game-data\": _ctx.gameData }, null, 8, [\"game-data\"]))\n  ], 6))\n}\n}\n\n})","<template>\r\n    <div\r\n        ref=\"wrapper\"\r\n        :class=\"['casino-game-footer', { 'casino-game-footer--dealer': gameData.type === CasinoGameType.livedealer }]\"\r\n        :style=\"{ '--info-color': gameData.infoColor || '' }\"\r\n    >\r\n        <component :is=\"footerComponent\" :game-data=\"gameData\" />\r\n    </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed, onMounted, onUnmounted, ref, useTemplateRef } from \"vue\";\r\nimport { OnlineGameDetail } from \"../online-game-detail\";\r\nimport { CasinoGameType } from \"@/casino/ng-casino/casino-game-type\";\r\nimport { debounce } from \"@sazka/utils/debounce\";\r\nimport CasinoGameFooterEtickets from \"./casino-game-footer-etickets.vue\";\r\nimport CasinoGameFooterGames from \"./casino-game-footer-games.vue\";\r\nimport CasinoGameFooterDealer from \"./casino-game-footer-dealer.vue\";\r\n\r\nconst props = defineProps<{\r\n    gameData: OnlineGameDetail;\r\n}>();\r\n\r\nconst wrapper = useTemplateRef(\"wrapper\");\r\nconst footerHeight = ref<number>();\r\n\r\nconst footerComponent = computed(() => {\r\n    switch (props.gameData.type) {\r\n        case CasinoGameType.eticket:\r\n            return CasinoGameFooterEtickets;\r\n        case CasinoGameType.game:\r\n            return CasinoGameFooterGames;\r\n        case CasinoGameType.livedealer:\r\n            return CasinoGameFooterDealer;\r\n        default:\r\n            return null;\r\n    }\r\n});\r\n\r\nconst updateSize = () => {\r\n    if (wrapper.value) {\r\n        footerHeight.value = wrapper.value.clientHeight;\r\n    }\r\n};\r\n\r\nconst debouncedUpdateHeight = debounce(updateSize, 100);\r\n\r\ndefineExpose({\r\n    height: footerHeight,\r\n});\r\n\r\nonMounted(() => {\r\n    updateSize();\r\n    window.addEventListener(\"resize\", debouncedUpdateHeight);\r\n});\r\n\r\nonUnmounted(() => {\r\n    window.removeEventListener(\"resize\", debouncedUpdateHeight);\r\n});\r\n</script>\r\n","import script from \"./casino-game-footer.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./casino-game-footer.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, normalizeClass as _normalizeClass, normalizeStyle as _normalizeStyle, createElementVNode as _createElementVNode, vShow as _vShow, withDirectives as _withDirectives, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"bs-container\" }\n\nimport { computed, CSSProperties, nextTick, onMounted, onUnmounted, ref, watch } from \"vue\";\r\nimport { addLoginAbortedCallback } from \"@sazka/ng/ng-integration\";\r\nimport { ResponsiveUtils } from \"@sazka/utils/responsive-utils\";\r\nimport { DateTimeUtils } from \"@sazka/utils/date-time-utils\";\r\nimport { WebpHelper } from \"@sazka/utils/webp-helper\";\r\nimport { useNgCasinoUtils } from \"./ng-casino-utils\";\r\nimport { useNgSession } from \"@sazka/ng/ng-session\";\r\nimport { CasinoGameType } from \"./casino-game-type\";\r\nimport { useNgCasino } from \"./ng-casino-module\";\r\nimport { debounce } from \"@sazka/utils/debounce\";\r\nimport SplitScreen from \"./split-screen/split-screen.vue\";\r\nimport CasinoGameHeader from \"./components/casino-game-header.vue\";\r\nimport CasinoGameFooter from \"./components/casino-game-footer.vue\";\r\nimport { useHeader } from \"@/shared/components/master-page/header\";\r\n\r\n\nexport default /*@__PURE__*/_defineComponent({\n  __name: 'casino-game-layer',\n  setup(__props) {\n\r\nconst { disableHeader, setHeaderState, resetHeader } = useHeader();\r\n\r\nconst {\r\n    playForMoney,\r\n    closeGame,\r\n    sessionStart,\r\n    currentGameServerData: gameData,\r\n    ngGameDefinition,\r\n    currentGameId,\r\n    transparentGame,\r\n    splitscreenData,\r\n} = useNgCasino();\r\n\r\nlet interval: number | null = null;\r\n\r\nconst casinoGameHeader = ref<InstanceType<typeof CasinoGameHeader>>();\r\nconst casinoGameFooter = ref<InstanceType<typeof CasinoGameFooter>>();\r\nconst ngGameContainer = ref<HTMLDivElement | null>(null);\r\nconst ngGameContainerStyle = ref<CSSProperties>({});\r\nconst container = ref<HTMLDivElement | null>(null);\r\nconst innerContainer = ref<HTMLDivElement>();\r\nconst playingTime = ref(\"\");\r\n\r\nconst { isMobile: isResponsiveMobile } = useNgCasinoUtils();\r\nconst { isLoggedIn } = useNgSession();\r\n\r\nconst isLiveDealer = computed(() => gameData.value?.type == CasinoGameType.livedealer);\r\n\r\nconst isMobileOnPageLoad = ResponsiveUtils.isMobile();\r\nconst isInAppView = window.environment?.isInAppView || false;\r\n\r\nconst getAspectRatio = () => parseFloat(ngGameDefinition.value?.aspectRatio) || 16 / 9;\r\n\r\nconst clearNgGameContainerStyle = () => {\r\n    if (ngGameContainer.value) {\r\n        ngGameContainer.value.style.width = \"\";\r\n        ngGameContainer.value.style.height = \"\";\r\n    }\r\n    ngGameContainerStyle.value = {};\r\n};\r\n\r\nconst updateNgGameContainerStyle = () => {\r\n    clearNgGameContainerStyle();\r\n\r\n    if (isResponsiveMobile.value) return;\r\n\r\n    if (!ngGameContainer.value || !innerContainer.value || !casinoGameHeader.value || !casinoGameFooter.value) {\r\n        console.error(\"Error while resizing iFrame, one or more elements not found on page:\", {\r\n            ngGameContainer: !!ngGameContainer.value,\r\n            innerContainer: !!innerContainer.value,\r\n            gameHeader: !!casinoGameHeader.value,\r\n            gameFooter: !!casinoGameFooter.value,\r\n        });\r\n        return;\r\n    }\r\n\r\n    const aspectRatio = getAspectRatio();\r\n\r\n    const availableWidth = innerContainer.value.clientWidth;\r\n    const headerHeight = isResponsiveMobile.value ? 0 : casinoGameHeader.value.height || 0;\r\n    const footerHeight = casinoGameFooter.value.height || 0;\r\n    const availableHeight = innerContainer.value.clientHeight - headerHeight - footerHeight;\r\n    if (availableHeight > 0 && availableWidth > 0) {\r\n        const containerHeightByWidth = availableWidth / aspectRatio;\r\n        const containerWidthByHeight = availableHeight * aspectRatio;\r\n        if (containerHeightByWidth <= availableHeight) {\r\n            ngGameContainerStyle.value = {\r\n                width: `${availableWidth}px`,\r\n                height: `${containerHeightByWidth}px`,\r\n            };\r\n        } else {\r\n            ngGameContainerStyle.value = {\r\n                width: `${containerWidthByHeight}px`,\r\n                height: `${availableHeight}px`,\r\n            };\r\n        }\r\n    }\r\n};\r\n\r\nconst backgroundImageUrl = computed(() => {\r\n    const url = gameData.value?.background || \"\";\r\n    return WebpHelper.hasWebpSupport ? WebpHelper.webpUrl(url) : url;\r\n});\r\n\r\nconst handleLoginAborted = () => {\r\n    if (isLiveDealer.value) {\r\n        closeGame();\r\n    } else {\r\n        playForMoney.value = false;\r\n    }\r\n};\r\naddLoginAbortedCallback(handleLoginAborted);\r\n\r\nconst handleHeaderVisibility = () => {\r\n    if (isMobileOnPageLoad) {\r\n        disableHeader();\r\n    } else {\r\n        setHeaderState({ active: true, transparent: false, animated: false });\r\n    }\r\n};\r\n\r\nconst onGameStart = () => {\r\n    document.body.classList.add(\"casino-open\");\r\n\r\n    if (!isInAppView) {\r\n        handleHeaderVisibility();\r\n    }\r\n\r\n    if (ngGameContainer.value && !ngGameContainer.value.querySelector(\"#ng-game-container\")) {\r\n        const gameContainerElement = document.getElementById(\"ng-game-container\");\r\n        if (gameContainerElement) ngGameContainer.value.appendChild(gameContainerElement);\r\n    }\r\n};\r\n\r\nconst onGameEnd = () => {\r\n    document.body.classList.remove(\"casino-open\");\r\n    if (!isInAppView) {\r\n        resetHeader();\r\n    }\r\n};\r\n\r\nconst debouncedUpdate = debounce(updateNgGameContainerStyle, 100);\r\n\r\nconst updateScreenWidth = () => {\r\n    if (gameData.value.type !== CasinoGameType.eticket) {\r\n        debouncedUpdate();\r\n    }\r\n};\r\n\r\nonMounted(() => {\r\n    onGameStart();\r\n    window.addEventListener(\"resize\", updateScreenWidth);\r\n    if (gameData.value.type !== CasinoGameType.eticket) {\r\n        updateNgGameContainerStyle();\r\n    }\r\n});\r\n\r\nonUnmounted(() => {\r\n    onGameEnd();\r\n    window.removeEventListener(\"resize\", updateScreenWidth);\r\n});\r\n\r\nwatch([sessionStart, isLoggedIn], ([val, isLoggedIn]) => {\r\n    if (val) {\r\n        if (!interval) {\r\n            interval = window.setInterval(() => {\r\n                playingTime.value = DateTimeUtils.formatDuration(Date.now() - val);\r\n            });\r\n\r\n            if (!isLoggedIn) {\r\n                clearInterval(interval);\r\n                interval = null;\r\n            }\r\n        } else {\r\n            clearInterval(interval);\r\n            interval = null;\r\n        }\r\n    }\r\n});\r\n\r\nwatch([currentGameId, splitscreenData], ([newVal]) => {\r\n    if (newVal == 0) {\r\n        if (splitscreenData.value) {\r\n            nextTick(() => onGameStart());\r\n        }\r\n        onGameEnd();\r\n    } else {\r\n        nextTick(() => onGameStart());\r\n    }\r\n});\r\n\nreturn (_ctx: any,_cache: any) => {\n  return _withDirectives((_openBlock(), _createElementBlock(\"div\", {\n    class: _normalizeClass([\"game-detail\", {\r\n            'game-detail--splitscreen': _unref(splitscreenData),\r\n            'game-detail--mobile-on-load': _unref(isMobileOnPageLoad),\r\n            'game-detail--live-dealer': isLiveDealer.value,\r\n        }]),\n    ref_key: \"container\",\n    ref: container\n  }, [\n    _createElementVNode(\"div\", {\n      class: _normalizeClass([\"content\", { 'content--mobile': _unref(isResponsiveMobile) }]),\n      style: _normalizeStyle(`background-image:url(${backgroundImageUrl.value});`)\n    }, [\n      _createElementVNode(\"div\", _hoisted_1, [\n        _createElementVNode(\"div\", {\n          ref_key: \"innerContainer\",\n          ref: innerContainer,\n          class: _normalizeClass([\"inner-container\", [\r\n                        { 'inner-container--mobile': _unref(isResponsiveMobile) },\r\n                        { 'inner-container--app': _unref(isInAppView) },\r\n                    ]])\n        }, [\n          (!_unref(isInAppView))\n            ? (_openBlock(), _createBlock(CasinoGameHeader, {\n                key: 0,\n                ref_key: \"casinoGameHeader\",\n                ref: casinoGameHeader,\n                \"game-data\": _unref(gameData)\n              }, null, 8, [\"game-data\"]))\n            : _createCommentVNode(\"\", true),\n          _createElementVNode(\"div\", {\n            class: _normalizeClass([\r\n                            'ng-game-container',\r\n                            { 'ng-game-container--centered': _unref(gameData).type !== _unref(CasinoGameType).eticket },\r\n                        ]),\n            ref_key: \"ngGameContainer\",\n            ref: ngGameContainer,\n            style: _normalizeStyle(ngGameContainerStyle.value)\n          }, [\n            (_unref(splitscreenData))\n              ? (_openBlock(), _createBlock(SplitScreen, { key: 0 }))\n              : _createCommentVNode(\"\", true)\n          ], 6),\n          (_unref(gameData) && (!_unref(isInAppView) || _unref(gameData).type === _unref(CasinoGameType).livedealer))\n            ? (_openBlock(), _createBlock(CasinoGameFooter, {\n                key: 1,\n                ref_key: \"casinoGameFooter\",\n                ref: casinoGameFooter,\n                \"game-data\": _unref(gameData)\n              }, null, 8, [\"game-data\"]))\n            : _createCommentVNode(\"\", true)\n        ], 2)\n      ])\n    ], 6)\n  ], 2)), [\n    [_vShow, (_unref(currentGameId) != 0 && _unref(gameData) && !_unref(transparentGame)) || _unref(splitscreenData)]\n  ])\n}\n}\n\n})","<template>\r\n    <div\r\n        v-show=\"(currentGameId != 0 && gameData && !transparentGame) || splitscreenData\"\r\n        class=\"game-detail\"\r\n        :class=\"{\r\n            'game-detail--splitscreen': splitscreenData,\r\n            'game-detail--mobile-on-load': isMobileOnPageLoad,\r\n            'game-detail--live-dealer': isLiveDealer,\r\n        }\"\r\n        ref=\"container\"\r\n    >\r\n        <div\r\n            class=\"content\"\r\n            :class=\"{ 'content--mobile': isResponsiveMobile }\"\r\n            :style=\"`background-image:url(${backgroundImageUrl});`\"\r\n        >\r\n            <div class=\"bs-container\">\r\n                <div\r\n                    ref=\"innerContainer\"\r\n                    class=\"inner-container\"\r\n                    :class=\"[\r\n                        { 'inner-container--mobile': isResponsiveMobile },\r\n                        { 'inner-container--app': isInAppView },\r\n                    ]\"\r\n                >\r\n                    <CasinoGameHeader v-if=\"!isInAppView\" ref=\"casinoGameHeader\" :game-data=\"gameData\" />\r\n\r\n                    <div\r\n                        :class=\"[\r\n                            'ng-game-container',\r\n                            { 'ng-game-container--centered': gameData.type !== CasinoGameType.eticket },\r\n                        ]\"\r\n                        ref=\"ngGameContainer\"\r\n                        :style=\"ngGameContainerStyle\"\r\n                    >\r\n                        <SplitScreen v-if=\"splitscreenData\"></SplitScreen>\r\n                    </div>\r\n\r\n                    <CasinoGameFooter\r\n                        v-if=\"gameData && (!isInAppView || gameData.type === CasinoGameType.livedealer)\"\r\n                        ref=\"casinoGameFooter\"\r\n                        :game-data=\"gameData\"\r\n                    />\r\n                </div>\r\n            </div>\r\n        </div>\r\n    </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed, CSSProperties, nextTick, onMounted, onUnmounted, ref, watch } from \"vue\";\r\nimport { addLoginAbortedCallback } from \"@sazka/ng/ng-integration\";\r\nimport { ResponsiveUtils } from \"@sazka/utils/responsive-utils\";\r\nimport { DateTimeUtils } from \"@sazka/utils/date-time-utils\";\r\nimport { WebpHelper } from \"@sazka/utils/webp-helper\";\r\nimport { useNgCasinoUtils } from \"./ng-casino-utils\";\r\nimport { useNgSession } from \"@sazka/ng/ng-session\";\r\nimport { CasinoGameType } from \"./casino-game-type\";\r\nimport { useNgCasino } from \"./ng-casino-module\";\r\nimport { debounce } from \"@sazka/utils/debounce\";\r\nimport SplitScreen from \"./split-screen/split-screen.vue\";\r\nimport CasinoGameHeader from \"./components/casino-game-header.vue\";\r\nimport CasinoGameFooter from \"./components/casino-game-footer.vue\";\r\nimport { useHeader } from \"@/shared/components/master-page/header\";\r\n\r\nconst { disableHeader, setHeaderState, resetHeader } = useHeader();\r\n\r\nconst {\r\n    playForMoney,\r\n    closeGame,\r\n    sessionStart,\r\n    currentGameServerData: gameData,\r\n    ngGameDefinition,\r\n    currentGameId,\r\n    transparentGame,\r\n    splitscreenData,\r\n} = useNgCasino();\r\n\r\nlet interval: number | null = null;\r\n\r\nconst casinoGameHeader = ref<InstanceType<typeof CasinoGameHeader>>();\r\nconst casinoGameFooter = ref<InstanceType<typeof CasinoGameFooter>>();\r\nconst ngGameContainer = ref<HTMLDivElement | null>(null);\r\nconst ngGameContainerStyle = ref<CSSProperties>({});\r\nconst container = ref<HTMLDivElement | null>(null);\r\nconst innerContainer = ref<HTMLDivElement>();\r\nconst playingTime = ref(\"\");\r\n\r\nconst { isMobile: isResponsiveMobile } = useNgCasinoUtils();\r\nconst { isLoggedIn } = useNgSession();\r\n\r\nconst isLiveDealer = computed(() => gameData.value?.type == CasinoGameType.livedealer);\r\n\r\nconst isMobileOnPageLoad = ResponsiveUtils.isMobile();\r\nconst isInAppView = window.environment?.isInAppView || false;\r\n\r\nconst getAspectRatio = () => parseFloat(ngGameDefinition.value?.aspectRatio) || 16 / 9;\r\n\r\nconst clearNgGameContainerStyle = () => {\r\n    if (ngGameContainer.value) {\r\n        ngGameContainer.value.style.width = \"\";\r\n        ngGameContainer.value.style.height = \"\";\r\n    }\r\n    ngGameContainerStyle.value = {};\r\n};\r\n\r\nconst updateNgGameContainerStyle = () => {\r\n    clearNgGameContainerStyle();\r\n\r\n    if (isResponsiveMobile.value) return;\r\n\r\n    if (!ngGameContainer.value || !innerContainer.value || !casinoGameHeader.value || !casinoGameFooter.value) {\r\n        console.error(\"Error while resizing iFrame, one or more elements not found on page:\", {\r\n            ngGameContainer: !!ngGameContainer.value,\r\n            innerContainer: !!innerContainer.value,\r\n            gameHeader: !!casinoGameHeader.value,\r\n            gameFooter: !!casinoGameFooter.value,\r\n        });\r\n        return;\r\n    }\r\n\r\n    const aspectRatio = getAspectRatio();\r\n\r\n    const availableWidth = innerContainer.value.clientWidth;\r\n    const headerHeight = isResponsiveMobile.value ? 0 : casinoGameHeader.value.height || 0;\r\n    const footerHeight = casinoGameFooter.value.height || 0;\r\n    const availableHeight = innerContainer.value.clientHeight - headerHeight - footerHeight;\r\n    if (availableHeight > 0 && availableWidth > 0) {\r\n        const containerHeightByWidth = availableWidth / aspectRatio;\r\n        const containerWidthByHeight = availableHeight * aspectRatio;\r\n        if (containerHeightByWidth <= availableHeight) {\r\n            ngGameContainerStyle.value = {\r\n                width: `${availableWidth}px`,\r\n                height: `${containerHeightByWidth}px`,\r\n            };\r\n        } else {\r\n            ngGameContainerStyle.value = {\r\n                width: `${containerWidthByHeight}px`,\r\n                height: `${availableHeight}px`,\r\n            };\r\n        }\r\n    }\r\n};\r\n\r\nconst backgroundImageUrl = computed(() => {\r\n    const url = gameData.value?.background || \"\";\r\n    return WebpHelper.hasWebpSupport ? WebpHelper.webpUrl(url) : url;\r\n});\r\n\r\nconst handleLoginAborted = () => {\r\n    if (isLiveDealer.value) {\r\n        closeGame();\r\n    } else {\r\n        playForMoney.value = false;\r\n    }\r\n};\r\naddLoginAbortedCallback(handleLoginAborted);\r\n\r\nconst handleHeaderVisibility = () => {\r\n    if (isMobileOnPageLoad) {\r\n        disableHeader();\r\n    } else {\r\n        setHeaderState({ active: true, transparent: false, animated: false });\r\n    }\r\n};\r\n\r\nconst onGameStart = () => {\r\n    document.body.classList.add(\"casino-open\");\r\n\r\n    if (!isInAppView) {\r\n        handleHeaderVisibility();\r\n    }\r\n\r\n    if (ngGameContainer.value && !ngGameContainer.value.querySelector(\"#ng-game-container\")) {\r\n        const gameContainerElement = document.getElementById(\"ng-game-container\");\r\n        if (gameContainerElement) ngGameContainer.value.appendChild(gameContainerElement);\r\n    }\r\n};\r\n\r\nconst onGameEnd = () => {\r\n    document.body.classList.remove(\"casino-open\");\r\n    if (!isInAppView) {\r\n        resetHeader();\r\n    }\r\n};\r\n\r\nconst debouncedUpdate = debounce(updateNgGameContainerStyle, 100);\r\n\r\nconst updateScreenWidth = () => {\r\n    if (gameData.value.type !== CasinoGameType.eticket) {\r\n        debouncedUpdate();\r\n    }\r\n};\r\n\r\nonMounted(() => {\r\n    onGameStart();\r\n    window.addEventListener(\"resize\", updateScreenWidth);\r\n    if (gameData.value.type !== CasinoGameType.eticket) {\r\n        updateNgGameContainerStyle();\r\n    }\r\n});\r\n\r\nonUnmounted(() => {\r\n    onGameEnd();\r\n    window.removeEventListener(\"resize\", updateScreenWidth);\r\n});\r\n\r\nwatch([sessionStart, isLoggedIn], ([val, isLoggedIn]) => {\r\n    if (val) {\r\n        if (!interval) {\r\n            interval = window.setInterval(() => {\r\n                playingTime.value = DateTimeUtils.formatDuration(Date.now() - val);\r\n            });\r\n\r\n            if (!isLoggedIn) {\r\n                clearInterval(interval);\r\n                interval = null;\r\n            }\r\n        } else {\r\n            clearInterval(interval);\r\n            interval = null;\r\n        }\r\n    }\r\n});\r\n\r\nwatch([currentGameId, splitscreenData], ([newVal]) => {\r\n    if (newVal == 0) {\r\n        if (splitscreenData.value) {\r\n            nextTick(() => onGameStart());\r\n        }\r\n        onGameEnd();\r\n    } else {\r\n        nextTick(() => onGameStart());\r\n    }\r\n});\r\n</script>\r\n","import script from \"./casino-game-layer.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./casino-game-layer.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { useLocalStorage } from \"@sazka/utils/use-storage\";\r\nconst storageName = \"has-confirmed-age\";\r\nconst store = useLocalStorage();\r\n\r\nexport const confirmAge = (): Promise<void> => {\r\n    return new Promise((resolve, reject) => {\r\n        if (environment.isRegistered) {\r\n            resolve();\r\n            return;\r\n        }\r\n\r\n        const hasConfirmedAge = store.getItem(storageName);\r\n        if (hasConfirmedAge) {\r\n            resolve();\r\n            return;\r\n        }\r\n\r\n        const template = `\r\n        <div class=\"modal fade confirmation-modal\" tabindex=\"-1\" role=\"dialog\" aria-hidden=\"true\">\r\n            <div class=\"modal-dialog modal-dialog-centered\">\r\n                <div class=\"modal-content modal-content--without-close\">\r\n                    <div class=\"modal-body text-center\">\r\n                        <img src=\"/frontend/web/img/casino/age-confirmation.svg\" class=\"img-top\">\r\n                        <h2>Potvrďte nám, že</br>už vám bylo 18 let.</h2>\r\n                        <div class=\"buttons buttons--without-subtitle\">\r\n                            <button type=\"button\" id=\"btn-confirm\" class=\"btn btn-primary\">Potvrzuji</button>\r\n                            <button type=\"button\" id=\"btn-cancel\" class=\"btn btn-outline-primary\">Zpět</button>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`;\r\n\r\n        const $modal = $(template);\r\n        $(\"body\").append($modal);\r\n        $modal.modal(\"show\");\r\n        $modal.find(\"#btn-confirm\").on(\"click\", () => {\r\n            store.setItem(storageName, \"true\", \"essential\");\r\n            resolve();\r\n            $modal.modal(\"hide\");\r\n        });\r\n        $modal.find(\"#btn-cancel\").on(\"click\", () => {\r\n            $modal.modal(\"hide\");\r\n        });\r\n        $modal.on(\"hidden.bs.modal\", () => {\r\n            reject();\r\n            $modal.modal(\"dispose\").remove();\r\n            if ($(\".modal:visible\").length) {\r\n                $(\"body\").addClass(\"modal-open\");\r\n            }\r\n        });\r\n    });\r\n};\r\n","import { addLoginAbortedCallback, getNgTimeDuration, ngFrameworkLoaded } from \"@sazka/ng/ng-integration\";\r\nimport { ResponsiveUtils } from \"@sazka/utils/responsive-utils\";\r\nimport { sazkaAlert } from \"@sazka/utils/sazka-alert\";\r\nimport { computed, createApp, ref, watch } from \"vue\";\r\nimport { CasinoGameLoadParams } from \"./casino-game-load-params\";\r\nimport { analyticsCasinoGameDetail, analyticsCasinoToggleMoneyMode } from \"./ng-casino-analytics\";\r\nimport { useNgCasinoGameList } from \"./ng-casino-game-list\";\r\nimport { OnlineGameDetail } from \"./online-game-detail\";\r\nimport { useSplitscreen } from \"./split-screen/splitscreen\";\r\nimport CasinoGameDetail from \"@/casino/ng-casino/casino-game-layer.vue\";\r\nimport { useNgSession } from \"@sazka/ng/ng-session\";\r\nimport { Loader } from \"@sazka/design-system/src/loader/loader\";\r\nimport { SplitScreenGame } from \"./split-screen/split-screen-game\";\r\nimport { httpClient } from \"@sazka/utils/http-clients/http-client\";\r\nimport useFloatingGamePreload from \"@/floating/use-floating-preload\";\r\nimport { confirmAge } from \"@/shared/utils/age-confirmation\";\r\nimport { checkPlayerRestrictions } from \"@sazka/ng/ng-player-restrictions\";\r\nimport { CasinoGameType } from \"./casino-game-type\";\r\n\r\n/** ID of currently opened game */\r\nconst currentGameId = ref(0);\r\n/** ID of the game that was successfully launched by NG */\r\nconst successfullyLaunchedGameId = ref(0);\r\n/** Flag if user plays for money */\r\nconst playForMoney = ref(false);\r\n/** Flag if transparent game is being opened */\r\nconst transparentGame = ref(false);\r\n\r\n// Revert changes from FE-4801 only for games\r\nconst netLoss = ref<number | null>(null);\r\n\r\nconst sessionStart = ref<number | null>(null);\r\nconst { isLoggedIn } = useNgSession();\r\n\r\nlet container = null;\r\n\r\nlet transparentGameMountModule: typeof import(\"./mount-casino-transparent-game-layer\") = null;\r\n\r\nconst casinoGameMobileMode = ResponsiveUtils.isMobile();\r\nconst ngGameDefinition = ref(null);\r\n\r\n/** Data received from server*/\r\nconst currentGameServerData = ref<OnlineGameDetail | null>(null);\r\n\r\nconst splitscreenData = ref<SplitScreenGame>(null);\r\n\r\nlet gameLoadPromiseResolve: (data?: any) => void = null;\r\n\r\nconst { fetchNgGameDefinition, gameListReady } = useNgCasinoGameList();\r\n\r\nconst isLiveDealerGameOpen = computed(() => {\r\n    return currentGameId.value !== 0 && currentGameServerData.value.type === CasinoGameType.livedealer;\r\n});\r\n\r\nfunction tryOpenPreloadedTransparentGame(gameId: number) {\r\n    const { casinoFloatingGamePreloaded, casinoFloatingGamePreloading, emitGameLoad } = useFloatingGamePreload();\r\n\r\n    if (currentGameId.value === gameId && (casinoFloatingGamePreloaded.value || casinoFloatingGamePreloading.value)) {\r\n        emitGameLoad();\r\n        return true;\r\n    }\r\n\r\n    return false;\r\n}\r\n\r\nconst showGameDetail = () => {\r\n    if (!container) {\r\n        container = document.createElement(\"div\");\r\n        document.body.append(container);\r\n        const component = createApp(CasinoGameDetail);\r\n        component.mount(container);\r\n    }\r\n};\r\n\r\nconst showTransparentGameDetail = async (loadingFromQuery = false) => {\r\n    if (loadingFromQuery && tryOpenPreloadedTransparentGame(currentGameId.value)) return;\r\n\r\n    transparentGameMountModule ??= await import(\"./mount-casino-transparent-game-layer\");\r\n    transparentGameMountModule.launchCasinoTransparentGameLayer(currentGameId.value.toString());\r\n};\r\n\r\n/**\r\n * Close game request to NG\r\n */\r\nconst closeGame = () => {\r\n    // handle case when NG doesn't start loading of the game, because of widget or error (CDD verification for example)\r\n    if (!successfullyLaunchedGameId.value) {\r\n        currentGameId.value = 0;\r\n    }\r\n    successfullyLaunchedGameId.value = 0;\r\n\r\n    if (currentGameId.value > 0) {\r\n        ng_fw.closeGame();\r\n    }\r\n    if (splitscreenData.value) {\r\n        currentGameId.value = 0;\r\n        splitscreenData.value = null;\r\n    }\r\n};\r\n\r\nconst loadGameFromMoneyModeToggle = () => {\r\n    loadGame({\r\n        gameId: currentGameId.value,\r\n        moneyMode: playForMoney.value,\r\n        loadSameGame: true,\r\n    });\r\n    analyticsCasinoToggleMoneyMode(playForMoney.value);\r\n};\r\n\r\n/**\r\n * Toggles money mode\r\n */\r\nconst toggleMoneyMode = () => {\r\n    playForMoney.value = !playForMoney.value;\r\n\r\n    if (playForMoney.value && !isLoggedIn.value) {\r\n        ng_fw.showLogin();\r\n\r\n        const stopWatch = watch(\r\n            isLoggedIn,\r\n            (val) => {\r\n                if (val) {\r\n                    loadGameFromMoneyModeToggle();\r\n                }\r\n            },\r\n            { once: true }\r\n        );\r\n\r\n        ng_hs.loginAborted(() => stopWatch());\r\n    } else {\r\n        loadGameFromMoneyModeToggle();\r\n    }\r\n};\r\n\r\n/**\r\n * NG confirms that game started loading,\r\n * we can show iframe\r\n * @param gameId Game ID of currently started game, supplied by NG\r\n * @param playMode Play mode supplied by NG\r\n */\r\nconst ngGameReady = (gameId: number, playMode: \"M\" | \"D\") => {\r\n    if (currentGameId.value == gameId && playForMoney.value === (playMode === \"M\")) {\r\n        gameLoadPromiseResolve();\r\n        gameLoadPromiseResolve = null;\r\n    } else {\r\n        loadGameInitiatedByNg(gameId, playMode === \"M\");\r\n    }\r\n    currentGameId.value = gameId;\r\n    playForMoney.value = playMode === \"M\";\r\n    successfullyLaunchedGameId.value = gameId;\r\n};\r\n\r\nconst ngLoadGame = (gameId: number, playForMoney: boolean) => {\r\n    return new Promise<void>((res) => {\r\n        gameLoadPromiseResolve = res;\r\n        ng_fw.loadGame({ gameId, playMode: playForMoney ? \"M\" : \"D\" });\r\n    });\r\n};\r\n\r\nasync function loadTransparentGame(gameLoadParams: CasinoGameLoadParams) {\r\n    transparentGame.value = true;\r\n    playForMoney.value = true; // can be played in money mode only (may change for future transparent games)\r\n\r\n    if (currentGameServerData.value?.gameId !== gameLoadParams.gameId) {\r\n        await loadServerData(gameLoadParams.gameId);\r\n    }\r\n\r\n    currentGameId.value = currentGameServerData.value.gameId;\r\n\r\n    return ngLoadGame(currentGameId.value, playForMoney.value);\r\n}\r\n\r\n/**\r\n * Initiates game load process\r\n * @param gameLoadParams game load params\r\n */\r\nasync function loadGame(\r\n    gameLoadParams: CasinoGameLoadParams,\r\n    loadingFromQuery = false,\r\n    manufacturer = null,\r\n    placement = null,\r\n    position = 0,\r\n    withAbTest = true\r\n) {\r\n    if (\r\n        gameLoadParams == null ||\r\n        isNaN(gameLoadParams.gameId) ||\r\n        (gameLoadParams.gameId === currentGameId.value && !gameLoadParams.loadSameGame)\r\n    ) {\r\n        return;\r\n    }\r\n\r\n    if (!environment.isInAppView) {\r\n        try {\r\n            await confirmAge();\r\n        } catch {\r\n            return;\r\n        }\r\n    }\r\n\r\n    // Hard Splitscreen\r\n    splitscreenData.value = useSplitscreen(gameLoadParams.gameId);\r\n\r\n    Loader.showNow();\r\n\r\n    try {\r\n        await loadServerData(gameLoadParams.gameId, withAbTest);\r\n\r\n        const mobileId = currentGameServerData.value.gameMobileId || currentGameServerData.value.gameId;\r\n        const desktopId = currentGameServerData.value.gameId;\r\n\r\n        transparentGame.value = currentGameServerData.value?.transparent ?? false;\r\n        currentGameId.value = casinoGameMobileMode ? mobileId : desktopId; // needs to be set after transparentGame, because of watch trigger in casinoGameLayer\r\n\r\n        if (splitscreenData.value) {\r\n            Loader.hide();\r\n            showGameDetail();\r\n            return;\r\n        }\r\n        await ngFrameworkLoaded();\r\n\r\n        ngGameDefinition.value = await fetchNgGameDefinition(currentGameId.value);\r\n        if (!ngGameDefinition.value) {\r\n            Loader.hide();\r\n            gameNotFoundAlert();\r\n            return;\r\n        }\r\n\r\n        playForMoney.value = gameLoadParams.moneyMode ?? isLoggedIn.value;\r\n        // check if game is available in demo mode\r\n        if (playForMoney.value === false && !ngGameDefinition.value.playModes.includes(\"Demo\")) {\r\n            playForMoney.value = true;\r\n        }\r\n\r\n        analyticsCasinoGameDetail(\r\n            currentGameServerData.value?.type,\r\n            currentGameServerData.value?.codeName,\r\n            playForMoney.value,\r\n            currentGameId.value,\r\n            manufacturer,\r\n            placement,\r\n            position\r\n        );\r\n        Loader.hide();\r\n\r\n        if (transparentGame.value) {\r\n            showTransparentGameDetail(loadingFromQuery);\r\n        } else {\r\n            const isRestricted = environment.isInAppView ? false : await checkPlayerRestrictions(true);\r\n\r\n            //do not load game background in case of cool off\r\n            if (!isRestricted) {\r\n                showGameDetail();\r\n            }\r\n            ngLoadGame(currentGameId.value, playForMoney.value);\r\n        }\r\n    } catch (e) {\r\n        gameLoadAlert();\r\n        Loader.hide();\r\n    }\r\n}\r\n\r\n// game can be initiated from NG widget\r\nasync function loadGameInitiatedByNg(gameId: number, moneyMode: boolean) {\r\n    playForMoney.value = moneyMode;\r\n    currentGameId.value = gameId;\r\n    Loader.showNow();\r\n\r\n    try {\r\n        await loadServerData(currentGameId.value, false);\r\n        transparentGame.value = currentGameServerData.value?.transparent ?? false;\r\n\r\n        // TODO: switch to \"force\" money mode for transparent games?\r\n\r\n        if (transparentGame.value) {\r\n            showTransparentGameDetail();\r\n        } else {\r\n            showGameDetail();\r\n        }\r\n\r\n        ngGameDefinition.value = await fetchNgGameDefinition(currentGameId.value);\r\n        if (!ngGameDefinition.value) {\r\n            Loader.hide();\r\n            gameNotFoundAlert();\r\n            return;\r\n        }\r\n\r\n        analyticsCasinoGameDetail(\r\n            currentGameServerData.value?.type,\r\n            currentGameServerData.value?.codeName,\r\n            playForMoney.value,\r\n            currentGameId.value,\r\n            null,\r\n            null,\r\n            0\r\n        );\r\n        Loader.hide();\r\n    } catch (e) {\r\n        Loader.hide();\r\n        gameLoadAlert();\r\n    }\r\n}\r\n\r\nfunction gameLoadAlert() {\r\n    sazkaAlert(\r\n        \"Nastal problém při načítání hry\",\r\n        \"Zkuste prosím obnovit stránku a hru znovu spustit.\",\r\n        \"Obnovit stránku\",\r\n        \"javascript:location.reload()\",\r\n        \"Zavřít\"\r\n    );\r\n}\r\n\r\nfunction gameNotFoundAlert() {\r\n    sazkaAlert(\r\n        \"Připravujeme pro vás novou hru\",\r\n        \"Omlouváme se, ale hru není možné v tuto chvíli spustit. Připravujeme pro vás novou emisi. Mezitím vyzkoušejte další hry z naší nabídky.\"\r\n    );\r\n}\r\n\r\n/**\r\n * Load game data from Kentico\r\n * @param gameId Game to load server data\r\n */\r\nasync function loadServerData(gameId: number, withAbTest = true): Promise<boolean> {\r\n    return await new Promise(async (res, rej) => {\r\n        // is same game - for example on money mode change\r\n        if (currentGameServerData.value?.gameId === gameId && !withAbTest) {\r\n            res(true);\r\n            return;\r\n        }\r\n\r\n        try {\r\n            const response = await httpClient.get<OnlineGameDetail>(\r\n                `/api/casino/game/${gameId}?withAbTest=${withAbTest}`\r\n            );\r\n            currentGameServerData.value = response.data;\r\n            res(true);\r\n        } catch (err) {\r\n            rej(err);\r\n        }\r\n    });\r\n}\r\n\r\nfunction ngSessionUpdate(totalNetLoss: string, playingSessionStart: string, ngServerTime: string) {\r\n    netLoss.value = Number(totalNetLoss) * -1;\r\n\r\n    if (playingSessionStart) {\r\n        sessionStart.value = getNgTimeDuration(playingSessionStart, ngServerTime);\r\n    } else {\r\n        sessionStart.value = null;\r\n        netLoss.value = null;\r\n    }\r\n}\r\n\r\nfunction handleTransparentProductCardClick(gameId: any, gameLoadParams: any) {\r\n    if (!tryOpenPreloadedTransparentGame(gameId)) {\r\n        gameLoadParams.moneyMode = true;\r\n        loadGame(gameLoadParams);\r\n    }\r\n}\r\n\r\nngFrameworkLoaded().then(() => {\r\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n    ng_hs.instantGame.gameClosed((gameId: number) => {\r\n        // do not reset game id, when we are expecting next game to launch\r\n        if (!gameLoadPromiseResolve) {\r\n            currentGameId.value = 0;\r\n            gameLoadPromiseResolve = null;\r\n        }\r\n    });\r\n    ng_hs.onGamesListUpdated((gameList) => gameListReady(gameList));\r\n\r\n    ng_hs.InstantGamesPlayingSessionUpdate((rgStatus) => {\r\n        // Revert changes for FE-4801\r\n        // to include net loss only for games only\r\n        ngSessionUpdate(rgStatus.TotalNetLoss, rgStatus.PlayingSessionStartTime, rgStatus.ServerTime);\r\n    });\r\n\r\n    // when user toggles money mode and then closes login popup,\r\n    // we need to forget, he wanted to change game mode\r\n    addLoginAbortedCallback(() => {\r\n        if (gameLoadPromiseResolve) {\r\n            gameLoadPromiseResolve = null;\r\n        }\r\n    });\r\n});\r\n\r\n/*\r\n    prevents user from pressing tab\r\n    while game opened\r\n    (header dissapears)\r\n*/\r\n$(\"body\").keydown(function (e) {\r\n    if ($(\"body\").hasClass(\"casino-open\")) {\r\n        if (e.keyCode === 9) {\r\n            e.preventDefault();\r\n        }\r\n    }\r\n});\r\n\r\nexport const useNgCasino = () => ({\r\n    loadGame,\r\n    loadTransparentGame,\r\n    ngGameReady,\r\n    playForMoney,\r\n    closeGame,\r\n    sessionStart,\r\n    netLoss,\r\n    currentGameServerData,\r\n    currentGameId,\r\n    transparentGame,\r\n    ngGameDefinition,\r\n    toggleMoneyMode,\r\n    splitscreenData,\r\n    handleTransparentProductCardClick,\r\n    isLiveDealerGameOpen,\r\n});\r\n","import { eventBus, GlobalEvents } from \"@sazka/utils/global-events\";\r\nimport { ref } from \"vue\";\r\n\r\nconst casinoFloatingGamePreloaded = ref(false);\r\nconst casinoFloatingGamePreloading = ref(false);\r\n\r\nexport default function useFloatingGamePreload() {\r\n    const emitGameLoad = () => {\r\n        eventBus.emit(GlobalEvents.LaunchCasinoFloating);\r\n    };\r\n\r\n    return {\r\n        casinoFloatingGamePreloading,\r\n        casinoFloatingGamePreloaded,\r\n        emitGameLoad,\r\n    };\r\n}\r\n","import { ngFrameworkLoaded } from \"@sazka/ng/ng-integration\";\r\nimport { useNgSession } from \"@sazka/ng/ng-session\";\r\nimport { getPlayerSelfExclusion } from \"@/shared/http-clients/player-account-http-client\";\r\nimport { isTerminatedAccount } from \"./player-account\";\r\nimport { ref, watch } from \"vue\";\r\n\r\nexport const isSelfExcludedAccount = ref<boolean>(null);\r\n\r\nexport const startPanicButtonFlow = async (location: \"detail\" | \"footer\" | \"\" = \"\", game = \"\") => {\r\n    const { usePanicButtonFlow } = await import(\"../panic-button/use-panic-button-flow\");\r\n    const { showPopup } = usePanicButtonFlow();\r\n    await showPopup(location, game);\r\n};\r\n\r\nexport const useSelfExclusion = async () => {\r\n    const { isLoggedIn } = useNgSession();\r\n\r\n    await ngFrameworkLoaded();\r\n    watch(isLoggedIn, async (loggedIn) => {\r\n        if (loggedIn) {\r\n            let selfExclusion = null;\r\n            try {\r\n                selfExclusion = await getPlayerSelfExclusion();\r\n            } catch {\r\n                return;\r\n            }\r\n\r\n            if (selfExclusion?.Limits?.[0]?.DurationUnit === \"Permanent\") {\r\n                isSelfExcludedAccount.value = true;\r\n\r\n                watch(\r\n                    isTerminatedAccount,\r\n                    async () => {\r\n                        if (isTerminatedAccount.value === false) {\r\n                            const { usePanicButtonLoginNotification } = await import(\r\n                                \"../panic-button/use-panic-button-login-notification\"\r\n                            );\r\n                            const { showPermanentBlockPopup } = usePanicButtonLoginNotification();\r\n                            await showPermanentBlockPopup();\r\n                        }\r\n                    },\r\n                    { immediate: true }\r\n                );\r\n\r\n                return;\r\n            }\r\n\r\n            if (selfExclusion?.Limits?.[0]?.EndDate) {\r\n                isSelfExcludedAccount.value = true;\r\n\r\n                watch(\r\n                    isTerminatedAccount,\r\n                    async () => {\r\n                        if (isTerminatedAccount.value === false) {\r\n                            const { usePanicButtonLoginNotification } = await import(\r\n                                \"../panic-button/use-panic-button-login-notification\"\r\n                            );\r\n                            const { showTemporaryBlockPopup } = usePanicButtonLoginNotification();\r\n                            await showTemporaryBlockPopup(new Date(selfExclusion.Limits[0].EndDate));\r\n                        }\r\n                    },\r\n                    { immediate: true }\r\n                );\r\n\r\n                return;\r\n            }\r\n\r\n            isSelfExcludedAccount.value = false;\r\n        } else {\r\n            isSelfExcludedAccount.value = null;\r\n        }\r\n    });\r\n\r\n    document.getElementById(\"panic-button\")?.addEventListener(\"click\", () => startPanicButtonFlow(\"footer\"));\r\n};\r\n","export namespace StringUtils {\r\n    /**\r\n     * Formats a number by adding commas for thousands separator and truncating decimal places.\r\n     *\r\n     * @param {number} value - The number to format.\r\n     * @param {boolean} useNbsp - Optional flag to use non-breaking space as a separator. Defaults to true.\r\n     * @return {string} The formatted number with commas and optional non-breaking space separator.\r\n     */\r\n    export const formatNumber = (value: number, useNbsp = true): string => {\r\n        if (typeof value !== \"number\") {\r\n            return \"---\";\r\n        }\r\n        const ref = value.toFixed(2).split(\".\");\r\n        let preComma = ref[0] || \"\";\r\n        const postComma = ref[1];\r\n        preComma = stringReverse((stringReverse(preComma).match(/.{1,3}/g) || [\"\"]).join(useNbsp ? \";psbn&\" : \" \"));\r\n\r\n        return postComma != \"00\" ? preComma + \",\" + postComma : preComma;\r\n    };\r\n\r\n    /**\r\n     * Formats a currency value by calling formatNumber and appending the currency symbol.\r\n     *\r\n     * @param {number} value - The value to format as currency.\r\n     * @param {boolean} useNbsp - Optional flag to use non-breaking space as a separator. Defaults to true.\r\n     * @return {string} The formatted currency value with the currency symbol.\r\n     */\r\n    export const formatCurrency = (value: number, useNbsp = true): string => {\r\n        // this is also case for 0\r\n        if (!value || isNaN(value)) {\r\n            value = 0;\r\n        }\r\n        return `${formatNumber(value, useNbsp)}${useNbsp ? \"&nbsp;\" : \" \"}Kč`;\r\n    };\r\n\r\n    /**\r\n     * Limits the length of the text if it exceeds the specified limit by truncating and adding ellipsis.\r\n     *\r\n     * @param {string} text - The input text to limit.\r\n     * @param {number} limit - The maximum length of the text before truncation. Defaults to 50.\r\n     * @return {string} The text with limited length, potentially truncated with ellipsis.\r\n     */\r\n    export const limitTextLength = (text: string, limit = 50) => {\r\n        if (text && text.length > limit) {\r\n            return text.substring(0, limit - 3) + \"...\";\r\n        }\r\n        return text;\r\n    };\r\n\r\n    /**\r\n     * Reverses the given string.\r\n     *\r\n     * @param {string} str - The string to be reversed.\r\n     * @return {string} The reversed string.\r\n     */\r\n    export function stringReverse(str: string): string {\r\n        return str.split(\"\").reverse().join(\"\");\r\n    }\r\n\r\n    /**\r\n     * Converts given HTML text to plain text.\r\n     *\r\n     * @param {string} htmlText - The HTML text to be converted to plain text.\r\n     * @return {string} The plain text.\r\n     */\r\n    export function getPlainTextFromHtml(htmlText: string): string {\r\n        const tempDiv = document.createElement(\"div\");\r\n        tempDiv.innerHTML = htmlText;\r\n        return tempDiv.textContent || tempDiv.innerText || \"\";\r\n    }\r\n\r\n    /**\r\n     * Sanitizes a string by removing HTML tags and replacing multiple whitespaces/newlines with a single space.\r\n     */\r\n    export function sanitizeString(input: string): string {\r\n        return input\r\n            .replace(/<[^>]*>/g, \"\") // Remove HTML tags\r\n            .replace(/\\s+/g, \" \") // Replace multiple whitespaces/newlines with a single space\r\n            .trim(); // Remove leading and trailing spaces\r\n    }\r\n}\r\n","import { defineComponent as _defineComponent } from 'vue'\nimport { createElementVNode as _createElementVNode, createTextVNode as _createTextVNode, unref as _unref, createStaticVNode as _createStaticVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nimport { startPanicButtonFlow } from \"@/shared/components/master-page/self-exclusion\";\r\n\r\n\nexport default /*@__PURE__*/_defineComponent({\n  __name: 'panic-button',\n  props: {\n    gameName: {}\n  },\n  setup(__props: any) {\n\r\n\r\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createElementBlock(\"button\", {\n    type: \"button\",\n    onClick: _cache[0] || (_cache[0] = ($event: any) => (_unref(startPanicButtonFlow)('detail', _ctx.gameName))),\n    class: \"panic-button authenticated\"\n  }, _cache[1] || (_cache[1] = [\n    _createStaticVNode(\"<svg class=\\\"panic-button__icon\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"12\\\" height=\\\"16\\\" viewBox=\\\"0 0 12 16\\\"><g clip-path=\\\"url(#clip0_7238_472)\\\"><path d=\\\"M9.70342 8.71247L8.33967 10.5488V2.38369C8.33967 1.91938 7.9634 1.54312 7.49909 1.54312H7.49883C7.03452 1.54312 6.65825 1.91938 6.65825 2.38369V7.51812C6.55388 7.49189 6.44577 7.46727 6.33444 7.44506V1.27417C6.33444 0.809858 5.95818 0.433594 5.49387 0.433594H5.4936C5.02929 0.433594 4.65303 0.809858 4.65303 1.27417V7.27298C4.59924 7.27218 4.54545 7.27164 4.49112 7.27164C4.4368 7.27164 4.38301 7.27218 4.32922 7.27298V1.97023C4.32922 1.50592 3.95295 1.12966 3.48864 1.12966H3.48838C3.02407 1.12966 2.6478 1.50592 2.6478 1.97023V7.44479C2.53648 7.46727 2.42836 7.49162 2.32399 7.51785V4.14967C2.32399 3.68536 1.94773 3.3091 1.48342 3.3091H1.48315C1.01884 3.3091 0.642578 3.68536 0.642578 4.14967V7.71053V9.84367C0.642578 10.6596 0.698777 11.4732 0.810104 12.2792C1.04159 13.955 2.47011 15.1957 4.16196 15.1957H6.05693C7.24674 15.1957 8.3493 14.5705 8.96053 13.5496L11.9581 8.54147C12.0402 8.40418 12.0003 8.22676 11.8673 8.13791C11.217 7.70357 10.3406 7.85531 9.87443 8.48313L9.70423 8.71221L9.70342 8.71247Z\\\"></path></g><defs><clipPath id=\\\"clip0_7238_472\\\"><rect width=\\\"11.358\\\" height=\\\"14.7623\\\" fill=\\\"white\\\" transform=\\\"translate(0.64209 0.433594)\\\"></rect></clipPath></defs></svg> Zablokovat hraní \", 2)\n  ])))\n}\n}\n\n})","import script from \"./panic-button.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./panic-button.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__"],"names":["CasinoGameType","analyticsCasinoGameDetail","type","analyticsGameCode","moneyMode","gameId","manufacturer","placement","position","ngGameDefinition","typeDl","game","eticket","livedealer","page","verticalCode","verticalCodeStrict","gameCode","gameCodeStrict","gameMode","gameid","externalGameProvider","externalGameSubProvider","dataLayer","push","event","analyticsCasinoToggleMoneyMode","playForMoney","action","click","gameList","gameListReadyPromiseResolve","loadGameList","Promise","res","ng_fw","updateGamesList","gameListReady","list","_list$games","games","instant","getGameFromNgList","id","find","fetchNgGameDefinition","async","useNgCasinoGameList","splitscreenGames","cssClass","gameData","link","useSplitscreen","filtered","filter","x","length","MOBILE_BREAKPOINT","useNgCasinoUtils","viewportWidth","ref","window","innerWidth","isMobile","computed","value","updateSize","debouncedUpdateSize","debounce","startDeposit","ngFrameworkLoaded","showDeposit","onMounted","addEventListener","onUnmounted","removeEventListener","_hoisted_1","_defineComponent","__name","setup","__props","splitscreenData","useNgCasino","_ctx","_cache","_openBlock","_createElementBlock","class","_normalizeClass","_unref","_Fragment","_renderList","data","i","href","key","__exports__","_hoisted_2","props","expose","__expose","wrapper","height","closeGame","toggleMoneyMode","isLiveDealer","_props$gameData","moneyTogglerEnabled","updateHeight","clientHeight","debouncedUpdateHeight","ref_key","_createBlock","PanicButton","codeName","_createElementVNode","checked","onClick","args","_createCommentVNode","_createVNode","DsButton","theme","$event","default","_withCtx","_createTextVNode","_","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_environment$isInAppV","isInAppView","environment","loginDurationFormatted","isLoggedIn","useNgSession","_toDisplayString","infoUrl","target","size","_hoisted_7","netLoss","balanceValue","StringUtils","formatCurrency","_hoisted_8","_hoisted_9","_hoisted_10","isMdOrLarger","useBreakpoints","studioAddress","useTemplateRef","footerHeight","footerComponent","CasinoGameFooterEtickets","CasinoGameFooterGames","CasinoGameFooterDealer","style","_normalizeStyle","infoColor","_resolveDynamicComponent","_window$environment","disableHeader","setHeaderState","resetHeader","useHeader","sessionStart","currentGameServerData","currentGameId","transparentGame","interval","casinoGameHeader","casinoGameFooter","ngGameContainer","ngGameContainerStyle","container","innerContainer","playingTime","isResponsiveMobile","_gameData$value","isMobileOnPageLoad","ResponsiveUtils","getAspectRatio","_ngGameDefinition$val","parseFloat","aspectRatio","clearNgGameContainerStyle","width","updateNgGameContainerStyle","console","error","gameHeader","gameFooter","availableWidth","clientWidth","headerHeight","availableHeight","containerHeightByWidth","containerWidthByHeight","backgroundImageUrl","_gameData$value2","url","background","WebpHelper","hasWebpSupport","webpUrl","handleLoginAborted","addLoginAbortedCallback","handleHeaderVisibility","active","transparent","animated","onGameStart","document","body","classList","add","querySelector","gameContainerElement","getElementById","appendChild","onGameEnd","remove","debouncedUpdate","updateScreenWidth","watch","val","clearInterval","setInterval","DateTimeUtils","formatDuration","Date","now","newVal","nextTick","_withDirectives","CasinoGameHeader","SplitScreen","CasinoGameFooter","_vShow","storageName","store","useLocalStorage","confirmAge","resolve","reject","isRegistered","hasConfirmedAge","getItem","template","$modal","$","append","modal","on","setItem","addClass","successfullyLaunchedGameId","transparentGameMountModule","casinoGameMobileMode","gameLoadPromiseResolve","isLiveDealerGameOpen","tryOpenPreloadedTransparentGame","casinoFloatingGamePreloaded","casinoFloatingGamePreloading","emitGameLoad","useFloatingGamePreload","showGameDetail","createElement","component","createApp","CasinoGameDetail","mount","showTransparentGameDetail","loadingFromQuery","_transparentGameMount","launchCasinoTransparentGameLayer","toString","loadGameFromMoneyModeToggle","loadGame","loadSameGame","showLogin","stopWatch","once","ng_hs","loginAborted","ngGameReady","playMode","loadGameInitiatedByNg","ngLoadGame","loadTransparentGame","gameLoadParams","_currentGameServerDat","loadServerData","withAbTest","isNaN","Loader","showNow","_currentGameServerDat2","_currentGameServerDat3","_gameLoadParams$money","_currentGameServerDat4","_currentGameServerDat5","mobileId","gameMobileId","desktopId","hide","gameNotFoundAlert","playModes","includes","isRestricted","checkPlayerRestrictions","e","gameLoadAlert","_currentGameServerDat6","_currentGameServerDat7","_currentGameServerDat8","_currentGameServerDat9","sazkaAlert","rej","_currentGameServerDat10","response","httpClient","get","err","ngSessionUpdate","totalNetLoss","playingSessionStart","ngServerTime","Number","getNgTimeDuration","handleTransparentProductCardClick","then","instantGame","gameClosed","onGamesListUpdated","InstantGamesPlayingSessionUpdate","rgStatus","TotalNetLoss","PlayingSessionStartTime","ServerTime","keydown","hasClass","keyCode","preventDefault","eventBus","emit","GlobalEvents","LaunchCasinoFloating","isSelfExcludedAccount","startPanicButtonFlow","location","usePanicButtonFlow","showPopup","useSelfExclusion","_document$getElementB","loggedIn","_selfExclusion","_selfExclusion2","selfExclusion","getPlayerSelfExclusion","Limits","DurationUnit","isTerminatedAccount","usePanicButtonLoginNotification","showPermanentBlockPopup","immediate","EndDate","showTemporaryBlockPopup","stringReverse","str","split","reverse","join","getPlainTextFromHtml","htmlText","tempDiv","innerHTML","textContent","innerText","sanitizeString","input","replace","trim","formatNumber","useNbsp","toFixed","preComma","postComma","match","limitTextLength","text","limit","substring","gameName","_createStaticVNode"],"sourceRoot":""}