Munzee Map Permalinks

Adds a Map Permalink button to events on the Munzee Calendar, and a better Map Link button to a Munzee's page.

目前為 2021-03-18 提交的版本,檢視 最新版本

// ==UserScript==
// @name         Munzee Map Permalinks
// @version      1.1
// @description  Adds a Map Permalink button to events on the Munzee Calendar, and a better Map Link button to a Munzee's page.
// @author       sohcah
// @match        https://calendar.munzee.com/*
// @match        https://munzee.com/*
// @match        https://www.munzee.com/*
// @grant        none
// @namespace https://greasyfork.org/users/398283
// ==/UserScript==

  const BITS = [16, 8, 4, 2, 1];

  const BASE32 = "0123456789bcdefghjkmnpqrstuvwxyz";
  const NEIGHBORS = {
    right: { even: "bc01fg45238967deuvhjyznpkmstqrwx" },
    left: { even: "238967debc01fg45kmstqrwxuvhjyznp" },
    top: { even: "p0r21436x8zb9dcf5h7kjnmqesgutwvy" },
    bottom: { even: "14365h7k9dcfesgujnmqp0r2twvyx8zb" }
  };
  const BORDERS = {
    right: { even: "bcfguvyz" },
    left: { even: "0145hjnp" },
    top: { even: "prxz" },
    bottom: { even: "028b" }
  };

  NEIGHBORS.bottom.odd = NEIGHBORS.left.even;
  NEIGHBORS.top.odd = NEIGHBORS.right.even;
  NEIGHBORS.left.odd = NEIGHBORS.bottom.even;
  NEIGHBORS.right.odd = NEIGHBORS.top.even;

  BORDERS.bottom.odd = BORDERS.left.even;
  BORDERS.top.odd = BORDERS.right.even;
  BORDERS.left.odd = BORDERS.bottom.even;
  BORDERS.right.odd = BORDERS.top.even;

(function () {
  'use strict';

  function encodeGeoHash(latitude, longitude) {
    var is_even = 1;
    var i = 0;
    var lat = []; var lon = [];
    var bit = 0;
    var ch = 0;
    var precision = 9;
    var geohash = "";
    var mid;

    lat[0] = -90.0; lat[1] = 90.0;
    lon[0] = -180.0; lon[1] = 180.0;

    while (geohash.length < precision) {
      if (is_even) {
        mid = (lon[0] + lon[1]) / 2;
        if (longitude > mid) {
          ch |= BITS[bit];
          lon[0] = mid;
        } else
          lon[1] = mid;
      } else {
        mid = (lat[0] + lat[1]) / 2;
        if (latitude > mid) {
          ch |= BITS[bit];
          lat[0] = mid;
        } else
          lat[1] = mid;
      }

      is_even = !is_even;
      if (bit < 4)
        bit++;
      else {
        geohash += BASE32[ch];
        bit = 0;
        ch = 0;
      }
    }
    return geohash;
  }
  $(() => {
    setTimeout(()=>{
        if($('.event-indicator')[0]) {
            const link = `https://www.munzee.com/map/${encodeGeoHash(window.map.getCenter().lat, window.map.getCenter().lng)}/16.0`;
            $('.event-indicator')[0].outerHTML = `<a style="color: black;" href="${link}">&nbsp;📌 Map Link</a>&nbsp;|&nbsp;` + $('.event-indicator')[0].outerHTML;
        }
        if($("form#gotomap input")[0]) {
            const values = Array.from($("form#gotomap input")).map(i=>[i.name, i.value]);
            const link = `https://www.munzee.com/map/${encodeGeoHash(Number(values.find(i=>i[0] === "latitude")[1]), Number(values.find(i=>i[0] === "longitude")[1]))}/16.0`;
            $("#locationimage")[0].innerHTML = `<a href="${link}">&nbsp;📌 Map Link</a>` + $("#locationimage")[0].innerHTML;

        }
    }, 2000);
  })
})();