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> 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();