Greasy Fork

Greasy Fork is available in English.

WME LevelReset

Script version of the WME LevelReset tool, to make relocking segments to their appropriate lock level easy & quick. ʕʘ̅͜ʘ̅ʔ

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

此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.greasyfork.icu/scripts/14414/91214/WME%20LevelReset.js

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

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

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         WME LevelReset
// @namespace    [email protected]
// @version      0.1
// @description  Script version of the WME LevelReset tool, to make relocking segments to their appropriate lock level easy & quick. ʕʘ̅͜ʘ̅ʔ
// @author       Broos Gert '2015
// @match        https://editor-beta.waze.com/*editor/*
// @match        https://www.waze.com/*editor/*
// @icon		 data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAA+VBMVEX///93PgHX19fTgQfFZgLLcwTrxYDDgA3nqBj5+fmwr6+Yl5f8/PzExMTl5eX114vv7+/e3t68vLzOzs6saRKARQSLTgeioqK2tbX72XfU1NT515fxz4b54b3RmySYWAv31aTpwIHgrn9/f3/75qPZsEvuuC/utx3psVP13KizbhXuuVj745bfoEzzwzDxwDXTjknpxqDPfhzWih7PhUaObErowqDJchrmqCfprRjbmUvblCLZjAv71WnhnyTfmA7hrmbjsm7qxpPv06vYljj305776MvLkD3XkjFwcHCMi4v6zk/6z1P2wVDYqzr3y3j2xWnrrl761X3u0VhGAAABv0lEQVQ4jZWTXXuaMBiGY7bZQUhIoBaKsIK0KkVqtd+2tJ2gnVJs9f//mAW78uHYwe6TXE+em/flJAD8D0RVdF3HTKqvGcaMAiAQVYd1vaEASikhhFKA1ZoeA8Iwct2lCAnAxl/zdcAMbeGipbtwMQM62xFEFUJtoWEIsbh0CVTF3QGqqrjax2cq4kkkFQFjTJD2eYeXBoa4uoEoBOU/RhBUWHWHJukUCZ9JQFCnWkVAQJRQniREyvGPANA/YzazRhBKwjSOg+DZmdoRZ+r8XAfxr5eo1AfzuW1HljXfYkX2zJ5b8TQXXtbWzPff38x2hvn27qf+zFrHubC39tppGoabjczZHIZpmra9/jgXTn2vnSTJaxgecsLwNRkmsueflgV5eLZarU4y+Lk6G9YIg8HxB4PBYEfY3woZQ0529rjQ3y+Evid3ez9K9LpmWTjqe2b3Ti5xlwlHhRDYzdvvFW5NOyiEAy48Pu2VeHps2sFBIUwi5/6hWeLh3okmhdCajJyLLxUunNGktS0lgdLW+agz/lZh3Bmdt6ggZS/NUBqX152brxVuOteXDZVRafsUrxq1XGHIBb6CwHoY4Tt+A1eiQ8S/AAv7AAAAAElFTkSuQmCC
// @grant        none
// ==/UserScript==


// initialize LevelReset and do some checks
function LevelReset_bootstrap() {
    LevelReset_init();
}

function LevelReset_init() {
    // Check initialisation
    if (typeof Waze == 'undefined' || typeof I18n == 'undefined') {
        setTimeout(LevelReset_init, 660);
        console.log('LevelReset: Waze object unavailable, map still loading');
        return;
    }

    //console.log('LevelReset: Waze - ', Waze);

    function onScreen(obj) {
        if (obj.geometry) {
            return(Waze.map.getExtent().intersectsBounds(obj.geometry.getBounds()));
        }
        return(false);  
    } 

    var UpdateObject = require("Waze/Action/UpdateObject"),
        strt = '',
        fwy_lvl = 5,
        rmp_lvl = 4,
        maj_lvl = 3,
        min_lvl = 2,
        pri_lvl = 1,
        absolute = false,
        fwy_cnt = 0,
        rmp_cnt = 0,
        maj_cnt = 0,
        min_cnt = 0,
        pri_cnt = 0,
        relockObject = null,
        userlevel = Waze.loginManager.user.normalizedLevel,
        relockTab = document.createElement('li'),
        userInfo = document.getElementById('user-info'),
        navTabs = userInfo.querySelector('.nav-tabs'),
        tabContent = userInfo.querySelector('.tab-content'),
        relockContent = document.createElement('div'),
        relockTitle = document.createElement('h4'),
        relockSubTitle = document.createElement('h4'),
        relockScanbutton = document.createElement('input'),
        relockAllbutton = document.createElement('input'),
        relockSub = document.createElement('p'),
        resultsCntr = document.createElement('div'),
        warningCntr = document.createElement('div'),
        readable = {'pri':'Primary Streets (L2)','min':'Minor Highways (L3)', 'maj':'Major Highways (L4)',  'rmp':'Ramps (L5)', 'fwy':'Freeways (L6)'};

    // Begin building
    relockContent.id = 'sidepanel-relockTab';
    relockContent.className = 'tab-pane';
    relockTitle.appendChild(document.createTextNode('Relock segments'));
    relockTitle.style.marginBottom = '5px';
    relockContent.appendChild(relockTitle);
    relockTab.innerHTML = '<a href="#sidepanel-relockTab" data-toggle="tab" title="Relock segments">Re - <span class="icon-lock" id="lockcolor" style="color:green"></span></a>';

    // fill tab
    relockSub.innerHTML = 'Your on-screen area is automatically scanned when you load or pan around. Pressing the lock behind each type will relock only those results, or you can choose to relock all.<br/><br/>You can only relock segments lower or equal to your current editor level.';
    relockSub.style.cssText = 'font-size:85%';
    relockSubTitle.innerHTML = 'Results';
    relockScanbutton.type = 'button';
    relockScanbutton.value = 'Rescan area';
    relockScanbutton.style.cssText = 'margin: 10px 3px 0 0';
    relockScanbutton.onclick = function() {
        scanArea();
    };
    relockAllbutton.type = 'button';
    relockAllbutton.value = 'Relock All';
    relockAllbutton.style.cssText = 'margin: 10px 3px 0 5px';
    relockAllbutton.onclick = function() {
        relockAll();
    };

    // Remember to save
    warningCntr.style.cssText = 'margin-top:15px;border:1px solid #FFBB00;background:#FFE599;color:#664C00;border-radius:5px;padding:10px 5px;text-align:center;font-weight:bold;display:none';
    warningCntr.innerHTML = 'Remember to save these changes!';
    warningCntr.id = 'warningCntr';

    // add to stage
    navTabs.appendChild(relockTab);
    tabContent.appendChild(relockContent);
    relockContent.appendChild(relockSub);
    relockContent.appendChild(relockSubTitle);
    relockContent.appendChild(resultsCntr);
    relockContent.appendChild(relockScanbutton);
    relockContent.appendChild(relockAllbutton);
    relockContent.appendChild(warningCntr);

    // Some functions
    function relock(obj, key) {
        $.each(obj[key], function( id, value ) {
            Waze.model.actionManager.add(value);
        });
        $('#warningCntr:hidden').fadeIn('fast');
        scanArea();
    }

    function relockAll() {
        // only lock "all" until the current editors level is reached, then stop...
        var lvlCnt = 2;

        $.each(relockObject, function( key, value ) {
            // Check for value length & user level
            if(value.length !== 0 && userlevel >= lvlCnt) {
                // loop trough each segment (updateObject)
                $.each(value, function( id, obj ) {
                    Waze.model.actionManager.add(obj);                    
                });
            }
            lvlCnt++;
        });
        $('#warningCntr:hidden').fadeIn('fast');
        scanArea();
    }

    function scanArea() {
        // Object with array of roadtypes, to collect each wrongly locked segment, for later use        
        relockObject = {'pri':[], 'min':[], 'maj':[], 'rmp':[], 'fwy':[]};
        var foundBadlocks = false;
        var count = 0;

        // Do a count on how many segments are in need of a correct lock (limit to 150 to save CPU)
        // Count also depends on the users editor level
        Object.forEach(Waze.model.segments.objects, function(k, v) {
            if (count < 150 && v.type == "segment" && onScreen(v) && v.isGeometryEditable()) {
                // Primary (Lock 2)
                if (v.attributes.roadType == 2 && (v.attributes.lockRank < pri_lvl || (absolute && v.attributes.lockRank != pri_lvl))) {    
                    strt = Waze.model.streets.get(v.attributes.primaryStreetID);
                    relockObject.pri.push(new UpdateObject(v, {lockRank: pri_lvl}));
                    count++;
                    foundBadlocks = true;
                }
                // Minor Highway
                if (v.attributes.roadType == 7 && (v.attributes.lockRank < min_lvl || (absolute && v.attributes.lockRank != min_lvl))) {
                    strt = Waze.model.streets.get(v.attributes.primaryStreetID);
                    relockObject.min.push(new UpdateObject(v, {lockRank: min_lvl}));
                    count++;
                    foundBadlocks = true;
                }
                // Major Highway
                if (v.attributes.roadType == 6 && (v.attributes.lockRank < maj_lvl || (absolute && v.attributes.lockRank != maj_lvl))) {
                    strt = Waze.model.streets.get(v.attributes.primaryStreetID);
                    relockObject.maj.push(new UpdateObject(v, {lockRank: maj_lvl}));
                    count++;
                    foundBadlocks = true;
                }   
                // Ramps
                if (v.attributes.roadType == 4 && (v.attributes.lockRank < rmp_lvl || (absolute && v.attributes.lockRank != rmp_lvl))) {
                    strt = Waze.model.streets.get(v.attributes.primaryStreetID);
                    relockObject.rmp.push(new UpdateObject(v, {lockRank: rmp_lvl}));
                    count++;
                    foundBadlocks = true;
                }
                // Freeways
                if (v.attributes.roadType == 3 && (v.attributes.lockRank < fwy_lvl || (absolute && v.attributes.lockRank != fwy_lvl))) {
                    strt = Waze.model.streets.get(v.attributes.primaryStreetID);
                    relockObject.fwy.push(new UpdateObject(v, {lockRank: fwy_lvl}));
                    count++;
                    foundBadlocks = true;
                }
            }
        });

        // Build result to users tabpanel
        resultsCntr.innerHTML = '';
        var lvlCnt = 2; // start at 2 (pri) because we can't lock lower then 1 :-)

        $.each(relockObject, function( key, value ) {
            var __cntr = document.createElement('div'),
                __keyLeft = document.createElement('div'),
                __lckRight = document.createElement('div'),
                __cntRight = document.createElement('div'),
                __cleardiv = document.createElement("div");                

            // Begin building
            __keyLeft.style.cssText = 'float:left';
            __keyLeft.innerHTML = readable[key];
            __lckRight.className = ((value.length !==0) ? 'icon-lock' : '');
            __cntRight.style.cssText = 'float:right';
            __cntRight.innerHTML =  ((value.length !==0) ? '<b>'+value.length+'</b>' : '-');
            __cleardiv.style.cssText ='clear:both;';

            // only add relock function if the editor's level allows it...
            if (userlevel >= lvlCnt) {
                __lckRight.style.cssText = 'width:15px;float:right;padding:3px 0 0 8px;cursor:pointer;' + ((value.length!== 0) ? 'color:red' : '' );
                __lckRight.onclick = function() {
                    relock(relockObject, key);
                };
            } else {
                // Grey out options to make it more visible
                __lckRight.className = '';
                __keyLeft.style.cssText = 'float:left;color:#777';
                __cntRight.style.cssText = 'float:right;color:#777';
                __lckRight.style.cssText = 'float:right;padding:3px 0 0 8px;color:#777;width:15px';
            }

            // Add to stage
            __cntr.appendChild(__keyLeft);
            __cntr.appendChild(__lckRight);
            __cntr.appendChild(__cntRight);
            __cntr.appendChild(__cleardiv);
            resultsCntr.appendChild(__cntr);
            lvlCnt++;
        });

        // Color the small lock icon red, if errors are found, so people can decide what to do...
        if (foundBadlocks)
            $('#lockcolor').css('color', 'red');
        else
            $('#lockcolor').css('color', 'green');
    }

    // Do a default scan once at startup
    scanArea();

    // Register some eventlisteners
    Waze.map.events.register("moveend", null, scanArea);
    Waze.model.actionManager.events.register("afteraction", null, scanArea);
    Waze.model.actionManager.events.register("afterundoaction", null, scanArea);
    Waze.model.actionManager.events.register("noActions", null, scanArea);
}
setTimeout(LevelReset_bootstrap, 2000);