WME Road History

Saves state of roads in area and it finds changes between history snapshots.

  1. // ==UserScript==
  2. // @name WME Road History
  3. // @name:pl WME Road History
  4. // @description Saves state of roads in area and it finds changes between history snapshots.
  5. // @description:pl Zapisuje stan obszaru mapy i tworzy historię zmian pomiędzy "migawkami" mapy.
  6. // @include https://www.waze.com/editor*
  7. // @include https://www.waze.com/*/editor*
  8. // @include https://beta.waze.com/*
  9. // @exclude https://www.waze.com/user/editor*
  10. // @version 2018.09.12.01
  11. // @grant none
  12. // @namespace https://greasyfork.org/en/scripts/39715-wme-road-history
  13. // @copyright 2015 wlodek76
  14. // @credits FZ69617 tips and tricks
  15. // ==/UserScript==
  16.  
  17. /* global W */
  18. /* global OL */
  19. /* ecmaVersion 2017 */
  20. /* global $ */
  21. /* global I18n */
  22. /* global require */
  23. /* eslint no-multi-spaces: ["warn", { ignoreEOLComments:true, exceptions: { "VariableDeclarator": true} }]*/
  24. /* eslint curly: ["warn", "multi-or-nest"] */
  25.  
  26. var wmech_version = "2018.03.18.01";
  27.  
  28. var epsg900913 = new OL.Projection("EPSG:900913");
  29. var epsg4326 = new OL.Projection("EPSG:4326");
  30.  
  31. var lang = {code:'en',
  32. summarystats : 'Statistic of the latest edits',
  33. statedits : ' ed.',
  34. showcircle : 'Colorize edits on the map',
  35. showcircleshort : 'Show short names of editors',
  36. showcirclelong : 'Show long names of editors',
  37. fulltime : 'Show seconds in timestamps',
  38. datesdefined : 'Date range:',
  39. datesincorrect : 'Incorrect date range in Options!',
  40. daterange : 'Date range:',
  41. showfromdate : 'From date:',
  42. showtodate : 'To date:',
  43. customize : 'Customize:',
  44. rowsperpage : 'Rows per page: ',
  45. dbversion : 'Database version: ',
  46. dbopenerror : 'WME Road History\n\nProbably you are trying to run the script with newer version of database. Please update the script to the newest version.',
  47. reloadsite : 'WME Road History\n\nDatabase version has been updated. Please refresh the site!',
  48. closetabs : 'WME Road History\n\nPlease close all other tabs with this site open!',
  49. mergedatatip : 'Merge option compares timestamps between segments. Only segments with the newest timestamp will be uploaded.',
  50. dberrorlocked : "ERR: Can't delete a Database. Database is locked or used in other instance of browser!",
  51. dberrordelete : "ERR: Can't delete a Database!",
  52. preparingdatabase : 'Preparing database...',
  53. clearquestion : 'Do you want to clear Database before import?',
  54. mergedata : 'Merge data into Database',
  55. exporteddata : 'Exported records: ',
  56. importeddata : 'Processed records: ',
  57. imports : 'Import from file...',
  58. exports : 'Export to file...',
  59. options : 'Options',
  60. amonly : 'Tools for Area Managers or L3 editors.',
  61. trAB : 'Time Restrictions (A do B):',
  62. trBA : 'Time Restrictions (B do A):',
  63. removedtr : 'Removed TR turn: ',
  64. changedtr : 'Changed TR turn: ',
  65. addedtr : 'Added TR turn: ',
  66. removed_uturn : 'Removed U-Turn: ',
  67. added_uturn : 'Added U-Turn: ',
  68. veh1 : 'Trucks',
  69. veh2 : 'Public Transportation',
  70. veh3 : 'Taxis',
  71. veh4 : 'Buses',
  72. veh5 : 'HOV - 2',
  73. veh6 : 'HOV - 3',
  74. veh7 : 'RV',
  75. veh8 : 'Towing vehicles',
  76. veh9 : 'Motorcycles',
  77. veh10 : 'Private vehicles',
  78. veh11 : 'Hazardous materials',
  79. exceptvehicles : 'Except vehicles: ',
  80. allweek : 'All Week',
  81. day1 : 'Su',
  82. day2 : 'Mo',
  83. day3 : 'Tu',
  84. day4 : 'We',
  85. day5 : 'Th',
  86. day6 : 'Fr',
  87. day7 : 'Sa',
  88. allday : 'All Day',
  89. atob : 'A to B',
  90. btoa : 'B to A',
  91. none : 'None',
  92. trbefore : 'Time restrictions before:',
  93. trafter : 'Time restrictions:',
  94. tollchange : 'Changed: ',
  95. tollpart : 'Toll Road Partially',
  96. tollfree : 'Toll Road Free',
  97. toll : 'Toll Road',
  98. changename : 'Street: ',
  99. changecity : 'City: ',
  100. level : 'Level: ',
  101. changedgeom : 'Changed geometry',
  102. into : 'to ',
  103. to : 'to',
  104. noname : 'No name',
  105. removedturn : 'Removed turn: ',
  106. addedturn : 'Added turn: ',
  107. road1 : 'Street',
  108. road2 : 'Primary Street',
  109. road3 : 'Freeway',
  110. road4 : 'Ramp',
  111. road5 : 'Walking Trail',
  112. road6 : 'Major Highway',
  113. road7 : 'Minor Highway',
  114. road8 : 'Dirt road / 4x4 Trail',
  115. road10 : 'Pedestrian Boardwalk',
  116. road17 : 'Private Road',
  117. road18 : 'Railroad',
  118. road19 : 'Runway / Taxiway',
  119. road20 : 'Parking Lot Road',
  120. road21 : 'Service Road',
  121. roadtype : 'RoadType(',
  122. dirchange0 : '<b class=wmeroadhistory_error>Removed direction</b>',
  123. dirchange1 : 'Changed to <b class=wmeroadhistory_error>One-way</b>',
  124. dirchange2 : 'Changed to <b class=wmeroadhistory_error>Two-way</b>',
  125. dirchangerev : '<b class=wmeroadhistory_error>Reversed direction</b>',
  126. dirchangeadd : '<b class=wmeroadhistory_error>Added direction</b>',
  127. newsegment : 'New',
  128. sec : 'sec.',
  129. prev : 'Newest',
  130. next : 'Oldest',
  131. stop : 'Stop',
  132. changes: 'Changes',
  133. segments: 'Segments',
  134. edits: 'Edits',
  135. scanarea: 'Scan Area'
  136. };
  137. var langPL = {code:'pl',
  138. summarystats : 'Statystyka ostatnich edycji',
  139. statedits : ' ed.',
  140. showcircle : 'Koloruj edycje na mapie',
  141. showcircleshort : 'Pokaż skrócone nazwy edytorów',
  142. showcirclelong : 'Pokaż długie nazwy edytorów',
  143. fulltime : 'Pokaż sekundy w znacznikach czasowych',
  144. datesdefined : 'Zakres dat:',
  145. datesincorrect : 'UWAGA: Niewłaściwy zakres dat w Opcjach!',
  146. daterange : 'Zakres dat:',
  147. showfromdate : "Od dnia:",
  148. showtodate : "Do dnia:",
  149. customize : 'Dostosuj ustawienia:',
  150. rowsperpage : 'Ilość wierszy na stronie: ',
  151. dbversion : 'Wersja bazy danych: ',
  152. dbopenerror : 'WME Road History\n\nPrawdopodobnie próbujesz uruchomić starszą wersję skryptu na nowszej bazie danych. Zaktualizuj skrypt do najnowszej wersji.',
  153. reloadsite : 'WME Road History\n\nWersja bazy danych została zaktualizowana. Proszę odświeżyć stronę!',
  154. closetabs : 'WME Road History\n\nBaza danych wymaga aktualizacji. Proszę zamknąć stronę na pozostałych zakładkach przeglądarki!',
  155. mergedatatip : 'Opcja dołączania danych porównuje znaczniki czasowe segmentów. Tylko najnowsze segmenty będą zaimportowane.',
  156. dberrorlocked : "ERR: Nie mogę skasować Bazy danych.<br>Baza danych jest zablokowana lub używana przez inną instancję przeglądarki!",
  157. dberrordelete : "ERR: Nie mogę skasować Bazy danych!",
  158. preparingdatabase : 'Przygotowywanie bazy danych...',
  159. clearquestion : 'Czy wyczyścić Bazę danych przed importem?',
  160. mergedata : 'Dołącz dane do Bazy danych',
  161. exporteddata : 'Wyeksportowano rekordów: ',
  162. importeddata : 'Przetworzono rekordów: ',
  163. imports : 'Import z pliku...',
  164. exports : 'Eksport do pliku...',
  165. options : 'Opcje',
  166. amonly : 'Narzędzie przeznaczone dla Area Manager lub edytorów L3.',
  167. trAB : 'Ograniczenia czasowe (A do B):',
  168. trBA : 'Ograniczenia czasowe (B do A):',
  169. removedtr : 'Usunięty TR skrętu: ',
  170. changedtr : 'Zmieniony TR skrętu: ',
  171. addedtr : 'Dodany TR skrętu: ',
  172. removed_uturn : 'Usunięte zawracanie: ',
  173. added_uturn : 'Dodane zawracanie: ',
  174. veh1 : 'Ciężarówki',
  175. veh2 : 'Transport Publiczny',
  176. veh3 : 'Taksówki',
  177. veh4 : 'Autobusy',
  178. veh5 : 'Więcej niż 2 pasażerów (HOV - 2)',
  179. veh6 : 'Więcej niż 3 pasażerów (HOV - 3)',
  180. veh7 : 'Kamper',
  181. veh8 : 'Pojazdy holujące',
  182. veh9 : 'Motocykle',
  183. veh10 : 'Samochody prywatne',
  184. veh11 : 'Materiały niebezpieczne',
  185. exceptvehicles : 'Z wyjątkiem pojazdów: ',
  186. allweek : 'Każdy tydzień',
  187. day1 : 'Nd',
  188. day2 : 'Pon',
  189. day3 : 'Wt',
  190. day4 : 'Śr',
  191. day5 : 'Czw',
  192. day6 : 'Pt',
  193. day7 : 'Sob',
  194. allday : 'Cały dzień',
  195. atob : 'A do B',
  196. btoa : 'B do A',
  197. none : 'Brak',
  198. trbefore : 'Poprzednie ograniczenia czasowe:',
  199. trafter : 'Ograniczenia czasowe:',
  200. tollchange : 'Zmiana: ',
  201. tollpart : 'Droga częściowo płatna',
  202. tollfree : 'Droga bezpłatna',
  203. toll : 'Droga płatna',
  204. changename : 'Nazwa: ',
  205. changecity : 'Miasto: ',
  206. level : 'Poziom: ',
  207. changedgeom : 'Zmiana geometrii',
  208. into : 'w ',
  209. to : 'do',
  210. noname : 'Bez nazwy',
  211. removedturn : 'Usunięto skręt: ',
  212. addedturn : 'Dodano skręt: ',
  213. road1 : 'Ulica',
  214. road2 : 'Główna ulica',
  215. road3 : 'Autostrada / Droga ekspresowa',
  216. road4 : 'Wjazd / Zjazd',
  217. road5 : 'Ścieżka dla pieszych',
  218. road6 : 'Droga krajowa',
  219. road7 : 'Droga wojewódzka',
  220. road8 : 'Droga gruntowa',
  221. road10 : 'Deptak',
  222. road17 : 'Droga prywatna',
  223. road18 : 'Tory kolejowe / tramwajowe',
  224. road19 : 'Pas startowy / Droga kołowania',
  225. road20 : 'Droga wewnętrzna',
  226. road21 : 'Droga serwisowa',
  227. roadtype : 'RoadType(',
  228. dirchange0 : '<b class=wmeroadhistory_error>Usunięto kierunkowość</b>',
  229. dirchange1 : 'Zmieniono na <b class=wmeroadhistory_error>Jednokierunkowa</b>',
  230. dirchange2 : 'Zmieniono na <b class=wmeroadhistory_error>Dwukierunkowa</b>',
  231. dirchangerev : '<b class=wmeroadhistory_error>Odwrócono kierunkowość</b>',
  232. dirchangeadd : '<b class=wmeroadhistory_error>Dodano kierunkowość</b>',
  233. newsegment : 'Nowy',
  234. sec : 'sek.',
  235. prev : 'Nowsze',
  236. next : 'Starsze',
  237. stop : 'Stop',
  238. changes: 'Zmiany',
  239. segments: 'Segmentów',
  240. edits: 'Edycje',
  241. scanarea: 'Skanuj Obszar'
  242. };
  243.  
  244. var DIFF_DIR = 0x01;
  245. var DIFF_TYPE = 0x02;
  246. var DIFF_TURNS = 0x04;
  247. var DIFF_NAMES = 0x08;
  248. var DIFF_CITY = 0x10;
  249. var DIFF_TR = 0x20;
  250. var DIFF_LEVEL = 0x40;
  251. var DIFF_GEOM = 0x80;
  252. var DIFF_TOLL = 0x100;
  253. var DIFF_TS = 0x200;
  254.  
  255. var last_LONLAT;
  256. var last_ZOOM;
  257. var wazepending;
  258. var rec_xy1;
  259. var rec_xy2;
  260. var rec = false;
  261. var rec_direction = 1;
  262. var scanned_segments_list = {}; // zastosowanie tablicy obiektów jest szybsze wydajnościowo podczas przeszukiwania tablicy
  263. var scanned_segments = 0;
  264. var scanned_segments_prev = 0;
  265. var added_segments = 0;
  266. var added_segments_prev = 0;
  267. var added_changes = 0;
  268. var added_changes_prev = 0;
  269. var rec_zoom = 5;
  270. var rec_elapsed_time = 0;
  271. var wazeDataBaseName = 'wazeDB';
  272. var wazeDB;
  273. var readconfig = 0;
  274. var LastTimeScan = 0;
  275. var ShowHistMode = 2;
  276. var pageEdits = 0;
  277. var prevScroll = 0;
  278. var userinfoDispPrev = '';
  279. var showturn = [0,0,0,0];
  280. var importlines = new Array();
  281. var importcount = 0;
  282. var importmaxcount = 0;
  283. var importchunk = 0;
  284. var importpercent = -1;
  285. var importbrowser = 0;
  286. var chunkdata = 0;
  287. var ICONMODE = 0; // 0: oznacza że skrypt użyje linii do pokazania zmian na mapie 1: oznacza, że zmiany na mapie zostaną pokazane jako ikonki
  288. var markerskey = {};
  289. var markersseg = {};
  290. var markersadd = [];
  291. var stats = {};
  292. var updatestatsdelay = 0;
  293. var ventCount = 0;
  294. var scanprocentyPrev = 0;
  295. var scanprocentyDelta = 0;
  296. var scanprocPrev = 0;
  297. var scanproc = '';
  298. var LOOPTIMER = 100;
  299.  
  300. /*----------------------------------------------------------------------------------------------------------
  301. FileSaver.js Javascript Component
  302. Copyright © 2015 Eli Grey.
  303.  
  304. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
  305. documentation files (the "Software"), to deal in the Software without restriction, including without
  306. limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
  307. the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
  308.  
  309. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
  310.  
  311. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
  312. INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
  313. PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
  314. DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  315. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  316. ------------------------------------------------------------------------------------------------------------*/
  317. var saveAs = saveAs
  318. // IE 10+ (native saveAs)
  319. || (typeof navigator !== "undefined" &&
  320. navigator.msSaveOrOpenBlob && navigator.msSaveOrOpenBlob.bind(navigator))
  321. // Everyone else
  322. || (function(view) {
  323. "use strict";
  324. // IE <10 is explicitly unsupported
  325. if (typeof navigator !== "undefined" && /MSIE [1-9]\./.test(navigator.userAgent))
  326. return;
  327.  
  328. var doc = view.document
  329. // only get URL when necessary in case Blob.js hasn't overridden it yet
  330. , get_URL = function() {
  331. return view.URL || view.webkitURL || view;
  332. }
  333. , save_link = doc.createElementNS("http://www.w3.org/1999/xhtml", "a")
  334. , can_use_save_link = "download" in save_link
  335. , click = function(node) {
  336. var event = doc.createEvent("MouseEvents");
  337. event.initMouseEvent(
  338. "click", true, false, view, 0, 0, 0, 0, 0
  339. , false, false, false, false, 0, null
  340. );
  341. node.dispatchEvent(event);
  342. }
  343. , webkit_req_fs = view.webkitRequestFileSystem
  344. , req_fs = view.requestFileSystem || webkit_req_fs || view.mozRequestFileSystem
  345. , throw_outside = function(ex) {
  346. (view.setImmediate || view.setTimeout)(function() {
  347. throw ex;
  348. }, 0);
  349. }
  350. , force_saveable_type = "application/octet-stream"
  351. , fs_min_size = 0
  352. // See https://code.google.com/p/chromium/issues/detail?id=375297#c7 and
  353. // https://github.com/eligrey/FileSaver.js/commit/485930a#commitcomment-8768047
  354. // for the reasoning behind the timeout and revocation flow
  355. , arbitrary_revoke_timeout = 500 // in ms
  356. , revoke = function(file) {
  357. var revoker = function() {
  358. if (typeof file === "string") { // file is an object URL
  359. get_URL().revokeObjectURL(file);
  360. } else { // file is a File
  361. file.remove();
  362. }
  363. };
  364. if (view.chrome)
  365. revoker();
  366. else
  367. setTimeout(revoker, arbitrary_revoke_timeout);
  368. }
  369. , dispatch = function(filesaver, event_types, event) {
  370. event_types = [].concat(event_types);
  371. var i = event_types.length;
  372. while (i--) {
  373. var listener = filesaver["on" + event_types[i]];
  374. if (typeof listener === "function") {
  375. try {
  376. listener.call(filesaver, event || filesaver);
  377. } catch (ex) {
  378. throw_outside(ex);
  379. }
  380. }
  381. }
  382. }
  383. , FileSaver = function(blob, name) {
  384. // First try a.download, then web filesystem, then object URLs
  385. var
  386. filesaver = this
  387. , type = blob.type
  388. , blob_changed = false
  389. , object_url
  390. , target_view
  391. , dispatch_all = function() {
  392. dispatch(filesaver, "writestart progress write writeend".split(" "));
  393. }
  394. // on any filesys errors revert to saving with object URLs
  395. , fs_error = function() {
  396. // don't create more object URLs than needed
  397. if (blob_changed || !object_url)
  398. object_url = get_URL().createObjectURL(blob);
  399. if (target_view)
  400. target_view.location.href = object_url;
  401. else {
  402. var new_tab = view.open(object_url, "_blank");
  403. if (new_tab == undefined && typeof safari !== "undefined") {
  404. //Apple do not allow window.open, see http://bit.ly/1kZffRI
  405. view.location.href = object_url
  406. }
  407. }
  408. filesaver.readyState = filesaver.DONE;
  409. dispatch_all();
  410. revoke(object_url);
  411. }
  412. , abortable = function(func) {
  413. return function() {
  414. if (filesaver.readyState !== filesaver.DONE)
  415. return func.apply(this, arguments);
  416. };
  417. }
  418. , create_if_not_found = {create: true, exclusive: false}
  419. , slice
  420. ;
  421. filesaver.readyState = filesaver.INIT;
  422. if (!name)
  423. name = "download";
  424. if (can_use_save_link) {
  425. object_url = get_URL().createObjectURL(blob);
  426. save_link.href = object_url;
  427. save_link.download = name;
  428. click(save_link);
  429. filesaver.readyState = filesaver.DONE;
  430. dispatch_all();
  431. revoke(object_url);
  432. return;
  433. }
  434. // prepend BOM for UTF-8 XML and text/plain types
  435. if (/^\s*(?:text\/(?:plain|xml)|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(blob.type))
  436. blob = new Blob(["\ufeff", blob], {type: blob.type});
  437.  
  438. // Object and web filesystem URLs have a problem saving in Google Chrome when
  439. // viewed in a tab, so I force save with application/octet-stream
  440. // http://code.google.com/p/chromium/issues/detail?id=91158
  441. // Update: Google errantly closed 91158, I submitted it again:
  442. // https://code.google.com/p/chromium/issues/detail?id=389642
  443. if (view.chrome && type && type !== force_saveable_type) {
  444. slice = blob.slice || blob.webkitSlice;
  445. blob = slice.call(blob, 0, blob.size, force_saveable_type);
  446. blob_changed = true;
  447. }
  448. // Since I can't be sure that the guessed media type will trigger a download
  449. // in WebKit, I append .download to the filename.
  450. // https://bugs.webkit.org/show_bug.cgi?id=65440
  451. if (webkit_req_fs && name !== "download")
  452. name += ".download";
  453. if (type === force_saveable_type || webkit_req_fs)
  454. target_view = view;
  455. if (!req_fs) {
  456. fs_error();
  457. return;
  458. }
  459. fs_min_size += blob.size;
  460. req_fs(view.TEMPORARY, fs_min_size, abortable(function(fs) {
  461. fs.root.getDirectory("saved", create_if_not_found, abortable(function(dir) {
  462. var save = function() {
  463. dir.getFile(name, create_if_not_found, abortable(function(file) {
  464. file.createWriter(abortable(function(writer) {
  465. writer.onwriteend = function(event) {
  466. target_view.location.href = file.toURL();
  467. filesaver.readyState = filesaver.DONE;
  468. dispatch(filesaver, "writeend", event);
  469. revoke(file);
  470. };
  471. writer.onerror = function() {
  472. var error = writer.error;
  473. if (error.code !== error.ABORT_ERR)
  474. fs_error();
  475. };
  476. "writestart progress write abort".split(" ").forEach(function(event) {
  477. writer["on" + event] = filesaver["on" + event];
  478. });
  479. writer.write(blob);
  480. filesaver.abort = function() {
  481. writer.abort();
  482. filesaver.readyState = filesaver.DONE;
  483. };
  484. filesaver.readyState = filesaver.WRITING;
  485. }), fs_error);
  486. }), fs_error);
  487. };
  488. dir.getFile(name, {create: false}, abortable(function(file) {
  489. // delete file if it already exists
  490. file.remove();
  491. save();
  492. }), abortable(function(ex) {
  493. if (ex.code === ex.NOT_FOUND_ERR)
  494. save();
  495. else
  496. fs_error();
  497. }));
  498. }), fs_error);
  499. }), fs_error);
  500. }
  501. , FS_proto = FileSaver.prototype
  502. , saveAs = function(blob, name) {
  503. return new FileSaver(blob, name);
  504. }
  505. ;
  506. FS_proto.abort = function() {
  507. var filesaver = this;
  508. filesaver.readyState = filesaver.DONE;
  509. dispatch(filesaver, "abort");
  510. };
  511. FS_proto.readyState = FS_proto.INIT = 0;
  512. FS_proto.WRITING = 1;
  513. FS_proto.DONE = 2;
  514.  
  515. FS_proto.error =
  516. FS_proto.onwritestart =
  517. FS_proto.onprogress =
  518. FS_proto.onwrite =
  519. FS_proto.onabort =
  520. FS_proto.onerror =
  521. FS_proto.onwriteend =
  522. null;
  523.  
  524. return saveAs;
  525. }(
  526. typeof self !== "undefined" && self
  527. || typeof window !== "undefined" && window
  528. || this.content
  529. ));
  530. //------------------------------------------------------------------------------------------------
  531. window.indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
  532. window.IDBTransaction = window.IDBTransaction || window.webkitIDBTransaction || window.msIDBTransaction;
  533. window.IDBKeyRange = window.IDBKeyRange || window.webkitIDBKeyRange || window.msIDBKeyRange
  534.  
  535. if (!window.indexedDB)
  536. window.alert("Your browser doesn't support a stable version of IndexedDB.")
  537. //------------------------------------------------------------------------------------------------
  538. var docurl = window.document.URL;
  539. if (docurl.indexOf( "/pl/" ) >=0 ) lang = langPL;
  540. //------------------------------------------------------------------------------------------------
  541. var openrequest = window.indexedDB.open( wazeDataBaseName, 2 );
  542.  
  543. openrequest.onsuccess = function(event) {
  544. wazeDB = event.target.result;
  545. console.log("WMERoadHistory.DataBase.Init.OK = ", openrequest.result.name, wazeDB.version );
  546. };
  547.  
  548. openrequest.onblocked = function(event) {
  549. //alert( lang.closetabs );
  550. };
  551.  
  552. openrequest.onerror = function(event) {
  553. alert(lang.dbopenerror);
  554. };
  555.  
  556. openrequest.onupgradeneeded = function(event) {
  557.  
  558. var db = event.target.result;
  559. console.log("WMERoadHistory.DataBase.Upgrade: ", db);
  560.  
  561. var storeSEG = false;
  562. var storeCHG = false;
  563. var stores = db.objectStoreNames;
  564. for(var n=0; n<stores.length; n++) {
  565. if ( stores[n] == 'segments') storeSEG = true;
  566. if ( stores[n] == 'changes') storeCHG = true;
  567. }
  568.  
  569. if (storeSEG) {
  570. }
  571. else {
  572. var newStore = db.createObjectStore("segments", { keyPath: "ID", autoIncrement: false });
  573. newStore.createIndex("T", "T", { unique: false });
  574. }
  575.  
  576. if (storeCHG) {
  577. var currentStore = event.currentTarget.transaction.objectStore("changes");
  578.  
  579. var nameID = '';
  580. var nameT = '';
  581. for(let n=0; n<currentStore.indexNames.length; n++) {
  582. var name = currentStore.indexNames[n];
  583. if (name == 'ID') nameID = name;
  584. if (name == 'T') nameT = name;
  585. }
  586. if (nameT == '') currentStore.createIndex("T", "T", { unique: false });
  587. if (nameID == '') currentStore.createIndex("ID", "ID", { unique: false });
  588. }
  589. else {
  590. let newStore = db.createObjectStore("changes", { keyPath: "nr", autoIncrement: true });
  591. newStore.createIndex("T", "T", { unique: false });
  592. newStore.createIndex("ID", "ID", { unique: false });
  593. }
  594. }
  595. //------------------------------------------------------------------------------------------------
  596. function bootstrapWMERoadHistory()
  597. {
  598. if(!window.W.map) {
  599. console.log('WME Road History: Waiting for WME...');
  600. setTimeout(bootstrapWMERoadHistory, 1000);
  601. return;
  602. }
  603.  
  604. window.addEventListener("beforeunload", saveOptions, true);
  605.  
  606. setTimeout(initialiseWMERoadHistory, 1000);
  607. }
  608. //------------------------------------------------------------------------------------------------
  609. function saveOptions() {
  610.  
  611. var options = '';
  612.  
  613. var opt0 = getId('_wmeRoadHistoryRows');
  614. var opt1 = getId('_wmeRoadHistoryFromYear');
  615. var opt2 = getId('_wmeRoadHistoryFromMonth');
  616. var opt3 = getId('_wmeRoadHistoryFromDay');
  617. var opt4 = getId('_wmeRoadHistoryToYear');
  618. var opt5 = getId('_wmeRoadHistoryToMonth');
  619. var opt6 = getId('_wmeRoadHistoryToDay');
  620. var opt7 = getId('_wmeRoadHistoryDateRange');
  621. var opt8 = getId('_wmeRoadHistoryFullTime');
  622. var opt9 = getId('_wmeRoadHistoryShowCircle');
  623. var opt10 = getId('_wmeRoadHistoryShowCircleShort');
  624. var opt11 = getId('_wmeRoadHistoryShowCircleLong');
  625. var opt12 = getId('_wmeRoadHistorySummaryStats');
  626.  
  627. if (opt0 != undefined) options += opt0.value + "|";
  628. if (opt1 != undefined) options += opt1.value + "|";
  629. if (opt2 != undefined) options += opt2.value + "|";
  630. if (opt3 != undefined) options += opt3.value + "|";
  631. if (opt4 != undefined) options += opt4.value + "|";
  632. if (opt5 != undefined) options += opt5.value + "|";
  633. if (opt6 != undefined) options += opt6.value + "|";
  634. if (opt7 != undefined) options += opt7.checked + "|";
  635. if (opt8 != undefined) options += opt8.checked + "|";
  636. if (opt9 != undefined) options += opt9.checked + "|";
  637. if (opt10 != undefined) options += opt10.checked + "|";
  638. if (opt11 != undefined) options += opt11.checked + "|";
  639. if (opt12 != undefined) options += opt12.checked + "|";
  640.  
  641. localStorage.setItem('WMERoadHistoryOptions', options );
  642. }
  643. //------------------------------------------------------------------------------------------------
  644. function loadOptions() {
  645.  
  646. if (localStorage.WMERoadHistoryOptions) {
  647. var options = localStorage.WMERoadHistoryOptions.split('|');
  648.  
  649. if (options[0]) getId('_wmeRoadHistoryRows').value = options[0];
  650. if (options[1]) getId('_wmeRoadHistoryFromYear').value = options[1];
  651. if (options[2]) getId('_wmeRoadHistoryFromMonth').value = options[2];
  652. if (options[3]) getId('_wmeRoadHistoryFromDay').value = options[3];
  653. if (options[4]) getId('_wmeRoadHistoryToYear').value = options[4];
  654. if (options[5]) getId('_wmeRoadHistoryToMonth').value = options[5];
  655. if (options[6]) getId('_wmeRoadHistoryToDay').value = options[6];
  656. if (options[7]) getId('_wmeRoadHistoryDateRange').checked = (options[7] == 'true');
  657. if (options[8]) getId('_wmeRoadHistoryFullTime').checked = (options[8] == 'true');
  658. if (options[9]) getId('_wmeRoadHistoryShowCircle').checked = (options[9] == 'true');
  659. if (options[10]) getId('_wmeRoadHistoryShowCircleShort').checked = (options[10] == 'true');
  660. if (options[11]) getId('_wmeRoadHistoryShowCircleLong').checked = (options[11] == 'true');
  661. if (options[12]) getId('_wmeRoadHistorySummaryStats').checked = (options[12] == 'true');
  662. }
  663. }
  664. //------------------------------------------------------------------------------------------------
  665. function getElementsByClassName(classname, node) {
  666. if(!node) node = document.getElementsByTagName("body")[0];
  667. var a = [];
  668. var re = new RegExp('\\b' + classname + '\\b');
  669. var els = node.getElementsByTagName("*");
  670. for (let i=0,j=els.length; i<j; i++)
  671. if (re.test(els[i].className)) a.push(els[i]);
  672. return a;
  673. }
  674. //--------------------------------------------------------------------------------------------------------
  675. function getId(node) {
  676. return document.getElementById(node);
  677. }
  678. //--------------------------------------------------------------------------------------------------------
  679. function precFloat(f, prec)
  680. {
  681. if (!isFinite(f)) return "&mdash;";
  682.  
  683. if (f < 0)
  684. f -= Math.pow(0.1, prec) * 0.5;
  685. else
  686. f += Math.pow(0.1, prec) * 0.5;
  687.  
  688. var ipart = parseInt(f);
  689. var fpart = Math.abs(f - ipart);
  690. f = ipart;
  691.  
  692. if (fpart == '0') fpart = '0.0';
  693. fpart += '0000000000000000';
  694. if (prec) f += fpart.substr(1, prec + 1);
  695.  
  696. return f;
  697. }
  698. //--------------------------------------------------------------------------------------------------------
  699. function createCRC32() {
  700. var c, i, j,
  701. crcTable = [];
  702. for (i = 0; i < 256; i++) {
  703. c = i;
  704. for (j = 0; j < 8; j++)
  705. c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));
  706. crcTable[i] = c;
  707. }
  708.  
  709. return function (str) {
  710. var i,
  711. crc = 0 ^ (-1);
  712.  
  713. for (i = 0; i < str.length; i++)
  714. crc = (crc >>> 8) ^ crcTable[(crc ^ str.charCodeAt(i)) & 0xFF];
  715.  
  716. return (crc ^ (-1)) >>> 0;
  717. };
  718. }
  719. //--------------------------------------------------------------------------------------------------------
  720. var crc32 = createCRC32();
  721. //--------------------------------------------------------------------------------------------------------
  722. function updateSaveButton() {
  723. var obj = getId('wmeroadhistory_scanarea');
  724. if (rec == true) {
  725. obj.style.backgroundColor = '#C00000';
  726. obj.style.color = '#FFFFFF';
  727. obj.innerHTML = lang.stop;
  728. }
  729. else {
  730. obj.style.backgroundColor = '';
  731. obj.style.color = '';
  732. obj.innerHTML = lang.scanarea;
  733. }
  734. }
  735. //--------------------------------------------------------------------------------------------------------
  736. function stopRec(finished) {
  737. var WM = window.W.map;
  738.  
  739. rec = false;
  740. updateSaveButton(rec);
  741.  
  742. WM.panTo(last_LONLAT);
  743. WM.zoomTo(last_ZOOM);
  744.  
  745. if (ShowHistMode == 3) ShowHistMode = 2;
  746. if (ShowHistMode == 0) wmeroadhistoryTAB2();
  747. if (ShowHistMode == 1) wmeroadhistoryTAB1();
  748. if (ShowHistMode == 2) wmeroadhistoryTAB2();
  749. }
  750. //--------------------------------------------------------------------------------------------------------
  751. function getMidPointLen(seg) {
  752.  
  753. var points, p1, p2;
  754. points = seg.geometry.components.length;
  755.  
  756. var x = 0;
  757. var y = 0;
  758. var length = 0;
  759.  
  760. if (points == 2) {
  761. p1 = seg.geometry.components[0];
  762. p2 = seg.geometry.components[1];
  763.  
  764. x = p1.x + (p2.x - p1.x) * 0.5;
  765. y = p1.y + (p2.y - p1.y) * 0.5;
  766.  
  767. let dx = p2.x - p1.x;
  768. let dy = p2.y - p1.y;
  769. length += Math.sqrt(dx*dx + dy*dy);
  770. }
  771. else {
  772.  
  773. for(let i=0; i<points-1; i++) {
  774. p1 = seg.geometry.components[i + 0];
  775. p2 = seg.geometry.components[i + 1];
  776.  
  777. let dx = p2.x - p1.x;
  778. let dy = p2.y - p1.y;
  779. length += Math.sqrt(dx*dx + dy*dy);
  780. }
  781. var midlen = length / 2.0;
  782.  
  783. var length1 = 0;
  784. var length2 = 0;
  785. for(let i=0; i<points-1; i++) {
  786. p1 = seg.geometry.components[i + 0];
  787. p2 = seg.geometry.components[i + 1];
  788. let dx = p2.x - p1.x;
  789. let dy = p2.y - p1.y;
  790. length1 = length2;
  791. length2 = length2 + Math.sqrt(dx*dx + dy*dy);
  792.  
  793. if (midlen >= length1 && midlen < length2) {
  794. var proc = (midlen - length1) / (length2 - length1);
  795. x = p1.x + (p2.x - p1.x) * proc;
  796. y = p1.y + (p2.y - p1.y) * proc;
  797. }
  798. }
  799. }
  800.  
  801. return { x:x, y:y, d:length};
  802. }
  803. //------------------------------------------------------------------------------------------------
  804. function merge_imported_change_DB_Sync(item) {
  805.  
  806. var objstore = wazeDB.transaction( 'changes', 'readonly').objectStore('changes');
  807. var range = IDBKeyRange.only( item.ID );
  808. var index = objstore.index( 'ID' );
  809.  
  810. var idexists = false;
  811. var foundthesame = false;
  812.  
  813. index.openCursor(range, "next").onsuccess = function(event) {
  814. var cursor = event.target.result;
  815.  
  816. if (cursor) {
  817. idexists = true;
  818.  
  819. var rekord = cursor.value;
  820. var diff = false;
  821.  
  822. if (rekord.E != item.E) diff = true;
  823. if (rekord.D != item.D) diff = true;
  824. if (rekord.x != item.x) diff = true;
  825. if (rekord.y != item.y) diff = true;
  826. if (rekord.N != item.N) diff = true;
  827. if (rekord.C != item.C) diff = true;
  828. if (rekord.K != item.K) diff = true;
  829. if (rekord.Q != item.Q) diff = true;
  830.  
  831. if (rekord.drA != item.drA) diff = true;
  832. if (rekord.drB != item.drB) diff = true;
  833. if (rekord.tyA != item.tyA) diff = true;
  834. if (rekord.tyB != item.tyB) diff = true;
  835. if (rekord.arA != item.arA) diff = true;
  836. if (rekord.arB != item.arB) diff = true;
  837. if (rekord.naA != item.naA) diff = true;
  838. if (rekord.naB != item.naB) diff = true;
  839. if (rekord.ciA != item.ciA) diff = true;
  840. if (rekord.ciB != item.ciB) diff = true;
  841. if (rekord.trA != item.trA) diff = true;
  842. if (rekord.trB != item.trB) diff = true;
  843. if (rekord.tsA != item.tsA) diff = true;
  844. if (rekord.tsB != item.tsB) diff = true;
  845. if (rekord.lvA != item.lvA) diff = true;
  846. if (rekord.lvB != item.lvB) diff = true;
  847. if (rekord.geA != item.geA) diff = true;
  848. if (rekord.geB != item.geB) diff = true;
  849. if (rekord.tolA != item.tolA) diff = true;
  850. if (rekord.tolB != item.tolB) diff = true;
  851.  
  852. if (!diff) foundthesame = true;
  853.  
  854. cursor.continue();
  855. }
  856. else {
  857. if (idexists) {
  858. if (foundthesame) {
  859. getId('wmerh_progress_info').innerHTML = lang.importeddata + (importcount - importchunk) + ' / ' + (importmaxcount - 2);
  860. setTimeout(wmeroadhistoryIMPORTLOOP, 1);
  861. }
  862. else {
  863.  
  864. let objectStore = wazeDB.transaction('changes', 'readwrite').objectStore('changes');
  865. let request = objectStore.put( item );
  866. request.onsuccess = function() {
  867. getId('wmerh_progress_info').innerHTML = lang.importeddata + (importcount - importchunk) + ' / ' + (importmaxcount - 2);
  868. setTimeout(wmeroadhistoryIMPORTLOOP, 1);
  869. }
  870. }
  871. }
  872. else {
  873. let objectStore = wazeDB.transaction('changes', 'readwrite').objectStore('changes');
  874. let request = objectStore.put( item );
  875. request.onsuccess = function() {
  876. getId('wmerh_progress_info').innerHTML = lang.importeddata + (importcount - importchunk) + ' / ' + (importmaxcount - 2);
  877. setTimeout(wmeroadhistoryIMPORTLOOP, 1);
  878. }
  879. }
  880. }
  881. }
  882. }
  883. //--------------------------------------------------------------------------------------------------------
  884. function changesDB(diff, segID, segtime, segeditor, segx, segy, segnames, segcity, before, after, segkind, segequal) {
  885.  
  886. var item = { ID: segID, T: segtime, E: segeditor, D: diff, x: segx, y: segy, N: segnames, C: segcity, K: segkind, Q: segequal};
  887. if (diff & DIFF_DIR) item.drA = before.D;
  888. if (diff & DIFF_DIR) item.drB = after.D;
  889. if (diff & DIFF_TYPE) item.tyA = before.K;
  890. if (diff & DIFF_TYPE) item.tyB = after.K;
  891. if (diff & DIFF_TURNS) item.arA = before.A;
  892. if (diff & DIFF_TURNS) item.arB = after.A;
  893. if (diff & DIFF_NAMES) item.naA = before.N;
  894. if (diff & DIFF_NAMES) item.naB = after.N;
  895. if (diff & DIFF_CITY) item.ciA = before.C;
  896. if (diff & DIFF_CITY) item.ciB = after.C;
  897. if (diff & DIFF_TR) item.trA = before.TR;
  898. if (diff & DIFF_TR) item.trB = after.TR;
  899. if (diff & DIFF_TS) item.tsA = before.TS;
  900. if (diff & DIFF_TS) item.tsB = after.TS;
  901. if (diff & DIFF_LEVEL) item.lvA = before.L;
  902. if (diff & DIFF_LEVEL) item.lvB = after.L;
  903. if (diff & DIFF_GEOM) item.geA = before.G;
  904. if (diff & DIFF_GEOM) item.geB = after.G;
  905. if (diff & DIFF_TOLL) item.tolA = before.TL;
  906. if (diff & DIFF_TOLL) item.tolB = after.TL;
  907.  
  908. var objectStore = wazeDB.transaction('changes', 'readwrite').objectStore('changes');
  909. var request = objectStore.add( item );
  910. request.onsuccess = function() {
  911. added_changes++;
  912. }
  913. request.onerror = function() {
  914. }
  915. }
  916. //--------------------------------------------------------------------------------------------------------
  917. function addDB(segID, roadtime, roadeditor, roaddir, roadkind, roadarrows, roadnames, roadcity, roadtr, roadts, roadlevel, roadgeom, roadgeom2, roadtoll, roadx, roady, roadequal, roadpoints) {
  918.  
  919. var objectStore = wazeDB.transaction('segments', 'readwrite').objectStore('segments');
  920. var request = objectStore.get( segID );
  921. request.onsuccess = function() {
  922. if(request.result) {
  923. var item = { ID: segID, T: roadtime, E: roadeditor, D: roaddir, K: roadkind, A: roadarrows, N: roadnames, C: roadcity, TR: roadtr, TS: roadts, L: roadlevel, G: roadgeom2, TL: roadtoll, x: roadx, y: roady, Q:roadequal, P:roadpoints };
  924. var rekord = request.result;
  925.  
  926. var diff = 0;
  927. if (roaddir != rekord.D) diff |= DIFF_DIR;
  928. if (roadkind != rekord.K) diff |= DIFF_TYPE;
  929. if (roadarrows != rekord.A) {
  930. //sortowanie i ujednolicenie rekordów przed porównaniem
  931. //z powodu różnej kolejności zmiennych na różnych platformach Chrome/Firefox
  932. if (roadarrows.length == rekord.A.length) {
  933. var a = roadarrows.split('·');
  934. var b = rekord.A.split('·');
  935. a.sort();
  936. b.sort();
  937. if (a.toString() != b.toString())
  938. diff |= DIFF_TURNS;
  939. }
  940. else
  941. diff |= DIFF_TURNS;
  942. }
  943. if (roadnames != rekord.N) {
  944. //poprawione porównywanie nazw Alt, zdarza się, że nazwy w Alt potrafią być zwrócone przez mechanizm WME w innej przypadkowej kolejności!
  945. var names1 = roadnames.split(',');
  946. var names2 = rekord.N.split(',');
  947. names1.sort();
  948. names2.sort();
  949. if (names1.toString() != names2.toString())
  950. diff |= DIFF_NAMES;
  951. }
  952. if (roadcity != rekord.C) diff |= DIFF_CITY;
  953.  
  954. //posortowanie i porównanie wpisów zawierających ograniczenia bazujące na czasie, mogą być w różnej kolejności zwrócone przez mechanizm WME
  955. //kolejność ograniczeń na liście nie ma znaczenia są traktowane operatorem logicznym OR
  956. //zmiana tej kolejności nie powinna być odnotowana jako zmiana edycyjna przez skrypt stąd wcześniejsze posortowanie i dopiero porównanie danych
  957. if (roadtr != rekord.TR) {
  958. var tab1 = roadtr.split('²');
  959. var tab2 = rekord.TR.split('²');
  960. tab1.sort();
  961. tab2.sort();
  962. var vstr1 = '';
  963. var vstr2 = '';
  964. for(let i=0; i<tab1.length; i++) {
  965. let v = tab1[i].split('¹');
  966. v.sort();
  967. vstr1 += v.toString();
  968. }
  969. for(let i=0; i<tab2.length; i++) {
  970. let v = tab2[i].split('¹');
  971. v.sort();
  972. vstr2 += v.toString();
  973. }
  974. if (vstr1.toString() != vstr2.toString())
  975. diff |= DIFF_TR;
  976. }
  977.  
  978. //posortowanie i porównanie wpisów zawierających ograniczenia dla skrętów, mogą być w różnej kolejności zwrócone przez mechanizm WME
  979. //kolejność ograniczeń na liście nie ma znaczenia są traktowane operatorem logicznym OR
  980. //zmiana tej kolejności nie powinna być odnotowana jako zmiana edycyjna przez skrypt stąd wcześniejsze posortowanie i dopiero porównanie danych
  981. if (roadts != rekord.TS) {
  982. let tab1 = roadts.split('²');
  983. let tab2 = rekord.TS.split('²');
  984. tab1.sort();
  985. tab2.sort();
  986. let vstr1 = '';
  987. let vstr2 = '';
  988. for(let i=0; i<tab1.length; i++) {
  989. let v = tab1[i].split('¹');
  990. v.sort();
  991. vstr1 += v.toString();
  992. }
  993. for(let i=0; i<tab2.length; i++) {
  994. let v = tab2[i].split('¹');
  995. v.sort();
  996. vstr2 += v.toString();
  997. }
  998. if (vstr1.toString() != vstr2.toString())
  999. diff |= DIFF_TS;
  1000. }
  1001.  
  1002. if (roadlevel != rekord.L) diff |= DIFF_LEVEL;
  1003. //porównanie dwóch sum kontrolnych w starej i nowej wersji
  1004. if (roadgeom != rekord.G && roadgeom2 != rekord.G) {
  1005. //sprawdzenie czy wraz ze zmianą geometrii zmienił się również znacznik czasowy
  1006. //czy różnica jest wynikiem błędu zaokrąglenia starej sumy
  1007. if (roadtime != rekord.T) {
  1008. diff |= DIFF_GEOM;
  1009. }
  1010. }
  1011. if (roadtoll != rekord.TL) diff |= DIFF_TOLL;
  1012.  
  1013. if (diff) {
  1014. if (roadtime == rekord.T) {
  1015. let t = new Date();
  1016. roadtime = parseInt(t.getTime() / 1000);
  1017. roadeditor = '?';
  1018. }
  1019.  
  1020. changesDB(diff, segID, roadtime, roadeditor, roadx, roady, roadnames, roadcity, rekord, item, roadkind, roadequal);
  1021. }
  1022.  
  1023. //aktualizacja rekordu w bazie danych zawsze
  1024. objectStore.put( item );
  1025. scanned_segments++;
  1026. }
  1027. else {
  1028. added_segments++;
  1029.  
  1030. let item = { ID: segID, T: roadtime, E: roadeditor, D: roaddir, K: roadkind, A: roadarrows, N: roadnames, C: roadcity, TR: roadtr, TS:roadts, L: roadlevel, G: roadgeom2, TL: roadtoll, x: roadx, y: roady, Q:roadequal, P:roadpoints };
  1031. objectStore.put( item );
  1032. scanned_segments++;
  1033. }
  1034. }
  1035. request.onerror = function() {
  1036. }
  1037. }
  1038. //--------------------------------------------------------------------------------------------------------
  1039. function SCAN_SEGMENTS() {
  1040. let segments = W.model.segments.getObjectArray();
  1041.  
  1042. for(let i=0;i<segments.length;i++){//(var seg in W.model.segments.getObjectArray()) {
  1043. var segment = segments[i]; //W.model.segments.getObjectById(seg);
  1044. var attributes = segment.attributes;
  1045. var line = getId(segment.geometry.id);
  1046. var segID = attributes.id;
  1047.  
  1048. if (line !== null && segID !== null) {
  1049. if (scanned_segments_list[segID] === undefined) {
  1050. scanned_segments_list[segID] = 1;
  1051.  
  1052. var xyd = getMidPointLen( segment );
  1053. var roadx = parseInt( xyd.x );
  1054. var roady = parseInt( xyd.y );
  1055.  
  1056. var roadpoints = [];
  1057. var points = attributes.geometry.components;
  1058. var num = points.length;
  1059. roadpoints.push ( parseInt(points[0].x + 0.5) );
  1060. roadpoints.push ( parseInt(points[0].y + 0.5) );
  1061. roadpoints.push ( parseInt(points[num-1].x + 0.5) );
  1062. roadpoints.push ( parseInt(points[num-1].y + 0.5) );
  1063.  
  1064. //sprawdzenie czy oba końce drogi są poza skanowanym obszarem mapy
  1065. var both_ends_behind_scanarea = 0;
  1066. if (roadpoints[0] < rec_xy1.lon) both_ends_behind_scanarea |= 1;
  1067. if (roadpoints[0] > rec_xy2.lon) both_ends_behind_scanarea |= 1;
  1068. if (roadpoints[2] < rec_xy1.lon) both_ends_behind_scanarea |= 2;
  1069. if (roadpoints[2] > rec_xy2.lon) both_ends_behind_scanarea |= 2;
  1070. if (roadpoints[1] > rec_xy1.lat) both_ends_behind_scanarea |= 1;
  1071. if (roadpoints[1] < rec_xy2.lat) both_ends_behind_scanarea |= 1;
  1072. if (roadpoints[3] > rec_xy1.lat) both_ends_behind_scanarea |= 2;
  1073. if (roadpoints[3] < rec_xy2.lat) both_ends_behind_scanarea |= 2;
  1074. if (both_ends_behind_scanarea == 3) continue;
  1075.  
  1076. var roadtime = parseInt(attributes.updatedOn / 1000);
  1077. var roadcreated = parseInt(attributes.createdOn / 1000);
  1078. var roadequal = 0;
  1079.  
  1080. if (roadtime == roadcreated) roadequal = 1;
  1081.  
  1082. var roadeditor = parseInt(attributes.updatedBy);
  1083. var user = W.model.users.getObjectById(roadeditor);
  1084. if (user === null || typeof(user) === "undefined")
  1085. roadeditor = '-';
  1086. else
  1087. roadeditor = user.userName + '(' + user.normalizedLevel + ')';
  1088.  
  1089. var roadkind = parseInt(attributes.roadType);
  1090. var roaddir = (attributes.fwdDirection ? 1 : 0) * 2 + (attributes.revDirection ? 1 : 0);
  1091.  
  1092. var roadarrows = '';
  1093.  
  1094. //zwraca różną kolejność danych na różnych platformach Chrome/Firefox
  1095. //for (s in attributes.fromConnections) { roadarrows += 'A' + parseInt(s) + '·'; }
  1096. //for (s in attributes.toConnections) { roadarrows += 'B' + parseInt(s) + '·'; }
  1097.  
  1098. //procedura zapewniająca tę samą kolejność danych za pomocą sortowania
  1099. //istotne podczas porównywania utworzonych rekordów na różnych platformach Chrome/Firefox
  1100. var fromConn = new Array();
  1101. var toConn = new Array();
  1102. for (s in attributes.fromConnections) { fromConn.push( parseInt(s) ); }
  1103. for (s in attributes.toConnections) { toConn.push( parseInt(s) ); }
  1104. fromConn.sort();
  1105. toConn.sort();
  1106. for (let i=0; i<fromConn.length; i++)
  1107. roadarrows += 'A' + fromConn[i] + '·';
  1108. for (let i=0; i<toConn.length; i++)
  1109. roadarrows += 'B' + toConn[i] + '·';
  1110.  
  1111.  
  1112. var roadnames = '';
  1113. var roadcity = '';
  1114.  
  1115. let street = W.model.streets.getObjectById(attributes.primaryStreetID);
  1116. if (street != undefined) {
  1117. if (street.name != null) {
  1118. roadnames += street.name;
  1119. }
  1120. if (street.cityID != null) {
  1121. var city = W.model.cities.getObjectById(street.cityID);
  1122. roadcity = city.isEmpty ? '·' : city.name;
  1123. }
  1124. }
  1125. for(var j=0; j<attributes.streetIDs.length; j++) {
  1126. var sid = attributes.streetIDs[j];
  1127. if (sid !== null) {
  1128. let street = W.model.streets.getObjectById(sid);
  1129. if (street != undefined) {
  1130. if (street.name != null) {
  1131. if (roadnames != '') roadnames += ", ";
  1132. roadnames += street.name;
  1133. }
  1134. }
  1135. }
  1136. }
  1137.  
  1138. var roadtr = '';
  1139.  
  1140. /* //This is broken right now - have to change to check the turngraph...which is ugly and complicated
  1141. var tr = attributes.fwdRestrictions;
  1142. if (tr.length) {
  1143. roadtr += 'AB¹';
  1144. for(let i=0; i<tr.length; i++) {
  1145. roadtr += (tr[i].allDay==true ? 1 : 0) + '·';
  1146. roadtr += tr[i].days + '·';
  1147. roadtr += tr[i].description + '·';
  1148. roadtr += (tr[i].enabled ? 1 : 0) + '·';
  1149. roadtr += (tr[i].fromDate == null ? '' : tr[i].fromDate) + '·';
  1150. roadtr += (tr[i].fromTime == null ? '00:00' : tr[i].fromTime) + '·';
  1151. roadtr += (tr[i].toDate == null ? '' : tr[i].toDate) + '·';
  1152. roadtr += (tr[i].toTime == null ? '23:59' : tr[i].toTime) + '·';
  1153. roadtr += tr[i].vehicleTypes + '¹';
  1154. }
  1155. roadtr += '²';
  1156. }
  1157.  
  1158. var tr = attributes.revRestrictions;
  1159. if (tr.length) {
  1160. roadtr += 'BA¹';
  1161. for(let i=0; i<tr.length; i++) {
  1162. roadtr += (tr[i].allDay==true ? 1 : 0) + '·';
  1163. roadtr += tr[i].days + '·';
  1164. roadtr += tr[i].description + '·';
  1165. roadtr += (tr[i].enabled ? 1 : 0) + '·';
  1166. roadtr += (tr[i].fromDate == null ? '' : tr[i].fromDate) + '·';
  1167. roadtr += (tr[i].fromTime == null ? '00:00' : tr[i].fromTime) + '·';
  1168. roadtr += (tr[i].toDate == null ? '' : tr[i].toDate) + '·';
  1169. roadtr += (tr[i].toTime == null ? '23:59' : tr[i].toTime) + '·';
  1170. roadtr += tr[i].vehicleTypes + '¹';
  1171. }
  1172. roadtr += '²';
  1173. }
  1174. */
  1175. var roadts = '';
  1176. /*
  1177. for(trseg in attributes.toRestrictions) {
  1178. var tr = attributes.toRestrictions[trseg];
  1179. roadts += 'B' + trseg + '¹';
  1180. for(let i=0; i<tr.length; i++) {
  1181. roadts += (tr[i].allDay==true ? 1 : 0) + '·';
  1182. roadts += tr[i].days + '·';
  1183. roadts += tr[i].description + '·';
  1184. roadts += (tr[i].enabled ? 1 : 0) + '·';
  1185. roadts += (tr[i].fromDate == null ? '' : tr[i].fromDate) + '·';
  1186. roadts += (tr[i].fromTime == null ? '00:00' : tr[i].fromTime) + '·';
  1187. roadts += (tr[i].toDate == null ? '' : tr[i].toDate) + '·';
  1188. roadts += (tr[i].toTime == null ? '23:59' : tr[i].toTime) + '·';
  1189. roadts += tr[i].vehicleTypes + '¹';
  1190. }
  1191. roadts += '²';
  1192. }
  1193.  
  1194. for(trseg in attributes.fromRestrictions) {
  1195. var tr = attributes.fromRestrictions[trseg];
  1196. roadts += 'A' + trseg + '¹';
  1197. for(let i=0; i<tr.length; i++) {
  1198. roadts += (tr[i].allDay==true ? 1 : 0) + '·';
  1199. roadts += tr[i].days + '·';
  1200. roadts += tr[i].description + '·';
  1201. roadts += (tr[i].enabled ? 1 : 0) + '·';
  1202. roadts += (tr[i].fromDate == null ? '' : tr[i].fromDate) + '·';
  1203. roadts += (tr[i].fromTime == null ? '00:00' : tr[i].fromTime) + '·';
  1204. roadts += (tr[i].toDate == null ? '' : tr[i].toDate) + '·';
  1205. roadts += (tr[i].toTime == null ? '23:59' : tr[i].toTime) + '·';
  1206. roadts += tr[i].vehicleTypes + '¹';
  1207. }
  1208. roadts += '²';
  1209. }*/
  1210.  
  1211. var roadlevel = parseInt(attributes.level);
  1212. var roadgeom = crc32(attributes.geometry.toString());
  1213. var roadtoll = (attributes.fwdToll ? 1 : 0) * 2 + (attributes.revToll ? 1 : 0);
  1214.  
  1215. //pod Chrome i Firefox występują różne błędy zaokrągleń w rezultacie jest inna suma kontrolna geometrii!!!
  1216. //porównanie dwóch wariantów sum kontrolnych starej i zastąpienie nową z poprawionym błędem zaokrąglenia
  1217. var pstr = '';
  1218. for(var p=0; p<attributes.geometry.components.length; p++) {
  1219. var pt = attributes.geometry.components[p];
  1220. var xrounded = parseInt(pt.x * 1000 + 0.5) / 1000.0;
  1221. var yrounded = parseInt(pt.y * 1000 + 0.5) / 1000.0;
  1222. if (!p) pstr += 'POINT(' + xrounded + ' ' + yrounded + ')';
  1223. else pstr += ',POINT(' + xrounded + ' ' + yrounded + ')';
  1224. }
  1225. var roadgeom2 = crc32(pstr);
  1226.  
  1227.  
  1228. addDB(segID, roadtime, roadeditor, roaddir, roadkind, roadarrows, roadnames, roadcity, roadtr, roadts, roadlevel, roadgeom, roadgeom2, roadtoll, roadx, roady, roadequal, roadpoints);
  1229. }
  1230. }
  1231. }
  1232.  
  1233. updateCountTime();
  1234. }
  1235. //--------------------------------------------------------------------------------------------------------
  1236. function updateCountTime() {
  1237. var tNow = new Date();
  1238. var t = parseInt( (tNow.getTime() - rec_elapsed_time) / 1000);
  1239. var ts = '';
  1240. if (t < 60)
  1241. ts = t + '&nbsp;' + lang.sec;
  1242. else {
  1243. var a = parseInt(t / 60);
  1244. var b = t - a*60;
  1245. if (b<10) ts = a + ':0' + b + '&nbsp;min.'
  1246. else ts = a + ':' + b + '&nbsp;min.'
  1247. }
  1248.  
  1249. var bs = '';
  1250. var be = '';
  1251. if (added_changes) {
  1252. bs = '<b>';
  1253. be = '</b>';
  1254. }
  1255.  
  1256. getId('wmeroadhistory_log').innerHTML = lang.segments + ':&nbsp;' + scanned_segments + ' &nbsp; ' + bs + lang.changes + ':&nbsp;' + added_changes + be + '<br>(' + ts + ')' + scanproc;
  1257. }
  1258. //--------------------------------------------------------------------------------------------------------
  1259. function selectShowTurn(segs)
  1260. {
  1261.  
  1262. for(let i=0; i<4; i++) {
  1263. if (segs[i]==0) continue;
  1264.  
  1265. var segment = W.model.segments.getObjectById( segs[i] );
  1266. if (segment != undefined) {
  1267.  
  1268. var line = getId(segment.geometry.id);
  1269. if (line !== null) {
  1270.  
  1271. var color = line.getAttribute("stroke");
  1272. var opacity = line.getAttribute("stroke-opacity");
  1273. var lineWidth = line.getAttribute("stroke-width");
  1274.  
  1275. var kol1 = '#FE61FE';
  1276. var kol2 = '#FE01FE';
  1277.  
  1278. var selected = false;
  1279. //if (opacity == 1 || lineWidth == 9) selected = true; // nie działa poprawnie zaznaczanie - wchodzi w interakcję z WME Highlights
  1280. //if (color == kol1) selected = false;
  1281. //if (color == kol2) selected = false;
  1282. if (color == '#03b9da') selected = true;
  1283. if (color == '#00d8ff') selected = true;
  1284.  
  1285. if (!selected) {
  1286. if (i < 2) {
  1287. if (color == kol1 || color == kol2) {
  1288. line.setAttribute("stroke", "#dd7700");
  1289. line.setAttribute("stroke-opacity", 0.001 );
  1290. line.setAttribute("stroke-width", 2);
  1291. }
  1292. }
  1293. else if (i == 2) {
  1294. if (color != kol1) {
  1295. line.setAttribute("stroke", kol1);
  1296. line.setAttribute("stroke-opacity", 0.601 );
  1297. line.setAttribute("stroke-width", 9);
  1298. }
  1299. }
  1300. else if (i == 3) {
  1301. if (color != kol2) {
  1302. line.setAttribute("stroke", kol2);
  1303. line.setAttribute("stroke-opacity", 0.801 );
  1304. line.setAttribute("stroke-width", 9);
  1305. }
  1306. }
  1307. }
  1308. }
  1309. }
  1310. }
  1311. }
  1312. //--------------------------------------------------------------------------------------------------------
  1313. function wmeroadhistoryLOOP()
  1314. {
  1315. //--------- zaznaczenie skrętu na mapie
  1316. selectShowTurn(showturn);
  1317.  
  1318. //--------- aktualizacja statystyk ----------------------------------------
  1319. //statystyki są podliczane z opóźnieniem 2 sek., aby nie przeciążać przeglądanych edycji
  1320. if (updatestatsdelay) {
  1321. updatestatsdelay--;
  1322. if (updatestatsdelay == 0) showstatsdelayed();
  1323. }
  1324.  
  1325. //--------- aktualizacja liczby przeskanowanych segmentów i zmian ---------
  1326. if (scanned_segments != scanned_segments_prev || added_changes != added_changes_prev) {
  1327. scanned_segments_prev = scanned_segments;
  1328. added_changes_prev = added_changes;
  1329. updateCountTime();
  1330. }
  1331.  
  1332. //--------- przywrócenie pozycji sidebar, która resetuje się po zaznaczeniu segmentu --------
  1333. if (getId('wmeroadhistory_scanarea').onclick == null)
  1334. getId('wmeroadhistory_list').innerHTML = '<p class=wmeroadhistory_amonly>' + lang.amonly + '</p>';
  1335.  
  1336. var scanarea = getId('wmeroadhistory_scanarea');
  1337. var tab = getId('wmeroadhistory_tab');
  1338. var sidebar = getId('sidebar');
  1339. var userinfoDisp = getId('user-info').style.display;
  1340. if (tab.className == 'active') {
  1341. if (userinfoDisp == 'block') {
  1342. if (userinfoDisp != userinfoDispPrev)
  1343. sidebar.scrollTop = prevScroll;
  1344. prevScroll = sidebar.scrollTop;
  1345. }
  1346. userinfoDispPrev = userinfoDisp;
  1347. }
  1348.  
  1349. //-------- inicjalizacja warstwy na której będą pokazywane markery --------
  1350. create_markers_layer();
  1351.  
  1352. //-------- główna procedura skacząca po mapie -----------------------------
  1353. if (rec) {
  1354.  
  1355. //oczekiwanie na gotowość mapy za pomocą badania przycisku hidden lub zdarzeń vent
  1356. //nie wiadomo, która z tych metod jest lepsza i stabilniejsza w praktyce
  1357. //metoda vent zostaje, teoretycznie powinna być tą najlepszą
  1358.  
  1359. var ready = (ventCount==0); // metoda vent
  1360. //var ready = (wazepending.className.indexOf("hidden") >= 0); // metoda hidden
  1361. //var ready = (wazepending.className.indexOf("hidden") >= 0) && (ventCount==0); // połączenie dwóch metod
  1362.  
  1363. if (ready) {
  1364.  
  1365. var WM = window.W.map;
  1366. var zoom = WM.getZoom();
  1367. var W = WM.getSize().w;
  1368. var H = WM.getSize().h;
  1369.  
  1370. if (zoom == rec_zoom) {
  1371.  
  1372. //zakładka 30px niepotrzebna segmenty na obrzeżach okna ładowane są i tak z pewnym marginesem
  1373. //W -= 30;
  1374. //H -= 30;
  1375.  
  1376. var cent = WM.getCenter();
  1377.  
  1378. var scanprocenty = (cent.lat - rec_xy1.lat) / (rec_xy2.lat - rec_xy1.lat);
  1379. var scanprocentx = (cent.lon - rec_xy1.lon) / (rec_xy2.lon - rec_xy1.lon);
  1380. if (scanprocenty < 0) scanprocenty = 0;
  1381. if (scanprocenty > 1) scanprocenty = 1;
  1382. if (scanprocentx < 0) scanprocentx = 0;
  1383. if (scanprocentx > 1) scanprocentx = 1;
  1384.  
  1385. var proc = scanprocenty;
  1386. if (rec_direction == 1) proc += scanprocentyDelta * scanprocentx;
  1387. if (rec_direction == 3) proc += scanprocentyDelta * (1 - scanprocentx);
  1388. if (proc < 0) proc = 0;
  1389. if (proc > 1) proc = 1;
  1390.  
  1391. if (scanprocenty > scanprocentyPrev) {
  1392. scanprocentyDelta = scanprocenty - scanprocentyPrev;
  1393. scanprocentyPrev = scanprocenty;
  1394. }
  1395.  
  1396. scanproc = '&nbsp;&nbsp;&nbsp;' + precFloat(proc * 100, 1) + '%';
  1397.  
  1398. var wsp = new OL.LonLat(cent.lon, cent.lat).transform(epsg900913, epsg4326);
  1399. var log = 'WME Road History LOG: ' + precFloat(proc * 100, 1) + '% segs: ' + scanned_segments + ' cent: ' + precFloat(wsp.lon, 8) + ',' + precFloat(wsp.lat, 8) + ' zoom: ' + zoom + ' window: ' + W + ' ' + H;
  1400. console.log(log);
  1401.  
  1402. SCAN_SEGMENTS();
  1403.  
  1404.  
  1405. if (rec_direction == 1 && cent.lon > rec_xy2.lon) rec_direction = 2;
  1406. if (rec_direction == 3 && cent.lon < rec_xy1.lon) rec_direction = 4;
  1407.  
  1408. //czasami potrafi zwrócić "Uncaught TypeError: undefined is not a function" dla dużego obszaru roboczego mapy np. 3030 x 1722 px.
  1409. //rzadko to się zdarza, błąd nie jest nawet powtarzalny, wygląda to na jakiś bug wewnętrzny po stronie serwera WME
  1410. //możliwe, że występuje tylko wtedy, gdy mapa na serwerze jest w trakcie aktualizacji
  1411. //rozwiązaniem od strony użytkownika jest zmniejszenie okna mapy, restart przeglądarki i ponowne uruchomienie skanowania
  1412. //bądź wystarczy delikatne zmienić obszar skanowania o kilka pikseli
  1413.  
  1414. //skok mapy za pomocą WM.setCenter
  1415. //var e1 = new OL.Geometry.Point(0, 0);
  1416. //var e2 = new OL.Geometry.Point(W, H);
  1417. //var p1 = WM.getLonLatFromViewPortPx(e1);
  1418. //var p2 = WM.getLonLatFromViewPortPx(e2);
  1419. //var dx = p2.lon - p1.lon;
  1420. //var dy = p2.lat - p1.lat;
  1421. //var x = cent.lon;
  1422. //var y = cent.lat;
  1423. //if (rec_direction == 1) { x += dx; }
  1424. //else if (rec_direction == 2) { y += dy; rec_direction = 3; }
  1425. //else if (rec_direction == 3) { x -= dx; }
  1426. //else if (rec_direction == 4) { y += dy; rec_direction = 1; }
  1427. //WM.setCenter( [x, y], zoom );
  1428.  
  1429.  
  1430. //skok mapy za pomocą panoramowania widoku WM.pan
  1431. if (rec_direction == 1) WM.pan( W, 0);
  1432. else if (rec_direction == 2) { WM.pan( 0, H); rec_direction = 3; }
  1433. else if (rec_direction == 3) WM.pan(-W, 0);
  1434. else if (rec_direction == 4) { WM.pan( 0, H); rec_direction = 1; }
  1435.  
  1436.  
  1437. if (cent.lon > rec_xy2.lon && cent.lat < rec_xy2.lat) {
  1438. stopRec(true);
  1439. LastTimeScan = rec_elapsed_time;
  1440.  
  1441. scanproc = '';
  1442. updateCountTime();
  1443. }
  1444. }
  1445. }
  1446. }
  1447. }
  1448. //--------------------------------------------------------------------------------------------------------
  1449. function wmeroadhistorySCANAREA() {
  1450. var WM = window.W.map;
  1451.  
  1452. if (rec)
  1453. stopRec(false);
  1454. else {
  1455.  
  1456. last_LONLAT = WM.getCenter();
  1457. last_ZOOM = WM.getZoom();
  1458.  
  1459. let Width = WM.getSize().w;
  1460. let Height = WM.getSize().h;
  1461.  
  1462. let e1 = new OL.Geometry.Point(0, 0);
  1463. let e2 = new OL.Geometry.Point(Width, Height);
  1464.  
  1465. rec_xy1 = WM.getLonLatFromViewPortPx(e1);
  1466. rec_xy2 = WM.getLonLatFromViewPortPx(e2);
  1467.  
  1468. rec_direction = 1;
  1469. getId('wmeroadhistory_log').innerHTML = '&nbsp;';
  1470.  
  1471. scanned_segments_list = {};
  1472. scanned_segments = 0;
  1473. scanned_segments_prev = 0;
  1474. added_segments = 0;
  1475. added_segments_prev = 0;
  1476. added_changes = 0;
  1477. added_changes_prev = 0;
  1478. scanprocentyPrev = 0;
  1479. scanprocentyDelta = 0;
  1480. scanprocPrev = 0;
  1481.  
  1482. let tNow = new Date();
  1483. rec_elapsed_time = tNow.getTime();
  1484.  
  1485. rec_zoom = last_ZOOM + 1;
  1486. if (rec_zoom < 5) rec_zoom = 5;
  1487. if (rec_zoom > 10) rec_zoom = 10;
  1488.  
  1489. if (typeof W == 'undefined') W = window.W;
  1490. if (typeof W.loginManager == 'undefined') W.loginManager = window.W.loginManager;
  1491. if (W.loginManager && W.loginManager.isLoggedIn()) {
  1492. let thisUser = W.loginManager.user;
  1493. var lev = thisUser.normalizedLevel;
  1494. if (thisUser !== null && (lev*lev >= lev+lev+lev || thisUser.isAreaManager)) {
  1495. rec = true;
  1496. WM.zoomTo(rec_zoom);
  1497. WM.panTo(rec_xy1);
  1498.  
  1499. updateSaveButton(rec);
  1500. }
  1501. }
  1502. }
  1503. }
  1504. //--------------------------------------------------------------------------------------------------------
  1505. function htmlEntities(str) {
  1506. return String(str).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/\'/g, '&#39;').replace(/\r/g, ' ').replace(/\n/g, ' ');
  1507. }
  1508. //--------------------------------------------------------------------------------------------------------
  1509. function createLink(segx, segy, zoom, idsegments) {
  1510. var WM = window.W.map;
  1511.  
  1512. var docurl = document.URL;
  1513. var docurlparams = docurl.split('&');
  1514.  
  1515. var layers = '';
  1516. var link = '';
  1517. for(let i=0; i<docurlparams.length; i++) {
  1518. if (docurlparams[i].indexOf( 'waze.com' ) >= 0) link = docurlparams[i];
  1519. if (docurlparams[i].indexOf( 'layers' ) >= 0) layers = docurlparams[i];
  1520. }
  1521.  
  1522. var lonlat = new OL.LonLat(segx, segy).transform(epsg900913, epsg4326);
  1523.  
  1524. link += '&lon=' + parseInt(lonlat.lon * 1000000 + 0.5) / 1000000;
  1525. link += '&lat=' + parseInt(lonlat.lat * 1000000 + 0.5) / 1000000;
  1526. if (layers != '') link += '&' + layers;
  1527. link += '&zoom=' + zoom;
  1528. link += '&segments=' + idsegments;
  1529.  
  1530. return link;
  1531. }
  1532. //--------------------------------------------------------------------------------------------------------
  1533. function gotoSEG(x, y, segid) {
  1534. var WM = window.W.map;
  1535. var xy = new OL.LonLat( x, y );
  1536.  
  1537. WM.panTo(xy);
  1538. WM.zoomTo(6);
  1539.  
  1540. showturn[0] = showturn[2];
  1541. showturn[1] = showturn[3];
  1542. showturn[2] = segid;
  1543. showturn[3] = 0;
  1544. }
  1545. //--------------------------------------------------------------------------------------------------------
  1546. function gotoTURN(event) {
  1547. var WM = window.W.map;
  1548.  
  1549. var segs = event.target.id.split('_');
  1550. var seg1 = parseInt( segs[1] );
  1551. var segN = segs[2];
  1552. var seg2 = parseInt( segs[3] );
  1553.  
  1554. var objectStore = wazeDB.transaction('segments', 'readonly').objectStore('segments');
  1555. var request = objectStore.get( seg1 );
  1556. request.onsuccess = function() {
  1557. var rekord = request.result;
  1558. if(rekord) {
  1559.  
  1560. if (rekord.P.length >= 2) {
  1561. if (segN == 'A') {
  1562. let x = rekord.P[ 0 ];
  1563. let y = rekord.P[ 1 ];
  1564. }
  1565. else {
  1566. let x = rekord.P[ rekord.P.length - 2 ];
  1567. let y = rekord.P[ rekord.P.length - 1 ];
  1568. }
  1569. var xy = new OL.LonLat( x, y );
  1570.  
  1571. showturn[0] = showturn[2];
  1572. showturn[1] = showturn[3];
  1573. showturn[2] = seg1;
  1574. showturn[3] = seg2;
  1575.  
  1576. WM.panTo(xy);
  1577. WM.zoomTo(6);
  1578. }
  1579.  
  1580. }
  1581. }
  1582.  
  1583. }
  1584. //--------------------------------------------------------------------------------------------------------
  1585. function foundPELinkName( pe, seg2 ) {
  1586.  
  1587. var objectStore = wazeDB.transaction('segments', 'readonly').objectStore('segments');
  1588. var request = objectStore.get( seg2 );
  1589. request.onsuccess = function() {
  1590. var rekord = request.result;
  1591. if (rekord) {
  1592. if (rekord.N == '') pe.innerHTML = lang.into + lang.noname;
  1593. else pe.innerHTML = lang.into + rekord.N;
  1594. }
  1595. }
  1596. }
  1597. //--------------------------------------------------------------------------------------------------------
  1598. function formatRestriction(str, bs, be) {
  1599. var items = str.split('·');
  1600.  
  1601. var li = document.createElement('p');
  1602.  
  1603. if (items[4]=='') li.innerHTML += bs + lang.allweek + be + '<br>';
  1604. else li.innerHTML += bs + items[4] + ' <span style="font-weight:normal">..</span> ' + items[6] + be + '<br>';
  1605.  
  1606. if (items[0] == 0) li.innerHTML += bs + items[5] + ' - ' + items[7] + be + '<br>';
  1607.  
  1608. if (items[1] != 127) {
  1609. let html = bs;
  1610. if (items[1] & 0x01) { if (html!='') html+=' · '; html += lang.day1; }
  1611. if (items[1] & 0x02) { if (html!='') html+=' · '; html += lang.day2; }
  1612. if (items[1] & 0x04) { if (html!='') html+=' · '; html += lang.day3; }
  1613. if (items[1] & 0x08) { if (html!='') html+=' · '; html += lang.day4; }
  1614. if (items[1] & 0x10) { if (html!='') html+=' · '; html += lang.day5; }
  1615. if (items[1] & 0x20) { if (html!='') html+=' · '; html += lang.day6; }
  1616. if (items[1] & 0x40) { if (html!='') html+=' · '; html += lang.day7; }
  1617. html += be + '<br>';
  1618. li.innerHTML += html;
  1619. }
  1620. if (items[2]!='') li.innerHTML += '<i>&quot;' + htmlEntities(items[2]) + '&quot;</i><br>';
  1621.  
  1622. if (items[8] != '-1') {
  1623. li.innerHTML += lang.exceptvehicles + '<br>';
  1624. let html = bs;
  1625. if ((items[8] & 0x01)==0) html += '- ' + lang.veh1 + '<br>';
  1626. if ((items[8] & 0x02)==0) html += '- ' + lang.veh2 + '<br>';
  1627. if ((items[8] & 0x04)==0) html += '- ' + lang.veh3 + '<br>';
  1628. if ((items[8] & 0x08)==0) html += '- ' + lang.veh4 + '<br>';
  1629. if ((items[8] & 0x10)==0) html += '- ' + lang.veh5 + '<br>';
  1630. if ((items[8] & 0x20)==0) html += '- ' + lang.veh6 + '<br>';
  1631. if ((items[8] & 0x40)==0) html += '- ' + lang.veh7 + '<br>';
  1632. if ((items[8] & 0x80)==0) html += '- ' + lang.veh8 + '<br>';
  1633. if ((items[8] & 0x100)==0) html += '- ' + lang.veh9 + '<br>';
  1634. if ((items[8] & 0x200)==0) html += '- ' + lang.veh10 + '<br>';
  1635. if ((items[8] & 0x400)==0) html += '- ' + lang.veh11 + '<br>';
  1636. html += be;
  1637. li.innerHTML += html;
  1638. }
  1639.  
  1640. return li;
  1641. }
  1642. //--------------------------------------------------------------------------------------------------------
  1643. function create_markers_layer() {
  1644.  
  1645. var WM = window.W.map;
  1646. var OL = window.OL;
  1647.  
  1648. var mlayers = WM.getLayersBy("uniqueName","__WMERoadHistoryMarkers");
  1649. if (mlayers.length == 0) {
  1650. let drc_mapLayer;
  1651. //----------wersja z ikonkami jest bardzo wolna, pokazanie na mapie 1000 ikonek spowalnia mocno rendering
  1652. if (ICONMODE == 1) {
  1653. drc_mapLayer = new OL.Layer.Markers("WME Road History", {
  1654. displayInLayerSwitcher: true,
  1655. uniqueName: "__WMERoadHistoryMarkers"
  1656. });
  1657. }
  1658.  
  1659. //----------wersja z liniami lepsza i szybsza w renderingu
  1660. if (ICONMODE == 0) {
  1661. var drc_style = new OL.Style({
  1662. strokeDashstyle: 'solid',
  1663. strokeColor : '${lineColor}',
  1664. strokeOpacity: 0.5,
  1665. strokeWidth: '${lineWidth}',
  1666. fillColor: '#000000',
  1667. fillOpacity: 0,
  1668. pointRadius: 0,
  1669. label : '${labelText}',
  1670. fontFamily: 'Tahoma',
  1671. labelOutlineColor: '#FFFFFF',
  1672. labelOutlineWidth: '2',
  1673. fontColor: '${labelColor}',
  1674. fontOpacity: 1,
  1675. fontSize: '9px',
  1676. display: 'block'
  1677. });
  1678.  
  1679. drc_mapLayer = new OL.Layer.Vector("WME Road History", {
  1680. displayInLayerSwitcher: true,
  1681. styleMap: new OL.StyleMap(drc_style),
  1682. uniqueName: "__WMERoadHistoryMarkers"
  1683. });
  1684. }
  1685.  
  1686. I18n.translations[I18n.currentLocale()].layers.name["__WMERoadHistoryMarkers"] = "WME Road History";
  1687. WM.addLayer(drc_mapLayer);
  1688. drc_mapLayer.setVisibility(true);
  1689.  
  1690. }
  1691. }
  1692. //--------------------------------------------------------------------------------------------------------
  1693. function remove_markers() {
  1694.  
  1695. var WM = window.W.map;
  1696. var OL = window.OL;
  1697.  
  1698. markerskey = {};
  1699. markersseg = {};
  1700. markersadd = [];
  1701.  
  1702. var mlayers = WM.getLayersBy("uniqueName","__WMERoadHistoryMarkers");
  1703. var markerLayer = mlayers[0];
  1704. if (markerLayer) {
  1705. if (ICONMODE)
  1706. markerLayer.clearMarkers();
  1707. else
  1708. markerLayer.removeAllFeatures();
  1709. }
  1710. }
  1711. //--------------------------------------------------------------------------------------------------------
  1712. function add_markers_from_list() {
  1713.  
  1714. var showcircle = getId('_wmeRoadHistoryShowCircle').checked;
  1715. var showcircleshort = getId('_wmeRoadHistoryShowCircleShort').checked;
  1716. var showcirclelong = getId('_wmeRoadHistoryShowCircleLong').checked;
  1717.  
  1718. //jeżeli nie zaznaczono żadnej z opcji kolorowania to powrót
  1719. if (!showcircle && !showcircleshort && !showcirclelong) return;
  1720.  
  1721. // przygotowanie danych warstwy '__WMERoadHistoryMarkers'
  1722. var WM = window.W.map;
  1723. var OL = window.OL;
  1724.  
  1725. var mlayers = WM.getLayersBy("uniqueName","__WMERoadHistoryMarkers");
  1726. var markerLayer = mlayers[0];
  1727. if (markerLayer == undefined) return;
  1728.  
  1729. var lineFeatures = [];
  1730.  
  1731. while (markersadd.length) {
  1732.  
  1733. var mark = markersadd.shift();
  1734. var x = mark.x;
  1735. var y = mark.y;
  1736. var ed = mark.editor;
  1737. var key = mark.key;
  1738. var segid = mark.segid;
  1739.  
  1740. if (markerskey[key] == 1) continue;
  1741. markerskey[key] = 1;
  1742.  
  1743. if (ShowHistMode == 1) {
  1744. if (markersseg[segid] == undefined)
  1745. markersseg[segid] = 0;
  1746. else
  1747. markersseg[segid] = markersseg[segid] + 1;
  1748. x += markersseg[segid] * 4;
  1749. }
  1750.  
  1751. var edT = '#808080';
  1752. var edL = '#808080';
  1753.  
  1754. if (ed.indexOf('(1)') >= 0) { edT = '#FF0000'; edL = '#FF0000'; }
  1755. if (ed.indexOf('(2)') >= 0) { edT = '#af8000'; edL = '#FFFF00'; }
  1756. if (ed.indexOf('(3)') >= 0) { edT = '#00FF00'; edL = '#00FF00'; }
  1757. if (ed.indexOf('(4)') >= 0) { edT = '#0080FF'; edL = '#0080FF'; }
  1758. if (ed.indexOf('(5)') >= 0) { edT = '#FF00FF'; edL = '#FF00FF'; }
  1759. if (ed == 'Inactive User(1)') { edT = '#808080'; edL = '#808080'; ed = 'I'; }
  1760.  
  1761. if (showcirclelong) {}
  1762. else if (showcircleshort)
  1763. ed = ed.substr(0, 3);
  1764. else
  1765. ed = '';
  1766.  
  1767. var width = 0;
  1768. if (showcircle) width = 30;
  1769.  
  1770. if (ICONMODE) {
  1771. var di = require("Waze/DivIcon");
  1772. var iconA = new di("wmeroadhistorymarker1");
  1773. var lonlatA = new OL.LonLat( x, y );
  1774. markerA = new OL.Marker(lonlatA, iconA );
  1775. markerA.display(true);
  1776. markerLayer.addMarker(markerA);
  1777. }
  1778. else {
  1779. var p1 = new OL.Geometry.Point(x, y)
  1780. var p2 = new OL.Geometry.Point(x, y)
  1781.  
  1782. var points = [];
  1783. points.push(p1);
  1784. points.push(p2);
  1785. var line = new OL.Geometry.LineString(points);
  1786.  
  1787. var lineFeature = new OL.Feature.Vector(line, { labelText: ed, labelColor: edT, lineColor: edL, lineWidth:width } );
  1788. lineFeatures.push(lineFeature);
  1789. }
  1790. }
  1791.  
  1792. if (!ICONMODE)
  1793. markerLayer.addFeatures(lineFeatures);
  1794. }
  1795. //--------------------------------------------------------------------------------------------------------
  1796. function showEdits(histmode, fromPage) {
  1797.  
  1798. var objlist = getId('wmeroadhistory_list');
  1799. if (objlist == null) return;
  1800.  
  1801. var range, transaction, store, index;
  1802.  
  1803. let lower = 0;
  1804. let upper = 9999999999;
  1805.  
  1806. if (getId('_wmeRoadHistoryDateRange').checked) {
  1807.  
  1808. var fyear = parseInt(getId('_wmeRoadHistoryFromYear').value);
  1809. var fmonth = parseInt(getId('_wmeRoadHistoryFromMonth').value) - 1;
  1810. var fday = parseInt(getId('_wmeRoadHistoryFromDay').value);
  1811.  
  1812. var tyear = parseInt(getId('_wmeRoadHistoryToYear').value);
  1813. var tmonth = parseInt(getId('_wmeRoadHistoryToMonth').value) - 1;
  1814. var tday = parseInt(getId('_wmeRoadHistoryToDay').value);
  1815.  
  1816. var lowerdate = new Date(fyear, fmonth, fday, 0, 0, 0, 0);
  1817. var upperdate = new Date(tyear, tmonth, tday, 23, 59, 59, 999);
  1818.  
  1819. lower = parseInt(lowerdate.getTime() / 1000);
  1820. upper = parseInt(upperdate.getTime() / 1000);
  1821.  
  1822. if (lower <= upper) {
  1823. getId('wmeroadhistory_rangeinfo').innerHTML = lang.datesdefined + ' &nbsp; ' + lowerdate.toLocaleDateString() + ' - ' + upperdate.toLocaleDateString();
  1824. }
  1825. else {
  1826. getId('wmeroadhistory_rangeinfo').innerHTML = '<span style="color: #CC0000; ">' + lang.datesincorrect + '</span>';
  1827. return;
  1828. }
  1829. }
  1830. else
  1831. getId('wmeroadhistory_rangeinfo').innerHTML = '';
  1832.  
  1833. var showseconds = getId('_wmeRoadHistoryFullTime').checked;
  1834. updatestatsdelay = 0;
  1835. while (markersadd.length) markersadd.pop();
  1836.  
  1837. if (histmode == 1) {
  1838. range = IDBKeyRange.bound( lower, upper );
  1839. transaction = wazeDB.transaction(["changes"], "readonly");
  1840. store = transaction.objectStore("changes");
  1841. index = store.index("T");
  1842. }
  1843. else {
  1844. range = IDBKeyRange.bound( lower, upper );
  1845. transaction = wazeDB.transaction(["segments"], "readonly");
  1846. store = transaction.objectStore("segments");
  1847. index = store.index("T");
  1848. }
  1849.  
  1850. var count = 0;
  1851. var page = 0;
  1852. var end = 0;
  1853.  
  1854. var rows = getId('_wmeRoadHistoryRows').value;
  1855. if (rows < 5) rows = 5;
  1856. if (rows > 1000) rows = 1000;
  1857.  
  1858. var t = new Date();
  1859. var curtime = parseInt( t.getTime() / 1000);
  1860.  
  1861. index.openCursor(range, "prev").onsuccess = function(event) {
  1862. var cursor = event.target.result;
  1863. if (cursor) {
  1864.  
  1865. if (page < fromPage) {
  1866.  
  1867. page++;
  1868. cursor.advance( rows );
  1869. }
  1870. else if (count < rows) {
  1871.  
  1872. var segid = cursor.value.ID;
  1873. var segtime = cursor.value.T;
  1874. var segeditor = cursor.value.E;
  1875. var segnames = cursor.value.N;
  1876. var segcity = cursor.value.C;
  1877. var segx = cursor.value.x;
  1878. var segy = cursor.value.y;
  1879. var segkind = cursor.value.K;
  1880. var segequal = cursor.value.Q;
  1881.  
  1882. var h1 = document.createElement('h1');
  1883. var h2 = document.createElement('h2');
  1884. var ul = document.createElement('ul');
  1885. var h4 = document.createElement('h4');
  1886. var h5 = document.createElement('h5');
  1887. var h6 = document.createElement('h6');
  1888. var hr = document.createElement('hr');
  1889.  
  1890. if (stats[segeditor] == null) {
  1891. var list = {};
  1892. list[ segid + '.' + segtime ] = 1;
  1893. stats[segeditor] = list;
  1894. }
  1895. else
  1896. stats[segeditor][segid + '.' + segtime] = 1;
  1897.  
  1898. //----- dodanie wsp. markera do tablicy ----------
  1899. var mark = { x:segx, y:segy, editor:segeditor, key:cursor.primaryKey, segid:segid };
  1900. markersadd.push( mark );
  1901.  
  1902. if (histmode == 1) {
  1903.  
  1904.  
  1905. if (cursor.value.drA != null && cursor.value.drB != null) {
  1906.  
  1907. let li = document.createElement('li');
  1908.  
  1909. if (cursor.value.drA == 0) li.innerHTML = lang.dirchangeadd;
  1910.  
  1911. if (cursor.value.drA == 1) {
  1912. if (cursor.value.drB == 0) li.innerHTML = lang.dirchange0;
  1913. if (cursor.value.drB == 2) li.innerHTML = lang.dirchangerev;
  1914. if (cursor.value.drB == 3) li.innerHTML = lang.dirchange2;
  1915. }
  1916.  
  1917. if (cursor.value.drA == 2) {
  1918. if (cursor.value.drB == 0) li.innerHTML = lang.dirchange0;
  1919. if (cursor.value.drB == 1) li.innerHTML = lang.dirchangerev;
  1920. if (cursor.value.drB == 3) li.innerHTML = lang.dirchange2;
  1921. }
  1922.  
  1923. if (cursor.value.drA == 3) {
  1924. if (cursor.value.drB == 0) li.innerHTML = lang.dirchange0;
  1925. if (cursor.value.drB == 1) li.innerHTML = lang.dirchange1;
  1926. if (cursor.value.drB == 2) li.innerHTML = lang.dirchange1;
  1927. }
  1928.  
  1929. ul.appendChild(li);
  1930. }
  1931.  
  1932.  
  1933. var tyA = cursor.value.tyA;
  1934. var tyB = cursor.value.tyB;
  1935. if (tyA != null && tyB != null) {
  1936.  
  1937. let li = document.createElement('li');
  1938.  
  1939. let html = '';
  1940.  
  1941. switch (tyA) {
  1942. case 1: html += lang.road1; break;
  1943. case 2: html += lang.road2; break;
  1944. case 3: html += lang.road3; break;
  1945. case 4: html += lang.road4; break;
  1946. case 5: html += lang.road5; break;
  1947. case 6: html += lang.road6; break;
  1948. case 7: html += lang.road7; break;
  1949. case 8: html += lang.road8; break;
  1950. case 10: html += lang.road10; break;
  1951. case 17: html += lang.road17; break;
  1952. case 18: html += lang.road18; break;
  1953. case 19: html += lang.road19; break;
  1954. case 20: html += lang.road20; break;
  1955. default: html += lang.roadtype + tyA + ')'; break;
  1956. }
  1957.  
  1958. html += ' » <b class=wmeroadhistory_kind >';
  1959.  
  1960. switch (tyB) {
  1961. case 1: html += lang.road1; break;
  1962. case 2: html += lang.road2; break;
  1963. case 3: html += lang.road3; break;
  1964. case 4: html += lang.road4; break;
  1965. case 5: html += lang.road5; break;
  1966. case 6: html += lang.road6; break;
  1967. case 7: html += lang.road7; break;
  1968. case 8: html += lang.road8; break;
  1969. case 10: html += lang.road10; break;
  1970. case 17: html += lang.road17; break;
  1971. case 18: html += lang.road18; break;
  1972. case 19: html += lang.road19; break;
  1973. case 20: html += lang.road20; break;
  1974. default: html += lang.roadtype + tyB + ')'; break;
  1975. }
  1976.  
  1977. html += '</b>';
  1978. li.innerHTML = html;
  1979.  
  1980. ul.appendChild(li);
  1981. }
  1982.  
  1983.  
  1984.  
  1985. var arA = cursor.value.arA;
  1986. var arB = cursor.value.arB;
  1987. if (arA != null && arB != null) {
  1988. var turnsA = arA.split('·');
  1989. var turnsB = arB.split('·');
  1990.  
  1991. for(let i=0; i<turnsA.length - 1; i++) {
  1992. var p = arB.indexOf( turnsA[i] + '·' );
  1993. if (p < 0) {
  1994.  
  1995. let seg1 = segid;
  1996. let segN = turnsA[i].substr(0,1);
  1997. let seg2 = turnsA[i].substr(1,12);
  1998.  
  1999. let li = document.createElement('li');
  2000. if (seg1 == seg2) li.innerHTML += '<b class=wmeroadhistory_uturn >' + lang.removed_uturn + '</b>';
  2001. else li.innerHTML += '<b class=wmeroadhistory_error >' + lang.removedturn + '</b>';
  2002.  
  2003. let pe = document.createElement('p');
  2004. pe.innerHTML = 'link';
  2005. pe.className = 'wmeroadhistory_turnlink';
  2006. pe.id = 'turnlink_' + seg1 + '_' + segN + '_' + seg2;
  2007.  
  2008. foundPELinkName( pe, parseInt(seg2) );
  2009.  
  2010. pe.onclick = (function(event) {
  2011. gotoTURN(event);
  2012. });
  2013. li.appendChild(pe);
  2014.  
  2015. ul.appendChild(li);
  2016. }
  2017. }
  2018.  
  2019. for(let i=0; i<turnsB.length - 1; i++) {
  2020. let p = arA.indexOf( turnsB[i] + '·' );
  2021. if (p < 0) {
  2022.  
  2023. let seg1 = segid;
  2024. let segN = turnsB[i].substr(0,1);
  2025. let seg2 = turnsB[i].substr(1,12);
  2026.  
  2027. var li = document.createElement('li');
  2028. if (seg1 == seg2) li.innerHTML += '<b class=wmeroadhistory_uturn >' + lang.added_uturn + '</b>';
  2029. else li.innerHTML += '<b class=wmeroadhistory_error >' + lang.addedturn + '</b>';
  2030.  
  2031. let pe = document.createElement('p');
  2032. pe.innerHTML = 'link';
  2033. pe.className = 'wmeroadhistory_turnlink';
  2034. pe.id = 'turnlink_' + seg1 + '_' + segN + '_' + seg2;
  2035.  
  2036. foundPELinkName( pe, parseInt(seg2) );
  2037.  
  2038. pe.onclick = (function(event) {
  2039. gotoTURN(event);
  2040. });
  2041. li.appendChild(pe);
  2042.  
  2043. ul.appendChild(li);
  2044. }
  2045. }
  2046. }
  2047.  
  2048.  
  2049. if (cursor.value.naA != null && cursor.value.naB != null) {
  2050. let li = document.createElement('li');
  2051. li.innerHTML = lang.changename + cursor.value.naA + ' » ' + cursor.value.naB;
  2052. ul.appendChild(li);
  2053. }
  2054.  
  2055. if (cursor.value.ciA != null && cursor.value.ciB != null) {
  2056. let li = document.createElement('li');
  2057. li.innerHTML = lang.changecity + cursor.value.ciA + ' » ' + cursor.value.ciB;
  2058. ul.appendChild(li);
  2059. }
  2060.  
  2061. if (cursor.value.geA != null && cursor.value.geB != null) {
  2062. let li = document.createElement('li');
  2063. li.innerHTML = lang.changedgeom;
  2064. ul.appendChild(li);
  2065. }
  2066.  
  2067. if (cursor.value.lvA != null && cursor.value.lvB != null) {
  2068. let li = document.createElement('li');
  2069. li.innerHTML = lang.level + cursor.value.lvA + ' » ' + cursor.value.lvB;
  2070. ul.appendChild(li);
  2071. }
  2072.  
  2073. if (cursor.value.tolA != null && cursor.value.tolB != null) {
  2074. let li = document.createElement('li');
  2075.  
  2076. if (cursor.value.tolA == 0) li.innerHTML += lang.tollfree;
  2077. if (cursor.value.tolA == 1) li.innerHTML += lang.tollpart;
  2078. if (cursor.value.tolA == 2) li.innerHTML += lang.tollpart;
  2079. if (cursor.value.tolA == 3) li.innerHTML += lang.toll;
  2080.  
  2081. if (cursor.value.tolB == 0) li.innerHTML += ' » <b class=wmeroadhistory_toll>' + lang.tollfree + '</b>';
  2082. if (cursor.value.tolB == 1) li.innerHTML += ' » <b class=wmeroadhistory_toll>' + lang.tollpart + '</b>';
  2083. if (cursor.value.tolB == 2) li.innerHTML += ' » <b class=wmeroadhistory_toll>' + lang.tollpart + '</b>';
  2084. if (cursor.value.tolB == 3) li.innerHTML += ' » <b class=wmeroadhistory_toll>' + lang.toll + '</b>';
  2085.  
  2086. ul.appendChild(li);
  2087. }
  2088.  
  2089. var trBefore = cursor.value.trA;
  2090. var trAfter = cursor.value.trB;
  2091. if (trBefore != null && trAfter != null) {
  2092.  
  2093. var before = trBefore.split('²');
  2094. var after = trAfter.split('²');
  2095.  
  2096. var abBefore = '';
  2097. var abAfter = '';
  2098. var baBefore = '';
  2099. var baAfter = '';
  2100.  
  2101. for(let i=0; i<before.length - 1; i++) {
  2102. if (before[i].indexOf('AB¹') == 0) abBefore = before[i];
  2103. if (before[i].indexOf('BA¹') == 0) baBefore = before[i];
  2104. }
  2105.  
  2106. for(let i=0; i<after.length - 1; i++) {
  2107. if (after[i].indexOf('AB¹') == 0) abAfter = after[i];
  2108. if (after[i].indexOf('BA¹') == 0) baAfter = after[i];
  2109. }
  2110.  
  2111. if (abBefore != abAfter) {
  2112.  
  2113. let li = document.createElement('li');
  2114. li.innerHTML = '<b class=wmeroadhistory_trafter>' + lang.trAB + '</b>';
  2115. ul.appendChild(li);
  2116.  
  2117. if (abAfter == '') {
  2118. let li = document.createElement('p');
  2119. li.innerHTML = '<b class=wmeroadhistory_trafter>' + lang.none + '</b>';
  2120. ul.appendChild(li);
  2121. }
  2122. else {
  2123. var lines = abAfter.split('¹');
  2124. for(let i=1; i<lines.length-1; i++) {
  2125. let li = formatRestriction( lines[i], '<b class=wmeroadhistory_trafter>', '</b>');
  2126. ul.appendChild(li);
  2127. }
  2128. }
  2129.  
  2130. var lines = abBefore.split('¹');
  2131. for(let i=1; i<lines.length-1; i++) {
  2132. let li = formatRestriction( lines[i], '', '');
  2133. li.className = 'wmeroadhistory_trbefore';
  2134. ul.appendChild(li);
  2135. }
  2136. }
  2137.  
  2138. if (baBefore != baAfter) {
  2139.  
  2140. let li = document.createElement('li');
  2141. li.innerHTML = '<b class=wmeroadhistory_trafter>' + lang.trBA + '</b>';
  2142. ul.appendChild(li);
  2143.  
  2144. if (baAfter == '') {
  2145. let li = document.createElement('p');
  2146. li.innerHTML = '<b class=wmeroadhistory_trafter>' + lang.none + '</b>';
  2147. ul.appendChild(li);
  2148. }
  2149. else {
  2150. let lines = baAfter.split('¹');
  2151. for(let i=1; i<lines.length-1; i++) {
  2152. let li = formatRestriction( lines[i], '<b class=wmeroadhistory_trafter>', '</b>');
  2153. ul.appendChild(li);
  2154. }
  2155. }
  2156.  
  2157. let lines = baBefore.split('¹');
  2158. for(let i=1; i<lines.length-1; i++) {
  2159. let li = formatRestriction( lines[i], '', '');
  2160. li.className = 'wmeroadhistory_trbefore';
  2161. ul.appendChild(li);
  2162. }
  2163.  
  2164. }
  2165.  
  2166. }
  2167.  
  2168.  
  2169. var trBefore = cursor.value.tsA;
  2170. var trAfter = cursor.value.tsB;
  2171. if (trBefore != null && trAfter != null) {
  2172. let before = trBefore.split('²');
  2173. let after = trAfter.split('²');
  2174.  
  2175. for(let i=0; i<before.length - 1; i++) {
  2176. let bi = before[i].split('¹');
  2177.  
  2178. var aifound = [];
  2179.  
  2180. for(let j=0; j<after.length - 1; j++) {
  2181. let ai = after[j].split('¹');
  2182. if (ai[0] == bi[0]) {
  2183. aifound = ai;
  2184. }
  2185. }
  2186.  
  2187. if (aifound.length > 2) {
  2188. let li = document.createElement('li');
  2189. li.innerHTML = '<b class=wmeroadhistory_trturn>' + lang.changedtr + '</b>';
  2190.  
  2191. let seg1 = segid;
  2192. let segN = bi[0].substr(0,1);
  2193. let seg2 = bi[0].substr(1,12);
  2194.  
  2195. let pe = document.createElement('p');
  2196. pe.innerHTML = 'link';
  2197. pe.className = 'wmeroadhistory_turnlink';
  2198. pe.id = 'turnlink_' + seg1 + '_' + segN + '_' + seg2;
  2199.  
  2200. foundPELinkName( pe, parseInt(seg2) );
  2201.  
  2202. pe.onclick = (function(event) {
  2203. gotoTURN(event);
  2204. });
  2205. li.appendChild(pe);
  2206. ul.appendChild(li);
  2207.  
  2208. if (aifound.length <= 2) {
  2209. let li = document.createElement('p');
  2210. li.innerHTML = '<b class=wmeroadhistory_trturn>' + lang.none + '</b>';
  2211. ul.appendChild(li);
  2212. }
  2213. else {
  2214. for(let k=1; k<aifound.length-1; k++) {
  2215. let li = formatRestriction( aifound[k], '<b class=wmeroadhistory_trturn>', '</b>');
  2216. ul.appendChild(li);
  2217. }
  2218. }
  2219.  
  2220. for(let k=1; k<bi.length-1; k++) {
  2221. let li = formatRestriction( bi[k], '', '');
  2222. ul.appendChild(li);
  2223. }
  2224. }
  2225. else {
  2226. let li = document.createElement('li');
  2227. li.innerHTML = '<b class=wmeroadhistory_trturn>' + lang.removedtr + '</b>';
  2228.  
  2229. let seg1 = segid;
  2230. let segN = bi[0].substr(0,1);
  2231. let seg2 = bi[0].substr(1,12);
  2232.  
  2233. let pe = document.createElement('p');
  2234. pe.innerHTML = 'link';
  2235. pe.className = 'wmeroadhistory_turnlink';
  2236. pe.id = 'turnlink_' + seg1 + '_' + segN + '_' + seg2;
  2237.  
  2238. foundPELinkName( pe, parseInt(seg2) );
  2239.  
  2240. pe.onclick = (function(event) {
  2241. gotoTURN(event);
  2242. });
  2243. li.appendChild(pe);
  2244. ul.appendChild(li);
  2245.  
  2246. //var li = document.createElement('p');
  2247. //li.innerHTML = '<b class=wmeroadhistory_trturn>' + lang.none + '</b>';
  2248. //ul.appendChild(li);
  2249.  
  2250. for(let k=1; k<bi.length-1; k++) {
  2251. let li = formatRestriction( bi[k], '', '');
  2252. ul.appendChild(li);
  2253. }
  2254. }
  2255. }
  2256.  
  2257.  
  2258. for(let i=0; i<after.length - 1; i++) {
  2259. let ai = after[i].split('¹');
  2260.  
  2261. let p = trBefore.indexOf( ai[0] + '¹' );
  2262. if (p < 0) {
  2263. let li = document.createElement('li');
  2264. li.innerHTML = '<b class=wmeroadhistory_trturn>' + lang.addedtr + '</b>';
  2265.  
  2266. let seg1 = segid;
  2267. let segN = ai[0].substr(0,1);
  2268. let seg2 = ai[0].substr(1,12);
  2269.  
  2270. var pe = document.createElement('p');
  2271. pe.innerHTML = 'link';
  2272. pe.className = 'wmeroadhistory_turnlink';
  2273. pe.id = 'turnlink_' + seg1 + '_' + segN + '_' + seg2;
  2274.  
  2275. foundPELinkName( pe, parseInt(seg2) );
  2276.  
  2277. pe.onclick = (function(event) {
  2278. gotoTURN(event);
  2279. });
  2280. li.appendChild(pe);
  2281. ul.appendChild(li);
  2282.  
  2283. for(let k=1; k<ai.length-1; k++) {
  2284. let li = formatRestriction( ai[k], '<b class=wmeroadhistory_trturn>', '</b>');
  2285. ul.appendChild(li);
  2286. }
  2287. }
  2288. }
  2289. }
  2290.  
  2291.  
  2292.  
  2293. }
  2294.  
  2295. var t = new Date;
  2296. t.setTime( segtime * 1000 );
  2297. var topt = { year: "numeric", month: "numeric", day: "numeric", hour: "2-digit", minute: "2-digit" };
  2298. var czas;
  2299. if (showseconds) czas = t.toLocaleString(lang.code);
  2300. else czas = t.toLocaleDateString(lang.code, topt);
  2301.  
  2302.  
  2303. if (segnames == '') h1.innerHTML = '<b>' + lang.noname + '</b>';
  2304. else h1.innerHTML = '<b>' + htmlEntities(segnames) + '</b>';
  2305.  
  2306. h1.onclick = (function() {
  2307. gotoSEG(segx, segy, segid);
  2308. });
  2309.  
  2310. if (segkind == 1) h1.style.color = '#488193'; // street
  2311. else if (segkind == 2) h1.style.color = '#488193'; // primary street
  2312. else if (segkind == 3) h1.style.color = '#488193'; // freeways
  2313. else if (segkind == 4) h1.style.color = '#488193'; // ramps
  2314. else if (segkind == 6) h1.style.color = '#488193'; // major highway
  2315. else if (segkind == 7) h1.style.color = '#488193'; // minor highway
  2316. else if (segkind == 8) h1.style.color = '#404040'; // dirt roads
  2317. else if (segkind == 18) h1.style.color = '#c0c0c0'; // pkp
  2318. else if (segkind == 21) h1.style.color = '#808080'; // service road
  2319. else if (segkind == 120) h1.style.color = '#808080'; // service road
  2320. else h1.style.color = '#808080';
  2321.  
  2322. if (segequal && curtime - segtime < 7*24*3600) {
  2323. h4.innerHTML = '<b class=wmeroadhistory_newseg>' + lang.newsegment + '</b>';
  2324. }
  2325.  
  2326. h2.innerHTML = htmlEntities(segcity);
  2327. h5.innerHTML = czas;
  2328. h6.innerHTML = htmlEntities(segeditor);
  2329. if (segeditor.indexOf('(1)') >= 0) h6.className = 'wmeroadhistory_rank1';
  2330. if (segeditor.indexOf('(2)') >= 0) h6.className = 'wmeroadhistory_rank2';
  2331. if (segeditor.indexOf('(3)') >= 0) h6.className = 'wmeroadhistory_rank3';
  2332. if (segeditor.indexOf('(4)') >= 0) h6.className = 'wmeroadhistory_rank4';
  2333. if (segeditor.indexOf('(5)') >= 0) h6.className = 'wmeroadhistory_rank5';
  2334. if (segeditor.indexOf('Inactive User') >= 0) h6.className = 'wmeroadhistory_rank0';
  2335.  
  2336.  
  2337. if (count < objlist.childNodes.length) {
  2338. var div = objlist.childNodes[count];
  2339.  
  2340. div.innerHTML = '';
  2341.  
  2342. div.appendChild(h1);
  2343. div.appendChild(h4);
  2344. div.appendChild(h2);
  2345. div.appendChild(ul);
  2346. div.appendChild(h5);
  2347. div.appendChild(h6);
  2348. div.appendChild(hr);
  2349. }
  2350. else {
  2351. var newdiv = document.createElement('div');
  2352.  
  2353. newdiv.appendChild(h1);
  2354. newdiv.appendChild(h4);
  2355. newdiv.appendChild(h2);
  2356. newdiv.appendChild(ul);
  2357. newdiv.appendChild(h5);
  2358. newdiv.appendChild(h6);
  2359. newdiv.appendChild(hr);
  2360.  
  2361. objlist.appendChild(newdiv);
  2362. }
  2363.  
  2364. count++;
  2365. cursor.continue();
  2366. }
  2367. else {
  2368.  
  2369. add_markers_from_list();
  2370. updatestatsdelay = parseInt(2000 / LOOPTIMER);
  2371. }
  2372. }
  2373. else {
  2374. add_markers_from_list();
  2375. updatestatsdelay = parseInt(2000 / LOOPTIMER);
  2376.  
  2377. //korekta pozycji na ostatniej stronie, gdy list jest mniejsza niż zdefiniowana ilość wierszy
  2378. if (count && count < rows) {
  2379. for(let i=count; i<rows; i++) {
  2380. let div = objlist.childNodes[i];
  2381. div.innerHTML = '';
  2382. }
  2383. }
  2384.  
  2385. if (count==0) {
  2386. if (pageEdits > page-1) pageEdits = page-1;
  2387. if (pageEdits < 0) pageEdits = 0;
  2388. }
  2389. }
  2390. }
  2391. }
  2392. //--------------------------------------------------------------------------------------------------------
  2393. function wmeroadhistoryTAB1() {
  2394.  
  2395. ShowHistMode = 1;
  2396. updateTabs();
  2397.  
  2398. //reset zaznaczonych segmentów
  2399. showturn[0] = showturn[2];
  2400. showturn[1] = showturn[3];
  2401. showturn[2] = 0;
  2402. showturn[3] = 0;
  2403.  
  2404.  
  2405. //usunięcie,czyszczenie markerów z mapy
  2406. remove_markers();
  2407.  
  2408. //reset statystyk po kliknięciu w zakładkę, aby można było podliczać od nowa poruszając się po stronach
  2409. reset_statistics();
  2410.  
  2411. getId('wmeroadhistory_list').innerHTML = '';
  2412. getId('wmeroadhistory_list').style.display = 'block';
  2413. getId('wmeroadhistory_options').style.display = 'none';
  2414. getId('wmeroadhistory_stats').style.display = 'block';
  2415.  
  2416. pageEdits = 0;
  2417. showEdits(ShowHistMode, pageEdits);
  2418.  
  2419. getId('wmeroadhistory_list_buttons_1').style.visibility = '';
  2420. getId('wmeroadhistory_list_buttons_2').style.visibility = '';
  2421. }
  2422. //--------------------------------------------------------------------------------------------------------
  2423. function wmeroadhistoryTAB2() {
  2424.  
  2425. ShowHistMode = 2;
  2426. updateTabs();
  2427.  
  2428. //reset zaznaczonych segmentów
  2429. showturn[0] = showturn[2];
  2430. showturn[1] = showturn[3];
  2431. showturn[2] = 0;
  2432. showturn[3] = 0;
  2433.  
  2434.  
  2435. //usunięcie,czyszczenie markerów z mapy
  2436. remove_markers();
  2437.  
  2438. //reset statystyk po kliknięciu w zakładkę, aby można było podliczać od nowa poruszając się po stronach
  2439. reset_statistics();
  2440.  
  2441. getId('wmeroadhistory_list').innerHTML = '';
  2442. getId('wmeroadhistory_list').style.display = 'block';
  2443. getId('wmeroadhistory_options').style.display = 'none';
  2444. getId('wmeroadhistory_stats').style.display = 'block';
  2445.  
  2446. pageEdits = 0;
  2447. showEdits(ShowHistMode, pageEdits);
  2448.  
  2449. getId('wmeroadhistory_list_buttons_1').style.visibility = '';
  2450. getId('wmeroadhistory_list_buttons_2').style.visibility = '';
  2451. }
  2452. //--------------------------------------------------------------------------------------------------------
  2453. function wmeroadhistoryTAB3() {
  2454.  
  2455. ShowHistMode = 3;
  2456. updateTabs();
  2457.  
  2458. //reset zaznaczonych segmentów
  2459. showturn[0] = showturn[2];
  2460. showturn[1] = showturn[3];
  2461. showturn[2] = 0;
  2462. showturn[3] = 0;
  2463.  
  2464. getId('wmeroadhistory_list').innerHTML = '';
  2465. getId('wmeroadhistory_list').style.display = 'none';
  2466. getId('wmeroadhistory_options').style.display = 'block';
  2467. getId('wmeroadhistory_list_buttons_1').style.visibility = 'hidden';
  2468. getId('wmeroadhistory_list_buttons_2').style.visibility = 'hidden';
  2469. getId('wmeroadhistory_stats').style.display = 'none';
  2470.  
  2471. if (window.File && window.FileReader && window.FileList && window.Blob) {
  2472. }
  2473. else {
  2474. alert('The File APIs are not fully supported by your browser.');
  2475.  
  2476. getId('wmeroadhistory_import').className = 'wmerh_button_disabled';
  2477. getId('wmeroadhistory_export').className = 'wmerh_button_disabled';
  2478. }
  2479.  
  2480. getId('wmerh_dbinfo').innerHTML = lang.dbversion + wazeDB.version;
  2481. }
  2482. //--------------------------------------------------------------------------------------------------------
  2483. function wmeroadhistoryPREV() {
  2484. if (pageEdits) {
  2485. pageEdits--;
  2486. if (pageEdits < 0) pageEdits = 0;
  2487. showEdits(ShowHistMode, pageEdits);
  2488. }
  2489. }
  2490. //--------------------------------------------------------------------------------------------------------
  2491. function wmeroadhistoryNEXT() {
  2492. pageEdits++;
  2493. showEdits(ShowHistMode, pageEdits);
  2494. }
  2495. //--------------------------------------------------------------------------------------------------------
  2496. function wmeroadhistoryPREVDOWN() {
  2497. if (pageEdits) {
  2498. pageEdits--;
  2499. if (pageEdits < 0) pageEdits = 0;
  2500. getId('sidebar').scrollTop = 0;
  2501. showEdits(ShowHistMode, pageEdits);
  2502. }
  2503. }
  2504. //--------------------------------------------------------------------------------------------------------
  2505. function wmeroadhistoryNEXTDOWN() {
  2506. pageEdits++;
  2507. getId('sidebar').scrollTop = 0;
  2508. showEdits(ShowHistMode, pageEdits);
  2509. }
  2510. //--------------------------------------------------------------------------------------------------------
  2511. function updateTabs() {
  2512. if (ShowHistMode == 1) {
  2513. getId('wmeroadhistory_tab1').className = 'wmeroadhistory_tab_active';
  2514. getId('wmeroadhistory_tab2').className = '';
  2515. getId('wmeroadhistory_tab3').className = '';
  2516. }
  2517. if (ShowHistMode == 2) {
  2518. getId('wmeroadhistory_tab1').className = '';
  2519. getId('wmeroadhistory_tab2').className = 'wmeroadhistory_tab_active';
  2520. getId('wmeroadhistory_tab3').className = '';
  2521. }
  2522. if (ShowHistMode == 3) {
  2523. getId('wmeroadhistory_tab1').className = '';
  2524. getId('wmeroadhistory_tab2').className = '';
  2525. getId('wmeroadhistory_tab3').className = 'wmeroadhistory_tab_active';
  2526. }
  2527. }
  2528. //--------------------------------------------------------------------------------------------------------
  2529. function importexportenable(flag) {
  2530. if (flag) {
  2531. getId('wmeroadhistory_import').className = 'wmerh_button_enabled';
  2532. getId('wmeroadhistory_export').className = 'wmerh_button_enabled';
  2533. getId('wmeroadhistory_import').disabled = false;
  2534. getId('wmeroadhistory_export').disabled = false;
  2535. getId('wmeroadhistory_mergecheckbox').disabled = false;
  2536. }
  2537. else {
  2538. getId('wmeroadhistory_import').className = 'wmerh_button_disabled';
  2539. getId('wmeroadhistory_export').className = 'wmerh_button_disabled';
  2540. getId('wmeroadhistory_import').disabled = true;
  2541. getId('wmeroadhistory_export').disabled = true;
  2542. getId('wmeroadhistory_mergecheckbox').disabled = true;
  2543. }
  2544. }
  2545. //--------------------------------------------------------------------------------------------------------
  2546. function wmeroadhistoryIMPORT() {
  2547.  
  2548. getId('wmeroadhistory_wrapper').innerHTML = '<input id=wmeroadhistory_fileselector type="file" name="files[]" />';
  2549. getId('wmeroadhistory_wrapper').addEventListener('change', wmeroadhistoryFILESELECTOR, false);
  2550.  
  2551. getId('wmeroadhistory_fileselector').click();
  2552.  
  2553. reset_statistics();
  2554. }
  2555. //--------------------------------------------------------------------------------------------------------
  2556. function wmeroadhistoryIMPORTLOOP() {
  2557.  
  2558. var saveitems = new Array();
  2559. var savestores = new Array();
  2560. var compitems = new Array();
  2561. var compstores = new Array();
  2562.  
  2563. var v = 0;
  2564. while (importcount < importmaxcount && v<100) {
  2565.  
  2566. var str = importlines[ importcount++ ];
  2567.  
  2568. var percent = Math.round((importcount / importmaxcount) * 100);
  2569. if (percent != importpercent) {
  2570. importpercent = percent;
  2571. getId('wmerh_progress_percent').style.minWidth = percent + '%';
  2572. getId('wmerh_progress_percent').innerHTML = percent + '%';
  2573. }
  2574.  
  2575. var data = str.split('¤');
  2576. if (data[0] == '[CONFIG]') { chunkdata = 3; continue; }
  2577. if (data[0] == '[SEGMENTSDATA]') { chunkdata = 1; importchunk++; continue; }
  2578. if (data[0] == '[CHANGESDATA]') { chunkdata = 2; importchunk++; continue; }
  2579.  
  2580. if (chunkdata == 3) {
  2581. if (data[0] == 'browser=other') importbrowser = 0;
  2582. if (data[0] == 'browser=chrome') importbrowser = 1;
  2583. if (data[0] == 'browser=firefox') importbrowser = 2;
  2584. }
  2585.  
  2586. if (chunkdata == 1) {
  2587. let ID = parseInt(data[0]);
  2588. let T = parseInt(data[1]);
  2589. let E = data[2];
  2590. let D = parseInt(data[3]);
  2591. let K = parseInt(data[4]);
  2592. let x = parseInt(data[5]);
  2593. let y = parseInt(data[6]);
  2594. let N = data[7];
  2595. let C = data[8];
  2596. let Q = parseInt(data[9]);
  2597. let A = data[10];
  2598. let TR = data[11];
  2599. let TS = data[12];
  2600. let L = parseInt(data[13]);
  2601. let G = parseInt(data[14]);
  2602. let TL = parseInt(data[15]);
  2603.  
  2604. var P = new Array();
  2605. var pstr = data[16].split(',');
  2606. for(let i=0; i<pstr.length; i++)
  2607. P.push ( parseInt(pstr[i]) );
  2608.  
  2609. let item = { ID:ID, T:T, E:E, D:D, K:K, x:x, y:y, N:N, C:C, Q:Q, A:A, TR:TR, TS:TS, L:L, G:G, TL:TL, P:P };
  2610.  
  2611. if (getId('wmeroadhistory_mergecheckbox').checked == true) {
  2612. compitems.push( item );
  2613. compstores.push( 'segments' );
  2614. }
  2615. else {
  2616. saveitems.push( item );
  2617. savestores.push( 'segments' );
  2618. }
  2619. }
  2620.  
  2621. if (chunkdata == 2) {
  2622. let ID = parseInt(data[0]);
  2623. let T = parseInt(data[1]);
  2624. let E = data[2];
  2625. let D = parseInt(data[3]);
  2626. let K = parseInt(data[4]);
  2627. let x = parseInt(data[5]);
  2628. let y = parseInt(data[6]);
  2629. let N = data[7];
  2630. let C = data[8];
  2631. let Q = parseInt(data[9]);
  2632.  
  2633. let item = { ID:ID, T:T, E:E, D:D, K:K, x:x, y:y, N:N, C:C, Q:Q };
  2634.  
  2635. if (data[10] != '' || data[11] != '') {
  2636. item.drA = parseInt( data[10] );
  2637. item.drB = parseInt( data[11] );
  2638. }
  2639.  
  2640. if (data[12] != '' || data[13] != '') {
  2641. item.tyA = parseInt( data[12] );
  2642. item.tyB = parseInt( data[13] );
  2643. }
  2644.  
  2645. if (data[14] != '' || data[15] != '') {
  2646. item.arA = data[14];
  2647. item.arB = data[15];
  2648. }
  2649.  
  2650. if (data[16] != '' || data[17] != '') {
  2651. item.naA = data[16];
  2652. item.naB = data[17];
  2653. }
  2654.  
  2655. if (data[18] != '' || data[19] != '') {
  2656. item.ciA = data[18];
  2657. item.ciB = data[19];
  2658. }
  2659.  
  2660. if (data[20] != '' || data[21] != '') {
  2661. item.trA = data[20];
  2662. item.trB = data[21];
  2663. }
  2664.  
  2665. if (data[22] != '' || data[23] != '') {
  2666. item.tsA = data[22];
  2667. item.tsB = data[23];
  2668. }
  2669.  
  2670. if (data[24] != '' || data[25] != '') {
  2671. item.lvA = parseInt( data[24] );
  2672. item.lvB = parseInt( data[25] );
  2673. }
  2674.  
  2675. if (data[26] != '' || data[27] != '') {
  2676. item.geA = parseInt( data[26] );
  2677. item.geB = parseInt( data[27] );
  2678. }
  2679.  
  2680. if (data[28] != '' || data[29] != '') {
  2681. item.tolA = parseInt( data[28] );
  2682. item.tolB = parseInt( data[29] );
  2683. }
  2684.  
  2685. if (getId('wmeroadhistory_mergecheckbox').checked == true) {
  2686. // wprowadzenie synchronicznej pojedynczej aktualizacji rekordu zmiany, tryb asynchroniczny jest zbyt skomplikowany i zagmatwany tutaj
  2687. // jednorazowe pobranie rekordu i aktualizacja synchroniczna
  2688. merge_imported_change_DB_Sync( item );
  2689. break;
  2690. }
  2691. else {
  2692. saveitems.push( item );
  2693. savestores.push( 'changes' );
  2694. }
  2695. }
  2696.  
  2697. v++;
  2698. }
  2699.  
  2700. if (compitems.length) {
  2701. var trx = wazeDB.transaction( compstores , 'readwrite');
  2702. var reqarray = new Array();
  2703.  
  2704. trx.oncomplete = function(event) {
  2705.  
  2706. var updatestores = new Array();
  2707. var updateitems = new Array();
  2708.  
  2709. for(let i=0; i<compitems.length; i++) {
  2710. let rekord = reqarray[i].result;
  2711. let item = compitems[i];
  2712.  
  2713. if (rekord) {
  2714. if (item.T >= rekord.T) {
  2715. updatestores.push( compstores[i] );
  2716. updateitems.push( item );
  2717. }
  2718. }
  2719. else {
  2720. updatestores.push( compstores[i] );
  2721. updateitems.push( item );
  2722. }
  2723. }
  2724.  
  2725. if (updatestores.length) {
  2726. var trxupdate = wazeDB.transaction( updatestores , 'readwrite');
  2727.  
  2728. trxupdate.oncomplete = function(event) {
  2729. getId('wmerh_progress_info').innerHTML = lang.importeddata + (importcount - importchunk) + ' / ' + (importmaxcount - 2);
  2730. setTimeout(wmeroadhistoryIMPORTLOOP, 1);
  2731. };
  2732. trxupdate.onerror = function(error) {
  2733. };
  2734.  
  2735. for(let i=0; i<updateitems.length; i++) {
  2736. var updstore = trxupdate.objectStore( updatestores[i] );
  2737. updstore.put( updateitems[i] );
  2738. }
  2739. }
  2740. else {
  2741. getId('wmerh_progress_info').innerHTML = lang.importeddata + (importcount - importchunk) + ' / ' + (importmaxcount - 2);
  2742. setTimeout(wmeroadhistoryIMPORTLOOP, 1);
  2743. }
  2744.  
  2745. };
  2746. trx.onerror = function(error) {
  2747. };
  2748.  
  2749. for(let i=0; i<compitems.length; i++) {
  2750. let store = trx.objectStore( compstores[i] );
  2751. let req = store.get( compitems[i].ID );
  2752. reqarray.push(req);
  2753. }
  2754. }
  2755.  
  2756. if (saveitems.length) {
  2757. let trx = wazeDB.transaction( savestores , 'readwrite');
  2758.  
  2759. trx.oncomplete = function(event) {
  2760. getId('wmerh_progress_info').innerHTML = lang.importeddata + (importcount - importchunk) + ' / ' + (importmaxcount - 2);
  2761. setTimeout(wmeroadhistoryIMPORTLOOP, 1);
  2762. };
  2763. trx.onerror = function(error) {
  2764. };
  2765.  
  2766. for(let i=0; i<saveitems.length; i++) {
  2767. let store = trx.objectStore( savestores[i] );
  2768. store.put( saveitems[i] );
  2769. }
  2770. }
  2771.  
  2772. if (importcount == importmaxcount) {
  2773. while (importlines.length) { importlines.pop(); }
  2774.  
  2775. setTimeout(progressFadeOut, 5000);
  2776. importexportenable(1);
  2777. }
  2778. }
  2779. //--------------------------------------------------------------------------------------------------------
  2780. function wmeroadhistorydatabaseInit() {
  2781.  
  2782. var openrequest = window.indexedDB.open( wazeDataBaseName, 2 );
  2783.  
  2784. openrequest.onsuccess = function(event) {
  2785. wazeDB = event.target.result;
  2786. console.log("WMERoadHistory.DataBase.Create.OK = ", openrequest.result.name );
  2787.  
  2788. setTimeout(wmeroadhistoryIMPORTLOOP, 100);
  2789. };
  2790.  
  2791. openrequest.onerror = function(event) {
  2792. importexportenable(1);
  2793. };
  2794.  
  2795. openrequest.onupgradeneeded = function(event) {
  2796. var db = event.target.result;
  2797.  
  2798. var objectStore1 = db.createObjectStore("segments", { keyPath: "ID", autoIncrement: false });
  2799. objectStore1.createIndex("T", "T", { unique: false });
  2800.  
  2801. var objectStore2 = db.createObjectStore("changes", { keyPath: "nr", autoIncrement: true });
  2802. objectStore2.createIndex("T", "T", { unique: false });
  2803. objectStore2.createIndex("ID", "ID", { unique: false });
  2804. }
  2805. }
  2806. //--------------------------------------------------------------------------------------------------------
  2807. function wmeroadhistoryFILESELECTOR(evt) {
  2808.  
  2809. getId('wmerh_progress').className = 'loading';
  2810. getId('wmerh_progress_percent').style.minWidth = '0%';
  2811. getId('wmerh_progress_percent').innerHTML = '0%';
  2812. getId('wmerh_progress_info').innerHTML = lang.importeddata + '0 / 0';
  2813.  
  2814. var files = evt.target.files;
  2815.  
  2816. if (files.length) {
  2817. var f = files[0];
  2818.  
  2819. if (f.type.match('text/plain')) {
  2820. var reader = new FileReader();
  2821.  
  2822. reader.onloadstart = function(e) {
  2823. };
  2824.  
  2825. reader.onload = function(e) {
  2826. importlines = e.target.result.split('¶\r\n');
  2827. importlines.pop();
  2828.  
  2829. if (importlines.length == 0) {
  2830. importlines = e.target.result.split('¶\n');
  2831. importlines.pop();
  2832. }
  2833.  
  2834. importchunk = 0;
  2835. importcount = 0;
  2836. importmaxcount = importlines.length;
  2837. importPercent = -1;
  2838. importbrowser = 0;
  2839. chunkdata = 0;
  2840.  
  2841. if (importmaxcount) {
  2842. importexportenable(0);
  2843.  
  2844. if ( getId('wmeroadhistory_mergecheckbox').checked == false ) {
  2845. if (wazeDB) {
  2846.  
  2847. getId('wmerh_progress_info').innerHTML = lang.preparingdatabase;
  2848. wazeDB.close();
  2849.  
  2850. var req = window.indexedDB.deleteDatabase( wazeDataBaseName );
  2851. req.onsuccess = function () {
  2852. wmeroadhistorydatabaseInit();
  2853.  
  2854. };
  2855. req.onerror = function () {
  2856. importexportenable(1);
  2857. getId('wmerh_progress_info').innerHTML = lang.dberrordelete;
  2858. };
  2859. req.onblocked = function () {
  2860. importexportenable(1);
  2861. getId('wmerh_progress_info').innerHTML = lang.dberrorlocked;
  2862. };
  2863. }
  2864. }
  2865. else
  2866. setTimeout(wmeroadhistoryIMPORTLOOP, 100);
  2867.  
  2868. }
  2869. else {
  2870. getId('wmerh_progress_percent').style.minWidth = '100%';
  2871. getId('wmerh_progress_percent').innerHTML = '100%';
  2872.  
  2873. setTimeout(progressFadeOut, 5000);
  2874. importexportenable(1);
  2875. }
  2876. };
  2877.  
  2878. reader.readAsText(f, 'utf-8');
  2879. }
  2880. }
  2881. }
  2882. //--------------------------------------------------------------------------------------------------------
  2883. function databaseExport(maxcount) {
  2884.  
  2885. var count = 0;
  2886. var exportpercent = -1;
  2887. var txt = '';
  2888.  
  2889. //var firefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;
  2890. //var chrome = navigator.userAgent.toLowerCase().indexOf('chrome') > -1;
  2891. //txt += '[BROWSER]¶\r\n';
  2892. //if (chrome) txt += 'chrome¶\r\n';
  2893. //else if (firefox) txt += 'firefox¶\r\n';
  2894. //else txt += 'other¶\r\n';
  2895.  
  2896. txt += '[SEGMENTSDATA]¶\r\n';
  2897.  
  2898.  
  2899. //zmiana przeszukiwania bazy wg. primary key jest szybsze
  2900. var store = wazeDB.transaction( ["segments"] ,'readonly').objectStore("segments");
  2901. var index = store.openCursor();
  2902.  
  2903. index.onerror = function(event) {
  2904. importexportenable(1);
  2905. };
  2906.  
  2907. index.onsuccess = function(event) {
  2908. var cursor = event.target.result;
  2909. if (cursor) {
  2910. count++;
  2911. var item = cursor.value;
  2912.  
  2913. var row = '';
  2914. row += item.ID + '¤';
  2915. row += item.T + '¤';
  2916. row += item.E + '¤';
  2917. row += item.D + '¤';
  2918. row += item.K + '¤';
  2919. row += item.x + '¤';
  2920. row += item.y + '¤';
  2921. row += item.N + '¤';
  2922. row += item.C + '¤';
  2923. row += item.Q + '¤';
  2924. row += item.A + '¤';
  2925. row += item.TR + '¤';
  2926. row += item.TS + '¤';
  2927. row += item.L + '¤';
  2928. row += item.G + '¤';
  2929. row += item.TL + '¤';
  2930. row += item.P + '¤';
  2931.  
  2932. txt += row + '¶\r\n';
  2933.  
  2934. var percent = Math.round((count / maxcount) * 100);
  2935. if (percent != exportpercent) {
  2936. exportpercent = percent;
  2937. getId('wmerh_progress_percent').style.minWidth = percent + '%';
  2938. getId('wmerh_progress_percent').innerHTML = percent + '%';
  2939. getId('wmerh_progress_info').innerHTML = lang.exporteddata + count + ' / ' + maxcount;
  2940. }
  2941.  
  2942. cursor.continue();
  2943. }
  2944. else {
  2945.  
  2946. txt += '[CHANGESDATA]¶\r\n';
  2947.  
  2948. //zmiana przeszukiwania bazy wg. primary key jest szybsze
  2949. var store2 = wazeDB.transaction( ['changes'] ,'readonly').objectStore('changes');
  2950. var index2 = store2.openCursor();
  2951.  
  2952. index2.onerror = function(event) {
  2953. importexportenable(1);
  2954. }
  2955.  
  2956. index2.onsuccess = function(event) {
  2957. var cursor2 = event.target.result;
  2958. if (cursor2) {
  2959. count++;
  2960. var item = cursor2.value;
  2961.  
  2962. var row = '';
  2963. row += item.ID + '¤';
  2964. row += item.T + '¤';
  2965. row += item.E + '¤';
  2966. row += item.D + '¤';
  2967. row += item.K + '¤';
  2968. row += item.x + '¤';
  2969. row += item.y + '¤';
  2970. row += item.N + '¤';
  2971. row += item.C + '¤';
  2972. row += item.Q + '¤';
  2973. if (item.drA != undefined) row += item.drA + '¤'; else row += '¤';
  2974. if (item.drB != undefined) row += item.drB + '¤'; else row += '¤';
  2975. if (item.tyA != undefined) row += item.tyA + '¤'; else row += '¤';
  2976. if (item.tyB != undefined) row += item.tyB + '¤'; else row += '¤';
  2977. if (item.arA != undefined) row += item.arA + '¤'; else row += '¤';
  2978. if (item.arB != undefined) row += item.arB + '¤'; else row += '¤';
  2979. if (item.naA != undefined) row += item.naA + '¤'; else row += '¤';
  2980. if (item.naB != undefined) row += item.naB + '¤'; else row += '¤';
  2981. if (item.ciA != undefined) row += item.ciA + '¤'; else row += '¤';
  2982. if (item.ciB != undefined) row += item.ciB + '¤'; else row += '¤';
  2983. if (item.trA != undefined) row += item.trA + '¤'; else row += '¤';
  2984. if (item.trB != undefined) row += item.trB + '¤'; else row += '¤';
  2985. if (item.tsA != undefined) row += item.tsA + '¤'; else row += '¤';
  2986. if (item.tsB != undefined) row += item.tsB + '¤'; else row += '¤';
  2987. if (item.lvA != undefined) row += item.lvA + '¤'; else row += '¤';
  2988. if (item.lvB != undefined) row += item.lvB + '¤'; else row += '¤';
  2989. if (item.geA != undefined) row += item.geA + '¤'; else row += '¤';
  2990. if (item.geB != undefined) row += item.geB + '¤'; else row += '¤';
  2991. if (item.tolA != undefined) row += item.tolA + '¤'; else row += '¤';
  2992. if (item.tolB != undefined) row += item.tolB + '¤'; else row += '¤';
  2993.  
  2994. txt += row + '¶\r\n';
  2995.  
  2996.  
  2997. var percent = Math.round((count / maxcount) * 100);
  2998. if (percent != exportpercent) {
  2999. exportpercent = percent;
  3000. getId('wmerh_progress_percent').style.minWidth = percent + '%';
  3001. getId('wmerh_progress_percent').innerHTML = percent + '%';
  3002. getId('wmerh_progress_info').innerHTML = lang.exporteddata + count + ' / ' + maxcount;
  3003. }
  3004.  
  3005. cursor2.continue();
  3006. }
  3007. else {
  3008. getId('wmerh_progress_percent').style.minWidth = '100%';
  3009. getId('wmerh_progress_percent').innerHTML = '100%';
  3010. getId('wmerh_progress_info').innerHTML = lang.exporteddata + count + ' / ' + maxcount;
  3011.  
  3012. let t = new Date;
  3013.  
  3014. let blob = new Blob([ txt ], {type: "text/plain;charset=utf-8"});
  3015. let y = t.getFullYear();
  3016. let m = t.getMonth() + 1;
  3017. let d = t.getDate();
  3018. if (m < 10) m = '0' + m;
  3019. if (d < 10) d = '0' + d;
  3020. saveAs(blob, 'wmeroadhistory_' + y + '-' + m + '-' + d + '_' + t.toLocaleTimeString() + '.txt' );
  3021.  
  3022. setTimeout(progressFadeOut, 5000);
  3023. importexportenable(1);
  3024. }
  3025. }
  3026. }
  3027. }
  3028. }
  3029. //--------------------------------------------------------------------------------------------------------
  3030. function wmeroadhistoryEXPORT() {
  3031.  
  3032. getId('wmerh_progress').className = 'loading';
  3033. getId('wmerh_progress_percent').style.minWidth = '0%';
  3034. getId('wmerh_progress_percent').innerHTML = '0%';
  3035. getId('wmerh_progress_info').innerHTML = lang.exporteddata + '0 / 0';
  3036. importexportenable(0);
  3037.  
  3038. var maxcount = 0;
  3039.  
  3040. var objstore = wazeDB.transaction(["segments"], "readonly").objectStore("segments");
  3041. var requestcount = objstore.count();
  3042. requestcount.onerror = function() {
  3043. importexportenable(1);
  3044. }
  3045. requestcount.onsuccess = function() {
  3046. maxcount += requestcount.result;
  3047.  
  3048. var objstore2 = wazeDB.transaction(["changes"], "readonly").objectStore("changes");
  3049. var requestcount2 = objstore2.count();
  3050. requestcount2.onerror = function() {
  3051. importexportenable(1);
  3052. }
  3053. requestcount2.onsuccess = function() {
  3054. maxcount += requestcount2.result;
  3055.  
  3056. databaseExport(maxcount);
  3057. }
  3058.  
  3059. }
  3060.  
  3061. }
  3062. //--------------------------------------------------------------------------------------------------------
  3063. function progressFadeOut() {
  3064. //sprawdzenie czy w czasie czekania na efekt transition nie rozpoczęto kolejnego importu
  3065. //zezwolenie na zniknięcie paska postępu tylko wtedy, gdy proces importu został ukończony
  3066. if (importcount == importmaxcount)
  3067. getId('wmerh_progress').className = '';
  3068. }
  3069. //--------------------------------------------------------------------------------------------------------
  3070. function update_multi_checkboxes(event) {
  3071.  
  3072. var src = event.target.id;
  3073. var c1 = '_wmeRoadHistoryShowCircleShort';
  3074. var c2 = '_wmeRoadHistoryShowCircleLong';
  3075. if (src == c1) getId(c2).checked = false;
  3076. if (src == c2) getId(c1).checked = false;
  3077. }
  3078. //--------------------------------------------------------------------------------------------------------
  3079. function showstatsdelayed() {
  3080.  
  3081. if (getId('_wmeRoadHistorySummaryStats').checked == false) {
  3082. getId('wmeroadhistory_stats').innerHTML = '';
  3083. return;
  3084. }
  3085.  
  3086. var maxcount = 0;
  3087. var sortable = [];
  3088. for(ed in stats) {
  3089. var item = stats[ed];
  3090. let count = 0;
  3091. for(c in item) { count++; }
  3092. sortable.push( [ed, count] );
  3093. if (count > maxcount) maxcount = count;
  3094. }
  3095.  
  3096. sortable.sort(function(b, a) {return a[1] - b[1]});
  3097.  
  3098. if (sortable.length) {
  3099. getId('wmeroadhistory_stats').innerHTML = '<br>';
  3100. for(let i=0; i<sortable.length; i++) {
  3101. let autor = sortable[i][0];
  3102. let count = sortable[i][1];
  3103. let pasek = parseInt(150 * count / maxcount);
  3104.  
  3105. let klasa = 'wmeroadhistory_rank0';
  3106. if (autor.indexOf('(1)')>=0) klasa = 'wmeroadhistory_rank1';
  3107. if (autor.indexOf('(2)')>=0) klasa = 'wmeroadhistory_rank2';
  3108. if (autor.indexOf('(3)')>=0) klasa = 'wmeroadhistory_rank3';
  3109. if (autor.indexOf('(4)')>=0) klasa = 'wmeroadhistory_rank4';
  3110. if (autor.indexOf('(5)')>=0) klasa = 'wmeroadhistory_rank5';
  3111. if (autor == 'Inactive User(1)') klasa = 'wmeroadhistory_rank0';
  3112.  
  3113. getId('wmeroadhistory_stats').innerHTML += '<div class="' + klasa + '" style="display: inline-block; min-width:150px;" >' + autor + '</div>';
  3114. getId('wmeroadhistory_stats').innerHTML += '<b>' + count + '</b>' + lang.statedits + '<br>';
  3115. }
  3116. getId('wmeroadhistory_stats').innerHTML += '<br>';
  3117. }
  3118. }
  3119. //--------------------------------------------------------------------------------------------------------
  3120. function reset_statistics()
  3121. {
  3122. stats = {};
  3123. getId('wmeroadhistory_stats').innerHTML = '';
  3124. }
  3125. //--------------------------------------------------------------------------------------------------------
  3126. function initialiseWMERoadHistory()
  3127. {
  3128. var docurl = window.document.URL;
  3129. if (docurl.indexOf( "/pl/" ) >=0 ) lang = langPL;
  3130.  
  3131. var addon = document.createElement('section');
  3132. addon.id = "wmeroadhistory-addon";
  3133. addon.innerHTML = ''
  3134. + '<div style="margin-bottom: 5px;"><b style="margin:0px; padding:0px;"><a href="https://greasyfork.org/pl/scripts/8593-wme-road-history" target="_blank"><u>WME Road History</u></a></b> &nbsp; v' + wmech_version + '</div>'
  3135. + '<button id=wmeroadhistory_scanarea class="btn btn-default" style="min-width:150px; margin: 0px; "></button>'
  3136. + '<div id=wmeroadhistory_log style="">&nbsp;</div>'
  3137. + '<div class=wmeroadhistory_noselect style="margin-top: 10px; ">'
  3138. + '<div id=wmeroadhistory_tab1>' + lang.changes + '</div>'
  3139. + '<div id=wmeroadhistory_tab2>' + lang.edits + '</div>'
  3140. + '<div id=wmeroadhistory_tab3>' + lang.options + '</div>'
  3141. + '<div id=wmeroadhistory_tab9></div>'
  3142. + '</div>'
  3143. + '<div id=wmeroadhistory_options style="text-align: center; display:none; ">'
  3144. + '<div id=wmeroadhistory_wrapper style="display:none; "></div>'
  3145. + '<div id=wmerh_dbinfo></div>'
  3146. + '<br>'
  3147. + '<button id=wmeroadhistory_import class="wmerh_button_enabled" style=" margin: 0px; ">' + lang.imports + '</button> &nbsp; '
  3148. + '<button id=wmeroadhistory_export class="wmerh_button_enabled" style=" margin: 0px; ">' + lang.exports + '</button>'
  3149. + '<div><input id=wmeroadhistory_mergecheckbox type="checkbox" style="margin-top:10px;" title="' + lang.mergedatatip + '" />' + lang.mergedata + '</div>'
  3150. + '<div id=wmerh_progress>'
  3151. + '<div id=wmerh_progress_bar><div id=wmerh_progress_percent>0%</div></div>'
  3152. + '<div id=wmerh_progress_info></div>'
  3153. + '</div>'
  3154. + '<hr style="margin:5px; padding:0px;">'
  3155. + '<p style="margin-bottom:10px;"><b>' + lang.customize + '</b></p>'
  3156. + '<div style="text-align: left; ">'
  3157. + '<div style="text-align: left; ">' + lang.rowsperpage + ' &nbsp; <input id=_wmeRoadHistoryRows type="number" min=5 max=1000 step=5 size="4" value="50" style="width:60px" /></div><br>'
  3158. + '<div style="text-align: left; "><input id=_wmeRoadHistoryDateRange type="checkbox" style="" />' + lang.daterange + '</div>'
  3159. + '<div>'
  3160. + '<p style="min-width: 70px; display: inline-block; ">' + lang.showfromdate + '</p>'
  3161. + '<input type="number" min="2000" max="2999" size="4" id="_wmeRoadHistoryFromYear" style="width:65px; margin: 2px; "/>'
  3162. + '<input type="number" min="1" max="12" size="2" id="_wmeRoadHistoryFromMonth" style="width:45px; margin: 2px; "/>'
  3163. + '<input type="number" min="1" max="31" size="2" id="_wmeRoadHistoryFromDay" style="width:45px; margin: 2px; "/>'
  3164. + '</div>'
  3165. + '<div>'
  3166. + '<p style="min-width: 70px; display: inline-block; ">' + lang.showtodate + '</p>'
  3167. + '<input type="number" min="2000" max="2999" size="4" id="_wmeRoadHistoryToYear" style="width:65px; margin: 2px; "/>'
  3168. + '<input type="number" min="1" max="12" size="2" id="_wmeRoadHistoryToMonth" style="width:45px; margin: 2px; "/>'
  3169. + '<input type="number" min="1" max="31" size="2" id="_wmeRoadHistoryToDay" style="width:45px; margin: 2px; "/>'
  3170. + '</div>'
  3171. + '<div style="text-align: left; "><input id=_wmeRoadHistoryFullTime type="checkbox" />' + lang.fulltime + '</div>'
  3172. + '<div style="text-align: left; "><input id=_wmeRoadHistoryShowCircle type="checkbox" checked />' + lang.showcircle + '</div>'
  3173. + '<div style="text-align: left; "><input id=_wmeRoadHistoryShowCircleShort type="checkbox" checked />' + lang.showcircleshort + '</div>'
  3174. + '<div style="text-align: left; "><input id=_wmeRoadHistoryShowCircleLong type="checkbox" />' + lang.showcirclelong + '</div>'
  3175. + '<div style="text-align: left; "><input id=_wmeRoadHistorySummaryStats type="checkbox" checked />' + lang.summarystats + '</div>'
  3176. + '</div>'
  3177. + '</div>'
  3178. + '<div id=wmeroadhistory_stats style="font-family:Tahoma; font-size:11px; ">'
  3179. + '</div>'
  3180. + '<div id=wmeroadhistory_list_buttons_1 style="text-align: center; margin:0px; background: #f8f8f8; padding: 5px; visibility: hidden; ">'
  3181. + '<button id=wmeroadhistory_prev class="btn btn-default" style="margin: 2px; padding:0px; font-weight:normal; height:20px; padding-left:20px; padding-right:20px; " >&lt;&lt; ' + lang.prev + '</button>'
  3182. + '<button id=wmeroadhistory_next class="btn btn-default" style="margin: 2px; padding:0px; font-weight:normal; height:20px; padding-left:20px; padding-right:20px; " >' + lang.next + ' &gt;&gt;</button>'
  3183. + '<div id=wmeroadhistory_rangeinfo></div>'
  3184. + '</div>'
  3185. + '<div id=wmeroadhistory_list>'
  3186. + '</div>'
  3187. + '<div id=wmeroadhistory_list_buttons_2 style="text-align: center; margin:0px; background: #f8f8f8; padding: 5px; visibility: hidden; ">'
  3188. + '<button id=wmeroadhistory_prev2 class="btn btn-default" style="margin: 2px; padding:0px; font-weight:normal; height:20px; padding-left:20px; padding-right:20px; " >&lt;&lt; ' + lang.prev + '</button>'
  3189. + '<button id=wmeroadhistory_next2 class="btn btn-default" style="margin: 2px; padding:0px; font-weight:normal; height:20px; padding-left:20px; padding-right:20px; " >' + lang.next + ' &gt;&gt;</button>'
  3190. + '</div>'
  3191. + '<style>'
  3192. + '.wmeroadhistory_hovbutton:hover { cursor:pointer; color: #0000FF; text-decoration: underline; }'
  3193. + '#wmeroadhistory_list div { padding-left: 15px; border: 0px solid #f0f0f0; border-bottom-width: 1px; padding-top:5px; padding-bottom:5px; }'
  3194. //+ '#wmeroadhistory_list div:hover { background: #E6F2FF; }'
  3195. + '#wmeroadhistory_list h1 { margin: 0px; padding: 0px; line-height: 100%; font-size: 15px; display: inline-block; left: -15px; position: relative; padding-left: 15px; }'
  3196. + '#wmeroadhistory_list h1:hover { cursor: pointer; color: #0D5270; text-decoration: underline; }'
  3197. + '#wmeroadhistory_list h1 { background-position: 0px 2px; background-repeat: no-repeat; }'
  3198. + '#wmeroadhistory_list h1 { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAMCAIAAAA/PgD0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAA7ElEQVR4nGWNQUvDQBSE34Z1N65dU0mMaSkoItriqVdP/nOP/gEPYkV6MSgloUVsTbPvjYd4qHT4Tt8wjAIA0PP7x+yz2rTh8EBfF9nN8EwpUgw8PL3W2+CdU0oB+Ppep7G+v72KXsrFspWecyASAES9I1dvZVYu9LxeGWuDgHZirZnXK90wQEJ72bBoH5vqJ+x3aWyj8zRpmRnYpWW+SBM9SLw39bL5Nz2xukh8JMB0lAfmIPIH83SUCxAJ4djZ8Wk/iLAgsEzyvndWCBFAAE0GaRqbIJI5My6yTqpq3XQfTQiPb+Xd5dBo3ZlfDOiS3+b9cP0AAAAASUVORK5CYII="); }'
  3199. + '#wmeroadhistory_list h2 { margin: 0px; padding: 0px; line-height: 100%; color: #606060; font-size: 100%; }'
  3200. + '#wmeroadhistory_list ul { margin: 0px; padding: 0px; margin-left: 30px; margin-top: 5px; font-family: Tahoma; font-size: 11px; margin-bottom:5px; color: #606060; line-height: 18px; }'
  3201. + '#wmeroadhistory_list h4 { margin: 0px; padding: 0px; line-height: 100%; color: #606060; font-family: Tahoma; font-size: 11px; display: inline-block; }'
  3202. + '#wmeroadhistory_list h5 { margin: 0px; padding: 0px; line-height: 100%; color: #606060; font-family: Tahoma; font-size: 11px; float:left; margin-top: 5px; }'
  3203. + '#wmeroadhistory_list h6 { margin: 0px; padding: 0px; line-height: 100%; font-family: Tahoma; font-size: 11px; float:right; font-weight: normal; margin-top: 5px; }'
  3204. + '#wmeroadhistory_list p { margin: 0px; }'
  3205. + '#wmeroadhistory_list hr { margin: 0px; clear: both; border: 0px; outline: 0px; height: 0px; }'
  3206. + '#wmeroadhistory_tab1, #wmeroadhistory_tab2, #wmeroadhistory_tab3 { font-size: 12px; display: inline-block; width: 85px; height: 30px; line-height: 30px; border: 1px solid #e0e0e0; border-radius: 5px 5px 0 0; border-bottom-width: 0px; text-align: center; }'
  3207. + '#wmeroadhistory_tab1:hover, #wmeroadhistory_tab2:hover, #wmeroadhistory_tab3:hover { background: #d0d0d0; cursor: pointer; }'
  3208. + '#wmeroadhistory_tab9 { width: 100%; height:1px; background: #e0e0e0; }'
  3209. + '.wmeroadhistory_tab_active { font-weight: bold; background: #e9e9e9; }'
  3210. + '.wmeroadhistory_tab_noactive { font-weight: normal; background: #f8f8f8; }'
  3211. + '.wmeroadhistory_noselect { -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; }'
  3212. + '.wmeroadhistory_rank0 { color: #808080 }'
  3213. + '.wmeroadhistory_rank1 { color: #E12222 }'
  3214. + '.wmeroadhistory_rank2 { color: #EB712D }'
  3215. + '.wmeroadhistory_rank3 { color: #349B20 }'
  3216. + '.wmeroadhistory_rank4 { color: #3176E9 }'
  3217. + '.wmeroadhistory_rank5 { color: #C000C0 }'
  3218. + '.wmeroadhistory_newseg { color: #ffffff; font-weight: bold; background: #4CD429; border-radius: 5px 5px 5px 5px; padding: 1px 5px 1px 5px; margin-left: 3px; }'
  3219. + '.wmeroadhistory_turnlink { display: inline-block; color: #0091FF; text-decoration: underline; }'
  3220. + '.wmeroadhistory_turnlink:hover { color: #000000; text-decoration: underline; cursor: pointer; }'
  3221. + '.wmeroadhistory_turnlink { -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; }'
  3222. + '.wmeroadhistory_error { color: #D72C2C }'
  3223. + '.wmeroadhistory_kind { color: #404040 }'
  3224. + '.wmeroadhistory_toll { color: #CC38CC }'
  3225. + '.wmeroadhistory_trbefore { color: #808080 }'
  3226. + '.wmeroadhistory_trafter { color: #D72C2C }'
  3227. + '.wmeroadhistory_uturn { color: #808080 }'
  3228. + '.wmeroadhistory_trturn { color: #D72C2C }'
  3229. + '.wmeroadhistory_amonly { color: #59899e; font-weight:bold; }'
  3230. + '#wmerh_progress { opacity: 0; height: 0; margin-top: 10px; margin-bottom: 20px; }'
  3231. + '#wmerh_progress { -moz-transition: opacity 0.5s linear; -o-transition: opacity 0.5s linear; -webkit-transition: opacity 0.5s linear; }'
  3232. + '#wmerh_progress.loading { opacity: 1.0; height: auto; }'
  3233. + '#wmerh_progress_bar { margin: 0px; padding: 2px; border: 1px solid #a0a0a0; border-radius: 5px; font-size: 14px; width: 75%; margin: 0 auto; }'
  3234. + '#wmerh_progress_percent { background-color: #C0E7F1; width: 0px; color: #000000; white-space: nowrap; }'
  3235. + '#wmerh_progress_info { font-family: Tahoma; font-size: 11px; color: #000000; }'
  3236. + '.wmerh_button_disabled { disabled: true; color: #C0C0C0; }'
  3237. + '.wmerh_button_enabled { disabled: false; color: #000000; }'
  3238. + '#wmerh_dbinfo { font-size: 11px; color: #a0a0a0; font-weight: normal; text-align: center; padding:0px; font-style: italic; }'
  3239. + '#wmeroadhistory_rangeinfo { font-family: Tahoma; font-size: 11px; color: #007EFF; }'
  3240. + '.wmeroadhistorymarker1 { display:block; width:33px; height:40px; margin-left:-16px; margin-top:-36px; }'
  3241. + '.wmeroadhistorymarker1 { background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACEAAAAoCAYAAABw65OnAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAACUJJREFUeNqsWA1sVFkVPu9nZjoz/ZmW0gJLf2i7si1lU6hYiMvC/siKyBokTYA1EYkJGA0SQ0j8BdaIQiIaRJQogRA2ITR21yXIJgUpsJFlkUSSVtulQO0PpfaPdqadzsyb9/y+mSm03Te0oC+5eXfe3Hu+755z7jnnXkWe/lHRlJUrVyp+v18Z+5iWlmbV19db6LKZTyNQmeYYgqqtra16YWGhbhiGIxgMai6XS41Go4qmaVYoFDLdbndU1/UIxhkYZ4CUmSBlPSuJGHhlZaUWiUScXq/Xhd9uRVFS2EzTdKqqqqGpZvyJohu2LGuUDWODw8PDIYfDEb5582b0SWSSkeDKNazOQWCsNBUg6cuWLcvbsGHDF/Lz8z8L9RdDE9kAduK/MMb2wjx32tra/n769Om6a9euteO/IWgqQEIYG4FmonZE7Ehw9XoKntHR0VSsxLdmzZr5mzdv3jpnzpzXIVgfjYh80ivS/lBkBH0PqOb5RD6TLZKCPkgZ9+/fv3DixImj586da4YmH0JcAPJGoRVjMhHFjgAeN5hnQK0zDxw48LUlS5Z8S9W0lKt3Rf7cKPJRm0jUxvU0uOzSfJGvLBBZXgQy0ejojRs3frdr165TMGEPtDUIfwpOJqJMNgFY0+6ZHo9n9tGjR38CB/vS3T6RfX8VaXgwfY8vnyXyg1dFimaIwFH/snXr1rdHRka6sLABaDc43jTa+IWkp6enYEAGSMw6fvz4XhKovyPy3fdFuoaebh//B55w9l8i87JEKop8zy9fvvy52traj2GqyNDQkNHd3f0pEsrq1asdYJmGQTkHDx78Rnl5+VuXWrCa8/aqn87DeRdvixRDG4tApKysLHT+/Pkm+EcY8iMtLS3mIxIwgz4wMODBLshatWpVxaZNm356b0DVd5y1JzB+v01uqg2Zq60iL8NHFhTPrujs7PzbnTt3+qCN8Pz58w2YyoxFv46ODu53OqNvy5Yt34QTuvZdFAkb8n95KIfyKJfyiUM84hKfJNTc3FwnfMG7ePHieXl5eSsut8Sd0LLsW9J4Pm5MqnPiHMqjXMonDvGIy2kqcwAjIkzhXb9+PeOA9l7j/7byz+WJfB87I8018TvlUj5xiEdc4utUyezZs52IbN6CgoJFwUg8DljPAJ4K0O98XqQ0R+Tb74r4QxP/p1zKJw7xYBZnzBVmzpzJJERzpPh8vsLbiITmMzD4KgLUe5vjfTsCfCiX8olDPOISX0cOUAOBgM6EhCzoa29PeMoUmW2MKFX/9cr4m+r+RX1iTBIZ7YMIZLluH/HwM4avh8NhBWGa2mBCdIwaTzbFugXxNoSVdkLguvL493dB4OeXptYY5RMHJFTixvBjXq2qFkgIWsTj1BxP2gG1DSKvlcRXLnkJAvi279L0zObB+okzhht7O51OC0nFhLdGkf/7C3xTCyLgUOjpCfApyBAhDvGIS3wdNQAJGKwJ+vr6Wkvy03MdCCHhJ4TqjqE4cLorTmLssaao05zwkxKk+/vt/feIh08G8dWenh4TCYvqCTY3N//DCQIriqZe0YWWxwQc+vS08PI8EIH8pqamW8QjLvHVuXPnUi0h2Gnk5MmTH+Idql6YPFraRc6IEa9spxpPucQ6deoUcUbYJ77KYhRBIwyTDCNwdDU0NNQvfk7kpYLpk5BpEKC8yrkijY2N9SgBu4hHXOJzN1sARwSNDKM/gDR+BhWQ/0eviWR6EmkxWZt8EEjSKOeHr4hQLuUTh3jEJX4slff39wsKmFhqR99CVRVcWrmwqmKOonyAesBI4qSm8piLmcQpU+Avv1mLCivLslAA/76uru4jfO7G9hy8desW95j5qLKCagQqEgQQBXVhf3FxsWvpwsKypXnxemA4bA9CAZEkjjjTK/LbN0VeRKl3+fLl2v379/8JztiJercfOzGIBRsTyjtqANW0hdCN+jRqYVIb0q5atXBe6ZtlitI3ItLca1/g2D1r54v8+suIZxmWefHixZo9e/a8g8qtHXGhB1EyAN8I29WYgkondoSD10YZO+A098D6QUX5Cy98sdTlXg3BjCFtg/FSf3JV5YTq36oQeRv+tB7hPBL09x87duzI4cOH34f6O7C4HmjaD62HWFElLflZcdOUmJAGMtkgk5uVlZW/ffv2tVVVVa+kpqZm8MyxsQYgk9TwYzhfNfIKAtDQ9evXLx06dOgsysZ/Q1Y3wHshy8/0MfkQpE1WIxhacFITodXgFoIXh6i+K1eu3D5z5szHs2bN0qpeLCnxIVpebn2shVcR4L6HWqLl9u1/bty48QCArqDEv4eFdCFt96If04DdKUyzsyeJdHV1mUVFRQbIhOFMocQZMwQyHStWrCh5qTQrpwkauYtTWG6ayB/WUf2Bhzt37vwVVv8JwjL3fTcWMIDdNoJjYThhAsvumJ/0aAi1RuGoIazGD5v2QfADtM7du3f/cTgQGPzZ6yJzQOCXb4h4NdPEYek4AlELyHbBBL0g4ed8hubxh2y7HTaBQHV1NXO8A+HUyfILWnDBniz/dPR12NWBlarQ0ODK5csq15UqSiEyL9Rcd+TIkQsgwD1E0hE0nku17OxslpA6ZKoZGRkKSCU1R8wpcTJyefHAjmkQwvNoOkhkoM93Goh4WRYgCYXgO+7S54sK29vbW3fs2FEDwAD+p/moYZJ3Y54HC3CjubgQxqKKigorcfD51BZlpaPjKOjhSZznUfzMxKRMCM/E/yzJUA1IOoTN5Unt6tWr/kWLFuXu3bv3w97eWBBxYR6LFR3Niz6vFLxoJEPNQpxmInxHc3JyTPhdjMT4JKyw6KTKsXoHL0LwdvN+Am8eCfhN4y0NhXIuYoi1bdu2D/C/iabRdHgTnIGIdxsG5kVoEt7mYC6DqwMBS8PcR8DjSVh0IGzBWG0BYSx+o9wZnJjwCQoj0X7O5W82XtNgfCzA8c3GCxySYMPvMK8EIINJchQ4BiKmZUsCqjUwIMhqB6YI0THBmGMcPLSQAPAk8WZTAAAeipWoFy0S4u9YdrcsVmyMCwYLGG5xXiHxZJi4XLNsI+bYPRUSjDZjxgyVJTlIaXgrWI3Ci7JYzki8J3g5VD7WDwaDtIGFE7jJRcHXTRyCozC5OTlgKVNcqCmJbSvQ0IQrw6mesStFzq2pqRkDtL08+68AAwDXuYBD7DWeHAAAAABJRU5ErkJggg==); }'
  3242. + '</style>'
  3243. ;
  3244.  
  3245. var userTabs = getId('user-info');
  3246. var navTabs = getElementsByClassName('nav-tabs', userTabs)[0];
  3247. var tabContent = getElementsByClassName('tab-content', userTabs)[0];
  3248.  
  3249. var newtab = document.createElement('li');
  3250. newtab.innerHTML = '<a id=sidepanel-wmeroadhistory-tab href="#sidepanel-wmeroadhistory" data-toggle="tab" style="" >Road History</a>';
  3251. newtab.id = 'wmeroadhistory_tab';
  3252. navTabs.appendChild(newtab);
  3253.  
  3254. addon.id = "sidepanel-wmeroadhistory";
  3255. addon.className = "tab-pane";
  3256. tabContent.appendChild(addon);
  3257.  
  3258. if (typeof W == 'undefined')
  3259. W = window.W;
  3260. if (typeof W.loginManager == 'undefined')
  3261. W.loginManager = window.W.loginManager;
  3262. if (W.loginManager && W.loginManager.isLoggedIn()) {
  3263. let thisUser = W.loginManager.user;
  3264. var lev = thisUser.normalizedLevel;
  3265. if (thisUser !== null && (lev*lev >= lev+lev+lev || thisUser.isAreaManager)) {
  3266. getId('wmeroadhistory_scanarea').onclick = wmeroadhistorySCANAREA;
  3267. getId('wmeroadhistory_tab1').onclick = wmeroadhistoryTAB1;
  3268. getId('wmeroadhistory_tab2').onclick = wmeroadhistoryTAB2;
  3269. getId('wmeroadhistory_tab3').onclick = wmeroadhistoryTAB3;
  3270. getId('wmeroadhistory_prev').onclick = wmeroadhistoryPREV;
  3271. getId('wmeroadhistory_next').onclick = wmeroadhistoryNEXT;
  3272. getId('wmeroadhistory_prev2').onclick = wmeroadhistoryPREVDOWN;
  3273. getId('wmeroadhistory_next2').onclick = wmeroadhistoryNEXTDOWN;
  3274. getId('wmeroadhistory_import').onclick = wmeroadhistoryIMPORT;
  3275. getId('wmeroadhistory_export').onclick = wmeroadhistoryEXPORT;
  3276. }
  3277. }
  3278.  
  3279. getId('_wmeRoadHistoryShowCircleShort').onchange = update_multi_checkboxes;
  3280. getId('_wmeRoadHistoryShowCircleLong').onchange = update_multi_checkboxes;
  3281.  
  3282. updateSaveButton();
  3283.  
  3284. let t = new Date();
  3285. getId('_wmeRoadHistoryFromYear').value = 2010;
  3286. getId('_wmeRoadHistoryFromMonth').value = 1;
  3287. getId('_wmeRoadHistoryFromDay').value = 1;
  3288.  
  3289. getId('_wmeRoadHistoryToYear').max = t.getFullYear() + 1;
  3290. getId('_wmeRoadHistoryToYear').value = t.getFullYear() + 1;
  3291. getId('_wmeRoadHistoryToMonth').value = 1;
  3292. getId('_wmeRoadHistoryToDay').value = 1;
  3293.  
  3294. getId('_wmeRoadHistoryDateRange').onchange = reset_statistics;
  3295. getId('_wmeRoadHistoryFromYear').onchange = reset_statistics;
  3296. getId('_wmeRoadHistoryFromMonth').onchange = reset_statistics;
  3297. getId('_wmeRoadHistoryFromDay').onchange = reset_statistics;
  3298. getId('_wmeRoadHistoryToYear').onchange = reset_statistics;
  3299. getId('_wmeRoadHistoryToMonth').onchange = reset_statistics;
  3300. getId('_wmeRoadHistoryToDay').onchange = reset_statistics;
  3301.  
  3302. loadOptions();
  3303.  
  3304. var list = document.getElementsByTagName("div");
  3305. for(let i=0; i<list.length; i++) {
  3306. let id = list[i].id;
  3307. let p = id.indexOf("PendingOperation");
  3308. if (p>=0)
  3309. wazepending = list[i];
  3310. }
  3311.  
  3312. W.vent.on("operationPending", function() {
  3313. ventCount++;
  3314. });
  3315. W.vent.on("operationDone", function() {
  3316. ventCount--;
  3317. if (ventCount < 0) ventCount = 0;
  3318. });
  3319.  
  3320. window.setInterval(wmeroadhistoryLOOP, LOOPTIMER);
  3321. }
  3322. //--------------------------------------------------------------------------------------------------------------
  3323. bootstrapWMERoadHistory();