WME Favorites

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

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 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);