WME Permalink Selector

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

当前为 2014-10-01 提交的版本,查看 最新版本

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