WME Fix UI

Allows alterations to the WME UI to fix things screwed up or ignored by Waze

Per 20-10-2017. Zie de nieuwste versie.

// ==UserScript==
// @name                WME Fix UI
// @namespace           https://greatest.deepsurf.us/en/users/46070
// @description         Allows alterations to the WME UI to fix things screwed up or ignored by Waze
// @include             https://www.waze.com/editor*
// @include             https://www.waze.com/*/editor*
// @include             https://beta.waze.com/editor*
// @include             https://beta.waze.com/*/editor*
// @exclude             https://www.waze.com/*user/editor/*
// @supportURL          https://www.waze.com/forum/viewtopic.php?f=819&t=191178
// @version             2.0beta1
// @grant               none
// ==/UserScript==

// Thanks to (in no particular order)
//    Bellhouse, Twister-UK, Timbones, Dave2084, Rickzabel, Glodenox,
//    JJohnston84, SAR85, Cardyin

(function()
{
// global variables
var wmefu_version = "2.0beta1";
var oldVersion;
var prefix = "WMEFU";
var tabAttempts = 0;
var wmeFUAddon;
var debug = false;
var wmeFUinitialising = true;
var URLSegments;
var URLSegmentCount;
var UIver;
//Fix for date/time formats in WME released Oct/Nov 2016 - provided by Glodenox
I18n.translations[I18n.currentLocale()].time = {};
I18n.translations[I18n.currentLocale()].time.formats = {};
I18n.translations[I18n.currentLocale()].time.formats.long = "%a %b %d %Y, %H:%M";
I18n.translations[I18n.currentLocale()].date.formats = {};
I18n.translations[I18n.currentLocale()].date.formats.long = "%a %b %d %Y, %H:%M";
I18n.translations[I18n.currentLocale()].date.formats.default = "%a %b %d %Y";
if (I18n.currentLocale() == 'en-GB') {
  I18n.translations['en-GB'].update_requests.panel.reported = 'Reported on: %{date}';
}
// Set the "Chat is here!" message to be hidden
if (localStorage.hiddenMessages) {
	var hm = JSON.parse(localStorage.hiddenMessages);
	if (hm.chat_intro_tip === false) {
		logit("Hiding Chat is Here! message","info");
		hm.chat_intro_tip = true;
		localStorage.setItem('hiddenMessages', JSON.stringify(hm));
	}
}

function init1() {
	console.group(prefix + ": initialising...");
	console.time(prefix + ": initialisation time");
	logit("Starting init1","debug");
	// go round again if map container isn't there yet
	if(!window.Waze.map) {
		logit("waiting for WME...","warning");
		setTimeout(init1, 200);
		return;
	}
	// identify WME version by checking for an item that no longer appears in the new version
	UIver = ((document.getElementById("input-overlay") === null) ? "new" : "old");
	// create tab content and store it
	wmeFUAddon = createAddon();
	// insert the content as a tab
	addMyTab(null,0);
	//pass control to init2
	init2();
}

function init2() {
	logit("Starting init2","debug");
	//go round again if my tab isn't there yet
	if (!getId('sidepanel-FixUI')) {
		logit("Waiting for my tab to appear...","warning");
		setTimeout(init2, 200);
		return;
	}
	//test for 2017 UI
	logit("UI version is " + UIver, "info");
	// setup event handlers for my controls:
	getId('_cbMoveZoomBar').onclick = moveZoomBar;
	getId('_cbShrinkTopBars').onclick = shrinkTopBars;
	getId('_cbHideUserInfo').onclick = hideUserInfo;
	getId('_cbCompressSegmentTab').onclick = compressSegmentTab;
	getId('_cbRestyleReports').onclick = restyleReports;
	getId('_cbNarrowSidePanel').onclick = narrowSidePanel;
	getId('_cbHideAveSpeedControls').onclick = hideAveSpeedControls;
	getId('_cbAddZoomIndicator').onclick = addZoomIndicator;
	getId('_cbFixExternalProviders').onclick = fixExternalProviders;
	getId('_cbClickablePlaceAddress').onclick = hideAveSpeedControls;
	getId('_cbCompressLayersMenu').onclick = compressLayersMenu;
	getId('_cbMoveChatIcon').onclick = moveChatIcon;
	getId("_inpASX").onchange = shiftAerials;
	getId("_inpASX").onwheel = shiftAerials;
	getId("_inpASY").onchange = shiftAerials;
	getId("_inpASY").onwheel = shiftAerials;
	getId("_inpASO").onchange = shiftAerials;
	getId("_inpASO").onwheel = shiftAerials;
	getId("_resetAS").onclick = function() {
		 _inpASX.value = 0;
		 _inpASY.value = 0;
		 shiftAerials();
		};
	getId("_inpGSVContrast").onchange = adjustGSV;
	getId("_inpGSVBrightness").onchange = adjustGSV;
	getId("_cbGSVInvert").onchange = adjustGSV;
	if (UIver=='new') {
		getId("_inpUICompression").onchange = applyEnhancements;
		getId("_inpUIContrast").onchange = applyEnhancements;
	}

	//REGISTER WAZE EVENT HOOKS
	// event to recreate my tab when MTE mode is exited
	Waze.app.modeController.model.bind('change:mode', addMyTab);
	// events for Aerial Shifter
	Waze.map.events.register("zoomend", null, shiftAerials);
	Waze.map.events.register("moveend", null, shiftAerials);
	Waze.map.baseLayer.events.register("loadend", null, shiftAerials);
	// event to deal with ASC controls and make place address clickable
	Waze.selectionManager.events.register("selectionchanged", null, hideAveSpeedControls);
	// event to change menu bar color based on map comments checkbox
	Waze.map.events.register("zoomend", null, warnCommentsOff);
	Waze.map.events.register("moveend", null, warnCommentsOff);

	// overload the window unload function to save my settings
	window.addEventListener("beforeunload", saveSettings, false);

	loadSettings();
	// Add an extra checkbox so I can test segment panel changes easily
	if (Waze.loginManager.user.userName == 'iainhouse') {
		logit("creating segment detail debug checkbox","info");
		var brand = getId('brand');
		extraCBSection = document.createElement('p');
		extraCBSection.innerHTML = '<input type="checkbox" id="_cbextraCBSection" />';
		brand.appendChild(extraCBSection);
		getId('_cbextraCBSection').onclick = FALSEcompressSegmentTab;
		_cbextraCBSection.checked = _cbCompressSegmentTab.checked;
	}
	// warn of permalink segments not all selected
	URLSegments = window.location.search.match(new RegExp("[?&]segments?=([^&]*)"));
	if (URLSegments) {
		URLSegmentCount = URLSegments[1].split(',').length;
		if (Waze.selectionManager.selectedItems.length > 0) {
			permalinkCheck();
		} else {
			Waze.selectionManager.events.register("selectionchanged", null, permalinkCheck);
		}
	}

	// Alert to new version
	if (oldVersion != wmefu_version) {
		alert("WME Fix UI has been updated to version " + wmefu_version +
		"\n" +
		"\nVersion 2.0beta1 - 2017-10-20" +
		"\n" +
		"\n* Changes for Beta WME version only. Production WME not affected." +
		"\n");
		saveOptions();
	}

	// fix for sidebar display problem in Safari, requested by edsonajj
	var isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
	if (isSafari) {
		addGlobalStyle('.flex-parent { height: 99% !important; }');
	}

	// apply the settings
	shiftAerials();
	setTimeout(applyAllSettings, 2000);
	logit("Initialisation complete");
	console.timeEnd(prefix + ": initialisation time");
	console.groupEnd();
}

function createAddon() {
	//create the contents of my side-panel tab
	var addon = document.createElement('section');
	var section = document.createElement('p');
	addon.id = "sidepanel-FixUI";
	section.style.paddingTop = "0px";
	section.style.lineHeight = "16px";
	section.id = "fuContent";
	section.innerHTML = ""
	section.innerHTML += '<b>UI Fixes/changes</b><br>';
	section.innerHTML += '<input type="checkbox" id="_cbMoveZoomBar" /> ' +
			'<span title="Because nobody likes a pointless UI change that breaks your workflow,\nimposed by idiots who rarely use the editor and don\'t listen to feedback">Move zoom bar to left</span><br>';
	section.innerHTML += '<input type="checkbox" id="_cbAddZoomIndicator" /> ' +
			'<span title="Yes - I stole the idea from WME Toolbox. But mine is clearer and takes up no extra room ;)">Add zoom level indicator to zoom bar</span><br>';
	section.innerHTML += '<input type="checkbox" id="_cbHideUserInfo" /> ' +
			'<span title="Because we can earn points quicker without a massive chunk of space\nwasted on telling us how many we earnt up to yesterday">Hide user info in the side panel</span><br>';
	section.innerHTML += '<input type="checkbox" id="_cbHideAveSpeedControls" /> ' +
			'<span title="If you don\'t have these in your country, YOU\'RE LUCKY!\nBut don\'t forget you\'ve disabled this - they\'ll be coming soon!">Hide average speed camera controls</span><br>';
	section.innerHTML += '<input type="checkbox" id="_cbFixExternalProviders" /> ' +
			'<span title="The External Providers interface is really poor - you can rarely see all of the\ndetails in the box provided and the other elements are poorly arranged.\nThis fixes all that.">Expand & improve External Provider details for places</span><br>';
	section.innerHTML += '<input type="checkbox" id="_cbClickablePlaceAddress" /> ' +
			'<span title="For segments, the entire address is a clickable button to edit - for places, only the small pencil icon. \nThis fixes that inconsistency and also gives the correct mouse pointer.">Make the entire place address clickable</span><br>';
	section.innerHTML += '<input type="checkbox" id="_cbPermalinkChecker" /> ' +
			'<span title="If a permalink is created with off-screen segments or segment IDs have been changed,\nWME may open with fewer segments selected than are included in the permalink.\nThis causes a pop-up warning when that happens.">Warn on invalid permalinks</span><br>';
	section.innerHTML += '<input type="checkbox" id="_cbMoveChatIcon" /> ' +
			'<span title="Here\'s a truly outstanding example of making a stupid change to the UI in order to\ndeal with another stupid change to the UI!\nBecause HQ couldn\'t make the new layers menu auto-hide, they moved the chat icon.\nTick this box to put it back where it belongs.">Move Chat icon back to right</span><br>';
	section.innerHTML += '<input type="checkbox" id="_cbLayersMenuMoreOptions" /> ' +
			'<span title="As requested by users, this option turns on the More Options in the Layers menu.\nNote that this option only has an effect when the page is loaded. You can still toggle as normal.">Turn on More Options in Layers menu</span><br>';
	section.innerHTML += '<br>';
	section.innerHTML += '<b>UI Enhancements</b><br>';
	section.innerHTML += '<input type="checkbox" id="_cbShrinkTopBars" /> ' +
			'<span title="Because we can\'t afford to waste screen space, particularly on\nstuff we didn\'t ask for and don\'t want, like the black bar">Shrink bars above the map</span><br>';
	section.innerHTML += '<input type="checkbox" id="_cbCompressSegmentTab" /> ' +
			'<span title="Because I\'m sick of having to scroll the side panel because of oversized fonts and wasted space">Compress' + (UIver=='new' ? '/enhance' : '') + ' side panel contents</span><br>';
	section.innerHTML += '<input type="checkbox" id="_cbCompressLayersMenu" /> ' +
			'<span title="Because it\'s already too big for small screens and Waze only plan to make it bigger">Compress' + (UIver=='new' ? '/enhance' : '') + ' layers menu</span><br>';
	section.innerHTML += '<input type="checkbox" id="_cbRestyleReports" /> ' +
			'<span title="Another UI element configured for developers with massive screens instead of normal users">Compress' + (UIver=='new' ? '/enhance' : '') + ' report panels (UR/MP)</span><br>';
	section.innerHTML += '<input type="checkbox" id="_cbNarrowSidePanel" /> ' +
			'<span title="If you have a netbook, Waze isn\'t interested in your experience.\nYou need every bit of map space you can get - so have a present from me!">Reduce width of the side panel</span><span title="This will definitely interfere with scripts that rely on a fixed width for their tab contents." style="font-size: 16px; color: red;">&#9888</span><br>';
	if (UIver == "new") {
		section.innerHTML += '<br>';
		section.innerHTML += '<b title="Control the amount of compression/enhancment">UI Enhancement controls<br>';
		section.innerHTML += '<div style="display:inline-block"><input type="number" id="_inpUICompression" title="Compression enhancement" max=2 min=0 step=1 style="height:20px; width:35px;text-align:center;"/>&nbsp;<span class="fa fa-compress"></span></div>&nbsp;&nbsp;&nbsp;&nbsp;';
		section.innerHTML += '<div style="display:inline-block"><input type="number" id="_inpUIContrast" title="Contrast enhancement" max=2 min=0 step=1 style="height:20px; width:35px;text-align:center;"/>&nbsp;<span class="fa fa-adjust"></span></div>';
		section.innerHTML += '<br>';
		section.innerHTML += '<br>';
	}
	section.innerHTML += '<b title="Shift aerial images layer to match GPS tracks and reduce image opacity">Aerial Shifter</b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
	section.innerHTML += '<span class="fa fa-power-off" id="_resetAS" title="Clear X/Y offsets"></span><br>';
	section.innerHTML += '<div style="display:inline-block"><input type="number" id="_inpASX" title="horizontal shift" max=100 min=-100 step=5 style="height:20px; width:47px;text-align:right;"/><b>m</b><span class="fa fa-arrow-right"></span></div>';
	section.innerHTML += '<div id="as2" style="display:inline-block;padding:0 5px;"><input type="number" id="_inpASY" title="vertical shift" max=100 min=-100 step=5 style="height:20px; width:47px;text-align:right;"/><b>m</b><span class="fa fa-arrow-up"></span></div>';
	section.innerHTML += '<div id="as3" style="display:inline-block"><input type="number" id="_inpASO" title="opacity" max=100 min=0 step=10 style="height:20px; width:44px;text-align:right;"/><b>%</b><span class="fa fa-adjust"></span></div>';
	section.innerHTML += '<br>';
	section.innerHTML += '<br>';

	section.innerHTML += '<b title="Adjust contrast & brightness for Google Street View images">GSV image adjust</b><br>';
	section.innerHTML += '<span title="Contrast"><input type="number" id="_inpGSVContrast" max=200 min=0 step=25 style="height:20px; width:47px;text-align:right;"/><b>%</b><span class="fa fa-adjust"></span></span>&nbsp;&nbsp;';
	section.innerHTML += '<span title="Brightness"><input type="number" id="_inpGSVBrightness" max=200 min=0 step=25 style="height:20px; width:47px;text-align:right;"/><b>%</b><span class="fa fa-sun-o"></span></span>&nbsp;&nbsp;&nbsp;';
	section.innerHTML += '<span title="Invert colours"><input type="checkbox" id="_cbGSVInvert"/><span class="fa fa-tint"></span></span>';

	section.innerHTML += '<br>';
	section.innerHTML += '<br>';
	section.innerHTML += '<b><a href="https://www.waze.com/forum/viewtopic.php?f=819&t=191178" title="Forum topic" target="_blank"><u>' +
			'WME Fix UI</u></a></b> &nbsp; v' + wmefu_version;
	addon.appendChild(section);
	addon.className = "tab-pane";
	return addon;
}

function addMyTab(model,modeID) {
	if (modeID === 0) {
		logit("entering default mode, so creating tab");
		tabAttempts = 0;
		tabsLooper();
	} else {
		logit("entering event mode, so not initialising");
		return;
	}
}

function tabsLooper() {
	tabAttempts += 1;
	if (tabAttempts > 20) {
		// tried 20 times to create tab without luck
		logit("unable to create my tab after 20 attempts","error");
		return;
	}
	var userTabs = getId('user-info');
	var navTabs = getElementsByClassName('nav-tabs', userTabs)[0];
	if (typeof navTabs === "undefined") {
		//the basic tabs aren't there yet, so I can't add mine
		logit("waiting for NavTabs","warning");
		setTimeout(tabsLooper, 200);
	} else{
		var tabContent = getElementsByClassName('tab-content', userTabs)[0];
		newtab = document.createElement('li');
		newtab.innerHTML = '<a href="#sidepanel-FixUI" data-toggle="tab" title="Fix UI">FU</a>';
		navTabs.appendChild(newtab);
		tabContent.appendChild(wmeFUAddon);
	}
}

function loadSettings() {
	var fname = arguments.callee.toString().match(/function ([^\(]+)/)[1];
	logit("function " + fname + " called", "debug");
	// Convert old version of settings to new version
	if (localStorage.WMEFixUI) {
		oldSettings = JSON.parse(localStorage.WMEFixUI);
		newSettings = {};
		newSettings.oldVersion = (oldSettings[0] ? oldSettings[0] : "1.0" );
		newSettings.moveZoomBar = (oldSettings[1] ? oldSettings[1] : true );
		newSettings.shrinkTopBars = (oldSettings[2] ? oldSettings[2] : true );
		newSettings.hideUserInfo = (oldSettings[3] ? oldSettings[3] : true );
		newSettings.restyleSidePanel = (oldSettings[4] ? oldSettings[4] : true );
		newSettings.restyleReports = (oldSettings[5] ? oldSettings[5] : true );
		newSettings.narrowSidePanel = (oldSettings[7] ? oldSettings[7] : false );
		newSettings.hideASCControls = (oldSettings[8] ? oldSettings[8] : false );
		newSettings.addZoomIndicator = (oldSettings[9] ? oldSettings[9] : true );
		newSettings.aerialShiftX = (oldSettings[10] ? oldSettings[10] : 0 );
		newSettings.aerialShiftY = (oldSettings[11] ? oldSettings[11] : 0 );
		newSettings.aerialOpacity = (oldSettings[12] ? oldSettings[12] : 100 );
		newSettings.fixExternalProviders = (oldSettings[13] ? oldSettings[13] : true );
		newSettings.GSVContrast = (oldSettings[14] ? oldSettings[14] : 100 );
		newSettings.GSVBrightness = (oldSettings[15] ? oldSettings[15] : 100 );
		newSettings.GSVInvert = (oldSettings[16] ? oldSettings[16] : false );
		newSettings.clickablePlaceAddress = (oldSettings[17] ? oldSettings[17] : true );
		newSettings.permalinkChecker = (oldSettings[18] ? oldSettings[18] : true );
		newSettings.restyleLayersMenu = (oldSettings[19] ? oldSettings[19] : true );
		newSettings.moveChatIcon = (oldSettings[20] ? oldSettings[20] : true );
		// setting[21] was Menu Autohide - no longer needed
		newSettings.layersMenuMore = (oldSettings[22] ? oldSettings[22] : true );
		localStorage.WMEFUSettings = JSON.stringify(newSettings);
		localStorage.removeItem("WMEFixUI");
	}

	if (localStorage.WMEFUSettings) {
		options = JSON.parse(localStorage.WMEFUSettings);
	} else {
		options = {};
	}
	oldVersion = (options.oldVersion !== undefined ? options.oldVersion : "0.0");
	getId('_cbMoveZoomBar').checked = (options.moveZoomBar !== undefined ? options.moveZoomBar : true);
	getId('_cbShrinkTopBars').checked = (options.shrinkTopBars !== undefined ? options.shrinkTopBars : true);
	getId('_cbHideUserInfo').checked = ( options.hideUserInfo !== undefined ? options.hideUserInfo : true);
	getId('_cbCompressSegmentTab').checked = ( options.restyleSidePanel !== undefined ? options.restyleSidePanel : true);
	getId('_cbRestyleReports').checked = ( options.restyleReports !== undefined ? options.restyleReports : true);
	getId('_cbNarrowSidePanel').checked = ( options.narrowSidePanel !== undefined ? options.narrowSidePanel : false);
	getId('_cbHideAveSpeedControls').checked = ( options.hideASCControls !== undefined ? options.hideASCControls : false);
	getId('_cbAddZoomIndicator').checked = ( options.addZoomIndicator !== undefined ? options.addZoomIndicator : true);
	getId('_inpASX').value = ( options.aerialShiftX !== undefined ? options.aerialShiftX : 0);
	getId('_inpASY').value = ( options.aerialShiftY !== undefined ? options.aerialShiftY : 0);
	getId('_inpASO').value = ( options.aerialOpacity !== undefined ? options.aerialOpacity : 100);
	getId('_cbFixExternalProviders').checked = ( options.fixExternalProviders !== undefined ? options.fixExternalProviders : true);
	getId('_inpGSVContrast').value = ( options.GSVContrast !== undefined ? options.GSVContrast : 100);
	getId('_inpGSVBrightness').value = ( options.GSVBrightness !== undefined ? options.GSVBrightness : 100);
	getId('_cbGSVInvert').checked = ( options.GSVInvert !== undefined ? options.GSVInvert : false);
	getId('_cbClickablePlaceAddress').checked = ( options.clickablePlaceAddress !== undefined ? options.clickablePlaceAddress : true);
	getId('_cbPermalinkChecker').checked = ( options.permalinkChecker !== undefined ? options.permalinkChecker : true);
	getId('_cbCompressLayersMenu').checked = ( options.restyleLayersMenu !== undefined ? options.restyleLayersMenu : true);
	getId('_cbMoveChatIcon').checked = ( options.moveChatIcon !== undefined ? options.moveChatIcon : true);
	getId('_cbLayersMenuMoreOptions').checked = ( options.layersMenuMore !== undefined ? options.layersMenuMore : true);
	if (UIver == "new") {
		getId('_inpUIContrast').value = ( options.UIContrast !== undefined ? options.UIContrast : 1);
		getId('_inpUICompression').value = ( options.UICompression !== undefined ? options.UICompression : 1);
	}
}

function saveSettings() {
	var fname = arguments.callee.toString().match(/function ([^\(]+)/)[1];
	logit("function " + fname + " called", "debug");
	if (localStorage) {
		logit("saving options to local storage");
		alert("saving options");
		var options = {};
		options.oldVersion = wmefu_version;
		options.moveZoomBar = getId('_cbMoveZoomBar').checked;
		options.shrinkTopBars = getId('_cbShrinkTopBars').checked;
		options.hideUserInfo = getId('_cbHideUserInfo').checked;
		options.restyleSidePanel = getId('_cbCompressSegmentTab').checked;
		options.restyleReports = getId('_cbRestyleReports').checked;
		options.narrowSidePanel = getId('_cbNarrowSidePanel').checked;
		options.hideASCControls = getId('_cbHideAveSpeedControls').checked;
		options.addZoomIndicator = getId('_cbAddZoomIndicator').checked;
		options.aerialShiftX = getId('_inpASX').value;
		options.aerialShiftY = getId('_inpASY').value;
		options.aerialOpacity = getId('_inpASO').value;
		options.fixExternalProviders = getId('_cbFixExternalProviders').checked;
		options.GSVContrast = getId('_inpGSVContrast').value;
		options.GSVBrightness = getId('_inpGSVBrightness').value;
		options.GSVInvert = getId('_cbGSVInvert').checked;
		options.clickablePlaceAddress = getId('_cbClickablePlaceAddress').checked;
		options.permalinkChecker = getId('_cbPermalinkChecker').checked;
		options.restyleLayersMenu = getId('_cbCompressLayersMenu').checked;
		options.moveChatIcon = getId('_cbMoveChatIcon').checked;
		options.layersMenuMore = getId('_cbLayersMenuMoreOptions').checked;
		if (UIver == "new") {
			options.UIContrast = getId('_inpUIContrast').value;
			options.UICompression = getId('_inpUICompression').value;
		}
		localStorage.WMEFUSettings = JSON.stringify(options);
	}
}

function applyAllSettings() {
	var fname = arguments.callee.toString().match(/function ([^\(]+)/)[1];
	logit("function " + fname + " called", "debug");
	console.group(prefix + ": applying all settings");
		moveZoomBar();
		shrinkTopBars();
		hideUserInfo();
		compressSegmentTab();
		restyleReports();
		narrowSidePanel();
		hideAveSpeedControls();
		fixExternalProviders();
		addZoomIndicator();
		warnCommentsOff();
		adjustGSV();
		compressLayersMenu();
		moveChatIcon();
//		layersMenuAutoHide();
	console.groupEnd();
	if (getId('_cbLayersMenuMoreOptions').checked === true) {
		$("#toolbar > div > div.layer-switcher-container > div > div > div > div > div.menu > div.more-options-toggle > label > div").click();
	}
	wmeFUinitialising = false;
}

function applyEnhancements() {
	var fname = arguments.callee.toString().match(/function ([^\(]+)/)[1];
	logit("function " + fname + " called", "debug");
	shrinkTopBars();
	compressSegmentTab();
	restyleReports();
	compressLayersMenu();
}

function moveZoomBar() {
	// Now functioning correctly for prod & beta
	var fname = arguments.callee.toString().match(/function ([^\(]+)/)[1];
	logit("function " + fname + " called", "debug");
	if (_cbMoveZoomBar.checked) {
		var styles = "";
		if (UIver == "old") {
			styles += '.olControlPanZoomBar { left: 10px; width: 30px; }';
			// shift UR/MP panel to the right
			styles += '#panel-container > div { left: 40px; }';
		} else {
			styles += '.olControlPanZoomBar { left: 10px; top: 40px; }';
			styles += '.street-view-control-container { bottom: -42px; }';
			styles += '.geolocation-control-container { bottom: -81px; }';
			// fix for WME Map Tiles Update script
			styles += '#Info_div { margin-top: 93px !important; }';
			// shift UR/MP panel to the right
			styles += '#panel-container > div { left: 40px; }';
		}
		addStyle(prefix + fname,styles);
	} else {
		removeStyle(prefix + fname);
	}	
}

function hideUserInfo() {
	// Now functioning correctly for prod & beta
	var fname = arguments.callee.toString().match(/function ([^\(]+)/)[1];
	logit("function " + fname + " called", "debug");
	var styles = "";
	// WME Panel Swap buttons - move them up if user info is hidden
	var PSButton1 = getId('WMEPS_UIButton');
	var PSButton2 = getId('WMEPS_EditButton');
	if (_cbHideUserInfo.checked) {
		styles += '#user-box { display: none; }';
		// extra fix for WME Panel Swap control (not working with new WME UI)
		if (PSButton1) { PSButton1.style.top = '-27px'; }
		if (PSButton2) { PSButton2.style.top = '-27px'; }
		addStyle(prefix + fname,styles);
	} else {
		if (PSButton1) { PSButton1.style.top = '0px'; }
		if (PSButton2) { PSButton2.style.top = '0px'; }
		removeStyle(prefix + fname);
	}
}

function shrinkTopBars() {
	var fname = arguments.callee.toString().match(/function ([^\(]+)/)[1];
	logit("function " + fname + " called", "debug");
	var styles = "";
	if (_cbShrinkTopBars.checked) {
		//shrink the blue tool bar
		styles += '.toolbar { height: 31px; }';
		styles += '#app-head { height: 31px; }';
		styles += '#search { padding-top: 1px; }';
		styles += '.toolbar .toolbar-button { padding: 2px 7px; }';
		styles += '.toolbar .toolbar-separator { height: 31px; }';
		styles += '#layer-switcher { height: 51px; }';
		styles += '.toolbar menu.dropdown-menu { top: 31px; }';
		styles += '.toolbar .menu { top: 31px; }';
		styles += '#layer-switcher .dropdown-menu { top: 31px; }';
		styles += '.layer-switcher .content { top: 31px; }';
		//extra tweaks for Toolbox button & layers menu
		styles += '.WazeControlLayerSwitcherIcon { margin: 5px 2px 0 !important; }';
		styles += '#WazeControlLayerSwitcherIconContainer { height: 51px !important; }';
		styles += '#WazeControlLayerSwitcherIconContainerBeta { height: 51px !important; }';
		if (document.body.dir != "rtl") {
			styles += '.WazeControlLayerSwitcherToolbox { margin-left: -92px !important; }';
		} else {
			styles += '.WazeControlLayerSwitcherToolbox { margin-left: 112px !important; }';
		}
		styles += '#sidebar waze-links { height: 16px; }';
		//shrink the black bar
		styles += 'div#topbar-container { position: relative; }';
		styles += '.topbar { position: absolute; z-index: 1; background: transparent; height: 0; color: white; text-shadow: -1px -1px 0 #000, 1px -1px #000, -1px 1px #000, 1px 1px #000; line-height: 1.1; }';
		styles += '.topbar .location-info { font-size: 15px; font-weight: 900; }';
		styles += '.topbar .area-managers .title, .topbar .area-managers .main-list { font-size: 15px; font-weight: 900; }';
		styles += '.olControlPanZoomBar { top: 32px; }';
		styles += '#panel-container .panel { top: 20px; }';
		// disable text shadow for the list of additional AMs
		styles += '#topbar-container > div > div > div.area-managers-region > div > div.rest-list-region > div > span > ul { text-shadow: none; }';
		// following line needed to move MTE menu over the WME Bookmarks pin control
		styles += '#mode-switcher .dropdown-menu { top: 30px; }';
		//fix for buttons of WME GIS script
		styles += '.btn-group-sm { text-shadow: initial; background: white; }';
		addStyle(prefix + fname,styles);
	} else {
		removeStyle(prefix + fname);
	}
	window.dispatchEvent(new Event('resize'));
}

function FALSEcompressSegmentTab() {
	_cbCompressSegmentTab.checked = _cbextraCBSection.checked;
	compressSegmentTab();
}

function compressSegmentTab() {
	var fname = arguments.callee.toString().match(/function ([^\(]+)/)[1];
	logit("function " + fname + " called", "debug");
	var styles = "";
	if (_cbCompressSegmentTab.checked) {
		// shrink address
		if (UIver == "old") {
			styles += '#edit-panel .primary-street { font-size: 14px; line-height: 15px; font-weight: 600; color: black; }';
			styles += '#edit-panel .address-edit-view .preview .address-edit-btn:not(.disabled) { background-color: #FFF9C4; }';
			styles += '#edit-panel .segment .address-edit-view, .edit-panel .segment .address-edit-view { margin-bottom: 5px; }';
			//shrink tabs
			styles += '#sidebar .nav-tabs>li {margin-top: 2px; }';
			styles += '#sidebar .nav-tabs li a { padding: 2px; }';
			styles += '#sidebar .nav-tabs { margin: 0 0 5px 0; padding-left: 4px; }';
			//reduce some vertical margins
			styles += '#edit-panel .contents { padding: 0 5px 0 5px; overflow: hidden; }';
			styles += '#edit-panel .form-group { margin-bottom: 2px; line-height: 1; font-size: 11px; }';
			styles += '#edit-panel .selection { margin-bottom: 5px; }';
			styles += '#sidebar .side-panel-section:not(:last-child) { margin-bottom: 2px; }';
			styles += '#sidebar .side-panel-section:not(:last-child)::after { margin-top: 5px; margin-bottom: 2px; }';
			styles += '#edit-panel .control-label { margin-bottom: 1px; }';
			styles += '#sidebar .controls-container { padding-top: 2px; }';
			styles += '#edit-panel .segment .speed-limit label { margin-bottom: 0px; }';
			styles += '#edit-panel .more-actions { padding-top: 2px; }';
			styles += '#edit-panel .segment .speed-limit .direction-label, #edit-panel .segment .speed-limit .unit-label { line-height: 2.1em; }';
			styles += '#sidebar .side-panel-section~.side-panel-section:not(:last-child):before { margin: 5px -20px !important; }';
			styles += '#sidebar .side-panel-section~.side-panel-section:not(:last-child) { margin-top: 5px !important; }';
			//shrink dropdown controls & buttons
			styles += '#edit-panel button, #edit-panel select, #edit-panel .form-control { font-size: 11px; height: 19px; padding: 0px 4px; }';
			styles += '#edit-panel .more-actions button:not(:last-of-type) { margin-bottom: 2px; }';
			styles += '.edit-closure .input-group-addon { padding: 2px 8px; }';
			//fit road property checkboxes on one line for all three (if text length allows)
			styles += '#edit-panel .controls-container { display: inline-block; }';
			styles += '#edit-panel .controls-container label { font-size: 12px; line-height: 18px; padding-left: 22px; }';
			styles += '#edit-panel .select-entire-street { width: 49%; overflow: hidden; }';
			styles += '#edit-panel .edit-house-numbers { width: 49%; overflow: hidden; }';
			styles += '#edit-panel .action-button { color: black; }';
			styles += '#edit-panel .categories .select2-container { margin-bottom: -5px; }';
			//tweak for speed camera checkbox having a left margin of -20px. Why?!
			styles += '#edit-panel .checkbox, .radio { margin-left: 20px; }';
			//tweaks for Closures tab
			styles += '#edit-panel .segment .segment-details { margin-bottom: 4px; }';
			styles += '.closures-list .closure-item .section { padding: 2px; }';
			styles += '.col-xs-6 { line-height: 14px; }';
			styles += '.closures-list .direction { margin-bottom: 0px; }';
			styles += '.closures-list .closure-item:not(:last-child) { margin-bottom: 4px; }';
			//tweak required for Speedhelper script
			styles += 'div[id^="spd_"] { line-height: 1.43; }';
			//tweaks for Feed tab
			styles += '.feed-item { margin-bottom: 2px; }';
			styles += '.feed-item .inner { padding: 2px; }';
			styles += '.feed-item .delete { zoom: 149%; }';
			styles += '.feed-item .motivation { margin-bottom: 0px; }';
			styles += '.feed-item .content .title { margin-bottom: 0px; }';
			styles += '.feed-item .content .subtext { font-size: 11px; }';
			//tweaks for Drives tab
			styles += '#sidebar .message { margin-bottom: 0px; line-height: 14px; }';
			styles += '#sidebar .result-list .result { padding: 2px 5px; }';
			//tweaks for Restrictions dialogue
			styles += '#schedule-modal .modal-body { padding: 2px 8px; }';
			styles += '#schedule-modal .items { line-height: 0.5; }';
			styles += '#schedule-modal .table { margin-bottom: 10px; }';
			styles += '#schedule-modal .no-restrictions { margin-bottom: 10px; }';
			styles += '#schedule-modal .well { padding: 5px; }';
			styles += '#schedule-modal .edit-restriction .section { margin-bottom: 2px; padding: 0 2px; }';
			styles += '#schedule-modal .nav>li>a { padding: 2px 15px; }';
			styles += '#schedule-modal .btn { height: 22px; padding: 2px 15px; }';
			//tweaks for Map Comments
			styles += '.map-comment-feature-editor .conversation-region, .map-comment-feature-editor .name-editor-region { margin-left: -17px; margin-right: -5px; }';
			if (_cbNarrowSidePanel.checked) {
				styles += '.map-comment-feature-editor .conversation-view .new-comment-text { resize: both; max-width: 230px; }';
			} else {
				styles += '.map-comment-feature-editor .conversation-view .new-comment-text { resize: both; max-width: 310px; }';
			}
			//tweaks for History
			styles += '.toggleHistory { padding: 2px 12px 7px 12px; }';
			styles += '.tx-header { padding: 2px 15px 2px 15px !important; }';
			styles += '.tx-author-date { margin-bottom: 2px !important; }';
			styles += '.element-history-item { font-size: 11px; }';
			styles += '.tx-content { padding: 2px 15px 2px 15px !important; }';
			styles += '.tx-changed-ro:not(:last-child) { margin-bottom: 2px; }';
			styles += '.tx-changed-attribute .ca-name { margin-bottom: 2px; }';
			styles += '.tx-changed-attribute:not(:last-child) {margin-bottom: 2px; }';
		} else {
			//For new WME version
			var contrast = _inpUIContrast.value;
			var compress = _inpUICompression.value;
			if (compress > 0) {
				//compression enhancements
				styles += '#sidebar #advanced-tools { padding: ' + [,'0 9px','0 4px'][compress] + '; }';
				styles += '#sidebar waze-staff-tools { margin-bottom: ' + [,'9px','4px'][compress] + '; }';
				styles += '#sidebar .tab-content { padding: ' + [,'9px','4px'][compress] + '; }';
				//Tabs
				styles += '#sidebar #user-info #user-tabs { padding: ' + [,'0 9px','0 4px'][compress] + '; }';
				styles += '#sidebar .nav-tabs li a { margin-top: ' + [,'2px','1px'][compress] + '; margin-left: ' + [,'3px','1px'][compress] + '; padding-top: 0px !important; }';
				styles += '#sidebar .nav-tabs li { flex-grow: 0; }';
				//Feed
				styles += '.feed-item { margin-bottom: ' + [,'3px','1px'][compress] + '; }';
				styles += '.feed-item .inner { padding: ' + [,'5px','0px'][compress] + '; }';
				styles += '.feed-item .content .title { margin-bottom: ' + [,'1px','0px'][compress] + '; }';
				styles += '.feed-item .motivation { margin-bottom: ' + [,'2px','0px'][compress] + '; }';
				//Drives & Areas
				styles += '#sidebar .message { margin-bottom: ' + [,'6px','2px'][compress] + '; }';
				styles += '#sidebar .result-list .result { padding: ' + [,'6px 17px','2px 9px'][compress] + '; margin-bottom: ' + [,'3px','1px'][compress] + '; }';
				//SEGMENT EDIT PANEL
				//Selected segments info
				styles += '#edit-panel .selection { padding-top: ' + [,'8px','2px'][compress] + '; padding-bottom: ' + [,'8px','4px'][compress] + '; }';
				styles += '#edit-panel .segment .direction-message { margin-bottom: ' + [,'9px','3px'][compress] + '; }';
				//All control labels
				styles += '#edit-panel .control-label { font-size: ' + [,'11px','10px'][compress] + '; margin-bottom: ' + [,'4px','2px'][compress] + '; }';
				//Address input
				styles += '#edit-panel .segment .address-edit-view { margin-bottom: ' + [,'6px','2px'][compress] + '; }';
				styles += '#edit-panel .address-edit-input { padding: ' + [,'4px','1px'][compress] + '; font-size: ' + [,'13px','12px'][compress] + '; }';
				styles += '#sidebar .controls-container { padding-top: ' + [,'4px','1px'][compress] + '; display: inline-block; font-size: ' + [,'12px','11px'][compress] + '; }';
				styles += '#sidebar .form-group { margin-bottom: ' + [,'6px','2px'][compress] + '; }';
				styles += '#sidebar .form-control { height: ' + [,'28px','21px'][compress] + '; padding-top: ' + [,'4px','0px'][compress] + '; font-size: ' + [,'13px','12px'][compress] + '; }';
				styles += '#edit-panel .waze-btn { padding-top: ' + [,'3px','1px'][contrast] + '; padding-bottom: ' + [,'3px','1px'][contrast] + '; font-size: ' + [,'13px','12px'][compress] + '; }';
				styles += '.waze-radio-container label { height: ' + [,'19px','16px'][compress] + '; line-height: ' + [,'19px','16px'][compress] + '; font-size: ' + [,'13px','12px'][compress] + '; margin-bottom: ' + [,'3px','1px'][compress] + '; }';
				styles += '#edit-panel .segment .speed-limit .form-control { height: ' + [,'23px','19px'][compress] + '; padding-top: ' + [,'6px','5px'][compress] + '; font-size: ' + [,'13px','12px'][compress] + '; width: 5em; }';
				styles += '#edit-panel .segment .speed-limit .direction-label { font-size: ' + [,'12px','11px'][compress] + '; line-height: ' + [,'2.0em','1.8em'][compress] + '; }';
				styles += '#edit-panel .segment .speed-limit .unit-label { font-size: ' + [,'12px','11px'][compress] + '; line-height: ' + [,'2.0em','1.8em'][compress] + '; padding-right: ' + ( getId('_cbNarrowSidePanel').checked ? '58px' : '138px' ) + '; }';
				styles += '#sidebar .waze-radio-container { border: 0 none !important; }';
				styles += '#edit-panel .more-actions { padding-top: ' + [,'6px','2px'][compress] + '; }';
				styles += '#edit-panel .more-actions .waze-btn.waze-btn-white { height: ' + [,'28px','21px'][compress] + '; line-height: ' + [,'25px','18px'][compress] + '; }';
				//get more-actions buttons on one line
				styles += '#edit-panel .more-actions { color: teal; display: inline-flex; }';
				styles += '#edit-panel .action-button { color: teal; width: 161px; overflow: hidden; }';
				styles += '#edit-panel .action-button:before { color: teal; margin-right: 0px !important; }';
				styles += '#edit-panel .more-actions .edit-house-numbers-btn-wrapper { color: teal; margin-top: 0px; }';

			}
			if (contrast > 0) {
				//contrast enhancements
				styles += '#sidebar waze-staff-tools { background-color: #c7c7c7; }';
				//Tabs
				styles += '#sidebar .nav-tabs li a { border: 1px solid ' + [,'lightgrey','grey'][contrast] + ' !important; }';
				//Feed
				styles += '.feed-item { border: 1px solid ' + [,'lightgrey','grey'][contrast] + '; }';
				//Drives & Areas
				styles += '#sidebar .result-list .result { border: 1px solid ' + [,'lightgrey','grey'][contrast] + '; }';
				//Segment edit panel
				styles += '#edit-panel .selection { font-size: 13px; }';
				styles += '#edit-panel .segment .direction-message { color: orangered; }';
				styles += '#edit-panel .address-edit-input { border: 1px solid ' + [,'lightgrey','grey'][contrast] + '; }';
				styles += '#sidebar .form-control { border: 1px solid ' + [,'lightgrey','grey'][contrast] + '; }';
				styles += '#edit-panel .waze-btn { border: 1px solid ' + [,'lightgrey','grey'][contrast] + '; }';
				styles += '.waze-radio-container label  { border: 1px solid ' + [,'lightgrey','grey'][contrast] + '; }';
			}
		}
		//fix for buttons of WME Image Overlay script
		styles += '#sidepanel-imageoverlays > div.result-list button { height: 24px; }';
		addStyle(prefix + fname,styles);
	} else {
		removeStyle(prefix + fname);
	}
}

function compressLayersMenu() {
	var fname = arguments.callee.toString().match(/function ([^\(]+)/)[1];
	logit("function " + fname + " called", "debug");
	var styles = "";
	if (_cbCompressLayersMenu.checked) {
		// tweaks for layers menu
		if (document.getElementById('layer-switcher-list') === null) {
			//new style layers menu
			styles += '.layer-switcher { line-height: 11px; }';
			styles += '#layer-switcher .dropdown-menu .draggable .toggler .handle { height: 18px; }';
			styles += '.layer-switcher .togglers .group:not(:last-child):after { margin: 5px -7px -2px; }';
			styles += '.layer-switcher .more-options-toggle { height: 20px; line-height: 20px; }';
		} else {
			//old style layers menu
			styles += '.layer-switcher { line-height: 14px; }';
		}
//		styles += '.layer-switcher .toggler { padding-top: 0px; padding-bottom: 0px; }';
		addStyle(prefix + fname,styles);
	} else {
		removeStyle(prefix + fname);
	}
}

function restyleReports() {
	var fname = arguments.callee.toString().match(/function ([^\(]+)/)[1];
	logit("function " + fname + " called", "debug");
	var styles = "";
	if (_cbRestyleReports.checked) {
		styles += '#panel-container .panel { font-size: 12px; line-height: 15px; }';
		styles += '#panel-container .problem-edit .header { padding: 5px; line-height: 15px; }';
		styles += '#panel-container .problem-edit .problem-data .title { line-height: 22px; }';
		styles += '#panel-container .problem-edit .section .title { padding: 0 5px; }';
		styles += '#panel-container .problem-edit .section .content { padding: 5px; }';
		styles += '#WMEFP-UR-ALLPM { top: -2px !important; }';
		styles += '#panel-container .problem-edit .conversation.section .comment .comment-content { padding: 0 5px; }';
		styles += '#panel-container .problem-edit .conversation.section .no-comments { padding: 0; }';
		styles += '#panel-container .problem-edit .conversation.section .new-comment-form { padding: 0; }';
		styles += '#panel-container .problem-edit .conversation.section .new-comment-form textarea { resize: vertical; height: 110px; margin-bottom: 0px; padding: 3px 5px; font-size: 12px; }';
		styles += '#panel-container .btn { height: 20px; padding: 0px 10px;}';
		styles += '#panel-container .problem-edit .actions .content { padding: 2px 5px;}';
		styles += '#panel-container .problem-edit .actions .controls-container label { margin-bottom: 0px; line-height: 22px }';
		styles += '#panel-container .problem-edit .actions .navigation { margin-top: 5px;}';
		styles += '#panel-container .problem-edit .actions .controls-container { display: inline-flex; flex-wrap: wrap; margin-left: -3px; }';
		styles += '#panel-container .input-max-length { text-align: right; margin-top: 0; white-space: nowrap; color: #3d3d3d; font-weight: 700; font-size: 11px; }';
		addStyle(prefix + fname,styles);
		if (wmeFUinitialising) {
			setTimeout(draggablePanel, 5000);
		} else {
			draggablePanel();
		}
	} else {
		removeStyle(prefix + fname);
		if (jQuery.ui) {
			$("#panel-container").draggable("destroy");
			getId("panel-container").style = "";
		}
	}
	window.dispatchEvent(new Event('resize'));
}

function draggablePanel() {
	if (jQuery.ui) {
		$("#panel-container").draggable({ handle: ".header" });
	}
}

function narrowSidePanel() {
	var fname = arguments.callee.toString().match(/function ([^\(]+)/)[1];
	logit("function " + fname + " called", "debug");
	var styles = "";
	if (_cbNarrowSidePanel.checked) {
		styles += '.row-fluid #sidebar { width: 250px; }';
		styles += '.col-fixed-330 { width: 250px; }';
		styles += '#sidebar waze-links { overflow: hidden; }';
		styles += '#sidebar waze-links li+li::before { padding: 0; }';
		styles += '#sidebar waze-links li { font-size: 10px; }';
		styles += '#edit-panel .add-alt-street-form th.city { min-width: inherit; }';
		styles += '#edit-panel .external-providers-view .select2-container { width: 100%; }';
		if (document.body.dir != "rtl") {
			styles += '.show-sidebar .row-fluid .fluid-fixed { margin-left: 250px; }';
			styles += '.col-offset-330 { padding-left: 250px; }';
		} else {
			styles += '.show-sidebar .row-fluid .fluid-fixed { margin-right: 250px; }';
			styles += '.col-offset-330 { padding-right: 250px; }';
		}
		styles += '.edit-closure .form { padding: 2px; }';
		styles += '.edit-closure .date-input-group { width: 56%; }';
		addStyle(prefix + fname, styles);
	} else {
		removeStyle(prefix + fname);
	}
	window.dispatchEvent(new Event('resize'));
}

function hideAveSpeedControls() {
	var fname = arguments.callee.toString().match(/function ([^\(]+)/)[1];
	logit("function " + fname + " called", "debug");
	removeStyle(prefix + fname);
	if (_cbHideAveSpeedControls.checked) {
		var ASCBox;
		if (getId('fwdSpeedCameraCheckbox')) {
			ASCBox = getId('fwdSpeedCameraCheckbox');
		}
		if (getId('revSpeedCameraCheckbox')) {
			ASCBox = getId('revSpeedCameraCheckbox');
		}
		if (ASCBox) {
			var formGroup = ASCBox.parentNode.parentNode.parentNode;
			var formGroupParent = formGroup.parentNode;
			var targetGroup = Array.prototype.indexOf.call(formGroupParent.children, formGroup) + 1;
			addStyle(prefix + fname, '#segment-edit-general > .side-panel-section.attributes-form > .form-group:nth-of-type(' + targetGroup + ') { display: none; }');
		}
	}
	if (_cbClickablePlaceAddress.checked) {
		var address;
		// Place address
		if (UIver == "old") {
			address = document.querySelector("#landmark-edit-general > div.address-edit.side-panel-section > div > div");
			if (address) {
				address.classList.add('edit-button');
				address.style.cursor = 'pointer';
			}
		} else {
			address = document.querySelector("#landmark-edit-general > div.form-group > div > div > div");
			if (address) {
				address.classList.add('edit-button');
				address.style.cursor = 'pointer';
			}
		}
		// Segment address
		if (UIver == "old") {
			// don't need to do anything - already clickable
		} else {
			address = document.querySelector("#segment-edit-general > div.address-edit.address-edit-view.clearfix.preview > div");
			if (address) {
				address.classList.add('address-edit-btn');
				address.style.cursor = 'pointer';
				var styles = "";
				styles += "#segment-edit-general > div.address-edit.address-edit-view.clearfix.preview > div:before { content: none; }";
				styles += "#segment-edit-general > div.address-edit.address-edit-view.clearfix.preview > div:after { content: none; }";
				addStyle(prefix + fname, styles);
			}
		}
	} else {
		removeStyle(prefix + fname);
	}
}

function addZoomIndicator() {
	var fname = arguments.callee.toString().match(/function ([^\(]+)/)[1];
	logit("function " + fname + " called", "debug");
	var slider = getElementsByClassName('slider', getId('WazeMap'))[1];
	if (_cbAddZoomIndicator.checked) {
		addStyle(prefix + fname, '.slider { font-size: 15px; font-weight: 900; line-height: 1; height: 18px; margin-top: 23px; padding-top: 2px; text-align: center; }');
		Waze.map.events.register("zoomend", null, ZLI);
		ZLI();
	} else {
		removeStyle(prefix + fname);
		Waze.map.events.unregister("zoomend", null, ZLI);
		slider.innerText = "";
		slider.title = "";
	}
}

function ZLI() {
	var slider = getElementsByClassName('slider', getId('WazeMap'))[1];
	slider.innerText = Waze.map.zoom;
	slider.title = "Zoom level indicator by WMEFU";
	switch (Waze.map.zoom) {
		case 0:
		case 1:
			slider.style.background = '#ef9a9a';
			slider.title += "\nCannot permalink any segments at this zoom level";
			break;
		case 2:
		case 3:
			slider.style.background = '#ffe082';
			slider.title += "\nCan only permalink primary or higher at this zoom level";
			break;
		default:
			slider.style.background = '#ffffff';
			slider.title += "\nCan permalink any segments at this zoom level";
			break;
	}
}

function shiftAerials() {
	var fname = arguments.callee.toString().match(/function ([^\(]+)/)[1];
	logit("function " + fname + " called", "debug");
	// calculate meters/pixel for current map view
	var ipu = OpenLayers.INCHES_PER_UNIT;
	var metersPerPixel = Waze.map.getResolution() * ipu.m / ipu[Waze.map.getUnits()];
	// Apply the shift and opacity
	Waze.map.baseLayer.div.style.left = Math.round(getId("_inpASX").value / metersPerPixel) + 'px';
	Waze.map.baseLayer.div.style.top = Math.round(- getId("_inpASY").value / metersPerPixel) + 'px';
	Waze.map.baseLayer.div.style.opacity = getId("_inpASO").value/100;
}

function fixExternalProviders () {
	var fname = arguments.callee.toString().match(/function ([^\(]+)/)[1];
	logit("function " + fname + " called", "debug");
	var styles = "";
	if (_cbFixExternalProviders.checked) {
		//enlarge external provider boxes
		styles += '#edit-panel .external-providers-view .select2-container { width: 90%; margin-bottom: 2px; }';
		styles += '.select2-container .select2-choice { height: inherit; line-height: 16px; }';
		styles += '.select2-container .select2-choice>.select2-chosen { white-space: normal; }';
		styles += '.placeId { padding-bottom: 5px; }';
		addStyle(prefix + fname,styles);
	} else {
		removeStyle(prefix + fname);
	}
}

function warnCommentsOff() {
	var fname = arguments.callee.toString().match(/function ([^\(]+)/)[1];
	logit("function " + fname + " called", "debug");
	if (Waze.map.getLayerByUniqueName('mapComments').visibility === false) {
		removeStyle(prefix + fname);
		addStyle(prefix + fname, '.toolbar { background-color: #FFC107; }');
	} else {
		removeStyle(prefix + fname);
	}
}

function adjustGSV() {
	var fname = arguments.callee.toString().match(/function ([^\(]+)/)[1];
	logit("function " + fname + " called", "debug");
	var styles = "";
	styles += '.gm-style { filter: contrast(' + getId('_inpGSVContrast').value + '%) ';
	styles += 'brightness(' + getId('_inpGSVBrightness').value + '%) ';
	if (getId('_cbGSVInvert').checked) {
		styles += 'invert(1); }';
	} else {
		styles += 'invert(0); }';
	}
	removeStyle(prefix + fname);
	addStyle(prefix + fname, styles);
}

function permalinkCheck() {
	var fname = arguments.callee.toString().match(/function ([^\(]+)/)[1];
	logit("function " + fname + " called", "debug");
	var selSegments = Waze.selectionManager.selectedItems.length;
	if ( URLSegmentCount != selSegments ) {
		alert("WARNING FROM WME FixUI!\n\n" +
		"You have opened a permalink with " + URLSegmentCount + " segments,\n" +
		"but the total selected in WME is " + selSegments + ".\n\n" +
		"The permalink may contain segments not selectable at this zoom\n" +
		"or not visible on-screen, or some segment IDs may have been\n" +
		"changed since the permalink was created.");
	}
	Waze.selectionManager.events.unregister("selectionchanged", null, permalinkCheck);
}

function moveChatIcon() {
	// Now functioning correctly for prod & beta
	var fname = arguments.callee.toString().match(/function ([^\(]+)/)[1];
	logit("function " + fname + " called", "debug");
	var styles = "";
	if (_cbMoveChatIcon.checked) {
		styles += '#chat-overlay { left: inherit; right: 20px; }';
		if (UIver == "new") {
			styles += '#chat-overlay #chat-toggle { right: 0px; }';
		}
		addStyle(prefix + fname,styles);
	} else {
		removeStyle(prefix + fname);
	}
}

//function layersMenuAutoHide() {
//	var fname = arguments.callee.toString().match(/function ([^\(]+)/)[1];
//	logit("function " + fname + " called", "debug");
//	var LS = getElementsByClassName('layer-switcher')[0];
//	if (_cbLayersMenuAutoHide.checked) {
//		LS.onmouseleave = function () { $(".waze-icon-layers").click(); };
//		LS.onmouseenter = function () { $(".waze-icon-layers").click(); };
//	} else {
//		LS.onmouseleave = null;
//		LS.onmouseenter = null;
//	}
//}

//Helper functions

function addGlobalStyle(css) {
	var head, style;
	head = document.getElementsByTagName('head')[0];
	if (!head) {
		return;
	}
	style = document.createElement('style');
	style.type = 'text/css';
	style.innerHTML = css;
	head.appendChild(style);
}

function addStyle(ID, css) {
	var head, style;
	head = document.getElementsByTagName('head')[0];
	if (!head) {
		return;
	}
	removeStyle(ID); // in case it is already there
	style = document.createElement('style');
	style.type = 'text/css';
	style.innerHTML = css;
	style.id = ID;
	head.appendChild(style);
}

function removeStyle(ID) {
	var style = document.getElementById(ID);
	if (style) { style.parentNode.removeChild(style); }
}

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 logit(msg, typ) {
	if (!typ) {
		console.log(prefix + ": " + msg);
	} else {
		switch(typ) {
			case "error":
				console.error(prefix + ": " + msg);
				break;
			case "warning":
				console.warn(prefix + ": " + msg);
				break;
			case "info":
				console.info(prefix + ": " + msg);
				break;
			case "debug":
				if (debug) {
					console.debug(prefix + ": " + msg);
				}
				break;
			default:
				console.log(prefix + " unknown message type: " + msg);
				break;
		}
	}
}

// Start it running
setTimeout(init1, 200);
})();