// ==UserScript==
// @name WME BeenThere
// @namespace https://greasyfork.org/users/30701-justins83-waze
// @description This lets you drop boxes around the map to help visualize where you have been editing
// @include https://www.waze.com/editor*
// @include https://www.waze.com/*/editor*
// @include https://beta.waze.com/*
// @exclude https://www.waze.com/*/user/editor*
// @require https://greasyfork.org/scripts/24851-wazewrap/code/WazeWrap.js
// @require https://greasyfork.org/scripts/27023-jscolor/code/JSColor.js
// @require https://greasyfork.org/scripts/27254-clipboard-js/code/clipboardjs.js
// @require https://greasyfork.org/scripts/28687-jquery-ui-1-11-4-custom-min-js/code/jquery-ui-1114customminjs.js
// @resource jqUI_CSS https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/smoothness/jquery-ui.css
// @version 2020.06.02.02
// ==/UserScript==
//---------------------------------------------------------------------------------------
/* global W */
/* global OpenLayers */
/* ecmaVersion 2017 */
/* global $ */
/* global jscolor */
/* global _ */
/* global WazeWrap */
/* global require */
/* global Clipboard */
/* eslint curly: ["warn", "multi-or-nest"] */
var beenTheresettings = [];
var attributes = {
name: ""
};
var layerFuture = [];
var pointStyle = {
pointRadius: 3,
fillOpacity: 50,
strokeColor: '#00ece3',
strokeWidth: '2',
strokeLinecap: 'round'
};
var clickCount = 0;
var userRectPoint1 = null;
var userCircleCenter = null;
var currColor;
const updateMessage = "";
(function() {
//var jqUI_CssSrc = GM_getResourceText("jqUI_CSS");
//GM_addStyle(jqUI_CssSrc);
function bootstrap(tries = 1) {
if (W && W.map &&
W.model && W.loginManager.user &&
$ && window.jscolor &&
WazeWrap.Ready && W.model.users)
init();
else if (tries < 1000)
setTimeout(function () {bootstrap(++tries);}, 200);
}
bootstrap();
function AddExtent() {
var point = W.map.getExtent();
var groupPoints2 = {
topLeft : {
lon:point.left,
lat:point.top
},
botLeft : {
lon: point.left,
lat: point.bottom
},
botRight: {
lon: point.right,
lat: point.bottom
},
topRight:{
lon: point.right,
lat: point.top
},
color: currColor,
type: "rectangle",
radius: null
};
beenTheresettings.Groups[beenTheresettings.CurrentGroup].push(groupPoints2);
DrawFeature(groupPoints2);
}
function DrawFeature(obj){
var pnt = [];
//var pnt2 = [];
//var pnt4326;
var feature;
var style = {
strokeColor: obj.color, strokeOpacity: 1, strokeWidth: 5, fillColor: obj.color, fillOpacity: 0.0,
label: "", labelOutlineColor: "black", labelOutlineWidth: 3, fontSize: 14,
fontColor: "orange", fontOpacity: 1, fontWeight: "bold"};
if(beenTheresettings.DrawShapeBorder)
style.strokeOpacity = 1;
else
style.strokeOpacity = 0;
if(beenTheresettings.FillShape)
style.fillOpacity = 1;
else
style.fillOpacity = 0;
if(obj.type === "rectangle"){
var convPoint = new OpenLayers.Geometry.Point(obj.topLeft.lon, obj.topLeft.lat);
pnt.push(convPoint);
//pnt4326 = WazeWrap.Geometry.ConvertTo4326(obj.topLeft.lon,obj.topLeft.lat);
//pnt2.push(new OpenLayers.Geometry.Point(pnt4326.lon, pnt4326.lat));
convPoint = new OpenLayers.Geometry.Point(obj.botLeft.lon, obj.botLeft.lat);
pnt.push(convPoint);
//pnt4326 = WazeWrap.Geometry.ConvertTo4326(obj.botLeft.lon,obj.botLeft.lat);
//pnt2.push(new OpenLayers.Geometry.Point(pnt4326.lon, pnt4326.lat));
convPoint = new OpenLayers.Geometry.Point(obj.botRight.lon, obj.botRight.lat);
pnt.push(convPoint);
//pnt4326 = WazeWrap.Geometry.ConvertTo4326(obj.botRight.lon,obj.botRight.lat);
//pnt2.push(new OpenLayers.Geometry.Point(pnt4326.lon, pnt4326.lat));
convPoint = new OpenLayers.Geometry.Point(obj.topRight.lon, obj.topRight.lat);
pnt.push(convPoint);
//pnt4326 = WazeWrap.Geometry.ConvertTo4326(obj.topRight.lon,obj.topRight.lat);
//pnt2.push(new OpenLayers.Geometry.Point(pnt4326.lon, pnt4326.lat));
convPoint = new OpenLayers.Geometry.Point(obj.topLeft.lon, obj.topLeft.lat);
pnt.push(convPoint);
//pnt4326 = WazeWrap.Geometry.ConvertTo4326(obj.topLeft.lon,obj.topLeft.lat);
//pnt2.push(new OpenLayers.Geometry.Point(pnt4326.lon, pnt4326.lat));
var ring = new OpenLayers.Geometry.LinearRing(pnt);
var polygon = new OpenLayers.Geometry.Polygon([ring]);
feature = new OpenLayers.Feature.Vector(polygon, attributes, style);
}
else{ //circle
var poly = new OpenLayers.Geometry.Polygon.createRegularPolygon(obj.centerPoint, obj.radius, 40, 0);
feature = new OpenLayers.Feature.Vector(poly, attributes, style);
}
mapLayers.addFeatures([feature]);
updateTotalRectCount();
/*
var ring2 = new OpenLayers.Geometry.LinearRing(pnt2);
var polygon2 = new OpenLayers.Geometry.Polygon([ring2]);
var feature2 = new OpenLayers.Feature.Vector(polygon2);
var pnt3 = [];
pnt3.push(new OpenLayers.Geometry.Point(-84.3197299999999,40.100960000000285));
pnt3.push(new OpenLayers.Geometry.Point(-84.3197299999999,40.04566000000004));
pnt3.push(new OpenLayers.Geometry.Point(-84.24969999999959,40.04566000000004));
pnt3.push(new OpenLayers.Geometry.Point(-84.24969999999959,40.100960000000285));
pnt3.push(new OpenLayers.Geometry.Point(-84.3197299999999,40.100960000000285));
var ring3 = new OpenLayers.Geometry.LinearRing(pnt3);
var polygon3 = new OpenLayers.Geometry.Polygon([ring3]);
var feature3 = new OpenLayers.Feature.Vector(polygon3);
var geoJSON = new OpenLayers.Format.GeoJSON();
//var geoJSONText = geoJSON.write(feature3, true);
//var geoJSONText2 = geoJSON.write(feature2, true);
//console.log("geoJSONText = " + geoJSONText);
//console.log("geoJSONText2 = " + geoJSONText2);
var turfpolygon = turf.polygon([[
[-84.3197299999999, 40.100960000000285],
[-84.3197299999999, 40.04566000000004],
[-84.24969999999959, 40.04566000000004],
[-84.24969999999959, 40.100960000000285],
[-84.3197299999999, 40.100960000000285]
]]);
var turfpoly2 = turf.polygon([[
[-84.3034299999997, 40.11526999999987],
[-84.3034299999997, 40.085729999999806],
[-84.24437, 40.085729999999806],
[-84.24437, 40.11526999999987],
[-84.3034299999997, 40.11526999999987]
]]);
var union = turf.union(turfpolygon, turfpoly2);
console.log("Justin");
console.log(union);*/
}
function updateTotalRectCount(){
$('#rectCount')[0].innerHTML = mapLayers.features.length;
}
function NewBox(e) {
e.stopPropagation();
AddExtent();
saveSettings();
}
function NewUserRect(e){
e.stopPropagation();
EndUserCircleMode();
clickCount = 0;
clearLayer();
$(".olMapViewport").on('mousemove', MouseMoveHandlerRect);
document.addEventListener('keyup', keyUpHandler, false);
$(".olMapViewport").click(ClickHandler);
}
function NewUserCircle(e){
e.stopPropagation();
EndUserRectMode();
clickCount = 0;
clearLayer();
$(".olMapViewport").on('mousemove', MouseMoveHandlerCircle);
document.addEventListener('keyup', keyUpHandler, false);
$(".olMapViewport").click(ClickHandlerCircle);
}
function ClickHandlerCircle(){
if(clickCount === 0){
userCircleCenter = getMousePos900913();
clickCount++;
}
else{
var point2 = getMousePos900913();
var points = [new OpenLayers.Geometry.Point(userCircleCenter.lon, userCircleCenter.lat), new OpenLayers.Geometry.Point(point2.lon, point2.lat)];
var radius = WazeWrap.Geometry.calculateDistance(points);
var circleData = {
centerPoint : new OpenLayers.Geometry.Point(userCircleCenter.lon, userCircleCenter.lat),
radius : radius,
color: currColor,
type : "circle"
};
beenTheresettings.Groups[beenTheresettings.CurrentGroup].push(circleData);
saveSettings();
DrawFeature(circleData);
EndUserCircleMode();
}
}
function ClickHandler(){
if(clickCount === 0){ //first point chosen - draw rectangle as the mouse moves
userRectPoint1 = getMousePos900913();
clickCount++;
}
else{ //second point chose - take both coordinates and draw a rectangle on the BeenThere layer
var point2 = getMousePos900913();
var groupPoints2 = {
topLeft : {
lon: userRectPoint1.lon,
lat: userRectPoint1.lat
},
botLeft : {
lon: userRectPoint1.lon,
lat: point2.lat
},
botRight: {
lon: point2.lon,
lat: point2.lat
},
topRight:{
lon: point2.lon,
lat: userRectPoint1.lat
},
color: currColor,
type: "rectangle"
};
beenTheresettings.Groups[beenTheresettings.CurrentGroup].push(groupPoints2);
saveSettings();
DrawFeature(groupPoints2);
EndUserRectMode();
}
}
function MouseMoveHandlerRect(e){
clearLayer();
drawPointer(getMousePos900913(), false);
drawRect(userRectPoint1);
}
function MouseMoveHandlerCircle(e){
clearLayer();
var currMousePos = getMousePos900913();
drawPointer(currMousePos, true);
if(userCircleCenter){
var points = [new OpenLayers.Geometry.Point(userCircleCenter.lon, userCircleCenter.lat), new OpenLayers.Geometry.Point(currMousePos.lon, currMousePos.lat)];
var radius = WazeWrap.Geometry.calculateDistance(points);
drawCircle(userCircleCenter, radius);
}
}
function clearLayer() {
var layer = W.map.getLayersByName("BeenThereUserRect")[0];
layer.removeAllFeatures();
}
function drawRect(e){
if(e !== null){
var color = currColor;
var style = {
strokeColor: color, strokeOpacity: 1, strokeWidth: 5, fillColor: color, fillOpacity: 0.0,
label: "", labelOutlineColor: "black", labelOutlineWidth: 3, fontSize: 14,
fontColor: color, fontOpacity: 0.85, fontWeight: "bold"};
if(beenTheresettings.DrawShapeBorder)
style.strokeOpacity = 1;
else
style.strokeOpacity = 0;
if(beenTheresettings.FillShape)
style.fillOpacity = 1;
else
style.fillOpacity = 0;
var point2 = getMousePos900913();
var pnt = [];
var convPoint = new OpenLayers.Geometry.Point(e.lon, e.lat);
pnt.push(convPoint);
convPoint = new OpenLayers.Geometry.Point(e.lon, point2.lat);
pnt.push(convPoint);
convPoint = new OpenLayers.Geometry.Point(point2.lon, point2.lat);
pnt.push(convPoint);
convPoint = new OpenLayers.Geometry.Point(point2.lon, e.lat);
pnt.push(convPoint);
convPoint = new OpenLayers.Geometry.Point(e.lon, e.lat);
pnt.push(convPoint);
var ring = new OpenLayers.Geometry.LinearRing(pnt);
var polygon = new OpenLayers.Geometry.Polygon([ring]);
var feature = new OpenLayers.Feature.Vector(polygon, attributes, style);
W.map.getLayersByName("BeenThereUserRect")[0].addFeatures([feature]);
}
}
function drawCircle(e, radius){
if(e !== null){
var color = currColor;
var style = {
strokeColor: color, strokeOpacity: 0.8, strokeWidth: 5, fillColor: color, fillOpacity: 0.0,
label: "", labelOutlineColor: "black", labelOutlineWidth: 3, fontSize: 14,
fontColor: color, fontOpacity: 0.85, fontWeight: "bold"};
if(beenTheresettings.DrawShapeBorder)
style.strokeOpacity = 1;
else
style.strokeOpacity = 0;
if(beenTheresettings.FillShape)
style.fillOpacity = 1;
else
style.fillOpacity = 0;
var point2 = getMousePos900913();
var pt = new OpenLayers.Geometry.Point(e.lon, e.lat);
var polygon = new OpenLayers.Geometry.Polygon.createRegularPolygon(pt,radius, 40, 0);
var feature = new OpenLayers.Feature.Vector(polygon, attributes, style);
W.map.getLayersByName("BeenThereUserRect")[0].addFeatures([feature]);
}
}
function drawPointer(e, circle){
var color = currColor;
pointStyle.strokeColor = color;
pointStyle.fillColor = color;
if(circle && circle === true)
pointStyle.fillOpacity = 0;
else
pointStyle.fillOpacity = 1;
var pointFeature = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(e.lon, e.lat), {}, pointStyle);
W.map.getLayersByName("BeenThereUserRect")[0].addFeatures([pointFeature]);
}
function getMousePos900913(){
var mousePosition = $('.WazeControlMousePosition').text().split(" ");
[mousePosition[0], mousePosition[1]] = [mousePosition[1], mousePosition[0]];
return WazeWrap.Geometry.ConvertTo900913(mousePosition[0], mousePosition[1]);
}
function keyUpHandler(e){
if (e.keyCode == 27){
EndUserRectMode();
EndUserCircleMode();
}
}
function EndUserRectMode(){
$('.olMapViewport').css('cursor', 'initial');
$(".olMapViewport").off('click');
$(".olMapViewport").off('mousemove', MouseMoveHandlerRect);
clearLayer();
document.removeEventListener('keyup', keyUpHandler);
clickCount = 0;
userRectPoint1 = null;
}
function EndUserCircleMode(){
$(".olMapViewport").off('click');
$(".olMapViewport").off('mousemove', MouseMoveHandlerCircle);
clearLayer();
document.removeEventListener('keyup', keyUpHandler);
clickCount = 0;
userCircleCenter = null;
}
function RemoveLastBox() {
var mro_mapLayers = W.map.getLayersBy("uniqueName", "__beenThere");
var mro_mapLayers_mapLayerLength = mro_mapLayers[0].features.length;
if (mro_mapLayers_mapLayerLength > 0)
mro_mapLayers[0].features[mro_mapLayers_mapLayerLength - 1].destroy();
if(beenTheresettings.Groups[beenTheresettings.CurrentGroup].length > 0)
layerFuture.push(beenTheresettings.Groups[beenTheresettings.CurrentGroup].pop());
saveSettings();
updateTotalRectCount();
}
function RedoLastBox(){
if(layerFuture.length >0){
var rect = layerFuture.pop();
beenTheresettings.Groups[beenTheresettings.CurrentGroup].push(rect);
DrawFeature(rect);
}
}
function RemoveAllBoxes() {
if(beenTheresettings.Groups[beenTheresettings.CurrentGroup].length > 0)
if(confirm("Clearing all boxes cannot be undone.\nPress OK to clear all boxes.")){
var mro_mapLayers = W.map.getLayersBy("uniqueName", "__beenThere");
var mro_mapLayers_mapLayerLength = mro_mapLayers[0].features.length;
if (mro_mapLayers_mapLayerLength > 0)
mro_mapLayers[0].destroyFeatures();
beenTheresettings.Groups[beenTheresettings.CurrentGroup] = [];
layerFuture = [];
saveSettings();
updateTotalRectCount();
}
}
var mapLayers;
var userRectLayer;
function init() {
LoadSettingsObj();
mapLayers = new OpenLayers.Layer.Vector("Been There", {
displayInLayerSwitcher: true,
uniqueName: "__beenThere"
});
userRectLayer = new OpenLayers.Layer.Vector("BeenThereUserRect", {
displayInLayerSwitcher: false,
uniqueName: "__beenThereUserRect"
});
//$.getScript('https://npmcdn.com/@turf/turf@3.9.0/turf.min.js');
W.map.addLayer(mapLayers);
mapLayers.setVisibility(beenTheresettings.layerVisible);
mapLayers.setOpacity(0.6);
W.map.addLayer(userRectLayer);
userRectLayer.setOpacity(0.6);
userRectLayer.setVisibility(beenTheresettings.layerVisible);
WazeWrap.Interface.AddLayerCheckbox("display", "Been There", beenTheresettings.layerVisible, LayerToggled, [mapLayers, userRectLayer]);
//append our css to the head
var g = '.beenThereButtons {font-size:26px; color:#59899e; cursor:pointer;} .flex-container {display: -webkit-flex; display: flex; background-color:black;}';
$("head").append($('<style type="text/css">' + g + '</style>'));
//add controls to the map
var $section = $("<div>", {style:"padding:8px 16px", id:"WMEBeenThere"});
$section.html([
'<div id="beenThere" class="flex-container" style="width:65px; position: absolute;top:' + beenTheresettings.LocTop + '; left: ' + beenTheresettings.LocLeft + '; z-index: 1040 !important; border-radius: 5px; padding: 4px; background-color: #000000;">',
'<div class="flex-container" style="width:32px; flex-wrap:wrap;" >',//left side container
'<div id="NewBox" class="waze-icon-plus_neg beenThereButtons" style="margin-top:-10px; display:block; float:left;" title="Draw a box around the visible area"></div>',
'<div id="UserRect" class="fa fa-pencil-square-o" style="display:block; float:left; margin-left:3px; color:#59899e; cursor:pointer; font-size:25px;"></div>',
'<div id="UserCirc" class="fa-stack" style="margin-top:10px; display:block; float:left; color:#59899e; cursor:pointer;"><span class="fa fa-circle-thin fa-stack-2x"></span><span class="fa fa-pencil" style="font-size:20px; margin-left:8px;"></span></div>',
'<div id="RemoveLastBox" class="waze-icon-undo beenThereButtons" style="display:block;margin-bottom:-10px;" title="Remove last shape"></div>',
'<div id="Redo" class="waze-icon-redo beenThereButtons" style="display:block;margin-bottom:-10px;" title="Redo last shape"></div>',
'<div id="TrashBox" class="waze-icon-trash beenThereButtons" style="margin-bottom:-5px; display:block;" title="Remove all shapes">',
'<span id="rectCount" style="position:absolute; top:150px; right:16px;font-size:12px;">0</span></div>',
'<div id="Settings" class="fa fa-cog" style="display:block; float:left; margin-left:3px; color:#59899e; cursor:pointer; font-size:20px;"></div>',
'</div>',//close left side container
'<div class="flex-container" style="width:30px; height:90px; flex-wrap:wrap; justify-content:flex-start;">', //right side container
'<input type="radio" name="currColor" value="btcolorPicker1" style="width:10px;" checked="checked">',
'<button class="jscolor {valueElement:null,hash:true,closable:true}" style="float:right;width:15px; height:15px;border:2px solid black" id="btcolorPicker1"></button>',
'<input type="radio" name="currColor" value="btcolorPicker2" style="width:10px;">',
'<button class="jscolor {valueElement:null,hash:true,closable:true}" style="float:right;width:15px; height:15px;border:2px solid black" id="btcolorPicker2"></button>',
'<input type="radio" name="currColor" value="btcolorPicker3" style="width:10px;">',
'<button class="jscolor {valueElement:null,hash:true,closable:true}" style="float:right;width:15px; height:15px;border:2px solid black" id="btcolorPicker3"></button>',
'<input type="radio" name="currColor" value="btcolorPicker4" style="width:10px;">',
'<button class="jscolor {valueElement:null,hash:true,closable:true}" style="float:right;width:15px; height:15px;border:2px solid black" id="btcolorPicker4"></button>',
'</div>' //close right side container
].join(' '));
$("#WazeMap").append($section.html());
BuildSettingsInterface();
//set up listeners
$("#NewBox").click(NewBox);
$('#UserRect').click(NewUserRect);
$('#UserCirc').click(NewUserCircle);
$("#RemoveLastBox").click(RemoveLastBox);
$('#Redo').click(RedoLastBox);
$("#TrashBox").click(RemoveAllBoxes);
$('#Settings').click(function(){
$('#BTSettings')[0].innerHTML = localStorage.beenThere_Settings;
setChecked('chkBTShapeBorder',beenTheresettings.DrawShapeBorder);
setChecked('chkBTShapeFill',beenTheresettings.FillShape);
$('#BeenThereSettings').css({'visibility':'visible'});
});
new WazeWrap.Interface.Shortcut('NewBoxShortcut', 'Draw a box around the visible area', 'wmebt', 'Been There', beenTheresettings.NewBoxShortcut, NewBox, null).add();
new WazeWrap.Interface.Shortcut('NewUserRectShortcut', 'Draw a rectangle', 'wmebt', 'Been There', beenTheresettings.NewUserRectShortcut, NewUserRect, null).add();
new WazeWrap.Interface.Shortcut('NewUserCircleShortcut', 'Draw a circle', 'wmebt', 'Been There', beenTheresettings.NewUserCircleShortcut, NewUserCircle, null).add();
new WazeWrap.Interface.Shortcut('RemoveLastShapeShortcut', 'Remove last shape', 'wmebt', 'Been There', beenTheresettings.RemoveLastShapeShortcut, RemoveLastBox, null).add();
new WazeWrap.Interface.Shortcut('RedoLastShapeShortcut', 'Redo last shape', 'wmebt', 'Been There', beenTheresettings.RedoLastShapeShortcut, RedoLastBox, null).add();
new WazeWrap.Interface.Shortcut('RemoveAllShapesShortcut', 'Remove all shapes', 'wmebt', 'Been There', beenTheresettings.RemoveAllShapesShortcut, RemoveAllBoxes, null).add();
//necessary to catch changes to the keyboard shortcuts
window.onbeforeunload = function() {
checkShortcutsChanged();
};
$('[name="currColor"]').change(function() {
currColor = '#' + $('#' + this.value)[0].jscolor.toString();
});
if($.ui){
$('#beenThere').draggable({
stop: function(event, ui) {
beenTheresettings.LocLeft = $('#beenThere').css('left');
beenTheresettings.LocTop = $('#beenThere').css('top');
saveSettings();
}
});
$('#BeenThereSettings').draggable({
stop: function(event, ui) {
beenTheresettings.SettingsLocLeft = $('#BeenThereSettings').css('left');
beenTheresettings.SettingsLocTop = $('#BeenThereSettings').css('top');
saveSettings();
}
});
}
initColorPicker();
LoadSettings();
WazeWrap.Interface.ShowScriptUpdate("WME BeenThere", GM_info.script.version, updateMessage, "https://greasyfork.org/scripts/27035-wme-beenthere", "https://www.waze.com/forum/viewtopic.php?f=819&t=218182");
}
function LayerToggled(checked){
userRectLayer.setVisibility(checked);
mapLayers.setVisibility(checked);
beenTheresettings.layerVisible = checked;
saveSettings();
}
/*
Takes the settings loaded into the settings obj and loads them into the interface and draws any features that were saved
*/
function LoadSettings(){
loadGroup(beenTheresettings.CurrentGroup);
if ($('#btcolorPicker1')[0].jscolor && $('#btcolorPicker2')[0].jscolor && $('#btcolorPicker3')[0].jscolor && $('#btcolorPicker4')[0].jscolor){
$('#btcolorPicker1')[0].jscolor.fromString(beenTheresettings.CP1);
$('#btcolorPicker2')[0].jscolor.fromString(beenTheresettings.CP2);
$('#btcolorPicker3')[0].jscolor.fromString(beenTheresettings.CP3);
$('#btcolorPicker4')[0].jscolor.fromString(beenTheresettings.CP4);
}
}
function loadGroup(group){
for(var i=0;i<beenTheresettings.Groups[group].length;i++)
DrawFeature(beenTheresettings.Groups[group][i]);
}
function BuildSettingsInterface(){
var $section = $("<div>", {style:"padding:8px 16px", id:"WMEBeenThereSettings"});
$section.html([
`<div id="BeenThereSettings" style="visibility:hidden; position:fixed; top:${beenTheresettings.SettingsLocTop}; left:${beenTheresettings.SettingsLocLeft}; z-index:1000; background-color:white; border-width:3px; border-style:solid; border-radius:10px; padding:4px;">`,
'<div>', //top div - split left/right
'<div style="width:328px; height:240px; display:inline-block; float:left;">', //left side div
'<div><h3>Drawing</h3>',
'<input type="radio" name="DrawOptions" class="btOptions" id="chkBTShapeBorder">Draw shape border</br>',
'<input type="radio" name="DrawOptions" class="btOptions" id="chkBTShapeFill">Fill shape</br>',
'</div></br>',//close drawing div
'<div><h3>Export/Import</h3>',
'<div><button class="fa fa-upload fa-2x" aria-hidden="true" id="btnBTCopySettings" style="cursor:pointer;border: 1; background: none; box-shadow:none;" title="Copy BeenThere settings to the clipboard" data-clipboard-target="#BTSettings"></button>',
'<textarea rows="4" cols="30" readonly id="BTSettings" style="resize:none;"></textarea>',
'</div>',//end export div
'<div>', // import div
'<button class="fa fa-download fa-2x" aria-hidden="true" id="btnBTImportSettings" style="cursor:pointer;border: 1; background: none; box-shadow:none;" title="Import copied settings"></button>',
'<textarea rows="4" cols="30" id="txtBTImportSettings" style="resize:none;"></textarea>',
'</div>',//end import div
'</div>',//close import/export div
'</div>', //close left side div
'<div style="display:inline-block; height:240px;">', //right side div
'<h3>Groups</h3>',
'<div id="BeenThereGroups">',
'<div id="BeenThereGroupsList">',
'</div>',
'<div style="float:left;">',//textboxes div
'<label for="btGroupName" style="display:inline-block; width:40px;">Name </label><input type="text" id="btGroupName" size="10" style="border: 1px solid #000000; height:20px;"/></br>',
'</div>', //End textboxes div
'<div style="float:right; text-align:center;">',//button div
'<button id="btAddGroup">Add</button>',
'</div>',//close button div
'</div>', //close BeenThereGroups
'</div>', //close right side div
'</div>', //close top div
'<div style="float: right; top:10px;">', //save/cancel buttons
'<button id="BeenThereSettingsClose" class="btn btn-default">Close</button>',
'</div>',//end save/cancel buttons
'</div>'
].join(' '));
$("#WazeMap").append($section.html());
$('.btOptions').change(function(){
beenTheresettings.DrawShapeBorder = isChecked('chkBTShapeBorder');
beenTheresettings.FillShape = isChecked('chkBTShapeFill');
saveSettings();
});
$("#BeenThereSettingsClose").click(function(){
$('#BeenThereSettings').css({'visibility':'hidden'}); //hide the settings window
});
$('#btnBTImportSettings').click(function(){
if($('#txtBTImportSettings')[0].value !== ""){
localStorage.beenThere_Settings = $('#txtBTImportSettings')[0].value;
LoadSettingsObj();
LoadSettings();
}
});
LoadCustomGroups();
$('#btAddGroup').click(function(){
if($('#btGroupName').val() !== ""){
let name = $('#btGroupName').val();
let exists = beenTheresettings.Groups[name];
if(exists == null){
beenTheresettings.Groups[name] = [];
$('#btGroupsName').val("");
LoadCustomGroups();
saveSettings();
}
}
});
new Clipboard('#btnBTCopySettings');
}
function LoadCustomGroups(){
$('#BeenThereGroupsList').empty();
var groups = "";
$.each(beenTheresettings.Groups, function(k, v){
groups += '<div style="position:relative;">' + k + '<i id="BTGroupsClose' + k + '" style="position:absolute; right:0; top:0;" class="fa fa-times" title="Remove group"></i></div>';
});
groups += 'Current group: <select id="btCurrGroup">';
$.each(beenTheresettings.Groups, function(val, obj){
groups += `<option value="${val}">${val}</option>`;
});
groups += '</select>';
$('#BeenThereGroupsList').prepend(groups);
$('#btCurrGroup')[0].value = beenTheresettings.CurrentGroup;
$('#btCurrGroup').change(function(){
beenTheresettings.CurrentGroup = $(this)[0].value;
clearLayer();
mapLayers.removeAllFeatures();
loadGroup(beenTheresettings.CurrentGroup);
saveSettings();
});
$('[id^="BTGroupsClose"]').click(function(){
if(getObjectPropertyCount(beenTheresettings.Groups) > 1){
delete beenTheresettings.Groups[this.id.replace('BTGroupsClose','')];
saveSettings();
LoadCustomGroups();
}
else
alert("There must be at least one group");
});
}
function isChecked(checkboxId) {
return $('#' + checkboxId).is(':checked');
}
function setChecked(checkboxId, checked) {
$('#' + checkboxId).prop('checked', checked);
}
function initColorPicker(tries = 1){
if ($('#btcolorPicker1')[0].jscolor && $('#btcolorPicker2')[0].jscolor) {
$('#btcolorPicker1')[0].jscolor.fromString(beenTheresettings.CP1);
$('#btcolorPicker2')[0].jscolor.fromString(beenTheresettings.CP2);
$('#btcolorPicker3')[0].jscolor.fromString(beenTheresettings.CP3);
$('#btcolorPicker4')[0].jscolor.fromString(beenTheresettings.CP4);
$('[id^="colorPicker"]')[0].jscolor.closeText = 'Close';
$('#btcolorPicker1')[0].jscolor.onChange = jscolorChanged;
$('#btcolorPicker2')[0].jscolor.onChange = jscolorChanged;
$('#btcolorPicker3')[0].jscolor.onChange = jscolorChanged;
$('#btcolorPicker4')[0].jscolor.onChange = jscolorChanged;
} else if (tries < 1000)
setTimeout(function () {initColorPicker(tries++);}, 200);
}
function jscolorChanged(){
beenTheresettings.CP1 = "#" + $('#btcolorPicker1')[0].jscolor.toString();
beenTheresettings.CP2 = "#" + $('#btcolorPicker2')[0].jscolor.toString();
beenTheresettings.CP3 = "#" + $('#btcolorPicker3')[0].jscolor.toString();
beenTheresettings.CP4 = "#" + $('#btcolorPicker4')[0].jscolor.toString();
//In case they changed the color of the currently selected color, re-set currColor
currColor = '#' + $('#' + $("input[type='radio'][name='currColor']:checked").val())[0].jscolor.toString();
saveSettings();
}
function objectHasProperties(object) {
for (var prop in object) {
if (object.hasOwnProperty(prop))
return true;
}
return false;
}
function getObjectPropertyCount(object){
let count = 0;
for (var prop in object) {
if (object.hasOwnProperty(prop))
count++;
}
return count;
}
async function LoadSettingsObj() {
var loadedSettings;
try{
loadedSettings = $.parseJSON(localStorage.getItem("beenThere_Settings"));
}
catch(err){
loadedSettings = null;
}
var defaultSettings = {
layerHistory: [],
LocLeft: "6px",
LocTop: "280px",
CP1: "#FDA400",
CP2: "#fd0303",
CP3: "#1303fd",
CP4: "#00fd22",
DrawShapeBorder: true,
FillShape: false,
NewBoxShortcut: "",
NewUserRectShortcut: "",
NewUserCircleShortcut: "",
RemoveLastShapeShortcut: "",
RedoLastShapeShortcut: "",
RemoveAllShapesShortcut: "",
SettingsLocTop: "40%",
SettingsLocLeft: "50%",
Groups: {"default": []},
CurrentGroup: "default",
layerVisible: true,
lastSaved: 0
};
beenTheresettings = $.extend({}, defaultSettings, loadedSettings);
let serverSettings = await WazeWrap.Remote.RetrieveSettings("BeenThere");
if(serverSettings && serverSettings.lastSaved > beenTheresettings.lastSaved)
$.extend(beenTheresettings, serverSettings);
if(parseInt(beenTheresettings.LocLeft.replace('px', '')) < 0)
beenTheresettings.LocLeft = "6px";
if(parseInt(beenTheresettings.LocTop.replace('px','')) < 0)
beenTheresettings.LocTop = "280px";
currColor = beenTheresettings.CP1;
if(beenTheresettings.layerHistory.length > 0){ //move our old layers into the default group
beenTheresettings.Groups.default = [...beenTheresettings.layerHistory];
beenTheresettings.layerHistory = [];
saveSettings();
}
}
function saveSettings() {
if (localStorage) {
var localsettings = {
layerHistory: beenTheresettings.layerHistory,
LocLeft: beenTheresettings.LocLeft,
LocTop: beenTheresettings.LocTop,
CP1: beenTheresettings.CP1,
CP2: beenTheresettings.CP2,
CP3: beenTheresettings.CP3,
CP4: beenTheresettings.CP4,
DrawShapeBorder: beenTheresettings.DrawShapeBorder,
FillShape: beenTheresettings.FillShape,
NewBoxShortcut: beenTheresettings.NewBoxShortcut,
NewUserRectShortcut: beenTheresettings.NewUserRectShortcut,
NewUserCircleShortcut: beenTheresettings.NewUserCircleShortcut,
RemoveLastShapeShortcut: beenTheresettings.RemoveLastShapeShortcut,
RedoLastShapeShortcut: beenTheresettings.RedoLastShapeShortcut,
RemoveAllShapesShortcut: beenTheresettings.RemoveAllShapesShortcut,
SettingsLocTop: beenTheresettings.SettingsLocTop,
SettingsLocLeft: beenTheresettings.SettingsLocLeft,
Groups: beenTheresettings.Groups,
CurrentGroup: beenTheresettings.CurrentGroup,
layerVisible: beenTheresettings.layerVisible,
lastSaved: Date.now()
};
if(parseInt(localsettings.LocLeft.replace('px', '')) < 0)
localsettings.LocLeft = "6px";
if(parseInt(localsettings.LocTop.replace('px','')) < 0)
localsettings.LocTop = "280px";
for (var name in W.accelerators.Actions) {
let TempKeys = "";
if (W.accelerators.Actions[name].group == 'wmebt') {
console.log(name);
if (W.accelerators.Actions[name].shortcut) {
if (W.accelerators.Actions[name].shortcut.altKey === true)
TempKeys += 'A';
if (W.accelerators.Actions[name].shortcut.shiftKey === true)
TempKeys += 'S';
if (W.accelerators.Actions[name].shortcut.ctrlKey === true)
TempKeys += 'C';
if (TempKeys !== "")
TempKeys += '+';
if (W.accelerators.Actions[name].shortcut.keyCode)
TempKeys += W.accelerators.Actions[name].shortcut.keyCode;
} else
TempKeys = "-1";
localsettings[name] = TempKeys;
}
}
localStorage.setItem("beenThere_Settings", JSON.stringify(localsettings));
WazeWrap.Remote.SaveSettings("BeenThere", localsettings);
}
}
function checkShortcutsChanged(){
let triggerSave = false;
for (let name in W.accelerators.Actions) {
let TempKeys = "";
if (W.accelerators.Actions[name].group == 'wmepie') {
if (W.accelerators.Actions[name].shortcut) {
if (W.accelerators.Actions[name].shortcut.altKey === true)
TempKeys += 'A';
if (W.accelerators.Actions[name].shortcut.shiftKey === true)
TempKeys += 'S';
if (W.accelerators.Actions[name].shortcut.ctrlKey === true)
TempKeys += 'C';
if (TempKeys !== "")
TempKeys += '+';
if (W.accelerators.Actions[name].shortcut.keyCode)
TempKeys += W.accelerators.Actions[name].shortcut.keyCode;
} else
TempKeys = "-1";
if(beenTheresettings[name] != TempKeys){
beenTheresettings[name] = TempKeys;
triggerSave = true;
break;
}
}
}
if(triggerSave)
saveSettings();
}
})();