WME LevelReset

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

Dit script moet niet direct worden geïnstalleerd - het is een bibliotheek voor andere scripts om op te nemen met de meta-richtlijn // @require https://update.greasyfork.org/scripts/14414/134648/WME%20LevelReset.js

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey, Greasemonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals {tampermonkey_link:Tampermonkey}.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Userscripts.

Voor het installeren van scripts heb je een extensie nodig, zoals {tampermonkey_link:Tampermonkey}.

Voor het installeren van scripts heb je een gebruikersscriptbeheerder nodig.

(Ik heb al een user script manager, laat me het downloaden!)

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

(Ik heb al een beheerder - laat me doorgaan met de installatie!)

// ==UserScript==
// @name         WME LevelReset
// @namespace    [email protected]
// @version      0.2.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/*
// @grant        none
// @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
// ==/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;
    }

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

    // Country database --------------------------------------------------------------------------------------------------------------
    var cntryDB = {
        BE:     { str_lvl:0, pri_lvl:1,min_lvl:2, maj_lvl:3,  rmp_lvl:4, fwy_lvl:4}, //--------------------------------- Belgium
        NL:     { str_lvl:0, pri_lvl:1,min_lvl:2, maj_lvl:3,  rmp_lvl:4, fwy_lvl:4}, //--------------------------------- Netherlands
        LU:     { str_lvl:0, pri_lvl:1,min_lvl:2, maj_lvl:3,  rmp_lvl:4, fwy_lvl:4}, //--------------------------------- Luxemburg
        PL:     { str_lvl:0, pri_lvl:1,min_lvl:2, maj_lvl:3,  rmp_lvl:3, fwy_lvl:3},  //--------------------------------- Poland
        TU:     { str_lvl:0, pri_lvl:1,min_lvl:2, maj_lvl:3,  rmp_lvl:4, fwy_lvl:4}  //--------------------------------- Turkey
    };
    // Country database --------------------------------------------------------------------------------------------------------------


    // Setting up all variables
    var UpdateObject = require("Waze/Action/UpdateObject"),
        VERSION = '0.2.0',
        loader = 'data:image/gif;base64,R0lGODlhEAAQAPQAAP///wAAAPj4+Dg4OISEhAYGBiYmJtbW1qioqBYWFnZ2dmZmZuTk5JiYmMbGxkhISFZWVgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH+GkNyZWF0ZWQgd2l0aCBhamF4bG9hZC5pbmZvACH5BAAKAAAAIf8LTkVUU0NBUEUyLjADAQAAACwAAAAAEAAQAAAFUCAgjmRpnqUwFGwhKoRgqq2YFMaRGjWA8AbZiIBbjQQ8AmmFUJEQhQGJhaKOrCksgEla+KIkYvC6SJKQOISoNSYdeIk1ayA8ExTyeR3F749CACH5BAAKAAEALAAAAAAQABAAAAVoICCKR9KMaCoaxeCoqEAkRX3AwMHWxQIIjJSAZWgUEgzBwCBAEQpMwIDwY1FHgwJCtOW2UDWYIDyqNVVkUbYr6CK+o2eUMKgWrqKhj0FrEM8jQQALPFA3MAc8CQSAMA5ZBjgqDQmHIyEAIfkEAAoAAgAsAAAAABAAEAAABWAgII4j85Ao2hRIKgrEUBQJLaSHMe8zgQo6Q8sxS7RIhILhBkgumCTZsXkACBC+0cwF2GoLLoFXREDcDlkAojBICRaFLDCOQtQKjmsQSubtDFU/NXcDBHwkaw1cKQ8MiyEAIfkEAAoAAwAsAAAAABAAEAAABVIgII5kaZ6AIJQCMRTFQKiDQx4GrBfGa4uCnAEhQuRgPwCBtwK+kCNFgjh6QlFYgGO7baJ2CxIioSDpwqNggWCGDVVGphly3BkOpXDrKfNm/4AhACH5BAAKAAQALAAAAAAQABAAAAVgICCOZGmeqEAMRTEQwskYbV0Yx7kYSIzQhtgoBxCKBDQCIOcoLBimRiFhSABYU5gIgW01pLUBYkRItAYAqrlhYiwKjiWAcDMWY8QjsCf4DewiBzQ2N1AmKlgvgCiMjSQhACH5BAAKAAUALAAAAAAQABAAAAVfICCOZGmeqEgUxUAIpkA0AMKyxkEiSZEIsJqhYAg+boUFSTAkiBiNHks3sg1ILAfBiS10gyqCg0UaFBCkwy3RYKiIYMAC+RAxiQgYsJdAjw5DN2gILzEEZgVcKYuMJiEAOwAAAAAAAAAAAA==',
        strt = '',
        fwy_lvl = 4,
        rmp_lvl = 4,
        maj_lvl = 3,
        min_lvl = 2,
        pri_lvl = 1,
        str_lvl = 0,
        absolute = false,
        fwy_cnt = 0,
        rmp_cnt = 0,
        maj_cnt = 0,
        min_cnt = 0,
        pri_cnt = 0,
        str_cnt = 0,
        relockObject = null,
        userlevel = Waze.loginManager.user.normalizedLevel,
        //userlevel = 6, // for testing purposes (NOTE: this does not enable you to lock higher!)
        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('h3'),
        relockSubTitle = document.createElement('h4'),
        relockAllbutton = document.createElement('input'),
        relockSub = document.createElement('p'),
        versionTitle = document.createElement('p'),
        resultsCntr = document.createElement('div'),
        alertCntr = document.createElement('div'),
        hidebutton = document.createElement('div'),
        dotscntr = document.createElement('div'),
        includeAllSegments = document.createElement('input'),
        includeAllSegmentsLabel = document.createElement('label'),
        percentageLoader = document.createElement('div'),
        readable = {'str':'Streets (#)', 'pri':'Primary Streets (#)','min':'Minor Highways (#)', 'maj':'Major Highways (#)',  'rmp':'Ramps (#)', 'fwy':'Freeways (#)'};

    // Begin building
    relockContent.id = 'sidepanel-relockTab';
    relockContent.className = 'tab-pane';
    relockTitle.appendChild(document.createTextNode('Relock segments'));
    relockTitle.style.cssText = 'margin-bottom:0';
    relockTab.innerHTML = '<a href="#sidepanel-relockTab" data-toggle="tab" title="Relock segments">Re - <span class="fa fa-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. Segments locked higher than normal are left alone.';
    relockSub.style.cssText = 'font-size:85%;padding:15px;border:1px solid red;border-radius:5px;position:relative';
    relockSub.id = 'sub';
    hidebutton.style.cssText ='cursor:pointer;width:16px;height:16px;position:absolute;right:3px;top:3px;background-image:url(\'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAAWdEVYdENyZWF0aW9uIFRpbWUAMTEvMjAvMTVnsXrkAAADTUlEQVQ4jW2TW0xbZQCAv3ODnpYWegEGo1wKwzBcxAs6dONSjGMm3kjmnBqjYqLREE2WLDFTIBmbmmxRpzHy4NPi4zRLfNBlZjjtnCEaOwYDJUDcVqC3UzpWTkt7fp80hvk9f/nePkkIwWb+gA5jMXLQjK50Zc2cuKVp4wlX2UevtAYubnal/waWoTI1N38keu7ck2uTl335ZFJCkpE8XlGob4ibgeZvMl7P8MtdO6/dFohDe/Sn0LdzJ457MuHfUYqLkYtsSIqMJASyIiNv30Gm6+G1zNbqvpf6gqF/AwaUXx+/MDdz6KArH4ujVVRAbgPVroMsQz6P6nJiGUnUGj/pR/tTyx2dtW+11t2UAa5Pz34w//GHLitpsG1wkODp0xQ11GOZJpgmzq5uqo8ew76zAxFPUDJxscwzFR4BkGfh/tj58/3Zq9OoFZU0PHsAd00NnWNj6IEApd3duA48g2nXKenpQSl1oceWsUeuPfdp+M9GZf/zA5+lz3x9lxRbAUli+dIlKnt7Ud1uCk1NJH0+VnMmq6EQfw0NUzCSULBQfT4HVf4iNRO50VlIGSi6jup0sj5zlTO7d9N48iRLa2vkCwWsyTArbx/GAaSBm/MLyLm85OjZs0c2zawQsoRmt5NeXCRyeRLh9rBkGBSEwF6i09h+L96GemyAx2bDK4ENkGRJkbM2fVy4PRhT08RmZvH09VE29C6ixEFuahL3hklLby9PhEKUt7VRZln4kHD669Bqtl6Q7W07jqWL9FQiEkHTdUoGBsgXF5EPh0m8M8Tc62/CSoLSqmqaR4ZxaRpenxfbgw8lCy2Nx5Uv3xuNXEll7shO/HI38Rjr09NImkriyCgOy0JZTZM4+x3C7SY+epTaLZWsdwXJPNV/6jF/9ReSEIKzmcKWpbHPF9OHDxUr6xksoAiQJAmnpuEWAqeq4G9uRr7nPpZeeDG10NqybV+5Ly4DPGJXlsv79u51v38iK22/EwmwACEEIpdD2tjApmncan8A49XX4qtNgeC+cl/8tpm+jxoBY+K3N7I/jj+dvxKuIhZV7KpKWV295dy1K6YEg1/NO2wj+/210f+98R9+hub0wo1BOZnslRVV16orf0hVeD55HH7d7P4N0V1gY9/zcaEAAAAASUVORK5CYII=\');'; 
    hidebutton.onclick = function() {
        localStorage.msgHide = 1;
        $('#sub').hide('slow');
    };    
    dotscntr.style.cssText = 'width:16px;height:16px;margin-left:5px;background:url("'+ loader + '");vertical-align:text-top;display:none';
    dotscntr.id = 'dotscntr';
    relockSubTitle.innerHTML = 'Results';
    versionTitle.innerHTML = 'Version ' + VERSION;
    versionTitle.style.cssText = 'margin:2px;font-size:85%;font-weight:bold';
    relockAllbutton.type = 'button';
    relockAllbutton.value = 'Relock All';
    relockAllbutton.style.cssText = 'margin: 10px 3px 0 0';
    relockAllbutton.onclick = function() {
        relockAll();
    };

    // Also reset higher locked segments?
    includeAllSegments.type = 'checkbox';
    includeAllSegments.name = "name";
    includeAllSegments.value = "value";
    includeAllSegments.id = "_allSegments"; 
    includeAllSegments.onclick = function() { 
        scanArea();
        relockShowAlert();
    };
    includeAllSegmentsLabel.htmlFor = "_allSegments";
    includeAllSegmentsLabel.innerHTML = 'Also reset higher locked segments';
    includeAllSegmentsLabel.style.cssText = 'font-size:95%;margin-left:5px;vertical-align:middle';

    // Alert box
    alertCntr.id = "alertCntr";
    alertCntr.style.cssText = 'border:1px solid #EBCCD1;background-color:#F2DEDE;color:#AC4947;font-weight:bold;font-size:90%;border-radius:5px;padding:10px;margin:5px 0;display:none';
    alertCntr.innerHTML = 'Watch out for map exceptions, some higher locks are there for a reason!';

    // add to stage
    navTabs.appendChild(relockTab);
    tabContent.appendChild(relockContent);
    relockContent.appendChild(relockTitle);
    relockContent.appendChild(versionTitle);

    // Loader bar
    percentageLoader.id = 'percentageLoader';
    percentageLoader.style.cssText = 'width:1px;height:10px;background-color:green;margin-top:10px;border:1px solid:#333333;display:none';

    // only show if user didn't hide it before 
    if (localStorage.msgHide != 1) {
        relockSub.appendChild(hidebutton);
        relockContent.appendChild(relockSub);
    }
    relockContent.appendChild(includeAllSegments);
    relockContent.appendChild(includeAllSegmentsLabel);
    relockContent.appendChild(alertCntr);
    relockContent.appendChild(relockSubTitle);
    relockContent.appendChild(resultsCntr);
    relockContent.appendChild(relockAllbutton);
    relockContent.appendChild(dotscntr);
    relockContent.appendChild(percentageLoader);

    // Some functions
    function relock(obj, key) {
        var objects = obj[key];
        var _i = 0;

        // update GUI
        function RunLocal() {
            Waze.model.actionManager.add(objects[_i]);
            _i++;

            if (_i < objects.length) {
                setTimeout(RunLocal, 1);
                var newWidth = (_i / objects.length) * $('#sidepanel-relockTab').css('width').replace('px', '');
                $('#percentageLoader').show();
                $('#percentageLoader').css('width', newWidth + 'px');
                $('#dotscntr').css('display', 'inline-block');
            } else {
                $('#dotscntr').css('display', 'none');
                $('#percentageLoader').hide();
            }
        }
        RunLocal();
    }   

    function relockAll() {
        // only lock "all" until the current editors level is reached, then stop...
        $('#dotscntr').css('display', 'inline-block');

        $.each(relockObject, function( key, value ) {
            if (value.length !== 0) {
                // loop trough each segmentType
                var _i = 0;
                var RunLocal5 = function() {
                    Waze.model.actionManager.add(value[_i]);
                    _i++;

                    // Did not iterate with $.each, so the GUI can update with larger arrays
                    if (_i < value.length) {
                        setTimeout(RunLocal5, 1);
                        var newWidth = (_i / value.length) * $('#sidepanel-relockTab').css('width').replace('px', '');
                        $('#percentageLoader').show();
                        $('#percentageLoader').css('width', newWidth + 'px');
                        $('#dotscntr').css('display', 'inline-block');
                    } else {
                        $('#dotscntr').css('display', 'none');
                        $('#percentageLoader').hide(); 
                    }
                };
                RunLocal5();
            }
        });
        scanArea();
        $('#dotscntr').hide('slow');
    }

    function relockShowAlert() {
        if (includeAllSegments.checked)
            $('#alertCntr').show("fast");
        else
            $('#alertCntr').hide("fast");
    }

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

        // Choose country lock settings. If country selection fails 
        // or country isn't in this list, WME default values are used.
        try {
            var ABBR =  cntryDB[Waze.model.countries.top.abbr];
            fwy_lvl = ABBR.fwy_lvl;
            rmp_lvl = ABBR.rmp_lvl;
            maj_lvl = ABBR.maj_lvl;
            min_lvl = ABBR.min_lvl;
            pri_lvl = ABBR.pri_lvl;
            str_lvl = ABBR.str_lvl;        
            console.log("LevelReset: ", ABBR);        
        } catch(err) {
            console.log("LevelReset ERROR: ", err);
        }

        // 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
        $.each(Waze.model.segments.objects, function( k, v ) {
            if (count < 150 && v.type == "segment" && onScreen(v) && v.isGeometryEditable()) {
                strt = Waze.model.streets.get(v.attributes.primaryStreetID);

                // Street (L1)
                if (v.attributes.roadType == 1) {
                    if (v.attributes.lockRank > str_lvl && includeAllSegments.checked) {
                        relockObject.str.push(new UpdateObject(v, {lockRank: str_lvl}));
                        foundBadlocks = true;
                        count++;
                    }                
                }            
                // Primary (L2)
                if (v.attributes.roadType == 2 && (userlevel >= (pri_lvl+1)) ) {
                    if (v.attributes.lockRank < pri_lvl) {
                        relockObject.pri.push(new UpdateObject(v, {lockRank: pri_lvl}));
                        foundBadlocks = true;
                        count++;
                    }
                    if (v.attributes.lockRank > pri_lvl && includeAllSegments.checked) {
                        relockObject.pri.push(new UpdateObject(v, {lockRank: pri_lvl}));
                        foundBadlocks = true;
                        count++;
                    }
                }
                // Minor Highway (L3)
                if (v.attributes.roadType == 7 && (userlevel >= (min_lvl+1)) ) {
                    if (v.attributes.lockRank < min_lvl) {
                        relockObject.min.push(new UpdateObject(v, {lockRank: min_lvl}));
                        foundBadlocks = true;
                        count++;
                    }
                    if (v.attributes.lockRank > min_lvl && includeAllSegments.checked) {
                        relockObject.min.push(new UpdateObject(v, {lockRank: min_lvl}));
                        foundBadlocks = true;
                        count++;
                    }
                }
                // Major Highway (L4)
                if (v.attributes.roadType == 6 && (userlevel >= (maj_lvl+1)) ) {
                    if (v.attributes.lockRank < maj_lvl) {
                        relockObject.maj.push(new UpdateObject(v, {lockRank: maj_lvl}));
                        foundBadlocks = true;
                        count++;
                    }
                    if (v.attributes.lockRank > maj_lvl && includeAllSegments.checked) {
                        relockObject.maj.push(new UpdateObject(v, {lockRank: maj_lvl}));
                        foundBadlocks = true;
                        count++;
                    }
                }                
                // Ramps (L5)
                if (v.attributes.roadType == 4 && (userlevel >= (rmp_lvl+1)) ) {
                    if (v.attributes.lockRank < rmp_lvl) {
                        relockObject.rmp.push(new UpdateObject(v, {lockRank: rmp_lvl}));
                        foundBadlocks = true;
                        count++;
                    }
                    if (v.attributes.lockRank > rmp_lvl && includeAllSegments.checked) {
                        relockObject.rmp.push(new UpdateObject(v, {lockRank: rmp_lvl}));
                        foundBadlocks = true;
                        count++;
                    }
                }   
                // Freeways (L5)
                if (v.attributes.roadType == 3  && (userlevel >= (fwy_lvl+1)) ) {
                    if (v.attributes.lockRank < fwy_lvl) {
                        relockObject.fwy.push(new UpdateObject(v, {lockRank: fwy_lvl}));
                        foundBadlocks = true;
                        count++;
                    }
                    if (v.attributes.lockRank > fwy_lvl && includeAllSegments.checked) {
                        relockObject.fwy.push(new UpdateObject(v, {lockRank: fwy_lvl}));
                        foundBadlocks = true;
                        count++;
                    }
                }
            }
        });

        // Build result to users tabpanel
        resultsCntr.innerHTML = '';
        var lvlCnt;
        if (includeAllSegments.checked)
            lvlCnt = 1;
        else
            lvlCnt = 2;

        $.each(relockObject, function( key, value ) {
            // Only show streets (L1) if needed -> checkbox checked. L1 streets cannot be locked too low, only too high :)
            if (key == 'str' && !includeAllSegments.checked) {
                return;
            }

            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].replace('#', 'Lock ' + (eval(key+'_lvl')+1)); // No eval is not evil :)
            __lckRight.className = ((value.length !==0) ? 'fa fa-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 < 5) {
                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';
                }
            }
            else
            {
                // User is an L5/L6 so he can edit all road types (exceptions possible)
                __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);
                };
            }

            // 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) {
            relockAllbutton.removeAttribute('disabled');
            $('#lockcolor').css('color', 'red');
        } else {
            relockAllbutton.setAttribute('disabled', true);
            $('#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);