let defaultConfig = { theme: "serika_dark", customTheme: false, customThemeColors: [ "#323437", "#e2b714", "#e2b714", "#646669", "#d1d0c5", "#ca4754", "#7e2a33", "#ca4754", "#7e2a33", ], favThemes: [], showKeyTips: true, showLiveWpm: false, showTimerProgress: true, smoothCaret: true, quickTab: false, punctuation: false, numbers: false, words: 50, time: 30, mode: "time", quoteLength: 1, language: "english", fontSize: 15, freedomMode: false, resultFilters: null, difficulty: "normal", blindMode: false, quickEnd: false, // readAheadMode: false, caretStyle: "default", paceCaretStyle: "default", flipTestColors: false, capsLockBackspace: false, layout: "default", confidenceMode: "off", indicateTypos: false, timerStyle: "text", colorfulMode: false, randomTheme: "off", timerColor: "black", timerOpacity: "0.25", stopOnError: "off", showAllLines: false, keymapMode: "off", keymapStyle: "staggered", keymapLayout: "qwerty", fontFamily: "Roboto_Mono", smoothLineScroll: false, alwaysShowDecimalPlaces: false, alwaysShowWordsHistory: false, singleListCommandLine: "manual", playSoundOnError: false, playSoundOnClick: "off", startGraphsAtZero: true, swapEscAndTab: false, showOutOfFocusWarning: true, paceCaret: "off", paceCaretCustomSpeed: 100, pageWidth: "100", chartAccuracy: true }; let cookieConfig = null; let config = { ...defaultConfig, }; let dbConfigLoaded = false; let configChangedBeforeDb = false; //cookies async function saveConfigToCookie(noDbCheck = false) { if (!dbConfigLoaded && !noDbCheck) { // console.log('config changed before db loaded!'); configChangedBeforeDb = true; } // showNotification('saving to cookie',1000); if (config.freedomMode === null) config.freedomMode = false; let d = new Date(); d.setFullYear(d.getFullYear() + 1); $.cookie("config", null); $.cookie("config", JSON.stringify(config), { expires: d, path: "/", }); restartCount = 0; if (!noDbCheck) saveConfigToDB(); } async function saveConfigToDB() { if (firebase.auth().currentUser !== null) { // showNotification('saving to db',1000); accountIconLoading(true); saveConfig({ uid: firebase.auth().currentUser.uid, obj: config }).then( (d) => { // console.log(d.data); accountIconLoading(false); if (d.data.returnCode === 1) { // showNotification('config saved to db',1000); } else { showNotification( `Error saving config to DB! ${d.data.message}`, 4000 ); } } ); } } function resetConfig() { config = { ...defaultConfig, }; applyConfig(); saveConfigToCookie(); } function saveActiveTagsToCookie() { let tags = []; try { dbSnapshot.tags.forEach((tag) => { if (tag.active === true) { tags.push(tag.id); } }); let d = new Date(); d.setFullYear(d.getFullYear() + 1); $.cookie("activeTags", null); $.cookie("activeTags", JSON.stringify(tags), { expires: d, path: "/", }); } catch (e) {} } function loadConfigFromCookie() { let newConfig = $.cookie("config"); if (newConfig !== undefined) { newConfig = JSON.parse(newConfig); applyConfig(newConfig); cookieConfig = newConfig; saveConfigToCookie(true); } } function applyConfig(configObj) { if (configObj && configObj != null && configObj != "null") { setTheme(configObj.theme, true); setCustomTheme(configObj.customTheme, true); setCustomThemeColors(configObj.customThemeColors, true); setQuickTabMode(configObj.quickTab, true); setNumbers(configObj.numbers, true); setPunctuation(configObj.punctuation, true); setKeyTips(configObj.showKeyTips, true); changeTimeConfig(configObj.time, true); changeQuoteLength(configObj.quoteLength, true); changeWordCount(configObj.words, true); changeMode(configObj.mode, true); changeLanguage(configObj.language, true); setCapsLockBackspace(configObj.capsLockBackspace, true); changeLayout(configObj.layout, true); changeFontSize(configObj.fontSize, true); setFreedomMode(configObj.freedomMode, true); setCaretStyle(configObj.caretStyle, true); setPaceCaretStyle(configObj.paceCaretStyle, true); setDifficulty(configObj.difficulty, true); setBlindMode(configObj.blindMode, true); setQuickEnd(configObj.quickEnd, true); // setReadAheadMode(configObj.readAheadMode, true); setFlipTestColors(configObj.flipTestColors, true); setColorfulMode(configObj.colorfulMode, true); setConfidenceMode(configObj.confidenceMode, true); setIndicateTypos(configObj.indicateTypos, true); setTimerStyle(configObj.timerStyle, true); setTimerColor(configObj.timerColor, true); setTimerOpacity(configObj.timerOpacity, true); changeKeymapMode(configObj.keymapMode, true); changeKeymapStyle(configObj.keymapStyle, true); changeKeymapLayout(configObj.keymapLayout, true); setFontFamily(configObj.fontFamily, true); setSmoothCaret(configObj.smoothCaret, true); setSmoothLineScroll(configObj.smoothLineScroll, true); setShowLiveWpm(configObj.showLiveWpm, true); setShowTimerProgress(configObj.showTimerProgress, true); setAlwaysShowDecimalPlaces(configObj.alwaysShowDecimalPlaces, true); setAlwaysShowWordsHistory(configObj.alwaysShowWordsHistory, true); setSingleListCommandLine(configObj.singleListCommandLine, true); setPlaySoundOnError(configObj.playSoundOnError, true); setPlaySoundOnClick(configObj.playSoundOnClick, true); setStopOnError(configObj.stopOnError, true); setFavThemes(configObj.favThemes, true); setRandomTheme(configObj.randomTheme, true); setShowAllLines(configObj.showAllLines, true); setSwapEscAndTab(configObj.swapEscAndTab, true); setShowOutOfFocusWarning(configObj.showOutOfFocusWarning, true); setPaceCaret(configObj.paceCaret, true); setPaceCaretCustomSpeed(configObj.paceCaretCustomSpeed, true); setPageWidth(configObj.pageWidth, true); setChartAccuracy(configObj.chartAccuracy, true); config.startGraphsAtZero = configObj.startGraphsAtZero; // if ( // configObj.resultFilters !== null && // configObj.resultFilters !== undefined // ) { // accountFilters = configObj.resultFilters; // } // config = configObj; } Object.keys(defaultConfig).forEach((configKey) => { if (config[configKey] == undefined) { config[configKey] = defaultConfig[configKey]; } }); updateTestModesNotice(); } function loadActiveTagsFromCookie() { let newTags = $.cookie("activeTags"); if (newTags !== undefined) { newTags = JSON.parse(newTags); newTags.forEach((ntag) => { toggleTag(ntag, true); }); saveActiveTagsToCookie(); } } function showTestConfig() { $("#top .config").removeClass("hidden").css("opacity", 1); } function hideTestConfig() { $("#top .config").css("opacity", 0).addClass("hidden"); } function setPlaySoundOnError(val, nosave) { if (val == undefined) { val = false; } config.playSoundOnError = val; if (!nosave) saveConfigToCookie(); } function setPlaySoundOnClick(val, nosave) { if (val == undefined) { val = "off"; } config.playSoundOnClick = val; if (clickSounds === null && config.playSoundOnClick !== "off") initClickSounds(); if (!nosave) saveConfigToCookie(); } function togglePlaySoundOnError() { config.playSoundOnError = !config.playSoundOnError; if (config.playSoundOnError == undefined) { config.playSoundOnError = false; } } //difficulty function setDifficulty(diff, nosave) { if ( (diff !== "normal" && diff !== "expert" && diff !== "master") || diff == undefined ) { diff = "normal"; } config.difficulty = diff; restartTest(false,nosave); updateTestModesNotice(); if (!nosave) saveConfigToCookie(); } //set fav themes function setFavThemes(themes, nosave) { config.favThemes = themes; if (!nosave) { refreshThemeButtons(); saveConfigToCookie(); } } //blind mode function toggleBlindMode() { blind = !config.blindMode; if (blind == undefined) { blind = false; } config.blindMode = blind; updateTestModesNotice(); saveConfigToCookie(); } function setBlindMode(blind, nosave) { if (blind == undefined) { blind = false; } config.blindMode = blind; updateTestModesNotice(); if (!nosave) saveConfigToCookie(); } function updateChartAccuracy() { resultHistoryChart.data.datasets[1].hidden = !config.chartAccuracy; resultHistoryChart.options.scales.yAxes[1].display = config.chartAccuracy; resultHistoryChart.update(); } function toggleChartAccuracy() { if (config.chartAccuracy) { config.chartAccuracy = false; } else { config.chartAccuracy = true; } updateChartAccuracy(); saveConfigToCookie(); } function setChartAccuracy(chartAccuracy, nosave) { if (chartAccuracy == undefined) { chartAccuracy = true; } config.chartAccuracy = chartAccuracy; updateChartAccuracy(); if (!nosave) saveConfigToCookie(); } //read ahead mode // function toggleReadAheadMode() { // config.readAheadMode = !config.readAheadMode; // applyReadAheadMode(config.readAheadMode); // updateTestModesNotice(); // saveConfigToCookie(); // } // function setReadAheadMode(readAhead, nosave) { // if (readAhead == undefined) { // readAhead = false; // } // config.readAheadMode = readAhead; // applyReadAheadMode(readAhead); // updateTestModesNotice(); // if (!nosave) saveConfigToCookie(); // } //stoponerror // function toggleStopOnError() { // soe = !config.stopOnError; // if (soe == undefined) { // soe = false; // } // config.stopOnError = soe; // updateTestModesNotice(); // saveConfigToCookie(); // } function setStopOnError(soe, nosave) { if (soe == undefined || soe === true || soe === false) { soe = "off"; } config.stopOnError = soe; if (config.stopOnError !== "off") { config.confidenceMode = "off"; } updateTestModesNotice(); if (!nosave) saveConfigToCookie(); } //alwaysshowdecimal function toggleAlwaysShowDecimalPlaces() { config.alwaysShowDecimalPlaces = !config.alwaysShowDecimalPlaces; saveConfigToCookie(); } function setAlwaysShowDecimalPlaces(val, nosave) { if (val == undefined) { val = false; } config.alwaysShowDecimalPlaces = val; if (!nosave) saveConfigToCookie(); } //show out of focus warning function toggleShowOutOfFocusWarning() { config.showOutOfFocusWarning = !config.showOutOfFocusWarning; if (!config.showOutOfFocusWarning) { $("#words").css("transition", "none").removeClass("blurred"); $(".outOfFocusWarning").addClass("hidden"); clearTimeouts(outOfFocusTimeouts); } saveConfigToCookie(); } function setShowOutOfFocusWarning(val, nosave) { if (val == undefined) { val = true; } config.showOutOfFocusWarning = val; if (!config.showOutOfFocusWarning) { $("#words").css("transition", "none").removeClass("blurred"); $(".outOfFocusWarning").addClass("hidden"); clearTimeouts(outOfFocusTimeouts); } if (!nosave) saveConfigToCookie(); } //swap esc and tab function toggleSwapEscAndTab() { config.swapEscAndTab = !config.swapEscAndTab; saveConfigToCookie(); updateKeytips(); } function setSwapEscAndTab(val, nosave) { if (val == undefined) { val = false; } config.swapEscAndTab = val; updateKeytips(); if (!nosave) saveConfigToCookie(); } //pace caret function setPaceCaret(val, nosave) { if (val == undefined) { val = "off"; } config.paceCaret = val; updateTestModesNotice(); initPaceCaret(nosave); if (!nosave) saveConfigToCookie(); } function setPaceCaretCustomSpeed(val, nosave) { if (val == undefined || Number.isNaN(parseInt(val))) { val = 100; } config.paceCaretCustomSpeed = val; if (!nosave) saveConfigToCookie(); } //always show words history function setAlwaysShowWordsHistory(val, nosave) { if (val == undefined) { val = false; } config.alwaysShowWordsHistory = val; if (!nosave) saveConfigToCookie(); } //single list command line function setSingleListCommandLine(option, nosave) { if (!option) option = "manual"; config.singleListCommandLine = option; if (!nosave) saveConfigToCookie(); } //show all lines function toggleShowAllLines() { sal = !config.showAllLines; if (sal == undefined) { sal = false; } config.showAllLines = sal; restartTest(); saveConfigToCookie(); } function setShowAllLines(sal, nosave) { if (sal == undefined) { sal = false; } config.showAllLines = sal; if (!nosave) { saveConfigToCookie(); restartTest(); } } //quickend function toggleQuickEnd() { qe = !config.quickEnd; if (qe == undefined) { qe = false; } config.quickEnd = qe; saveConfigToCookie(); } function setQuickEnd(qe, nosave) { if (qe == undefined) { qe = false; } config.quickEnd = qe; if (!nosave) saveConfigToCookie(); } //flip colors function setFlipTestColors(flip, nosave) { if (flip == undefined) { flip = false; } config.flipTestColors = flip; flipTestColors(flip); if (!nosave) saveConfigToCookie(); } function toggleFlipTestColors() { config.flipTestColors = !config.flipTestColors; flipTestColors(config.flipTestColors); saveConfigToCookie(); } //extra color function setColorfulMode(extra, nosave) { if (extra == undefined) { extra = false; } config.colorfulMode = extra; applyColorfulMode(extra); if (!nosave) saveConfigToCookie(); } function toggleColorfulMode() { config.colorfulMode = !config.colorfulMode; applyColorfulMode(config.colorfulMode); saveConfigToCookie(); } function setPageWidth(val, nosave) { if (val == null || val == undefined) { val = "100"; } config.pageWidth = val; $("#centerContent").removeClass("wide125"); $("#centerContent").removeClass("wide150"); $("#centerContent").removeClass("wide200"); $("#centerContent").removeClass("widemax"); if (val !== "100") { $("#centerContent").addClass('wide' + val); } if (!nosave) saveConfigToCookie(); } function setCaretStyle(caretStyle, nosave) { if (caretStyle == null || caretStyle == undefined) { caretStyle = "default"; } config.caretStyle = caretStyle; $("#caret").removeClass("off"); $("#caret").removeClass("default"); $("#caret").removeClass("underline"); $("#caret").removeClass("outline"); $("#caret").removeClass("block"); if (caretStyle == "off") { $("#caret").addClass("off"); }else if (caretStyle == "default") { $("#caret").addClass("default"); } else if (caretStyle == "block") { $("#caret").addClass("block"); } else if (caretStyle == "outline") { $("#caret").addClass("outline"); } else if (caretStyle == "underline") { $("#caret").addClass("underline"); } if (!nosave) saveConfigToCookie(); } function setPaceCaretStyle(caretStyle, nosave) { if (caretStyle == null || caretStyle == undefined) { caretStyle = "default"; } config.paceCaretStyle = caretStyle; $("#paceCaret").removeClass("off"); $("#paceCaret").removeClass("default"); $("#paceCaret").removeClass("underline"); $("#paceCaret").removeClass("outline"); $("#paceCaret").removeClass("block"); if (caretStyle == "off") { $("#paceCaret").addClass("off"); }else if (caretStyle == "default") { $("#paceCaret").addClass("default"); } else if (caretStyle == "block") { $("#paceCaret").addClass("block"); } else if (caretStyle == "outline") { $("#paceCaret").addClass("outline"); } else if (caretStyle == "underline") { $("#paceCaret").addClass("underline"); } if (!nosave) saveConfigToCookie(); } function setShowTimerProgress(timer, nosave) { if (timer == null || timer == undefined) { timer = false; } config.showTimerProgress = timer; if (!nosave) saveConfigToCookie(); } function toggleShowTimerProgress() { config.showTimerProgress = !config.showTimerProgress; saveConfigToCookie(); } function setShowLiveWpm(live, nosave) { if (live == null || live == undefined) { live = false; } config.showLiveWpm = live; // if (config.keymapMode !== "off") { // config.keymapMode = "off"; // } if (!nosave) saveConfigToCookie(); } function toggleShowLiveWpm() { config.showLiveWpm = !config.showLiveWpm; // if (config.keymapMode !== "off") { // config.keymapMode = "off"; // } saveConfigToCookie(); } function setTimerStyle(style, nosave) { if (style == null || style == undefined) { style = "bar"; } config.timerStyle = style; if (!nosave) saveConfigToCookie(); } function setTimerColor(color, nosave) { if (color == null || color == undefined) { color = "black"; } config.timerColor = color; changeTimerColor(color); if (!nosave) saveConfigToCookie(); } function setTimerOpacity(opacity, nosave) { if (opacity == null || opacity == undefined) { opacity = 0.25; } config.timerOpacity = opacity; if (!nosave) saveConfigToCookie(); } //key tips function setKeyTips(keyTips, nosave) { config.showKeyTips = keyTips; if (config.showKeyTips) { $("#bottom .keyTips").removeClass("hidden"); } else { $("#bottom .keyTips").addClass("hidden"); } if (!nosave) saveConfigToCookie(); } function toggleKeyTips() { config.showKeyTips = !config.showKeyTips; if (config.showKeyTips) { $("#bottom .keyTips").removeClass("hidden"); } else { $("#bottom .keyTips").addClass("hidden"); } saveConfigToCookie(); } //mode function changeTimeConfig(time, nosave) { if (time !== null && !isNaN(time) && time >= 0) { } else { time = 15; } time = parseInt(time); changeMode("time", nosave); config.time = time; $("#top .config .time .text-button").removeClass("active"); if (![15, 30, 60, 120].includes(time)) { time = "custom"; } $("#top .config .time .text-button[timeConfig='" + time + "']").addClass( "active" ); if (!nosave) saveConfigToCookie(); } //quote length function changeQuoteLength(len, nosave) { if (len !== null && !isNaN(len) && len >= -1 && len <= 3) { } else { len = 1; } len = parseInt(len); changeMode("quote", nosave); config.quoteLength = len; $("#top .config .quoteLength .text-button").removeClass("active"); $("#top .config .quoteLength .text-button[quoteLength='" + len + "']").addClass( "active" ); if (!nosave) saveConfigToCookie(); } function changeWordCount(wordCount, nosave) { if (wordCount !== null && !isNaN(wordCount) && wordCount >= 0) { } else { wordCount = 10; } wordCount = parseInt(wordCount); changeMode("words", nosave); config.words = wordCount; $("#top .config .wordCount .text-button").removeClass("active"); if (![10, 25, 50, 100, 200].includes(wordCount)) { wordCount = "custom"; } $( "#top .config .wordCount .text-button[wordCount='" + wordCount + "']" ).addClass("active"); if (!nosave) saveConfigToCookie(); } //caret function setSmoothCaret(mode, nosave) { config.smoothCaret = mode; if (!nosave) saveConfigToCookie(); } function toggleSmoothCaret() { config.smoothCaret = !config.smoothCaret; saveConfigToCookie(); } //startgraphsatzero function setStartGraphsAtZero(mode, nosave) { config.startGraphsAtZero = mode; if (!nosave) saveConfigToCookie(); } // function toggleSmoothCaret() { // config.smoothCaret = !config.smoothCaret; // saveConfigToCookie(); // } //linescroll function setSmoothLineScroll(mode, nosave) { config.smoothLineScroll = mode; if (!nosave) saveConfigToCookie(); } function toggleSmoothLineScroll() { config.smoothLineScroll = !config.smoothLineScroll; saveConfigToCookie(); } //quick tab function setQuickTabMode(mode, nosave) { config.quickTab = mode; if (!config.quickTab) { // $(".pageTest").append('