DartCounter Calculator

Support maths for DartCounter score entry.

// ==UserScript==
// @name         DartCounter Calculator
// @namespace    http://dartcounter.net/
// @author       mrdarts180
// @version      2.0
// @license      MIT
// @description  Support maths for DartCounter score entry.
// @match        http*://app.dartcounter.net/*
// @icon         https://dartcounter.net/favicon-32x32.png
// @require      https://unpkg.com/mathjs/lib/browser/math.js
// @grant        GM_addStyle
// ==/UserScript==

(function() {
    'use strict';

    var observer = new MutationObserver(function(mutations) {
        var score = document.getElementsByClassName("in-game-score-field")[0];
        if (score) {
            score.type = 'text';
            score.disabled = false;
            score.setAttribute('autocomplete', 'off');
        }
    });
    observer.observe(document, {attributes: false, childList: true, characterData: false, subtree:true});

    document.addEventListener('keydown', (event) => {
        var score = document.getElementsByClassName("in-game-score-field")[0];
        if (score && event.target == score) {
            if (event.keyCode == 13) {
                let evalScore = (str) => {
                    return math.evaluate(str);
                };

                if (score.value && score.value.length > 0) {
                    score.value = evalScore(score.value);
                    score.dispatchEvent(
                        new Event("input", { bubbles: true, cancelable: true })
                    );

                    event.stopPropagation();
                    score.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Enter'}));

                    return false;
                }
            }
            // Remaping +/- keys
            else if (event.keyCode == 187 || event.keyCode == 189) {
                score.value += event.keyCode == 187 ? "+" : "*";
                score.dispatchEvent(
                    new Event("input", { bubbles: true, cancelable: true })
                );
                event.cancelBubble = true;
                event.preventDefault();
                event.stopPropagation();

                return false;
            }
        }
    }, true);

})();