// ==UserScript==
// @name WME Road History
// @name:pl WME Road History
// @description Saves state of roads in area and it finds changes between history snapshots.
// @description:pl Zapisuje stan obszaru mapy i tworzy historię zmian pomiędzy "migawkami" mapy.
// @include https://www.waze.com/editor/*
// @include https://www.waze.com/*/editor/*
// @include https://editor-beta.waze.com/*
// @version 1.2.2
// @grant none
// @namespace https://greasyfork.org/pl/scripts/8593-wme-road-history
// @copyright 2015 wlodek76
// @credits FZ69617 tips and tricks
// ==/UserScript==
var wmech_version = "1.2.2";
var epsg900913 = new OpenLayers.Projection("EPSG:900913");
var epsg4326 = new OpenLayers.Projection("EPSG:4326");
var lang = {code:'en',
summarystats : 'Statistic of the latest edits',
statedits : ' ed.',
showcircle : 'Colorize edits on the map',
showcircleshort : 'Show short names of editors',
showcirclelong : 'Show long names of editors',
fulltime : 'Show seconds in timestamps',
datesdefined : 'Date range:',
datesincorrect : 'Incorrect date range in Options!',
daterange : 'Date range:',
showfromdate : 'From date:',
showtodate : 'To date:',
customize : 'Customize:',
rowsperpage : 'Rows per page: ',
dbversion : 'Database version: ',
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.',
reloadsite : 'WME Road History\n\nDatabase version has been updated. Please refresh the site!',
closetabs : 'WME Road History\n\nPlease close all other tabs with this site open!',
mergedatatip : 'Merge option compares timestamps between segments. Only segments with the newest timestamp will be uploaded.',
dberrorlocked : "ERR: Can't delete a Database. Database is locked or used in other instance of browser!",
dberrordelete : "ERR: Can't delete a Database!",
preparingdatabase : 'Preparing database...',
clearquestion : 'Do you want to clear Database before import?',
mergedata : 'Merge data into Database',
exporteddata : 'Exported records: ',
importeddata : 'Processed records: ',
imports : 'Import from file...',
exports : 'Export to file...',
options : 'Options',
amonly : 'Tools for Area Managers or L3 editors.',
trAB : 'Time Restrictions (A do B):',
trBA : 'Time Restrictions (B do A):',
removedtr : 'Removed TR turn: ',
changedtr : 'Changed TR turn: ',
addedtr : 'Added TR turn: ',
removed_uturn : 'Removed U-Turn: ',
added_uturn : 'Added U-Turn: ',
veh1 : 'Trucks',
veh2 : 'Public Transportation',
veh3 : 'Taxis',
veh4 : 'Buses',
veh5 : 'HOV - 2',
veh6 : 'HOV - 3',
veh7 : 'RV',
veh8 : 'Towing vehicles',
veh9 : 'Motorcycles',
veh10 : 'Private vehicles',
veh11 : 'Hazardous materials',
exceptvehicles : 'Except vehicles: ',
allweek : 'All Week',
day1 : 'Su',
day2 : 'Mo',
day3 : 'Tu',
day4 : 'We',
day5 : 'Th',
day6 : 'Fr',
day7 : 'Sa',
allday : 'All Day',
atob : 'A to B',
btoa : 'B to A',
none : 'None',
trbefore : 'Time restrictions before:',
trafter : 'Time restrictions:',
tollchange : 'Changed: ',
tollpart : 'Toll Road Partially',
tollfree : 'Toll Road Free',
toll : 'Toll Road',
changename : 'Street: ',
changecity : 'City: ',
level : 'Level: ',
changedgeom : 'Changed geometry',
into : 'to ',
to : 'to',
noname : 'No name',
removedturn : 'Removed turn: ',
addedturn : 'Added turn: ',
road1 : 'Street',
road2 : 'Primary Street',
road3 : 'Freeway',
road4 : 'Ramp',
road5 : 'Walking Trail',
road6 : 'Major Highway',
road7 : 'Minor Highway',
road8 : 'Dirt road / 4x4 Trail',
road10 : 'Pedestrian Boardwalk',
road17 : 'Private Road',
road18 : 'Railroad',
road19 : 'Runway / Taxiway',
road20 : 'Parking Lot Road',
road21 : 'Service Road',
roadtype : 'RoadType(',
dirchange0 : '<b class=wmeroadhistory_error>Removed direction</b>',
dirchange1 : 'Changed to <b class=wmeroadhistory_error>One-way</b>',
dirchange2 : 'Changed to <b class=wmeroadhistory_error>Two-way</b>',
dirchangerev : '<b class=wmeroadhistory_error>Reversed direction</b>',
dirchangeadd : '<b class=wmeroadhistory_error>Added direction</b>',
newsegment : 'New',
sec : 'sec.',
prev : 'Newest',
next : 'Oldest',
stop : 'Stop',
changes: 'Changes',
segments: 'Segments',
edits: 'Edits',
scanarea: 'Scan Area'
};
var langPL = {code:'pl',
summarystats : 'Statystyka ostatnich edycji',
statedits : ' ed.',
showcircle : 'Koloruj edycje na mapie',
showcircleshort : 'Pokaż skrócone nazwy edytorów',
showcirclelong : 'Pokaż długie nazwy edytorów',
fulltime : 'Pokaż sekundy w znacznikach czasowych',
datesdefined : 'Zakres dat:',
datesincorrect : 'UWAGA: Niewłaściwy zakres dat w Opcjach!',
daterange : 'Zakres dat:',
showfromdate : "Od dnia:",
showtodate : "Do dnia:",
customize : 'Dostosuj ustawienia:',
rowsperpage : 'Ilość wierszy na stronie: ',
dbversion : 'Wersja bazy danych: ',
dbopenerror : 'WME Road History\n\nPrawdopodobnie próbujesz uruchomić starszą wersję skryptu na nowszej bazie danych. Zaktualizuj skrypt do najnowszej wersji.',
reloadsite : 'WME Road History\n\nWersja bazy danych została zaktualizowana. Proszę odświeżyć stronę!',
closetabs : 'WME Road History\n\nBaza danych wymaga aktualizacji. Proszę zamknąć stronę na pozostałych zakładkach przeglądarki!',
mergedatatip : 'Opcja dołączania danych porównuje znaczniki czasowe segmentów. Tylko najnowsze segmenty będą zaimportowane.',
dberrorlocked : "ERR: Nie mogę skasować Bazy danych.<br>Baza danych jest zablokowana lub używana przez inną instancję przeglądarki!",
dberrordelete : "ERR: Nie mogę skasować Bazy danych!",
preparingdatabase : 'Przygotowywanie bazy danych...',
clearquestion : 'Czy wyczyścić Bazę danych przed importem?',
mergedata : 'Dołącz dane do Bazy danych',
exporteddata : 'Wyeksportowano rekordów: ',
importeddata : 'Przetworzono rekordów: ',
imports : 'Import z pliku...',
exports : 'Eksport do pliku...',
options : 'Opcje',
amonly : 'Narzędzie przeznaczone dla Area Manager lub edytorów L3.',
trAB : 'Ograniczenia czasowe (A do B):',
trBA : 'Ograniczenia czasowe (B do A):',
removedtr : 'Usunięty TR skrętu: ',
changedtr : 'Zmieniony TR skrętu: ',
addedtr : 'Dodany TR skrętu: ',
removed_uturn : 'Usunięte zawracanie: ',
added_uturn : 'Dodane zawracanie: ',
veh1 : 'Ciężarówki',
veh2 : 'Transport Publiczny',
veh3 : 'Taksówki',
veh4 : 'Autobusy',
veh5 : 'Więcej niż 2 pasażerów (HOV - 2)',
veh6 : 'Więcej niż 3 pasażerów (HOV - 3)',
veh7 : 'Kamper',
veh8 : 'Pojazdy holujące',
veh9 : 'Motocykle',
veh10 : 'Samochody prywatne',
veh11 : 'Materiały niebezpieczne',
exceptvehicles : 'Z wyjątkiem pojazdów: ',
allweek : 'Każdy tydzień',
day1 : 'Nd',
day2 : 'Pon',
day3 : 'Wt',
day4 : 'Śr',
day5 : 'Czw',
day6 : 'Pt',
day7 : 'Sob',
allday : 'Cały dzień',
atob : 'A do B',
btoa : 'B do A',
none : 'Brak',
trbefore : 'Poprzednie ograniczenia czasowe:',
trafter : 'Ograniczenia czasowe:',
tollchange : 'Zmiana: ',
tollpart : 'Droga częściowo płatna',
tollfree : 'Droga bezpłatna',
toll : 'Droga płatna',
changename : 'Nazwa: ',
changecity : 'Miasto: ',
level : 'Poziom: ',
changedgeom : 'Zmiana geometrii',
into : 'w ',
to : 'do',
noname : 'Bez nazwy',
removedturn : 'Usunięto skręt: ',
addedturn : 'Dodano skręt: ',
road1 : 'Ulica',
road2 : 'Główna ulica',
road3 : 'Autostrada / Droga ekspresowa',
road4 : 'Wjazd / Zjazd',
road5 : 'Ścieżka dla pieszych',
road6 : 'Droga krajowa',
road7 : 'Droga wojewódzka',
road8 : 'Droga gruntowa',
road10 : 'Deptak',
road17 : 'Droga prywatna',
road18 : 'Tory kolejowe / tramwajowe',
road19 : 'Pas startowy / Droga kołowania',
road20 : 'Droga wewnętrzna',
road21 : 'Droga serwisowa',
roadtype : 'RoadType(',
dirchange0 : '<b class=wmeroadhistory_error>Usunięto kierunkowość</b>',
dirchange1 : 'Zmieniono na <b class=wmeroadhistory_error>Jednokierunkowa</b>',
dirchange2 : 'Zmieniono na <b class=wmeroadhistory_error>Dwukierunkowa</b>',
dirchangerev : '<b class=wmeroadhistory_error>Odwrócono kierunkowość</b>',
dirchangeadd : '<b class=wmeroadhistory_error>Dodano kierunkowość</b>',
newsegment : 'Nowy',
sec : 'sek.',
prev : 'Nowsze',
next : 'Starsze',
stop : 'Stop',
changes: 'Zmiany',
segments: 'Segmentów',
edits: 'Edycje',
scanarea: 'Skanuj Obszar'
};
var DIFF_DIR = 0x01;
var DIFF_TYPE = 0x02;
var DIFF_TURNS = 0x04;
var DIFF_NAMES = 0x08;
var DIFF_CITY = 0x10;
var DIFF_TR = 0x20;
var DIFF_LEVEL = 0x40;
var DIFF_GEOM = 0x80;
var DIFF_TOLL = 0x100;
var DIFF_TS = 0x200;
var last_LONLAT;
var last_ZOOM;
var wazepending;
var rec_xy1;
var rec_xy2;
var rec = false;
var rec_direction = 1;
var scanned_segments_list = {}; // zastosowanie tablicy obiektów jest szybsze wydajnościowo podczas przeszukiwania tablicy
var scanned_segments = 0;
var scanned_segments_prev = 0;
var added_segments = 0;
var added_segments_prev = 0;
var added_changes = 0;
var added_changes_prev = 0;
var rec_zoom = 5;
var rec_elapsed_time = 0;
var wazeDataBaseName = 'wazeDB';
var wazeDB;
var readconfig = 0;
var LastTimeScan = 0;
var ShowHistMode = 2;
var pageEdits = 0;
var prevScroll = 0;
var userinfoDispPrev = '';
var showturn = [0,0,0,0];
var importlines = new Array();
var importcount = 0;
var importmaxcount = 0;
var importchunk = 0;
var importpercent = -1;
var importbrowser = 0;
var chunkdata = 0;
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
var markerskey = {};
var markersseg = {};
var markersadd = [];
var stats = {};
var updatestatsdelay = 0;
var ventCount = 0;
var scanprocentyPrev = 0;
var scanprocentyDelta = 0;
var scanprocPrev = 0;
var scanproc = '';
var LOOPTIMER = 100;
/*----------------------------------------------------------------------------------------------------------
FileSaver.js Javascript Component
Copyright © 2015 Eli Grey.
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
documentation files (the "Software"), to deal in the Software without restriction, including without
limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
------------------------------------------------------------------------------------------------------------*/
var saveAs = saveAs
// IE 10+ (native saveAs)
|| (typeof navigator !== "undefined" &&
navigator.msSaveOrOpenBlob && navigator.msSaveOrOpenBlob.bind(navigator))
// Everyone else
|| (function(view) {
"use strict";
// IE <10 is explicitly unsupported
if (typeof navigator !== "undefined" &&
/MSIE [1-9]\./.test(navigator.userAgent)) {
return;
}
var
doc = view.document
// only get URL when necessary in case Blob.js hasn't overridden it yet
, get_URL = function() {
return view.URL || view.webkitURL || view;
}
, save_link = doc.createElementNS("http://www.w3.org/1999/xhtml", "a")
, can_use_save_link = "download" in save_link
, click = function(node) {
var event = doc.createEvent("MouseEvents");
event.initMouseEvent(
"click", true, false, view, 0, 0, 0, 0, 0
, false, false, false, false, 0, null
);
node.dispatchEvent(event);
}
, webkit_req_fs = view.webkitRequestFileSystem
, req_fs = view.requestFileSystem || webkit_req_fs || view.mozRequestFileSystem
, throw_outside = function(ex) {
(view.setImmediate || view.setTimeout)(function() {
throw ex;
}, 0);
}
, force_saveable_type = "application/octet-stream"
, fs_min_size = 0
// See https://code.google.com/p/chromium/issues/detail?id=375297#c7 and
// https://github.com/eligrey/FileSaver.js/commit/485930a#commitcomment-8768047
// for the reasoning behind the timeout and revocation flow
, arbitrary_revoke_timeout = 500 // in ms
, revoke = function(file) {
var revoker = function() {
if (typeof file === "string") { // file is an object URL
get_URL().revokeObjectURL(file);
} else { // file is a File
file.remove();
}
};
if (view.chrome) {
revoker();
} else {
setTimeout(revoker, arbitrary_revoke_timeout);
}
}
, dispatch = function(filesaver, event_types, event) {
event_types = [].concat(event_types);
var i = event_types.length;
while (i--) {
var listener = filesaver["on" + event_types[i]];
if (typeof listener === "function") {
try {
listener.call(filesaver, event || filesaver);
} catch (ex) {
throw_outside(ex);
}
}
}
}
, FileSaver = function(blob, name) {
// First try a.download, then web filesystem, then object URLs
var
filesaver = this
, type = blob.type
, blob_changed = false
, object_url
, target_view
, dispatch_all = function() {
dispatch(filesaver, "writestart progress write writeend".split(" "));
}
// on any filesys errors revert to saving with object URLs
, fs_error = function() {
// don't create more object URLs than needed
if (blob_changed || !object_url) {
object_url = get_URL().createObjectURL(blob);
}
if (target_view) {
target_view.location.href = object_url;
} else {
var new_tab = view.open(object_url, "_blank");
if (new_tab == undefined && typeof safari !== "undefined") {
//Apple do not allow window.open, see http://bit.ly/1kZffRI
view.location.href = object_url
}
}
filesaver.readyState = filesaver.DONE;
dispatch_all();
revoke(object_url);
}
, abortable = function(func) {
return function() {
if (filesaver.readyState !== filesaver.DONE) {
return func.apply(this, arguments);
}
};
}
, create_if_not_found = {create: true, exclusive: false}
, slice
;
filesaver.readyState = filesaver.INIT;
if (!name) {
name = "download";
}
if (can_use_save_link) {
object_url = get_URL().createObjectURL(blob);
save_link.href = object_url;
save_link.download = name;
click(save_link);
filesaver.readyState = filesaver.DONE;
dispatch_all();
revoke(object_url);
return;
}
// prepend BOM for UTF-8 XML and text/plain types
if (/^\s*(?:text\/(?:plain|xml)|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(blob.type)) {
blob = new Blob(["\ufeff", blob], {type: blob.type});
}
// Object and web filesystem URLs have a problem saving in Google Chrome when
// viewed in a tab, so I force save with application/octet-stream
// http://code.google.com/p/chromium/issues/detail?id=91158
// Update: Google errantly closed 91158, I submitted it again:
// https://code.google.com/p/chromium/issues/detail?id=389642
if (view.chrome && type && type !== force_saveable_type) {
slice = blob.slice || blob.webkitSlice;
blob = slice.call(blob, 0, blob.size, force_saveable_type);
blob_changed = true;
}
// Since I can't be sure that the guessed media type will trigger a download
// in WebKit, I append .download to the filename.
// https://bugs.webkit.org/show_bug.cgi?id=65440
if (webkit_req_fs && name !== "download") {
name += ".download";
}
if (type === force_saveable_type || webkit_req_fs) {
target_view = view;
}
if (!req_fs) {
fs_error();
return;
}
fs_min_size += blob.size;
req_fs(view.TEMPORARY, fs_min_size, abortable(function(fs) {
fs.root.getDirectory("saved", create_if_not_found, abortable(function(dir) {
var save = function() {
dir.getFile(name, create_if_not_found, abortable(function(file) {
file.createWriter(abortable(function(writer) {
writer.onwriteend = function(event) {
target_view.location.href = file.toURL();
filesaver.readyState = filesaver.DONE;
dispatch(filesaver, "writeend", event);
revoke(file);
};
writer.onerror = function() {
var error = writer.error;
if (error.code !== error.ABORT_ERR) {
fs_error();
}
};
"writestart progress write abort".split(" ").forEach(function(event) {
writer["on" + event] = filesaver["on" + event];
});
writer.write(blob);
filesaver.abort = function() {
writer.abort();
filesaver.readyState = filesaver.DONE;
};
filesaver.readyState = filesaver.WRITING;
}), fs_error);
}), fs_error);
};
dir.getFile(name, {create: false}, abortable(function(file) {
// delete file if it already exists
file.remove();
save();
}), abortable(function(ex) {
if (ex.code === ex.NOT_FOUND_ERR) {
save();
} else {
fs_error();
}
}));
}), fs_error);
}), fs_error);
}
, FS_proto = FileSaver.prototype
, saveAs = function(blob, name) {
return new FileSaver(blob, name);
}
;
FS_proto.abort = function() {
var filesaver = this;
filesaver.readyState = filesaver.DONE;
dispatch(filesaver, "abort");
};
FS_proto.readyState = FS_proto.INIT = 0;
FS_proto.WRITING = 1;
FS_proto.DONE = 2;
FS_proto.error =
FS_proto.onwritestart =
FS_proto.onprogress =
FS_proto.onwrite =
FS_proto.onabort =
FS_proto.onerror =
FS_proto.onwriteend =
null;
return saveAs;
}(
typeof self !== "undefined" && self
|| typeof window !== "undefined" && window
|| this.content
));
//------------------------------------------------------------------------------------------------
window.indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
window.IDBTransaction = window.IDBTransaction || window.webkitIDBTransaction || window.msIDBTransaction;
window.IDBKeyRange = window.IDBKeyRange || window.webkitIDBKeyRange || window.msIDBKeyRange
if (!window.indexedDB) {
window.alert("Your browser doesn't support a stable version of IndexedDB.")
}
//------------------------------------------------------------------------------------------------
var docurl = window.document.URL;
if (docurl.indexOf( "/pl/" ) >=0 ) lang = langPL;
//------------------------------------------------------------------------------------------------
var openrequest = window.indexedDB.open( wazeDataBaseName, 2 );
openrequest.onsuccess = function(event) {
wazeDB = event.target.result;
console.log("WMERoadHistory.DataBase.Init.OK = ", openrequest.result.name, wazeDB.version );
};
openrequest.onblocked = function(event) {
//alert( lang.closetabs );
};
openrequest.onerror = function(event) {
alert(lang.dbopenerror);
};
openrequest.onupgradeneeded = function(event) {
var db = event.target.result;
console.log("WMERoadHistory.DataBase.Upgrade: ", db);
storeSEG = false;
storeCHG = false;
var stores = db.objectStoreNames;
for(var n=0; n<stores.length; n++) {
if ( stores[n] == 'segments') storeSEG = true;
if ( stores[n] == 'changes') storeCHG = true;
}
if (storeSEG) {
}
else {
var newStore = db.createObjectStore("segments", { keyPath: "ID", autoIncrement: false });
newStore.createIndex("T", "T", { unique: false });
}
if (storeCHG) {
var currentStore = event.currentTarget.transaction.objectStore("changes");
var nameID = '';
var nameT = '';
for(var n=0; n<currentStore.indexNames.length; n++) {
var name = currentStore.indexNames[n];
if (name == 'ID') nameID = name;
if (name == 'T') nameT = name;
}
if (nameT == '') currentStore.createIndex("T", "T", { unique: false });
if (nameID == '') currentStore.createIndex("ID", "ID", { unique: false });
}
else {
var newStore = db.createObjectStore("changes", { keyPath: "nr", autoIncrement: true });
newStore.createIndex("T", "T", { unique: false });
newStore.createIndex("ID", "ID", { unique: false });
}
}
//------------------------------------------------------------------------------------------------
function bootstrapWMERoadHistory()
{
if(!window.Waze.map) {
console.log('WME Road History: Waiting for WME...');
setTimeout(bootstrapWMERoadHistory, 1000);
return;
}
window.addEventListener("beforeunload", saveOptions, true);
setTimeout(initialiseWMERoadHistory, 1000);
}
//------------------------------------------------------------------------------------------------
function saveOptions() {
var options = '';
var opt0 = getId('_wmeRoadHistoryRows');
var opt1 = getId('_wmeRoadHistoryFromYear');
var opt2 = getId('_wmeRoadHistoryFromMonth');
var opt3 = getId('_wmeRoadHistoryFromDay');
var opt4 = getId('_wmeRoadHistoryToYear');
var opt5 = getId('_wmeRoadHistoryToMonth');
var opt6 = getId('_wmeRoadHistoryToDay');
var opt7 = getId('_wmeRoadHistoryDateRange');
var opt8 = getId('_wmeRoadHistoryFullTime');
var opt9 = getId('_wmeRoadHistoryShowCircle');
var opt10 = getId('_wmeRoadHistoryShowCircleShort');
var opt11 = getId('_wmeRoadHistoryShowCircleLong');
var opt12 = getId('_wmeRoadHistorySummaryStats');
if (opt0 != undefined) options += opt0.value + "|";
if (opt1 != undefined) options += opt1.value + "|";
if (opt2 != undefined) options += opt2.value + "|";
if (opt3 != undefined) options += opt3.value + "|";
if (opt4 != undefined) options += opt4.value + "|";
if (opt5 != undefined) options += opt5.value + "|";
if (opt6 != undefined) options += opt6.value + "|";
if (opt7 != undefined) options += opt7.checked + "|";
if (opt8 != undefined) options += opt8.checked + "|";
if (opt9 != undefined) options += opt9.checked + "|";
if (opt10 != undefined) options += opt10.checked + "|";
if (opt11 != undefined) options += opt11.checked + "|";
if (opt12 != undefined) options += opt12.checked + "|";
localStorage.setItem('WMERoadHistoryOptions', options );
}
//------------------------------------------------------------------------------------------------
function loadOptions() {
if (localStorage.WMERoadHistoryOptions) {
var options = localStorage.WMERoadHistoryOptions.split('|');
if (options[0]) getId('_wmeRoadHistoryRows').value = options[0];
if (options[1]) getId('_wmeRoadHistoryFromYear').value = options[1];
if (options[2]) getId('_wmeRoadHistoryFromMonth').value = options[2];
if (options[3]) getId('_wmeRoadHistoryFromDay').value = options[3];
if (options[4]) getId('_wmeRoadHistoryToYear').value = options[4];
if (options[5]) getId('_wmeRoadHistoryToMonth').value = options[5];
if (options[6]) getId('_wmeRoadHistoryToDay').value = options[6];
if (options[7]) getId('_wmeRoadHistoryDateRange').checked = (options[7] == 'true');
if (options[8]) getId('_wmeRoadHistoryFullTime').checked = (options[8] == 'true');
if (options[9]) getId('_wmeRoadHistoryShowCircle').checked = (options[9] == 'true');
if (options[10]) getId('_wmeRoadHistoryShowCircleShort').checked = (options[10] == 'true');
if (options[11]) getId('_wmeRoadHistoryShowCircleLong').checked = (options[11] == 'true');
if (options[12]) getId('_wmeRoadHistorySummaryStats').checked = (options[12] == 'true');
}
}
//------------------------------------------------------------------------------------------------
function getElementsByClassName(classname, node) {
if(!node) node = document.getElementsByTagName("body")[0];
var a = [];
var re = new RegExp('\\b' + classname + '\\b');
var els = node.getElementsByTagName("*");
for (var i=0,j=els.length; i<j; i++)
if (re.test(els[i].className)) a.push(els[i]);
return a;
}
//--------------------------------------------------------------------------------------------------------
function getId(node) {
return document.getElementById(node);
}
//--------------------------------------------------------------------------------------------------------
function precFloat(f, prec)
{
if (!isFinite(f)) return "—";
if (f < 0) {
f -= Math.pow(0.1, prec) * 0.5;
}
else {
f += Math.pow(0.1, prec) * 0.5;
}
var ipart = parseInt(f);
var fpart = Math.abs(f - ipart);
f = ipart;
if (fpart == '0') fpart = '0.0';
fpart += '0000000000000000';
if (prec) f += fpart.substr(1, prec + 1);
return f;
}
//--------------------------------------------------------------------------------------------------------
function createCRC32() {
var c, i, j,
crcTable = [];
for (i = 0; i < 256; i++) {
c = i;
for (j = 0; j < 8; j++) {
c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));
}
crcTable[i] = c;
}
return function (str) {
var i,
crc = 0 ^ (-1);
for (i = 0; i < str.length; i++) {
crc = (crc >>> 8) ^ crcTable[(crc ^ str.charCodeAt(i)) & 0xFF];
}
return (crc ^ (-1)) >>> 0;
};
}
//--------------------------------------------------------------------------------------------------------
var crc32 = createCRC32();
//--------------------------------------------------------------------------------------------------------
function updateSaveButton() {
var obj = getId('wmeroadhistory_scanarea');
if (rec == true) {
obj.style.backgroundColor = '#C00000';
obj.style.color = '#FFFFFF';
obj.innerHTML = lang.stop;
}
else {
obj.style.backgroundColor = '';
obj.style.color = '';
obj.innerHTML = lang.scanarea;
}
}
//--------------------------------------------------------------------------------------------------------
function stopRec(finished) {
var WM = window.Waze.map;
rec = false;
updateSaveButton(rec);
WM.panTo(last_LONLAT);
WM.zoomTo(last_ZOOM);
if (ShowHistMode == 3) ShowHistMode = 2;
if (ShowHistMode == 0) wmeroadhistoryTAB2();
if (ShowHistMode == 1) wmeroadhistoryTAB1();
if (ShowHistMode == 2) wmeroadhistoryTAB2();
}
//--------------------------------------------------------------------------------------------------------
function getMidPointLen(seg) {
var points, p1, p2;
points = seg.geometry.components.length;
var x = 0;
var y = 0;
var length = 0;
if (points == 2) {
p1 = seg.geometry.components[0];
p2 = seg.geometry.components[1];
x = p1.x + (p2.x - p1.x) * 0.5;
y = p1.y + (p2.y - p1.y) * 0.5;
var dx = p2.x - p1.x;
var dy = p2.y - p1.y;
length += Math.sqrt(dx*dx + dy*dy);
}
else {
for(var i=0; i<points-1; i++) {
p1 = seg.geometry.components[i + 0];
p2 = seg.geometry.components[i + 1];
var dx = p2.x - p1.x;
var dy = p2.y - p1.y;
length += Math.sqrt(dx*dx + dy*dy);
}
var midlen = length / 2.0;
var length1 = 0;
var length2 = 0;
for(var i=0; i<points-1; i++) {
p1 = seg.geometry.components[i + 0];
p2 = seg.geometry.components[i + 1];
var dx = p2.x - p1.x;
var dy = p2.y - p1.y;
length1 = length2;
length2 = length2 + Math.sqrt(dx*dx + dy*dy);
if (midlen >= length1 && midlen < length2) {
var proc = (midlen - length1) / (length2 - length1);
x = p1.x + (p2.x - p1.x) * proc;
y = p1.y + (p2.y - p1.y) * proc;
}
}
}
return { x:x, y:y, d:length};
}
//------------------------------------------------------------------------------------------------
function merge_imported_change_DB_Sync(item) {
var objstore = wazeDB.transaction( 'changes', 'readonly').objectStore('changes');
var range = IDBKeyRange.only( item.ID );
var index = objstore.index( 'ID' );
var idexists = false;
var foundthesame = false;
index.openCursor(range, "next").onsuccess = function(event) {
var cursor = event.target.result;
if (cursor) {
idexists = true;
var rekord = cursor.value;
var diff = false;
if (rekord.E != item.E) diff = true;
if (rekord.D != item.D) diff = true;
if (rekord.x != item.x) diff = true;
if (rekord.y != item.y) diff = true;
if (rekord.N != item.N) diff = true;
if (rekord.C != item.C) diff = true;
if (rekord.K != item.K) diff = true;
if (rekord.Q != item.Q) diff = true;
if (rekord.drA != item.drA) diff = true;
if (rekord.drB != item.drB) diff = true;
if (rekord.tyA != item.tyA) diff = true;
if (rekord.tyB != item.tyB) diff = true;
if (rekord.arA != item.arA) diff = true;
if (rekord.arB != item.arB) diff = true;
if (rekord.naA != item.naA) diff = true;
if (rekord.naB != item.naB) diff = true;
if (rekord.ciA != item.ciA) diff = true;
if (rekord.ciB != item.ciB) diff = true;
if (rekord.trA != item.trA) diff = true;
if (rekord.trB != item.trB) diff = true;
if (rekord.tsA != item.tsA) diff = true;
if (rekord.tsB != item.tsB) diff = true;
if (rekord.lvA != item.lvA) diff = true;
if (rekord.lvB != item.lvB) diff = true;
if (rekord.geA != item.geA) diff = true;
if (rekord.geB != item.geB) diff = true;
if (rekord.tolA != item.tolA) diff = true;
if (rekord.tolB != item.tolB) diff = true;
if (!diff) foundthesame = true;
cursor.continue();
}
else {
if (idexists) {
if (foundthesame) {
getId('wmerh_progress_info').innerHTML = lang.importeddata + (importcount - importchunk) + ' / ' + (importmaxcount - 2);
setTimeout(wmeroadhistoryIMPORTLOOP, 1);
}
else {
var objectStore = wazeDB.transaction('changes', 'readwrite').objectStore('changes');
var request = objectStore.put( item );
request.onsuccess = function() {
getId('wmerh_progress_info').innerHTML = lang.importeddata + (importcount - importchunk) + ' / ' + (importmaxcount - 2);
setTimeout(wmeroadhistoryIMPORTLOOP, 1);
}
}
}
else {
var objectStore = wazeDB.transaction('changes', 'readwrite').objectStore('changes');
var request = objectStore.put( item );
request.onsuccess = function() {
getId('wmerh_progress_info').innerHTML = lang.importeddata + (importcount - importchunk) + ' / ' + (importmaxcount - 2);
setTimeout(wmeroadhistoryIMPORTLOOP, 1);
}
}
}
}
}
//--------------------------------------------------------------------------------------------------------
function changesDB(diff, segID, segtime, segeditor, segx, segy, segnames, segcity, before, after, segkind, segequal) {
var item = { ID: segID, T: segtime, E: segeditor, D: diff, x: segx, y: segy, N: segnames, C: segcity, K: segkind, Q: segequal};
if (diff & DIFF_DIR) item.drA = before.D;
if (diff & DIFF_DIR) item.drB = after.D;
if (diff & DIFF_TYPE) item.tyA = before.K;
if (diff & DIFF_TYPE) item.tyB = after.K;
if (diff & DIFF_TURNS) item.arA = before.A;
if (diff & DIFF_TURNS) item.arB = after.A;
if (diff & DIFF_NAMES) item.naA = before.N;
if (diff & DIFF_NAMES) item.naB = after.N;
if (diff & DIFF_CITY) item.ciA = before.C;
if (diff & DIFF_CITY) item.ciB = after.C;
if (diff & DIFF_TR) item.trA = before.TR;
if (diff & DIFF_TR) item.trB = after.TR;
if (diff & DIFF_TS) item.tsA = before.TS;
if (diff & DIFF_TS) item.tsB = after.TS;
if (diff & DIFF_LEVEL) item.lvA = before.L;
if (diff & DIFF_LEVEL) item.lvB = after.L;
if (diff & DIFF_GEOM) item.geA = before.G;
if (diff & DIFF_GEOM) item.geB = after.G;
if (diff & DIFF_TOLL) item.tolA = before.TL;
if (diff & DIFF_TOLL) item.tolB = after.TL;
var objectStore = wazeDB.transaction('changes', 'readwrite').objectStore('changes');
var request = objectStore.add( item );
request.onsuccess = function() {
added_changes++;
}
request.onerror = function() {
}
}
//--------------------------------------------------------------------------------------------------------
function addDB(segID, roadtime, roadeditor, roaddir, roadkind, roadarrows, roadnames, roadcity, roadtr, roadts, roadlevel, roadgeom, roadgeom2, roadtoll, roadx, roady, roadequal, roadpoints) {
var objectStore = wazeDB.transaction('segments', 'readwrite').objectStore('segments');
var request = objectStore.get( segID );
request.onsuccess = function() {
if(request.result) {
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 };
var rekord = request.result;
var diff = 0;
if (roaddir != rekord.D) diff |= DIFF_DIR;
if (roadkind != rekord.K) diff |= DIFF_TYPE;
if (roadarrows != rekord.A) {
//sortowanie i ujednolicenie rekordów przed porównaniem
//z powodu różnej kolejności zmiennych na różnych platformach Chrome/Firefox
if (roadarrows.length == rekord.A.length) {
var a = roadarrows.split('·');
var b = rekord.A.split('·');
a.sort();
b.sort();
if ( a.toString() != b.toString() ) {
diff |= DIFF_TURNS;
}
}
else {
diff |= DIFF_TURNS;
}
}
if (roadnames != rekord.N) {
//poprawione porównywanie nazw Alt, zdarza się, że nazwy w Alt potrafią być zwrócone przez mechanizm WME w innej przypadkowej kolejności!
var names1 = roadnames.split(',');
var names2 = rekord.N.split(',');
names1.sort();
names2.sort();
if ( names1.toString() != names2.toString() ) {
diff |= DIFF_NAMES;
}
}
if (roadcity != rekord.C) diff |= DIFF_CITY;
//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
//kolejność ograniczeń na liście nie ma znaczenia są traktowane operatorem logicznym OR
//zmiana tej kolejności nie powinna być odnotowana jako zmiana edycyjna przez skrypt stąd wcześniejsze posortowanie i dopiero porównanie danych
if (roadtr != rekord.TR) {
var tab1 = roadtr.split('²');
var tab2 = rekord.TR.split('²');
tab1.sort();
tab2.sort();
var vstr1 = '';
var vstr2 = '';
for(var i=0; i<tab1.length; i++) {
var v = tab1[i].split('¹');
v.sort();
vstr1 += v.toString();
}
for(var i=0; i<tab2.length; i++) {
var v = tab2[i].split('¹');
v.sort();
vstr2 += v.toString();
}
if ( vstr1.toString() != vstr2.toString() ) {
diff |= DIFF_TR;
}
}
//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
//kolejność ograniczeń na liście nie ma znaczenia są traktowane operatorem logicznym OR
//zmiana tej kolejności nie powinna być odnotowana jako zmiana edycyjna przez skrypt stąd wcześniejsze posortowanie i dopiero porównanie danych
if (roadts != rekord.TS) {
var tab1 = roadts.split('²');
var tab2 = rekord.TS.split('²');
tab1.sort();
tab2.sort();
var vstr1 = '';
var vstr2 = '';
for(var i=0; i<tab1.length; i++) {
var v = tab1[i].split('¹');
v.sort();
vstr1 += v.toString();
}
for(var i=0; i<tab2.length; i++) {
var v = tab2[i].split('¹');
v.sort();
vstr2 += v.toString();
}
if ( vstr1.toString() != vstr2.toString() ) {
diff |= DIFF_TS;
}
}
if (roadlevel != rekord.L) diff |= DIFF_LEVEL;
//porównanie dwóch sum kontrolnych w starej i nowej wersji
if (roadgeom != rekord.G && roadgeom2 != rekord.G) {
//sprawdzenie czy wraz ze zmianą geometrii zmienił się również znacznik czasowy
//czy różnica jest wynikiem błędu zaokrąglenia starej sumy
if (roadtime != rekord.T) {
diff |= DIFF_GEOM;
}
}
if (roadtoll != rekord.TL) diff |= DIFF_TOLL;
if (diff) {
if (roadtime == rekord.T) {
var t = new Date();
roadtime = parseInt(t.getTime() / 1000);
roadeditor = '?';
}
changesDB(diff, segID, roadtime, roadeditor, roadx, roady, roadnames, roadcity, rekord, item, roadkind, roadequal);
}
//aktualizacja rekordu w bazie danych zawsze
objectStore.put( item );
scanned_segments++;
}
else {
added_segments++;
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 };
objectStore.put( item );
scanned_segments++;
}
}
request.onerror = function() {
}
}
//--------------------------------------------------------------------------------------------------------
function SCAN_SEGMENTS() {
for (var seg in Waze.model.segments.objects) {
var segment = Waze.model.segments.get(seg);
var attributes = segment.attributes;
var line = getId(segment.geometry.id);
var segID = attributes.id;
if (line !== null && segID !== null) {
if (scanned_segments_list[segID] === undefined) {
scanned_segments_list[segID] = 1;
var xyd = getMidPointLen( segment );
var roadx = parseInt( xyd.x );
var roady = parseInt( xyd.y );
var roadpoints = [];
var points = attributes.geometry.components;
var num = points.length;
roadpoints.push ( parseInt(points[0].x + 0.5) );
roadpoints.push ( parseInt(points[0].y + 0.5) );
roadpoints.push ( parseInt(points[num-1].x + 0.5) );
roadpoints.push ( parseInt(points[num-1].y + 0.5) );
//sprawdzenie czy oba końce drogi są poza skanowanym obszarem mapy
var both_ends_behind_scanarea = 0;
if (roadpoints[0] < rec_xy1.lon) both_ends_behind_scanarea |= 1;
if (roadpoints[0] > rec_xy2.lon) both_ends_behind_scanarea |= 1;
if (roadpoints[2] < rec_xy1.lon) both_ends_behind_scanarea |= 2;
if (roadpoints[2] > rec_xy2.lon) both_ends_behind_scanarea |= 2;
if (roadpoints[1] > rec_xy1.lat) both_ends_behind_scanarea |= 1;
if (roadpoints[1] < rec_xy2.lat) both_ends_behind_scanarea |= 1;
if (roadpoints[3] > rec_xy1.lat) both_ends_behind_scanarea |= 2;
if (roadpoints[3] < rec_xy2.lat) both_ends_behind_scanarea |= 2;
if (both_ends_behind_scanarea == 3) continue;
var roadtime = parseInt(attributes.updatedOn / 1000);
var roadcreated = parseInt(attributes.createdOn / 1000);
var roadequal = 0;
if (roadtime == roadcreated) roadequal = 1;
var roadeditor = parseInt(attributes.updatedBy);
var user = Waze.model.users.get(roadeditor);
if (user === null || typeof(user) === "undefined") roadeditor = '-';
else roadeditor = user.userName + '(' + user.normalizedLevel + ')';
var roadkind = parseInt(attributes.roadType);
var roaddir = (attributes.fwdDirection ? 1 : 0) * 2 + (attributes.revDirection ? 1 : 0);
var roadarrows = '';
//zwraca różną kolejność danych na różnych platformach Chrome/Firefox
//for (s in attributes.fromConnections) { roadarrows += 'A' + parseInt(s) + '·'; }
//for (s in attributes.toConnections) { roadarrows += 'B' + parseInt(s) + '·'; }
//procedura zapewniająca tę samą kolejność danych za pomocą sortowania
//istotne podczas porównywania utworzonych rekordów na różnych platformach Chrome/Firefox
var fromConn = new Array();
var toConn = new Array();
for (s in attributes.fromConnections) { fromConn.push( parseInt(s) ); }
for (s in attributes.toConnections) { toConn.push( parseInt(s) ); }
fromConn.sort();
toConn.sort();
for (var i=0; i<fromConn.length; i++) { roadarrows += 'A' + fromConn[i] + '·'; }
for (var i=0; i<toConn.length; i++) { roadarrows += 'B' + toConn[i] + '·'; }
var roadnames = '';
var roadcity = '';
var street = Waze.model.streets.get(attributes.primaryStreetID);
if (street != undefined) {
if (street.name != null) {
roadnames += street.name;
}
if (street.cityID != null) {
var city = Waze.model.cities.get(street.cityID);
roadcity = city.isEmpty ? '·' : city.name;
}
}
for(var j=0; j<attributes.streetIDs.length; j++) {
var sid = attributes.streetIDs[j];
if (sid !== null) {
var street = Waze.model.streets.get(sid);
if (street != undefined) {
if (street.name != null) {
if (roadnames != '') roadnames += ", ";
roadnames += street.name;
}
}
}
}
var roadtr = '';
var tr = attributes.fwdRestrictions;
if (tr.length) {
roadtr += 'AB¹';
for(var i=0; i<tr.length; i++) {
roadtr += (tr[i].allDay==true ? 1 : 0) + '·';
roadtr += tr[i].days + '·';
roadtr += tr[i].description + '·';
roadtr += (tr[i].enabled ? 1 : 0) + '·';
roadtr += (tr[i].fromDate == null ? '' : tr[i].fromDate) + '·';
roadtr += (tr[i].fromTime == null ? '00:00' : tr[i].fromTime) + '·';
roadtr += (tr[i].toDate == null ? '' : tr[i].toDate) + '·';
roadtr += (tr[i].toTime == null ? '23:59' : tr[i].toTime) + '·';
roadtr += tr[i].vehicleTypes + '¹';
}
roadtr += '²';
}
var tr = attributes.revRestrictions;
if (tr.length) {
roadtr += 'BA¹';
for(var i=0; i<tr.length; i++) {
roadtr += (tr[i].allDay==true ? 1 : 0) + '·';
roadtr += tr[i].days + '·';
roadtr += tr[i].description + '·';
roadtr += (tr[i].enabled ? 1 : 0) + '·';
roadtr += (tr[i].fromDate == null ? '' : tr[i].fromDate) + '·';
roadtr += (tr[i].fromTime == null ? '00:00' : tr[i].fromTime) + '·';
roadtr += (tr[i].toDate == null ? '' : tr[i].toDate) + '·';
roadtr += (tr[i].toTime == null ? '23:59' : tr[i].toTime) + '·';
roadtr += tr[i].vehicleTypes + '¹';
}
roadtr += '²';
}
var roadts = '';
for(trseg in attributes.toRestrictions) {
var tr = attributes.toRestrictions[trseg];
roadts += 'B' + trseg + '¹';
for(var i=0; i<tr.length; i++) {
roadts += (tr[i].allDay==true ? 1 : 0) + '·';
roadts += tr[i].days + '·';
roadts += tr[i].description + '·';
roadts += (tr[i].enabled ? 1 : 0) + '·';
roadts += (tr[i].fromDate == null ? '' : tr[i].fromDate) + '·';
roadts += (tr[i].fromTime == null ? '00:00' : tr[i].fromTime) + '·';
roadts += (tr[i].toDate == null ? '' : tr[i].toDate) + '·';
roadts += (tr[i].toTime == null ? '23:59' : tr[i].toTime) + '·';
roadts += tr[i].vehicleTypes + '¹';
}
roadts += '²';
}
for(trseg in attributes.fromRestrictions) {
var tr = attributes.fromRestrictions[trseg];
roadts += 'A' + trseg + '¹';
for(var i=0; i<tr.length; i++) {
roadts += (tr[i].allDay==true ? 1 : 0) + '·';
roadts += tr[i].days + '·';
roadts += tr[i].description + '·';
roadts += (tr[i].enabled ? 1 : 0) + '·';
roadts += (tr[i].fromDate == null ? '' : tr[i].fromDate) + '·';
roadts += (tr[i].fromTime == null ? '00:00' : tr[i].fromTime) + '·';
roadts += (tr[i].toDate == null ? '' : tr[i].toDate) + '·';
roadts += (tr[i].toTime == null ? '23:59' : tr[i].toTime) + '·';
roadts += tr[i].vehicleTypes + '¹';
}
roadts += '²';
}
var roadlevel = parseInt(attributes.level);
var roadgeom = crc32(attributes.geometry.toString());
var roadtoll = (attributes.fwdToll ? 1 : 0) * 2 + (attributes.revToll ? 1 : 0);
//pod Chrome i Firefox występują różne błędy zaokrągleń w rezultacie jest inna suma kontrolna geometrii!!!
//porównanie dwóch wariantów sum kontrolnych starej i zastąpienie nową z poprawionym błędem zaokrąglenia
var pstr = '';
for(var p=0; p<attributes.geometry.components.length; p++) {
var pt = attributes.geometry.components[p];
var xrounded = parseInt(pt.x * 1000 + 0.5) / 1000.0;
var yrounded = parseInt(pt.y * 1000 + 0.5) / 1000.0;
if (!p) pstr += 'POINT(' + xrounded + ' ' + yrounded + ')';
else pstr += ',POINT(' + xrounded + ' ' + yrounded + ')';
}
var roadgeom2 = crc32(pstr);
addDB(segID, roadtime, roadeditor, roaddir, roadkind, roadarrows, roadnames, roadcity, roadtr, roadts, roadlevel, roadgeom, roadgeom2, roadtoll, roadx, roady, roadequal, roadpoints);
}
}
}
updateCountTime();
}
//--------------------------------------------------------------------------------------------------------
function updateCountTime() {
var tNow = new Date();
var t = parseInt( (tNow.getTime() - rec_elapsed_time) / 1000);
var ts = '';
if (t < 60) {
ts = t + ' ' + lang.sec;
}
else {
var a = parseInt(t / 60);
var b = t - a*60;
if (b<10) ts = a + ':0' + b + ' min.'
else ts = a + ':' + b + ' min.'
}
var bs = '';
var be = '';
if (added_changes) {
bs = '<b>';
be = '</b>';
}
getId('wmeroadhistory_log').innerHTML = lang.segments + ': ' + scanned_segments + ' ' + bs + lang.changes + ': ' + added_changes + be + '<br>' + '(' + ts + ')' + scanproc;
}
//--------------------------------------------------------------------------------------------------------
function selectShowTurn(segs)
{
for(var i=0; i<4; i++) {
if (segs[i]==0) continue;
var segment = Waze.model.segments.get( segs[i] );
if (segment != undefined) {
var line = getId(segment.geometry.id);
if (line !== null) {
var color = line.getAttribute("stroke");
var opacity = line.getAttribute("stroke-opacity");
var lineWidth = line.getAttribute("stroke-width");
var kol1 = '#FE61FE';
var kol2 = '#FE01FE';
var selected = false;
//if (opacity == 1 || lineWidth == 9) selected = true; // nie działa poprawnie zaznaczanie - wchodzi w interakcję z WME Highlights
//if (color == kol1) selected = false;
//if (color == kol2) selected = false;
if (color == '#03b9da') selected = true;
if (color == '#00d8ff') selected = true;
if (!selected) {
if (i < 2) {
if (color == kol1 || color == kol2) {
line.setAttribute("stroke", "#dd7700");
line.setAttribute("stroke-opacity", 0.001 );
line.setAttribute("stroke-width", 2);
}
}
else if (i == 2) {
if (color != kol1) {
line.setAttribute("stroke", kol1);
line.setAttribute("stroke-opacity", 0.601 );
line.setAttribute("stroke-width", 9);
}
}
else if (i == 3) {
if (color != kol2) {
line.setAttribute("stroke", kol2);
line.setAttribute("stroke-opacity", 0.801 );
line.setAttribute("stroke-width", 9);
}
}
}
}
}
}
}
//--------------------------------------------------------------------------------------------------------
function wmeroadhistoryLOOP()
{
//--------- zaznaczenie skrętu na mapie
selectShowTurn(showturn);
//--------- aktualizacja statystyk ----------------------------------------
//statystyki są podliczane z opóźnieniem 2 sek., aby nie przeciążać przeglądanych edycji
if (updatestatsdelay) {
updatestatsdelay--;
if (updatestatsdelay == 0) showstatsdelayed();
}
//--------- aktualizacja liczby przeskanowanych segmentów i zmian ---------
if (scanned_segments != scanned_segments_prev || added_changes != added_changes_prev) {
scanned_segments_prev = scanned_segments;
added_changes_prev = added_changes;
updateCountTime();
}
//--------- przywrócenie pozycji sidebar, która resetuje się po zaznaczeniu segmentu --------
if (getId('wmeroadhistory_scanarea').onclick == null) {
getId('wmeroadhistory_list').innerHTML = '<p class=wmeroadhistory_amonly>' + lang.amonly + '</p>';
}
var scanarea = getId('wmeroadhistory_scanarea');
var tab = getId('wmeroadhistory_tab');
var sidebar = getId('sidebar');
var userinfoDisp = getId('user-info').style.display;
if (tab.className == 'active') {
if (userinfoDisp == 'block') {
if (userinfoDisp != userinfoDispPrev) {
sidebar.scrollTop = prevScroll;
//alert('sidebar restore');
}
prevScroll = sidebar.scrollTop;
}
userinfoDispPrev = userinfoDisp;
}
//-------- inicjalizacja warstwy na której będą pokazywane markery --------
create_markers_layer();
//-------- główna procedura skacząca po mapie -----------------------------
if (rec) {
//oczekiwanie na gotowość mapy za pomocą badania przycisku hidden lub zdarzeń vent
//nie wiadomo, która z tych metod jest lepsza i stabilniejsza w praktyce
//metoda vent zostaje, teoretycznie powinna być tą najlepszą
var ready = (ventCount==0); // metoda vent
//var ready = (wazepending.className.indexOf("hidden") >= 0); // metoda hidden
//var ready = (wazepending.className.indexOf("hidden") >= 0) && (ventCount==0); // połączenie dwóch metod
if (ready) {
var WM = window.Waze.map;
var zoom = WM.getZoom();
var W = WM.getSize().w;
var H = WM.getSize().h;
if (zoom == rec_zoom) {
//zakładka 30px niepotrzebna segmenty na obrzeżach okna ładowane są i tak z pewnym marginesem
//W -= 30;
//H -= 30;
var cent = WM.getCenter();
var scanprocenty = (cent.lat - rec_xy1.lat) / (rec_xy2.lat - rec_xy1.lat);
var scanprocentx = (cent.lon - rec_xy1.lon) / (rec_xy2.lon - rec_xy1.lon);
if (scanprocenty < 0) scanprocenty = 0;
if (scanprocenty > 1) scanprocenty = 1;
if (scanprocentx < 0) scanprocentx = 0;
if (scanprocentx > 1) scanprocentx = 1;
var proc = scanprocenty;
if (rec_direction == 1) proc += scanprocentyDelta * scanprocentx;
if (rec_direction == 3) proc += scanprocentyDelta * (1 - scanprocentx);
if (proc < 0) proc = 0;
if (proc > 1) proc = 1;
if (scanprocenty > scanprocentyPrev) {
scanprocentyDelta = scanprocenty - scanprocentyPrev;
scanprocentyPrev = scanprocenty;
}
scanproc = ' ' + precFloat(proc * 100, 1) + '%';
var wsp = new OL.LonLat(cent.lon, cent.lat).transform(epsg900913, epsg4326);
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;
console.log(log);
SCAN_SEGMENTS();
if (rec_direction == 1 && cent.lon > rec_xy2.lon) rec_direction = 2;
if (rec_direction == 3 && cent.lon < rec_xy1.lon) rec_direction = 4;
//czasami potrafi zwrócić "Uncaught TypeError: undefined is not a function" dla dużego obszaru roboczego mapy np. 3030 x 1722 px.
//rzadko to się zdarza, błąd nie jest nawet powtarzalny, wygląda to na jakiś bug wewnętrzny po stronie serwera WME
//możliwe, że występuje tylko wtedy, gdy mapa na serwerze jest w trakcie aktualizacji
//rozwiązaniem od strony użytkownika jest zmniejszenie okna mapy, restart przeglądarki i ponowne uruchomienie skanowania
//bądź wystarczy delikatne zmienić obszar skanowania o kilka pikseli
//skok mapy za pomocą WM.setCenter
//var e1 = new OL.Geometry.Point(0, 0);
//var e2 = new OL.Geometry.Point(W, H);
//var p1 = WM.getLonLatFromViewPortPx(e1);
//var p2 = WM.getLonLatFromViewPortPx(e2);
//var dx = p2.lon - p1.lon;
//var dy = p2.lat - p1.lat;
//var x = cent.lon;
//var y = cent.lat;
//if (rec_direction == 1) { x += dx; }
//else if (rec_direction == 2) { y += dy; rec_direction = 3; }
//else if (rec_direction == 3) { x -= dx; }
//else if (rec_direction == 4) { y += dy; rec_direction = 1; }
//WM.setCenter( [x, y], zoom );
//skok mapy za pomocą panoramowania widoku WM.pan
if (rec_direction == 1) WM.pan( W, 0);
else if (rec_direction == 2) { WM.pan( 0, H); rec_direction = 3; }
else if (rec_direction == 3) WM.pan(-W, 0);
else if (rec_direction == 4) { WM.pan( 0, H); rec_direction = 1; }
if (cent.lon > rec_xy2.lon && cent.lat < rec_xy2.lat) {
stopRec(true);
LastTimeScan = rec_elapsed_time;
scanproc = '';
updateCountTime();
}
}
}
}
}
//--------------------------------------------------------------------------------------------------------
function wmeroadhistorySCANAREA() {
var WM = window.Waze.map;
if (rec) {
stopRec(false);
}
else {
last_LONLAT = WM.getCenter();
last_ZOOM = WM.getZoom();
var W = WM.getSize().w;
var H = WM.getSize().h;
var e1 = new OL.Geometry.Point(0, 0);
var e2 = new OL.Geometry.Point(W, H);
rec_xy1 = WM.getLonLatFromViewPortPx(e1);
rec_xy2 = WM.getLonLatFromViewPortPx(e2);
rec_direction = 1;
getId('wmeroadhistory_log').innerHTML = ' ';
scanned_segments_list = {};
scanned_segments = 0;
scanned_segments_prev = 0;
added_segments = 0;
added_segments_prev = 0;
added_changes = 0;
added_changes_prev = 0;
scanprocentyPrev = 0;
scanprocentyDelta = 0;
scanprocPrev = 0;
var tNow = new Date();
rec_elapsed_time = tNow.getTime();
rec_zoom = last_ZOOM + 1;
if (rec_zoom < 5) rec_zoom = 5;
if (rec_zoom > 10) rec_zoom = 10;
if (typeof Waze == 'undefined') Waze = window.Waze;
if (typeof Waze.loginManager == 'undefined') Waze.loginManager = window.Waze.loginManager;
if (typeof Waze.loginManager == 'undefined') Waze.loginManager = window.loginManager;
if (Waze.loginManager !== null && Waze.loginManager.isLoggedIn()) {
thisUser = Waze.loginManager.user;
var lev = thisUser.normalizedLevel;
if (thisUser !== null && (lev*lev >= lev+lev+lev || thisUser.isAreaManager)) {
rec = true;
WM.zoomTo(rec_zoom);
WM.panTo(rec_xy1);
updateSaveButton(rec);
}
}
}
}
//--------------------------------------------------------------------------------------------------------
function htmlEntities(str) {
return String(str).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"').replace(/\'/g, ''').replace(/\r/g, ' ').replace(/\n/g, ' ');
}
//--------------------------------------------------------------------------------------------------------
function createLink(segx, segy, zoom, idsegments) {
var WM = window.Waze.map;
var docurl = document.URL;
var docurlparams = docurl.split('&');
var layers = '';
var link = '';
for(var i=0; i<docurlparams.length; i++) {
if (docurlparams[i].indexOf( 'waze.com' ) >= 0) link = docurlparams[i];
if (docurlparams[i].indexOf( 'layers' ) >= 0) layers = docurlparams[i];
}
var lonlat = new OL.LonLat(segx, segy).transform(epsg900913, epsg4326);
link += '&lon=' + parseInt(lonlat.lon * 1000000 + 0.5) / 1000000;
link += '&lat=' + parseInt(lonlat.lat * 1000000 + 0.5) / 1000000;
if (layers != '') link += '&' + layers;
link += '&zoom=' + zoom;
link += '&segments=' + idsegments;
return link;
}
//--------------------------------------------------------------------------------------------------------
function gotoSEG(x, y, segid) {
var WM = window.Waze.map;
var xy = new OL.LonLat( x, y );
WM.panTo(xy);
WM.zoomTo(6);
showturn[0] = showturn[2];
showturn[1] = showturn[3];
showturn[2] = segid;
showturn[3] = 0;
}
//--------------------------------------------------------------------------------------------------------
function gotoTURN(event) {
var WM = window.Waze.map;
var segs = event.target.id.split('_');
var seg1 = parseInt( segs[1] );
var segN = segs[2];
var seg2 = parseInt( segs[3] );
var objectStore = wazeDB.transaction('segments', 'readonly').objectStore('segments');
var request = objectStore.get( seg1 );
request.onsuccess = function() {
var rekord = request.result;
if(rekord) {
if (rekord.P.length >= 2) {
if (segN == 'A') {
var x = rekord.P[ 0 ];
var y = rekord.P[ 1 ];
}
else {
var x = rekord.P[ rekord.P.length - 2 ];
var y = rekord.P[ rekord.P.length - 1 ];
}
var xy = new OL.LonLat( x, y );
showturn[0] = showturn[2];
showturn[1] = showturn[3];
showturn[2] = seg1;
showturn[3] = seg2;
WM.panTo(xy);
WM.zoomTo(6);
}
}
}
}
//--------------------------------------------------------------------------------------------------------
function foundPELinkName( pe, seg2 ) {
var objectStore = wazeDB.transaction('segments', 'readonly').objectStore('segments');
var request = objectStore.get( seg2 );
request.onsuccess = function() {
var rekord = request.result;
if (rekord) {
if (rekord.N == '') pe.innerHTML = lang.into + lang.noname;
else pe.innerHTML = lang.into + rekord.N;
}
}
}
//--------------------------------------------------------------------------------------------------------
function formatRestriction(str, bs, be) {
var items = str.split('·');
var li = document.createElement('p');
if (items[4]=='') li.innerHTML += bs + lang.allweek + be + '<br>';
else li.innerHTML += bs + items[4] + ' <span style="font-weight:normal">..</span> ' + items[6] + be + '<br>';
if (items[0] == 0) li.innerHTML += bs + items[5] + ' - ' + items[7] + be + '<br>';
if (items[1] != 127) {
var html = bs;
if (items[1] & 0x01) { if (html!='') html+=' · '; html += lang.day1; }
if (items[1] & 0x02) { if (html!='') html+=' · '; html += lang.day2; }
if (items[1] & 0x04) { if (html!='') html+=' · '; html += lang.day3; }
if (items[1] & 0x08) { if (html!='') html+=' · '; html += lang.day4; }
if (items[1] & 0x10) { if (html!='') html+=' · '; html += lang.day5; }
if (items[1] & 0x20) { if (html!='') html+=' · '; html += lang.day6; }
if (items[1] & 0x40) { if (html!='') html+=' · '; html += lang.day7; }
html += be + '<br>';
li.innerHTML += html;
}
if (items[2]!='') li.innerHTML += '<i>"' + htmlEntities(items[2]) + '"</i><br>';
if (items[8] != '-1') {
li.innerHTML += lang.exceptvehicles + '<br>';
var html = bs;
if ((items[8] & 0x01)==0) html += '- ' + lang.veh1 + '<br>';
if ((items[8] & 0x02)==0) html += '- ' + lang.veh2 + '<br>';
if ((items[8] & 0x04)==0) html += '- ' + lang.veh3 + '<br>';
if ((items[8] & 0x08)==0) html += '- ' + lang.veh4 + '<br>';
if ((items[8] & 0x10)==0) html += '- ' + lang.veh5 + '<br>';
if ((items[8] & 0x20)==0) html += '- ' + lang.veh6 + '<br>';
if ((items[8] & 0x40)==0) html += '- ' + lang.veh7 + '<br>';
if ((items[8] & 0x80)==0) html += '- ' + lang.veh8 + '<br>';
if ((items[8] & 0x100)==0) html += '- ' + lang.veh9 + '<br>';
if ((items[8] & 0x200)==0) html += '- ' + lang.veh10 + '<br>';
if ((items[8] & 0x400)==0) html += '- ' + lang.veh11 + '<br>';
html += be;
li.innerHTML += html;
}
return li;
}
//--------------------------------------------------------------------------------------------------------
function create_markers_layer() {
var WM = window.Waze.map;
var OL = window.OpenLayers;
var mlayers = WM.getLayersBy("uniqueName","__WMERoadHistoryMarkers");
if (mlayers.length == 0) {
//----------wersja z ikonkami jest bardzo wolna, pokazanie na mapie 1000 ikonek spowalnia mocno rendering
if (ICONMODE == 1) {
var drc_mapLayer = new OL.Layer.Markers("WME Road History", {
displayInLayerSwitcher: true,
uniqueName: "__WMERoadHistoryMarkers"
});
}
//----------wersja z liniami lepsza i szybsza w renderingu
if (ICONMODE == 0) {
var drc_style = new OL.Style({
strokeDashstyle: 'solid',
strokeColor : '${lineColor}',
strokeOpacity: 0.5,
strokeWidth: '${lineWidth}',
fillColor: '#000000',
fillOpacity: 0,
pointRadius: 0,
label : '${labelText}',
fontFamily: 'Tahoma',
labelOutlineColor: '#FFFFFF',
labelOutlineWidth: '2',
fontColor: '${labelColor}',
fontOpacity: 1,
fontSize: '9px',
display: 'block'
});
var drc_mapLayer = new OL.Layer.Vector("WME Road History", {
displayInLayerSwitcher: true,
styleMap: new OL.StyleMap(drc_style),
uniqueName: "__WMERoadHistoryMarkers"
});
}
I18n.translations.en.layers.name["__WMERoadHistoryMarkers"] = "WME Road History";
WM.addLayer(drc_mapLayer);
drc_mapLayer.setVisibility(true);
}
}
//--------------------------------------------------------------------------------------------------------
function remove_markers() {
var WM = window.Waze.map;
var OL = window.OpenLayers;
markerskey = {};
markersseg = {};
markersadd = [];
var mlayers = WM.getLayersBy("uniqueName","__WMERoadHistoryMarkers");
var markerLayer = mlayers[0];
if (markerLayer) {
if (ICONMODE) {
markerLayer.clearMarkers();
}
else {
markerLayer.removeAllFeatures();
}
}
}
//--------------------------------------------------------------------------------------------------------
function add_markers_from_list() {
var showcircle = getId('_wmeRoadHistoryShowCircle').checked;
var showcircleshort = getId('_wmeRoadHistoryShowCircleShort').checked;
var showcirclelong = getId('_wmeRoadHistoryShowCircleLong').checked;
//jeżeli nie zaznaczono żadnej z opcji kolorowania to powrót
if (!showcircle && !showcircleshort && !showcirclelong) return;
// przygotowanie danych warstwy '__WMERoadHistoryMarkers'
var WM = window.Waze.map;
var OL = window.OpenLayers;
var mlayers = WM.getLayersBy("uniqueName","__WMERoadHistoryMarkers");
var markerLayer = mlayers[0];
if (markerLayer == undefined) return;
var lineFeatures = [];
while (markersadd.length) {
var mark = markersadd.shift();
var x = mark.x;
var y = mark.y;
var ed = mark.editor;
var key = mark.key;
var segid = mark.segid;
if (markerskey[key] == 1) continue;
markerskey[key] = 1;
if (ShowHistMode == 1) {
if (markersseg[segid] == undefined) {
markersseg[segid] = 0;
}
else {
markersseg[segid] = markersseg[segid] + 1;
}
x += markersseg[segid] * 4;
}
var edT = '#808080';
var edL = '#808080';
if (ed.indexOf('(1)') >= 0) { edT = '#FF0000'; edL = '#FF0000'; }
if (ed.indexOf('(2)') >= 0) { edT = '#af8000'; edL = '#FFFF00'; }
if (ed.indexOf('(3)') >= 0) { edT = '#00FF00'; edL = '#00FF00'; }
if (ed.indexOf('(4)') >= 0) { edT = '#0080FF'; edL = '#0080FF'; }
if (ed.indexOf('(5)') >= 0) { edT = '#FF00FF'; edL = '#FF00FF'; }
if (ed == 'Inactive User(1)') { edT = '#808080'; edL = '#808080'; ed = 'I'; }
if (showcirclelong) {}
else if (showcircleshort) ed = ed.substr(0, 3);
else { ed = ''; }
var width = 0;
if (showcircle) width = 30;
if (ICONMODE) {
var di = require("Waze/DivIcon");
var iconA = new di("wmeroadhistorymarker1");
var lonlatA = new OL.LonLat( x, y );
markerA = new OL.Marker(lonlatA, iconA );
markerA.display(true);
markerLayer.addMarker(markerA);
}
else {
var p1 = new OL.Geometry.Point(x, y)
var p2 = new OL.Geometry.Point(x, y)
var points = [];
points.push(p1);
points.push(p2);
var line = new OL.Geometry.LineString(points);
var lineFeature = new OL.Feature.Vector(line, { labelText: ed, labelColor: edT, lineColor: edL, lineWidth:width } );
lineFeatures.push(lineFeature);
}
}
if (!ICONMODE) {
markerLayer.addFeatures(lineFeatures);
}
}
//--------------------------------------------------------------------------------------------------------
function showEdits(histmode, fromPage) {
var objlist = getId('wmeroadhistory_list');
if (objlist == null) return;
var range, transaction, store, index, lower, upper;
var lower = 0;
var upper = 9999999999;
if (getId('_wmeRoadHistoryDateRange').checked) {
var fyear = parseInt(getId('_wmeRoadHistoryFromYear').value);
var fmonth = parseInt(getId('_wmeRoadHistoryFromMonth').value) - 1;
var fday = parseInt(getId('_wmeRoadHistoryFromDay').value);
var tyear = parseInt(getId('_wmeRoadHistoryToYear').value);
var tmonth = parseInt(getId('_wmeRoadHistoryToMonth').value) - 1;
var tday = parseInt(getId('_wmeRoadHistoryToDay').value);
var lowerdate = new Date(fyear, fmonth, fday, 0, 0, 0, 0);
var upperdate = new Date(tyear, tmonth, tday, 23, 59, 59, 999);
var lower = parseInt(lowerdate.getTime() / 1000);
var upper = parseInt(upperdate.getTime() / 1000);
if (lower <= upper) {
getId('wmeroadhistory_rangeinfo').innerHTML = lang.datesdefined + ' ' + lowerdate.toLocaleDateString() + ' - ' + upperdate.toLocaleDateString();
}
else {
getId('wmeroadhistory_rangeinfo').innerHTML = '<span style="color: #CC0000; ">' + lang.datesincorrect + '</span>';
return;
}
}
else {
getId('wmeroadhistory_rangeinfo').innerHTML = '';
}
var showseconds = getId('_wmeRoadHistoryFullTime').checked;
updatestatsdelay = 0;
while (markersadd.length) markersadd.pop();
if (histmode == 1) {
range = IDBKeyRange.bound( lower, upper );
transaction = wazeDB.transaction(["changes"], "readonly");
store = transaction.objectStore("changes");
index = store.index("T");
}
else {
range = IDBKeyRange.bound( lower, upper );
transaction = wazeDB.transaction(["segments"], "readonly");
store = transaction.objectStore("segments");
index = store.index("T");
}
var count = 0;
var page = 0;
var end = 0;
var rows = getId('_wmeRoadHistoryRows').value;
if (rows < 5) rows = 5;
if (rows > 1000) rows = 1000;
var t = new Date();
var curtime = parseInt( t.getTime() / 1000);
index.openCursor(range, "prev").onsuccess = function(event) {
var cursor = event.target.result;
if (cursor) {
if (page < fromPage) {
page++;
cursor.advance( rows );
}
else if (count < rows) {
var segid = cursor.value.ID;
var segtime = cursor.value.T;
var segeditor = cursor.value.E;
var segnames = cursor.value.N;
var segcity = cursor.value.C;
var segx = cursor.value.x;
var segy = cursor.value.y;
var segkind = cursor.value.K;
var segequal = cursor.value.Q;
var h1 = document.createElement('h1');
var h2 = document.createElement('h2');
var ul = document.createElement('ul');
var h4 = document.createElement('h4');
var h5 = document.createElement('h5');
var h6 = document.createElement('h6');
var hr = document.createElement('hr');
if (stats[segeditor] == null) {
var list = {};
list[ segid + '.' + segtime ] = 1;
stats[segeditor] = list;
}
else {
stats[segeditor][segid + '.' + segtime] = 1;
}
//----- dodanie wsp. markera do tablicy ----------
var mark = { x:segx, y:segy, editor:segeditor, key:cursor.primaryKey, segid:segid };
markersadd.push( mark );
if (histmode == 1) {
if (cursor.value.drA != null && cursor.value.drB != null) {
var li = document.createElement('li');
if (cursor.value.drA == 0) li.innerHTML = lang.dirchangeadd;
if (cursor.value.drA == 1) {
if (cursor.value.drB == 0) li.innerHTML = lang.dirchange0;
if (cursor.value.drB == 2) li.innerHTML = lang.dirchangerev;
if (cursor.value.drB == 3) li.innerHTML = lang.dirchange2;
}
if (cursor.value.drA == 2) {
if (cursor.value.drB == 0) li.innerHTML = lang.dirchange0;
if (cursor.value.drB == 1) li.innerHTML = lang.dirchangerev;
if (cursor.value.drB == 3) li.innerHTML = lang.dirchange2;
}
if (cursor.value.drA == 3) {
if (cursor.value.drB == 0) li.innerHTML = lang.dirchange0;
if (cursor.value.drB == 1) li.innerHTML = lang.dirchange1;
if (cursor.value.drB == 2) li.innerHTML = lang.dirchange1;
}
ul.appendChild(li);
}
var tyA = cursor.value.tyA;
var tyB = cursor.value.tyB;
if (tyA != null && tyB != null) {
var li = document.createElement('li');
var html = '';
switch (tyA) {
case 1: html += lang.road1; break;
case 2: html += lang.road2; break;
case 3: html += lang.road3; break;
case 4: html += lang.road4; break;
case 5: html += lang.road5; break;
case 6: html += lang.road6; break;
case 7: html += lang.road7; break;
case 8: html += lang.road8; break;
case 10: html += lang.road10; break;
case 17: html += lang.road17; break;
case 18: html += lang.road18; break;
case 19: html += lang.road19; break;
case 20: html += lang.road20; break;
default: html += lang.roadtype + tyA + ')'; break;
}
html += ' » <b class=wmeroadhistory_kind >';
switch (tyB) {
case 1: html += lang.road1; break;
case 2: html += lang.road2; break;
case 3: html += lang.road3; break;
case 4: html += lang.road4; break;
case 5: html += lang.road5; break;
case 6: html += lang.road6; break;
case 7: html += lang.road7; break;
case 8: html += lang.road8; break;
case 10: html += lang.road10; break;
case 17: html += lang.road17; break;
case 18: html += lang.road18; break;
case 19: html += lang.road19; break;
case 20: html += lang.road20; break;
default: html += lang.roadtype + tyB + ')'; break;
}
html += '</b>';
li.innerHTML = html;
ul.appendChild(li);
}
var arA = cursor.value.arA;
var arB = cursor.value.arB;
if (arA != null && arB != null) {
var turnsA = arA.split('·');
var turnsB = arB.split('·');
for(var i=0; i<turnsA.length - 1; i++) {
var p = arB.indexOf( turnsA[i] + '·' );
if (p < 0) {
var seg1 = segid;
var segN = turnsA[i].substr(0,1);
var seg2 = turnsA[i].substr(1,12);
var li = document.createElement('li');
if (seg1 == seg2) li.innerHTML += '<b class=wmeroadhistory_uturn >' + lang.removed_uturn + '</b>';
else li.innerHTML += '<b class=wmeroadhistory_error >' + lang.removedturn + '</b>';
var pe = document.createElement('p');
pe.innerHTML = 'link';
pe.className = 'wmeroadhistory_turnlink';
pe.id = 'turnlink_' + seg1 + '_' + segN + '_' + seg2;
foundPELinkName( pe, parseInt(seg2) );
pe.onclick = (function(event) {
gotoTURN(event);
});
li.appendChild(pe);
ul.appendChild(li);
}
}
for(var i=0; i<turnsB.length - 1; i++) {
var p = arA.indexOf( turnsB[i] + '·' );
if (p < 0) {
var seg1 = segid;
var segN = turnsB[i].substr(0,1);
var seg2 = turnsB[i].substr(1,12);
var li = document.createElement('li');
if (seg1 == seg2) li.innerHTML += '<b class=wmeroadhistory_uturn >' + lang.added_uturn + '</b>';
else li.innerHTML += '<b class=wmeroadhistory_error >' + lang.addedturn + '</b>';
var pe = document.createElement('p');
pe.innerHTML = 'link';
pe.className = 'wmeroadhistory_turnlink';
pe.id = 'turnlink_' + seg1 + '_' + segN + '_' + seg2;
foundPELinkName( pe, parseInt(seg2) );
pe.onclick = (function(event) {
gotoTURN(event);
});
li.appendChild(pe);
ul.appendChild(li);
}
}
}
if (cursor.value.naA != null && cursor.value.naB != null) {
var li = document.createElement('li');
li.innerHTML = lang.changename + cursor.value.naA + ' » ' + cursor.value.naB;
ul.appendChild(li);
}
if (cursor.value.ciA != null && cursor.value.ciB != null) {
var li = document.createElement('li');
li.innerHTML = lang.changecity + cursor.value.ciA + ' » ' + cursor.value.ciB;
ul.appendChild(li);
}
if (cursor.value.geA != null && cursor.value.geB != null) {
var li = document.createElement('li');
li.innerHTML = lang.changedgeom;
ul.appendChild(li);
}
if (cursor.value.lvA != null && cursor.value.lvB != null) {
var li = document.createElement('li');
li.innerHTML = lang.level + cursor.value.lvA + ' » ' + cursor.value.lvB;
ul.appendChild(li);
}
if (cursor.value.tolA != null && cursor.value.tolB != null) {
var li = document.createElement('li');
if (cursor.value.tolA == 0) li.innerHTML += lang.tollfree;
if (cursor.value.tolA == 1) li.innerHTML += lang.tollpart;
if (cursor.value.tolA == 2) li.innerHTML += lang.tollpart;
if (cursor.value.tolA == 3) li.innerHTML += lang.toll;
if (cursor.value.tolB == 0) li.innerHTML += ' » <b class=wmeroadhistory_toll>' + lang.tollfree + '</b>';
if (cursor.value.tolB == 1) li.innerHTML += ' » <b class=wmeroadhistory_toll>' + lang.tollpart + '</b>';
if (cursor.value.tolB == 2) li.innerHTML += ' » <b class=wmeroadhistory_toll>' + lang.tollpart + '</b>';
if (cursor.value.tolB == 3) li.innerHTML += ' » <b class=wmeroadhistory_toll>' + lang.toll + '</b>';
ul.appendChild(li);
}
var trBefore = cursor.value.trA;
var trAfter = cursor.value.trB;
if (trBefore != null && trAfter != null) {
var before = trBefore.split('²');
var after = trAfter.split('²');
var abBefore = '';
var abAfter = '';
var baBefore = '';
var baAfter = '';
for(var i=0; i<before.length - 1; i++) {
if (before[i].indexOf('AB¹') == 0) abBefore = before[i];
if (before[i].indexOf('BA¹') == 0) baBefore = before[i];
}
for(var i=0; i<after.length - 1; i++) {
if (after[i].indexOf('AB¹') == 0) abAfter = after[i];
if (after[i].indexOf('BA¹') == 0) baAfter = after[i];
}
if (abBefore != abAfter) {
var li = document.createElement('li');
li.innerHTML = '<b class=wmeroadhistory_trafter>' + lang.trAB + '</b>';
ul.appendChild(li);
if (abAfter == '') {
var li = document.createElement('p');
li.innerHTML = '<b class=wmeroadhistory_trafter>' + lang.none + '</b>';
ul.appendChild(li);
}
else {
var lines = abAfter.split('¹');
for(var i=1; i<lines.length-1; i++) {
var li = formatRestriction( lines[i], '<b class=wmeroadhistory_trafter>', '</b>');
ul.appendChild(li);
}
}
var lines = abBefore.split('¹');
for(var i=1; i<lines.length-1; i++) {
var li = formatRestriction( lines[i], '', '');
li.className = 'wmeroadhistory_trbefore';
ul.appendChild(li);
}
}
if (baBefore != baAfter) {
var li = document.createElement('li');
li.innerHTML = '<b class=wmeroadhistory_trafter>' + lang.trBA + '</b>';
ul.appendChild(li);
if (baAfter == '') {
var li = document.createElement('p');
li.innerHTML = '<b class=wmeroadhistory_trafter>' + lang.none + '</b>';
ul.appendChild(li);
}
else {
var lines = baAfter.split('¹');
for(var i=1; i<lines.length-1; i++) {
var li = formatRestriction( lines[i], '<b class=wmeroadhistory_trafter>', '</b>');
ul.appendChild(li);
}
}
var lines = baBefore.split('¹');
for(var i=1; i<lines.length-1; i++) {
var li = formatRestriction( lines[i], '', '');
li.className = 'wmeroadhistory_trbefore';
ul.appendChild(li);
}
}
}
var trBefore = cursor.value.tsA;
var trAfter = cursor.value.tsB;
if (trBefore != null && trAfter != null) {
var before = trBefore.split('²');
var after = trAfter.split('²');
for(var i=0; i<before.length - 1; i++) {
var bi = before[i].split('¹');
var aifound = [];
for(var j=0; j<after.length - 1; j++) {
var ai = after[j].split('¹');
if (ai[0] == bi[0]) {
aifound = ai;
}
}
if (aifound.length > 2) {
var li = document.createElement('li');
li.innerHTML = '<b class=wmeroadhistory_trturn>' + lang.changedtr + '</b>';
var seg1 = segid;
var segN = bi[0].substr(0,1);
var seg2 = bi[0].substr(1,12);
var pe = document.createElement('p');
pe.innerHTML = 'link';
pe.className = 'wmeroadhistory_turnlink';
pe.id = 'turnlink_' + seg1 + '_' + segN + '_' + seg2;
foundPELinkName( pe, parseInt(seg2) );
pe.onclick = (function(event) {
gotoTURN(event);
});
li.appendChild(pe);
ul.appendChild(li);
if (aifound.length <= 2) {
var li = document.createElement('p');
li.innerHTML = '<b class=wmeroadhistory_trturn>' + lang.none + '</b>';
ul.appendChild(li);
}
else {
for(var k=1; k<aifound.length-1; k++) {
var li = formatRestriction( aifound[k], '<b class=wmeroadhistory_trturn>', '</b>');
ul.appendChild(li);
}
}
for(var k=1; k<bi.length-1; k++) {
var li = formatRestriction( bi[k], '', '');
ul.appendChild(li);
}
}
else {
var li = document.createElement('li');
li.innerHTML = '<b class=wmeroadhistory_trturn>' + lang.removedtr + '</b>';
var seg1 = segid;
var segN = bi[0].substr(0,1);
var seg2 = bi[0].substr(1,12);
var pe = document.createElement('p');
pe.innerHTML = 'link';
pe.className = 'wmeroadhistory_turnlink';
pe.id = 'turnlink_' + seg1 + '_' + segN + '_' + seg2;
foundPELinkName( pe, parseInt(seg2) );
pe.onclick = (function(event) {
gotoTURN(event);
});
li.appendChild(pe);
ul.appendChild(li);
//var li = document.createElement('p');
//li.innerHTML = '<b class=wmeroadhistory_trturn>' + lang.none + '</b>';
//ul.appendChild(li);
for(var k=1; k<bi.length-1; k++) {
var li = formatRestriction( bi[k], '', '');
ul.appendChild(li);
}
}
}
for(var i=0; i<after.length - 1; i++) {
var ai = after[i].split('¹');
var p = trBefore.indexOf( ai[0] + '¹' );
if (p < 0) {
var li = document.createElement('li');
li.innerHTML = '<b class=wmeroadhistory_trturn>' + lang.addedtr + '</b>';
var seg1 = segid;
var segN = ai[0].substr(0,1);
var seg2 = ai[0].substr(1,12);
var pe = document.createElement('p');
pe.innerHTML = 'link';
pe.className = 'wmeroadhistory_turnlink';
pe.id = 'turnlink_' + seg1 + '_' + segN + '_' + seg2;
foundPELinkName( pe, parseInt(seg2) );
pe.onclick = (function(event) {
gotoTURN(event);
});
li.appendChild(pe);
ul.appendChild(li);
for(var k=1; k<ai.length-1; k++) {
var li = formatRestriction( ai[k], '<b class=wmeroadhistory_trturn>', '</b>');
ul.appendChild(li);
}
}
}
}
}
var t = new Date;
t.setTime( segtime * 1000 );
var topt = { year: "numeric", month: "numeric", day: "numeric", hour: "2-digit", minute: "2-digit" };
var czas;
if (showseconds) czas = t.toLocaleString(lang.code);
else czas = t.toLocaleDateString(lang.code, topt);
if (segnames == '') h1.innerHTML = '<b>' + lang.noname + '</b>';
else h1.innerHTML = '<b>' + htmlEntities(segnames) + '</b>';
h1.onclick = (function() {
gotoSEG(segx, segy, segid);
});
if (segkind == 1) h1.style.color = '#488193'; // street
else if (segkind == 2) h1.style.color = '#488193'; // primary street
else if (segkind == 3) h1.style.color = '#488193'; // freeways
else if (segkind == 4) h1.style.color = '#488193'; // ramps
else if (segkind == 6) h1.style.color = '#488193'; // major highway
else if (segkind == 7) h1.style.color = '#488193'; // minor highway
else if (segkind == 8) h1.style.color = '#404040'; // dirt roads
else if (segkind == 18) h1.style.color = '#c0c0c0'; // pkp
else if (segkind == 21) h1.style.color = '#808080'; // service road
else if (segkind == 120) h1.style.color = '#808080'; // service road
else h1.style.color = '#808080';
if (segequal && curtime - segtime < 7*24*3600) {
h4.innerHTML = '<b class=wmeroadhistory_newseg>' + lang.newsegment + '</b>';
}
h2.innerHTML = htmlEntities(segcity);
h5.innerHTML = czas;
h6.innerHTML = htmlEntities(segeditor);
if (segeditor.indexOf('(1)') >= 0) h6.className = 'wmeroadhistory_rank1';
if (segeditor.indexOf('(2)') >= 0) h6.className = 'wmeroadhistory_rank2';
if (segeditor.indexOf('(3)') >= 0) h6.className = 'wmeroadhistory_rank3';
if (segeditor.indexOf('(4)') >= 0) h6.className = 'wmeroadhistory_rank4';
if (segeditor.indexOf('(5)') >= 0) h6.className = 'wmeroadhistory_rank5';
if (segeditor.indexOf('Inactive User') >= 0) h6.className = 'wmeroadhistory_rank0';
if (count < objlist.childNodes.length) {
var div = objlist.childNodes[count];
div.innerHTML = '';
div.appendChild(h1);
div.appendChild(h4);
div.appendChild(h2);
div.appendChild(ul);
div.appendChild(h5);
div.appendChild(h6);
div.appendChild(hr);
}
else {
var newdiv = document.createElement('div');
newdiv.appendChild(h1);
newdiv.appendChild(h4);
newdiv.appendChild(h2);
newdiv.appendChild(ul);
newdiv.appendChild(h5);
newdiv.appendChild(h6);
newdiv.appendChild(hr);
objlist.appendChild(newdiv);
}
count++;
cursor.continue();
}
else {
add_markers_from_list();
updatestatsdelay = parseInt(2000 / LOOPTIMER);
}
}
else {
add_markers_from_list();
updatestatsdelay = parseInt(2000 / LOOPTIMER);
//korekta pozycji na ostatniej stronie, gdy list jest mniejsza niż zdefiniowana ilość wierszy
if (count && count < rows) {
for(var i=count; i<rows; i++) {
var div = objlist.childNodes[i];
div.innerHTML = '';
}
}
if (count==0) {
if (pageEdits > page-1) pageEdits = page-1;
if (pageEdits < 0) pageEdits = 0;
}
}
}
}
//--------------------------------------------------------------------------------------------------------
function wmeroadhistoryTAB1() {
ShowHistMode = 1;
updateTabs();
//reset zaznaczonych segmentów
showturn[0] = showturn[2];
showturn[1] = showturn[3];
showturn[2] = 0;
showturn[3] = 0;
//usunięcie,czyszczenie markerów z mapy
remove_markers();
//reset statystyk po kliknięciu w zakładkę, aby można było podliczać od nowa poruszając się po stronach
reset_statistics();
getId('wmeroadhistory_list').innerHTML = '';
getId('wmeroadhistory_list').style.display = 'block';
getId('wmeroadhistory_options').style.display = 'none';
getId('wmeroadhistory_stats').style.display = 'block';
pageEdits = 0;
showEdits(ShowHistMode, pageEdits);
getId('wmeroadhistory_list_buttons_1').style.visibility = '';
getId('wmeroadhistory_list_buttons_2').style.visibility = '';
}
//--------------------------------------------------------------------------------------------------------
function wmeroadhistoryTAB2() {
ShowHistMode = 2;
updateTabs();
//reset zaznaczonych segmentów
showturn[0] = showturn[2];
showturn[1] = showturn[3];
showturn[2] = 0;
showturn[3] = 0;
//usunięcie,czyszczenie markerów z mapy
remove_markers();
//reset statystyk po kliknięciu w zakładkę, aby można było podliczać od nowa poruszając się po stronach
reset_statistics();
getId('wmeroadhistory_list').innerHTML = '';
getId('wmeroadhistory_list').style.display = 'block';
getId('wmeroadhistory_options').style.display = 'none';
getId('wmeroadhistory_stats').style.display = 'block';
pageEdits = 0;
showEdits(ShowHistMode, pageEdits);
getId('wmeroadhistory_list_buttons_1').style.visibility = '';
getId('wmeroadhistory_list_buttons_2').style.visibility = '';
}
//--------------------------------------------------------------------------------------------------------
function wmeroadhistoryTAB3() {
ShowHistMode = 3;
updateTabs();
//reset zaznaczonych segmentów
showturn[0] = showturn[2];
showturn[1] = showturn[3];
showturn[2] = 0;
showturn[3] = 0;
getId('wmeroadhistory_list').innerHTML = '';
getId('wmeroadhistory_list').style.display = 'none';
getId('wmeroadhistory_options').style.display = 'block';
getId('wmeroadhistory_list_buttons_1').style.visibility = 'hidden';
getId('wmeroadhistory_list_buttons_2').style.visibility = 'hidden';
getId('wmeroadhistory_stats').style.display = 'none';
if (window.File && window.FileReader && window.FileList && window.Blob) {
}
else {
alert('The File APIs are not fully supported by your browser.');
getId('wmeroadhistory_import').className = 'wmerh_button_disabled';
getId('wmeroadhistory_export').className = 'wmerh_button_disabled';
}
getId('wmerh_dbinfo').innerHTML = lang.dbversion + wazeDB.version;
}
//--------------------------------------------------------------------------------------------------------
function wmeroadhistoryPREV() {
if (pageEdits) {
pageEdits--;
if (pageEdits < 0) pageEdits = 0;
showEdits(ShowHistMode, pageEdits);
}
}
//--------------------------------------------------------------------------------------------------------
function wmeroadhistoryNEXT() {
pageEdits++;
showEdits(ShowHistMode, pageEdits);
}
//--------------------------------------------------------------------------------------------------------
function wmeroadhistoryPREVDOWN() {
if (pageEdits) {
pageEdits--;
if (pageEdits < 0) pageEdits = 0;
getId('sidebar').scrollTop = 0;
showEdits(ShowHistMode, pageEdits);
}
}
//--------------------------------------------------------------------------------------------------------
function wmeroadhistoryNEXTDOWN() {
pageEdits++;
getId('sidebar').scrollTop = 0;
showEdits(ShowHistMode, pageEdits);
}
//--------------------------------------------------------------------------------------------------------
function updateTabs() {
if (ShowHistMode == 1) {
getId('wmeroadhistory_tab1').className = 'wmeroadhistory_tab_active';
getId('wmeroadhistory_tab2').className = '';
getId('wmeroadhistory_tab3').className = '';
}
if (ShowHistMode == 2) {
getId('wmeroadhistory_tab1').className = '';
getId('wmeroadhistory_tab2').className = 'wmeroadhistory_tab_active';
getId('wmeroadhistory_tab3').className = '';
}
if (ShowHistMode == 3) {
getId('wmeroadhistory_tab1').className = '';
getId('wmeroadhistory_tab2').className = '';
getId('wmeroadhistory_tab3').className = 'wmeroadhistory_tab_active';
}
}
//--------------------------------------------------------------------------------------------------------
function importexportenable(flag) {
if (flag) {
getId('wmeroadhistory_import').className = 'wmerh_button_enabled';
getId('wmeroadhistory_export').className = 'wmerh_button_enabled';
getId('wmeroadhistory_import').disabled = false;
getId('wmeroadhistory_export').disabled = false;
getId('wmeroadhistory_mergecheckbox').disabled = false;
}
else {
getId('wmeroadhistory_import').className = 'wmerh_button_disabled';
getId('wmeroadhistory_export').className = 'wmerh_button_disabled';
getId('wmeroadhistory_import').disabled = true;
getId('wmeroadhistory_export').disabled = true;
getId('wmeroadhistory_mergecheckbox').disabled = true;
}
}
//--------------------------------------------------------------------------------------------------------
function wmeroadhistoryIMPORT() {
getId('wmeroadhistory_wrapper').innerHTML = '<input id=wmeroadhistory_fileselector type="file" name="files[]" />';
getId('wmeroadhistory_wrapper').addEventListener('change', wmeroadhistoryFILESELECTOR, false);
getId('wmeroadhistory_fileselector').click();
reset_statistics();
}
//--------------------------------------------------------------------------------------------------------
function wmeroadhistoryIMPORTLOOP() {
var saveitems = new Array();
var savestores = new Array();
var compitems = new Array();
var compstores = new Array();
var v = 0;
while (importcount < importmaxcount && v<100) {
var str = importlines[ importcount++ ];
var percent = Math.round((importcount / importmaxcount) * 100);
if (percent != importpercent) {
importpercent = percent;
getId('wmerh_progress_percent').style.minWidth = percent + '%';
getId('wmerh_progress_percent').innerHTML = percent + '%';
}
var data = str.split('¤');
if (data[0] == '[CONFIG]') { chunkdata = 3; continue; }
if (data[0] == '[SEGMENTSDATA]') { chunkdata = 1; importchunk++; continue; }
if (data[0] == '[CHANGESDATA]') { chunkdata = 2; importchunk++; continue; }
if (chunkdata == 3) {
if (data[0] == 'browser=other') importbrowser = 0;
if (data[0] == 'browser=chrome') importbrowser = 1;
if (data[0] == 'browser=firefox') importbrowser = 2;
}
if (chunkdata == 1) {
var ID = parseInt(data[0]);
var T = parseInt(data[1]);
var E = data[2];
var D = parseInt(data[3]);
var K = parseInt(data[4]);
var x = parseInt(data[5]);
var y = parseInt(data[6]);
var N = data[7];
var C = data[8];
var Q = parseInt(data[9]);
var A = data[10];
var TR = data[11];
var TS = data[12];
var L = parseInt(data[13]);
var G = parseInt(data[14]);
var TL = parseInt(data[15]);
var P = new Array();
var pstr = data[16].split(',');
for(var i=0; i<pstr.length; i++) {
P.push ( parseInt(pstr[i]) );
}
var 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 };
if (getId('wmeroadhistory_mergecheckbox').checked == true) {
compitems.push( item );
compstores.push( 'segments' );
}
else {
saveitems.push( item );
savestores.push( 'segments' );
}
}
if (chunkdata == 2) {
var ID = parseInt(data[0]);
var T = parseInt(data[1]);
var E = data[2];
var D = parseInt(data[3]);
var K = parseInt(data[4]);
var x = parseInt(data[5]);
var y = parseInt(data[6]);
var N = data[7];
var C = data[8];
var Q = parseInt(data[9]);
var item = { ID:ID, T:T, E:E, D:D, K:K, x:x, y:y, N:N, C:C, Q:Q };
if (data[10] != '' || data[11] != '') {
item.drA = parseInt( data[10] );
item.drB = parseInt( data[11] );
}
if (data[12] != '' || data[13] != '') {
item.tyA = parseInt( data[12] );
item.tyB = parseInt( data[13] );
}
if (data[14] != '' || data[15] != '') {
item.arA = data[14];
item.arB = data[15];
}
if (data[16] != '' || data[17] != '') {
item.naA = data[16];
item.naB = data[17];
}
if (data[18] != '' || data[19] != '') {
item.ciA = data[18];
item.ciB = data[19];
}
if (data[20] != '' || data[21] != '') {
item.trA = data[20];
item.trB = data[21];
}
if (data[22] != '' || data[23] != '') {
item.tsA = data[22];
item.tsB = data[23];
}
if (data[24] != '' || data[25] != '') {
item.lvA = parseInt( data[24] );
item.lvB = parseInt( data[25] );
}
if (data[26] != '' || data[27] != '') {
item.geA = parseInt( data[26] );
item.geB = parseInt( data[27] );
}
if (data[28] != '' || data[29] != '') {
item.tolA = parseInt( data[28] );
item.tolB = parseInt( data[29] );
}
if (getId('wmeroadhistory_mergecheckbox').checked == true) {
// wprowadzenie synchronicznej pojedynczej aktualizacji rekordu zmiany, tryb asynchroniczny jest zbyt skomplikowany i zagmatwany tutaj
// jednorazowe pobranie rekordu i aktualizacja synchroniczna
merge_imported_change_DB_Sync( item );
break;
}
else {
saveitems.push( item );
savestores.push( 'changes' );
}
}
v++;
}
if (compitems.length) {
var trx = wazeDB.transaction( compstores , 'readwrite');
var reqarray = new Array();
trx.oncomplete = function(event) {
var updatestores = new Array();
var updateitems = new Array();
for(var i=0; i<compitems.length; i++) {
var rekord = reqarray[i].result;
var item = compitems[i];
if (rekord) {
if (item.T >= rekord.T) {
updatestores.push( compstores[i] );
updateitems.push( item );
}
}
else {
updatestores.push( compstores[i] );
updateitems.push( item );
}
}
if (updatestores.length) {
var trxupdate = wazeDB.transaction( updatestores , 'readwrite');
trxupdate.oncomplete = function(event) {
getId('wmerh_progress_info').innerHTML = lang.importeddata + (importcount - importchunk) + ' / ' + (importmaxcount - 2);
setTimeout(wmeroadhistoryIMPORTLOOP, 1);
};
trxupdate.onerror = function(error) {
};
for(var i=0; i<updateitems.length; i++) {
var updstore = trxupdate.objectStore( updatestores[i] );
updstore.put( updateitems[i] );
}
}
else {
getId('wmerh_progress_info').innerHTML = lang.importeddata + (importcount - importchunk) + ' / ' + (importmaxcount - 2);
setTimeout(wmeroadhistoryIMPORTLOOP, 1);
}
};
trx.onerror = function(error) {
};
for(var i=0; i<compitems.length; i++) {
var store = trx.objectStore( compstores[i] );
var req = store.get( compitems[i].ID );
reqarray.push(req);
}
}
if (saveitems.length) {
var trx = wazeDB.transaction( savestores , 'readwrite');
trx.oncomplete = function(event) {
getId('wmerh_progress_info').innerHTML = lang.importeddata + (importcount - importchunk) + ' / ' + (importmaxcount - 2);
setTimeout(wmeroadhistoryIMPORTLOOP, 1);
};
trx.onerror = function(error) {
};
for(var i=0; i<saveitems.length; i++) {
var store = trx.objectStore( savestores[i] );
store.put( saveitems[i] );
}
}
if (importcount == importmaxcount) {
while (importlines.length) { importlines.pop(); }
setTimeout(progressFadeOut, 5000);
importexportenable(1);
}
}
//--------------------------------------------------------------------------------------------------------
function wmeroadhistorydatabaseInit() {
var openrequest = window.indexedDB.open( wazeDataBaseName, 2 );
openrequest.onsuccess = function(event) {
wazeDB = event.target.result;
console.log("WMERoadHistory.DataBase.Create.OK = ", openrequest.result.name );
setTimeout(wmeroadhistoryIMPORTLOOP, 100);
};
openrequest.onerror = function(event) {
importexportenable(1);
};
openrequest.onupgradeneeded = function(event) {
var db = event.target.result;
var objectStore1 = db.createObjectStore("segments", { keyPath: "ID", autoIncrement: false });
objectStore1.createIndex("T", "T", { unique: false });
var objectStore2 = db.createObjectStore("changes", { keyPath: "nr", autoIncrement: true });
objectStore2.createIndex("T", "T", { unique: false });
objectStore2.createIndex("ID", "ID", { unique: false });
}
}
//--------------------------------------------------------------------------------------------------------
function wmeroadhistoryFILESELECTOR(evt) {
getId('wmerh_progress').className = 'loading';
getId('wmerh_progress_percent').style.minWidth = '0%';
getId('wmerh_progress_percent').innerHTML = '0%';
getId('wmerh_progress_info').innerHTML = lang.importeddata + '0 / 0';
var files = evt.target.files;
if (files.length) {
var f = files[0];
if (f.type.match('text/plain')) {
var reader = new FileReader();
reader.onloadstart = function(e) {
};
reader.onload = function(e) {
importlines = e.target.result.split('¶\r\n');
importlines.pop();
if (importlines.length == 0) {
importlines = e.target.result.split('¶\n');
importlines.pop();
}
importchunk = 0;
importcount = 0;
importmaxcount = importlines.length;
importPercent = -1;
importbrowser = 0;
chunkdata = 0;
if (importmaxcount) {
importexportenable(0);
if ( getId('wmeroadhistory_mergecheckbox').checked == false ) {
if (wazeDB) {
getId('wmerh_progress_info').innerHTML = lang.preparingdatabase;
wazeDB.close();
var req = window.indexedDB.deleteDatabase( wazeDataBaseName );
req.onsuccess = function () {
wmeroadhistorydatabaseInit();
};
req.onerror = function () {
importexportenable(1);
getId('wmerh_progress_info').innerHTML = lang.dberrordelete;
};
req.onblocked = function () {
importexportenable(1);
getId('wmerh_progress_info').innerHTML = lang.dberrorlocked;
};
}
}
else {
setTimeout(wmeroadhistoryIMPORTLOOP, 100);
}
}
else {
getId('wmerh_progress_percent').style.minWidth = '100%';
getId('wmerh_progress_percent').innerHTML = '100%';
setTimeout(progressFadeOut, 5000);
importexportenable(1);
}
};
reader.readAsText(f, 'utf-8');
}
}
}
//--------------------------------------------------------------------------------------------------------
function databaseExport(maxcount) {
var count = 0;
var exportpercent = -1;
var txt = '';
//var firefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;
//var chrome = navigator.userAgent.toLowerCase().indexOf('chrome') > -1;
//txt += '[BROWSER]¶\r\n';
//if (chrome) txt += 'chrome¶\r\n';
//else if (firefox) txt += 'firefox¶\r\n';
//else txt += 'other¶\r\n';
txt += '[SEGMENTSDATA]¶\r\n';
//zmiana przeszukiwania bazy wg. primary key jest szybsze
var store = wazeDB.transaction( ["segments"] ,'readonly').objectStore("segments");
var index = store.openCursor();
index.onerror = function(event) {
importexportenable(1);
};
index.onsuccess = function(event) {
var cursor = event.target.result;
if (cursor) {
count++;
var item = cursor.value;
var row = '';
row += item.ID + '¤';
row += item.T + '¤';
row += item.E + '¤';
row += item.D + '¤';
row += item.K + '¤';
row += item.x + '¤';
row += item.y + '¤';
row += item.N + '¤';
row += item.C + '¤';
row += item.Q + '¤';
row += item.A + '¤';
row += item.TR + '¤';
row += item.TS + '¤';
row += item.L + '¤';
row += item.G + '¤';
row += item.TL + '¤';
row += item.P + '¤';
txt += row + '¶\r\n';
var percent = Math.round((count / maxcount) * 100);
if (percent != exportpercent) {
exportpercent = percent;
getId('wmerh_progress_percent').style.minWidth = percent + '%';
getId('wmerh_progress_percent').innerHTML = percent + '%';
getId('wmerh_progress_info').innerHTML = lang.exporteddata + count + ' / ' + maxcount;
}
cursor.continue();
}
else {
txt += '[CHANGESDATA]¶\r\n';
//zmiana przeszukiwania bazy wg. primary key jest szybsze
var store2 = wazeDB.transaction( ['changes'] ,'readonly').objectStore('changes');
var index2 = store2.openCursor();
index2.onerror = function(event) {
importexportenable(1);
}
index2.onsuccess = function(event) {
var cursor2 = event.target.result;
if (cursor2) {
count++;
var item = cursor2.value;
var row = '';
row += item.ID + '¤';
row += item.T + '¤';
row += item.E + '¤';
row += item.D + '¤';
row += item.K + '¤';
row += item.x + '¤';
row += item.y + '¤';
row += item.N + '¤';
row += item.C + '¤';
row += item.Q + '¤';
if (item.drA != undefined) row += item.drA + '¤'; else row += '¤';
if (item.drB != undefined) row += item.drB + '¤'; else row += '¤';
if (item.tyA != undefined) row += item.tyA + '¤'; else row += '¤';
if (item.tyB != undefined) row += item.tyB + '¤'; else row += '¤';
if (item.arA != undefined) row += item.arA + '¤'; else row += '¤';
if (item.arB != undefined) row += item.arB + '¤'; else row += '¤';
if (item.naA != undefined) row += item.naA + '¤'; else row += '¤';
if (item.naB != undefined) row += item.naB + '¤'; else row += '¤';
if (item.ciA != undefined) row += item.ciA + '¤'; else row += '¤';
if (item.ciB != undefined) row += item.ciB + '¤'; else row += '¤';
if (item.trA != undefined) row += item.trA + '¤'; else row += '¤';
if (item.trB != undefined) row += item.trB + '¤'; else row += '¤';
if (item.tsA != undefined) row += item.tsA + '¤'; else row += '¤';
if (item.tsB != undefined) row += item.tsB + '¤'; else row += '¤';
if (item.lvA != undefined) row += item.lvA + '¤'; else row += '¤';
if (item.lvB != undefined) row += item.lvB + '¤'; else row += '¤';
if (item.geA != undefined) row += item.geA + '¤'; else row += '¤';
if (item.geB != undefined) row += item.geB + '¤'; else row += '¤';
if (item.tolA != undefined) row += item.tolA + '¤'; else row += '¤';
if (item.tolB != undefined) row += item.tolB + '¤'; else row += '¤';
txt += row + '¶\r\n';
var percent = Math.round((count / maxcount) * 100);
if (percent != exportpercent) {
exportpercent = percent;
getId('wmerh_progress_percent').style.minWidth = percent + '%';
getId('wmerh_progress_percent').innerHTML = percent + '%';
getId('wmerh_progress_info').innerHTML = lang.exporteddata + count + ' / ' + maxcount;
}
cursor2.continue();
}
else {
getId('wmerh_progress_percent').style.minWidth = '100%';
getId('wmerh_progress_percent').innerHTML = '100%';
getId('wmerh_progress_info').innerHTML = lang.exporteddata + count + ' / ' + maxcount;
var t = new Date;
var blob = new Blob([ txt ], {type: "text/plain;charset=utf-8"});
var y = t.getFullYear();
var m = t.getMonth() + 1;
var d = t.getDate();
if (m < 10) m = '0' + m;
if (d < 10) d = '0' + d;
saveAs(blob, 'wmeroadhistory_' + y + '-' + m + '-' + d + '_' + t.toLocaleTimeString() + '.txt' );
setTimeout(progressFadeOut, 5000);
importexportenable(1);
}
}
}
}
}
//--------------------------------------------------------------------------------------------------------
function wmeroadhistoryEXPORT() {
getId('wmerh_progress').className = 'loading';
getId('wmerh_progress_percent').style.minWidth = '0%';
getId('wmerh_progress_percent').innerHTML = '0%';
getId('wmerh_progress_info').innerHTML = lang.exporteddata + '0 / 0';
importexportenable(0);
var maxcount = 0;
var objstore = wazeDB.transaction(["segments"], "readonly").objectStore("segments");
var requestcount = objstore.count();
requestcount.onerror = function() {
importexportenable(1);
}
requestcount.onsuccess = function() {
maxcount += requestcount.result;
var objstore2 = wazeDB.transaction(["changes"], "readonly").objectStore("changes");
var requestcount2 = objstore2.count();
requestcount2.onerror = function() {
importexportenable(1);
}
requestcount2.onsuccess = function() {
maxcount += requestcount2.result;
databaseExport(maxcount);
}
}
}
//--------------------------------------------------------------------------------------------------------
function progressFadeOut() {
//sprawdzenie czy w czasie czekania na efekt transition nie rozpoczęto kolejnego importu
//zezwolenie na zniknięcie paska postępu tylko wtedy, gdy proces importu został ukończony
if (importcount == importmaxcount) {
getId('wmerh_progress').className = '';
}
}
//--------------------------------------------------------------------------------------------------------
function update_multi_checkboxes(event) {
var src = event.target.id;
var c1 = '_wmeRoadHistoryShowCircleShort';
var c2 = '_wmeRoadHistoryShowCircleLong';
if (src == c1) getId(c2).checked = false;
if (src == c2) getId(c1).checked = false;
}
//--------------------------------------------------------------------------------------------------------
function showstatsdelayed() {
if (getId('_wmeRoadHistorySummaryStats').checked == false) {
getId('wmeroadhistory_stats').innerHTML = '';
return;
}
var maxcount = 0;
var sortable = [];
for(ed in stats) {
var item = stats[ed];
var count = 0;
for(c in item) { count++; }
sortable.push( [ed, count] );
if (count > maxcount) maxcount = count;
}
sortable.sort(function(b, a) {return a[1] - b[1]});
if (sortable.length) {
getId('wmeroadhistory_stats').innerHTML = '<br>';
for(var i=0; i<sortable.length; i++) {
var autor = sortable[i][0];
var count = sortable[i][1];
var pasek = parseInt(150 * count / maxcount);
var klasa = 'wmeroadhistory_rank0';
if (autor.indexOf('(1)')>=0) klasa = 'wmeroadhistory_rank1';
if (autor.indexOf('(2)')>=0) klasa = 'wmeroadhistory_rank2';
if (autor.indexOf('(3)')>=0) klasa = 'wmeroadhistory_rank3';
if (autor.indexOf('(4)')>=0) klasa = 'wmeroadhistory_rank4';
if (autor.indexOf('(5)')>=0) klasa = 'wmeroadhistory_rank5';
if (autor == 'Inactive User(1)') klasa = 'wmeroadhistory_rank0';
getId('wmeroadhistory_stats').innerHTML += '<div class="' + klasa + '" style="display: inline-block; min-width:150px;" >' + autor + '</div>';
getId('wmeroadhistory_stats').innerHTML += '<b>' + count + '</b>' + lang.statedits + '<br>';
}
getId('wmeroadhistory_stats').innerHTML += '<br>';
}
}
//--------------------------------------------------------------------------------------------------------
function reset_statistics()
{
stats = {};
getId('wmeroadhistory_stats').innerHTML = '';
}
//--------------------------------------------------------------------------------------------------------
function initialiseWMERoadHistory()
{
var docurl = window.document.URL;
if (docurl.indexOf( "/pl/" ) >=0 ) lang = langPL;
var addon = document.createElement('section');
addon.id = "wmeroadhistory-addon";
addon.innerHTML = ''
+ '<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> v' + wmech_version + '</div>'
+ '<button id=wmeroadhistory_scanarea class="btn btn-default" style="min-width:150px; margin: 0px; "></button>'
+ '<div id=wmeroadhistory_log style=""> </div>'
+ '<div class=wmeroadhistory_noselect style="margin-top: 10px; ">'
+ '<div id=wmeroadhistory_tab1>' + lang.changes + '</div>'
+ '<div id=wmeroadhistory_tab2>' + lang.edits + '</div>'
+ '<div id=wmeroadhistory_tab3>' + lang.options + '</div>'
+ '<div id=wmeroadhistory_tab9></div>'
+ '</div>'
+ '<div id=wmeroadhistory_options style="text-align: center; display:none; ">'
+ '<div id=wmeroadhistory_wrapper style="display:none; "></div>'
+ '<div id=wmerh_dbinfo></div>'
+ '<br>'
+ '<button id=wmeroadhistory_import class="wmerh_button_enabled" style=" margin: 0px; ">' + lang.imports + '</button> '
+ '<button id=wmeroadhistory_export class="wmerh_button_enabled" style=" margin: 0px; ">' + lang.exports + '</button>'
+ '<div><input id=wmeroadhistory_mergecheckbox type="checkbox" style="margin-top:10px;" title="' + lang.mergedatatip + '" />' + lang.mergedata + '</div>'
+ '<div id=wmerh_progress>'
+ '<div id=wmerh_progress_bar><div id=wmerh_progress_percent>0%</div></div>'
+ '<div id=wmerh_progress_info></div>'
+ '</div>'
+ '<hr style="margin:5px; padding:0px;">'
+ '<p style="margin-bottom:10px;"><b>' + lang.customize + '</b></p>'
+ '<div style="text-align: left; ">'
+ '<div style="text-align: left; ">' + lang.rowsperpage + ' <input id=_wmeRoadHistoryRows type="number" min=5 max=1000 step=5 size="4" value="50" style="width:60px" /></div><br>'
+ '<div style="text-align: left; "><input id=_wmeRoadHistoryDateRange type="checkbox" style="" />' + lang.daterange + '</div>'
+ '<div>'
+ '<p style="min-width: 70px; display: inline-block; ">' + lang.showfromdate + '</p>'
+ '<input type="number" min="2000" max="2999" size="4" id="_wmeRoadHistoryFromYear" style="width:65px; margin: 2px; "/>'
+ '<input type="number" min="1" max="12" size="2" id="_wmeRoadHistoryFromMonth" style="width:45px; margin: 2px; "/>'
+ '<input type="number" min="1" max="31" size="2" id="_wmeRoadHistoryFromDay" style="width:45px; margin: 2px; "/>'
+ '</div>'
+ '<div>'
+ '<p style="min-width: 70px; display: inline-block; ">' + lang.showtodate + '</p>'
+ '<input type="number" min="2000" max="2999" size="4" id="_wmeRoadHistoryToYear" style="width:65px; margin: 2px; "/>'
+ '<input type="number" min="1" max="12" size="2" id="_wmeRoadHistoryToMonth" style="width:45px; margin: 2px; "/>'
+ '<input type="number" min="1" max="31" size="2" id="_wmeRoadHistoryToDay" style="width:45px; margin: 2px; "/>'
+ '</div>'
+ '<div style="text-align: left; "><input id=_wmeRoadHistoryFullTime type="checkbox" />' + lang.fulltime + '</div>'
+ '<div style="text-align: left; "><input id=_wmeRoadHistoryShowCircle type="checkbox" checked />' + lang.showcircle + '</div>'
+ '<div style="text-align: left; "><input id=_wmeRoadHistoryShowCircleShort type="checkbox" checked />' + lang.showcircleshort + '</div>'
+ '<div style="text-align: left; "><input id=_wmeRoadHistoryShowCircleLong type="checkbox" />' + lang.showcirclelong + '</div>'
+ '<div style="text-align: left; "><input id=_wmeRoadHistorySummaryStats type="checkbox" checked />' + lang.summarystats + '</div>'
+ '</div>'
+ '</div>'
+ '<div id=wmeroadhistory_stats style="font-family:Tahoma; font-size:11px; ">'
+ '</div>'
+ '<div id=wmeroadhistory_list_buttons_1 style="text-align: center; margin:0px; background: #f8f8f8; padding: 5px; visibility: hidden; ">'
+ '<button id=wmeroadhistory_prev class="btn btn-default" style="margin: 2px; padding:0px; font-weight:normal; height:20px; padding-left:20px; padding-right:20px; " ><< ' + lang.prev + '</button>'
+ '<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 + ' >></button>'
+ '<div id=wmeroadhistory_rangeinfo></div>'
+ '</div>'
+ '<div id=wmeroadhistory_list>'
+ '</div>'
+ '<div id=wmeroadhistory_list_buttons_2 style="text-align: center; margin:0px; background: #f8f8f8; padding: 5px; visibility: hidden; ">'
+ '<button id=wmeroadhistory_prev2 class="btn btn-default" style="margin: 2px; padding:0px; font-weight:normal; height:20px; padding-left:20px; padding-right:20px; " ><< ' + lang.prev + '</button>'
+ '<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 + ' >></button>'
+ '</div>'
+ '<style>'
+ '.wmeroadhistory_hovbutton:hover { cursor:pointer; color: #0000FF; text-decoration: underline; }'
+ '#wmeroadhistory_list div { padding-left: 15px; border: 0px solid #f0f0f0; border-bottom-width: 1px; padding-top:5px; padding-bottom:5px; }'
//+ '#wmeroadhistory_list div:hover { background: #E6F2FF; }'
+ '#wmeroadhistory_list h1 { margin: 0px; padding: 0px; line-height: 100%; font-size: 15px; display: inline-block; left: -15px; position: relative; padding-left: 15px; }'
+ '#wmeroadhistory_list h1:hover { cursor: pointer; color: #0D5270; text-decoration: underline; }'
+ '#wmeroadhistory_list h1 { background-position: 0px 2px; background-repeat: no-repeat; }'
+ '#wmeroadhistory_list h1 { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAMCAIAAAA/PgD0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAA7ElEQVR4nGWNQUvDQBSE34Z1N65dU0mMaSkoItriqVdP/nOP/gEPYkV6MSgloUVsTbPvjYd4qHT4Tt8wjAIA0PP7x+yz2rTh8EBfF9nN8EwpUgw8PL3W2+CdU0oB+Ppep7G+v72KXsrFspWecyASAES9I1dvZVYu9LxeGWuDgHZirZnXK90wQEJ72bBoH5vqJ+x3aWyj8zRpmRnYpWW+SBM9SLw39bL5Nz2xukh8JMB0lAfmIPIH83SUCxAJ4djZ8Wk/iLAgsEzyvndWCBFAAE0GaRqbIJI5My6yTqpq3XQfTQiPb+Xd5dBo3ZlfDOiS3+b9cP0AAAAASUVORK5CYII="); }'
+ '#wmeroadhistory_list h2 { margin: 0px; padding: 0px; line-height: 100%; color: #606060; font-size: 100%; }'
+ '#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; }'
+ '#wmeroadhistory_list h4 { margin: 0px; padding: 0px; line-height: 100%; color: #606060; font-family: Tahoma; font-size: 11px; display: inline-block; }'
+ '#wmeroadhistory_list h5 { margin: 0px; padding: 0px; line-height: 100%; color: #606060; font-family: Tahoma; font-size: 11px; float:left; margin-top: 5px; }'
+ '#wmeroadhistory_list h6 { margin: 0px; padding: 0px; line-height: 100%; font-family: Tahoma; font-size: 11px; float:right; font-weight: normal; margin-top: 5px; }'
+ '#wmeroadhistory_list p { margin: 0px; }'
+ '#wmeroadhistory_list hr { margin: 0px; clear: both; border: 0px; outline: 0px; height: 0px; }'
+ '#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; }'
+ '#wmeroadhistory_tab1:hover, #wmeroadhistory_tab2:hover, #wmeroadhistory_tab3:hover { background: #d0d0d0; cursor: pointer; }'
+ '#wmeroadhistory_tab9 { width: 100%; height:1px; background: #e0e0e0; }'
+ '.wmeroadhistory_tab_active { font-weight: bold; background: #e9e9e9; }'
+ '.wmeroadhistory_tab_noactive { font-weight: normal; background: #f8f8f8; }'
+ '.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; }'
+ '.wmeroadhistory_rank0 { color: #808080 }'
+ '.wmeroadhistory_rank1 { color: #E12222 }'
+ '.wmeroadhistory_rank2 { color: #EB712D }'
+ '.wmeroadhistory_rank3 { color: #349B20 }'
+ '.wmeroadhistory_rank4 { color: #3176E9 }'
+ '.wmeroadhistory_rank5 { color: #C000C0 }'
+ '.wmeroadhistory_newseg { color: #ffffff; font-weight: bold; background: #4CD429; border-radius: 5px 5px 5px 5px; padding: 1px 5px 1px 5px; margin-left: 3px; }'
+ '.wmeroadhistory_turnlink { display: inline-block; color: #0091FF; text-decoration: underline; }'
+ '.wmeroadhistory_turnlink:hover { color: #000000; text-decoration: underline; cursor: pointer; }'
+ '.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; }'
+ '.wmeroadhistory_error { color: #D72C2C }'
+ '.wmeroadhistory_kind { color: #404040 }'
+ '.wmeroadhistory_toll { color: #CC38CC }'
+ '.wmeroadhistory_trbefore { color: #808080 }'
+ '.wmeroadhistory_trafter { color: #D72C2C }'
+ '.wmeroadhistory_uturn { color: #808080 }'
+ '.wmeroadhistory_trturn { color: #D72C2C }'
+ '.wmeroadhistory_amonly { color: #59899e; font-weight:bold; }'
+ '#wmerh_progress { opacity: 0; height: 0; margin-top: 10px; margin-bottom: 20px; }'
+ '#wmerh_progress { -moz-transition: opacity 0.5s linear; -o-transition: opacity 0.5s linear; -webkit-transition: opacity 0.5s linear; }'
+ '#wmerh_progress.loading { opacity: 1.0; height: auto; }'
+ '#wmerh_progress_bar { margin: 0px; padding: 2px; border: 1px solid #a0a0a0; border-radius: 5px; font-size: 14px; width: 75%; margin: 0 auto; }'
+ '#wmerh_progress_percent { background-color: #C0E7F1; width: 0px; color: #000000; white-space: nowrap; }'
+ '#wmerh_progress_info { font-family: Tahoma; font-size: 11px; color: #000000; }'
+ '.wmerh_button_disabled { disabled: true; color: #C0C0C0; }'
+ '.wmerh_button_enabled { disabled: false; color: #000000; }'
+ '#wmerh_dbinfo { font-size: 11px; color: #a0a0a0; font-weight: normal; text-align: center; padding:0px; font-style: italic; }'
+ '#wmeroadhistory_rangeinfo { font-family: Tahoma; font-size: 11px; color: #007EFF; }'
+ '.wmeroadhistorymarker1 { display:block; width:33px; height:40px; margin-left:-16px; margin-top:-36px; }'
+ '.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==); }'
+ '</style>'
;
var userTabs = getId('user-info');
var navTabs = getElementsByClassName('nav-tabs', userTabs)[0];
var tabContent = getElementsByClassName('tab-content', userTabs)[0];
var newtab = document.createElement('li');
newtab.innerHTML = '<a id=sidepanel-wmeroadhistory-tab href="#sidepanel-wmeroadhistory" data-toggle="tab" style="" >Road History</a>';
newtab.id = 'wmeroadhistory_tab';
navTabs.appendChild(newtab);
addon.id = "sidepanel-wmeroadhistory";
addon.className = "tab-pane";
tabContent.appendChild(addon);
if (typeof Waze == 'undefined') Waze = window.Waze;
if (typeof Waze.loginManager == 'undefined') Waze.loginManager = window.Waze.loginManager;
if (typeof Waze.loginManager == 'undefined') Waze.loginManager = window.loginManager;
if (Waze.loginManager !== null && Waze.loginManager.isLoggedIn()) {
thisUser = Waze.loginManager.user;
var lev = thisUser.normalizedLevel;
if (thisUser !== null && (lev*lev >= lev+lev+lev || thisUser.isAreaManager)) {
getId('wmeroadhistory_scanarea').onclick = wmeroadhistorySCANAREA;
getId('wmeroadhistory_tab1').onclick = wmeroadhistoryTAB1;
getId('wmeroadhistory_tab2').onclick = wmeroadhistoryTAB2;
getId('wmeroadhistory_tab3').onclick = wmeroadhistoryTAB3;
getId('wmeroadhistory_prev').onclick = wmeroadhistoryPREV;
getId('wmeroadhistory_next').onclick = wmeroadhistoryNEXT;
getId('wmeroadhistory_prev2').onclick = wmeroadhistoryPREVDOWN;
getId('wmeroadhistory_next2').onclick = wmeroadhistoryNEXTDOWN;
getId('wmeroadhistory_import').onclick = wmeroadhistoryIMPORT;
getId('wmeroadhistory_export').onclick = wmeroadhistoryEXPORT;
}
}
getId('_wmeRoadHistoryShowCircleShort').onchange = update_multi_checkboxes;
getId('_wmeRoadHistoryShowCircleLong').onchange = update_multi_checkboxes;
updateSaveButton();
var t = new Date();
getId('_wmeRoadHistoryFromYear').value = 2010;
getId('_wmeRoadHistoryFromMonth').value = 1;
getId('_wmeRoadHistoryFromDay').value = 1;
getId('_wmeRoadHistoryToYear').max = t.getFullYear() + 1;
getId('_wmeRoadHistoryToYear').value = t.getFullYear() + 1;
getId('_wmeRoadHistoryToMonth').value = 1;
getId('_wmeRoadHistoryToDay').value = 1;
getId('_wmeRoadHistoryDateRange').onchange = reset_statistics;
getId('_wmeRoadHistoryFromYear').onchange = reset_statistics;
getId('_wmeRoadHistoryFromMonth').onchange = reset_statistics;
getId('_wmeRoadHistoryFromDay').onchange = reset_statistics;
getId('_wmeRoadHistoryToYear').onchange = reset_statistics;
getId('_wmeRoadHistoryToMonth').onchange = reset_statistics;
getId('_wmeRoadHistoryToDay').onchange = reset_statistics;
loadOptions();
var list = document.getElementsByTagName("div");
for(var i=0; i<list.length; i++) {
var id = list[i].id;
var p = id.indexOf("PendingOperation");
if (p>=0) {
wazepending = list[i];
}
}
Waze.vent.on("operationPending", function() {
ventCount++;
});
Waze.vent.on("operationDone", function() {
ventCount--;
if (ventCount < 0) ventCount = 0;
});
window.setInterval(wmeroadhistoryLOOP, LOOPTIMER);
}
//--------------------------------------------------------------------------------------------------------------
bootstrapWMERoadHistory();