WME Select Same Type Roads

This script add functionnality to select and modify roads

当前为 2014-10-05 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name WME Select Same Type Roads
  3. // @author buchet37
  4. // @namespace https://greasyfork.org/users/4062
  5. // @description This script add functionnality to select and modify roads
  6. // @match https://world.waze.com/editor/*
  7. // @match https://www.waze.com/editor/*
  8. // @match https://world.waze.com/map-editor/*
  9. // @match https://www.waze.com/map-editor/*
  10. // @include https://*.waze.com/editor/*
  11. // @include https://*.waze.com/*/editor/*
  12. // @include https://*.waze.com/map-editor/*
  13. // @include https://*.waze.com/beta_editor/*
  14. // @include https://descarte*.waze.com/beta/*
  15. // @include https://editor-beta.waze.com/*
  16. // @grant none
  17. // @version 4.9.5
  18. // ==/UserScript==
  19.  
  20. // Based on Street to River ( http://userscripts.org/scripts/show/122049 )
  21. // Thanks to alcolo47 (some functions are based on WME Extented Tools)
  22. // Thanks to gdu1971, bgodette, Timbones for part of code
  23. // Adapted by buchet37 for "Select Same Type Road"
  24.  
  25. // Mini howto:
  26. // 1) install this script as greasemonkey script or chrome extension
  27. // 2) Select 2 segments
  28. // 3) Click the "Select Roads A<=>B" button
  29. // The script will select all same type road between A and B with a limit of 50 segments
  30.  
  31.  
  32. if ('undefined' == typeof __RTLM_PAGE_SCOPE_RUN__) {
  33. (function page_scope_runner() {
  34. // If we're _not_ already running in the page, grab the full source
  35. // of this script.
  36. var my_src = "(" + page_scope_runner.caller.toString() + ")();";
  37.  
  38. // Create a script node holding this script, plus a marker that lets us
  39. // know we are running in the page scope (not the Greasemonkey sandbox).
  40. // Note that we are intentionally *not* scope-wrapping here.
  41. var script = document.createElement('script');
  42. script.setAttribute("type", "text/javascript");
  43. script.textContent = "var __RTLM_PAGE_SCOPE_RUN__ = true;\n" + my_src;
  44.  
  45. // Insert the script node into the page, so it will run, and immediately
  46. // remove it to clean up. Use setTimeout to force execution "outside" of
  47. // the user script scope completely.
  48. setTimeout(function() {
  49. document.body.appendChild(script);
  50. document.body.removeChild(script);
  51. }, 0);
  52. })();
  53.  
  54. // Stop running, because we know Greasemonkey actually runs us in
  55. // an anonymous wrapper.
  56. return;
  57. }
  58.  
  59. // function t(toto) {
  60. // return require.modules[eval(toto)];
  61. //}
  62.  
  63.  
  64.  
  65. function selectSameTypeRoad() {
  66. var defaultWidth = "15 m"; //Default Width is equal to 15m
  67. // ***************** COMPATIBILITY WITH NEW EDITOR ***********
  68. var WazeActionCreateObject = require("Waze/Action/CreateObject");
  69. var WazeActionCreateRoundabout = require ("Waze/Action/CreateRoundabout");
  70. var WazeActionDeleteSegment = require ("Waze/Action/DeleteSegment");
  71. var WazeActionModifyConnection = require ("Waze/Action/ModifyConnection");
  72. var WazeActionMultiAction = require ("Waze/Action/MultiAction");
  73. var WazeActionUpdateObject = require("Waze/Action/UpdateObject");
  74. var WazeActionUpdateSegmentGeometry = require("Waze/Action/UpdateSegmentGeometry");
  75. var WazeFeatureVectorLandmark = require("Waze/Feature/Vector/Landmark");
  76. var WazeActionAddLandmark = require("Waze/Action/AddLandmark");
  77. // *****************************************************************
  78. insertButton()
  79. function insertButton() {
  80. if(document.getElementById('WME_SSTR_All') != null) return;
  81. var chk1 = $('<Label style="font-weight:normal"><input type="checkbox"; style="vertical-align: middle;margin: 0px;" id="WME_SSTR_enable" title="Enable or Disable WME SSTR">On-Off   </input></Label>');
  82. var chk2 = $('<Label style="font-weight:normal"><input type="checkbox"; style="vertical-align: middle;margin: 0px;" id="WME_SSTR_SmthRvr" title="Check for smoothing">Smooth</input></Label>');
  83. var chk3 = $('<Label style="font-weight:normal"><input type="checkbox"; style="vertical-align: middle;margin: 0px;" id="WME_SSTR_SmthPlt" title="Check for smoothing">Smooth</input></Label>');
  84. var url1 = $('<div style="font-size:12px;display: inline;"> <u><i><a href="https://greasyfork.org/scripts/4715-wme-select-same-type-roads" target="_blank">Select Same Type Road V4.9.5</a></i></u>');
  85. var btn1 = $('<button class="btn btn-default" style="padding:0px 10px; height:22px" title="Select 1 or more segments and click this button">Select Same Type Roads</button>');
  86. var btn2 = $('<button class="btn btn-default" style="padding:0px 10px; height:22px" title="Select adjacent segment from node A">Side A</button>');
  87. var btn3 = $('<button class="btn btn-default" style="padding:0px 10px; height:22px" title="Select adjacent segment from node B">Side B</button>');
  88. var btn4 = $('<button class="btn btn-default" style="padding:0px 10px; height:22px" title="Start from segment 1 to join Segment 2 (if possible)">1 => 2</button>');
  89. var btn6 = $('<button class="btn btn-default" style="padding:0px 10px; height:22px" title="Create a ParkingLot from railroad geometry">Railroad => PkgLot</button>');
  90. var btn7 = $('<button class="btn btn-default" style="padding:0px 10px; height:22px" title="Create a River from Street Geometry">Street => River</button>');
  91. var btn8 = $('<button class="btn btn-default" style="padding:0px 10px; height:22px" title="Select road(s) to make an Overall Landmark">Do Landmark</button>');
  92. var btn10= $('<button class="btn btn-default" style="padding:0px 10px; height:22px" title="Make a new roundabout from 1 segment of an old one or a set of segments">Redo Roundabout</button>');
  93. var btn12= $('<button class="btn btn-default" style="padding:0px 10px; height:22px" title="click this button to suppress road geometry">Clear Road Geometry</button>');
  94. var btn13= $('<button class="btn btn-default" style="padding:0px 10px; height:22px" title="click this button to allow "All drives" and "All Turns" on selected roads)">All drives on Selection</button>');
  95. btn1.click (select_same_type_roads);
  96. btn2.click (Side_A);
  97. btn3.click (Side_B);
  98. btn4.click (select_AB);
  99. btn6.click (Railroad_ParkingLot);
  100. btn7.click (Street_River);
  101. btn8.click (Roads_to_Interchange);
  102. btn10.click (Redo_RoundAbout);
  103. btn12.click (Clear_Road_Geometry);
  104. btn13.click (All_drives_on_Selection);
  105. var WME_SSTR_Menu = $ ('<div id="WME_SSTR_All" style="height: auto;width:100%;"/>');
  106. var cnt0 = $('<section id="WME_SSTR_lnk" style="padding-top:2px"/>'); cnt0.append(chk1);cnt0.append(" ");cnt0.append(url1);
  107. var cnt1 = $('<section id="WME_SSTR" style="padding-top:2px"/>'); cnt1.append(btn1);
  108. var cnt2 = $('<section id="WME_SSTR_Side" style="padding-top:2px; padding-bottom:5px"/>'); cnt2.append(btn2); cnt2.append(" ");cnt2.append(btn3);
  109. var cnt3 = $('<section id="WME_SSTR_12" style="padding-top:2px; padding-bottom:5px"/>'); cnt3.append(btn4);
  110. var cnt4 = $('<section id="WME_SSTR_River" style="padding-top:2px"/>'); cnt4.append(btn7); cnt4.append(" ");cnt4.append(chk2);
  111. var cnt5 = $('<section id="WME_SSTR_Pklt" style="padding-top:2px"/>'); cnt5.append(btn6); cnt5.append(" ");cnt5.append(chk3);
  112. var cnt6 = $('<section id="WME_SSTR_Ldmk" style="padding-top:2px"/>'); cnt6.append(btn8);
  113. var cnt7 = $('<section id="WME_SSTR_Rdt" style="padding-top:2px; padding-bottom:5px"/>'); cnt7.append(btn10);
  114. var cnt8 = $('<section id="WME_SSTR_CrgAds" style="padding-top:2px"/>'); cnt8.append(btn12); cnt8.append(" ");cnt8.append(btn13);
  115. WME_SSTR_Menu.append(cnt0);
  116. WME_SSTR_Menu.append(cnt1);
  117. WME_SSTR_Menu.append(cnt2);
  118. WME_SSTR_Menu.append(cnt3);
  119. WME_SSTR_Menu.append(cnt4); // Problems in new editor
  120. WME_SSTR_Menu.append(cnt5);
  121. WME_SSTR_Menu.append(cnt6);
  122. WME_SSTR_Menu.append(cnt7);
  123. WME_SSTR_Menu.append(cnt8);
  124. // ******* Mise en place des buttons
  125. var WME_SSTR_MenuFlag = false, myDialogBoxFlag = false;
  126. function put_WME_SSTR_Menu() { // wait for 'sidebar'
  127. if (document.getElementById('sidebar')!=null) {
  128. if (document.getElementById('WME_JCB_All')!=null) { // si mon menu existe
  129. $("#WME_JCB_All").append('<hr style="margin-bottom:5px; margin-top:5px;width=100%;color:SkyBlue; background-color:SkyBlue; height:1px;">');} // on ajoute une barre
  130. else {
  131. var WME_JCB_Menu = $ ('<div id="WME_JCB_All" style="padding:2px 5px 2px 5px;margin:5px 0px 30px 0px;width:295px; border-width:3px; border-style:double;border-color: SkyBlue; border-radius:10px"/>');
  132. $("#sidebar").append(WME_JCB_Menu);
  133. }
  134. $("#WME_JCB_All").append(WME_SSTR_Menu); // on ajoute le nemu CRN
  135. WME_SSTR_MenuFlag = true;
  136. }
  137. else {
  138. setTimeout (function () {put_WME_SSTR_Menu();}, 501);
  139. }
  140. }
  141. put_WME_SSTR_Menu();
  142. // Boite d'alerte
  143. var myAlertBoxFlag = false;
  144. function put_myAlertBox() {
  145. if (document.getElementById('map-search')!=null) {
  146. if (document.getElementById('WME_JCB_AlertBox')==null) {
  147. var myAlertBox = $('<div id="WME_JCB_AlertBox" class="form-control search-query" style="opacity : 0.8;display :none; height: auto;min-height: 30px; position: absolute;top :16px; margin-left: 350px; margin-right: auto; "/>');
  148. var myAlertTxt = $('<div id="WME_JCB_AlertTxt" style=" opacity : 1;display:inline;padding:0px 0px">City ID/');
  149. myAlertBox.append(myAlertTxt);
  150. $("#map-search").append(myAlertBox)
  151. }
  152. myAlertBoxFlag = true;
  153. }
  154. else {setTimeout (function () {put_myAlertBox();}, 501);}
  155. }
  156. put_myAlertBox();
  157.  
  158. function start_init_WME_SSTR() { // si tous les boutons sont chargés on démarre le script
  159. if (WME_SSTR_MenuFlag && myAlertBoxFlag) {
  160. init_WME_SSTR();
  161. }
  162. else {setTimeout(function () {start_init_WME_SSTR();}, 501);}
  163. }
  164. start_init_WME_SSTR();
  165. }
  166. function Clear_Road_Geometry(ev) {
  167. if (Waze.selectionManager.selectedItems.length!=0) {
  168. if (confirm ("Do you want to clear the geometry for selected segments") ) {
  169. for (var i = 0; i < Waze.selectionManager.selectedItems.length; i++) {
  170. var seg = Waze.selectionManager.selectedItems[i].model;
  171. if (seg.type == "segment") {
  172. var newGeo = seg.geometry.clone();
  173. newGeo.components.splice(1,newGeo.components.length -2); // on garde le 1er et le dernier point
  174. newGeo.components[0].calculateBounds();
  175. newGeo.components[1].calculateBounds();
  176. Waze.model.actionManager.add (new WazeActionUpdateSegmentGeometry (seg,seg.geometry,newGeo));
  177. }
  178. }
  179. }
  180. }
  181. }
  182. function All_drives_on_Selection(ev) {
  183. if (Waze.selectionManager.selectedItems.length!=0) {
  184. var action = [];
  185. var nodeToAllowed = [];
  186. var selectRoadIDs = [];
  187. for (var i = 0; i < Waze.selectionManager.selectedItems.length; i++) {
  188. var seg = Waze.selectionManager.selectedItems[i].model;
  189. if (seg != null && seg.type == "segment" && !seg.attributes.locked && seg.attributes.junctionID == null) {
  190. selectRoadIDs.push (seg.getID());
  191. //action.push (new Waze.Action.UpdateObject( seg, {fwdDirection: true, revDirection: true})); // pass to two ways
  192. action.push (new WazeActionUpdateObject( seg, {fwdDirection: true, revDirection: true})); // pass to two ways
  193. if (Waze.model.nodes.objects[seg.attributes.fromNodeID]!= null) { // store node A
  194. nodeToAllowed.push (seg.attributes.fromNodeID); }
  195. if (Waze.model.nodes.objects[seg.attributes.toNodeID]!= null) { // store node B
  196. nodeToAllowed.push (seg.attributes.toNodeID); }
  197. }
  198. }
  199. nodeToAllowed = areTwice (nodeToAllowed); // on ne traite que les segments inttermédiaires
  200. for (var l = 0; l < nodeToAllowed.length; l++) {
  201. var node = Waze.model.nodes.objects[nodeToAllowed[l]];
  202. var roadIDs = node.attributes.segIDs;
  203. for (var j = 0; j < roadIDs.length; j++) {
  204. for (var k = 0; k < roadIDs.length; k++) {
  205. if (roadIDs[j]!= roadIDs[k] && isInArray (roadIDs[j],selectRoadIDs) && isInArray (roadIDs[k],selectRoadIDs)) {
  206. //action.push (new Waze.Action.ModifyConnection(roadIDs[j], node, roadIDs[k], true));
  207. action.push (new WazeActionModifyConnection(roadIDs[j], node, roadIDs[k], true));
  208. }
  209. }
  210. }
  211. }
  212. //if (action.length !=0) { Waze.model.actionManager.add (new Waze.Action.MultiAction(action));}
  213. if (action.length !=0) { Waze.model.actionManager.add (new WazeActionMultiAction(action));}
  214. //alert ("On va au bout");
  215. }
  216. }
  217.  
  218. function areTwice (myArray) {
  219. var myNewArray = [];
  220. if (myArray.length > 0) {
  221. for (var i = 0; i < myArray.length-1; i++) {
  222. for (var j = i+1; j < myArray.length; j++) {
  223. if (myArray [i] == myArray[j]) {
  224. myNewArray.push(myArray [i]);
  225. }
  226. }
  227. }
  228. return delete_multi_Ids(myNewArray);
  229. }
  230. else {
  231. return (myArray);
  232. }
  233. }
  234. function Redo_RoundAbout (ev) {
  235. var selectedGood = (Waze.selectionManager.selectedItems.length!=0);
  236. if (selectedGood) {
  237. if (Waze.selectionManager.selectedItems[0].model.attributes.junctionID !=null) {
  238. var sel = Waze.selectionManager.selectedItems[0].model;
  239. var junc = Waze.model.junctions.objects[sel.attributes.junctionID];
  240. var listRoadIds = junc.segIDs;
  241. //var listId
  242. }
  243. else {
  244. var listRoadIds = [];
  245. for (var i = 0; i < Waze.selectionManager.selectedItems.length; i++) {
  246. var sel = Waze.selectionManager.selectedItems[i].model;
  247. listRoadIds.push (sel.getID());
  248. }
  249. }
  250.  
  251. //alert (listRoadIds.length);
  252. var oldRdt = extract_rdt (listRoadIds);
  253. if (oldRdt.higherRank == false) {
  254. var action = [];
  255. for (var j = 0; j < oldRdt.listRoadIds.length; j++) {
  256. var seg = Waze.model.segments.objects[oldRdt.listRoadIds[j]]
  257. //action.push(new Waze.Action.DeleteSegment(seg)); // ******* Delete Roundabout
  258. action.push(new WazeActionDeleteSegment(seg)); // ******* Delete Roundabout
  259.  
  260. }
  261. for (var i = 0; i < oldRdt.listAdjRoadIds.length; i++) {
  262. var seg = Waze.model.segments.objects[oldRdt.listAdjRoadIds[i].id];
  263. var newGeo = seg.geometry.clone();
  264. if (oldRdt.listAdjRoadIds[i].sideConnect == "A") {
  265. var index1 =0;
  266. var index2 =1;
  267. var nodeEnd = Waze.model.nodes.objects [seg.attributes.toNodeID];
  268. }
  269. else {
  270. var index1 = newGeo.components.length-1;
  271. var index2 = newGeo.components.length-2;
  272. var nodeEnd = Waze.model.nodes.objects [seg.attributes.fromNodeID];
  273. }
  274. if (nodeEnd !=null && nodeEnd.onScreen() && nodeEnd.attributes.segIDs.length <2) {
  275. action.push (new Waze.Action.UpdateObject(seg, {fwdDirection: true, revDirection: true}));} // dead-end is always two ways roads
  276. if (!seg.attributes.fwdDirection && !seg.attributes.revDirection) { // unknown roads are fixed to two ways roads
  277. action.push (new Waze.Action.UpdateObject(seg, {fwdDirection: true, revDirection: true}));}
  278. var deltaX = newGeo.components[index1].x - newGeo.components[index2].x;
  279. var deltaY = newGeo.components[index1].y - newGeo.components[index2].y;
  280. var angle = angleDeg (deltaX,deltaY);
  281. var meanExt = 0.10 * (oldRdt.rx + oldRdt.ry);
  282. newGeo.components[index1].x = newGeo.components[index1].x + meanExt* Math.cos(convertDegRad(angle));
  283. newGeo.components[index1].y = newGeo.components[index1].y + meanExt* Math.sin(convertDegRad(angle));
  284. newGeo.components[index1].calculateBounds();
  285. //action.push(new Waze.Action.UpdateSegmentGeometry (seg,seg.geometry,newGeo));
  286. action.push(new WazeActionUpdateSegmentGeometry (seg,seg.geometry,newGeo));
  287. }
  288. //Waze.model.actionManager.add (new Waze.Action.MultiAction(action)); // ******* Strech adjacent segments
  289. Waze.model.actionManager.add (new WazeActionMultiAction(action)); // ******* Strech adjacent segments
  290. var R = {};
  291. R.center = {x: oldRdt.centerX, y:oldRdt.centerY};
  292. R.rx = Math.min (parseInt(144),oldRdt.rx);
  293. R.ry = Math.min (parseInt(144),oldRdt.ry);
  294. if (Math.abs (R.rx - R.ry) < (0.15 * R.rx)) { // if Rx near Ry => Circle with mean value
  295. R.rx = (R.rx + R.ry) / 2;
  296. R.ry = R.rx;
  297. }
  298. R.bounds = new OpenLayers.Bounds(R.center.x - R.rx, R.center.y - R.ry, R.center.x+R.rx, R.center.y + R.ry);
  299. // var action = new Waze.Action.CreateRoundabout(R);
  300. var action = new WazeActionCreateRoundabout(R);
  301. Waze.model.actionManager.add (action);
  302. var rbtRoadIds = [];
  303. for (var j = 0; j < action.roundaboutSegments.length; j++) { // store new SegIds
  304. rbtRoadIds.push (action.roundaboutSegments[j].getID());
  305. }
  306. newRdt = searchNewRdt (rbtRoadIds,oldRdt.primaryStreetID);
  307. var action = [];
  308. for (var k = 0; k < rbtRoadIds.length; k++) {
  309. var road = Waze.model.segments.objects[rbtRoadIds[k]];
  310. //action.push(new Waze.Action.UpdateObject(road, {roadType: newRdt.roadtype, level: newRdt.level, lockRank: "0"} ));
  311. action.push(new WazeActionUpdateObject(road, {roadType: newRdt.roadtype, level: newRdt.level, lockRank: "0"} ));
  312. if (oldRdt.primaryStreetID != null) {
  313. //action.push(new Waze.Action.UpdateObject(road, {primaryStreetID: oldRdt.primaryStreetID}));
  314. action.push(new WazeActionUpdateObject(road, {primaryStreetID: oldRdt.primaryStreetID}));
  315. }
  316. }
  317. //Waze.model.actionManager.add(new Waze.Action.MultiAction(action));
  318. Waze.model.actionManager.add(new WazeActionMultiAction(action));
  319. select (rbtRoadIds);
  320. }
  321. else {
  322. alert ("Your ranking is not higher\nto redo this roundabout");
  323. }
  324. }
  325. else {
  326. alert ("Incorrect Selection : \n\nOne segment must be selected \nOr It is not Roundabout Segment");
  327. }
  328. }
  329. function searchNewRdt (listRdtSegIds,StreetID) {
  330. var roadpriority = [];
  331. roadpriority [1] = 0; //"Streets"
  332. roadpriority [2] = 1; //"Primary Street"
  333. roadpriority [3] = 3; //"Freeways"
  334. roadpriority [4] = 2; //"Ramps"
  335. roadpriority [6] = 3; //"Major Highway"
  336. roadpriority [7] = 2; //"Minor Highway"
  337. roadpriority [8] = 0; //"Dirt roads"
  338. roadpriority [18] = 0; //"Railroad"
  339. roadpriority [19] = 0; //"Runway/Taxiway"
  340. roadpriority [20] = 0; //"Parking Lot Road"
  341. roadpriority [5] = 0; //"Walking Trails"
  342. roadpriority [10] = 0; //"Pedestrian Bw"
  343. roadpriority [16] = 0; //"Stairway"
  344. roadpriority [17] = 0; //"Private Road"
  345. roadpriority [21] = 0; //"Service Road"
  346. var priorityToRoadtype = [];
  347. priorityToRoadtype [0] = 1; //"Streets"
  348. priorityToRoadtype [1] = 2; //"Primary Street"
  349. priorityToRoadtype [2] = 7; //"Minor Highway"
  350. priorityToRoadtype [3] = 6; //"Major Highway"
  351. var compteur = [0,0,0,0]; //array for number of roads by type
  352. var listRdtNodeIds = [];
  353. for (var i = 0; i < listRdtSegIds.length; i++) {
  354. var road = Waze.model.segments.objects[listRdtSegIds[i]];
  355. if (road != null) {
  356. listRdtNodeIds.push (road.attributes.fromNodeID);
  357. listRdtNodeIds.push (road.attributes.toNodeID);
  358. }
  359. }
  360. listRdtNodeIds = delete_multi_Ids (listRdtNodeIds);
  361. var usedNodeIDs = [];
  362. usedNodeIDs.push.apply (usedNodeIDs,listRdtNodeIds);
  363. var rdt = {};
  364. rdt.level = -5;
  365. var action = [];
  366. for (var j = 0; j <listRdtNodeIds.length; j++) { // Search connected Segments
  367. var node = Waze.model.nodes.objects[listRdtNodeIds[j]];
  368. if (node != null) {
  369. var nbSegs = node.attributes.segIDs.length;
  370. for (var k = 0; k < nbSegs;k++) {
  371. var road = Waze.model.segments.objects[node.attributes.segIDs[k]];
  372. if ((road != null) && (notInArray (road.getID(),listRdtSegIds))) {
  373. rdt.level = Math.max (rdt.level,road.attributes.level);
  374. if (road.attributes.roadType == 3 ) { // Freeways are not allowed in roundabout
  375. action.push (new Waze.Action.UpdateObject(road, {roadType: 6}));}
  376. if (notInArray(road.attributes.roadType,([1,2,3,4,6,7]))) { // Road type on roundabout should be at least "Street"
  377. action.push (new Waze.Action.UpdateObject(road, {roadType: 1}));}
  378. if (!road.attributes.fwdDirection && !road.attributes.revDirection) { // unknown roads are fixed to two ways roads
  379. action.push (new Waze.Action.UpdateObject(road, {fwdDirection: true, revDirection: true}));}
  380. if (road.attributes.primaryStreetID == null && StreetID != null) { // Unnamed Roadsd are named as the rdt
  381. action.push(new Waze.Action.UpdateObject(road, {primaryStreetID: StreetID}));}
  382. if (notInArray(road.attributes.fromNodeID,usedNodeIDs) || notInArray(road.attributes.toNodeID,usedNodeIDs)) {
  383. compteur [roadpriority[road.attributes.roadType]] ++;
  384. usedNodeIDs.push (usedNodeIDs, road.attributes.fromNodeID);
  385. usedNodeIDs.push (usedNodeIDs, road.attributes.toNodeID);
  386. }
  387. }
  388. }
  389. }
  390. }
  391. rdt.roadtype = priorityToRoadtype [0];
  392. var foundMax = false;
  393. for (var k = 3; k > 0; k --) {
  394. if ((compteur[k] > 1) && (foundMax == false)) {
  395. rdt.roadtype = priorityToRoadtype [k];
  396. foundMax = true;
  397. }
  398. else {
  399. compteur [k-1] = compteur[k-1] + compteur[k];
  400. compteur [k] = 0;
  401. }
  402. }
  403. rdt.level ++; // up Roundabout level
  404. if (action.length !=0) {Waze.model.actionManager.add ( new Waze.Action.MultiAction(action));} // do modifications if there are
  405. return rdt;
  406. }
  407. function extractNodes (listRoadIds) {
  408. var nodeList = [];
  409. for (var i = 0; i<listRoadIds.length;i++) {
  410. var road = Waze.model.segments.objects[listRoadIds[i]];
  411. if (road != null) {
  412. nodeList.push (road.attributes.fromNodeID);
  413. nodeList.push (road.attributes.toNodeID);
  414. }
  415. }
  416. return delete_multi_Ids (nodeList);
  417. }
  418. function extract_rdt (listIDs) {
  419. var rdt = {};
  420. //rdt.listNodeIds = [];
  421. rdt.listAdjRoadIds = [];
  422. rdt.higherRank = false;
  423. rdt.listRoadIds = listIDs;
  424. var xmin = 10000000000000; var ymin = xmin;
  425. var xmax = -10000000000000; var ymax = xmax;
  426. for (var i = 0; i<rdt.listRoadIds.length;i++) {
  427. var road = Waze.model.segments.objects[rdt.listRoadIds[i]];
  428. if (road != null) {
  429. rdt.higherRank = rdt.higherRank || road.isLockedByHigherRank();
  430. for (var j = 0;j < road.geometry.components.length;j++) {
  431. xmin = Math.min (xmin, road.geometry.components[j].x);
  432. xmax = Math.max (xmax, road.geometry.components[j].x);
  433. ymin = Math.min (ymin, road.geometry.components[j].y);
  434. ymax = Math.max (ymax, road.geometry.components[j].y);
  435. }
  436. }
  437. }
  438.  
  439. rdt.listNodeIds = extractNodes (rdt.listRoadIds);
  440. rdt.rx = (xmax-xmin)/2;
  441. rdt.ry = (ymax-ymin)/2;
  442. rdt.centerX = (xmin+xmax) / 2;
  443. rdt.centerY = (ymin+ymax) / 2;
  444.  
  445. var roadIDs =[];
  446. for (var i = 0; i <rdt.listNodeIds.length; i++) { // Search connected Segments
  447. var node = Waze.model.nodes.objects[rdt.listNodeIds[i]];
  448. if (node != null) {
  449. var nbSegs = node.attributes.segIDs.length;
  450. roadIDs = roadIDs.concat(node.attributes.segIDs);
  451. //roadIDs.push.apply(node.attributes.segIDs); //collect rioadsIds connect to rdt
  452. for (var j=0; j<nbSegs;j++) {
  453. var road = Waze.model.segments.objects[node.attributes.segIDs[j]];
  454. if ((road != null) && (notInArray (road.getID(),rdt.listRoadIds))) {
  455. rdt.higherRank = rdt.higherRank || road.isLockedByHigherRank(); // test if locked at higher rank
  456. if (isInArray (road.attributes.fromNodeID,rdt.listNodeIds)) {
  457. rdt.listAdjRoadIds.push ({id:road.getID(),sideConnect :"A"});
  458. }
  459. if (isInArray (road.attributes.toNodeID,rdt.listNodeIds)) {
  460. rdt.listAdjRoadIds.push ({id:road.getID(),sideConnect :"B"});
  461. }
  462. }
  463. }
  464. }
  465. }
  466. var city_ID =[]; //search for primaryStreetID
  467. roadIDs = delete_multi_Ids(roadIDs);
  468. for (var i = 0; i <roadIDs.length; i++) {
  469. var sel = Waze.model.segments.objects[roadIDs[i]];
  470. var streetID = sel.attributes.primaryStreetID;
  471. if (streetID && Waze.model.streets.objects[streetID]) {
  472. var street = Waze.model.streets.objects[streetID];
  473. if (street.cityID && Waze.model.cities.objects[street.cityID]) {
  474. city_ID.push(street.cityID);
  475. }
  476. }
  477. }
  478. city_ID = delete_multi_Ids (city_ID);
  479. var cityName = "";
  480. var city = Waze.model.cities.objects[city_ID[0]];
  481. if (city_ID.length == 1 && city && city.name) {
  482. if (city.name!=""){cityName = city.name;}
  483. }
  484. var state_ID = (city.stateID) ? city.stateID : "";
  485. var country_Id = (city.countryID) ? city.countryID : "";
  486. if (city.stateID && city.countryID) {
  487. var newCityID = SearchCityID (city.countryID, city.stateID, cityName);
  488. rdt.primaryStreetID = searchPrimaryID (newCityID, "");
  489. }
  490. return rdt;
  491. }
  492. function SearchCityID (country_ID, state_ID, cityName) {
  493. var emptyct = (cityName==="");
  494. var fattr = {countryID: country_ID, stateID: state_ID, isEmpty: emptyct, name : cityName };
  495. var city = Waze.model.cities.getByAttributes(fattr);
  496. if (city.length === 0) {
  497. myAlert ("Create new city: "+cityName);
  498. //var f = new Waze.Action.CreateObject(Waze.Model.ObjectType.CITY, {
  499. var f = new WazeActionCreateObject(WazeModelObjectType.CITY, {
  500. countryID: country_ID,stateID: state_ID,isEmpty: emptyct,name: cityName});
  501. Waze.model.actionManager.add(f);
  502. return f.newObject.getID();
  503. }
  504. if (city.length === 1) {return city[0].getID();}
  505. if (city.length > 1) {
  506. myAlert ("Problems with cityID : "+city.length+" cities with same name. Please save and redo");
  507. return null;
  508. }
  509. return null;
  510. }
  511. //function SearchPrimaryID (oldStreetID, newCityName, newStreetName) {
  512. function searchPrimaryID (newCityID, newStreetName) {
  513. if (newCityID == null) { return null; }
  514. if (newStreetName == null) {newStreetName ="";}
  515. var emptyst = (newStreetName =="");
  516. var fattr = {cityID: newCityID, isEmpty: emptyst};
  517. if (emptyst == false) { fattr.name = newStreetName;}
  518. var st = Waze.model.streets.getByAttributes(fattr);
  519. if (st.length === 0) {
  520. myAlert ("Create new street: "+newCityName+" "+newStreetName);
  521. //var a = new Waze.Action.CreateObject(Waze.Model.ObjectType.STREET, {
  522. var a = new WazeActionCreateObject(WazeModelObjectType.STREET, {
  523. name: newStreetName,isEmpty: emptyst,cityID: newCityID});
  524. Waze.model.actionManager.add(a);
  525. var newPrimaryStreetID = a.newObject.getID();
  526. }
  527. if (st.length === 1) {var newPrimaryStreetID = st[0].getID();}
  528. if (st.length > 1) {
  529. myAlert ("Problems with StreetID : "+st.length+" streets with same name. Please save and redo");
  530. return null;
  531. }
  532. return newPrimaryStreetID;
  533. }
  534. // function captureCity (roadListID) {
  535. // var road = {};
  536. // road.NoCityNoStreet = null;
  537. // road.CityNoStreet = null;
  538. // road.altStreetID = null;
  539. // for (var i = 0; i < roadListID.length;i++) {
  540. // var road1 = Waze.model.segments.objects[roadListID[i]];
  541. // if (road1 != null && road1.attributes.primaryStreetID!= null) {
  542. // var adress = road1.getAddress();
  543. // road.altStreetID = road1.attributes.primaryStreetID;
  544. // if ((adress.city.isEmpty ) && (adress.street.isEmpty)) {
  545. // road.NoCityNoStreet = road1.attributes.primaryStreetID;}
  546. // if ((adress.city.name != null) && (adress.city.name != "") && (adress.street.isEmpty)) {
  547. // road.CityNoStreet = road1.attributes.primaryStreetID;}
  548. // }
  549. // }
  550. // return road;
  551. // }
  552.  
  553.  
  554. function Roads_to_Interchange(ev) {
  555. //alert ("Do landmark is\nnot available in new editor" ); return ;
  556. var foundSelectedSegment = false;
  557. var selectedGood = (Waze.selectionManager.selectedItems.length>0);
  558. var roadIds = [];
  559. for (var i = 0; i<Waze.selectionManager.selectedItems.length;i++) { // Test if selection are segment
  560. var sel = Waze.selectionManager.selectedItems[i].model;
  561. selectedGood = ((selectedGood) && (sel.type == "segment"));
  562. if ((selectedGood)&& (sel.attributes.junctionID!=null)) { // if it is a roundabout
  563. var jId = sel.attributes.junctionID;
  564. var junc = Waze.model.junctions.objects[jId];
  565. roadIds.push.apply (roadIds,junc.segIDs); // we add all segment of the roundabout
  566. }
  567. if (selectedGood) { roadIds.push ( sel.getID());} // stocke les segments
  568. }
  569. if ((selectedGood) &&( roadIds.length != 0)) {
  570. roadIds = delete_multi_Ids (roadIds); // delete double roads
  571. var totalPoints = [];
  572. //points.push({x:5, y:3});
  573. var name;
  574. var leftEnv = [];
  575. var rightEnv = [];
  576. var typeLandmak;
  577. leftEnv.push ({x: 100000000000000,y:2000000000});
  578. var yMax = -100000000000;
  579. //alert (roadIds);
  580. for (var k = 0; k<roadIds.length;k++) {
  581. var sel = Waze.model.segments.objects[roadIds[k]];
  582. //alert (sel.getID());
  583. if (name == null) {name = getStreet(sel).name;}
  584. if (typeLandmak == null) {
  585. switch (sel.attributes.roadType) {
  586. case 1: //"Streets"
  587. case 2: //"Primary Street"
  588. case 3: //"Freeways"
  589. case 4: //"Ramps"
  590. case 6: //"Major Highway"
  591. case 7: //"Minor Highway"
  592. typeLandmak = ["JUNCTION_INTERCHANGE"]; break;// Jonction/interchange
  593. case 8: //"Dirt roads"
  594. case 18: //"Railroad"
  595. case 19: //"Runway/Taxiway"
  596. case 20: //"Parking Lot Road"
  597. typeLandmak = ["PARKING_LOT"]; break; // ParkingLot
  598. case 5: //"Walking Trails"
  599. case 10: //"Pedestrian Bw"
  600. case 16: //"Stairway"
  601. case 17: //"Private Road"
  602. case 21: //"Service Road"
  603. typeLandmak = ["PARK"]; break; // Park
  604. }
  605. }
  606. for (var j = 0; j < sel.geometry.components.length;j++) {
  607. totalPoints.push (sel.geometry.components[j].clone());
  608. if (leftEnv[0].y > sel.geometry.components[j].y) { // Stocke le Y mini
  609. leftEnv[0] = sel.geometry.components[j].clone();
  610. rightEnv[0] = sel.geometry.components[j].clone();
  611. }
  612. if (sel.geometry.components[j].y > yMax) { yMax = sel.geometry.components[j].y;}
  613. }
  614. }
  615. while ( rightEnv[rightEnv.length-1].y <yMax) { // traitement de la voie droite
  616. var anglemin = 190;
  617. for (var i = 0; i<totalPoints.length;i++) {
  618. if (totalPoints[i].y > rightEnv[rightEnv.length-1].y) {
  619. var deltaX = totalPoints[i].x - rightEnv[rightEnv.length-1].x;
  620. if (deltaX !=0) {
  621. var deltaY = totalPoints[i].y - rightEnv[rightEnv.length-1].y;
  622. var angle = angleDeg( deltaX , deltaY);
  623. if (angle < anglemin) {
  624. anglemin = angle;
  625. var iMin = i;
  626. }
  627. }
  628. }
  629. }
  630. rightEnv.push (totalPoints[iMin]);
  631. }
  632. while ( leftEnv[leftEnv.length-1].y <yMax) { // traitement de la voie droite
  633. var anglemax = 0;
  634. for (var i = 0; i<totalPoints.length;i++) {
  635. if (totalPoints[i].y > leftEnv[leftEnv.length-1].y) {
  636. var deltaX = totalPoints[i].x - leftEnv[leftEnv.length-1].x;
  637. if (deltaX !=0) {
  638. var deltaY = totalPoints[i].y - leftEnv[leftEnv.length-1].y;
  639. var angle = angleDeg( deltaX , deltaY);
  640. if (angle > anglemax) {
  641. anglemax = angle;
  642. var iMax = i;
  643. }
  644. }
  645. }
  646. }
  647. leftEnv.push (totalPoints[iMax]);
  648. }
  649. leftEnv.shift(); leftEnv.pop(); //On ote le premier et le dernier point( communs avec droite)
  650. rightEnv.push.apply (rightEnv,leftEnv.reverse ()); //on ajoute la partie Gauche
  651. var dummy = doLandmark (rightEnv,name,typeLandmak); // make the landmark
  652. alert("Successfully created Landmark");}
  653. else {
  654. alert("Incorrect Selection : \n\nOne segment must be selected \nOr It is not RoundAbout Segment");
  655. }
  656. }
  657.  
  658. function doLandmark (geometry,nameLandmak,typeLandmak) {
  659. var polyPoints = null;
  660. for (var i = 0; i<geometry.length;i++) {
  661. var vertex = geometry[i];
  662. if (polyPoints == null) {
  663. polyPoints = [geometry[i]];
  664. var ri = new OpenLayers.Geometry.Point(geometry[i].x, geometry[i].y);
  665. polyPoints.push(ri)
  666. }
  667. else {
  668. var ri = new OpenLayers.Geometry.Point(geometry[i].x, geometry[i].y);
  669. polyPoints.push(ri);
  670. }
  671. }
  672. var polygon = new OpenLayers.Geometry.Polygon(new OpenLayers.Geometry.LinearRing(polyPoints));
  673. var landmark = new WazeFeatureVectorLandmark();
  674. landmark.geometry = polygon;
  675. landmark.attributes.name = nameLandmak;
  676. landmark.attributes.categories = typeLandmak;
  677. var what = Waze.model.actionManager.add(new WazeActionAddLandmark(landmark));
  678.  
  679. activateLayer ("landmarks", true );
  680. return true;
  681. }
  682. function Street_River (ev) {
  683. var selectedGood = (Waze.selectionManager.selectedItems.length==1);
  684. var sel = Waze.selectionManager.selectedItems[0].model;
  685. selectedGood = selectedGood && (sel.type == "segment") && (sel.attributes.roadType != "18");
  686. if (selectedGood) {
  687. var offset = getDisplacement(); // valeur en mètres
  688. if (offset == null) {
  689. return;}
  690. var name = getStreet(sel).name;
  691. var points = StreetToLandmark (sel, offset);
  692. //var dummy = doLandmark (points,name,"H3010") // river
  693. var dummy = doLandmark (points,name,["RIVER_STREAM"]); // river
  694. alert("Successfully created a River Landmark");}
  695. else {
  696. alert ("Incorrect Selection : \n\nOne segment must be selected \nOr It is not Street Segment");
  697. }
  698. }
  699.  
  700. function Railroad_ParkingLot (ev) {
  701. //alert ("Railraod to parkingLot is\n\nnot available in new editor" ); return ;
  702. var selectedGood = (Waze.selectionManager.selectedItems.length==1);
  703. var sel = Waze.selectionManager.selectedItems[0].model;
  704. selectedGood = selectedGood && (sel.type == "segment") && (sel.attributes.roadType == "18");
  705. if (selectedGood) {
  706. var offset = getDisplacement(); // valeur en mètres
  707. if (offset == null) {
  708. return;}
  709. var name = getStreet(sel).name;
  710. var points = StreetToLandmark (sel, offset);
  711. //var dummy = doLandmark (points,name,"W0001") // ParkingLot
  712. var dummy = doLandmark (points,name,["PARKING_LOT"]); // ParkingLot
  713. alert("Successfully created ParkingLot Landmark");}
  714. else {
  715. alert ("Incorrect Selection : \n\nOne segment must be selected \nOr It is not Railroad Segment");
  716. }
  717. }
  718.  
  719. function getDisplacement() {
  720. var scale = 1.44449796; // Scale mètres => coordonnées waze
  721. var width = prompt ("Enter new Width or leave it to old value ",defaultWidth);
  722. if (width == null) {
  723. return null}
  724. else {
  725. if (width.match("m","g")) {
  726. width =parseInt(width);
  727. if (width < 1) {width = 1;} //minimum width equal to 1m
  728. if (width >100) {width = 100;} //maximum width equal to 100m
  729. defaultWidth=width+" m";
  730. return width * scale / 2;
  731. }
  732. if (width.match("ft","g")) {
  733. width =parseInt(width);
  734. if (width < 3) {width =3;} //minimum width equal to 3 ft
  735. if (width > 300) {width =300;} //maximum width equal to 300 ft
  736. defaultWidth=width+" ft";
  737. return width * 0.3048 * scale /2;
  738. }
  739. width=15;
  740. defaultWidth="15 m";
  741. return width * scale / 2;
  742. }
  743. }
  744. function StreetToLandmark (seg,offset) {
  745. var decal = decalage (seg.geometry.components, offset);
  746. if (document.getElementById ('WME_SSTR_SmthRvr').checked == 1) {
  747. decal.dir = optGeometry (decal.dir);
  748. decal.sym = optGeometry (decal.sym);
  749. decal.dir = b_spline (decal.dir); // creation des B - splines X & Y
  750. decal.sym = b_spline (decal.sym);
  751. decal.dir = sup_unneed (decal.dir); // delete aligned points
  752. decal.sym = sup_unneed (decal.sym); // delete aligned points
  753. }
  754. decal.dir.push.apply (decal.dir,decal.sym.reverse()); // on rajoute le trajet retour
  755. return decal.dir;
  756. }
  757. function sup_unneed (decal) {
  758. for (var phase = 0; phase < 3; phase ++) {
  759. var decal1 = [];
  760. decal1 [0] = decal [0];
  761. for (var i = 1; i< decal.length-2; i++) {
  762. if ((decal1[decal1.length-1].x != decal[i+1].x) && (decal[i+1].x != decal[i+2].x)) { // non vertical => can calculate Atan
  763. var angle1 = ((decal1[decal1.length-1].y - decal[i+1].y) / (decal1[decal1.length-1].x - decal[i+1].x));
  764. var angle2 = ((decal[i+1].y - decal[i+2].y) / (decal[i+1].x - decal[i+2].x));
  765. var length1 = longueur (decal1[decal1.length-1].x,decal1[decal1.length-1].y,decal[i+1].x,decal[i+1].y);
  766. if (testUnneed (angle1,angle2,length1,phase)) {
  767. decal1.push (decal[i+1]);
  768. }
  769. }
  770. else {
  771. decal1.push (decal[i+1]);
  772. }
  773. }
  774. decal1.push (decal[decal.length-1]);
  775. decal = decal1;
  776. }
  777. return decal1;
  778. }
  779. function testUnneed (angle1,angle2,longueur,phase) {
  780. var deltaAngle = Math.abs (AtanDeg (angle1) - AtanDeg (angle2));
  781. switch (phase) {
  782. case 0: if ((deltaAngle < 45) && (longueur < 10)) {return false;}; break;
  783. case 1: if ((deltaAngle < 1 ) && (longueur >= 10) && (longueur < 250)) {return false;}; break;
  784. case 2: if ((deltaAngle < 2 ) && (longueur >= 10) && (longueur < 50 )) {return false;}; break;
  785. }
  786. return true;
  787. }
  788. function optGeometry ( line) {
  789. var opt = [];
  790. opt[0] = line[0].clone();
  791. for (var i = 1; i< line.length; i++) {
  792. var deltaX = line[i].x-line[i-1].x;
  793. var deltaY = line[i].y-line[i-1].y;
  794. opt.push ({x: line[i-1].x + deltaX * 0.33, y: line[i-1].y + deltaY * 0.33}); // add 2 extra control points
  795. opt.push ({x: line[i-1].x + deltaX * 0.66, y: line[i-1].y + deltaY * 0.66});
  796. opt.push ({x: line[i].x, y: line[i].y});
  797. }
  798. return opt;
  799. }
  800.  
  801. function decalage (geom,offset) {
  802. var decal = {};
  803. decal.dir = []; // décalage d'un coté
  804. decal.sym = []; // décalage de l'autre
  805. decal.dir[0] = geom[0].clone();
  806. decal.sym[0] = geom[0].clone();
  807. if (Math.abs(geom[1].x - geom[0].x) < 0.1) {geom[1].x = geom[0].x+0.1;} // traitement de la verticalité
  808. var deltaX = geom[1].x - geom[0].x;
  809. var deltaY = geom[1].y - geom[0].y;
  810. var angle = Math.atan (deltaY/deltaX);
  811. decal.dir[0].x = geom[0].x - sign (deltaX) * offset * Math.sin (angle);
  812. decal.dir[0].y = geom[0].y + sign (deltaX) * offset * Math.cos (angle);
  813. decal.sym[0].x = geom[0].x + sign (deltaX) * offset * Math.sin (angle);
  814. decal.sym[0].y = geom[0].y - sign (deltaX) * offset * Math.cos (angle);
  815. var aprev = deltaY / deltaX;
  816. var b = geom[0].y - aprev * geom[0].x; // y = ax+b
  817. var off1 = sign(deltaX) * offset / Math.cos (angle);
  818. var bprev = b + off1; var bprev1 = b - off1;
  819. for (var i = 1; i < geom.length-1; i++) {
  820. if (Math.abs(geom[i+1].x - geom[i].x)< 0.1) {geom[i+1].x = geom[i].x+0.1;} // traitement de la verticalité
  821. deltaX = geom[i+1].x - geom[i].x;
  822. deltaY = geom[i+1].y - geom[i].y;
  823. var anext = deltaY / deltaX;
  824. b = geom[i].y - anext * geom[i].x;
  825. angle = Math.atan (deltaY/deltaX);
  826. off1 = sign(deltaX) * offset / Math.cos (angle);
  827. var bnext = b + off1; var bnext1 = b - off1;
  828. var x1 = -(bprev - bnext) / (aprev - anext);
  829. var x2 = -(bprev1 - bnext1) / (aprev - anext);
  830. decal.dir.push ({x: x1, y: (aprev * x1 + bprev)}); // décalage d'un coté
  831. decal.sym.push ({x: x2, y: (aprev * x2 + bprev1)}); // décalage de l'autre coté
  832. aprev = anext;
  833. bprev = bnext; bprev1 = bnext1;
  834. }
  835. // derniers point
  836. decal.dir.push ({x: (geom[i].x - sign(deltaX) * offset * Math.sin (angle)),y: (geom[i].y + sign(deltaX) * offset * Math.cos (angle))});
  837. decal.sym.push ({x: (geom[i].x + sign(deltaX) * offset * Math.sin (angle)),y: (geom[i].y - sign(deltaX) * offset * Math.cos (angle))});
  838. return decal;
  839. }
  840.  
  841. function b_spline (ligne) {
  842. var ligne1 = [];
  843. ligne1 [0] = ligne [0];
  844. for (var j = 1; j < ligne.length-2;j++) {
  845. var t = 4; // nombre de sous-segments
  846. for (var i = 0; i < 1;i+=1/t) {
  847. var x1 = ((1-i)*(1-i)*(1-i)*ligne[j-1].x + (3*i*i*i -6*i*i +4)*ligne[j].x + (-3*i*i*i +3*i*i +3*i +1)*ligne[j+1].x + i*i*i*ligne[j+2].x)/6;
  848. var y1 = ((1-i)*(1-i)*(1-i)*ligne[j-1].y + (3*i*i*i -6*i*i +4)*ligne[j].y + (-3*i*i*i +3*i*i +3*i +1)*ligne[j+1].y + i*i*i*ligne[j+2].y)/6;
  849. ligne1.push ({x: (x1), y: (y1)});
  850. }
  851. }
  852. ligne1.push( ligne[ligne.length-1] );
  853. return ligne1;
  854. }
  855.  
  856. function getStreet(segment) {
  857. if (!segment.attributes.primaryStreetID)
  858. return null;
  859. var street = segment.model.streets.get(segment.attributes.primaryStreetID);
  860. return street;
  861. }
  862.  
  863. function select_same_type_roads(ev) {
  864. var nbRoad = Waze.selectionManager.selectedItems.length;
  865. var selectedGood = true; // selection must have 1 or 2 items
  866. for (var i = 0; i<nbRoad;i++) { // Test if selection are segment
  867. var sel = Waze.selectionManager.selectedItems[i].model;
  868. selectedGood = ((selectedGood) && (sel.type == "segment"));
  869. }
  870. if (selectedGood) {
  871. var Select_IDs =[]; //tableau de stockage des Routes electionnées
  872. for (var j = 0; j < nbRoad; j++) {
  873. var sel = Waze.selectionManager.selectedItems[j].model;
  874. if (sel.attributes.junctionID!=null) { // It's un roundabout
  875. var jId = sel.attributes.junctionID;
  876. var junc = Waze.model.junctions.objects[jId];
  877. Select_IDs.push.apply(Select_IDs,junc.segIDs);} // Add to pervious selected Ids
  878. else {
  879. var roadFrom = sel.attributes.fromNodeID;
  880. var nodeFrom = Waze.model.nodes.objects[roadFrom]; // recherche à partir du premier noeud
  881. var segList = searchRoad(nodeFrom,sel,"0");
  882. Select_IDs.push.apply(Select_IDs,segList.IDs); // Add to pervious selected Ids
  883. var roadTo = sel.attributes.toNodeID;
  884. var nodeTo = Waze.model.nodes.objects[roadTo]; // recherche à partir du deuxième noeud
  885. var segList = searchRoad(nodeTo,sel,"0");
  886. Select_IDs.push.apply(Select_IDs,segList.IDs); // Add to pervious selected Ids
  887. }
  888. }
  889. select (Select_IDs);
  890. }
  891. if (!selectedGood) { alert("You must select road(s)");}
  892. }
  893.  
  894. function Side_A(ev) {
  895. var nbRoad = Waze.selectionManager.selectedItems.length;
  896. var sel = Waze.selectionManager.selectedItems[0].model;
  897. if ((nbRoad == 1) && (sel.type == "segment")) {
  898. var roadFrom = sel.attributes.fromNodeID;
  899. var nodeFrom = Waze.model.nodes.objects[roadFrom]; // recherche à partir du noeud A
  900. var segList = searchRoad(nodeFrom,sel,"0")
  901. select (segList.IDs);}
  902. else {
  903. alert ("One segment (and only one)\nmust be selected");
  904. }
  905. }
  906. function Side_B(ev) {
  907. var nbRoad = Waze.selectionManager.selectedItems.length;
  908. var sel = Waze.selectionManager.selectedItems[0].model;
  909. if ((nbRoad == 1) && (sel.type == "segment")) {
  910. var roadTo = sel.attributes.toNodeID;
  911. var nodeTo = Waze.model.nodes.objects[roadTo]; // recherche à partir du noeud A
  912. var segList = searchRoad(nodeTo,sel,"0")
  913. select (segList.IDs);}
  914. else {
  915. alert ("One segment (and only one)\nmust be selected");
  916. }
  917. }
  918. function select_AB(ev) {
  919. var nbRoad = Waze.selectionManager.selectedItems.length; // **** Validate selection *****
  920. var selectedGood = (nbRoad == 2); // selection must have 2 items
  921. if (selectedGood) {
  922. var sel = Waze.selectionManager.selectedItems[0].model;
  923. var sel1 = Waze.selectionManager.selectedItems[1].model;
  924. selectedGood = ((sel.type == "segment") && (sel1.type == "segment")); // Test if selection are segment
  925. selectedGood = ((selectedGood) && (sel.attributes.roadType == sel1.attributes.roadType)); // Test if selection have same road Type
  926. }
  927. if (selectedGood) {
  928. var lengthMin = 1000000;
  929. var goodTrip = [];
  930. var select1 = select_12(sel,sel1);
  931. if (select1[select1.length-1] == sel1.getID()) { // on a trouvé un chemin dans ce sens
  932. goodTrip = select1;
  933. lengthMin = lengthTrip (select1);
  934. }
  935. var select2 = select_12(sel1,sel);
  936. if ((select2[select2.length-1] == sel.getID()) && (lengthTrip (select2) < lengthMin)){ // on a trouvé un chemin dans ce sens
  937. goodTrip = select2;
  938. lengthMin = lengthTrip (select2);
  939. }
  940. var nodeTrip1 = nodeFromTrip (select1); // ******* search for Common Nodes
  941. var nodeTrip2 = nodeFromTrip (select2);
  942. var CommonNode = [];
  943. for (var m = 0; m < nodeTrip1.length; m++) {
  944. if (isInArray (nodeTrip1[m],nodeTrip2)) {
  945. CommonNode.push (nodeTrip1[m]);
  946. }
  947. }
  948. if (CommonNode.length !=0) {
  949. for (var i = 0; i < CommonNode.length; i++) {
  950. var select3 = [];
  951. var road = Waze.model.segments.objects[select1[0]];
  952. for (var j = 0; ((road.attributes.fromNodeID != CommonNode[i]) && (road.attributes.toNodeID != CommonNode[i])); j++) {
  953. select3.push (road.getID());
  954. road = Waze.model.segments.objects[select1[j]];
  955. }
  956. select3.push (road.getID());
  957. road = Waze.model.segments.objects[select2[0]];
  958. for (var k = 0; ((road.attributes.fromNodeID != CommonNode[i]) && (road.attributes.toNodeID != CommonNode[i])); k++) {
  959. select3.push (road.getID());
  960. road = Waze.model.segments.objects[select2[k]];
  961. }
  962. select3.push (road.getID());
  963. select3 = delete_multi_Ids (select3);
  964. if (lengthTrip (select3) <lengthMin) {
  965. goodTrip = select3;
  966. lengthMin = lengthTrip (goodTrip);
  967. }
  968. }
  969. }
  970. if (lengthMin != 1000000) { // a path was found
  971. goodTrip = addRoundabout (goodTrip); // Add roundabout segments
  972. goodTrip = addAlternativePaths (goodTrip); // add alternative simple way like fork in roundabaout
  973. select (goodTrip);} // make the selection
  974. else {
  975. alert("No Path found");
  976. }
  977. }
  978. else { alert("You must select 2 roads \nwith the same type");
  979. }
  980. }
  981.  
  982. function addAlternativePaths (trip) {
  983. var alternativeSegs = [];
  984. var listNodeIDs = nodeFromTrip (trip); // list of nodesIds of the trip
  985. var road = Waze.model.segments.objects[trip[0]];
  986. var roadtype = road.attributes.roadType;
  987. for (var i = 0; i < listNodeIDs.length;i++) {
  988. var node = Waze.model.nodes.objects[listNodeIDs[i]];
  989. var nodeSegIdList = node.attributes.segIDs;
  990. for (var j = 0; j < nodeSegIdList.length;j++) {
  991. var road1 = Waze.model.segments.objects[nodeSegIdList[j]];
  992. if ((road1 != null) && (road1.attributes.roadType == roadtype) && (isInArray (road1.attributes.fromNodeID,listNodeIDs)) && (isInArray (road1.attributes.toNodeID,listNodeIDs))) {
  993. alternativeSegs.push (road1.getID());
  994. }
  995. }
  996. }
  997. if (alternativeSegs.length != 0 ) {
  998. trip.push.apply(trip,alternativeSegs);
  999. trip = delete_multi_Ids (trip);
  1000. }
  1001. return trip;
  1002. }
  1003.  
  1004. function addRoundabout (trip) {
  1005. var roundaboutSegs = [];
  1006. for (var i = 0; i < trip.length;i++) {
  1007. var road = Waze.model.segments.objects[trip[i]];
  1008. if (road.attributes.junctionID!=null) { // It's un roundabout
  1009. var jId = road.attributes.junctionID;
  1010. var junc = Waze.model.junctions.objects[jId];
  1011. roundaboutSegs.push.apply(roundaboutSegs,junc.segIDs); // prepare to add roundabout to select
  1012. }
  1013. }
  1014. if (roundaboutSegs.length != 0 ) {
  1015. trip.push.apply(trip,roundaboutSegs);
  1016. trip = delete_multi_Ids (trip);
  1017. }
  1018. return trip;
  1019. }
  1020.  
  1021. function nodeFromTrip (Trip) {
  1022. var node =[];
  1023. for (var i = 0; i < Trip.length; i++) {
  1024. var road = Waze.model.segments.objects[Trip[i]];
  1025. node.push (road.attributes.fromNodeID);
  1026. node.push (road.attributes.toNodeID);
  1027. }
  1028. node = delete_multi_Ids (node);
  1029. return node;
  1030. }
  1031.  
  1032. function lengthTrip (listRoadID) {
  1033. var length= 0;
  1034. for (var i = 0; i < listRoadID.length;i++) {
  1035. var road = Waze.model.segments.objects[listRoadID[i]];
  1036. length = length + road.attributes.length;
  1037. }
  1038. return length;
  1039. }
  1040.  
  1041. function select_12(startRoad,endRoad) {
  1042. var Select_IDs =[]; //tableau de stockage des Routes electionnées
  1043. var endRoadFrom;
  1044. var endRoadTo;
  1045. if (endRoad.attributes.fromNodeID != null) { // Validate node for End Road
  1046. endRoadFrom = Waze.model.nodes.objects[endRoad.attributes.fromNodeID];}
  1047. else {endRoadFrom = Waze.model.nodes.objects[endRoad.attributes.toNodeID];}
  1048. if (endRoad.attributes.toNodeID != null) {
  1049. endRoadTo = Waze.model.nodes.objects[endRoad.attributes.toNodeID];}
  1050. else {endRoadTo = Waze.model.nodes.objects[endRoad.attributes.fromNodeID];}
  1051. var node = choiceStartNode (startRoad,endRoadFrom,endRoadTo); // Choix du node de depart
  1052. var segList = searchRoad(node,startRoad,endRoad.getID());
  1053. Select_IDs.push.apply(Select_IDs,segList.IDs);
  1054. //alert (Select_IDs);
  1055. while ((segList.stop == "multiRoads") && (segList.roads.length >"1") && (Select_IDs.length < 50)) { // Manage jonctions with same type road
  1056. var BestNextNode = searchBestNextNode (segList.node, segList.roads, endRoad);
  1057. if ( BestNextNode.getID() != segList.node.getID() ) { // search road with best node
  1058. for (var i = 0; i < segList.roads.length;i++) {
  1059. var road = Waze.model.segments.objects[segList.roads[i]];
  1060. if ((BestNextNode.getID() == road.attributes.fromNodeID) || (BestNextNode.getID() == road.attributes.toNodeID)) {
  1061. var bestRoad = road;
  1062. }
  1063. }
  1064. var segList = searchRoad (BestNextNode, bestRoad, endRoad.getID());
  1065. Select_IDs.push.apply(Select_IDs, segList.IDs);}
  1066. else {
  1067. segList.stop = "none";
  1068. }
  1069. }
  1070. return (Select_IDs);
  1071. }
  1072.  
  1073. function searchBestNextNode (StartNode,listRoadID,endRoad) {
  1074. var EndNode1 = Waze.model.nodes.objects[endRoad.attributes.fromNodeID];
  1075. var EndNode2 = Waze.model.nodes.objects[endRoad.attributes.toNodeID];
  1076. if (distance(StartNode,EndNode2) > distance(StartNode,EndNode1)) { // determine de noeud de référence de fin
  1077. var EndNode = EndNode1;}
  1078. else {
  1079. var EndNode = EndNode2;
  1080. }
  1081. var angleEnd = angle(StartNode, EndNode);
  1082. var angleMin = 360;
  1083. var BestNode;
  1084. for (var i = 0; i < listRoadID.length;i++) {
  1085. var road = Waze.model.segments.objects[listRoadID[i]];
  1086. if (road.attributes.fromNodeID == StartNode.getID()) { // determine de noeud à tester pour la fin du segment
  1087. var node = Waze.model.nodes.objects[road.attributes.toNodeID];}
  1088. else {
  1089. var node = Waze.model.nodes.objects[road.attributes.fromNodeID];
  1090. }
  1091. var angle1 = Math.abs(angle (StartNode,node) - angleEnd);
  1092. if (angle1 > 180 ) { angle1= 360 - angle1;} // angle complémentaire
  1093. if ( angle1 < angleMin ) {
  1094. angleMin = angle1;
  1095. BestNode = node;
  1096. }
  1097. }
  1098. return BestNode;
  1099. }
  1100.  
  1101.  
  1102. //function sign (x) {
  1103. //if ( x < 0 ) { return (-1);}
  1104. // else {return (1);}
  1105. //}
  1106. // **** Math functions *****
  1107. function sign (x) {return (x < 0) ? (-1) : (1);}
  1108. function AtanDeg ( x) {return ( 180 * Math.atan (x) / Math.PI );}
  1109. function convertDegRad (angledeg) {return (Math.PI * (angledeg) / 180 );}
  1110. function angle (node1,node2) {
  1111. //var deltaX = (node2.geometry.x - node1.geometry.x);
  1112. //var deltaY = (node2.geometry.y - node1.geometry.y);
  1113. //return angleDeg (deltaX,deltaY);
  1114. return angleDeg ((node2.geometry.x - node1.geometry.x),(node2.geometry.y - node1.geometry.y));
  1115. }
  1116. function angleDeg (deltaX,deltaY) {
  1117. if (deltaX == 0) { return ( sign( deltaY ) * 90);}
  1118. if (deltaX > 0 ) { return (AtanDeg( deltaY / deltaX));}
  1119. else { return ((sign( deltaY )* 180) + AtanDeg( deltaY / deltaX));}
  1120. }
  1121. function longueur (x1,y1,x2,y2) {
  1122. return (Math.sqrt (((x1-x2)*(x1-x2))+((y1-y2)*(y1-y2))));
  1123. }
  1124. // **********************
  1125. function select (Select_IDs) {
  1126. Select_IDs = delete_multi_Ids (Select_IDs) ; // suppression des doublons
  1127. var foundSegs =[];
  1128. for (var i = 0; i<Select_IDs.length;i++) {
  1129. foundSegs.push(Waze.model.segments.objects[Select_IDs[i]]); // créer la selection
  1130. }
  1131. Waze.selectionManager.select(foundSegs);
  1132. }
  1133. function delete_multi_Ids (myArray) {
  1134. var myNewArray = [];
  1135. if (myArray.length >0) {
  1136. myNewArray[0]= myArray [0];
  1137. for (var i = 0; i < myArray.length; i++) {
  1138. if (notInArray (myArray [i],myNewArray)) {
  1139. myNewArray.push(myArray [i]);
  1140. }
  1141. }
  1142. }
  1143. return myNewArray;
  1144. }
  1145. function minInArray (array) {
  1146. if (array.length > 0) {
  1147. var minimum = array [0];
  1148. for (var i = 1; i < array.length; i++) {
  1149. //if (array [i] < minimum) {minimum = array [i];}
  1150. minimum = Math.min (minimum,array [i]);
  1151. }
  1152. return minimum;
  1153. }
  1154. else {return null;}
  1155. }
  1156. function isInArray (item,array) {return array.indexOf(item) !== -1;}
  1157. function notInArray (item,array) {return array.indexOf(item) === -1;}
  1158. // function notInArray (item,array) {
  1159. // for (var i = 0; i < array.length; i++) {
  1160. // if (item == array [i]) { return false;}
  1161. // }
  1162. // return true;
  1163. // }
  1164. // function isInArray (item,array) {
  1165. // for (var i = 0; i < array.length; i++) {
  1166. // if (item == array [i]) { return true;}
  1167. // }
  1168. // return false;
  1169. // }
  1170. function searchRoad(node,roadStart,roadEndID) {
  1171. var roadtype = roadStart.attributes.roadType;
  1172. var roadStartID = roadStart.getID();
  1173. var roadID = roadStartID;
  1174. var foundSegs = {}; // object for return parameters
  1175. foundSegs.IDs = [];
  1176. foundSegs.roads = []; //init array
  1177. foundSegs.stop = "none"; //init Stop cause
  1178. foundSegs.IDs.push(roadID);
  1179. var nbSeg = 1; //Number of searched segments
  1180. while ((nbSeg < 50) && (roadID != roadEndID)) {
  1181. var nodeSegIdList = node.attributes.segIDs; // list of road connected to node
  1182. var sameTypeRoad = [];
  1183. for (var i = 0; i < nodeSegIdList.length;i++) {
  1184. var segID = nodeSegIdList [i];
  1185. var seg1 =Waze.model.segments.objects[segID];
  1186. if (seg1 == null ) return foundSegs; // le segment n'est pas chargé en mémoire
  1187. else {
  1188. if ((seg1.attributes.roadType == roadtype) && (seg1.getID() != roadID)) {
  1189. sameTypeRoad.push(segID);
  1190. }
  1191. }
  1192. }
  1193.  
  1194. if (sameTypeRoad.length !=1) {
  1195. if (isInArray (roadEndID,sameTypeRoad)) { // End Road is in the fork
  1196. foundSegs.IDs.push(roadEndID); // We add it and go away
  1197. return foundSegs;
  1198. }
  1199. sameTypeRoad = validate (sameTypeRoad); // delete cul-de-sac
  1200. }
  1201. if (sameTypeRoad.length !=1) { // not an unique segment (0,2 or more)
  1202. foundSegs.stop = "multiRoads";
  1203. foundSegs.roads = sameTypeRoad;
  1204. foundSegs.node = node;
  1205. return foundSegs;} // on retourne le tableau d'Ids s
  1206. else {
  1207. var roadID = sameTypeRoad[0];
  1208. if (isInArray (roadID,foundSegs.IDs)) return foundSegs; // we are in a lopp : we go away
  1209. foundSegs.IDs.push(roadID);
  1210. nbSeg = nbSeg + 1;
  1211. var seg2 = Waze.model.segments.objects[roadID];
  1212. if (node.getID() == seg2.attributes.fromNodeID) { var nodeID = seg2.attributes.toNodeID;}
  1213. else { var nodeID = seg2.attributes.fromNodeID;}
  1214. var node = Waze.model.nodes.objects[nodeID];
  1215.  
  1216. if (node == null ) return foundSegs; // It's a cul-de-sac : we go away
  1217. }
  1218. }
  1219. return foundSegs;
  1220. }
  1221. function validate (sameTypeRoad) {
  1222. var myNewSameTypeRoad = [];
  1223. for (var i = 0; i < sameTypeRoad.length; i++) {
  1224. var sel = Waze.model.segments.objects[sameTypeRoad[i]];
  1225. if ((sel.attributes.fromNodeID !=null) && (sel.attributes.toNodeID!=null)) { //it is not a cul-de-sac
  1226. myNewSameTypeRoad.push (sameTypeRoad[i]);
  1227. }
  1228. }
  1229. return myNewSameTypeRoad;
  1230. }
  1231. function choiceStartNode (road1,node3,node4) {
  1232. var node1,node2;
  1233.  
  1234. if (road1.attributes.fromNodeID != null) { // test of cul-de-sac & change node if it is
  1235. node1 = Waze.model.nodes.objects[road1.attributes.fromNodeID];}
  1236. else { node1 = Waze.model.nodes.objects[road1.attributes.toNodeID];}
  1237. if (road1.attributes.toNodeID != null) {
  1238. node2 = Waze.model.nodes.objects[road1.attributes.toNodeID];}
  1239. else { node2 = Waze.model.nodes.objects[road1.attributes.fromNodeID];}
  1240.  
  1241. var nodeStart = node1;
  1242. var dist_min = distance (node1,node3);
  1243. var dist = distance (node1,node4);
  1244. if (dist < dist_min ) {dist_min=dist;}
  1245. dist = distance (node2,node3);
  1246. if (dist < dist_min ) { dist_min = dist; nodeStart = node2;}
  1247. dist = distance (node2,node4);
  1248. if (dist < dist_min ) { dist_min = dist; nodeStart = node2;}
  1249. return nodeStart;
  1250. }
  1251. function distance (node1 , node2) {
  1252. var dist = (node1.geometry.x - node2.geometry.x)*(node1.geometry.x - node2.geometry.x);
  1253. dist = dist + (node1.geometry.y - node2.geometry.y)*(node1.geometry.y - node2.geometry.y);
  1254. return Math.sqrt(dist);
  1255. }
  1256. function activateLayer (layerName, flag) {
  1257. if (flag == true || flag == false) {
  1258. var index;
  1259. switch (layerName.toUpperCase()) {
  1260. case "AERIALS": index = 1; break;
  1261. case "CITIES": index = 2; break;
  1262. case "ROADS": index = 3; break;
  1263. case "GPS POINTS": index = 4; break;
  1264. case "AREA MANAGERS": index = 6; break;
  1265. case "LANDMARKS": index = 7; break;
  1266. case "SPEED CAMERAS": index = 10; break;
  1267. case "MAP PROBLEMS": index = 12; break;
  1268. case "UPDATE REQUESTS": index = 14; break;
  1269. case "EDITABLE AREAS": index = 17; break;
  1270. case "LIVE USERS": index = 27;break;
  1271. }
  1272. if (index != null) {
  1273. var layerID = Waze.map.controls[0].map.layers[index].id;
  1274. Waze.map.controls[33].map.getLayer(layerID).setVisibility(flag);
  1275. }
  1276. }
  1277. }
  1278.  
  1279. function afficheObjet (objet) {
  1280. for (var e in objet) {alert("objet["+e+"] ="+ objet[e]+" !");}
  1281. }
  1282.  
  1283. function manage_WME_SSTR(ev) {
  1284. localStorage['WME_SSTR_enable'] = document.getElementById ('WME_SSTR_enable').checked == 1;
  1285. var road = [];
  1286. for (var i = 0; i<Waze.selectionManager.selectedItems.length;i++) {
  1287. var seg = Waze.selectionManager.selectedItems[i].model;
  1288. if (seg != null && seg.type == "segment") { road.push(seg);}
  1289. }
  1290. effaceMenu ();
  1291. if(document.getElementById ('WME_SSTR_enable').checked == 1) {
  1292. if (road.length == 1) {
  1293. document.getElementById ('WME_SSTR_Side').style.display = "block";
  1294. if (road[0].attributes.roadType == "18") {
  1295. document.getElementById ('WME_SSTR_Pklt').style.display = "block";}
  1296. else {
  1297. document.getElementById ('WME_SSTR_River').style.display = "block";}
  1298. }
  1299. if (road.length >= 1) {
  1300. document.getElementById ('WME_SSTR').style.display = "block";
  1301. document.getElementById ('WME_SSTR_Ldmk').style.display = "block";
  1302. if (road[0].attributes.junctionID !=null) {
  1303. document.getElementById ('WME_SSTR_Rdt').style.display = "block";
  1304. }
  1305. if (Waze.loginManager.user.normalizedLevel >= 3) {
  1306. document.getElementById ('WME_SSTR_CrgAds').style.display = "block";}
  1307. }
  1308. if (road.length == 2) {
  1309. document.getElementById ('WME_SSTR_12').style.display = "block";
  1310. }
  1311. }
  1312. return;
  1313. }
  1314.  
  1315. function effaceMenu () {
  1316. document.getElementById ('WME_SSTR').style.display = "none";
  1317. document.getElementById ('WME_SSTR_Side').style.display = "none";
  1318. document.getElementById ('WME_SSTR_12').style.display = "none";
  1319. document.getElementById ('WME_SSTR_River').style.display = "none";
  1320. document.getElementById ('WME_SSTR_Pklt').style.display = "none";
  1321. document.getElementById ('WME_SSTR_Ldmk').style.display = "none";
  1322. document.getElementById ('WME_SSTR_Rdt').style.display = "none";
  1323. document.getElementById ('WME_SSTR_CrgAds').style.display = "none";
  1324. }
  1325. function manageSmoothRiver () {
  1326. if (document.getElementById ('WME_SSTR_SmthRvr').checked == 1) { // recopie river sur Parling lot
  1327. document.getElementById ('WME_SSTR_SmthPlt').checked = 1;}
  1328. else {
  1329. document.getElementById ('WME_SSTR_SmthPlt').checked = 0;
  1330. }
  1331. localStorage['WME_SSTR_Smth'] = document.getElementById ('WME_SSTR_SmthRvr').checked == 1;
  1332. return;
  1333. }
  1334. function manageSmoothPklt () {
  1335. if (document.getElementById ('WME_SSTR_SmthPlt').checked == 1) { // recopie Parling lot sur river
  1336. document.getElementById ('WME_SSTR_SmthRvr').checked = 1;}
  1337. else {
  1338. document.getElementById ('WME_SSTR_SmthRvr').checked = 0;}
  1339. localStorage['WME_SSTR_Smth'] = document.getElementById ('WME_SSTR_SmthPlt').checked == 1;
  1340. return;
  1341. }
  1342. function init_WME_SSTR() {
  1343. if (localStorage['WME_SSTR_enable']=='true') { // restaure old Values (if exist)
  1344. document.getElementById ('WME_SSTR_enable').checked = 1;}
  1345. if (localStorage['WME_SSTR_Smth']=='true') {
  1346. document.getElementById ('WME_SSTR_SmthRvr').checked = 1;
  1347. document.getElementById ('WME_SSTR_SmthPlt').checked = 1;
  1348. }
  1349. if (typeof(Waze.map) != "object" || typeof(require.modules) != "object") {
  1350. //alert ("WME_MUR_Not_init")
  1351. myAlert("WME_SSTR : Waze.map not ready");
  1352. setTimeout(init_WME_SSTR, 2001);}
  1353. else {
  1354. Waze.selectionManager.events.register("selectionchanged", null, manage_WME_SSTR);
  1355. document.getElementById('WME_SSTR_enable').onclick = manage_WME_SSTR;
  1356. document.getElementById('WME_SSTR_SmthRvr').onclick = manageSmoothRiver;
  1357. document.getElementById('WME_SSTR_SmthPlt').onclick = manageSmoothPklt;
  1358. effaceMenu();
  1359. manage_WME_SSTR();
  1360. myAlert("WME_SSTR initialized");
  1361.  
  1362. console_log("Select Same Type Roads initialized");
  1363. }
  1364.  
  1365. //effaceMenu ()
  1366. //manage_WME_SSTR();
  1367. //Waze.selectionManager.events.register("selectionchanged", null, manage_WME_SSTR);
  1368.  
  1369. }
  1370.  
  1371. function myAlert (message) {
  1372. var myMessage = document.getElementById ('WME_JCB_AlertTxt').innerHTML;
  1373. var line = myMessage.split("<br>");
  1374. if (line.length==1 && line[0]==""){ line[0]= message;}
  1375. else { line.push (message);}
  1376. document.getElementById ('WME_JCB_AlertTxt').innerHTML = line.join ("<br>");
  1377. document.getElementById ('WME_JCB_AlertBox').style.display = "block";
  1378. setTimeout(function() {endAlert();}, 3750 + 500*Math.random());
  1379. }
  1380. function endAlert() {
  1381. var myMessage = document.getElementById ('WME_JCB_AlertTxt').innerHTML;
  1382. var line = myMessage.split("<br>");
  1383. line.shift();
  1384. document.getElementById ('WME_JCB_AlertTxt').innerHTML = line.join ("<br>");
  1385. if (line.length ==0){
  1386. document.getElementById ('WME_JCB_AlertBox').style.display = "none";
  1387. }
  1388. }
  1389. function console_log(msg) {
  1390. if (console.log) {console.log(msg);}
  1391. }
  1392. }
  1393.  
  1394. selectSameTypeRoad();