WME Favorites

Waze Map Editor script that creates a list of favorite places next to the search field.

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name                WME Favorites
// @description         Waze Map Editor script that creates a list of favorite places next to the search field.
// @include             https://*.waze.com/editor/*
// @include             https://*.waze.com/*/editor/*
// @grant         		none
// @version             1.0.3
// @namespace https://greasyfork.org/users/11005
// ==/UserScript==



if ('undefined' == typeof __RTLM_PAGE_SCOPE_RUN__) {
  (function page_scope_runner() {
    // If we're _not_ already running in the page, grab the full source
    // of this script.
    var my_src = "(" + page_scope_runner.caller.toString() + ")();";

    // Create a script node holding this script, plus a marker that lets us
    // know we are running in the page scope (not the Greasemonkey sandbox).
    // Note that we are intentionally *not* scope-wrapping here.
    var script = document.createElement('script');
    script.setAttribute("type", "text/javascript");
    script.textContent = "var __RTLM_PAGE_SCOPE_RUN__ = true;\n" + my_src;

    // Insert the script node into the page, so it will run, and immediately
    // remove it to clean up.  Use setTimeout to force execution "outside" of
    // the user script scope completely.
    setTimeout(function() {
          document.body.appendChild(script);
          document.body.removeChild(script);
        }, 1500);
  })();

  // Stop running, because we know Greasemonkey actually runs us in
  // an anonymous wrapper.
  return;
}



function FAV_Bootstrap() {
	var bGreasemonkeyServiceDefined = false;

	try {
		bGreasemonkeyServiceDefined = (typeof Components.interfaces.gmIGreasemonkeyService === "object");
	}
	catch (err) { /* Ignore */ }

	if (typeof unsafeWindow === "undefined" || ! bGreasemonkeyServiceDefined) {
		unsafeWindow    = ( function () {
			var dummyElem = document.createElement('p');
			dummyElem.setAttribute('onclick', 'return window;');
			return dummyElem.onclick();
		}) ();
	}

	/* begin running the code! */
	FAV_init();
}





function FAV_init() {

	getQueryStringAsObject=function(e){var t,r,o,n,p,l,c,a={},u=function(e){return decodeURIComponent(e).replace(/\+/g," ")},i=e.split("?"),s=i[1],y=/([^&;=]+)=?([^&;]*)/g;for(p=function(e){return"object"!=typeof e&&(r=e,e={},e.length=0,r&&Array.prototype.push.call(e,r)),e};o=y.exec(s);)t=o[1].indexOf("["),c=u(o[2]),0>t?(n=u(o[1]),"zoom"==n?c=parseInt(c):("lat"==n||"lon"==n)&&(c=parseFloat(c)),a[n]?(a[n]=p(a[n]),Array.prototype.push.call(a[n],c)):a[n]=c):(n=u(o[1].slice(0,t)),l=u(o[1].slice(t+1,o[1].indexOf("]",t))),a[n]=p(a[n]),l?a[n][l]=c:Array.prototype.push.call(a[n],c));return a};

	var imgSort = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAgCAYAAAD0S5PyAAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAA6hpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDUuNC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iPgogICAgICAgICA8eG1wOk1vZGlmeURhdGU+MjAxNS0wNS0xNFQyMTowNTozNjwveG1wOk1vZGlmeURhdGU+CiAgICAgICAgIDx4bXA6Q3JlYXRvclRvb2w+UGl4ZWxtYXRvciAzLjMuMjwveG1wOkNyZWF0b3JUb29sPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpDb21wcmVzc2lvbj41PC90aWZmOkNvbXByZXNzaW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj43MjwvdGlmZjpZUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WFJlc29sdXRpb24+NzI8L3RpZmY6WFJlc29sdXRpb24+CiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj4xNzwvZXhpZjpQaXhlbFhEaW1lbnNpb24+CiAgICAgICAgIDxleGlmOkNvbG9yU3BhY2U+MTwvZXhpZjpDb2xvclNwYWNlPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+MzI8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KbAvF7QAAAEpJREFUSA1jYBgFoyEwlEKAEeTYqM75/2GOXlaeiFMMpgadZkIXIIdPFUPIsZg2enAGIrbAxuUEqoQJVQzB5cJR8dEQGA2BoRICAAcAEAuD4JOKAAAAAElFTkSuQmCC';
	var imgHeart = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAALEwAACxMBAJqcGAAABCRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDUuNC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIgogICAgICAgICAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyI+CiAgICAgICAgIDx0aWZmOlJlc29sdXRpb25Vbml0PjI8L3RpZmY6UmVzb2x1dGlvblVuaXQ+CiAgICAgICAgIDx0aWZmOkNvbXByZXNzaW9uPjU8L3RpZmY6Q29tcHJlc3Npb24+CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjcyPC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj43MjwvdGlmZjpZUmVzb2x1dGlvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjQ4PC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6Q29sb3JTcGFjZT4xPC9leGlmOkNvbG9yU3BhY2U+CiAgICAgICAgIDxleGlmOlBpeGVsWURpbWVuc2lvbj40ODwvZXhpZjpQaXhlbFlEaW1lbnNpb24+CiAgICAg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';
	var cmdCtrl = (navigator.platform.indexOf('Mac')>=0) ? 'cmd' : 'ctrl';



	var FAVstyle = '<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css">';
	FAVstyle += '<style id="FAVstyle">';
	FAVstyle += '#map-search .input-wrapper {width: 400px;} #map-search .input-wrapper input {width: 300px}';
	FAVstyle += 'ul#favloc {position: absolute; margin: -74px 0 0 310px; text-align: left; display: inline; padding: 15px 4px 17px 0; list-style: none} ul#favloc li {display: inline-block; margin-right: -4px; position: relative; padding: 0;} ul#favloc>li>a {display: inline-block; padding: 17px 15px;}  ul#favloc>li:hover, ul#favloc.visible {background: #D4E7ED; color: #5A899F} ul#favloc li ul {padding: 10px 20px 20px 20px; position: absolute; top: 48px; left: -20px; width: 300px; display: none; visibility: hidden;}';
	FAVstyle += 'ul#favloc li ul li {display: block; min-height: 32px; cursor: move; color: #5A899F; padding: 0;} ul#favloc li ul li:hover {background: #bfdce4 url(' + imgSort + ') center right no-repeat; border-radius: 0 5px 5px 0;} ul#favloc li:hover ul, ul#favloc.visible li ul {display: block; visibility: visible}';
	FAVstyle += 'ul#favloc li ul li a {border-bottom: 1px solid #BEDCE5; background: #D4E7ED; display: block; width: 247px; color: #5A899F; padding: 7px 5px 7px 15px; font-size: 12px; font-weight: 600; cursor: pointer;} ul#favloc li ul li a:hover, ul#favloc li ul li:hover a {background-color: #bfdce4; text-decoration: none;}';
	FAVstyle += 'ul#favloc li ul li a .fr {display: none; float: right;} ul#favloc li ul li:hover a .fr {display: inline-block; padding: 1px 4px 2px 4px;} ul#favloc li ul li a .fr:hover {color: #000;}';
	FAVstyle += 'ul#favloc li ul li.add-favloc {background: transparent;} ul#favloc li ul li.add-favloc a {border-color: #bfdce4; border-radius: 0 0 5px 5px;}';
	FAVstyle += 'ul#favloc i.fa-crosshairs, ul#favloc i.fa-plus-circle {margin-right: 5px;}';
	FAVstyle += '</style>';


	$('head').append(FAVstyle);





	function checkFavName(favName) {
		var f = (localStorage.WME_Favorites) ? JSON.parse(localStorage.WME_Favorites) : {};
		if (f.hasOwnProperty(favName)) {
			var i = 2;
			saveName = favName + ' ' + i;
			while (f.hasOwnProperty(saveName)) {
				i++;
				saveName = favName + ' ' + i;
			}
			return saveName;
		}
		else {
			return favName;
		}
	}





	function addFavLoc() {

		$('ul#favloc').addClass('visible');
		var WazePermalink = $('.WazeControlPermalink a.fa-link').attr('href');
		var w = getQueryStringAsObject(WazePermalink);

		$.getJSON('https://maps.googleapis.com/maps/api/geocode/json?address=' + w.lat + ',' + w.lon + '&key=AIzaSyBSNGQYKnxf2oFR_GkIcEm1I-Om0b7nALs', function(data) {
			var geocodeName = data.results[1].formatted_address;
			var newFavName = prompt('Please enter location name', geocodeName);

			if (newFavName != null) {

				var saveName = checkFavName(newFavName);

				f[saveName] = WazePermalink;
				localStorage.setItem('WME_Favorites', JSON.stringify(f, null, 4));
				$('.add-favloc.disabled').before('<li><a href="' + WazePermalink + '" class="favloc"><i class="fa fa-crosshairs"></i> <span class="favName">' + saveName + '</span> <i class="fr fa fa-trash-o delete-favloc" data-item="' + saveName + '" title="Delete favorite location"></i><i class="fr fa fa-pencil edit-favloc" data-item="' + saveName + '" title="Rename / Relocate ('+cmdCtrl+'+click) location"></i></a></li>');
				$('.sortable').sortable('refresh');
				console.log('WME Favorites: "' + saveName + '" added');
			}

		});

		return false;

	}





	function editFavLoc(e, t) {

		$('ul#favloc').addClass('visible');
		var favName = t.siblings('.favName').html();

		if (e.ctrlKey || e.metaKey) {
			var r = confirm('Relocate "' + favName + '" to the current location?');
			if (r == true) {
				t.parents('.favloc').attr('href', $('.WazeControlPermalink a.fa-link').attr('href'));
				console.log('WME Favorites: "' + favName + '" relocated to new location');
			}
		}
		else {
			var r = prompt('Rename favorite location:', favName);
			if (r != null && r != favName) {
				var saveName = checkFavName(r);
				t.siblings('.favName').html(saveName);
				console.log('WME Favorites: "' + favName + '" renamed to "' + saveName + '"');
			}
		}

		updateFavLocList();
		return false;

	}





	function deleteFavLoc() {
		$('ul#favloc').addClass('visible');
		var fn = $(this).attr('data-item');
		var d = confirm('Delete favorite location "' + fn + '"?');
		if (d == true) {
			delete f[fn];
			$(this).closest('li').remove();
			localStorage.setItem('WME_Favorites', JSON.stringify(f, null, 4));
			console.log('WME Favorites: "' + fn + '" deleted');
		}

		return false;
	}





	function updateFavLocList() {
		var nf = {};
		$('#favloc li ul li:not(.disabled)').each(function() {
			var nfName = $('span.favName', this).html();
			var nfHref = $('a', this).attr('href');
			nf[nfName] = nfHref;
		});
		localStorage.setItem('WME_Favorites', JSON.stringify(nf, null, 4));
	}





	function openFavLoc() {
		var w = getQueryStringAsObject($(this).attr('href'));
		var xy = OpenLayers.Layer.SphericalMercator.forwardMercator(w.lon, w.lat);
		unsafeWindow.Waze.map.setCenter(xy);
		unsafeWindow.Waze.map.zoomTo(w.zoom);
		return false;
	}





	var f = (localStorage.WME_Favorites) ? JSON.parse(localStorage.WME_Favorites) : {};

	var favlocList = '<ul id="favloc">';
	favlocList += '<li class="add-favloc"><a href="#"><img src="' + imgHeart + '" height="24" width="24" id="fav-loc"></a>';
	favlocList += '<ul class="sortable">';
	$.each(f, function(fName, fHref) {
		favlocList += '<li><a href="' + fHref + '" class="favloc"><i class="fa fa-crosshairs"></i> <span class="favName">' + fName + '</span> <i class="fr fa fa-trash-o delete-favloc" data-item="' + fName + '" title="Delete favorite location"></i><i class="fr fa fa-pencil edit-favloc" data-item="' + fName + '" title="Rename / Relocate ('+cmdCtrl+'+click) location"></i></a></li>';
	});
	favlocList += '<li class="add-favloc disabled"><a href="#"><i class="fa fa-plus-circle"></i> Add current location</a></li>';
	favlocList += '</ul></li></ul>';


	$('#search').after(favlocList);





	$('.sortable')
		.sortable({items: ':not(.disabled)'})
		.bind('sortupdate', function() {
			$('ul#favloc').addClass('visible');
			updateFavLocList();
		});

	$(document)
		.on('click', '.add-favloc>a', addFavLoc)
		.on('click', '.favloc', openFavLoc)
		.on('click', '.edit-favloc', function(event) {editFavLoc(event, $(this)); return false;})
		.on('click', '.delete-favloc', deleteFavLoc)
		.on('click', function(event) {
			if (!$(event.target).closest('#favloc').length) {
				$('#favloc').removeClass('visible');
			}
		});


}



$(document).ready(FAV_Bootstrap);