// ==UserScript==
// @name WME Place Interface Enhancements
// @namespace https://greasyfork.dpdns.org/users/30701-justins83-waze
// @version 0.2.0
// @description Enhancements to various Place interfaces
// @include https://www.waze.com/editor/*
// @include https://www.waze.com/*/editor/*
// @include https://beta.waze.com/*
// @exclude https://www.waze.com/user/editor*
// @author JustinS83
// @grant none
// @require https://greasyfork.dpdns.org/scripts/24851-wazewrap/code/WazeWrap.js
// @license GPLv3
// ==/UserScript==
(function() {
'use strict';
var settings = {};
// Your code here...
function bootstrap(tries) {
tries = tries || 1;
if (window.W &&
window.W.map &&
window.W.model &&
$) {
init();
} else if (tries < 1000) {
setTimeout(function () {bootstrap(tries++);}, 200);
}
}
bootstrap();
function init(){
var $section = $("<div>", {style:"padding:8px 16px", id:"WMEPIESettings"});
$section.html([
'<b>WME Place Interface Enhancements</b>',
'<div class="controls-container" id="divAreaPlaceSizeControls">',
'<div id="divShowAreaPlaceSize" class="controls-container"><input type="checkbox" id="_cbShowAreaPlaceSize" class="pieSettingsCheckbox" /><label for="_cbShowAreaPlaceSize">Show area Place size</label></div>',
'<div id="divShowAreaPlaceSizeImperial"class="controls-container" style="padding-left:30px;"><input type="checkbox" id="_cbShowAreaPlaceSizeImperial" class="pieSettingsCheckbox" disabled /><label for ="_cbShowAreaPlaceSizeImperial"> Show imperial </label></div>',
'<div id="divShowAreaPlaceSizeMetric" class="controls-container" style="padding-left:30px;"><input type="checkbox" id="_cbShowAreaPlaceSizeMetric" class="pieSettingsCheckbox" disabled /><label for ="_cbShowAreaPlaceSizeMetric"> Show metric</label></div>',
'</div>',
'<div class="controls-container" id="divShowLockButtonsRPP"><input type="checkbox" id="_cbShowLockButtonsRPP" class="pieSettingsCheckbox" /><label for="_cbShowLockButtonsRPP">Show lock buttons for RPPs</label></div>',
'<div class="controls-container" id="divPlaceMenuCustomization>',
'</div>'
].join(' '));
new WazeWrap.Interface.Tab('PIE', $section.html(), init2);
}
function init2(){
//First load settings
loadSettings();
//Second set up event handlers
$('#_cbShowAreaPlaceSize').change(function() {
if(this.checked) {
attachPlaceSizeHandlers();
updatePlaceSizeDisplay();
$('#_cbShowAreaPlaceSizeImperial')[0].disabled = false;
$('#_cbShowAreaPlaceSizeMetric')[0].disabled = false;
}
else
{
removePlaceSizeHandlers();
$('#AreaSize').remove();
$('#_cbShowAreaPlaceSizeImperial')[0].disabled = true;
$('#_cbShowAreaPlaceSizeMetric')[0].disabled = true;
}
});
$('#_cbShowLockButtonsRPP').change(function() {
if(this.checked) {
attachRPPLockButtonHandlers();
}
else
{
$('#RPPOptionPlaceLockButtonsContainer').remove();
W.selectionManager.events.unregister("selectionchanged", null, addLockButtons);
W.model.actionManager.events.unregister("afterundoaction",null, addLockButtons);
W.model.actionManager.events.unregister("afterclearactions",null, addLockButtons);
W.model.actionManager.events.unregister("afteraction",null, addLockButtons);
}
});
//Third load settings to interface
setChecked('_cbShowAreaPlaceSize', settings.ShowAreaPlaceSize);
setChecked('_cbShowAreaPlaceSizeImperial', settings.ShowAreaPlaceSizeImperial);
setChecked('_cbShowAreaPlaceSizeMetric', settings.ShowAreaPlaceSizeMetric);
setChecked('_cbShowLockButtonsRPP', settings.ShowLockButtonsRPP);
if(settings.ShowAreaPlaceSize){
$('#_cbShowAreaPlaceSizeImperial')[0].disabled = false;
$('#_cbShowAreaPlaceSizeMetric')[0].disabled = false;
attachPlaceSizeHandlers();
}
if(settings.ShowLockButtonsRPP)
attachRPPLockButtonHandlers();
$('.pieSettingsCheckbox').change(function() {
var settingName = $(this)[0].id.substr(3);
settings[settingName] = this.checked;
saveSettings();
});
}
function attachRPPLockButtonHandlers(){
$('#RPPOptionPlaceLockButtonsContainer').remove();
W.selectionManager.events.register("selectionchanged", null, addLockButtons);
W.model.actionManager.events.register("afterundoaction",null, addLockButtons);
W.model.actionManager.events.register("afterclearactions",null, addLockButtons);
W.model.actionManager.events.register("afteraction",null, addLockButtons);
}
function attachPlaceSizeHandlers(){
W.selectionManager.events.register("selectionchanged", null, updatePlaceSizeDisplay);
W.model.actionManager.events.register("afteraction",null, updatePlaceSizeDisplay);
W.model.actionManager.events.register("afterundoaction",null, updatePlaceSizeDisplay);
W.model.actionManager.events.register("afterclearactions",null, updatePlaceSizeDisplay);
W.model.actionManager.events.register("noActions",null, noActions);
updatePlaceSizeDisplay();
}
function removePlaceSizeHandlers(){
W.selectionManager.events.unregister("selectionchanged", null, updatePlaceSizeDisplay);
W.model.actionManager.events.unregister("afteraction",null, updatePlaceSizeDisplay);
W.model.actionManager.events.unregister("afterundoaction",null, updatePlaceSizeDisplay);
W.model.actionManager.events.unregister("afterclearactions",null, updatePlaceSizeDisplay);
W.model.actionManager.events.unregister("noActions",null, noActions);
}
function isChecked(checkboxId) {
return $('#' + checkboxId).is(':checked');
}
function setChecked(checkboxId, checked) {
$('#' + checkboxId).prop('checked', checked);
}
function noActions(){
setTimeout(updatePlaceSizeDisplay, 100 ); //have to put in a delay for when the user uses undo to clear all actions - WME updates on top of my changes otherwise.
}
function updatePlaceSizeDisplay(){
var count = W.selectionManager.selectedItems.length;
var metersArea = 0;
var bold = false;
if(count === 1){
var venue = W.selectionManager.selectedItems[0];
var isArea = venue.geometry.toString().match(/^POLYGON/);
//var isPoint = venue.geometry.toString().match(/^POINT/);
if(venue.model.type === "venue" && isArea){
if($('#AreaSize'))
$('#AreaSize').remove();
metersArea = W.selectionManager.selectedItems[0].model.geometry.getGeodesicArea(W.map.getProjectionObject());
if(metersArea > 0 && isArea){
var ftArea = Math.round(metersArea * 10.76391 *100)/100;
var list = $('#landmark-edit-general > ul')[0];
var newList = document.createElement("UL");
newList.id = "AreaSize";
var newItem = document.createElement("LI");
if(isChecked("_cbShowAreaPlaceSizeMetric")){
newItem.innerHTML = "Area: " + metersArea.toFixed(2) + " m<sup>2</sup>";
newList.append(newItem);
}
if(isChecked("_cbShowAreaPlaceSizeImperial")){
newItem = document.createElement("LI");
newItem.innerHTML = "Area: " + ftArea.toFixed(2) + " ft<sup>2</sup>";
newList.append(newItem);
}
if(metersArea < 500){
newItem = document.createElement("LI");
newItem.innerHTML = "<span style='color:red; font-weight:bold;'>Places smaller than 500 m<sup>2</sup>/5382 ft<sup>2</sup> will not show in the client</span>";
newList.append(newItem);
}
list.before(newList);
$('#AreaSize').addClass("list-unstyled");
$('#AreaSize').addClass("additional-attributes");
}
}
}
}
function loadSettings() {
var loadedSettings = $.parseJSON(localStorage.getItem("WMEPIE_Settings"));
var defaultSettings = {
ShowAreaPlaceSize: false,
ShowAreaPlaceSizeImperial: false,
ShowAreaPlaceSizeMetric: false,
ShowLockButtonsRPP: true
};
settings = loadedSettings ? loadedSettings : defaultSettings;
for (var prop in defaultSettings) {
if (!settings.hasOwnProperty(prop))
settings[prop] = defaultSettings[prop];
}
if(settings.ShowAreaPlaceSizeImperial === false && settings.ShowAreaPlaceSizeMetric === false)
if(Waze.prefs.attributes.isImperial)
settings.ShowAreaPlaceSizeImperial = true;
else
settings.ShowAreaPlaceSizeMetric = true;
}
function saveSettings() {
if (localStorage) {
var localsettings = {
ShowAreaPlaceSize: settings.ShowAreaPlaceSize,
ShowAreaPlaceSizeImperial: settings.ShowAreaPlaceSizeImperial,
ShowAreaPlaceSizeMetric: settings.ShowAreaPlaceSizeMetric,
ShowLockButtonsRPP: settings.ShowLockButtonsRPP
};
localStorage.setItem("WMEPIE_Settings", JSON.stringify(localsettings));
}
}
//Using the same display for lock buttons as ClickSaver (with permission from MapoMatic) - thanks MoM!
function addLockButtons() {
if(W.selectionManager.selectedItems.length > 0){
var item = W.selectionManager.selectedItems[0];
var isRPP = (item.model.type === "venue" && item.model.attributes.residential === true);
if(isRPP){
console.log("adding!!!");
var attr = item.model.attributes;
var autoRank = attr.rank;
var manualRank = attr.lockRank;
var firstManualRank = manualRank;
var userRank = WazeWrap.User.Rank() - 1;
var maxAutoRank = autoRank;
var disabled = false;
var $div = $('#RPPOptionPlaceLockButtonsContainer');
$div.remove();
$div = $('<div>',{id:'RPPOptionPlaceLockButtonsContainer',style:'margin-bottom:5px;'});
$div.append('<label class="control-label">Lock</label>');
var btnInfos = [];
for(var iBtn=0;iBtn<=6;iBtn++){btnInfos.push({r:iBtn,val:iBtn});}
btnInfos.forEach(function(btnInfo){
var selected = (btnInfo.val === manualRank);
disabled = userRank < btnInfo.val;
if (btnInfo.val !== 6) {
$div.append(
$('<div>', {
class:'btn btn-lh' + (selected ? ' btn-lh-selected':'') + (btnInfo.r < 6 & (userRank < btnInfo.r || disabled) ? ' disabled' : '')
})
.text(btnInfo.hasOwnProperty('title') ? btnInfo.title : btnInfo.r + 1)
.data('val',btnInfo.hasOwnProperty('val') ? btnInfo.val : btnInfo.r + 1)
.hover(function() {})
.click(function() {
if((userRank >= $(this).data('val')) && (btnInfo.r < 6)) {
W.model.actionManager.add(new UpdateObject(item.model,{lockRank:($(this).data('val'))}));
addLockButtons();
}
})
);
}
});
$('#landmark-edit-general > div').after($div);
}
}
}
function listPlaces(){
var category = "";
for(i=0; i<W.Config.venues.categories.length; i++){
category = W.Config.venues.categories[i];
console.log(category + " Main");
var subCategories = W.Config.venues.subcategories[category];
for(var j=0; j<subCategories.length;j++){
console.log(subCategories[j]);
}
}
}
})();