diff --git a/site/finska/index.html b/site/finska/index.html
deleted file mode 100644
index 3112edc..0000000
--- a/site/finska/index.html
+++ /dev/null
@@ -1,59 +0,0 @@
-
-
-
-
-
- Mahjong Score Card - Tools
-
-
-
-
-
- Finska Scorecard
-
-
-
-
-
- | Team A |
- Team B |
-
-
-
-
-
-
- |
-
- |
- |
-
-
- |
- |
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/site/finska/scripts/controllers.js b/site/finska/scripts/controllers.js
deleted file mode 100644
index 03fd023..0000000
--- a/site/finska/scripts/controllers.js
+++ /dev/null
@@ -1,160 +0,0 @@
-import { Controller } from "https://unpkg.com/@hotwired/stimulus/dist/stimulus.js";
-import { Scorecard, getStoreDAO } from "./models.js";
-
-const storeDao = getStoreDAO();
-
-export class FinskaScorecardController extends Controller {
- static targets = ["score1Input", "score2Input", "scoreTable"];
- static values = {
- maxScore: Number,
- overflowScoreTo: Number
- }
-
- connect() {
- let rules = {
- maxScore: Math.floor(this.maxScoreValue),
- overflowScoreTo: Math.floor(this.overflowScoreToValue)
- };
-
- this._undoStack = [];
- this._scorecard = storeDao.loadOrCreate(rules);
- this.updateTable();
- }
-
- updateTable() {
- let tableBody = this.scoreTableTarget;
- let tableRows = tableBody.querySelectorAll("tr");
- let pairs = this._scorecard.pairs();
-
- for (let pairIndex = 0; pairIndex < pairs.length; pairIndex++) {
- let tableRow;
- if (pairIndex >= tableRows.length) {
- tableRow = this._appendRow();
- } else {
- tableRow = tableRows[pairIndex];
- }
-
- this._updateRow(tableRow, pairs[pairIndex])
- }
-
- // Remove any extra rows
- for (let i = pairs.length; i < tableRows.length; i++) {
- tableBody.removeChild(tableRows[i]);
- }
-
- console.log(JSON.stringify(this._scorecard.toJson()));
- }
-
- _updateRow(tableRow, pair) {
- let tds = tableRow.querySelectorAll("td");
-
- this._updateCell(pair.p1, tds[0], tds[1]);
- this._updateCell(pair.p2, tds[2], tds[3]);
- }
-
- _updateCell(score, scoreCell, totalCell) {
- scoreCell.classList.value = "";
- totalCell.classList.value = "";
-
- if (score != null) {
- scoreCell.textContent = score.score;
- totalCell.textContent = score.total;
-
- if (score.score === 0) {
- scoreCell.classList.add("score-foul");
- totalCell.classList.add("score-foul");
- } else if (score.wasOverflow) {
- scoreCell.classList.add("score-overflow");
- totalCell.classList.add("score-overflow");
- } else if (score.wasWin) {
- scoreCell.classList.add("score-win");
- totalCell.classList.add("score-win");
- }
- } else {
- scoreCell.textContent = "";
- totalCell.textContent = "";
- }
- }
-
- _appendRow() {
- let newRow = document.createElement("tr");
- newRow.classList.add("score-entry");
-
- for (let i = 0; i < 4; i++) {
- newRow.appendChild(document.createElement("td"));
- }
-
- this.scoreTableTarget.appendChild(newRow);
- return newRow;
- }
-
- addScore1() {
- this._addScore(this.score1InputTarget, this.score2InputTarget,
- this._scorecard.addPlayer1Score.bind(this._scorecard),
- this._scorecard.removeLastPlayer1Score.bind(this._scorecard));
- }
-
- addScore2() {
- this._addScore(this.score2InputTarget, this.score1InputTarget,
- this._scorecard.addPlayer2Score.bind(this._scorecard),
- this._scorecard.removeLastPlayer2Score.bind(this._scorecard));
-
- }
-
- _addScore(inputElem, focusToInputElem, addScoreFn, queueUndoFn) {
- let score = parseInt(inputElem.value);
- if (isNaN(score)) {
- score = 0;
- }
-
- addScoreFn(score);
- this._undoStack.push(queueUndoFn);
-
- inputElem.value = "";
-
- storeDao.save(this._scorecard);
- this.updateTable();
-
- focusToInputElem.focus();
- }
-
- score1KeyDown(e) {
- this._handleKeyDown(e, this.addScore1.bind(this));
- }
-
- score2KeyDown(e) {
- this._handleKeyDown(e, this.addScore2.bind(this));
- }
-
- _handleKeyDown(e, addScoreFn) {
- if (e.key === "Enter") {
- e.preventDefault();
- addScoreFn();
- }
- }
-
- undoLast() {
- if (this._undoStack.length === 0) {
- return;
- }
- if (!confirm("Really undo last move?")) {
- return;
- }
-
- (this._undoStack.pop())();
-
- storeDao.save(this._scorecard);
- this.updateTable();
- }
-
- resetAll() {
- if (!confirm("Really reset?")) {
- return;
- }
-
- this._scorecard.reset();
- storeDao.clear();
- this._undoStack = [];
- this.updateTable();
- }
-}
diff --git a/site/finska/scripts/main.js b/site/finska/scripts/main.js
deleted file mode 100644
index 34ece68..0000000
--- a/site/finska/scripts/main.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import { Application } from "https://unpkg.com/@hotwired/stimulus/dist/stimulus.js";
-import { FinskaScorecardController } from "./controllers.js"
-
-window.Stimulus = Application.start();
-
-window.Stimulus.register('finska-scorecard', FinskaScorecardController);
-
diff --git a/site/finska/scripts/models.js b/site/finska/scripts/models.js
deleted file mode 100644
index 61d917a..0000000
--- a/site/finska/scripts/models.js
+++ /dev/null
@@ -1,152 +0,0 @@
-export class ScoreEntry {
- constructor(score, total, foul, wasOverflow, wasWin) {
- this.score = score;
- this.total = total;
- this.fouls = foul;
- this.wasOverflow = wasOverflow;
- this.wasWin = wasWin;
- }
-};
-
-export class Scorecard {
-
- constructor(rules) {
- this.rules = rules;
- this.reset();
- }
-
- reset() {
- this._player1Scores = [];
- this._player2Scores = [];
- }
-
- addPlayer1Score(newScore) {
- this._addScore(this._player1Scores, newScore);
- }
-
- removeLastPlayer1Score() {
- this._player1Scores.pop();
- }
-
- addPlayer2Score(newScore) {
- this._addScore(this._player2Scores, newScore);
- }
-
- removeLastPlayer2Score() {
- this._player2Scores.pop();
- }
-
- _addScore(playerScores, newScore) {
- let lastEntry;
- if (playerScores.length === 0) {
- lastEntry = new ScoreEntry(0, 0, 0, false, false);
- } else {
- lastEntry = playerScores[playerScores.length - 1];
- }
-
- let newEntry = this._newEntryFromPrevious(newScore, lastEntry);
-
- playerScores.push(newEntry);
- }
-
- length() {
- return Math.max(this._player1Scores.length, this._player2Scores.length);
- }
-
- pairs() {
- let pairs = [];
-
- for (let i = 0; i < this.length(); i++) {
- pairs.push({
- p1: (i < this._player1Scores.length ? this._player1Scores[i] : null),
- p2: (i < this._player2Scores.length ? this._player2Scores[i] : null),
- })
- }
-
- return pairs;
- }
-
- _newEntryFromPrevious(score, previousScoreEntry) {
- if (previousScoreEntry === null) {
- return new ScoreEntry(score, score, (score === 0 ? 1 : 0));
- }
-
- let wasOverflow = false, wasWin = false;
- let newTotal = previousScoreEntry.total + score;
-
- if (newTotal === this.rules.maxScore) {
- wasWin = true;
- } else if (newTotal > this.rules.maxScore) {
- newTotal = this.rules.overflowScoreTo;
- wasOverflow = true;
- }
-
- let newFouls = previousScoreEntry.foul;
- if (score === 0) {
- newFouls++;
- }
-
- return new ScoreEntry(score, newTotal, newFouls, wasOverflow, wasWin);
- }
-
- toJson() {
- return {
- "version": 1,
- "rules": this.rules,
- "p1": { "scores": this._player1Scores.map(p => p.score) },
- "p2": { "scores": this._player2Scores.map(p => p.score) },
- };
- }
-
- static fromJson(o) {
- let scorecard = new Scorecard(o.rules);
- o["p1"]["scores"].forEach(x => scorecard.addPlayer1Score(x));
- o["p2"]["scores"].forEach(x => scorecard.addPlayer2Score(x));
- return scorecard;
- }
-}
-
-class StoreDAO {
-
- constructor(localStorage) {
- this._localStorage = localStorage;
- }
-
- save(scoreCard) {
- this._localStorage.setItem('score_card', JSON.stringify(scoreCard.toJson()));
- }
-
- loadOrCreate(rules) {
- try {
- console.log("Loading scorecard");
- let scoreCardJson = this._localStorage.getItem('score_card');
- if (scoreCardJson !== null) {
- return Scorecard.fromJson(JSON.parse(scoreCardJson));
- }
- } catch (e) {
- console.log(`Could not restore game: ${e}`);
- }
-
- return new Scorecard(rules);
- }
-
- clear() {
- this._localStorage.clear();
- }
-}
-
-class DummyStoreDAO {
- save(scoreCard) { }
- loadOrCreate(rules) {
- return new Scorecard(rules);
- }
- clear() { }
-}
-
-export function getStoreDAO() {
- if (!!window.localStorage) {
- return new StoreDAO(window.localStorage);
- } else {
- return new DummyStoreDAO();
- }
-}
\ No newline at end of file
diff --git a/site/finska/style.css b/site/finska/style.css
deleted file mode 100644
index f4ef62c..0000000
--- a/site/finska/style.css
+++ /dev/null
@@ -1,17 +0,0 @@
-.score-foul {
- color: #861D13;
- background-color: #F8DCD6;
- font-weight: bold;
-}
-
-.score-overflow {
- color: #5B4200;
- background-color: #FCEFD9;
- font-weight: bold;
-}
-
-.score-win {
- color: #394D00;
- background-color: #DEFC85;
- font-weight: bold;
-}
\ No newline at end of file
diff --git a/site/index.html b/site/index.html
index 85da7ef..444f37f 100644
--- a/site/index.html
+++ b/site/index.html
@@ -25,7 +25,6 @@
Two-letter Country Codes
Timestamp Converter
Mahjong Scorecard
- Finska Scorecard