Greasy Fork is available in English.

WME Permalink Selector

Shows Permalinks or Segments ID's on the map and colorizes a level of segments.

// ==UserScript==
// @name                WME Permalink Selector
// @description         Shows Permalinks or Segments ID's on the map and colorizes a level of segments.
// @include             https://www.waze.com/editor/*
// @include             https://www.waze.com/*/editor/*
// @include             https://editor-beta.waze.com/*
// @version             1.0.5.1
// @grant               none
// @namespace           https://greasyfork.org/scripts/3931-wme-permalink-selector
// ==/UserScript==


/* Original wlodek76's version 1.0.5 adapted to WME v1.6-297 by FZ69617 */


var wmech_version = "1.0.5.1"

var loadcount = 0;

//------------------------------------------------------------------------------------------------
function bootstrapPermalinkSelector()
{
    var bGreasemonkeyServiceDefined = false;
    
    try {
        bGreasemonkeyServiceDefined = (typeof Components.interfaces.gmIGreasemonkeyService === "object");
    }
    catch (err) { /* Ignore */ }
    
    if (typeof unsafeWindow === "undefined" || ! bGreasemonkeyServiceDefined) {
        unsafeWindow    = ( function () {
            var dummyElem = document.createElement('p');
            dummyElem.setAttribute('onclick', 'return window;');
            return dummyElem.onclick();
        }) ();
    }
    
    setTimeout(initialisePermalinkHighlight, 999);

	window.addEventListener("beforeunload", savePermalink, false);
}
//------------------------------------------------------------------------------------------------
function savePermalink() {
    var segobj = document.getElementById('permalink_id_content');
    if (segobj != null) {
    	var segstr = segobj.value;
        
        localStorage.setItem("PermalinkSegmentContent", segstr);
	}
}
//---------------------------------------------------------------------------------------
function loadPermalink() {
    var segobj = document.getElementById('permalink_id_content');
    if (segobj != null) {
        if (loadcount == 0) {
            loadcount++;
            if (localStorage.PermalinkSegmentContent) segobj.value = localStorage.PermalinkSegmentContent;
        }
    }
}
//---------------------------------------------------------------------------------------
function highlightPermalink() {
    
    var showLevels = getId('_cbShowRoadLevels').checked;
    
    var segobj = document.getElementById('permalink_id_content');

    loadPermalink();

    var segstr = segobj.value;
    var seglines = new Array();
    if (segstr.length > 0) {

        var obj = document.getElementById('sidepanel-permalink-tab');
        if (obj.innerHTML == "Permalink") obj.innerHTML = "Permalink*";
        
        var p = segstr.indexOf("segments=");
        if (p >= 0) {
            
            var newstr = "";
            
            var q = segstr.indexOf("segments=");
            while (q >= 0) {
                var q1 = segstr.indexOf("\n", q + 1);
                var q2 = segstr.indexOf("http", q + 1);
                var q3 = segstr.indexOf('&', q + 1);
                
                var qmax = 99999999;
                if (q1 >=0 && q1 < qmax) qmax = q1;
                if (q2 >=0 && q2 < qmax) qmax = q2;
                if (q3 >=0 && q3 < qmax) qmax = q3;
                if (q1 == -1 && q2 == -1 && q3 == -1) qmax = segstr.length;
                
                //console.log(q, qmax, q1, q2, q3);
                
                newstr += segstr.substr(q+9, qmax - (q+9)) + ",";
                
                q = segstr.indexOf("segments=", q + 1);
            }
            
            segstr = newstr;
        }
        
        segstr = segstr.replace(/\n/g, ",");
        segstr = segstr.replace(/\s+/g, '');
        seglines = segstr.split(",");
    }
    else {
        var obj = document.getElementById('sidepanel-permalink-tab');
        if (obj.innerHTML == "Permalink*") obj.innerHTML = "Permalink";
    }        
    
    var numDays    = 0;

    var objnumRecentDays   = getId('permalink_numRecentDays');
    
    if (objnumRecentDays != undefined) {
        var numDays = objnumRecentDays.value;
        if (numDays === undefined) numDays = 0;
    }

    var tNow = new Date();
    var before = tNow.getTime() - (numDays * 86400000);
    before = before - ( before % 3600000 );
    var beforeTime = new Date();
    beforeTime.setTime(before /*+ tNow.getTimezoneOffset() * 60 * 1000*/ );
    if (numDays == 0) 	getId('permalink_date_before').innerHTML = '';
    else 				getId('permalink_date_before').innerHTML = 'After: ' + beforeTime.toLocaleString().trim();

    for (var seg in Waze.model.segments.objects) {
        var segment = Waze.model.segments.get(seg);
        var attributes = segment.attributes;
        var line = getId(segment.geometry.id);
        
        if (line !== null) {
            var sid 		= attributes.primaryStreetID;
            var street 		= Waze.model.streets.get(sid);
            var level   	= attributes.level;
            var segid 		= segment.attributes.id;
            
            var lineColor 	= line.getAttribute("stroke");
            var lineWidth 	= line.getAttribute("stroke-width");
            var opacity 	= line.getAttribute("stroke-opacity");
            
            var newColor 	= lineColor;
            var newWidth 	= lineWidth;
            var newOpacity 	= opacity;
            
            var reset = 0;
            var RecentlyUpdatedGreen = 0;
            var RecentlyCreatedGreen = 0;
            
           
			var updatedOn   = new Date(attributes.updatedOn);
			var createdOn   = new Date(attributes.createdOn);
            if (numDays > 0 && updatedOn.getTime() >= before) RecentlyUpdatedGreen = 1;
            if (numDays > 0 && createdOn.getTime() >= before) RecentlyCreatedGreen = 1;
            
            // check that WME hasn't highlighted this segment (better method)
            var selected = 0;
            if (segment.renderIntent == "highlight") 		 selected = 1;
            if (segment.renderIntent == "select")    		 selected = 1;
            if (segment.renderIntent == "highlightselected") selected = 1;
            
            // check for WME Highlights errors and do not affect their colors
            if (lineColor == "#ff0") selected = 1;  //segments has soft-turns (yellow)
            if (lineColor == "#f0f") selected = 1;  //segment has reverse connections (purple)
            if (lineColor == "#0ff") selected = 1;
            
            if (selected) {
                continue;
            }

            if (showLevels) {
                newWidth = 9;
                if (level == null || level == undefined) newColor = "#40C040";
                else {
                    level = parseInt(level);
                    if (level <= -3)   newColor = "#040484";
                    if (level == -2)   newColor = "#0404C4";
                    if (level == -1)   newColor = "#0404FC";
                    if (level == 0)  { newColor = "#848484"; newWidth = 4; }
                    if (level == 1)    newColor = "#FC8404";
                    if (level == 2)    newColor = "#FC0404";
                    if (level == 3)    newColor = "#FC04FC";
                    if (level >= 4)    newColor = "#840484";
                }
                newOpacity = 1;
            }
            else {
                if (newColor == "#040484") reset = 1;
                if (newColor == "#0404C4") reset = 1;
                if (newColor == "#0404FC") reset = 1;
                if (newColor == "#848484") reset = 1;
                if (newColor == "#FC8404") reset = 1;
                if (newColor == "#FC0404") reset = 1;
                if (newColor == "#FC04FC") reset = 1;
                if (newColor == "#840484") reset = 1;
            }
            
            var nsel = 0;
            
            if (seglines.length > 0) {
                for(var i=0; i<seglines.length; i++) {
                    if (seglines[i] == segid) { nsel++; }
                }
			}
            
            if (nsel == 0) {
                if (newColor == "#f1125c") reset = 1;
                if (newColor == "#0056ff") reset = 1;
                if (newColor == "#ff7802") reset = 1;
                if (newColor == "#ff02f0") reset = 1;
            }
            else if (nsel == 1) {
                if (RecentlyUpdatedGreen == 0) newColor = "#0056ff";
                if (RecentlyUpdatedGreen == 1) newColor = "#ff7802";
                if (RecentlyCreatedGreen == 1) newColor = "#ff02f0";
                newWidth = 9;
                newOpacity = 0.8;
            }
            else if (nsel >= 2) {
                newColor = "#f1125c";
                newWidth = 9;
                newOpacity = 0.8;
            }

                
            if (reset) {
                newColor 	= "#dd7700";
                newWidth 	= 8;            
                newOpacity 	= 0.001;
            }
            
            if (newColor != lineColor) {
                line.setAttribute("stroke", newColor);
                line.setAttribute("stroke-width", newWidth);
                line.setAttribute("stroke-opacity", newOpacity);
            }
        }
    }
}
//--------------------------------------------------------------------------------------------------------
function getElementsByClassName(classname, node) {
    if(!node) node = document.getElementsByTagName("body")[0];
    var a = [];
    var re = new RegExp('\\b' + classname + '\\b');
    var els = node.getElementsByTagName("*");
    for (var i=0,j=els.length; i<j; i++)
        if (re.test(els[i].className)) a.push(els[i]);
        return a;
}
//--------------------------------------------------------------------------------------------------------
function getId(node) {
    return document.getElementById(node);
}
//--------------------------------------------------------------------------------------------------------
function initialisePermalinkHighlight()
{
    var addon 		= document.createElement('section');
    addon.id 		= "permalink-addon";
    addon.innerHTML = '<b style="margin:0px; padding:0px;"><a href="https://greasyfork.org/scripts/5404-wme-permalink-selector" target="_blank"><u>WME Permalink Selector</u></a></b> &nbsp; v' + wmech_version;
    var tooltip1 = 'title="Selects segments or permalinks on the map."';
    var tooltip2 = 'title="Selects segments edited before specified date."';
    var tooltip3 = 'title="Selects segments created before specified date."';
    var tooltip4 = 'title="Marks ID of segments which exists more then once on the list."';
    
    var section = document.createElement('p');
    section.id 					= "permalinkSection";
    section.innerHTML  			= ''
    + '<input type="checkbox" id="_cbShowRoadLevels" style="margin-left:8px; margin-top:16px;" > Road Levels</input>'
    + '<br><br>'
    + '<b>Permalink Selector:</b>'
    + '<textarea   id="permalink_id_content"    style="width:280px; height:150px; " placeholder="Paste Segments ID\'s or Permalinks here" ></textarea>'
    + '<br><div ' + tooltip1 + ' style="margin-left:4px;position:relative;top:+3px;display:inline-block;width:16px;height:16px;background-color:#0056ff;"></div> - selected segments'
    + '<br><div ' + tooltip2 + ' style="margin-left:4px;position:relative;top:+3px;display:inline-block;width:16px;height:16px;background-color:#ff7802;"></div> - recently edited segments'
    + '<br><div ' + tooltip3 + ' style="margin-left:4px;position:relative;top:+3px;display:inline-block;width:16px;height:16px;background-color:#ff02f0;"></div> - recently created segments'
    + '<br><div ' + tooltip4 + ' style="margin-left:4px;position:relative;top:+3px;display:inline-block;width:16px;height:16px;background-color:#f1125c;"></div> - doubled segments'
    + '<br><br>Recently Edited/Created: <input type="number" step="1" min="0" max="30" size="2" value="5" id="permalink_numRecentDays" style=""/> days'
    + '<div id="permalink_date_before" style="xborder: 1px solid red; margin:0px; padding:0px; text-align:left; " ><div>'
    ;
    addon.appendChild(section);
    
    var userTabs = getId('user-info');
    var navTabs = getElementsByClassName('nav-tabs', userTabs)[0];
    var tabContent = getElementsByClassName('tab-content', userTabs)[0];
    
    newtab = document.createElement('li');
    newtab.innerHTML = '<a id=sidepanel-permalink-tab href="#sidepanel-permalink" data-toggle="tab">Permalink</a>';
    navTabs.appendChild(newtab);
    
    addon.id = "sidepanel-permalink";
    addon.className = "tab-pane";
    tabContent.appendChild(addon);
    
    window.setInterval(highlightPermalink, 333);
    
    Waze.map.events.register("zoomend", null, highlightPermalink);
}
//--------------------------------------------------------------------------------------------------------------
bootstrapPermalinkSelector();