WME BeenThere

This lets you drop boxes around the map to help visualize where you have been editing

  1. // ==UserScript==
  2. // @name WME BeenThere
  3. // @namespace https://gf.qytechs.cn/users/30701-justins83-waze
  4. // @description This lets you drop boxes around the map to help visualize where you have been editing
  5. // @include https://www.waze.com/editor*
  6. // @include https://www.waze.com/*/editor*
  7. // @include https://beta.waze.com/*
  8. // @exclude https://www.waze.com/*/user/editor*
  9. // @require https://gf.qytechs.cn/scripts/24851-wazewrap/code/WazeWrap.js
  10. // @require https://gf.qytechs.cn/scripts/27023-jscolor/code/JSColor.js
  11. // @require https://gf.qytechs.cn/scripts/27254-clipboard-js/code/clipboardjs.js
  12. // @require https://gf.qytechs.cn/scripts/28687-jquery-ui-1-11-4-custom-min-js/code/jquery-ui-1114customminjs.js
  13. // @resource jqUI_CSS https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/smoothness/jquery-ui.css
  14. // @version 2020.06.02.02
  15. // ==/UserScript==
  16. //---------------------------------------------------------------------------------------
  17.  
  18. /* global W */
  19. /* global OpenLayers */
  20. /* ecmaVersion 2017 */
  21. /* global $ */
  22. /* global jscolor */
  23. /* global _ */
  24. /* global WazeWrap */
  25. /* global require */
  26. /* global Clipboard */
  27. /* eslint curly: ["warn", "multi-or-nest"] */
  28.  
  29. var beenTheresettings = [];
  30. var attributes = {
  31. name: ""
  32. };
  33. var layerFuture = [];
  34. var pointStyle = {
  35. pointRadius: 3,
  36. fillOpacity: 50,
  37. strokeColor: '#00ece3',
  38. strokeWidth: '2',
  39. strokeLinecap: 'round'
  40. };
  41. var clickCount = 0;
  42. var userRectPoint1 = null;
  43. var userCircleCenter = null;
  44. var currColor;
  45. const updateMessage = "";
  46.  
  47. (function() {
  48. //var jqUI_CssSrc = GM_getResourceText("jqUI_CSS");
  49. //GM_addStyle(jqUI_CssSrc);
  50.  
  51. function bootstrap(tries = 1) {
  52. if (W && W.map &&
  53. W.model && W.loginManager.user &&
  54. $ && window.jscolor &&
  55. WazeWrap.Ready && W.model.users)
  56. init();
  57. else if (tries < 1000)
  58. setTimeout(function () {bootstrap(++tries);}, 200);
  59. }
  60.  
  61. bootstrap();
  62.  
  63. function AddExtent() {
  64. var point = W.map.getExtent();
  65.  
  66. var groupPoints2 = {
  67. topLeft : {
  68. lon:point.left,
  69. lat:point.top
  70. },
  71. botLeft : {
  72. lon: point.left,
  73. lat: point.bottom
  74. },
  75. botRight: {
  76. lon: point.right,
  77. lat: point.bottom
  78. },
  79. topRight:{
  80. lon: point.right,
  81. lat: point.top
  82. },
  83. color: currColor,
  84. type: "rectangle",
  85. radius: null
  86. };
  87.  
  88. beenTheresettings.Groups[beenTheresettings.CurrentGroup].push(groupPoints2);
  89. DrawFeature(groupPoints2);
  90. }
  91.  
  92. function DrawFeature(obj){
  93. var pnt = [];
  94. //var pnt2 = [];
  95. //var pnt4326;
  96. var feature;
  97. var style = {
  98. strokeColor: obj.color, strokeOpacity: 1, strokeWidth: 5, fillColor: obj.color, fillOpacity: 0.0,
  99. label: "", labelOutlineColor: "black", labelOutlineWidth: 3, fontSize: 14,
  100. fontColor: "orange", fontOpacity: 1, fontWeight: "bold"};
  101. if(beenTheresettings.DrawShapeBorder)
  102. style.strokeOpacity = 1;
  103. else
  104. style.strokeOpacity = 0;
  105.  
  106. if(beenTheresettings.FillShape)
  107. style.fillOpacity = 1;
  108. else
  109. style.fillOpacity = 0;
  110.  
  111. if(obj.type === "rectangle"){
  112. var convPoint = new OpenLayers.Geometry.Point(obj.topLeft.lon, obj.topLeft.lat);
  113. pnt.push(convPoint);
  114. //pnt4326 = WazeWrap.Geometry.ConvertTo4326(obj.topLeft.lon,obj.topLeft.lat);
  115. //pnt2.push(new OpenLayers.Geometry.Point(pnt4326.lon, pnt4326.lat));
  116.  
  117. convPoint = new OpenLayers.Geometry.Point(obj.botLeft.lon, obj.botLeft.lat);
  118. pnt.push(convPoint);
  119. //pnt4326 = WazeWrap.Geometry.ConvertTo4326(obj.botLeft.lon,obj.botLeft.lat);
  120. //pnt2.push(new OpenLayers.Geometry.Point(pnt4326.lon, pnt4326.lat));
  121.  
  122. convPoint = new OpenLayers.Geometry.Point(obj.botRight.lon, obj.botRight.lat);
  123. pnt.push(convPoint);
  124. //pnt4326 = WazeWrap.Geometry.ConvertTo4326(obj.botRight.lon,obj.botRight.lat);
  125. //pnt2.push(new OpenLayers.Geometry.Point(pnt4326.lon, pnt4326.lat));
  126.  
  127. convPoint = new OpenLayers.Geometry.Point(obj.topRight.lon, obj.topRight.lat);
  128. pnt.push(convPoint);
  129. //pnt4326 = WazeWrap.Geometry.ConvertTo4326(obj.topRight.lon,obj.topRight.lat);
  130. //pnt2.push(new OpenLayers.Geometry.Point(pnt4326.lon, pnt4326.lat));
  131.  
  132. convPoint = new OpenLayers.Geometry.Point(obj.topLeft.lon, obj.topLeft.lat);
  133. pnt.push(convPoint);
  134. //pnt4326 = WazeWrap.Geometry.ConvertTo4326(obj.topLeft.lon,obj.topLeft.lat);
  135. //pnt2.push(new OpenLayers.Geometry.Point(pnt4326.lon, pnt4326.lat));
  136.  
  137. var ring = new OpenLayers.Geometry.LinearRing(pnt);
  138. var polygon = new OpenLayers.Geometry.Polygon([ring]);
  139. feature = new OpenLayers.Feature.Vector(polygon, attributes, style);
  140. }
  141. else{ //circle
  142. var poly = new OpenLayers.Geometry.Polygon.createRegularPolygon(obj.centerPoint, obj.radius, 40, 0);
  143. feature = new OpenLayers.Feature.Vector(poly, attributes, style);
  144. }
  145.  
  146. mapLayers.addFeatures([feature]);
  147. updateTotalRectCount();
  148. /*
  149. var ring2 = new OpenLayers.Geometry.LinearRing(pnt2);
  150. var polygon2 = new OpenLayers.Geometry.Polygon([ring2]);
  151. var feature2 = new OpenLayers.Feature.Vector(polygon2);
  152.  
  153. var pnt3 = [];
  154. pnt3.push(new OpenLayers.Geometry.Point(-84.3197299999999,40.100960000000285));
  155. pnt3.push(new OpenLayers.Geometry.Point(-84.3197299999999,40.04566000000004));
  156. pnt3.push(new OpenLayers.Geometry.Point(-84.24969999999959,40.04566000000004));
  157. pnt3.push(new OpenLayers.Geometry.Point(-84.24969999999959,40.100960000000285));
  158. pnt3.push(new OpenLayers.Geometry.Point(-84.3197299999999,40.100960000000285));
  159. var ring3 = new OpenLayers.Geometry.LinearRing(pnt3);
  160. var polygon3 = new OpenLayers.Geometry.Polygon([ring3]);
  161. var feature3 = new OpenLayers.Feature.Vector(polygon3);
  162.  
  163. var geoJSON = new OpenLayers.Format.GeoJSON();
  164. //var geoJSONText = geoJSON.write(feature3, true);
  165. //var geoJSONText2 = geoJSON.write(feature2, true);
  166. //console.log("geoJSONText = " + geoJSONText);
  167. //console.log("geoJSONText2 = " + geoJSONText2);
  168.  
  169. var turfpolygon = turf.polygon([[
  170. [-84.3197299999999, 40.100960000000285],
  171. [-84.3197299999999, 40.04566000000004],
  172. [-84.24969999999959, 40.04566000000004],
  173. [-84.24969999999959, 40.100960000000285],
  174. [-84.3197299999999, 40.100960000000285]
  175. ]]);
  176. var turfpoly2 = turf.polygon([[
  177. [-84.3034299999997, 40.11526999999987],
  178. [-84.3034299999997, 40.085729999999806],
  179. [-84.24437, 40.085729999999806],
  180. [-84.24437, 40.11526999999987],
  181. [-84.3034299999997, 40.11526999999987]
  182. ]]);
  183.  
  184. var union = turf.union(turfpolygon, turfpoly2);
  185. console.log("Justin");
  186. console.log(union);*/
  187. }
  188.  
  189. function updateTotalRectCount(){
  190. $('#rectCount')[0].innerHTML = mapLayers.features.length;
  191. }
  192.  
  193. function NewBox(e) {
  194. e.stopPropagation();
  195. AddExtent();
  196. saveSettings();
  197. }
  198.  
  199. function NewUserRect(e){
  200. e.stopPropagation();
  201. EndUserCircleMode();
  202. clickCount = 0;
  203. clearLayer();
  204. $(".olMapViewport").on('mousemove', MouseMoveHandlerRect);
  205. document.addEventListener('keyup', keyUpHandler, false);
  206. $(".olMapViewport").click(ClickHandler);
  207. }
  208.  
  209. function NewUserCircle(e){
  210. e.stopPropagation();
  211. EndUserRectMode();
  212. clickCount = 0;
  213. clearLayer();
  214. $(".olMapViewport").on('mousemove', MouseMoveHandlerCircle);
  215. document.addEventListener('keyup', keyUpHandler, false);
  216. $(".olMapViewport").click(ClickHandlerCircle);
  217. }
  218.  
  219. function ClickHandlerCircle(){
  220. if(clickCount === 0){
  221. userCircleCenter = getMousePos900913();
  222. clickCount++;
  223. }
  224. else{
  225. var point2 = getMousePos900913();
  226. var points = [new OpenLayers.Geometry.Point(userCircleCenter.lon, userCircleCenter.lat), new OpenLayers.Geometry.Point(point2.lon, point2.lat)];
  227. var radius = WazeWrap.Geometry.calculateDistance(points);
  228. var circleData = {
  229. centerPoint : new OpenLayers.Geometry.Point(userCircleCenter.lon, userCircleCenter.lat),
  230. radius : radius,
  231. color: currColor,
  232. type : "circle"
  233. };
  234.  
  235. beenTheresettings.Groups[beenTheresettings.CurrentGroup].push(circleData);
  236. saveSettings();
  237. DrawFeature(circleData);
  238. EndUserCircleMode();
  239. }
  240. }
  241.  
  242. function ClickHandler(){
  243. if(clickCount === 0){ //first point chosen - draw rectangle as the mouse moves
  244. userRectPoint1 = getMousePos900913();
  245. clickCount++;
  246. }
  247. else{ //second point chose - take both coordinates and draw a rectangle on the BeenThere layer
  248. var point2 = getMousePos900913();
  249.  
  250. var groupPoints2 = {
  251. topLeft : {
  252. lon: userRectPoint1.lon,
  253. lat: userRectPoint1.lat
  254. },
  255. botLeft : {
  256. lon: userRectPoint1.lon,
  257. lat: point2.lat
  258. },
  259. botRight: {
  260. lon: point2.lon,
  261. lat: point2.lat
  262. },
  263. topRight:{
  264. lon: point2.lon,
  265. lat: userRectPoint1.lat
  266. },
  267. color: currColor,
  268. type: "rectangle"
  269. };
  270. beenTheresettings.Groups[beenTheresettings.CurrentGroup].push(groupPoints2);
  271. saveSettings();
  272. DrawFeature(groupPoints2);
  273. EndUserRectMode();
  274. }
  275. }
  276.  
  277. function MouseMoveHandlerRect(e){
  278. clearLayer();
  279. drawPointer(getMousePos900913(), false);
  280. drawRect(userRectPoint1);
  281. }
  282.  
  283. function MouseMoveHandlerCircle(e){
  284. clearLayer();
  285. var currMousePos = getMousePos900913();
  286. drawPointer(currMousePos, true);
  287. if(userCircleCenter){
  288. var points = [new OpenLayers.Geometry.Point(userCircleCenter.lon, userCircleCenter.lat), new OpenLayers.Geometry.Point(currMousePos.lon, currMousePos.lat)];
  289. var radius = WazeWrap.Geometry.calculateDistance(points);
  290. drawCircle(userCircleCenter, radius);
  291. }
  292. }
  293.  
  294. function clearLayer() {
  295. var layer = W.map.getLayersByName("BeenThereUserRect")[0];
  296. layer.removeAllFeatures();
  297. }
  298.  
  299. function drawRect(e){
  300. if(e !== null){
  301. var color = currColor;
  302. var style = {
  303. strokeColor: color, strokeOpacity: 1, strokeWidth: 5, fillColor: color, fillOpacity: 0.0,
  304. label: "", labelOutlineColor: "black", labelOutlineWidth: 3, fontSize: 14,
  305. fontColor: color, fontOpacity: 0.85, fontWeight: "bold"};
  306. if(beenTheresettings.DrawShapeBorder)
  307. style.strokeOpacity = 1;
  308. else
  309. style.strokeOpacity = 0;
  310.  
  311. if(beenTheresettings.FillShape)
  312. style.fillOpacity = 1;
  313. else
  314. style.fillOpacity = 0;
  315.  
  316. var point2 = getMousePos900913();
  317.  
  318. var pnt = [];
  319. var convPoint = new OpenLayers.Geometry.Point(e.lon, e.lat);
  320. pnt.push(convPoint);
  321. convPoint = new OpenLayers.Geometry.Point(e.lon, point2.lat);
  322. pnt.push(convPoint);
  323. convPoint = new OpenLayers.Geometry.Point(point2.lon, point2.lat);
  324. pnt.push(convPoint);
  325. convPoint = new OpenLayers.Geometry.Point(point2.lon, e.lat);
  326. pnt.push(convPoint);
  327. convPoint = new OpenLayers.Geometry.Point(e.lon, e.lat);
  328. pnt.push(convPoint);
  329.  
  330. var ring = new OpenLayers.Geometry.LinearRing(pnt);
  331. var polygon = new OpenLayers.Geometry.Polygon([ring]);
  332. var feature = new OpenLayers.Feature.Vector(polygon, attributes, style);
  333. W.map.getLayersByName("BeenThereUserRect")[0].addFeatures([feature]);
  334. }
  335. }
  336.  
  337. function drawCircle(e, radius){
  338. if(e !== null){
  339. var color = currColor;
  340. var style = {
  341. strokeColor: color, strokeOpacity: 0.8, strokeWidth: 5, fillColor: color, fillOpacity: 0.0,
  342. label: "", labelOutlineColor: "black", labelOutlineWidth: 3, fontSize: 14,
  343. fontColor: color, fontOpacity: 0.85, fontWeight: "bold"};
  344. if(beenTheresettings.DrawShapeBorder)
  345. style.strokeOpacity = 1;
  346. else
  347. style.strokeOpacity = 0;
  348.  
  349. if(beenTheresettings.FillShape)
  350. style.fillOpacity = 1;
  351. else
  352. style.fillOpacity = 0;
  353.  
  354. var point2 = getMousePos900913();
  355. var pt = new OpenLayers.Geometry.Point(e.lon, e.lat);
  356. var polygon = new OpenLayers.Geometry.Polygon.createRegularPolygon(pt,radius, 40, 0);
  357. var feature = new OpenLayers.Feature.Vector(polygon, attributes, style);
  358. W.map.getLayersByName("BeenThereUserRect")[0].addFeatures([feature]);
  359. }
  360. }
  361.  
  362. function drawPointer(e, circle){
  363. var color = currColor;
  364. pointStyle.strokeColor = color;
  365. pointStyle.fillColor = color;
  366. if(circle && circle === true)
  367. pointStyle.fillOpacity = 0;
  368. else
  369. pointStyle.fillOpacity = 1;
  370. var pointFeature = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(e.lon, e.lat), {}, pointStyle);
  371. W.map.getLayersByName("BeenThereUserRect")[0].addFeatures([pointFeature]);
  372. }
  373.  
  374. function getMousePos900913(){
  375. var mousePosition = $('.WazeControlMousePosition').text().split(" ");
  376. [mousePosition[0], mousePosition[1]] = [mousePosition[1], mousePosition[0]];
  377. return WazeWrap.Geometry.ConvertTo900913(mousePosition[0], mousePosition[1]);
  378. }
  379.  
  380. function keyUpHandler(e){
  381. if (e.keyCode == 27){
  382. EndUserRectMode();
  383. EndUserCircleMode();
  384. }
  385. }
  386.  
  387. function EndUserRectMode(){
  388. $('.olMapViewport').css('cursor', 'initial');
  389. $(".olMapViewport").off('click');
  390. $(".olMapViewport").off('mousemove', MouseMoveHandlerRect);
  391. clearLayer();
  392. document.removeEventListener('keyup', keyUpHandler);
  393. clickCount = 0;
  394. userRectPoint1 = null;
  395. }
  396.  
  397. function EndUserCircleMode(){
  398. $(".olMapViewport").off('click');
  399. $(".olMapViewport").off('mousemove', MouseMoveHandlerCircle);
  400. clearLayer();
  401. document.removeEventListener('keyup', keyUpHandler);
  402. clickCount = 0;
  403. userCircleCenter = null;
  404. }
  405.  
  406. function RemoveLastBox() {
  407. var mro_mapLayers = W.map.getLayersBy("uniqueName", "__beenThere");
  408.  
  409. var mro_mapLayers_mapLayerLength = mro_mapLayers[0].features.length;
  410. if (mro_mapLayers_mapLayerLength > 0)
  411. mro_mapLayers[0].features[mro_mapLayers_mapLayerLength - 1].destroy();
  412. if(beenTheresettings.Groups[beenTheresettings.CurrentGroup].length > 0)
  413. layerFuture.push(beenTheresettings.Groups[beenTheresettings.CurrentGroup].pop());
  414. saveSettings();
  415. updateTotalRectCount();
  416. }
  417.  
  418. function RedoLastBox(){
  419. if(layerFuture.length >0){
  420. var rect = layerFuture.pop();
  421. beenTheresettings.Groups[beenTheresettings.CurrentGroup].push(rect);
  422. DrawFeature(rect);
  423. }
  424. }
  425.  
  426. function RemoveAllBoxes() {
  427. if(beenTheresettings.Groups[beenTheresettings.CurrentGroup].length > 0)
  428. if(confirm("Clearing all boxes cannot be undone.\nPress OK to clear all boxes.")){
  429. var mro_mapLayers = W.map.getLayersBy("uniqueName", "__beenThere");
  430.  
  431. var mro_mapLayers_mapLayerLength = mro_mapLayers[0].features.length;
  432. if (mro_mapLayers_mapLayerLength > 0)
  433. mro_mapLayers[0].destroyFeatures();
  434. beenTheresettings.Groups[beenTheresettings.CurrentGroup] = [];
  435. layerFuture = [];
  436. saveSettings();
  437. updateTotalRectCount();
  438. }
  439. }
  440.  
  441. var mapLayers;
  442. var userRectLayer;
  443. function init() {
  444. LoadSettingsObj();
  445.  
  446. mapLayers = new OpenLayers.Layer.Vector("Been There", {
  447. displayInLayerSwitcher: true,
  448. uniqueName: "__beenThere"
  449. });
  450.  
  451. userRectLayer = new OpenLayers.Layer.Vector("BeenThereUserRect", {
  452. displayInLayerSwitcher: false,
  453. uniqueName: "__beenThereUserRect"
  454. });
  455. //$.getScript('https://npmcdn.com/@turf/turf@3.9.0/turf.min.js');
  456. W.map.addLayer(mapLayers);
  457. mapLayers.setVisibility(beenTheresettings.layerVisible);
  458. mapLayers.setOpacity(0.6);
  459. W.map.addLayer(userRectLayer);
  460. userRectLayer.setOpacity(0.6);
  461. userRectLayer.setVisibility(beenTheresettings.layerVisible);
  462.  
  463. WazeWrap.Interface.AddLayerCheckbox("display", "Been There", beenTheresettings.layerVisible, LayerToggled, [mapLayers, userRectLayer]);
  464.  
  465. //append our css to the head
  466. var g = '.beenThereButtons {font-size:26px; color:#59899e; cursor:pointer;} .flex-container {display: -webkit-flex; display: flex; background-color:black;}';
  467. $("head").append($('<style type="text/css">' + g + '</style>'));
  468.  
  469. //add controls to the map
  470. var $section = $("<div>", {style:"padding:8px 16px", id:"WMEBeenThere"});
  471. $section.html([
  472. '<div id="beenThere" class="flex-container" style="width:65px; position: absolute;top:' + beenTheresettings.LocTop + '; left: ' + beenTheresettings.LocLeft + '; z-index: 1040 !important; border-radius: 5px; padding: 4px; background-color: #000000;">',
  473. '<div class="flex-container" style="width:32px; flex-wrap:wrap;" >',//left side container
  474. '<div id="NewBox" class="waze-icon-plus_neg beenThereButtons" style="margin-top:-10px; display:block; float:left;" title="Draw a box around the visible area"></div>',
  475. '<div id="UserRect" class="fa fa-pencil-square-o" style="display:block; float:left; margin-left:3px; color:#59899e; cursor:pointer; font-size:25px;"></div>',
  476. '<div id="UserCirc" class="fa-stack" style="margin-top:10px; display:block; float:left; color:#59899e; cursor:pointer;"><span class="fa fa-circle-thin fa-stack-2x"></span><span class="fa fa-pencil" style="font-size:20px; margin-left:8px;"></span></div>',
  477. '<div id="RemoveLastBox" class="waze-icon-undo beenThereButtons" style="display:block;margin-bottom:-10px;" title="Remove last shape"></div>',
  478. '<div id="Redo" class="waze-icon-redo beenThereButtons" style="display:block;margin-bottom:-10px;" title="Redo last shape"></div>',
  479. '<div id="TrashBox" class="waze-icon-trash beenThereButtons" style="margin-bottom:-5px; display:block;" title="Remove all shapes">',
  480. '<span id="rectCount" style="position:absolute; top:150px; right:16px;font-size:12px;">0</span></div>',
  481. '<div id="Settings" class="fa fa-cog" style="display:block; float:left; margin-left:3px; color:#59899e; cursor:pointer; font-size:20px;"></div>',
  482. '</div>',//close left side container
  483. '<div class="flex-container" style="width:30px; height:90px; flex-wrap:wrap; justify-content:flex-start;">', //right side container
  484. '<input type="radio" name="currColor" value="btcolorPicker1" style="width:10px;" checked="checked">',
  485. '<button class="jscolor {valueElement:null,hash:true,closable:true}" style="float:right;width:15px; height:15px;border:2px solid black" id="btcolorPicker1"></button>',
  486. '<input type="radio" name="currColor" value="btcolorPicker2" style="width:10px;">',
  487. '<button class="jscolor {valueElement:null,hash:true,closable:true}" style="float:right;width:15px; height:15px;border:2px solid black" id="btcolorPicker2"></button>',
  488. '<input type="radio" name="currColor" value="btcolorPicker3" style="width:10px;">',
  489. '<button class="jscolor {valueElement:null,hash:true,closable:true}" style="float:right;width:15px; height:15px;border:2px solid black" id="btcolorPicker3"></button>',
  490. '<input type="radio" name="currColor" value="btcolorPicker4" style="width:10px;">',
  491. '<button class="jscolor {valueElement:null,hash:true,closable:true}" style="float:right;width:15px; height:15px;border:2px solid black" id="btcolorPicker4"></button>',
  492. '</div>' //close right side container
  493. ].join(' '));
  494.  
  495. $("#WazeMap").append($section.html());
  496.  
  497. BuildSettingsInterface();
  498.  
  499. //set up listeners
  500. $("#NewBox").click(NewBox);
  501. $('#UserRect').click(NewUserRect);
  502. $('#UserCirc').click(NewUserCircle);
  503. $("#RemoveLastBox").click(RemoveLastBox);
  504. $('#Redo').click(RedoLastBox);
  505. $("#TrashBox").click(RemoveAllBoxes);
  506. $('#Settings').click(function(){
  507. $('#BTSettings')[0].innerHTML = localStorage.beenThere_Settings;
  508. setChecked('chkBTShapeBorder',beenTheresettings.DrawShapeBorder);
  509. setChecked('chkBTShapeFill',beenTheresettings.FillShape);
  510. $('#BeenThereSettings').css({'visibility':'visible'});
  511. });
  512. new WazeWrap.Interface.Shortcut('NewBoxShortcut', 'Draw a box around the visible area', 'wmebt', 'Been There', beenTheresettings.NewBoxShortcut, NewBox, null).add();
  513. new WazeWrap.Interface.Shortcut('NewUserRectShortcut', 'Draw a rectangle', 'wmebt', 'Been There', beenTheresettings.NewUserRectShortcut, NewUserRect, null).add();
  514. new WazeWrap.Interface.Shortcut('NewUserCircleShortcut', 'Draw a circle', 'wmebt', 'Been There', beenTheresettings.NewUserCircleShortcut, NewUserCircle, null).add();
  515. new WazeWrap.Interface.Shortcut('RemoveLastShapeShortcut', 'Remove last shape', 'wmebt', 'Been There', beenTheresettings.RemoveLastShapeShortcut, RemoveLastBox, null).add();
  516. new WazeWrap.Interface.Shortcut('RedoLastShapeShortcut', 'Redo last shape', 'wmebt', 'Been There', beenTheresettings.RedoLastShapeShortcut, RedoLastBox, null).add();
  517. new WazeWrap.Interface.Shortcut('RemoveAllShapesShortcut', 'Remove all shapes', 'wmebt', 'Been There', beenTheresettings.RemoveAllShapesShortcut, RemoveAllBoxes, null).add();
  518.  
  519. //necessary to catch changes to the keyboard shortcuts
  520. window.onbeforeunload = function() {
  521. checkShortcutsChanged();
  522. };
  523.  
  524. $('[name="currColor"]').change(function() {
  525. currColor = '#' + $('#' + this.value)[0].jscolor.toString();
  526. });
  527.  
  528. if($.ui){
  529. $('#beenThere').draggable({
  530. stop: function(event, ui) {
  531. beenTheresettings.LocLeft = $('#beenThere').css('left');
  532. beenTheresettings.LocTop = $('#beenThere').css('top');
  533. saveSettings();
  534. }
  535. });
  536.  
  537. $('#BeenThereSettings').draggable({
  538. stop: function(event, ui) {
  539. beenTheresettings.SettingsLocLeft = $('#BeenThereSettings').css('left');
  540. beenTheresettings.SettingsLocTop = $('#BeenThereSettings').css('top');
  541. saveSettings();
  542. }
  543. });
  544. }
  545.  
  546. initColorPicker();
  547. LoadSettings();
  548.  
  549. WazeWrap.Interface.ShowScriptUpdate("WME BeenThere", GM_info.script.version, updateMessage, "https://gf.qytechs.cn/scripts/27035-wme-beenthere", "https://www.waze.com/forum/viewtopic.php?f=819&t=218182");
  550. }
  551.  
  552. function LayerToggled(checked){
  553. userRectLayer.setVisibility(checked);
  554. mapLayers.setVisibility(checked);
  555. beenTheresettings.layerVisible = checked;
  556. saveSettings();
  557. }
  558.  
  559. /*
  560. Takes the settings loaded into the settings obj and loads them into the interface and draws any features that were saved
  561. */
  562. function LoadSettings(){
  563. loadGroup(beenTheresettings.CurrentGroup);
  564.  
  565. if ($('#btcolorPicker1')[0].jscolor && $('#btcolorPicker2')[0].jscolor && $('#btcolorPicker3')[0].jscolor && $('#btcolorPicker4')[0].jscolor){
  566. $('#btcolorPicker1')[0].jscolor.fromString(beenTheresettings.CP1);
  567. $('#btcolorPicker2')[0].jscolor.fromString(beenTheresettings.CP2);
  568. $('#btcolorPicker3')[0].jscolor.fromString(beenTheresettings.CP3);
  569. $('#btcolorPicker4')[0].jscolor.fromString(beenTheresettings.CP4);
  570. }
  571. }
  572.  
  573. function loadGroup(group){
  574. for(var i=0;i<beenTheresettings.Groups[group].length;i++)
  575. DrawFeature(beenTheresettings.Groups[group][i]);
  576. }
  577.  
  578. function BuildSettingsInterface(){
  579. var $section = $("<div>", {style:"padding:8px 16px", id:"WMEBeenThereSettings"});
  580. $section.html([
  581. `<div id="BeenThereSettings" style="visibility:hidden; position:fixed; top:${beenTheresettings.SettingsLocTop}; left:${beenTheresettings.SettingsLocLeft}; z-index:1000; background-color:white; border-width:3px; border-style:solid; border-radius:10px; padding:4px;">`,
  582. '<div>', //top div - split left/right
  583. '<div style="width:328px; height:240px; display:inline-block; float:left;">', //left side div
  584. '<div><h3>Drawing</h3>',
  585. '<input type="radio" name="DrawOptions" class="btOptions" id="chkBTShapeBorder">Draw shape border</br>',
  586. '<input type="radio" name="DrawOptions" class="btOptions" id="chkBTShapeFill">Fill shape</br>',
  587. '</div></br>',//close drawing div
  588. '<div><h3>Export/Import</h3>',
  589. '<div><button class="fa fa-upload fa-2x" aria-hidden="true" id="btnBTCopySettings" style="cursor:pointer;border: 1; background: none; box-shadow:none;" title="Copy BeenThere settings to the clipboard" data-clipboard-target="#BTSettings"></button>',
  590. '<textarea rows="4" cols="30" readonly id="BTSettings" style="resize:none;"></textarea>',
  591. '</div>',//end export div
  592. '<div>', // import div
  593. '<button class="fa fa-download fa-2x" aria-hidden="true" id="btnBTImportSettings" style="cursor:pointer;border: 1; background: none; box-shadow:none;" title="Import copied settings"></button>',
  594. '<textarea rows="4" cols="30" id="txtBTImportSettings" style="resize:none;"></textarea>',
  595. '</div>',//end import div
  596. '</div>',//close import/export div
  597. '</div>', //close left side div
  598.  
  599. '<div style="display:inline-block; height:240px;">', //right side div
  600. '<h3>Groups</h3>',
  601. '<div id="BeenThereGroups">',
  602. '<div id="BeenThereGroupsList">',
  603. '</div>',
  604. '<div style="float:left;">',//textboxes div
  605. '<label for="btGroupName" style="display:inline-block; width:40px;">Name </label><input type="text" id="btGroupName" size="10" style="border: 1px solid #000000; height:20px;"/></br>',
  606. '</div>', //End textboxes div
  607.  
  608. '<div style="float:right; text-align:center;">',//button div
  609. '<button id="btAddGroup">Add</button>',
  610. '</div>',//close button div
  611. '</div>', //close BeenThereGroups
  612. '</div>', //close right side div
  613. '</div>', //close top div
  614.  
  615. '<div style="float: right; top:10px;">', //save/cancel buttons
  616. '<button id="BeenThereSettingsClose" class="btn btn-default">Close</button>',
  617. '</div>',//end save/cancel buttons
  618. '</div>'
  619. ].join(' '));
  620.  
  621. $("#WazeMap").append($section.html());
  622.  
  623. $('.btOptions').change(function(){
  624. beenTheresettings.DrawShapeBorder = isChecked('chkBTShapeBorder');
  625. beenTheresettings.FillShape = isChecked('chkBTShapeFill');
  626. saveSettings();
  627. });
  628.  
  629. $("#BeenThereSettingsClose").click(function(){
  630. $('#BeenThereSettings').css({'visibility':'hidden'}); //hide the settings window
  631. });
  632.  
  633. $('#btnBTImportSettings').click(function(){
  634. if($('#txtBTImportSettings')[0].value !== ""){
  635. localStorage.beenThere_Settings = $('#txtBTImportSettings')[0].value;
  636. LoadSettingsObj();
  637. LoadSettings();
  638. }
  639. });
  640.  
  641. LoadCustomGroups();
  642.  
  643. $('#btAddGroup').click(function(){
  644. if($('#btGroupName').val() !== ""){
  645. let name = $('#btGroupName').val();
  646. let exists = beenTheresettings.Groups[name];
  647. if(exists == null){
  648. beenTheresettings.Groups[name] = [];
  649. $('#btGroupsName').val("");
  650. LoadCustomGroups();
  651. saveSettings();
  652. }
  653. }
  654. });
  655.  
  656. new Clipboard('#btnBTCopySettings');
  657. }
  658.  
  659. function LoadCustomGroups(){
  660. $('#BeenThereGroupsList').empty();
  661. var groups = "";
  662. $.each(beenTheresettings.Groups, function(k, v){
  663. groups += '<div style="position:relative;">' + k + '<i id="BTGroupsClose' + k + '" style="position:absolute; right:0; top:0;" class="fa fa-times" title="Remove group"></i></div>';
  664. });
  665.  
  666. groups += 'Current group: <select id="btCurrGroup">';
  667. $.each(beenTheresettings.Groups, function(val, obj){
  668. groups += `<option value="${val}">${val}</option>`;
  669. });
  670. groups += '</select>';
  671.  
  672. $('#BeenThereGroupsList').prepend(groups);
  673.  
  674. $('#btCurrGroup')[0].value = beenTheresettings.CurrentGroup;
  675.  
  676. $('#btCurrGroup').change(function(){
  677. beenTheresettings.CurrentGroup = $(this)[0].value;
  678. clearLayer();
  679. mapLayers.removeAllFeatures();
  680. loadGroup(beenTheresettings.CurrentGroup);
  681. saveSettings();
  682. });
  683.  
  684. $('[id^="BTGroupsClose"]').click(function(){
  685. if(getObjectPropertyCount(beenTheresettings.Groups) > 1){
  686. delete beenTheresettings.Groups[this.id.replace('BTGroupsClose','')];
  687. saveSettings();
  688. LoadCustomGroups();
  689. }
  690. else
  691. alert("There must be at least one group");
  692. });
  693. }
  694.  
  695. function isChecked(checkboxId) {
  696. return $('#' + checkboxId).is(':checked');
  697. }
  698.  
  699. function setChecked(checkboxId, checked) {
  700. $('#' + checkboxId).prop('checked', checked);
  701. }
  702.  
  703. function initColorPicker(tries = 1){
  704. if ($('#btcolorPicker1')[0].jscolor && $('#btcolorPicker2')[0].jscolor) {
  705. $('#btcolorPicker1')[0].jscolor.fromString(beenTheresettings.CP1);
  706. $('#btcolorPicker2')[0].jscolor.fromString(beenTheresettings.CP2);
  707. $('#btcolorPicker3')[0].jscolor.fromString(beenTheresettings.CP3);
  708. $('#btcolorPicker4')[0].jscolor.fromString(beenTheresettings.CP4);
  709. $('[id^="colorPicker"]')[0].jscolor.closeText = 'Close';
  710. $('#btcolorPicker1')[0].jscolor.onChange = jscolorChanged;
  711. $('#btcolorPicker2')[0].jscolor.onChange = jscolorChanged;
  712. $('#btcolorPicker3')[0].jscolor.onChange = jscolorChanged;
  713. $('#btcolorPicker4')[0].jscolor.onChange = jscolorChanged;
  714.  
  715.  
  716. } else if (tries < 1000)
  717. setTimeout(function () {initColorPicker(tries++);}, 200);
  718. }
  719.  
  720. function jscolorChanged(){
  721. beenTheresettings.CP1 = "#" + $('#btcolorPicker1')[0].jscolor.toString();
  722. beenTheresettings.CP2 = "#" + $('#btcolorPicker2')[0].jscolor.toString();
  723. beenTheresettings.CP3 = "#" + $('#btcolorPicker3')[0].jscolor.toString();
  724. beenTheresettings.CP4 = "#" + $('#btcolorPicker4')[0].jscolor.toString();
  725. //In case they changed the color of the currently selected color, re-set currColor
  726. currColor = '#' + $('#' + $("input[type='radio'][name='currColor']:checked").val())[0].jscolor.toString();
  727. saveSettings();
  728. }
  729.  
  730. function objectHasProperties(object) {
  731. for (var prop in object) {
  732. if (object.hasOwnProperty(prop))
  733. return true;
  734. }
  735. return false;
  736. }
  737.  
  738. function getObjectPropertyCount(object){
  739. let count = 0;
  740. for (var prop in object) {
  741. if (object.hasOwnProperty(prop))
  742. count++;
  743. }
  744. return count;
  745. }
  746.  
  747. async function LoadSettingsObj() {
  748. var loadedSettings;
  749. try{
  750. loadedSettings = $.parseJSON(localStorage.getItem("beenThere_Settings"));
  751. }
  752. catch(err){
  753. loadedSettings = null;
  754. }
  755.  
  756. var defaultSettings = {
  757. layerHistory: [],
  758. LocLeft: "6px",
  759. LocTop: "280px",
  760. CP1: "#FDA400",
  761. CP2: "#fd0303",
  762. CP3: "#1303fd",
  763. CP4: "#00fd22",
  764. DrawShapeBorder: true,
  765. FillShape: false,
  766. NewBoxShortcut: "",
  767. NewUserRectShortcut: "",
  768. NewUserCircleShortcut: "",
  769. RemoveLastShapeShortcut: "",
  770. RedoLastShapeShortcut: "",
  771. RemoveAllShapesShortcut: "",
  772. SettingsLocTop: "40%",
  773. SettingsLocLeft: "50%",
  774. Groups: {"default": []},
  775. CurrentGroup: "default",
  776. layerVisible: true,
  777. lastSaved: 0
  778. };
  779.  
  780. beenTheresettings = $.extend({}, defaultSettings, loadedSettings);
  781.  
  782. let serverSettings = await WazeWrap.Remote.RetrieveSettings("BeenThere");
  783. if(serverSettings && serverSettings.lastSaved > beenTheresettings.lastSaved)
  784. $.extend(beenTheresettings, serverSettings);
  785. if(parseInt(beenTheresettings.LocLeft.replace('px', '')) < 0)
  786. beenTheresettings.LocLeft = "6px";
  787. if(parseInt(beenTheresettings.LocTop.replace('px','')) < 0)
  788. beenTheresettings.LocTop = "280px";
  789.  
  790. currColor = beenTheresettings.CP1;
  791.  
  792. if(beenTheresettings.layerHistory.length > 0){ //move our old layers into the default group
  793. beenTheresettings.Groups.default = [...beenTheresettings.layerHistory];
  794. beenTheresettings.layerHistory = [];
  795. saveSettings();
  796. }
  797. }
  798.  
  799. function saveSettings() {
  800. if (localStorage) {
  801. var localsettings = {
  802. layerHistory: beenTheresettings.layerHistory,
  803. LocLeft: beenTheresettings.LocLeft,
  804. LocTop: beenTheresettings.LocTop,
  805. CP1: beenTheresettings.CP1,
  806. CP2: beenTheresettings.CP2,
  807. CP3: beenTheresettings.CP3,
  808. CP4: beenTheresettings.CP4,
  809. DrawShapeBorder: beenTheresettings.DrawShapeBorder,
  810. FillShape: beenTheresettings.FillShape,
  811. NewBoxShortcut: beenTheresettings.NewBoxShortcut,
  812. NewUserRectShortcut: beenTheresettings.NewUserRectShortcut,
  813. NewUserCircleShortcut: beenTheresettings.NewUserCircleShortcut,
  814. RemoveLastShapeShortcut: beenTheresettings.RemoveLastShapeShortcut,
  815. RedoLastShapeShortcut: beenTheresettings.RedoLastShapeShortcut,
  816. RemoveAllShapesShortcut: beenTheresettings.RemoveAllShapesShortcut,
  817. SettingsLocTop: beenTheresettings.SettingsLocTop,
  818. SettingsLocLeft: beenTheresettings.SettingsLocLeft,
  819. Groups: beenTheresettings.Groups,
  820. CurrentGroup: beenTheresettings.CurrentGroup,
  821. layerVisible: beenTheresettings.layerVisible,
  822. lastSaved: Date.now()
  823. };
  824. if(parseInt(localsettings.LocLeft.replace('px', '')) < 0)
  825. localsettings.LocLeft = "6px";
  826. if(parseInt(localsettings.LocTop.replace('px','')) < 0)
  827. localsettings.LocTop = "280px";
  828.  
  829. for (var name in W.accelerators.Actions) {
  830. let TempKeys = "";
  831. if (W.accelerators.Actions[name].group == 'wmebt') {
  832. console.log(name);
  833. if (W.accelerators.Actions[name].shortcut) {
  834. if (W.accelerators.Actions[name].shortcut.altKey === true)
  835. TempKeys += 'A';
  836. if (W.accelerators.Actions[name].shortcut.shiftKey === true)
  837. TempKeys += 'S';
  838. if (W.accelerators.Actions[name].shortcut.ctrlKey === true)
  839. TempKeys += 'C';
  840. if (TempKeys !== "")
  841. TempKeys += '+';
  842. if (W.accelerators.Actions[name].shortcut.keyCode)
  843. TempKeys += W.accelerators.Actions[name].shortcut.keyCode;
  844. } else
  845. TempKeys = "-1";
  846. localsettings[name] = TempKeys;
  847. }
  848. }
  849.  
  850. localStorage.setItem("beenThere_Settings", JSON.stringify(localsettings));
  851. WazeWrap.Remote.SaveSettings("BeenThere", localsettings);
  852. }
  853. }
  854.  
  855. function checkShortcutsChanged(){
  856. let triggerSave = false;
  857. for (let name in W.accelerators.Actions) {
  858. let TempKeys = "";
  859. if (W.accelerators.Actions[name].group == 'wmepie') {
  860. if (W.accelerators.Actions[name].shortcut) {
  861. if (W.accelerators.Actions[name].shortcut.altKey === true)
  862. TempKeys += 'A';
  863. if (W.accelerators.Actions[name].shortcut.shiftKey === true)
  864. TempKeys += 'S';
  865. if (W.accelerators.Actions[name].shortcut.ctrlKey === true)
  866. TempKeys += 'C';
  867. if (TempKeys !== "")
  868. TempKeys += '+';
  869. if (W.accelerators.Actions[name].shortcut.keyCode)
  870. TempKeys += W.accelerators.Actions[name].shortcut.keyCode;
  871. } else
  872. TempKeys = "-1";
  873. if(beenTheresettings[name] != TempKeys){
  874. beenTheresettings[name] = TempKeys;
  875. triggerSave = true;
  876. break;
  877. }
  878. }
  879. }
  880. if(triggerSave)
  881. saveSettings();
  882. }
  883. })();

QingJ © 2025

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