// ==UserScript==
// @name WME GPS Tracer
// @namespace https://gf.qytechs.cn/ru/users/26764-alexletov-wme-gps-tracer
// @version 0.1
// @description Load and show tracks in WME
// @author alexletov
// @include https://www.waze.com/editor/*
// @include https://www.waze.com/*/editor/*
// @include https://editor-beta.waze.com/*
// @license https://opensource.org/licenses/BSD-3-Clause
// @copyright 2016 alexletov
// @grant none
// ==/UserScript==
var VERSION = '0.1 beta';
var server_url;
var start, end;
function gpsTracer_init() {
try {
if (!((typeof window.Waze.map !== undefined) && (undefined !== typeof window.Waze.map.events.register) && (undefined !== typeof window.Waze.selectionManager.events.register ) && (undefined !== typeof window.Waze.loginManager.events.register) )) {
setTimeout(gpsTracer_init, 1000);
return;
}
} catch (err) {
setTimeout(gpsTracer_init, 1000);
return;
}
console.log('WME GPS Tracer: init');
var userInfo = getElId("user-info");
if (userInfo === null) {
window.setTimeout(gpsTracer_init, 500);
return;
}
var navTabs = userInfo.getElementsByTagName("ul");
if (navTabs.length === 0) {
window.setTimeout(gpsTracer_init, 500);
return;
}
if (typeof navTabs[0] === undefined) {
window.setTimeout(gpsTracer_init, 500);
return;
}
var tabContents = userInfo.getElementsByTagName("div");
if (tabContents.length === 0) {
window.setTimeout(gpsTracer_init, 500);
return;
}
if (typeof tabContents[0] === undefined) {
window.setTimeout(gpsTracer_init, 500);
return;
}
gpsTracer_loadSettings();
gpsTracer_init_showUI();
$('#_bGPSTProcessSave').click(gpsTracer_saveSettings);
}
function gpsTracer_init_showUI() {
addon = document.createElement('section');
addon.innerHTML = '<b>WME GPS Tracer</b> v' + VERSION;
section = document.createElement('p');
section.style.paddingTop = "8px";
section.style.textIndent = "16px";
section.id = "gpstracer_settings";
section.innerHTML += 'Select track to show: <select id="_iGPST_track_list" name="_iGPST_track_list" disabled></select><br />';
section.innerHTML += '<button id="_bGPSTProcessLoadTrack" name="_bGPSTProcessLoadTrack" width="100%" disabled>Load track</button><br/>';
section.innerHTML += '<button id="_bGPSTGoToStartOfTrack" name="_bGPSTGoToStartOfTrack" width="100%" disabled>Go to start</button><br/>';
section.innerHTML += '<button id="_bGPSTGoToEndOfTrack" name="_bGPSTGoToEndOfTrack" width="100%" disabled>Go to end</button><br/>';
section.innerHTML += '<br/><br/><hr /><br/><br/>';
section.innerHTML += 'Server url: <input id="_iGPSTServerUrl" name="_iGPSTServerUrl" type="text" value="' + ((server_url === undefined || server_url === null) ? '' : server_url ) + '" /><br />';
section.innerHTML += '<button id="_bGPSTProcessSave" name="_bGPSTProcessSave" width="100%">Save</button><br/>';
addon.appendChild(section);
userTabs = getElId("user-tabs");
userInfo = getElId("user-info");
sidePanelPrefs = getElId("sidepanel-prefs");
navTabs = getElClass("nav-tabs", userTabs)[0];
tabContent = sidePanelPrefs.parentNode;
newtab = document.createElement('li');
newtab.innerHTML = '<a href="#sidepanel-gpstracer" data-toggle="tab">GPS-T</a>';
navTabs.appendChild(newtab);
addon.id = "sidepanel-gpstracer";
addon.className = "tab-pane";
tabContent.appendChild(addon);
}
function gpsTracer_request_track_list() {
if (server_url !== null) {
$.ajax({
url: server_url + '/track_list.php',
type: "POST",
dataType: "jsonp",
data: null,
success: function (resp) {
gpsTracer_update_track_list(resp.tracks);
console.log(resp);
},
error: function (xhr, status) {
alert("Error: " + status);
}
});
} else {
console.log("server url is null");
}
}
function gpsTracer_update_track_list(list) {
$('#_iGPST_track_list').empty();
for (var i = 0; i < list.length; i++) {
$('#_iGPST_track_list').append( new Option(list[i].name, list[i].id) );
};
$("#_iGPST_track_list").removeAttr("disabled");
$("#_bGPSTProcessLoadTrack").removeAttr("disabled");
$('#_bGPSTProcessLoadTrack').click(gpsTracer_load_track);
}
function isValidURL(s) {
var regexp = /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/;
return regexp.test(s);
}
function gpsTracer_loadSettings() {
server_url = localStorage.getItem("GPST_Server_Url");
gpsTracer_request_track_list();
}
function gpsTracer_load_track() {
if (server_url !== null) {
$.ajax({
url: server_url + '/' + $('#_iGPST_track_list').val() + '.php',
type: "POST",
dataType: "jsonp",
data: null,
success: function (resp) {
gpsTracer_show_track(resp);
$('#_bGPSTGoToStartOfTrack').click(gpsTracer_goto_start);
$("#_bGPSTGoToStartOfTrack").removeAttr("disabled");
$('#_bGPSTGoToEndOfTrack').click(gpsTracer_goto_end);
$("#_bGPSTGoToEndOfTrack").removeAttr("disabled");
},
error: function (xhr, status) {
alert("Error: " + status);
}
});
} else {
console.log("server url is null");
}
}
function gpsTracer_saveSettings() {
url = $('#_iGPSTServerUrl').val();
if (!isValidURL(url)) {
$('#_iGPSTServerUrl').val(server_url === null ? '' : server_url);
alert(url + ' is not valid URL!');
return;
}
server_url = url;
localStorage.setItem("GPST_Server_Url", url);
gpsTracer_request_track_list();
}
function gpsTracer_goto_start() {
Waze.map.setCenter([start.x, start.y], 4);
}
function gpsTracer_goto_end() {
Waze.map.setCenter([end.x, end.y], 4);
}
function gpsTracer_show_track(coordinates) {
var points = [];
var lineFeatures = [];
var proj1 = new OpenLayers.Projection('EPSG:4326');
var proj2 = Waze.map.getProjectionObject();
var numPoints = 0;
gpsTracer_clear_track();
for (var i = 0; i < coordinates.length; i++) {
var point = new OpenLayers.Geometry.Point(coordinates[i].lat, coordinates[i].lon).transform(proj1, proj2);
points.push(point);
if (i == 0) {
start = point;
}
end = point;
numPoints++;
}
var line = new OpenLayers.Geometry.LineString(points);
var size = 6;
var lineFeature = new OpenLayers.Feature.Vector(line, {strokeColor: '#ff0000'} );
lineFeatures.push(lineFeature);
var layers = Waze.map.getLayersBy("uniqueName","__WME_GPS_Tracer");
var gps_mapLayer;
if(layers.length == 0) {
var new_layer_style = new OpenLayers.Style({
strokeDashstyle: 'solid',
strokeColor : "${strokeColor}",
strokeOpacity: 1.0,
strokeWidth: "${lineWidth}",
//strokeLinecap: 'square',
fillColor: '#000000',
fillOpacity: 1.0,
pointRadius: 2,
fontWeight: "normal",
label : "${labelText}",
fontFamily: "Tahoma, Courier New",
labelOutlineColor: "#FFFFFF",
labelOutlineWidth: 2,
fontColor: '#000000',
fontSize: "10px"
});
gps_mapLayer = new OpenLayers.Layer.Vector("GPS Tracer", {
displayInLayerSwitcher: true,
uniqueName: "__WME_GPS_Tracer",
styleMap: new OpenLayers.StyleMap(new_layer_style)
});
I18n.translations.en.layers.name["__WME_GPS_Tracer"] = "GPS Tracer";
Waze.map.addLayer(gps_mapLayer);
} else {
gps_mapLayer = layers[0];
}
gps_mapLayer.setVisibility(true);
if (lineFeatures.length > 0) gps_mapLayer.addFeatures(lineFeatures);
// go to the center of added features
if (lineFeatures.length > 0 || pointFeatures.length > 0) {
var bounds = new OpenLayers.Bounds();
for (var i = 0; i < lineFeatures.length; ++i) {
var line = lineFeatures[i];
bounds.extend(line.geometry.bounds);
}
var center = bounds.getCenterPixel();
var zoom = Waze.map.getZoom();
Waze.map.setCenter([center.x, center.y], zoom);
}
}
function gpsTracer_clear_track()
{
var layers = Waze.map.getLayersBy("uniqueName","__WME_GPS_Tracer");
if(layers.length != 0) {
var gps_layer = layers[0];
gps_layer.removeAllFeatures();
}
}
/* helper function */
function getElClass(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 getElId(node) {
return document.getElementById(node);
}
gpsTracer_init();