MooTyper Moodle Plugin
======================
Features
========
Everything you need to start typing instruction
in Moodle is provided in this plugin.

"When looking at grades, exclamation marks are present if
the person typed more than 60 chars in 5 seconds (which is
kind of imposible)...or if the exercise took more than 10
minutes to complete...so this is to warn a teacher about a
potential cheater..."

Lessons - A selection of example lessons, are
included. If you choose not to use them, you can delete
them before triggering the installation, or you can
delete them after the installation is completed. Lessons
can be completed in lesson mode, practice mode or exam mode.

Keyboard Layouts - A selection of keyboard layouts
are included. You can create your own and have it included
by bumping the version number, then upgrading. Keyboard
visualization during lessons is optional. An admin can
delete unwanted keyboard layouts at any time.

After the V4.2.2 upgrade, any old MooTyper using, Whole grades,
will need to be edited and then saved. No need to make any
changes, just need to save to update the mdl_mootyper table
for the scale entry. (rating and grades were added v3.9.1)

Installation
============

* Put this code under "yourmoodlerootdir/mod/mootyper" (you may "git clone")
* Visit your Moodle site as administrator to install plugin via web interface

Contact
=======

Feel free to contact me at drachels@drachels.com

If you have problems using the plugin or would like
to see a new feature implemented, please visit

    https://github.com/drachels/moodle-mod_mootyper/issues

If you like the plugin and want to say hi publicly instead of
sending an email, leave a comment at

    https://moodle.org/plugins/mod_mootyper
===============
=== Deferred to a later version. ===

=== GitHub issue parity (open issues not yet mapped to MooTyper tickets) ===
20260405 Audit baseline from https://github.com/drachels/moodle-mod_mootyper/issues.
    Open issues currently not explicitly referenced in this upgrade log are listed below
    so they are accounted for and can be mapped to internal MooTyper tickets.

GitHub issue to MooTyper ticket mapping table:
GitHub # | GitHub issue title | MooTyper ticket | Upgrade status | Notes
115 | Bug: Accent letters not working in German layout | MooTyper_1466 | pending-triage | Confidence: High. Rationale: Tracked as 20231026 MooTyper_1466 - Bug: Accent letters not working in German layout #115.

20170704 MooTyper_1465 - Special characters not working for swiss french in mac #42.
20180315 MooTyper_1468 - Spanish accent marks not working on Linux or Mac #57 nor Chromebooks #130.
    2026041011 Connectivity restored; Linux validation can proceed on Raspberry Pi host
        10.0.6.58 via VNC. Mac/Chromebook runtime checks remain pending.
20200521 MooTyper_438 - move contents of the csvexport.php file into gview.php file.
20200521 MooTyper_436 - Lesson import request to change to file upload.
20200521 MooTyper_437 - Request for new Audio Exercise Mode.
20200521 MooTyper_445 - Need to change all refs to audio over to dictation.
20200521 MooTyper_446 - User ownership stops dictation from working.
20200521 MooTyper_447 - Investigate using Atto for text to type.
20200521 MooTyper_448 - exercises.php needs mods for audio.
20200521 MooTyper_449 - eedit.php needs mods for audio.
20200521 MooTyper_456 - need to modify database tables for MooTyper audio capability.
20200521 MooTyper_450 - should combine *_form.php's into mod_form.php like Hot Question does.
20200521 MooTyper_453 - Need to change, text alignment, from an activity setting to exercise setting.
20200521 MooTyper_455 - view.php needs mods for audio.
20200521 MooTyper_460 - When viewing page exercises.php, lesson in the URL is wrong number.
20200521 MooTyper_461 - provider.php file NEEDS REWRITE.
20200521 MooTyper_464 - lib.php function get_typer_grades_adv sort order needs fixing.
20200521 MooTyper_466 - Export order looks unordered due to sort on lastname.
20200521 MooTyper_467 - See about adding Tab as a character to type in an exercise.
20200521 MooTyper_468 - log link where you have deleted own grade returns to view all grades instead of own grades.
20200521 MooTyper_470 - Going to add a category does not create nav bar breadcrumb.
20200607 MooTyper_495 - Need to verify backup as it appears to be broken.
20200612 MooTyper_537 - discovered dictation stuff in current code that needs to be eliminated.
20200629 MooTyper_556 - eins.php when dropdown shows Visible to Only me need to hide Can
    edit Any teacher in course.
20200801 MooTyper_587 - Czech(V5) keyboard layout will not correctly type all characters.
    2026032123 Verified code present: Czech(V5).php/.js files exist; full character-coverage
        validation is still a manual typing check.
20200812 MooTyper_590 - mootyper_scale_used and mootyper_scale_used_anywhere not implemented correctly.
20210318 MooTyper_684 - Need Telugu(TEV5) keyboard layout.
    2026032120 Verified not fixed: no Telugu(TEV5) layout files are present;
        current repo contains Telugu(V4).php/.js only.
20210318 MooTyper_685 - Need Thai(THV5) keyboard layout.
20210318 MooTyper_688 - Need Uyghur(UG_LTV5) keyboard layout.
    2026032121 Verified not fixed: no Uyghur(UG_LTV5) layout files are present;
        current repo contains Uyghur(V4).php/.js only.
20210318 MooTyper_689 - Need Vietnamese(VIV5) keyboard layout.
    2026032122 Verified fixed for layout availability: Vietnamese(VNIV5).php/.js are present,
        and Vietnamese(VNTelexV5).php/.js also exist for Telex-style input; additional multimode
        behavior requests remain tracked under MooTyper_1335.
20210325 MooTyper_650 - Page reload when Continue is showing wipes out current results.
20201106 MooTyper_651 - suspicion from attempts table should be added to the grades table.
20210325 MooTyper_690 - Need work on the documentation on Moodle.
20210327 MooTyper_693 - lessonname and exercisename fields are too large.
20210418 MooTyper_702 - Tower 1 ansible playbook upgrading MooTyper gave missing string error.
20210506 MooTyper_713 - Need to modify import to allow/disallow adding lessons/keyboards.
20210509 MooTyper_717 - See about making a BS4 based keyboard layout.
20211005 MooTyper_754 - New capability request for cron to periodically remove grades.
20220405 MooTyper_837 - Exercise X of X in view.php needs to be changed to a function.
20220723 MooTyper_826 - The Moodle Mobile app is not supported.
20220816 MooTyper_909 - In MooTyper in 10.0.6.136/moodle400 generates two grade_grade entries for each user.
20221207 MooTyper_974 - Direct access to eedit.php via url should be checked and prevented if not editable by me.
20230119 MooTyper_994 - Make install of lessons optional during an upgrade.
20230302 MooTyper_988 - Need a new graph class to do the actual graph for owngrades.php and gview.php.
20230720 MooTyper_1060 - Completion field null/not null status needs to be checked.
20230928 MooTyper_1082 - Need to implement automatic attempts removal for old data. WAITING
    2026040801 BT planning checklist:
        1) Add a scheduled housekeeping task that closes stale in-progress attempts after a
           configurable timeout.
        2) Delete orphaned mootyper_checks rows (no matching attemptid) older than a
           configurable age window.
        3) Add plugin settings for enable/disable, stale timeout, orphan-retention days,
           and batch size.
        4) Process rows in bounded batches and log scanned/updated/deleted counts for each run.
        5) Keep the task idempotent and safe for retries; no changes to non-matching rows.
        6) Add an optional scheduled reset workflow for selected Practice mode activities
            (candidate scope under MooTyper_754): use reset_mootyper_instance() on matching
            IDs using a defined schedule, with dry-run/logging and explicit opt-in selection.
20231014 MooTyper_1100 - Need to revisit cron_task.php as it is not really needed. Commented
    out as not currently needed.
    2026041702 Reopened for review: current classes/task/cron_task.php is a heartbeat only and
        performs no maintenance actions.
    2026041703 Recommendation: add a scheduled housekeeping pass for stale in-progress attempts
        (for example no activity for N hours), starting with Practice mode scope; use
        mootyper_attempts.inprogress + latest mootyper_checks.checktime as the inactivity
        signal, close matched attempts (set inprogress=0), delete related checks, process in
        bounded batches, and expose enable/timeout/batch settings with mtrace counts.
20231026 MooTyper_1466 - Bug: Accent letters not working in German layout #115
20231106 MooTyper_1112 - English to Hebrew lessons. See ticket. WAITING
20240111 MooTyper_1168 - Deleting a MooTyper instance seems to leave some items undeleted.
    2026032108 Verified not fixed per tracker evidence: prior testing reported leftover
        mootyper_attempts and mootyper_grades rows after deleting activities; must re-test on a
        fresh install using admin/teacher/student flows and confirm mdl_grade_grades and activity
        completion status behavior.
20240115 MooTyper_1170 - Might need a previous_completions.php file. - WAITING
20240129 MooTyper_1183 - Exercise Completion may need rewrite to account for bad exercise
    grade in Lesson mode.
20240326 MooTyper_1227 - Would be nice to have pictures for which finger to use. In progress
    in the MooTyper Keyboard development course with new English(USV5.2)masterlayout version.
20240524 MooTyper_1248 - Need new KB layout installation code when installing/upgrading MooTyper.
20240813 MooTyper_1295 - Feature request for inverted letters, inverted words, added, or lower/upper case error.
20241019 MooTyper_1331 - Need to see about creating group graphs on gview.php page and maybe owngrades.php.
20250206 MooTyper_1367 - Trying to add help buttons to non-existent form elements.
20251118 MooTyper_1385 - Feature Request: Allow teachers to customize CSS class colors (finger1, finger2, finger3, finger4) #131.
20251122 MooTyper_1387 - Using Amharic in Opera - Mistake details widens the page w/each mistake.
20260322 MooTyper_1450 - Need to check all the KB layout *.js files for code style errors.
Moodle Versions

===============

=== 5.1.0 === pending
20200521 MooTyper_435bt - Need to be able to delete un-need lesson files from lesson folder.
    20240212 See ticket re:may be in v4.2.4 already! Need to VERIFY.
    2026032104 Verified not fixed: no admin workflow deletes files from mod/mootyper/lessons,
        and lsnimport.php still auto-imports any lesson file present in that folder.
    2026041702 Implemented and validated lesson-delete hardening in lsnexrem.php: delete path
        now cleans dependent grades/attempts/checks/ratings, updates affected users in the
        gradebook, removes the physical lesson file only when present, and gracefully re-points
        activities to the alphabetically first available lesson.
    2026041703 Live verification on moodledev activity id 8382 (lesson aaaaa12): Delete all
        exercises from lesson completed; admin View all grades and student View my grades both
        refreshed cleanly with grades cleared and lesson fallback set to __Micky__. Added guard
        so stale repeat delete URLs now redirect to exercises instead of throwing an error.
20200521 MooTyper_439bt - Possible unused function get_typerexercises() and
    get_typerexercisesfull($lsn = 0) in classes/local/lessons.php.
    2026041001 Confirmed no call sites in plugin and removed both functions from
        classes/local/lessons.php.
    2026041002 Completed broader classes/local helper scan; removed additional
        unreferenced methods get_grades_avg() and get_renderer_factory().
20200521 MooTyper_473bt - Issue #71 Activity heading help does not stay toggled open with Boost.
    2026040701 Tested against Moodle 3.11 and lower in both Boost and Classic:
        the overview_help icon/string is shown.
    2026040702 Tested against Moodle 4.0 and higher in both Boost and Classic:
        the overview_help display path appears deprecated (icon/string not shown).
20200521 MooTyper_469bt - Pratice lesson grade remove should check it is last grade before removing.
    2026041304 Moved from Deferred. Confirmed scope is individual grade deletion order:
        a user can only delete their latest grade first, preventing non-terminal gaps that
        can block lesson completion requirements. This is related to, but distinct from,
        MooTyper_1127 (exercise deletion risk across multiple users).
20200621 MooTyper_545bt - Evaluate current suspicion setting.
    2026040901 Moved from Deferred after rework of suspicion evaluation.
    2026040902 Suspicion now tracks counter rollback anomalies and long no-progress gaps
        between check intervals in classes/local/results.php.
    2026040903 In timed exercises, suspicion now compares typed pace against exercise
        length/timelimit context and uses an early-stall check (good initial pace,
        long idle tail, low completion ratio).
    2026040904 Corrected full-hits tracking in all active typing scripts.
20220808 MooTyper_900bt - Need a Tamil keyboard layout.
    2026041201 Moved from Deferred to 5.1.0 pending after Tamil(V5)e layout and
        typer.js combined-character flow updates passed row-level validation.
    2026041202 Verified left-shift guidance for < and > by updating Tamil(V5)e.js
        shift-side mapping; upper row 2 now highlights and scores correctly in testing.
20230513 MooTyper_902bt - Settings are incomplete on the settings.php and mod_form.php pages.
    20260405 Folded GitHub issue #133 into MooTyper_902 and moved from Deferred;
        fix was included in v5.0.0 (Build: 2026032100).
20231019 MooTyper_1102bt - See about changing Suspicion to be based on WPM and character
    count of the exercise.
    2026041303 Moved from Deferred after linking to MooTyper_545 rework; ticket scope is
        covered by the new suspicion calculation logic added under MooTyper_545 entries
        2026040902 and 2026040903.
20240218 MooTyper_1209bt - MooTyper - Grades in Moodle are not updated when deleting own MooTyper
    exercise grades.
    2026032109 Verified not fixed: attrem.php calls mootyper_update_grades(), but when a user
        has no remaining mootyper_grades rows the update path does not explicitly clear the
        user's gradebook/completion state, so stale values can remain.
    2026041701 Implemented and validated fix in lib.php: mootyper_update_grades() now sends
        per-user null-grade updates when no rows remain (for both rating and whole-activity
        grade items), and uses per-user aggregate grade updates to avoid stale 100 carryover.
        Verified on moodledev activity id 8382 (Frank Furter): gradebook value cleared to null.
20241030 MooTyper_1332bt - Need a Vietnamese(VNV5) Keyboard Layout.
    2026041003 Confirmed layout is installable/selectable via generic layout import.
    2026041004 Fixed Vietnamese(VNV5) and Vietnamese(VNIV5) JS key reset handling and
        corrected VNIV5 layout identifiers/header text.
20241031 MooTyper_1335bt - Request to Add Telex Input Support for Vietnamese Typing in MooTyper.
    2026041005 Fixed Telex driver runtime defects in combined-character flow
        (showKeyboard variable usage, end handler call, mistake counter, and key reset behavior).
    2026041012 Expanded Telex combined-character detection and normalized Vietnamese
        accented letters to base keys so highlighting no longer falls into undefined
        next6 styling (home-row shift/drop) and extra accent-mark characters type correctly.
    2026041014 Accepted IME-composed character completion directly from textarea state
        so letter-plus-mark input modes can advance reliably even when key events vary.
    2026041101 Reduced false Telex mistake counts during in-progress IME composition
        and corrected scoring math so precision and net WPM remain valid (non-negative).
    2026041102 Added a lightweight typing-page diagnostic line showing active layout name
        and the latest IME-detected character stream to speed reproducible field reports.
    2026041103 Normalized cumulative IME compositionupdate payloads (for example VIE TL)
        to the latest character so unshifted number-row typing is scored per key correctly.
    2026041104 Limited compositionupdate key processing to Korean(KNV7) so Vietnamese
        Telex combined-character input is not double-processed across current/next characters.
    2026041105 Restored compositionupdate fallback for IME environments where keypress is
        restricted, while ignoring compositionupdate during combined-character targets.
    2026041106 Added temporary per-error diagnostics (expected->typed) to clarify each
        counted mistake, including VNTelex combined-character mismatch paths.
    2026041107 Ignored compositionupdate pre-events unless they match the current target
        character, fixing Chrome student sessions where spaces were being marked incorrect.
    2026041108 Normalized IME-altered intermediate keyup input (for example å-style keys)
        to Telex base letters so VNTelex no longer adds false mistakes when output is correct.
    2026041109 Deferred VNTelex mismatch counting until IME commits a character at the
        current position, preventing false mistakes while all letters render correct.
    2026041110 Removed temporary on-page diagnostics (ime/err) after validation and
        confirmed pass on three Vietnamese sentence exercises using Chrome + VIE TL.
20241126 MooTyper_1342bt - Feature request - A flush button to reset a MooTyper for a user.
    2026041111 Expanded teacher/admin flush controls on gview.php to show in Lesson,
        Exam, and Practice modes, so filtered or whole-group resets can be done faster.
20251118 MooTyper_899bt - Delete all from a lesson also needs to delete the physical file.
    20260405 Folded GitHub issue #129 into MooTyper_899 and moved from Deferred;
        started code review of lesson-delete/file-delete path for 5.1.0.
    20260405 Verified with purge/delete of EN - Aesops Fables 11.
        Check 1 passed: lesson removed from Exercises lesson list.
        Check 2 passed: source lesson file removed from lessons folder.
        Check 3 passed: exercises tied to that lesson were removed.
        Check 4 passed: related grades/attempt-linked checks for those exercises were cleaned up.
        Check 5 passed: return path landed on Exercises with a valid remaining lesson selected.
20260322 MooTyper_1467bt - Error in lesson ES - AesopsFables1.txt #132.
    20260405 Moved from Deferred; updated files were included in recent 5.0.0 (Build: 2026032100) release.
20260411 MooTyper_1469bt - The klrem.php file does not fail gracefully if the physical file is
    already missing .
    2026041101 Hardened klrem.php deletion path to use $CFG->dirroot.'/mod/mootyper'
        instead of getcwd(), and treat already-missing layout files as non-fatal.
    2026041102 Live validation passed: deleting Spanish(V4) from layouts.php completed
        cleanly when physical layout files were absent, with DB cleanup and normal return.
    2026041301 Discovered downstream crash in classes/local/keyboards.php when attempting
        to view/use an activity that referenced a deleted layout; get_instance_layout_js_file()
        and get_instance_layout_file() called get_record() and tried to access ->name on bool
        (false return value when record not found). Added fallback logic to find first available
        layout on demand and gracefully switch to the fallback if requested layout is missing.
    2026041302 Extended fallback logic to also verify layout files actually exist on disk;
        now searches for a complete layout (both .php and .js files present) when the
        requested layout record exists but files are orphaned, or when the record doesn't exist.
20260413 MooTyper_1470bt - The layout folder contains multiple Danish files - investigate on
    what to keep.
    2026041301 Deleted V4 Danish layout files (Danish(DAV4).php/.js and Danish(DKV4).php/.js)
        after verifying they were orphaned and no longer in use.
    2026041302 Corrected file comments in both Danish(DAV5) and Danish(DKV5) layout files;
        both had been mislabeled as DKV5 in their docstrings.
    2026041303 Follow-up review of DK vs DA naming: DK aligns to ISO country code for
        Denmark, while DA appears to be a legacy/context-specific label. Initial on-screen
        layout comparison shows no visible differences beyond the name label; physical
        keyboard validation is pending before deciding whether DAV5 should be retired.
20260414 MooTyper_1471bt - Investigate adding a Cherokee keyboard layout.
    2026041401 Moved from Deferred and added initial Cherokee scaffold files:
        layouts/Cherokee(CWYV5).php and layouts/Cherokee(CWYV5).js.
    2026041402 Scaffold is based on English(UKV5) so the ISO-style extra key area
        (including the key left of Z) is available for physical keyboard validation;
        next step is iterative Cherokee character mapping and runtime typing tests.
    2026041601 Added Cherokee(CWYV5) multi-codepoint cluster grouping in typer.js so
        number-row combinations (for example ᏣᎳᎩ, ᎣᏏᏲ, and ᏩᏙ) map to a single
        physical key target for highlighting and scoring.
    2026041602 Added Cherokee(CWYV5) follow-up handling for CWY transliteration outputs
        (CWY/OSY/WDO) and fixed key-id runtime issues in Cherokee(CWYV5).js, so
        number-row combo keys highlight on the number row instead of the first letter key.
    2026041603 Reworked thenFinger() in Cherokee(CWYV5).js to use key-id mapping so
        finger highlight colors follow the actual key positions in this layout.
    2026041604 Hardened Cherokee(CWYV5).js key highlighting by guarding missing key IDs
        and replacing brittle getKeyID() condition chains with a deterministic
        Cherokee/CWY token-to-key map, preventing runtime stalls.
    2026041605 Added Cherokee transliteration alias support for KWY/kwy alongside CWY/cwy
        in Cherokee(CWYV5).js and typer.js cluster recognition, so key-1 combined targets
        no longer fall back to spacebar highlighting when lessons use the KWY form.
    2026041606 Corrected Cherokee(CWYV5).js token detection for the two-character ᏩᏙ output
        to use a two-codepoint slice (not three), preventing missed key targets and
        spacebar fallback highlighting on that number-row combo key.
    2026041607 Fixed Cherokee(CWYV5).js key-highlight fallback by normalizing Cherokee
        lowercase/uppercase syllabic forms in getKeyID(), so toLowerCase() paths resolve
        to intended physical key IDs instead of defaulting to jkeyspace.
    2026041608 Added missing Cherokee(CWYV5) shifted-key mapping for Ꮚ (backquote key)
        and explicit shifted-syllabic right/left shift-token routing in keyboardElement(),
        so shifted row-key exercises highlight the correct key and shift side.
    2026041609 Extended Cherokee(CWYV5) shifted-syllabic shift-token routing for row 2
        (Q..] keys), so shifted row-2 exercises highlight the correct shift key while
        still crediting typed keys correctly.
    2026041610 Extended Cherokee(CWYV5) shifted-syllabic shift-token routing for row 3
        (A..# keys) and hardened jkey# DOM lookup in key-highlighting helpers, so row-3
        shifted exercises highlight shift keys correctly and the row's final key remains reliable.
    2026041611 Corrected Cherokee(CWYV5) row-3 shift-token classification so unshifted
        row-3 syllabics (for example ᎠᏍᏗ...) no longer light shift keys, while true shifted
        row-3 syllabics (for example ᏌᏎᏐ...) still light the proper shift side.
    2026041612 Remapped Cherokee(CWYV5) row-3 final syllabics (Ꮹ/Ꮾ) to jkey# and added
        shifted Ꮾ to row-3 shift-left token routing, so the last key before Enter highlights
        in the intended row-3 position instead of the ISO key left of Z.
    2026041613 Swapped Cherokee(CWYV5).php key IDs so the key before Enter uses
        jkeybackslash and the ISO key left of Z uses jkey#, then aligned JS mapping for
        Ꮹ/Ꮾ to jkeybackslash to match intended Cherokee layout key naming.
    2026041614 Extended Cherokee(CWYV5) shifted-token routing to cover row-4 uppercase
        syllabics (#..B and N../ groups) so shift keys highlight correctly, and hardened
        typer.js physical-key fallback to accept IntlBackslash/Backslash variants for
        jkey# and jkeybackslash when a keyboard driver emits no printable character.
    2026041615 Updated Cherokee(CWYV5).php to leave the ISO key left of Z visually blank
        for the Sequoyah Cherokee Nation layout choice while retaining runtime key handling
        for cross-keyboard compatibility.
    2026041616 Final cleanup after the Sequoyah layout decision: removed remaining
        Cherokee jkey# highlight/token assumptions in Cherokee(CWYV5).js and typer.js,
        while keeping jkeybackslash physical-key fallback tolerant of Backslash/
        IntlBackslash scan codes.
20260417 MooTyper_1473bt - Feature Request - Relocate mootyper/*.js files to a js folder.
    2026041701 Created mod/mootyper/js, moved typer.js + typer(ETV7).js + typer(KNV7).js,
        and updated view.php script includes to the new js/ paths.
    2026041801 Fixed Korean V7 runtime script selection in view.php to treat KNV7/KRV7/KNR7
        layout filename variants as Korean V7, so the standalone js/typer(KRV7).js loader is used
        and key highlighting works again.
    2026041802 Normalized Korean V7 naming to KR conventions: renamed layout PHP to
        layouts/Korean(KRV7).php, updated Korean(KRV7).js THE_LAYOUT/labels, and renamed
        standalone typer file to js/typer(KRV7).js with matching loader updates.
20260422  MooTyper_1474bt - MooTyper - Need a Hindi keyboard layout. Had an old ticket for
    this keyboard layout, but closed it so starting this new one. Started development.
    2026042301 Completed Hindi(HIV5) row-level validation and fixed shifted-key highlighting
        for number row, QWERTY row, and home row cluster handling.


=== 5.0.0 === 2026032100
20200521 MooTyper_471r - Need to add missing items to activity edit page - mod_form.php.
    2026032101 Moved from Deferred into active 5.0.0 pending and resumed verification.
    2026032102 Added Mode, Lesson, and Exam Exercise controls to mod_form.php, plus an
        Exercises in lesson reference list that now updates immediately when Lesson changes.
    2026032103 Extended Exercises in lesson list to mod_setup.php Settings page for
        Lesson and Practice modes; list refreshes server-side on every lesson selection change.
20200521 MooTyper_472r - Reopened Korean keyboard layout development ticket. Replaced the
    KNV7 addon approach with standalone typer(KNV7).js and updated view.php to load only the
    standalone file for Korean layouts.
    2026032001 Added Korean IME compositionend scoring with duplicate keypress suppression for
    Opera, preserving Chrome and Edge behavior for admin and student roles.
    2026032002 Enhanced Korean keyboard guidance to highlight all keys needed to assemble each
    syllable in a single character position, similar to Amharic multi-step guidance.
20200708 MooTyper_572r - Need behat tests. WAITING. 20260311 Started working on adding behat
    tests as needed. Currently have 15.
    2026032101 Added targeted Behat coverage for mod_form.php creation flow and live lesson
        switch refresh of the Exercises in lesson list on the edit form.
    2026032102 Verified current coverage includes 17 feature files / 18 scenarios in
        mod/mootyper/tests/behat; ticket scope (need behat tests) appears satisfied.
    2026032106 Added a targeted regression scenario to protect ticket 1127 by verifying
        non-latest grade deletion is blocked and existing results remain intact.
20231007 MooTyper_1127r - Need to prevent exercise delete unless it is the last one
    in the lesson for the user of the grade.
    20260312 Added server-side guard so only the latest exercise result in a lesson can be
        deleted per user. Added blocked-delete event logging and a Logs filter hint on gview.php
        for quick auditing.
    2026032105 Verified fixed in attrem.php: delete now allowed only for latest user result
        in the activity lesson context, with blocked attempts logged via grade_delete_blocked.
20240201 MooTyper_1185r - Fixed Continue button regression after pointer-only submit hardening.
    Multiple Enter/Space are ignored at end, and Continue now advances on mouse click as expected.
    2026032107 Verified fixed: end-of-exercise Continue advances on pointer click while Enter/Space
        no longer retrigger completion submits.
20240927 MooTyper_1324r - MooTyper - Need a Finland Keyboard Layout. Being tested.
    2026032110 Verified code present: layouts/Finland(FIV5).php and layouts/Finland(FIV5).js
        exist, and db/install.php imports layout PHP files into mootyper_layouts on install;
        manual typing validation remains the final check.
20241028 MooTyper_1333r - Comma in Passing grade - issue #126. Set up new Moodle and course at:
    https://10.0.6.134/moodle405/mod/mootyper/view.php?id=57&forceview=1. This is on the
    RaspberryPi5-1 SBC server. Took a little while for the locales to reconfigure to, all, but
    once I did, changing the  MooTyper Grade to pass worked as expected, without any problems.
    Made an update to the issue#126 on github. User says they have correct locales and still
    have the same problem. Made the needed changes in the mod_form.php file. Tested before the
    changes on the moodledemo site and saw the error. Saved the new version of the mod_form.php
    file and the problem went away, so pushed new code to github.
    2026032111 Verified fixed in mod_form.php: grade-to-pass input is normalized with
        unformat_float() during validation/get_data, so comma decimals are accepted and stored
        as DB-safe numeric values.
20241028 MooTyper_1334r - Typing Exam timer not stopping at time limit - issue #127. Pertinant
    code has been modified and harden to ensure time limit does not rely just on client side
    code, but also uses server side code to ensure no time drift.
    2026032112 Verified fixed: typer.js ends attempt when the client timer reaches zero, and
        gcnext.php enforces a server-side timelimit (with grace window) and rejects late submits.
20241119 MooTyper_1337r - Have a request for Amharic keyboard layout. Angie McMillan-Major<aymm@uw.edu>
    created new typer(ETV7).js file and modified the two keyboard files. I created a modified
    version of MooTyper to use them. Still needs some testing.
    2026032113 Verified code present: layouts/Amharic(ETV7).php and layouts/Amharic(ETV7).js
        exist, and view.php loads typer(ETV7).js when this layout is selected; manual typing
        validation remains the final check.
20241120 MooTyper_1339r - Code in erem.php causes Undefined variable for $attemptid. Doing a
    total rewrite of the code in the file.
    2026032114 Verified fixed: erem.php is no longer in the active codebase, and grade/attempt
        deletion now runs through attrem.php using the fetched grade record ($dbgrade->attemptid)
        rather than an undefined standalone $attemptid variable.
20240102 MooTyper_1347r - The erem.php file needs logging events code added to it. 
    2026032115 Verified fixed: delete logging is implemented in attrem.php, which triggers
        grade_deleted and owngrades_deleted on successful deletions and
        grade_delete_blocked on blocked delete attempts.
20250103 MooTyper_1348r - Feature request - along with time limit, precision, and WPM, list
    continuous, spaces, and keystrokes. Added the needed lines of code in view.php. 320-325.
    Created new span class to change format of the settings information. Added same info to
	gview.php and owngrades.php files.
    2026032116 Verified fixed: view.php, gview.php, and owngrades.php all display
        timelimit, requiredgoal, requiredwpm, continuoustype, countmistypedspaces,
        and countmistakes; styles.css includes the settingsinfo formatting class for view.php.
20260309 MooTyper_1433r - Need anchor point when deleting a keyboard layout. Anchors are now
    working.
    2026032117 Verified fixed: layouts.php assigns per-row anchor IDs and passes an
        anchor parameter targeting the next (or previous) layout row after delete,
        and klrem.php redirects back to layouts.php with that anchor fragment.
20260310 MooTyper_1434r - Feature request - Need broken attempt reset button/s. Admin and
    teachers see, Reset my stuck attempt and Reset stuck attempts (all users) and students
    see, Reset my stuck attempt, only in Practice mode.
    2026032118 Verified not fixed: in view.php the recovery buttons are gated by
        $showrecovermine = ($mtmode === '2') || $canrecoverall, so users with
        mod/mootyper:viewgrades (admin/teacher) still see recovery buttons outside Practice mode;
        attempt_recovery.php also has no Practice-mode check.
    2026032124 Verified fixed: view.php now shows recovery controls only when
        $mtmode === '2' (students get mine; users with mod/mootyper:viewgrades also get all),
        and attempt_recovery.php now blocks non-Practice mode requests.
    2026032125 Quick role/mode matrix check passed (scripted): Practice mode shows
        student mine-only and teacher/admin mine+all; non-Practice mode shows no recovery
        buttons and endpoint access is denied.
    2026041013 Fixed warning in attempt_recovery.php from undefined $mootyper->mode;
        Practice-mode guard now correctly checks $mootyper->isexam.
20260312 MooTyper_1435r - Feature Request - Need an anchor point when deleting grades.
    2026032119 Verified fixed: gview.php and owngrades.php pass returnanchor=grades-table
        to attrem.php, and attrem.php appends that anchor on redirects after blocked or
        successful grade deletion so users return to the grades table position.

=== 4.3.0 === (Build: 2024102000)
20240227 MooTyper_1215bt - Duplicate or Restore activity always winds up in Exam mode. Found
    code error with comparison in restore_mootyper_stepslib.php file. See ticket for details.
20240516 MooTyper_1240bt - Need Español Lantin America V5 and V6 keyboard layouts. Created and
    verfied the code as needed in the four files.
20240517 MooTyper_1242bt - Need new KB layout, EnglishInternationalWKeypad(INTLV6). Made changes
    as needed to create the working layout.
20240706 MooTyper_1259bt - Need to change all occurences of, // @codingStandardsIgnoreLine, over
    to, // phpcs:ignore. Changed
20240902 MooTyper_1312bt - MooTyper - High delay in large courses #125. Added missing $record->userid
    and now seems to work correctly.
20240902 MooTyper_1313bt - MooTyper - number_format(): Passing null to parameter #1 ($num) of
    type float is deprecated. Found suggestion to switch from using, number_format();, over
    to using, sprintf();, instead. See ticker for details of actual code change.
20240918 MooTyper_1320bt - Need a Maori Keyboard Layout. Created the two files based off the one's
    for English(USV5) EnglishWKeypad(USV6).

    

=== 4.2.9 === (Build: 2024061300)
20240129 MooTyper_1182v - Lesson Completion needs rewrite to account for when exercises are
    set to less than max. I made a change in the "if" at about line 136, in the code of the
    custom_completion.php file.
20240331 MooTyper_1228v - Need to make an English International Keyboard Layout. Created two
    needed files based English(UKV5) then modified as needed.
20240410 MooTyper_1234v - Sort arrows on gview.php and owngrades.php should be part of the sort link.
    Changed code in gview.php and owngrades.php to include the arrows as part of the sort link.
    See the ticket for further details.    
20240424 MooTyper_1236v - The lsnimport.php needs to ignore Eclipse IDE period folders. Added an
    "if" that checks to skip any file name that starts with a period.
20240517 MooTyper_1241v - EnglishWKeypad(USV6).php indents are mostly incorrect. Changed indents
    as needed to align code in the file. Changed version to 6.1 in this file and the .js file.
20240611 MooTyper_1252v - New codechecker shows language file needs to be sorted. Completed changes
    as directed by codechecker. Found a duplicate string name and renamed both: deletekb and
    deletedblo in the layouts.php file.

=== 4.2.8 === (Build: 2024032100)
20240110 MooTyper_1164v - Completion does not work for, Require lesson completion,
    by itself. See ticket for current progress. Possibly still needs work.
20240215 MooTyper_1207v - Lesson completion not staying checked. Changed the setting from just
    the checkbox, to require an input of 1. Added a help button.
20240215 MooTyper_1208v - Upon later change to deactivate, completion item must be set to 0.
    Discovered I was using hard coded words, instead of the needed string with the new
    $suffix added. Added help buttons for each completion.
20240223 MooTyper_1212v - MooTyper - Duplicate fails when using PostgreSQL data base in
    MooTyper v4.2.7 and lower. Changed the three affected SQL's in the
    backup_mootyper_stepslib.php file, so that JOIN's use ON.
20240223 MooTyper_1214v - MooTyper v4.2.8 fails when used with PostgreSQL Data Base. See
    the code for details. Added GROUP BY as needed, where needed. Modified other code in
    custom_completion.php as needed to get the correct completion results.
20240227 MooTyper_1216v - Layout - Spanish(V5) needs to remove a non-breaking space from
    the 5 key. Removed one non-breaking space.
20240303 MooTyper_1219v - Lesson Completion - Need to prevent values other than 0 or 1. 
    Modified the file, mod?form.php for the, $completionlessongroup, so the the group item
    is no longer $mform->createElement('checkbox', but is now, $mform->createElement
    ('selectyesno'. The yes-no selection is automatically translated as 1 or 0.

=== 4.2.7 === (Build: 2024013100)
20230929 MooTyper_1083v - In lib.php, function mootyper_get_completion_state($course, $cm,
    $userid, $type), needs to be removed. See ticket. This function has currently been
    removed.
20231212 MooTyper_1131v - Deleting an exercise leaves orphaned grades if a user has already
    completed the exercise. Current code warns the teacher that an orphaned grade needs to
    be deleted. See also, MooTyper_1165.
20240110 MooTyper_1165v - There is some hard coded text, Need to delete., in gview.php
    at about line 287. Converted the hard coded text to a string and added code to use
    it in the gview.php page at about line 286.
20240110 MooTyper_1166v - When a teacher deletes an exercise result on gview.php, it does
    not reset the completion status of the student. When I fixed the completionexercise
    SQL for PostgreSQL, MariaDB, and MySQL, this finally started working correctly.
20240119 MooTyper_1176v - Sql in var $finalexercisecompletesql fails because it's missing,
    Group By #121. Modified the SQL to use two versions based on the DB type. Reworked the
    SQL to one simpler and also works for PostgreSQL, MariaDB and MySQL.
20240120 MooTyper_1177v - Heading on the owngrades page is not formatting correctly. Added
    a sub-table. See the ticket for details.
20240120 MooTyper_1178v - Cannot sort data based on the exercise name. Added the code
    that was missing. Sort by exercise name now works like the other columns on the page.
20240121 MooTyper_1179v - The custom_completion.php file needs to use simplified $params.
    Made a LOT of changes. See the ticket for details. 
20240128 MooTyper_1181v - Warning: Undefined property: stdClass::$completionexercise, plus
    the other four. Once I got the PostgreSQL straightened out, I was able to remove the
    extra completion code that I had added into the lib.php files. These five undefineds
    were part of my addition that I have now removed and things are working as expected.

=== 4.2.6 === 2023121000
20231204 MooTyper_1125v - Need to see about moving $style1 and $style, lines 155/156
    of exercises.php to styles.css file. Added a, .style1 and .style2 into the styles.css
    file. In the exercises.php file, for testing I commented out the line 155 and 156. I
    then modified lines 158, 159, 160, and 199 to use class="style1" and then in two
    places in line 195 I modified it to use class="style2".
20231210 MooTyper_1129v - Error in new instances with "Activity completion" configured #118.
    Merged pull request that fixes this.
20231210 MooTyper_1130v - Module only update completion progress when the instance is
    updated. #120. Restored missing function. Testing shows completion now works.

=== 4.2.5 === 20231206
20231204 MooTyper_1124v - Deleting an exercise from the exercises.php page seems to
    possibly be broken/not working. In line 53(57) of the erem.php, I had left a right
    parenthesis when converting from array() to [].
20231204 MooTyper_1126v - Deleting a lesson from exercises.php page seems to be broken.
    In line 53(57) of the erem.php, I had left a right parenthesis when converting from
    array() to [].

=== 4.2.4 === 2023110200
20201006 MooTyper_629v - Request for Home Row Keys color settings. Have applied a
    one-off method to new French(BelgianFRBV5) layout. Modified the .js file to produce
    the desired colors for the keys.
20230215 MooTyper_1011v - Need to add an on/off toggle or check box for each bar
    on the grade charts. Added need code to ownview.php. Did a copy and paste for gview.php.
    ***Need to fix dropdowns to NOT have one blank line as an option.
20230510 MooTyper_1040v - Deprecated: Implicit conversion from float 1674064081.5 to int
    loses precision owngrades.php. Added round() to owngrades.php line 264 and to gview.php
    line 365.
20230513 MooTyper_645v - Need Completion tracking based on Precision, WPM, exercises,
    lesson, and grade. Got it working, but may need further development. Added
    required new completion fields to mdl_mootyper table.
20230515 MooTyper_1044v - In Lesson mode, when anyone removes a grade, the Moodle Gradebook
    is not updated. In attrem.php, I added a new call to mootyper_update_grades() in lib.php.
20230613 MooTyper_1054v - MooTyper Backup and Restore seems to be broken. Backup/restore only
    works on same server and give errors on another server due to not updating all ID's.
    Rewrote both the backup and restore code to correctly create and link to new ID's.
20230614 MooTyper_1055v - Missing child tree for exercises in the backup_mootyper_stepslib.php
    file. As part of my work on MooTyper_1054, I have added the missing code and tested it.
    It seems to be working correctly now.
20230707 MooTyper_1057v - MooTyper - Deleting a MooTyper activity does not delete related attempts.
    Realized that the attemptid in mootyper_grades is NOT being updated during the restore! Once
    this was changed in restore_mootyper_stepslib.php file, both deleting an individual grade, as
    well as removing a MooTyper activity, removes attempts from the mootyper_attempts table.
20230707 MooTyper_1058v - MooTyper - Reset MooTyper Instance does not delete checks. Added code
    to delete checks based on attemptid when executing function reset_mootyper_instance($mootyperid).
20230708 MooTyper_1059v - MooTyper - Backup does not include teacher created lessons and exercises.
    The code to fix this was developed and included as part of MooTyper_1054.
20230729 MooTyper_1063v - The mdl_mootyper_grades, mistakedetails, field size of 255 is too small.
    Upgrade DB field size to 1333. Could not go bigger with varchar. 20231005 Had to make another
    change from varchar 1333 to text.
20230810 MooTyper_1065v - In line 344 of provider.php, mootyper should be mootyperid. Made the code
    merge so it is now mootyperid in line 344 of the provider.php file.
20230920 MooTyper_1074v - Grade pages need the Completed column moved two places to the right.
    Completed the moves in owngrades.php and being tested. 20230920 Made the same
    code moves in gview.php. 20230920 Made the needed changes in the csvexport.php file.
20230926 MooTyper_1078v - Need to implement suffix on mod_form.php for Moodle 4.3. Made all the
    needed changes in public function add_completion_rules() {. Made all the needed code changes
    in public function completion_rule_enabled($data) {.
20230927 MooTyper_1079v - No one in a group has any attempts causes multiple errors in gview.php.
    Added an additional AND clause check to make sure at least one memeber of the group being
    viewed has made an attempt at an exercise. 
20230927 MooTyper_1080v - Latest codechecker requires convert from long array(), to short array [].
    Changed all arrays to short array form, []. There was a "boat load" so see ticket for details.
20230927 MooTyper_1081v - Latest codechecker says "Import statements must not begin with a leading
    backslash." Removed all leading backslashes. There were many of them so see ticket for details.
20231019 MooTyper_1103v - In the new Italian v5.1 keyboard layout, the shift and enter keys, color
    is wrong. Made needed code changes in the .js file.
20231029 MooTyper_1106v - German(v5) layouts do not properly handle ê é è characters. Made needed
    changes to both the German(V5) and German(V5)-icons layouts.
20231029 MooTyper_1107v - Syntax error in line 174 of mootyper/classes/local/lessons.php file. Fixed
    by adding code to include the missing closing quotation mark.
20231029 MooTyper_1108v - Need Arabic(ARV5)dual layout. Created the files some time ago and now
    have tested the layout.
20231030 MooTyper_1109v - Remove attempt does not work when using View all grades and Visible group
    is not All participants. Changed code to ensure $n is always set to $mootyper->id. See ticket
    for details. 
20231101 MooTyper_1111v - Completion rules are missing from the Default activity completion page.
    Added missing function in lib.php file and missing language description strings.

=== 4.2.3 === 20230420
20230105 MooTyper_982v - Need to enable new, Grade, bar to the chart. Added a new
    series 4 for grades. Temporarily commented out series 1 for hits per minute,
    resulting in a x-axis that goes from 0 to 100.
20230123 MooTyper_996v - Need to add AM / PM to date format for gview.php and owngrades.php. 
    Changed the settings.php page code, down around line 143 from this: 'M d, Y G:i' to this:
    'M d, Y G:i A'. Once I went to the MooTyper settings page, added the A there, it started
    showing AM and PM with the times.
20230206 MooTyper_1009v - Need to remove V4 layouts that also have a V5 version. Removed
    copies of keyboard layouts that have both a V4 and V5 layout. 
20230207 MooTyper_1010v - A user has requested a German(V5) KB Layout. I duplicated the
    German(V5)-icons files as just, German(V5). I then modified the php file to no longer
    use the icons, but instead, to use the words, like I did in the German(V4) php file.
20230224 MooTyper_699v - Create Hindi(HIV5) KB Layout. Dropping this ticket because the
    Hindi alphabet is not in the Courier New font file so it is not compatible with
    view.php and typer.js files.
20230224 MooTyper_1013v - Need to see about selecting KB Layout based on name instead of ID.
    New code provided as a merged pulled request for item #110.
    2026040703 Re-verified in current code/runtime: default layout by name resolves
        through keyboards::get_id_of_layout_by_layoutname(); with overwrite enabled,
        configured name English(USV5) maps to installed layout id 116.
20230406 MooTyper_1032v - Invalid event functions defined in \mod_mootyper\event
    \course_exercises_viewed. Deleted deprecated legacy log code as need in all the new,
    MooTyper v4.2.3, files.

=== 4.2.2 === posted 20230118
20221008 MooTyper_930v - In exam mode, WPM by itself, does not generate a grade. See the
    ticket for specific details. Added one string, modified a $sql, added automatic
    feedback, and added multiple if checks to create the correct raw grade needed
    by the Moodle rating and grading systems.
20230103 MooTyper_980v - In practice and lesson modes, WPM by itself, does not generate
    the correct rating for the grade book. Deferred to MooTyper_930 as the fix for it
    will also fix this ticket.
20230105 MooTyper_981v - Need new grade/rating coloumn for grade table on grade pages.
    Made needed changes in gview.php, lib.php, owngrades.php, and results.php. I now
    am getting a grade column when viewing the owngrades.php page and the gview.php
    page. Might want to see about adding the grade data to the charts.
20230106 MooTyper_983v - Need new grade data added to CSV download file.  Made code
    changes to gview.php and csvexport.php. Data is now in the download.
20230107 MooTyper_984v - Sort controls on gview.php and owngrades.php pages are not
    working correctly. Fixed them, both pages, and they now appear to be working
    correctly.
20230108 MooTyper_985v - Need date/time added to CSVexport file name. Added code
    that pastes the current date and time into the file name, just before the .csv
    at the end of the file name.
20230108 MooTyper_986v - Postgresql generates errors in proposed MooTyper v4.2.2. 
    The Moodle ratings table expects an integer, so I changed the code to give 0 decimals.
    Also, with PostgreSQL the $exercises table order is scrambled. Fixed by sorting
    the table before use. See the ticket for exact details.
20230114 MooTyper_991v - Got debug message regarding duplicate values in column 'firstname'.
    The function in lib.php had an SQL that was getting unique users by firstname. The
    fix was to reorder the SQL and get the users id first. 
20230116 MooTyper_992v - In gcnext.php, line 60 not giving fail when % fails and WPM passes.
    Fixed by modifying line 60 to require %pass and WPMpass for green background, no
    matter what the mode is. Otherwise the background should be red. See ticket for
    details.
20230116 MooTyper_993v - Need to see about adding Count, Max, Min, or Sum to the grades
    reports based on rating setting. Have made needed code changes to result.php, gview.php,
    and owngrades.php. The rating info only shows up when ratings are being used.

=== 4.2.1 === released 20221207
20200521 MooTyper_458v - Site admin should be able to see who created and can edit an
    exercise or a lesson. Added the needed information code to eedit.php.
20211121 MooTyper_757v - Issue#99 at github Error in phpUnit for core_calender.
    20220413 Got a pull request that fixes this. More info at:
    https://github.com/drachels/moodle-mod_mootyper/issues/99. I've applied
    the pull request, but have not had time to verify the fix.
20220413 MooTyper_843v - When using PostgreSQL, View all grades, is broken for, All
    participants. In gview.php, about line 153, changed $groups = ''; to $groups = 0;
20220505 MooTyper_836v - Completion file custom_completion.php needs work especially for
    completexercise. 20220813 Added four missing functions for completionlesson to the
    mod_form.php file so that now the extra selection check box shows when setting the
    completion requirements.
20220729 MooTyper_901v - Need two new strings in eedit.php about line 287 and 289
    regarding changing lesson info. Added the two new strings, "This lesson was
    included with the MooTyper plugin." and "Created in course:."
20220816 MooTyper_908v - Grade to pass in Whole MooTyper grading should automatically
    use the defaultprecision. Made changes in the mod_form.php file.
20220922 MooTyper_923v - I think the, Export/edit exercises, link needs to be moved up
    in the nav link hierarchy. In the lib.php file, down around line 1196, I moved the
    code for the, Export/edit exercises, link so that it gets added to the navigation
    hierarchy sooner. Still visible only if the teacher can edit the lesson being used.
20221023 MooTyper_940v - Need to create new icons, monologo.svg and monologo.png.
    Created both icons and they are being used in this Moodle 4.x.x site.
20221127 MooTyper_967v - #108 From the MooTyper settings page, other Moodtype nav links
    are broken. The fix is to specify the the complete path. e.g. $link = new
    moodle_url('/mod/mootyper/eins.php', array('id' => $cm->id)); See ticket for
    specific changes that were made.

=== 4.2.0 === released 20220403
20220128 MooTyper_814 - Need string for authorid on the exercises.php page button. Added
    the string and code needed to display it about line 148 of file exercises.php. 
20220128 MooTyper_699 - Create Hindi(HIV5) KB Layout. Created the initial versions of the
    two files and started modifications.
20220220 MooTyper_819 - Missing basic completion information on view page issue #102. The
    same person who opened this issue, provided a solution via pull request that added the
    needed code in the renderer.php file down around line 66.
20220219 MooTyper_821 - Issue #104 - Data Privacy is broken. Made the needed changes then
    also got a pull request for this. Export requests do work.
20220322 MooTyper_799 - Need new Moodle 4.0 icon. Discovered I can just make two copies
    of the switch with a branch check for greater than m3.11. The copy of the switch for
    Moodle 4.0 and above should contain the new case FEATURE_MOD_PURPOSE: return
    MOD_PURPOSE_ASSESSMENT; 

=== 4.1.1 === released 20220128
20220122 MooTyper_613 - Would be nice to have a link to index.php on grade pages.
    Added links to index.php on the view.php, gview.php, and owngrades.php pages.
    Added links for when lesson is complete and when exam is complete.
20220125 MooTyper_547 - Duplicating a MooTyper does not set the cursor color correctly.
    Originally thought I had this fixed in MooTyper v3.9.0. However, I finally have
    tracked the problem to line 77, in file, backup_mootyper_stepslib.php where the
    variable, cursocolor was mistyped as coursorcolor.
20220125 MooTyper_718 - Exercises.php file need fix dev stuff in the big top button.
    Modified the code in exercises.php so it now shows, Author ID: xx, Lesson visible
    to: xxx, and Can edit: xxx. After testing, will need to turn Author ID: into
    a language string.
20220126 MooTyper_442 - Set return url in layouts.php, to return to same MooTyper.
    Change button url and it appears to be working correctly. 
20220126 MooTyper_415 - Need a layout add/remove page. Added and tested code. Switched
    to using buttons with popup confirm window.

=== 4.1.0 === released 2022011700
20220117 MooTyper_808 - Avoid storing absolute paths in database (mootyper_layouts).
    Completed pull request and now testing MooTyper v4.1.0. Duplicate of
    MooTyper_635, which I closed also.

=== 4.0.1 === released 2021072200
20210416 MooTyper_701 - Exception - Return value of mootyper_grade_item_update() must
    be an instance of void, none returned. Made two changes in the moodle3dev lib.php
    file to remove the :void in the function line of the code.
20210507 MooTyper_714 - Turkmen(TKV5) pull request. Did the pull request, then fixed
    missing shift indicators for all of row 1 and for a few other letters in other
    rows. № was missing from blue row and there were 3 non-existent keys included.
    Also converted all \r\n over to \n.
20210507 MooTyper_715 - Owngrades.php stats table missing right vertical border.
    Tracked it down to an extra table cell definition at about line 205.
20210511 MooTyper_465 - Convert owngrades.php and gview.php grade tables to BS4 table.
    I think I have these two files fixed. Will still need to do others, but will do
    another ticket for them.
20210626 MooTyper_755 - recent activity causes a debug meesage.
    Added a branch
   check so that M3.10 and below use the old, user_picture and M3.11 and above
   will use the new, \core_user\fields, code.
20210722 MooTyper_747 - Convert from lib.php cron function to /classes/task/cron_task.php.
    Added one new string and two needed files. Sheduled tasks reports success.
20210722 MooTyper - Need to remove from view.php, a line of code. See ticket for details.
    Removed the line of code and replaced with $PAGE-&gt;requires-&gt;jquery().

=== 4.0.0 === release 2021041600
20210325 MooTyper_619/259 - Need to add capability to add names to exercise name numbers.
    Done and testing.
20210326 MooTyper_441/180 - Use current MooTyper for layouts.php background color.
    Implemented.
20210327 MooTyper_459/198 - It would be nice if a Lesson name could be edited. Got this
    and 619 working today. Still need to add exercise names to lesson file exports
    and detect them for imports.
20210327 MooTyper_692/296 - Need exercise names added in lsnexport and lsnimport. At 1550
    got the lsnexport.php file working. Exercise name is added right after the break
    indicator for the exercise texttotype, followed by another break indicator,
    unless it is the last exercise name.
20210331 MooTyper_675/280 - Create Icelandic KB Layout.
    Created files and tested.
20210408 MooTyper_694/298 - Invalid get_string() identifier: 'mootyper:rate' #95.
    Added string.

=== 3.9.6 === release 2021032000
20201224 MooTyper_660 - Aesop's Fables needs to be split into multiple files.
    Done.
20201225 MooTyper_662 - View.php has lots of space period space errors.
    Fixed as needed.
20201230 MooTyper_663 - owngrades.php grade table right border does not render in some
    browsers was due to incorrect td count in some rows. Checked and now renders
    correctly in Firefox, Chrome, Edge, Opera, and Safari.
20210304 MooTyper_653 - Need to format all KB layout files. Fixed lots of minor
    format errors and tags.
20200317 MooTyper_674 - Need Estonia(EEV5) KB layout.
    Created files and tested.
20210318 MooTyper_676 - Need Danish(DNV5) KB layout.
    Created files and tested.
20210318 MooTyper_677 - Need Hungarian(HUV5) KB layout.
    Created files and tested.
20210318 MooTyper_679 - Need Italian(ITV5) KB layout.
    Created files and tested.
20210318 MooTyper_680 - Need Norwegian(NOV5) KB layout.
    Created files and tested.
20210318 MooTyper_681 - Need Russian(RUV5) KB layout.
    Created files and tested.
20210319 MooTyper_682 - Need Serbian(SR_CRV5) KB layout.
    Created files and tested.
20210319 MooTyper_683 - Need Swedish(SEV5) KB layout.
    Created files and tested.
20210319 MooTyper_686 - Need Turkish(TRV5) KB layout.
    Created files and tested.
20210319 MooTyper_687 - Need Ukrainian(UKV5) keyboard layout.
    Created files and tested.
20210320 MooTyper_646 - Need French(V5) and FrenchWKeypad(V6) KB layouts. Created
    and tested. The carat,^, is on two keys, row 1 on the nine key as an Alt,
    and row 2 on the key to the right of P. THe highlight defaults to the row 2
    key without Alt being highlighted.

=== 3.9.5 === released 2020111000
20201109 MooTyper_643 - Bad grade can be wiped out by a page reload, fixed. Atchk.php
    was missing the, use \mod_mootyper\local\results;, and results::suspicion.

=== 3.9.4 === released 2020110100
20201027 Fixed keytop round borders on Spanish, Portugues(P), and German V6 layouts.
20201027 Added GermanWKeypad(V6)-icons KB layout.

=== 3.9.3 === released 2020090502
20201016 Added SpanishWKeypad(V6) KB layout.
20201018 Added PortuguesWKeypad(PortugueseV6) KB layout.

=== 3.9.2 === released 2020073100
20200728 Added four new fields to table mootyper. assessed, asstimestart,
    assessedtimefinished, and scale.
20200730 MooTyper_567 - Investigate adding median, mode and range to the bottom
    of grade tables. Code in place and pushed to github.
20200808 MooTyper_562 - Need to integrate MooTyper grades into Moodle
    Grades/Rating system, is FINALLY working. Still need to fix delete part.

=== 3.9.1+ === released 20200810
20200715 MooTyper_577 - File upgrade.php missing final upgrade_mod_savepoint. Added
    missing line of code and pushed to github.

=== 3.9.1 === released 2020070800
20200708 MooTyper_570 - mod_setup.php can be directly accessed by students. 20200708
    Pushed to MT V3.9.1 code on github.
20200708 MooTyper_569 - lsnimport.php can be directly accessed by students. 20200708
    Pushed to MT V3.9.1 code on github.
20200708 MooTyper_568 - gview.php can be directly accessed by students. 20200708
    Pushed to MT V3.9.1 code on github.
20200708 MooTyper_565 - eins.php can be directly accessed by students. 20200708
    Pushed to MT V3.9.1 code on github.
20200708 MooTyper_566 - eedit.php can be directly accessed by students. Duplicate
    of MT_416. Fixed in current version. 20200708 Pushed to MT V3.9.1 code on github.
20200708 MooTyper_416 - Students can type in address for eedit.php. 20200708
    Pushed to MT V3.9.1 code on github.
20200708 MooTyper_559 - exercises.php can be directly accessed by students. 20200708
    Pushed to MT V3.9.1 code on github.
20200708 MooTyper_563 - REMOVED FUNCTION - change variable name in lib.php function
    get_grade_averages($grads). 20200708 Pushed to MT V3.9.1 code on github.
20200708 MooTyper_418 - Change $id to $cmid like other plugins. Needed for enhanced
    navigation. 20200708 Pushed to MT V3.9.1 code on github.
20200708 MooTyper_432 - eins.php about line 207, ... is hard coded. Removed the
    ellipse. 20200708 Pushed to MT V3.9.1 code on github.
20200630 MooTyper_560 - mod_form.php page, under MooTyper Administration, the link
    is broken. Have a fix inplace and being tested. 20200708 Pushed to MT V3.9.1
    code on github.
20200708 MooTyper_558 - mod_setup.php has duplicate lines of code for timelimit,
    requiredgoal, and requiredwpm. Removed duplicate lines of code. 20200708
    Pushed to MT V3.9.1 code on github.
20200708 MooTyper_546 - delete a grade doesn't work correctly. Fixed. 20200708
    Pushed to MT V3.9.1 code on github.
20200708 MooTyper_474 - Vietnamese keyboard unable to type some characters.
    Pushed to MT V3.9.1 code on github.
20200708 MooTyper_462 - Need Uyghur keyboard layout - RTL. 20200708 Pushed
    to MT V3.9.1 code on github. Created course on m3x demo site.
20200708 MooTyper_425 - Cancel on eins.php should go to view.php instead of
    exercises.php. 20200708 Pushed to MT V3.9.1 code on github.
20200708 MooTyper_422 - MT Slovenian layout needs multiple keys adjusted.
    Pushed to MT V3.9.1 code on github. Changed spacing layout
    on multiple keytops.
20200708 MooTyper_452 - Change align from center to left for audio and
    buttons 20200708 Pushed to MT V3.9.1 code on github.
20200708 MooTyper_440 - Arabic(V4)dual - space bar showing shift is needed.
    Deleted extra layouts. 20200708 Pushed to MT V3.9.1 code on github.
20200708 MooTyper_434 - CSS .normal does not work correctly in current version.
    Pushed to MT V3.9.1 code on github. Made various tweaks to the css.

=== 3.9.0 === released 2020062003
20200618 I have thrown away six months worth of development work, and as of today
    have started over. I am systematically going through all the code changes
    I developed, and am applying them here, while doing lots of testing to make
    sure that I am not breaking anything.
20200620 MooTyper_411 - View all grades does not support groups, changed status
    to, Being tested.
20200620 MooTyper_542 - in gview change $htmlout's to echo's. Makes the code
    more consistent with the rest of MooTyper, and easier to make changes.
20200624 MooTyper_411 - View all grades does not support groups. Made change
    to case, in lib.php. In gview.php (View all grades) added code to
    support Separate and Visible groups, groupmode. The change also fixed the
    missing, Exercise, dropdown, so that, View by exercise, is now working again.
20200624 MooTyper_463 - lsnexport.php incorrect inline SQL needs to be fixed.
    Changed code to use $params.
20200624 MooTyper_547 - Duplicating a MooTyper does not set the cursor color correctly.
    There was an error in mod_setup.php, line 219, which was using the keyboard
    background color, instead of using the cursor color.
20200625 MooTyper_548 - if (lessons::is_editable_by_me($USER->id, $id, $lessonpo))
    giving wrong results. Second if, second $id should have been $crs.
20200625 MooTyper_549 - classes/local/lessons.php function is_user_enrolled incorrect
    inline SQL needs to be fixed. Changed to use $params.
20200625 MooTyper_550 - Keyboard layout EnglishWKeypad(USV6) incorrectly renders
    in Opera. Fixed by adding one pixel to the width of the background in css.
20200625 MooTyper_551 - Change exercises.php table background color to same as
    current MooTyper color. Eliminates DB get for MooTyper configuration.
20200625 MooTyper_552 - Change eedit.php table background color to same as
    current MooTyper color. Adds DB get for current MooTyper.
20200625 MooTyper_553 - Change eins.php table background color to same as
    current MooTyper color. Adds DB get for current MooTyper.
20200627 MooTyper_558 - mod_setup.php has duplicate lines of code for timelimit,
    requiredgoal, and requiredwpm. Removed 30 (10x3) duplicate lines and replaced
    them with a copy of just the 10 needed lines.
20200628 MooTyper_557 - view.php Edit/edit exercises link should only be visible
    if I can edit the current lesson. Changed the if around line 353 to also
    check the lesson visibility. Hide Settings button if not editable by me.
20200629 Released MooTyper v3.9.0. Closed 36 tickets with this release.

=== 3.8.3 === released 2019123002
20191227 - Issue #81 at github - Missing space between user name and exercise name in
the graph when viewing all grades. Fixed and pushed to github master branch.
20191228 MooTyper_319 - Mistake details error reporting added just below the status bar.
    Added mistake-details error reporting below the status bar.
20191229 - Bumped version to 3.8.3 and pushed to github.
20191229 MooTyper_332 - Added new field, mistakedetails to table mdl_mootyper_grades.
    Added field mistakedetails to mdl_mootyper_grades.
20191229 MooTyper_319 - Added code to place countChars(mistakestring) into new field.
    Added code to store countChars(mistakestring) in mistakedetails.
20191230 MooTyper_319 - Added code in gview.php and owngrades.php, to place data from
the, mdl_mootyper_grades->mistakedetails, field, into the grades table in the,
Mistakes, column for, View all grades, and, View my grades.
    20191230 Updated gview.php and owngrades.php to show mistakedetails in the Mistakes
    column for both view-all and view-my grades.
20191231 MooTyper_333 - Converted hard coded, Mistake details, to a language string.
    Wrapped the output in a div so it can be left aligned.
20191231 - Experimenting with .tb1 settings in styles.css to try and keep the hidden
textarea from creating a blank line below the, Mistake details. Might need to make
a single row, two column table, for them.
20200102 MooTyper_320 - layout_imported, line 222 in lsnimport.php fixed.
    Fixed layout_imported handling at line 222 in lsnimport.php.
20200103 - Minor fix and publish, Armenian(V5) layout.
20200103 MooTyper_264 - Changed Export to .csv link to a BS4 style primary button.
    Updated View all grades to use a BS4 primary button for Export to .csv.
20200103 MooTyper_335 - Added, Mistake details, data to the, Mistakes, column
to the, Export to .csv, file output data.
    20200103 Added Mistake details to the Mistakes column in Export to .csv output.
20200104 - Spell checked lessons and switched some to paragraph format.
20200104 - Some code cleanup based on last version check on Moodle.

=== 3.8.2 === released 2019122501
20191210 MooTyper_314 - Would be nice to show lesson id when viewing exercise.php page.
    20191227 Added lesson ID to the link, Add new exercise to this lesson, ID: XX.
    Also moved the link code so now inside the 'if' that checks and hides the link if the
    lesson and exercises are not editable by the person viewing the page. This move also
    fixed the download link in the table, and shows, 'Not editable by me." message.
20191211 MooTyper_315 - locallib.php function is editable by me $crs is setup wrong.
    Fixed bug when checking iseditable by me. If mdl_mootyper_lessons->editable
    was set to a 1, teachers in course, current course was NOT being compared to the
    lesson->courseid, like it should.
20191211 MooTyper_317 - Many strings use Exercise/s when it should be, Lesson/s.
    Changed language strings to use Lesson/lesson instead of Exercise/exercise.
20191211 MooTyper_318 - Need Romanian(V5) keyboard layout.
    Romanian(V5) working. Able to type all in Lorem Ipsum. Ready for Beta release.
20191213 - Bumped version to 3.8.2 and moved a copy to m3x.drachels.com site.
20191214 MooTyper_168 - Need to see about creating a required WPM.
    Added requiredwpm setting and implemented the needed code and strings.
    Seems to be working fine.
20191214 MooTyper_181 - Would be nice to have a text color setting for keytops.
    Added settings for keytoptextc but not the code to implement it, yet.
20191214 MooTyper_311 - Need to investigate adding an exercise time limit.
    Added settings for timelimit, but not the code to implement it, yet.
20191215 MooTyper_181 - Would be nice to have a text color setting for keytops.
    Added code for keytoptextc and it appears to be working correctly.
20191222 MooTyper_325, MooTyper_322, and MooTyper_324 - Once setup is complete going to
    settings does not show correct mode; need to work on Exam Mode needing an exercise
    id; and exam mode shows only exercise 1 no matter what is selected.
    20191222 Fixed multiple bugs with mode setting. Mainly fixed bug where exam mode
    would only show exercise 1, when others were selected.
20191223 MooTyper_323 - mod_setup.php does not use default setting for mode.
    Finally realized the mistake I was making and now have this working so
    that during the initial activity setup, get the site default mode. Then check to
    see if the activity has something in isexam. First time there will not be. Any
    time someone later clicks on Settings, there will be something in isexam, and use
    it.
20191224 MooTyper_311 - Need to investigate adding an exercise time limit.
    Exercise timelimit coded and appears to be working correctly.
20191224 MooTyper_326 and MooTyper_327 - gview.php and owngrades.php do not show
    timelimit above the grade table.
    20191224 Added timelimit setting to the labels above the grade tables in gview.php
    and owngrades.php.
20191224 MooTyper_168 and MooTyper_311 - Need to see about creating a required WPM,
    and need to investigate adding an exercise time limit.
    20191224 Reopened as I discovered I could not change from a site default of any
    positive number down to a zero. Discovered that I could not do the same for
    timelimit and for %. Fixed and testing. Added MooTyper_328.
20191225 MooTyper_329 - Need to add timelimit to the csv file export.
    Added timelimit to the first line of output in the csvexport file.
20191226 MooTyper_168 - Need to see about creating a required WPM.
    Required WPM code needed to be changed as in older Moodles it was
    resetting to site defaultwpm each time you went to Settings page.
20191226 MooTyper_330 - Need a Cancel button on the mod_setup.php settings page.
    For convenience, I added a Cancel button to the settings page.

=== 3.8.1 === released 2019120800
20191124 - Fixed PostrgreSQL compatibility error in locallib.php function get_mootyperlessons.
20191124 - Fixed bug when going to eins.php. Undefined variable $lsnnamepo. When incoming
optional parameter 'lesson' is blank due to starting a new lesson/category name,
$lsnnamepo has to be set to -1, otherwise when starting a new exercise for the current
lesson/category, the optional parameter 'lesson' goes to the $lessonpo. The first part
was missing.
20191130 MooTyper_284 - Need exercise complete event for logging.
    Added exercise_completed event and pushed to github.
20191201 MooTyper_304 - Need exam complete event for logging.
    Added exam_completed event, modified examdone string, and pushed to github.
20191201 MooTyper_301 - The links and Continue button needs to be changed to BS4 type on
    view.php.
    20191201 Converted the links and Continue button above the status bar to small primary
    buttons, and replaced the vertical bar with a single space.
20191202 MooTyper_257 - Need a layout add/remove page.
    Started Manage MooTyper layouts capability so admins can remove unused keyboard
    layouts.
20191202 MooTyper_306 - Moodle lists MooTyper 3.8.0 as having warnings and errors.
    Started working through Moodle-reported warnings and errors for the 3.8.0
    release.
20191203 - Added new donated German(V4)-icons keyboard layout from pmaneggia.
20191203 - Temporarily added suggested new permissions for mod/mootyper:viewcategory
and mod/mootyper:editcategory. Discussing what is needed with pmaneggia. I think
just checking for site admin is the best way to go.
20191203 MooTyper_307 - Need German(V5)-icons keyboard layout.
    Created German(V5)-icons layout files, published to github, and requested
    feedback before final checks.
20191203 MooTyper_190 - Need to investigate adding Event lesson_completed.php.
    Implemented lesson_completed event and confirmed it was working.
20191206 - Lots of code cleanup in various files.
20191207 - More code cleanup and bumped version for release.
20191208 - Made two small string changes and bumped version date for release.

=== 3.8.0+ === released 2019112400
20191119 MooTyper_295 - Mod_setup.php Confirm button not compatible with Safari browser.
    Changed the Confirm button in mod_setup.php to BS4 markup so it behaves
    correctly in Safari and other browsers.
20191119 MooTyper_294 - On page, Import Lesson / KB Layouts, change Continue link to a btn.
    Replaced the Continue link with a Continue button on the
    lsnimport.php-generated Import Lesson / KB Layout page.
20191119 MooTyper_293 - Convert Import Lesson / KB Layout to BS4 table.
    Converted the Import Lesson / KB Layout listing from plain text to a BS4
    table, using hover with light rows for existing items and success rows for newly
    added items.

=== 3.8.0 === released 2019111700
20191028 - Corrected comment style used in styles.css file. Also deleted all of the
[[settings]] lines of code that were preventing Moodle from applying the file.
20191028 - Tweaked the Alt Gr when needed in all the layouts. Also eliminated an
extra blank line that was spacing the KB layout two lines below texttoenter
instead of just one.
20191029 - Verified and tweaked as needed, all the event code in php files, that
I could. Added new event for viewed_own_grades in owngrades.php.
20191029 - Fixed bug in, Viewed exercises, event, course_exercises_viewed.php. In
the logs, the Viewed exercises link was giving an error due to passing 'f' instead
of passing 'id' to the URL.
20191029 - Changed event description for View all grades and Viewed exercises.
20191107 - Added course name and activity name to the first row of the csv file
output. Made changes in both gview.php and csvexport.php and pushed to github.
20191110 - Add details to the log entrries for when an exercise grade is deleted.
This required multiple changes to three files, attrem.php, grade_deleted.php,
and owngrades_deleted.php.
20191111 - Worked on, attrem.php, grade_deleted.php, and owngrades_deleted.php some
more to include whose grade and for which exercise it was that was being deleted.
20191111 - Added details to the event, exercise_edited in eedit.php and exercise_edited.php.
20191111 - Finalized changes to viewed_all_grades event triggered in gview.php.
20191111 - Rewrote events for lesson import, layout import, and lesson/category export.
20191112 - Rewrote events for exercise_deleted and lesson_deleted and pushed to github.
20191112 - Rewrote events for exercise_added and pushed to github. Changed one
language string, too.
20191112 - Changed wording for viewed_all_grades event to include more information
and added event, export_viewallgrades_to_csv.
20191114 - Created event, Export to .csv and pushed to github.
20191114 - Created new .php file for layouts Danish, Dvorak, Norwegian, Swedish,
and Vietnamese trying to get rid of Moodle reported BOM character in each file.
20191114 - Code cleanup in typer.js.
20191117 MooTyper_291 - eins.php needs a Cancel button.
    Changed Confirm to btn-primary and added Cancel in eins.php, returning to
    exercises.php at the same exercise when possible (or first in list).
20191117 MooTyper_290 - eedit.php needs a Cancel button.
    Changed Confirm to btn-primary and added Cancel in eedit.php, returning to
    exercises.php at the same exercise when possible (or first in list).
20191117 MooTyper_263 - Need event for csvexport.
    Completed the export event for the text link; BS4-button path still needed
    follow-up.

=== 3.7.0 === released 2019102100
20190520 - function get_keyboard_layouts_db() { in locallib.php so the list of keyboard
layouts appears in alphabetical order.
20190520 - Removed jsTime, jsProgress, jsAcc, jsSpeed, textup, and textdown from styles.css.
20190520 - Modified view.php to add Lesson/category name = xxxx to Mode and Exercise
x of x above the status bar.
20190713 - Closed pull requests on github as I had implemented the changes manually.
20190911 - Changed status bar to full width so that languages other than English
do not cause an extra new line due to long label names.
20191016 - Fixed a bug in mod_setup.php that prevented use of setup modes other than what
was in the default settings for mode.
20191021 - Ran codechecker and udated README.md
20191023 - Released v3.7.0.

=== 3.6.1 === released 2019051800
20190412 - As of 11:30 AM, I have finally gotten my Korean(V5) keyboard to start
recognizing Korean characters, without breaking other layouts.
20190413 MooTyper_200 - Add new exercise/category should automatically add to one being viewed.
    Added a link above the exercises table to eins.php with the lesson name
    preselected so a new exercise is added to the lesson being viewed.
    20190413 Added a supporting language string as part of this exercise-editing update.
20190414 - Added Ex- to the exercise name in the popup when students remove owngrade.
20190430 - Started development, again, on adding Mode config setting, adding Mode and
Lesson to the activity setup page.
20190501 - Started development of keypad layout per request from Assiniboine Community College.
Also began development of a keyboard with keypad layout. Will need to make some
drastic changes to the .js file to get the highlighting to work correctly.
20190511 - Pushed changed styles.css, view.php, and new numberPadOnly(V1).js and php files
to github. This .js file implements color highlights.
20190512 - Implemented highlights in English(V6).
20190515 - Renamed English(V6) to EnglishWKeypad(V6). Fixed it's highlith errors.
20190517 - Fixed Czech(V6) highlight error with đ and Đ.
20190517 - Tried rc1 but deleted due to problems with EnglishWKeypad(USV6) layout.
20190517 - Fixed code getElementByID errors for regular keys in EnglishWKeypad(USV6)
layout so you can type any letter or number.

=== 3.6.0+ === released 2019041200
20190412 - Plus version release due to including the wrong typer.js file in the
last 3.6.0 release. It had my console.log entries in it, and one of them was
breaking the scroll function.

=== 3.6.0 === Working on BETA released 2019032800
20190301 - Doing lots of code cleanup based on working on Roshine.
20190302 - Did lots more code cleanup based on changes to Roshine. Also worked
on changing the look of the grades table generated by owngrades.php. Big change
is adding a background that matches/uses keybdbgc (keyboard background color)
so the table can match the view.php page and color coordinate with a course
or site theme color scheme.
20190303 - Made the same background changes to the page generated by gview.php.
Both grade viewing page tables now also include a heading the lists the mode
and the name of the Lesson/Category.
20190303 - HUGE code change. I eliminated the section of code that generated
the grade view for an exam, in gview.php. I now use the Lesson and Practice
part of the code to also generate results when generating a grade report
for an exam. As part of the change, I was also able to eliminate the function
used by exam mode to retrieve exam results data from the database.
20190303 - In almost every php file, I changed to a new require format as seen
in the Moodle documentation for code style.
20190304 - Worked on adding background frames and color to all the pages using
setting for the keyboard background.
20190308 - Created new English(USV5) keyboard layout that only highlights one
of the shift keys for uppercase letters and symbols. Highlight the shiftkey
opposite to the side of the keyboard where the key is. e.g. A uses shiftright.
20190309 - Created new V5 layouts for Dvorak and Spanish layouts.
20190310 - Changed code to csvexport so the filename is now the lesson name
with all whitespace removed. First row of the file now shows the mode,
the lesson name, and the required goal.
20190310 - Ran codechecker on everything and pushed changes to master branch
at git hub as a MATURITY_BETA version.
20190311 - Fixed an error in the classes/event/course_module_view.php file
that was causing an error when clicking a log link that should take you
to the MooTyper that was listed in the log as being viewed.
20190312 - Renamed event grade_removed to grade_deleted to comply with verb list.
Changed language string grade_removed to grade_deleted.
20190312 - Added event owngrades_deleted and add language string owngrades_deleted.
20190313 - Renamed event lesson_removed to lesson_deleted to comply with verb list.
Changed language string lesson_removed to lesson_deleted.
20190313 - Renamed event exercise_removed to exercise_deleted to comply with verb list.
Changed language string exercise_removed to exercise_deleted.
20190313 - Began work on Belgian(DutchV5) keyboard layout.
20190315 MooTyper_191 - Keyboard layout - Belgian(DutchV5).
    Finished the Belgian(DutchV5) layout, corrected one shiftright key that
    should have been shiftleft, and verified the fix.
20190315 MooTyper_173 - Confirm on eedit.php should return to caller.
    Fixed eedit.php so Confirm returns to the correct caller context.
20190315 MooTyper_192 - eins.php insert exercise does not take you to the new lesson view.
    Fixed eins.php so insert exercise returns to the correct lesson view.
20190315 MooTyper_193 - erem.php after removing an exercise you do not go to the correct lesson.
    Fixed erem.php so removing an exercise returns to the correct lesson.
20190319 - Added confirm popup when deleting a grade from gview.php, View all grades.
20190316 - Added confirm popup when deleting a grade from owngrades.php, Vy my grades.
20190316 - Add mew string for the two new confirm popups.
20190316 - Rename 3 strings to change wroding from remove, to delete.
20190317 - Added new GDPR functions.
20190318 - Changed string, $string['eremove'] = 'Remove'; to, $string['delete'] = 'Delete';
Changed the gview.php and owngrades.php files to use the new Delete string,
instead of the improper, Remove.
20190318 - Armenian(V5) KB - done
20190318 - Bulgarian(V5) KB - done
20190319 - Slovenian(V5) KB - done
20190321 - Croation(V5) KB - done
20190321 - Czech(V5) KB - started
20190326 - Pushed new Belgium(DutchV5), Dvorak(V5), English(USV5), Slovenian(V5),
and Spanish(V5) keyboard layouts to github.
20190328 - Released version 3.6.0.

=== 3.5.4+ === released 2019021600
20181206 - M36 - Started dev on adding Mode and Exercise category to the MooTyper
activity Edit page. Got them both there with help. Exercise category still
needs work as id is not matching the name correctly, yet.
20181211 - M36 - Got both Mode and Exercise category working. Now need Exercise to
show when Exam mode is selected.
20181213 - M36 - Got Exercise to show when mode is Exam. Now need it to show an
actual list of numbers for the chose Exercise category.
20190126 - 3dev - Relabeled some German layout keytops and pushed to github.
20190126 - 3dev - Added two missing characters, â, and î, to german.js file.
20190201 - 3dev - Spent the last two days working on removing all the code style
errors in all the keyboard layouts. See ticket for fix. Pushed to github
master branch.
20190203 - 3dev - Finally found a combination to fix the missing security code
for atchk.php and pushed change to github master branch.
20190213 - Mostly completed new Telugu keyboard layout. Need to fix parenthesis.
20190214 - Added all the code needed for Open and Close calendar events.
20180214 - Created new release 3.5.4.
20190215 - Fixed calendar Open event when creating a new MooTyper activity.
Instance was not being set at the right point in the add_instnace function.
20190216 - Created new release 3.5.4+ build 2019021600.

=== 3.5.3 === released 2018113000
20180609 - Worked on code cleanup in all the keyboard .js files.
20180609 - Major cleanup in Belgium(DutchV4).js file. - Working so far.
20180612 - Completed the same major cleanup in all the other .js kb files.
20180616 - Change the search pattern in eedit.php and eins.php to allow
every character with, var pattern = /[!-ﻼ]/i; instead of the old
piecemeal method of selectin alphabets from somewhere in the middle
of the characters available in a font. Will STILL need to account
for the characters in each js file of each keyboard drivers target alphabet.
20180616 - Created Vietnamese(V4) keyboard layout.
20180618 - Created Swedish(V4) keyboard layout.
20180619 - Created Danish(V4) keyboard layout.
20180619 - Created Norwegian(V4) keyboard layout.
20180622 - Created Bulgarian(V4) keyboard layout.
20180623 - Created Greek(V4) keyboard layout.
20180625 - Created Czech(V4) keyboard layout.
20180625 - Made the minor code modification to enable Automatic View
activity completion. Started work on the grade completion part.
20180626 - Worked some more on added gradebook capabiltiy to MooTyper.
20180627 - Created Italian(V4) keyboard layout.
20180627 - Created Turkish(V4) keyboard layout. And removed some
fixed spaces in the new keyboard php files after fixing line
lengths.
20180629 - Created Arabic(V4) keyboard layout. Still needs major work.
20180630 - Implemented, Activity Completion for View and it is now
working in this version of MooTyper.
20180630 - Created Ukrainian(V4) keyboard layout.
20180707 - Created Hungarian(V4) keyboard layout.
20180709 - Created German(V4) keyboard layout.
20180711 - Created Serbian(V4) keyboard layout.
20180712 - Most of the needed work for Arabic(V4) keyboard layout is now complete.
20180722 - Fixed alignment error for the English(US) tilde keytop.
20180923 - Worked some on Aribic(V4) layout. The .js file still needs some characters
implemented.
20180925 - Got all the lower case Arabic letters working except the ones on tgb.
The g is lighting up when it should be shift+t or shift+b.
20181130 - Pushed all the working stuff to github for realease.

=== 3.5.2 === released 20180060300
20180515 - Fixed lesson export so \r\n is only \n.
20180526 - Added strings for GDPR.
20180526 - Added privacy.php file with code for GDPR.
STILL need code changed to included data for lesson and exercises.
20180528 - Finally, I think I have GDPR working. Creates data.json,
attempts.json, grades.json, and lesson.json. The last one doesn't
ever show up for a student. Only teachers and admins, IF, they
have created a lesson with at least one exercise.
20180529 - Delete for grades and lessons worked previously and today I have
added a delete for lessons. Can't use as it is because it leaves orphaned
exercises in the mootyper_exercises table.
20180601 - Got a working provider.php for MooTyper working. Need to refine listed
lessons as in some cases it is listing repeats.
20180602 - After forum discussion with Davo Smith, I realize, I only need to list
and delete grades and attempts.
20180603 - Modified provider.php to only handle grades and attempts.
20180603 - Some code cleanup in Belgin, Dvorak, and English(US) .js files.
20180604 - Fixed GDPR code to use the legacy_polyfill so I can use one branch
to work for Moodle 2.7 thru Moodle 3.5.
20180605 - Tested each version - all okay.
Bumped version to 3.5.2 and pushed to github.

=== 3.5.1 STABLE === release 2018051300
20180408 - Modified csvexport.php to include exercise name in the export file.
20180409 - Created prototype Korean(V4) keyboard layout. Still needs work.
20180416 - Began development of GDPR code for MooTyper in Moodle3.5.
20180501 - Have GDPR for MT giving results for grades. Now need to add attempts,
lessons, and exercises.
20180502 - Added new strings needed for, Plugin privacy registry, listing.
20180503 - Modified $SQL in privacy.php.
20180504 - Added missing strings for grades and lessons.Reorganized and changed
wording of new strings for Plugin privacy registry.
20180511 - Changed status bar WPM to show Gross WPM and Net WPM in Moodle3dev.
20180511 - Changed the final display of WPM to show updated GWPM and NWPM.
20190511 - Changed gcnext, view.php, and typer.js to treat wpm as rpWpmInput
just like the other rpXxxxInput items.
20180512 - Added Practice mode. Setting is hardcoded at the moment.
20180513 - Finished development of the new, Practice, mode.
20180513 - Cleaned code. Alost all the code precheck errors are in the js files
for each of the keyboard layouts. Need to go through them again.
20180514 - Finsihed changes to the wpm formula and pushed to github.
20180514 - Posted new 3.5.1 version to Moodle.

=== 3.5.0 STABLE === release 2018040400
20180326 - Updated function doTheEnd in typer.js to do a final stauts bar update so the
info on the staus bar is the same as the info in the grade view.
20180327 - Added scrolling text capability to the texttotype and hid the textarea.
20180328 - Added textbackground color to scrolling text. Need to add database setting for it.
20180328 - Added cursor color in scrolling text. Need to add database setting for it.
20180328 - Added border and drop shadow to scrolling text frame.
20180330 - Changed scrolling text so scroll bars appear after typing the exercise.
20180330 - In XMLDB added four new fields to mdl_mootyper for cursorcolor, textbgc, texterrorcolor,
and countmistakes.
20180330 - Modified backup code for new fields.
20180330 - Modified view.php for new fields.
20180331 - Added new settings for text background color, cursor color, incorrect letter color
to the settings.php file, the mod_setup.php file, and the mod_form.php file.
20180403 - Added code for auto text direction to make Hebrew(V4)dual layout work.
20180404 - Added code to view.php to make the status bar round corners look right for
Moodle 3.1 and below as they were not getting flipped as expected.
20180404 - Created English(UKV4) keyboard layout files.
20180404 - Deleted Hebrew(V4RTL) and Hebrew(V4LTR) as they are replaced by Hebrew(V4)dual.
20180404 - Cleaned code and pushed to github for new release.

=== 3.4.3 STABLE === released 2018031200
20180208 - Started development on Hebrew(V4) Keyboard layout at request of Eyal Laifer.
20180209 - Abandoned files from Eyal and started over. By EOD I have Hebrew characters working
but NOT the capitalized English characters.
20180210 - Testing for Hebrew text right align. Should work like the other color settings.
20180210 - Have working Hebrew layout except for English characters when using shift.
20180211 - Have left, center, and right align working for text-to-enter and the text entry area.
20180215 - Working on Thai layout - no progress to speak of. Unable to get shift letters on row1
to type except for %.
20180216 - Fixed a couple of errors and added AltGr characters to Hebrew KB Layout.
20180216 - Did some code cleanup on all MooTyper files.
20180218 - Finally got Thai shift letters to work. Turnoff function had shiftd renamed and that was
causing it to break.
20180225 - Started modifications to Hebrew(V4) based on input from Eyal Laifer.
20180226 - Converted Text Alignment Setting from a type into entry box, into a selector using
three language strings for left, center, and right.
20180311 - Created Estonian(V4) keyboard layout at request of Virgo Pihlapuu.
20180311 - Got text alignment selector working in eedit.php.
20180312 - Got text alignment selector working in eins.php and added new language string to warn users
to set alignment before starting to type, as setting alignment clears the textarea.
20180312 - Cleaned code and pushed to github for new release.

=== 3.4.2 STABLE === released 2017120402
20171202 - Created Portuguese(PortugalV4) keyboard layout and modified eeins.php and eedit.php
to add «» characters.
20171203 - Finalized Portuguese(PortugalV4) keyboard layout and modified styles.css file
so that the new Moodle previous and next activity links, stay below MooTyper.
20171204 - Added missing characters to Portuguese(BrazilV4) keyboard layout and changed font size.
20171204 - Bumped Version.
20171204 - Changed font size and name for English(USV4).
20171205 - Changed PARAM_CLEANHTML to PARAM_RAW in line 50 of eedit.php and line 53 of eeins.php
to fix the problem of some symbols being changed when used in exercises.
20171206 - Created French(V4) keyboard layout. Waiting for assistance to make sure combined
characters are accounted for.
20171212 - I think the French(V4) keyboard layout is ready for release. One more check by
Séverin and I'll know for sure.
20171212 - Dinis has completed MooTyper translation for Portuguese.
20171218 - Pushed code to github that as Course Reset capability for MooTyper.
20171222 - Released MooTyper 3.4.2 to Moodle.

=== 3.4.1 STABLE === released 2017120100
20171111 - Worked on fixing many of the JSDOC errors in all the layout .js files and typer.js.
20171114 - Moved statistics so they appear with a colored background, right above
the text to type. Added the 2 grade and the settings links just above them.
20171119 - Over the past four days I have been creating V4 keyboard layouts.
20171120 - Fixed css filename error in line 72 of owngrades.php. Fixed css filename
error in line 70 of gview.php. Being spelled wrong was preventing the correct
color (black) from being applied to the sort direction indicators on both of
the grade viewing pages.
20171122 - Added dropdown keyboard layout selector to mod_form which is used when
adding or editing a MooTyper activity.
20171123 - rearrainged mod_form and mod_setup so Show keyboard checkbox is just
above the Keyboard layout selector.
20171123 - Modfied min:secs in stats to use leading 0:0 any time seconds
are less than 10, which occurs after each 60 seconds.
20171124 - Added dropdown selector for required precision to mod_form.php which is
used when adding or editing a MooTyper activity.
20171127 - Over the past three days I have added a statistics background setting
and added it, keytops, and keyboard background settings that can be set at the
time of creating a MooTyper activity.
20171201 - Released V4 versions of keyboard layouts.
20171201 - Released MooTyper 3.4.1.

=== 3.4.0 STABLE === released 2017110700
20171106 - Over the past two weeks I have been working on eliminating the last few
instances of _POST and _GET. Finally got rid of the last one today in mod_setup.php.
While working on this I also made a new log entry for removing a lesson and made the
previous one cover just the removal of an exercise from a lesson.
Reworked the mod_form to include showkeyboard.
20171107 - Pushed latest to github. Works on Moodle 2.7 to Moodle 3.4.
Charts are shown only when in Moodle 3.2 and higher.

=== 3.3.2 STABLE === released 2017102600
20171026 - Fixed a lot more of the warnings and errors listed on Moodle for 3.3.1 version.
20171026 - Pushed changes to github and published new version 3.3.2.

=== 3.3.1 STABLE === released 2017102500
20171005 - Changed t_crka to t_Crka to get rid of camelcase errors in all keyboard .js files.
20171005 - Added JSDoc comments to functions in typer.js and all keyboard .js files.
20171005 - Bumped version by 0.1.
20171010 - Fixed instances of _POST being used in gcnext.php and gadd.php.
20171010 - Pushed 3.3.1 BETA to github.
20171012 - Fixed instances of _POST being used when it should not in eedit.php and eins.php.
20171019 - Fixed some instances of _GET being used in attrem.php.
20171020 - Fixed some instances of _GET being used in atchk.php
20171024 - Removed DIE and Require_login from atchk.php to fix things back to what
they should be. With either of those lines, students could restart a lesson fromt
the beginning without being fourced to complete and take a "bad" grade. With
either of those two lines, the code for suspicious grades did not work.
20171025 - Finished fixing _POST and _GET in all files pushed to git and published new version 3.3.1.

=== 3.3.0 STABLE === released 2017092901
NOTE: Moodle 3.2 implements new Graph API, so this MooTyper will be
for MooTyper 3.2 and 3.3 only.
20170719 - Started adding chart to owngrades.php, View own grades page.
20170720 - Have dynamic chart working for own grades when grades are present.
Added language string for it's title.
20170720 - Discovered the column label, Exercise, for the owngrades table was
hard coded. Changed to get_string.
20170720 - Added dynamic chart to gview.php, View all grades page and added language string for it's title.
20170814 - Fine tuning y-axis labels for the new graphs.
20170821 - Eclipse day!
20170903 - Been working off and on to get various parts of 3.3.0 to work.
   1. fixed options setting so Continuous type is set to config setting
   2. added countmistypedspaces optional
   3. fixed options setting so COunt mistyped spaces is set to config setting
   4. fixed a problem with typer.js that was removing formatting for texttoenter
   5. set colors for text to enter Red, Blue, and Green like the original design
20170904 - Received message from Ruben Cancho that accented letters do not work in Spanish(V21) keyboard layout.
20170910 - Reworked all the keyboard layouts, especially Spanish. Accents work as expected except when
using Linux.
20170915 - Created Belgium(DutchV21) keyboard layout.
20170916 - Added blue and red characters to Portuguese(V21)(Brazil) KB layout.
20170916 - Added missing characters, blue, and red to Slovenian(V21) KB layout. Everything works except 'Ł'.
20170917 - Finished dev work on Belgium(DutchV21) KB layout. Can now type all the provided sample text.
20170917 - Changed size of the text area in eedit.php line 130-133.
20170917 - Increased the width of the Required precision setting from 20px to 25px in mod_setup.php line 159.
20170920 - Completed dev work on a Dvorak KB layout a couple of days ago. Yesterday, simplified all
internal "or" checks and changed it to (V3)
20170920 - Simplified code in English(V21) and changed it to English(V3).
20170920 - Simplified code in Belgium(DutchV21) and changed it to Belgium(DutchV3)
20170920 - Added missing string for log event when importing new KB layout.
20170921 - Simplified code in Spanish(V21) and changed it to Spanish(V3)
20170923 - Simplified code in Portuguese(V21) and changed it to Portuguese(V3)
20170924 - Simplified code in Russian(V21) and changed it to Russian(V3)
20170924 - Simplified code in German(Swiss)(V21) and changed it to German(Swiss)(V3) - still needs work.
20170926 - Finally got Slovenian(V3) working correctly for all keys.
20170927 - Finally got German(SwissV3) based on Belgium working correctly for all keys.
20170929 - Finished tweaks to keyboard layouts.
20170929 - Added code to draw charts when the MooTyper is an Exam.
20170929 - Released MooTyper 3.3 STABLE.

=== 3.2.0 STABLE ===
20170720 - Completed codechecker fixes.
20170811 - Since last entry been working off and on, on getting V2 keyboards to render "the same" in both Boost
and Clean. Finally got it today by cutting the padding back to 1px along with width of 39px and height of 30px.
20170812 - Fine tuning the V2 keyboard files. Added missing background to Japanese (V2) keyboard. Lost some of my work.
NOT sure what happened. I think I did not have template.css and styles.css set the same so that when I made a
a settings change it wiped out my work in styles.css.
20170816 - Finally tracked down a way to make renders using both Clean and Boost look the same. Did it by adding,
box-sizing: border-box; to each one of my classes in styles.css and template.css.
20170816 - Made a lot of little tweeks to all of the keyboard layouts to make them as symetrical as I can, plus
added a few missing keys to the non-v2 layouts.
20170818 - Continued making tweeks to all the keyboard layouts
20170819 - Released version 3.2.0.

=== 3.1.5 Beta === NOT RELEASED
20170610 - Cleaned up more of the code in typer.js - Slovenian to English.
20170611 - Cleaned up more of the code in typer.js - Slovenian to English.
20170611 - Worked on CSS - still don't know why render size is different between Boost and Clean.
20170622 - Started development of Behat tests.
20170623 - Experimented with adding options to the MooTyper edit activity page:
        - Mode = Lesson or Exam
        - showkeyboard
        - continuous type
20170818 - Current 3.2.0 STABLE released instead of 3.1.5.

=== 3.1.4 STABLE ===
20170605 - Currently have backup working with user data for grades.
20170607 - Worked on lesson import.
20170608 - Worked on lesson import for keyboard part. had to add gloabl db and cfg to this part just like lesson.
20170608 - Released new version.

=== 3.1.4 BETA ===
20161018 - typer.js did some more work on converting Slovenian words to English.
20161018 - Modified typer.js so that if you mistype a character, you don't have
to enter the correct letter before proceeding, but it still gets counted as a mistake.
20161024 - Started work on adding continuous typing as a setting during setup of a MooTyper lesson or exam.
20170405 - Fixed multiple occurances in both css files where 5x should be 5px.
20170405 - Fixed one spot where radius was spelled wrong in both css files.
20170504 - Code style cleanup .../mootyper/view.php.
20170504 - Code style cleanup .../mootyper/typer.js.
20170504 - Code style cleanup .../mootyper/settings.php.
20170504 - Code style cleanup .../mootyper/owngrades.php.
20170504 - Code style cleanup .../mootyper/mod_setup.php.
20170504 - Code style cleanup .../mootyper/mod_form.php.
20170504 - Code style cleanup .../mootyper/lsnimport.php.
20170504 - Code style cleanup .../mootyper/lsnexport.php.
20170504 - Code style cleanup .../mootyper/lib.php.
20170504 - Code style cleanup .../mootyper/gview.php.
20170504 - Code style cleanup .../mootyper/gcnext.php. moved global $DB up above require_once.
20170504 - Code style cleanup .../mootyper/gadd.php. moved global $DB up above require_once.
20170504 - Code style cleanup .../mootyper/exercises.php.
20170504 - Code style cleanup .../mootyper/erem.php. moved global $DB up above require_once.
20170504 - Code style cleanup .../mootyper/eins.php.
20170504 - Code style cleanup .../mootyper/eedit.php.
20170504 - Code style cleanup .../mootyper/csvexport.php.
20170504 - Code style cleanup .../mootyper/attrem.php. moved global $DB up above require_once.
20170504 - Code style cleanup .../mootyper/atchk.php. moved global $DB up above require_once.
20170504 - Code style cleanup .../mootyper/layout/Dvorak.js
20170504 - Code style cleanup .../mootyper/db/install.php.
20170504 - Code style cleanup .../mootyper/db/uninstall.php.
20170504 - Code style cleanup .../mootyper/backup/moodle2/backup_mootyper_activity_task.class.php.
20170504 - Code style cleanup .../mootyper/backup/moodle2/backup_mootyper_stepslib.php.
20170504 - Code style cleanup .../mootyper/backup/moodle2/restore_mootyper_stepslib.php.
20170504 - Code doc cleanup in ...mod/view.php
20170504 - Code doc cleanup in ...mod/styles.css and template.css
20170504 - Code doc cleanup in ...mod/settings.php
20170504 - Code doc cleanup in ...mod/renderer.php
20170504 - Code doc cleanup in ...mod/owngrades.php
20170504 - Code doc cleanup in ...mod/mod_setup.php
20170504 - Code doc cleanup in ...mod/mod_form.php
20170504 - Code doc cleanup in ...mod/lsnimport.php
20170504 - Code doc cleanup in ...mod/lsnexport.php
20170504 - Code doc cleanup in ...mod/locallib.php
20170504 - Code doc cleanup in ...mod/lib.php
20170504 - Code doc cleanup in ...mod/index.php
20170504 - Code doc cleanup in ...mod/gcnext.php
20170504 - Code doc cleanup in ...mod/gadd.php
20170504 - Code doc cleanup in ...mod/gadd.php
20170504 - Code doc cleanup in ...mod/erem.php
20170504 - Code doc cleanup in ...mod/eins.php
20170504 - Code doc cleanup in ...mod/eedit.php
20170504 - Code doc cleanup in ...mod/csvexport.php
20170504 - Code doc cleanup in ...mod/attrem.php
20170504 - Code doc cleanup in ...mod/atchk.php
20170504 - Code doc cleanup in ...mod/lang/en/mootyper.php
20170504 - Code doc cleanup in ...mod/db/access.php       *******
20170504 - Code doc cleanup in ...mod/db/install.php      *******
20170504 - Code doc cleanup in ...mod/db/log.php          *******
20170504 - Code doc cleanup in ...mod/db/uninstall.php    *******
20170504 - Code doc cleanup in ...mod/db/upgrade.php      *******
20170504 - Code doc cleanup in ...mod/classes/event/course_exercise_viewed.php
20170504 - Code doc cleanup in ...mod/classes/event/course_module_instance_list_viewed.php
20170505 - Modified $sql SELECT statement to include mte.id in lsnexport.php line so exercises CAN be
duplicates without getting debug message in output file.
20170506 - Code style cleanup .../mootyper/csvexport.php - moved require_once x3 to correct location in file.
20170506 - Code style cleanup .../mootyper/eedit.php - moved globals to correct location in file.
20170506 - Code style cleanup .../mootyper/exercises.php - moved globals to correct location in file.
20170506 - Code style cleanup .../mootyper/lessons/* - fixed missing lf at the end of new lessons.
20170506 - Code style cleanup .../mootyper/localib.php - removed whitespace at the end of a bunch of lines.
20170506 - Code style cleanup .../mootyper/view.php - moved globals to correct location in file.
20170506 - Code style cleanup .../mootyper/layouts/qwerty.js - fixed errors.
20170506 - Code style cleanup .../mootyper/layouts/English(V2).php - added missing intro section.
20170601 - Pushed 3.1.4 Beta to github with partial backup capability for others to test.
20170603 - Pushed 3.1.4.1 Beta to github with user data backup capability for others to test.
20170604 - Ran code checker PHPdoc on new code in moodle 30 and fixed warnings, errors and missing documentation.
20170604 - Did more work on continous typing. Flag is not being detected correctly?
20170605 - Added continuoustype field to list of fields to back up. Tested and is working.
20170605 - Implemented continuous typing as an optional setting. Working in beta.

=== 3.1.3 ===
20160815 - Changed Administration Import exercise / category entry, to Import lesson / KB layout.
20160815 - Added code to lsnimport.php that checks to see if there are any new keyboard layouts in the layouts folder.
20161010 - Fixed bug with Time open and Time close being reversed in availability check.
20161010 - Changed code for Exam mode to prevent negative WPM.
20161011 - Changed code for Lesson mode to prevent negative WPM.
20161011 - Changed some language strings to make the plugin more generic.
20161011 - Changed availability check code in view.php so that admin and teachers can always access
a MooTyper activity to check grades. Only students are prevented if availability is closed.

=== 3.1.2 === released 2016080700
20160718 - Implemented code to show entries in the Recent Activity Block.
20160730 - Implemented code to use open and close dates for MooTyper activities.
20160730 - Implemented renderer.php file and started creating functions in it.
20160802 - Implemented code for passwords. Had to add new usepassword field
to mdl_mootyper table.
20160806 - Changed Exercise filename to show "Exercise x of y' instead of a
single meaningless digit.
20160807 - Modified config name for recent activity to match other config names.
20160807 - Added setting to allow for automatic addition of GMT to export lesson
filenames.

=== 3.1.1 ===
20160701 - Previously, I attempted to add a setting for the date and time format
but gave it up to work on other new capabilities and enhancements. Today, I tried
again based on a clue regarding get_config. Took only a few minutes and I now have
it working. Need to finalize the directions and see what codes can be used. Right
now I know about d, M, Y, G and i as well as comma and colon.
20160702 - Added color picker setting for passing grades. Not used for exam as no
pass/fail is implemented for exam.
20160702 - Added color picker setting for failing grades. Not used for exam as no
pass/fail is implemented for exam.
20160702 - Added color picker setting for suspicious grades.
20160708 - Added color picker setting for keyboard background for new keyboard layouts.
Does not affect old keyboard layout versions.
20160708 - Added color picker setting for keytops of non-homerow keys for new keyboard layouts.
Does not affect old keyboard layout versions.

=== 3.1.0 ===
Working on multiple new capabilities.
20160503 - Over the past few days I've added V2 versions of other keyboard layouts.
20160614 - Added an Export / edit exercises link in the Administration
block that's visible when looking at the view.php page. It takes you to the
normal exercises.php page and now has links that will let you export lessons
as a .txt file so you can save and or swap lessons that you create.
20160614 - Added an Import exercise / category link in the Administration
block that's visible when looking at the view.php page. When clicked it will
check all the files in the MooTyper lesson folder. Filenames that match lessons
already in the database are skipped. Filenames that do not match lessons already
in the database will get added. Once complete you will see a report of what was
done with a contiue link that takes you to the exercises.php page so you can
check the contents of the new lessons.
20160625 - Yesterday I updated github with a 3.1.0 Beta version and made a post about
it in the discussion group.
20160626 - Last night when doing some testing, I discovered the lesson export
format was not correct. Updated the code in lsnexport.php and pushed to github.
20160630 - Modified lesson export format again. Each exported line of text need
both CR adn LF, not just the CR I had been using. With just a CR, the text of the
first exercise of a lesson would would not show up until it was opend for editing
and then saved. New format works out of the box.
20160701 - Released this version on Moodle.

=== 3.0.1 ===
20160401 - Added English(US) keyboard layout by copying English one.
Redid all number and symbol keys to show shifted and unshifted characters
on one key, by using supscript and subscript tags.
Got rid of the <> key that was by the z key and put them where they belong.
Added the missing backslash plus vertical bar key that was supposed
to be next to the right bracket key.
Changed the Alt gr key to Alt.
Resized some keys to enhance the layout.
Some characters were not being recognized as valid characters for a lesson,
so I added them in the eins.php file. I also added them to the eedit.php file.
20160404 - Added some CSS changes to make the English(US) keyboard layout look better
especially keys with two symbols on them.
20160404 - Redid the icon as an SVG file.
20160406 - Change suspicion indication from red to yellow to make it stand out more.
I also added more characters to the lesson install.php. Made copy of the original
version so I can experiment.
20160407 - Added links under the Administration block to go
directly to MooTyper Administration and Add new exercise/category pages. The two
links also use the new icon file.
20160408 - Changed variable name in install.php from $pikapos to $periodpos.
20160408 - Added keyboard background color setting for the new keyboard layout.
Have NOT yet figured out the correct "selector" for it in settings.php.

=== 3.0 ===
3.0 (Build: 2016032400) (2016032400)Moodle 2.9, 3.0
* Changed version.
Minor code cleanup.

=== 2.9 ===
2.9 (Build: 2016032300) (2016032300)Moodle 2.9
Release date: Thursday, 24 March 2016, 12:54 PM

* Fixed function moodleform_mod::add_intro_editor() is deprecated, in mod_form.php.
* Removed non-English sample lessons
* Removed extra language files.
* Changed version.

=== 2.8 ===
2.7.1 (Build: 2016032200) (2016031501)Moodle 2.7, 2.8
Release date: Tuesday, 22 March 2016, 5:24 PM

Modified ename language string.
Fixed function can_view_edit_all($usr, $c) that was letting everyone modify every lesson.
Fixed function is_user_enrolled($usr, $crs) that was incorrectly comparing a courseid to modifieid.
Modified the call to function get_typerlessons() in mod_setup.php so the function is no longer
used. It was incorrectly being called for everyone and giving them edit/remove capability they
should not have had.
Modified mod_setup.php to only call function get_mootyperlessons($u, $c) so edit/remove works correctly.
Removed some of the junk lines in locallib.php and modified the remarks at the top of the file.
Combined README.txt and README.md into one file: README.md.
Changed version.

=== 2.7 ===
I took over MooTyper 3/15/16
* 2.7.0 (Build: 2016031500) (2016031500)Moodle 2.7
  Release date: Wednesday, 16 March 2016, 11:12 AM
required changes in code:
  * Fixed all deprecated add_to_log functions.
  * Sorted language strings.
  * Added language strings for new events.
  * Added language strings for missing permissions.
  * Fixed multiple notices of trying to get property of non-object errors when viewing lessons.
  * Fixed function moodleform_mod::add_intro_editor() is deprecated error.
  * Fixed get_context_instance() is deprecated when viewing list of MootTyper activities.

No updates for about a year and a half.

=== 2.7 ===
* 2.6.6 (Build: 2014120500) (2014120500)Moodle 2.7
  Release date: Friday, 5 December 2014, 11:17 AM
* 2.6.5 (Build: 2014102300) (2014102300)Moodle 2.7
  Release date: Thursday, 23 October 2014, 4:32 PM
* 2.6.4 (Build: 2014090300) (2014090300)Moodle 2.7
  Release date: Wednesday, 3 September 2014, 8:11 AM
* 2.6.2 (Build: 2014082800) (2014082800)Moodle 2.7
  Release date: Thursday, 28 August 2014, 3:17 PM
* 2.5 (Build: 2014071300) (2014071300)Moodle 2.7
  Release date: Sunday, 13 July 2014, 5:38 AM

=== No releases for 2.4, 2.5, 2.6 ===

=== 2.3 === released 20140803
* 2.6 (Build: 2014080300) (2014080300)Moodle 2.3
  Release date: Sunday, 3 August 2014, 7:51 AM
* 2.4 (Build: 2014071200) (2014071200)Moodle 2.3
  Release date: Sunday, 13 July 2014, 5:27 AM
* 2.3.1 (Build: 2013022300) (2013022300)Moodle 2.3
  Release date: Friday, 22 February 2013, 5:38 PM
* 2.3 (Build: 2013022100) (2013022100)Moodle 2.3
  Release date: Thursday, 21 February 2013, 4:39 PM

=== 2.2 ===
* 2.2 (Build: 2013012100) (2013012100)Moodle 2.2
  Release date: Monday, 21 January 2013, 11:40 AM
* 2.1 (Build: 2012101200) (2012101200)Moodle 2.2
  Release date: Friday, 12 October 2012, 9:38 AM
* 2.0 (Build: 2012101100) (2012101100)Moodle 2.2
  Release date: Thursday, 11 October 2012, 2:43 PM
* 1.9 (Build: 2012101100) (2012101100)Moodle 2.2
  Release date: Thursday, 11 October 2012, 6:43 AM
* 1.8 (Build: 2012090400) (2012100400)Moodle 2.2
  Release date: Thursday, 4 October 2012, 7:39 AM
* 1.7 (Build: 2012100400) (2012100400)Moodle 2.2
  Release date: Thursday, 4 October 2012, 6:52 AM
* 1.6 (Build: 2012082500) (2012082500)Moodle 2.2
  Release date: Friday, 24 August 2012, 4:14 PM
* 1.5 (Build: 2012082400) (2012082400)Moodle 2.2
  Release date: Friday, 24 August 2012, 9:23 AM
* 1.4 (Build: 2012081600) (2012081600)Moodle 2.2
  Release date: Wednesday, 15 August 2012, 11:09 AM
* 1.3 (Build: 2012081500) (2012081500)Moodle 2.2
  Release date: Tuesday, 14 August 2012, 4:17 PM
* 1.2 (Build: 2012081400) (2012081400)Moodle 2.2
  Release date: Tuesday, 14 August 2012, 4:43 AM
* 1.1 (Build: 2012010700) (2012010700)Moodle 2.2
  Release date: Wednesday, 25 July 2012, 3:15 AM
* 1.0 (20120411)Moodle 2.2
  Release date: Sunday, 1 July 2012, 12:19 PM
