WME Route Speeds (MapOMatic fork)

Shows segment's speed in a route.

As of 13/11/2018. See the latest version.

  1. var meta = function () {/*
  2. // ==UserScript==
  3. // @name WME Route Speeds (MapOMatic fork)
  4. // @description Shows segment's speed in a route.
  5. // @include /^https:\/\/(www|beta)\.waze\.com\/(?!user\/)(.{2,6}\/)?editor\/?.*$/
  6. // @version 2018.11.13.001
  7. // @grant none
  8. // @namespace https://greasyfork.org/pl/scripts/4393-wme-route-speeds
  9. // @require https://greasyfork.org/scripts/24851-wazewrap/code/WazeWrap.js
  10. // @author wlodek76 (forked by MapOMatic)
  11. // @copyright 2014, 2015 wlodek76
  12. // @contributor 2014, 2015 FZ69617
  13. // ==/UserScript==
  14. */};
  15.  
  16. /*Version history:
  17. * 2017.12.09.001 (20171209)
  18. * - New: Added Avoid Ferries option (tonestertm)
  19. * Fixed longstanding bug which never allowed U-turns
  20. *
  21. * 2017.11.15.001 (20171115)
  22. * - New: Added Avoid Difficult Turns option (tonestertm)
  23. * - New: Added a checkbox and functionality to place results in Livemap's natural sort order, to help with troubleshooting around penalties.
  24. * Note that when Routing Order is checked, the Try More option is ignored, to better approximate Livemap results (tonestertm)
  25. *
  26. * 2017.11.10.001 (20171011)
  27. * - Changing to use WazeWrap.Interface.Tab to load the Route Speeds tab so it can recover from changing the map units (Imperial/Metric)
  28. * and coming back from event mode
  29. *
  30. * 1.4.8-momfork (20170123)
  31. * - Updated formatting in options panel to fix checkbox alignment issues.
  32. *
  33. * 1.4.7-momfork (20170118)
  34. * - [FIXED] International translations set to english by default. Causing critical failures.
  35. *
  36. * 1.4.6-momfork (20170104)
  37. * - Restored original marker functionality (*HUGE* thanks to JustinS83 for doing ALL the work to figure out a workaround).
  38. *
  39. * 1.4.5-momfork (20161228)
  40. * - Fixed @include so script will work in WME Beta again.
  41. *
  42. * 1.4.4-momfork (20161228)
  43. * - This is a temporary fix to restore some basic functionality. The original script may work again if Waze
  44. * devs fix an issue on their end. Had to remove markers for now.
  45. *
  46. *
  47. * 1.4.3 (20150505)
  48. * - script didn't work when only WME Route Speeds was installed (removed unnecessary unsafeWindow definition)
  49. *
  50. * 1.4.2 (20150424)
  51. * - Added: Paste LiveMap permalink into A/B marker input.
  52. * - Improved: 'Reset to Livemap Route' did not reset correctly when Shortest route was selected.
  53. * - Fixed: Layout of A-B button accordingly to browser's size.
  54. * - Fixed: Translation of internal AVOID_TRAILS option to Dirt roads.
  55. *
  56. * 1.4.1.1 (20150424)
  57. * - Improvement: Fixed options styling minor issues.
  58. * - Minor Fix: Drawing two-way traffic on segments with sharp angle
  59. *
  60. * 1.4.0 (20150424)
  61. * - New: Displaying traffic on two-way segments
  62. * - Improved: Faster display of recalculated routes
  63. * - Improved: First route is selected always by default
  64. * - Gui: Reorganize of options
  65. * - Fixed: Waiting for WME initialization
  66. * - Added: Option for ALLOW_UTURNS
  67. *
  68. * 1.3.0 (20150421)
  69. * - Fix: ALLOW UTURNS in routes
  70. *
  71. * 1.2.9.1 (20150419)
  72. * - Fix: Road Closures icons hides Route Speeds speed/time info
  73. *
  74. * 1.2.9 (20150114)
  75. * - New: Centering the map on the A/B markers.
  76. * - New: Routing options reset to the Livemap Route equivalents.
  77. * - New: Experimental "Fastest (no history)" route type option.
  78. *
  79. * 1.2.8.1 (20150102)
  80. * - Bug fix: Routing request options fixed.
  81. *
  82. * 1.2.8 (20150101)
  83. * - New: Added "Route type" routing option.
  84. * - New: Added "Try more" alternative routes option.
  85. * - Change: Controls' styling.
  86. * - Improvement: Route list sorting.
  87. * - Improvement: Route list selection can now be toggled.
  88. * - Improvement: Better handling of route request errors.
  89. * - Other: Minor code changes.
  90. *
  91. * 1.2.7.1 (20141211)
  92. * - Bug fix: Routing request options corrected.
  93. *
  94. * 1.2.7 (20141210)
  95. * - New: Added "Avoid toll roads" routing option.
  96. * - New: Added "Avoid freeways" routing option.
  97. * - New: Added "Allow dirt roads" routing option.
  98. * - Other: Minor code improvements.
  99. *
  100. * 1.2.6.1 (20141001)
  101. * - Fix for new WME by tkr85.
  102. */
  103.  
  104. var wmech_version = meta.toString().match(/@version\s+(\S+)/)[1];
  105.  
  106. var epsg900913 = new OL.Projection("EPSG:900913");
  107. var epsg4326 = new OL.Projection("EPSG:4326");
  108.  
  109. var selected = 0;
  110. var routewsp1 = [];
  111. var routewsp2 = [];
  112. var routewsp3 = [];
  113. var routewsp4 = [];
  114. var routewsp5 = [];
  115. var routeodc1 = [];
  116. var routeodc2 = [];
  117. var routeodc3 = [];
  118. var routeodc4 = [];
  119. var routeodc5 = [];
  120. var routewait = 0;
  121. var routeSelected = 1;
  122. var routeSelectedLast = 0;
  123.  
  124. var markerA;
  125. var markerB;
  126. var markerA_offset_click = [0, 0];
  127. var markerB_offset_click = [0, 0];
  128.  
  129. var routespeedsoption1 = false;
  130. var routespeedsoption2 = false;
  131. var routespeedsoption3 = false;
  132. var routespeedsoption4 = false;
  133. var routespeedsoption5 = false;
  134. var routespeedsoption6 = 3;
  135. var routespeedsoption7 = true;
  136. var routespeedsoption8 = false;
  137. var routespeedsoption9 = false;
  138. var routespeedsoption10 = false;
  139. var routespeedsoption11 = false;
  140. var routespeedsoption12 = false;
  141. var routespeedsoption13 = 1;
  142. var routespeedsoption14 = true;
  143. var routespeedsoption15 = false; // Routing Order
  144. var routespeedsoption16 = false; // Difficult Turns
  145. var routespeedsoption17 = false; // Ferries
  146.  
  147. var lastmapcenter = [0, 0];
  148. var panningX = 0;
  149. var panningY = 0;
  150. var acceleration = 1.6;
  151. var accelerationmin = 10;
  152. var accelerationmax = 200;
  153. var accelerationmargin = 30;
  154. var accelerationbackstop = 3;
  155.  
  156. var koloractive = [
  157. "#808080", // 0 km/h
  158. "#271308", // 10 km/h
  159. "#813b27", // 20 km/h
  160. "#e22700", // 30 km/h
  161. "#ef7200", // 40 km/h
  162. "#ffd307", // 50 km/h
  163. "#6cf104", // 60 km/h
  164. "#2fa035", // 70 km/h
  165. "#0bbbe9", // 80 km/h
  166. "#0f77e0", // 90 km/h
  167. "#0346fc", // 100 km/h
  168. "#3918d7", // 110 km/h
  169. "#8c07f7", // 120 km/h
  170. "#ea0ae7", // 130 km/h
  171. "#b00094", // 140 km/h
  172. "#670055" // 200 km/h
  173. ];
  174.  
  175. var jqueryinfo = 0;
  176. var tabswitched = 0;
  177. var closurelayer = null;
  178. var closurelayerZINDEX = [];
  179. var leftHand = false;
  180.  
  181. //------------------------------------------------------------------------------------------------
  182. function bootstrapWMERouteSpeeds()
  183. {
  184. if(!window.W.map && !WazeWrap.Ready) {
  185. console.log('WME Route Speeds: Waiting for WME...');
  186. setTimeout(bootstrapWMERouteSpeeds, 1000);
  187. return;
  188. }
  189.  
  190. setTimeout(initialiseWMERouteSpeeds, 1000);
  191.  
  192. console.log("WME Route Speeds " + wmech_version + " loaded.");
  193. }
  194. //------------------------------------------------------------------------------------------------
  195. function panningWMERouteSpeeds() {
  196. var WM = window.W.map;
  197.  
  198. //var operationPending = W.vent._events.listeners.operationPending[0];
  199. //if (operationPending == undefined) return;
  200. //var pending = operationPending.obj.pending[0];
  201.  
  202. //var lastcenterX = lastmapcenter[0];
  203. //var lastcenterY = lastmapcenter[1];
  204. //var centerX = WM.getCenter().lon;
  205. //var centerY = WM.getCenter().lat;
  206.  
  207. //if (lastcenterX == 0) lastcenterX = centerX;
  208. //if (lastcenterY == 0) lastcenterY = centerY;
  209.  
  210. //if ( lastcenterX==centerX && lastcenterY==centerY && pending == undefined ) {
  211. if (panningX || panningY) {
  212. var accelX = panningX;
  213. var accelY = panningY;
  214.  
  215. if (accelX < 0) accelX = -Math.pow( Math.abs(accelX) , acceleration) - accelerationmin;
  216. if (accelX > 0) accelX = Math.pow( Math.abs(accelX) , acceleration) + accelerationmin;
  217.  
  218. if (accelY < 0) accelY = -Math.pow( Math.abs(accelY) , acceleration) - accelerationmin;
  219. if (accelY > 0) accelY = Math.pow( Math.abs(accelY) , acceleration) + accelerationmin;
  220.  
  221. if (accelX < -accelerationmax) accelX = -accelerationmax;
  222. if (accelY < -accelerationmax) accelY = -accelerationmax;
  223. if (accelX > accelerationmax) accelX = accelerationmax;
  224. if (accelY > accelerationmax) accelY = accelerationmax;
  225.  
  226. WM.pan(accelX, accelY);
  227. }
  228. //}
  229. }
  230. //------------------------------------------------------------------------------------------------
  231. function saveRouteSpeedsOptions() {
  232.  
  233. var obj1 = getId('routespeeds-option1');
  234. var obj2 = getId('routespeeds-option2');
  235. var obj3 = getId('routespeeds-option3');
  236. var obj4 = getId('routespeeds-option4');
  237. var obj5 = getId('routespeeds-option5');
  238. var obj6 = getId('routespeeds-option6');
  239. var obj7 = getId('routespeeds-option7');
  240. var obj8 = getId('routespeeds-option8');
  241. var obj9 = getId('routespeeds-option9');
  242. var obj10 = getId('routespeeds-option10');
  243. var obj11 = getId('routespeeds-option11');
  244. var obj12 = getId('routespeeds-option12');
  245. var obj13 = getId('routespeeds-option13');
  246. var obj14 = getId('routespeeds-option14');
  247. var obj15 = getId('routespeeds-option15'); // Routing Order
  248. var obj16 = getId('routespeeds-option16'); // Difficult Turns
  249. var obj17 = getId('routespeeds-option17'); // Ferries
  250.  
  251. if (obj1 !== undefined) {
  252. localStorage.setItem("RouteSpeedsOption1", obj1.checked);
  253. localStorage.setItem("RouteSpeedsOption2", obj2.checked);
  254. localStorage.setItem("RouteSpeedsOption3", obj3.checked);
  255. localStorage.setItem("RouteSpeedsOption4", obj4.checked);
  256. localStorage.setItem("RouteSpeedsOption5", obj5.checked);
  257. localStorage.setItem("RouteSpeedsOption6", obj6.value);
  258. localStorage.setItem("RouteSpeedsOption7", obj7.checked);
  259. localStorage.setItem("RouteSpeedsOption8", obj8.checked);
  260. localStorage.setItem("RouteSpeedsOption9", obj9.checked);
  261. localStorage.setItem("RouteSpeedsOption10", obj10.checked);
  262. localStorage.setItem("RouteSpeedsOption11", obj11.checked);
  263. localStorage.setItem("RouteSpeedsOption12", obj12.checked);
  264. localStorage.setItem("RouteSpeedsOption13", obj13.value);
  265. localStorage.setItem("RouteSpeedsOption14", true); // ALLOW_UTURNS is by default always true
  266. localStorage.setItem("RouteSpeedsOption15", obj15.checked); // Routing Order
  267. localStorage.setItem("RouteSpeedsOption16", obj16.checked); // Difficult Turns
  268. localStorage.setItem("RouteSpeedsOption17", obj17.checked); // Ferries
  269. }
  270. }
  271. //---------------------------------------------------------------------------------------
  272. function loadRouteSpeedsOptions() {
  273.  
  274. if (localStorage.RouteSpeedsOption1) routespeedsoption1 = (localStorage.RouteSpeedsOption1 == "true");
  275. if (localStorage.RouteSpeedsOption2) routespeedsoption2 = (localStorage.RouteSpeedsOption2 == "true");
  276. if (localStorage.RouteSpeedsOption3) routespeedsoption3 = (localStorage.RouteSpeedsOption3 == "true");
  277. if (localStorage.RouteSpeedsOption4) routespeedsoption4 = (localStorage.RouteSpeedsOption4 == "true");
  278. if (localStorage.RouteSpeedsOption5) routespeedsoption5 = (localStorage.RouteSpeedsOption5 == "true");
  279. if (localStorage.RouteSpeedsOption6) routespeedsoption6 = (localStorage.RouteSpeedsOption6);
  280. if (localStorage.RouteSpeedsOption7) routespeedsoption7 = (localStorage.RouteSpeedsOption7 == "true");
  281. if (localStorage.RouteSpeedsOption8) routespeedsoption8 = (localStorage.RouteSpeedsOption8 == "true");
  282. if (localStorage.RouteSpeedsOption9) routespeedsoption9 = (localStorage.RouteSpeedsOption9 == "true");
  283. if (localStorage.RouteSpeedsOption10) routespeedsoption10 = (localStorage.RouteSpeedsOption10 == "true");
  284. if (localStorage.RouteSpeedsOption11) routespeedsoption11 = (localStorage.RouteSpeedsOption11 == "true");
  285. if (localStorage.RouteSpeedsOption12) routespeedsoption12 = (localStorage.RouteSpeedsOption12 == "true");
  286. if (localStorage.RouteSpeedsOption13) routespeedsoption13 = (localStorage.RouteSpeedsOption13);
  287. if (localStorage.RouteSpeedsOption14) routespeedsoption14 = (localStorage.RouteSpeedsOption14 == "true");
  288. if (localStorage.RouteSpeedsOption15) routespeedsoption15 = (localStorage.RouteSpeedsOption15 == "true");
  289. if (localStorage.RouteSpeedsOption16) routespeedsoption16 = (localStorage.RouteSpeedsOption16 == "true");
  290. if (localStorage.RouteSpeedsOption17) routespeedsoption17 = (localStorage.RouteSpeedsOption17 == "true");
  291.  
  292.  
  293. getId('routespeeds-option1').checked = routespeedsoption1;
  294. getId('routespeeds-option2').checked = routespeedsoption2;
  295. getId('routespeeds-option3').checked = routespeedsoption3;
  296. getId('routespeeds-option4').checked = routespeedsoption4;
  297. getId('routespeeds-option5').checked = routespeedsoption5;
  298. getId('routespeeds-option6').value = routespeedsoption6;
  299. getId('routespeeds-option7').checked = routespeedsoption7;
  300. getId('routespeeds-option8').checked = routespeedsoption8;
  301. getId('routespeeds-option9').checked = routespeedsoption9;
  302. getId('routespeeds-option10').checked = routespeedsoption10;
  303. getId('routespeeds-option11').checked = routespeedsoption11;
  304. getId('routespeeds-option12').checked = routespeedsoption12;
  305. getId('routespeeds-option13').value = routespeedsoption13;
  306. getId('routespeeds-option14').checked = routespeedsoption14;
  307. getId('routespeeds-option15').checked = routespeedsoption15;
  308. getId('routespeeds-option16').checked = routespeedsoption16;
  309. getId('routespeeds-option17').checked = routespeedsoption17;
  310.  
  311. update_adv_switches();
  312. }
  313. //---------------------------------------------------------------------------------------
  314. function update_adv_switches() {
  315.  
  316. getId('routespeeds-option5-span').style.display = routespeedsoption5 ? 'inline' : 'none';
  317. getId('routespeeds-option10-span').style.display = routespeedsoption10 ? 'inline' : 'inline';
  318. }
  319. //---------------------------------------------------------------------------------------
  320. function getRoutingManager() {
  321. if (W.model.countries.getObjectById(235) || W.model.countries.getObjectById(40)) { // US & Canada
  322. return '/RoutingManager/routingRequest';
  323. } else if (W.model.countries.getObjectById(106)) { // Israel
  324. return '/il-RoutingManager/routingRequest';
  325. } else {
  326. return '/row-RoutingManager/routingRequest';
  327. }
  328. }
  329. //------------------------------------------------------------------------------------------------
  330. function getSegmentMidPoint(seg, end) {
  331.  
  332. var points, p1, p2, dx, dy, x, y;
  333. points = seg.geometry.components.length;
  334.  
  335. if (points == 2) {
  336. p1 = seg.geometry.components[0];
  337. p2 = seg.geometry.components[1];
  338.  
  339. x = p1.x + (p2.x - p1.x) * 0.5;
  340. y = p1.y + (p2.y - p1.y) * 0.5;
  341. return OL.Layer.SphericalMercator.inverseMercator(x, y);
  342. }
  343.  
  344. var length = 0;
  345. for(var i=0; i<points-1; i++) {
  346. p1 = seg.geometry.components[i + 0];
  347. p2 = seg.geometry.components[i + 1];
  348. dx = p2.x - p1.x;
  349. dy = p2.y - p1.y;
  350. length += Math.sqrt(dx*dx + dy*dy);
  351. }
  352. var midlen = length / 2.0;
  353.  
  354. var length1 = 0;
  355. var length2 = 0;
  356. for(i=0; i<points-1; i++) {
  357. p1 = seg.geometry.components[i + 0];
  358. p2 = seg.geometry.components[i + 1];
  359. dx = p2.x - p1.x;
  360. dy = p2.y - p1.y;
  361. length1 = length2;
  362. length2 = length2 + Math.sqrt(dx*dx + dy*dy);
  363.  
  364. if (midlen >= length1 && midlen < length2) {
  365. var proc = (midlen - length1) / (length2 - length1);
  366. x = p1.x + (p2.x - p1.x) * proc;
  367. y = p1.y + (p2.y - p1.y) * proc;
  368. return OL.Layer.SphericalMercator.inverseMercator(x, y);
  369. }
  370. }
  371.  
  372. if (end === 0) {
  373. p1 = seg.geometry.components[0];
  374. p2 = seg.geometry.components[1];
  375. }
  376. else {
  377. p1 = seg.geometry.components[points - 2];
  378. p2 = seg.geometry.components[points - 1];
  379. }
  380.  
  381. x = p1.x + (p2.x - p1.x) * 0.5;
  382. y = p1.y + (p2.y - p1.y) * 0.5;
  383. return OL.Layer.SphericalMercator.inverseMercator(x, y);
  384. }
  385. //------------------------------------------------------------------------------------------------
  386. function getColor(speed) {
  387. if (speed === 0) return koloractive[0];
  388. var k = parseInt(speed / 10.0) + 1;
  389. if (k > 15) k = 15;
  390. return koloractive[k];
  391. }
  392. //------------------------------------------------------------------------------------------------
  393. function addLabel(lines, speedtekst, routespeedsoption2, odctime, odclen, routespeedsoption4, id) {
  394.  
  395. var speed = parseInt(speedtekst);
  396.  
  397. var kolor1 = '#F0F0F0';
  398. var kolor2 = '#000000';
  399. var p1, p2, pt, textFeature, k, sx, sy;
  400. if (speed >= 40 && speed < 50) { kolor1 = '#404040'; kolor2 = '#FFFFFF'; }
  401. if (speed >= 50 && speed < 60) { kolor1 = '#404040'; kolor2 = '#FFFFFF'; }
  402.  
  403. if (routespeedsoption4) speedtekst = parseInt(speedtekst / 1.609 + 0.5);
  404. if (speedtekst === 0) speedtekst = "?";
  405.  
  406. var numlines = lines.length;
  407. if (numlines >= 2) {
  408. var line;
  409. var ps = parseInt(numlines) >> 1;
  410. p1 = lines[ps].components[0];
  411. p2 = lines[ps].components[1];
  412. var proc = 0.5;
  413.  
  414. var dist = [];
  415. var dsum = 0;
  416. for(k=0; k<numlines; k++) {
  417. line = lines[k];
  418. var d = line.getGeodesicLength( epsg900913 );
  419. dsum += d;
  420. dist.push(d);
  421. }
  422. var dmid = dsum / 2.0;
  423. var d1 = 0;
  424. var d2 = 0;
  425. for(k=0; k<numlines; k++) {
  426. line = lines[k];
  427. d1 = d2;
  428. d2 += dist[k];
  429. if (dmid >= d1 && dmid < d2) {
  430. p1 = lines[k].components[0];
  431. p2 = lines[k].components[1];
  432. proc = (dmid - d1) / (d2 - d1);
  433. }
  434. }
  435.  
  436. sx = p1.x + (p2.x - p1.x) * proc;
  437. sy = p1.y + (p2.y - p1.y) * proc;
  438.  
  439. if (routespeedsoption2) speedtekst = odctime + "s ";
  440.  
  441. pt = new OL.Geometry.Point(sx, sy);
  442. textFeature = new OL.Feature.Vector( pt, {labelText: speedtekst, fontColor: kolor1, pointRadius: 0 } );
  443. return textFeature;
  444. }
  445. else if (numlines==1) {
  446. p1 = lines[0].components[0];
  447. p2 = lines[0].components[1];
  448.  
  449. sx = (p1.x + p2.x) * 0.5;
  450. sy = (p1.y + p2.y) * 0.5;
  451.  
  452. if (routespeedsoption2) speedtekst = odctime + "s ";
  453.  
  454. pt = new OL.Geometry.Point(sx, sy);
  455. textFeature = new OL.Feature.Vector( pt, {labelText: speedtekst, fontColor: kolor1, pointRadius: 0 } );
  456. return textFeature;
  457. }
  458. else return null;
  459. }
  460. //------------------------------------------------------------------------------------------------
  461. function panmap(draggingobj, x, y)
  462. {
  463. var maxX = draggingobj.map.viewPortDiv.clientWidth;
  464. var maxY = draggingobj.map.viewPortDiv.clientHeight;
  465. var lastx = draggingobj.last.x;
  466. var lasty = draggingobj.last.y;
  467. var mx = x - lastx;
  468. var my = y - lasty;
  469.  
  470. if (x < accelerationmargin) {
  471. if (mx < 0) panningX = x - accelerationmargin;
  472. if (mx > accelerationbackstop) panningX = 0;
  473. }
  474. else if (x > maxX-accelerationmargin) {
  475. if (mx > 0) panningX = x - (maxX-accelerationmargin);
  476. if (mx < -accelerationbackstop) panningX = 0;
  477. }
  478. else panningX = 0;
  479.  
  480. if (y < accelerationmargin) {
  481. if (my < 0) panningY = y - (accelerationmargin);
  482. if (my > accelerationbackstop) panningY = 0;
  483. }
  484. else if (y > maxY-accelerationmargin-25) {
  485. if (my > 0) panningY = y - (maxY-accelerationmargin-25);
  486. if (my < -accelerationbackstop) panningY = 0;
  487. }
  488. else panningY = 0;
  489. }
  490. //------------------------------------------------------------------------------------------------
  491. function createMarkers(lon1, lat1, lon2, lat2, disp) {
  492.  
  493. var WM = window.W.map;
  494. var OL = window.OL;
  495.  
  496. var mlayers = WM.getLayersBy("uniqueName","__DrawRouteSpeedsMarkers");
  497. var markerLayer = mlayers[0];
  498. var p1, p2, lonlat;
  499.  
  500. if (markerA === undefined && markerB === undefined) {
  501. var di = WazeWrap.Require.DivIcon;
  502. var iconA = new di("routespeedsmarkerA");
  503. var iconB = new di("routespeedsmarkerB");
  504.  
  505. p1 = new OL.Geometry.Point(lon1, lat1).transform(epsg4326, epsg900913);
  506. p2 = new OL.Geometry.Point(lon2, lat2).transform(epsg4326, epsg900913);
  507.  
  508. var lonlatA = new OL.LonLat( p1.x, p1.y );
  509. var lonlatB = new OL.LonLat( p2.x, p2.y );
  510.  
  511. markerA = new OL.Marker(lonlatA, iconA );
  512. markerB = new OL.Marker(lonlatB, iconB );
  513.  
  514. var wh = WazeWrap.Require.DragElement();//require("Waze/Handler/DragElement");
  515. markerA.dragging = new wh(WM);
  516. markerB.dragging = new wh(WM);
  517.  
  518. markerA.dragging.down = function(e) {
  519. lonlat = this.map.getLonLatFromViewPortPx(e.xy);
  520. if (lonlat === null) return;
  521. markerA_offset_click[0] = markerA.lonlat.lon - lonlat.lon;
  522. markerA_offset_click[1] = markerA.lonlat.lat - lonlat.lat;
  523. };
  524. markerB.dragging.down = function(e) {
  525. lonlat = this.map.getLonLatFromViewPortPx(e.xy);
  526. if (lonlat === null) return;
  527. markerB_offset_click[0] = markerB.lonlat.lon - lonlat.lon;
  528. markerB_offset_click[1] = markerB.lonlat.lat - lonlat.lat;
  529. };
  530.  
  531. markerA.dragging.move = function(e) {
  532. lonlat = this.map.getLonLatFromViewPortPx(e.xy);
  533. markerA.lonlat.lon = lonlat.lon + markerA_offset_click[0];
  534. markerA.lonlat.lat = lonlat.lat + markerA_offset_click[1];
  535. markerLayer.drawMarker(markerA);
  536. panmap(this, e.xy.x, e.xy.y);
  537. };
  538. markerB.dragging.move = function(e) {
  539. lonlat = this.map.getLonLatFromViewPortPx(e.xy);
  540. markerB.lonlat.lon = lonlat.lon + markerB_offset_click[0];
  541. markerB.lonlat.lat = lonlat.lat + markerB_offset_click[1];
  542. markerLayer.drawMarker(markerB);
  543. panmap(this, e.xy.x, e.xy.y);
  544. };
  545.  
  546. markerA.dragging.done = function(e) {
  547.  
  548. if (routespeedsoption1) return;
  549.  
  550. panningX = 0;
  551. panningY = 0;
  552.  
  553. var lonlatA = new OL.LonLat( markerA.lonlat.lon, markerA.lonlat.lat ).transform(epsg900913, epsg4326);
  554. var lonlatB = new OL.LonLat( markerB.lonlat.lon, markerB.lonlat.lat ).transform(epsg900913, epsg4326);
  555.  
  556. lon1 = parseInt(lonlatA.lon * 1000000.0 + 0.5) / 1000000.0;
  557. lat1 = parseInt(lonlatA.lat * 1000000.0 + 0.5) / 1000000.0;
  558. lon2 = parseInt(lonlatB.lon * 1000000.0 + 0.5) / 1000000.0;
  559. lat2 = parseInt(lonlatB.lat * 1000000.0 + 0.5) / 1000000.0;
  560.  
  561. if (getId('sidepanel-routespeeds-a') !== undefined) {
  562. getId('sidepanel-routespeeds-a').value = lon1 + ", " + lat1;
  563. getId('sidepanel-routespeeds-b').value = lon2 + ", " + lat2;
  564. }
  565.  
  566. var objprog1 = getId('routespeeds-button-livemap');
  567. if (objprog1.style.backgroundColor === '') objprog1.style.backgroundColor = '#FF8000';
  568.  
  569. requestRouteFromLiveMap(lon1, lat1, lon2, lat2);
  570. };
  571. markerB.dragging.done = function(e) {
  572.  
  573. if (routespeedsoption1) return;
  574.  
  575. panningX = 0;
  576. panningY = 0;
  577.  
  578. var lonlatA = new OL.LonLat( markerA.lonlat.lon, markerA.lonlat.lat ).transform(epsg900913, epsg4326);
  579. var lonlatB = new OL.LonLat( markerB.lonlat.lon, markerB.lonlat.lat ).transform(epsg900913, epsg4326);
  580.  
  581. lon1 = parseInt(lonlatA.lon * 1000000.0 + 0.5) / 1000000.0;
  582. lat1 = parseInt(lonlatA.lat * 1000000.0 + 0.5) / 1000000.0;
  583. lon2 = parseInt(lonlatB.lon * 1000000.0 + 0.5) / 1000000.0;
  584. lat2 = parseInt(lonlatB.lat * 1000000.0 + 0.5) / 1000000.0;
  585.  
  586. if (getId('sidepanel-routespeeds-a') !== undefined) {
  587. getId('sidepanel-routespeeds-a').value = lon1 + ", " + lat1;
  588. getId('sidepanel-routespeeds-b').value = lon2 + ", " + lat2;
  589. }
  590.  
  591. var objprog1 = getId('routespeeds-button-livemap');
  592. if (objprog1.style.backgroundColor === '') objprog1.style.backgroundColor = '#FF8000';
  593.  
  594. requestRouteFromLiveMap(lon1, lat1, lon2, lat2);
  595. };
  596.  
  597. markerA.dragging.activate(iconA.$div);
  598. markerB.dragging.activate(iconB.$div);
  599.  
  600. markerA.display(disp);
  601. markerB.display(disp);
  602.  
  603. markerLayer.addMarker(markerA);
  604. markerLayer.addMarker(markerB);
  605. }
  606. else {
  607. p1 = new OL.Geometry.Point(lon1, lat1).transform(epsg4326, epsg900913);
  608. p2 = new OL.Geometry.Point(lon2, lat2).transform(epsg4326, epsg900913);
  609.  
  610. markerA.lonlat.lon = p1.x;
  611. markerA.lonlat.lat = p1.y;
  612. markerB.lonlat.lon = p2.x;
  613. markerB.lonlat.lat = p2.y;
  614.  
  615. markerA.display(disp);
  616. markerB.display(disp);
  617.  
  618. markerLayer.drawMarker(markerA);
  619. markerLayer.drawMarker(markerB);
  620. }
  621.  
  622. markerA.created = disp;
  623. markerB.created = disp;
  624. }
  625. //------------------------------------------------------------------------------------------------
  626. function showLayers(disp)
  627. {
  628. var WM = window.W.map;
  629.  
  630. var rlayers1 = WM.getLayersBy("uniqueName","__DrawRouteSpeeds1");
  631. var rlayers2 = WM.getLayersBy("uniqueName","__DrawRouteSpeeds2");
  632. var rlayers3 = WM.getLayersBy("uniqueName","__DrawRouteSpeeds3");
  633. var rlayers4 = WM.getLayersBy("uniqueName","__DrawRouteSpeeds4");
  634. var rlayers5 = WM.getLayersBy("uniqueName","__DrawRouteSpeeds5");
  635. var routeLayer1 = rlayers1[0];
  636. var routeLayer2 = rlayers2[0];
  637. var routeLayer3 = rlayers3[0];
  638. var routeLayer4 = rlayers4[0];
  639. var routeLayer5 = rlayers5[0];
  640.  
  641. if (routeLayer1 === undefined) return;
  642. if (routeLayer2 === undefined) return;
  643. if (routeLayer3 === undefined) return;
  644. if (routeLayer4 === undefined) return;
  645. if (routeLayer5 === undefined) return;
  646.  
  647. routeLayer1.setVisibility(disp);
  648. routeLayer2.setVisibility(disp);
  649. routeLayer3.setVisibility(disp);
  650. routeLayer4.setVisibility(disp);
  651. routeLayer5.setVisibility(disp);
  652. }
  653. //--------------------------------------------------------------------------------------------------------
  654. function showMarkers(disp)
  655. {
  656. var WM = window.W.map;
  657.  
  658. var mlayers = WM.getLayersBy("uniqueName","__DrawRouteSpeedsMarkers");
  659. var markerLayer = mlayers[0];
  660.  
  661. if (markerLayer === undefined) return false;
  662. if (markerA === undefined) return false;
  663. if (markerB === undefined) return false;
  664.  
  665. if (markerA.created) markerA.display(disp);
  666. if (markerB.created) markerB.display(disp);
  667.  
  668. return (markerA.created && markerB.created);
  669. }
  670. //------------------------------------------------------------------------------------------------
  671. function reverseMarkers()
  672. {
  673. var WM = window.W.map;
  674.  
  675. var mlayers = WM.getLayersBy("uniqueName","__DrawRouteSpeedsMarkers");
  676. var markerLayer = mlayers[0];
  677.  
  678. if (markerLayer === undefined) return;
  679. if (markerA === undefined || !markerA.created) return;
  680. if (markerB === undefined || !markerB.created) return;
  681.  
  682. var copy = markerA.lonlat;
  683. markerA.lonlat = markerB.lonlat;
  684. markerB.lonlat = copy;
  685.  
  686. markerLayer.drawMarker(markerA);
  687. markerLayer.drawMarker(markerB);
  688. }
  689. //------------------------------------------------------------------------------------------------
  690. function loopWMERouteSpeeds() {
  691.  
  692. if (routespeedsoption1) return;
  693.  
  694. var tabOpen = $('#user-tabs > .nav-tabs > li > a[href="#sidepanel-routespeeds"]').attr('aria-expanded') == "true";
  695. if (!tabOpen) {
  696. if (tabswitched !== 1) {
  697. tabswitched = 1;
  698. showLayers(false);
  699. showMarkers(false);
  700. showClosures(0);
  701. }
  702. return;
  703. }
  704. else {
  705. if (tabswitched !== 2) {
  706. tabswitched = 2;
  707. showLayers(true);
  708. showMarkers(true);
  709. showClosures(1);
  710. }
  711. }
  712.  
  713. //var routespeedsbutton = getId('routespeeds-button-livemap');
  714. //if (routespeedsbutton == 'undefined') return;
  715. //var routespeedsbutton_ofsW = routespeedsbutton.offsetWidth;
  716. //var routespeedsbutton_ofsH = routespeedsbutton.offsetHeight;
  717. //console.log(routespeedsbutton_ofsW, routespeedsbutton_ofsH);
  718. //if (routespeedsbutton_ofsW == 0 || routespeedsbutton_ofsH==0) return;
  719.  
  720.  
  721. var WM = window.W.map;
  722. var OL = window.OL;
  723.  
  724. var rlayers = WM.getLayersBy("uniqueName","__DrawRouteSpeeds1");
  725. if(rlayers.length === 0) {
  726.  
  727. var drc_style1 = new OL.Style({
  728. strokeDashstyle: 'solid',
  729. strokeColor : "${strokeColor}",
  730. strokeOpacity: 1.0,
  731. strokeWidth: "${strokeWidth}",
  732. fillColor: '#0040FF',
  733. fillOpacity: 1.0,
  734. pointRadius: "${pointRadius}",
  735. label : "${labelText}",
  736. fontFamily: "Tahoma, Courier New",
  737. labelOutlineColor: '#FFFFFF',
  738. labelOutlineWidth: 0,
  739. fontColor: "${fontColor}",
  740. fontOpacity: 1.0,
  741. fontSize: "10px",
  742. display: 'block'
  743. });
  744.  
  745. var drc_style2 = new OL.Style({
  746. strokeDashstyle: 'solid',
  747. strokeColor : "${strokeColor}",
  748. strokeOpacity: 1.0,
  749. strokeWidth: "${strokeWidth}",
  750. fillColor: '#0040FF',
  751. fillOpacity: 1.0,
  752. pointRadius: "${pointRadius}",
  753. label : "${labelText}",
  754. fontFamily: "Tahoma, Courier New",
  755. labelOutlineColor: '#FFFFFF',
  756. labelOutlineWidth: 0,
  757. fontColor: "${fontColor}",
  758. fontOpacity: 1.0,
  759. fontSize: "10px",
  760. display: 'block'
  761. });
  762.  
  763. var drc_style3 = new OL.Style({
  764. strokeDashstyle: 'solid',
  765. strokeColor : "${strokeColor}",
  766. strokeOpacity: 1.0,
  767. strokeWidth: "${strokeWidth}",
  768. fillColor: '#0040FF',
  769. fillOpacity: 1.0,
  770. pointRadius: "${pointRadius}",
  771. label : "${labelText}",
  772. fontFamily: "Tahoma, Courier New",
  773. labelOutlineColor: '#FFFFFF',
  774. labelOutlineWidth: 0,
  775. fontColor: "${fontColor}",
  776. fontOpacity: 1.0,
  777. fontSize: "10px",
  778. display: 'block'
  779. });
  780.  
  781. var drc_style4 = new OL.Style({
  782. strokeDashstyle: 'solid',
  783. strokeColor : "${strokeColor}",
  784. strokeOpacity: 1.0,
  785. strokeWidth: "${strokeWidth}",
  786. fillColor: '#0040FF',
  787. fillOpacity: 1.0,
  788. pointRadius: "${pointRadius}",
  789. label : "${labelText}",
  790. fontFamily: "Tahoma, Courier New",
  791. labelOutlineColor: '#FFFFFF',
  792. labelOutlineWidth: 0,
  793. fontColor: "${fontColor}",
  794. fontOpacity: 1.0,
  795. fontSize: "10px",
  796. display: 'block'
  797. });
  798.  
  799. var drc_style5 = new OL.Style({
  800. strokeDashstyle: 'solid',
  801. strokeColor : "${strokeColor}",
  802. strokeOpacity: 1.0,
  803. strokeWidth: "${strokeWidth}",
  804. fillColor: '#0040FF',
  805. fillOpacity: 1.0,
  806. pointRadius: "${pointRadius}",
  807. label : "${labelText}",
  808. fontFamily: "Tahoma, Courier New",
  809. labelOutlineColor: '#FFFFFF',
  810. labelOutlineWidth: 0,
  811. fontColor: "${fontColor}",
  812. fontOpacity: 1.0,
  813. fontSize: "10px",
  814. display: 'block'
  815. });
  816.  
  817. var drc_mapLayer1 = new OL.Layer.Vector("Route Speeds", {
  818. displayInLayerSwitcher: true,
  819. uniqueName: "__DrawRouteSpeeds1",
  820. styleMap: new OL.StyleMap(drc_style1)
  821. });
  822.  
  823. var drc_mapLayer2 = new OL.Layer.Vector("Route Speeds 2", {
  824. displayInLayerSwitcher: false,
  825. uniqueName: "__DrawRouteSpeeds2",
  826. styleMap: new OL.StyleMap(drc_style2)
  827. });
  828.  
  829. var drc_mapLayer3 = new OL.Layer.Vector("Route Speeds 3", {
  830. displayInLayerSwitcher: false,
  831. uniqueName: "__DrawRouteSpeeds3",
  832. styleMap: new OL.StyleMap(drc_style3)
  833. });
  834.  
  835. var drc_mapLayer4 = new OL.Layer.Vector("Route Speeds 4", {
  836. displayInLayerSwitcher: false,
  837. uniqueName: "__DrawRouteSpeeds4",
  838. styleMap: new OL.StyleMap(drc_style4)
  839. });
  840.  
  841. var drc_mapLayer5 = new OL.Layer.Vector("Route Speeds 5", {
  842. displayInLayerSwitcher: false,
  843. uniqueName: "__DrawRouteSpeeds5",
  844. styleMap: new OL.StyleMap(drc_style5)
  845. });
  846.  
  847. I18n.translations[I18n.currentLocale()].layers.name["__DrawRouteSpeeds1"] = "Route Speeds";
  848. I18n.translations[I18n.currentLocale()].layers.name["__DrawRouteSpeeds2"] = "Route Speeds 2";
  849. I18n.translations[I18n.currentLocale()].layers.name["__DrawRouteSpeeds3"] = "Route Speeds 3";
  850. I18n.translations[I18n.currentLocale()].layers.name["__DrawRouteSpeeds4"] = "Route Speeds 4";
  851. I18n.translations[I18n.currentLocale()].layers.name["__DrawRouteSpeeds5"] = "Route Speeds 5";
  852.  
  853. drc_mapLayer1.setVisibility(true);
  854. drc_mapLayer2.setVisibility(true);
  855. drc_mapLayer3.setVisibility(true);
  856. drc_mapLayer4.setVisibility(true);
  857. drc_mapLayer5.setVisibility(true);
  858.  
  859. WM.addLayer(drc_mapLayer1);
  860. WM.addLayer(drc_mapLayer2);
  861. WM.addLayer(drc_mapLayer3);
  862. WM.addLayer(drc_mapLayer4);
  863. WM.addLayer(drc_mapLayer5);
  864.  
  865. return;
  866. }
  867.  
  868. var mlayers = WM.getLayersBy("uniqueName","__DrawRouteSpeedsMarkers");
  869. if (mlayers.length === 0) {
  870.  
  871. var drc_mapLayer = new OL.Layer.Markers("Route Speeds Markers", {
  872. displayInLayerSwitcher: false,
  873. uniqueName: "__DrawRouteSpeedsMarkers"
  874. });
  875.  
  876. I18n.translations[I18n.currentLocale()].layers.name["__DrawRouteSpeedsMarkers"] = "Route Speeds Markers";
  877. WM.addLayer(drc_mapLayer);
  878. drc_mapLayer.setVisibility(true);
  879.  
  880. createMarkers(16, 52, 17, 53, false);
  881.  
  882. return;
  883. }
  884.  
  885. if (jqueryinfo === 1) {
  886. jqueryinfo = 2;
  887. console.log('WME Route Speeds: jQuery reloaded ver. ' + jQuery.fn.jquery);
  888. }
  889. if (jqueryinfo === 0) {
  890. if (typeof jQuery === 'undefined') {
  891. console.log('WME Route Speeds: jQuery current ver. ' + jQuery.fn.jquery);
  892.  
  893. var script = document.createElement('script');
  894. script.type = "text/javascript";
  895. script.src = "https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js";
  896. //script.src = "https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js";
  897. document.getElementsByTagName('head')[0].appendChild(script);
  898. jqueryinfo = 1;
  899. }
  900. }
  901.  
  902.  
  903. var rlayers1 = WM.getLayersBy("uniqueName","__DrawRouteSpeeds1");
  904. var rlayers2 = WM.getLayersBy("uniqueName","__DrawRouteSpeeds2");
  905. var rlayers3 = WM.getLayersBy("uniqueName","__DrawRouteSpeeds3");
  906. var rlayers4 = WM.getLayersBy("uniqueName","__DrawRouteSpeeds4");
  907. var rlayers5 = WM.getLayersBy("uniqueName","__DrawRouteSpeeds5");
  908. var routeLayer1 = rlayers1[0];
  909. var routeLayer2 = rlayers2[0];
  910. var routeLayer3 = rlayers3[0];
  911. var routeLayer4 = rlayers4[0];
  912. var routeLayer5 = rlayers5[0];
  913. if (routeLayer1 === undefined) return;
  914. if (routeLayer2 === undefined) return;
  915. if (routeLayer3 === undefined) return;
  916. if (routeLayer4 === undefined) return;
  917. if (routeLayer5 === undefined) return;
  918.  
  919. if (routeLayer1.getVisibility() === false) {
  920. if (routeLayer2.getVisibility() === true) {
  921. routeLayer2.setVisibility(false);
  922. routeLayer3.setVisibility(false);
  923. routeLayer4.setVisibility(false);
  924. routeLayer5.setVisibility(false);
  925. }
  926. }
  927. else {
  928. if (routeLayer2.getVisibility() === false) {
  929. routeLayer2.setVisibility(true);
  930. routeLayer3.setVisibility(true);
  931. routeLayer4.setVisibility(true);
  932. routeLayer5.setVisibility(true);
  933. }
  934. }
  935.  
  936. var numSelected = WazeWrap.getSelectedFeatures().length;
  937. var seg1 = WazeWrap.getSelectedFeatures()[0];
  938. var seg2 = WazeWrap.getSelectedFeatures()[1];
  939.  
  940. if (seg1 !== undefined && seg2 !== undefined) {
  941. if (!selected) {
  942. selected = 1;
  943.  
  944. var coords1 = getSegmentMidPoint(seg1, 0);
  945. var coords2 = getSegmentMidPoint(seg2, 1);
  946.  
  947. var lon1 = parseInt(coords1.lon * 1000000.0 + 0.5) / 1000000.0;
  948. var lat1 = parseInt(coords1.lat * 1000000.0 + 0.5) / 1000000.0;
  949. var lon2 = parseInt(coords2.lon * 1000000.0 + 0.5) / 1000000.0;
  950. var lat2 = parseInt(coords2.lat * 1000000.0 + 0.5) / 1000000.0;
  951.  
  952. if (getId('sidepanel-routespeeds-a') !== undefined) {
  953. getId('sidepanel-routespeeds-a').value = lon1 + ", " + lat1;
  954. getId('sidepanel-routespeeds-b').value = lon2 + ", " + lat2;
  955. }
  956.  
  957. createMarkers(lon1, lat1, lon2, lat2, true);
  958.  
  959. leftHand = false;
  960. if (seg1.model.model.isLeftHand) leftHand = true;
  961. if (seg2.model.model.isLeftHand) leftHand = true;
  962.  
  963. requestRouteFromLiveMap(lon1, lat1, lon2, lat2);
  964. }
  965. }
  966. else {
  967. if (seg1 !== undefined || seg2 !== undefined) {
  968. if (selected) {
  969. selected = 0;
  970.  
  971. routeLayer1.removeAllFeatures();
  972. routeLayer2.removeAllFeatures();
  973. routeLayer3.removeAllFeatures();
  974. routeLayer4.removeAllFeatures();
  975. routeLayer5.removeAllFeatures();
  976.  
  977. getId('routespeeds-summary1').style.visibility = 'hidden';
  978. getId('routespeeds-summary2').style.visibility = 'hidden';
  979. getId('routespeeds-summary3').style.visibility = 'hidden';
  980. getId('routespeeds-summary4').style.visibility = 'hidden';
  981. getId('routespeeds-summary5').style.visibility = 'hidden';
  982.  
  983. getId('routespeeds-summary1').className = 'routespeeds_summary_classA';
  984. getId('routespeeds-summary2').className = 'routespeeds_summary_classA';
  985. getId('routespeeds-summary3').className = 'routespeeds_summary_classA';
  986. getId('routespeeds-summary4').className = 'routespeeds_summary_classA';
  987. getId('routespeeds-summary5').className = 'routespeeds_summary_classA';
  988. }
  989. }
  990. }
  991. }
  992. //--------------------------------------------------------------------------------------------------------
  993. function createRouteFeatures(id, routewsp, routeodc) {
  994.  
  995. var WM = window.W.map;
  996. var OL = window.OL;
  997.  
  998. var layers;
  999. if (id==1) rlayers = WM.getLayersBy("uniqueName","__DrawRouteSpeeds1");
  1000. if (id==2) rlayers = WM.getLayersBy("uniqueName","__DrawRouteSpeeds2");
  1001. if (id==3) rlayers = WM.getLayersBy("uniqueName","__DrawRouteSpeeds3");
  1002. if (id==4) rlayers = WM.getLayersBy("uniqueName","__DrawRouteSpeeds4");
  1003. if (id==5) rlayers = WM.getLayersBy("uniqueName","__DrawRouteSpeeds5");
  1004. var routeLayer = rlayers[0];
  1005. if (routeLayer === undefined) return;
  1006.  
  1007. var lineFeatures = [];
  1008. var labelFeatures = [];
  1009. var lines = [];
  1010. var outlinepoints = [];
  1011.  
  1012. var odc = 0;
  1013. var odclen = routeodc[odc].length;
  1014. var odctime = 0;
  1015. if (routespeedsoption7) odctime = routeodc[odc].crossTime;
  1016. else odctime = routeodc[odc].crossTimeWithoutRealTime;
  1017. var odcx = 0;
  1018. var odcy = 0;
  1019. if (odc + 1 < routeodc.length) {
  1020. odcx = routeodc[odc + 1].path.x;
  1021. odcy = routeodc[odc + 1].path.y;
  1022. }
  1023.  
  1024. var speed = 0;
  1025. if (odctime > 0) speed = 3.6 * odclen / odctime;
  1026. var speedtekst = parseInt(speed);
  1027. var kolor = getColor(speed);
  1028.  
  1029. var ptA = new OL.Geometry.Point(0, 0);
  1030. var ptB = new OL.Geometry.Point(0, 0);
  1031.  
  1032. var doubletraffic = false;
  1033. var p1 = null;
  1034. var p2 = null;
  1035. var doublepoints = {};
  1036. var wsp1, wsp2, dlon, dlat, dx, dy, label, len, i;
  1037.  
  1038.  
  1039. //wykrycie czy trasa przechodzi dwa razy przez te same punkty, jeżeli tak to rysowanie trasy z odstępem, aby był widoczny przebieg trasy
  1040. for(i=0; i<routewsp.length-1; i++) {
  1041. wsp1 = routewsp[i + 0];
  1042. wsp2 = routewsp[i + 1];
  1043.  
  1044. dlon = Math.abs(wsp1.x - wsp2.x);
  1045. dlat = Math.abs(wsp1.y - wsp2.y);
  1046.  
  1047. if (dlon < 0.0000001 && dlat < 0.0000001) continue;
  1048.  
  1049. var s1 = parseInt(wsp1.x * 10000000 + 0.5) + ',' + parseInt(wsp1.y * 10000000 + 0.5);
  1050. var s2 = parseInt(wsp2.x * 10000000 + 0.5) + ',' + parseInt(wsp2.y * 10000000 + 0.5);
  1051.  
  1052. if (s1 === s2) continue;
  1053.  
  1054. if (doublepoints[s1] === undefined) doublepoints[s1] = 0;
  1055. if (doublepoints[s2] === undefined) doublepoints[s2] = 0;
  1056. doublepoints[s1]++;
  1057. doublepoints[s2]++;
  1058.  
  1059. if (doublepoints[s2] >= 2) {
  1060. doubletraffic = true;
  1061. break;
  1062. }
  1063. }
  1064.  
  1065. var doubletrafficoffset = 0;
  1066. if (doubletraffic) {
  1067. doubletrafficoffset = 11 * Math.pow(2.0, 5-W.map.zoom);
  1068. }
  1069.  
  1070.  
  1071. for(i=0; i<routewsp.length-1; i++) {
  1072. wsp1 = routewsp[i + 0];
  1073. wsp2 = routewsp[i + 1];
  1074.  
  1075. if (i === 0) {
  1076. ptA.x = wsp1.x;
  1077. ptA.y = wsp1.y;
  1078. ptA = ptA.transform(epsg4326, epsg900913);
  1079. //var p = new drc_OL.Geometry.Point(wsp1.x, wsp1.y).transform(epsg4326, epsg900913);
  1080. //var pt = new drc_OL.Geometry.Point(p.x, p.y);
  1081. //var textFeature = new drc_OL.Feature.Vector( ptA, {labelText: "A", pointRadius: 8, fontColor: '#FFFFFF' } );
  1082. //labelFeatures.push(textFeature);
  1083. }
  1084. if (i === routewsp.length-2) {
  1085. ptB.x = wsp2.x;
  1086. ptB.y = wsp2.y;
  1087. ptB = ptB.transform(epsg4326, epsg900913);
  1088. //var p = new drc_OL.Geometry.Point(wsp2.x, wsp2.y).transform(epsg4326, epsg900913);
  1089. //var pt = new drc_OL.Geometry.Point(p.x, p.y);
  1090. //var textFeature = new drc_OL.Feature.Vector( ptB, {labelText: "B", pointRadius: 8, fontColor: '#FFFFFF' } );
  1091. //labelFeatures.push(textFeature);
  1092. }
  1093.  
  1094. dx = Math.abs(wsp1.x - odcx);
  1095. dy = Math.abs(wsp1.y - odcy);
  1096.  
  1097. //console.log(wsp1, odcx, odcy, dx, dy);
  1098.  
  1099. if (dx < 0.000001 && dy < 0.000001) {
  1100.  
  1101. if (!routespeedsoption3) {
  1102. label = addLabel(lines, speedtekst, routespeedsoption2, odctime, odclen, routespeedsoption4, id);
  1103. if (label !== null) labelFeatures.push(label);
  1104. }
  1105. while (lines.length > 0) lines.pop();
  1106.  
  1107. if (odc + 1 < routeodc.length) {
  1108. odc++;
  1109. odclen = routeodc[odc].length;
  1110. if (routespeedsoption7) odctime = routeodc[odc].crossTime;
  1111. else odctime = routeodc[odc].crossTimeWithoutRealTime;
  1112. if (odc + 1 < routeodc.length) {
  1113. odcx = routeodc[odc + 1].path.x;
  1114. odcy = routeodc[odc + 1].path.y;
  1115. }
  1116.  
  1117. speed = 0;
  1118. if (odctime > 0) speed = 3.6 * odclen / odctime;
  1119. speedtekst = parseInt(speed);
  1120. kolor = getColor(speed);
  1121.  
  1122. }
  1123. }
  1124.  
  1125. dlon = Math.abs(wsp1.x - wsp2.x);
  1126. dlat = Math.abs(wsp1.y - wsp2.y);
  1127.  
  1128. if (dlon < 0.0000001 && dlat < 0.0000001) continue;
  1129.  
  1130. var p3 = new OL.Geometry.Point(wsp1.x, wsp1.y).transform(epsg4326, epsg900913);
  1131. var p4 = new OL.Geometry.Point(wsp2.x, wsp2.y).transform(epsg4326, epsg900913);
  1132.  
  1133. if (doubletraffic) {
  1134. dx = p4.x - p3.x;
  1135. dy = p4.y - p3.y;
  1136. var r = Math.sqrt(dx*dx + dy*dy);
  1137. var angle = Math.acos( dx / r );
  1138. if (dy < 0) angle = -angle;
  1139. angle = angle - 0.5 * Math.PI;
  1140. if (leftHand) angle += Math.PI;
  1141.  
  1142. p3.x += doubletrafficoffset * Math.cos(angle) * 0.6;
  1143. p3.y += doubletrafficoffset * Math.sin(angle) * 0.6;
  1144. p4.x += doubletrafficoffset * Math.cos(angle) * 0.6;
  1145. p4.y += doubletrafficoffset * Math.sin(angle) * 0.6;
  1146.  
  1147. if (p1!==null && p2!==null) {
  1148.  
  1149. var Ax = p1.x;
  1150. var Ay = p1.y;
  1151. var Bx = p2.x;
  1152. var By = p2.y;
  1153. var Cx = p3.x;
  1154. var Cy = p3.y;
  1155. var Dx = p4.x;
  1156. var Dy = p4.y;
  1157.  
  1158. dx = Cx - Bx;
  1159. dy = Cy - By;
  1160.  
  1161. var delta = Math.sqrt(dx*dx + dy*dy);
  1162.  
  1163. var mx = ((By-Ay)*(Dx-Cx)-(Dy-Cy)*(Bx-Ax));
  1164. var my = ((Dy-Cy)*(Bx-Ax)-(By-Ay)*(Dx-Cx));
  1165.  
  1166. if ( Math.abs(mx) > 0.000000001 && Math.abs(my) > 0.000000001 && delta > 0.1 ) {
  1167.  
  1168. var x = ((Bx-Ax)*(Dx*Cy-Dy*Cx)-(Dx-Cx)*(Bx*Ay-By*Ax)) / mx;
  1169. var y = ((Dy-Cy)*(Bx*Ay-By*Ax)-(By-Ay)*(Dx*Cy-Dy*Cx)) / my;
  1170.  
  1171. var dx2 = x - Bx;
  1172. var dy2 = y - By;
  1173. var delta2 = Math.sqrt(dx2*dx2 + dy2*dy2);
  1174.  
  1175. if (delta2 < 1000) { // checking if point of crossing is close to segments
  1176.  
  1177. len = lineFeatures.length;
  1178. if (len>0) {
  1179. var lf = lineFeatures[len-1];
  1180. lf.geometry.components[1].x = x;
  1181. lf.geometry.components[1].y = y;
  1182. }
  1183.  
  1184. p3.x = x;
  1185. p3.y = y;
  1186. }
  1187. }
  1188. }
  1189. }
  1190.  
  1191. outlinepoints.push(p3);
  1192. outlinepoints.push(p4);
  1193.  
  1194. var points = [];
  1195. points.push(p3);
  1196. points.push(p4);
  1197.  
  1198. var line = new OL.Geometry.LineString(points);
  1199. lines.push(line);
  1200.  
  1201. var lineFeature = new OL.Feature.Vector(line, { strokeColor: kolor, labelText: '', strokeWidth: 10 } );
  1202.  
  1203. lineFeatures.push(lineFeature);
  1204.  
  1205. p1 = p3;
  1206. p2 = p4;
  1207. }
  1208.  
  1209. if (!routespeedsoption3) {
  1210. label = addLabel(lines, speedtekst, routespeedsoption2, odctime, odclen, routespeedsoption4, id);
  1211. if (label !== null) labelFeatures.push(label);
  1212. }
  1213. while (lines.length > 0) lines.pop();
  1214.  
  1215. var outlinestring = new OL.Geometry.LineString(outlinepoints);
  1216. var outlineFeature = new OL.Feature.Vector(outlinestring, { strokeColor: '#404040', labelText: '', strokeWidth: 12 } );
  1217. routeLayer.addFeatures(outlineFeature);
  1218.  
  1219. routeLayer.addFeatures(lineFeatures);
  1220. routeLayer.addFeatures(labelFeatures);
  1221.  
  1222.  
  1223.  
  1224. var summarylen = 0;
  1225. var summarysec = 0;
  1226. if (routespeedsoption7) {
  1227. for(i=0; i<routeodc.length; i++) {
  1228. summarylen += routeodc[i].length;
  1229. summarysec += routeodc[i].crossTime;
  1230. }
  1231. }
  1232. else {
  1233. for(i=0; i<routeodc.length; i++) {
  1234. summarylen += routeodc[i].length;
  1235. summarysec += routeodc[i].crossTimeWithoutRealTime;
  1236. }
  1237. }
  1238. len = summarylen / 1000.0;
  1239. var sec = summarysec % 60;
  1240. var min = (summarysec - sec) % 3600;
  1241. var hou = (summarysec - sec - min) % 216000;
  1242. min = (min / 60) % 60;
  1243. hou = (hou / 3600);
  1244.  
  1245. var t = '';
  1246. if (hou < 10) t += '0' + hou + ":"; else t += hou + ":";
  1247. if (min < 10) t += '0' + min + ":"; else t += min + ":";
  1248. if (sec < 10) t += '0' + sec;
  1249. else t += sec;
  1250.  
  1251. var lenmph = len / 1.609;
  1252.  
  1253. var avgspeed = (summarylen / 1000.0) / (summarysec / 3600.0);
  1254. if (routespeedsoption4) avgspeed = avgspeed / 1.609;
  1255.  
  1256. var summaryobj;
  1257. if (id==1) summaryobj = getId('routespeeds-summary1');
  1258. if (id==2) summaryobj = getId('routespeeds-summary2');
  1259. if (id==3) summaryobj = getId('routespeeds-summary3');
  1260. if (id==4) summaryobj = getId('routespeeds-summary4');
  1261. if (id==5) summaryobj = getId('routespeeds-summary5');
  1262.  
  1263. var html;
  1264. if (id==1) html = '<div class=routespeeds_header style="background: #4d4dcd; color: #e0e0e0; "></div>' + '<span style="color: #404040;">Route 1</span> ';
  1265. if (id==2) html = '<div class=routespeeds_header style="background: #d34f8a; color: #e0e0e0; "></div>' + '<span style="color: #404040;">Route 2</span> ';
  1266. if (id==3) html = '<div class=routespeeds_header style="background: #188984; color: #e0e0e0; "></div>' + '<span style="color: #404040;">Route 3</span> ';
  1267. if (id==4) html = '<div class=routespeeds_header style="background: #cafa27; color: #404040; "></div>' + '<span style="color: #404040;">Route 4</span> ';
  1268. if (id==5) html = '<div class=routespeeds_header style="background: #ffca3f; color: #e0e0e0; "></div>' + '<span style="color: #404040;">Route 5</span> ';
  1269.  
  1270. var lenstr = precFloat(len,2);
  1271. var u1 = 'km';
  1272. var u2 = 'km&#47;h';
  1273. if (routespeedsoption4) {
  1274. lenstr = precFloat(lenmph,2);
  1275. u1 = 'miles';
  1276. u2 = 'mph';
  1277. }
  1278.  
  1279. html += '<div style="min-width:50px; display:inline-block; text-align:right;" ><b>' + lenstr + '</b></div>';
  1280. html += '<span style="font-size:11px;"> ' + u1 + '</span> &nbsp;<b>' + t + '</b>';
  1281. html += '<div style="display:inline-block; min-width:40px; text-align:right; color:#404040" >' + precFloat(avgspeed,1) + '</div> <span style="font-size:11px;">' + u2 + '</span>';
  1282.  
  1283. summaryobj.innerHTML = html;
  1284.  
  1285. if (id === routeSelected) summaryobj.className = 'routespeeds_summary_classB';
  1286. summaryobj.style.visibility = 'visible';
  1287. }
  1288. //--------------------------------------------------------------------------------------------------------
  1289. function precFloat(f, prec)
  1290. {
  1291. if (!isFinite(f)) return "&mdash;";
  1292.  
  1293. if (f < 0) {
  1294. f -= Math.pow(0.1, prec) * 0.5;
  1295. }
  1296. else {
  1297. f += Math.pow(0.1, prec) * 0.5;
  1298. }
  1299.  
  1300. var ipart = parseInt(f);
  1301. var fpart = Math.abs(f - ipart);
  1302. f = ipart;
  1303.  
  1304. if (fpart === '0') fpart = '0.0';
  1305. fpart += '0000000000000000';
  1306. if (prec) f += fpart.substr(1, prec + 1);
  1307.  
  1308. return f;
  1309. }
  1310. //--------------------------------------------------------------------------------------------------------
  1311. function getElementsByClassName(classname, node) {
  1312. if(!node) node = document.getElementsByTagName("body")[0];
  1313. var a = [];
  1314. var re = new RegExp('\\b' + classname + '\\b');
  1315. var els = node.getElementsByTagName("*");
  1316. for (var i=0,j=els.length; i<j; i++)
  1317. if (re.test(els[i].className)) a.push(els[i]);
  1318. return a;
  1319. }
  1320. //--------------------------------------------------------------------------------------------------------
  1321. function getId(node) {
  1322. return document.getElementById(node);
  1323. }
  1324. //--------------------------------------------------------------------------------------------------------
  1325. function getnowtoday()
  1326. {
  1327. var hour = getId('routespeeds-hour').value;
  1328. var day = getId('routespeeds-day').value;
  1329. if (hour === '---') hour = 'now';
  1330. if (day === '---') day = 'today';
  1331. if (hour === '') hour = 'now';
  1332. if (day === '') day = 'today';
  1333.  
  1334. var t = new Date();
  1335. var thour = (t.getHours() * 60) + t.getMinutes();
  1336. var tnow = (t.getDay() * 1440) + thour;
  1337. var tsel = tnow;
  1338.  
  1339. if (hour === 'now') {
  1340. if (day === "0") tsel = (parseInt(day) * 1440) + thour;
  1341. if (day === "1") tsel = (parseInt(day) * 1440) + thour;
  1342. if (day === "2") tsel = (parseInt(day) * 1440) + thour;
  1343. if (day === "3") tsel = (parseInt(day) * 1440) + thour;
  1344. if (day === "4") tsel = (parseInt(day) * 1440) + thour;
  1345. if (day === "5") tsel = (parseInt(day) * 1440) + thour;
  1346. if (day === "6") tsel = (parseInt(day) * 1440) + thour;
  1347. }
  1348. else {
  1349. if (day === "today") tsel = (t.getDay() * 1440) + parseInt(hour);
  1350. if (day === "0") tsel = (parseInt(day) * 1440) + parseInt(hour);
  1351. if (day === "1") tsel = (parseInt(day) * 1440) + parseInt(hour);
  1352. if (day === "2") tsel = (parseInt(day) * 1440) + parseInt(hour);
  1353. if (day === "3") tsel = (parseInt(day) * 1440) + parseInt(hour);
  1354. if (day === "4") tsel = (parseInt(day) * 1440) + parseInt(hour);
  1355. if (day === "5") tsel = (parseInt(day) * 1440) + parseInt(hour);
  1356. if (day === "6") tsel = (parseInt(day) * 1440) + parseInt(hour);
  1357. }
  1358.  
  1359. //console.log(tsel, tnow, tsel-tnow);
  1360.  
  1361. return tsel - tnow;
  1362. }
  1363. //--------------------------------------------------------------------------------------------------------
  1364. function requestRouteFromLiveMap(x1, y1, x2, y2)
  1365. {
  1366. var atTime = getnowtoday();
  1367.  
  1368. var numRoutes = 1;
  1369. if (routespeedsoption5) numRoutes = parseInt(routespeedsoption6);
  1370. var numPaths = (routespeedsoption5 && routespeedsoption12 && !routespeedsoption15) ? numRoutes * 10 : numRoutes; //Routing Order - last condition disables Try More option
  1371.  
  1372. var routeType = (routespeedsoption13 === 2) ? "DISTANCE" : (routespeedsoption13 === 3) ? "TIME" : "HISTORIC_TIME";
  1373.  
  1374. var avoidTollRoads = routespeedsoption8;
  1375. var avoidPrimaries = routespeedsoption9;
  1376. var avoidTrails = routespeedsoption10;
  1377. var avoidLongTrails = routespeedsoption11;
  1378. var allowUTurns = routespeedsoption14;
  1379. var avoidDifficult = routespeedsoption16;
  1380. var avoidFerries = routespeedsoption17;
  1381.  
  1382. var options = {
  1383. data: [],
  1384. add: function (name, value, defaultValue) {
  1385. if (value !== defaultValue) {
  1386. this.data.push(name + (value ? ":t" : ":f"));
  1387. }
  1388. },
  1389. put: function (name, value) {
  1390. this.data.push(name + (value ? ":t" : ":f"));
  1391. },
  1392. get: function () {
  1393. return this.data.join(",");
  1394. }
  1395. };
  1396.  
  1397. options.add("AVOID_TOLL_ROADS", avoidTollRoads, false);
  1398. options.add("AVOID_PRIMARIES", avoidPrimaries, false);
  1399. options.add("AVOID_DANGEROUS_TURNS", avoidDifficult, false);
  1400. options.add("AVOID_FERRIES", avoidFerries, false);
  1401. options.add("ALLOW_UTURNS", allowUTurns, true);
  1402.  
  1403. if (avoidLongTrails) { options.put("AVOID_LONG_TRAILS", true); }
  1404. else if (avoidTrails) { options.put("AVOID_TRAILS", true); }
  1405. else { options.put("AVOID_LONG_TRAILS", false); }
  1406.  
  1407. var url = getRoutingManager();
  1408. var data = {
  1409. from: "x:" + x1 + " y:" + y1,
  1410. to: "x:" + x2 + " y:" + y2,
  1411. returnJSON: true,
  1412. returnGeometries: true,
  1413. returnInstructions: true,
  1414. timeout: 60000,
  1415. at: atTime,
  1416. type: routeType,
  1417. nPaths: numPaths,
  1418. clientVersion: '4.0.0',
  1419. options: options.get()
  1420. };
  1421.  
  1422. routewait = 1;
  1423.  
  1424. getId('routespeeds-error').innerHTML = "";
  1425.  
  1426. console.time('WME Route Speeds: routing time');
  1427.  
  1428. $.ajax({
  1429. dataType: "json",
  1430. cache: false,
  1431. url: url,
  1432. data: data,
  1433. dataFilter: function(data, dataType) {
  1434. return data.replace(/NaN/g, '0');
  1435. },
  1436. error: function(req, textStatus, errorThrown) {
  1437. var str = "Route request failed" + (textStatus !== null ? " with " + textStatus : "") + "!";
  1438. str += "<br>" + errorThrown;
  1439. handleRouteRequestError(str);
  1440. },
  1441. success: function(json) {
  1442. if (json.error !== undefined) {
  1443. var str = json.error;
  1444. str = str.replace("|", "<br>");
  1445. handleRouteRequestError(str);
  1446. }
  1447. else {
  1448.  
  1449. routewsp1 = [];
  1450. routeodc1 = [];
  1451. routewsp2 = [];
  1452. routeodc2 = [];
  1453. routewsp3 = [];
  1454. routeodc3 = [];
  1455. routewsp4 = [];
  1456. routeodc4 = [];
  1457. routewsp5 = [];
  1458. routeodc5 = [];
  1459.  
  1460.  
  1461. if (json.coords !== undefined) {
  1462. console.log("WME Route Speeds: 1 route received" + " (" + numPaths + " requested)");
  1463.  
  1464. if (routeSelected > 1) routeSelected = 1;
  1465.  
  1466. routewsp1 = json.coords;
  1467. routeodc1 = json.response.results;
  1468.  
  1469. }
  1470. if (json.alternatives !== undefined) {
  1471. console.log("WME Route Speeds: " + json.alternatives.length + " routes received" + " (" + numPaths + " requested)");
  1472.  
  1473. var sortByField = (routespeedsoption13 === 2) ? "length" : routespeedsoption7 ? "crossTime" : "crossTimeWithoutRealTime";
  1474.  
  1475. if (!routespeedsoption15) { // Routing Order
  1476. json.alternatives.sort(function(a, b) {
  1477. var valField = "total_" + sortByField;
  1478. var val = function(r) {
  1479. if (r[valField] !== undefined) return r[valField];
  1480. var val = 0;
  1481. for (var i = 0; i < r.results.length; ++i) {
  1482. val += r.results[i][sortByField];
  1483. }
  1484. return r[valField] = val;
  1485. };
  1486. return val(a.response) - val(b.response);
  1487. });
  1488. } //Routing Order
  1489.  
  1490.  
  1491. if (json.alternatives.length > numRoutes) {
  1492. json.alternatives = json.alternatives.slice(0, numRoutes);
  1493. }
  1494.  
  1495. if (routeSelectedLast) routeSelected = routeSelectedLast;
  1496. if (routeSelected > json.alternatives.length) routeSelected = json.alternatives.length;
  1497.  
  1498. for(var n=0; n<json.alternatives.length; n++) {
  1499.  
  1500. if (n===0) routewsp1 = json.alternatives[n].coords;
  1501. if (n===0) routeodc1 = json.alternatives[n].response.results;
  1502.  
  1503. if (n===1) routewsp2 = json.alternatives[n].coords;
  1504. if (n===1) routeodc2 = json.alternatives[n].response.results;
  1505.  
  1506. if (n===2) routewsp3 = json.alternatives[n].coords;
  1507. if (n===2) routeodc3 = json.alternatives[n].response.results;
  1508.  
  1509. if (n===3) routewsp4 = json.alternatives[n].coords;
  1510. if (n===3) routeodc4 = json.alternatives[n].response.results;
  1511.  
  1512. if (n===4) routewsp5 = json.alternatives[n].coords;
  1513. if (n===4) routeodc5 = json.alternatives[n].response.results;
  1514. }
  1515. }
  1516.  
  1517. rezoom();
  1518. }
  1519.  
  1520. getId('routespeeds-button-livemap').style.backgroundColor = '';
  1521. getId('routespeeds-button-reverse').style.backgroundColor = '';
  1522. },
  1523. complete: function() {
  1524. console.timeEnd('WME Route Speeds: routing time');
  1525. routewait = 0;
  1526. }
  1527. });
  1528. }
  1529. //--------------------------------------------------------------------------------------------------------
  1530. function handleRouteRequestError(message)
  1531. {
  1532. console.log("WME Route Speeds: route request error: " + message.replace("<br>", "\n"));
  1533.  
  1534. getId('routespeeds-button-livemap').style.backgroundColor = '';
  1535. getId('routespeeds-button-reverse').style.backgroundColor = '';
  1536.  
  1537. getId('routespeeds-summary1').innerHTML = '';
  1538. getId('routespeeds-summary2').innerHTML = '';
  1539. getId('routespeeds-summary3').innerHTML = '';
  1540. getId('routespeeds-summary4').innerHTML = '';
  1541. getId('routespeeds-summary5').innerHTML = '';
  1542.  
  1543. getId('routespeeds-summary1').style.visibility = 'hidden';
  1544. getId('routespeeds-summary2').style.visibility = 'hidden';
  1545. getId('routespeeds-summary3').style.visibility = 'hidden';
  1546. getId('routespeeds-summary4').style.visibility = 'hidden';
  1547. getId('routespeeds-summary5').style.visibility = 'hidden';
  1548.  
  1549. var WM = window.W.map;
  1550. var rlayers1 = WM.getLayersBy("uniqueName","__DrawRouteSpeeds1");
  1551. var rlayers2 = WM.getLayersBy("uniqueName","__DrawRouteSpeeds2");
  1552. var rlayers3 = WM.getLayersBy("uniqueName","__DrawRouteSpeeds3");
  1553. var rlayers4 = WM.getLayersBy("uniqueName","__DrawRouteSpeeds4");
  1554. var rlayers5 = WM.getLayersBy("uniqueName","__DrawRouteSpeeds5");
  1555. var routeLayer1 = rlayers1[0];
  1556. var routeLayer2 = rlayers2[0];
  1557. var routeLayer3 = rlayers3[0];
  1558. var routeLayer4 = rlayers4[0];
  1559. var routeLayer5 = rlayers5[0];
  1560. if (routeLayer1 !== undefined) routeLayer1.removeAllFeatures();
  1561. if (routeLayer2 !== undefined) routeLayer2.removeAllFeatures();
  1562. if (routeLayer3 !== undefined) routeLayer3.removeAllFeatures();
  1563. if (routeLayer4 !== undefined) routeLayer4.removeAllFeatures();
  1564. if (routeLayer5 !== undefined) routeLayer5.removeAllFeatures();
  1565.  
  1566. getId('routespeeds-error').innerHTML = "<br>" + message;
  1567. }
  1568. //--------------------------------------------------------------------------------------------------------
  1569. function livemapRouteClick()
  1570. {
  1571. routeSelected = 1;
  1572. routeSelectedLast = 0;
  1573.  
  1574. livemapRoute();
  1575. }
  1576. //--------------------------------------------------------------------------------------------------------
  1577. function get_coords_from_livemap_link(link) {
  1578.  
  1579. var lon1 = '';
  1580. var lat1 = '';
  1581. var lon2 = '';
  1582. var lat2 = '';
  1583.  
  1584. var opt = link.split('&');
  1585. for(var i=0; i<opt.length; i++) {
  1586. var o = opt[i];
  1587.  
  1588. if (o.indexOf('from_lon=')===0) lon1 = o.substring(9, 30);
  1589. if (o.indexOf('from_lat=')===0) lat1 = ', ' + o.substring(9, 30);
  1590. if (o.indexOf('to_lon=')===0) lon2 = o.substring(7, 30);
  1591. if (o.indexOf('to_lat=')===0) lat2 = ', ' + o.substring(7, 30);
  1592. }
  1593.  
  1594. getId('sidepanel-routespeeds-a').value = lon1 + lat1;
  1595. getId('sidepanel-routespeeds-b').value = lon2 + lat2;
  1596. }
  1597. //--------------------------------------------------------------------------------------------------------
  1598. function livemapRoute() {
  1599.  
  1600. if (routespeedsoption1) return;
  1601. if (routewait) return;
  1602.  
  1603. routewsp1 = [];
  1604. routeodc1 = [];
  1605. routewsp2 = [];
  1606. routeodc2 = [];
  1607. routewsp3 = [];
  1608. routeodc3 = [];
  1609. routewsp4 = [];
  1610. routeodc4 = [];
  1611. routewsp5 = [];
  1612. routeodc5 = [];
  1613.  
  1614. var stra = getId('sidepanel-routespeeds-a').value;
  1615. var strb = getId('sidepanel-routespeeds-b').value;
  1616.  
  1617. var pastedlink = false;
  1618.  
  1619. //sprawdzenie czy wklejono link z LiveMap, jeżeli tak to sparsowanie i przeformatowanie współrzędnych oraz przeniesienie widoku mapy na miejsce wklejonej trasy
  1620. if (stra.indexOf('livemap?')>=0 || stra.indexOf('livemap/?')>=0) {
  1621. get_coords_from_livemap_link(stra);
  1622. stra = getId('sidepanel-routespeeds-a').value;
  1623. strb = getId('sidepanel-routespeeds-b').value;
  1624. pastedlink = true;
  1625. }
  1626. else if (strb.indexOf('livemap?')>=0 || strb.indexOf('livemap/?')>=0) {
  1627. get_coords_from_livemap_link(strb);
  1628. stra = getId('sidepanel-routespeeds-a').value;
  1629. strb = getId('sidepanel-routespeeds-b').value;
  1630. pastedlink = true;
  1631. }
  1632.  
  1633. stra = getId('sidepanel-routespeeds-a').value;
  1634. strb = getId('sidepanel-routespeeds-b').value;
  1635. if (stra === "") return;
  1636. if (strb === "") return;
  1637.  
  1638. var p1 = stra.split(",");
  1639. var p2 = strb.split(",");
  1640.  
  1641. if (p1.length < 2) return;
  1642. if (p2.length < 2) return;
  1643.  
  1644. var x1 = p1[0].trim();
  1645. var y1 = p1[1].trim();
  1646. var x2 = p2[0].trim();
  1647. var y2 = p2[1].trim();
  1648.  
  1649. x1 = parseFloat(x1);
  1650. y1 = parseFloat(y1);
  1651. x2 = parseFloat(x2);
  1652. y2 = parseFloat(y2);
  1653.  
  1654. if (isNaN(x1)) return;
  1655. if (isNaN(y1)) return;
  1656. if (isNaN(x2)) return;
  1657. if (isNaN(y2)) return;
  1658.  
  1659. if (x1 < -180 || x1 > 180) x1 = 0;
  1660. if (x2 < -180 || x2 > 180) x2 = 0;
  1661. if (y1 < -90 || y1 > 90) y1 = 0;
  1662. if (y2 < -90 || y2 > 90) y2 = 0;
  1663.  
  1664. var objprog1 = getId('routespeeds-button-livemap');
  1665. objprog1.style.backgroundColor = '#FF8000';
  1666.  
  1667. createMarkers(x1, y1, x2, y2, true);
  1668.  
  1669. if (pastedlink) {
  1670. clickA();
  1671. }
  1672.  
  1673. requestRouteFromLiveMap(x1, y1, x2, y2);
  1674. }
  1675. //--------------------------------------------------------------------------------------------------------
  1676. function reverseRoute() {
  1677.  
  1678. if (routespeedsoption1) return;
  1679. if (routewait) return;
  1680.  
  1681. routewsp1 = [];
  1682. routeodc1 = [];
  1683. routewsp2 = [];
  1684. routeodc2 = [];
  1685. routewsp3 = [];
  1686. routeodc3 = [];
  1687. routewsp4 = [];
  1688. routeodc4 = [];
  1689. routewsp5 = [];
  1690. routeodc5 = [];
  1691.  
  1692. var stra = getId('sidepanel-routespeeds-b').value;
  1693. var strb = getId('sidepanel-routespeeds-a').value;
  1694. if (stra === "") return;
  1695. if (strb === "") return;
  1696.  
  1697. getId('sidepanel-routespeeds-a').value = stra;
  1698. getId('sidepanel-routespeeds-b').value = strb;
  1699.  
  1700. var p1 = stra.split(",");
  1701. var p2 = strb.split(",");
  1702.  
  1703. if (p1.length < 2) return;
  1704. if (p2.length < 2) return;
  1705.  
  1706. var x1 = p1[0].trim();
  1707. var y1 = p1[1].trim();
  1708. var x2 = p2[0].trim();
  1709. var y2 = p2[1].trim();
  1710.  
  1711. x1 = parseFloat(x1);
  1712. y1 = parseFloat(y1);
  1713. x2 = parseFloat(x2);
  1714. y2 = parseFloat(y2);
  1715.  
  1716. if (isNaN(x1)) return;
  1717. if (isNaN(y1)) return;
  1718. if (isNaN(x2)) return;
  1719. if (isNaN(y2)) return;
  1720.  
  1721. if (x1 < -180 || x1 > 180) x1 = 0;
  1722. if (x2 < -180 || x2 > 180) x2 = 0;
  1723. if (y1 < -90 || y1 > 90) y1 = 0;
  1724. if (y2 < -90 || y2 > 90) y2 = 0;
  1725.  
  1726. var objprog2 = getId('routespeeds-button-reverse');
  1727. objprog2.style.backgroundColor = '#FF8000';
  1728.  
  1729. createMarkers(x1, y1, x2, y2, true);
  1730.  
  1731. requestRouteFromLiveMap(x1, y1, x2, y2);
  1732. }
  1733. //--------------------------------------------------------------------------------------------------------
  1734. function resetOptions() {
  1735.  
  1736. getId('routespeeds-option5').checked = routespeedsoption5 = true;
  1737. getId('routespeeds-option6').value = routespeedsoption6 = 3;
  1738. getId('routespeeds-option12').checked = routespeedsoption12 = false;
  1739.  
  1740. getId('routespeeds-option7').checked = routespeedsoption7 = false;
  1741.  
  1742. getId('routespeeds-option13').value = routespeedsoption13 = 1;
  1743.  
  1744. getId('routespeeds-option8').checked = routespeedsoption8 = false;
  1745. getId('routespeeds-option9').checked = routespeedsoption9 = false;
  1746. getId('routespeeds-option10').checked = routespeedsoption10 = true;
  1747. getId('routespeeds-option11').checked = routespeedsoption11 = false;
  1748. getId('routespeeds-option14').checked = routespeedsoption14 = true;
  1749. getId('routespeeds-option15').checked = routespeedsoption15 = false;
  1750. getId('routespeeds-option16').checked = routespeedsoption16 = false;
  1751. getId('routespeeds-option17').checked = routespeedsoption17 = false;
  1752.  
  1753. update_adv_switches();
  1754. }
  1755. //--------------------------------------------------------------------------------------------------------
  1756. function resetOptionsToLivemapRouteClick() {
  1757. if (routewait) return;
  1758.  
  1759. resetOptions();
  1760.  
  1761. livemapRoute();
  1762. }
  1763. //--------------------------------------------------------------------------------------------------------
  1764. function hourChange() {
  1765.  
  1766. livemapRoute();
  1767. }
  1768. //--------------------------------------------------------------------------------------------------------
  1769. function dayChange() {
  1770.  
  1771. livemapRoute();
  1772. }
  1773. //--------------------------------------------------------------------------------------------------------
  1774. function clickA() { gotoMarker(markerA); }
  1775. function clickB() { gotoMarker(markerB); }
  1776. //--------------------------------------------------------------------------------------------------------
  1777. function gotoMarker(marker) {
  1778.  
  1779. if (routespeedsoption1 || marker === undefined || !marker.created) return;
  1780.  
  1781. var pt = marker.lonlat.toPoint();
  1782. var zoom = window.W.map.getZoom();
  1783.  
  1784. window.W.map.setCenter([pt.x, pt.y], zoom);
  1785. }
  1786. //--------------------------------------------------------------------------------------------------------
  1787. function clickOption1()
  1788. {
  1789. var WM = window.W.map;
  1790.  
  1791. routespeedsoption1 = (getId('routespeeds-option1').checked === true);
  1792.  
  1793. if (routespeedsoption1) {
  1794. getId('sidepanel-routespeeds').style.color = "#A0A0A0";
  1795.  
  1796. getId('routespeeds-summary1').innerHTML = '';
  1797. getId('routespeeds-summary2').innerHTML = '';
  1798. getId('routespeeds-summary3').innerHTML = '';
  1799. getId('routespeeds-summary4').innerHTML = '';
  1800. getId('routespeeds-summary5').innerHTML = '';
  1801.  
  1802. getId('routespeeds-summary1').style.visibility = 'hidden';
  1803. getId('routespeeds-summary2').style.visibility = 'hidden';
  1804. getId('routespeeds-summary3').style.visibility = 'hidden';
  1805. getId('routespeeds-summary4').style.visibility = 'hidden';
  1806. getId('routespeeds-summary5').style.visibility = 'hidden';
  1807.  
  1808. var rlayers1 = WM.getLayersBy("uniqueName","__DrawRouteSpeeds1");
  1809. var rlayers2 = WM.getLayersBy("uniqueName","__DrawRouteSpeeds2");
  1810. var rlayers3 = WM.getLayersBy("uniqueName","__DrawRouteSpeeds3");
  1811. var rlayers4 = WM.getLayersBy("uniqueName","__DrawRouteSpeeds4");
  1812. var rlayers5 = WM.getLayersBy("uniqueName","__DrawRouteSpeeds5");
  1813. var routeLayer1 = rlayers1[0];
  1814. var routeLayer2 = rlayers2[0];
  1815. var routeLayer3 = rlayers3[0];
  1816. var routeLayer4 = rlayers4[0];
  1817. var routeLayer5 = rlayers5[0];
  1818.  
  1819. if (routeLayer1 !== undefined) routeLayer1.removeAllFeatures();
  1820. if (routeLayer2 !== undefined) routeLayer2.removeAllFeatures();
  1821. if (routeLayer3 !== undefined) routeLayer3.removeAllFeatures();
  1822. if (routeLayer4 !== undefined) routeLayer4.removeAllFeatures();
  1823. if (routeLayer5 !== undefined) routeLayer5.removeAllFeatures();
  1824.  
  1825. showMarkers(false);
  1826. showClosures(0);
  1827. }
  1828. else {
  1829. getId('sidepanel-routespeeds').style.color = "";
  1830.  
  1831. if (showMarkers(true)) livemapRoute();
  1832. showClosures(1);
  1833. }
  1834. }
  1835. //--------------------------------------------------------------------------------------------------------
  1836. function clickOption2()
  1837. {
  1838. routespeedsoption2 = (getId('routespeeds-option2').checked === true);
  1839. livemapRoute();
  1840. }
  1841. //--------------------------------------------------------------------------------------------------------
  1842. function clickOption3()
  1843. {
  1844. routespeedsoption3 = (getId('routespeeds-option3').checked === true);
  1845. livemapRoute();
  1846. }
  1847. //--------------------------------------------------------------------------------------------------------
  1848. function clickOption4()
  1849. {
  1850. routespeedsoption4 = (getId('routespeeds-option4').checked === true);
  1851. livemapRoute();
  1852. }
  1853. //--------------------------------------------------------------------------------------------------------
  1854. function clickOption5()
  1855. {
  1856. routeSelected = 1;
  1857. routeSelectedLast = 0;
  1858.  
  1859. routespeedsoption5 = (getId('routespeeds-option5').checked === true);
  1860. getId('routespeeds-option5-span').style.display = routespeedsoption5 ? 'inline' : 'none';
  1861. livemapRoute();
  1862. }
  1863. //--------------------------------------------------------------------------------------------------------
  1864. function clickOption6()
  1865. {
  1866. routespeedsoption5 = (getId('routespeeds-option5').checked === true);
  1867. update_adv_switches();
  1868.  
  1869. routespeedsoption6 = parseInt(getId('routespeeds-option6').value);
  1870. livemapRoute();
  1871. }
  1872. //--------------------------------------------------------------------------------------------------------
  1873. function clickOption7()
  1874. {
  1875. routespeedsoption7 = (getId('routespeeds-option7').checked === true);
  1876. livemapRoute();
  1877. }
  1878. //--------------------------------------------------------------------------------------------------------
  1879. function clickOption8()
  1880. {
  1881. routespeedsoption8 = (getId('routespeeds-option8').checked === true);
  1882. livemapRoute();
  1883. }
  1884. //--------------------------------------------------------------------------------------------------------
  1885. function clickOption9()
  1886. {
  1887. routespeedsoption9 = (getId('routespeeds-option9').checked === true);
  1888. livemapRoute();
  1889. }
  1890. //--------------------------------------------------------------------------------------------------------
  1891. function clickOption10()
  1892. {
  1893. routespeedsoption10 = (getId('routespeeds-option10').checked === true);
  1894.  
  1895. routespeedsoption11 = false;
  1896. getId('routespeeds-option11').checked = false;
  1897.  
  1898. update_adv_switches();
  1899. livemapRoute();
  1900. }
  1901. //--------------------------------------------------------------------------------------------------------
  1902. function clickOption11()
  1903. {
  1904. routespeedsoption11 = (getId('routespeeds-option11').checked === true);
  1905.  
  1906. routespeedsoption10 = false;
  1907. getId('routespeeds-option10').checked = false;
  1908.  
  1909. update_adv_switches();
  1910. livemapRoute();
  1911. }
  1912. //--------------------------------------------------------------------------------------------------------
  1913. function clickOption12()
  1914. {
  1915. routespeedsoption12 = (getId('routespeeds-option12').checked === true);
  1916. livemapRoute();
  1917. }
  1918. //--------------------------------------------------------------------------------------------------------
  1919. function clickOption13()
  1920. {
  1921. routespeedsoption13 = parseInt(getId('routespeeds-option13').value);
  1922. livemapRoute();
  1923. }
  1924. //--------------------------------------------------------------------------------------------------------
  1925. function clickOption14()
  1926. {
  1927. routespeedsoption14 = (getId('routespeeds-option14').checked === true);
  1928. livemapRoute();
  1929. }
  1930. //--------------------------------------------------------------------------------------------------------
  1931. function clickOption15()
  1932. {
  1933. routespeedsoption15 = (getId('routespeeds-option15').checked === true);
  1934. livemapRoute();
  1935. }
  1936. //--------------------------------------------------------------------------------------------------------
  1937. function clickOption16()
  1938. {
  1939. routespeedsoption16 = (getId('routespeeds-option16').checked === true);
  1940. livemapRoute();
  1941. }
  1942. //--------------------------------------------------------------------------------------------------------
  1943. function clickOption17()
  1944. {
  1945. routespeedsoption17 = (getId('routespeeds-option17').checked === true);
  1946. livemapRoute();
  1947. }
  1948. //--------------------------------------------------------------------------------------------------------
  1949. function clickRoute1() { toggleRoute(1); }
  1950. function clickRoute2() { toggleRoute(2); }
  1951. function clickRoute3() { toggleRoute(3); }
  1952. function clickRoute4() { toggleRoute(4); }
  1953. function clickRoute5() { toggleRoute(5); }
  1954. //--------------------------------------------------------------------------------------------------------
  1955. function toggleRoute(routeNo) {
  1956. if (routeSelected === routeNo) routeNo = 0;
  1957. routeSelectedLast = routeSelected = routeNo;
  1958. switchRoute();
  1959. }
  1960. //--------------------------------------------------------------------------------------------------------
  1961. function switchRoute()
  1962. {
  1963. var WM = window.W.map;
  1964. var OL = window.OL;
  1965.  
  1966. if (routeSelected==1) getId('routespeeds-summary1').className = 'routespeeds_summary_classB';
  1967. else getId('routespeeds-summary1').className = 'routespeeds_summary_classA';
  1968. if (routeSelected==2) getId('routespeeds-summary2').className = 'routespeeds_summary_classB';
  1969. else getId('routespeeds-summary2').className = 'routespeeds_summary_classA';
  1970. if (routeSelected==3) getId('routespeeds-summary3').className = 'routespeeds_summary_classB';
  1971. else getId('routespeeds-summary3').className = 'routespeeds_summary_classA';
  1972. if (routeSelected==4) getId('routespeeds-summary4').className = 'routespeeds_summary_classB';
  1973. else getId('routespeeds-summary4').className = 'routespeeds_summary_classA';
  1974. if (routeSelected==5) getId('routespeeds-summary5').className = 'routespeeds_summary_classB';
  1975. else getId('routespeeds-summary5').className = 'routespeeds_summary_classA';
  1976.  
  1977. var rlayers1 = WM.getLayersBy("uniqueName","__DrawRouteSpeeds1");
  1978. var rlayers2 = WM.getLayersBy("uniqueName","__DrawRouteSpeeds2");
  1979. var rlayers3 = WM.getLayersBy("uniqueName","__DrawRouteSpeeds3");
  1980. var rlayers4 = WM.getLayersBy("uniqueName","__DrawRouteSpeeds4");
  1981. var rlayers5 = WM.getLayersBy("uniqueName","__DrawRouteSpeeds5");
  1982. var routeLayer1 = rlayers1[0];
  1983. var routeLayer2 = rlayers2[0];
  1984. var routeLayer3 = rlayers3[0];
  1985. var routeLayer4 = rlayers4[0];
  1986. var routeLayer5 = rlayers5[0];
  1987. if (routeLayer1 === undefined) return;
  1988. if (routeLayer2 === undefined) return;
  1989. if (routeLayer3 === undefined) return;
  1990. if (routeLayer4 === undefined) return;
  1991. if (routeLayer5 === undefined) return;
  1992.  
  1993. var style1 = routeLayer1.styleMap.styles.default.defaultStyle;
  1994. var style2 = routeLayer2.styleMap.styles.default.defaultStyle;
  1995. var style3 = routeLayer3.styleMap.styles.default.defaultStyle;
  1996. var style4 = routeLayer4.styleMap.styles.default.defaultStyle;
  1997. var style5 = routeLayer5.styleMap.styles.default.defaultStyle;
  1998.  
  1999. var s1 = style1.strokeColor;
  2000. var s2 = style2.strokeColor;
  2001. var s3 = style3.strokeColor;
  2002. var s4 = style4.strokeColor;
  2003. var s5 = style5.strokeColor;
  2004.  
  2005. var t1 = style1.label;
  2006. var t2 = style2.label;
  2007. var t3 = style3.label;
  2008. var t4 = style4.label;
  2009. var t5 = style5.label;
  2010.  
  2011. style1.strokeColor = '#4d4dcd';
  2012. style2.strokeColor = '#d34f8a';
  2013. style3.strokeColor = '#188984';
  2014. style4.strokeColor = '#cafa27';
  2015. style5.strokeColor = '#ffca3f';
  2016. //style1.strokeColor = '#76768f';
  2017. //style2.strokeColor = '#917682';
  2018. //style3.strokeColor = '#6b8a88';
  2019. //style4.strokeColor = '#998f73';
  2020. //style5.strokeColor = '#769178';
  2021. //style1.strokeColor = '#7070a0';
  2022. //style2.strokeColor = '#a07070';
  2023. //style3.strokeColor = '#70a070';
  2024. //style4.strokeColor = '#a0a070';
  2025. //style5.strokeColor = '#a070a0';
  2026. style1.strokeWidth = 5;
  2027. style2.strokeWidth = 5;
  2028. style3.strokeWidth = 5;
  2029. style4.strokeWidth = 5;
  2030. style5.strokeWidth = 5;
  2031. style1.label = '';
  2032. style2.label = '';
  2033. style3.label = '';
  2034. style4.label = '';
  2035. style5.label = '';
  2036.  
  2037. if (routeSelected === 0 || routeSelected === 1) { style1.strokeColor = '${strokeColor}'; style1.strokeWidth = '${strokeWidth}'; style1.label = '${labelText}'; }
  2038. if (routeSelected === 0 || routeSelected === 2) { style2.strokeColor = '${strokeColor}'; style2.strokeWidth = '${strokeWidth}'; style2.label = '${labelText}'; }
  2039. if (routeSelected === 0 || routeSelected === 3) { style3.strokeColor = '${strokeColor}'; style3.strokeWidth = '${strokeWidth}'; style3.label = '${labelText}'; }
  2040. if (routeSelected === 0 || routeSelected === 4) { style4.strokeColor = '${strokeColor}'; style4.strokeWidth = '${strokeWidth}'; style4.label = '${labelText}'; }
  2041. if (routeSelected === 0 || routeSelected === 5) { style5.strokeColor = '${strokeColor}'; style5.strokeWidth = '${strokeWidth}'; style5.label = '${labelText}'; }
  2042.  
  2043. var z1 = parseInt(routeLayer1.getZIndex());
  2044. var z2 = parseInt(routeLayer2.getZIndex());
  2045. var z3 = parseInt(routeLayer3.getZIndex());
  2046. var z4 = parseInt(routeLayer4.getZIndex());
  2047. var z5 = parseInt(routeLayer5.getZIndex());
  2048. var z;
  2049.  
  2050. if (z1 > z2) { z = z1; z1 = z2; z2 = z; }
  2051. if (z1 > z3) { z = z1; z1 = z3; z3 = z; }
  2052. if (z1 > z4) { z = z1; z1 = z4; z4 = z; }
  2053. if (z1 > z5) { z = z1; z1 = z5; z5 = z; }
  2054. if (z2 > z3) { z = z2; z2 = z3; z3 = z; }
  2055. if (z2 > z4) { z = z2; z2 = z4; z4 = z; }
  2056. if (z2 > z5) { z = z2; z2 = z5; z5 = z; }
  2057. if (z3 > z4) { z = z3; z3 = z4; z4 = z; }
  2058. if (z3 > z5) { z = z3; z3 = z5; z5 = z; }
  2059. if (z4 > z5) { z = z4; z4 = z5; z5 = z; }
  2060.  
  2061. //wlodek76: finding closure layer and changing its zindex to hide it under Route Speeds layer
  2062. // we cannot easily set route speed layer over markers because it will block access to elements on these layers
  2063. var clayers = WM.getLayersBy( "uniqueName", "closures" );
  2064. if (clayers[0] !== undefined && closurelayer === null) {
  2065.  
  2066. closurelayer = clayers[0];
  2067. closurelayerZINDEX[0] = clayers[0].getZIndex();
  2068. closurelayerZINDEX[1] = z1 - 5;
  2069.  
  2070. closurelayer.setZIndex( closurelayerZINDEX[1] );
  2071. closurelayer.redraw();
  2072. }
  2073.  
  2074. if (routeSelected <= 1) { routeLayer1.setZIndex(z5); routeLayer2.setZIndex(z4); routeLayer3.setZIndex(z3); routeLayer4.setZIndex(z2); routeLayer5.setZIndex(z1); }
  2075. if (routeSelected === 2) { routeLayer1.setZIndex(z4); routeLayer2.setZIndex(z5); routeLayer3.setZIndex(z3); routeLayer4.setZIndex(z2); routeLayer5.setZIndex(z1); }
  2076. if (routeSelected === 3) { routeLayer1.setZIndex(z4); routeLayer2.setZIndex(z3); routeLayer3.setZIndex(z5); routeLayer4.setZIndex(z2); routeLayer5.setZIndex(z1); }
  2077. if (routeSelected === 4) { routeLayer1.setZIndex(z4); routeLayer2.setZIndex(z3); routeLayer3.setZIndex(z2); routeLayer4.setZIndex(z5); routeLayer5.setZIndex(z1); }
  2078. if (routeSelected === 5) { routeLayer1.setZIndex(z4); routeLayer2.setZIndex(z3); routeLayer3.setZIndex(z2); routeLayer4.setZIndex(z1); routeLayer5.setZIndex(z5); }
  2079.  
  2080. if (t1 !== style1.label || s1 !== style1.strokeColor) routeLayer1.redraw();
  2081. if (t2 !== style2.label || s2 !== style2.strokeColor) routeLayer2.redraw();
  2082. if (t3 !== style3.label || s3 !== style3.strokeColor) routeLayer3.redraw();
  2083. if (t4 !== style4.label || s4 !== style4.strokeColor) routeLayer4.redraw();
  2084. if (t5 !== style5.label || s5 !== style5.strokeColor) routeLayer5.redraw();
  2085. }
  2086. //--------------------------------------------------------------------------------------------------------
  2087. function showClosures(mode) {
  2088. if (closurelayer !== null && closurelayerZINDEX.length==2) {
  2089. closurelayer.setZIndex( closurelayerZINDEX[mode] );
  2090. closurelayer.redraw();
  2091. }
  2092. }
  2093. //--------------------------------------------------------------------------------------------------------
  2094. function rezoom() {
  2095.  
  2096. var WM = window.W.map;
  2097. var OL = window.OL;
  2098.  
  2099. var rlayers1 = WM.getLayersBy("uniqueName","__DrawRouteSpeeds1");
  2100. var rlayers2 = WM.getLayersBy("uniqueName","__DrawRouteSpeeds2");
  2101. var rlayers3 = WM.getLayersBy("uniqueName","__DrawRouteSpeeds3");
  2102. var rlayers4 = WM.getLayersBy("uniqueName","__DrawRouteSpeeds4");
  2103. var rlayers5 = WM.getLayersBy("uniqueName","__DrawRouteSpeeds5");
  2104.  
  2105. var routeLayer1 = rlayers1[0];
  2106. var routeLayer2 = rlayers2[0];
  2107. var routeLayer3 = rlayers3[0];
  2108. var routeLayer4 = rlayers4[0];
  2109. var routeLayer5 = rlayers5[0];
  2110.  
  2111. if (routeLayer1 !== undefined) routeLayer1.removeAllFeatures();
  2112. if (routeLayer2 !== undefined) routeLayer2.removeAllFeatures();
  2113. if (routeLayer3 !== undefined) routeLayer3.removeAllFeatures();
  2114. if (routeLayer4 !== undefined) routeLayer4.removeAllFeatures();
  2115. if (routeLayer5 !== undefined) routeLayer5.removeAllFeatures();
  2116.  
  2117. getId('routespeeds-summary1').innerHTML = '';
  2118. getId('routespeeds-summary2').innerHTML = '';
  2119. getId('routespeeds-summary3').innerHTML = '';
  2120. getId('routespeeds-summary4').innerHTML = '';
  2121. getId('routespeeds-summary5').innerHTML = '';
  2122.  
  2123. getId('routespeeds-summary1').className = 'routespeeds_summary_classA';
  2124. getId('routespeeds-summary2').className = 'routespeeds_summary_classA';
  2125. getId('routespeeds-summary3').className = 'routespeeds_summary_classA';
  2126. getId('routespeeds-summary4').className = 'routespeeds_summary_classA';
  2127. getId('routespeeds-summary5').className = 'routespeeds_summary_classA';
  2128.  
  2129. getId('routespeeds-summary1').style.visibility = 'hidden';
  2130. getId('routespeeds-summary2').style.visibility = 'hidden';
  2131. getId('routespeeds-summary3').style.visibility = 'hidden';
  2132. getId('routespeeds-summary4').style.visibility = 'hidden';
  2133. getId('routespeeds-summary5').style.visibility = 'hidden';
  2134.  
  2135. switchRoute();
  2136.  
  2137. if (routewsp1.length>=2 && routeodc1.length>=1) {
  2138. createRouteFeatures(1, routewsp1, routeodc1);
  2139. }
  2140.  
  2141. if (routewsp2.length>=2 && routeodc2.length>=1) {
  2142. createRouteFeatures(2, routewsp2, routeodc2);
  2143. }
  2144.  
  2145. if (routewsp3.length>=2 && routeodc3.length>=1) {
  2146. createRouteFeatures(3, routewsp3, routeodc3);
  2147. }
  2148.  
  2149. if (routewsp4.length>=2 && routeodc4.length>=1) {
  2150. createRouteFeatures(4, routewsp4, routeodc4);
  2151. }
  2152.  
  2153. if (routewsp5.length>=2 && routeodc5.length>=1) {
  2154. createRouteFeatures(5, routewsp5, routeodc5);
  2155.  
  2156. }
  2157. }
  2158. //--------------------------------------------------------------------------------------------------------
  2159. function enterAB(ev) {
  2160. if (ev.keyCode === 13) {
  2161. livemapRoute();
  2162. }
  2163. }
  2164. //--------------------------------------------------------------------------------------------------------
  2165. function initialiseWMERouteSpeeds()
  2166. {
  2167. var line_div_break = '<br>';
  2168. line_div_break += '</div>';
  2169. line_div_break += '<div style="margin-left:55px">';
  2170.  
  2171. if (typeof W === 'undefined') W = window.W;
  2172. if (typeof W.loginManager === 'undefined') W.loginManager = window.W.loginManager;
  2173. if (typeof W.loginManager === 'undefined') W.loginManager = window.loginManager;
  2174. if (W.loginManager !== null && W.loginManager.isLoggedIn()) {
  2175. var user = W.loginManager.user;
  2176. //console.log(user);
  2177.  
  2178. //wlodek76: I prefer more condensed lines for avoid options, so I've added a personal switch here
  2179. if(user !== null) {
  2180. if (user.userName === "wlodek76" && user.id === 203457007) {
  2181. line_div_break = '';
  2182. }
  2183. }
  2184. }
  2185.  
  2186.  
  2187. var addon = document.createElement('section');
  2188. addon.id = "routespeeds-addon";
  2189. addon.innerHTML = '' +
  2190. '<b style="margin:0px; padding:0px;"><a href="https://greasyfork.org/en/scripts/369630-wme-route-speeds-mapomatic-fork" target="_blank"><u>WME Route Speeds</u></a></b> &nbsp; v' + wmech_version +
  2191. '<style>\n' +
  2192. '#sidepanel-routespeeds select { margin-left:20px; font-size:12px; height:22px; border:1px solid; border-color:rgb(169, 169, 169); border-radius:4px; border: 1px solid; border-color: rgb(169, 169, 169); -webkit-border-radius:4px; -moz-border-radius:4px; }\n' +
  2193. '#sidepanel-routespeeds select, #sidepanel-routespeeds input { margin-top:2px; margin-bottom:2px; width:initial; }\n' +
  2194. '#sidepanel-routespeeds input[type="checkbox"] { margin-bottom:0px; }\n' +
  2195. '#sidepanel-routespeeds label ~ label, #sidepanel-routespeeds span label { margin-left:20px; }\n' +
  2196. '</style>' +
  2197.  
  2198. '<br><br>' +
  2199. '<div style="float:left; display:inline-block;">' +
  2200. '<a id="routespeeds-button-A" onclick="return false;" style="cursor:pointer; width:20px; display:inline-block; vertical-align:middle;" title="Center map on A marker">A:</a>' +
  2201. '<input id="sidepanel-routespeeds-a" class="form-control" style="width:165px; padding:6px; margin:0px; display:inline;" type="text" name=""/>' +
  2202. '<br><div style="height: 4px;"></div>' +
  2203. '<a id="routespeeds-button-B" onclick="return false;" style="cursor:pointer; width:20px; display:inline-block; vertical-align:middle;" title="Center map on B marker">B:</a>' +
  2204. '<input id="sidepanel-routespeeds-b" class="form-control" style="width:165px; padding:6px; margin:0px; display:inline;" type="text" name=""/>' +
  2205. '</div>' +
  2206. '<div style="float:right; padding-right:20px; padding-top:6%; ">' +
  2207. '<button id=routespeeds-button-reverse class="btn btn-default" style="padding-left:15px; padding-right:15px;" title="Calculate reverse route" >A &#8596; B</button></div>' +
  2208. '<div style="clear:both; "></div>' +
  2209.  
  2210. '<div style="margin-top:8px;">' +
  2211. '<select id=routespeeds-hour>' +
  2212. '<option value="now">Now</option>' +
  2213. '<option value="0" >00:00</option>' +
  2214. '<option value="30" >00:30</option>' +
  2215. '<option value="60" >01:00</option>' +
  2216. '<option value="90" >01:30</option>' +
  2217. '<option value="120">02:00</option>' +
  2218. '<option value="150">02:30</option>' +
  2219. '<option value="180">03:00</option>' +
  2220. '<option value="210">03:30</option>' +
  2221. '<option value="240">04:00</option>' +
  2222. '<option value="270">04:30</option>' +
  2223. '<option value="300">05:00</option>' +
  2224. '<option value="330">05:30</option>' +
  2225. '<option value="360">06:00</option>' +
  2226. '<option value="390">06:30</option>' +
  2227. '<option value="420">07:00</option>' +
  2228. '<option value="450">07:30</option>' +
  2229. '<option value="480">08:00</option>' +
  2230. '<option value="510">08:30</option>' +
  2231. '<option value="540">09:00</option>' +
  2232. '<option value="570">09:30</option>' +
  2233. '<option value="600">10:00</option>' +
  2234. '<option value="630">10:30</option>' +
  2235. '<option value="660">11:00</option>' +
  2236. '<option value="690">11:30</option>' +
  2237. '<option value="720">12:00</option>' +
  2238. '<option value="750">12:30</option>' +
  2239. '<option value="780">13:00</option>' +
  2240. '<option value="810">13:30</option>' +
  2241. '<option value="840">14:00</option>' +
  2242. '<option value="870">14:30</option>' +
  2243. '<option value="900">15:00</option>' +
  2244. '<option value="930">15:30</option>' +
  2245. '<option value="960">16:00</option>' +
  2246. '<option value="990">16:30</option>' +
  2247. '<option value="1020">17:00</option>' +
  2248. '<option value="1050">17:30</option>' +
  2249. '<option value="1080">18:00</option>' +
  2250. '<option value="1110">18:30</option>' +
  2251. '<option value="1140">19:00</option>' +
  2252. '<option value="1170">19:30</option>' +
  2253. '<option value="1200">20:00</option>' +
  2254. '<option value="1230">20:30</option>' +
  2255. '<option value="1260">21:00</option>' +
  2256. '<option value="1290">21:30</option>' +
  2257. '<option value="1320">22:00</option>' +
  2258. '<option value="1350">22:30</option>' +
  2259. '<option value="1380">23:00</option>' +
  2260. '<option value="1410">23:30</option>' +
  2261. '</select>' +
  2262. '<select id=routespeeds-day style="margin-left:5px;" >' +
  2263. '<option value="today">Today</option>' +
  2264. '<option value="1">Monday</option>' +
  2265. '<option value="2">Tuesday</option>' +
  2266. '<option value="3">Wednesday</option>' +
  2267. '<option value="4">Thursday</option>' +
  2268. '<option value="5">Friday</option>' +
  2269. '<option value="6">Saturday</option>' +
  2270. '<option value="0">Sunday</option>' +
  2271. '</select>' +
  2272. '</div>' +
  2273.  
  2274. '<div style="padding:20px; padding-top: 15px; padding-bottom: 15px; ">' +
  2275. '<button id=routespeeds-button-livemap class="btn btn-default" style="width:100%;">Calculate Route</button>' +
  2276. '</div>' +
  2277.  
  2278. '<div style="margin-bottom:4px;">' +
  2279. '<b>Options:</b>' +
  2280. '<a id="routespeeds-reset-options-to-livemap-route" onclick="return false;" style="cursor:pointer; float:right; margin-right:20px;" title="Reset routing options to the Livemap Route equivalents">Reset to Livemap Route</a>' +
  2281. '</div>' +
  2282.  
  2283. '<div><label class=""><input id="routespeeds-option1" type="checkbox"/>Disable script</label></div>' +
  2284. '<div><label class=""><input id="routespeeds-option3" type="checkbox"/>Hide labels</label></div>' +
  2285. '<div><label class=""><input id="routespeeds-option2" type="checkbox"/>Show cross-times through segments</label></div>' +
  2286. '<div><label class=""><input id="routespeeds-option4" type="checkbox"/>Speed in mph</label></div>' +
  2287.  
  2288. '<div>' +
  2289. '<label class="" style="display:inline-block;"><input id="routespeeds-option5" type="checkbox"/>Alternative routes</label>' +
  2290. '<select id=routespeeds-option6 style="margin-left:10px; display:inline-block;" >' +
  2291. '<option id=routespeeds-option6-v1 value="1">1</option>' +
  2292. '<option id=routespeeds-option6-v2 value="2">2</option>' +
  2293. '<option id=routespeeds-option6-v3 value="3">3</option>' +
  2294. '<option id=routespeeds-option6-v4 value="4">4</option>' +
  2295. '<option id=routespeeds-option6-v5 value="5">5</option>' +
  2296. '</select>' +
  2297. '<span id="routespeeds-option5-span" style="display:none;">' +
  2298. '<label class="" style="margin-left:15px; display:inline-block;" title="When enabled ten times more alternative routes is requested from the routing server.&#13;This usually increases the request time, but sometimes provides interesting routes..."><input id="routespeeds-option12" type="checkbox"/>Try more</label>' +
  2299. '</span>' +
  2300. '</div>' +
  2301.  
  2302. '<div><label class=""><input id=routespeeds-option7 type="checkbox"/>Real-Time Traffic</label></div>' +
  2303.  
  2304. '<div>' +
  2305. 'Route type:<select id=routespeeds-option13 style="margin-left:10px;" >' +
  2306. '<option id=routespeeds-option13-v1 value="1">Fastest</option>' +
  2307. '<option id=routespeeds-option13-v1 value="3">Fastest (no history)</option>' +
  2308. '<option id=routespeeds-option13-v2 value="2">Shortest</option>' +
  2309. '</select>' +
  2310. '</div>' +
  2311. '<br>' +
  2312.  
  2313. '<div>' +
  2314. '<div style="min-width:55px; display:inline-block;"><b>Avoid:</b></div>' +
  2315. '<label class=""><input id=routespeeds-option8 type="checkbox"/>Tolls</label>' +
  2316. line_div_break +
  2317. '<label class=""><input id=routespeeds-option9 type="checkbox"/>Freeways</label>' +
  2318. line_div_break +
  2319. '<label class=""><input id=routespeeds-option16 type="checkbox"/>Difficult Turns</label>' +
  2320. line_div_break +
  2321. '<label class=""><input id=routespeeds-option17 type="checkbox"/>Ferries</label>' +
  2322. '</div>' +
  2323.  
  2324. '<div style="margin-left:55px">' +
  2325. '<label class=""><input id=routespeeds-option10 type="checkbox"/>Dirt (Unpaved)</label>' +
  2326. '<span id=routespeeds-option10-span style="display:none;">' +
  2327. '<label class=""><input id=routespeeds-option11 type="checkbox"/>Long dirt roads</label>' +
  2328. '</span>' +
  2329. '</div>' +
  2330.  
  2331. '<div>' +
  2332. '<div style="min-width:55px; display:inline-block;"><b>Allow:</b></div>' +
  2333. '<label class=""><input id=routespeeds-option14 type="checkbox"/>U-Turns</label>' +
  2334. '</div>' +
  2335.  
  2336. '<br>' +
  2337. '<div>'+
  2338. '<div style="margin-left:55px"></div>' +
  2339. '<label class=""><b>Use Routing Order <b><input id="routespeeds-option15" type="checkbox"/></label>' +
  2340. '</div>' + // New Checkbox for Routing Order
  2341.  
  2342. '<b><p id=routespeeds-error style="color:#FF0000"></p></b>' +
  2343.  
  2344. '<div id=routespeeds-summary1 class=routespeeds_summary_classA></div>' +
  2345. '<div id=routespeeds-summary2 class=routespeeds_summary_classA></div>' +
  2346. '<div id=routespeeds-summary3 class=routespeeds_summary_classA></div>' +
  2347. '<div id=routespeeds-summary4 class=routespeeds_summary_classA></div>' +
  2348. '<div id=routespeeds-summary5 class=routespeeds_summary_classA></div>' +
  2349. '<style>' +
  2350. '.routespeedsmarkerA { display:block; width:27px; height:36px; margin-left:-13px; margin-top:-34px; }' +
  2351. '.routespeedsmarkerB { display:block; width:27px; height:36px; margin-left:-13px; margin-top:-34px; }' +
  2352. //+ '.routespeedsmarkerA { background:url("http://341444cc-a-62cb3a1a-s-sites.googlegroups.com/site/wazeaddons/routespeeds_marker_a.png"); }'
  2353. //+ '.routespeedsmarkerB { background:url("http://341444cc-a-62cb3a1a-s-sites.googlegroups.com/site/wazeaddons/routespeeds_marker_b.png"); }'
  2354. '.routespeedsmarkerA { background-image:url(data:image/png;base64,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); }' +
  2355. '.routespeedsmarkerB { background-image:url(data:image/png;base64,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); }' +
  2356. '.routespeedsmarkerA:hover { cursor:move }' +
  2357. '.routespeedsmarkerB:hover { cursor:move }' +
  2358. '.routespeeds_summary_classA { visibility:hidden; display:inline-block; color:#000000; margin:2px 0px 2px 0px; padding:2px 6px 2px 4px; border:1px solid #c0c0c0; background:#F8F8F8; border-radius:4px; vertical-align:middle; white-space:nowrap; }' +
  2359. '.routespeeds_summary_classB { visibility:hidden; display:inline-block; color:#000000; margin:2px 0px 2px 0px; padding:2px 6px 2px 4px; border:1px solid #c0c0c0; background:#d0fffe; border-radius:4px; vertical-align:middle; white-space:nowrap; }' +
  2360. '.routespeeds_summary_classA:hover { cursor:pointer; border:1px solid #808080; xbackground:#a0fffd; }' +
  2361. '.routespeeds_summary_classB:hover { cursor:pointer; border:1px solid #808080; xbackground:#a0fffd; }' +
  2362. '.routespeeds_header { display:inline-block; width:14px; height:14px; text-align:center; border-radius:2px; margin-right:2px; position:relative; top:2px; }' +
  2363. '</style>';
  2364.  
  2365. /*var userTabs = getId('user-info');
  2366. var navTabs = getElementsByClassName('nav-tabs', userTabs)[0];
  2367. var tabContent = getElementsByClassName('tab-content', userTabs)[0];
  2368.  
  2369. newtab = document.createElement('li');
  2370. newtab.innerHTML = '<a id=sidepanel-routespeeds href="#sidepanel-routespeeds" data-toggle="tab" style="" >Route Speeds</a>';
  2371. navTabs.appendChild(newtab);
  2372.  
  2373. addon.id = "sidepanel-routespeeds";
  2374. addon.className = "tab-pane";
  2375. tabContent.appendChild(addon);*/
  2376.  
  2377. new WazeWrap.Interface.Tab('Route Speeds', addon.innerHTML, init);
  2378.  
  2379. window.addEventListener("beforeunload", saveRouteSpeedsOptions, true);
  2380. }
  2381.  
  2382. function init()
  2383. {
  2384. resetOptions();
  2385. loadRouteSpeedsOptions();
  2386.  
  2387. if (routespeedsoption1) getId('sidepanel-routespeeds').style.color = "#A0A0A0";
  2388. else getId('sidepanel-routespeeds').style.color = "";
  2389.  
  2390. getId('routespeeds-option6').value = routespeedsoption6;
  2391. getId('routespeeds-option13').value = routespeedsoption13;
  2392.  
  2393. getId('routespeeds-option1').onclick = clickOption1;
  2394. getId('routespeeds-option2').onclick = clickOption2;
  2395. getId('routespeeds-option3').onclick = clickOption3;
  2396. getId('routespeeds-option4').onclick = clickOption4;
  2397. getId('routespeeds-option5').onclick = clickOption5;
  2398. getId('routespeeds-option6').onchange = clickOption6;
  2399. getId('routespeeds-option7').onclick = clickOption7;
  2400. getId('routespeeds-option8').onclick = clickOption8;
  2401. getId('routespeeds-option9').onclick = clickOption9;
  2402. getId('routespeeds-option10').onclick = clickOption10;
  2403. getId('routespeeds-option11').onclick = clickOption11;
  2404. getId('routespeeds-option12').onclick = clickOption12;
  2405. getId('routespeeds-option13').onchange = clickOption13;
  2406. getId('routespeeds-option14').onclick = clickOption14;
  2407. getId('routespeeds-option15').onclick = clickOption15; // Routing Order
  2408. getId('routespeeds-option16').onclick = clickOption16; // Difficult Turns
  2409. getId('routespeeds-option17').onclick = clickOption17; // Ferries
  2410.  
  2411. getId('routespeeds-summary1').onclick = clickRoute1;
  2412. getId('routespeeds-summary2').onclick = clickRoute2;
  2413. getId('routespeeds-summary3').onclick = clickRoute3;
  2414. getId('routespeeds-summary4').onclick = clickRoute4;
  2415. getId('routespeeds-summary5').onclick = clickRoute5;
  2416.  
  2417. getId('sidepanel-routespeeds-a').onkeydown = enterAB;
  2418. getId('sidepanel-routespeeds-b').onkeydown = enterAB;
  2419.  
  2420. getId('routespeeds-button-livemap').onclick = livemapRouteClick;
  2421. getId('routespeeds-button-reverse').onclick = reverseRoute;
  2422. getId('routespeeds-reset-options-to-livemap-route').onclick = resetOptionsToLivemapRouteClick;
  2423.  
  2424. getId('routespeeds-hour').onchange = hourChange;
  2425. getId('routespeeds-day').onchange = dayChange;
  2426.  
  2427. getId('routespeeds-button-A').onclick = clickA;
  2428. getId('routespeeds-button-B').onclick = clickB;
  2429.  
  2430. window.W.map.events.register("zoomend", null, rezoom);
  2431.  
  2432. window.setInterval(loopWMERouteSpeeds, 500);
  2433. window.setInterval(panningWMERouteSpeeds, 100);
  2434. }
  2435. //--------------------------------------------------------------------------------------------------------------
  2436. bootstrapWMERouteSpeeds();