{"id":4157,"date":"2026-07-06T06:00:21","date_gmt":"2026-07-06T04:00:21","guid":{"rendered":"https:\/\/fotografeer.nl\/?p=4157"},"modified":"2026-08-30T09:34:30","modified_gmt":"2026-08-30T07:34:30","slug":"reval-type-test","status":"publish","type":"post","link":"https:\/\/fotografeer.nl\/?p=4157&lang=nl","title":{"rendered":"Reval &#8211; Typ Test &#8211; v1.3"},"content":{"rendered":"\n<script>\n    var logLevel = \"INFO\"; \/\/ DEBUG, INFO, ERROR or OFF\n    var translation = {\n        \"en\": {\n                \"duration\": \"Duration\",\n                \"accuracy\": \"Accuracy\",\n\t\t\t\t\"words\": \"Words\",\n                \"cps\": \"Char\/s\",\n                \"cpm\": \"Char\/min\",\n                \"wpm\": \"Words\/min\",\n                \"presets\": \"Autocomplete Presets and Text Refresh\",\n                \"settings\": \"Autocomplete settings\",\n                \"readError\": \"Error while reading from \",\n                \"forbidden\": \"Forbidden to read from \",\n                \"notFound\": \"Unable to find \",\n                \"F1\": \"Simple(F1)\",\n                \"F2\": \"Intermediate(F2)\",\n                \"F3\": \"Advanced(F3)\",\n                \"F4\": \"Type Test(F4)\",\n                \"F5\": \"Refresh(F5)\",\n                \"F6\": \"Punctuation(F6)\",\n                \"F7\": \"Caps(F7)\",\n                \"F8\": \"Numbers(F8)\",\n                \"F9\": \"Special Chars(F9)\",\n                \"F10\": \"Space(F10)\",\n                \"loading\": \"Loading Text...\",\n                \"source\": \"<i>Source<\/i>\",\n                \"errorArea\": '<b style=\"color:red; font-size:26px;\">Error Area. No errors detected yet...<\/b>',\n                \"textArea\": \"<i>Text Area<\/i>\",\n                \"mobile\": \"This application<br\/> requires a PC or<br\/>laptop with a<br\/>physical keyboard.<br\/>Mobile phones and<br\/>tablets are<br\/>not supported!\",\n                \"tablet\": '<b style=\"color:red;\">Mobile Phones and<br\/>Tablets Not Supported<\/b>',\n            },\n        \"nl\": {\n                \"duration\": \"Duur\",\n                \"accuracy\": \"Nauwkeurigheid\",\n\t\t\t\t\"words\": \"Wrdn\",\n                \"cps\": \"Kar\/s\",\n                \"cpm\": \"Kar\/min\",\n                \"wpm\": \"Woorden\/min\",\n                \"presets\": \"Moeilijkheidsgraad en Ververs Tekst\",\n                \"settings\": \"Automatische Aanvul Instellingen\",\n                \"readError\": \"Fout bij lezen van \",\n                \"forbidden\": \"Verboden om te lezen van \",\n                \"notFound\": \"Niet gevonden: \",\n                \"F1\": \"Beginner(F1)\",\n                \"F2\": \"Gevorderd(F2)\",\n                \"F3\": \"Expert(F3)\",\n                \"F4\": \"Type Test(F4)\",\n                \"F5\": \"Ververs(F5)\",\n                \"F6\": \"Tekens(F6)\",\n                \"F7\": \"Hfdletters(F7)\",\n                \"F8\": \"Nummers(F8)\",\n                \"F9\": \"Speciale Kars(F9)\",\n                \"F10\": \"Spatie(F10)\",\n                \"loading\": 'Tekst Laden...',\n                \"source\": \"<i>Bron<\/i>\",\n                \"errorArea\": '<b style=\"color:red; font-size:26px;\">Fout Meldingen. Nog geen fouten ontdekt...<\/b>',\n                \"textArea\": \"<i>Tekst Veld<\/i>\",\n                \"mobile\": \"Voor deze applicatie<br\/>is een PC of laptop met<br\/>een fysiek toetsenbord<br\/>nodig.<br\/>Mobiele telefoons en<br\/>tablets zijn<br\/>niet geschikt!\",\n                \"tablet\": '<b style=\"color:red;\">Mobiele Telefoons en<br\/>Tablets zijn niet geschikt<\/b>',\n              },\n    };\n    var language = \"en\"; \/\/ Default language, overridden by page language\n    var country = \"GB\"; \/\/ Default country, overridden by page country\n    var altDown = false;\n    var kar = \"\";\n    var _buffer = null;\n    var disabledOrigin = false;\n    var loadPage = \"\";\n    var error = \"\";\n    var veld = \"\";\n    var tekst = \"\";\n    var source = \"\";\n    var sel = \"\";\n    var beforeCursor = \"\";\n    var atCursor = \"\";\n    var afterCursor = \"\";\n    var cursorPosition = 1;\n    var start = 0;\n    var end = 0;\n    var time = 0;\n    var duration = 0;\n    var accuracy = 0;\n\tvar words = 0;\n    var cps = 0;\n    var cpm = 0;\n\tvar wpm = 0;\n\tvar minutes = 0;\n\tvar seconds = 0;\n\tvar remainder = 0;\n    var numberOfKeysPressed = 0;\n    var correctKeysPressed = 0;\n    var urls = [];\n    var originalText = \"\";\n    var mode = \"Simple\";\n    var punctuation = \".?!,;:-\u2013\u2014()[]{}'\" + '\"';  \/\/ Punctuation marks\n    var space = \" \"; \/\/ Space\n    var numbers = \"0123456789\"; \/\/ Numbers\n    \/\/ Special characters exculding punctuation marks\n    var speci = \"#$%&*+\u00b1\/<=>@^_`|~\\\\\u00b0\u00a3\u20ac\u00a5\u00a2\u00e1\u00e9\u00ed\u00f3\u00fa\u00fd\u00c1\u00c9\u00cd\u00d3\u00da\u00dd\u00e0\u00e8\u00ec\u00f2\u00f9\u00c0\u00c8\u00cc\u00d2\u00d9\u00e2\u00ea\u00ee\u00f4\u00fb\u00c2\u00ca\u00ce\u00d4\u00db\u00e4\u00eb\u00ef\u00f6\u00fc\u00ff\u00c4\u00cb\u00cf\u00d6\u00dc\u00e3\u00f1\u00f5\u00c3\u00d1\u00d5\u00e7\u0123\u0137\u013c\u0146\u00c7\u0122\u0136\u013b\u0145\u00e5\u00c5\u010d\u0161\u017e\u010c\u0160\u017d\u0101\u0113\u012b\u014d\u016b\u0100\u0112\u012a\u014c\u016a\u00e6\u0153\u00df\u00f0\u00f8\u00fe\u00c6\u0152\u1e9e\u00d0\u00d8\u00de\";\n    const raw = \"https:\/\/raw.githubusercontent.com\/dsnpevl\/rehabilitation.typing.test\/refs\/heads\/main\/\";\n    const apiurl = \"https:\/\/api.github.com\/repos\/dsnpevl\/rehabilitation.typing.test\/git\/trees\/main?recursive=1\";\n    const digitsOnly = string => [...string].every(c => '0123456789'.includes(c));\n    document.addEventListener(\"keyup\", upKey);\n    document.addEventListener(\"keydown\", downKey);\n    window.addEventListener(\"load\", (event) => {\n        info(\"Start Typing Test\");\n        \/\/ Determine the document's language (e.g. en) and country (e.g. GB)\n        \/\/ from locale (e.g. en-GB); Then get the matching URLs.\n        var locale = document.documentElement.lang.split(\"-\"); \/\/ e.g. en-GB\n        language = locale[0];\n        country = locale[1];\n        \/\/ Set text of errors, source field, results field and buttons to match the language of the current page.\n        document.getElementById(\"duration\").innerHTML = i18n(language, \"duration\") + ': <b style=\"color:red\">0<\/b> min <b style=\"color:red\">0<\/b> s&nbsp;';\n        document.getElementById(\"accuracy\").innerHTML = i18n(language, \"accuracy\") + ': <b style=\"color:red\">0<\/b> %&nbsp;';\n        document.getElementById(\"words\").innerHTML = i18n(language, \"words\") + ': <b style=\"color:red\">0<\/b>';\n        document.getElementById(\"cps\").innerHTML = i18n(language, \"cps\") + ': <b style=\"color:red\">0<\/b>&nbsp;';\n        document.getElementById(\"cpm\").innerHTML = i18n(language, \"cpm\") + ': <b style=\"color:red\">0<\/b>&nbsp;';\n        document.getElementById(\"wpm\").innerHTML = i18n(language, \"wpm\") + ': <b style=\"color:red\">0<\/b>';\n        document.getElementById(\"presets\").textContent = i18n(language, \"presets\");\n        document.getElementById(\"settings\").textContent = i18n(language, \"settings\");\n        document.getElementById(\"F1\").textContent = i18n(language, \"F1\");\n        document.getElementById(\"F2\").textContent = i18n(language, \"F2\");\n        document.getElementById(\"F3\").textContent = i18n(language, \"F3\");\n        document.getElementById(\"F4\").textContent = i18n(language, \"F4\");\n        document.getElementById(\"F5\").textContent = i18n(language, \"F5\");\n        document.getElementById(\"F6\").textContent = i18n(language, \"F6\");\n        document.getElementById(\"F7\").textContent = i18n(language, \"F7\");\n        document.getElementById(\"F8\").textContent = i18n(language, \"F8\");\n        document.getElementById(\"F9\").textContent = i18n(language, \"F9\");\n        document.getElementById(\"F10\").textContent = i18n(language, \"F10\");\n        document.getElementById(\"error\").innerHTML = i18n(language, \"errorArea\");\n        document.getElementById(\"blauw\").innerHTML = i18n(language, \"textArea\");\n        document.getElementById(\"source\").innerHTML = i18n(language, \"source\");\n        debug(\"Mobile or tablet? \" + mobileAndTabletCheck());\n\n        if (mobileAndTabletCheck()) {\n            document.getElementById(\"tekst\").innerHTML = i18n(language, \"mobile\");\n            document.getElementById(\"error\").innerHTML = i18n(language, \"tablet\");\n            return;\n        }\n\n        debug(dateAsString());\n        start = new Date().getTime();\n        setTimeout(() => {\n            error = document.getElementById(\"error\");\n            veld = document.getElementById(\"veld\");\n            tekst = document.getElementById(\"tekst\");\n            source = document.getElementById(\"source\");\n\t\t\tsel = document.getElementById(\"files\");\n            sel.addEventListener('change', function(){\n                debug(\"New file Selected\");\n                var lev = \"\"; \/\/ Selected difficulty lev\n\t\t\t\tif (!document.getElementById(\"F1\").disabled) lev = \"F1\";\n\t\t        if (!document.getElementById(\"F2\").disabled) lev = \"F2\";\n\t\t        if (!document.getElementById(\"F3\").disabled) lev = \"F3\";\n\t\t        if (!document.getElementById(\"F4\").disabled) lev = \"F4\";\n\t\t\t\tvar x = sel.selectedIndex;\n                var filename = document.getElementsByTagName(\"option\")[x].value;\n                debug(\"Index \" + x + \" name: \" + filename);\n                cursorPosition = 0;\t\t\t\t\n\t\t\t\tgetText(raw + \"\/\" + language + \"\/\" + lev + \"\/\" + filename);\n                var veldEl1 = document.getElementById(\"veld\");\n                veldEl1.scroll({top: 0, behavior: 'smooth'});\n\t\t\t\thideResults();\n\t\t\t\tresetResults();\n\t\t\t\tshowResults();\n\t\t\t});\n            debug(dateAsString());\n        }, 300);\n        \/\/ Wait a short while and then press F1 (select Simple) and F5 (display text)\n        setTimeout(() => {\n            error.innerHTML = '';\n            source.innerHTML = '';\n            debug(dateAsString());\n        }, 400);\n        setTimeout(() => {\n            tekst.innerHTML = '<b style=\"color: blue\"><i>' + i18n(language, \"loading\") + '<\/i><\/b>';\n            debug(dateAsString());\n        }, 500);\n        setTimeout(() => {\n            info(\"Getting Data\");\n            getData();\n            debug(dateAsString());\n            info(\"Got Data\");\n        }, 1000);\n        setTimeout(() => {\n            info(\"Getting Text\");\n\t\t\tpopulateFilesList();\n            pressF1();\n            pressF5();\n            info(\"Got Text\");\n            debug(dateAsString());\n        }, 2000);\n    });\n\n    \/\/ Based on https:\/\/medium.com\/@mihura.ian\/translations-in-vanilla-javascript-c942c2095170\n    function i18n(lang, param) {\n        lang = lang ?? \"en\";\n        return translation[lang][param];\n    }\n\n    function upKey(key)\n    {\n        if (key.getModifierState(\"NumLock\")) {\n                debug(\"NumLock: is ON\");\n                numLock = true;\n        }\n        if (!key.getModifierState(\"NumLock\")) {\n                debug(\"NumLock: is OFF\");\n                numLock = false;\n        }\n\n        if (key.key == \"Alt\") {\n            key.preventDefault();\n            debug(\"ALT is UP \" + kar + \"-\" + digitsOnly(kar) + \"-\");\n            if (kar.length > 0) {\n                \/\/ Increase the total number of keys pressed.\n                numberOfKeysPressed = numberOfKeysPressed + 1;\n                if (digitsOnly(kar)) {\n                    const altCode = kar\n                    \/\/ 1. Maak er het getal van, e.g. \"0128\" -> 128  \n                    const byteWaarde = parseInt(altCode, 10); \n                    \/\/ 2. Plaats de byte in een Uint8Array (byte-buffer)\n                    const byteBuffer = new Uint8Array([byteWaarde]);\n                    \/\/ 3. Decodeer de buffer expliciet als windows-1252\n                    const decoder = new TextDecoder('windows-1252');\n                    const letter = decoder.decode(byteBuffer);\n                    debug(\"ALT is UP \" + kar + \"-\" + byteWaarde + \":\" + letter + \"=\" + atCursor + \" - \");\n\n                    if (atCursor != letter) {\n                        \/\/ Wrong character was pressed on keyboard! Keep yellow cursor at same spot.\n                        \/\/ Display wanted character in bold and red.\n                        updateWrongChar();\n                    } else {\n                        \/\/ Count the number of correct keys pressed\n                        correctKeysPressed = correctKeysPressed + 1;\n                        \/\/ Move the cursor to the next character.\n                        cursorPosition = cursorPosition + 1;\n                        \/\/ Refresh the text\n                        updateVeld(cursorPosition);\n                        autoComplete();\n                        updateVeld(cursorPosition);\n                    }\n                }\n            }\n            kar = \"\";\n            altDown = false;\n            tekst.focus();\n        }\n    }\n\n    function downKey(key)\n    {\n        \/\/ Get the original tekst inside the text area\n        tekst = document.getElementById(\"tekst\");\n        originalText = tekst.textContent.trim();\n\n        \/\/ Prevent unwanted scrolling to bottom when pressing space bar\n        \/\/ Source - https:\/\/stackoverflow.com\/a\/43054031\n        \/\/ Posted by lhavCoder, modified by community. See post 'Timeline' for change history\n        \/\/ Retrieved 2026-06-03, License - CC BY-SA 3.0\n        key.preventDefault();\n        if (key.keyCode == 32 && key.target == document.body) {\n            key.preventDefault();\n        }\n\n        \/\/ Function Keys F1, F2 and F3\n        if (key.code == \"F1\") {\n            key.preventDefault();\n            pressF1();\n            return;\n        }\n        if (key.code == \"F2\") {\n            key.preventDefault();\n            pressF2();\n            return;\n        }\n        if (key.code == \"F3\") {\n            key.preventDefault();\n            pressF3();\n            return;\n        }\n        if (key.code == \"F4\") {\n            key.preventDefault();\n            pressF4();\n            return;\n        }\n        if (key.code == \"F5\") {\n            key.preventDefault();\n            setTimeout(() => {pressF5();}, 300);\n            return;\n        }\n        if (key.code == \"F6\" ||\n            key.code == \"F7\" ||\n            key.code == \"F8\" ||\n            key.code == \"F9\" ||\n            key.code == \"F10\") {\n                key.preventDefault();\n                toggleButton(document.getElementById(key.code));\n            return;\n        }\n        if (key.code == \"F11\") {\n            key.preventDefault();\n            var veldEl = document.getElementById(\"veld\");\n            var offset = veldEl.offsetHeight;\n            veldEl.scroll({top: offset, behavior: 'smooth'});\n            return;\n        }\n        if (key.code == \"F12\") {\n            key.preventDefault();\n            var veldEl = document.getElementById(\"veld\");\n            veldEl.scroll({top: 0, behavior: 'smooth'});\n            return;\n        }\n\n        \/\/ Get Special keys (e.g. Shift, Windows key, CTRL, ALT, ALT GR, FN\n        \/\/ key.altKey\n        \/\/ key.ctrlKey\n        \/\/ key.metaKey\n        \/\/ key.repeat\n        \/\/ key.isComposing\n\n        \/\/ Backspace\n        if (key.key == \"Backspace\") {\n            \/\/ TODO add removal of character and adapt cursor position\n            return;\n        }\n        \/\/ Shift\n        if (key.key == \"Shift\") {\n            return;\n        }\n        \/\/ Ctrl\n        if (key.key == \"Control\") { \n            return;\n        }\n        \/\/ Meta (Window key or Command key on Mac)\n        if (key.key == \"Meta\") { \n            return;\n        }\n        if (!key.getModifierState(\"NumLock\")) {\n                debug(\"NumLock: is OFF\");\n                numLock = false;\n        }\n\n        debug(\"2 downKey - \");\n        \/\/ Alt\n        if (key.key == \"Alt\") {\n                key.preventDefault();\n                debug(\"ALT is DOWN - \");\n                altDown = true;\n            return;\n        }\n\n        \/\/ Alt Gr\n        if (key.key == \"AltGraph\") { \n            return;\n        }\n        \/\/ Dead? e.g. \" followed by space on locales that generate umlaut characters by typing\n        \/\/ a double quote followed by a character like a, u, i (e.g. Dutch, German) \n        if (key.key == \"Dead\") { \n            return;\n        }\n        \/\/ Alt + Numeric keypad numbers 0-9.\n        if (altDown) {\n           debug(\"Key code: \" + key.code + \" - \");\n           if (key.code.includes(\"Numpad\")) {\n                kar = kar + key.key;\n                debug(\"Alt + \" + kar + \" - \");\n           }\n           return;\n        }\n        if (key.key == \"Dead\") { \n            return;\n        }\n              \n        \/\/ Update the text field.\n        updateVeld(cursorPosition);\n\n        var scroll = scrollNow(beforeCursor + atCursor);\n        debug(\" Scroll \" + scroll);\n        if (scroll) {\n            var veldEl = document.getElementById(\"veld\");\n            var offset = veldEl.offsetHeight;\n            veldEl.scroll({top: offset, behavior: 'smooth'});\n        }\n\n \n        \/\/ Count the complete number of keys pressed (disregard special keys like shift, alt, etc.)\n        numberOfKeysPressed = numberOfKeysPressed + 1;\n\n        \/\/ If a &nbsp; (160) before a space (32) is detected, remove the nbsp from the text\n        if (atCursor.charCodeAt(0) == 160 && afterCursor.charCodeAt(0) == 32) {\n           tekst.innerHTML = '<span style=\"color: green\">' + beforeCursor + '<\/span><span style=\"background-color: yellow; color: blue;\"><b> <\/b><\/span><span style=\"color: blue;\">' + afterCursor.substring(1,afterCursor.length) + '<\/span>';\n           originalText = tekst.textContent;\n           updateVeld(cursorPosition);\n           debug(\"Removed '&nbsp; ' from: \" + originalText + \" - \");\n        }\n\n        \/\/ Check if correct character was pressed on keyboard depending on the mode.\n        \/\/ Allow for case-insensitive check if Caps (F7) button is active\n        debug(\"Check correct character -\" + atCursor + \"-\" + atCursor.charCodeAt(0) + \"-\" + key.key + \"-\" + key.keyCode + \"-\" + afterCursor.charCodeAt(0));\n        if ((!document.getElementById(\"F7\").disabled && atCursor.toLowerCase() != key.key.toLowerCase()) || (document.getElementById(\"F7\").disabled && atCursor != key.key)) {\n            \/\/ Wrong character was pressed on keyboard! Keep yellow cursor at same spot.\n            \/\/ Sound warning and display wanted character in bold and red.\n            updateWrongChar();\n            return;\n        }\n\n        debug(\"correct character found-\" + atCursor + \"-\" + key.key + \"-\");\n\n        \/\/ Count the number of correct keys pressed\n        correctKeysPressed = correctKeysPressed + 1;\n\n        \/\/ Get the start time when first correct key is pressed.\n        if (correctKeysPressed == 1) {\n            \/\/ Get the time the user entered the first character\n            start = new Date().getTime();\n            \/\/ Hide results (like duration and accuracy)\n            hideResults();\n        }\n\n        \/\/ Move the cursor to the next character.\n        cursorPosition = cursorPosition + 1;\n \n        \/\/ Refresh the text\n        updateVeld(cursorPosition);\n\n        \/\/ Autocomplete according to selected autocomplete buttons (F6-F10)\n        autoComplete();\n\n        \/\/ Refresh the text\n        updateVeld(cursorPosition);\n        \n        \/\/ If next character is a space and autoComplete for space is off, check for auto wrap by comparing the line numbers of the space and the next word\n        if (atCursor === \" \" && document.getElementById(\"F10\").disabled) {\n            debug(\"NEXTCHAR:-\" + atCursor + \"-\" + afterCursor.charAt(0) +  \"-\");\n            lineSpace = lineNumber(beforeCursor + atCursor);\n            debug(\"Line \" + lineSpace + \"-\");\n            lineNext = lineNumber(beforeCursor + atCursor + afterCursor.replace(\/ .*\/,''));\n            debug(lineNext + \" - \");\n            if (lineNext > lineSpace) {\n               debug(\"Add &nbsp; (160)\");\n                \/\/ Temporarily add nbsp before space in text to force a cursor at the end of auto-wrapped line.\n               atCursor = String.fromCharCode(160) + \" \";\n               tekst.innerHTML = '<span style=\"color: green\">' + beforeCursor + '<\/span><span style=\"background-color: yellow; color: blue;\"><b>' + atCursor + '<\/b><\/span><span style=\"color: blue;\">' + afterCursor + '<\/span>';\n               \/\/ Add nbsp to original text\n               originalText = tekst.textContent;\n            } \n        }\n\n        \/\/ If there is nothing below the cursor, you've reached the end of the text\n        if (atCursor === \"\" || cursorPosition > tekst.textContent.length) {\n            \/\/ Show the calculated results\n            calculateResults();\n            showResults();\n        }\n\n        \/\/ Put focus on the code-tag that contains the text\n        tekst.focus();\n    }\n\n    function dateAsString() {\n        var currentdate = new Date(); \n        return currentdate.getDate() + \"\/\"\n                + (currentdate.getMonth()+1)  + \"\/\" \n                + currentdate.getFullYear() + \" @ \"  \n                + currentdate.getHours() + \":\"  \n                + currentdate.getMinutes() + \":\" \n                + currentdate.getSeconds();\n    }\n\n    \/\/ Add the text file URLs to the array\n    function addUrl(location) {\n        urls.push(location);\n        debug(\"Added URL: \" + location);\n    }\n\n    \/\/ Read the github API repositories directory and find the entries with blob typ\n    async function getData() {\n        debug(\"Entered getData()\");\n        try {\n            debug(\"Fetching Data...\");\n            const response = await fetch(apiurl);\n            if (!response.ok) {\n                debug(\"Response NOT OK!\");\n                throw new Error(\"Response status: ${response.status}\");\n            }\n\n            const result = await response.json();\n            debug(\"Got JSON Result\");\n            result.tree.forEach((item) => {\n                if (item.type === \"blob\") {\n                    addUrl(raw + item.path);\n                }\n            })\n            debug(\"Set URLs...\");\n            error.innerHTML = '';\n            source.innerHTML = '';\n       } catch (error) {\n            var displayError = i18n(language, \"readError\") + apiurl + \"; \" + error;\n            if (error.message.includes(\"403\")) {\n                displayError = i18n(language, \"forbidden\") + apiurl + \"; \" + error;\n            }\n            if (error.message.includes(\"404\")) {\n                displayError = i18n(language, \"notFound\") + apiurl + \"; \" + error;\n            }\n            error.innerHTML = '<span style=\"color: red\"><b>' + displayError + '<\/b><\/span>';\n            tekst.innerHTML = displayError;\n        }\n    }\n\n    \/\/ Populate the pulldown list with the filenames.\n    function populateFilesList() {\n\t\tdebug(\"populateFilesList()\");\n        var lev = \"\"; \/\/ Selected difficulty level\n\t\tif (!document.getElementById(\"F1\").disabled) lev = \"F1\";\n\t\tif (!document.getElementById(\"F2\").disabled) lev = \"F2\";\n\t\tif (!document.getElementById(\"F3\").disabled) lev = \"F3\";\n\t\tif (!document.getElementById(\"F4\").disabled) lev = \"F4\";\n\t\tvar substr = language + \"\/\" + lev + \"\/\";\n\t\tdebug(\"substr: \" + substr);\n\t\t\/\/ The select element to hold the option tags with the found filenames.\n\t\tvar select = document.getElementById(\"files\");\n\t\t\/\/ Remove any existing options\n\t\tselect.options.length = 0;\n        \/\/ Get the language and difficulty related text file urls\n        var langURLs = urls.filter(str => str.includes(substr));\n\t\tlet len = langURLs.length;\n\t\tdebug(\"Found files: \" + len);\n\t\t\n        for (let i = 0; i < len; i++) {\n            \/\/ Source - https:\/\/stackoverflow.com\/a\/8376542\n            \/\/ Posted by T.J. Crowder, modified by community. See post 'Timeline' for change history\n            \/\/ Retrieved 2026-08-02, License - CC BY-SA 3.0\n            var parts = langURLs[i].split(\"\/\");\n            var filename = parts.pop();\n            var el = document.createElement(\"option\");\n            el.textContent = filename;\n            \/\/ el.value = raw + \"\/\" + language + \"\/\" + lev + \"\/\" + filename;\n            el.value = filename;\n            select.appendChild(el);\n        }\n\t}\n\t\n\tfunction setURLselected(url) {\n\t        \/\/ Source - https:\/\/stackoverflow.com\/a\/8376542\n            \/\/ Posted by T.J. Crowder, modified by community. See post 'Timeline' for change history\n            \/\/ Retrieved 2026-08-02, License - CC BY-SA 3.0\n            var parts = url.split(\"\/\");\n            var filename = parts.pop();\n\t\t\t\/\/ Source - https:\/\/stackoverflow.com\/a\/12265656\n            \/\/ Posted by Michal Klouda, modified by community. See post 'Timeline' for change history\n            \/\/ Retrieved 2026-08-02, License - CC BY-SA 4.0\n\t\t\tdebug(\"Set selected URL: \" + url + \" - \" + filename);\n\t\t\tvar sel = document.getElementById('files');\n            sel.value = filename;\n\t}\n\t\n    \/\/ Retrieve URL for one random text file based on language and selected difficulty level.\n    function randomURL() {\n            var substr = '\/' + language + '\/';\n            debug(\"language: \" + language + \" country: \" + country);\n\n            \/\/ Select text difficulty level\n            if (!document.getElementById(\"F1\").disabled) {\n                substr = substr + 'F1\/';\n            }\n            if (!document.getElementById(\"F2\").disabled) {\n                substr = substr + 'F2\/';\n            }\n            if (!document.getElementById(\"F3\").disabled) {\n                substr = substr + 'F3\/';\n            }\n            if (!document.getElementById(\"F4\").disabled) {\n                substr = substr + 'F4\/';\n            }\n\n            \/\/ If URL data is empty don't try to read from it.\n            if (urls.length <= 0) return;\n\n            \/\/ Get the language and difficulty related text file urls\n            var langURLs = urls.filter(str => str.includes(substr));\n            \/\/ If none exist: exit\n            if (langURLs.length <= 0) return;\n\n            \/\/ for debugging\n            \/\/ var langURLs = urls.filter(str => str.includes(\"specialcharacters.txt\"));\n\n            \/\/ Pseudo random number to select one of the langues specific URLs\n            var n = Math.floor(Math.random() * langURLs.length);\n            debug(\"Randomly selected \" + langURLs[n]);\n            return langURLs[n];\n    }\n\n    \/\/ Read text file from a given URL.\n    async function getText(url) {\n        debug(\"Entered getText()\");\n        try {\n            debug(\"Fetching Text from \"+ url);\n            const response = await fetch(url);\n            if (!response.ok) {\n                debug(\"Text Response NOT OK!\");\n                throw new Error(\"Response status: ${response.status}\");\n            }\n\n            const result = await response.text();\n            debug(\"Got Text Result...\");\n            lines = result.split(\/\\r\\n|\\r|\\n\/);\n            firstLine = lines[0];\n            secondLine = lines[1];\n            debug(\"1st line: \" + firstLine);\n            debug(\"2nd line: \" + secondLine);\n            source.innerHTML = '';\n            error.innerHTML = '';\n            if (firstLine.startsWith(\"#\")) {\n                source.innerHTML = '<i>' + firstLine.substring(2, firstLine.length) + '<\/i>';\n                originalText = secondLine;\n            } else {\n                source.innerHTML = '<i>Source not specified<\/i>';\n                originalText = request.responseText;\n            }\n            \/\/ Make sure the text field shows the newly loaded text.\n            updateVeld(cursorPosition);\n            autoComplete();\n            updateVeld(cursorPosition);\n\t\t\tsetURLselected(url);\n\t\t\thideResults();\n\t\t\tresetResults();\n\t\t\tshowResults();\n        } catch (error) {\n            var displayError = i18n(language, \"readError\") + url + \"; \" + error;\n            if (error.message.includes(\"403\")) {\n                displayError = i18n(language, \"forbidden\") + url + \"; \" + error;\n            }\n            if (error.message.includes(\"404\")) {\n                displayError = i18n(\"notFound\") + url + \"; \" + error;\n            }\n            error.innerHTML = '<span style=\"color: red\"><b>' + displayError + '<\/b><\/span>';\n            source.innerHTML = '';\n        }\n    }\n\n    function toggleButton(el)\n    {\n      if (el.disabled) {\n        el.disabled = false;\n      } else {\n        el.disabled = true;\n      }\n      tekst.focus();\n    }\n\n    function pressF1()\n    {\n        debug(\"F1 key was pressed\");\n        document.getElementById(\"F1\").disabled = false;\n        document.getElementById(\"F2\").disabled = true;\n        document.getElementById(\"F3\").disabled = true;\n        document.getElementById(\"F4\").disabled = true;\n        document.getElementById(\"F5\").disabled = true;\n        document.getElementById(\"F6\").disabled = false;\n        document.getElementById(\"F7\").disabled = false;\n        document.getElementById(\"F8\").disabled = false;\n        document.getElementById(\"F9\").disabled = false;\n        document.getElementById(\"F10\").disabled = false;\n\t\tpopulateFilesList();\n        tekst.focus();\n        mode = \"Simple\";\n    }\n    \n    function pressF2()\n    {\n        debug(\"F2 key was pressed\");\n        document.getElementById(\"F1\").disabled = true;\n        document.getElementById(\"F2\").disabled = false;\n        document.getElementById(\"F3\").disabled = true;\n        document.getElementById(\"F4\").disabled = true;\n        document.getElementById(\"F5\").disabled = true;\n        document.getElementById(\"F6\").disabled = false;\n        document.getElementById(\"F7\").disabled = true;\n        document.getElementById(\"F8\").disabled = false;\n        document.getElementById(\"F9\").disabled = false;\n        document.getElementById(\"F10\").disabled = true;\n\t\tpopulateFilesList();\n        tekst.focus();\n        mode = \"Intermediate\";\n    }\n\n    function pressF3()\n    {\n        debug(\"F3 key was pressed\");\n        document.getElementById(\"F1\").disabled = true;\n        document.getElementById(\"F2\").disabled = true;\n        document.getElementById(\"F3\").disabled = false;\n        document.getElementById(\"F4\").disabled = true;\n        document.getElementById(\"F5\").disabled = true;\n        document.getElementById(\"F6\").disabled = true;\n        document.getElementById(\"F7\").disabled = true;\n        document.getElementById(\"F8\").disabled = true;\n        document.getElementById(\"F9\").disabled = false;\n        document.getElementById(\"F10\").disabled = true;\n\t\tpopulateFilesList();\n        tekst.focus();\n        mode = \"Advanced\";\n    }\n\n    function pressF4()\n    {\n        debug(\"F4 key was pressed\");\n        document.getElementById(\"F1\").disabled = true;\n        document.getElementById(\"F2\").disabled = true;\n        document.getElementById(\"F3\").disabled = true;\n        document.getElementById(\"F4\").disabled = false;\n        document.getElementById(\"F5\").disabled = true;\n        document.getElementById(\"F6\").disabled = true;\n        document.getElementById(\"F7\").disabled = true;\n        document.getElementById(\"F8\").disabled = true;\n        document.getElementById(\"F9\").disabled = true;\n        document.getElementById(\"F10\").disabled = true;\n\t\tpopulateFilesList();\n        tekst.focus();\n        mode = \"Type Test\";\n    }\n\n   function pressF5()\n    {\n        debug(\"F5 key was pressed\");\n        \/\/ Retrieve a random Text\n        getText(randomURL());\n        \/\/ Reset the text\n        cursorPosition = 1;\n        start = 0;\n        end = 0;\n        time = 0;\n        accuracy = 0;\n\t\twords = 0;\n        cps = 0;\n        cpm = 0;\n\t\twpm = 0;\n        numberOfKeysPressed = 0;\n        correctKeysPressed = 0;\n        \/\/ Make sure the scroll position is a the top of the text\n        veld.scroll({top: 0, behavior: 'smooth'});\n    }\n\n    \/\/ Auto-Complete special characters depending on selected mode.\n    \/\/ TODO Add functionality for the different autocomplete setting: \n    \/\/ TODO Punctuation, Caps, Numbers, Special Character and Space\n    function autoComplete() {\n        \/\/ debug Skip AutoComplete\n        debug(\" auto complete '\" + atCursor + \"' - \");\n        \/\/ Punctuation auto-complete when toggle button for F5 is active\n        if (!document.getElementById(\"F6\").disabled && punctuation.includes(atCursor)) complete();\n\n        \/\/ Capital characters auto-complete when toggle button for F6 is active\n        \/\/ Basically typing becomes case insensitive (is already handled in main script)\n\n        \/\/ Numbers auto-complete when toggle button for F7 is active\n        if (!document.getElementById(\"F8\").disabled && numbers.includes(atCursor)) complete();\n\n        \/\/ Special Characters auto-complete when toggle button for F8 is active\n        if (!document.getElementById(\"F9\").disabled && speci.includes(atCursor)) complete();\n\n        if (!document.getElementById(\"F10\").disabled && space.includes(atCursor)) {\n            complete();\n        }\n        if (document.getElementById(\"F10\").disabled) {\n            \/\/ Remove temporary nbsp before space when toggle button for F10 is not active\n            if (atCursor == String.fromCharCode(160)) {\n                atCursor = \" \";\n            }\n        }\n    }\n\n    function complete() {\n        debug(\"Complete '\" + atCursor + \"' - \");\n        cursorPosition = cursorPosition + 1;\n        if (cursorPosition > tekst.textContent.length) return;\n        \/\/ call this again to make sure consequtive occurences are also handled.\n        beforeCursor = originalText.substring(0, cursorPosition -1);\n        atCursor = originalText.substring(cursorPosition - 1, cursorPosition);\n        afterCursor =  originalText.substring(cursorPosition, originalText.length);\n        debug(\"Moved cursor to \" + cursorPosition + \" - '\" + atCursor + \"' - \");\n        autoComplete();\n    }\n\n    \/\/ Update the text in the text field.\n    function updateVeld(cur) {\n        debug(\"In UpdateVeld cur \" + cur + \" - \" + originalText.length + \" - \");\n        if (originalText.length <= 0) return;\n        \/\/ Get the characters before, at and after the current cursor position\n        beforeCursor = originalText.substring(0, cur - 1);\n        atCursor = originalText.substring((cur - 1), cur);\n        afterCursor =  originalText.substring(cur, originalText.length);\n        tekst.innerHTML = '<span style=\"color: green\">' + beforeCursor + '<\/span><span style=\"background-color: yellow; color: blue;\"><b>' + atCursor + '<\/b><\/span><span style=\"color: blue;\">' + afterCursor + '<\/span>';\n    }\n\n    function updateWrongChar(cur) {\n            tekst.innerHTML = '<span style=\"color: green\">' + beforeCursor.substring(0, (beforeCursor.length)) + '<\/span>' +'<span style=\"background-color: yellow; color: red\"><b>' + atCursor + '<\/b><\/span>' + '<span style=\"color:#FFCCCB;\">' + afterCursor + '<\/span>';\n    }\n\n    \/\/ Reset results for Duration, Accuray, Char\/s, Char\/min, Words\/min\n    function resetResults() {\n        start = 0;\n        end = 0;\n        time = 0;\n        duration = 0;\n        accuracy = 0;\n\t\twords = 0;\n        cps = 0;\n        cpm = 0;\n        wpm = 0;\n        numberOfKeysPressed = 0;\n        correctKeysPressed = 0;\n\t\tminutes = 0;\n\t\tseconds = 0;\n\t\tremainder = 0;\n    }\n\n    \/\/ Hide Duration, Accuray, Char\/s, Char\/min, Words\/min\n    function hideResults() {\n        document.getElementById(\"duration\").style.visibility = 'hidden';\n        document.getElementById(\"accuracy\").style.visibility = 'hidden';\n        document.getElementById(\"words\").style.visibility = 'hidden';\n        document.getElementById(\"cps\").style.visibility = 'hidden';\n        document.getElementById(\"cpm\").style.visibility = 'hidden';\n        document.getElementById(\"wpm\").style.visibility = 'hidden';\n    }\n\n    function calculateResults() {\n        debug(\" 1 calculateResults \" + correctKeysPressed + \"\/\" + numberOfKeysPressed + \" - \");\n        end = new Date().getTime();\n        time = (end - start) \/ 1000; \/\/ Time in seconds\n        accuracy = (correctKeysPressed \/ numberOfKeysPressed) * 100;\n\t\twords = originalText.trim().split(\/\\s+\/).length; \/\/ Number of words in the current text\n        cps = numberOfKeysPressed \/ time;\n        cpm = cps * 60;\n        debug(\" 2 calculateResults time \" + time + \"=\" + end + \"-\" + start + \" - \");\n        accuracy = Math.round((accuracy + Number.EPSILON) * 100) \/ 100;\n        cps = Math.round((cps + Number.EPSILON) * 100) \/ 100;\n        cpm = Math.round(cpm);\n\t\tvar min = time\/60; \/\/ seconds to minutes\n        wpm = words\/min;\n        wpm = Math.round(wpm);\n        debug(\"Number of words: \" + words + \" minutes: \" + min + \" wpm: \" + wpm);\n        \/\/ Expired full minutes -> quotient (The integer number resulting from the division of one number by another)\n\t    minutes = Math.floor(time\/60);\n        \/\/ The total number of seconds (rounded to nearest full second)\n        seconds = Math.round(time);\n        \/\/ The remaining number of seconds after the full minutes\n        remainder = seconds - (minutes * 60);\n    }\n\n    \/\/ Show Duration, Accuray, Char\/s, Char\/min, words\/min.\n    function showResults() {\n        words = originalText.trim().split(\/\\s+\/).length; \/\/ Number of words in the current text\n        var kleur = 'green';\n        if (accuracy < 60) {\n            kleur = 'yellow';\n        }\n        if (accuracy < 40) {\n            kleur = 'red';\n        }\n        document.getElementById(\"duration\").innerHTML = i18n(language, \"duration\") + \": <b style='color:\" + kleur + \"'>\" + minutes + \"<\/b> min <b style='color:\" + kleur + \"'>\" + remainder + \"<\/b> s&nbsp;\";\n        document.getElementById(\"accuracy\").innerHTML = i18n(language, \"accuracy\") +  \": <b style='color:\" + kleur + \"'>\" + accuracy + \"<\/b> %&nbsp;\";\n        document.getElementById(\"words\").innerHTML = i18n(language, \"words\") +  \": <b style='color:\" + kleur + \"'>\" + words + \"<\/b>\";\n        document.getElementById(\"cps\").innerHTML = i18n(language, \"cps\") + \": <b style='color:\" + kleur + \"'>\" + cps + \"<\/b>&nbsp;\";\n        document.getElementById(\"cpm\").innerHTML = i18n(language, \"cpm\") + \": <b style='color:\" + kleur + \"'>\" + cpm + \"<\/b>&nbsp;\";\n        document.getElementById(\"wpm\").innerHTML = i18n(language, \"wpm\") + \": <b style='color:\" + kleur + \"'>\" + wpm + \"<\/b>\";\n        \/\/ show duration and accuracy, characters per seconds and chars per minute\n        document.getElementById(\"duration\").style.visibility = 'visible';\n        document.getElementById(\"accuracy\").style.visibility = 'visible';\n        document.getElementById(\"words\").style.visibility = 'visible';\n        document.getElementById(\"cps\").style.visibility = 'visible';\n        document.getElementById(\"cpm\").style.visibility = 'visible';\n        document.getElementById(\"wpm\").style.visibility = 'visible';\n    }\n\n    \/\/ F1-F10 mouse clicks\n    function hover(fKey) {\n        disabledOrigin = document.getElementById(fKey).disabled;\n        debug('hover ' + fKey + '-' + disabledOrigin);\n        document.getElementById(fKey).disabled = false;\n        document.getElementById(fKey).style.background='orange';\n    }\n\n    function clickFunction(fKey) {\n        debug('click ' + fKey + '-' + document.getElementById(fKey).disabled);\n        if (fKey == \"F1\") {\n            pressF1();\n            disabledOrigin = false;\n        } else if (fKey == \"F2\") {\n            pressF2();\n            disabledOrigin = false;\n        } else if (fKey == \"F3\") {\n            pressF3();\n            disabledOrigin = false;\n        } else if (fKey == \"F4\") {\n            pressF4();\n            disabledOrigin = false;\n        } else if (fKey == \"F5\") {\n            setTimeout(() => {autoComplete(); updateVeld(cursorPosition);}, 600);\n        } else {\n            document.getElementById(fKey).disabled = disabledOrigin;\n            toggleButton(document.getElementById(fKey));\n            disabledOrigin = document.getElementById(fKey).disabled;\n        }\n        document.getElementById(fKey).disabled = disabledOrigin;\n        document.getElementById(fKey).style.background='';\n    }\n\n    function leave(fKey) {\n        debug('leave ' + fKey + '-' + document.getElementById(fKey).disabled);\n        document.getElementById(fKey).disabled = disabledOrigin;\n        document.getElementById(fKey).style.background='';\n    }\n\n    function lineNumber(textIncludingCursor) {\n        var el = document.getElementById(\"veld\");\n        if (_buffer == null) {\n            _buffer = document.createElement('tekst');\n            _buffer.style.border = 'none';\n            _buffer.style.height = '0';\n            _buffer.style.overflow = 'hidden';\n            _buffer.style.padding = '0';\n            _buffer.style.position = 'absolute';\n            _buffer.style.left = '0';\n            _buffer.style.top = '0';\n            _buffer.style.zIndex = '-1';\n            document.body.appendChild(_buffer);\n        }\n        _buffer.value = el.value;\n        _buffer.innerHTML = el.innerHTML;\n\n        var newCodeElement = null;\n        var element = _buffer.querySelectorAll('code').forEach(element => {\n             newCodeElement = element;\n        })\n        newCodeElement.textContent = textIncludingCursor;\n\n        var positionInfo = el.getBoundingClientRect();\n        var height = positionInfo.height;\n        var width = positionInfo.width;\n        var cs = window.getComputedStyle(el);\n        var pl = parseInt(cs.paddingLeft);\n        var pr = parseInt(cs.paddingRight);\n        var pb = parseInt(cs.paddingBottom);\n        var pt = parseInt(cs.paddingTop);\n        var lh = parseInt(cs.lineHeight);\n\n        \/\/ Copy content width.\n        _buffer.style.width = (el.clientWidth - pl - pr) + 'px';\n\n        \/\/ Copy content width.\n        _buffer.style.width = (width - pl - pr) + 'px';\n\n        var bufResult = Math.floor(_buffer.scrollHeight \/ lh);\n        \/\/ var divResult = Math.floor(el.scrollHeight \/ lh);\n        return bufResult;\n    }\n\n    function scrollNow(textIncludingCursor) {\n        var line = lineNumber(textIncludingCursor);\n\n        if (line == 0) result = 1;\n        if (line > 7) {\n            return true;\n        }\n        return false;\n    }\n\n    function debug(debugMessage) {\n        if (logLevel.includes(\"DEBUG\")) {\n            console.debug(debugMessage);\n        }\n    }\n\n    function info(infoMessage) {\n        if (logLevel.includes(\"DEBUG\") || logLevel.includes(\"INFO\")) {\n            console.info(infoMessage);\n        }\n    }\n\n    function warn(warnMessage) {\n        if (logLevel.includes(\"DEBUG\") || logLevel.includes(\"INFO\") || logLevel.includes(\"WARN\")) {\n            console.warn(warnMessage);\n        }\n    }\n\n    function error(errorMessage) {\n        if (logLevel.includes(\"DEBUG\") || logLevel.includes(\"INFO\") || logLevel.includes(\"WARN\") || logLevel.includes(\"ERROR\")) {\n            console.error(errorMessage);\n        }\n    }\n\n\/\/ Source - https:\/\/stackoverflow.com\/a\/11381730\n\/\/ Posted by Michael Zaporozhets, modified by community. See post 'Timeline' for change history\n\/\/ Retrieved 2026-06-22, License - CC BY-SA 4.0\nwindow.mobileAndTabletCheck = function() {\n  let check = false;\n  (function(a){if(\/(android|bb\\d+|meego).+mobile|avantgo|bada\\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk\/i.test(a)||\/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-\/i.test(a.substr(0,4))) check = true;})(navigator.userAgent||navigator.vendor||window.opera);\n  return check;\n};\n\n<\/script>\n     \n<\/head>\n<body>\n    \n<div id=\"top\" style=\"font-size:26px;\">\n    <span id=\"error\" style=\"font-size: 20px\"><b style=\"color:red; font-size:26px;\">Error Area. No errors detected yet&#8230;<\/b><\/span>\n<\/div>\n<div id=\"veld\" style=\"width:730px; height:300px; background-color:lightblue; overflow:scroll; padding-right:3px; padding-left:3px; line-height:30px;\">\n    <code id=\"tekst\" contenteditable=\"false\" style=\"font-size:26px; line-height:30px;\">\n        <span id=\"blauw\" style=\"color: blue\"><i>Text Area<\/i><\/span>\n    <\/code>\n<\/div>\n<div style=\"width:730px;font-size:0px;\">\n    <span id=\"source\" style=\"font-size:10px;\"><i>source<\/i><\/span>\n    <span id=\"fileslist\" style=\"float:right\">\n\t    <select name=\"files\" id=\"files\" style=\"font-size:10px\">\n        <\/select>\n    <\/span>\n<\/div>\n<div>\n    <span id=\"duration\" style=\"font-size: 20px\">Duration: <b style=\"color:red\">0<\/b> min <b style=\"color:red\">0<\/b> s<\/span>&nbsp;\n    <span id=\"accuracy\" style=\"font-size: 20px\">Accuracy: <b style=\"color:red\">0<\/b> %<\/span>\n    <span id=\"words\" style=\"font-size: 20px\">Words: <b style=\"color:red\">0<\/b><\/span><br\/>\n    <span id=\"cps\" style=\"font-size: 20px\">Char\/s: <b style=\"color:red\">0<\/b><\/span>&nbsp;\n    <span id=\"cpm\" style=\"font-size: 20px\">Char\/min: <b style=\"color:red\">0<\/b><\/span>&nbsp;\n    <span id=\"wpm\" style=\"font-size: 20px\">Words\/min: <b style=\"color:red\">0<\/b><\/span>\n<\/div>\n<div>\n    <span id=\"presets\">Autocomplete Presets and Text Refresh<\/span><br\/>\n    <button id=\"F1\" type=\"button\" onmouseover=\"hover('F1')\" onmouseleave=\"leave('F1')\" onclick=\"clickFunction('F1');\" disabled=\"\">Simple(F1)<\/button> \n    <button id=\"F2\" type=\"button\" onmouseover=\"hover('F2')\" onmouseleave=\"leave('F2')\" onclick=\"clickFunction('F2');\" disabled=\"\">Intermediate(F2)<\/button> \n    <button id=\"F3\" type=\"button\" onmouseover=\"hover('F3')\" onmouseleave=\"leave('F3')\" onclick=\"clickFunction('F3');\" disabled=\"\">Advanced(F3)<\/button>\n    <button id=\"F4\" type=\"button\" onmouseover=\"hover('F4')\" onmouseleave=\"leave('F4')\" onclick=\"clickFunction('F4');\" disabled=\"\">Type Test(F4)<\/button>\n    <button id=\"F5\" type=\"button\" onmouseover=\"hover('F5')\" onmouseleave=\"leave('F5')\" onclick=\"clickFunction('F5'); pressF5();\" disabled=\"\">Refresh(F5)<\/button>\n    <br\/><span id=\"settings\">Autocomplete settings<\/span><br\/>\n    <button id=\"F6\" type=\"button\" onmouseover=\"hover('F6')\" onmouseleave=\"leave('F6')\" onclick=\"clickFunction('F6')\" disabled=\"\">Punctuation(F6)<\/button>\n    <button id=\"F7\" type=\"button\" onmouseover=\"hover('F7')\" onmouseleave=\"leave('F7')\" onclick=\"clickFunction('F7')\" disabled=\"\">Caps(F7)<\/button>\n    <button id=\"F8\" type=\"button\" onmouseover=\"hover('F8')\" onmouseleave=\"leave('F8')\" onclick=\"clickFunction('F8')\" disabled=\"\">Numbers(F8)<\/button>\n    <button id=\"F9\" type=\"button\" onmouseover=\"hover('F9')\" onmouseleave=\"leave('F9')\" onclick=\"clickFunction('F9')\" disabled=\"\">Special Chars(F9)<\/button>\n    <button id=\"F10\" type=\"button\" onmouseover=\"hover('F10')\" onmouseleave=\"leave('F10')\" onclick=\"clickFunction('F10')\" disabled=\"\">Space(F10)<\/button>\n<\/div>\n\n\n<style>.kb-table-of-content-nav.kb-table-of-content-id4157_d24fac-ff .kb-table-of-content-wrap{padding-top:var(--global-kb-spacing-sm, 1.5rem);padding-right:var(--global-kb-spacing-sm, 1.5rem);padding-bottom:var(--global-kb-spacing-sm, 1.5rem);padding-left:var(--global-kb-spacing-sm, 1.5rem);}.kb-table-of-content-nav.kb-table-of-content-id4157_d24fac-ff .kb-table-of-contents-title-wrap{padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.kb-table-of-content-nav.kb-table-of-content-id4157_d24fac-ff .kb-table-of-contents-title{font-weight:regular;font-style:normal;}.kb-table-of-content-nav.kb-table-of-content-id4157_d24fac-ff .kb-table-of-content-wrap .kb-table-of-content-list{font-weight:regular;font-style:normal;margin-top:var(--global-kb-spacing-sm, 1.5rem);margin-right:0px;margin-bottom:0px;margin-left:0px;}<\/style>\n\n\n<h2 class=\"wp-block-heading\">Raadpleeg Medisch Professional<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Raadpleeg een medisch professional voordat je deze typ test onderdeel maakt van je revalidatietraject.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Handleiding<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Snelle start<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Kies de moeilijkheidsgraad (F1 &#8211; F4) met de functietoetsen of muisknoppen: <strong>Beginner (F1)<\/strong>, <strong>Gevorderd (F2)<\/strong>, <strong>Expert (F3)<\/strong> of <strong>Type Test (F4)<\/strong>.<\/li>\n\n\n\n<li>Kies <strong>Ververs (F5)<\/strong> om een tekst uit de gekozen moeilijkheidsgraad te tonen.<\/li>\n\n\n\n<li>Of kies een tekst bestand uit het uitklapmenu onder het Tekst Veld.<\/li>\n\n\n\n<li>De standaard moeilijkheidsgraad is <strong>Beginner (F1)<\/strong>.<\/li>\n\n\n\n<li>Let op de gele cursor in de linker bovenhoek van het tekst gebied.<\/li>\n\n\n\n<li>Typ het karakter onder de cursor.<\/li>\n\n\n\n<li>Wanneer het correcte karakter is getyped schuift de cursor naar het volgende karakter.<\/li>\n\n\n\n<li>Wanneer een fout karakter word getyped blijft de cursor op zijn plek en wordt het verwachte karakter rood en dikgedrukt afgebeeld.<\/li>\n\n\n\n<li>De focus ligt bij <strong>Beginner (F1)<\/strong> alleen op het typen van het correcte karakter uit het alfabet. <\/li>\n\n\n\n<li>Spaties, nummers of speciale karakters worden niet getypt. Ze worden automatisch aangevuld.<\/li>\n\n\n\n<li>Shift or Caps Lock worden niet gebruikt. Hoofdletters worden genegeerd.<\/li>\n\n\n\n<li>De resultaten zoals duur, nauwkeurigheid, karakters\/seconde en karakters\/minuut worden getoond als de tekst compleet is overgetypt. Tijdens het typen zijn ze verborgen.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Ontwerpprincipes<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Deze typtest is ontworpen voor mensen die opnieuw moeten leren typen tijdens een medisch revalidatie proces, bijvoorbeeld na verminderde fijne motoriek in \u00e9\u00e9n hand of beide handen veroorzaakt door fysiek trauma of neurologische schade. Verschillende automatische aanvul opties helpen om toetscombinaties en toetsen waarvoor de hand ver gestrekt moet worden te vermijden. Hierdoor kan de typist naar eigen potentie werken.<br>In de Type Test moeilijkheidsgraad wordt alle automatische aanvulling uitgeschakeld en werkt het zoals elke online typesnelheid test.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Voorwaarden<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Zoals met de meeste typsnelheidstests wordt het beste resultaat bereikt door het gebruik van een PC (of laptop), een fysiek toetsenbord en een muis. Deze typtest is niet ondersteund op mobiele telefoons of tablets.<\/li>\n\n\n\n<li>In de browser moet de ondersteuning voor Javascript aan staan.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Kenmerken<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Uitklapmenu met lijst van beschikbare tekst bestanden per moeilijkheidsgraad.<\/li>\n\n\n\n<li>Duur, nauwkeurigheid en typsnelheid worden getoond als de hele tekst is ingetypt.<\/li>\n\n\n\n<li>Moeilijkheidsgraad (F1-F4), Ververs (F5) en Automatische Aanvul Instelling (F6-F10).<\/li>\n\n\n\n<li>4 moeilijkheidsgradaties\n<ul class=\"wp-block-list\">\n<li>Beginner (F1)<\/li>\n\n\n\n<li>Gevorderd (F2)<\/li>\n\n\n\n<li>Expert (F3)<\/li>\n\n\n\n<li>Type Test (F4)<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Moeilijkheidsgraad (F1-F4) selectie met bijbehorend functietoets of muis klik.<\/li>\n\n\n\n<li>Ververs optie : Ververs (F5)<\/li>\n\n\n\n<li>Ververs (F5) wordt uitgevoerd om de volgend (willekeurig gekozen) tekst te tonen tijdens het laden van de pagina in de browser, met de F5 toets of een muis klik.<\/li>\n\n\n\n<li>5 Automatisch Aanvul Instellingen kunnen aan\/uit geschakeld worden met de overeenkomende functietoets of muis klik.\n<ul class=\"wp-block-list\">\n<li>Tekens (F6)<\/li>\n\n\n\n<li>Hoofdletters (F7)<\/li>\n\n\n\n<li>Nummers (F8)<\/li>\n\n\n\n<li>Speciale Karakters (F9)<\/li>\n\n\n\n<li>Spatie (F10)<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Cursor blijft staan en het verwachte karakter wordt dikgedrukt en rood afgebeeld als een fout karakter wordt getypt.<\/li>\n\n\n\n<li>Automatisch scrollen wanneer tekst groter is dan het zichtbare tekstgebied wanneer de cursor dicht bij de onderrand van het zichtbare gedeelte komt.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Tekst Veld<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Het tekst veld toont de te typen tekst. De gele cursor in de linkerbovenhoek knippert niet. Hier staat het te typen karakter. Als karakters automatisch worden aangevuld schuift de cursor \u00e9\u00e9n plaats op.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"428\" src=\"https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/06\/afbeelding-1024x428.png\" alt=\"\" class=\"wp-image-4204\" style=\"aspect-ratio:2.3925274325636874;width:414px;height:auto\" srcset=\"https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/06\/afbeelding-1024x428.png 1024w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/06\/afbeelding-300x125.png 300w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/06\/afbeelding-768x321.png 768w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/06\/afbeelding-1536x642.png 1536w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/06\/afbeelding.png 1647w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Als een verkeerd karakter wordt getypt blijft de cursor staan. Het verwachte karakter wordt rood en dikgedrukt totdat het juiste karakter wordt getypt. De overblijvende tekst wordt zwart in plaats van blauw. Correct getypte tekst wordt groen.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"805\" height=\"157\" src=\"https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/06\/afbeelding-1.png\" alt=\"\" class=\"wp-image-4207\" style=\"aspect-ratio:5.127604703122418;width:354px;height:auto\" srcset=\"https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/06\/afbeelding-1.png 805w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/06\/afbeelding-1-300x59.png 300w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/06\/afbeelding-1-768x150.png 768w\" sizes=\"auto, (max-width: 805px) 100vw, 805px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Bijschrift<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Indien beschikbaar wordt er een bijschrift met een beschrijvende tekst over de huidig inhoud van het Tekst Veld getoont.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1021\" height=\"461\" src=\"https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/afbeelding-7.png\" alt=\"\" class=\"wp-image-4643\" style=\"aspect-ratio:2.2148057842290605;width:349px;height:auto\" srcset=\"https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/afbeelding-7.png 1021w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/afbeelding-7-300x135.png 300w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/afbeelding-7-768x347.png 768w\" sizes=\"auto, (max-width: 1021px) 100vw, 1021px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Tekstbestand Uitklapmenu<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Het uitklapmenu onder het Tekst Veld toont een lijst van de beschikbare tekst bestanden per gekozen moeilijkheidsgraad. Kies een moeilijkheidsgraad (F1-F4) gevolgd door Ververs (F5) om de juiste lijst te tonen.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"935\" height=\"243\" src=\"https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/afbeelding-9.png\" alt=\"\" class=\"wp-image-4646\" style=\"aspect-ratio:3.847843419483095;width:356px;height:auto\" srcset=\"https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/afbeelding-9.png 935w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/afbeelding-9-300x78.png 300w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/afbeelding-9-768x200.png 768w\" sizes=\"auto, (max-width: 935px) 100vw, 935px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Selecteer een specifiek tekst bestand in het Uitklapmenu om het te tonen in het Tekst Veld.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"473\" src=\"https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/afbeelding-12-1024x473.png\" alt=\"\" class=\"wp-image-4650\" style=\"aspect-ratio:2.164887228864632;width:582px;height:auto\" srcset=\"https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/afbeelding-12-1024x473.png 1024w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/afbeelding-12-300x139.png 300w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/afbeelding-12-768x355.png 768w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/afbeelding-12-1536x709.png 1536w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/afbeelding-12.png 1771w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Resultaten<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">Toon Waarden<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Als deze pagina wordt geladen worden de waarden van de resultaten getoond als 0 in rood aangezien er nog niets is getypt.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"823\" height=\"150\" src=\"https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/afbeelding-13.png\" alt=\"\" class=\"wp-image-4652\" style=\"aspect-ratio:5.4866590248481435;width:376px;height:auto\" srcset=\"https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/afbeelding-13.png 823w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/afbeelding-13-300x55.png 300w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/afbeelding-13-768x140.png 768w\" sizes=\"auto, (max-width: 823px) 100vw, 823px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Tijdens het typen zijn deze waarden verborgen. Als het laatste karakter van de tekst is getypt worden de waarden berekend en getoond in groen.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"965\" height=\"149\" src=\"https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/afbeelding-14.png\" alt=\"\" class=\"wp-image-4654\" style=\"aspect-ratio:6.476415762583983;width:439px;height:auto\" srcset=\"https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/afbeelding-14.png 965w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/afbeelding-14-300x46.png 300w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/afbeelding-14-768x119.png 768w\" sizes=\"auto, (max-width: 965px) 100vw, 965px\" \/><\/figure>\n\n\n\n<h5 class=\"wp-block-heading\">Duur<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">Wanneer het eerste correcte karakter wordt gedetecteerd wordt een starttijd (<math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><mrow><mi>s<\/mi><\/mrow> <mn><\/mn> <\/math>) gezet. Wanneer het laatste karakter van de tekst is getypt wordt er een eindtijd (<math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><mrow><mi>e<\/mi><\/mrow> <mn><\/mn> <\/math>) gezet. De duur (<math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><mrow><mi>d<\/mi><\/mrow> <mn><\/mn> <\/math>) is de eindtijd min de starttijd (in milliseconden) gedeeld door 1000 voor conversie naar seconden.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\">\n<mrow>\n    <mi>d<\/mi>\n    <mo>=<\/mo>\n    <mfrac>\n        <mrow>\n            <mo>(<\/mo><mi>e<\/mi><mo>\u2212<\/mo><mi>s<\/mi><mo>)<\/mo>\n        <\/mrow>\n        <mrow><mi>1000<\/mi><\/mrow>\n    <\/mfrac>\n<\/mrow>\n<\/math><\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Nauwkeurigheid<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">Het nauwkeurigheidspercentage (<math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"> <mrow><mi>a<\/mi><\/mrow> <mn><\/mn> <\/math>) wordt berekend uit het aantal correct getypte karakters (<math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><mrow><mi>c<\/mi><\/mrow> <mn><\/mn> <\/math>) gedeeld door het totaal getypte karakters (<math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><mrow><mi>t<\/mi><\/mrow> <mn><\/mn> <\/math>) maal honderd.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><mrow><msup><mi>a<\/mi><mn><\/mn><\/msup><mo>=<\/mo><mo>(<\/mo><mfrac><mrow><mi>c<\/mi><mn><\/mn><\/mrow><mrow><mi>t<\/mi><mn><\/mn><\/mrow><\/mfrac><mo>)<\/mo><msrow><mo>\u00d7<\/mo><\/msrow><mn>100<\/mn><\/mrow><\/math><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">De automatisch aangevulde karakters worden niet geteld. Alleen getypte karakters dragen bij aan de nauwkeurigheidsberekening.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Woorden (Wrdn)<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">Het aantal woorden (<math><mrow><mi>w<\/mi><\/mrow><\/math>) in de huidige tekst.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Karakters per Seconde<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">De karakters per seconde (<math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><mrow><mi>cps<\/mi><\/mrow><\/math>) worden berekend uit het totale aantal ingedrukte toetsen (<math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><mrow><mi>t<\/mi><\/mrow><\/math>) gedeeld door de duur (<math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><mrow><mi>d<\/mi><\/mrow><\/math>).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><mrow><mi>cps<\/mi><mo>=<\/mo><mfrac><mrow><mi>t<\/mi><\/mrow><mrow><mi>d<\/mi><\/mrow><\/mfrac><\/mrow><\/math><\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Karakters per Minuut<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">De karakters per minuut (<math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><mrow><mi>cpm<\/mi><\/mrow><\/math>) zijn de karakters per seconde (<math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><mrow><mi>cps<\/mi><\/mrow><\/math>) maal 60.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><mrow>\n        <mi>cpm<\/mi>\n        <mo>=<\/mo>\n        <mi>cps<\/mi>\n        <mo>\u00d7<\/mo>\n        <mi>60<\/mi>\n    <\/mrow>\n<\/math><\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Woorden per Minuut<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">De Woorden per Minuut (<math><mrow><mi>wpm<\/mi><\/mrow><\/math>) worden berekend aan de hand van het aantal woorden (<math><mrow><mi>w<\/mi><\/mrow><\/math>) in de huidige tekst gedeeld door de duur (<math><mrow><mi>d<\/mi><\/mrow><\/math>) (gedeeld door 60 voor omzetting van seconden naar minuten).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><math><mrow><msup><mi>wpm<\/mi><mn><\/mn><\/msup><mo>=<\/mo><mo>(<\/mo><mfrac><mrow><mi>w<\/mi><mn><\/mn><\/mrow><mrow><mi>d\/60<\/mi><mn><\/mn><\/mrow><\/mfrac><mo>)<\/mo><\/mrow><\/math><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Moeilijkheidsgraad Knoppen<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Met F1 &#8211; F4 kies je een set van automatische aanvulinstellingen en de tekst moeilijkheidsgraad. Wanneer de muis aanwijzer boven de knoppen zweeft wijzigt de achtergrondkleur naar oranje.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"95\" src=\"https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/06\/afbeelding-17-1024x95.png\" alt=\"\" class=\"wp-image-4295\" style=\"aspect-ratio:10.78021158528527;width:399px;height:auto\" srcset=\"https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/06\/afbeelding-17-1024x95.png 1024w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/06\/afbeelding-17-300x28.png 300w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/06\/afbeelding-17-768x72.png 768w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/06\/afbeelding-17.png 1244w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"> Door een muisklik wordt (of blijft) de achtergrondkleur donkerblauw. De niet gekozen moeilijkheidsgraad knoppen worden lichtblauw.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"93\" src=\"https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/06\/afbeelding-5-1024x93.png\" alt=\"\" class=\"wp-image-4218\" style=\"aspect-ratio:11.010557562570813;width:396px;height:auto\" srcset=\"https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/06\/afbeelding-5-1024x93.png 1024w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/06\/afbeelding-5-300x27.png 300w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/06\/afbeelding-5-768x70.png 768w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/06\/afbeelding-5.png 1241w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Beginner (F1)<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Alle automatische aanvulinstellingen zijn aan.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"197\" src=\"https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/06\/afbeelding-13-1024x197.png\" alt=\"\" class=\"wp-image-4260\" style=\"aspect-ratio:5.198196022160847;width:525px;height:auto\" srcset=\"https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/06\/afbeelding-13-1024x197.png 1024w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/06\/afbeelding-13-300x58.png 300w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/06\/afbeelding-13-768x147.png 768w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/06\/afbeelding-13-1536x295.png 1536w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/06\/afbeelding-13.png 1605w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">De typist hoeft alleen het juiste karakter uit het alfabet te typen en kan hoofdletters negeren.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"307\" src=\"https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/keyboardSimpleF1-1024x307.jpg\" alt=\"\" class=\"wp-image-3943 media-focus-point\"\/ style=\"object-position: 14% 50%;\" srcset=\"https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/keyboardSimpleF1-1024x307.jpg 1024w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/keyboardSimpleF1-300x90.jpg 300w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/keyboardSimpleF1-768x230.jpg 768w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/keyboardSimpleF1-1536x461.jpg 1536w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/keyboardSimpleF1-2048x614.jpg 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Gevorderd (F2)<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">De Hoofdletters (F7) en Spatie (F10) automatische aanvulinstellingen zijn uit.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"200\" src=\"https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/06\/afbeelding-14-1024x200.png\" alt=\"\" class=\"wp-image-4262\" style=\"aspect-ratio:5.119813157503563;width:522px;height:auto\" srcset=\"https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/06\/afbeelding-14-1024x200.png 1024w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/06\/afbeelding-14-300x59.png 300w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/06\/afbeelding-14-768x150.png 768w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/06\/afbeelding-14-1536x301.png 1536w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/06\/afbeelding-14.png 1604w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Dit betekent dat de typist ook de  Shift toets (of Caps Lock) voor hoofdletters en de spatiebalk voor spatie moet gebruiken.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"307\" src=\"https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/keyboardIntermediateF2-1-1024x307.jpg\" alt=\"\" class=\"wp-image-3947\" srcset=\"https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/keyboardIntermediateF2-1-1024x307.jpg 1024w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/keyboardIntermediateF2-1-300x90.jpg 300w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/keyboardIntermediateF2-1-768x230.jpg 768w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/keyboardIntermediateF2-1-1536x461.jpg 1536w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/keyboardIntermediateF2-1-2048x614.jpg 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Expert (F3)<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Behalve Speciale Kars (F9), staan alle automatisch aanvulinstelling uit.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"194\" src=\"https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/06\/afbeelding-15-1024x194.png\" alt=\"\" class=\"wp-image-4264\" style=\"aspect-ratio:5.278380216136385;width:496px;height:auto\" srcset=\"https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/06\/afbeelding-15-1024x194.png 1024w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/06\/afbeelding-15-300x57.png 300w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/06\/afbeelding-15-768x146.png 768w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/06\/afbeelding-15-1536x292.png 1536w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/06\/afbeelding-15.png 1606w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Dit betekent dat de typist leestekens, hoofdletters, nummers en spaties ook moet typen.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"307\" src=\"https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/keyboardAdvancedF3-1024x307.jpg\" alt=\"\" class=\"wp-image-3953\" srcset=\"https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/keyboardAdvancedF3-1024x307.jpg 1024w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/keyboardAdvancedF3-300x90.jpg 300w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/keyboardAdvancedF3-768x230.jpg 768w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/keyboardAdvancedF3-1536x461.jpg 1536w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/keyboardAdvancedF3-2048x614.jpg 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Type Test (F4)<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Alle automatisch aanvulinstelling staan uit.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"195\" src=\"https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/06\/afbeelding-16-1024x195.png\" alt=\"\" class=\"wp-image-4266\" style=\"aspect-ratio:5.2511690782908165;width:488px;height:auto\" srcset=\"https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/06\/afbeelding-16-1024x195.png 1024w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/06\/afbeelding-16-300x57.png 300w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/06\/afbeelding-16-768x147.png 768w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/06\/afbeelding-16-1536x293.png 1536w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/06\/afbeelding-16.png 1604w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">De typist moet de benodigde toetscombinaties gebruiken om het juiste en hoofdlettergevoelige karakter te tonen.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"307\" src=\"https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/keyboardTypeTextF4-1024x307.jpg\" alt=\"\" class=\"wp-image-3956\" srcset=\"https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/keyboardTypeTextF4-1024x307.jpg 1024w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/keyboardTypeTextF4-300x90.jpg 300w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/keyboardTypeTextF4-768x230.jpg 768w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/keyboardTypeTextF4-1536x461.jpg 1536w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/keyboardTypeTextF4-2048x614.jpg 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Karakters die niet als toets voorkomen op het toetsenbord kunnen worden gevormd door toetscombinaties zoals &lt;Alt&gt; + &lt;nummers op numeriek toetsenbord gedeelte&gt;. (Zorg dat Num Lock aan is.) Zie ook <a href=\"https:\/\/support.microsoft.com\/en-US\/Word\/insert-ascii-or-unicode-latin-based-symbols-and-characters\">https:\/\/support.microsoft.com\/en-US\/Word\/insert-ascii-or-unicode-latin-based-symbols-and-characters<\/a>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"307\" src=\"https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/keyboardAltNumericKeyPad-1024x307.jpg\" alt=\"\" class=\"wp-image-3957\" srcset=\"https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/keyboardAltNumericKeyPad-1024x307.jpg 1024w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/keyboardAltNumericKeyPad-300x90.jpg 300w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/keyboardAltNumericKeyPad-768x230.jpg 768w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/keyboardAltNumericKeyPad-1536x461.jpg 1536w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/keyboardAltNumericKeyPad-2048x614.jpg 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Voorbeeld<em>:<\/em> <strong>&lt;Alt&gt; + 0176<\/strong> toont een graden teken \u00b0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Technieken zoals &#8220;chained dead keys&#8221; ( <strong>&#8216;<\/strong> + <strong>e<\/strong> =&gt; <strong>\u00e9<\/strong> ) en karakter combinaties (<strong>&lt;Alt&gt; + 0176<\/strong> =&gt; <strong>\u00b0<\/strong>)  kunnen gebruikt worden karakters te cre\u00ebren die niet op het toetsenbord worden gevonden. Zoek online voor meer informatie.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Ververs (F5) Knop<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Kies de F5 functietoets of klik de Ververs knop om naar een andere tekst te springen. De achtergrondkleur van de knop blijft lichtblauw.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Automatische Aanvul Instellingen Knoppen<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">De Moeilijkheidsgraad Knoppen selecteren vooraf ingestelde combinaties van enkele Automatische Aanvul Instellingen. Ongeacht de gekozen Moeilijkheidsgraad kunnen de Automatische Aanvulinstellingen gewijzigd worden met de F6 &#8211; F10 functietoetsen of met de muis. Hierdoor kan elke gewenste combinatie van Automatische Aanvul Instellingen bij elke Moeilijkheidsgraad worden gekozen.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"97\" src=\"https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/06\/afbeelding-10-1024x97.png\" alt=\"\" class=\"wp-image-4230\" style=\"aspect-ratio:10.55676043227277;width:486px;height:auto\" srcset=\"https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/06\/afbeelding-10-1024x97.png 1024w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/06\/afbeelding-10-300x28.png 300w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/06\/afbeelding-10-768x73.png 768w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/06\/afbeelding-10-1536x145.png 1536w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/06\/afbeelding-10.png 1605w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Tekens (F6) knop<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Als deze knop wordt getoond met een donkerblauwe achtergrond staat de automatisch aanvulinstelling voor Tekens aan. Leestekens zoals <strong>.?!,;:-\u2013\u2014()[]{}'&#8221;<\/strong> hoeven niet getypt te worden. Ze worden automatisch aangevuld en de cursor schuift een plaats op.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Hoofdletters (F7) knop<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Als deze knop wordt getoond met een donkerblauwe achtergrond staat de automatisch aanvulinstelling voor Hoofdletters aan. Het typen wordt niet-hoofdlettergevoelig. Dit betekent dat de typist geen toetscombinatie Shift + &lt;karaktertoets&gt; hoeft te gebruiken en alleen kleine letters typt. Deze worden automatisch omgezet naar hoofdletters waar dat noodzakelijk is in de tekst.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Nummers (F8) knop<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Als deze knop wordt getoond met een donkerblauwe achtergrond staat de automatisch aanvulinstelling voor Nummers aan. De nummers 0123456789 hoeven niet te worden getypt. Ze worden automatisch aangevuld en de cursor schuift een plaats op.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Speciale Karakters (F9) button<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Als deze knop wordt getoond met een donkerblauwe achtergrond staat de automatisch aanvulinstelling voor Speciale Karakters aan. Speciale karakters zoals #$%^&amp;*_+`|\\\u00b0\u00a3 hoeven niet te worden getypt. Ze worden automatisch aangevuld en de cursor schuift een plaats op. Mogelijk worden in de loop der tijd nog meer speciale karakters toegevoegd.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Spatie (F10) knop<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Als deze knop wordt getoond met een donkerblauwe achtergrond staat de automatisch aanvulinstelling voor Spatie aan. De spatiebalk hoeft niet te worden gebruikt. Spaties worden automatisch aangevuld en de cursor schuift een plaats op.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Scroll Tekst<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Soms is de te typen tekst iets langer dan in het visueel gedeelte van het tekstveld past. Met de rechter scrollbalk kan de tekst gescrolled worden. Of met het scrollwiel op de muis terwijl die over het tekstveld zweeft.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"424\" src=\"https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/06\/afbeelding-11-1024x424.png\" alt=\"\" class=\"wp-image-4233\" style=\"aspect-ratio:2.415086049273303;width:502px;height:auto\" srcset=\"https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/06\/afbeelding-11-1024x424.png 1024w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/06\/afbeelding-11-300x124.png 300w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/06\/afbeelding-11-768x318.png 768w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/06\/afbeelding-11-1536x636.png 1536w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/06\/afbeelding-11.png 1640w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Maar eigenlijk is handmatig scrollen helemaal niet nodig vanwege de Auto Scroll functionaliteit.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Auto Scroll<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Auto-scroll wordt toegepast voor tekst die gedeeltelijk buiten het visuele tekstveld valt. Wanneer de cursor onderaan komt wordt automatisch gescrolled om het volgende deel van de tekst te tonen. Dit levert een ononderbroken typervaring.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Scroll naar Onder (F11)<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Voor een tekst die groter is dan het tekstveld kan met de F11 functietoets naar het einde worden gesprongen.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Scroll naar Boven (F12)<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Voor een tekst die al onderaan staat kan met de F12 functietoets weer naar boven worden gesprongen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Donkere Modus<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Bij voorkeur voor een lichte tekst op een donkere achtergrond kan de donkere modus worden ingeschakeld.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"180\" height=\"84\" src=\"https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/afbeelding-16.png\" alt=\"\" class=\"wp-image-4724\" style=\"width:82px;height:auto\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Het &#8220;drijvend&#8221; menu rechtsonder op het scherm toont zon en maan icoontjes. Kies de zon voor normale modus en de maan voor de donkere modus.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"188\" height=\"94\" src=\"https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/afbeelding-18.png\" alt=\"\" class=\"wp-image-4736\" style=\"width:82px;height:auto\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"924\" src=\"https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/afbeelding-17-1024x924.png\" alt=\"\" class=\"wp-image-4730\" style=\"aspect-ratio:1.1082154557821817;width:359px;height:auto\" srcset=\"https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/afbeelding-17-1024x924.png 1024w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/afbeelding-17-300x271.png 300w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/afbeelding-17-768x693.png 768w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/afbeelding-17-1536x1386.png 1536w, https:\/\/fotografeer.nl\/wp-content\/uploads\/2026\/07\/afbeelding-17.png 1780w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Wijzigingshistorie<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Zie <a href=\"https:\/\/fotografeer.nl\/?p=3217#change-history\">Engelse versie<\/a><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Bekende problemen<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Zie <a href=\"https:\/\/fotografeer.nl\/?p=3217#known-issues\">Engelse versie<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Disclaimer<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>1. Aansprakelijkheid<\/strong><br>De software en alle bijbehorende materialen worden geleverd &#8216;zoals ze zijn&#8217; en &#8216;zoals beschikbaar&#8217;, zonder enige vorm van garantie. fotografeer.nl is niet aansprakelijk voor enige directe of indirecte schade, inclusief maar niet beperkt tot winstderving, bedrijfsonderbreking of verlies van data, voortvloeiend uit het gebruik of de onmogelijkheid tot het gebruik van deze software.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>2. Intellectueel Eigendom<\/strong><br>Alle intellectuele eigendomsrechten met betrekking tot de software berusten uitsluitend bij fotografeer.nl of haar licentiegevers. Het is niet toegestaan om de software te kopi\u00ebren, reverse-engineeren, distribueren of wijzigen zonder voorafgaande schriftelijke toestemming.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>3. Wijzigingen<\/strong><br>fotografeer.nl behoudt zich het recht voor om deze disclaimer op elk moment zonder voorafgaande kennisgeving aan te passen. Wij raden u aan om deze pagina regelmatig te controleren op eventuele wijzigingen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>4. Toepasselijk Recht<\/strong><br>Op deze disclaimer en het gebruik van de software is uitsluitend het Nederlands recht van toepassing.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Probeer deze typ test als je opnieuw moet leren typen al gevolg van fysiek trauma of neurologische schade. Met de verschillende automatische aanvul instellingen worden  toetscombinaties en moeilijk bereikbare toetsen vermeden om een stapsgewijze medische revalidatie te ondersteunen.<\/p>\n","protected":false},"author":2,"featured_media":3943,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"categories":[187],"tags":[197,195,189,193,191],"class_list":["post-4157","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-revalidatie___nl","tag-medisch-revalidatie","tag-reval","tag-revalidatie___nl","tag-test___nl","tag-typen___nl"],"lang":"nl","translations":{"nl":4157,"en":3217},"pll_sync_post":{},"_links":{"self":[{"href":"https:\/\/fotografeer.nl\/index.php?rest_route=\/wp\/v2\/posts\/4157","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fotografeer.nl\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fotografeer.nl\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fotografeer.nl\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/fotografeer.nl\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4157"}],"version-history":[{"count":174,"href":"https:\/\/fotografeer.nl\/index.php?rest_route=\/wp\/v2\/posts\/4157\/revisions"}],"predecessor-version":[{"id":4773,"href":"https:\/\/fotografeer.nl\/index.php?rest_route=\/wp\/v2\/posts\/4157\/revisions\/4773"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/fotografeer.nl\/index.php?rest_route=\/wp\/v2\/media\/3943"}],"wp:attachment":[{"href":"https:\/\/fotografeer.nl\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4157"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fotografeer.nl\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4157"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fotografeer.nl\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4157"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}