WME RRC AutoLock

Locks RRCs and Cameras to set level instead of autolock to rank of editor

  1. // ==UserScript==
  2. // @name WME RRC AutoLock
  3. // @namespace https://github.com/jm6087
  4. // @version 2023.09.26.01
  5. // @description Locks RRCs and Cameras to set level instead of autolock to rank of editor
  6. // @author jm6087 (with assistance from Dude495, TheCre8r, and SkiDooGuy)
  7. // @match https://www.waze.com/editor*
  8. // @match https://www.waze.com/*/editor*
  9. // @match https://beta.waze.com/editor*
  10. // @match https://beta.waze.com/*/editor*
  11. // @exclude https://www.waze.com/user/editor*
  12. // @require https://gf.qytechs.cn/scripts/24851-wazewrap/code/WazeWrap.js
  13. // @require https://gf.qytechs.cn/scripts/27254-clipboard-js/code/clipboardjs.js
  14. // @grant none
  15. // ==/UserScript==
  16.  
  17. /* global W */
  18. /* global WazeWrap */
  19. /* global $ */
  20. /* global I18n */
  21. /* global wazedevtoastr */
  22. /* global CleanPermaLinkShortcut */
  23. /* global wmeRRCAL */
  24. /* global _ */
  25.  
  26.  
  27. let UpdateObj;
  28.  
  29. (function() {
  30. 'use strict';
  31. var UPDATE_NOTES = `Fix for WazeWrap update<br>
  32. `
  33. // PREVIOUS NOTES
  34. // Variables that designate beta version - Do no copy to other versions
  35. var TAB_NAME = 'RRC-AL-β';
  36. let sPanel = `#sidepanel-rrc-al-`;
  37. const STORE_NAME = "RRCSettingsBETA";
  38. let LS = 1594558757308;
  39.  
  40. const CountrySS = 'https://sheets.googleapis.com/v4/spreadsheets/1wPb4tqTsES7EgAyxVqRRsRiWBDurld5NzN7IdC4pnSo/values/CountryMinimumLocks/?key='+atob('QUl6YVN5QXUxcl84ZDBNdkJUdEFwQ2VZdndDUXR6M2I0cmhWZFNn');
  41. const BetaSS = 'https://sheets.googleapis.com/v4/spreadsheets/1wPb4tqTsES7EgAyxVqRRsRiWBDurld5NzN7IdC4pnSo/values/Beta/?key='+atob('QUl6YVN5QXUxcl84ZDBNdkJUdEFwQ2VZdndDUXR6M2I0cmhWZFNn');
  42. var BETA_TESTERS = [];
  43. var COUNTRYID = [];
  44. let countQty;
  45. var currentEdits;
  46. var EDITdifference;
  47.  
  48. // Other variables
  49. var VERSION = GM_info.script.version;
  50. var SCRIPT_NAME = GM_info.script.name;
  51. const USER = {name: null, rank:null};
  52. var RRCAutoLockSettings;
  53. var LastEditorUserName;
  54. var CameraType;
  55. var CameraTypeWW;
  56. const mapCenter = {lon: null, lat: null};
  57. const Lang = "en-US";
  58. var newCleanPL;
  59. var OpenBrack;
  60. var ClosedBrack;
  61. var RRCAutoLock;
  62. var newLockLevel;
  63. let UpdateObj;
  64. var SelModel;
  65. var RRCAutolockRankplusOne;
  66. var RRCAutoLockRankOverLock;
  67. var modelRank; // -- DBSOONER
  68. var manAuto;
  69. var SelMan;
  70. var count;
  71. var evalCount;
  72. var CountryID;
  73. var tabColor;
  74. var originalLon;
  75. var movedLon;
  76. var originalZoom;
  77. var movedZoom;
  78. var RRCscreenCount;
  79. var ECscreenCount;
  80. var RRCmin;
  81. var ECmin;
  82. var CountryName;
  83. var forceDefault;
  84. var PLzoomLevel;
  85. var zm0, zm1, zm2, zm3, zm4, zm5, zm6, zm7, zm8, zm9, zm10;
  86.  
  87. [zm0, zm1, zm2, zm3, zm4, zm5, zm6, zm7, zm8, zm9, zm10] = [12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22]
  88.  
  89. function RRCscreenLock(){
  90. const extentGeometry = W.map.getOLMap().getExtent().toGeometry();
  91. count = 0;
  92. evalCount = 0;
  93. CameraTypeWW = "Railroad Crossing";
  94. _.each(W.model.railroadCrossings.getObjectArray(), v => {
  95. if (extentGeometry.intersects(v.geometry)) {
  96. evalCount++;
  97. if (count < countQty) {
  98. SelModel = v;
  99. manAuto = "Auto";
  100. RRCsharedLock();
  101. }
  102. }
  103. })
  104. ScreenlockCompleted();
  105. }
  106. function ECscreenLock(){
  107. const extentGeometry = W.map.getOLMap().getExtent().toGeometry();
  108. count = 0;
  109. evalCount = 0;
  110. CameraTypeWW = "Enforcement Camera";
  111. _.each(W.model.cameras.getObjectArray(), v => {
  112. if (extentGeometry.intersects(v.geometry)) {
  113. evalCount++;
  114. if (count < countQty) {
  115. SelModel = v;
  116. manAuto = "Auto";
  117. RRCsharedLock();
  118. }
  119. }
  120. })
  121. ScreenlockCompleted();
  122. }
  123.  
  124. function ScreenlockCompleted() {
  125. wazedevtoastr.options.timeOut = 5000;
  126. if (count == 0) {
  127. WazeWrap.Alerts.info(SCRIPT_NAME, ['All ' + CameraTypeWW + ' are already at assigned lock level, above', 'your edit rank, or the ' + CameraTypeWW + ' are not in your editable area', 'No changes were made'].join('\n'));
  128. }else{
  129. originalLon = "";
  130. RRCscreenMove()
  131. WazeWrap.Alerts.success(SCRIPT_NAME, ['RRC-AL locked ' + count + " (of " + evalCount + ") " + CameraTypeWW, ' that were equal to or below ' + USER.rank, 'They are now locked at lock level ' + newLockLevel].join('\n'));
  132. // console.log (SCRIPT_NAME, "RCC Screenlock completed");
  133. }
  134. }
  135.  
  136. function setRRCAutoLock() {
  137. SelMan = W.selectionManager;
  138. if (SelMan.getSelectedDataModelObjects().length > 0){ // Determines if there is an item selected
  139. // SelModel = SelMan.getSelectedFeatures()[0].model;
  140. SelModel = SelMan.getSelectedDataModelObjects()[0];
  141. manAuto = "Manual";
  142. RRCsharedLock();
  143. originalLon = "";
  144. RRCscreenMove()
  145. }
  146. }
  147.  
  148. function RRCsharedLock () {
  149.  
  150. wazedevtoastr.options.timeOut = 2500; // Used to adjust the timing of the WW banner messages
  151. if ((SelModel.type !== 'camera') && (SelModel.type !== 'railroadCrossing')) return; // Suggested by DBSOONER - exits script if the object selected is not what I want
  152.  
  153. if (SelModel.type === 'camera'){ // Determines camera type is Enforcement Camera
  154. CameraType = 'camera';
  155. CameraTypeWW = 'Enforcement Camera';
  156. modelRank = ($('#ECAutoLockLevelOption')[0].value - 1);
  157. }else{
  158. if (SelModel.type === 'railroadCrossing'){
  159. CameraType = 'railroadCrossing';
  160. CameraTypeWW = 'Railroad Crossing';
  161. modelRank = ($('#RRCAutoLockLevelOption')[0].value - 1);
  162. }
  163. }
  164. if (USER.rank >= SelModel.attributes.rank + 1 && SelModel.arePropertiesEditable() == false){ // Checking to see if the the editor is high enough rank and if the so, then checking to see if the camera is editable. If not, then must not be in EA.
  165. if (manAuto == "Manual") {
  166. wazedevtoastr.options.timeOut = 6000;
  167. WazeWrap.Alerts.error(SCRIPT_NAME, [CameraTypeWW + ' does not appear to be in your edit area.', 'Please check your Editable Areas layer to ensure you have edit rights'].join('\n'));
  168. }
  169. }else{
  170. //checks to see if Enabled is checked
  171. if (RRCAutoLockSettings.RRCAutoLockEnabled == false && CameraType == 'railroadCrossing') // Warning message is valid and MUST be there
  172. return console.log(SCRIPT_NAME, CameraTypeWW + " is disabled");
  173. if (RRCAutoLockSettings.ECAutoLockEnabled == false && CameraType == 'camera') // Warning message is valid and MUST be there
  174. return console.log(SCRIPT_NAME, CameraTypeWW + " is disabled");
  175. console.log(SCRIPT_NAME, "Script is enabled");
  176.  
  177. RRCAutoLockRankOverLock = SelModel.attributes.rank + 1; // Checks rank of selected RRC or EC
  178. if ((SelModel.attributes.unapproved == true) || (SelModel.attributes.lockRank == null)) { // Checks to see if selected RRC or EC is unverified
  179. RRCAutolockRankplusOne = ("Auto (" + (SelModel.attributes.rank + 1)+")"); // If unverified, sets the text for WW with Auto(lock number)
  180. }else{
  181. RRCAutolockRankplusOne = SelModel.attributes.lockRank + 1; // If already verified, sets text for WW to lock number only
  182. };
  183. if (USER.rank < modelRank + 1){
  184. newLockLevel = USER.rank;
  185. if (manAuto == "Manual") {
  186. RRCAutoLock = document.querySelector("#lockRank-" + USER.rank - 1); // Sets variable for which lockrank to click if the user rank is less than the settings
  187. }else{
  188. if (manAuto == "Auto") {
  189. RRCAutoLock = USER.rank - 1;
  190. }
  191. }
  192. }else{
  193. newLockLevel = modelRank + 1;
  194. if (manAuto == "Manual") {
  195. RRCAutoLock = document.querySelector("#lockRank-" + modelRank); // Sets variable for which lockrank to click
  196. }else{
  197. if (manAuto == "Auto") {
  198. RRCAutoLock = modelRank;
  199. }
  200. }
  201. }
  202. if (manAuto == "Manual") {
  203. if (SelMan.hasSelectedFeatures() && SelModel.type === CameraType){
  204. // Finds ID number of the last editor
  205. let lastEditBy = SelModel.attributes.updatedBy;
  206. if (lastEditBy === null) {
  207. lastEditBy = SelModel.attributes.createdBy;
  208. }
  209. if (lastEditBy == undefined) {
  210. LastEditorUserName = USER.name;
  211. }else{
  212. // Finds the UserName based off the ID of last editor
  213. LastEditorUserName = W.model.users.objects[lastEditBy].userName;
  214. }
  215. }
  216. }
  217.  
  218. // Checks to see if User Rank is higher/equal to object lock AND if object is not equal to dropdown lock level in panel
  219. if ((USER.rank >= (SelModel.attributes.rank + 1)) && (SelModel.attributes.lockRank != modelRank)){
  220. if (manAuto == "Manual") {
  221. RRCAutoLock.click();
  222. }else{
  223. if (manAuto == "Auto") {
  224. if (SelModel.attributes.unapproved == false || SelModel.type == "camera") {
  225. count++;
  226. W.model.actionManager.add(new UpdateObj(SelModel, { lockRank: RRCAutoLock }));
  227. }else{
  228. // console.log (SCRIPT_NAME, CameraTypeWW, "ID", SelModel.attributes.id, "skipped since it is unapproved");
  229. }
  230. }
  231. }
  232. // Checks to see if WazeWrap banner Enabled is checked
  233. if (manAuto == "Manual") {
  234. if (RRCAutoLockSettings.RRCAutoLockWazeWrapSuccessEnabled == true){
  235. // console.log(SCRIPT_NAME, "WazeWrap is enabled");
  236. WazeWrap.Alerts.success(SCRIPT_NAME, [CameraTypeWW + ' changed from lock level ' + RRCAutolockRankplusOne + ' to ' + newLockLevel, 'Last edited by ' + LastEditorUserName].join('\n'));
  237. }
  238. }
  239. // console.log(SCRIPT_NAME, "Version #", VERSION, "-", CameraTypeWW + "ID", SelModel.attributes.id, "Lock level changed from", RRCAutolockRankplusOne , "to", newLockLevel, "Last Edited by", LastEditorUserName);
  240. }else{
  241. // Checks to see if User rank is greater or equal to object lock level AND if object is already equal to dropdown lock level in panel
  242. if (USER.rank >= (SelModel.attributes.rank + 1) && SelModel.attributes.lockRank == modelRank){
  243. if (manAuto == "Manual") {
  244. if (RRCAutoLockSettings.RRCAutoLockWazeWrapInfoEnabled == true){ // Check to see if WW banner enabled
  245. // console.log(SCRIPT_NAME, "WazeWrap is enabled");
  246. WazeWrap.Alerts.info(SCRIPT_NAME, [CameraTypeWW + ' lock not changed, already at lock level ' + RRCAutolockRankplusOne, 'Last edited by ' + LastEditorUserName].join('\n'));
  247. }
  248. }
  249. // console.log (SCRIPT_NAME, "Version #", VERSION, "-", CameraTypeWW, "ID ", SelModel.attributes.id, "lock not changed, already at lock level", RRCAutolockRankplusOne);
  250. }else{
  251. // Checks to see if object is locked above User rank
  252. if (USER.rank < (SelModel.attributes.rank + 1)){
  253. if (manAuto == "Manual") {
  254. wazedevtoastr.options.timeOut = 5000;
  255. if (RRCAutoLockRankOverLock > 5){
  256. WazeWrap.Alerts.error(SCRIPT_NAME, [CameraTypeWW + ' is locked above your rank', 'You will need assistance from an Rank ' + RRCAutoLockRankOverLock + ' editor', 'Last edited by ' + LastEditorUserName].join('\n'));
  257. }else{
  258. WazeWrap.Alerts.error(SCRIPT_NAME, [CameraTypeWW + ' is locked above your rank', 'You will need assistance from at least a Rank ' + RRCAutoLockRankOverLock + ' editor', 'Last edited by ' + LastEditorUserName].join('\n'));
  259. // console.log (SCRIPT_NAME, "Version #", VERSION, " - ", CameraTypeWW, " ID ", SelModel.attributes.id , " is locked above editor rank");
  260. }
  261. }
  262. }
  263. }
  264. }
  265. }
  266. manAuto = null;
  267. }
  268.  
  269. function RRCAutoLockTab()
  270. {
  271. var $RRCsection = $("<div>");
  272. $RRCsection.html([
  273. '<div>',
  274. '<h6 style="margin-bottom:0px;"><b>'+ SCRIPT_NAME +'</b></h6>',
  275. VERSION +'</br>',
  276. '<div id="countryName"></div>',
  277. '<button id="force-country-settings" title="Reset country defaults" class="btn"><i class="fa fa-refresh"></i> Reset country settings/defaults <i class="fa fa-refresh"></i></button>',
  278. '<div class="form-group"></div>',
  279. '<b><input type="checkbox" id="RRCAutoLockCheckbox"> RRC lock enabled</b></br>',
  280. '<b><id="RRCAutoLockLevelValue">RRC lock level: <select id="RRCAutoLockLevelOption"></b></br>',
  281. '<option value="0">N/A</option>',
  282. '<option value="1">1</option>',
  283. '<option value="2">2</option>',
  284. '<option value="3">3</option>',
  285. '<option value="4">4</option>',
  286. '<option value="5">5</option>',
  287. '<option value="6">6</option>',
  288. '</select></br>',
  289. '<b><div id="RRCscreenCount"></div></b></br>',
  290. '<b><input type="checkbox" id="ECAutoLockCheckbox"> Enforcement camera lock enabled</b></br>',
  291. '<b><id="ECAutoLockLevelValue">Enforcement camera lock level: <select id="ECAutoLockLevelOption"></b></br>',
  292. '<option value="0">N/A</option>',
  293. '<option value="1">1</option>',
  294. '<option value="2">2</option>',
  295. '<option value="3">3</option>',
  296. '<option value="4">4</option>',
  297. '<option value="5">5</option>',
  298. '<option value="6">6</option>',
  299. '</select></br>',
  300. '<b><div id="ECscreenCount"></div></b></br>',
  301. '<b><input type="checkbox" id="RRCAutoLockWazeWrapSuccessCheckbox"> Alerts: Success</b></br>',
  302. '<b><input type="checkbox" id="RRCAutoLockWazeWrapInfoCheckbox"> Alerts: Info</b></br>',
  303. '<b><div id="WMETUWarning"></div></b>',
  304. '<b><input type="checkbox" id="TUWARNING"> Disable URMP / TU Warning</b></br>',
  305. '<b>Your WME window was last refreshed at:</b>',
  306. '<b><div id="CurrentDate"></div></b></br>',
  307. '<div class="form-group"></br>',
  308. '<div id="panelCountQty"></div></br>',
  309. '<div><input type="button" id="RRC-Screen-Lock" title="RRC Screen Lock" value="Lock all RRCs" class="btn btn-danger btn-xs RRC-Button"></div></br>',
  310. '<div><input type="button" id="EC-Screen-Lock" title="EC Screen Lock" value="Lock all Enforcement Cameras" class="btn btn-danger btn-xs RRC-Button"></div></div></br>',
  311. // BETA USER FEATURE BELOW
  312. ////////////////////////////////////////////////////////////////////////////////////////////////
  313. '<div class="form-group">', // BETA USER FEATURE
  314. '<b><div id="BETAonly">The features below only show for editors listed as Beta testers<div></b></br>', // BETA USER FEATURE
  315. '<b><id="PLzoomLevelValue">Zoom level for PLs: <select id="PLzoomLevelOption"></b></br>',
  316. '<option value="13">13 (1)</option>',
  317. '<option value="14">14 (2)</option>',
  318. '<option value="15">15 (3)</option>',
  319. '<option value="16">16 (4)</option>',
  320. '<option value="17">17 (5)</option>',
  321. '<option value="18">18 (6)</option>',
  322. '<option value="19">19 (7)</option>',
  323. '<option value="20">20 (8)</option>',
  324. '<option value="21">21 (9)</option>',
  325. '<option value="22">22 (10)</option>',
  326. '<option value="Default">Current Zoom</option>',
  327. '</select></br>',
  328. '<div id="discord">', // BETA USER FEATURE
  329. '<b><input type="checkbox" id="DiscordPermalinkCheckbox"> Create PL with < > for Discord.</div></b></br>', // https://www.w3schools.com/bootstrap/bootstrap_buttons.asp
  330. '<input type="button" id="Permalink-Button-Name" title="PL" value="Copy Clean PL to your clipboard" class="btn btn-info btn-xs RRC-Button"></br></br>', // BETA USER FEATURE
  331. '<input type="button" id="Permalink-Button-Input" title="PL" value="Clean PL from another editor" class="btn btn-info btn-xs RRC-Button"></br></br>', // BETA USER FEATURE
  332. '<div class="form-group">',
  333. '<b><p><div id="USERedits"><div></b></p></br></div></div>', // BETA USER FEATURE
  334. '</div>', // BETA USER FEATURE
  335. '<b><p><div id="prevUSERedits"><div></b></p></div></div>',
  336. '<p><div id="sheet"><a href="https://docs.google.com/spreadsheets/d/1wPb4tqTsES7EgAyxVqRRsRiWBDurld5NzN7IdC4pnSo/edit#gid=1675959019" target="_blank">Sheet</a></div></p>',
  337. '<div>',
  338. ].join(' '));
  339.  
  340. WazeWrap.Interface.Tab(TAB_NAME, $RRCsection.html(), RRCAutoLockInitializeSettings, TAB_NAME);
  341. $("#Permalink-Button-Name").click(CleanPermaLink); // BETA USER FEATURE
  342. $("#Permalink-Button-Input").click(inputPermaLink); // BETA USER FEATURE
  343. $("#RRC-Screen-Lock").click(RRCscreenLock); //
  344. $("#EC-Screen-Lock").click(ECscreenLock); //
  345. $("#force-country-settings").click(forceCountrySetting); //
  346. }
  347.  
  348. // BETA USER FEATURE BELOW
  349. /////////////////////////////////////////////////////////////////////////////////////////
  350. function CleanPermaLink(){
  351. PLzoomLevel = $('#PLzoomLevelOption')[0].value;
  352. if (PLzoomLevel == "Default"){
  353. PLzoomLevel = W.map.getZoom();
  354. }
  355. let selectedID;
  356. let PLselFeat = W.selectionManager.getSelectedDataModelObjects();
  357. // let PLselFeat = W.selectionManager.getSelectedFeatures();
  358. let LatLonCenter = W.map.getOLMap().getCenter();
  359. // let LatLonCenter = W.map.getCenter();
  360. let center4326 = WazeWrap.Geometry.ConvertTo4326(LatLonCenter.lon, LatLonCenter.lat);
  361. let PLurl = 'https://www.waze.com/' + I18n.currentLocale() + '/editor?env=' + W.app.getAppRegionCode() + "&lon=";
  362. if (RRCAutoLockSettings.DiscordPermalink == true){
  363. OpenBrack = "<";
  364. ClosedBrack = ">";
  365. }else{
  366. OpenBrack = "";
  367. ClosedBrack = "";
  368. }
  369. if (PLselFeat.length > 0){
  370. let selectedType = PLselFeat[0].type;
  371. // let selectedType = PLselFeat[0].model.type;
  372. if (PLselFeat.length > 1){
  373. for (let s = 0; s < PLselFeat.length; s++) {
  374. const z = PLselFeat[s].attributes.id;
  375. // const z = PLselFeat[s].model.attributes.id
  376. if (s == PLselFeat.length - 1){
  377. selectedID = selectedID + z;
  378. }else{
  379. selectedID += z + ",";
  380. }
  381. if (selectedID.includes("undefined") == true){
  382. selectedID = selectedID.substring(9);
  383. }
  384. }
  385. }else{
  386. selectedID = PLselFeat[0].attributes.id;
  387. // selectedID = PLselFeat[0].model.attributes.id
  388. }
  389. newCleanPL = OpenBrack + PLurl + center4326.lon.toFixed(5) + "&lat=" + center4326.lat.toFixed(5) + "&zoomLevel=" + PLzoomLevel + "&" + selectedType + "s=" + selectedID + ClosedBrack;
  390. }else{
  391. newCleanPL = OpenBrack + PLurl + center4326.lon.toFixed(5) + "&lat=" + center4326.lat.toFixed(5) + "&zoomLevel=" + PLzoomLevel + ClosedBrack;
  392. }
  393. copyToClipboard();
  394. }
  395. function inputPermaLink(){
  396. // Add WazeWrap Prompt box to grab PL and then clean it up
  397. WazeWrap.Alerts.prompt(SCRIPT_NAME, "Paste your PL", "", OKinputPermaLink, cancelInputPermaLink); // Prompts to enter a PL
  398. }
  399. function OKinputPermaLink(){
  400. let inputData = $(".toast-prompt-input")[0].value;
  401. var regexs = {
  402. 'wazeurl': new RegExp('(?:http(?:s):\/\/)?(?:www\.|beta\.)?waze\.com\/(?:.*?\/)?(editor|livemap)[-a-zA-Z0-9@:%_\+,.~#?&\/\/=]*', "ig")
  403. };
  404. if (inputData.match(regexs.wazeurl)){
  405. PLzoomLevel = $('#PLzoomLevelOption')[0].value;
  406. let PLurl = 'https://www.waze.com/' + I18n.currentLocale() + '/editor?env=' + W.app.getAppRegionCode();
  407. var inputSegsVen;
  408. var params;
  409. var inputLon;
  410. var inputLat;
  411. params = inputData.match(/lon=(-?\d*.\d*)&lat=(-?\d*.\d*)/);
  412. if (params == null){
  413. params = inputData.match(/lat=(-?\d*.\d*)&lon=(-?\d*.\d*)/);
  414. inputLat = params[1];
  415. inputLon = params[2];
  416. }else{
  417. inputLon = params[1];
  418. inputLat = params[2];
  419. }
  420. if (PLzoomLevel == "Default"){
  421. PLzoomLevel = inputData.match(/&zoomLevel=\d+/);
  422. PLzoomLevel = PLzoomLevel[0]
  423. }else{
  424. PLzoomLevel = "&zoomLevel" + PLzoomLevel;
  425. }
  426. let inputSegs = inputData.match(/&segments=(.*)(?:&|$)/);
  427. let inputVenue = inputData.match(/&venues=(.*)(?:&|$)/);
  428. let inputRRC = inputData.match(/&railroadCrossings=(.*)(?:&|$)/)
  429. if ((inputSegs == null) || (inputVenue == null)) (inputSegsVen = "");
  430. if (inputSegs != null) (inputSegsVen = "&segments=" + inputSegs[1]);
  431. if (inputVenue != null) (inputSegsVen = "&venues=" + inputVenue[1]);
  432. if (inputRRC != null) (inputSegsVen = "&railroadCrossings=" + inputRRC[1]);
  433. if (RRCAutoLockSettings.DiscordPermalink == true){
  434. OpenBrack = "<";
  435. ClosedBrack = ">";
  436. }else{
  437. OpenBrack = "";
  438. ClosedBrack = "";
  439. }
  440. newCleanPL = OpenBrack +PLurl + "&lon=" + inputLon + "&lat=" + inputLat + PLzoomLevel + inputSegsVen + ClosedBrack;
  441. copyToClipboard();
  442. console.log (SCRIPT_NAME, 'Inputed PL now clean ' + newCleanPL);
  443. }else{
  444. wazedevtoastr.options.timeout = 2000;
  445. WazeWrap.Alerts.info(SCRIPT_NAME, "That did not appear to be a valid permalink");
  446. }
  447. }
  448. function cancelInputPermaLink(){
  449. console.log (SCRIPT_NAME, "cancel button");
  450. }
  451.  
  452. function copyToClipboard(){
  453. // NEXT 4 LINES COPIES CLEAN PL TO CLIPBOARD
  454. var copied = $('<textarea id="PLcopy" rows="1" cols="1">').val(newCleanPL/*.replace(/\_*\n/g, '\n')*/).appendTo('body').select(); // Creates temp text box with the PL
  455. document.execCommand('copy'); // Copies the PL to clipboard
  456. var rembox = document.getElementById('PLcopy');
  457. document.body.removeChild(rembox); // Deletes temp text box
  458. wazedevtoastr.options.timeOut = 1500;
  459. WazeWrap.Alerts.info(SCRIPT_NAME, 'PL saved to your clipboard');
  460. console.log(SCRIPT_NAME, newCleanPL + ' copied to your clipboard');
  461. }
  462. ////////////////////////////////////
  463. // BETA USER FEATURE ABOVE
  464.  
  465. function disabledOptions() { // Disables the drop down if the enabled option is off.
  466. $('#RRCAutoLockLevelOption')[0].disabled = !RRCAutoLockSettings.RRCAutoLockEnabled;
  467. $('#ECAutoLockLevelOption')[0].disabled = !RRCAutoLockSettings.ECAutoLockEnabled;
  468. if (RRCAutoLockSettings.RRCAutoLockEnabled == false) {
  469. document.getElementById("RRC-Screen-Lock").disabled = true;
  470. }else{
  471. document.getElementById("RRC-Screen-Lock").disabled = false;
  472. }
  473. if (RRCAutoLockSettings.ECAutoLockEnabled == false) {
  474. document.getElementById("EC-Screen-Lock").disabled = true;
  475. }else{
  476. document.getElementById("EC-Screen-Lock").disabled = false;
  477. }
  478. }
  479.  
  480. /*-- START SETTINGS --*/
  481. async function loadSettings() {
  482. let loadedSettings = $.parseJSON(localStorage.getItem(STORE_NAME)); // Loads settings from local storage, allows settings to persist with refresh
  483. const defaultSettings = { // sets default values for tab options
  484. RRCAutoLockLevelOption: "0",
  485. ECAutoLockLevelOption: "0",
  486. PLzoomLevelOption: "19",
  487. RRCAutoLockWazeWrapSuccessEnabled: true,
  488. RRCAutoLockWazeWrapInfoEnabled: true,
  489. RRCAutoLockEnabled: true,
  490. ECAutoLockEnabled: true,
  491. DiscordPermalink: true,
  492. TUWARNING: false,
  493. lastSaved: "",
  494. lastVersion: "",
  495. prevUSERedits: ""
  496. };
  497. RRCAutoLockSettings = loadedSettings ? loadedSettings : defaultSettings;
  498. for (let prop in defaultSettings) {
  499. if (!RRCAutoLockSettings.hasOwnProperty(prop)) {
  500. RRCAutoLockSettings[prop] = defaultSettings[prop];
  501. }
  502. }
  503. if (RRCAutoLockSettings.lastSaved <= LS) { // Clears local storage and resets to defaults if older version is found
  504. RRCAutoLockSettings = defaultSettings;
  505. await WazeWrap.Remote.SaveSettings(STORE_NAME, JSON.stringify(defaultSettings));
  506. localStorage.removeItem(STORE_NAME); // Clears local storage and resets to defaults if older version is found
  507. localStorage.setItem(STORE_NAME, JSON.stringify(RRCAutoLockSettings)); // saves settings to local storage for persisting when refreshed
  508. }
  509. const serverSettings = await WazeWrap.Remote.RetrieveSettings(STORE_NAME); //Settings stored to WazeWrap
  510. if (serverSettings && (serverSettings.lastSaved > RRCAutoLockSettings.lastSaved)) { // checks to see if WazeWrap stored settings are newer than what is stored in local storage
  511. $.extend(true, RRCAutoLockSettings, serverSettings);
  512. localStorage.setItem(STORE_NAME, JSON.stringify(RRCAutoLockSettings)); // saves settings to local storage for persisting when refreshed
  513. }
  514. if (RRCAutoLockSettings.ECAutoLockLevelOption == 0 || RRCAutoLockSettings.RRCAutoLockLevelOption == 0) {
  515. forceDefault = true;
  516. forceCountrySetting();
  517. console.log(SCRIPT_NAME, "Settings set to country minimum by default");
  518. }
  519. EDITdifference = currentEdits - RRCAutoLockSettings.prevUSERedits;
  520.  
  521. RRCAutoLockSettings.prevUSERedits = currentEdits;
  522. localStorage.setItem(STORE_NAME, JSON.stringify(RRCAutoLockSettings)); // saves settings to local storage for persisting when refreshed
  523. WazeWrap.Remote.SaveSettings(STORE_NAME, JSON.stringify(RRCAutoLockSettings)); // saves settings to WazeWrap
  524. console.log(SCRIPT_NAME, "Settings Loaded");
  525. }
  526. function saveSettings() {
  527. if (localStorage) {
  528. RRCAutoLockSettings.lastVersion = VERSION;
  529. // RRCAutoLockSettings.prevUSERedits = currentEdits;
  530. if (forceDefault != true) {
  531. RRCAutoLockSettings.RRCAutoLockEnabled = $('#RRCAutoLockCheckbox')[0].checked;
  532. RRCAutoLockSettings.ECAutoLockEnabled = $('#ECAutoLockCheckbox')[0].checked;
  533. RRCAutoLockSettings.RRCAutoLockWazeWrapSuccessEnabled = $('#RRCAutoLockWazeWrapSuccessCheckbox')[0].checked;
  534. RRCAutoLockSettings.RRCAutoLockWazeWrapInfoEnabled = $('#RRCAutoLockWazeWrapInfoCheckbox')[0].checked;
  535. }else{
  536. RRCAutoLockSettings.RRCAutoLockEnabled = true;
  537. RRCAutoLockSettings.ECAutoLockEnabled = true;
  538. RRCAutoLockSettings.RRCAutoLockWazeWrapSuccessEnabled = true;
  539. RRCAutoLockSettings.RRCAutoLockWazeWrapInfoEnabled = true;
  540. }
  541. RRCAutoLockSettings.RRCAutoLockLevelOption = $('#RRCAutoLockLevelOption')[0].value;
  542. RRCAutoLockSettings.ECAutoLockLevelOption = $('#ECAutoLockLevelOption')[0].value;
  543. RRCAutoLockSettings.PLzoomLevelOption = $('#PLzoomLevelOption')[0].value;
  544. RRCAutoLockSettings.lastSaved = Date.now();
  545. RRCAutoLockSettings.DiscordPermalink = $('#DiscordPermalinkCheckbox')[0].checked;
  546. RRCAutoLockSettings.TUWARNING = $('#TUWARNING')[0].checked;
  547. disabledOptions();
  548. localStorage.setItem(STORE_NAME, JSON.stringify(RRCAutoLockSettings)); // saves settings to local storage for persisting when refreshed
  549. WazeWrap.Remote.SaveSettings(STORE_NAME, JSON.stringify(RRCAutoLockSettings)); // saves settings to WazeWrap
  550. // console.log(SCRIPT_NAME, 'Settings Saved '+ JSON.stringify(RRCAutoLockSettings));
  551. }
  552. }
  553. async function RRCAutoLockInitializeSettings(){
  554. USER.rank = W.loginManager.user.getRank() + 1;
  555. USER.name = W.loginManager.user.getUsername();
  556. let dte = Date();
  557. UpdateObj = require('Waze/Action/UpdateObject');
  558. await loadSettings();
  559. $('#RRCAutoLockUsername').text(USER.name);
  560. $('#RRCAutoLockRank').text(USER.rank);
  561. // beta $('#RRCAutoLockTotalEdits').text(W.loginManager.user.getAttributes().totalEdits);
  562. // beta $('#RRCAutoLockTotalPoints').text(W.loginManager.user.getAttributes().totalPoints);
  563. $('#RRCAutoLockTotalEdits').text(W.loginManager.user.totalEdits);
  564. $('#RRCAutoLockTotalPoints').text(W.loginManager.user.totalPoints);
  565. $('#RRCAutoLockCheckbox')[0].checked = RRCAutoLockSettings.RRCAutoLockEnabled;
  566. $('#ECAutoLockCheckbox')[0].checked = RRCAutoLockSettings.ECAutoLockEnabled;
  567. $('#RRCAutoLockWazeWrapSuccessCheckbox')[0].checked = RRCAutoLockSettings.RRCAutoLockWazeWrapSuccessEnabled;
  568. $('#RRCAutoLockWazeWrapInfoCheckbox')[0].checked = RRCAutoLockSettings.RRCAutoLockWazeWrapInfoEnabled;
  569. $('#RRCAutoLockLevelOption')[0].value = RRCAutoLockSettings.RRCAutoLockLevelOption;
  570. $('#ECAutoLockLevelOption')[0].value = RRCAutoLockSettings.ECAutoLockLevelOption;
  571. $('#PLzoomLevelOption')[0].value = RRCAutoLockSettings.PLzoomLevelOption;
  572. $('#DiscordPermalinkCheckbox')[0].checked = RRCAutoLockSettings.DiscordPermalink;
  573. $('#TUWARNING')[0].checked = RRCAutoLockSettings.TUWARNING;
  574. disabledOptions()
  575. setBetaFeatures(USER.name);
  576. setTimeout (loadCountryID, 2000);
  577. loadCountryID(CountryID);
  578. // console.log(SCRIPT_NAME, "- Tab Created & User Rank is ",USER.rank);
  579. $('#RRCAutoLockCheckbox')[0].onchange = function() {
  580. // console.log(SCRIPT_NAME, "RRCAutoLockCheckbox Settings changed");
  581. saveSettings();
  582. };
  583. $('#ECAutoLockCheckbox')[0].onchange = function() {
  584. // console.log(SCRIPT_NAME, "ECAutoLockCheckbox Settings changed");
  585. saveSettings();
  586. };
  587. $('#RRCAutoLockWazeWrapSuccessCheckbox')[0].onchange = function() {
  588. // console.log(SCRIPT_NAME, "RRCAutoLockWazeWrapSuccessCheckbox Settings changed");
  589. saveSettings();
  590. };
  591. $('#RRCAutoLockWazeWrapInfoCheckbox')[0].onchange = function() {
  592. // console.log(SCRIPT_NAME, "RRCAutoLockWazeWrapInfoCheckbox Settings changed");
  593. saveSettings();
  594. };
  595. $('#RRCAutoLockLevelOption')[0].onchange = function() {
  596. let x = $('#RRCAutoLockLevelOption')[0].value;
  597. undoAction();
  598. // console.log(SCRIPT_NAME, "RRCAutoLockLevelValue Settings changed to L" + x);
  599. saveSettings();
  600. };
  601. $('#ECAutoLockLevelOption')[0].onchange = function() {
  602. let x = $('#ECAutoLockLevelOption')[0].value;
  603. undoAction();
  604. // console.log(SCRIPT_NAME, "ECAutoLockLevelValue Settings changed to L" + x);
  605. saveSettings();
  606. };
  607. $('#PLzoomLevelOption')[0].onchange = function() {
  608. let x = $('#PLzoomLevelOption')[0].value;
  609. undoAction();
  610. // console.log(SCRIPT_NAME, "PLzoomLevelValue Settings changed to L" + x);
  611. saveSettings();
  612. };
  613. $('#DiscordPermalinkCheckbox')[0].onchange = function() {
  614. // console.log(SCRIPT_NAME, "Discord PL option changed");
  615. saveSettings();
  616. };
  617. $('#TUWARNING')[0].onchange = function() {
  618. // console.log(SCRIPT_NAME, "TUWARNING");
  619. saveSettings();
  620. };
  621. if (($('#Info_server')[0]) || ($('#sidepanel-urt')[0])) { $('#WMETUWarning')[0].innerHTML = 'WME Tile Update and/or UR-MP Script Detected;<br>WMETU and UR-MP are known to cause problems with this script.<br>Disable WMETU and/or UR-MP if you experience any issues.';
  622. if (RRCAutoLockSettings.TUWARNING == false) {
  623. wazedevtoastr.options.timeOut = 8000;
  624. WazeWrap.Alerts.warning(SCRIPT_NAME, ["WME Tile Update and/or UR-MP Script Detected;","WMETU and UR-MP are known to cause problems with this script.","Disable WMETU and/or UR-MP if you experience any issues."].join('\n'));
  625. }
  626. }else {
  627. $('#WMETUWarning')[0].textContent = ''};
  628. $('#CurrentDate')[0].textContent = dte;
  629. document.getElementById("force-country-settings").style.padding = "1px";
  630. document.getElementById("RRC-Screen-Lock").style.padding = "1px";
  631. document.getElementById("EC-Screen-Lock").style.padding = "1px";
  632. document.getElementById("Permalink-Button-Name").style.padding = "1px";
  633. document.getElementById("Permalink-Button-Input").style.padding = "1px";
  634. }
  635. async function loadCountry() {
  636. await $.getJSON(CountrySS, function(cdata){
  637. COUNTRYID = cdata;
  638. // console.log(SCRIPT_NAME, 'Country loaded....');
  639. });
  640. }
  641. async function loadBetaUsers() {
  642. await $.getJSON(BetaSS, function(ldata){
  643. BETA_TESTERS = ldata;
  644. // console.log('RRC-AL Beta Users Loaded....');
  645. });
  646. }
  647. function getCountryFromSheet(CountryID){
  648. let mapped = COUNTRYID.values.slice(0).reverse().map(obj =>{
  649. return {ctry: obj[0].trim(), ctryID: obj[1].trim(), ctryRRC: obj[2].trim(), ctryEC: obj[3].trim()
  650. }
  651. });
  652. for(let i=0; i<mapped.length; i++){
  653. if(mapped[i].ctryID == CountryID) {
  654. return mapped[i];
  655. }
  656. }
  657. return null;
  658. }
  659.  
  660. function getFromSheetList(editorName){
  661. let mapped = BETA_TESTERS.values.slice(0).reverse().map(obj =>{
  662. return {username: obj[0].trim()
  663. }
  664. });
  665. countQty = [mapped[mapped.length-3], mapped[mapped.length-2]];
  666. for(let i=0; i<mapped.length; i++){
  667. if(mapped[i].username.toLowerCase() === editorName.toLowerCase()) {
  668. return mapped[i];
  669. }
  670. }
  671. return null;
  672. }
  673.  
  674. function setBetaFeatures(user) {
  675. let entry = getFromSheetList(user);
  676. if (entry == null) {
  677. countQty = countQty[1].username;
  678. $("#DiscordPermalinkCheckbox").hide();
  679. $('#Permalink-Button-Name').hide();
  680. $('#Permalink-Button-Input').hide();
  681. $('#discord').hide();
  682. $('#BETAonly').hide();
  683. $('#USERedits').hide();
  684. $('#prevUSERedits').hide();
  685. $('#sheet').hide();
  686. console.log(SCRIPT_NAME, "Not a beta user");
  687. }else{
  688. countQty = countQty[0].username;
  689. $('#USERedits')[0].textContent = 'Current Edit Count for '+ USER.name + ' - ' + W.loginManager.user.totalEdits;
  690. // beta $('#USERedits')[0].textContent = 'Current Edit Count for '+ USER.name + ' - ' + W.loginManager.user.getAttributes().totalEdits;
  691. // $('#prevUSERedits')[0].textContent = 'Edit Count Difference since last load - ' + EDITdifference;
  692. console.log(SCRIPT_NAME, "Beta features loaded");
  693. var betaUser = "Yes";
  694. }
  695. $('#panelCountQty')[0].textContent = 'Lock up to ' + countQty + ' RRCs or ECs on screen';
  696. // if (EDITdifference > 0 && betaUser == "Yes") {
  697. // WazeWrap.Alerts.confirm(SCRIPT_NAME, 'Your edits have increased edits ' + EDITdifference + ' since last refresh');
  698. // }
  699. }
  700.  
  701. function loadCountryID() { // comment out the hide for each lock to show
  702.  
  703. var max = W.loginManager.user.getRank() + 1;
  704. CountryName = W.model.topCountry.attributes.name;
  705. if (W.model.topCountry.attributes.id == 235) CountryName = W.model.topState.attributes.name + ', USA';
  706. let cEntry = getCountryFromSheet(CountryID);
  707. if (cEntry == null) {
  708. console.log(SCRIPT_NAME, 'Country not loaded from sheet');
  709. loadCountryID()
  710. }
  711. if (RRCmin == null) {
  712.  
  713. $("#RRCAutoLockLevelOption option[value='0']").show();
  714. $("#RRCAutoLockLevelOption option[value='1']").show();
  715. $("#RRCAutoLockLevelOption option[value='2']").show();
  716. $("#RRCAutoLockLevelOption option[value='3']").show();
  717. $("#RRCAutoLockLevelOption option[value='4']").show();
  718. $("#RRCAutoLockLevelOption option[value='5']").show();
  719. $("#RRCAutoLockLevelOption option[value='6']").show();
  720. $("#ECAutoLockLevelOption option[value='0']").show();
  721. $("#ECAutoLockLevelOption option[value='1']").show();
  722. $("#ECAutoLockLevelOption option[value='2']").show();
  723. $("#ECAutoLockLevelOption option[value='3']").show();
  724. $("#ECAutoLockLevelOption option[value='4']").show();
  725. $("#ECAutoLockLevelOption option[value='5']").show();
  726. $("#ECAutoLockLevelOption option[value='6']").show();
  727.  
  728. // Sets country ID for RRC and EC minimum
  729.  
  730. if (cEntry == null) {
  731. RRCmin = 4;
  732. ECmin = 4;
  733. var ctry = "NOT LISTED ON SHEET";
  734. }else{
  735. if (cEntry.ctryRRC == null) {
  736. RRCmin = 4;
  737. }else{
  738. RRCmin = cEntry.ctryRRC;
  739. ctry = cEntry.ctry;
  740. }
  741. if (cEntry.ctryEC == null) {
  742. ECmin = 4;
  743. }else{
  744. ECmin = cEntry.ctryEC;
  745. }
  746. }
  747.  
  748. console.log(SCRIPT_NAME, 'Country ID is', CountryID, '-', ctry, ', the minimum RRC lock level is set to', RRCmin, 'and max rank set at', max);
  749. console.log(SCRIPT_NAME, 'Country ID is', CountryID, '-', ctry, ', the minimum EC lock level is set to', ECmin, 'and max rank set at', max);
  750.  
  751. if (max < RRCmin) {
  752. // wazedevtoastr.options.timeOut = 5000;
  753. // WazeWrap.Alerts.warning(SCRIPT_NAME, ["It appears that your user rank of R" + max,"is less than the minimum lock level of " + RRCmin + " for your country for Railroad Crossings"].join('\n'));
  754. RRCmin = 10;
  755. }
  756. if (max < ECmin) {
  757. // wazedevtoastr.options.timeOut = 5000;
  758. // WazeWrap.Alerts.warning(SCRIPT_NAME, ["It appears that your user rank of R" + max,"is less than the minimum lock level of " + ECmin + " for your country for Enforcement Cameras"].join('\n'));
  759. ECmin = 10;
  760. }
  761.  
  762. if (RRCmin >= 2) {
  763. $("#RRCAutoLockLevelOption option[value='0']").hide();
  764. $("#RRCAutoLockLevelOption option[value='1']").hide();
  765. if (RRCmin >= 3) {
  766. $("#RRCAutoLockLevelOption option[value='2']").hide();
  767. if (RRCmin >= 4) {
  768. $("#RRCAutoLockLevelOption option[value='3']").hide();
  769. if (RRCmin >= 5) {
  770. $("#RRCAutoLockLevelOption option[value='4']").hide();
  771. if (RRCmin >= 6) {
  772. $("#RRCAutoLockLevelOption option[value='5']").hide();
  773. if (RRCmin == 10) {
  774. $("#RRCAutoLockLevelOption option[value='6']").hide();
  775. $("#RRCAutoLockLevelOption option[value='0']").show();
  776. }
  777. }
  778. }
  779. }
  780. }
  781. }
  782.  
  783. if (ECmin >= 2) {
  784. $("#ECAutoLockLevelOption option[value='0']").hide();
  785. $("#ECAutoLockLevelOption option[value='1']").hide();
  786. if (ECmin >= 3) {
  787. $("#ECAutoLockLevelOption option[value='2']").hide();
  788. if (ECmin >= 4) {
  789. $("#ECAutoLockLevelOption option[value='3']").hide();
  790. if (ECmin >= 5) {
  791. $("#ECAutoLockLevelOption option[value='4']").hide();
  792. if (ECmin >= 6) {
  793. $("#ECAutoLockLevelOption option[value='5']").hide();
  794. if (ECmin == 10) {
  795. $("#ECAutoLockLevelOption option[value='6']").hide();
  796. $("#ECAutoLockLevelOption option[value='0']").show();
  797. }
  798. }
  799. }
  800. }
  801. }
  802. }
  803. if (max <= 5) {
  804. $("#ECAutoLockLevelOption option[value='6']").hide();
  805. $("#RRCAutoLockLevelOption option[value='6']").hide();
  806. if (max == 4) {
  807. $("#ECAutoLockLevelOption option[value='5']").hide();
  808. $("#RRCAutoLockLevelOption option[value='5']").hide();
  809. if (max == 3) {
  810. $("#ECAutoLockLevelOption option[value='4']").hide();
  811. $("#RRCAutoLockLevelOption option[value='4']").hide();
  812. if (max == 2) {
  813. $("#ECAutoLockLevelOption option[value='3']").hide();
  814. $("#RRCAutoLockLevelOption option[value='3']").hide();
  815. if (max == 1) {
  816. $("#ECAutoLockLevelOption option[value='2']").hide();
  817. $("#RRCAutoLockLevelOption option[value='2']").hide();
  818. }
  819. }
  820. }
  821. }
  822. }
  823. }
  824. $('#countryName')[0].textContent = 'Country setting is for ' + CountryName;
  825. }
  826.  
  827. function forceCountrySetting(){
  828. CountryID = 'forced refresh';
  829. checkCountry();
  830. $('#RRCAutoLockLevelOption')[0].value = RRCmin;
  831. $('#ECAutoLockLevelOption')[0].value = ECmin;
  832. saveSettings();
  833. undoAction();
  834. console.log(SCRIPT_NAME, "forceCountrySetting activated, reset RRC to L" + RRCmin + " and EC to L" + ECmin);
  835. }
  836.  
  837. function undoAction(){
  838. originalLon = 0;
  839. RRCscreenMove();
  840. }
  841.  
  842. function RRCscreenMove(tries = 1) {
  843. let RRClockCount = 0;
  844. let EClockCount = 0;
  845.  
  846. movedLon = W.map.getOLMap().getCenter().lon;
  847. // movedLon = W.map.getCenter().lon;
  848. movedZoom = W.map.getZoom();
  849. if ((originalLon != movedLon) || (originalZoom != movedZoom)) {
  850. originalLon = movedLon;
  851. originalZoom = movedZoom;
  852. const extentGeometry = W.map.getOLMap().getExtent().toGeometry();
  853.  
  854. //Changes the background color of the tab.
  855. modelRank = ($('#RRCAutoLockLevelOption')[0].value);
  856. _.each(W.model.railroadCrossings.getObjectArray(), v => {
  857. if (extentGeometry.intersects(v.geometry)) {
  858. var RRClockrank = v.attributes.lockRank + 1;
  859. var RRCunapproved = v.attributes.unapproved;
  860. if ((RRClockrank != modelRank) || (RRCunapproved == true)) {
  861. RRClockCount++
  862. $(`a[href$='${sPanel}']`).css('background-color', '#ffa07a');
  863. $(`a[href$='${sPanel}']`).text('RRC-' + RRClockCount + '/EC-' + EClockCount);
  864. tabColor = 1
  865. }
  866. }
  867. })
  868.  
  869. if (RRClockCount > 0) {
  870. $('#RRCscreenCount')[0].innerHTML = 'There are ' + RRClockCount + ' RRCs needing locked';
  871. }else{
  872. $('#RRCscreenCount')[0].innerHTML = '';
  873. }
  874.  
  875. //Changes the background color of the tab.
  876. modelRank = ($('#ECAutoLockLevelOption')[0].value);
  877. _.each(W.model.cameras.getObjectArray(), v => {
  878. if (extentGeometry.intersects(v.geometry)) {
  879. var EClockrank = v.attributes.lockRank + 1;
  880. var ECunapproved = v.attributes.unapproved;
  881. if ((EClockrank != modelRank) || (ECunapproved == true)) {
  882. EClockCount++
  883. $(`a[href$='${sPanel}']`).css('background-color', '#ffa07a');
  884. $(`a[href$='${sPanel}']`).text('RRC-' + RRClockCount + '/EC-' + EClockCount);
  885. tabColor = 1
  886. }
  887. }
  888. })
  889.  
  890. if (tabColor != 1) {
  891. $(`a[href$='${sPanel}']`).css('background-color', '#e9e9e9');
  892. $(`a[href$='${sPanel}']`).text(TAB_NAME);
  893. }
  894.  
  895. if (EClockCount > 0) {
  896. $('#ECscreenCount')[0].innerHTML = 'There are ' + EClockCount + ' ECs needing locked';
  897. }else{
  898. $('#ECscreenCount')[0].innerHTML = '';
  899. }
  900. tabColor = 0
  901. checkCountry();
  902. }
  903. }
  904.  
  905. function checkCountry(tries = 1){
  906. setTimeout (RRCscreenMove, 3000);
  907. if (W.model.topCountry) {
  908. let newLocationID = W.model.topCountry.attributes.id;
  909. if (newLocationID == 235) newLocationID = W.model.topState.attributes.id;
  910. if (newLocationID != CountryID) {
  911. console.log(SCRIPT_NAME, 'function RRCscreenMove - Country ID is', CountryID, 'newLocationID =',newLocationID);
  912. CountryID = newLocationID;
  913. loadCountry();
  914. RRCmin = null;
  915. ECmin = null;
  916. loadCountryID();
  917. }
  918. }else if (tries < 2000)
  919. setTimeout(function () {checkCountry(++tries);}, 200);
  920. }
  921.  
  922. function initialCountrySetup(tries = 1) {
  923. currentEdits = W.loginManager.user.totalEdits
  924. // beta currentEdits = W.loginManager.user.getAttributes().totalEdits
  925. if (W.model.topCountry) {
  926. CountryID = W.model.topCountry.attributes.id;
  927. CountryName = W.model.topCountry.attributes.name;
  928. if (CountryID == 235) {
  929. CountryID = W.model.topState.attributes.id;
  930. CountryName = W.model.topState.attributes.name;
  931. }
  932. loadCountry();
  933. console.log(SCRIPT_NAME, 'function: initialCountrySetup - Country ID is', CountryID);
  934. }else{
  935. if (tries < 2000)
  936. setTimeout(function () {initialCountrySetup(++tries);}, 1000);
  937. }
  938. }
  939. // function ClosedVenue(){
  940. // var closedName;
  941. // var origName = W.selectionManager.getSelectedFeatures()[0].model.attributes.name;
  942. // closedName = origName + ' (Closed)'
  943. // document.querySelector("#venue-edit-general > form > div:nth-child(1) > div:nth-child(1) > div > input").value = closedName;
  944. // }
  945.  
  946. function init() {
  947. const $RRCbttnDiv = $('<div>');
  948. $RRCbttnDiv.html([
  949. `<div id='MyRRCContainer' style='position: absolute; display:none; left: 20px; top: 300px; background-color:#35B6EE; width:30px; height:30px; cursor:pointer'>
  950. <i class="fas fa-link fa-2x"></i>
  951. </div>`
  952. ].join(' '));
  953. // Attach the button to the map element
  954. $('#map').append($RRCbttnDiv.html());
  955.  
  956. // Setup listener to run the function when the button is clicked
  957. $('#MyRRCContainer').click(function () {
  958. CleanPermaLink();
  959. });
  960.  
  961. // const $closedVenuebttnDiv = $('<div>');
  962. // $closedVenuebttnDiv.html([
  963. // `<div id='MyclosedVenueContainer' style='position: absolute; display:none; left: 20px; top: 330px; background-color:#35B6EE; width:30px; height:30px; cursor:pointer'>
  964. // <i class="fas fa-times-circle fa-2x"></i>
  965. // </div>`
  966. // ].join(' '));
  967. // // Attach the button to the map element
  968. // $('#map').append($closedVenuebttnDiv.html());
  969.  
  970. // // Setup listener to run the function when the button is clicked
  971. // $('#MyclosedVenueContainer').click(function () {
  972. // ClosedVenue();
  973. // });
  974. }
  975.  
  976. // Function the selection listener runs to display the button when an object is selected
  977. function displayButton() {
  978. const sel = W.selectionManager.getSelectedDataModelObjects();
  979.  
  980. if(sel.length > 0) {
  981. $('#MyRRCContainer').css('display', 'block');
  982. } else {
  983. $('#MyRRCContainer').css('display', 'none');
  984. // $('#MyclosedVenueContainer').css('display', 'none');
  985. }
  986.  
  987. // const sel1 = W.selectionManager.getSelectedFeatures()[0].model;
  988. // var testing = sel1.type
  989. // if(sel1.type == 'venue') {
  990. // $('#MyclosedVenueContainer').css('display', 'block');
  991. // } else {
  992. // $('#MyclosedVenueContainer').css('display', 'none');
  993. // }
  994. }
  995.  
  996. async function bootstrap(tries = 1) {
  997. if (typeof W === 'object' && W.userscripts?.state?.isReady && W.map && W.model && W.loginManager.user && $ && WazeWrap.Ready ) {
  998. await init();
  999. await initialCountrySetup();
  1000. await loadBetaUsers();
  1001. await RRCAutoLockTab();
  1002. await loadCountry();
  1003. originalLon = W.map.getOLMap().getCenter().lon;
  1004. // originalLon = W.map.getCenter().lon;
  1005. originalZoom = W.map.getZoom();
  1006. WazeWrap.Events.register("selectionchanged", null, setRRCAutoLock);
  1007. WazeWrap.Events.register("moveend", null, RRCscreenMove);
  1008. WazeWrap.Events.register("afterundoaction", null, undoAction);
  1009. WazeWrap.Interface.ShowScriptUpdate(SCRIPT_NAME, VERSION, UPDATE_NOTES);
  1010. // Create a listener to check when the selection changes if we should display the toolbar
  1011. WazeWrap.Events.register('selectionchanged', null, displayButton);
  1012. console.log(SCRIPT_NAME, "loaded");
  1013. } else if (tries < 1000)
  1014. setTimeout(function () {bootstrap(++tries);}, 200);
  1015. }
  1016. bootstrap();
  1017. })();

QingJ © 2025

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