WME LevelReset

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

当前为 2016-05-08 提交的版本,查看 最新版本

此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.cn-greasyfork.org/scripts/14414/124459/WME%20LevelReset.js

  1. // ==UserScript==
  2. // @name WME LevelReset
  3. // @namespace broosgert@gmail.com
  4. // @version 0.2.1
  5. // @description Script version of the WME LevelReset tool, to make relocking segments to their appropriate lock level easy & quick.
  6. // @author Broos Gert '2015
  7. // @match https://editor-beta.waze.com/*editor/*
  8. // @match https://www.waze.com/*editor/*
  9. // @grant none
  10. // @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
  11. // ==/UserScript==
  12.  
  13. // initialize LevelReset and do some checks
  14. function LevelReset_bootstrap() {
  15. LevelReset_init();
  16. }
  17.  
  18. function LevelReset_init() {
  19. // Check initialisation
  20. if (typeof Waze == 'undefined' || typeof I18n == 'undefined') {
  21. setTimeout(LevelReset_init, 660);
  22. console.log('LevelReset: Waze object unavailable, map still loading');
  23. return;
  24. }
  25.  
  26. function onScreen(obj) {
  27. if (obj.geometry) {
  28. return(Waze.map.getExtent().intersectsBounds(obj.geometry.getBounds()));
  29. }
  30. return(false);
  31. }
  32.  
  33. // Country database --------------------------------------------------------------------------------------------------------------
  34. var cntryDB = {
  35. BE: { str_lvl:0, pri_lvl:1,min_lvl:2, maj_lvl:3, rmp_lvl:4, fwy_lvl:4}, //--------------------------------- Belgium
  36. NL: { str_lvl:0, pri_lvl:1,min_lvl:2, maj_lvl:3, rmp_lvl:4, fwy_lvl:4}, //--------------------------------- Netherlands
  37. LU: { str_lvl:0, pri_lvl:1,min_lvl:2, maj_lvl:3, rmp_lvl:4, fwy_lvl:4}, //--------------------------------- Luxemburg
  38. PL: { str_lvl:0, pri_lvl:1,min_lvl:2, maj_lvl:3, rmp_lvl:3, fwy_lvl:3} //--------------------------------- Poland
  39. };
  40. // Country database --------------------------------------------------------------------------------------------------------------
  41.  
  42.  
  43. // Setting up all variables
  44. var UpdateObject = require("Waze/Action/UpdateObject"),
  45. VERSION = '0.2.0',
  46. loader = 'data:image/gif;base64,R0lGODlhEAAQAPQAAP///wAAAPj4+Dg4OISEhAYGBiYmJtbW1qioqBYWFnZ2dmZmZuTk5JiYmMbGxkhISFZWVgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH+GkNyZWF0ZWQgd2l0aCBhamF4bG9hZC5pbmZvACH5BAAKAAAAIf8LTkVUU0NBUEUyLjADAQAAACwAAAAAEAAQAAAFUCAgjmRpnqUwFGwhKoRgqq2YFMaRGjWA8AbZiIBbjQQ8AmmFUJEQhQGJhaKOrCksgEla+KIkYvC6SJKQOISoNSYdeIk1ayA8ExTyeR3F749CACH5BAAKAAEALAAAAAAQABAAAAVoICCKR9KMaCoaxeCoqEAkRX3AwMHWxQIIjJSAZWgUEgzBwCBAEQpMwIDwY1FHgwJCtOW2UDWYIDyqNVVkUbYr6CK+o2eUMKgWrqKhj0FrEM8jQQALPFA3MAc8CQSAMA5ZBjgqDQmHIyEAIfkEAAoAAgAsAAAAABAAEAAABWAgII4j85Ao2hRIKgrEUBQJLaSHMe8zgQo6Q8sxS7RIhILhBkgumCTZsXkACBC+0cwF2GoLLoFXREDcDlkAojBICRaFLDCOQtQKjmsQSubtDFU/NXcDBHwkaw1cKQ8MiyEAIfkEAAoAAwAsAAAAABAAEAAABVIgII5kaZ6AIJQCMRTFQKiDQx4GrBfGa4uCnAEhQuRgPwCBtwK+kCNFgjh6QlFYgGO7baJ2CxIioSDpwqNggWCGDVVGphly3BkOpXDrKfNm/4AhACH5BAAKAAQALAAAAAAQABAAAAVgICCOZGmeqEAMRTEQwskYbV0Yx7kYSIzQhtgoBxCKBDQCIOcoLBimRiFhSABYU5gIgW01pLUBYkRItAYAqrlhYiwKjiWAcDMWY8QjsCf4DewiBzQ2N1AmKlgvgCiMjSQhACH5BAAKAAUALAAAAAAQABAAAAVfICCOZGmeqEgUxUAIpkA0AMKyxkEiSZEIsJqhYAg+boUFSTAkiBiNHks3sg1ILAfBiS10gyqCg0UaFBCkwy3RYKiIYMAC+RAxiQgYsJdAjw5DN2gILzEEZgVcKYuMJiEAOwAAAAAAAAAAAA==',
  47. strt = '',
  48. fwy_lvl = 4,
  49. rmp_lvl = 4,
  50. maj_lvl = 3,
  51. min_lvl = 2,
  52. pri_lvl = 1,
  53. str_lvl = 0,
  54. absolute = false,
  55. fwy_cnt = 0,
  56. rmp_cnt = 0,
  57. maj_cnt = 0,
  58. min_cnt = 0,
  59. pri_cnt = 0,
  60. str_cnt = 0,
  61. relockObject = null,
  62. userlevel = Waze.loginManager.user.normalizedLevel,
  63. //userlevel = 6, // for testing purposes (NOTE: this does not enable you to lock higher!)
  64. relockTab = document.createElement('li'),
  65. userInfo = document.getElementById('user-info'),
  66. navTabs = userInfo.querySelector('.nav-tabs'),
  67. tabContent = userInfo.querySelector('.tab-content'),
  68. relockContent = document.createElement('div'),
  69. relockTitle = document.createElement('h3'),
  70. relockSubTitle = document.createElement('h4'),
  71. relockAllbutton = document.createElement('input'),
  72. relockSub = document.createElement('p'),
  73. versionTitle = document.createElement('p'),
  74. resultsCntr = document.createElement('div'),
  75. alertCntr = document.createElement('div'),
  76. hidebutton = document.createElement('div'),
  77. dotscntr = document.createElement('div'),
  78. includeAllSegments = document.createElement('input'),
  79. includeAllSegmentsLabel = document.createElement('label'),
  80. percentageLoader = document.createElement('div'),
  81. readable = {'str':'Streets (#)', 'pri':'Primary Streets (#)','min':'Minor Highways (#)', 'maj':'Major Highways (#)', 'rmp':'Ramps (#)', 'fwy':'Freeways (#)'};
  82.  
  83. // Begin building
  84. relockContent.id = 'sidepanel-relockTab';
  85. relockContent.className = 'tab-pane';
  86. relockTitle.appendChild(document.createTextNode('Relock segments'));
  87. relockTitle.style.cssText = 'margin-bottom:0';
  88. 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>';
  89.  
  90. // fill tab
  91. 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.';
  92. relockSub.style.cssText = 'font-size:85%;padding:15px;border:1px solid red;border-radius:5px;position:relative';
  93. relockSub.id = 'sub';
  94. 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=\');';
  95. hidebutton.onclick = function() {
  96. localStorage.msgHide = 1;
  97. $('#sub').hide('slow');
  98. };
  99. dotscntr.style.cssText = 'width:16px;height:16px;margin-left:5px;background:url("'+ loader + '");vertical-align:text-top;display:none';
  100. dotscntr.id = 'dotscntr';
  101. relockSubTitle.innerHTML = 'Results';
  102. versionTitle.innerHTML = 'Version ' + VERSION;
  103. versionTitle.style.cssText = 'margin:2px;font-size:85%;font-weight:bold';
  104. relockAllbutton.type = 'button';
  105. relockAllbutton.value = 'Relock All';
  106. relockAllbutton.style.cssText = 'margin: 10px 3px 0 0';
  107. relockAllbutton.onclick = function() {
  108. relockAll();
  109. };
  110.  
  111. // Also reset higher locked segments?
  112. includeAllSegments.type = 'checkbox';
  113. includeAllSegments.name = "name";
  114. includeAllSegments.value = "value";
  115. includeAllSegments.id = "_allSegments";
  116. includeAllSegments.onclick = function() {
  117. scanArea();
  118. relockShowAlert();
  119. };
  120. includeAllSegmentsLabel.htmlFor = "_allSegments";
  121. includeAllSegmentsLabel.innerHTML = 'Also reset higher locked segments';
  122. includeAllSegmentsLabel.style.cssText = 'font-size:95%;margin-left:5px;vertical-align:middle';
  123.  
  124. // Alert box
  125. alertCntr.id = "alertCntr";
  126. 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';
  127. alertCntr.innerHTML = 'Watch out for map exceptions, some higher locks are there for a reason!';
  128.  
  129. // add to stage
  130. navTabs.appendChild(relockTab);
  131. tabContent.appendChild(relockContent);
  132. relockContent.appendChild(relockTitle);
  133. relockContent.appendChild(versionTitle);
  134.  
  135. // Loader bar
  136. percentageLoader.id = 'percentageLoader';
  137. percentageLoader.style.cssText = 'width:1px;height:10px;background-color:green;margin-top:10px;border:1px solid:#333333;display:none';
  138.  
  139. // only show if user didn't hide it before
  140. if (localStorage.msgHide != 1) {
  141. relockSub.appendChild(hidebutton);
  142. relockContent.appendChild(relockSub);
  143. }
  144. relockContent.appendChild(includeAllSegments);
  145. relockContent.appendChild(includeAllSegmentsLabel);
  146. relockContent.appendChild(alertCntr);
  147. relockContent.appendChild(relockSubTitle);
  148. relockContent.appendChild(resultsCntr);
  149. relockContent.appendChild(relockAllbutton);
  150. relockContent.appendChild(dotscntr);
  151. relockContent.appendChild(percentageLoader);
  152.  
  153. // Some functions
  154. function relock(obj, key) {
  155. var objects = obj[key];
  156. var _i = 0;
  157.  
  158. // update GUI
  159. function RunLocal() {
  160. Waze.model.actionManager.add(objects[_i]);
  161. _i++;
  162.  
  163. if (_i < objects.length) {
  164. setTimeout(RunLocal, 1);
  165. var newWidth = (_i / objects.length) * $('#sidepanel-relockTab').css('width').replace('px', '');
  166. $('#percentageLoader').show();
  167. $('#percentageLoader').css('width', newWidth + 'px');
  168. $('#dotscntr').css('display', 'inline-block');
  169. } else {
  170. $('#dotscntr').css('display', 'none');
  171. $('#percentageLoader').hide();
  172. }
  173. }
  174. RunLocal();
  175. }
  176.  
  177. function relockAll() {
  178. // only lock "all" until the current editors level is reached, then stop...
  179. $('#dotscntr').css('display', 'inline-block');
  180.  
  181. $.each(relockObject, function( key, value ) {
  182. if (value.length !== 0) {
  183. // loop trough each segmentType
  184. var _i = 0;
  185. var RunLocal5 = function() {
  186. Waze.model.actionManager.add(value[_i]);
  187. _i++;
  188.  
  189. // Did not iterate with $.each, so the GUI can update with larger arrays
  190. if (_i < value.length) {
  191. setTimeout(RunLocal5, 1);
  192. var newWidth = (_i / value.length) * $('#sidepanel-relockTab').css('width').replace('px', '');
  193. $('#percentageLoader').show();
  194. $('#percentageLoader').css('width', newWidth + 'px');
  195. $('#dotscntr').css('display', 'inline-block');
  196. } else {
  197. $('#dotscntr').css('display', 'none');
  198. $('#percentageLoader').hide();
  199. }
  200. };
  201. RunLocal5();
  202. }
  203. });
  204. scanArea();
  205. $('#dotscntr').hide('slow');
  206. }
  207.  
  208. function relockShowAlert() {
  209. if (includeAllSegments.checked)
  210. $('#alertCntr').show("fast");
  211. else
  212. $('#alertCntr').hide("fast");
  213. }
  214.  
  215. function scanArea() {
  216. // Object with array of roadtypes, to collect each wrongly locked segment, for later use
  217. relockObject = {'str':[], 'pri':[], 'min':[], 'maj':[], 'rmp':[], 'fwy':[]};
  218. var foundBadlocks = false;
  219. var count = 0;
  220.  
  221. // Choose country lock settings. If country selection fails
  222. // or country isn't in this list, WME default values are used.
  223. try {
  224. var ABBR = cntryDB[Waze.model.countries.top.abbr];
  225. fwy_lvl = ABBR.fwy_lvl;
  226. rmp_lvl = ABBR.rmp_lvl;
  227. maj_lvl = ABBR.maj_lvl;
  228. min_lvl = ABBR.min_lvl;
  229. pri_lvl = ABBR.pri_lvl;
  230. str_lvl = ABBR.str_lvl;
  231. console.log("LevelReset: ", ABBR);
  232. } catch(err) {
  233. console.log("LevelReset ERROR: ", err);
  234. }
  235.  
  236. // Do a count on how many segments are in need of a correct lock (limit to 150 to save CPU)
  237. // Count also depends on the users editor level
  238. $.each(Waze.model.segments.objects, function( k, v ) {
  239. if (count < 150 && v.type == "segment" && onScreen(v) && v.isGeometryEditable()) {
  240. strt = Waze.model.streets.get(v.attributes.primaryStreetID);
  241.  
  242. // Street (L1)
  243. if (v.attributes.roadType == 1) {
  244. if (v.attributes.lockRank > str_lvl && includeAllSegments.checked) {
  245. relockObject.str.push(new UpdateObject(v, {lockRank: str_lvl}));
  246. foundBadlocks = true;
  247. count++;
  248. }
  249. }
  250. // Primary (L2)
  251. if (v.attributes.roadType == 2 && (userlevel >= (pri_lvl+1)) ) {
  252. if (v.attributes.lockRank < pri_lvl) {
  253. relockObject.pri.push(new UpdateObject(v, {lockRank: pri_lvl}));
  254. foundBadlocks = true;
  255. count++;
  256. }
  257. if (v.attributes.lockRank > pri_lvl && includeAllSegments.checked) {
  258. relockObject.pri.push(new UpdateObject(v, {lockRank: pri_lvl}));
  259. foundBadlocks = true;
  260. count++;
  261. }
  262. }
  263. // Minor Highway (L3)
  264. if (v.attributes.roadType == 7 && (userlevel >= (min_lvl+1)) ) {
  265. if (v.attributes.lockRank < min_lvl) {
  266. relockObject.min.push(new UpdateObject(v, {lockRank: min_lvl}));
  267. foundBadlocks = true;
  268. count++;
  269. }
  270. if (v.attributes.lockRank > min_lvl && includeAllSegments.checked) {
  271. relockObject.min.push(new UpdateObject(v, {lockRank: min_lvl}));
  272. foundBadlocks = true;
  273. count++;
  274. }
  275. }
  276. // Major Highway (L4)
  277. if (v.attributes.roadType == 6 && (userlevel >= (maj_lvl+1)) ) {
  278. if (v.attributes.lockRank < maj_lvl) {
  279. relockObject.maj.push(new UpdateObject(v, {lockRank: maj_lvl}));
  280. foundBadlocks = true;
  281. count++;
  282. }
  283. if (v.attributes.lockRank > maj_lvl && includeAllSegments.checked) {
  284. relockObject.maj.push(new UpdateObject(v, {lockRank: maj_lvl}));
  285. foundBadlocks = true;
  286. count++;
  287. }
  288. }
  289. // Ramps (L5)
  290. if (v.attributes.roadType == 4 && (userlevel >= (rmp_lvl+1)) ) {
  291. if (v.attributes.lockRank < rmp_lvl) {
  292. relockObject.rmp.push(new UpdateObject(v, {lockRank: rmp_lvl}));
  293. foundBadlocks = true;
  294. count++;
  295. }
  296. if (v.attributes.lockRank > rmp_lvl && includeAllSegments.checked) {
  297. relockObject.rmp.push(new UpdateObject(v, {lockRank: rmp_lvl}));
  298. foundBadlocks = true;
  299. count++;
  300. }
  301. }
  302. // Freeways (L5)
  303. if (v.attributes.roadType == 3 && (userlevel >= (fwy_lvl+1)) ) {
  304. if (v.attributes.lockRank < fwy_lvl) {
  305. relockObject.fwy.push(new UpdateObject(v, {lockRank: fwy_lvl}));
  306. foundBadlocks = true;
  307. count++;
  308. }
  309. if (v.attributes.lockRank > fwy_lvl && includeAllSegments.checked) {
  310. relockObject.fwy.push(new UpdateObject(v, {lockRank: fwy_lvl}));
  311. foundBadlocks = true;
  312. count++;
  313. }
  314. }
  315. }
  316. });
  317.  
  318. // Build result to users tabpanel
  319. resultsCntr.innerHTML = '';
  320. var lvlCnt;
  321. if (includeAllSegments.checked)
  322. lvlCnt = 1;
  323. else
  324. lvlCnt = 2;
  325.  
  326. $.each(relockObject, function( key, value ) {
  327. // Only show streets (L1) if needed -> checkbox checked. L1 streets cannot be locked too low, only too high :)
  328. if (key == 'str' && !includeAllSegments.checked) {
  329. return;
  330. }
  331.  
  332. var __cntr = document.createElement('div'),
  333. __keyLeft = document.createElement('div'),
  334. __lckRight = document.createElement('div'),
  335. __cntRight = document.createElement('div'),
  336. __cleardiv = document.createElement("div");
  337.  
  338. // Begin building
  339. __keyLeft.style.cssText = 'float:left';
  340. __keyLeft.innerHTML = readable[key].replace('#', 'Lock ' + (eval(key+'_lvl')+1)); // No eval is not evil :)
  341. __lckRight.className = ((value.length !==0) ? 'fa fa-lock' : '');
  342. __cntRight.style.cssText = 'float:right';
  343. __cntRight.innerHTML = ((value.length !==0) ? '<b>'+value.length+'</b>' : '-');
  344. __cleardiv.style.cssText ='clear:both;';
  345.  
  346. // only add relock function if the editor's level allows it...
  347. if (userlevel < 5) {
  348. if (userlevel >= lvlCnt) {
  349. __lckRight.style.cssText = 'width:15px;float:right;padding:3px 0 0 8px;cursor:pointer;' + ((value.length!== 0) ? 'color:red' : '' );
  350. __lckRight.onclick = function() {
  351. relock(relockObject, key);
  352. };
  353. } else {
  354. // Grey out options to make it more visible
  355. __lckRight.className = '';
  356. __keyLeft.style.cssText = 'float:left;color:#777';
  357. __cntRight.style.cssText = 'float:right;color:#777';
  358. __lckRight.style.cssText = 'float:right;padding:3px 0 0 8px;color:#777;width:15px';
  359. }
  360. }
  361. else
  362. {
  363. // User is an L5/L6 so he can edit all road types (exceptions possible)
  364. __lckRight.style.cssText = 'width:15px;float:right;padding:3px 0 0 8px;cursor:pointer;' + ((value.length!== 0) ? 'color:red' : '' );
  365. __lckRight.onclick = function() {
  366. relock(relockObject, key);
  367. };
  368. }
  369.  
  370. // Add to stage
  371. __cntr.appendChild(__keyLeft);
  372. __cntr.appendChild(__lckRight);
  373. __cntr.appendChild(__cntRight);
  374. __cntr.appendChild(__cleardiv);
  375. resultsCntr.appendChild(__cntr);
  376. lvlCnt++;
  377. });
  378.  
  379. // Color the small lock icon red, if errors are found, so people can decide what to do...
  380. if (foundBadlocks) {
  381. relockAllbutton.removeAttribute('disabled');
  382. $('#lockcolor').css('color', 'red');
  383. } else {
  384. relockAllbutton.setAttribute('disabled', true);
  385. $('#lockcolor').css('color', 'green');
  386. }
  387. }
  388.  
  389. // Do a default scan once at startup
  390. scanArea();
  391.  
  392. // Register some eventlisteners
  393. Waze.map.events.register("moveend", null, scanArea);
  394. Waze.model.actionManager.events.register("afteraction", null, scanArea);
  395. Waze.model.actionManager.events.register("afterundoaction", null, scanArea);
  396. Waze.model.actionManager.events.register("noActions", null, scanArea);
  397. }
  398. setTimeout(LevelReset_bootstrap, 2000);