(function($,ko){let urlComponentLoader={loadTemplate:function(name,templateConfig,callback){if(templateConfig.url){let version=window.global.version,fullUrl=window.urls.cdnUrl+"/components/"+templateConfig.url+"?v="+version;$.get(fullUrl,function(markupString){ko.components.defaultLoader.loadTemplate(name,markupString,callback)})}else callback(null)},loadViewModel:function(name,viewModelConfig,callback){if(viewModelConfig&&typeof viewModelConfig.createViewModel=="function"){let currentCreateViewModel=viewModelConfig.createViewModel;viewModelConfig.createViewModel=function(params,componentInfo){return currentCreateViewModel(params,componentInfo)};ko.components.defaultLoader.loadViewModel(name,viewModelConfig,callback)}else callback(null)}};ko.components.loaders.unshift(urlComponentLoader)})(jQuery,ko),function($,ko){function ApplyCouponModel(){function destroyErrorTooltip(element){element.tooltip("destroy")}function showErrorTooltip(element,text){destroyErrorTooltip(element);setTimeout(function(){element.tooltip({"class":"tooltip_error",placement:"right",trigger:"manual",title:text}).tooltip("show")},500)}const self=this;if(self.addCouponDlg=$("#add-coupon-dlg"),self.form=$("#add-coupon-form",self.addCouponDlg),self.couponInput=$("#add-coupon-couponId",self.form),self.couponCode=ko.observable(""),self.activate=function(){if(self.couponCode().length<3){showErrorTooltip(self.couponInput,"Coupon code not valid");return}let couponUserId=window.user.browsingProfileUserId;couponUserId||(couponUserId=window.global.currentUserId);let applyCouponRequest=new $.tabletopia.post.users.activateCoupon;applyCouponRequest.load({userId:couponUserId,couponCode:self.couponCode()}).done(function(data){data.success?window.location.reload():data.message&&showErrorTooltip(self.couponInput,data.message)}).fail(function(){$("#error-dlg").modal();self.addCouponDlg&&self.addCouponDlg.modal("hide")})},self.addCouponDlg)self.addCouponDlg.on("shown.bs.modal",function(){self.couponInput&&self.couponInput.focus()});self.couponInput&&self.couponInput.keyup(function(){destroyErrorTooltip(self.couponInput)});$("#apply-coupon-button").click(function(){self.couponCode("");destroyErrorTooltip(self.couponInput);self.addCouponDlg&&self.addCouponDlg.modal()})}ko.components.register("apply-coupon",{template:{url:"ApplyCoupon/apply-coupon.html"},viewModel:{createViewModel:function(){return new ApplyCouponModel}}})}(jQuery,ko),function($,ko){ko.bindingHandlers.animate={update:function(element,valueAccessor){var value=valueAccessor();if(value){const uwValue=ko.unwrap(value),duration=uwValue.duration!==undefined?uwValue.duration:1e3;$(element).animate(uwValue,duration)}}}}(jQuery,ko),function($,ko){function ConfirmationDialog(){const self=this;let internalConfirmCallback;self.isShow=ko.observable(!1);self.mainText=ko.observable();self.show=function(text,confirmCallback){confirmCallback&&(internalConfirmCallback=confirmCallback);self.mainText(text);self.isShow(!0)};self.onConfirmClick=function(){self.onCloseClick();internalConfirmCallback&&internalConfirmCallback()};self.onCloseClick=function(){self.isShow(!1)};ko.postbox?ko.postbox.subscribe($.tabletopia.postbox.common.confirmation,function(data){self.show(data.text,data.onOkCallback)}):console.error(this,"Can't subscribe to ko.postbox.")}ko.components.register("confirmation-dialog",{template:{url:"Common/confirmation-dialog.html"},viewModel:{createViewModel:function(params,componentInfo){return new ConfirmationDialog(params,componentInfo)}}})}(jQuery,ko),function($,ko){ko.bindingHandlers.datepicker={init:function(element,valueAccessor,allBindingsAccessor){function setMinMaxTime(selectedDateTime,dThis){const currentDate=new Date;if(selectedDateTime.getDate()===currentDate.getDate()&&selectedDateTime.getMonth()===currentDate.getMonth())dThis.setOptions({minTime:0,defaultDate:new Date});else{const timeDiff=Math.abs(selectedDateTime.getTime()-currentDate.getTime()),diffDays=Math.ceil(timeDiff/864e5);diffDays<15&&diffDays>0?dThis.setOptions({minTime:"0:00",maxTime:"23:59"}):dThis.setOptions({minTime:"0:00",maxTime:"0:00"})}}const datepicker=allBindingsAccessor().datepicker||{},options=datepicker.options||{},show=datepicker.show||undefined,$el=$(element);let isOpen=!1,date=datepicker.date||undefined,subscription;$el.datetimepicker(options);$el.datetimepicker({onShow:function(dateTime){const dateForPicker=ko.isObservable(date)?date():date;dateTime.setTime(dateForPicker);setMinMaxTime(dateTime,this);isOpen=!0},onClose:function(){if(isOpen=!1,subscription&&show()&&(show(!1),options.onCloseDialog))options.onCloseDialog(this)},onSelectDate:function(selectedDateTime){setMinMaxTime(selectedDateTime,this)},onChangeDateTime:function(selectedDateTime){setMinMaxTime(selectedDateTime,this)},onChangeMonth:function(selectedDateTime){setMinMaxTime(selectedDateTime,this)}});show&&ko.isObservable(show)&&(subscription=show.subscribe(function(newValue){newValue?isOpen||$el.datetimepicker("show"):isOpen&&$el.datetimepicker("hide")}));ko.utils.domNodeDisposal.addDisposeCallback(element,function(){$el.datetimepicker("destroy");subscription&&subscription.dispose()})}}}(jQuery,ko),function($,ko){ko.bindingHandlers.ddslick={init:function(element,valueAccessor,allBindingsAccessor){const bindings=allBindingsAccessor().ddslick||{},options=bindings.options||{},selectedValue=bindings.selectedValue||undefined,$el=$(element);options.onSelected=function(data){selectedValue&&ko.isObservable(selectedValue)&&selectedValue(data.selectedData)};bindings.showPanel&&ko.isObservable(bindings.showPanel)&&bindings.showPanel.subscribe(function(value){value?$("#avatar-selector").ddslick("open"):$("#avatar-selector").ddslick("close")});$el.ddslick(options);ko.utils.domNodeDisposal.addDisposeCallback(element,function(){$("#avatar-selector").ddslick("destroy")})}}}(jQuery,ko),function($,ko){ko.bindingHandlers.fileupload={init:function(element,valueAccessor,allBindingsAccessor){const bindings=allBindingsAccessor().fileupload||{},options=bindings.options||{},$uploadContainer=$(element),$uploadInput=$uploadContainer.find("input[type=file]");options.dropZone=$uploadContainer;options.error=function(data){if(bindings.onError&&typeof bindings.onError=="function")bindings.onError(data)};options.progressall=function(e,data){const progress=Math.round(data.loaded/data.total*100);if(bindings.onProgress&&typeof bindings.onProgress=="function")bindings.onProgress(progress)};options.done=function(e,data){if(typeof data=="undefined"||typeof data.result=="undefined"||typeof data.result.resources=="undefined"||data.result.resources.length===0)options.error(data);else if(bindings.onDone&&typeof bindings.onDone=="function")bindings.onDone(data.result.resources)};$uploadInput.fileupload(options);ko.utils.domNodeDisposal.addDisposeCallback(element,function(){$uploadInput.fileupload("destroy")})}}}(jQuery,ko),function($,ko){ko.bindingHandlers.masked={init:function(element,valueAccessor,allBindingsAccessor){const mask=allBindingsAccessor().mask||{},placeholder=allBindingsAccessor().placeholder;placeholder?$(element).mask(mask,{placeholder:placeholder}):$(element).mask(mask);ko.utils.registerEventHandler(element,"blur",function(){let observable=valueAccessor();ko.isObservable(observable)?observable($(element).val()):observable=$(element).val()})},update:function(element,valueAccessor){const value=ko.utils.unwrapObservable(valueAccessor());$(element).val(value)}}}(jQuery,ko),function($,ko){ko.bindingHandlers.scrollTo={update:function(element,valueAccessor){const _value=valueAccessor(),_valueUnwrapped=ko.unwrap(_value);_valueUnwrapped&&element.scrollIntoView()}}}(jQuery,ko),function($,ko){ko.bindingHandlers.slide={update:function(element,valueAccessor){var value=valueAccessor();if(value){const uwValue=ko.unwrap(value),duration=uwValue.duration!==undefined?uwValue.duration:"slow";uwValue.show?$(element).slideDown(duration,uwValue.function):$(element).slideUp(duration,uwValue.function)}}}}(jQuery,ko),function($,ko){function FindPlayModel(params){const self=this;if(self.widgetMode=$.tabletopia.enums.widgetMode.widget,self.openNewTab=!1,self.filter=params.filter,self.mode=ko.observable($.tabletopia.enums.findPlayMode.playNow),self.playNowFound=ko.observable(!1),self.scheduledFound=ko.observable(!1),self.inProgressFound=ko.observable(!1),params.widgetMode!==undefined&&(self.widgetMode=params.widgetMode),self.widgetMode===$.tabletopia.enums.widgetMode.widget&&(self.openNewTab=!0),self.widgetMode===$.tabletopia.enums.widgetMode.whitelabelFindAndPlay&&(!self.filter.whitelabel||!self.filter.whitelabelEvent)){console.error("In white label mode set filter: { whitelabel, whitelabelEvent}");return}self.userProvider=typeof UserProvider!="undefined"?new UserProvider(typeof unity=="undefined"?{}:unity):undefined;const x=new Date,timeZoneOffset=-x.getTimezoneOffset()/60;self.timeZone=timeZoneOffset>=0?$.tabletopia.localization.userTimeZone.replace("{0}","+"+timeZoneOffset):$.tabletopia.localization.userTimeZone.replace("{0}",timeZoneOffset);self.isActive=function(tab){return tab===self.mode()};self.playNowHidden=ko.pureComputed(function(){return self.widgetMode===$.tabletopia.enums.widgetMode.game||self.widgetMode===$.tabletopia.enums.widgetMode.whitelabelFindAndPlay?!self.playNowFound():!1});self.componentHidden=ko.pureComputed(function(){return self.widgetMode===$.tabletopia.enums.widgetMode.game?!self.playNowFound()&&!self.scheduledFound()&&!self.inProgressFound():!1});self.timeZoneHidden=function(){return self.playNowFound()||self.scheduledFound()||self.inProgressFound()?self.mode()!==$.tabletopia.enums.findPlayMode.playLater:!0};self.showPlayNow=function(){self.mode($.tabletopia.enums.findPlayMode.playNow);ko.postbox.publish($.tabletopia.postbox.findAndPlay.tabChanged,$.tabletopia.enums.findPlayMode.playNow);self.widgetMode===$.tabletopia.enums.widgetMode.findAndPlay&&window.history.replaceState("","","/find-play")};self.showPlayLater=function(){self.mode($.tabletopia.enums.findPlayMode.playLater);ko.postbox.publish($.tabletopia.postbox.findAndPlay.tabChanged,$.tabletopia.enums.findPlayMode.playLater);self.widgetMode===$.tabletopia.enums.widgetMode.findAndPlay&&window.history.replaceState("","","/find-play#later")};self.showGamesInProgress=function(){self.mode($.tabletopia.enums.findPlayMode.gamesInProgress);ko.postbox.publish($.tabletopia.postbox.findAndPlay.tabChanged,$.tabletopia.enums.findPlayMode.gamesInProgress);self.widgetMode===$.tabletopia.enums.widgetMode.findAndPlay&&window.history.replaceState("","","/find-play#games-in-progress")}}ko.components.register("find-play",{template:{url:"FindPlay/find-play.html"},viewModel:{createViewModel:function(params,componentInfo){return new FindPlayModel(params,componentInfo)}}});$.extend(!0,$,{tabletopia:{enums:{findPlayMode:{playNow:0,playLater:1,gamesInProgress:2},widgetMode:{game:0,findAndPlay:1,widget:2,whitelabelFindAndPlay:3}}}})}(jQuery,ko),function($,ko){function GamesInProgressModel(params){function updateRooms(data,loadMore){var loadMore=loadMore||!1;if(data!==undefined&&data.rooms!==undefined){let newRoomsUrls={},roomsToDelete=[];loadMore&&self.page++;self.rooms.valueWillMutate();loadMore||data.rooms.length!==0||self.rooms.removeAll();const underlyingArray=self.rooms();if(data.rooms.forEach(function(room){room=prepareRoom(room);loadMore?underlyingArray.push(room):newRoomsUrls[room.shortUrl]=room}),Object.keys(newRoomsUrls).length>0){underlyingArray.forEach(function(room,index){const updatedRoom=newRoomsUrls[room.shortUrl];updatedRoom!==undefined?(room.wantedPlayersOb(updatedRoom.wantedPlayers),room.gameOb(updatedRoom.game),room.seatsOb(updatedRoom.seats),newRoomsUrls[updatedRoom.shortUrl]=undefined):roomsToDelete.push(index)});roomsToDelete.forEach(function(index){underlyingArray.splice(index,1)});for(newRoom in newRoomsUrls)newRoomsUrls[newRoom]!==undefined&&underlyingArray.push(newRoomsUrls[newRoom])}self.rooms.valueHasMutated();self.moreAvailable(self.rooms().length<data.totalRooms)}self.findPlay.inProgressFound(self.rooms().length>0);self.findPlay.inProgressFound()||self.findPlay.mode()!==$.tabletopia.enums.findPlayMode.gamesInProgress||self.findPlay.mode($.tabletopia.enums.findPlayMode.playNow);self.lastRequestTime=(new Date).getTime()}function prepareRoom(room){return room.wantedPlayersOb=ko.observable(room.wantedPlayers),room.gameOb=ko.observable(room.game),room.seatsOb=ko.observable(room.seats),room}function loadRooms(){if(!self.getMoreRoomsRequest.isLoading()&&!self.getRoomsRequest.isLoading()){const query={page:1};self.page=1;self.rooms().length>0&&(query.size=self.rooms().length);self.filter&&$.extend(!0,query,self.filter);self.getRoomsRequest.load(query).done(function(data){updateRooms(data)})}}const self=this;self.page=1;self.lastRequestTime=0;self.rooms=ko.observableArray();self.findPlay=params.findPlay;self.filter=self.findPlay.filter?self.findPlay.filter:{};self.moreAvailable=ko.observable(!1);self.findPlay.widgetMode===$.tabletopia.enums.widgetMode.whitelabelFindAndPlay?(self.getRoomsRequest=new $.tabletopia.get.whitelabel.findPlay.playInProgress(self.filter.whitelabel,self.filter.whitelabelEvent),self.getMoreRoomsRequest=new $.tabletopia.get.whitelabel.findPlay.playInProgress(self.filter.whitelabel,self.filter.whitelabelEvent),self.filter={}):(self.getRoomsRequest=new $.tabletopia.get.findPlay.playInProgress,self.getMoreRoomsRequest=new $.tabletopia.get.findPlay.playInProgress);self.position=ko.computed(function(){let offsetMultiplier=self.rooms().length;return offsetMultiplier===0&&(offsetMultiplier=2),{height:offsetMultiplier*150,duration:800}});self.loadMore=function(){if(!self.getMoreRoomsRequest.isLoading()){const query={page:self.page+1};self.filter&&$.extend(!0,query,self.filter);self.getMoreRoomsRequest.load(query).done(function(data){updateRooms(data,!0)})}};self.findPlay.mode.subscribe(function(newValue){newValue===$.tabletopia.enums.findPlayMode.gamesInProgress&&(new Date).getTime()-self.lastRequestTime>3e4&&loadRooms()});self.removeRoom=function(elem){$(elem).animate({opacity:.25,height:0},1e3,function(){$(elem).remove()})};self.getRoomsRequest.load(self.filter?self.filter:{}).done(function(data){updateRooms(data)})}ko.components.register("find-play-games-in-progress",{template:{url:"FindPlay/games-in-progress.html"},viewModel:{createViewModel:function(params){return new GamesInProgressModel(params)}}})}(jQuery,ko),function($,ko){function PlayLaterModel(params){function updateRooms(data,loadMore){var loadMore=loadMore||!1;if(data!==undefined&&data.rooms!==undefined){let scheduledGroup="";scheduledGroupsCount=0;self.rooms.valueWillMutate();loadMore?self.page++:self.rooms.removeAll();const underlyingArray=self.rooms();data.rooms.forEach(function(room){if(room.wantedPlayersOb=ko.observable(room.wantedPlayers),room.gameOb=ko.observable(room.game),room.seatsOb=ko.observable(room.seats),room.welcomeMessageOb=ko.observable(room.welcomeMessage),room.scheduledGroup=ko.observable(""),room.scheduledAtUtc){const scheduledAtUtc=new Date(room.scheduledAtUtc),currentScheduledGroup=scheduledAtUtc.toDateString();room.scheduledGroupCaption=ko.observable(scheduledAtUtc.toDateFormatExt());room.scheduledDateNotiUserTZ=ko.observable(scheduledAtUtc.toScheduledGameNoti())}underlyingArray.push(room)});underlyingArray.forEach(function(room){if(room.scheduledAtUtc){const currentScheduledGroup=new Date(room.scheduledAtUtc).toDateString();scheduledGroup!==currentScheduledGroup?(scheduledGroupsCount++,scheduledGroup=currentScheduledGroup,room.scheduledGroup(scheduledGroup)):room.scheduledGroup("");room.cheduledGroupNumber=scheduledGroupsCount}});self.rooms.valueHasMutated();self.moreAvailable(self.rooms().length<data.totalRooms)}self.findPlay.scheduledFound(self.rooms().length>0);self.findPlay.scheduledFound()||self.findPlay.mode()!==$.tabletopia.enums.findPlayMode.playLater||self.findPlay.mode($.tabletopia.enums.findPlayMode.playNow);self.lastRequestTime=(new Date).getTime()}function loadRooms(){if(!self.getMoreRoomsRequest.isLoading()&&!self.getRoomsRequest.isLoading()){const query={page:1};self.page=1;self.rooms().length>0&&(query.size=self.rooms().length);self.filter&&$.extend(!0,query,self.filter);self.getRoomsRequest.load(query).done(function(data){updateRooms(data)})}}const self=this;let scheduledGroupsCount=0;self.page=1;self.lastRequestTime=0;self.rooms=ko.observableArray();self.findPlay=params.findPlay;self.filter=self.findPlay.filter?self.findPlay.filter:{};self.moreAvailable=ko.observable(!1);self.findPlay.widgetMode===$.tabletopia.enums.widgetMode.whitelabelFindAndPlay?(self.getRoomsRequest=new $.tabletopia.get.whitelabel.findPlay.playLater(self.filter.whitelabel,self.filter.whitelabelEvent),self.getMoreRoomsRequest=new $.tabletopia.get.whitelabel.findPlay.playLater(self.filter.whitelabel,self.filter.whitelabelEvent),self.filter={}):(self.getRoomsRequest=new $.tabletopia.get.findPlay.playLater,self.getMoreRoomsRequest=new $.tabletopia.get.findPlay.playLater);self.position=ko.computed(function(){let offsetMultiplier=self.rooms().length;return offsetMultiplier===0&&(offsetMultiplier=2),{height:offsetMultiplier*150+scheduledGroupsCount*51,duration:800}});self.loadMore=function(){if(!self.getMoreRoomsRequest.isLoading()){const query={page:self.page+1};self.filter&&$.extend(!0,query,self.filter);self.getMoreRoomsRequest.load(query).done(function(data){updateRooms(data,!0)})}};self.findPlay.mode.subscribe(function(newValue){newValue===$.tabletopia.enums.findPlayMode.playLater&&(new Date).getTime()-self.lastRequestTime>3e4&&loadRooms()});self.removeRoom=function(elem){$(elem).animate({opacity:.25,height:0},1e3,function(){$(elem).remove()})};const query={};self.filter&&$.extend(!0,query,self.filter);self.getRoomsRequest.load(query).done(function(data){updateRooms(data)})}ko.components.register("find-play-later",{template:{url:"FindPlay/play-later.html"},viewModel:{createViewModel:function(params){return new PlayLaterModel(params)}}})}(jQuery,ko),function($,ko){function PlayNowEmptyModel(params){const self=this;self.filter={};self.openNewTab=!1;self.widgetMode=$.tabletopia.enums.widgetMode.findAndPlay;self.games=ko.observableArray();params.filter&&(self.filter=params.filter);params.widgetMode&&(self.widgetMode=params.widgetMode);params.openNewTab&&(self.openNewTab=params.openNewTab);self.widgetMode===$.tabletopia.enums.widgetMode.findAndPlay?(self.getGamesRequest=new $.tabletopia.get.findPlay.recommendedGames,self.getGamesRequest.load().done(function(data){self.games(data)})):(self.getGamesRequest=new $.tabletopia.get.findPlay.recommendedWidgetGames,self.getGamesRequest.load(self.filter).done(function(data){self.games(data)}))}ko.components.register("play-now-empty",{template:{url:"FindPlay/play-now-empty.html"},viewModel:{createViewModel:function(params){return new PlayNowEmptyModel(params)}}})}(jQuery,ko),function($,ko){function PlayNowModel(params){function updateRooms(){self.getRoomsRequest.isLoading()||(new Date).getTime()-self.lastRequestTime()<3e4||self.getRoomsRequest.load(self.filter?self.filter:{}).done(function(data){let newRoomsUrls={},roomsToDelete=[];self.rooms.valueWillMutate();const underlyingArray=self.rooms();if(data.rooms.forEach(function(room){room=prepareRoom(room);newRoomsUrls[room.shortUrl]=room}),Object.keys(newRoomsUrls).length>0){underlyingArray.forEach(function(room,index){const updatedRoom=newRoomsUrls[room.shortUrl];updatedRoom!==undefined?(room.wantedPlayersOb(updatedRoom.wantedPlayers),room.gameOb(updatedRoom.game),room.seatsOb(updatedRoom.seats),newRoomsUrls[updatedRoom.shortUrl]=undefined):roomsToDelete.push(index)});roomsToDelete.forEach(function(index){underlyingArray.splice(index,1)});for(newRoom in newRoomsUrls)newRoomsUrls[newRoom]!==undefined&&underlyingArray.push(newRoomsUrls[newRoom])}self.rooms.valueHasMutated();self.lastRequestTime((new Date).getTime());self.findPlay.playNowFound(self.rooms().length>0);self.findPlay.scheduledFound(data.scheduledFound);self.findPlay.inProgressFound(data.inProgressFound);selectTab()})}function prepareRoom(room){return room.wantedPlayersOb=ko.observable(room.wantedPlayers),room.gameOb=ko.observable(room.game),room.seatsOb=ko.observable(room.seats),room}function selectTab(){if(self.findPlay.widgetMode===$.tabletopia.enums.widgetMode.findAndPlay)(self.findPlay.scheduledFound()||self.findPlay.mode()!==$.tabletopia.enums.findPlayMode.playLater)&&(self.findPlay.inProgressFound()||self.findPlay.mode()!==$.tabletopia.enums.findPlayMode.gamesInProgress)||self.findPlay.mode($.tabletopia.enums.findPlayMode.playNow);else{let tabWithData={};if(tabWithData[$.tabletopia.enums.findPlayMode.playNow]=self.findPlay.playNowFound(),tabWithData[$.tabletopia.enums.findPlayMode.playLater]=self.findPlay.scheduledFound(),tabWithData[$.tabletopia.enums.findPlayMode.gamesInProgress]=self.findPlay.inProgressFound(),!self.findPlay.playNowFound()&&!self.findPlay.scheduledFound()&&!self.findPlay.inProgressFound()){self.findPlay.mode($.tabletopia.enums.findPlayMode.playNow);return}tabWithData[self.findPlay.mode()]||(tabWithData[$.tabletopia.enums.findPlayMode.playNow]?self.findPlay.mode($.tabletopia.enums.findPlayMode.playNow):tabWithData[$.tabletopia.enums.findPlayMode.playLater]?self.findPlay.mode($.tabletopia.enums.findPlayMode.playLater):tabWithData[$.tabletopia.enums.findPlayMode.gamesInProgress]&&self.findPlay.mode($.tabletopia.enums.findPlayMode.gamesInProgress))}}const self=this,playgroundHub=$.connection.ph;self.lastRequestTime=ko.observable(0);self.rooms=ko.observableArray();self.findPlay=params.findPlay;self.filter=self.findPlay.filter?self.findPlay.filter:{};self.findPlay.widgetMode===$.tabletopia.enums.widgetMode.whitelabelFindAndPlay?(self.getRoomsRequest=new $.tabletopia.get.whitelabel.findPlay.playNow(self.filter.whitelabel,self.filter.whitelabelEvent),self.filter={}):self.getRoomsRequest=new $.tabletopia.get.findPlay.playNow;const qs={trackedPageType:"FindAndPlay"};typeof window.user.id=="number"&&window.user.id>0&&(qs.userId=window.user.id);window.global.signalrManager.extendQueryString(qs);self.showEmptyStub=ko.pureComputed(function(){return self.lastRequestTime()===0||self.findPlay.widgetMode===$.tabletopia.enums.widgetMode.game?!1:!self.findPlay.playNowFound()});ko.postbox&&ko.postbox.subscribe($.tabletopia.postbox.findAndPlay.refreshPlayNow,function(){self.lastRequestTime(0);updateRooms()});self.position=ko.pureComputed(function(){return{height:self.rooms().length*150+200}});playgroundHub.client.addRooms=function(newRooms){typeof newRooms!="undefined"&&newRooms.length!==0&&updateRooms()};playgroundHub.client.removeRooms=function(removedRooms){if(typeof removedRooms!="undefined"&&removedRooms.length!==0){let removedRoomsUrls=[];removedRooms.forEach(function(room){const startIndex=room.indexOf("^"),endIndex=room.indexOf("-");startIndex!==-1&&endIndex!==-1&&(removedRoomsUrls[room.substr(1,endIndex-1)]=room)});self.rooms.remove(function(room){return removedRoomsUrls[room.shortUrl]!==undefined});self.findPlay.playNowFound(self.rooms().length>0);selectTab()}};self.removeRoom=function(elem){$(elem).animate({opacity:.25,height:0},1e3,function(){$(elem).remove()})};self.getRoomsRequest.load(self.filter?self.filter:{}).done(function(data){if(data.rooms.forEach(function(room){room=prepareRoom(room)}),self.rooms(data.rooms),self.lastRequestTime((new Date).getTime()),self.findPlay.playNowFound(self.rooms().length>0),self.findPlay.scheduledFound(data.scheduledFound),self.findPlay.inProgressFound(data.inProgressFound),self.findPlay.widgetMode!==$.tabletopia.enums.widgetMode.whitelabelFindAndPlay&&window.global.signalrManager.connect(),data.scheduledFound&&window.location.href.indexOf("#later")!==-1){self.findPlay.mode($.tabletopia.enums.findPlayMode.playLater);return}if(data.inProgressFound&&window.location.href.indexOf("#games-in-progress")!==-1){self.findPlay.mode($.tabletopia.enums.findPlayMode.gamesInProgress);return}selectTab()})}ko.components.register("find-play-now",{template:{url:"FindPlay/play-now.html"},viewModel:{createViewModel:function(params){return new PlayNowModel(params)}}})}(jQuery,ko),function($,ko){function RoomsModel(params){const self=this,roomElementHeight=150,groupElementHeight=51;self.model=params.model;self.widgetMode=params.model.widgetMode;self.userProvider=params.model.userProvider;self.openNewTab=params.model.openNewTab;$.extend(!0,self,params.model.room);self.order=params.model.order;self.showScheduledGroup=ko.pureComputed(function(){return self.scheduledGroup()?!0:!1});self.gameTime=ko.pureComputed(function(){const createdAt=new Date(self.createdAtUtc),dateText=createdAt.toRelativeDate();switch(self.model.mode){case $.tabletopia.enums.findPlayMode.gamesInProgress:return $.tabletopia.localization.startedAt+" "+dateText;case $.tabletopia.enums.findPlayMode.playNow:return $.tabletopia.localization.createdTime.toLowerCase()+" "+dateText;case $.tabletopia.enums.findPlayMode.playLater:let scheduledDate=new Date(self.scheduledAtUtc);return scheduledDate.toLocaleTimeString(navigator.language,{hour:"2-digit",minute:"2-digit"})}});self.playerStatus=function(player){return self.model.mode===$.tabletopia.enums.findPlayMode.gamesInProgress?player.online?$.tabletopia.localization.inGame:$.tabletopia.localization.offline:player.online?$.tabletopia.localization.online:$.tabletopia.localization.offline};self.playerName=function(player){return self.host.id===player.id?player.displayName+" (Host)":player.displayName};self.seatClass=ko.pureComputed(function(){let elementsCount=self.seatsOb().length-self.wantedPlayersOb();return self.wantedPlayersOb()>0&&elementsCount++,self.widgetMode===$.tabletopia.enums.widgetMode.findAndPlay?elementsCount<4?"big-3":elementsCount<5?"big-4":"big-8":elementsCount<4?"small-3":"small-8"});self.animatePosition=ko.pureComputed(function(){const top=self.order()*roomElementHeight,offset=self.cheduledGroupNumber?self.cheduledGroupNumber*groupElementHeight:0;return{top:offset?top+offset:top,height:offset?roomElementHeight+offset:roomElementHeight}});self.animateGroupPosition=ko.pureComputed(function(){const top=self.order()*roomElementHeight,offset=self.cheduledGroupNumber?(self.cheduledGroupNumber-1)*groupElementHeight:0;return{top:top+offset}});self.statusText=ko.pureComputed(function(){return self.model.mode===$.tabletopia.enums.findPlayMode.gamesInProgress?$.tabletopia.localization.roomStatusGameInProgress:$.tabletopia.localization.roomStatusLookingForPlayers});self.lobbyUrl=ko.pureComputed(function(){switch(self.widgetMode){case $.tabletopia.enums.widgetMode.findAndPlay:return"/players/"+self.host.shortUrl+"/"+self.shortUrl;case $.tabletopia.enums.widgetMode.whitelabelFindAndPlay:return window.location.href+"/"+self.shortUrl;default:return"/players/"+self.host.shortUrl+"/"+self.shortUrl}});self.showUserInfo=function(currentPlayer){currentPlayer&&self.userProvider&&self.model.userProvider.openUserPreview(currentPlayer.shortUrl,"Find-Play","OnlinePlayers")}}ko.components.register("find-play-room",{template:{url:"FindPlay/room.html"},viewModel:{createViewModel:function(params,componentInfo){return new RoomsModel(params,componentInfo)}}})}(jQuery,ko),function($,ko){function GameShortModel(params){const self=this;self.model=params.model.game;self.openNewTab=params.model.openNewTab;self.catalogItemClass="carousel__item";params.model.catalogItemClass&&(self.catalogItemClass=params.model.catalogItemClass);self.catalogItemClass+=" item game-short-item";self.url="/games/"+self.model.shortUrl;self.isTryNowAvailable=(!window.user.isAuthenticated||window.user.isDemoUser)&&self.model.createRoomAccessGroup==="Everyone"&&self.model.hasOnlyPremiumSetups;self.isPremiumAvailable=self.model.hasOnlyPremiumSetups&&window.user.isAuthenticated&&!window.user.isDemoUser;self.isDlcAvailable=self.model.isDlc&&!self.model.inLibrary&&window.user.isInSteamBrowser;self.isLanguageAvailable=self.model.languages&&self.model.languages.length>0&&(self.model.languages.length>1||self.model.languages[0]!=="ind")}ko.components.register("game-short",{template:{url:"Games/game-short.html"},viewModel:{createViewModel:function(params){return new GameShortModel(params)}}})}(jQuery,ko),function($,ko){function AuthenticationDialog(params){function updateCookie(){self.isShow()&&(document.cookie=window.cookie.demoZoneCookieName+"="+self.redirectUrl+"; path=/; secure; SameSite=Lax")}function setupAvatars(obj){var number,avatarUrl;if(obj.selectedAvatar=ko.observable(),avatarUrls=window.user.avatarUrls,!avatarUrls)for(let i=1;i<83;i++){for(number=String(i);number.length<2;)number="0"+number;avatarUrl="/DefaultResources/DemoZone/Avatars/Default_Avatar_256х256-"+number+".png";avatarUrls.push(avatarUrl)}if(obj.avatars=avatarUrls.map(function(avatarUrl){return{selected:!1,avatarUrl:avatarUrl,imageSrc:avatarUrl+window.urls.authDialogAvatarQuery}}),window.user&&window.user.id!==0&&window.user.avatarUrl)obj.avatars.push({selected:!0,avatarUrl:window.user.avatarUrl,imageSrc:window.user.avatarUrl+window.urls.authDialogAvatarQuery});else{const selectedAvatarIndex=randomInteger(0,self.avatars.length-1);obj.avatars[selectedAvatarIndex].selected=!0;obj.selectedAvatar(obj.avatars[selectedAvatarIndex])}}function randomInteger(min,max){let rand=min+Math.random()*(max+1-min);return Math.floor(rand)}const self=this;self.roomShortUrl=params.roomShortUrl;self.isShow=ko.observable(!1);self.showPanel=ko.observable(!1);self.canClose=ko.observable(params.canClose!==undefined?params.canClose:!0);self.isShowPromo=ko.observable(params.showPromo!==undefined?params.showPromo:!0);self.isLoginButtonDisabled=ko.observable(!0);self.isUserNameFocused=ko.observable(!0);self.displayName=ko.observable();self.registerUserRequest=new $.tabletopia.post.playground.registerUser;self.redirectUrl=params.redirectUrl;self.redirectUrl||(self.redirectUrl=window.location.pathname);setupAvatars(self);ko.postbox.subscribe($.tabletopia.postbox.common.authenticationDialogShow,function(newValue){self.isShow(newValue)},this,!0);self.onLoginClick=function(){const name=self.displayName().trim();if(!name||self.isLoginButtonDisabled()||!self.selectedAvatar().avatarUrl){self.isUserNameFocused(!0);return}self.isLoginButtonDisabled(!0);const user={roomShortUrl:self.roomShortUrl,displayName:name,avatarUrl:self.selectedAvatar().avatarUrl};self.registerUserRequest.load({user:user}).then(function(data){if(!data){self.onSuccess!=null?self.onSuccess():window.location.href=self.redirectUrl;return}self.isShow(!1);self.isLoginButtonDisabled(!1)},function(){$("#error-dlg").modal();self.isLoginButtonDisabled(!1)})};self.onShowPanelClick=function(){self.showPanel()?self.showPanel(!1):self.showPanel(!0)};self.onCloseClick=function(){self.canClose()&&(self.isShow(!1),self.isLoginButtonDisabled(!1),self.isUserNameFocused(!0))};updateCookie();self.isShow.subscribe(function(){updateCookie()});self.onUserNameFocusout=function(){self.isUserNameFocused(!1)};self.displayName.subscribe(function(newValue){const name=newValue.trim();name?self.isLoginButtonDisabled(!1):self.isLoginButtonDisabled(!0)})}ko.components.register("authentication-dialog",{template:{url:"Lobby/Authentication/authentication-dialog.html"},viewModel:{createViewModel:function(params,componentInfo){return new AuthenticationDialog(params,componentInfo)}}})}(jQuery,ko),function($,ko){function SessionsDialog(params){function loadManager(roomShortUrl,zoneShortUrl){sessionsManagerRequest.isLoading()||sessionsManagerRequest.load({roomShortUrl:roomShortUrl,zoneShortUrl:zoneShortUrl}).then(function(response){self.isShow(!0);showManager(response)},function(){$("#error-dlg").modal()})}function showManager(html){if(html){const $dlg=$(html);$dlg.on("hide.bs.modal",function(){self.isShow(!1)});window.global.app.modalCarousel($dlg.find(".carousel"));window.global.activeRooms.add($dlg);const $continueBtn=$("#continue-btn",$dlg),$cancelBtn=$("#cancel-btn",$dlg);$continueBtn.removeClass("disabled");self.redirectUrl?$continueBtn.attr("href",self.redirectUrl):($continueBtn.hide(),$cancelBtn.attr("href",""),$cancelBtn.click(function(e){e.preventDefault();$dlg.modal("hide")}));$("#player-join-seat-btn",$dlg).removeClass("hidden");$("#sessions-dialog-placeholder").empty().append($dlg);window.global.app.initGetPremium();window.dataLayer.push({lobbies_open:$(".carousel__item",$dlg).length,event:"modal_window__max_lobbies_reached"});$dlg.modal({keyboard:!1,backdrop:"static"})}}const self=this;self.isShow=ko.observable(!1);self.redirectUrl=params.redirectUrl;const sessionsManagerRequest=new $.tabletopia.get.playground.sessionsManager;ko.postbox.subscribe($.tabletopia.postbox.common.sessionsManagerDialogShow,function(newValue){newValue&&loadManager(newValue.roomShortUrl,newValue.zoneShortUrl)},this,!0)}ko.components.register("sessions-dialog",{template:{url:"Lobby/Sessions/sessions-dialog.html"},viewModel:{createViewModel:function(params,componentInfo){return new SessionsDialog(params,componentInfo)}}})}(jQuery,ko),function($,ko){function GameChangeDialog(params){function changeGame(gameShortUrl){self.changeGameRequest.isLoading()||(self.isShowChangeGameDialog(!1),self.isShowConfirmDialog(!1),self.changeGameRequest.load({gameShortUrl:gameShortUrl}).then(function(response){response.result||processResponse(response,function(){changeGame(gameShortUrl)})},function(){$("#error-dlg").modal()}))}function changeSetup(setupId,completeCallback){self.changeSetupRequest.isLoading()||(self.lobby.isSetupLoaderHidden(!1),self.isShowConfirmDialog(!1),self.changeSetupRequest.load({setupId:setupId}).then(function(response){if(response.result){self.lobby.isSetupLoaderHidden(!0);typeof completeCallback=="function"&&completeCallback();return}processResponse(response,function(){changeSetup(setupId,completeCallback)})},function(){self.lobby.isSetupLoaderHidden(!0);$("#error-dlg").modal()}))}function processResponse(response){if(typeof response=="object")switch(response.reason){case"PremiumSetupNotAvailable":ko.postbox.publish($.tabletopia.postbox.subscriptions.show,{buySuccessUrl:window.location.origin+window.location.pathname});break;case"NotAvailableForDemoUsers":self.lobby.accessDeniedDialogShow(!0)}}const self=this;self.lobby=params.lobby;self.isWhitelabelMode=ko.observable(self.lobby.isWhitelabelMode);self.isShowChangeGameDialog=ko.observable(!1);self.isShowConfirmDialog=ko.observable(!1);self.isSearchMode=ko.observable(!1);self.isInputFocused=ko.observable(!1);self.searchText=ko.observable("");self.recentGames=ko.observableArray();self.searchGames=ko.observableArray();self.searchText.extend({rateLimit:{timeout:250,method:"notifyWhenChangesStop"}});self.isWhitelabelMode()?(self.getGamesRequest=new $.tabletopia.get.whitelabel.room.searchGames(self.lobby.whitelabel,self.lobby.whitelabelEvent),self.changeGameRequest=new $.tabletopia.post.whitelabel.room.game.change(self.lobby.whitelabel,self.lobby.whitelabelEvent,self.lobby.roomShortUrl)):(self.getGamesRequest=new $.tabletopia.get.playground.searchGames,self.changeGameRequest=new $.tabletopia.post.playground.game.change(self.lobby.roomShortUrl));self.changeSetupRequest=new $.tabletopia.post.playground.setup.change(self.lobby.roomShortUrl);ko.postbox.subscribe($.tabletopia.postbox.playground.changeSetupDialogShow,function(newValue){typeof newValue=="object"&&newValue.show?newValue.show&&newValue.setupId>0&&(self.lobby.partyStatus===$.tabletopia.enums.gamePartyStatus.frozen||self.lobby.partyStatus===$.tabletopia.enums.gamePartyStatus.playing?(self.onConfirmYesClick=function(){changeSetup(newValue.setupId,newValue.completeCallback)},self.isShowConfirmDialog(!0)):changeSetup(newValue.setupId,newValue.completeCallback)):self.isShowConfirmDialog(!1)});ko.postbox.subscribe($.tabletopia.postbox.playground.changeGameDialogShow,function(newValue){if(newValue){self.isSearchMode(!1);self.isInputFocused(!0);self.searchGames();self.searchText("");self.recentGames([]);const query={gameShortUrl:self.lobby.game().shortUrl};self.getGamesRequest.load(query).then(function(data){data&&data.result&&self.recentGames(data.result)});self.isShowChangeGameDialog(!0)}else self.isShowChangeGameDialog(!1)});self.animateShow=function(){return self.isShowChangeGameDialog()?{top:"0",duration:500}:{top:"-100%"}};self.onSwitchClick=function(data){data&&data.shortUrl&&(self.lobby.partyStatus===$.tabletopia.enums.gamePartyStatus.frozen||self.lobby.partyStatus===$.tabletopia.enums.gamePartyStatus.playing?(self.onConfirmYesClick=function(){changeGame(data.shortUrl)},self.isShowConfirmDialog(!0)):changeGame(data.shortUrl))};self.searchText.subscribe(function(newValue){const text=newValue.trim();self.getGamesRequest.isLoading()||(text?(self.isSearchMode(!0),self.getGamesRequest.load({gameShortUrl:self.lobby.game().shortUrl,searchText:text}).then(function(data){data&&data.result&&self.searchGames(data.result)})):(self.isSearchMode(!1),self.searchGames()))});self.onClearTextClick=function(){self.isInputFocused(!1);self.searchText("");self.isInputFocused(!0)}}ko.components.register("game-change-dialog",{template:{url:"Lobby/Whitelabel/game-change-dialog.html"},viewModel:{createViewModel:function(params,componentInfo){return new GameChangeDialog(params,componentInfo)}}})}(jQuery,ko),function($,ko){function RoomCreator(params){function checkRoom(roomShortUrl,playMode){!self.checkRoomRequest.isLoading()&&roomShortUrl&&(self.checkRoomRequest.setUrl($.tabletopia.routes.playground.api("rooms",roomShortUrl,"isExists")),self.checkRoomRequest.load().then(function(response){if(exists=response.exists,exists)switch(playMode){case"Online":window.location.href=window.urls.playGame.replace("ROOM-SHORT-URL",roomShortUrl);break;case"Solo":case"HotSeat":window.location.href=window.urls.playGame}else setTimeout(function(){checkRoom(roomShortUrl)},1e3)}))}const self=this;if(params&&params.createRoom){let exists=!1;self.showRoomStub=ko.observable(!1);self.roomStubMode=ko.observable();self.roomShortUrl="";self.userShortUrl="";self.zone=ko.observable();const roomParams=params.createRoom,isWhitelabelMode=roomParams.whitelabel&&roomParams.whitelabelEvent;self.createRoomRequest=isWhitelabelMode?new $.tabletopia.post.whitelabel.room.create(roomParams.whitelabel,roomParams.whitelabelEvent):new $.tabletopia.post.playground.create(roomParams.zoneShortUrl);self.checkRoomRequest=new $.tabletopia.get.playground.roomExists;self.redirectUrl=window.location.pathname;window.global.app.settings.loadPlayingNowRoomsCount=!1;const stateObj={foo:"create"};if(document.referrer&&document.referrer.indexOf(location.protocol+"//"+location.host)===0)history.replaceState(stateObj,"",document.referrer);else{var domain=window.location.protocol+"//"+window.location.hostname;window.location.hostname==="localhost"&&(domain+=":"+window.location.port);history.replaceState(stateObj,"",domain)}const query=isWhitelabelMode?{}:roomParams;self.createRoomRequest.load(query).then(function(response){switch(response.result.status){case"Success":self.roomShortUrl=response.result.roomShortUrl;checkRoom(response.result.roomShortUrl,response.result.playMode);break;case"Unauthenticated":case"SubscriptionNotAvailableForDemoUsers":self.roomStubMode($.tabletopia.enums.roomStubMode.unauthenticated);self.zone(response.zone);self.showRoomStub(!0);break;case"SubscriptionMaxGameSessions":self.roomStubMode($.tabletopia.enums.roomStubMode.subscriptionMaxGameSessions);self.zone(response.zone);self.showRoomStub(!0);break;case"SubscriptionPremiumSetupNotAvailable":self.roomStubMode($.tabletopia.enums.roomStubMode.subscriptionPremiumSetupNotAvailable);self.zone(response.zone);self.showRoomStub(!0);break;case"CanNotCreateRoom":self.roomStubMode($.tabletopia.enums.roomStubMode.canNotCreateRoom);self.zone(response.zone);self.showRoomStub(!0);break;default:window.location.href=window.urls.playgroundErrors}},function(){window.location.href=window.urls.playgroundErrors})}}ko.components.register("room-creator",{template:{url:"Lobby/Whitelabel/room-creator.html"},viewModel:{createViewModel:function(params,componentInfo){return new RoomCreator(params,componentInfo)}}})}(jQuery,ko),function($,ko){function RoomLobbyWhitelabel(params){function initAskUserEmail(){!window.user.email&&self.isCurrentUserHost()&&window.global.app.showAskUserEmail()}function initAddToCalendar(){if(!window.addtocalendar||typeof window.addtocalendar.start!="function"){const customTz=[{tz:-11,tzStr:"Pacific/Midway"},{tz:-10,tzStr:"America/Adak"},{tz:-10,tzStr:"Pacific/Tahiti"},{tz:-9.5,tzStr:"Pacific/Marquesas"},{tz:-9,tzStr:"Pacific/Gambier"},{tz:-8,tzStr:"Pacific/Pitcairn"},{tz:-7,tzStr:"America/Yellowknife"},{tz:-6,tzStr:"Pacific/Galapagos"},{tz:-5,tzStr:"Pacific/Easter"},{tz:-4.5,tzStr:"America/Caracas"},{tz:-4,tzStr:"Atlantic/Bermuda"},{tz:-3.5,tzStr:"America/St_Johns"},{tz:-3,tzStr:"Atlantic/Stanley"},{tz:-2,tzStr:"Atlantic/South_Georgia"},{tz:-1,tzStr:"Atlantic/Cape_Verde"},{tz:0,tzStr:"Europe/London"},{tz:1,tzStr:"Europe/Zurich"},{tz:2,tzStr:"Europe/Zaporozhye"},{tz:3,tzStr:"Indian/Mayotte"},{tz:3.5,tzStr:"Asia/Tehran"},{tz:4,tzStr:"Indian/Reunion"},{tz:4.5,tzStr:"Asia/Kabul"},{tz:5,tzStr:"Indian/Maldives"},{tz:5.5,tzStr:"Asia/Colombo"},{tz:5.75,tzStr:"Asia/Kathmandu"},{tz:6,tzStr:"Indian/Chagos"},{tz:6.5,tzStr:"Asia/Yangon"},{tz:7,tzStr:"Indian/Christmas"},{tz:8,tzStr:"Australia/Perth"},{tz:8.75,tzStr:"Australia/Eucla"},{tz:9,tzStr:"Pacific/Palau"},{tz:9.5,tzStr:"Australia/Darwin"},{tz:10,tzStr:"Pacific/Saipan"},{tz:10.5,tzStr:"Australia/Adelaide"},{tz:11,tzStr:"Pacific/Pohnpei"},{tz:11.5,tzStr:"Pacific/Norfolk"},{tz:12,tzStr:"Pacific/Wallis"},{tz:13,tzStr:"Pacific/Tongatapu"},{tz:13.75,tzStr:"Pacific/Chatham"},{tz:14,tzStr:"Pacific/Apia"}].filter(function(e){return e.tz===currentTimeZoneHours});self.atcTimeZone(customTz[0].tzStr);const d=document,s=d.createElement("script");s.type="text/javascript";s.charset="UTF-8";s.async=!0;s.src=("https:"===window.location.protocol?"https":"http")+"://addtocalendar.com/atc/1.5/atc.min.js";const h=d["getElementsByTagName"]("body")[0];h.appendChild(s)}}function initFacebook(){const id="facebook-jssdk",script="script";if(window.user.isInSteamBrowser!==1&&!document.getElementById(id)){let js,fjs=document.getElementsByTagName(script)[0];js=document.createElement(script);js.id=id;js.src="//connect.facebook.net/en_US/sdk.js#xfbml=1&version=v2.6";fjs.parentNode.insertBefore(js,fjs)}}function selectMainButtonType(partyStatus){if(self.isCurrentUserHost()){if(partyStatus!==$.tabletopia.enums.gamePartyStatus.readyCheck&&self.readyCheck.isTimeActive)return self.buttonTypeEnum.starting;if((partyStatus===$.tabletopia.enums.gamePartyStatus.unknown||partyStatus===$.tabletopia.enums.gamePartyStatus.awaiting)&&self.currentSetup().playersMin>self.busySeatsCount())return self.buttonTypeEnum.incomplete;if((partyStatus===$.tabletopia.enums.gamePartyStatus.unknown||partyStatus===$.tabletopia.enums.gamePartyStatus.awaiting)&&self.currentSetup().playersMin<=self.busySeatsCount())return self.buttonTypeEnum.start;if(partyStatus===$.tabletopia.enums.gamePartyStatus.readyCheck)return self.buttonTypeEnum.startNow;if(partyStatus===$.tabletopia.enums.gamePartyStatus.playing||partyStatus===$.tabletopia.enums.gamePartyStatus.frozen)return self.buttonTypeEnum.hostContinue}else{if(!self.isCurrentUserOnSeat()&&(partyStatus===$.tabletopia.enums.gamePartyStatus.playing||partyStatus===$.tabletopia.enums.gamePartyStatus.awaiting)&&self.seats().length-self.busySeatsCount()>0)return self.buttonTypeEnum.join;if(self.isCurrentUserOnSeat()&&(partyStatus===$.tabletopia.enums.gamePartyStatus.unknown||partyStatus===$.tabletopia.enums.gamePartyStatus.awaiting||partyStatus===$.tabletopia.enums.gamePartyStatus.readyCheck&&self.isCurrentUserReady()))return self.buttonTypeEnum.leave;if(self.isCurrentUserOnSeat()&&partyStatus===$.tabletopia.enums.gamePartyStatus.readyCheck&&!self.isCurrentUserReady())return self.buttonTypeEnum.ready;if(self.isCurrentUserOnSeat()&&(partyStatus===$.tabletopia.enums.gamePartyStatus.playing||partyStatus===$.tabletopia.enums.gamePartyStatus.frozen))return self.buttonTypeEnum.playerContinue;if(!self.isCurrentUserOnSeat()&&partyStatus===$.tabletopia.enums.gamePartyStatus.playing)return self.buttonTypeEnum.watch}if(partyStatus===$.tabletopia.enums.gamePartyStatus.scoring||partyStatus===$.tabletopia.enums.gamePartyStatus.finished)return self.buttonTypeEnum.result}function selectSecondButtonType(partyStatus){switch(self.mainButtonType()){case self.buttonTypeEnum.startNow:if(self.isCurrentUserHost()&&partyStatus==$.tabletopia.enums.gamePartyStatus.readyCheck)return self.buttonTypeEnum.readyCheckCancel;break;case self.buttonTypeEnum.join:if(!self.isCurrentUserOnSeat()&&partyStatus===$.tabletopia.enums.gamePartyStatus.playing)return self.buttonTypeEnum.watch;case self.buttonTypeEnum.ready:case self.buttonTypeEnum.playerContinue:if(!self.isCurrentUserHost()&&self.isCurrentUserOnSeat()&&(partyStatus==$.tabletopia.enums.gamePartyStatus.readyCheck&&!self.isCurrentUserReady()||partyStatus==$.tabletopia.enums.gamePartyStatus.playing||partyStatus==$.tabletopia.enums.gamePartyStatus.frozen||partyStatus==$.tabletopia.enums.gamePartyStatus.scoring||partyStatus==$.tabletopia.enums.gamePartyStatus.finished))return self.buttonTypeEnum.leave}return undefined}function copyToClipboard(text){window.user.isInSteamBrowser===1&&text&&unity&&typeof unity.sendMessage=="function"&&unity.sendMessage("CopyToClipboard",{data:text})}function setupSort(s1,s2){const s1PlayersMin=s1.playersMin,s1PlayersMax=s1.playersMax,s2PlayersMin=s2.playersMin,s2PlayersMax=s2.playersMax;return s1PlayersMin<s2PlayersMin?1:s1PlayersMin>s2PlayersMin?-1:s1PlayersMax<s2PlayersMax?-1:s1PlayersMax>s2PlayersMax?1:0}function buttonText(buttonType,text){switch(buttonType){case self.buttonTypeEnum.watch:return $.tabletopia.localization.watch;case self.buttonTypeEnum.leave:return $.tabletopia.localization.leave;case self.buttonTypeEnum.result:return $.tabletopia.localization.watchResults;case self.buttonTypeEnum.startNow:return $.tabletopia.localization.startNow;case self.buttonTypeEnum.start:case self.buttonTypeEnum.incomplete:return $.tabletopia.localization.start;case self.buttonTypeEnum.starting:return $.tabletopia.localization.starting+"...";case self.buttonTypeEnum.playerContinue:case self.buttonTypeEnum.hostContinue:return $.tabletopia.localization.continue;case self.buttonTypeEnum.join:return $.tabletopia.localization.join;case self.buttonTypeEnum.ready:return $.tabletopia.localization.ready;case self.buttonTypeEnum.readyCheckCancel:return text?$.tabletopia.localization.cancel+" ("+text+")":$.tabletopia.localization.cancel}return""}function getUrlDomain(url){const tmp=document.createElement("a");return tmp.href=url,tmp.hostname}const self=this;self.buttonTypeEnum={watch:0,leave:1,result:2,startNow:3,incomplete:4,hostContinue:6,join:7,ready:8,playerContinue:9,start:10,readyCheckCancel:11,starting:12};self.roomShortUrl=params.roomShortUrl;self.zoneShortUrl=undefined;self.whitelabel=params.whitelabel;self.whitelabelEvent=params.whitelabelEvent;self.isWhitelabelMode=!!(self.whitelabel&&self.whitelabelEvent);self.isSetupLoaderHidden=ko.observable(!0);self.gameZone=ko.observable();self.roomDataLoaded=ko.observable(!1);self.partyModificationTimeText=ko.observable("");self.welcomeMessage=ko.observable("");self.scheduledGameDate=ko.observable();self.isCurrentUserOnSeat=ko.observable(!1);self.isCurrentUserHost=ko.observable(!1);self.isCurrentUserReady=ko.observable(!1);self.currentSeatColor=ko.observable();self.partyStatus=ko.observable();self.isMobile=ko.observable(!1);self.game=ko.observable();self.currentSetup=ko.observable();self.alternativeSetup=ko.observable();self.tableSettings=ko.observable();self.tableAccessType=ko.observable();self.seats=ko.observableArray();self.spectators=ko.observableArray();self.leaveGameDialogShow=ko.observable(!1);self.abandonGameDialogShow=ko.observable(!1);self.notAvailableSteamDialogShow=ko.observable(!1);self.accessDeniedDialogShow=ko.observable(!1);self.userStorageErrorDialogShow=ko.observable(!1);self.autoPlayFailedDialogShow=ko.observable(!1);const currentDate=new Date,currentTimeZoneHours=currentDate.getTimezoneOffset()/-60;self.atcTimeZone=ko.observable();BrowserDetect.init();self.isMacOs=BrowserDetect.macOs;self.isUnsupportedSystem=!BrowserDetect.isSupportedSystem;self.showAddToCalendar=!(self.isMacOs&&window.user.isInSteamBrowser===1);self.readyCheck=new ReadyCheck(self);self.signalR=new LobbySignalR(self);self.getInvitationsRequest=new $.tabletopia.get.playground.invitations;self.playRequest=new $.tabletopia.post.playground.game.playNow(self.roomShortUrl);self.getRoomRequest=self.isWhitelabelMode?new $.tabletopia.get.whitelabel.room.room(self.whitelabel,self.whitelabelEvent,self.roomShortUrl):new $.tabletopia.get.playground.room(self.roomShortUrl);self.deleteRoomRequest=new $.tabletopia.delete.playground.room(self.roomShortUrl);ko.postbox.publish($.tabletopia.postbox.room.shortUrl,self.roomShortUrl);self.userProvider=typeof UserProvider!="undefined"?new UserProvider(typeof unity=="undefined"?{}:unity):undefined;const clipboard=new Clipboard("#copy-room-number-btn, #copy-url-btn",{text:function(trigger){return trigger.id==="copy-url-btn"?window.location:trigger.id==="copy-room-number-btn"?"#"+self.roomShortUrl.toUpperCase():void 0}});clipboard.on("error",function(){const $copyFallbackValue=$("#copy-fallback-value");$copyFallbackValue.tooltip({placement:"top",trigger:"manual",title:$.tabletopia.localization.operationFailed,container:$copyFallbackValue.parent()});$copyFallbackValue.tooltip("show")});ko.postbox.subscribe($.tabletopia.postbox.common.userDataReady,function(){self.getRoomRequest.load().then(function(response){typeof response!="object"||response.result.result?typeof response=="object"&&response.zone&&response.result.result&&(self.gameZone(response.zone),initFacebook(),self.roomDataLoaded(!0)):(self.gameZone(response.zone),self.roomDataLoaded(!0),response.result.reason==="NotAvailableForDemoUsers"||response.result.reason==="PremiumSetupNotAvailable"||response.result.reason==="UnauthenticatedException"?self.accessDeniedDialogShow(!0):response.result.reason==="AllowedForDemoUser"?ko.postbox.publish($.tabletopia.postbox.common.authenticationDialogShow,!0):response.result.reason==="NotAvailable"&&self.notAvailableSteamDialogShow(!0))},function(){$("#error-dlg").modal()})},this,!0);self.gameZone.subscribe(function(newValue){if(self.zoneShortUrl=newValue.shortUrl,self.game(newValue.game),newValue.room){ko.postbox.publish($.tabletopia.postbox.room.creatorShortUrl,newValue.room.creatorShortUrl);self.seats(newValue.room.table.seats);const seats=self.seats();for(let seat in seats){const value=seats[seat];value.readyCheckStatusOb=ko.observable(value.readyCheckStatus);value.user&&(value.user.isOnlineOb=ko.observable(value.user.isOnline))}self.welcomeMessage(newValue.room.table.welcomeMessage);newValue.room.scheduledGameDateUtc&&self.scheduledGameDate(new Date(newValue.room.scheduledGameDateUtc));self.currentSetup(newValue.room.table.setup);self.isMobile(newValue.room.table.setup.isMobile);self.isCurrentUserHost(newValue.room.table.isCurrentUserHost);self.isCurrentUserOnSeat(newValue.room.table.isCurrentUserOnSeat);self.isCurrentUserReady(newValue.room.table.isCurrentUserReady);self.tableAccessType(newValue.room.table.accessType);self.tableSettings(newValue.room.table.settings);self.partyStatus(newValue.room.table.partyStatus);newValue.room.table.partyStatus===$.tabletopia.enums.gamePartyStatus.readyCheck&&self.isCurrentUserHost()&&self.readyCheck.initTimer();self.partyModificationTimeText(new Date(newValue.room.table.partyModificationTime).toRelativeDate());self.alternativeSetup(self.getAlternativeSetup(self.game().setups));self.settingsLanguages=self.getSettingsLanguages(newValue);self.signalR.initSignalR(newValue.room.table.id);initAskUserEmail()}else self.isMobile(!1),self.isCurrentUserHost(!1),self.isCurrentUserOnSeat(!1),self.isCurrentUserReady(!1),self.gameZone().room={},self.gameZone().room.type===$.tabletopia.enums.roomType.basic,self.gameZone().room.table={},self.tableSettings({allowInvitePlayers:!1,languageIds:[],userSkillType:$.tabletopia.enums.userSkillType.any,useVoiceChat:$.tabletopia.enums.voiceChatType.any}),self.partyStatus($.tabletopia.enums.gamePartyStatus.unknown),self.currentSetup({title:""}),self.settingsLanguages=[]});self.onMainButtonClick=function(){if(!self.isUnsupportedSystem||self.mainButtonType()===self.buttonTypeEnum.leave)switch(self.mainButtonType()){case self.buttonTypeEnum.join:ko.postbox.publish($.tabletopia.postbox.room.joinSeat);break;case self.buttonTypeEnum.leave:self.onPlayerLeaveButtonClick();break;case self.buttonTypeEnum.start:self.readyCheck.start();break;case self.buttonTypeEnum.ready:self.readyCheck.ready();break;case self.buttonTypeEnum.incomplete:self.alternativeSetup()||self.readyCheck.start();break;case self.buttonTypeEnum.watch:case self.buttonTypeEnum.hostContinue:case self.buttonTypeEnum.playerContinue:self.playNow();break;case self.buttonTypeEnum.startNow:self.playNow(!1);break;case self.buttonTypeEnum.result:window.user.id===0?ko.postbox.publish($.tabletopia.postbox.common.authenticationDialogShow,!0):self.playNow()}};self.onSecondButtonClick=function(){if(!self.isUnsupportedSystem||self.secondButtonType()===self.buttonTypeEnum.leave||self.secondButtonType()===self.buttonTypeEnum.readyCheckCancel)switch(self.secondButtonType()){case self.buttonTypeEnum.join:ko.postbox.publish($.tabletopia.postbox.room.joinSeat);break;case self.buttonTypeEnum.leave:self.onPlayerLeaveButtonClick();break;case self.buttonTypeEnum.readyCheckCancel:self.readyCheck.cancel();break;case self.buttonTypeEnum.watch:self.playNow()}};self.onContinueAnywayWithSetup=function(){self.readyCheck.start()};self.onContinueWithChangeSetup=function(){ko.postbox.publish($.tabletopia.postbox.playground.changeSetupDialogShow,{show:!0,setupId:self.alternativeSetup().publicId,completeCallback:function(){self.readyCheck.start()}})};self.onPlayerLeaveButtonClick=function(){self.isCurrentUserHost()||self.leaveGameDialogShow(!0)};self.onChangeGameClick=function(){ko.postbox.publish($.tabletopia.postbox.playground.changeGameDialogShow,!0)};self.onChangeSetupClick=function(data){ko.postbox.publish($.tabletopia.postbox.playground.changeSetupDialogShow,{show:!0,setupId:data.publicId})};self.onInvitePlayersClick=function(){self.isCurrentUserHost()&&(!self.tableSettings.allowInvitePlayers||self.isCurrentUserOnSeat())&&self.getInvitationsRequest.load({roomShortUrl:self.roomShortUrl,gamePublicId:self.game().publicId,tableId:self.gameZone().room.table.id}).then(function(data){const invitationsManager=new InvitationsManager(data,"#invitations-manager-placeholder",self.roomShortUrl);invitationsManager.show()},function(){$("#error-dlg").modal()})};self.onCopyUrlButtonClick=function(){copyToClipboard(window.location)};self.onCopyRoomButtonClick=function(){copyToClipboard("#"+self.roomShortUrl.toUpperCase())};self.onLeaveDialogOkButtonClick=function(){self.leaveGameDialogShow(!1);ko.postbox.publish($.tabletopia.postbox.room.leaveSeat,window.user.id)};self.onAbandonDialogOkButtonClick=function(){(self.abandonGameDialogShow(!1),self.deleteRoomRequest.isLoading())||(self.isCurrentUserHost()||window.user.isAdmin)&&self.deleteRoomRequest.load().then(function(){window.location.href=window.urls.findAndPlay},function(){$("#error-dlg").modal()})};self.onAccessDeniedDialogClose=function(){self.accessDeniedDialogShow(!1);window.location.href=window.urls.playgroundGames};self.mainButtonType=ko.pureComputed(function(){return selectMainButtonType(self.partyStatus())});self.secondButtonType=ko.pureComputed(function(){return selectSecondButtonType(self.partyStatus())});self.hideGoPremium=ko.pureComputed(function(){return!(self.needToBuySubscription()&&window.user.isAuthenticated===1&&!window.user.isDemoUser)});self.hideProgress=ko.pureComputed(function(){return self.partyStatus()===$.tabletopia.enums.gamePartyStatus.unknown||self.partyStatus()===$.tabletopia.enums.gamePartyStatus.finished||self.partyStatus()===$.tabletopia.enums.gamePartyStatus.playing});self.welcomeMessageLinkify=ko.pureComputed(function(){const message="<em>"+linkifyStr(self.welcomeMessage(),window.global.linkifySettings)+"<\/em>";return self.scheduledGameDate&&self.scheduledGameDate()?"<br/>"+message:message});self.busySeatsCount=ko.pureComputed(function(){let result=0;const seats=self.seats();for(let seat in seats){const value=seats[seat];value.user&&result++}return result});self.progressValue=ko.pureComputed(function(){return self.busySeatsCount()<self.seats().length?self.busySeatsCount()/self.seats().length*100:100});self.partyStatusText=ko.pureComputed(function(){return self.gamePartyStatusToLocalizedString(self.partyStatus(),self.isCurrentUserReady(),self.tableAccessType()===$.tabletopia.enums.tableAccessType.public)});self.scheduledGameDescriptionForCalendar=ko.pureComputed(function(){return initAddToCalendar(),self.scheduledGameDate().toScheduledGameDescriptionForCalendar(self.game.name,self.currentSetup().title,self.gameZone().room.table.welcomeMessage,self.gameZone().room.shortUrl,window.location.href)});self.scheduledGameDateNoti=ko.pureComputed(function(){return self.scheduledGameDate().toScheduledGameNoti().uppercaseFirst()});self.mainButtonClass=ko.pureComputed(function(){let buttonClass="";switch(self.mainButtonType()){case self.buttonTypeEnum.watch:case self.buttonTypeEnum.result:case self.buttonTypeEnum.startNow:buttonClass="button _light_blue"+(self.isUnsupportedSystem?" disabled":"");break;case self.buttonTypeEnum.leave:case self.buttonTypeEnum.incomplete:buttonClass="button _light_blue";break;case self.buttonTypeEnum.start:case self.buttonTypeEnum.starting:case self.buttonTypeEnum.join:buttonClass="button _light_green"+(self.isUnsupportedSystem?" disabled":"");break;case self.buttonTypeEnum.hostContinue:case self.buttonTypeEnum.ready:case self.buttonTypeEnum.playerContinue:buttonClass="button _light_green";break;case self.buttonTypeEnum.readyCheckCancel:buttonClass="lobby-game__cancel js-link"}return buttonClass});self.secondButtonClass=ko.pureComputed(function(){switch(self.secondButtonType()){case self.buttonTypeEnum.watch:case self.buttonTypeEnum.result:case self.buttonTypeEnum.startNow:return"button _light_blue"+(self.isUnsupportedSystem?" disabled":"");case self.buttonTypeEnum.incomplete:return"button _light_blue";case self.buttonTypeEnum.start:case self.buttonTypeEnum.join:return"button _light_green"+(self.isUnsupportedSystem?" disabled":"");case self.buttonTypeEnum.hostContinue:case self.buttonTypeEnum.ready:case self.buttonTypeEnum.playerContinue:return"button _light_green";case self.buttonTypeEnum.leave:case self.buttonTypeEnum.readyCheckCancel:return"lobby-game__cancel js-link"}return""});self.mainButtonText=ko.pureComputed(function(){return buttonText(self.mainButtonType())});self.secondButtonText=ko.pureComputed(function(){return buttonText(self.secondButtonType(),self.readyCheck.readyCounterText())});self.hidePartyTime=ko.pureComputed(function(){return self.partyStatus()===$.tabletopia.enums.gamePartyStatus.unknown||self.partyStatus()===$.tabletopia.enums.gamePartyStatus.awaiting||self.partyStatus()===$.tabletopia.enums.gamePartyStatus.readyCheck||self.partyStatus()===$.tabletopia.enums.gamePartyStatus.archived});self.isAllowInvitePlayers=ko.pureComputed(function(){return self.isCurrentUserHost()||self.tableSettings.allowManageParty&&self.isCurrentUserOnSeat()});self.isAllowInvitePlayers=ko.pureComputed(function(){return(self.isCurrentUserHost()||self.tableSettings().allowInvitePlayers&&self.isCurrentUserOnSeat())&&self.partyStatus()!==$.tabletopia.enums.gamePartyStatus.readyCheck});self.disableSetupDropdown=ko.pureComputed(function(){return!self.game().setups||self.game().setups.length<2?!0:self.isSetupLoaderHidden()?self.isAllowInvitePlayers()?self.isMobile()&&(!self.isCurrentUserHost()||!self.isCurrentUserOnSeat()&&!self.tableSettings().allowManageParty):!0:!0});self.hideSwitch=ko.pureComputed(function(){return self.isWhitelabelMode?!0:window.user.isAdmin?!0:!self.isCurrentUserHost()||!self.tableSettings().allowManageParty&&!self.isCurrentUserOnSeat()||self.partyStatus()===$.tabletopia.enums.gamePartyStatus.readyCheck});self.showWhitelabelSwitch=ko.pureComputed(function(){return window.user.isAdmin?self.isWhitelabelMode&&self.gameZone().canChangeGame:self.isWhitelabelMode&&self.gameZone().canChangeGame&&(self.isCurrentUserHost()||self.tableSettings().allowManageParty&&self.isCurrentUserOnSeat())&&self.partyStatus()!==$.tabletopia.enums.gamePartyStatus.readyCheck});self.userSkillText=ko.pureComputed(function(){return self.userSkillTypeToLocalizedString(self.tableSettings().userSkillType)});self.voiceChatText=ko.pureComputed(function(){return self.voiceChatTypeToLocalizedString(self.tableSettings().useVoiceChat)});self.atcDateStart=ko.pureComputed(function(){const dateStart=new Date(self.scheduledGameDate().getTime()+currentTimeZoneHours*36e5);return dateStart.toISOString()});self.atcDateEnd=ko.pureComputed(function(){const dateEnd=new Date(self.scheduledGameDate().getTime()+(1+currentTimeZoneHours)*36e5);return dateEnd.toISOString()});self.needToBuySubscription=ko.pureComputed(function(){let result=!1;return self.game().createdById===window.user.id||self.gameZone().room.type!==$.tabletopia.enums.roomType.premiumRequired||window.user.isPremium||(result=!0),result&&self.gameZone().userBoughtDlc&&(result=!1),result});self.showGameLink=ko.pureComputed(function(){return self.isWhitelabelMode?!1:self.game().accessType!==$.tabletopia.enums.gameAccessType.private||self.game().createdById===window.user.id||window.user.isAdmin});self.gameUrl=ko.pureComputed(function(){return window.urls.gameUrlTemplate.replace("shorturl",self.game().shortUrl)});self.getAlternativeSetup=function(setups){const busySeats=self.busySeatsCount(),sortedArray=setups.slice(0).sort(setupSort);for(let x in sortedArray){const value=sortedArray[x];if(value.playersMin<=busySeats&&value.playersMax>=busySeats&&(window.user.isPremium||!value.isPremium)&&!value.isMobile)return value}return undefined};self.playNow=function(redirect){self.playRequest.isLoading()||(redirect||(redirect=!0),self.playRequest.load({zoneShortUrl:self.zoneShortUrl}).then(function(response){typeof response!="object"||response.result?response||redirect&&(window.location.href=window.urls.playGameUrl):response.reason==="PremiumSetupNotAvailable"&&ko.postbox.publish($.tabletopia.postbox.subscriptions.show,{buySuccessUrl:window.urls.playGameUrl,buyCancelUrl:window.urls.playgroundGames,redirectOnCancel:!0})},function(){$("#error-dlg").modal()}))};self.ruleName=function(rule){return rule.name?rule.name:rule.language?rule.language.name:$.tabletopia.localization.languageOther};self.showUserInfo=function(userShortUrl){self.userProvider&&self.userProvider.openUserPreview(userShortUrl,"Room","OnlinePlayers")};self.getSettingsLanguages=function(){const settingsLanguages=[];return self.tableSettings().languageIds.forEach(function(langId){const language=self.tableSettings().languages.filter(function(x){if(x.id===langId)return x});language&&settingsLanguages.push(language)}),settingsLanguages};self.displayLink=function(link){if(link)return link.indexOf("discord")!==-1?'<a href="'+link+'" target="_blank" class="lobby-soc__logo"><\/a>':link.indexOf("zoom")!==-1?'<a href="'+link+'" target="_blank" class="lobby-soc__zoom"><\/a>':'<a href="'+link+'" target="_blank" style="font-size: 16px; color: white; text-decoration: none; ">'+getUrlDomain(link)+"<\/a>"};self.gamePartyStatusToLocalizedString=function(status,isUserReady,showInFindAndPlay){switch(status){case $.tabletopia.enums.gamePartyStatus.unknown:case $.tabletopia.enums.gamePartyStatus.awaiting:return self.isCurrentUserHost()?showInFindAndPlay?$.tabletopia.localization.roomStatusHostGameNotStarted_ShowInFindAndPlay:$.tabletopia.localization.roomStatusHostGameNotStarted_DoNotShowInFindAndPlay:$.tabletopia.localization.roomStatusLookingForPlayers;case $.tabletopia.enums.gamePartyStatus.readyCheck:return self.isCurrentUserHost()||isUserReady?$.tabletopia.localization.roomStatusWaitingForPlayers:$.tabletopia.localization.roomStatusAreYouReadyToPlayNow;case $.tabletopia.enums.gamePartyStatus.playing:return $.tabletopia.localization.roomStatusGameInProgress;case $.tabletopia.enums.gamePartyStatus.frozen:return $.tabletopia.localization.roomStatusPaused;case $.tabletopia.enums.gamePartyStatus.scoring:return $.tabletopia.localization.roomStatusScoring;case $.tabletopia.enums.gamePartyStatus.finished:case $.tabletopia.enums.gamePartyStatus.archived:return $.tabletopia.localization.roomStatusGameIsFinished}return""};self.userSkillTypeToLocalizedString=function(skill){switch(skill){case $.tabletopia.enums.userSkillType.any:return $.tabletopia.localization.any;case $.tabletopia.enums.userSkillType.newbie:return $.tabletopia.localization.newPlayer;case $.tabletopia.enums.userSkillType.knowRules:return $.tabletopia.localization.knowTheRules;case $.tabletopia.enums.userSkillType.expert:return $.tabletopia.localization.expert}return""};self.voiceChatTypeToLocalizedString=function(chatType){switch(chatType){case $.tabletopia.enums.voiceChatType.any:return $.tabletopia.localization.any;case $.tabletopia.enums.voiceChatType.no:return $.tabletopia.localization.no;case $.tabletopia.enums.voiceChatType.yes:return $.tabletopia.localization.yes}return""}}function ReadyCheck(component){function clearTimer(){self.isTimeActive=!1;typeof readyCheckTimerId!="undefined"&&(clearInterval(readyCheckTimerId),readyCheckTimerId=undefined)}const self=this;let readyCheckTimerId;const startReadyCheckRequest=new $.tabletopia.post.playground.readyCheck.start(component.roomShortUrl),readyReadyCheckRequest=new $.tabletopia.post.playground.readyCheck.ready(component.roomShortUrl),cancelReadyCheckRequest=new $.tabletopia.delete.playground.readyCheck.cancel(component.roomShortUrl);self.isTimeActive=!1;self.readyCounterText=ko.observable();self.start=function(){if(!startReadyCheckRequest.isLoading()){if(component.busySeatsCount()===1){component.playNow();return}self.initTimer();startReadyCheckRequest.load().then(null,function(){clearTimer();$("#error-dlg").modal()})}};self.ready=function(){readyReadyCheckRequest.isLoading()||readyReadyCheckRequest.load().then(null,function(){$("#error-dlg").modal()})};self.cancel=function(){cancelReadyCheckRequest.isLoading()||(clearTimer(),cancelReadyCheckRequest.load().then(null,function(){$("#error-dlg").modal()}))};self.initTimer=function(){clearTimer();let seconds=component.gameZone().room.readyCheckTimeout;seconds<=0||isNaN(seconds)||(self.isTimeActive=!0,readyCheckTimerId=setInterval(function(){--seconds;seconds===0&&(component.gameZone().room.useAutoReadyCheck?clearTimer():self.cancel());let m=parseInt(seconds/60);m<0&&(m=0);let s=seconds%60;s<0&&(s=0);self.readyCounterText((m<10?"0"+m:m)+":"+(s<10?"0"+s:s))},1e3))}}function LobbySignalR(component){function updateRoom(newRoom){if(newRoom){let onSeat=!1;for(let i=0;i<newRoom.seats.length;++i)newRoom.seats[i].user&&(newRoom.seats[i].user.id===window.user.id&&(onSeat=!0,component.currentSeatColor(newRoom.seats[i].color)),newRoom.seats[i].user.isOnlineOb=ko.observable(newRoom.seats[i].user.isOnline),newRoom.seats[i].readyCheckStatusOb=ko.observable(newRoom.seats[i].readyCheckStatus));onSeat!==component.isCurrentUserOnSeat()&&component.isCurrentUserOnSeat(onSeat);component.seats(newRoom.seats);component.partyModificationTimeText(newRoom.partyModificationTime);component.alternativeSetup(component.getAlternativeSetup(component.game().setups));const partyStatus=newRoom.partyStatus.toLowerCase();for(let status in $.tabletopia.enums.gamePartyStatus)if(status.toLowerCase()===partyStatus){component.partyStatus($.tabletopia.enums.gamePartyStatus[status]);break}for(let i=0;i<component.spectators().length;++i){const user=component.spectators()[i];for(let j=0;j<newRoom.seats.length;++j)if(newRoom.seats[j].user&&user.id===newRoom.seats[j].user.id){component.spectators.remove(user);break}}if(component.currentSetup().publicId!==newRoom.setup.publicId)for(let setup in component.game().setups){const value=component.game().setups[setup];if(value.publicId===newRoom.setup.publicId){component.currentSetup(value);break}}}}function setUserReady(userId){const seats=component.seats();for(let seat in seats){const value=seats[seat];if(value.user.id===userId){value.user.isOnlineOb(!0);value.readyCheckStatusOb($.tabletopia.enums.seatReadyCheckStatus.ready);break}}userId===window.user.id&&component.isCurrentUserReady(!0)}function setBackgroundImage(url){if(!component.isWhitelabelMode){if(typeof url=="string"&&url.length>0){const query=$("#bg-url-query-input").val();typeof query=="string"&&query.length>0&&(url+=query)}else url=window.urls.fallbackBackgroundImageUrl;let currentUrl=$("#loby-bg-image").css("background-image");typeof currentUrl=="string"&&currentUrl.length>0&&(currentUrl=currentUrl.replace(/^url\(["']?/,"").replace(/["']?\)$/,""));currentUrl!==url&&$("#loby-bg-image").css("background-image","url('"+url+"')")}}function removeUsersFromSpectators(newUsers){for(let i=0;i<component.spectators().length;++i){let userExists=!1;const user=component.spectators()[i];for(let j=0;j<newUsers.length;++j)if(newUsers[j]&&user.id===newUsers[j].id){userExists=!0;break}userExists||component.spectators.remove(user)}}const self=this,roomProxy=$.connection.rh;self.initSignalR=function(tableId){const qs={tableId:tableId,trackedPageType:"Room"};typeof window.user.id=="number"&&window.user.id>0&&(qs.userId=window.user.id);window.global.signalrManager.extendQueryString(qs);window.global.signalrManager.registerConnectedCallback(function(){window.user.id>0?roomProxy.server.trackUser():roomProxy.server.trackSpectator()});window.global.signalrManager.connect()};window.global.usersManager.addReadyCheckOpenGameCallback(function(roomShortUrl){roomShortUrl.toLowerCase()===component.gameZone().room.shortUrl.toLowerCase()&&component.playNow()});window.global.usersManager.addUserJoinedPageCallback(function(userId){const seats=component.seats();for(let seat in seats){const value=seats[seat];if(value.user&&value.user.id===userId){value.user.isOnlineOb(!0);break}}});roomProxy.client.zoneChanged=function(zone,room){if(room&&zone){const newRoom=Tabletopia.Common.keysToCamel(room),newZone=Tabletopia.Common.keysToCamel(zone);component.game(newZone.game);updateRoom(newRoom);const currentBackgroundImageUrl=component.tableSettings().backgroundImageUrl;newZone.backgroundImageUrl!==currentBackgroundImageUrl&&setBackgroundImage(newZone.backgroundImageUrl);component.zoneShortUrl=newZone.shortUrl;component.gameZone().userBoughtDlc=newZone.userBoughtDlc}};roomProxy.client.roomChanged=function(room){if(room){const newRoom=Tabletopia.Common.keysToCamel(room);updateRoom(newRoom)}};roomProxy.client.roomDeleted=function(){window.location.href=window.urls.findAndPlay};roomProxy.client.applyViewersInfo=function(usersCnt,spectatorsCnt,users){if(usersCnt+spectatorsCnt!==0&&component.gameZone()){const newUsers=Tabletopia.Common.keysToCamel(users);if(removeUsersFromSpectators(newUsers),newUsers)for(let i=0;i<newUsers.length;++i){let userExists=!1;for(let j=0;j<component.seats().length;++j){const user=component.seats()[j].user;if(user&&newUsers[i].id===user.id){userExists=!0;break}}if(!userExists){const match=ko.utils.arrayFirst(component.spectators(),function(item){return item.id===newUsers[i].id});match||(newUsers[i].avatarUrl||(newUsers[i].avatarUrl=window.urls.cdnUrl+(newUsers[i].avatarUrl?newUsers[i].avatarUrl:window.urls.defaultAvatarUrl)+window.urls.avatarQuery),component.spectators.push(newUsers[i]))}}}};roomProxy.client.applyTableSettings=function(settings){if(typeof settings=="object"){const currentBackgroundImageUrl=component.tableSettings().backgroundImageUrl,newSettings=Tabletopia.Common.keysToCamel(settings);component.tableSettings(newSettings);newSettings.backgroundImageUrl!==currentBackgroundImageUrl&&setBackgroundImage(newSettings.backgroundImageUrl)}};roomProxy.client.applyPartyStatus=function(status,modificationTime){const newStatus=$.tabletopia.enums.gamePartyStatus[status.lowercaseFirst()];if(newStatus){if(component.seats().length>0&&newStatus===$.tabletopia.enums.gamePartyStatus.readyCheck){component.isCurrentUserHost()?(component.isCurrentUserReady(!0),component.readyCheck.isTimeActive||component.readyCheck.initTimer()):component.isCurrentUserReady(!1);const seats=component.seats();for(let seat in seats){const value=seats[seat];value.user&&(component.gameZone().room.creatorId===value.user.id?(value.user.isOnlineOb(!0),value.readyCheckStatusOb($.tabletopia.enums.seatReadyCheckStatus.ready)):value.readyCheckStatusOb($.tabletopia.enums.seatReadyCheckStatus.unknown))}}component.partyStatus(newStatus)}component.partyModificationTimeText(modificationTime)};roomProxy.client.readyCheckUserReady=function(userId){setUserReady(userId)};roomProxy.client.readyCheckAutoPlayFailed=function(){component.autoPlayFailedDialogShow(!0)};roomProxy.client.addChatMessage=function(message){if(message){const newMessage=Tabletopia.Common.keysToCamel(message);ko.postbox.publish($.tabletopia.postbox.room.addRoomChatMessage,newMessage)}}}ko.components.register("room-lobby-whitelabel",{template:{url:"Lobby/Whitelabel/room-lobby.html"},viewModel:{createViewModel:function(params,componentInfo){return new RoomLobbyWhitelabel(params,componentInfo)}}});$.extend(!0,$,{tabletopia:{enums:{roomType:{basic:0,premiumRoom:10,premiumRequired:20},gamePartyStatus:{unknown:0,awaiting:10,readyCheck:12,playing:15,frozen:20,scoring:25,finished:30,archived:40},gameAccessType:{public:0,creativeCommon:10,private:20},tableAccessType:{unknown:0,private:10,friendsOnly:20,public:30},userSkillType:{any:0,newbie:100,knowRules:200,expert:300},voiceChatType:{any:0,no:1,yes:2},seatReadyCheckStatus:{unknown:0,ready:10},playMode:{online:0,hotSeat:10,solo:20}}}})}(jQuery,ko),function($,ko){function RoomSeats(params){function join(seatIndex){if(!self.joinPlayerRequest.isLoading()&&!self.lobby.isUnsupportedSystem){const model={};seatIndex&&seatIndex>0&&(model.seatIndex=seatIndex);self.joinPlayerRequest.load(model).then(function(response){typeof response!="object"||response.result?response||(registerPushNotification(),!window.user.email&&self.lobby.scheduledGameDate()&&window.global.app.showAskUserEmail(function(email){window.user.email=email})):response.reason==="NotAvailableForDemoUsers"||response.reason==="PremiumSetupNotAvailable"?self.lobby.accessDeniedDialogShow(!0):response.reason==="AllowedForDemoUser"?ko.postbox.publish($.tabletopia.postbox.common.authenticationDialogShow,!0):response.reason==="NotAvailable"?self.lobby.notAvailableSteamDialogShow(!0):response.reason==="MaxGameSessions"&&ko.postbox.publish($.tabletopia.postbox.common.sessionsManagerDialogShow,{roomShortUrl:self.lobby.roomShortUrl,zoneShortUrl:self.lobby.zoneShortUrl})},function(){$("#error-dlg").modal()})}}function leave(userId){if(!self.leavePlayerRequest.isLoading()&&userId&&!(userId<1)){const isAllowManagePlayers=self.lobby.isCurrentUserHost()||self.lobby.tableSettings().allowManagePlayers&&self.lobby.isCurrentUserOnSeat();(userId===window.user.id||isAllowManagePlayers)&&self.leavePlayerRequest.load({userId:userId}).then(function(){disablePushNotification()},function(){$("#error-dlg").modal()})}}function registerPushNotification(){window.user.isInSteamBrowser!==1&&self.lobby.scheduledGameDate()&&window.oneSignalManager&&window.oneSignalManager.subscribeOneSignal(window.user.Id)}function disablePushNotification(){window.user.isInSteamBrowser!==1&&window.oneSignalManager&&window.oneSignalManager.unSubscribeOneSignal()}const self=this;self.lobby=params.lobby;self.host=self.lobby.gameZone().room.table.host;self.currentSetup=self.lobby.currentSetup;self.joinPlayerRequest=self.lobby.isWhitelabelMode?new $.tabletopia.post.whitelabel.room.players.join(self.lobby.whitelabel,self.lobby.whitelabelEvent,self.lobby.roomShortUrl):new $.tabletopia.post.playground.players.join(self.lobby.roomShortUrl);self.leavePlayerRequest=new $.tabletopia.delete.playground.players.leave(self.lobby.roomShortUrl);self.addTableSeatRequest=new $.tabletopia.post.playground.seats.add(self.lobby.roomShortUrl);self.removeTableSeatRequest=new $.tabletopia.delete.playground.seats.remove;self.onAddSeatClick=function(){self.addTableSeatRequest.isLoading()||self.addTableSeatRequest.load().then(null,function(){$("#error-dlg").modal()})};self.onRemoveSeatClick=function(data){self.removeTableSeatRequest.isLoading()||!data.position||data.position<1||(self.removeTableSeatRequest.setUrl($.tabletopia.routes.playground.api("rooms",self.lobby.roomShortUrl,"seat",data.position)),self.removeTableSeatRequest.load().then(null,function(){$("#error-dlg").modal()}))};ko.postbox.subscribe($.tabletopia.postbox.room.joinSeat,function(){join()});self.onJoinClick=function(data){join(data.position)};self.onKickButtonClick=function(data){data.user&&leave(data.user.id)};ko.postbox.subscribe($.tabletopia.postbox.room.leaveSeat,function(userId){leave(userId)});self.showUserInfo=function(userShortUrl){self.lobby.userProvider&&self.lobby.userProvider.openUserPreview(userShortUrl,"Room","OnlinePlayers")};self.hideAddSeat=function(){return!(self.lobby.seats().length<self.currentSetup().playersMax&&(self.lobby.isCurrentUserHost()||self.lobby.tableSettings().allowManagePlayers&&self.lobby.isCurrentUserOnSeat()))};self.hideRemoveSeat=function(){return!(self.currentSetup().playersMin<self.lobby.seats().length&&(self.lobby.isCurrentUserHost()||self.lobby.isCurrentUserOnSeat()&&self.lobby.tableSettings().allowManagePlayers))};self.seatUserClass=function(seat){return self.lobby.partyStatus()===$.tabletopia.enums.gamePartyStatus.readyCheck?seat.readyCheckStatusOb()===$.tabletopia.enums.seatReadyCheckStatus.ready?"status-ready":"status-offline":seat.user.isOnlineOb()&&!seat.user.isBusy?"status-ready":seat.user.isBusy?"status-busy":"status-offline"};self.hideKickButton=function(seat){return!(seat.user.id!==window.user.id&&seat.user.id!==self.host.id&&(self.lobby.isCurrentUserHost()||self.lobby.isCurrentUserOnSeat()&&self.lobby.tableSettings().allowManagePlayers))};self.hideHostButton=function(seat){return!(self.host&&self.host.id===seat.user.id)};self.userName=function(seat){const name=seat.user.displayName;return self.host&&self.host.id===seat.user.id?name+" ("+$.tabletopia.localization.host+")":name};self.hideStar=function(seat){return window.user.id===seat.user.id};self.starTitle=function(seat){return seat.user.isMyFriend&&!seat.user.isMySystemFriend?$.tabletopia.localization.removeFromFriends:seat.user.isMySystemFriend?$.tabletopia.localization.steamFriendsCanNotBeRemoved:$.tabletopia.localization.addToFriends};self.seatName=function(seatColor){switch(seatColor){case"blue":return $.tabletopia.localization.seatBlue;case"red":return $.tabletopia.localization.seatRed;case"yellow":return $.tabletopia.localization.seatYellow;case"green":return $.tabletopia.localization.seatGreen;case"white":return $.tabletopia.localization.seatWhite;case"purple":return $.tabletopia.localization.seatPurple;case"brown":return $.tabletopia.localization.seatBrown;case"black":return $.tabletopia.localization.seatBlack;default:return""}};self.playerStatus=function(seat){return self.lobby.partyStatus()===$.tabletopia.enums.gamePartyStatus.readyCheck?seat.readyCheckStatusOb()===$.tabletopia.enums.seatReadyCheckStatus.ready?$.tabletopia.localization.ready:$.tabletopia.localization.notReady:seat.user.isInThisGame?$.tabletopia.localization.inGame:seat.user.isOnlineOb()&&!seat.user.isBusy?$.tabletopia.localization.online:seat.user.isBusy?$.tabletopia.localization.busy:$.tabletopia.localization.offline}}ko.components.register("room-seats",{template:{url:"Lobby/Whitelabel/room-seats.html"},viewModel:{createViewModel:function(params,componentInfo){return new RoomSeats(params,componentInfo)}}})}(jQuery,ko),function($,ko){function RoomSettings(params){function showPanel(){self.panelOptions({show:!0,duration:"slow","function":function(){if(!self.currentWorkDate()){self.currentWorkDate(self.currentDate);self.showDatePicker(!0);self.onSelectTime(self.currentDate)}}})}function deleteScheduledDate(){self.currentWorkDate()&&self.deleteScheduledGameRequest.load().then(function(){disablePushNotification();self.lobby.scheduledGameDate(undefined);self.currentWorkDate(undefined);self.panelOptions({show:!1,duration:"slow"})})}function saveWelcomeMessage(){const message=self.lobby.welcomeMessage()?self.lobby.welcomeMessage().trim():"",newMessage=self.tempWelcomeMessage().trim();newMessage!==message&&(window.global.htmlRegex.test(newMessage)||(self.lobby.welcomeMessage(newMessage),self.setWelcomeMessageRequest.load({message:newMessage}).then(null,function(){self.lobby.welcomeMessage(message);$("#error-dlg").modal()})))}function registerPushNotification(){window.user.isInSteamBrowser!==1&&self.lobby.scheduledGameDate()&&window.oneSignalManager&&window.oneSignalManager.subscribeOneSignal(window.user.id)}function disablePushNotification(){window.user.isInSteamBrowser!==1&&window.oneSignalManager&&window.oneSignalManager.unSubscribeOneSignal()}const self=this;self.lobby=params.lobby;self.showOptions=ko.observable(!1);self.panelOptions=ko.observable();self.showDatePicker=ko.observable();self.welcomeMessageEdit=ko.observable(!1);self.tempWelcomeMessage=ko.observable(self.lobby.welcomeMessage());self.backgroundImageId=ko.observable();self.backgroundImageName=ko.observable();self.allowManageParty=ko.observable();self.allowManagePlayers=ko.observable();self.allowInvitePlayers=ko.observable();self.currentDate=new Date;self.currentDate.setMinutes(Math.ceil(self.currentDate.getMinutes()/30)*30);self.currentDate.setSeconds(0,0);self.maxDate=new Date;self.maxDate.setDate(self.currentDate.getDate()+14);self.currentWorkDate=ko.observable(self.lobby.scheduledGameDate());self.isDrag=ko.observable(!1);self.isUploading=ko.observable(!1);self.uploadProgress=ko.observable(0);self.setTableSettingsRequest=new $.tabletopia.post.playground.game.setTableSettings(self.lobby.roomShortUrl);self.setAccessTypeRequest=new $.tabletopia.post.playground.game.setTableAccessType(self.lobby.roomShortUrl);self.setWelcomeMessageRequest=new $.tabletopia.post.playground.game.setWelcomeMessage(self.lobby.roomShortUrl);self.setScheduledGameRequest=new $.tabletopia.post.playground.game.setScheduledGame(self.lobby.roomShortUrl);self.deleteScheduledGameRequest=new $.tabletopia.delete.playground.game.deleteScheduledGame(self.lobby.roomShortUrl);self.onOpenOptionsWindow=function(){const settings=self.lobby.tableSettings();self.backgroundImageId(settings.backgroundImageId);self.backgroundImageName(settings.backgroundImageName);self.allowManageParty(settings.allowManageParty);self.allowManagePlayers(settings.allowManagePlayers);self.allowInvitePlayers(settings.allowInvitePlayers)};self.onApply=function(){const settings=self.lobby.tableSettings();settings.backgroundImageId=self.backgroundImageId();settings.backgroundImageName=self.backgroundImageName();settings.allowManageParty=self.allowManageParty();settings.allowManagePlayers=self.allowManagePlayers();settings.allowInvitePlayers=self.allowInvitePlayers();self.setTableSettingsRequest.load({settings:self.lobby.tableSettings()}).then(function(){self.lobby.tableSettings().backgroundImageId=settings.backgroundImageId;self.lobby.tableSettings().backgroundImageName=settings.backgroundImageName;self.lobby.tableSettings().allowManageParty=settings.allowManageParty;self.lobby.tableSettings().allowManagePlayers=settings.allowManagePlayers;self.lobby.tableSettings().allowInvitePlayers=settings.allowInvitePlayers},function(){$("#error-dlg").modal()})};self.onEnterDragLeave=function(){self.isDrag(!1)};self.onDragOver=function(){self.isDrag(!0)};self.progressFileUpload=function(progress){self.isUploading()||self.isUploading(!0);self.uploadProgress(progress)};self.errorFileUpload=function(data){if(self.isUploading(!1),typeof data!="undefined"&&typeof data.result!="undefined"&&typeof data.result.storageStatus!="undefined"&&data.result.storageStatus==="Error"){self.lobby.userStorageErrorDialogShow(!0);return}$("#error-dlg").modal()};self.doneFileUpload=function(data){self.isUploading(!1);self.isDrag()&&self.isDrag(!1);self.backgroundImageId(data[0].id);self.backgroundImageName(data[0].name)};self.deleteBackgroundImage=function(){self.backgroundImageId(0);self.backgroundImageName("")};self.showOptions.subscribe(function(newValue){newValue?showPanel():deleteScheduledDate()});self.showOptions(self.currentWorkDate()!==undefined);self.accessTypeClick=function(){if(self.lobby.isCurrentUserHost()&&!self.setAccessTypeRequest.isLoading()){const isPublic=self.lobby.tableAccessType()===$.tabletopia.enums.tableAccessType.public;self.setAccessTypeRequest.load({isPublic:!isPublic}).then(function(){isPublic?self.lobby.tableAccessType($.tabletopia.enums.tableAccessType.private):self.lobby.tableAccessType($.tabletopia.enums.tableAccessType.public)},function(){$("#error-dlg").modal()})}};self.scheduledGameDateText=ko.pureComputed(function(){if(self.currentWorkDate())return ko.observable(self.currentWorkDate().toDateTimeFormat())});self.onSelectTime=function(selectedDateTime){const savedDateTime=self.lobby.scheduledGameDate();if(savedDateTime&&selectedDateTime.getTime()===savedDateTime.getTime()){self.currentWorkDate(savedDateTime);return}if(self.currentDate.getTime()>selectedDateTime.getTime()){self.currentWorkDate(savedDateTime);return}self.currentWorkDate(selectedDateTime);self.setScheduledGameRequest.load({scheduleDate:selectedDateTime.toISOString()}).then(function(){self.lobby.scheduledGameDate(selectedDateTime);registerPushNotification()},function(){self.currentWorkDate(savedDateTime);$("#error-dlg").modal()})};self.showDatePickerClick=function(){self.showDatePicker()||self.showDatePicker(!0)};self.welcomeMessageEdit.subscribe(function(newValue){newValue||saveWelcomeMessage()});self.welcomeMessageClick=function(){self.welcomeMessageEdit()||(self.tempWelcomeMessage(self.lobby.welcomeMessage()),self.welcomeMessageEdit(!0))};self.welcomeMessageKeydown=function(data,e){if(e.which===27){self.welcomeMessageEdit(!1);return}return e.which===13&&(self.tempWelcomeMessage($(e.target).val()),self.welcomeMessageEdit(!1)),!0};self.welcomeMessageFocusout=function(){self.welcomeMessageEdit(!1)}}ko.components.register("room-settings",{template:{url:"Lobby/Whitelabel/room-settings.html"},viewModel:{createViewModel:function(params,componentInfo){return new RoomSettings(params,componentInfo)}}})}(jQuery,ko),function($,ko){function RoomStub(params){const self=this;if(self.mode=ko.observable(),self.zone=ko.observable(),self.roomShortUrl=ko.observable(),self.redirectUrl=params.redirectUrl,self.accessDeniedDialogShow=ko.observable(!1),params.zone&&params.mode){self.zone=params.zone;self.mode=params.mode;self.roomShortUrl=params.roomShortUrl;switch(self.mode()){case $.tabletopia.enums.roomStubMode.unauthenticated:self.accessDeniedDialogShow(!0);break;case $.tabletopia.enums.roomStubMode.subscriptionPremiumSetupNotAvailable:ko.postbox.publish($.tabletopia.postbox.subscriptions.show,{buySuccessUrl:self.redirectUrl,buyCancelUrl:window.urls.playgroundGames,redirectOnCancel:!0});break;case $.tabletopia.enums.roomStubMode.subscriptionMaxGameSessions:ko.postbox.publish($.tabletopia.postbox.common.sessionsManagerDialogShow,{roomShortUrl:self.roomShortUrl,zoneShortUrl:self.zone().shortUrl});break;case $.tabletopia.enums.roomStubMode.canNotCreateRoom:ko.postbox.publish($.tabletopia.postbox.common.authenticationDialogShow,!0)}self.onAccessDeniedDialogClose=function(){self.accessDeniedDialogShow(!1);window.location.href=window.urls.playgroundGames}}}ko.components.register("room-stub",{template:{url:"Lobby/Whitelabel/room-stub.html"},viewModel:{createViewModel:function(params,componentInfo){return new RoomStub(params,componentInfo)}}});$.extend(!0,$,{tabletopia:{enums:{roomStubMode:{unauthenticated:0,subscriptionMaxGameSessions:10,subscriptionPremiumSetupNotAvailable:30,canNotCreateRoom:40}}}})}(jQuery,ko),function($,ko){function RoomChat(params,componentInfo){function openRoomPreview(roomShortUrl){roomShortUrl&&$.ajax({url:window.urls.getRoomPreview,data:{roomShortUrl:roomShortUrl},dataType:"html",cache:!1,success:function(html){if(typeof html!="undefined"&&html!==""){const $dlg=$(html);$("#chat-room-preview-placeholder").empty().append($dlg);$dlg.modal()}},error:function(){$("#room-not-found-dlg").modal()}})}function setUserOnlineStatus(userId,status){for(let i=0;i<self.messages().length;i++){const message=self.messages()[i];message.userId===userId&&message.userIsOnline(status)}}function prepareMessageText(message){if(message.message.length>0){const match=message.message.match(/(#[a-zA-Z0-9]{6,})/g);match&&match.length>0?(message.roomShortUrl=match[0].trim().slice(1),message.message='<span class="chat-message__room">'+match[0]+"<\/span>"):(message.isLinkified=!0,message.message=linkifyStr(message.message,window.global.linkifySettings))}}function processMessages(messages){let dateGroup,messagesCount=self.messages().length;messagesCount>0&&(dateGroup=self.messages()[messagesCount-1].timestampUtc.toDateFormatShort());for(let i=0;i<messages.length;i++){const message=messages[i];message.timestampUtc=new Date(message.timestampUtc);message.userIsOnline=ko.observable(message.userIsOnline);const groupMessage=message.timestampUtc.toDateFormatShort();dateGroup!==groupMessage&&(dateGroup=groupMessage,self.messages.push({entryType:$.tabletopia.enums.chatEntryType.message,userId:0,message:groupMessage}));prepareMessageText(message);self.messages.push(message)}}function scrollDown(){const content=componentInfo.element.firstChild;content.scrollTop=content.scrollHeight}const self=this;self.roomShortUrl=params.roomShortUrl;self.seatColor=params.seatColor;self.isWhitelabelMode=params.isWhitelabelMode;self.message=ko.observableArray("");self.messageIsFocused=ko.observableArray(!1);self.isVisible=ko.observableArray(!1);self.messages=ko.observableArray();self.getMessagesRequest=new $.tabletopia.get.playground.chat.room.messages(self.roomShortUrl);self.sendMessageRequest=new $.tabletopia.post.playground.chat.room.send(self.roomShortUrl);self.getMessagesRequest.load().done(function(response){response&&response.messages&&(processMessages(response.messages),scrollDown())});window.global.usersManager.addUserJoinedPageCallback(function(userId){setUserOnlineStatus(userId,!0)});window.global.usersManager.addUserLeftPageCallback(function(userId){setUserOnlineStatus(userId,!1)});ko.postbox.subscribe($.tabletopia.postbox.room.addRoomChatMessage,function(message){if(message){const content=componentInfo.element.firstChild,currentScroll=content.scrollTop,maxScroll=content.scrollHeight-content.offsetHeight;processMessages([message]);setUserOnlineStatus(message.userId,!0);currentScroll>maxScroll-25&&scrollDown()}});self.onOpenRoomPreviewClick=function(data){data&&data.roomShortUrl&&openRoomPreview(data.roomShortUrl)};self.onLinkifiedClick=function(data){if(!data.isLinkified||typeof window.unity.client=="undefined")return!0;const linkMatch=data.message.match(/href="(.*?)"/);if(!linkMatch&&linkMatch.length===0)return!0;const link=linkMatch[1],domain=window.location.protocol+"//"+window.location.hostname;link.indexOf(domain)===-1&&window.unity.client.sendMessage("OpenUrl",{openUrl:link})};self.messageKeydown=function(data,e){if(e.which===27){self.message("");return}return e.which===13&&self.sendMessage(),!0};self.sendMessage=function(){const text=self.message().trim();if(!text||self.sendMessageRequest.isLoading()){self.messageIsFocused(!0);return}if(window.global.htmlRegex.test(text)){self.messageIsFocused(!0);return}self.message("");self.messageIsFocused(!0);self.sendMessageRequest.load({message:text,seat:self.seatColor()}).then(function(response){response.isNotSpam||Messenger().post({message:$.tabletopia.localization.detectedAsSpam,type:"error",hideAfter:15,showCloseButton:!0})},function(){$("#error-dlg").modal()})}}ko.components.register("room-chat",{template:{url:"Lobby/whitelabel/chat/room-chat.html"},viewModel:{createViewModel:function(params,componentInfo){return new RoomChat(params,componentInfo)}}});$.extend(!0,$,{tabletopia:{enums:{chatEntryType:{message:0,notification:10}}}})}(jQuery,ko),function($,ko){function LoginFormModel(params){const self=this;self.mode=ko.observable(params.mode?params.mode:$.tabletopia.enums.loginComponentMode.login);self.isContinue=params.isContinue?params.isContinue:!1;self.redirectUrl=params.redirectUrl?params.redirectUrl:"/";self.resetToken=params.resetToken;document.cookie=window.cookies.redirectToUrlCookie+"="+self.redirectUrl+"; path=/; secure; SameSite=Lax";self.isShow=ko.observable(!1);self.mode()===$.tabletopia.enums.loginComponentMode.login||self.mode()===$.tabletopia.enums.loginComponentMode.signup?ko.postbox.subscribe($.tabletopia.postbox.loginForm.captchaLoaded,function(){self.isShow(!0)},this,!0):self.isShow(!0)}ko.components.register("login",{template:{url:"Login/login.html"},viewModel:{createViewModel:function(params){return new LoginFormModel(params)}}});$.extend(!0,$,{tabletopia:{enums:{loginComponentMode:{login:0,ssoLogin:10,signup:20,resetPassword:30}}}})}(jQuery,ko),function($,ko){function LoginModel(params){function showCaptcha(){localStorage["captcha-showed"]=!0;self.isCaptchaShow(!0);captchaId!==undefined?grecaptcha.reset(captchaId):captchaId=grecaptcha.render("recaptcha-contour",{sitekey:window.recaptcha.publicKey,callback:captchaSubmitCallback,"expired-callback":captchaExpiriedCallback});$captchaElement=$(".overall-login #recaptcha-contour");self.updateStatus(!self.updateStatus())}function captchaSubmitCallback(){$captchaElement&&$captchaElement.tooltip("destroy");self.updateStatus(!self.updateStatus())}function captchaExpiriedCallback(){self.updateStatus(!self.updateStatus())}function isCaptchaChecked(){return captchaId===undefined||!self.isCaptchaShow()?!0:grecaptcha&&grecaptcha.getResponse().length!==0}function showErrors(errors){errors&&(errors.common&&showTooltip($loginInput,$contentHolder,errors.common),errors.captcha&&showTooltip($captchaElement,$contentHolder,errors.captcha))}function showTooltip(element,container,message){element.tooltip({"class":"tooltip_error",placement:"right",trigger:"manual",html:!0,title:message,container:container});element.tooltip("show")}const self=this;window.document.title=$.tabletopia.localization.logInVerb+" • "+$.tabletopia.localization.tabletopia;const $contentHolder=$(".overall-login .overall-login__field"),$loginInput=$($contentHolder).find("input:first");let $captchaElement,captchaId=undefined;self.redirecting=ko.observable(!1);self.updateStatus=ko.observable(!0);self.mode=params.mode;self.isContinue=params.isContinue?params.isContinue:!1;self.redirectUrl=params.redirectUrl;self.isCaptchaShow=ko.observable(!1);self.login=ko.observable();self.password=ko.observable();self.loginRequest=new $.tabletopia.post.users.login;grecaptcha||alert("reCAPTCHA v2 not loaded!");localStorage["captcha-showed"]==="true"&&showCaptcha();self.submit=function(){if(!self.isSubmitDisabled()){const login=self.login().trim(),password=self.password().trim();let token=captchaId!==undefined?grecaptcha.getResponse():"";self.isCaptchaShow(!1);self.loginRequest.load({login:login,password:password,captchaToken:token}).then(function(response){response.success?(self.redirecting(!0),localStorage["captcha-showed"]=!1,window.location.href=self.redirectUrl):(response.errors.captcha&&showCaptcha(),showErrors(response.errors))},function(){})}};self.isSubmitDisabled=ko.pureComputed(function(){if(self.updateStatus(),self.loginRequest.isLoading()||!self.login()||!self.password()||self.redirecting())return!0;const login=self.login().trim(),password=self.password().trim();return!isCaptchaChecked()||login.length<4||password.length===0});self.onKeyPress=function(data,event){return($loginInput.tooltip("destroy"),event.keyCode===13)?(self.submit(),!1):!0};self.switchToMode=function(mode){self.mode()!==mode&&self.mode(mode)}}ko.components.register("login-form",{template:{url:"Login/Forms/login-form.html"},viewModel:{createViewModel:function(params){return new LoginModel(params)}}})}(jQuery,ko),function($,ko){function ResetPasswordModel(params){function showErrors(errors){errors&&($contentHolder=$(".overall-login .overall-login__field"),errors.common&&showTooltip(errors.common))}function showTooltip(message){$contentHolder=$(".overall-login .overall-login__field");$contentHolder.tooltip({"class":"tooltip_error",placement:"right",trigger:"manual",html:!0,title:message,container:$contentHolder});$contentHolder.tooltip("show")}const self=this;window.document.title=$.tabletopia.localization.restorePassword+" • "+$.tabletopia.localization.tabletopia;let $contentHolder;self.mode=params.mode;self.isContinue=params.isContinue?params.isContinue:!1;self.redirectUrl=params.redirectUrl?params.redirectUrl:"/";self.resetToken=params.resetToken;self.resetPasswordMode=ko.observable(self.resetToken!==undefined?$.tabletopia.enums.resetPasswordMode.setPassword:$.tabletopia.enums.resetPasswordMode.getToken);self.login=ko.observable();self.password=ko.observable();self.confirmPassword=ko.observable();self.getResetTokenRequest=new $.tabletopia.get.users.resetToken;self.resetPasswordRequest=new $.tabletopia.post.users.resetPassword;self.onKeyPress=function(data,event){return($contentHolder&&$contentHolder.tooltip("destroy"),event.keyCode===13)?(self.resetPasswordMode()===$.tabletopia.enums.resetPasswordMode.getToken&&self.onGetToken(),self.resetPasswordMode()===$.tabletopia.enums.resetPasswordMode.setPassword&&self.onSetPassword(),!1):!0};self.switchToMode=function(mode){self.mode()!==mode&&self.mode(mode)};self.onGetToken=function(){self.isSubmitDisabled()||self.getResetTokenRequest.load({email:self.login()}).then(function(response){response.success?self.resetPasswordMode($.tabletopia.enums.resetPasswordMode.checkEmail):showErrors(response.errors)},function(){})};self.isSubmitDisabled=ko.pureComputed(function(){if(self.getResetTokenRequest.isLoading()||!self.login())return!0;const login=self.login().trim();return login.length<4});self.isChangeDisabled=ko.pureComputed(function(){if(self.resetPasswordRequest.isLoading()||!self.password()||!self.confirmPassword())return!0;const password=self.password().trim(),confirmPassword=self.confirmPassword().trim();return password.length<4||confirmPassword<4||password!==confirmPassword});self.onSetPassword=function(){self.isChangeDisabled()||self.resetPasswordRequest.load({password:self.password(),confirmPassword:self.confirmPassword(),token:self.resetToken}).then(function(response){response.success?self.resetPasswordMode($.tabletopia.enums.resetPasswordMode.passwordChanged):showErrors(response.errors)},function(){})}}ko.components.register("resetpassword-form",{template:{url:"Login/Forms/resetpassword-form.html"},viewModel:{createViewModel:function(params){return new ResetPasswordModel(params)}}});$.extend(!0,$,{tabletopia:{enums:{resetPasswordMode:{getToken:0,checkEmail:10,setPassword:20,passwordChanged:30}}}})}(jQuery,ko),function($,ko){function SignupModel(params){function showCaptcha(){captchaId!==undefined?grecaptcha.reset(captchaId):captchaId=grecaptcha.render("recaptcha-contour",{sitekey:window.recaptcha.publicKey,callback:captchaSubmitCallback,"expired-callback":captchaExpiriedCallback});$captchaElement=$(".overall-sign-up #recaptcha-contour");self.updateStatus(!self.updateStatus())}function captchaSubmitCallback(){$captchaElement&&$captchaElement.tooltip("destroy");self.updateStatus(!self.updateStatus())}function captchaExpiriedCallback(){self.updateStatus(!self.updateStatus())}function isCaptchaChecked(){return captchaId===undefined?!0:grecaptcha&&grecaptcha.getResponse().length!==0}function showErrors(errors){errors&&(errors.common&&showTooltip($loginInput,$contentHolder,errors.common),errors.Email&&showTooltip($loginInput,$contentHolder,errors.Email),errors.captcha&&showTooltip($captchaElement,$contentHolder,errors.captcha))}function showTooltip(element,container,message){element.tooltip("destroy");element.tooltip({"class":"tooltip_error",placement:"right",trigger:"manual",html:!0,title:message,container:container});element.tooltip("show")}const self=this;window.document.title=$.tabletopia.localization.signUp+" • "+$.tabletopia.localization.tabletopia;const $contentHolder=$(".overall-sign-up .overall-login__field"),$loginInput=$($contentHolder).find("input:first");let $captchaElement,captchaId=undefined;self.redirecting=ko.observable(!1);self.updateStatus=ko.observable(!0);self.mode=params.mode;self.isContinue=params.isContinue?params.isContinue:!1;self.redirectUrl=params.redirectUrl!=="/"?params.redirectUrl:"/profile";self.login=ko.observable();self.password=ko.observable();self.signupRequest=new $.tabletopia.post.users.signup;grecaptcha||alert("reCAPTCHA v2 not loaded!");showCaptcha();self.submit=function(){if(!self.isSubmitDisabled()){const login=self.login().trim(),password=self.password().trim();let token=captchaId!==undefined?grecaptcha.getResponse():"";self.signupRequest.load({email:login,password:password,captchaToken:token}).then(function(response){response.success?(self.redirecting(!0),window.location.href=self.redirectUrl):(showCaptcha(),showErrors(response.errors))},function(){})}};self.isSubmitDisabled=ko.pureComputed(function(){if(self.updateStatus(),self.signupRequest.isLoading()||!self.login()||!self.password()||self.redirecting())return!0;const login=self.login().trim(),password=self.password().trim();return!isCaptchaChecked()||login.length<4||password.length===0});self.onKeyPress=function(data,event){return event.keyCode===13?(self.submit(),!1):!0};self.switchToMode=function(mode){self.mode()!==mode&&self.mode(mode)}}ko.components.register("signup-form",{template:{url:"Login/Forms/signup-form.html"},viewModel:{createViewModel:function(params){return new SignupModel(params)}}})}(jQuery,ko),function($,ko){function SSOLoginModel(params){function showTooltip(element,container,message){element.tooltip({"class":"tooltip_error",placement:"right",trigger:"manual",html:!0,title:message,container:container});element.tooltip("show")}const self=this;window.document.title=$.tabletopia.localization.logInVerb+" • "+$.tabletopia.localization.tabletopia;const $contentHolder=$(".overall-login .overall-login__field"),$loginInput=$($contentHolder).find("input:first");self.mode=params.mode;self.redirectUrl=params.redirectUrl;self.redirecting=ko.observable(!1);self.login=ko.observable();self.loginRequest=new $.tabletopia.post.users.loginOverSSO;self.submit=function(){if(!self.isSubmitDisabled()){const login=self.login().trim();self.loginRequest.load({email:login,returnUrl:self.redirectUrl}).then(function(response){response.success?(self.redirecting(!0),window.location.href=response.redirectUrl):showTooltip($loginInput,$contentHolder,response.error)},function(){})}};self.isSubmitDisabled=ko.pureComputed(function(){if(self.loginRequest.isLoading()||!self.login()||self.redirecting())return!0;const login=self.login().trim();return login.length<4});self.onKeyPress=function(data,event){return($loginInput.tooltip("destroy"),event.keyCode===13)?(self.submit(),!1):!0};self.switchToMode=function(mode){self.mode()!==mode&&self.mode(mode)}}ko.components.register("ssologin-form",{template:{url:"Login/Forms/ssologin-form.html"},viewModel:{createViewModel:function(params){return new SSOLoginModel(params)}}})}(jQuery,ko),function($,ko){function CreditCardDialogModel(params){function showError(error){error.length!==0&&(self.error(error),setTimeout(function(){self.error("")},5e3))}function showToolTip(element,message){(element||message)&&(element.tooltip({"class":"tooltip_error",placement:"top",trigger:"manual",html:!0,title:message}),element.tooltip("show"))}function showStripeError(result){if(result.error){let element;switch(result.error.code){case"incomplete_number":case"invalid_number":element=$("#StripeCardNumber");break;case"incomplete_cvc":element=$("#StripeCardCvc");break;case"incomplete_expiry":case"invalid_expiry_year_past":case"invalid_expiry_year":element=$("#StripeCardExpirationYearMonth");break;default:element=$("#StripeCardNumber")}element?showToolTip(element,result.error.message):showError(result.error.message)}}function initStripe(){if(!self.cardNumberIsSaved()){self.stripe=Stripe(window.StripePublishKey);const style={base:{height:"25px",lineHeight:"25px",backgroundColor:"#fff",fontSize:"16px"}},elements=self.stripe.elements();self.stripeCardNumber=elements.create("cardNumber",{style:style,placeholder:$.tabletopia.localization.cardNumber});self.stripeCardNumber.mount("#StripeCardNumber");self.stripeCardNumber.on("ready",function(){self.stripeCardNumber.focus()});self.stripeCardCvc=elements.create("cardCvc",{style:style});self.stripeCardCvc.mount("#StripeCardCvc");self.stripeCardExpiry=elements.create("cardExpiry",{style:style});self.stripeCardExpiry.mount("#StripeCardExpirationYearMonth")}}function updateRequest(model){return new Promise(function(resolve,reject){self.updatePaymentInfoRequest.load(model).then(function(data){data.status&&data.status.status==="complete"?resolve():(validateCardField(data.status.errorCode,data.status.errorMessageFromApi),reject())},function(){$("#error-dlg").modal();reject()})})}function validateCardField(errorCode,errorMessageFromApi){let errorMessage,element;if(errorCode!=="invalid_request_error")switch(errorCode){case"incorrect_number":element=$("#StripeCardNumber");errorMessage=$.tabletopia.localization.cardIncorrectNumber;break;case"incorrect_cvc":element=$("#StripeCardCvc");errorMessage=$.tabletopia.localization.cardIncorrectCvc;break;case"InvalidSwipeData":errorMessage=errorMessageFromApi?errorMessageFromApi:$.tabletopia.localization.cardInvalidSwipeData;break;case"expired_card":element=$("#StripeCardExpirationYearMonth");errorMessage=errorMessageFromApi?errorMessageFromApi:$.tabletopia.localization.cardExpiredCard;break;case"address_zip_check":errorMessage=$.tabletopia.localization.cardIncorrectZip;break;case"card_declined":errorMessage=errorMessageFromApi?errorMessageFromApi:$.tabletopia.localization.cardDeclined;break;case"Missing":errorMessage=errorMessageFromApi?errorMessageFromApi:$.tabletopia.localization.cardMissing;break;case"processing_error":errorMessage=errorMessageFromApi?errorMessageFromApi:$.tabletopia.localization.cardProcessingError;break;case"resource_missing":errorMessage=errorMessageFromApi}else errorCode==="invalid_request_error"&&errorMessageFromApi&&(errorMessage=errorMessageFromApi);errorMessage?element?showErrorTooltip(element,errorMessage):showError(errorMessage):$("#error-dlg").modal()}const self=this;if(self.cardData=params.cardData?params.cardData:ko.observable(),self.coupon=params.coupon?params.coupon:ko.observable(""),self.cardNumberIsSaved=ko.observable(!1),self.paymentAgreements=ko.observable(!1),self.cardHolderName=ko.observable(""),self.cardAddressZip=ko.observable(""),self.country=ko.observable(),self.email=ko.observable(window.user.email?window.user.email:""),self.dialogStatus=ko.observable(),self.countries=ko.observableArray(),self.error=ko.observable(""),self.updatePaymentInfoRequest=new $.tabletopia.put.subscriptions.updatePaymentInfo,self.getCountriesRequest=new $.tabletopia.get.geolocation.countries,self.cardData()&&(self.cardNumberIsSaved(!0),self.paymentAgreements=ko.observable(!0),self.cardHolderName(self.cardData().holder),self.cardAddressZip(self.cardData().zip),self.country(self.cardData().country),self.email(self.cardData().email)),params.status&&(self.dialogStatus=params.status),window.StripePublishKey)self.getCountriesRequest.load().done(function(response){response&&(self.countries(response),initStripe())});else{console.error("For use Card dialog set StripePublishKey");return}self.onCloseClick=function(){self.dialogStatus($.tabletopia.enums.cardDialogStatus.closed)};self.onChangeCardClick=function(){self.cardNumberIsSaved(!1);self.cardHolderName("");self.paymentAgreements(!1);initStripe()};self.onSubmit=function(){let element;if(self.cardHolderName().trim().length===0){element=$("#CardHolderName");showToolTip(element,$.tabletopia.localization.required.replace("{0}","Card Holder"));return}if(self.email().trim().length===0){element=$("#CardHolderEmail");showToolTip(element,$.tabletopia.localization.required.replace("{0}","Card Holder Email"));return}if(!self.country()){element=$("#Country");showToolTip(element,$.tabletopia.localization.required.replace("{0}","Country"));return}if(self.cardAddressZip().trim().length===0){element=$("#CardAddressZip");showToolTip(element,$.tabletopia.localization.required.replace("{0}","Card Zip Address"));return}self.cardNumberIsSaved()?self.updatePaymentInfo():self.createPaymentInfo()};self.isSaveDisabled=ko.pureComputed(function(){return self.updatePaymentInfoRequest.isLoading()||!self.paymentAgreements()});self.updatePaymentInfo=function(){if(!self.isSaveDisabled()){let model={UserId:window.user.id,CardUId:self.cardData().id,CardNumberIsSaved:self.cardNumberIsSaved(),Country:self.country(),Zip:self.cardAddressZip()};updateRequest(model).then(function(){self.cardData().zip=self.cardAddressZip();self.cardData().country=self.country();self.dialogStatus($.tabletopia.enums.cardDialogStatus.saved)})}};self.createPaymentInfo=function(){self.isSaveDisabled()||self.stripe.createPaymentMethod("card",self.stripeCardNumber,{billing_details:{name:self.cardHolderName(),email:self.email(),address:{country:self.country(),postal_code:self.cardAddressZip()}}}).then(function(result){if(result.error){showStripeError(result);return}let model={UserId:window.user.id,CardUId:result.paymentMethod.id,CardNumberIsSaved:!1,CardHolderEmail:self.email()};updateRequest(model).then(function(){self.cardData({id:result.paymentMethod.id,country:self.country(),zip:self.cardAddressZip(),cardNumberIsSaved:!0});self.dialogStatus($.tabletopia.enums.cardDialogStatus.saved)})})};self.minTwoDigits=function(n){return(n<10?"0":"")+n}}ko.components.register("creditcard-dialog",{template:{url:"Subscriptions/creditcard-dialog.html"},viewModel:{createViewModel:function(params){return new CreditCardDialogModel(params)}}});$.extend(!0,$,{tabletopia:{enums:{cardDialogStatus:{show:0,saved:10,closed:20}}}})}(jQuery,ko),function($,ko){function SubscriptionsDialogModel(params){function initDialog(dialogMode){self.dialogMode(dialogMode);self.isShow()||(self.inSteamBrowser?self.isShow(!0):self.userSubscriptionsInfoRequest.isLoading()||self.userSubscriptionsInfoRequest.load().done(function(response){response&&(response.subscriptions&&self.userSubscriptions(response.subscriptions),response.cardInfo&&self.cardData(response.cardInfo),response.subscriptionConstants&&(self.subscriptionConstants=response.subscriptionConstants,self.isShow(!0)))}))}const self=this;self.isShow=ko.observable(!1);self.canClose=ko.observable(!0);self.isShowBuyDialog=ko.observable(!1);self.autoBuy=ko.observable();self.buySuccessUrl=ko.observable();self.buyCancelUrl=ko.observable();self.showSteamCongratulations=ko.observable(params.showSteamCongratulations!==undefined?params.showSteamCongratulations:!0);self.inSteamBrowser=!!(window.unity&&typeof window.unity.client!="undefined");self.subscriptionConstants={};self.cardData=ko.observable();self.dialogMode=ko.observable();self.userSubscriptions=ko.observableArray([]);self.userSubscriptionsInfoRequest=new $.tabletopia.get.subscriptions.my;ko.postbox&&ko.postbox.subscribe($.tabletopia.postbox.subscriptions.show,function(data){const mode=data&&data.dialogMode?data.dialogMode:$.tabletopia.enums.subscriptionDialogMode.game;data&&(data.autoBuy!==undefined&&self.autoBuy(data.autoBuy),data.canClose!==undefined&&self.canClose(data.canClose),data.buySuccessUrl&&self.buySuccessUrl(data.buySuccessUrl),data.buyCancelUrl&&self.buyCancelUrl(data.buyCancelUrl));initDialog(mode)},!0)}ko.components.register("subscriptions-dialog",{template:{url:"Subscriptions/subscriptions-dialog.html"},viewModel:{createViewModel:function(params){return new SubscriptionsDialogModel(params)}}});$.extend(!0,$,{tabletopia:{enums:{subscriptionDialogMode:{game:0,designer:10,gift:20,videoChat:30},subscriptionType:{none:0,game:1,design:2,dlc:3}}}})}(jQuery,ko),function($,ko){function BuySubscriptionsSteamDialogModel(params){function initSteamHandlers(){window.user.id!==0&&self.unity&&(ko.postbox&&(ko.postbox.subscribe($.tabletopia.postbox.subscriptions.buySteamDlc,function(appId){appId&&buyDlc(appId)}),ko.postbox.subscribe($.tabletopia.postbox.subscriptions.initSteamInAppOrder,function(subscriptionId){subscriptionId&&initSteamInAppOrder(subscriptionId)}),ko.postbox.subscribe($.tabletopia.postbox.subscriptions.finalizeSteamInAppOrder,function(data){if(data){const json=JSON.parse(data);finalizeSteamInAppOrder(json.Authorized,json.AppID,json.OrderID)}})),window.FinalizeSteamInAppOrderOsx=function(data){const json=JSON.parse(data);finalizeSteamInAppOrder(json.Authorized,json.AppID,json.OrderID)},window.FinalizeSteamDlcOrderOsx=function(data){const json=JSON.parse(data);finalizeSteamDlcOrder(json.SteamAppId)},window.FinalizeSteamInAppOrder=function(command,data){if(console.log("FinalizeSteamInAppOrder: command - '"+command+"', date - "+new Date),console.log("FinalizeSteamInAppOrder: data - '"+JSON.stringify(data)+"'"),typeof data=="object"&&typeof data.value!="undefined"){const json=JSON.parse(data.value);finalizeSteamInAppOrder(json.Authorized,json.AppID,json.OrderID)}},window.FinalizeSteamDlcOrder=function(command,data){if(console.log("finalizeSteamDlcOrder: command - '"+command+"', date - "+new Date),console.log("finalizeSteamDlcOrder: data - '"+JSON.stringify(data)+"'"),typeof data=="object"&&typeof data.value!="undefined"){const json=JSON.parse(data.value);finalizeSteamDlcOrder(json.SteamAppId)}})}function finalizeSteamDlcOrder(steamAppId){self.synchronizeSteamDlcRequest.isLoading()||self.synchronizeSteamDlcRequest.load({SteamDlcId:steamAppId}).then(function(){window.location.reload()},function(){window.location.reload()})}function finalizeSteamInAppOrder(isAuthorized,appId,orderId){self.isWaitDialogShow(!0);const data={isAuthorized:isAuthorized,appId:appId,orderId:orderId};console.log("finalizeSteamInAppOrder: data: '"+JSON.stringify(data)+"'");self.finalizeSteamInAppRequest.load(data).then(function(resp){if(self.isWaitDialogShow(!1),console.log("finalizeSteamInAppOrder - Success Response: '"+JSON.stringify(resp)+"'"),typeof resp!="object"){$("#error-dlg").modal();return}switch(resp.status){case"Success":self.showSteamCongratulations()&&self.isCongratulationsDialogShow(!0);window.dataLayer.push({event:"upgrade_success"});resp.isVideoChat&&!self.showSteamCongratulations()&&self.unity.sendMessage("VideochatPurchasedSuccessfully");break;case"Canceled":self.onCloseClick();break;case"Error":self.isErrorDialogShow(!0)}},function(){console.log("finalizeSteamInAppOrder - Error");self.isWaitDialogShow(!1);self.isErrorDialogShow(!0)})}function buyDlc(steamAppId){self.unity&&self.unity.sendMessage("BuySteamDlc",{steamAppId:steamAppId})}function initSteamInAppOrder(subscriptionId){if(!self.isWaitDialogShow()&&subscriptionId&&!(subscriptionId<1)&&self.unity){self.isWaitDialogShow(!0);const request=new $.tabletopia.post.subscriptions.steam.buy(subscriptionId);request.load().then(function(resp){if(typeof resp!="object"||!resp.result){self.isErrorDialogShow(!0);return}self.unity&&self.unity.sendMessage("RefreshWindow",{});self.isWaitDialogShow(!1)},function(){self.isWaitDialogShow(!1);self.isErrorDialogShow(!0)})}}const self=this;self.autoBuy=params.autoBuy&&params.autoBuy()!==undefined?params.autoBuy:ko.observable(!0);self.isShow=params.isShow?params.isShow:ko.observable(!1);self.canClose=params.canClose?params.canClose:ko.observable(!0);self.buySuccessUrl=params.buySuccessUrl?params.buySuccessUrl:ko.observable();self.buyCancelUrl=params.buyCancelUrl?params.buyCancelUrl:ko.observable();self.showSteamCongratulations=params.showSteamCongratulations?params.showSteamCongratulations:ko.observable(!0);self.inSteamBrowser=params.inSteamBrowser;self.unity=undefined;self.isMedalShow=ko.observable(!1);self.isErrorDialogShow=ko.observable(!1);self.isCongratulationsDialogShow=ko.observable(!1);self.isWaitDialogShow=ko.observable(!1);self.synchronizeSteamDlcRequest=new $.tabletopia.post.subscriptions.steam.synchronizeDlc;self.finalizeSteamInAppRequest=new $.tabletopia.post.subscriptions.steam.finalize;self.inSteamBrowser&&typeof window.unity.client!="undefined"&&typeof window.unity.client.sendMessage=="function"&&(self.unity=window.unity.client,initSteamHandlers());self.isShow.subscribe(function(newValue){if(newValue&&self.autoBuy())self.onSubscriptionSelect(45)});self.onCloseClick=function(){self.canClose()&&(self.isShow(!1),self.buyCancelUrl()&&(window.location.href=self.buyCancelUrl()))};self.onSubscriptionSelect=function(subscriptionId){!ko.postbox||!subscriptionId||subscriptionId<1||(self.isShow(!1),ko.postbox.publish($.tabletopia.postbox.subscriptions.initSteamInAppOrder,subscriptionId))};self.onCongratulationsCloseClick=function(){self.isCongratulationsDialogShow(!1);self.isMedalShow(!0);setTimeout(function(){self.buySuccessUrl()?window.location.href=self.buySuccessUrl():window.location.reload()},2e3)};self.onErrorTryClick=function(){self.isErrorDialogShow(!1);self.isShow(!0)};self.onErrorCloseClick=function(){self.isErrorDialogShow(!1)}}ko.components.register("buy-dialog-steam",{template:{url:"Subscriptions/Steam/buy-dialog-steam.html"},viewModel:{createViewModel:function(params){return new BuySubscriptionsSteamDialogModel(params)}}})}(jQuery,ko),function($,ko){function BuySubscriptionsWebDialogModel(params){function updateSubscription(newSubscriptionId){if(!self.updateSubscriptionsRequest.isLoading()&&!self.isContinueDisabled()){self.isContinueDisabled(!0);refreshIdempotencyKey();self.errorText();let currentSubscriptionId;switch(self.dialogMode()){case $.tabletopia.enums.subscriptionDialogMode.designer:currentSubscriptionId=parseInt(self.designerSubscription());break;case $.tabletopia.enums.subscriptionDialogMode.game:currentSubscriptionId=parseInt(self.gameSubscription())}const model={userId:window.user.id,subscriptionId:currentSubscriptionId,newSubscriptionId:newSubscriptionId,couponCode:self.coupon(),idempotencyKey:self.idempotencyKey};self.updateSubscriptionsRequest.load(model).then(function(result){processResult(result)},function(){window.dataLayer.push({event:"upgrade_failed"});$("#error-dlg").modal();self.isContinueDisabled(!1)})}}function createSubscription(selectedSubscriptions){if(!self.createSubscriptionsRequest.isLoading()&&!self.isContinueDisabled()){self.isContinueDisabled(!0);refreshIdempotencyKey();self.errorText();const model={userId:window.user.id,subscriptionIds:selectedSubscriptions,couponCode:self.coupon(),idempotencyKey:self.idempotencyKey};self.createSubscriptionsRequest.load(model).then(function(result){processResult(result)},function(){window.dataLayer.push({event:"upgrade_failed"});self.errorText($.tabletopia.localization.operationFailed);self.isContinueDisabled(!1)})}}function processResult(data){const fail=data.subscriptions.every(function(result){return result.status.status==="fail"});if(!data.subscriptions||fail){const firstUnsuccessfulResult=$.grep(data.subscriptions,function(result){return result.status.status==="fail"})[0];self.errorText(firstUnsuccessfulResult.status.errorMessageFromApi);refreshIdempotencyKey();window.dataLayer.push({event:"upgrade_failed"});self.isContinueDisabled(!1)}else{const requiresActions=$.grep(data.subscriptions,function(result){return result.status.status==="requires_action"||result.status.status==="incomplete"||result.status.status==="past_due"});if(requiresActions.length>0){confirmPayment(requiresActions[0]);return}requestSuccess(data)}}function confirmPayment(data){const subscriptionId=data.subscriptionId;self.stripe||(self.stripe=Stripe(window.StripePublishKey));self.stripe.confirmCardPayment(data.clientSecret).then(function(result){if(self.isContinueDisabled(!1),result.error)self.errorText(result.error.message);else{let model={SubscriptionId:subscriptionId};self.activateSubscriptionsRequest.load(model).then(function(result){requestSuccess(result)})}})}function requestSuccess(data){data.subscriptions.every(function(result){result.status.status!=="fail"&&window.dataLayer.push({user_id:window.user.id,trial:result.status.status==="trialing",plan_new:result.subscriptionName,plan_previous:result.prevSubscriptionName,user_subscription_id:result.subscriptionId,event:self.isUpgrade?"plan_changed":"plan_chosen_first"})});window.dataLayer.push({event:"upgrade_success"});self.isContinueDisabled(!0);self.buySuccessUrl()&&(window.location.href===self.buySuccessUrl()?window.location.reload():window.location.href=self.buySuccessUrl());self.isUpgrade||(window.location.href="/profile")}function refreshIdempotencyKey(){self.idempotencyKey=Date.now().toString(36)+Math.random().toString(36).substr(2)}function setCurrentGameSubscription(subscriptions){if(subscriptions&&self.dialogMode()===$.tabletopia.enums.subscriptionDialogMode.game)for(let item of subscriptions)if(item.type===$.tabletopia.enums.subscriptionType.game||item.type===$.tabletopia.enums.subscriptionType.none)for(let constSubscription of self.gameSubscriptions)if(item.subscriptionId.toString()===constSubscription.id){self.annual(constSubscription.annual);self.gameSubscription(item.subscriptionId.toString());break}}function setCurrentDesignerSubscription(subscriptions){if(subscriptions&&self.dialogMode()===$.tabletopia.enums.subscriptionDialogMode.designer)for(let item of subscriptions)if(item.type===$.tabletopia.enums.subscriptionType.design||item.type===$.tabletopia.enums.subscriptionType.none)for(let constSubscription of self.designerSubscriptions)if(item.subscriptionId.toString()===constSubscription.id){self.annual(constSubscription.annual);self.designerSubscription(item.subscriptionId.toString());break}}const self=this;self.subscriptionConstants=params.subscriptionConstants;self.gameSubscriptions=[{id:self.subscriptionConstants.basicSubscriptionId.toString(),text:$.tabletopia.localization.bronze,"class":"_light_grey",annual:!0},{id:self.subscriptionConstants.playersSilverMonthId.toString(),text:$.tabletopia.localization.silver,"class":"_light_blue",annual:!1},{id:self.subscriptionConstants.playersGoldMonthId.toString(),text:$.tabletopia.localization.gold,"class":"_gold",annual:!1},{id:self.subscriptionConstants.playersSilverAnnualId.toString(),text:$.tabletopia.localization.silver,"class":"_light_blue",annual:!0},{id:self.subscriptionConstants.playersGoldAnnualId.toString(),text:$.tabletopia.localization.gold,"class":"_gold",annual:!0}];self.designerSubscriptions=[{id:self.subscriptionConstants.basicSubscriptionId.toString(),text:$.tabletopia.localization.basic,"class":"_light_grey",annual:!0},{id:self.subscriptionConstants.workshopAdvancedMonthId.toString(),text:$.tabletopia.localization.advanced,"class":"_light_blue",annual:!1},{id:self.subscriptionConstants.workshopProMonthId.toString(),text:$.tabletopia.localization.pro,"class":"_gold",annual:!1},{id:self.subscriptionConstants.workshopAdvancedAnnualId.toString(),text:$.tabletopia.localization.advanced,"class":"_light_blue",annual:!0},{id:self.subscriptionConstants.workshopProAnnualId.toString(),text:$.tabletopia.localization.pro,"class":"_gold",annual:!0},];self.errorText=ko.observable("");self.isUpgrade=!1;self.trialAllowed=window.user.trialAllowed!==undefined?window.user.trialAllowed:ko.observable(!1);self.isShow=params.isShow?params.isShow:ko.observable(!1);self.dialogMode=params.dialogMode;self.canClose=params.canClose;self.buySuccessUrl=params.buySuccessUrl?params.buySuccessUrl:ko.observable();self.buyCancelUrl=params.buyCancelUrl?params.buyCancelUrl:ko.observable();self.isContinueDisabled=ko.observable(!1);self.coupon=ko.observable("");self.cardData=params.cardData!==undefined?params.cardData:ko.observable();self.cardDialogStatus=ko.observable();self.annual=ko.observable(!0);self.designerSubscription=ko.observable();self.designerSubscriptionName=ko.observable();self.gameSubscription=ko.observable();self.gameSubscriptionName=ko.observable();self.createSubscriptionsRequest=new $.tabletopia.post.subscriptions.create;self.updateSubscriptionsRequest=new $.tabletopia.put.subscriptions.update;self.activateSubscriptionsRequest=new $.tabletopia.post.subscriptions.activate;self.setGameSubscription=function(subscription){self.isContinueDisabled()||(self.gameSubscription(subscription.id),self.gameSubscriptionName(subscription.text))};self.setDesignerSubscription=function(subscription){self.isContinueDisabled()||(self.designerSubscription(subscription.id),self.designerSubscriptionName(subscription.text))};self.annual(!0);self.setGameSubscription(self.gameSubscriptions[4]);self.setDesignerSubscription(self.designerSubscriptions[0]);params.subscriptions&&params.subscriptions().length>0&&(self.isUpgrade=!0,setCurrentGameSubscription(params.subscriptions()),setCurrentDesignerSubscription(params.subscriptions()));self.onCloseClick=function(){self.canClose()&&(self.isShow(!1),self.buyCancelUrl()&&(window.location.href=self.buyCancelUrl()))};self.selectMode=function(mode){self.dialogMode(mode)};self.gameTabClass=ko.pureComputed(function(){for(let item of self.gameSubscriptions)if(item.id===self.gameSubscription())return item.class;return self.gameSubscriptions[0].class});self.designerTabClass=ko.pureComputed(function(){for(let item of self.designerSubscriptions)if(item.id===self.designerSubscription())return item.class;return self.designerSubscriptions[0].class});self.continueButtonText=ko.pureComputed(function(){return self.trialAllowed()?$.tabletopia.localization.chooseSubscriptionContinueBtnTxt2:$.tabletopia.localization.chooseSubscriptionContinueBtnTxt.replace("{0}",self.gameSubscriptionName()).replace("{1}",self.designerSubscriptionName())});self.upgrade=function(subscription){if(self.cardData())updateSubscription(subscription.id);else{self.cardDialogStatus($.tabletopia.enums.cardDialogStatus.show);const koSubscription=self.cardDialogStatus.subscribe(function(newValue){newValue===$.tabletopia.enums.cardDialogStatus.saved&&updateSubscription(subscription.id);koSubscription.dispose()})}};self.onConfirmClick=function(){const selectedSubscriptions=[parseInt(self.gameSubscription()),parseInt(self.designerSubscription())];if(self.designerSubscription()!==self.designerSubscriptions[0].id||self.gameSubscription()!==self.gameSubscriptions[0].id)if(self.cardData())createSubscription(selectedSubscriptions);else{self.cardDialogStatus($.tabletopia.enums.cardDialogStatus.show);const koSubscription=self.cardDialogStatus.subscribe(function(newValue){newValue===$.tabletopia.enums.cardDialogStatus.saved&&createSubscription(selectedSubscriptions);koSubscription.dispose()})}else createSubscription(selectedSubscriptions)}}ko.components.register("buy-dialog-web",{template:{url:"Subscriptions/Web/buy-dialog-web.html"},viewModel:{createViewModel:function(params){return new BuySubscriptionsWebDialogModel(params)}}})}(jQuery,ko),function($,ko){function BuyVideoChatWebDialogModel(params){function createSubscription(selectedSubscriptions){if(!self.createSubscriptionsRequest.isLoading()&&!self.isContinueDisabled()){self.isContinueDisabled(!0);refreshIdempotencyKey();self.errorText("");const model={userId:window.user.id,subscriptionIds:selectedSubscriptions,couponCode:self.coupon(),idempotencyKey:self.idempotencyKey};self.createSubscriptionsRequest.load(model).then(function(result){processResult(result)},function(){window.dataLayer.push({event:"upgrade_failed"});self.errorText($.tabletopia.localization.operationFailed);self.isContinueDisabled(!1)})}}function processResult(data){const fail=data.subscriptions.every(function(result){return result.status.status==="fail"});if(!data.subscriptions||fail){const firstUnsuccessfulResult=$.grep(data.subscriptions,function(result){return result.status.status==="fail"})[0];self.errorText(firstUnsuccessfulResult.status.errorMessageFromApi);refreshIdempotencyKey();window.dataLayer.push({event:"upgrade_failed"});self.isContinueDisabled(!1)}else{const requiresActions=$.grep(data.subscriptions,function(result){return result.status.status==="requires_action"||result.status.status==="incomplete"||result.status.status==="past_due"});if(requiresActions.length>0){confirmPayment(requiresActions[0]);return}requestSuccess(data)}}function confirmPayment(data){const subscriptionId=data.subscriptionId;self.stripe||(self.stripe=Stripe(window.StripePublishKey));self.stripe.confirmCardPayment(data.clientSecret).then(function(result){if(self.isContinueDisabled(!1),result.error)self.errorText(result.error.message);else{let model={SubscriptionId:subscriptionId};self.activateSubscriptionsRequest.load(model).then(function(result){requestSuccess(result)})}})}function requestSuccess(data){data.subscriptions.every(function(result){result.status.status!=="fail"&&window.dataLayer.push({user_id:window.user.id,trial:result.status.status==="trialing",plan_new:result.subscriptionName,plan_previous:result.prevSubscriptionName,user_subscription_id:result.subscriptionId,event:self.isUpgrade?"plan_changed":"plan_chosen_first"})});window.dataLayer.push({event:"upgrade_success"});self.isContinueDisabled(!0);self.isCongratulationsDialogShow(!0)}function refreshIdempotencyKey(){self.idempotencyKey=Date.now().toString(36)+Math.random().toString(36).substr(2)}const self=this,videoChatSubscriptionId=params.subscriptionConstants.videoChatMonthId;self.errorText=ko.observable("");self.currentSubscription=undefined;self.trialAllowed=window.user.trialAllowed!==undefined?window.user.trialAllowed:ko.observable(!1);self.isShow=params.isShow?params.isShow:ko.observable(!1);self.dialogMode=params.dialogMode;self.canClose=params.canClose;self.buySuccessUrl=params.buySuccessUrl?params.buySuccessUrl:ko.observable();self.buyCancelUrl=params.buyCancelUrl?params.buyCancelUrl:ko.observable();self.isContinueDisabled=ko.observable(!1);self.isCongratulationsDialogShow=ko.observable(!1);self.coupon=ko.observable("");self.cardData=params.cardData?params.cardData:ko.observable();self.cardDialogStatus=ko.observable();self.createSubscriptionsRequest=new $.tabletopia.post.subscriptions.create;self.activateSubscriptionsRequest=new $.tabletopia.post.subscriptions.activate;for(let item of params.subscriptions())if(item.subscriptionId===videoChatSubscriptionId){self.currentSubscription=item;break}self.onCloseClick=function(){self.canClose()&&(self.isShow(!1),self.buyCancelUrl()&&(window.location.href=self.buyCancelUrl()))};self.onCongratulationsCloseClick=function(){self.isCongratulationsDialogShow(!1);window.clientV4&&window.clientV4.Tabletopia?(window.clientV4.Tabletopia.SendMessage("VideoChatStatusReceiver","VideoChatSuccessPurchasedCallback"),self.isShow(!1)):self.buySuccessUrl()&&(window.location.href===self.buySuccessUrl()?window.location.reload():window.location.href=self.buySuccessUrl())};self.buyVideoChatSubscription=function(){if(self.cardData())createSubscription([videoChatSubscriptionId]);else{self.cardDialogStatus($.tabletopia.enums.cardDialogStatus.show);const koSubscription=self.cardDialogStatus.subscribe(function(newValue){newValue===$.tabletopia.enums.cardDialogStatus.saved&&createSubscription([videoChatSubscriptionId]);koSubscription.dispose()})}};self.cancelVideoChatSubscription=function(){if(!self.isContinueDisabled()){self.isContinueDisabled(!0);const cancelSubscriptionsRequest=new $.tabletopia.delete.subscriptions.subscription({userId:window.user.id,subscriptionId:self.currentSubscription.id});cancelSubscriptionsRequest.load().then(function(){self.buySuccessUrl()&&(window.location.href===self.buySuccessUrl()?window.location.reload():window.location.href=self.buySuccessUrl())},function(){window.dataLayer.push({event:"upgrade_failed"});self.errorText($.tabletopia.localization.operationFailed);self.isContinueDisabled(!1)})}};self.onConfirmClick=function(){const selectedSubscriptions=[parseInt(self.gameSubscription()),parseInt(self.designerSubscription())];if(self.designerSubscription()!==self.designerSubscriptions[0].id||self.gameSubscription()!==self.gameSubscriptions[0].id)if(self.cardData())createSubscription(selectedSubscriptions);else{self.cardDialogStatus($.tabletopia.enums.cardDialogStatus.show);const koSubscription=self.cardDialogStatus.subscribe(function(newValue){newValue===$.tabletopia.enums.cardDialogStatus.saved&&createSubscription(selectedSubscriptions);koSubscription.dispose()})}else createSubscription(selectedSubscriptions)}}ko.components.register("buy-videochat-web",{template:{url:"Subscriptions/Web/buy-videochat-web.html"},viewModel:{createViewModel:function(params){return new BuyVideoChatWebDialogModel(params)}}})}(jQuery,ko)