WME Permalink Selector

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

  1. // ==UserScript==
  2. // @name WME Permalink Selector
  3. // @description Shows Permalinks or Segments ID's on the map and colorizes a level of segments.
  4. // @include https://www.waze.com/editor/*
  5. // @include https://www.waze.com/*/editor/*
  6. // @include https://editor-beta.waze.com/*
  7. // @version 1.0.5.1
  8. // @grant none
  9. // @namespace https://greasyfork.org/scripts/3931-wme-permalink-selector
  10. // ==/UserScript==
  11.  
  12.  
  13. /* Original wlodek76's version 1.0.5 adapted to WME v1.6-297 by FZ69617 */
  14.  
  15.  
  16. var wmech_version = "1.0.5.1"
  17.  
  18. var loadcount = 0;
  19.  
  20. //------------------------------------------------------------------------------------------------
  21. function bootstrapPermalinkSelector()
  22. {
  23. var bGreasemonkeyServiceDefined = false;
  24. try {
  25. bGreasemonkeyServiceDefined = (typeof Components.interfaces.gmIGreasemonkeyService === "object");
  26. }
  27. catch (err) { /* Ignore */ }
  28. if (typeof unsafeWindow === "undefined" || ! bGreasemonkeyServiceDefined) {
  29. unsafeWindow = ( function () {
  30. var dummyElem = document.createElement('p');
  31. dummyElem.setAttribute('onclick', 'return window;');
  32. return dummyElem.onclick();
  33. }) ();
  34. }
  35. setTimeout(initialisePermalinkHighlight, 999);
  36.  
  37. window.addEventListener("beforeunload", savePermalink, false);
  38. }
  39. //------------------------------------------------------------------------------------------------
  40. function savePermalink() {
  41. var segobj = document.getElementById('permalink_id_content');
  42. if (segobj != null) {
  43. var segstr = segobj.value;
  44. localStorage.setItem("PermalinkSegmentContent", segstr);
  45. }
  46. }
  47. //---------------------------------------------------------------------------------------
  48. function loadPermalink() {
  49. var segobj = document.getElementById('permalink_id_content');
  50. if (segobj != null) {
  51. if (loadcount == 0) {
  52. loadcount++;
  53. if (localStorage.PermalinkSegmentContent) segobj.value = localStorage.PermalinkSegmentContent;
  54. }
  55. }
  56. }
  57. //---------------------------------------------------------------------------------------
  58. function highlightPermalink() {
  59. var showLevels = getId('_cbShowRoadLevels').checked;
  60. var segobj = document.getElementById('permalink_id_content');
  61.  
  62. loadPermalink();
  63.  
  64. var segstr = segobj.value;
  65. var seglines = new Array();
  66. if (segstr.length > 0) {
  67.  
  68. var obj = document.getElementById('sidepanel-permalink-tab');
  69. if (obj.innerHTML == "Permalink") obj.innerHTML = "Permalink*";
  70. var p = segstr.indexOf("segments=");
  71. if (p >= 0) {
  72. var newstr = "";
  73. var q = segstr.indexOf("segments=");
  74. while (q >= 0) {
  75. var q1 = segstr.indexOf("\n", q + 1);
  76. var q2 = segstr.indexOf("http", q + 1);
  77. var q3 = segstr.indexOf('&', q + 1);
  78. var qmax = 99999999;
  79. if (q1 >=0 && q1 < qmax) qmax = q1;
  80. if (q2 >=0 && q2 < qmax) qmax = q2;
  81. if (q3 >=0 && q3 < qmax) qmax = q3;
  82. if (q1 == -1 && q2 == -1 && q3 == -1) qmax = segstr.length;
  83. //console.log(q, qmax, q1, q2, q3);
  84. newstr += segstr.substr(q+9, qmax - (q+9)) + ",";
  85. q = segstr.indexOf("segments=", q + 1);
  86. }
  87. segstr = newstr;
  88. }
  89. segstr = segstr.replace(/\n/g, ",");
  90. segstr = segstr.replace(/\s+/g, '');
  91. seglines = segstr.split(",");
  92. }
  93. else {
  94. var obj = document.getElementById('sidepanel-permalink-tab');
  95. if (obj.innerHTML == "Permalink*") obj.innerHTML = "Permalink";
  96. }
  97. var numDays = 0;
  98.  
  99. var objnumRecentDays = getId('permalink_numRecentDays');
  100. if (objnumRecentDays != undefined) {
  101. var numDays = objnumRecentDays.value;
  102. if (numDays === undefined) numDays = 0;
  103. }
  104.  
  105. var tNow = new Date();
  106. var before = tNow.getTime() - (numDays * 86400000);
  107. before = before - ( before % 3600000 );
  108. var beforeTime = new Date();
  109. beforeTime.setTime(before /*+ tNow.getTimezoneOffset() * 60 * 1000*/ );
  110. if (numDays == 0) getId('permalink_date_before').innerHTML = '';
  111. else getId('permalink_date_before').innerHTML = 'After: ' + beforeTime.toLocaleString().trim();
  112.  
  113. for (var seg in Waze.model.segments.objects) {
  114. var segment = Waze.model.segments.get(seg);
  115. var attributes = segment.attributes;
  116. var line = getId(segment.geometry.id);
  117. if (line !== null) {
  118. var sid = attributes.primaryStreetID;
  119. var street = Waze.model.streets.get(sid);
  120. var level = attributes.level;
  121. var segid = segment.attributes.id;
  122. var lineColor = line.getAttribute("stroke");
  123. var lineWidth = line.getAttribute("stroke-width");
  124. var opacity = line.getAttribute("stroke-opacity");
  125. var newColor = lineColor;
  126. var newWidth = lineWidth;
  127. var newOpacity = opacity;
  128. var reset = 0;
  129. var RecentlyUpdatedGreen = 0;
  130. var RecentlyCreatedGreen = 0;
  131. var updatedOn = new Date(attributes.updatedOn);
  132. var createdOn = new Date(attributes.createdOn);
  133. if (numDays > 0 && updatedOn.getTime() >= before) RecentlyUpdatedGreen = 1;
  134. if (numDays > 0 && createdOn.getTime() >= before) RecentlyCreatedGreen = 1;
  135. // check that WME hasn't highlighted this segment (better method)
  136. var selected = 0;
  137. if (segment.renderIntent == "highlight") selected = 1;
  138. if (segment.renderIntent == "select") selected = 1;
  139. if (segment.renderIntent == "highlightselected") selected = 1;
  140. // check for WME Highlights errors and do not affect their colors
  141. if (lineColor == "#ff0") selected = 1; //segments has soft-turns (yellow)
  142. if (lineColor == "#f0f") selected = 1; //segment has reverse connections (purple)
  143. if (lineColor == "#0ff") selected = 1;
  144. if (selected) {
  145. continue;
  146. }
  147.  
  148. if (showLevels) {
  149. newWidth = 9;
  150. if (level == null || level == undefined) newColor = "#40C040";
  151. else {
  152. level = parseInt(level);
  153. if (level <= -3) newColor = "#040484";
  154. if (level == -2) newColor = "#0404C4";
  155. if (level == -1) newColor = "#0404FC";
  156. if (level == 0) { newColor = "#848484"; newWidth = 4; }
  157. if (level == 1) newColor = "#FC8404";
  158. if (level == 2) newColor = "#FC0404";
  159. if (level == 3) newColor = "#FC04FC";
  160. if (level >= 4) newColor = "#840484";
  161. }
  162. newOpacity = 1;
  163. }
  164. else {
  165. if (newColor == "#040484") reset = 1;
  166. if (newColor == "#0404C4") reset = 1;
  167. if (newColor == "#0404FC") reset = 1;
  168. if (newColor == "#848484") reset = 1;
  169. if (newColor == "#FC8404") reset = 1;
  170. if (newColor == "#FC0404") reset = 1;
  171. if (newColor == "#FC04FC") reset = 1;
  172. if (newColor == "#840484") reset = 1;
  173. }
  174. var nsel = 0;
  175. if (seglines.length > 0) {
  176. for(var i=0; i<seglines.length; i++) {
  177. if (seglines[i] == segid) { nsel++; }
  178. }
  179. }
  180. if (nsel == 0) {
  181. if (newColor == "#f1125c") reset = 1;
  182. if (newColor == "#0056ff") reset = 1;
  183. if (newColor == "#ff7802") reset = 1;
  184. if (newColor == "#ff02f0") reset = 1;
  185. }
  186. else if (nsel == 1) {
  187. if (RecentlyUpdatedGreen == 0) newColor = "#0056ff";
  188. if (RecentlyUpdatedGreen == 1) newColor = "#ff7802";
  189. if (RecentlyCreatedGreen == 1) newColor = "#ff02f0";
  190. newWidth = 9;
  191. newOpacity = 0.8;
  192. }
  193. else if (nsel >= 2) {
  194. newColor = "#f1125c";
  195. newWidth = 9;
  196. newOpacity = 0.8;
  197. }
  198.  
  199. if (reset) {
  200. newColor = "#dd7700";
  201. newWidth = 8;
  202. newOpacity = 0.001;
  203. }
  204. if (newColor != lineColor) {
  205. line.setAttribute("stroke", newColor);
  206. line.setAttribute("stroke-width", newWidth);
  207. line.setAttribute("stroke-opacity", newOpacity);
  208. }
  209. }
  210. }
  211. }
  212. //--------------------------------------------------------------------------------------------------------
  213. function getElementsByClassName(classname, node) {
  214. if(!node) node = document.getElementsByTagName("body")[0];
  215. var a = [];
  216. var re = new RegExp('\\b' + classname + '\\b');
  217. var els = node.getElementsByTagName("*");
  218. for (var i=0,j=els.length; i<j; i++)
  219. if (re.test(els[i].className)) a.push(els[i]);
  220. return a;
  221. }
  222. //--------------------------------------------------------------------------------------------------------
  223. function getId(node) {
  224. return document.getElementById(node);
  225. }
  226. //--------------------------------------------------------------------------------------------------------
  227. function initialisePermalinkHighlight()
  228. {
  229. var addon = document.createElement('section');
  230. addon.id = "permalink-addon";
  231. 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;
  232. var tooltip1 = 'title="Selects segments or permalinks on the map."';
  233. var tooltip2 = 'title="Selects segments edited before specified date."';
  234. var tooltip3 = 'title="Selects segments created before specified date."';
  235. var tooltip4 = 'title="Marks ID of segments which exists more then once on the list."';
  236. var section = document.createElement('p');
  237. section.id = "permalinkSection";
  238. section.innerHTML = ''
  239. + '<input type="checkbox" id="_cbShowRoadLevels" style="margin-left:8px; margin-top:16px;" > Road Levels</input>'
  240. + '<br><br>'
  241. + '<b>Permalink Selector:</b>'
  242. + '<textarea id="permalink_id_content" style="width:280px; height:150px; " placeholder="Paste Segments ID\'s or Permalinks here" ></textarea>'
  243. + '<br><div ' + tooltip1 + ' style="margin-left:4px;position:relative;top:+3px;display:inline-block;width:16px;height:16px;background-color:#0056ff;"></div> - selected segments'
  244. + '<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'
  245. + '<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'
  246. + '<br><div ' + tooltip4 + ' style="margin-left:4px;position:relative;top:+3px;display:inline-block;width:16px;height:16px;background-color:#f1125c;"></div> - doubled segments'
  247. + '<br><br>Recently Edited/Created: <input type="number" step="1" min="0" max="30" size="2" value="5" id="permalink_numRecentDays" style=""/> days'
  248. + '<div id="permalink_date_before" style="xborder: 1px solid red; margin:0px; padding:0px; text-align:left; " ><div>'
  249. ;
  250. addon.appendChild(section);
  251. var userTabs = getId('user-info');
  252. var navTabs = getElementsByClassName('nav-tabs', userTabs)[0];
  253. var tabContent = getElementsByClassName('tab-content', userTabs)[0];
  254. newtab = document.createElement('li');
  255. newtab.innerHTML = '<a id=sidepanel-permalink-tab href="#sidepanel-permalink" data-toggle="tab">Permalink</a>';
  256. navTabs.appendChild(newtab);
  257. addon.id = "sidepanel-permalink";
  258. addon.className = "tab-pane";
  259. tabContent.appendChild(addon);
  260. window.setInterval(highlightPermalink, 333);
  261. Waze.map.events.register("zoomend", null, highlightPermalink);
  262. }
  263. //--------------------------------------------------------------------------------------------------------------
  264. bootstrapPermalinkSelector();