WME Rapid House Numbers

Another House Number script. Adds its controls to the House Number editor.

当前为 2017-12-02 提交的版本,查看 最新版本

/* global GM_info */
/* global W */
/* global Waze */
/* global I18n */
/* global unsafeWindow */

// ==UserScript==
// @name           WME Rapid House Numbers
// @description    Another House Number script.  Adds its controls to the House Number editor.
// @namespace      http://compsol.cc
// @version        0.1
// @match          https://beta.waze.com/*editor*
// @match          https://editor-beta.waze.com/*editor*
// @match          https://www.waze.com/*editor*
// @exclude        https://www.waze.com/user/editor*
// @author         Kevin Greiner 2017 (kjg53)
// @license        MIT
// ==/UserScript==

(function() {
    var scriptName = GM_info.script.name;
    var version = GM_info.script.version;
    var oWaze=Waze;
    var oI18n=I18n;

    console.log("Initializing " + scriptName);

    {
        var changeLog = [
            {version: "0.1", message: scriptName + ": Beta version with limited distribution"},
        ];

        var versionKey = scriptName.replace( /\s/g, "") + "Version";
        var previousVersion = localStorage.getItem(versionKey);

        var i = 0;
        if (previousVersion) {
            while (changeLog[i++].version != previousVersion) {}
        }

        var announcement;
        while (i < changeLog.length) {
            var log = changeLog[i++];
            var msg = "V" + log.version + ": " + log.message;
            announcement = (announcement ? announcement + "\n" + msg : msg);
        }

        if (announcement) {
            alert(announcement);
            localStorage.setItem(versionKey, version);
        }
    }

    function rapidHN_bootstrap() {
        if (typeof unsafeWindow !== "undefined")
        {
            oWaze=unsafeWindow.Waze;
            oI18n=unsafeWindow.I18n;
        }

        if (typeof oWaze === "undefined" || typeof oWaze.map === "undefined" || typeof oWaze.selectionManager === "undefined" || typeof oI18n === "undefined" || typeof oI18n.translations === "undefined")
        {
            console.log(scriptName + " dependencies not ready. Waiting...");
            setTimeout(rapidHN_bootstrap, 500);
            return;
        }

        setTimeout(initialize, 999);
    }

    function initialize() {
        var observeHouseNumbersLayer;
        var addHouseNumber;

        function addAccelerator() {
            addHouseNumber && addHouseNumber.click();
        }

        console.log(scriptName + " initializing.");

        oI18n.translations[oI18n.locale].keyboard_shortcuts.groups['default'].members.RapidHN_new = oI18n.t("toolbar.add_house_numbers");
        oI18n.translations[oI18n.locale].keyboard_shortcuts.groups['default'].members.RapidHN_info = 'Set the next and increment fields to non-zero numbers to inject a house number as soon as the location is selected.  The letter "a" will also be available as an accelerator.';
        oWaze.accelerators.addAction("RapidHN_new", {group: 'default'});

        var obs = new MutationObserver(function(mutations, observer) {
            var div = $('div#edit-buttons div');
            var foundControls = $('.rapidHN-control', div);
            addHouseNumber = $('.add-house-number', div);

            if (addHouseNumber.length) {
                if (!foundControls.length) {
                    addHouseNumber.after('<div class="toolbar-button rapidHN-control" style="float:left; padding-right: 3px; color: grey"><span class="menu-title" style="color: inherit">Next #</span><input type="number" name="nextHN" id="rapidHN-next" style="margin: 3px; height:20px; width: 64px; text-align: right; color: inherit"></div>',
                                    '<div class="toolbar-button rapidHN-control" style="float:left; color: grey"><span class="menu-title" style="text-align: right; color: inherit">Increment</span><input type="number" name="incrementHN" id="rapidHN-increment" value="4" style="margin: 3px; height:20px; width: 44px; text-align: right; color: inherit" step="1"></div>',
'<img id="rapidHN-help" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAIAAADZrBkAAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAJgSURBVDhPbZPPa1NBEMdn9+3LS16S5lWql0qReLAg4rUqiDcP9uKpHqQHq4jWkyAi+CeIJxGFIiiI4LFWRS/Sk3gqij2oJIpFUWqal6YmeT/H776NxogDCbuz38+b2ZlZ0Wg0aNgqI2XLIhLZhilJqLXZzjYDG8I0oIhjWqondZ/hqXpiumoJRUk8BA+wbV4ZEU49ju6txqWcsLJoCdNWyLN71Z1jNiJv+H2yj4HpRrTrdpAyl2x9gFjMJDN4K8JCfDrrFOw+KfFDbogDRkkwAkCjywkLS4r1DqdMcOIIAsi02GC4z9yTCHEcCwxvBvR0xl2bL9bPFV/OFoGZI/xDBrHGNJ3Q3bexya0T0ZWDzqGd6vKLYP55sG+HvDSVgxMGAWQQA5Go9aNaUrQFDGdKUq2Z3loJF15Hi+9jeDxHppoiCCCDGIhEujVfq43llVj8EF1dDsKEHx7Pw3PtVehmicD0R33dUi1Hxf42kHDcPJo/MK4O3+9+76TKtD4zI5aodLVCicnjt8UpT42rB6vhyrfYVTo944cMYiAijkJ8wLnenSijN+aUooRHC6IdoN2sTO+yOJ/baXCxAJnEyCibTkxaP6NBrhs9fjNXWj7ptoKBE4KZSQtiIHpKvKyD22/0Copy2VBBcWa//aXNzz7GuCo8qFA3pvULuki+wbDCcP3o8J6FAFTWDE1ircvDeo3hfHfaGXPFYLhg2IwVxdfz+SMTcq2dNnt6pqKUsMAWThxB8O8oGxsdKeONtDq8VEvrvi5u1ZPTu2XFFXhNzf8+nD+Gq8ps8Iylsb5Mf2OM6Bc9JDhpKCzFQAAAAABJRU5ErkJggg==" style="margin-top: 13px"/>',
'<div id="rapidHN-info" title="Rapid House Numbers">' +
                                         oI18n.translations[oI18n.locale].keyboard_shortcuts.groups['default'].members.RapidHN_info + '</div>');

                    $("#rapidHN-info").dialog({autoOpen: false});
                    $("#rapidHN-help").click(function() {
                        $("#rapidHN-info").dialog("open");
                        return false;
                    });

                    var controls = $('div.rapidHN-control');
                    $('input', controls).on('change', function(event) {
                        var active = true;
                        $('input', controls).each(function() {
                            if (active) {
                                var i = parseInt($(this).val(), 10);
                                active = !isNaN(i) && i != 0;
                            }
                        });

                        if (active) {
                            if ('black' != controls.css('color')) {
                                controls.css('color', 'black');

                                oWaze.accelerators.events.register("RapidHN_new", null, addAccelerator);
                                oWaze.accelerators._registerShortcuts({ 'a' : "RapidHN_new"});

                                observeHouseNumbersLayer = new MutationObserver(function(mutations, observer){
                                    mutations.forEach(function(mutation) {
                                        var input = $('div.olLayerDiv.house-numbers-layer div.house-number div.content.active:not(".new") input.number');
                                        if (input.val() == "") {
                                            var next = $('input#rapidHN-next');
                                            var n = parseInt(next.val());
                                            var inc = $('input#rapidHN-increment');
                                            var i = parseInt(inc.val());
                                            input.val(n).change();
                                            next.val(n + i);
                                        }
                                    });
                                });
                                observeHouseNumbersLayer.observe( $('div.olLayerDiv.house-numbers-layer')[0], { childList:false, subtree:true, attributes: true });
                            }
                        } else {
                            if ('grey' != controls.css('color')) {
                                controls.css('color', 'grey');

                                if (observeHouseNumbersLayer != undefined) {
                                    oWaze.accelerators.events.unregister("RapidHN_new", null, addAccelerator);
                                    oWaze.accelerators._registerShortcuts({ 'a' : null});
                                    observeHouseNumbersLayer.disconnect();
                                    observeHouseNumbersLayer = undefined;
                                }
                            }
                        }
                    });
                }
            }
        });
        // have the observer observe for changes in children
        obs.observe( $('div#edit-buttons')[0], { childList:true, subtree:false });

        console.log(scriptName + " initialized.");
    }

    rapidHN_bootstrap();
})();