/** * This file acts as an abstraction layer between HTML and JS. */ var playerName = "" var debugSessionToken = null const debugMode = true // Does not load session token, to allow multiple players per browser const offlineText = "Offline" const missingPlayerText = "Leer" const elementIdUserName = "user-name" const elementIdUserPssword = "user-pwd" const elementIdPlayerCards = "player-cards" const elementIdLoginWindow = "login-window" const elementIdTopBar = "top-bar" const elementIdTableListBar = "table-list-bar" const elementIdTableList = "table-list" const elementIdGameBar = "game-bar" const elementIdTablePlayers = "table-players" const elementIdTableName = "table-name-label" const elementIdPlayerName = "player-name" const elementIdLoginError = "login-error" const elementIdTableNameField = "table-name-field" const elementIdPublicTableCheckbox = "table-public-checkbox" const elementIdActionBar = "action-bar" const elementIdAvailableGamesList = "available-games-list" const elementIdGameSummary = "game-summary" const localStorageTokenId = "token" function showDebugLogins() { document.getElementById("login-window-inner").innerHTML += "" + "" + "" + "" } function loginDebugUser(name) { document.getElementById(elementIdUserName).value = name document.getElementById(elementIdUserPssword).value = name loginUser() } function setDisplayStyle(id, style) { document.getElementById(id).style.display = style } function hide(elementId) { setDisplayStyle(elementId, "none") } function showLoginElements() { setDisplayStyle(elementIdLoginWindow, "table") hide(elementIdTopBar) hide(elementIdTableListBar) hide(elementIdTableList) hide(elementIdGameBar) hide(elementIdTablePlayers) hide(elementIdPlayerCards) hide(elementIdActionBar) } function showTableListElements() { hide(elementIdLoginWindow) setDisplayStyle(elementIdTopBar, "inherit") setDisplayStyle(elementIdTableListBar, "grid") setDisplayStyle(elementIdTableList, "inherit") hide(elementIdGameBar) hide(elementIdTablePlayers) hide(elementIdPlayerCards) hide(elementIdActionBar) } function showGameElements() { hide(elementIdLoginWindow) setDisplayStyle(elementIdTopBar, "inherit") hide(elementIdTableListBar) hide(elementIdTableList) setDisplayStyle(elementIdGameBar, "grid") setDisplayStyle(elementIdTablePlayers, "grid") setDisplayStyle(elementIdPlayerCards, "grid") setDisplayStyle(elementIdActionBar, "inline-block") } function showTableName(name) { document.getElementById(elementIdTableName).innerHTML = name } function showConnectedState() { showPlayerState("bottom", "") } function showDisconnectedState() { showPlayerDisconnected("bottom") } function setPlayerName(name) { document.getElementById(elementIdPlayerName).innerHTML = name playerName = name } function getLoginName() { return document.getElementById(elementIdUserName).value } function clearLoginName() { document.getElementById(elementIdUserName).value = "" } function getLoginPassword() { return document.getElementById(elementIdUserPssword).value } function clearLoginPassword() { document.getElementById(elementIdUserPssword).value = "" } function getSessionToken() { if (debugMode) { return debugSessionToken } return localStorage.getItem(localStorageTokenId) } function setSessionToken(token) { if (debugMode) { debugSessionToken = token return } localStorage.setItem(localStorageTokenId, token) } function deleteSessionToken() { localStorage.removeItem(localStorageTokenId) } function setLoginError(text) { document.getElementById(elementIdLoginError).innerHTML = text } function getTableName() { return document.getElementById(elementIdTableNameField).value } function clearTableName() { return document.getElementById(elementIdTableNameField).value = "" } function getTableVisibility() { return document.getElementById(elementIdPublicTableCheckbox).checked } function setTableListContent(content) { document.getElementById(elementIdTableList).innerHTML = content } function setEmptyPlayerInfo(position) { setTablePlayerName(position, null, false) showPlayerState(position, "") setTableCard(position, "", 1) } function setTablePlayerName(position, name, active) { const nameElement = document.getElementById("table-player-name-" + position) if (name == null) { nameElement.style.color = "var(--secondary-text-color)" nameElement.innerHTML = missingPlayerText } else { nameElement.style.color = active ? "var(--button-color)" : "var(--text-color)" nameElement.innerHTML = name } } function showPlayerDisconnected(position) { setPlayerState(position, "var(--alert-color)", offlineText) } function showPlayerState(position, state) { setPlayerState(position, "var(--secondary-text-color)", state) } function setPlayerState(position, color, text) { const connectionElement = "table-player-state-" + position const element = document.getElementById(connectionElement) element.style.color = color element.innerHTML = text } function setTableCard(position, card, layer) { const id = "table-player-card-" + position setCard(id, card, layer) } function setHandCard(index, card, playable) { const id = "player-card" + index.toString() setCard(id, card, 1) const button = document.getElementById(id) if (playable) { button.disabled = false button.onclick = function() { playCard(card) } } else { button.disabled = true button.onclick = function() { } } } function setCard(id, card, layer) { const element = document.getElementById(id) if (card == "") { element.style.backgroundColor = "var(--element-background)" element.style.backgroundImage = "" element.style.zIndex = 0 } else { element.style.backgroundColor = "" element.style.backgroundImage = "url('/cards/" + card + ".jpeg')" element.style.zIndex = layer + 1 } } function updateTableInfo(table) { showTableName(table.name) // Set own cards const cardCount = table.cards.length for (let i = 0; i < cardCount; i += 1) { const card = table.cards[i] setHandCard(i+1, card.card, card.playable) } for (let i = cardCount; i < 8; i += 1) { setHandCard(i+1, "", false) } let playedGame = null if (table.hasOwnProperty("game")) { playedGame = textForAction(table.game) } // Show player info console.log(table) setInfoForPlayer(table.player, "bottom", playedGame) if (table.playerSelectsGame) { setActionsForOwnPlayer(table.playableGames) showAvailableGames([]) } else { if (table.player.active) { showAvailableGames(table.playableGames) } else { showAvailableGames([]) } setActionsForOwnPlayer(table.actions) } if (table.hasOwnProperty("playerLeft")) { setInfoForPlayer(table.playerLeft, "left", playedGame) } else { setEmptyPlayerInfo("left") } if (table.hasOwnProperty("playerAcross")) { setInfoForPlayer(table.playerAcross, "top", playedGame) } else { setEmptyPlayerInfo("top") } if (table.hasOwnProperty("playerRight")) { setInfoForPlayer(table.playerRight, "right", playedGame) } else { setEmptyPlayerInfo("right") } if (table.hasOwnProperty("summary")) { setGameSummary(table.summary) } else { hideGameSummary() } } function setGameSummary(summary) { document.getElementById(elementIdGameSummary).innerHTML = summary.text setDisplayStyle(elementIdGameSummary, "inherit") } function hideGameSummary() { hide(elementIdGameSummary) } function setInfoForPlayer(player, position, game) { var card = "" if (player.hasOwnProperty("card")) { card = player.card } const leadsGame = player.leads const layer = player.position setTableCard(position, card, layer) setTablePlayerName(position, player.name, player.active) if (!player.connected) { showPlayerDisconnected(position) return } var state = [] if (game != null && leadsGame) { state.push(game) } const double = doubleText(player.doubles) if (double) { state.push(double) } const text = state.join(", ") showPlayerState(position, text) } function doubleText(doubles) { if (doubles == 0) { return null } if (doubles == 1) { return "gedoppelt" } return doubles.toString() + "x gedoppelt" } function clearInfoForPlayer(position) { setEmptyPlayerInfo(position) } function setActionsForOwnPlayer(actions) { var len = actions.length var html = "" for (let i = 0; i < len; i += 1) { const action = actions[i] const content = textForAction(action) html += "" } document.getElementById(elementIdActionBar).innerHTML = html } function textForAction(action) { switch (action) { /// The player can request cards to be dealt case "deal": return "Austeilen" /// The player doubles on the initial four cards case "double": return "Legen" /// The player does not double on the initial four cards case "skip": return "Nicht legen" /// The player offers a wedding (one trump card) case "wedding": return "Hochzeit anbieten" /// The player can choose to accept the wedding case "accept": return "Hochzeit akzeptieren" /// The player matches or increases the game during auction case "bid": return "Spielen" /// The player does not want to play case "out": return "Weg" /// The player claims to win and doubles the game cost ("schießen") case "raise": return "Schießen" case "ruf": return "Ruf" case "ruf-eichel": return "Ruf Eichel" case "ruf-blatt": return "Ruf Blatt" case "ruf-schelln": return "Ruf Schelln" case "bettel": return "Bettel" case "wenz": return "Wenz" case "geier": return "Geier" case "solo": return "Solo" case "solo-eichel": return "Eichel Solo" case "solo-blatt": return "Blatt Solo" case "solo-herz": return "Herz Solo" case "solo-schelln": return "Schelln Solo" } return action } function performAction(action) { const token = getSessionToken() if (token == null) { showBlankLogin() return } performPlayerActionRequest(token, action) // TODO: Handle errors and success } function showAvailableGames(games) { var len = games.length var html = "" for (let i = 0; i < len; i += 1) { const game = games[i] const content = textForAction(game) html += "
" + content + "
" } document.getElementById(elementIdAvailableGamesList).innerHTML = html }