Refactor URL generating methods
authorJohn Firebaugh <john.firebaugh@gmail.com>
Wed, 24 Jul 2013 00:30:24 +0000 (17:30 -0700)
committerJohn Firebaugh <john.firebaugh@gmail.com>
Tue, 30 Jul 2013 22:41:41 +0000 (15:41 -0700)
app/assets/javascripts/application.js
app/assets/javascripts/index.js
app/assets/javascripts/leaflet.extend.js.erb
app/assets/javascripts/leaflet.share.js

index 44858506bf3dea3d2c3d7dd112b2c86af6550bfb..e54498834c3bdbcb70770efd2b2a8afe1ffc44e7 100644 (file)
@@ -120,65 +120,6 @@ function updatelinks(loc, zoom, layers, bounds, object) {
   }
 }
 
-function getShortUrl(map) {
-  return (window.location.hostname.match(/^www\.openstreetmap\.org/i) ?
-          'http://osm.org/go/' : 'http://' + window.location.hostname + '/go/') +
-          makeShortCode(map);
-}
-
-function getUrl(map) {
-  var center = map.getCenter(),
-      zoom = map.getZoom(),
-      toZoom = zoomPrecision(zoom);
-
-  return (window.location.hostname.match(/^www\.openstreetmap\.org/i) ?
-          'http://openstreetmap.org/?' : 'http://' + window.location.hostname + '/?') +
-        querystring.stringify({
-            lat: toZoom(center.lat),
-            lon: toZoom(center.lng),
-            zoom: zoom,
-            layers: map.getLayersCode()
-        });
-}
-
-// Called to create a short code for the short link.
-function makeShortCode(map) {
-    var zoom = map.getZoom(),
-        str = '',
-        char_array = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_~",
-        x = Math.round((map.getCenter().lng + 180.0) * ((1 << 30) / 90.0)),
-        y = Math.round((map.getCenter().lat +  90.0) * ((1 << 30) / 45.0)),
-        // JavaScript only has to keep 32 bits of bitwise operators, so this has to be
-        // done in two parts. each of the parts c1/c2 has 30 bits of the total in it
-        // and drops the last 4 bits of the full 64 bit Morton code.
-        c1 = interlace(x >>> 17, y >>> 17), c2 = interlace((x >>> 2) & 0x7fff, (y >>> 2) & 0x7fff);
-
-    for (var i = 0; i < Math.ceil((zoom + 8) / 3.0) && i < 5; ++i) {
-        digit = (c1 >> (24 - 6 * i)) & 0x3f;
-        str += char_array.charAt(digit);
-    }
-    for (i = 5; i < Math.ceil((zoom + 8) / 3.0); ++i) {
-        digit = (c2 >> (24 - 6 * (i - 5))) & 0x3f;
-        str += char_array.charAt(digit);
-    }
-    for (i = 0; i < ((zoom + 8) % 3); ++i) str += "-";
-
-    // Called to interlace the bits in x and y, making a Morton code.
-    function interlace(x, y) {
-        x = (x | (x << 8)) & 0x00ff00ff;
-        x = (x | (x << 4)) & 0x0f0f0f0f;
-        x = (x | (x << 2)) & 0x33333333;
-        x = (x | (x << 1)) & 0x55555555;
-        y = (y | (y << 8)) & 0x00ff00ff;
-        y = (y | (y << 4)) & 0x0f0f0f0f;
-        y = (y | (y << 2)) & 0x33333333;
-        y = (y | (y << 1)) & 0x55555555;
-        return (x << 1) | y;
-    }
-
-    return str;
-}
-
 // generate a cookie-safe string of map state
 function cookieContent(map) {
   var center = map.getCenter().wrap();
index 2f0c1609750d9321ff4bc1b18a76c1f3e440d7e7..452cc0bca821d1ba5d64374f3aa9875fd4d6735c 100644 (file)
@@ -81,8 +81,6 @@ $(document).ready(function () {
 
   L.OSM.share({
     position: position,
-    getShortUrl: getShortUrl,
-    getUrl: getUrl,
     sidebar: sidebar,
     short: true
   }).addTo(map);
index 3b505302f300d23258de983307695f3c1ec5f9aa..f1abfb4bab61de9144a1bf91255d5d8ff07d88d7 100644 (file)
@@ -10,22 +10,86 @@ L.extend(L.LatLngBounds.prototype, {
 });
 
 L.extend(L.Map.prototype, {
-    getLayersCode: function() {
-        var layerConfig = '';
-        for (var i in this._layers) { // TODO: map.eachLayer
-            var layer = this._layers[i];
-            if (layer.options && layer.options.code) {
-                layerConfig += layer.options.code;
-            }
-        }
-        return layerConfig;
-    },
-    getMapBaseLayerId: function() {
-        for (var i in this._layers) { // TODO: map.eachLayer
-            var layer = this._layers[i];
-            if (layer.options && layer.options.keyid) return layer.options.keyid;
-        }
+  getLayersCode: function () {
+    var layerConfig = '';
+    for (var i in this._layers) { // TODO: map.eachLayer
+      var layer = this._layers[i];
+      if (layer.options && layer.options.code) {
+        layerConfig += layer.options.code;
+      }
     }
+    return layerConfig;
+  },
+
+  getMapBaseLayerId: function () {
+    for (var i in this._layers) { // TODO: map.eachLayer
+      var layer = this._layers[i];
+      if (layer.options && layer.options.keyid) return layer.options.keyid;
+    }
+  },
+
+  getUrl: function(marker) {
+    var center = this.getCenter(),
+        zoom = this.getZoom(),
+        toZoom = zoomPrecision(zoom),
+        params = {
+          lat: toZoom(center.lat),
+          lon: toZoom(center.lng),
+          zoom: zoom,
+          layers: this.getLayersCode()
+        };
+
+    if (marker && this.hasLayer(marker)) {
+      params.mlat = toZoom(marker.getLatLng().lat);
+      params.mlon = toZoom(marker.getLatLng().lng);
+    }
+
+    return 'http://' + OSM.SERVER_URL + '/?' + querystring.stringify(params);
+  },
+
+  getShortUrl: function(marker) {
+    var zoom = this.getZoom(),
+      latLng = marker && this.hasLayer(marker) ? marker.getLatLng() : this.getCenter(),
+      str = '',
+      char_array = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_~",
+      x = Math.round((latLng.lng + 180.0) * ((1 << 30) / 90.0)),
+      y = Math.round((latLng.lat + 90.0) * ((1 << 30) / 45.0)),
+      // JavaScript only has to keep 32 bits of bitwise operators, so this has to be
+      // done in two parts. each of the parts c1/c2 has 30 bits of the total in it
+      // and drops the last 4 bits of the full 64 bit Morton code.
+      c1 = interlace(x >>> 17, y >>> 17), c2 = interlace((x >>> 2) & 0x7fff, (y >>> 2) & 0x7fff),
+      digit;
+
+    for (var i = 0; i < Math.ceil((zoom + 8) / 3.0) && i < 5; ++i) {
+      digit = (c1 >> (24 - 6 * i)) & 0x3f;
+      str += char_array.charAt(digit);
+    }
+    for (i = 5; i < Math.ceil((zoom + 8) / 3.0); ++i) {
+      digit = (c2 >> (24 - 6 * (i - 5))) & 0x3f;
+      str += char_array.charAt(digit);
+    }
+    for (i = 0; i < ((zoom + 8) % 3); ++i) str += "-";
+
+    // Called to interlace the bits in x and y, making a Morton code.
+    function interlace(x, y) {
+      x = (x | (x << 8)) & 0x00ff00ff;
+      x = (x | (x << 4)) & 0x0f0f0f0f;
+      x = (x | (x << 2)) & 0x33333333;
+      x = (x | (x << 1)) & 0x55555555;
+      y = (y | (y << 8)) & 0x00ff00ff;
+      y = (y | (y << 4)) & 0x0f0f0f0f;
+      y = (y | (y << 2)) & 0x33333333;
+      y = (y | (y << 1)) & 0x55555555;
+      return (x << 1) | y;
+    }
+
+    if (marker && this.hasLayer(marker)) {
+      str += '?m'
+    }
+
+    return (window.location.hostname.match(/^www\.openstreetmap\.org/i) ?
+            'http://osm.org/go/' : 'http://' + window.location.hostname + '/go/') + str;
+  }
 });
 
 L.Icon.Default.imagePath = <%= "#{asset_prefix}/images".to_json %>;
index b808bc435b4ccf4648f3156ec15ddc71ce0aaedd..bea877e6686c0da8be68412fd808cc5c55f1e5e4 100644 (file)
@@ -60,8 +60,8 @@ L.OSM.share = function (options) {
     }
 
     function update() {
-      $shortLink.attr('href', options.getShortUrl(map));
-      $longLink.attr('href', options.getUrl(map));
+      $shortLink.attr('href', map.getShortUrl());
+      $longLink.attr('href', map.getUrl());
     }
 
     function select() {