WME Speedhelper

Makes inputting speed data easier

目前為 2015-11-16 提交的版本,檢視 最新版本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name           WME Speedhelper
// @description    Makes inputting speed data easier
// @namespace      [email protected]
// @grant          none
// @grant          GM_info
// @version        0.2.2
// @match          https://editor-beta.waze.com/*editor/*
// @match          https://www.waze.com/*editor/*
// @author         Broos Gert '2015
// @license        MIT/BSD/X11
// @icon			data:image/png;base64,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
// ==/UserScript==
/* Changelog

*/

// Add Google Varela Round font to make sure signs look the same everywhere (less hassle)
WebFontConfig = {google:{families:['Varela+Round::latin' ]}};
(function() {
    var wf = document.createElement('script');
    wf.src = ('https:' == document.location.protocol ? 'https' : 'http') +
        '://ajax.googleapis.com/ajax/libs/webfont/1/webfont.js';
    wf.type = 'text/javascript';
    wf.async = 'true';
    var s = document.getElementsByTagName('script')[0];
    s.parentNode.insertBefore(wf, s);
})();

/* Borden base64 */
var mssimg = 'data:image/png;base64,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';
var BGa = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAkCAYAAADhAJiYAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOwwAADsMBx2+oZAAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAAWdEVYdENyZWF0aW9uIFRpbWUAMTEvMTUvMTUXz/AGAAACiElEQVRYhe2YT0sbQRjGn5VNbZAai4cmh5IttDcPK3gRQvQehNzUk4HNVfCag5/BL+BhAx7MB/CekAUvgnsNSthQgtkidROpW93Vtwdp2slM/m9xhT4QyLsz7zM/Znf+SkRECJFmXhqgV/I0ya5h4OfZGWuYSODd5ubEntK4r+y6UEBH1+HbNjAgVY7HMZfJYHF/H3IyGTyQnc+jUyyCfH9k8+cWJETTaSSKxZHAhgK5hoHmxgaeHGc8kN6GZBnxo6Ohr3PgR31bKuFrOj01DACQ7+Nqawt2Pj+kYh91jo+pJklUA7ifparU1nV6sCwu78GyqK3rZKmqMLcGUEvT+jVLQqC7alUIU1cUuiuX+5pxPuUy1RVFCPX94GB0oIuFBc6gmc3So+OMDPNbj45DzWyWh5Ik8gQ9zAG1NE0IM61EUJaqcvW4UXYRiTBDO6IoSJomZmKxqT7qp3YbDVWFZ1nM84/VKqKpVDdmRtl1ocDNM3FdnxoGAGZiMcR1nXv+bXeXiZkeqicS8FutbuGsqiJ5fj41zN9qLC/j3jT/AMgyvnheN2Z6yLdtJvn93l6gMCJP8n24hsEDuYbBrU3R9fXAgUSeP05OeKDeVRsAImMsiqNK5OmenvJAYdF/oGHqAr1dWeEKvUYj8AZFntHVVR4omkoBksRUdMvlwIFEnnOZTPd/uCfG+VyOSb43TbiVSmAwbqXCwADAm6UlJg734goA8zs7TOxZFlo9PTeJWrkcBzOrqgwMAPEWNlQbNKIQbmGJXm6TP/Bcdlsq4Wp7e+AJdVzFNA0fDg/7lr+ugyLwPIN/vrlBTNMgyRPcTUgSomtr+HR5OdIlxOu9bBApFNcx/1qh2w/9Ag1uL5DjL1V0AAAAAElFTkSuQmCC';

var signConfig = {
    NL:  	{'sgn': BGa, 'dim':'36|36', 'ann':'kmh', 'spd':[ 15, 30, 50, 60, 70, 80, 100, 120, 130 ]},
    BE:  	{'sgn': BGa, 'dim':'36|36', 'ann':'kmh', 'spd':[ 30, 50, 70, 90, 100, 120 ]},
    LUX:	{'sgn': BGa, 'dim':'36|36', 'ann':'kmh', 'spd':[ 30, 50, 70, 90, 120 ]},
    AU: 	{'sgn': BGa, 'dim':'36|36', 'ann':'kmh', 'spd':[ 30, 40, 50, 60, 70, 80, 100, 110, 120, 130 ]},
    FR:		{'sgn': BGa, 'dim':'36|36', 'ann':'kmh', 'spd':[ 30, 50, 70, 90, 110, 130 ]},
    HU:		{'sgn': BGa, 'dim':'36|36', 'ann':'kmh', 'spd':[ 30, 40, 50, 60, 70, 80, 90, 130]},
    MX: 	{'sgn': BGa, 'dim':'36|36', 'ann':'kmh', 'spd':[ 10, 60, 70, 80, 90, 100, 110]},
    UK: 	{'sgn': BGa, 'dim':'36|36', 'ann':'mph', 'spd':[ 30, 40, 50, 60]},
    SZ: 	{'sgn': BGa, 'dim':'36|36', 'ann':'kph', 'spd':[ 30, 40, 50, 60, 80, 100, 120]},
    GM:         {'sgn': BGa, 'dim':'36|36', 'ann':'kph', 'spd':[ 7, 30, 50, 60, 70, 80, 100, 120, 130]},
    LG:         {'sgn': BGa, 'dim':'36|36', 'ann':'kmh', 'spd':[ 20, 30, 50, 70, 90, 100 ]},
    LT:         {'sgn': BGa, 'dim':'36|36', 'ann':'kmh', 'spd':[ 30, 40, 50, 60, 70, 80, 90, 110, 120, 130 ]},
    RU:         {'sgn': BGa, 'dim':'36|36', 'ann':'kmh', 'spd':[ 30, 40, 50, 60, 70, 80, 90, 110, 120, 130 ]}
};

// initialize WMESpeedhelper and do some checks
function WMESpeedhelper_bootstrap() {
    WMESpeedhelper_init();
}

function WMESpeedhelper_init() {

    //create the WMESpeedhelper object
    var WMESpeedhelper = {};
    var editpanel =  $("#edit-panel");

    // Check initialisation
    if (typeof Waze == 'undefined' || typeof I18n == 'undefined') {
        setTimeout(WMESpeedhelper_init, 660);
        log('Waze object unavailable, map still loading');
        return;
    }
    if (editpanel === undefined) {
        setTimeout(WMESpeedhelper_init, 660);
        log('edit-panel info unavailable, map still loading');
        return;
    }

    // check for changes in the edit-panel
    var speedlimitsObserver = new MutationObserver(function(mutations) {
        mutations.forEach(function(mutation) {

            // Mutation is a NodeList and doesn't support forEach like an array
            for (var i = 0; i < mutation.addedNodes.length; i++) {

                var addedNode = mutation.addedNodes[i];
                
                // Only fire up if it's a node
                if (addedNode.nodeType === Node.ELEMENT_NODE) {
                    var speedlimitDiv = addedNode.querySelector('div.controls.speed-limit');

                    if (speedlimitDiv) {
                        WMESpeedhelper.makeSigns(speedlimitDiv);
                    }
                }
            }
        });
    });
    speedlimitsObserver.observe(document.getElementById('edit-panel'), { childList: true, subtree: true });

    // Show friendly message to users of unsupported countries (for now)
    WMESpeedhelper.showMessage = function() {
        // Check if this message isn't allready on screen (bugcheck, can't reproduce myself)
        if (!$("#_cnt").length) {
            var mD = document.createElement("div");
            mD.id = '_cnt';
            mD.style.cssText = 'margin:5px 0 10px 0;border:1px solid red;padding:5px;border-radius:5px';

            var mI = document.createElement("img");
            mI.id = '_img';
            mI.style.cssText = 'float:left;margin-right:5px;';
            mI.src = mssimg;

            var mT = document.createElement("div");
            mT.id = '_text';
            mT.innerHTML = '<b><a href="https://greasyfork.org/en/scripts/13774-wme-speedhelper" target="_blank">WME Speedhelper 0.2.0</a></b><br>Your country is currently not supported yet. If you want me to add it, follow <a href="https://greasyfork.org/en/scripts/13774-wme-speedhelper" target="_blank">this link</a> and look for the "missing country?" section in the description.';

            var cleardiv = document.createElement("div");
            cleardiv.id = 'cleardiv';
            cleardiv.style.cssText ='clear:both;margin-bottom:5px;';

            mD.appendChild(mI);
            mD.appendChild(mT);
            mD.appendChild(cleardiv);
            $("div.controls.speed-limit").prepend(mD);
        }
    };

    // The big one...
    WMESpeedhelper.makeSigns = function(reciever) {
        //log("COUNTRY CODE: " + Waze.model.countries.top.abbr);
        var ABBR =  signConfig[Waze.model.countries.top.abbr];

        // Country code not found? Show user friendly message with info to get his/her country added
        if (typeof ABBR == 'undefined') {
            WMESpeedhelper.showMessage();
            return;
        }

        // check if we're not adding to existing signs
        if (!$("#signsholder").length) {
            var signsholder = document.createElement("div");
            signsholder.id = 'signsholder';

            //Get the correct list of speedsigns to make
            ABBR.spd.forEach(function(speed) {
                // The sign background
                var addsign = document.createElement("div");
                addsign.id = 'signsholder';
                
                // Get width/height of sign background img
                var dims = ABBR.dim.split('|');
                addsign.style.cssText = 'cursor:pointer;float:left;width:'+dims[0]+'px;height:'+dims[1]+'x;background-image: url(\''+ ABBR.sgn + '\');';
                addsign.onclick =  function() {
                    $("input[name=fwdMaxSpeed]").val(speed).change();
                    $("input[name=revMaxSpeed]").val(speed).change();
                };

                // The speed value
                var speedvalue = document.createElement("div");
                speedvalue.id = 'spd_'+ speed;
                speedvalue.style.cssText = 'text-align:center;line-height:'+dims[1]+'px;font-size:11px;font-family:\'Varela Round\',sans-serif;color:#000; font-weight:bold;';
                speedvalue.innerHTML = speed;
                addsign.appendChild(speedvalue);
                signsholder.appendChild(addsign);
            });

            // CSS Clear after the floats
            var cleardiv = document.createElement("div");
            cleardiv.id = 'cleardiv';
            cleardiv.style.cssText ='clear:both;margin-bottom:5px;';

            // Add everything to the stage
            signsholder.appendChild(cleardiv);
            $("div.controls.speed-limit").prepend(signsholder);
            log('ready');
        }
    };

    function log(message) {
        if (typeof message === 'string') {
            console.log('WMESpeedhelper: ' + message);
        } else {
            console.log('WMESpeedhelper: ', message);
        }
    }
}

setTimeout(WMESpeedhelper_bootstrap, 3000);