WME Place Interface Enhancements

Enhancements to various Place interfaces

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

  1. // ==UserScript==
  2. // @name WME Place Interface Enhancements
  3. // @namespace https://greasyfork.org/users/30701-justins83-waze
  4. // @version 0.4.2
  5. // @description Enhancements to various Place interfaces
  6. // @include https://www.waze.com/editor/*
  7. // @include https://www.waze.com/*/editor/*
  8. // @include https://beta.waze.com/*
  9. // @exclude https://www.waze.com/user/editor*
  10. // @author JustinS83
  11. // @grant none
  12. // @require https://greasyfork.org/scripts/24851-wazewrap/code/WazeWrap.js
  13. // @license GPLv3
  14. // ==/UserScript==
  15. var UpdateObject, MultiAction;
  16.  
  17. (function() {
  18. 'use strict';
  19.  
  20. var settings = {};
  21. var placeMenuSelector = "#edit-buttons > div > div.toolbar-button.waze-icon-place.toolbar-submenu.toolbar-group.toolbar-group-venues.ItemInactive > menu";
  22. var pointStyle = {
  23. pointRadius: 6,
  24. fillOpacity: 0,
  25. strokeColor: '#00ece3',
  26. strokeWidth: '2',
  27. strokeLinecap: 'round'
  28. };
  29. var layerName = "WME PIE";
  30. var placementMode = false;
  31.  
  32. // Your code here...
  33. function bootstrap(tries) {
  34. tries = tries || 1;
  35.  
  36. if (window.W &&
  37. window.W.map &&
  38. window.W.model &&
  39. $) {
  40. init();
  41. } else if (tries < 1000) {
  42. setTimeout(function () {bootstrap(tries++);}, 200);
  43. }
  44. }
  45.  
  46. bootstrap();
  47.  
  48. function init(){
  49. var $section = $("<div>", {style:"padding:8px 16px", id:"WMEPIESettings"});
  50. $section.html([
  51. '<h4><b>WME Place Interface Enhancements</b></h4>',
  52. '<div class="controls-container" id="divAreaPlaceSizeControls">',
  53. '<div id="divShowAreaPlaceSize" class="controls-container"><input type="checkbox" id="_cbShowAreaPlaceSize" class="pieSettingsCheckbox" /><label for="_cbShowAreaPlaceSize">Show area Place size</label></div>',
  54. '<div id="divShowAreaPlaceSizeImperial"class="controls-container" style="padding-left:30px;"><input type="checkbox" id="_cbShowAreaPlaceSizeImperial" class="pieSettingsCheckbox" disabled /><label for ="_cbShowAreaPlaceSizeImperial"> Show imperial </label></div>',
  55. '<div id="divShowAreaPlaceSizeMetric" class="controls-container" style="padding-left:30px;"><input type="checkbox" id="_cbShowAreaPlaceSizeMetric" class="pieSettingsCheckbox" disabled /><label for ="_cbShowAreaPlaceSizeMetric"> Show metric</label></div>',
  56. '</div>',
  57. '<div class="controls-container" id="divShowLockButtonsRPP"><input type="checkbox" id="_cbShowLockButtonsRPP" class="pieSettingsCheckbox" /><label for="_cbShowLockButtonsRPP">Show lock buttons for RPPs</label></div>',
  58. '<b>New Places</b></br>',
  59. '<div id="divEditRPPAfterCreated" class="controls-container"><input type="checkbox" id="_cbEditRPPAfterCreated" class="pieSettingsCheckbox"><label for="_cbEditRPPAfterCreated">Edit RPP address after created</label></div>',
  60. '<div id="divUseStreetFromClosestSeg" class="controls-container"><input type="checkbox" id="_cbUseStreetFromClosestSeg" class="pieSettingsCheckbox"><label for="_cbUseStreetFromClosestSeg">Use street name from closest segment</label></div>',
  61. '<div id="divUseCityFromClosestSeg" class="controls-container"><input type="checkbox" id="_cbUseCityFromClosestSeg" class="pieSettingsCheckbox"><label for="_cbUseCityFromClosestSeg">Use city name from closest segment</label></div>',
  62. '<div class="controls-container" id="divPlaceMenuCustomization">',
  63. '<b>Place Menu Customization</b></br>',
  64. buildItemOption(1),
  65. buildItemOption(2),
  66. buildItemOption(3),
  67. buildItemOption(4),
  68. buildItemOption(5),
  69. buildItemOption(6),
  70. buildItemOption(7),
  71. buildItemOption(8),
  72. buildItemOption(9),
  73. buildItemOption(10),
  74. buildItemOption(11),
  75. '</div>'
  76.  
  77. ].join(' '));
  78.  
  79. UpdateObject = require("Waze/Action/UpdateObject");
  80. MultiAction = require("Waze/Action/MultiAction");
  81.  
  82. var newPlaceLayer = new OL.Layer.Vector(layerName,{displayInLayerSwitcher: false});
  83. W.map.addLayer(newPlaceLayer);
  84.  
  85. new WazeWrap.Interface.Tab('PIE', $section.html(), init2);
  86. }
  87.  
  88. function buildNewPlaceList(){
  89. //Clear out the Places menu
  90. $('#edit-buttons > div > div.toolbar-button.waze-icon-place.toolbar-submenu.toolbar-group.toolbar-group-venues.ItemInactive > menu').empty();
  91. var cat = "";
  92. for(i=0;i<11;i++){
  93. cat = $('#pieItem' + (i+1))[0].value;
  94. if(cat !== "PARKING_LOT" && cat !== "RESIDENCE_HOME")
  95. $(placeMenuSelector).append('<div class="toolbar-group-item WazeControlDrawFeature ItemInactive" id="piePlaceMainItem' + (i+1) + '" data-category="'+ cat + '"><span class="menu-title">' + $('#pieItem' + (i+1))[0].options[$('#pieItem' + (i+1))[0].selectedIndex].innerHTML + '</span><div class="drawing-controls"><span class="drawing-control polygon secondary-control" id="piePlaceAreaItem' + (i+1) + '" data-category="' + cat + '" title="Place (area)"></span><span class="drawing-control main-control point" id="piePlacePointItem' + (i+1) + '" data-category="' + cat + '" title="Place (point)"></span></div></div>');
  96. else
  97. $(placeMenuSelector).append('<div class="toolbar-group-item WazeControlDrawFeature ItemInactive" id="piePlaceMainItem' + (i+1) + '" data-category="'+ cat + '"><span class="menu-title">' + $('#pieItem' + (i+1))[0].options[$('#pieItem' + (i+1))[0].selectedIndex].innerHTML + '</span></div>');
  98. }
  99.  
  100. $('[id^="piePlaceMainItem"]').click(function(e){
  101. console.log($('#' + this.id).data("category") + " Point");
  102. startPlacementMode($('#' + this.id).data("category"), true);
  103. });
  104.  
  105. $('[id^="piePlaceAreaItem"]').click(function(e){
  106. e.stopPropagation();
  107. console.log($('#' + this.id).data("category") + " Area");
  108. startPlacementMode($('#' + this.id).data("category"), false);
  109. });
  110. }
  111.  
  112. function init2(){
  113. //First load settings
  114. loadSettings();
  115. //Second set up event handlers
  116. $('#_cbShowAreaPlaceSize').change(function() {
  117. if(this.checked) {
  118. attachPlaceSizeHandlers();
  119. updatePlaceSizeDisplay();
  120. $('#_cbShowAreaPlaceSizeImperial')[0].disabled = false;
  121. $('#_cbShowAreaPlaceSizeMetric')[0].disabled = false;
  122. }
  123. else
  124. {
  125. removePlaceSizeHandlers();
  126. $('#AreaSize').remove();
  127. $('#_cbShowAreaPlaceSizeImperial')[0].disabled = true;
  128. $('#_cbShowAreaPlaceSizeMetric')[0].disabled = true;
  129. }
  130. });
  131.  
  132. $('#_cbShowLockButtonsRPP').change(function() {
  133. if(this.checked) {
  134. attachRPPLockButtonHandlers();
  135. }
  136. else
  137. {
  138. $('#RPPOptionPlaceLockButtonsContainer').remove();
  139. W.selectionManager.events.unregister("selectionchanged", null, addLockButtons);
  140. W.model.actionManager.events.unregister("afterundoaction",null, addLockButtons);
  141. W.model.actionManager.events.unregister("afterclearactions",null, addLockButtons);
  142. W.model.actionManager.events.unregister("afteraction",null, addLockButtons);
  143. }
  144. });
  145.  
  146. //Third load settings to interface
  147. setChecked('_cbShowAreaPlaceSize', settings.ShowAreaPlaceSize);
  148. setChecked('_cbShowAreaPlaceSizeImperial', settings.ShowAreaPlaceSizeImperial);
  149. setChecked('_cbShowAreaPlaceSizeMetric', settings.ShowAreaPlaceSizeMetric);
  150. setChecked('_cbShowLockButtonsRPP', settings.ShowLockButtonsRPP);
  151. setChecked('_cbEditRPPAfterCreated', settings.EditRPPAfterCreated);
  152. setChecked('_cbUseStreetFromClosestSeg', settings.UseStreetFromClosestSeg);
  153. setChecked('_cbUseCityFromClosestSeg', settings.UseCityFromClosestSeg);
  154. if(settings.ShowAreaPlaceSize){
  155. $('#_cbShowAreaPlaceSizeImperial')[0].disabled = false;
  156. $('#_cbShowAreaPlaceSizeMetric')[0].disabled = false;
  157. attachPlaceSizeHandlers();
  158. }
  159.  
  160. if(settings.ShowLockButtonsRPP)
  161. attachRPPLockButtonHandlers();
  162.  
  163. $('.pieSettingsCheckbox').change(function() {
  164. var settingName = $(this)[0].id.substr(3);
  165. settings[settingName] = this.checked;
  166. saveSettings();
  167. });
  168.  
  169. //Whenever a Place item is changed, read the settings and save to localStorage
  170. $('[id^="pieItem"]').change(function(){
  171. for(i=0;i<11;i++){
  172. settings.NewPlacesList[i] = $('#pieItem'+(i+1))[0].value;
  173. }
  174. saveSettings();
  175. buildNewPlaceList();
  176. });
  177.  
  178. //Load settings into Place Customization list options
  179. for(i=0; i<11;i++)
  180. $('#pieItem'+(i+1))[0].value = settings.NewPlacesList[i];
  181.  
  182. //Build our new menu
  183. buildNewPlaceList();
  184. }
  185.  
  186. function startPlacementMode(category, isPoint){
  187. $('#edit-buttons > div > div.toolbar-button.waze-icon-place.toolbar-submenu.toolbar-group.toolbar-group-venues.ItemInactive').removeClass("open");
  188. $("#map").on('mousemove', MouseMoveHandler);
  189. $("#map").on('click', function(){endPlacementMode(category, isPoint);});
  190. document.addEventListener('keyup', keyUpHandler, false);
  191. }
  192.  
  193. function keyUpHandler(e){
  194. if (e.keyCode == 27)
  195. disablePlacementMode();
  196. }
  197.  
  198. function disablePlacementMode(){
  199. $("#map").off('click');//, endPlacementMode);
  200. $("#map").off('mousemove', MouseMoveHandler);
  201. clearLayer();
  202. document.removeEventListener('keyup', keyUpHandler);
  203. }
  204.  
  205. function endPlacementMode(category, isPoint){
  206. disablePlacementMode();
  207. createPlace(getMousePos900913(), category, isPoint);
  208. }
  209.  
  210. function getMousePos900913(){
  211. var mousePosition = $('.WazeControlMousePosition').text().split(" ");
  212. return WazeWrap.Geometry.ConvertTo900913(mousePosition[0], mousePosition[1]);
  213. }
  214.  
  215. function MouseMoveHandler(e){
  216. clearLayer();
  217. drawCircle(getMousePos900913());
  218. }
  219.  
  220. function clearLayer() {
  221. var layer = W.map.getLayersByName(layerName)[0];
  222. layer.removeAllFeatures();
  223. }
  224.  
  225. function drawCircle(e){
  226. var pointFeature = new OL.Feature.Vector(new OL.Geometry.Point(e.lon, e.lat), {}, pointStyle);
  227. W.map.getLayersByName(layerName)[0].addFeatures([pointFeature]);
  228. }
  229.  
  230. function createPlace(pos, category, isPoint){
  231. var PlaceObject = require("Waze/Feature/Vector/Landmark");
  232. var AddPlace = require("Waze/Action/AddLandmark");
  233. var multiaction = new MultiAction();
  234. multiaction.setModel(W.model);
  235.  
  236. var NewPlace = new PlaceObject();
  237. NewPlace.geometry = new OL.Geometry.Point(pos.lon, pos.lat);
  238. NewPlace.attributes.categories.push(category);
  239. if(category === "RESIDENCE_HOME"){
  240. NewPlace._originalResidential = true;
  241. NewPlace.attributes.residential = true;
  242. }
  243.  
  244. var closestSeg = WazeWrap.Geometry.findClosestSegment(new OL.Geometry.Point(pos.lon, pos.lat));
  245.  
  246. W.model.actionManager.add(new AddPlace(NewPlace));
  247. Waze.selectionManager.select([NewPlace]);
  248.  
  249. var newAttributes, UpdateFeatureAddress = require('Waze/Action/UpdateFeatureAddress'), address = closestSeg.getAddress();
  250.  
  251. newAttributes = {
  252. countryID: address.country.id,
  253. stateID: address.state.id,
  254. emptyCity: address.city.attributes.name ? null : true,
  255. emptyStreet: address.street.name ? null : true
  256. };
  257.  
  258. if(settings.UseStreetFromClosestSeg)
  259. newAttributes.streetName = address.street.name;
  260. else
  261. newAttributes.emptyStreet = true;
  262.  
  263. if(settings.UseCityFromClosestSeg)
  264. newAttributes.cityName = address.city.attributes.name;
  265. else
  266. newAttributes.emptyCity = true;
  267.  
  268. multiaction.doSubAction(new UpdateFeatureAddress(NewPlace, newAttributes));
  269. W.model.actionManager.add(multiaction);
  270.  
  271. if(category === "RESIDENCE_HOME" && settings.EditRPPAfterCreated)
  272. editRPPAddress();
  273. }
  274.  
  275. function editRPPAddress(rppTries){
  276. rppTries = rppTries || 1;
  277.  
  278. if ($('.edit-button').length > 0) {
  279. $('.edit-button').trigger("click");
  280. $('.house-number:first').focus();
  281.  
  282. } else if (rppTries < 1000) {
  283. console.log("not found");
  284. setTimeout(function () {editRPPAddress(rppTries++);}, 200);
  285. }
  286. }
  287.  
  288. function buildItemOption(itemNumber){
  289. var $section = $("<div>", {style:"padding:8px 16px", id:"piePlaceCat" + itemNumber});
  290. $section.html([
  291. 'Item ',
  292. itemNumber,
  293. buildItemList(itemNumber),
  294. '</br>'
  295. ].join(' '));
  296.  
  297. return $section.html();
  298. }
  299.  
  300. function buildItemList(itemNumber){
  301. /*var yourSelect = document.getElementById( "your-select-id" );
  302. alert( yourSelect.options[ yourSelect.selectedIndex ].value )*/
  303. var $places = $("<div>");
  304. $places.html([
  305. '<select id="pieItem' + itemNumber + '">',
  306. '<option value="CAR_SERVICES" style="font-weight:bold;">Car Services</option>',
  307. '<option value="GAS_STATION">Gas Station</option>',
  308. '<option value="GARAGE_AUTOMOTIVE_SHOP">Garage / Automotive Shop</option>',
  309. '<option value="CAR_WASH">Car Wash</option>',
  310. '<option value="CHARGING_STATION">Charging Station</option>',
  311. '<option value="TRANSPORTATION" style="font-weight:bold;">Transportation</option>',
  312. '<option value="AIRPORT">Airport</option>',
  313. '<option value="BUS_STATION">Bus Station</option>',
  314. '<option value="FERRY_PIER">Ferry / Pier</option>',
  315. '<option value="SEAPORT_MARINA_HARBOR">Seaport / Marina / Harbor</option>',
  316. '<option value="SUBWAY_STATION">Subway Station</option>',
  317. '<option value="TRAIN_STATION">Train Station</option>',
  318. '<option value="BRIDGE">Bridge</option>',
  319. '<option value="TUNNEL">Tunnel</option>',
  320. '<option value="TAXI_STATION">Taxi Station</option>',
  321. '<option value="JUNCTION_INTERCHANGE">Junction / Interchange</option>',
  322. '<option value="PROFESSIONAL_AND_PUBLIC" style="font-weight:bold;">Professional and public</option>',
  323. '<option value="COLLEGE_UNIVERSITY">College / University</option>',
  324. '<option value="SCHOOL">School</option>',
  325. '<option value="CONVENTIONS_EVENT_CENTER">Conventions / Event Center</option>',
  326. '<option value="GOVERNMENT">Government</option>',
  327. '<option value="LIBRARY">Library</option>',
  328. '<option value="CITY_HALL">City Hall</option>',
  329. '<option value="ORGANIZATION_OR_ASSOCIATION">Organization or Association</option>',
  330. '<option value="COURTHOUSE">Courthouse</option>',
  331. '<option value="CEMETERY">Cemetery</option>',
  332. '<option value="FIRE_DEPARTMENT">Fire Department</option>',
  333. '<option value="POLICE_STATION">Police Station</option>',
  334. '<option value="MILITARY">Military</option>',
  335. '<option value="HOSPITAL_MEDICAL_CARE">Hospital / Medical Care</option>',
  336. '<option value="OFFICES">Offices</option>',
  337. '<option value="POST_OFFICE">Post Office</option>',
  338. '<option value="RELIGIOUS_CENTER">Religious Center</option>',
  339. '<option value="KINDERGARTEN">Kindergarten</option>',
  340. '<option value="FACTORY_INDUSTRIAL">Factory / Industrial</option>',
  341. '<option value="EMBASSY_CONSULATE">Embassy / Consulate</option>',
  342. '<option value="INFORMATION_POINT">Information Point</option>',
  343. '<option value="EMERGENCY_SHELTER">Emergency Shelter</option>',
  344. '<option value="SHOPPING_AND_SERVICES" style="font-weight:bold;">Shopping and services</option>',
  345. '<option value="ARTS_AND_CRAFTS">Arts & Crafts</option>',
  346. '<option value="BANK_FINANCIAL">Bank / Financial</option>',
  347. '<option value="SPORTING_GOODS">Sporting Goods</option>',
  348. '<option value="BOOKSTORE">Bookstore</option>',
  349. '<option value="PHOTOGRAPHY">Photography</option>',
  350. '<option value="CAR_DEALERSHIP">Car Dealership</option>',
  351. '<option value="FASHION_AND_CLOTHING">Fashion and Clothing</option>',
  352. '<option value="CONVENIENCE_STORE">Convenience Store</option>',
  353. '<option value="PERSONAL_CARE">Personal Care</option>',
  354. '<option value="DEPARTMENT_STORE">Department Store</option>',
  355. '<option value="PHARMACY">Pharmacy</option>',
  356. '<option value="ELECTRONICS">Electronics</option>',
  357. '<option value="FLOWERS">Flowers</option>',
  358. '<option value="FURNITURE_HOME_STORE">Furniture / Home Store</option>',
  359. '<option value="GIFTS">Gifts</option>',
  360. '<option value="GYM_FITNESS">Gym / Fitness</option>',
  361. '<option value="SWIMMING_POOL">Swimming Pool</option>',
  362. '<option value="HARDWARE_STORE">Hardware Store</option>',
  363. '<option value="MARKET">Market</option>',
  364. '<option value="SUPERMARKET_GROCERY">Supermarket / Grocery</option>',
  365. '<option value="JEWELRY">Jewelry</option>',
  366. '<option value="LAUNDRY_DRY_CLEAN">Laundry / Dry Clean</option>',
  367. '<option value="SHOPPING_CENTER">Shopping Center</option>',
  368. '<option value="MUSIC_STORE">Music Store</option>',
  369. '<option value="PET_STORE_VETERINARIAN_SERVICES">Pet Store / Veterinarian Services</option>',
  370. '<option value="TOY_STORE">Toy Store</option>',
  371. '<option value="TRAVEL_AGENCY">Travel Agency</option>',
  372. '<option value="ATM">ATM</option>',
  373. '<option value="CURRENCY_EXCHANGE">Currency Exchange</option>',
  374. '<option value="CAR_RENTAL">Car Rental</option>',
  375. '<option value="FOOD_AND_DRINK" style="font-weight:bold;">Food and Drink</option>',
  376. '<option value="RESTAURANT">Restaurant</option>',
  377. '<option value="BAKERY">Bakery</option>',
  378. '<option value="DESSERT">Dessert</option>',
  379. '<option value="CAFE">Cafe</option>',
  380. '<option value="FAST_FOOD">Fast Food</option>',
  381. '<option value="FOOD_COURT">Food Court</option>',
  382. '<option value="BAR">Bar</option>',
  383. '<option value="ICE_CREAM">Ice Cream</option>',
  384. '<option value="CULTURE_AND_ENTERTAINEMENT" style="font-weight:bold;">Culture & Entertainment</option>',
  385. '<option value="ART_GALLERY">Art Gallery</option>',
  386. '<option value="CASINO">Casino</option>',
  387. '<option value="CLUB">Club</option>',
  388. '<option value="TOURIST_ATTRACTION_HISTORIC_SITE">Tourist Attraction / History Site</option>',
  389. '<option value="MOVIE_THEATER">Movie Theater</option>',
  390. '<option value="MUSEUM">Museum</option>',
  391. '<option value="MUSIC_VENUE">Music Venue</option>',
  392. '<option value="PERFORMING_ARTS_VENUE">Performing Arts Venue</option>',
  393. '<option value="GAME_CLUB">Game Club</option>',
  394. '<option value="STADIUM_ARENA">Stadium / Arena</option>',
  395. '<option value="THEME_PARK">Theme Park</option>',
  396. '<option value="ZOO_AQUARIUM">Zoo / Aquarium</option>',
  397. '<option value="RACING_TRACK">Racing Track</option>',
  398. '<option value="THEATER">Theater</option>',
  399. '<option value="OTHER" style="font-weight:bold;">Other</option>',
  400. '<option value="CONSTRUCTION_SITE">Construction Site</option>',
  401. '<option value="LODGING" style="font-weight:bold;">Lodging</option>',
  402. '<option value="HOTEL">Hotel</option>',
  403. '<option value="HOSTEL">Hostel</option>',
  404. '<option value="CAMPING_TRAILER_PARK">Camping / Trailer Park</option>',
  405. '<option value="COTTAGE_CABIN">Cottage / Cabin</option>',
  406. '<option value="BED_AND_BREAKFAST">Bed & Breakfast</option>',
  407. '<option value="OUTDOORS" style="font-weight:bold;">Outdoors</option>',
  408. '<option value="PARK">Park</option>',
  409. '<option value="PLAYGROUND">Playground</option>',
  410. '<option value="BEACH">Beach</option>',
  411. '<option value="SPORTS_COURT">Sports Court</option>',
  412. '<option value="GOLF_COURSE">Golf Course</option>',
  413. '<option value="PLAZA">Plaza</option>',
  414. '<option value="PROMENADE">Promenade</option>',
  415. '<option value="POOL">Pool</option>',
  416. '<option value="SCENIC_LOOKOUT_VIEWPOINT">Scenic Lookout / Viewpoint</option>',
  417. '<option value="SKI_AREA">Ski Area</option>',
  418. '<option value="NATURAL_FEATURES" style="font-weight:bold;">Natural Features</option>',
  419. '<option value="ISLAND">Island</option>',
  420. '<option value="SEA_LAKE_POOL">Sea / Lake / Pool</option>',
  421. '<option value="RIVER_STREAM">River / Stream</option>',
  422. '<option value="FOREST_GROVE">Forest / Grove</option>',
  423. '<option value="FARM">Farm</option>',
  424. '<option value="CANAL">Canal</option>',
  425. '<option value="SWAMP_MARSH">Swamp / Marsh</option>',
  426. '<option value="DAM">Dam</option>',
  427. '<option value="PARKING_LOT" style="font-weight:bold;">Parking Lot</option>',
  428. '<option value="RESIDENCE_HOME" style="font-weight:bold;">Residential</option>',
  429. '</select>'
  430. ].join(' '));
  431.  
  432. return $places.html();
  433. }
  434.  
  435. function attachRPPLockButtonHandlers(){
  436. $('#RPPOptionPlaceLockButtonsContainer').remove();
  437. W.selectionManager.events.register("selectionchanged", null, addLockButtons);
  438. W.model.actionManager.events.register("afterundoaction",null, addLockButtons);
  439. W.model.actionManager.events.register("afterclearactions",null, addLockButtons);
  440. W.model.actionManager.events.register("afteraction",null, addLockButtons);
  441. }
  442.  
  443. function attachPlaceSizeHandlers(){
  444. W.selectionManager.events.register("selectionchanged", null, updatePlaceSizeDisplay);
  445. W.model.actionManager.events.register("afteraction",null, updatePlaceSizeDisplay);
  446. W.model.actionManager.events.register("afterundoaction",null, updatePlaceSizeDisplay);
  447. W.model.actionManager.events.register("afterclearactions",null, updatePlaceSizeDisplay);
  448. W.model.actionManager.events.register("noActions",null, noActions);
  449. updatePlaceSizeDisplay();
  450. }
  451.  
  452. function removePlaceSizeHandlers(){
  453. W.selectionManager.events.unregister("selectionchanged", null, updatePlaceSizeDisplay);
  454. W.model.actionManager.events.unregister("afteraction",null, updatePlaceSizeDisplay);
  455. W.model.actionManager.events.unregister("afterundoaction",null, updatePlaceSizeDisplay);
  456. W.model.actionManager.events.unregister("afterclearactions",null, updatePlaceSizeDisplay);
  457. W.model.actionManager.events.unregister("noActions",null, noActions);
  458. }
  459.  
  460. function isChecked(checkboxId) {
  461. return $('#' + checkboxId).is(':checked');
  462. }
  463.  
  464. function setChecked(checkboxId, checked) {
  465. $('#' + checkboxId).prop('checked', checked);
  466. }
  467.  
  468. function noActions(){
  469. setTimeout(updatePlaceSizeDisplay, 100 ); //have to put in a delay for when the user uses undo to clear all actions - WME updates on top of my changes otherwise.
  470. }
  471.  
  472. function updatePlaceSizeDisplay(){
  473. var count = W.selectionManager.selectedItems.length;
  474. var metersArea = 0;
  475. var bold = false;
  476. if(count === 1){
  477. var venue = W.selectionManager.selectedItems[0];
  478. var isArea = venue.geometry.toString().match(/^POLYGON/);
  479. //var isPoint = venue.geometry.toString().match(/^POINT/);
  480.  
  481. if(venue.model.type === "venue" && isArea){
  482. if($('#AreaSize'))
  483. $('#AreaSize').remove();
  484. metersArea = W.selectionManager.selectedItems[0].model.geometry.getGeodesicArea(W.map.getProjectionObject());
  485.  
  486. if(metersArea > 0 && isArea){
  487. var ftArea = Math.round(metersArea * 10.76391 *100)/100;
  488.  
  489. var list = $('#landmark-edit-general > ul')[0];
  490. var newList = document.createElement("UL");
  491. newList.id = "AreaSize";
  492.  
  493. var newItem = document.createElement("LI");
  494. if(isChecked("_cbShowAreaPlaceSizeMetric")){
  495. newItem.innerHTML = "Area: " + metersArea.toFixed(2) + " m<sup>2</sup>";
  496. newList.append(newItem);
  497. }
  498.  
  499. if(isChecked("_cbShowAreaPlaceSizeImperial")){
  500. newItem = document.createElement("LI");
  501. newItem.innerHTML = "Area: " + ftArea.toFixed(2) + " ft<sup>2</sup>";
  502. newList.append(newItem);
  503. }
  504. if(metersArea < 500){
  505. newItem = document.createElement("LI");
  506. newItem.innerHTML = "<span style='color:red; font-weight:bold;'>Places smaller than 500 m<sup>2</sup>/5382 ft<sup>2</sup> will not show in the client</span>";
  507. newList.append(newItem);
  508. }
  509. list.before(newList);
  510.  
  511. $('#AreaSize').addClass("list-unstyled");
  512. $('#AreaSize').addClass("additional-attributes");
  513. }
  514. }
  515. }
  516. }
  517.  
  518. function loadSettings() {
  519. var loadedSettings = $.parseJSON(localStorage.getItem("WMEPIE_Settings"));
  520. var defaultSettings = {
  521. ShowAreaPlaceSize: false,
  522. ShowAreaPlaceSizeImperial: false,
  523. ShowAreaPlaceSizeMetric: false,
  524. ShowLockButtonsRPP: true,
  525. NewPlacesList: W.Config.venues.categories.clone(),
  526. EditRPPAfterCreated: false,
  527. UseStreetFromClosestSeg: false,
  528. UseCityFromClosestSeg: false
  529. };
  530. settings = loadedSettings ? loadedSettings : defaultSettings;
  531. for (var prop in defaultSettings) {
  532. if (!settings.hasOwnProperty(prop))
  533. settings[prop] = defaultSettings[prop];
  534. }
  535.  
  536. if(settings.ShowAreaPlaceSizeImperial === false && settings.ShowAreaPlaceSizeMetric === false)
  537. if(Waze.prefs.attributes.isImperial)
  538. settings.ShowAreaPlaceSizeImperial = true;
  539. else
  540. settings.ShowAreaPlaceSizeMetric = true;
  541. }
  542.  
  543. function saveSettings() {
  544. if (localStorage) {
  545. var localsettings = {
  546. ShowAreaPlaceSize: settings.ShowAreaPlaceSize,
  547. ShowAreaPlaceSizeImperial: settings.ShowAreaPlaceSizeImperial,
  548. ShowAreaPlaceSizeMetric: settings.ShowAreaPlaceSizeMetric,
  549. ShowLockButtonsRPP: settings.ShowLockButtonsRPP,
  550. NewPlacesList: settings.NewPlacesList,
  551. EditRPPAfterCreated: settings.EditRPPAfterCreated,
  552. UseStreetFromClosestSeg: settings.UseStreetFromClosestSeg,
  553. UseCityFromClosestSeg: settings.UseCityFromClosestSeg
  554. };
  555.  
  556. localStorage.setItem("WMEPIE_Settings", JSON.stringify(localsettings));
  557. }
  558. }
  559.  
  560. //Using the same display for lock buttons as ClickSaver (with permission from MapoMatic) - thanks MoM!
  561. function addLockButtons() {
  562. if(W.selectionManager.selectedItems.length > 0){
  563. var item = W.selectionManager.selectedItems[0];
  564. var isRPP = (item.model.type === "venue" && item.model.attributes.residential === true);
  565.  
  566. if(isRPP){
  567. var attr = item.model.attributes;
  568. var autoRank = attr.rank;
  569. var manualRank = attr.lockRank;
  570. var firstManualRank = manualRank;
  571. var userRank = WazeWrap.User.Rank() - 1;
  572. var maxAutoRank = autoRank;
  573. var disabled = false;
  574.  
  575. var $div = $('#RPPOptionPlaceLockButtonsContainer');
  576. $div.remove();
  577. $div = $('<div>',{id:'RPPOptionPlaceLockButtonsContainer',style:'margin-bottom:5px;'});
  578. $div.append('<label class="control-label">Lock</label>');
  579. var btnInfos = [];
  580.  
  581. for(var iBtn=0;iBtn<=6;iBtn++){btnInfos.push({r:iBtn,val:iBtn});}
  582. btnInfos.forEach(function(btnInfo){
  583. var selected = (btnInfo.val === manualRank);
  584. disabled = userRank < btnInfo.val;
  585. if (btnInfo.val !== 6) {
  586. $div.append(
  587. $('<div>', {
  588. class:'btn btn-lh' + (selected ? ' btn-lh-selected':'') + (btnInfo.r < 6 & (userRank < btnInfo.r || disabled) ? ' disabled' : '')
  589. })
  590. .text(btnInfo.hasOwnProperty('title') ? btnInfo.title : btnInfo.r + 1)
  591. .data('val',btnInfo.hasOwnProperty('val') ? btnInfo.val : btnInfo.r + 1)
  592. .hover(function() {})
  593. .click(function() {
  594. if((userRank >= $(this).data('val')) && (btnInfo.r < 6)) {
  595. W.model.actionManager.add(new UpdateObject(item.model,{lockRank:($(this).data('val'))}));
  596. addLockButtons();
  597. }
  598. })
  599. );
  600. }
  601. });
  602. $('#landmark-edit-general > div').after($div);
  603. }
  604. }
  605. }
  606.  
  607. function listPlaces(){
  608. var category = "";
  609. for(i=0; i<W.Config.venues.categories.length; i++){
  610. category = W.Config.venues.categories[i];
  611. console.log(category + " Main");
  612. var subCategories = W.Config.venues.subcategories[category];
  613. for(var j=0; j<subCategories.length;j++){
  614. console.log(subCategories[j]);
  615. }
  616. }
  617. }
  618. })();