WME Locksmith US

Dynamic locking tool which locks based on State standards

目前為 2019-11-13 提交的版本,檢視 最新版本

  1. // ==UserScript==
  2. // @name WME Locksmith US
  3. // @namespace https://gf.qytechs.cn/en/users/286957-skidooguy
  4. // @version 2019.11.13.02
  5. // @description Dynamic locking tool which locks based on State standards
  6. // @author SkiDooGuy / JustinS83 / Blaine "herrchin" Kahle
  7. // @include /^https:\/\/(www|beta)\.waze\.com\/(?!user\/)(.{2,6}\/)?editor\/?.*$/
  8. // @require https://gf.qytechs.cn/scripts/24851-wazewrap/code/WazeWrap.js
  9. // @require https://apis.google.com/js/api.js
  10. // @grant none
  11. // @contributionURL https://github.com/WazeDev/Thank-The-Authors
  12. // ==/UserScript==
  13.  
  14. /* global W */
  15. /* global WazeWrap */
  16. /* global $ */
  17. /* global OL */
  18. /* global _ */
  19. /* global require */
  20.  
  21. const LOCKSMITH_VERSION = `v${GM_info.script.version}`;
  22. const LS_UPDATE_NOTES = `<b>NEW:</b><br>
  23. - <br><br>
  24. <b>FIXES:</b><br>
  25. - Fixed my fix that broke something that wasnt broke<br><br>`;
  26.  
  27. let _allStandardsArray = {};
  28. let _currentStateStandards = {};
  29. let LsSettings = {};
  30. let _currentState = '';
  31. let _editorRank;
  32. let LocksmithHighlightLayer;
  33. let tries = 0;
  34. let UpdateObj;
  35.  
  36. console.log('Locksmith initializing...');
  37.  
  38. const css = [
  39. '.ls-Wrapper {width:100%;height:100%;background-color:white;border:2px solid white;border-radius:6px;font-size:12px;font-family:Poppins, "Helvetica Neue", Helvetica, "Open Sans", sans-serif;user-select:none;}',
  40. '.ls-Body {display:block;padding:3px;}',
  41. '.ls-Header-Wrapper {display:block;width:100%;}',
  42. '.ls-Header-Text-Container {width:100%;padding:0 5px 0 5px;display:inline-block;border-bottom:1px solid grey;}',
  43. '.ls-Label {display:inline-block;position:relative;padding-right:20px;font-weight:normal;margin:5px 0 0 0;width:auto;cursor:pointer;}',
  44. '.ls-Label input[type=checkbox] {position:absolute;opacity:0;height:0;width:0;}',
  45. '.ls-CheckBox {position:absolute;height:13px;width:13px;background-color:#eee;border:1px solid black;border-radius:4px;top:1px;right:0px;}',
  46. '.ls-Label:hover input ~ .ls-CheckBox {background-color:#ccc;}',
  47. '.ls-Label input:checked ~ .ls-CheckBox {background-color:rgb(66 184 196);}',
  48. '.ls-Options-Container {display:inline-block;}',
  49. '.ls-Options-Menu {position:relative;display:block;width:100%;float:left;padding:3px;border:1px solid black;border-radius:5px;text-align:center;}',
  50. '.ls-Options-Menu:hover {border:1.5px outset grey;background-color:rgb(224,224,224);}',
  51. '.ls-Options-Dropdown-Menu {display:none;position:absolute;background-color:#f9f9f9;min-width:160px;top:25px;left:0px;z-index:1;text-align:left;}',
  52. '.ls-Options-Menu:hover .ls-Options-Dropdown-Menu {display:block;}',
  53. '.ls-Options-Dropdown-Menu ul {list-style:none;padding-left:0px;border:1px solid grey;border-radius:5px;}',
  54. '.ls-Options-Dropdown-Menu li {padding:5px;}',
  55. '.ls-Options-Dropdown-Menu li:hover {background-color:rgb(220,220,220);border:.5px solid lightgrey;border-radius:5px;}',
  56. '.ls-Section-Container {display:inline-block;width:100%;}',
  57. '.ls-Section-Header {width:100%;display:block;padding-bottom:2px;border-bottom:1.5px solid grey;margin-bottom:5px;}',
  58. '.ls-Select {color:#444;box-sizing:border-box;margin-right:5px;outline:none;padding:3px;border:1px solid lightgrey;border-radius:6px;}',
  59. '.ls-Select:hover {border:1px solid grey;}',
  60. '.ls-Select:focus {border:1px solid black;}',
  61. '.ls-Lock-Options {display:block;width:100%;max-height:3-px;margin-bottom:3px;}',
  62. '.ls-Seg-Result {display:inline-block;position:relative;float:right;top:8px;}',
  63. '.ls-IL-Block {display:inline-block;}',
  64. '.fa.fa-arrow-circle-up {position:relative;color:lightgrey;padding:0px 5px 0px 5px}',
  65. '.fa.fa-arrow-circle-down {position:relative;color:lightgrey;padding:0px 5px 0px 5px}',
  66. '.ls-Seg-Quantity-Low {position:relative;padding:0px 5px 0px 5px;}',
  67. '.ls-Seg-Quantity-High {position:relative;padding:0px 5px 0px 5px;}',
  68. '.ls-Seg-Quantity-Low.enabled {}',
  69. '.ls-Seg-Quantity-High.enabled {}',
  70. '.ls-Seg-Attributes {display:inline-block;border:1px solid lightgrey;border-radius:5px;padding:2px;margin:4px;background-color:lightgrey;font-size:12px}',
  71. '.ls-Attr-Label {display:inline-block;position:relative;padding:2px 5px 2px 2px;font-size:12px;font-weight:bold;width:auto;}',
  72. '.ls-Attr-Label input[type=checkbox] {position:absolute;opacity:0;height:0;width:0;}',
  73. '.ls-Attr-CheckBox {position:relative;padding:2px;background-color:lightgrey;border:1px solid lightgrey;border-radius:4px;top:1px;right:0px;}',
  74. '.ls-Attr-Label:hover input ~ .ls-Attr-CheckBox {border:1.2px outset grey;}',
  75. '.ls-Attr-Label input:checked ~ .ls-Attr-CheckBox {border:1.2px outset black;}',
  76. '.ls-Button-Container {position:relative;display:inline-block;float:right;padding-top:3px;width:40%;}',
  77. '.ls-Button {border:1px solid black;border-radius:5px;cursor:pointer;padding:3px;background-color:white;}',
  78. '.ls-Button:hover {border:1.5px outset grey;background-color:rgb(224,224,224);}',
  79. '.key-Text {font-weight:bold;font-size:14px;}',
  80. '#lsConnectionStatus {display:inline;position:relative;height:15px;width:30px;border:1px solid lightgrey;border-radius:4px;font-size:8px;text-align:center;font-weight:bold;top:-2px;left:2px;line-height:1.5;}'
  81. ].join(' ');
  82.  
  83. function Locksmithbootstrap() {
  84. if (W && W.map && W.model && W.model.states && W.loginManager.user && $ && WazeWrap.Ready) {
  85. initLocksmith();
  86. } else if (tries < 500) setTimeout(() => { tries++; Locksmithbootstrap(); }, 200);
  87. else console.log('Failed to load Locksmith');
  88. }
  89.  
  90. function initLocksmith() {
  91. // Checks to ensure WME is in editing mode and not HN or Event mode
  92. if (W.app.modeController.model.attributes.mode !== 0 && !W.editingMediator.attributes.editingHouseNumbers) {
  93. return console.log('WME is not in editing mode');
  94. }
  95.  
  96. editorInfo = W.loginManager.user;
  97.  
  98. const $section = $('<div>');
  99. // HTML for UI tab
  100. $section.html([
  101. '<div class="ls-Wrapper">',
  102. '<div class="ls-Body">',
  103. `<div class="ls-Header-Wrapper">
  104. <div class="ls-Header-Text-Container">
  105. <span class='key-Text'>Locksmith US</span> - <span id='lsVersion' /><a href='https://docs.google.com/spreadsheets/d/1DJEk390OYv5jWXEINl6PF3I1A8y1WrwrdPIsAL7SihI/edit#gid=0' target="_blank" id='lsConnectionStatus' data-original-title="Spreadsheet Connection" />
  106. </div>
  107. <div class="ls-Options-Container" style="display:block;height:35px;padding:2px 10px 0 10px;width:100%">
  108. <div style="display:inline-block;float:left;position:relative;width:60%;">
  109. <div class="ls-Options-Container" style="margin:3px 0 0 0;">
  110. <div class="ls-Options-Menu">
  111. <div>Options</div>
  112. <div class="ls-Options-Dropdown-Menu">
  113. <ul>
  114. <li>
  115. <label class="ls-Label">Active Scan<input type="checkbox" class="ls-Save-Status" id="lsEnableActiveScan">
  116. <span class="ls-CheckBox" /></label>
  117. </li>
  118. <li>
  119. <label class="ls-Label">Enable Highlights<input type="checkbox" class="ls-Save-Status" id="lsEnableHighlightSeg">
  120. <span class="ls-CheckBox" /></label>
  121. </li>
  122. <li id="ls-Above-Rank-Tooltip" data-original-title="Allows segments that you cannot edit or lock to the standard rank to be highlighted and show in the UI">
  123. <label class="ls-Label">Detect Segs Above My Rank<input type="checkbox" class="ls-Save-Status" id="lsEnableIgnoreRank">
  124. <span class="ls-CheckBox" /></label>
  125. </li>
  126. <li>
  127. <label class="ls-Label">Save Custom Locks<input type="checkbox" class="ls-Save-Status" id="lsEnableSaveValues">
  128. <span class="ls-CheckBox" /></label>
  129. </li>
  130. <li>
  131. <label class="ls-Label">Save Scan Settings<input type="checkbox" class="ls-Save-Status" id="lsEnableSaveSettings">
  132. <span class="ls-CheckBox" /></label>
  133. </li>
  134. <li>
  135. <label class="ls-Label" style="margin:0px;">Manual State Select<input type="checkbox" id="lsManualStateOverride">
  136. <span class="ls-CheckBox" /></label>
  137. </li>
  138. <li>
  139. <label class="ls-Label">Disable states popup<input type="checkbox" class="ls-Save-Status" id="lsDisableStatePopup">
  140. <span class="ls-CheckBox" /></label>
  141. </li>
  142. <li id="ls-Higher-Level-Tooltip" data-original-title="Watch out for map exceptions, some higher locks are there for a reason!">
  143. <label class="ls-Label" style="font-weight:bold;">Include Overlocked Segs<input type="checkbox" class="ls-Save-Status" id="lsEnableResetHigher">
  144. <span class="ls-CheckBox" /></label>
  145. </li>
  146. </ul>
  147. </div>
  148. </div>
  149. </div>
  150. <div class="ls-Button-Container" style="width:50%;left:-20px">
  151. <input type="button" class="ls-Button" id="ls-Reset-Standards-Display" style="position:relative;" value="Reset" data-original-title="Reset lock values and UI">
  152. </div>
  153. </div>
  154. <div class="ls-Button-Container">
  155. <input type="button" class="ls-Button" style="position:relative;left:5px;" id="ls-Maual-Scan-Activate" value="Scan">
  156. <input type="button" class="ls-Button" style="float:right;" id="ls-Lock-All-Submit" value="Lock All">
  157. </div>
  158. </div>
  159. </div>
  160. <div class="ls-Section-Container" style="margin-top:0px;">
  161. <div class="ls-Section-Container">
  162. <span style="float:left;border-bottom:1px solid black;">Lock Standards&nbsp;&nbsp;</span>
  163. <span style="float:right;border-bottom:1px solid black;">Lock Status:&nbsp;Low&nbsp;&nbsp;|&nbsp;&nbsp;High&nbsp;&nbsp;|&nbsp;All</span>
  164. </div>
  165.  
  166. <div class="ls-Section-Container">
  167. <div class="ls-Section-Container" id="ls-Seg-Types-Main">
  168. <div class="ls-Lock-Options">
  169. <select class="ls-Select" id="lsLockStreetSelect">
  170. <option class="ls-Lock-Option-0">Auto</option><option class="ls-Lock-Option-1">1</option>
  171. <option class="ls-Lock-Option-2">2</option><option class="ls-Lock-Option-3">3</option>
  172. <option class="ls-Lock-Option-4">4</option><option class="ls-Lock-Option-5">5</option>
  173. <option class="ls-Lock-Option-6">6</option>
  174. </select>
  175. <span class="ls-LS-Label" />
  176. <div class="ls-Seg-Result">
  177. <div id="ls-Seg-Result-LS" style="float:right;">
  178. <div class="ls-IL-Block">
  179. <span class="fa fa-arrow-circle-up" id="ls-LS-Lock-Up" />
  180. <span class="ls-Seg-Quantity-Low" id="ls-LS-Low-Quan" />
  181. </div>
  182. <div class="ls-IL-Block">
  183. <span class="fa fa-arrow-circle-down" id="ls-LS-Lock-Down" />
  184. <span class="ls-Seg-Quantity-High" id="ls-LS-High-Quan" />
  185. </div>
  186. <span class="fa fa-lock" id="icon-Lock-LS" style="color:lightgrey;padding-left:10px;float:right;" />
  187. </div>
  188. </div>
  189. </div>
  190.  
  191. <div class="ls-Lock-Options">
  192. <select class="ls-Select" id="lsLockPSSelect">
  193. <option class="ls-Lock-Option-0">Auto</option><option class="ls-Lock-Option-1">1</option>
  194. <option class="ls-Lock-Option-2">2</option><option class="ls-Lock-Option-3">3</option>
  195. <option class="ls-Lock-Option-4">4</option><option class="ls-Lock-Option-5">5</option>
  196. <option class="ls-Lock-Option-6">6</option>
  197. </select>
  198. <span class="ls-PS-Label" />
  199. <div class="ls-Seg-Result">
  200. <div id="ls-Seg-Result-PS" style="float:right;">
  201. <div class="ls-IL-Block">
  202. <span class="fa fa-arrow-circle-up" id="ls-PS-Lock-Up" />
  203. <span class="ls-Seg-Quantity-Low" id="ls-PS-Low-Quan" />
  204. </div>
  205. <div class="ls-IL-Block">
  206. <span class="fa fa-arrow-circle-down" id="ls-PS-Lock-Down" />
  207. <span class="ls-Seg-Quantity-High" id="ls-PS-High-Quan" />
  208. </div>
  209. <span class="fa fa-lock" id="icon-Lock-PS" style="color:lightgrey;padding-left:10px;float:right;" />
  210. </div>
  211. </div>
  212. </div>
  213.  
  214. <div class="ls-Lock-Options">
  215. <select class="ls-Select" id="lsLockMinHSelect">
  216. <option class="ls-Lock-Option-0">Auto</option><option class="ls-Lock-Option-1">1</option>
  217. <option class="ls-Lock-Option-2">2</option><option class="ls-Lock-Option-3">3</option>
  218. <option class="ls-Lock-Option-4">4</option><option class="ls-Lock-Option-5">5</option>
  219. <option class="ls-Lock-Option-6">6</option>
  220. </select>
  221. <span class="ls-minH-Label" />
  222. <div class="ls-Seg-Result">
  223. <div id="ls-Seg-Result-minH" style="float:right;">
  224. <div class="ls-IL-Block">
  225. <span class="fa fa-arrow-circle-up" id="ls-minH-Lock-Up" />
  226. <span class="ls-Seg-Quantity-Low" id="ls-minH-Low-Quan" />
  227. </div>
  228. <div class="ls-IL-Block">
  229. <span class="fa fa-arrow-circle-down" id="ls-minH-Lock-Down" />
  230. <span class="ls-Seg-Quantity-High" id="ls-minH-High-Quan" />
  231. </div>
  232. <span class="fa fa-lock" id="icon-Lock-minH" style="color:lightgrey;padding-left:10px;float:right;" />
  233. </div>
  234. </div>
  235. </div>
  236.  
  237. <div class="ls-Lock-Options">
  238. <select class="ls-Select" id="lsLockMajHSelect">
  239. <option class="ls-Lock-Option-0">Auto</option><option class="ls-Lock-Option-1">1</option>
  240. <option class="ls-Lock-Option-2">2</option><option class="ls-Lock-Option-3">3</option>
  241. <option class="ls-Lock-Option-4">4</option><option class="ls-Lock-Option-5">5</option>
  242. <option class="ls-Lock-Option-6">6</option>
  243. </select>
  244. <span class="ls-majH-Label" />
  245. <div class="ls-Seg-Result">
  246. <div id="ls-Seg-Result-majH" style="float:right;">
  247. <div class="ls-IL-Block">
  248. <span class="fa fa-arrow-circle-up" id="ls-majH-Lock-Up" />
  249. <span class="ls-Seg-Quantity-Low" id="ls-majH-Low-Quan" />
  250. </div>
  251. <div class="ls-IL-Block">
  252. <span class="fa fa-arrow-circle-down" id="ls-majH-Lock-Down" />
  253. <span class="ls-Seg-Quantity-High" id="ls-majH-High-Quan" />
  254. </div>
  255. <span class="fa fa-lock" id="icon-Lock-majH" style="color:lightgrey;padding-left:10px;float:right;" />
  256. </div>
  257. </div>
  258. </div>
  259.  
  260. <div class="ls-Lock-Options">
  261. <select class="ls-Select" id="lsLockRmpSelect">
  262. <option class="ls-Lock-Option-0">Auto</option><option class="ls-Lock-Option-0">HRCS</option>
  263. <option class="ls-Lock-Option-1">1</option><option class="ls-Lock-Option-2">2</option>
  264. <option class="ls-Lock-Option-3">3</option><option class="ls-Lock-Option-4">4</option>
  265. <option class="ls-Lock-Option-5">5</option><option class="ls-Lock-Option-6">6</option>
  266. </select>
  267. <span class="ls-Ramp-Label" />
  268. <div class="ls-Seg-Result">
  269. <div id="ls-Seg-Result-Rmp" style="float:right;">
  270. <div class="ls-IL-Block">
  271. <span class="fa fa-arrow-circle-up" id="ls-Rmp-Lock-Up" />
  272. <span class="ls-Seg-Quantity-Low" id="ls-Rmp-Low-Quan" />
  273. </div>
  274. <div class="ls-IL-Block">
  275. <span class="fa fa-arrow-circle-down" id="ls-Rmp-Lock-Down" />
  276. <span class="ls-Seg-Quantity-High" id="ls-Rmp-High-Quan" />
  277. </div>
  278. <span class="fa fa-lock" id="icon-Lock-Rmp" style="color:lightgrey;padding-left:10px;float:right;" />
  279. </div>
  280. </div>
  281. </div>
  282.  
  283. <div class="ls-Lock-Options">
  284. <select class="ls-Select" id="lsLockFwySelect">
  285. <option class="ls-Lock-Option-0">Auto</option><option class="ls-Lock-Option-1">1</option>
  286. <option class="ls-Lock-Option-2">2</option><option class="ls-Lock-Option-3">3</option>
  287. <option class="ls-Lock-Option-4">4</option><option class="ls-Lock-Option-5">5</option>
  288. <option class="ls-Lock-Option-6">6</option>
  289. </select>
  290. <span class="ls-FWY-Label" />
  291. <div class="ls-Seg-Result">
  292. <div id="ls-Seg-Result-Fwy" style="float:right;">
  293. <div class="ls-IL-Block">
  294. <span class="fa fa-arrow-circle-up" id="ls-Fwy-Lock-Up" />
  295. <span class="ls-Seg-Quantity-Low" id="ls-Fwy-Low-Quan" />
  296. </div>
  297. <div class="ls-IL-Block">
  298. <span class="fa fa-arrow-circle-down" id="ls-Fwy-Lock-Down" />
  299. <span class="ls-Seg-Quantity-High" id="ls-Fwy-High-Quan" />
  300. </div>
  301. <span class="fa fa-lock" id="icon-Lock-Fwy" style="color:lightgrey;padding-left:10px;float:right;" />
  302. </div>
  303. </div>
  304. </div>
  305. </div>
  306.  
  307. <div class="ls-Lock-Options">
  308. <div style="display:inline-block;float:left;cursor:pointer;" id="ls-Othr-Seg-Label">Other segment types: </div>
  309. <div class="ls-Seg-Result" style="top:5px;" id="rl-Othr-Result-Container">
  310. <div class="ls-IL-Block">
  311. <span class="fa fa-arrow-circle-up" id="ls-othr-Lock-Up" />
  312. <span class="ls-Seg-Quantity-Low" id="ls-othr-Low-Quan" />
  313. </div>
  314. <div class="ls-IL-Block">
  315. <span class="fa fa-arrow-circle-down" id="ls-othr-Lock-Down" />
  316. <span class="ls-Seg-Quantity-High" id="ls-othr-High-Quan" />
  317. </div>
  318. <span class="fa fa-lock" id="icon-Lock-othr" style="color:lightgrey;padding-left:10px;float:right;" />
  319. </div>
  320. </div>
  321.  
  322. <div class="ls-Section-Container" id="ls-Seg-Types-Alt" style="display:none;">
  323. <div class="ls-Lock-Options" style="margin-top:3px;">
  324. <select class="ls-Select" id="lsLockPvtSelect">
  325. <option class="ls-Lock-Option-0">Auto</option><option class="ls-Lock-Option-1">1</option>
  326. <option class="ls-Lock-Option-2">2</option><option class="ls-Lock-Option-3">3</option>
  327. <option class="ls-Lock-Option-4">4</option><option class="ls-Lock-Option-5">5</option>
  328. <option class="ls-Lock-Option-6">6</option>
  329. </select>
  330. <span class="ls-Pvt-Label" />
  331. <div class="ls-Seg-Result">
  332. <div id="ls-Seg-Result-Pvt" style="float:right;">
  333. <div class="ls-IL-Block">
  334. <span class="fa fa-arrow-circle-up" id="ls-Pvt-Lock-Up" />
  335. <span class="ls-Seg-Quantity-Low" id="ls-Pvt-Low-Quan" />
  336. </div>
  337. <div class="ls-IL-Block">
  338. <span class="fa fa-arrow-circle-down" id="ls-Pvt-Lock-Down" />
  339. <span class="ls-Seg-Quantity-High" id="ls-Pvt-High-Quan" />
  340. </div>
  341. <span class="fa fa-lock" id="icon-Lock-Pvt" style="color:lightgrey;padding-left:10px;float:right;" />
  342. </div>
  343. </div>
  344. </div>
  345.  
  346. <div class="ls-Lock-Options">
  347. <select class="ls-Select" id="lsLockPlrSelect">
  348. <option class="ls-Lock-Option-0">Auto</option><option class="ls-Lock-Option-1">1</option>
  349. <option class="ls-Lock-Option-2">2</option><option class="ls-Lock-Option-3">3</option>
  350. <option class="ls-Lock-Option-4">4</option><option class="ls-Lock-Option-5">5</option>
  351. <option class="ls-Lock-Option-6">6</option>
  352. </select>
  353. <span class="ls-Plr-Label" />
  354. <div class="ls-Seg-Result">
  355. <div id="ls-Seg-Result-Plr" style="float:right;">
  356. <div class="ls-IL-Block">
  357. <span class="fa fa-arrow-circle-up" id="ls-Plr-Lock-Up" />
  358. <span class="ls-Seg-Quantity-Low" id="ls-Plr-Low-Quan" />
  359. </div>
  360. <div class="ls-IL-Block">
  361. <span class="fa fa-arrow-circle-down" id="ls-Plr-Lock-Down" />
  362. <span class="ls-Seg-Quantity-High" id="ls-Plr-High-Quan" />
  363. </div>
  364. <span class="fa fa-lock" id="icon-Lock-Plr" style="color:lightgrey;padding-left:10px;float:right;" />
  365. </div>
  366. </div>
  367. </div>
  368.  
  369. <div class="ls-Lock-Options">
  370. <select class="ls-Select" id="lsLockRailSelect">
  371. <option class="ls-Lock-Option-0">Auto</option><option class="ls-Lock-Option-1">1</option>
  372. <option class="ls-Lock-Option-2">2</option><option class="ls-Lock-Option-3">3</option>
  373. <option class="ls-Lock-Option-4">4</option><option class="ls-Lock-Option-5">5</option>
  374. <option class="ls-Lock-Option-6">6</option>
  375. </select>
  376. <span class="ls-Rail-Label" />
  377. <div class="ls-Seg-Result">
  378. <div id="ls-Seg-Result-Rail" style="float:right;">
  379. <div class="ls-IL-Block">
  380. <span class="fa fa-arrow-circle-up" id="ls-Rail-Lock-Up" />
  381. <span class="ls-Seg-Quantity-Low" id="ls-Rail-Low-Quan" />
  382. </div>
  383. <div class="ls-IL-Block">
  384. <span class="fa fa-arrow-circle-down" id="ls-Rail-Lock-Down" />
  385. <span class="ls-Seg-Quantity-High" id="ls-Rail-High-Quan" />
  386. </div>
  387. <span class="fa fa-lock" id="icon-Lock-Rail" style="color:lightgrey;padding-left:10px;float:right;" />
  388. </div>
  389. </div>
  390. </div>
  391.  
  392. <div class="ls-Lock-Options">
  393. <select class="ls-Select" id="lsLockFrySelect">
  394. <option class="ls-Lock-Option-0">Auto</option><option class="ls-Lock-Option-1">1</option>
  395. <option class="ls-Lock-Option-2">2</option><option class="ls-Lock-Option-3">3</option>
  396. <option class="ls-Lock-Option-4">4</option><option class="ls-Lock-Option-5">5</option>
  397. <option class="ls-Lock-Option-6">6</option>
  398. </select>
  399. <span class="ls-Fry-Label" />
  400. <div class="ls-Seg-Result">
  401. <div id="ls-Seg-Result-Fry" style="float:right;">
  402. <div class="ls-IL-Block">
  403. <span class="fa fa-arrow-circle-up" id="ls-Fry-Lock-Up" />
  404. <span class="ls-Seg-Quantity-Low" id="ls-Fry-Low-Quan" />
  405. </div>
  406. <div class="ls-IL-Block">
  407. <span class="fa fa-arrow-circle-down" id="ls-Fry-Lock-Down" />
  408. <span class="ls-Seg-Quantity-High" id="ls-Fry-High-Quan" />
  409. </div>
  410. <span class="fa fa-lock" id="icon-Lock-Fry" style="color:lightgrey;padding-left:10px;float:right;" />
  411. </div>
  412. </div>
  413. </div>
  414.  
  415. <div class="ls-Lock-Options">
  416. <select class="ls-Select" id="lsLockRnwySelect">
  417. <option class="ls-Lock-Option-0">Auto</option><option class="ls-Lock-Option-1">1</option>
  418. <option class="ls-Lock-Option-2">2</option><option class="ls-Lock-Option-3">3</option>
  419. <option class="ls-Lock-Option-4">4</option><option class="ls-Lock-Option-5">5</option>
  420. <option class="ls-Lock-Option-6">6</option>
  421. </select>
  422. <span class="ls-Rnwy-Label" />
  423. <div class="ls-Seg-Result">
  424. <div id="ls-Seg-Result-Rnwy" style="float:right;">
  425. <div class="ls-IL-Block">
  426. <span class="fa fa-arrow-circle-up" id="ls-Rnwy-Lock-Up" />
  427. <span class="ls-Seg-Quantity-Low" id="ls-Rnwy-Low-Quan" />
  428. </div>
  429. <div class="ls-IL-Block">
  430. <span class="fa fa-arrow-circle-down" id="ls-Rnwy-Lock-Down" />
  431. <span class="ls-Seg-Quantity-High" id="ls-Rnwy-High-Quan" />
  432. </div>
  433. <span class="fa fa-lock" id="icon-Lock-Rnwy" style="color:lightgrey;padding-left:10px;float:right;" />
  434. </div>
  435. </div>
  436. </div>
  437.  
  438. <div class="ls-Lock-Options">
  439. <select class="ls-Select" id="lsLockOfrdSelect">
  440. <option class="ls-Lock-Option-0">Auto</option><option class="ls-Lock-Option-1">1</option>
  441. <option class="ls-Lock-Option-2">2</option><option class="ls-Lock-Option-3">3</option>
  442. <option class="ls-Lock-Option-4">4</option><option class="ls-Lock-Option-5">5</option>
  443. <option class="ls-Lock-Option-6">6</option>
  444. </select>
  445. <span class="ls-Ofrd-Label" />
  446. <div class="ls-Seg-Result">
  447. <div id="ls-Seg-Result-Ofrd" style="float:right;">
  448. <div class="ls-IL-Block">
  449. <span class="fa fa-arrow-circle-up" id="ls-Ofrd-Lock-Up" />
  450. <span class="ls-Seg-Quantity-Low" id="ls-Ofrd-Low-Quan" />
  451. </div>
  452. <div class="ls-IL-Block">
  453. <span class="fa fa-arrow-circle-down" id="ls-Ofrd-Lock-Down" />
  454. <span class="ls-Seg-Quantity-High" id="ls-Ofrd-High-Quan" />
  455. </div>
  456. <span class="fa fa-lock" id="icon-Lock-Ofrd" style="color:lightgrey;padding-left:10px;float:right;" />
  457. </div>
  458. </div>
  459. </div>
  460.  
  461. <div class="ls-Lock-Options">
  462. <select class="ls-Select" id="lsLockNonpedSelect">
  463. <option class="ls-Lock-Option-0">Auto</option><option class="ls-Lock-Option-1">1</option>
  464. <option class="ls-Lock-Option-2">2</option><option class="ls-Lock-Option-3">3</option>
  465. <option class="ls-Lock-Option-4">4</option><option class="ls-Lock-Option-5">5</option>
  466. <option class="ls-Lock-Option-6">6</option>
  467. </select>
  468. <span class="ls-Nonped-Label" />
  469. <div class="ls-Seg-Result">
  470. <div id="ls-Seg-Result-Nonped" style="float:right;">
  471. <div class="ls-IL-Block">
  472. <span class="fa fa-arrow-circle-up" id="ls-Nonped-Lock-Up" />
  473. <span class="ls-Seg-Quantity-Low" id="ls-Nonped-Low-Quan" />
  474. </div>
  475. <div class="ls-IL-Block">
  476. <span class="fa fa-arrow-circle-down" id="ls-Nonped-Lock-Down" />
  477. <span class="ls-Seg-Quantity-High" id="ls-Nonped-High-Quan" />
  478. </div>
  479. <span class="fa fa-lock" id="icon-Lock-Nonped" style="color:lightgrey;padding-left:10px;float:right;" />
  480. </div>
  481. </div>
  482. </div>
  483.  
  484. </div>
  485. </div>
  486. </div>
  487. <div class="ls-Section-Container" style="margin-top:5px;border-top:.5px solid lightgrey;">
  488. <div class="ls-Section-Container" style="margin-top:3px;">
  489. Current Standards:&nbsp;&nbsp;<span id="ls-Current-State-Display" style="font-weight:bold;" />
  490. <div id="ls-State-Select-Container" style="display:none;">
  491. <select class="ls-Select" id="ls-State-Selection"></select>
  492. </div>
  493. </div>
  494. </div>
  495. <div class="ls-Section-Container">
  496. <div class="ls-Section-Header" style="float:left;margin-top:5px;" id="ls-Add-Att-Info" data-original-title="Colored attributes are available in this state, click to toggle them enabled">Additional Attributes</div>
  497. <div class="ls-Locking-Attributes">
  498. <label class="ls-Attr-Label">
  499. <input type="checkbox" class="ls-Att-Ck-Form" id="ls-Unpaved-Enable"><span class="ls-Attr-CheckBox" id="ls-Unpaved-Status" />
  500. </label>
  501. <label class="ls-Attr-Label">
  502. <input type="checkbox" class="ls-Att-Ck-Form" id="ls-OneWay-Enable"><span class="ls-Attr-CheckBox" id="ls-OneWay-Status" />
  503. </label>
  504. <label class="ls-Attr-Label">
  505. <input type="checkbox" class="ls-Att-Ck-Form" id="ls-HOV-Enable"><span class="ls-Attr-CheckBox" id="ls-HOV-Status" />
  506. </label>
  507. <label class="ls-Attr-Label">
  508. <input type="checkbox" class="ls-Att-Ck-Form" id="ls-Toll-Enable"><span class="ls-Attr-CheckBox" id="ls-Toll-Status" />
  509. </label>
  510. <label class="ls-Attr-Label">
  511. <input type="checkbox" class="ls-Att-Ck-Form" id="ls-WKT-Enable"><span class="ls-Attr-CheckBox" id="ls-WKT-Status" />
  512. </label>
  513. </div>
  514. </div>`,
  515. '</div>',
  516. '</div>'
  517. ].join(' '));
  518. // Attach HTML for tab to webpage
  519. UpdateObj = require('Waze/Action/UpdateObject');
  520. let safeProceed = editorInfo.id != 461031220;
  521. // Gather info about editor rank
  522. _editorRank = editorInfo.rank;
  523.  
  524. // Script is initialized and the highlighting layer is created
  525. if (_editorRank >= 2 && safeProceed) {
  526. new WazeWrap.Interface.Tab('LsUS', $section.html(), initializeSettings);
  527.  
  528. WazeWrap.Interface.ShowScriptUpdate(GM_info.script.name, GM_info.script.version, LS_UPDATE_NOTES, 'https://gf.qytechs.cn/en/scripts/386773-wme-locksmith-us', 'https://www.waze.com/forum/viewtopic.php?f=1286&t=285583');
  529.  
  530. LocksmithHighlightLayer = new OL.Layer.Vector('LocksmithHighlightLayer', { uniqueName: '_LocksmithHighlightLayer' });
  531. W.map.addLayer(LocksmithHighlightLayer);
  532. LocksmithHighlightLayer.setVisibility(true);
  533.  
  534. setTimeout(() => { if (_editorRank < 4) WazeWrap.Alerts.warning(GM_info.script.name, `Editor rank below R5, the maximum you'll be able to lock segments is R${_editorRank + 1}`); }, 3000);
  535. console.log('Locksmith loaded');
  536. } else return console.log('Locksmith: insufficient permissions...');
  537. }
  538.  
  539. async function initializeSettings() {
  540. loadSpreadsheet();
  541. await loadSettings();
  542. setUserOptions();
  543. getCurrentState();
  544.  
  545. $(`<style type="text/css">${css}</style>`).appendTo('head');
  546.  
  547. // Allows WME native tooltip UI
  548. $('#ls-Add-Att-Info').tooltip();
  549. $('#lsConnectionStatus').tooltip();
  550. $('#ls-Above-Rank-Tooltip').tooltip({ placement: 'auto right' });
  551. $('#ls-Higher-Level-Tooltip').tooltip({ placement: 'auto bottom' });
  552. $('#ls-Reset-Standards-Display').tooltip({ placement: 'auto bottom' });
  553.  
  554. // Create listeners to run functions when buttons are clicked
  555. $('#ls-Lock-All-Submit').click(() => { relockAll(); });
  556. $('#ls-Maual-Scan-Activate').click(() => { scanArea(true); });
  557. $('#ls-Reset-Standards-Display').click(() => {
  558. $('#lsEnableSaveValues').prop('checked', false);
  559. LsSettings.EnableSaveValues = false;
  560. saveSettings();
  561. resetUISegStats();
  562. getCurrentState();
  563. setCurrentStandards(_currentState);
  564. });
  565. $('#ls-Othr-Seg-Label').click(() => { $('#ls-Seg-Types-Main').toggle(); $('#ls-Seg-Types-Alt').toggle(); $('#rl-Othr-Result-Container').toggle(); });
  566.  
  567. $('#ls-State-Selection').change(function () { _currentState = this.value; setCurrentStandards(_currentState); });
  568. $('#lsEnableHighlightSeg').change(function () { if (!this.checked) { removeHighlights(); } });
  569. $("input[type='checkbox'].ls-Att-Ck-Form").change(function () {
  570. const elementName = $(this).attr('id');
  571.  
  572. switch (elementName) {
  573. case 'ls-Unpaved-Enable':
  574. if (this.checked) $('#ls-Unpaved-Status').css({ 'background-color': 'rgb(205,133,63)', 'background-image': '' });
  575. else $('#ls-Unpaved-Status').css({ 'background-color': '', 'background-image': 'repeating-linear-gradient(135deg,lightgrey,rgb(205,133,63) 20%,lightgrey 10%)' });
  576. break;
  577. case 'ls-OneWay-Enable':
  578. if (this.checked) $('#ls-OneWay-Status').css({ 'background-color': 'rgb(236, 249, 31)', 'background-image': '' });
  579. else $('#ls-OneWay-Status').css({ 'background-color': '', 'background-image': 'repeating-linear-gradient(135deg,rgb(239,251,81),rgb(209,224,6) 6px,black 8px)' });
  580. break;
  581. case 'ls-HOV-Enable':
  582. if (this.checked) $('#ls-HOV-Status').css({ 'background-color': 'rgb(254,151,13)', 'background-image': '' });
  583. else $('#ls-HOV-Status').css({ 'background-color': '', 'background-image': 'repeating-linear-gradient(135deg,rgb(254,151,13),rgb(247,199,134) 6px,black 8px)' });
  584. break;
  585. case 'ls-Toll-Enable':
  586. if (this.checked) $('#ls-Toll-Status').css({ 'background-color': 'rgb(253,14,202)', 'background-image': '' });
  587. else $('#ls-Toll-Status').css({ 'background-color': '', 'background-image': 'repeating-linear-gradient(135deg,rgb(253,14,202),rgb(252,156,231) 6px,black 8px)' });
  588. break;
  589. case 'ls-WKT-Enable':
  590. if (this.checked) $('#ls-WKT-Status').css({ 'background-color': 'rgb(9,235,255)', 'background-image': '' });
  591. else $('#ls-WKT-Status').css({ 'background-color': '', 'background-image': 'repeating-linear-gradient(135deg,rgb(9,235,255),rgb(161,247,255) 6px,black 8px)' });
  592. break;
  593. default:
  594. console.log('LS: Seg Att switch error');
  595. }
  596. });
  597. $('#lsManualStateOverride').change(function () {
  598. if (this.checked) {
  599. generateStateList();
  600. $('#ls-State-Select-Container').css('display', 'inline-block');
  601. $('#ls-Current-State-Display').css('display', 'none');
  602. setCurrentStandards(_currentState);
  603. } else {
  604. $('#ls-State-Select-Container').css('display', 'none');
  605. $('#ls-Current-State-Display').css('display', 'inline-block');
  606. _currentState = 'changeME';
  607. getCurrentState();
  608. }
  609. });
  610. $('#lsEnableActiveScan').change(function () { if (!this.checked) { resetUISegStats(); removeHighlights(); } });
  611.  
  612. // Trigger checkbox save status
  613. $('.ls-Save-Status').change(function () {
  614. let settingName = $(this)[0].id.substr(2);
  615. LsSettings[settingName] = this.checked;
  616. saveSettings();
  617. });
  618. // Trigger save upon select change
  619. $('.ls-Select').change(function () {
  620. let settingName = $(this)[0].id.substr(2);
  621. LsSettings[settingName] = this.value;
  622. saveSettings();
  623. });
  624.  
  625. // Register WME event listeners
  626. W.map.events.register('moveend', null, tryScan);
  627. W.map.events.register('movestart', null, resetUISegStats);
  628. W.model.actionManager.events.register('afteraction', null, tryScan);
  629. W.model.actionManager.events.register('afterundoaction', null, tryScan);
  630. W.model.actionManager.events.register('afterclearactions', null, tryScan);
  631. W.model.actionManager.events.register('afterclearactions', null, resetUISegStats);
  632.  
  633. // Setup UI text
  634. $('#lsVersion').text(LOCKSMITH_VERSION);
  635. $('.ls-FWY-Label').text('FWY');
  636. $('.ls-Ramp-Label').text('Ramp');
  637. $('.ls-majH-Label').text('MH');
  638. $('.ls-minH-Label').text('mH');
  639. $('.ls-PS-Label').text('PS');
  640. $('.ls-LS-Label').text('LS');
  641. $('.ls-Pvt-Label').text('PVT');
  642. $('.ls-Plr-Label').text('PLR');
  643. $('.ls-Rail-Label').text('Railroad');
  644. $('.ls-Fry-Label').text('Ferry');
  645. $('.ls-Ofrd-Label').text('Off-Road');
  646. $('.ls-Rnwy-Label').text('Runway');
  647. $('.ls-Nonped-Label').text('NonRout Ped');
  648. $('.ls-Seg-Quantity-Low').text('--');
  649. $('.ls-Seg-Quantity-High').text('--');
  650. $('.fa.fa-arrow-circle-up').css({ color: 'lightgrey', cursor: 'default' });
  651. $('.fa.fa-arrow-circle-down').css({ color: 'lightgrey', cursor: 'default' });
  652. $('.fa.fa-arrow-circle-up').attr('disabled', true);
  653. $('.fa.fa-arrow-circle-down').attr('disabled', true);
  654. $('#ls-Unpaved-Status').text('Unpaved');
  655. $('#ls-OneWay-Status').text('One-Way');
  656. $('#ls-HOV-Status').text('HOV');
  657. $('#ls-WKT-Status').text('WKT');
  658. $('#ls-Toll-Status').text('Toll');
  659.  
  660. function setUserOptions() {
  661. // Checks editors rank and hides lock options above them
  662. verifyOptionEnable('.ls-Lock-Option-3', 2);
  663. verifyOptionEnable('.ls-Lock-Option-4', 3);
  664. verifyOptionEnable('.ls-Lock-Option-5', 4);
  665. verifyOptionEnable('.ls-Lock-Option-6', 5);
  666. // Set check boxes based on last use
  667. setChecked('lsEnableActiveScan', LsSettings.EnableActiveScan);
  668. setChecked('lsEnableHighlightSeg', LsSettings.EnableHighlightSeg);
  669. setChecked('lsEnableResetHigher', LsSettings.EnableResetHigher);
  670. setChecked('lsEnableSaveSettings', LsSettings.EnableSaveSettings);
  671. setChecked('lsDisableStatePopup', LsSettings.DisableStatePopup);
  672. setChecked('lsEnableIgnoreRank', LsSettings.EnableIgnoreRank);
  673. setChecked('lsEnableSaveValues', LsSettings.EnableSaveValues);
  674.  
  675. // Enable rank select drop downs appropriate for editors rank
  676. function verifyOptionEnable(className, rankRequired) {
  677. if (_editorRank < rankRequired) $(className).hide();
  678. }
  679. function setChecked(checkboxId, checked) {
  680. $(`#${checkboxId}`).prop('checked', checked);
  681. }
  682. }
  683. }
  684.  
  685. async function saveSettings() {
  686. const localsettings = {
  687. lastSaveAction: Date.now(),
  688. EnableActiveScan: LsSettings.EnableActiveScan,
  689. EnableHighlightSeg: LsSettings.EnableHighlightSeg,
  690. EnableResetHigher: LsSettings.EnableResetHigher,
  691. DisableStatePopup: LsSettings.DisableStatePopup,
  692. EnableIgnoreRank: LsSettings.EnableIgnoreRank,
  693. EnableSaveSettings: LsSettings.EnableSaveSettings,
  694. EnableSaveValues: LsSettings.EnableSaveValues,
  695. LockStreetSelect: LsSettings.LockStreetSelect,
  696. LockPSSelect: LsSettings.LockPSSelect,
  697. LockMinHSelect: LsSettings.LockMinHSelect,
  698. LockMajHSelect: LsSettings.LockMajHSelect,
  699. LockRmpSelect: LsSettings.LockRmpSelect,
  700. LockFwySelect: LsSettings.LockFwySelect,
  701. LockPvtSelect: LsSettings.LockPvtSelect,
  702. LockPlrSelect: LsSettings.LockPlrSelect,
  703. LockRailSelect: LsSettings.LockRailSelect,
  704. LockFrySelect: LsSettings.LockFrySelect,
  705. LockRnwySelect: LsSettings.LockRnwySelect,
  706. LockOfrdSelect: LsSettings.LockOfrdSelect,
  707. LockNonpedSelect: LsSettings.LockNonpedSelect
  708.  
  709. };
  710.  
  711. if (localStorage) { localStorage.setItem('LsUS_Settings', JSON.stringify(localsettings)); }
  712. // Attempt to connect to the WazeWrap setting store server
  713. const serverSave = await WazeWrap.Remote.SaveSettings('LsUS_Settings', localsettings);
  714.  
  715. if (serverSave === null) console.log('LsUS: User PIN not set in WazeWrap tab');
  716. else if (serverSave === false) console.log('LsUS: Unable to save settings to server');
  717. }
  718.  
  719. async function loadSettings() {
  720. const localSettings = $.parseJSON(localStorage.getItem('LsUS_Settings'));
  721. // Attempt connection to WazeWrap setting server to retrieve settings
  722. const serverSettings = await WazeWrap.Remote.RetrieveSettings('LsUS_Settings');
  723. if (!serverSettings) console.log('LsUS: Error communicating with WW settings server');
  724. // Default checkbox settings
  725. const defaultsettings = {
  726. lastSaveAction: null,
  727. EnableActiveScan: false,
  728. EnableHighlightSeg: false,
  729. EnableResetHigher: false,
  730. DisableStatePopup: false,
  731. EnableIgnoreRank: false,
  732. EnableSaveSettings: false,
  733. EnableSaveValues: false,
  734. LockStreetSelect: 'Auto',
  735. LockPSSelect: 'Auto',
  736. LockMinHSelect: 'Auto',
  737. LockMajHSelect: 'Auto',
  738. LockRmpSelect: 'Auto',
  739. LockFwySelect: 'Auto',
  740. LockPvtSelect: 'Auto',
  741. LockPlrSelect: 'Auto',
  742. LockRailSelect: 'Auto',
  743. LockFrySelect: 'Auto',
  744. LockRnwySelect: 'Auto',
  745. LockOfrdSelect: 'Auto',
  746. LockNonpedSelect: 'Auto'
  747. };
  748.  
  749. LsSettings = $.extend({}, defaultsettings, localSettings);
  750. if (serverSettings && serverSettings.lastSaveAction > LsSettings.lastSaveAction) {
  751. $.extend(LsSettings, serverSettings);
  752. console.log('Locksmith server settings used');
  753. }
  754. if (LsSettings.EnableSaveSettings === false) LsSettings = defaultsettings;
  755. // Sets saved values for segment locks when desired
  756. if (LsSettings.EnableSaveValues === true) {
  757. $('#lsLockStreetSelect').val(LsSettings.LockStreetSelect);
  758. $('#lsLockPSSelect').val(LsSettings.LockPSSelect);
  759. $('#lsLockMinHSelect').val(LsSettings.LockMinHSelect);
  760. $('#lsLockMajHSelect').val(LsSettings.LockMajHSelect);
  761. $('#lsLockRmpSelect').val(LsSettings.LockRmpSelect);
  762. $('#lsLockFwySelect').val(LsSettings.LockFwySelect);
  763. $('#lsLockPvtSelect').val(LsSettings.LockPvtSelect);
  764. $('#lsLockPlrSelect').val(LsSettings.LockPlrSelect);
  765. $('#lsLockRailSelect').val(LsSettings.LockRailSelect);
  766. $('#lsLockFrySelect').val(LsSettings.LockFrySelect);
  767. $('#lsLockRnwySelect').val(LsSettings.LockRnwySelect);
  768. $('#lsLockOfrdSelect').val(LsSettings.LockOfrdSelect);
  769. $('#lsLockNonpedSelect').val(LsSettings.LockNonpedSelect);
  770. }
  771. }
  772.  
  773. function changeUI(eleID, status, type, inText) {
  774. if (type === 'lock' && status === 1) {
  775. $(eleID).attr('disabled', false);
  776. if (inText === 'high') $(eleID).css({ color: 'cyan', cursor: 'pointer' });
  777. if (inText === 'low') $(eleID).css({ color: 'red', cursor: 'pointer' });
  778. if (inText === 'both') $(eleID).css({ color: 'orange', cursor: 'pointer' });
  779. }
  780. if (type === 'text' && status === 1) {
  781. $(eleID).text(inText);
  782. }
  783. if (type === 'lock' && status === 0) {
  784. $(eleID).css({ color: 'lightgrey', cursor: 'default' });
  785. $(eleID).attr('disabled', true);
  786. $(eleID).off('click');
  787. }
  788. }
  789.  
  790. function resetUISegStats() {
  791. changeUI('.fa.fa-arrow-circle-up', 0, 'lock', null);
  792. changeUI('.fa.fa-arrow-circle-down', 0, 'lock', null);
  793. changeUI('.ls-Seg-Quantity-Low', 1, 'text', '--');
  794. changeUI('.ls-Seg-Quantity-High', 1, 'text', '--');
  795. changeUI('#icon-Lock-LS', 0, 'lock', null);
  796. changeUI('#icon-Lock-PS', 0, 'lock', null);
  797. changeUI('#icon-Lock-minH', 0, 'lock', null);
  798. changeUI('#icon-Lock-majH', 0, 'lock', null);
  799. changeUI('#icon-Lock-Rmp', 0, 'lock', null);
  800. changeUI('#icon-Lock-Fwy', 0, 'lock', null);
  801. changeUI('#icon-Lock-othr', 0, 'lock', null);
  802. changeUI('#icon-Lock-Pvt', 0, 'lock', null);
  803. changeUI('#icon-Lock-Plr', 0, 'lock', null);
  804. changeUI('#icon-Lock-Rail', 0, 'lock', null);
  805. changeUI('#icon-Lock-Rnwy', 0, 'lock', null);
  806. changeUI('#icon-Lock-Fry', 0, 'lock', null);
  807. changeUI('#icon-Lock-Ofrd', 0, 'lock', null);
  808. changeUI('#icon-Lock-Nonped', 0, 'lock', null);
  809. removeHighlights();
  810. $("a[href$='#sidepanel-lsus']").css('background-color', '#e9e9e9');
  811. }
  812.  
  813. function WKT_to_LinearRing(wkt) {
  814. const lines = wkt.split(',');
  815. const ringPts = [];
  816.  
  817. for (let i = 0; i < lines.length; i++) {
  818. const coords = lines[i].trim().match(/(-?\d*(?:\.\d*)?)\s(-?\d*(?:\.\d*))/);
  819. const pt = WazeWrap.Geometry.ConvertTo900913(coords[1], coords[2]);
  820. ringPts.push(new OL.Geometry.Point(pt.lon, pt.lat));
  821. }
  822. return new OL.Geometry.LinearRing(ringPts);
  823. }
  824.  
  825. async function loadSpreadsheet() {
  826. let connectionEstablished = false;
  827. const apiKey = 'AIzaSyDZjmkSx5xWc-86hsAIzedgDgRgy8vB7BQ';
  828. const rawSheetData = await $.getJSON(`https://sheets.googleapis.com/v4/spreadsheets/1DJEk390OYv5jWXEINl6PF3I1A8y1WrwrdPIsAL7SihI/values/Sheet1!A2:C?key=${apiKey}`);
  829. if (rawSheetData.values.length > 0) {
  830. _.each(rawSheetData.values, v => {
  831. if (!_allStandardsArray[v[1]]) _allStandardsArray[v[1]] = JSON.parse(v[0]);
  832. else {
  833. if (!_allStandardsArray[v[1]].Areas) _allStandardsArray[v[1]].Areas = {};
  834. _allStandardsArray[v[1]].Areas[v[2]] = JSON.parse(v[0]);
  835. if (v[2].startsWith('POLYGON')) _allStandardsArray[v[1]].Areas[v[2]].Polygon = new OL.Geometry.Polygon(WKT_to_LinearRing(v[2]));
  836. }
  837. });
  838. connectionEstablished = true;
  839. }
  840. if (connectionEstablished) {
  841. $('#lsConnectionStatus').text('Good');
  842. $('#lsConnectionStatus').css('backgroundColor', 'lime');
  843. } else {
  844. $('#lsConnectionStatus').text('Error');
  845. $('#lsConnectionStatus').css('backgroundColor', 'red');
  846. }
  847.  
  848. // Process state standards for later use
  849. _.each(_allStandardsArray, stateKey => {
  850. for (const k in stateKey) {
  851. if (stateKey.hasOwnProperty(k)) {
  852. // Check if strings are numbers and convert to numbers if so
  853. let keyValue = stateKey[k];
  854. // convert "" values to null
  855. if (keyValue == '') keyValue = null;
  856. // If lock is 1 then change to Auto to prevent excessive 1 locks
  857. let tempKey = parseInt(keyValue);
  858. if (!isNaN(tempKey)) {
  859. if (keyValue == 1) tempKey = 'Auto';
  860. keyValue = tempKey;
  861. }
  862. stateKey[k] = keyValue;
  863. }
  864. }
  865.  
  866. if (stateKey.Areas) {
  867. _.each(stateKey.Areas, polyArea => {
  868. for (const k in polyArea) {
  869. if (polyArea.hasOwnProperty(k)) {
  870. // Check if strings are numbers and convert to numbers if so
  871. let keyValue = polyArea[k];
  872. // convert "" values to null
  873. if (keyValue == '') keyValue = null;
  874. // If lock is 1 then change to Auto to prevent excessive 1 locks
  875. let tempKey = parseInt(keyValue);
  876. if (!isNaN(tempKey)) {
  877. if (keyValue == 1) tempKey = 'Auto';
  878. keyValue = tempKey;
  879. }
  880. polyArea[k] = keyValue;
  881. }
  882. }
  883. });
  884. }
  885. });
  886. }
  887.  
  888. function getCurrentState() {
  889. const overrideEnable = getId('lsManualStateOverride').checked;
  890. const disablePopup = getId('lsDisableStatePopup').checked;
  891. let statusOk = false;
  892. let attempts = 0;
  893.  
  894. function stateModelStatus() {
  895. const statesAvailable = W.model.states.getObjectArray();
  896.  
  897. if (statesAvailable) {
  898. // Verify the number of states currently available and either prompt for manual selection or set standards based on that state
  899. if (statesAvailable.length > 1) {
  900. if (!overrideEnable) {
  901. if (!disablePopup) WazeWrap.Alerts.info(GM_info.script.name, 'Multiple States available, please manually set the correct state or zoom in/out to reset the States layer');
  902. $('#ls-Current-State-Display').text('Multiple');
  903. } else statusOk = true;
  904. } else if (statesAvailable.length === 1 && !overrideEnable) {
  905. if (_currentState !== statesAvailable[0].name) {
  906. _currentState = statesAvailable[0].name;
  907. $('#ls-Current-State-Display').text(_currentState);
  908. setCurrentStandards(_currentState);
  909. statusOk = true;
  910. } else statusOk = true;
  911. } else if (attempts < 20) setTimeout(() => { stateModelStatus(attempts++); }, 300);
  912. } else if (attempts < 20) setTimeout(() => { stateModelStatus(attempts++); }, 300);
  913. else WazeWrap.Alerts.warning(GM_info.script.name, 'Error loading state array');
  914. }
  915. stateModelStatus();
  916. return statusOk;
  917. }
  918.  
  919. function generateStateList() {
  920. const stateSelector = getId('ls-State-Selection');
  921. const currOptionsLength = stateSelector.childNodes.length;
  922. const statesAvailable = W.model.states.getObjectArray();
  923.  
  924. // Removes any options currently attached to the select
  925. if (currOptionsLength > 0) {
  926. for (let i = 0; i < currOptionsLength; i++) {
  927. stateSelector.removeChild(stateSelector.firstChild);
  928. }
  929. }
  930.  
  931. // Adds available states to the user select
  932. for (let i = 0; i < statesAvailable.length; i++) {
  933. const currStateName = statesAvailable[i].name;
  934. const newStateOption = document.createElement('option');
  935. const stateNameText = document.createTextNode(currStateName);
  936. if (i === 0) {
  937. newStateOption.setAttribute('selected', true);
  938. _currentState = currStateName;
  939. }
  940. newStateOption.appendChild(stateNameText);
  941. stateSelector.appendChild(newStateOption);
  942. }
  943. }
  944.  
  945. function setCurrentStandards(stateName) {
  946. // Sets the locking standards based on the state and updates relevent UI components
  947.  
  948. function applyStandards() {
  949. _currentStateStandards = _allStandardsArray[stateName];
  950.  
  951. if (_currentStateStandards && _currentStateStandards.LS !== undefined) {
  952. if (!getId('lsEnableSaveValues').checked) {
  953. $('#lsLockStreetSelect').val(_currentStateStandards.LS);
  954. $('#lsLockPSSelect').val(_currentStateStandards.PS);
  955. $('#lsLockMinHSelect').val(_currentStateStandards.mH);
  956. $('#lsLockMajHSelect').val(_currentStateStandards.MH);
  957. $('#lsLockRmpSelect').val(_currentStateStandards.Ramp);
  958. $('#lsLockFwySelect').val(_currentStateStandards.Fwy);
  959. $('#lsLockPvtSelect').val(_currentStateStandards.Private);
  960. $('#lsLockPlrSelect').val(_currentStateStandards.PLR);
  961. $('#lsLockRailSelect').val(_currentStateStandards.Railroad);
  962. $('#lsLockFrySelect').val(_currentStateStandards.Ferry);
  963. $('#lsLockRnwySelect').val(_currentStateStandards.Runway);
  964. $('#lsLockOfrdSelect').val(_currentStateStandards.Offroad);
  965. $('#lsLockNonpedSelect').val(_currentStateStandards.NonRoutablePedestrian);
  966. }
  967.  
  968. // Setup seg attribute based locks on UI
  969. if (_currentStateStandards.Unpaved) {
  970. $('#ls-Unpaved-Enable').attr('disabled', false);
  971. $('#ls-Unpaved-Enable').prop('checked', true);
  972. $('#ls-Unpaved-Status').css({ 'background-color': 'rgb(205,133,63)', 'background-image': '' });
  973. } else {
  974. $('#ls-Unpaved-Enable').attr('disabled', true);
  975. $('#ls-Unpaved-Status').css({ 'background-image': 'repeating-linear-gradient(135deg,lightgrey,grey 10px,black 4px)', 'background-color': '' });
  976. }
  977. if (_currentStateStandards.LS1Way || _currentStateStandards.PS1Way || _currentStateStandards.mH1Way || _currentStateStandards.MH1Way || _currentStateStandards.Private1Way) {
  978. $('#ls-OneWay-Enable').attr('disabled', false);
  979. $('#ls-OneWay-Enable').prop('checked', true);
  980. $('#ls-OneWay-Status').css({ 'background-color': 'rgb(236,249,31)', 'background-image': '' });
  981. } else {
  982. $('#ls-OneWay-Enable').attr('disabled', true);
  983. $('#ls-OneWay-Status').css({ 'background-image': 'repeating-linear-gradient(135deg,lightgrey,grey 10px,black 4px)', 'background-color': '' });
  984. }
  985. if (_currentStateStandards.HOV) {
  986. $('#ls-HOV-Enable').attr('disabled', false);
  987. $('#ls-HOV-Enable').prop('checked', true);
  988. $('#ls-HOV-Status').css({ 'background-color': 'rgb(254,151,13)', 'background-image': '' });
  989. } else {
  990. $('#ls-HOV-Enable').attr('disabled', true);
  991. $('#ls-HOV-Status').css({ 'background-image': 'repeating-linear-gradient(135deg,lightgrey,grey 10px,black 4px)', 'background-color': '' });
  992. }
  993. if (_currentStateStandards.Toll) {
  994. $('#ls-Toll-Enable').attr('disabled', false);
  995. $('#ls-Toll-Enable').prop('checked', true);
  996. $('#ls-Toll-Status').css({ 'background-color': 'rgb(253,14,202)', 'background-image': '' });
  997. } else {
  998. $('#ls-Toll-Enable').attr('disabled', true);
  999. $('#ls-Toll-Status').css({ 'background-image': 'repeating-linear-gradient(135deg,lightgrey,grey 10px,black 4px)', 'background-color': '' });
  1000. }
  1001. if (_currentStateStandards.Areas) {
  1002. $('#ls-WKT-Enable').attr('disabled', false);
  1003. $('#ls-WKT-Enable').prop('checked', true);
  1004. $('#ls-WKT-Status').css({ 'background-color': 'rgb(9,235,255)', 'background-image': '' });
  1005. } else {
  1006. $('#ls-WKT-Enable').attr('disabled', true);
  1007. $('#ls-WKT-Status').css({ 'background-image': 'repeating-linear-gradient(135deg,lightgrey,grey 10px,black 4px)', 'background-color': '' });
  1008. }
  1009.  
  1010. console.log(`LS: Lock levels loaded for: ${stateName}`);
  1011. } else setTimeout(() => { applyStandards(); }, 200);
  1012. }
  1013. applyStandards();
  1014. }
  1015.  
  1016. function getId(iD) {
  1017. return document.getElementById(iD);
  1018. }
  1019.  
  1020. function onScreen(obj) {
  1021. if (obj.geometry) {
  1022. return (W.map.getExtent().intersectsBounds(obj.geometry.getBounds()));
  1023. }
  1024. return false;
  1025. }
  1026.  
  1027. function removeHighlights() {
  1028. LocksmithHighlightLayer.removeAllFeatures();
  1029. }
  1030.  
  1031. function processLocks(seg, currLockRnk, stdLockRnk) {
  1032. // Process lock action
  1033. if (stdLockRnk > _editorRank) stdLockRnk = _editorRank;
  1034. if (((currLockRnk < stdLockRnk) || (currLockRnk == null && stdLockRnk != null)
  1035. || ((currLockRnk > stdLockRnk) && (currLockRnk <= _editorRank)))
  1036. && seg.isGeometryEditable() && seg.attributes.hasClosures === false) {
  1037. W.model.actionManager.add(new UpdateObj(seg, { lockRank: stdLockRnk }));
  1038. return true;
  1039. } return false;
  1040. }
  1041.  
  1042. function getSegmentConditions(seg, conditions) {
  1043. // Determine segment attributes for locking exceptions
  1044. if ((seg.fwdDirection === false && seg.revDirection === true) || (seg.fwdDirection === true && seg.revDirection === false)) conditions.isOneWay = true;
  1045. if (seg.fwdToll === true || seg.revToll === true) conditions.isTollRoad = true;
  1046. if (seg.flags === 16) conditions.isUnpaved = true;
  1047. return conditions;
  1048. }
  1049.  
  1050. function getHighestLock(segID) {
  1051. const segObj = W.model.segments.getObjectById(segID);
  1052. const segType = segObj.attributes.roadType;
  1053. const checkedSegs = [];
  1054. let forwardLock = null;
  1055. let reverseLock = null;
  1056.  
  1057. function processForNode(forwardID) {
  1058. checkedSegs.push(forwardID);
  1059. const forNode = W.model.segments.getObjectById(forwardID).getToNode();
  1060. const forNodeSegs = [...forNode.attributes.segIDs];
  1061.  
  1062. for (let j = 0; j < forNodeSegs.length; j++) {
  1063. if (forNodeSegs[j] === forwardID) { forNodeSegs.splice(j, 1); }
  1064. }
  1065.  
  1066. for (let i = 0; i < forNodeSegs.length; i++) {
  1067. const conSeg = W.model.segments.getObjectById(forNodeSegs[i]).attributes;
  1068.  
  1069. if (conSeg.roadType !== segType) {
  1070. forwardLock = Math.max(conSeg.lockRank, forwardLock);
  1071. } else {
  1072. for (let k = 0; k < forNodeSegs.length; k++) {
  1073. if (!checkedSegs.some(segNum => segNum === conSeg.id)) {
  1074. const tempRank = processForNode(conSeg.id);
  1075. if (tempRank > forwardLock) forwardLock = tempRank;
  1076. }
  1077. }
  1078. }
  1079. }
  1080. return forwardLock;
  1081. }
  1082.  
  1083. function processRevNode(reverseID) {
  1084. checkedSegs.push(reverseID);
  1085. const revNode = W.model.segments.getObjectById(reverseID).getFromNode();
  1086. const revNodeSegs = [...revNode.attributes.segIDs];
  1087.  
  1088. for (let j = 0; j < revNodeSegs.length; j++) {
  1089. if (revNodeSegs[j] === reverseID) { revNodeSegs.splice(j, 1); }
  1090. }
  1091.  
  1092. for (let i = 0; i < revNodeSegs.length; i++) {
  1093. const conSeg = W.model.segments.getObjectById(revNodeSegs[i]).attributes;
  1094.  
  1095. if (conSeg.roadType !== segType) {
  1096. reverseLock = Math.max(conSeg.lockRank, reverseLock);
  1097. } else {
  1098. for (let k = 0; k < revNodeSegs.length; k++) {
  1099. if (!checkedSegs.some(segNum => segNum === conSeg.id)) {
  1100. const tempRank = processRevNode(conSeg.id);
  1101. if (tempRank > reverseLock) { reverseLock = tempRank; }
  1102. }
  1103. }
  1104. }
  1105. }
  1106. return reverseLock;
  1107. }
  1108.  
  1109. return Math.max(processForNode(segID), processRevNode(segID));
  1110. }
  1111.  
  1112. function processSegment(seg) {
  1113. const segAtt = seg.attributes;
  1114. const segType = segAtt.roadType;
  1115. let lockUpdateLvl = null;
  1116. let enUpdate = false;
  1117. let tempLocks = _currentStateStandards;
  1118. let possiblePolys = [];
  1119.  
  1120. // Gather primary segment locks from UI in case of user override of standards
  1121. tempLocks.LS = getId('lsLockStreetSelect').value;
  1122. tempLocks.PS = getId('lsLockPSSelect').value;
  1123. tempLocks.mH = getId('lsLockMinHSelect').value;
  1124. tempLocks.MH = getId('lsLockMajHSelect').value;
  1125. tempLocks.Ramp = getId('lsLockRmpSelect').value;
  1126. tempLocks.Fwy = getId('lsLockFwySelect').value;
  1127. tempLocks.Private = getId('lsLockPvtSelect').value;
  1128. tempLocks.PLR = getId('lsLockPlrSelect').value;
  1129. tempLocks.Railroad = getId('lsLockRailSelect').value;
  1130. tempLocks.Ferry = getId('lsLockFrySelect').value;
  1131. tempLocks.Offroad = getId('lsLockOfrdSelect').value;
  1132. tempLocks.Runway = getId('lsLockRnwySelect').value;
  1133. tempLocks.NonRoutablePedestrian = getId('lsLockNonpedSelect').value;
  1134. const unpavedChkd = getId('ls-Unpaved-Enable').checked;
  1135. const oneWayChkd = getId('ls-OneWay-Enable').checked;
  1136. const tollChkd = getId('ls-Toll-Enable').checked;
  1137. const wktChkd = getId('ls-WKT-Enable').checked;
  1138. // const hovChkd = getId('ls-HOV-Enable').checked;
  1139.  
  1140. if (seg.state !== 'Insert' && seg.state !== 'Delete') {
  1141. // Gather/verify info attached to segment
  1142. const priSt = W.model.streets.getObjectById(segAtt.primaryStreetID);
  1143. const cityObj = W.model.cities.getObjectById(priSt.cityID);
  1144. const cityName = cityObj.attributes.name;
  1145. const segStateName = W.model.states.getObjectById(cityObj.attributes.stateID).name;
  1146. // Setup object to verify certain segment attributes
  1147. const conditions = {
  1148. isOneWay: false,
  1149. isTollRoad: false,
  1150. isTunnel: false,
  1151. isUnpaved: false,
  1152. hasHeadlights: false
  1153. };
  1154.  
  1155. // Check if segment is in special city/polygon locking standards
  1156. if (wktChkd) {
  1157. _.each(tempLocks.Areas, (v, k) => {
  1158. if (!k.startsWith('POLYGON')) {
  1159. if (k === cityName) {
  1160. tempLocks = v;
  1161. }
  1162. } else { possiblePolys.push(v); }
  1163. });
  1164. for (let i = 0; i < possiblePolys.length; i++) {
  1165. if (possiblePolys[i].Polygon.intersects(seg.geometry)) {
  1166. tempLocks = possiblePolys[i];
  1167. break;
  1168. }
  1169. }
  1170. }
  1171.  
  1172. const coreLocks = {
  1173. lsLock: tempLocks.LS === 'Auto' ? 0 : tempLocks.LS - 1,
  1174. psLock: tempLocks.PS === 'Auto' ? 0 : tempLocks.PS - 1,
  1175. minHLock: tempLocks.mH === 'Auto' ? 0 : tempLocks.mH - 1,
  1176. majHLock: tempLocks.MH === 'Auto' ? 0 : tempLocks.MH - 1,
  1177. rmpLock: tempLocks.Ramp >= 0 ? tempLocks.Ramp - 1 : tempLocks.Ramp,
  1178. fwyLock: tempLocks.Fwy === 'Auto' ? 0 : tempLocks.Fwy - 1,
  1179. plrLock: tempLocks.PLR === 'Auto' ? 0 : tempLocks.PLR - 1,
  1180. pvtLock: tempLocks.Private === 'Auto' ? 0 : tempLocks.Private - 1,
  1181. nrpedLock: tempLocks.NonRoutablePedestrian === 'Auto' ? 0 : tempLocks.NonRoutablePedestrian - 1,
  1182. fryLock: tempLocks.Ferry === 'Auto' ? 0 : tempLocks.Ferry - 1,
  1183. rrLock: tempLocks.Railroad === 'Auto' ? 0 : tempLocks.Railroad - 1,
  1184. rnwyLock: tempLocks.Runway === 'Auto' ? 0 : tempLocks.Runway - 1,
  1185. offRoadLock: tempLocks.Offroad === 'Auto' ? 0 : tempLocks.Offroad - 1
  1186. };
  1187. const attLocks = {
  1188. pvtOneWay: tempLocks.Private1Way != null ? tempLocks.Private1Way - 1 : coreLocks.pvtLock,
  1189. plrOneWay: tempLocks.PLR1Way != null ? tempLocks.PLR1Way - 1 : coreLocks.plrLock,
  1190. lsOneWay: tempLocks.LS1Way != null ? tempLocks.LS1Way - 1 : coreLocks.lsLock,
  1191. psOneWay: tempLocks.PS1Way != null ? tempLocks.PS1Way - 1 : coreLocks.psLock,
  1192. minOneWay: tempLocks.mH1Way != null ? tempLocks.mH1Way - 1 : coreLocks.minHLock,
  1193. majOneWay: tempLocks.MH1Way != null ? tempLocks.MH1Way - 1 : coreLocks.majHLock,
  1194. tollLock: tempLocks.Toll != null ? tempLocks.Toll - 1 : null,
  1195. unpavedLock: tempLocks.Unpaved != null
  1196. };
  1197.  
  1198. if (seg.type === 'segment' && onScreen(seg) && (segStateName === _currentState)) {
  1199. getSegmentConditions(segAtt, conditions);
  1200.  
  1201. // Process local streets
  1202. if (segType === 1) {
  1203. lockUpdateLvl = coreLocks.lsLock;
  1204.  
  1205. if (conditions.isUnpaved && attLocks.unpavedLock && unpavedChkd) {
  1206. lockUpdateLvl++;
  1207. }
  1208. if (conditions.isOneWay && attLocks.lsOneWay && oneWayChkd) {
  1209. lockUpdateLvl = attLocks.lsOneWay;
  1210. }
  1211. enUpdate = true;
  1212. }
  1213. // Process primary streets
  1214. if (segType === 2) {
  1215. lockUpdateLvl = coreLocks.psLock;
  1216.  
  1217. if (conditions.isUnpaved && attLocks.unpavedLock && unpavedChkd) {
  1218. lockUpdateLvl++;
  1219. }
  1220. if (conditions.isOneWay && attLocks.psOneWay && oneWayChkd) {
  1221. lockUpdateLvl = attLocks.psOneWay;
  1222. }
  1223. enUpdate = true;
  1224. }
  1225. // Process Fwy
  1226. if (segType === 3) {
  1227. lockUpdateLvl = coreLocks.fwyLock;
  1228. enUpdate = true;
  1229. }
  1230. // Process ramps
  1231. if (segType === 4) {
  1232. lockUpdateLvl = coreLocks.rmpLock;
  1233. enUpdate = true;
  1234. if (lockUpdateLvl === 'HRCS') {
  1235. lockUpdateLvl = getHighestLock(segAtt.id);
  1236. }
  1237. }
  1238. // Process routable ped path
  1239. // if(segType == 5) {
  1240. // lockUpdateLvl = coreLocks.rpedLock;
  1241. // enUpdate = true;
  1242. // }
  1243. // Process MH
  1244. if (segType === 6) {
  1245. lockUpdateLvl = coreLocks.majHLock;
  1246.  
  1247. if (conditions.isUnpaved && attLocks.unpavedLock && unpavedChkd) {
  1248. lockUpdateLvl++;
  1249. }
  1250. if (conditions.isOneWay && attLocks.majHOneWay && oneWayChkd) {
  1251. lockUpdateLvl = attLocks.majOneWay;
  1252. }
  1253. enUpdate = true;
  1254. }
  1255. // Process minor highways
  1256. if (segType === 7) {
  1257. lockUpdateLvl = coreLocks.minHLock;
  1258.  
  1259. if (conditions.isUnpaved && attLocks.unpavedLock && unpavedChkd) {
  1260. lockUpdateLvl++;
  1261. }
  1262. if (conditions.isOneWay && attLocks.minHOneWay && oneWayChkd) {
  1263. lockUpdateLvl = attLocks.minHOneWay;
  1264. }
  1265. enUpdate = true;
  1266. }
  1267. // Process offroad
  1268. if (segType === 8) {
  1269. lockUpdateLvl = coreLocks.offRoadLock;
  1270. enUpdate = true;
  1271. }
  1272. // Process non-routable ped path
  1273. if (segType === 10) {
  1274. lockUpdateLvl = coreLocks.nrpedLock;
  1275. enUpdate = true;
  1276. }
  1277. // Process Ferry
  1278. if (segType === 15) {
  1279. lockUpdateLvl = coreLocks.fryLock;
  1280. enUpdate = true;
  1281. }
  1282. // Process PVT
  1283. if (segType === 17) {
  1284. lockUpdateLvl = coreLocks.pvtLock;
  1285.  
  1286. if (conditions.isUnpaved && attLocks.unpavedLock && unpavedChkd) {
  1287. lockUpdateLvl++;
  1288. }
  1289. if (conditions.isOneWay && attLocks.pvtOneWay && oneWayChkd) {
  1290. lockUpdateLvl = attLocks.pvtOneWay;
  1291. }
  1292. enUpdate = true;
  1293. }
  1294. // Process Railroads
  1295. if (segType === 18) {
  1296. lockUpdateLvl = coreLocks.rrLock;
  1297. enUpdate = true;
  1298. }
  1299. // Process Runways
  1300. if (segType === 19) {
  1301. lockUpdateLvl = coreLocks.rnwyLock;
  1302. enUpdate = true;
  1303. }
  1304. // Process PLR
  1305. if (segType === 20) {
  1306. lockUpdateLvl = coreLocks.plrLock;
  1307.  
  1308. if (conditions.isUnpaved && attLocks.unpavedLock && unpavedChkd) {
  1309. lockUpdateLvl++;
  1310. }
  1311. if (conditions.isOneWay && attLocks.plrOneWay && oneWayChkd) {
  1312. lockUpdateLvl = attLocks.plrOneWay;
  1313. }
  1314. enUpdate = true;
  1315. }
  1316. if (conditions.isTollRoad && attLocks.tollLock && tollChkd) {
  1317. lockUpdateLvl = attLocks.tollLock;
  1318. }
  1319. if (lockUpdateLvl === -1) lockUpdateLvl = 0;
  1320. }
  1321. }
  1322.  
  1323. if (enUpdate) return lockUpdateLvl;
  1324. return false;
  1325. }
  1326.  
  1327. function relockAll() {
  1328. let count = 0;
  1329. const resetHigher = getId('lsEnableResetHigher').checked;
  1330.  
  1331. if (getCurrentState()) {
  1332. _.each(W.model.segments.getObjectArray(), v => {
  1333. const segAtt = v.attributes;
  1334. const currLockRnk = segAtt.lockRank;
  1335. let updateSuccess;
  1336.  
  1337. const stdLockRank = processSegment(v);
  1338.  
  1339. if (stdLockRank !== false) {
  1340. if (currLockRnk < stdLockRank || (currLockRnk > stdLockRank && resetHigher)) {
  1341. updateSuccess = processLocks(v, currLockRnk, stdLockRank);
  1342. }
  1343. }
  1344. if (updateSuccess) count++;
  1345. });
  1346. resetUISegStats();
  1347.  
  1348. if (count > 0) WazeWrap.Alerts.info(GM_info.script.name, `Locked ${count} segments`);
  1349. else WazeWrap.Alerts.info(GM_info.script.name, 'No segments out of standards');
  1350. }
  1351. }
  1352.  
  1353. function tryScan() {
  1354. let modeCheck = false;
  1355. if (W.app.modeController.model.attributes.mode == 0 && !W.editingMediator.attributes.editingHouseNumbers) modeCheck = getId('lsEnableActiveScan').checked;
  1356. if (modeCheck) scanArea(false);
  1357. }
  1358.  
  1359. function scanArea(manual) {
  1360. // Start by resetting UI scan elements
  1361. resetUISegStats();
  1362. getCurrentState();
  1363.  
  1364. // Object with array of roadtypes, to collect each wrongly locked segment, for later use
  1365. const badLockSegs = {
  1366. ls: [], ps: [], mih: [], mah: [], rmp: [], fwy: [], plr: [], pvt: [], rail: [], fry: [], rnwy: [], ofrd: [], nrpd: [], othr: []
  1367. };
  1368. let incorrectLocks = false;
  1369. let numWrongLocks = 0;
  1370. const resetHigher = getId('lsEnableResetHigher').checked;
  1371. const ignoreHigher = getId('lsEnableIgnoreRank').checked;
  1372.  
  1373. function editorSufficientRank(segRank, standardRank) {
  1374. if (_editorRank >= segRank && _editorRank >= standardRank) { return true; } return false;
  1375. }
  1376.  
  1377. // Count how many segments need a corrected lock (limit to 150 to save CPU), accounts for the users editor level
  1378. _.each(W.model.segments.getObjectArray(), v => {
  1379. if (numWrongLocks < 150 && v.type === 'segment' && onScreen(v)) {
  1380. const correctLockRank = processSegment(v);
  1381.  
  1382. if (correctLockRank !== false) {
  1383. const segGeo = v.geometry;
  1384. const segType = v.attributes.roadType;
  1385. const segLockRank = v.attributes.lockRank;
  1386.  
  1387. // LS
  1388. if (segType === 1) {
  1389. if (resetHigher && segLockRank > correctLockRank && (editorSufficientRank(segLockRank, correctLockRank) || ignoreHigher)) {
  1390. badLockSegs.ls.push({
  1391. segID: v.attributes.id, currLockRnk: segLockRank, stdLockRnk: correctLockRank, lockError: 'high'
  1392. });
  1393. incorrectLocks = true;
  1394. numWrongLocks++;
  1395. highlightSegments('high', segGeo);
  1396. }
  1397. if (segLockRank < correctLockRank && (editorSufficientRank(segLockRank, correctLockRank) || ignoreHigher)) {
  1398. badLockSegs.ls.push({
  1399. segID: v.attributes.id, currLockRnk: segLockRank, stdLockRnk: correctLockRank, lockError: 'low'
  1400. });
  1401. incorrectLocks = true;
  1402. numWrongLocks++;
  1403. highlightSegments('low', segGeo);
  1404. }
  1405. }
  1406. // PS
  1407. if (segType === 2) {
  1408. if (resetHigher && segLockRank > correctLockRank && (editorSufficientRank(segLockRank, correctLockRank) || ignoreHigher)) {
  1409. badLockSegs.ps.push({
  1410. segID: v.attributes.id, currLockRnk: segLockRank, stdLockRnk: correctLockRank, lockError: 'high'
  1411. });
  1412. incorrectLocks = true;
  1413. numWrongLocks++;
  1414. highlightSegments('high', segGeo);
  1415. }
  1416. if (segLockRank < correctLockRank && (editorSufficientRank(segLockRank, correctLockRank) || ignoreHigher)) {
  1417. badLockSegs.ps.push({
  1418. segID: v.attributes.id, currLockRnk: segLockRank, stdLockRnk: correctLockRank, lockError: 'low'
  1419. });
  1420. incorrectLocks = true;
  1421. numWrongLocks++;
  1422. highlightSegments('low', segGeo);
  1423. }
  1424. }
  1425. // Fwy
  1426. if (segType === 3) {
  1427. if (resetHigher && segLockRank > correctLockRank && (editorSufficientRank(segLockRank, correctLockRank) || ignoreHigher)) {
  1428. badLockSegs.fwy.push({
  1429. segID: v.attributes.id, currLockRnk: segLockRank, stdLockRnk: correctLockRank, lockError: 'high'
  1430. });
  1431. incorrectLocks = true;
  1432. numWrongLocks++;
  1433. highlightSegments('high', segGeo);
  1434. }
  1435. if (segLockRank < correctLockRank && (editorSufficientRank(segLockRank, correctLockRank) || ignoreHigher)) {
  1436. badLockSegs.fwy.push({
  1437. segID: v.attributes.id, currLockRnk: segLockRank, stdLockRnk: correctLockRank, lockError: 'low'
  1438. });
  1439. incorrectLocks = true;
  1440. numWrongLocks++;
  1441. highlightSegments('low', segGeo);
  1442. }
  1443. }
  1444. // Rmp
  1445. if (segType === 4) {
  1446. if (resetHigher && segLockRank > correctLockRank && (editorSufficientRank(segLockRank, correctLockRank) || ignoreHigher)) {
  1447. badLockSegs.rmp.push({
  1448. segID: v.attributes.id, currLockRnk: segLockRank, stdLockRnk: correctLockRank, lockError: 'high'
  1449. });
  1450. incorrectLocks = true;
  1451. numWrongLocks++;
  1452. highlightSegments('high', segGeo);
  1453. }
  1454. if (segLockRank < correctLockRank && (editorSufficientRank(segLockRank, correctLockRank) || ignoreHigher)) {
  1455. badLockSegs.rmp.push({
  1456. segID: v.attributes.id, currLockRnk: segLockRank, stdLockRnk: correctLockRank, lockError: 'low'
  1457. });
  1458. incorrectLocks = true;
  1459. numWrongLocks++;
  1460. highlightSegments('low', segGeo);
  1461. }
  1462. }
  1463. // MH
  1464. if (segType === 6) {
  1465. if (resetHigher && segLockRank > correctLockRank && (editorSufficientRank(segLockRank, correctLockRank) || ignoreHigher)) {
  1466. badLockSegs.mah.push({
  1467. segID: v.attributes.id, currLockRnk: segLockRank, stdLockRnk: correctLockRank, lockError: 'high'
  1468. });
  1469. incorrectLocks = true;
  1470. numWrongLocks++;
  1471. highlightSegments('high', segGeo);
  1472. }
  1473. if (segLockRank < correctLockRank && (editorSufficientRank(segLockRank, correctLockRank) || ignoreHigher)) {
  1474. badLockSegs.mah.push({
  1475. segID: v.attributes.id, currLockRnk: segLockRank, stdLockRnk: correctLockRank, lockError: 'low'
  1476. });
  1477. incorrectLocks = true;
  1478. numWrongLocks++;
  1479. highlightSegments('low', segGeo);
  1480. }
  1481. }
  1482. // mH
  1483. if (segType === 7) {
  1484. if (resetHigher && segLockRank > correctLockRank && (editorSufficientRank(segLockRank, correctLockRank) || ignoreHigher)) {
  1485. badLockSegs.mih.push({
  1486. segID: v.attributes.id, currLockRnk: segLockRank, stdLockRnk: correctLockRank, lockError: 'high'
  1487. });
  1488. incorrectLocks = true;
  1489. numWrongLocks++;
  1490. highlightSegments('high', segGeo);
  1491. }
  1492. if (segLockRank < correctLockRank && (editorSufficientRank(segLockRank, correctLockRank) || ignoreHigher)) {
  1493. badLockSegs.mih.push({
  1494. segID: v.attributes.id, currLockRnk: segLockRank, stdLockRnk: correctLockRank, lockError: 'low'
  1495. });
  1496. incorrectLocks = true;
  1497. numWrongLocks++;
  1498. highlightSegments('low', segGeo);
  1499. }
  1500. }
  1501. // Offroad
  1502. if (segType === 8) {
  1503. if (resetHigher && segLockRank > correctLockRank && (editorSufficientRank(segLockRank, correctLockRank) || ignoreHigher)) {
  1504. badLockSegs.ofrd.push({
  1505. segID: v.attributes.id, currLockRnk: segLockRank, stdLockRnk: correctLockRank, lockError: 'high'
  1506. });
  1507. incorrectLocks = true;
  1508. numWrongLocks++;
  1509. highlightSegments('high', segGeo);
  1510. }
  1511. if (segLockRank < correctLockRank && (editorSufficientRank(segLockRank, correctLockRank) || ignoreHigher)) {
  1512. badLockSegs.ofrd.push({
  1513. segID: v.attributes.id, currLockRnk: segLockRank, stdLockRnk: correctLockRank, lockError: 'low'
  1514. });
  1515. incorrectLocks = true;
  1516. numWrongLocks++;
  1517. highlightSegments('low', segGeo);
  1518. }
  1519. }
  1520. // Non-Routable Ped
  1521. if (segType === 10) {
  1522. if (resetHigher && segLockRank > correctLockRank && (editorSufficientRank(segLockRank, correctLockRank) || ignoreHigher)) {
  1523. badLockSegs.nrpd.push({
  1524. segID: v.attributes.id, currLockRnk: segLockRank, stdLockRnk: correctLockRank, lockError: 'high'
  1525. });
  1526. incorrectLocks = true;
  1527. numWrongLocks++;
  1528. highlightSegments('high', segGeo);
  1529. }
  1530. if (segLockRank < correctLockRank && (editorSufficientRank(segLockRank, correctLockRank) || ignoreHigher)) {
  1531. badLockSegs.nrpd.push({
  1532. segID: v.attributes.id, currLockRnk: segLockRank, stdLockRnk: correctLockRank, lockError: 'low'
  1533. });
  1534. incorrectLocks = true;
  1535. numWrongLocks++;
  1536. highlightSegments('low', segGeo);
  1537. }
  1538. }
  1539. // Ferry
  1540. if (segType === 15) {
  1541. if (resetHigher && segLockRank > correctLockRank && (editorSufficientRank(segLockRank, correctLockRank) || ignoreHigher)) {
  1542. badLockSegs.fry.push({
  1543. segID: v.attributes.id, currLockRnk: segLockRank, stdLockRnk: correctLockRank, lockError: 'high'
  1544. });
  1545. incorrectLocks = true;
  1546. numWrongLocks++;
  1547. highlightSegments('high', segGeo);
  1548. }
  1549. if (segLockRank < correctLockRank && (editorSufficientRank(segLockRank, correctLockRank) || ignoreHigher)) {
  1550. badLockSegs.fry.push({
  1551. segID: v.attributes.id, currLockRnk: segLockRank, stdLockRnk: correctLockRank, lockError: 'low'
  1552. });
  1553. incorrectLocks = true;
  1554. numWrongLocks++;
  1555. highlightSegments('low', segGeo);
  1556. }
  1557. }
  1558. // Pvt
  1559. if (segType === 17) {
  1560. if (resetHigher && segLockRank > correctLockRank && (editorSufficientRank(segLockRank, correctLockRank) || ignoreHigher)) {
  1561. badLockSegs.pvt.push({
  1562. segID: v.attributes.id, currLockRnk: segLockRank, stdLockRnk: correctLockRank, lockError: 'high'
  1563. });
  1564. incorrectLocks = true;
  1565. numWrongLocks++;
  1566. highlightSegments('high', segGeo);
  1567. }
  1568. if (segLockRank < correctLockRank && (editorSufficientRank(segLockRank, correctLockRank) || ignoreHigher)) {
  1569. badLockSegs.pvt.push({
  1570. segID: v.attributes.id, currLockRnk: segLockRank, stdLockRnk: correctLockRank, lockError: 'low'
  1571. });
  1572. incorrectLocks = true;
  1573. numWrongLocks++;
  1574. highlightSegments('low', segGeo);
  1575. }
  1576. }
  1577. // Railroads
  1578. if (segType === 18) {
  1579. if (resetHigher && segLockRank > correctLockRank && (editorSufficientRank(segLockRank, correctLockRank) || ignoreHigher)) {
  1580. badLockSegs.rail.push({
  1581. segID: v.attributes.id, currLockRnk: segLockRank, stdLockRnk: correctLockRank, lockError: 'high'
  1582. });
  1583. incorrectLocks = true;
  1584. numWrongLocks++;
  1585. highlightSegments('high', segGeo);
  1586. }
  1587. if (segLockRank < correctLockRank && (editorSufficientRank(segLockRank, correctLockRank) || ignoreHigher)) {
  1588. badLockSegs.rail.push({
  1589. segID: v.attributes.id, currLockRnk: segLockRank, stdLockRnk: correctLockRank, lockError: 'low'
  1590. });
  1591. incorrectLocks = true;
  1592. numWrongLocks++;
  1593. highlightSegments('low', segGeo);
  1594. }
  1595. }
  1596. // Runway
  1597. if (segType === 19) {
  1598. if (resetHigher && segLockRank > correctLockRank && (editorSufficientRank(segLockRank, correctLockRank) || ignoreHigher)) {
  1599. badLockSegs.rnwy.push({
  1600. segID: v.attributes.id, currLockRnk: segLockRank, stdLockRnk: correctLockRank, lockError: 'high'
  1601. });
  1602. incorrectLocks = true;
  1603. numWrongLocks++;
  1604. highlightSegments('high', segGeo);
  1605. }
  1606. if (segLockRank < correctLockRank && (editorSufficientRank(segLockRank, correctLockRank) || ignoreHigher)) {
  1607. badLockSegs.rnwy.push({
  1608. segID: v.attributes.id, currLockRnk: segLockRank, stdLockRnk: correctLockRank, lockError: 'low'
  1609. });
  1610. incorrectLocks = true;
  1611. numWrongLocks++;
  1612. highlightSegments('low', segGeo);
  1613. }
  1614. }
  1615. // PLR
  1616. if (segType === 20) {
  1617. if (resetHigher && segLockRank > correctLockRank && (editorSufficientRank(segLockRank, correctLockRank) || ignoreHigher)) {
  1618. badLockSegs.plr.push({
  1619. segID: v.attributes.id, currLockRnk: segLockRank, stdLockRnk: correctLockRank, lockError: 'high'
  1620. });
  1621. incorrectLocks = true;
  1622. numWrongLocks++;
  1623. highlightSegments('high', segGeo);
  1624. }
  1625. if (segLockRank < correctLockRank && (editorSufficientRank(segLockRank, correctLockRank) || ignoreHigher)) {
  1626. badLockSegs.plr.push({
  1627. segID: v.attributes.id, currLockRnk: segLockRank, stdLockRnk: correctLockRank, lockError: 'low'
  1628. });
  1629. incorrectLocks = true;
  1630. numWrongLocks++;
  1631. highlightSegments('low', segGeo);
  1632. }
  1633. }
  1634. // All other segment types
  1635. if (segType === 8 || segType === 10 || segType === 15 || segType === 17 || segType === 18 || segType === 19 || segType === 20) {
  1636. if (resetHigher && segLockRank > correctLockRank && (editorSufficientRank(segLockRank, correctLockRank) || ignoreHigher)) {
  1637. badLockSegs.othr.push({
  1638. segID: v.attributes.id, currLockRnk: segLockRank, stdLockRnk: correctLockRank, lockError: 'high'
  1639. });
  1640. incorrectLocks = true;
  1641. numWrongLocks++;
  1642. highlightSegments('high', segGeo);
  1643. }
  1644. if (segLockRank < correctLockRank && (editorSufficientRank(segLockRank, correctLockRank) || ignoreHigher)) {
  1645. badLockSegs.othr.push({
  1646. segID: v.attributes.id, currLockRnk: segLockRank, stdLockRnk: correctLockRank, lockError: 'low'
  1647. });
  1648. incorrectLocks = true;
  1649. numWrongLocks++;
  1650. highlightSegments('low', segGeo);
  1651. }
  1652. }
  1653. }
  1654. }
  1655. });
  1656.  
  1657. function highlightSegments(errorType, segGeo) {
  1658. const enableHighlight = getId('lsEnableHighlightSeg').checked;
  1659. if (enableHighlight) {
  1660. const style = {
  1661. strokeColor: '', strokeLinecap: 'round', strokeWidth: 18, fill: false, strokeOpacity: 0.5
  1662. };
  1663. if (errorType === 'high') { style.strokeColor = 'cyan'; } else { style.strokeColor = 'red'; }
  1664.  
  1665. const geo = segGeo.clone();
  1666. const feature = new OL.Feature.Vector(geo, {}, style);
  1667. LocksmithHighlightLayer.addFeatures([feature]);
  1668. }
  1669. }
  1670.  
  1671. // Enable/configure UI elements if bad segments are found
  1672. let lsLow = 0; let lsHigh = 0;
  1673. let psLow = 0; let psHigh = 0;
  1674. let miLow = 0; let miHigh = 0;
  1675. let maLow = 0; let maHigh = 0;
  1676. let rmpLow = 0; let rmpHigh = 0;
  1677. let fwyLow = 0; let fwyHigh = 0;
  1678. let othrLow = 0; let othrHigh = 0;
  1679. let plrLow = 0; let plrHigh = 0;
  1680. let pvtLow = 0; let pvtHigh = 0;
  1681. let railLow = 0; let railHigh = 0;
  1682. let fryLow = 0; let fryHigh = 0;
  1683. let rnwyLow = 0; let rnwyHigh = 0;
  1684. let ofrdLow = 0; let ofrdHigh = 0;
  1685. let nrpdLow = 0; let nrpdHigh = 0;
  1686. if (incorrectLocks) {
  1687. _.each(badLockSegs, (key, value) => {
  1688. if (value === 'ls') {
  1689. for (let i = 0; i < key.length; i++) {
  1690. if (key[i].lockError === 'high') lsHigh++;
  1691. if (key[i].lockError === 'low') lsLow++;
  1692. }
  1693. if (lsHigh > 0 || lsLow > 0) {
  1694. changeUI('#icon-Lock-LS', 1, 'lock', 'both');
  1695. $('#icon-Lock-LS').click(() => {
  1696. for (let i = 0; i < badLockSegs.ls.length; i++) {
  1697. const aryData = badLockSegs.ls[i];
  1698. const seg = W.model.segments.getObjectById(aryData.segID);
  1699. processLocks(seg, aryData.currLockRnk, aryData.stdLockRnk);
  1700. }
  1701. changeUI('#icon-Lock-LS', 0, 'lock', null);
  1702. changeUI('#ls-LS-Lock-Up', 0, 'lock', null);
  1703. changeUI('#ls-LS-Lock-Down', 0, 'lock', null);
  1704. changeUI('#ls-LS-Low-Quan', 1, 'text', '--');
  1705. changeUI('#ls-LS-High-Quan', 1, 'text', '--');
  1706. });
  1707. if (lsHigh > 0) {
  1708. changeUI('#ls-LS-High-Quan', 1, 'text', lsHigh);
  1709. changeUI('#ls-LS-Lock-Down', 1, 'lock', 'high');
  1710.  
  1711. $('#ls-LS-Lock-Down').click(() => {
  1712. for (let i = 0; i < badLockSegs.ls.length; i++) {
  1713. const aryData = badLockSegs.ls[i];
  1714. const seg = W.model.segments.getObjectById(aryData.segID);
  1715. if (aryData.lockError === 'high') processLocks(seg, aryData.currLockRnk, aryData.stdLockRnk);
  1716. }
  1717. changeUI('#ls-LS-Lock-Down', 0, 'lock', null);
  1718. changeUI('#ls-LS-High-Quan', 1, 'text', '--');
  1719. lsHigh = 0;
  1720. if (lsLow === 0) changeUI('#icon-Lock-LS', 0, 'lock', null);
  1721. });
  1722. }
  1723. if (lsLow > 0) {
  1724. changeUI('#ls-LS-Low-Quan', 1, 'text', lsLow);
  1725. changeUI('#ls-LS-Lock-Up', 1, 'lock', 'low');
  1726.  
  1727. $('#ls-LS-Lock-Up').click(() => {
  1728. for (let i = 0; i < badLockSegs.ls.length; i++) {
  1729. const aryData = badLockSegs.ls[i];
  1730. const seg = W.model.segments.getObjectById(aryData.segID);
  1731. if (aryData.lockError === 'low') processLocks(seg, aryData.currLockRnk, aryData.stdLockRnk);
  1732. }
  1733. changeUI('#ls-LS-Lock-Up', 0, 'lock', null);
  1734. changeUI('#ls-LS-Low-Quan', 1, 'text', '--');
  1735. lsLow = 0;
  1736. if (lsHigh === 0) changeUI('#icon-Lock-LS', 0, 'lock', null);
  1737. });
  1738. }
  1739. }
  1740. }
  1741. if (value === 'ps') {
  1742. for (let i = 0; i < key.length; i++) {
  1743. if (key[i].lockError === 'high') psHigh++;
  1744. if (key[i].lockError === 'low') psLow++;
  1745. }
  1746. if (psHigh > 0 || psLow > 0) {
  1747. changeUI('#icon-Lock-PS', 1, 'lock', 'both');
  1748. $('#icon-Lock-PS').click(() => {
  1749. for (let i = 0; i < badLockSegs.ps.length; i++) {
  1750. const aryData = badLockSegs.ps[i];
  1751. const seg = W.model.segments.getObjectById(aryData.segID);
  1752. processLocks(seg, aryData.currLockRnk, aryData.stdLockRnk);
  1753. }
  1754. changeUI('#icon-Lock-PS', 0, 'lock', null);
  1755. changeUI('#ls-PS-Lock-Up', 0, 'lock', null);
  1756. changeUI('#ls-PS-Lock-Down', 0, 'lock', null);
  1757. changeUI('#ls-PS-Low-Quan', 1, 'text', '--');
  1758. changeUI('#ls-PS-High-Quan', 1, 'text', '--');
  1759. });
  1760. if (psHigh > 0) {
  1761. changeUI('#ls-PS-High-Quan', 1, 'text', psHigh);
  1762. changeUI('#ls-PS-Lock-Down', 1, 'lock', 'high');
  1763.  
  1764. $('#ls-PS-Lock-Down').click(() => {
  1765. for (let i = 0; i < badLockSegs.ps.length; i++) {
  1766. const aryData = badLockSegs.ps[i];
  1767. const seg = W.model.segments.getObjectById(aryData.segID);
  1768. if (aryData.lockError === 'high') processLocks(seg, aryData.currLockRnk, aryData.stdLockRnk);
  1769. }
  1770. changeUI('#ls-PS-Lock-Down', 0, 'lock', null);
  1771. changeUI('#ls-PS-High-Quan', 1, 'text', '--');
  1772. psHigh = 0;
  1773. if (psLow === 0) changeUI('#icon-Lock-PS', 0, 'lock', null);
  1774. });
  1775. }
  1776. if (psLow > 0) {
  1777. changeUI('#ls-PS-Low-Quan', 1, 'text', psLow);
  1778. changeUI('#ls-PS-Lock-Up', 1, 'lock', 'low');
  1779.  
  1780. $('#ls-PS-Lock-Up').click(() => {
  1781. for (let i = 0; i < badLockSegs.ps.length; i++) {
  1782. const aryData = badLockSegs.ps[i];
  1783. const seg = W.model.segments.getObjectById(aryData.segID);
  1784. if (aryData.lockError === 'low') processLocks(seg, aryData.currLockRnk, aryData.stdLockRnk);
  1785. }
  1786. changeUI('#ls-PS-Lock-Up', 0, 'lock', null);
  1787. changeUI('#ls-PS-Low-Quan', 1, 'text', '--');
  1788. psLow = 0;
  1789. if (psHigh === 0) changeUI('#icon-Lock-PS', 0, 'lock', null);
  1790. });
  1791. }
  1792. }
  1793. }
  1794. if (value === 'mih') {
  1795. for (let i = 0; i < key.length; i++) {
  1796. if (key[i].lockError === 'high') miHigh++;
  1797. if (key[i].lockError === 'low') miLow++;
  1798. }
  1799. if (miHigh > 0 || miLow > 0) {
  1800. changeUI('#icon-Lock-minH', 1, 'lock', 'both');
  1801. $('#icon-Lock-minH').click(() => {
  1802. for (let i = 0; i < badLockSegs.mih.length; i++) {
  1803. const aryData = badLockSegs.mih[i];
  1804. const seg = W.model.segments.getObjectById(aryData.segID);
  1805. processLocks(seg, aryData.currLockRnk, aryData.stdLockRnk);
  1806. }
  1807. changeUI('#icon-Lock-minH', 0, 'lock', null);
  1808. changeUI('#ls-minH-Lock-Up', 0, 'lock', null);
  1809. changeUI('#ls-minH-Lock-Down', 0, 'lock', null);
  1810. changeUI('#ls-minH-Low-Quan', 1, 'text', '--');
  1811. changeUI('#ls-minH-High-Quan', 1, 'text', '--');
  1812. });
  1813. if (miHigh > 0) {
  1814. changeUI('#ls-minH-High-Quan', 1, 'text', miHigh);
  1815. changeUI('#ls-minH-Lock-Down', 1, 'lock', 'high');
  1816.  
  1817. $('#ls-minH-Lock-Down').click(() => {
  1818. for (let i = 0; i < badLockSegs.mih.length; i++) {
  1819. const aryData = badLockSegs.mih[i];
  1820. const seg = W.model.segments.getObjectById(aryData.segID);
  1821. if (aryData.lockError === 'high') processLocks(seg, aryData.currLockRnk, aryData.stdLockRnk);
  1822. }
  1823. changeUI('#ls-minH-Lock-Down', 0, 'lock', null);
  1824. changeUI('#ls-minH-High-Quan', 1, 'text', '--');
  1825. miHigh = 0;
  1826. if (miLow === 0) changeUI('#icon-Lock-minH', 0, 'lock', null);
  1827. });
  1828. }
  1829. if (miLow > 0) {
  1830. changeUI('#ls-minH-Low-Quan', 1, 'text', miLow);
  1831. changeUI('#ls-minH-Lock-Up', 1, 'lock', 'low');
  1832.  
  1833. $('#ls-minH-Lock-Up').click(() => {
  1834. for (let i = 0; i < badLockSegs.mih.length; i++) {
  1835. const aryData = badLockSegs.mih[i];
  1836. const seg = W.model.segments.getObjectById(aryData.segID);
  1837. if (aryData.lockError === 'low') processLocks(seg, aryData.currLockRnk, aryData.stdLockRnk);
  1838. }
  1839. changeUI('#ls-minH-Lock-Up', 0, 'lock', null);
  1840. changeUI('#ls-minH-Low-Quan', 1, 'text', '--');
  1841. miLow = 0;
  1842. if (miHigh === 0) changeUI('#icon-Lock-minH', 0, 'lock', null);
  1843. });
  1844. }
  1845. }
  1846. }
  1847. if (value === 'mah') {
  1848. for (let i = 0; i < key.length; i++) {
  1849. if (key[i].lockError === 'high') maHigh++;
  1850. if (key[i].lockError === 'low') maLow++;
  1851. }
  1852. if (maHigh > 0 || maLow > 0) {
  1853. changeUI('#icon-Lock-majH', 1, 'lock', 'both');
  1854. $('#icon-Lock-majH').click(() => {
  1855. for (let i = 0; i < badLockSegs.mah.length; i++) {
  1856. const aryData = badLockSegs.mah[i];
  1857. const seg = W.model.segments.getObjectById(aryData.segID);
  1858. processLocks(seg, aryData.currLockRnk, aryData.stdLockRnk);
  1859. }
  1860. changeUI('#icon-Lock-majH', 0, 'lock', null);
  1861. changeUI('#ls-majH-Lock-Up', 0, 'lock', null);
  1862. changeUI('#ls-majH-Lock-Down', 0, 'lock', null);
  1863. changeUI('#ls-majH-Low-Quan', 1, 'text', '--');
  1864. changeUI('#ls-majH-High-Quan', 1, 'text', '--');
  1865. });
  1866. if (maHigh > 0) {
  1867. changeUI('#ls-majH-High-Quan', 1, 'text', maHigh);
  1868. changeUI('#ls-majH-Lock-Down', 1, 'lock', 'high');
  1869.  
  1870. $('#ls-majH-Lock-Down').click(() => {
  1871. for (let i = 0; i < badLockSegs.mah.length; i++) {
  1872. const aryData = badLockSegs.mah[i];
  1873. const seg = W.model.segments.getObjectById(aryData.segID);
  1874. if (aryData.lockError === 'high') processLocks(seg, aryData.currLockRnk, aryData.stdLockRnk);
  1875. }
  1876. changeUI('#ls-majH-Lock-Down', 0, 'lock', null);
  1877. changeUI('#ls-majH-High-Quan', 1, 'text', '--');
  1878. maHigh = 0;
  1879. if (maLow === 0) changeUI('#icon-Lock-majH', 0, 'lock', null);
  1880. });
  1881. }
  1882. if (maLow > 0) {
  1883. changeUI('#ls-majH-Low-Quan', 1, 'text', maLow);
  1884. changeUI('#ls-majH-Lock-Up', 1, 'lock', 'low');
  1885.  
  1886. $('#ls-majH-Lock-Up').click(() => {
  1887. for (let i = 0; i < badLockSegs.mah.length; i++) {
  1888. const aryData = badLockSegs.mah[i];
  1889. const seg = W.model.segments.getObjectById(aryData.segID);
  1890. if (aryData.lockError === 'low') processLocks(seg, aryData.currLockRnk, aryData.stdLockRnk);
  1891. }
  1892. changeUI('#ls-majH-Lock-Up', 0, 'lock', null);
  1893. changeUI('#ls-majH-Low-Quan', 1, 'text', '--');
  1894. maLow = 0;
  1895. if (maHigh === 0) changeUI('#icon-Lock-majH', 0, 'lock', null);
  1896. });
  1897. }
  1898. }
  1899. }
  1900. if (value === 'rmp') {
  1901. for (let i = 0; i < key.length; i++) {
  1902. if (key[i].lockError === 'high') rmpHigh++;
  1903. if (key[i].lockError === 'low') rmpLow++;
  1904. }
  1905. if (rmpHigh > 0 || rmpLow > 0) {
  1906. changeUI('#icon-Lock-Rmp', 1, 'lock', 'both');
  1907. $('#icon-Lock-Rmp').click(() => {
  1908. for (let i = 0; i < badLockSegs.rmp.length; i++) {
  1909. const aryData = badLockSegs.rmp[i];
  1910. const seg = W.model.segments.getObjectById(aryData.segID);
  1911. processLocks(seg, aryData.currLockRnk, aryData.stdLockRnk);
  1912. }
  1913. changeUI('#icon-Lock-Rmp', 0, 'lock', null);
  1914. changeUI('#ls-Rmp-Lock-Up', 0, 'lock', null);
  1915. changeUI('#ls-Rmp-Lock-Down', 0, 'lock', null);
  1916. changeUI('#ls-Rmp-Low-Quan', 1, 'text', '--');
  1917. changeUI('#ls-Rmp-High-Quan', 1, 'text', '--');
  1918. });
  1919. if (rmpHigh > 0) {
  1920. changeUI('#ls-Rmp-High-Quan', 1, 'text', rmpHigh);
  1921. changeUI('#ls-Rmp-Lock-Down', 1, 'lock', 'high');
  1922.  
  1923. $('#ls-Rmp-Lock-Down').click(() => {
  1924. for (let i = 0; i < badLockSegs.rmp.length; i++) {
  1925. const aryData = badLockSegs.rmp[i];
  1926. const seg = W.model.segments.getObjectById(aryData.segID);
  1927. if (aryData.lockError === 'high') processLocks(seg, aryData.currLockRnk, aryData.stdLockRnk);
  1928. }
  1929. changeUI('#ls-Rmp-Lock-Down', 0, 'lock', null);
  1930. changeUI('#ls-Rmp-High-Quan', 1, 'text', '--');
  1931. rmpHigh = 0;
  1932. if (rmpLow === 0) changeUI('#icon-Lock-Rmp', 0, 'lock', null);
  1933. });
  1934. }
  1935. if (rmpLow > 0) {
  1936. changeUI('#ls-Rmp-Low-Quan', 1, 'text', rmpLow);
  1937. changeUI('#ls-Rmp-Lock-Up', 1, 'lock', 'low');
  1938.  
  1939. $('#ls-Rmp-Lock-Up').click(() => {
  1940. for (let i = 0; i < badLockSegs.rmp.length; i++) {
  1941. const aryData = badLockSegs.rmp[i];
  1942. const seg = W.model.segments.getObjectById(aryData.segID);
  1943. if (aryData.lockError === 'low') processLocks(seg, aryData.currLockRnk, aryData.stdLockRnk);
  1944. }
  1945. changeUI('#ls-Rmp-Lock-Up', 0, 'lock', null);
  1946. changeUI('#ls-Rmp-Low-Quan', 1, 'text', '--');
  1947. rmpLow = 0;
  1948. if (rmpHigh === 0) changeUI('#icon-Lock-Rmp', 0, 'lock', null);
  1949. });
  1950. }
  1951. }
  1952. }
  1953. if (value === 'fwy') {
  1954. for (let i = 0; i < key.length; i++) {
  1955. if (key[i].lockError === 'high') fwyHigh++;
  1956. if (key[i].lockError === 'low') fwyLow++;
  1957. }
  1958. if (fwyHigh > 0 || fwyLow > 0) {
  1959. changeUI('#icon-Lock-Fwy', 1, 'lock', 'both');
  1960. $('#icon-Lock-Fwy').click(() => {
  1961. for (let i = 0; i < badLockSegs.fwy.length; i++) {
  1962. const aryData = badLockSegs.fwy[i];
  1963. const seg = W.model.segments.getObjectById(aryData.segID);
  1964. processLocks(seg, aryData.currLockRnk, aryData.stdLockRnk);
  1965. }
  1966. changeUI('#icon-Lock-Fwy', 0, 'lock', null);
  1967. changeUI('#ls-Fwy-Lock-Up', 0, 'lock', null);
  1968. changeUI('#ls-Fwy-Lock-Down', 0, 'lock', null);
  1969. changeUI('#ls-Fwy-Low-Quan', 1, 'text', '--');
  1970. changeUI('#ls-Fwy-High-Quan', 1, 'text', '--');
  1971. });
  1972. if (fwyHigh > 0) {
  1973. changeUI('#ls-Fwy-High-Quan', 1, 'text', fwyHigh);
  1974. changeUI('#ls-Fwy-Lock-Down', 1, 'lock', 'high');
  1975.  
  1976. $('#ls-Fwy-Lock-Down').click(() => {
  1977. for (let i = 0; i < badLockSegs.fwy.length; i++) {
  1978. const aryData = badLockSegs.fwy[i];
  1979. const seg = W.model.segments.getObjectById(aryData.segID);
  1980. if (aryData.lockError === 'high') processLocks(seg, aryData.currLockRnk, aryData.stdLockRnk);
  1981. }
  1982. changeUI('#ls-Fwy-Lock-Down', 0, 'lock', null);
  1983. changeUI('#ls-Fwy-High-Quan', 1, 'text', '--');
  1984. fwyHigh = 0;
  1985. if (fwyLow === 0) changeUI('#icon-Lock-Fwy', 0, 'lock', null);
  1986. });
  1987. }
  1988. if (fwyLow > 0) {
  1989. changeUI('#ls-Fwy-Low-Quan', 1, 'text', fwyLow);
  1990. changeUI('#ls-Fwy-Lock-Up', 1, 'lock', 'low');
  1991.  
  1992. $('#ls-Fwy-Lock-Up').click(() => {
  1993. for (let i = 0; i < badLockSegs.fwy.length; i++) {
  1994. const aryData = badLockSegs.fwy[i];
  1995. const seg = W.model.segments.getObjectById(aryData.segID);
  1996. if (aryData.lockError === 'low') processLocks(seg, aryData.currLockRnk, aryData.stdLockRnk);
  1997. }
  1998. changeUI('#ls-Fwy-Lock-Up', 0, 'lock', null);
  1999. changeUI('#ls-Fwy-Low-Quan', 1, 'text', '--');
  2000. fwyLow = 0;
  2001. if (fwyHigh === 0) changeUI('#icon-Lock-Fwy', 0, 'lock', null);
  2002. });
  2003. }
  2004. }
  2005. }
  2006. if (value === 'othr') {
  2007. for (let i = 0; i < key.length; i++) {
  2008. if (key[i].lockError === 'high') othrHigh++;
  2009. if (key[i].lockError === 'low') othrLow++;
  2010. }
  2011. if (othrHigh > 0 || othrLow > 0) {
  2012. changeUI('#icon-Lock-othr', 1, 'lock', 'both');
  2013. $('#icon-Lock-othr').click(() => {
  2014. for (let i = 0; i < badLockSegs.othr.length; i++) {
  2015. const aryData = badLockSegs.othr[i];
  2016. const seg = W.model.segments.getObjectById(aryData.segID);
  2017. processLocks(seg, aryData.currLockRnk, aryData.stdLockRnk);
  2018. }
  2019. changeUI('#icon-Lock-othr', 0, 'lock', null);
  2020. changeUI('#ls-othr-Lock-Up', 0, 'lock', null);
  2021. changeUI('#ls-othr-Lock-Down', 0, 'lock', null);
  2022. changeUI('#ls-othr-Low-Quan', 1, 'text', '--');
  2023. changeUI('#ls-othr-High-Quan', 1, 'text', '--');
  2024. });
  2025. if (othrHigh > 0) {
  2026. changeUI('#ls-othr-High-Quan', 1, 'text', othrHigh);
  2027. changeUI('#ls-othr-Lock-Down', 1, 'lock', 'high');
  2028. $('#ls-othr-Lock-Down').click(() => {
  2029. for (let i = 0; i < badLockSegs.othr.length; i++) {
  2030. const aryData = badLockSegs.othr[i];
  2031. const seg = W.model.segments.getObjectById(aryData.segID);
  2032. if (aryData.lockError === 'high') processLocks(seg, aryData.currLockRnk, aryData.stdLockRnk);
  2033. }
  2034. changeUI('#ls-othr-Lock-Down', 0, 'lock', null);
  2035. changeUI('#ls-othr-High-Quan', 1, 'text', '--');
  2036. othrHigh = 0;
  2037. if (othrLow === 0) changeUI('#icon-Lock-othr', 0, 'lock', null);
  2038. });
  2039. }
  2040. if (othrLow > 0) {
  2041. changeUI('#ls-othr-Low-Quan', 1, 'text', othrLow);
  2042. changeUI('#ls-othr-Lock-Up', 1, 'lock', 'low');
  2043. $('#ls-othr-Lock-Up').click(() => {
  2044. for (let i = 0; i < badLockSegs.othr.length; i++) {
  2045. const aryData = badLockSegs.othr[i];
  2046. const seg = W.model.segments.getObjectById(aryData.segID);
  2047. if (aryData.lockError === 'low') processLocks(seg, aryData.currLockRnk, aryData.stdLockRnk);
  2048. }
  2049. changeUI('#ls-othr-Lock-Up', 0, 'lock', null);
  2050. changeUI('#ls-othr-Low-Quan', 1, 'text', '--');
  2051. othrLow = 0;
  2052. if (othrHigh === 0) changeUI('#icon-Lock-othr', 0, 'lock', null);
  2053. });
  2054. }
  2055. }
  2056. }
  2057. if (value === 'plr') {
  2058. for (let i = 0; i < key.length; i++) {
  2059. if (key[i].lockError === 'high') plrHigh++;
  2060. if (key[i].lockError === 'low') plrLow++;
  2061. }
  2062. if (plrHigh > 0 || plrLow > 0) {
  2063. changeUI('#icon-Lock-Plr', 1, 'lock', 'both');
  2064. $('#icon-Lock-Plr').click(() => {
  2065. for (let i = 0; i < badLockSegs.plr.length; i++) {
  2066. const aryData = badLockSegs.plr[i];
  2067. const seg = W.model.segments.getObjectById(aryData.segID);
  2068. processLocks(seg, aryData.currLockRnk, aryData.stdLockRnk);
  2069. }
  2070. changeUI('#icon-Lock-Plr', 0, 'lock', null);
  2071. changeUI('#ls-Plr-Lock-Up', 0, 'lock', null);
  2072. changeUI('#ls-Plr-Lock-Down', 0, 'lock', null);
  2073. changeUI('#ls-Plr-Low-Quan', 1, 'text', '--');
  2074. changeUI('#ls-Plr-High-Quan', 1, 'text', '--');
  2075. });
  2076. if (plrHigh > 0) {
  2077. changeUI('#ls-Plr-High-Quan', 1, 'text', plrHigh);
  2078. changeUI('#ls-Plr-Lock-Down', 1, 'lock', 'high');
  2079. $('#ls-Plr-Lock-Down').click(() => {
  2080. for (let i = 0; i < badLockSegs.plr.length; i++) {
  2081. const aryData = badLockSegs.plr[i];
  2082. const seg = W.model.segments.getObjectById(aryData.segID);
  2083. if (aryData.lockError === 'high') processLocks(seg, aryData.currLockRnk, aryData.stdLockRnk);
  2084. }
  2085. changeUI('#ls-Plr-Lock-Down', 0, 'lock', null);
  2086. changeUI('#ls-Plr-High-Quan', 1, 'text', '--');
  2087. plrHigh = 0;
  2088. if (plrLow === 0) changeUI('#icon-Lock-Plr', 0, 'lock', null);
  2089. });
  2090. }
  2091. if (plrLow > 0) {
  2092. changeUI('#ls-Plr-Low-Quan', 1, 'text', plrLow);
  2093. changeUI('#ls-Plr-Lock-Up', 1, 'lock', 'low');
  2094. $('#ls-Plr-Lock-Up').click(() => {
  2095. for (let i = 0; i < badLockSegs.plr.length; i++) {
  2096. const aryData = badLockSegs.plr[i];
  2097. const seg = W.model.segments.getObjectById(aryData.segID);
  2098. if (aryData.lockError === 'low') processLocks(seg, aryData.currLockRnk, aryData.stdLockRnk);
  2099. }
  2100. changeUI('#ls-Plr-Lock-Up', 0, 'lock', null);
  2101. changeUI('#ls-Plr-Low-Quan', 1, 'text', '--');
  2102. plrLow = 0;
  2103. if (plrHigh === 0) changeUI('#icon-Lock-Plr', 0, 'lock', null);
  2104. });
  2105. }
  2106. }
  2107. }
  2108. if (value === 'pvt') {
  2109. for (let i = 0; i < key.length; i++) {
  2110. if (key[i].lockError === 'high') pvtHigh++;
  2111. if (key[i].lockError === 'low') pvtLow++;
  2112. }
  2113. if (pvtHigh > 0 || pvtLow > 0) {
  2114. changeUI('#icon-Lock-Pvt', 1, 'lock', 'both');
  2115. $('#icon-Lock-Pvt').click(() => {
  2116. for (let i = 0; i < badLockSegs.pvt.length; i++) {
  2117. const aryData = badLockSegs.pvt[i];
  2118. const seg = W.model.segments.getObjectById(aryData.segID);
  2119. processLocks(seg, aryData.currLockRnk, aryData.stdLockRnk);
  2120. }
  2121. changeUI('#icon-Lock-Pvt', 0, 'lock', null);
  2122. changeUI('#ls-Pvt-Lock-Up', 0, 'lock', null);
  2123. changeUI('#ls-Pvt-Lock-Down', 0, 'lock', null);
  2124. changeUI('#ls-Pvt-Low-Quan', 1, 'text', '--');
  2125. changeUI('#ls-Pvt-High-Quan', 1, 'text', '--');
  2126. });
  2127. if (pvtHigh > 0) {
  2128. changeUI('#ls-Pvt-High-Quan', 1, 'text', pvtHigh);
  2129. changeUI('#ls-Pvt-Lock-Down', 1, 'lock', 'high');
  2130. $('#ls-Pvt-Lock-Down').click(() => {
  2131. for (let i = 0; i < badLockSegs.pvt.length; i++) {
  2132. const aryData = badLockSegs.pvt[i];
  2133. const seg = W.model.segments.getObjectById(aryData.segID);
  2134. if (aryData.lockError === 'high') processLocks(seg, aryData.currLockRnk, aryData.stdLockRnk);
  2135. }
  2136. changeUI('#ls-Pvt-Lock-Down', 0, 'lock', null);
  2137. changeUI('#ls-Pvt-High-Quan', 1, 'text', '--');
  2138. pvtHigh = 0;
  2139. if (pvtLow === 0) changeUI('#icon-Lock-Pvt', 0, 'lock', null);
  2140. });
  2141. }
  2142. if (pvtLow > 0) {
  2143. changeUI('#ls-Pvt-Low-Quan', 1, 'text', pvtLow);
  2144. changeUI('#ls-Pvt-Lock-Up', 1, 'lock', 'low');
  2145. $('#ls-Pvt-Lock-Up').click(() => {
  2146. for (let i = 0; i < badLockSegs.pvt.length; i++) {
  2147. const aryData = badLockSegs.pvt[i];
  2148. const seg = W.model.segments.getObjectById(aryData.segID);
  2149. if (aryData.lockError === 'low') processLocks(seg, aryData.currLockRnk, aryData.stdLockRnk);
  2150. }
  2151. changeUI('#ls-Pvt-Lock-Up', 0, 'lock', null);
  2152. changeUI('#ls-Pvt-Low-Quan', 1, 'text', '--');
  2153. pvtLow = 0;
  2154. if (pvtHigh === 0) changeUI('#icon-Lock-Pvt', 0, 'lock', null);
  2155. });
  2156. }
  2157. }
  2158. }
  2159. if (value === 'rail') {
  2160. for (let i = 0; i < key.length; i++) {
  2161. if (key[i].lockError === 'high') railHigh++;
  2162. if (key[i].lockError === 'low') railLow++;
  2163. }
  2164. if (railHigh > 0 || railLow > 0) {
  2165. changeUI('#icon-Lock-Rail', 1, 'lock', 'both');
  2166. $('#icon-Lock-Rail').click(() => {
  2167. for (let i = 0; i < badLockSegs.rail.length; i++) {
  2168. const aryData = badLockSegs.rail[i];
  2169. const seg = W.model.segments.getObjectById(aryData.segID);
  2170. processLocks(seg, aryData.currLockRnk, aryData.stdLockRnk);
  2171. }
  2172. changeUI('#icon-Lock-Rail', 0, 'lock', null);
  2173. changeUI('#ls-Rail-Lock-Up', 0, 'lock', null);
  2174. changeUI('#ls-Rail-Lock-Down', 0, 'lock', null);
  2175. changeUI('#ls-Rail-Low-Quan', 1, 'text', '--');
  2176. changeUI('#ls-Rail-High-Quan', 1, 'text', '--');
  2177. });
  2178. if (railHigh > 0) {
  2179. changeUI('#ls-Rail-High-Quan', 1, 'text', railHigh);
  2180. changeUI('#ls-Rail-Lock-Down', 1, 'lock', 'high');
  2181. $('#ls-Rail-Lock-Down').click(() => {
  2182. for (let i = 0; i < badLockSegs.rail.length; i++) {
  2183. const aryData = badLockSegs.rail[i];
  2184. const seg = W.model.segments.getObjectById(aryData.segID);
  2185. if (aryData.lockError === 'high') processLocks(seg, aryData.currLockRnk, aryData.stdLockRnk);
  2186. }
  2187. changeUI('#ls-Rail-Lock-Down', 0, 'lock', null);
  2188. changeUI('#ls-Rail-High-Quan', 1, 'text', '--');
  2189. railHigh = 0;
  2190. if (railLow === 0) changeUI('#icon-Lock-Rail', 0, 'lock', null);
  2191. });
  2192. }
  2193. if (railLow > 0) {
  2194. changeUI('#ls-Rail-Low-Quan', 1, 'text', railLow);
  2195. changeUI('#ls-Rail-Lock-Up', 1, 'lock', 'low');
  2196. $('#ls-Rail-Lock-Up').click(() => {
  2197. for (let i = 0; i < badLockSegs.rail.length; i++) {
  2198. const aryData = badLockSegs.rail[i];
  2199. const seg = W.model.segments.getObjectById(aryData.segID);
  2200. if (aryData.lockError === 'low') processLocks(seg, aryData.currLockRnk, aryData.stdLockRnk);
  2201. }
  2202. changeUI('#ls-Rail-Lock-Up', 0, 'lock', null);
  2203. changeUI('#ls-Rail-Low-Quan', 1, 'text', '--');
  2204. railLow = 0;
  2205. if (railHigh === 0) changeUI('#icon-Lock-Rail', 0, 'lock', null);
  2206. });
  2207. }
  2208. }
  2209. }
  2210. if (value === 'fry') {
  2211. for (let i = 0; i < key.length; i++) {
  2212. if (key[i].lockError === 'high') fryHigh++;
  2213. if (key[i].lockError === 'low') fryLow++;
  2214. }
  2215. if (fryHigh > 0 || fryLow > 0) {
  2216. changeUI('#icon-Lock-Fry', 1, 'lock', 'both');
  2217. $('#icon-Lock-Fry').click(() => {
  2218. for (let i = 0; i < badLockSegs.fry.length; i++) {
  2219. const aryData = badLockSegs.fry[i];
  2220. const seg = W.model.segments.getObjectById(aryData.segID);
  2221. processLocks(seg, aryData.currLockRnk, aryData.stdLockRnk);
  2222. }
  2223. changeUI('#icon-Lock-Fry', 0, 'lock', null);
  2224. changeUI('#ls-Fry-Lock-Up', 0, 'lock', null);
  2225. changeUI('#ls-Fry-Lock-Down', 0, 'lock', null);
  2226. changeUI('#ls-Fry-Low-Quan', 1, 'text', '--');
  2227. changeUI('#ls-Fry-High-Quan', 1, 'text', '--');
  2228. });
  2229. if (fryHigh > 0) {
  2230. changeUI('#ls-Fry-High-Quan', 1, 'text', fryHigh);
  2231. changeUI('#ls-Fry-Lock-Down', 1, 'lock', 'high');
  2232. $('#ls-Fry-Lock-Down').click(() => {
  2233. for (let i = 0; i < badLockSegs.fry.length; i++) {
  2234. const aryData = badLockSegs.fry[i];
  2235. const seg = W.model.segments.getObjectById(aryData.segID);
  2236. if (aryData.lockError === 'high') processLocks(seg, aryData.currLockRnk, aryData.stdLockRnk);
  2237. }
  2238. changeUI('#ls-Fry-Lock-Down', 0, 'lock', null);
  2239. changeUI('#ls-Fry-High-Quan', 1, 'text', '--');
  2240. fryHigh = 0;
  2241. if (fryLow === 0) changeUI('#icon-Lock-Fry', 0, 'lock', null);
  2242. });
  2243. }
  2244. if (fryLow > 0) {
  2245. changeUI('#ls-Fry-Low-Quan', 1, 'text', fryLow);
  2246. changeUI('#ls-Fry-Lock-Up', 1, 'lock', 'low');
  2247. $('#ls-Fry-Lock-Up').click(() => {
  2248. for (let i = 0; i < badLockSegs.fry.length; i++) {
  2249. const aryData = badLockSegs.fry[i];
  2250. const seg = W.model.segments.getObjectById(aryData.segID);
  2251. if (aryData.lockError === 'low') processLocks(seg, aryData.currLockRnk, aryData.stdLockRnk);
  2252. }
  2253. changeUI('#ls-Fry-Lock-Up', 0, 'lock', null);
  2254. changeUI('#ls-Fry-Low-Quan', 1, 'text', '--');
  2255. fryLow = 0;
  2256. if (fryHigh === 0) changeUI('#icon-Lock-Fry', 0, 'lock', null);
  2257. });
  2258. }
  2259. }
  2260. }
  2261. if (value === 'rnwy') {
  2262. for (let i = 0; i < key.length; i++) {
  2263. if (key[i].lockError === 'high') rnwyHigh++;
  2264. if (key[i].lockError === 'low') rnwyLow++;
  2265. }
  2266. if (rnwyHigh > 0 || rnwyLow > 0) {
  2267. changeUI('#icon-Lock-Rnwy', 1, 'lock', 'both');
  2268. $('#icon-Lock-Rnwy').click(() => {
  2269. for (let i = 0; i < badLockSegs.rnwy.length; i++) {
  2270. const aryData = badLockSegs.rnwy[i];
  2271. const seg = W.model.segments.getObjectById(aryData.segID);
  2272. processLocks(seg, aryData.currLockRnk, aryData.stdLockRnk);
  2273. }
  2274. changeUI('#icon-Lock-Rnwy', 0, 'lock', null);
  2275. changeUI('#ls-Rnwy-Lock-Up', 0, 'lock', null);
  2276. changeUI('#ls-Rnwy-Lock-Down', 0, 'lock', null);
  2277. changeUI('#ls-Rnwy-Low-Quan', 1, 'text', '--');
  2278. changeUI('#ls-Rnwy-High-Quan', 1, 'text', '--');
  2279. });
  2280. if (rnwyHigh > 0) {
  2281. changeUI('#ls-Rnwy-High-Quan', 1, 'text', rnwyHigh);
  2282. changeUI('#ls-Rnwy-Lock-Down', 1, 'lock', 'high');
  2283. $('#ls-Rnwy-Lock-Down').click(() => {
  2284. for (let i = 0; i < badLockSegs.rnwy.length; i++) {
  2285. const aryData = badLockSegs.rnwy[i];
  2286. const seg = W.model.segments.getObjectById(aryData.segID);
  2287. if (aryData.lockError === 'high') processLocks(seg, aryData.currLockRnk, aryData.stdLockRnk);
  2288. }
  2289. changeUI('#ls-Rnwy-Lock-Down', 0, 'lock', null);
  2290. changeUI('#ls-Rnwy-High-Quan', 1, 'text', '--');
  2291. rnwyHigh = 0;
  2292. if (rnwyLow === 0) changeUI('#icon-Lock-Rnwy', 0, 'lock', null);
  2293. });
  2294. }
  2295. if (rnwyLow > 0) {
  2296. changeUI('#ls-Rnwy-Low-Quan', 1, 'text', rnwyLow);
  2297. changeUI('#ls-Rnwy-Lock-Up', 1, 'lock', 'low');
  2298. $('#ls-Rnwy-Lock-Up').click(() => {
  2299. for (let i = 0; i < badLockSegs.rnwy.length; i++) {
  2300. const aryData = badLockSegs.rnwy[i];
  2301. const seg = W.model.segments.getObjectById(aryData.segID);
  2302. if (aryData.lockError === 'low') processLocks(seg, aryData.currLockRnk, aryData.stdLockRnk);
  2303. }
  2304. changeUI('#ls-Rnwy-Lock-Up', 0, 'lock', null);
  2305. changeUI('#ls-Rnwy-Low-Quan', 1, 'text', '--');
  2306. rnwyLow = 0;
  2307. if (rnwyHigh === 0) changeUI('#icon-Lock-Rnwy', 0, 'lock', null);
  2308. });
  2309. }
  2310. }
  2311. }
  2312. if (value === 'ofrd') {
  2313. for (let i = 0; i < key.length; i++) {
  2314. if (key[i].lockError === 'high') ofrdHigh++;
  2315. if (key[i].lockError === 'low') ofrdLow++;
  2316. }
  2317. if (ofrdHigh > 0 || ofrdLow > 0) {
  2318. changeUI('#icon-Lock-Ofrd', 1, 'lock', 'both');
  2319. $('#icon-Lock-Ofrd').click(() => {
  2320. for (let i = 0; i < badLockSegs.ofrd.length; i++) {
  2321. const aryData = badLockSegs.ofrd[i];
  2322. const seg = W.model.segments.getObjectById(aryData.segID);
  2323. processLocks(seg, aryData.currLockRnk, aryData.stdLockRnk);
  2324. }
  2325. changeUI('#icon-Lock-Ofrd', 0, 'lock', null);
  2326. changeUI('#ls-Ofrd-Lock-Up', 0, 'lock', null);
  2327. changeUI('#ls-Ofrd-Lock-Down', 0, 'lock', null);
  2328. changeUI('#ls-Ofrd-Low-Quan', 1, 'text', '--');
  2329. changeUI('#ls-Ofrd-High-Quan', 1, 'text', '--');
  2330. });
  2331. if (ofrdHigh > 0) {
  2332. changeUI('#ls-Ofrd-High-Quan', 1, 'text', ofrdHigh);
  2333. changeUI('#ls-Ofrd-Lock-Down', 1, 'lock', 'high');
  2334. $('#ls-Ofrd-Lock-Down').click(() => {
  2335. for (let i = 0; i < badLockSegs.ofrd.length; i++) {
  2336. const aryData = badLockSegs.ofrd[i];
  2337. const seg = W.model.segments.getObjectById(aryData.segID);
  2338. if (aryData.lockError === 'high') processLocks(seg, aryData.currLockRnk, aryData.stdLockRnk);
  2339. }
  2340. changeUI('#ls-Ofrd-Lock-Down', 0, 'lock', null);
  2341. changeUI('#ls-Ofrd-High-Quan', 1, 'text', '--');
  2342. ofrdHigh = 0;
  2343. if (ofrdLow === 0) changeUI('#icon-Lock-Ofrd', 0, 'lock', null);
  2344. });
  2345. }
  2346. if (ofrdLow > 0) {
  2347. changeUI('#ls-Ofrd-Low-Quan', 1, 'text', ofrdLow);
  2348. changeUI('#ls-Ofrd-Lock-Up', 1, 'lock', 'low');
  2349. $('#ls-Ofrd-Lock-Up').click(() => {
  2350. for (let i = 0; i < badLockSegs.ofrd.length; i++) {
  2351. const aryData = badLockSegs.ofrd[i];
  2352. const seg = W.model.segments.getObjectById(aryData.segID);
  2353. if (aryData.lockError === 'low') processLocks(seg, aryData.currLockRnk, aryData.stdLockRnk);
  2354. }
  2355. changeUI('#ls-Ofrd-Lock-Up', 0, 'lock', null);
  2356. changeUI('#ls-Ofrd-Low-Quan', 1, 'text', '--');
  2357. ofrdLow = 0;
  2358. if (ofrdHigh === 0) changeUI('#icon-Lock-Ofrd', 0, 'lock', null);
  2359. });
  2360. }
  2361. }
  2362. }
  2363. if (value === 'nrpd') {
  2364. for (let i = 0; i < key.length; i++) {
  2365. if (key[i].lockError === 'high') nrpdHigh++;
  2366. if (key[i].lockError === 'low') nrpdLow++;
  2367. }
  2368. if (nrpdHigh > 0 || nrpdLow > 0) {
  2369. changeUI('#icon-Lock-Nonped', 1, 'lock', 'both');
  2370. $('#icon-Lock-Nonped').click(() => {
  2371. for (let i = 0; i < badLockSegs.nrpd.length; i++) {
  2372. const aryData = badLockSegs.nrpd[i];
  2373. const seg = W.model.segments.getObjectById(aryData.segID);
  2374. processLocks(seg, aryData.currLockRnk, aryData.stdLockRnk);
  2375. }
  2376. changeUI('#icon-Lock-Nonped', 0, 'lock', null);
  2377. changeUI('#ls-Nonped-Lock-Up', 0, 'lock', null);
  2378. changeUI('#ls-Nonped-Lock-Down', 0, 'lock', null);
  2379. changeUI('#ls-Nonped-Low-Quan', 1, 'text', '--');
  2380. changeUI('#ls-Nonped-High-Quan', 1, 'text', '--');
  2381. });
  2382. if (nrpdHigh > 0) {
  2383. changeUI('#ls-Nonped-High-Quan', 1, 'text', nrpdHigh);
  2384. changeUI('#ls-Nonped-Lock-Down', 1, 'lock', 'high');
  2385. $('#ls-Nonped-Lock-Down').click(() => {
  2386. for (let i = 0; i < badLockSegs.nrpd.length; i++) {
  2387. const aryData = badLockSegs.nrpd[i];
  2388. const seg = W.model.segments.getObjectById(aryData.segID);
  2389. if (aryData.lockError === 'high') processLocks(seg, aryData.currLockRnk, aryData.stdLockRnk);
  2390. }
  2391. changeUI('#ls-Nonped-Lock-Down', 0, 'lock', null);
  2392. changeUI('#ls-Nonped-High-Quan', 1, 'text', '--');
  2393. nrpdHigh = 0;
  2394. if (nrpdLow === 0) changeUI('#icon-Lock-Nonped', 0, 'lock', null);
  2395. });
  2396. }
  2397. if (nrpdLow > 0) {
  2398. changeUI('#ls-Nonped-Low-Quan', 1, 'text', nrpdLow);
  2399. changeUI('#ls-Nonped-Lock-Up', 1, 'lock', 'low');
  2400. $('#ls-Nonped-Lock-Up').click(() => {
  2401. for (let i = 0; i < badLockSegs.nrpd.length; i++) {
  2402. const aryData = badLockSegs.nrpd[i];
  2403. const seg = W.model.segments.getObjectById(aryData.segID);
  2404. if (aryData.lockError === 'low') processLocks(seg, aryData.currLockRnk, aryData.stdLockRnk);
  2405. }
  2406. changeUI('#ls-Nonped-Lock-Up', 0, 'lock', null);
  2407. changeUI('#ls-Nonped-Low-Quan', 1, 'text', '--');
  2408. nrpdLow = 0;
  2409. if (nrpdHigh === 0) changeUI('#icon-Lock-Nonped', 0, 'lock', null);
  2410. });
  2411. }
  2412. }
  2413. }
  2414. });
  2415.  
  2416. let isActiveTab = $("a[href$='#sidepanel-lsus']").parent().prop('class');
  2417. if (isActiveTab === '' || isActiveTab !== 'active') $("a[href$='#sidepanel-lsus']").css('background-color', '#ed503bb5');
  2418. } else {
  2419. if (manual) WazeWrap.Alerts.info(GM_info.script.name, 'No segments out of standards');
  2420. }
  2421. }
  2422.  
  2423. Locksmithbootstrap();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址