214 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			214 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
'use strict';
 | 
						|
 | 
						|
const RaMemoryPage = {
 | 
						|
    howToPlayId: "how-to-play",
 | 
						|
    aboutId: "about",
 | 
						|
    gameId: "game",
 | 
						|
    imprintId: "imprint",
 | 
						|
    gdprId: "gdpr",
 | 
						|
    settingsId: "settings",
 | 
						|
    displayNoneClass: Css.classes.displayNone,
 | 
						|
    howToPlayBtnClass: "btn-howto",
 | 
						|
    gdprBtnClass: "btn-gdpr",
 | 
						|
    imprintBtnClass: "btn-imprint",
 | 
						|
    settingsBtnClass: "btn-settings",
 | 
						|
    themeSwitchBtnClass: "btn-toggle-theme",
 | 
						|
    settingsCheckUseCookiesId: "settings-use-cookies",
 | 
						|
    settingsCheckSaveHighscoreId: "settings-save-highscore",
 | 
						|
    settingsRadioStartValueClass: "settings-start-value",
 | 
						|
    scrollToTimeout: 200,
 | 
						|
    timeoutId: 0,
 | 
						|
    prefersDarkTheme: null,
 | 
						|
    currentTheme: null,
 | 
						|
    closeAll: function (_this, not = "") {
 | 
						|
        if (document.getElementById(_this.howToPlayId) && not !== _this.howToPlayId) {
 | 
						|
            if (!document.getElementById(_this.howToPlayId).classList.contains(_this.displayNoneClass)) {
 | 
						|
                document.getElementById(_this.howToPlayId).classList.add(_this.displayNoneClass);
 | 
						|
            }
 | 
						|
        }
 | 
						|
        if (document.getElementById(_this.gameId) && not !== _this.gameId) {
 | 
						|
            if (!document.getElementById(_this.gameId).classList.contains(_this.displayNoneClass)) {
 | 
						|
                document.getElementById(_this.gameId).classList.add(_this.displayNoneClass);
 | 
						|
            }
 | 
						|
        }
 | 
						|
        if (document.getElementById(_this.aboutId) && not !== _this.aboutId) {
 | 
						|
            if (!document.getElementById(_this.aboutId).classList.contains(_this.displayNoneClass)) {
 | 
						|
                document.getElementById(_this.aboutId).classList.add(_this.displayNoneClass);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        if (document.getElementById(_this.imprintId) && not !== _this.imprintId) {
 | 
						|
            if (!document.getElementById(_this.imprintId).classList.contains(_this.displayNoneClass)) {
 | 
						|
                document.getElementById(_this.imprintId).classList.add(_this.displayNoneClass);
 | 
						|
            }
 | 
						|
        }
 | 
						|
        if (document.getElementById(_this.gdprId) && not !== _this.gdprId) {
 | 
						|
            if (!document.getElementById(_this.gdprId).classList.contains(_this.displayNoneClass)) {
 | 
						|
                document.getElementById(_this.gdprId).classList.add(_this.displayNoneClass);
 | 
						|
            }
 | 
						|
        }
 | 
						|
        if (document.getElementById(_this.settingsId) && not !== _this.settingsId) {
 | 
						|
            if (!document.getElementById(_this.settingsId).classList.contains(_this.displayNoneClass)) {
 | 
						|
                document.getElementById(_this.settingsId).classList.add(_this.displayNoneClass);
 | 
						|
            }
 | 
						|
    }
 | 
						|
    },
 | 
						|
    showJust: function (id) {
 | 
						|
        let _this = RaMemoryPage;
 | 
						|
        _this.closeAll(_this, id);
 | 
						|
        if (document.getElementById(id)) {
 | 
						|
            if (document.getElementById(id).classList.contains(_this.displayNoneClass)) {
 | 
						|
                document.getElementById(id).classList.remove(_this.displayNoneClass);
 | 
						|
            }
 | 
						|
        }
 | 
						|
    },
 | 
						|
    btnActions: function (_this, id) {
 | 
						|
        _this.showJust(id);
 | 
						|
        _this.timeoutId = setTimeout(function () {
 | 
						|
            document.getElementById(id).scrollIntoView({behavior: "smooth"});
 | 
						|
        }, _this.scrollToTimeout);
 | 
						|
    },
 | 
						|
    initBtnActions: function (_this) {
 | 
						|
        document.getElementById(Memory.generateMemoryBtnId).addEventListener("click", function () {
 | 
						|
            _this.showJust(_this.gameId);
 | 
						|
        });
 | 
						|
        let btns = document.getElementsByClassName(_this.howToPlayBtnClass);
 | 
						|
        for (let i = 0; i < btns.length; i++) {
 | 
						|
            btns[i].addEventListener("click", function () {
 | 
						|
                _this.btnActions(_this, _this.howToPlayId);
 | 
						|
            });
 | 
						|
        }
 | 
						|
        btns = document.getElementsByClassName(_this.gdprBtnClass);
 | 
						|
        for (let i = 0; i < btns.length; i++) {
 | 
						|
            btns[i].addEventListener("click", function () {
 | 
						|
                _this.btnActions(_this, _this.gdprId);
 | 
						|
            });
 | 
						|
        }
 | 
						|
        btns = document.getElementsByClassName(_this.imprintBtnClass);
 | 
						|
        for (let i = 0; i < btns.length; i++) {
 | 
						|
            btns[i].addEventListener("click", function () {
 | 
						|
                _this.btnActions(_this, _this.imprintId);
 | 
						|
            });
 | 
						|
        }
 | 
						|
        btns = document.getElementsByClassName(_this.settingsBtnClass);
 | 
						|
        for (let i = 0; i < btns.length; i++) {
 | 
						|
            btns[i].addEventListener("click", function () {
 | 
						|
                _this.btnActions(_this, _this.settingsId);
 | 
						|
            });
 | 
						|
        }
 | 
						|
 | 
						|
        btns = document.getElementsByClassName(_this.themeSwitchBtnClass);
 | 
						|
        for (let i = 0; i < btns.length; i++) {
 | 
						|
            btns[i].addEventListener("click", function () {
 | 
						|
                let theme = "";
 | 
						|
                if (_this.prefersDarkTheme.matches) {
 | 
						|
                    document.body.classList.toggle(Css.classes.lightTheme);
 | 
						|
                    theme = document.body.classList.contains(Css.classes.lightTheme)
 | 
						|
                            ? "light"
 | 
						|
                            : "dark";
 | 
						|
                } else {
 | 
						|
                    document.body.classList.toggle(Css.classes.darkTheme);
 | 
						|
                    theme = document.body.classList.contains(Css.classes.darkTheme)
 | 
						|
                            ? "dark"
 | 
						|
                            : "light";
 | 
						|
                }
 | 
						|
                localStorage.setItem("theme", theme);
 | 
						|
            });
 | 
						|
        }
 | 
						|
        document.getElementById("save-settings").addEventListener("click", function (e) {
 | 
						|
            if (document.getElementById(_this.settingsCheckUseCookiesId).checked) {
 | 
						|
                _this.saveSettingsAction(_this);
 | 
						|
 | 
						|
                document.getElementById(_this.settingsCheckUseCookiesId).parentNode.classList.remove("bg-alert");
 | 
						|
                document.getElementById(_this.settingsCheckUseCookiesId).parentNode.classList.remove("text-white");
 | 
						|
            } else {
 | 
						|
                document.getElementById(_this.settingsCheckUseCookiesId).parentNode.classList.add("bg-alert");
 | 
						|
                document.getElementById(_this.settingsCheckUseCookiesId).parentNode.classList.add("text-white");
 | 
						|
            }
 | 
						|
        });
 | 
						|
        document.getElementById("clear-settings").addEventListener("click", function (e) {
 | 
						|
            Memory.eraseAllCookies();
 | 
						|
            document.getElementById(_this.settingsRadioStartValueClass + "-0").checked = true;
 | 
						|
            document.getElementById(_this.settingsCheckSaveHighscoreId).checked = false;
 | 
						|
            document.getElementById(_this.settingsCheckUseCookiesId).checked = false;
 | 
						|
            
 | 
						|
                document.getElementById("settings-saved").classList.remove("d-none");
 | 
						|
            setTimeout(function(){
 | 
						|
                document.getElementById("settings-saved").classList.add("d-none");
 | 
						|
            },1350);
 | 
						|
        });
 | 
						|
    },
 | 
						|
    initTheme: function (_this) {
 | 
						|
        _this.prefersDarkTheme = window.matchMedia("(prefers-color-scheme: dark)");
 | 
						|
        _this.currentTheme = localStorage.getItem("theme");
 | 
						|
        if (_this.currentTheme === "dark") {
 | 
						|
            document.body.classList.toggle(Css.classes.darkTheme);
 | 
						|
        } else if (_this.currentTheme === "light") {
 | 
						|
            document.body.classList.toggle(Css.classes.lightTheme);
 | 
						|
        }
 | 
						|
    },
 | 
						|
    initSettings: function (_this) {
 | 
						|
        document.getElementById(_this.settingsRadioStartValueClass + "-" + Memory.cookieStartValue).checked = true;
 | 
						|
        document.getElementById(_this.settingsCheckSaveHighscoreId).checked = Memory.cookieSaveHighscore === 0 ? false : true;
 | 
						|
        document.getElementById(_this.settingsCheckUseCookiesId).checked = Memory.cookies;
 | 
						|
    },
 | 
						|
    saveSettingsAction: function (_this) {
 | 
						|
        document.cookie = "";
 | 
						|
        Memory.cookies = true;
 | 
						|
        Memory.setCookieSaveHighscore(document.getElementById(_this.settingsCheckSaveHighscoreId).checked ? 1 : 0);
 | 
						|
        Memory.setCookieStartValue(document.querySelector('input[name="' + _this.settingsRadioStartValueClass + '"]:checked').value);
 | 
						|
         document.getElementById("settings-saved").classList.remove("d-none");
 | 
						|
            setTimeout(function(){
 | 
						|
                document.getElementById("settings-saved").classList.add("d-none");
 | 
						|
            },1350);
 | 
						|
    },
 | 
						|
    init: function () {
 | 
						|
        let _this = this;
 | 
						|
        if (typeof Memory === "object") {
 | 
						|
            Memory.init();
 | 
						|
        }
 | 
						|
        _this.initTheme(_this);
 | 
						|
        _this.initBtnActions(_this);
 | 
						|
        _this.initSettings(_this);
 | 
						|
        if (location.hash === "#" + _this.howToPlayId ||
 | 
						|
                location.hash === "#" + _this.settingsId ||
 | 
						|
                location.hash === "#" + _this.gdprId ||
 | 
						|
                location.hash === "#" + _this.imprintId
 | 
						|
                ) {
 | 
						|
            let id = location.hash.substr(1, location.hash.length - 1);
 | 
						|
            if (document.getElementById(id)) {
 | 
						|
                _this.showJust(id);
 | 
						|
                setTimeout(function () {
 | 
						|
                    document.getElementById(id).scrollIntoView({behavior: "smooth"});
 | 
						|
                }, 450);
 | 
						|
            }
 | 
						|
        }
 | 
						|
        _this.closeAll(_this, _this.aboutId);
 | 
						|
    }
 | 
						|
};
 | 
						|
 | 
						|
RaMemoryPage.init();
 | 
						|
 | 
						|
 | 
						|
const registerServiceWorker = async () => {
 | 
						|
    if ('serviceWorker' in navigator) {
 | 
						|
        try {
 | 
						|
            const registration = await navigator.serviceWorker.register(
 | 
						|
                    './sw.js',
 | 
						|
                    {
 | 
						|
                        scope: './',
 | 
						|
                    }
 | 
						|
            );
 | 
						|
            if (registration.installing) {
 | 
						|
            } else if (registration.waiting) {
 | 
						|
            } else if (registration.active) {
 | 
						|
            }
 | 
						|
        } catch (error) {
 | 
						|
            console.error(`Registration failed with ${error}`);
 | 
						|
        }
 | 
						|
    }
 | 
						|
};
 | 
						|
 | 
						|
window.addEventListener("DOMContentLoaded", async function (event) {
 | 
						|
    registerServiceWorker();
 | 
						|
}); |