]> git.openstreetmap.org Git - rails.git/commitdiff
Merge remote-tracking branch 'osmlab/map-ui'
authorTom Hughes <tom@compton.nu>
Tue, 6 Aug 2013 08:05:59 +0000 (09:05 +0100)
committerTom Hughes <tom@compton.nu>
Tue, 6 Aug 2013 08:05:59 +0000 (09:05 +0100)
20 files changed:
app/assets/images/sprite.png
app/assets/images/sprite.svg
app/assets/javascripts/application.js
app/assets/javascripts/browse.js
app/assets/javascripts/embed.js.erb
app/assets/javascripts/index.js
app/assets/javascripts/index/export.js
app/assets/javascripts/index/notes.js.erb
app/assets/javascripts/leaflet.extend.js.erb
app/assets/javascripts/leaflet.key.js
app/assets/javascripts/leaflet.layers.js
app/assets/javascripts/leaflet.share.js
app/assets/javascripts/leaflet.sidebar.js
app/assets/javascripts/map.js.erb
app/assets/stylesheets/common.css.scss
app/views/export/start.html.erb
app/views/layouts/site.html.erb
app/views/site/_sidebar.html.erb
config/locales/en.yml
vendor/assets/leaflet/leaflet.js

index 9f857f852b8a5c783b4d256474a14a46d5ab68d7..108c38c87a2f0ba77dde89462fd5722b42e6cc61 100644 (file)
Binary files a/app/assets/images/sprite.png and b/app/assets/images/sprite.png differ
index 2e1d309e4b60acf7759f946b9103d7210f1874ce..dea2cccc1bd234c0820121c5c3614a1c8e27fa63 100644 (file)
@@ -13,7 +13,7 @@
    height="200"
    id="svg2"
    version="1.1"
-   inkscape:version="0.48.2 r9819"
+   inkscape:version="0.48.4 r9939"
    inkscape:export-filename="/Users/tmcw/src/openstreetmap-website/app/assets/images/sprite.png"
    inkscape:export-xdpi="90"
    inkscape:export-ydpi="90"
      borderopacity="1.0"
      inkscape:pageopacity="0.0"
      inkscape:pageshadow="2"
-     inkscape:zoom="5"
-     inkscape:cx="159.62972"
-     inkscape:cy="181.16738"
+     inkscape:zoom="1.4142136"
+     inkscape:cx="82.865988"
+     inkscape:cy="195.08379"
      inkscape:document-units="px"
      inkscape:current-layer="layer1"
-     showgrid="true"
+     showgrid="false"
      inkscape:window-width="1280"
      inkscape:window-height="756"
      inkscape:window-x="0"
         <dc:format>image/svg+xml</dc:format>
         <dc:type
            rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
+        <dc:title />
       </cc:Work>
     </rdf:RDF>
   </metadata>
      id="layer1"
      transform="translate(0,-852.36218)">
     <path
-       style="color:#000000;fill:#222222;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
        d="m 24,860.36218 c 0,-1.82764 1,-4 3.75,-4 1.827643,0 2.75,2 2.75,2 0,0 0.922357,-2 2.75,-2 2.75,0 3.75,2.17236 3.75,4 0,5 -6.5,8 -6.5,8 0,0 -6.5,-3 -6.5,-8 z"
        id="path3843"
        inkscape:connector-curvature="0"
        sodipodi:nodetypes="cccccccccccccccccc"
        d="m 129,855.3622 -1.00001,1 0,2 1.00001,1 2.00002,0 1,-1 0,-2 -1.00002,-1 z m 2e-5,6 -1.00001,1 0,6 1.00001,1 1.99998,0 1.00004,-1 -3e-5,-6 -1,-1 z"
        id="path6912"
-       style="font-size:16.71258354px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:100%;letter-spacing:0px;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#222222;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter6591-2);enable-background:accumulate;font-family:Helvetica Neue"
+       style="font-size:16.71258354000000068px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:100%;letter-spacing:0px;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter6591-2);enable-background:accumulate;font-family:Helvetica Neue"
        inkscape:connector-curvature="0" />
     <path
        inkscape:export-ydpi="90"
        inkscape:connector-curvature="0"
        id="path6914"
        d="m 57,861.36216 -1,-1 -4,0 0,-4 -1,-0.99999 -1,0 -1,1 0,4 -4,0 -1,0.99999 0,1 1,1 4,0 0,3.99999 1,1.00002 1,0 1,-1.00001 0,-3.99999 4,-10e-6 1,-0.99998 0,-1.00002 z"
-       style="color:#000000;fill:#222222;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter6591-2);enable-background:accumulate" />
+       style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter6591-2);enable-background:accumulate" />
     <path
-       style="color:#000000;fill:#222222;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter6591-2);enable-background:accumulate"
+       style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter6591-2);enable-background:accumulate"
        d="m 65,860.36216 11,-2e-5 1,1.00002 0,1.00002 -1,0.99997 -11,3e-5 -1,-1.00003 0,-1 z"
        id="path6916"
        inkscape:connector-curvature="0"
        inkscape:connector-curvature="0"
        id="path6918"
        d="m 84,862.36218 0,-2.00001 10,-3.99999 2,1e-5 0,1.99998 -4,10 -2,10e-6 0,-6 z"
-       style="color:#000000;fill:#222222;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter6591-2);enable-background:accumulate" />
+       style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter6591-2);enable-background:accumulate" />
     <path
        inkscape:export-ydpi="90"
        inkscape:export-xdpi="90"
        inkscape:export-filename="/Users/saman/work_repos/osm-redesign/renders/share-1.png"
        id="path6920"
        d="m 155,854.3622 -1,1 0,2 -2,0 c -6,0 -6,7 -6,7 0,0 2,-4 6,-4 0.66667,0 1.33333,0 2,0 l 0,2 1,1 4,-4.5 -4,-4.5 z m -13,4 -1,1 0,9 1,1 10,0 1,-1 0,-2 0,-3 0,-1 -1,0 c -0.3202,-10e-5 -0.6603,0.073 -1,0.1875 l 0,2.8125 0,2 -5.5625,0 a 2.0002,2.0002 0 0 1 -0.90625,0 l -1.53125,0 0,-1.625 a 2.0002,2.0002 0 0 1 0,-0.625 l 0,-2.75 0,-2 1.53125,0 c 0.3433,-0.6691 0.79175,-1.3477 1.34375,-2 l -0.875,0 -3,0 z"
-       style="color:#000000;fill:#222222;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter6591-2);enable-background:accumulate"
+       style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter6591-2);enable-background:accumulate"
        inkscape:connector-curvature="0" />
     <path
        inkscape:export-ydpi="90"
        inkscape:export-xdpi="90"
        inkscape:export-filename="/Users/saman/work_repos/osm-redesign/renders/share-1.png"
-       style="color:#000000;fill:#222222;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter6591-2);enable-background:accumulate"
+       style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter6591-2);enable-background:accumulate"
        d="m 109.50003,855.3622 -6.50002,3 1e-5,1 6.49998,3 1.00002,0 6.49999,-3 1e-5,-1 -6.50001,-3 -0.99998,0 z m -5.40621,6.5 -1.09377,0.5 -3e-5,1 6.49999,3 1,0 6.50001,-3 0,-1 -1.0937,-0.5 -5.40631,2.5 -0.99998,0 -5.40621,-2.5 z m 0,4 -1.09379,0.5 -2e-5,1 6.50001,3 1.00001,0 6.5,-3 -10e-6,-1 -1.0937,-0.5 -5.40631,2.5 -0.99999,0 -5.4062,-2.5 z"
        id="path6922"
        inkscape:connector-curvature="0" />
        inkscape:connector-curvature="0"
        id="path6924"
        d="m 170,853.3622 -1,1 0,1 -1,0 -1,1 0,2 7,0 0,-2 -1,-1 -1,0 0,-1 -1,-1 -1,0 z m -5,3 -1,1 0,11 1,1 11,0 1,-1 0,-11 -1,-1 -1,0 0,1 0,2 0,8 -9,0 0,-8 0,-2 0,-1 -1,0 z m 3,4 0,1 5,0 0,-1 -5,0 z m 0,2 0,1 5,0 0,-1 -5,0 z m 0,2 0,1 3,0 0,-1 -3,0 z"
-       style="color:#000000;fill:#222222;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+       style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
     <path
        inkscape:export-ydpi="90"
        inkscape:export-xdpi="90"
        id="path10739"
        d="m 11.5,855.36218 c 3.0376,0 5.5,2.46243 5.5,5.5 0,3.03757 -2.4624,5.5 -5.5,5.5 -1.0061,0 -1.9387,-0.27827 -2.75,-0.75 l -3.75,3.75 -1,0 -1,-1 0,-1 3.75,-3.75 C 6.2783,862.80084 6,861.86831 6,860.86218 c 0,-3.03757 2.4624,-5.5 5.5,-5.5 z m 0.5,2 -1,0 -2,1 -1,2 0,1 1,2 2,1 1,0 2,-1 1,-2 0,-1 -1,-2 -2,-1 z"
        style="color:#000000;fill:#999999;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter6591-2);enable-background:accumulate" />
-    <path
-       style="color:#000000;fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter6591-2);enable-background:accumulate"
-       d="m 192.00001,854.36218 -2,2 3,0 0,0 3,3 -4.50001,4.5 -2,-2 -1.5,1.5 2.5,2.5 2,0 5.50001,-5.5 0,-2 -4,-4 z m -3.50001,3.5 -5.5,5.5 0,2 4,4 2,0 2,-2 -3,0 0,0 -3,-3 4.5,-4.5 2,2 1.5,-1.5 -2.5,-2.5 z"
-       id="path10871"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccccccccccccccccccccccccc" />
     <path
        inkscape:export-ydpi="90"
        inkscape:export-xdpi="90"
        inkscape:connector-curvature="0"
        sodipodi:nodetypes="cccccccccccc" />
     <path
-       style="color:#000000;fill:#222222;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
        d="m 244,864.36218 0,-7 1,-1 10,0 1,1 0,7 -1,1 -3,0 -2,3 -2,-3 -3,0 z"
        id="path11741"
        inkscape:connector-curvature="0"
        id="path6918-2"
        d="m 84,882.36218 0,-2.00001 10,-3.99999 2,1e-5 0,1.99998 -4,10 -2,10e-6 0,-6 z"
        style="color:#000000;fill:#70cd8f;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter6591-2);enable-background:accumulate" />
+    <path
+       style="color:#000000;fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="m 183,864.36218 0,-4 2,-2 2,0 -2,2 0,4 2,2 -2,0 z"
+       id="path4118"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccc" />
+    <path
+       sodipodi:nodetypes="ccccccccc"
+       inkscape:connector-curvature="0"
+       id="path4120"
+       d="m 196,864.36218 0,-4 -2,-2 -2,0 2,2 0,4 -1,2 1,0 z"
+       style="color:#000000;fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+    <path
+       style="color:#000000;fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="m 185,858.36218 5,0 0,2 -5,0 z"
+       id="rect4122"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="color:#000000;fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="m 194,866.36218 -5,0 0,-2 5,0 z"
+       id="rect4126"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="color:#000000;fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="m 190,858.36218 2,2 0,3 -2,0 z"
+       id="path4130"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       sodipodi:nodetypes="ccccc"
+       inkscape:connector-curvature="0"
+       id="path4132"
+       d="m 189,866.36218 -2,-2 0,-3 2,0 z"
+       style="color:#000000;fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
   </g>
 </svg>
index b257f7fedfd575f65a881dc213a9d88112cb8786..225ddaf44503ee78aaa2ec81455121df795c6e36 100644 (file)
@@ -122,6 +122,19 @@ function cookieContent(map) {
   return [center.lng, center.lat, map.getZoom(), map.getLayersCode()].join('|');
 }
 
+function escapeHTML(string) {
+  var htmlEscapes = {
+    '&': '&amp;',
+    '<': '&lt;',
+    '>': '&gt;',
+    '"': '&quot;',
+    "'": '&#x27;'
+  };
+  return string == null ? '' : (string + '').replace(/[&<>"']/g, function(match) {
+      return htmlEscapes[match];
+  });
+}
+
 /*
  * Forms which have been cached by rails may have the wrong
  * authenticity token, so patch up any forms with the correct
index 023dc878dd705aef120279676f8f48b099692e6e..5d2412183040ddcb76621aa843bbc829ec36eaac 100644 (file)
@@ -57,8 +57,8 @@ $(document).ready(function () {
       object.version = params.version - 1;
     }
 
-    addObjectToMap(object, map, {
-      zoom: true, 
+    map.addObject(object, {
+      zoom: true,
       callback: function(extent) {
         $("#loading").hide();
         $("#browse_map .geolink").show();
index 57572ca48ff31dee1cd998d5312c6886443f37fb..50c294b41b0da937e3d09d8ec5e030b115d9f0e8 100644 (file)
@@ -5,12 +5,11 @@ window.onload = function () {
   var query = (window.location.search || '?').substr(1),
       args  = {};
 
-  query.replace(/([^&=]+)=?([^&]*)(?:&+|$)/g, function(match, key, value) {
-    value = value.split(",");
-    if (value.length == 1)
-      value = value[0];
-    args[key] = value;
-  });
+  var pairs = query.split('&');
+  for (var i = 0; i < pairs.length; i++) {
+    var parts = pairs[i].split('=');
+    args[parts[0]] = decodeURIComponent(parts[1] || '');
+  }
 
   var map = L.map("map");
   map.attributionControl.setPrefix('');
@@ -26,7 +25,7 @@ window.onload = function () {
   }
 
   if (args.marker) {
-    L.marker(args.marker, {icon: L.icon({
+    L.marker(args.marker.split(','), {icon: L.icon({
       iconUrl: <%= asset_path('images/marker-icon.png').to_json %>,
       iconSize: new L.Point(25, 41),
       iconAnchor: new L.Point(12, 41),
@@ -36,8 +35,9 @@ window.onload = function () {
   }
 
   if (args.bbox) {
-    map.fitBounds([L.latLng(args.bbox[1], args.bbox[0]),
-                   L.latLng(args.bbox[3], args.bbox[2])])
+    var bbox = args.bbox.split(',');
+    map.fitBounds([L.latLng(bbox[1], bbox[0]),
+                   L.latLng(bbox[3], bbox[2])])
   } else {
     map.fitWorld();
   }
index 15acc64124f69d19d3343fda9b4349d05552c844..bae80cac5069480ff60a9fe3ab4cf3e857a77ac8 100644 (file)
@@ -48,7 +48,12 @@ $(document).ready(function () {
     })
   ];
 
-  layers[0].addTo(map);
+  for (var i = layers.length - 1; i >= 0; i--) {
+    if (i === 0 || params.layers.indexOf(layers[i].options.code) >= 0) {
+      map.addLayer(layers[i]);
+      break;
+    }
+  }
 
   map.noteLayer = new L.LayerGroup();
   map.noteLayer.options = {code: 'N'};
@@ -116,27 +121,12 @@ $(document).ready(function () {
     }).addTo(map);
   }
 
-  if (params.layers) {
-    var foundLayer = false;
-    for (var i = 0; i < layers.length; i++) {
-      if (params.layers.indexOf(layers[i].options.code) >= 0) {
-        map.addLayer(layers[i]);
-        foundLayer = true;
-      } else {
-        map.removeLayer(layers[i]);
-      }
-    }
-    if (!foundLayer) {
-      map.addLayer(layers[0]);
-    }
-  }
-
   if (params.marker) {
     L.marker([params.mlat, params.mlon], {icon: getUserIcon()}).addTo(map.markerLayer);
   }
 
   if (params.object) {
-    addObjectToMap(params.object, map, { zoom: params.object_zoom });
+    map.addObject(params.object, { zoom: params.object_zoom });
   }
 
   $("body").on("click", "a.set_position", setPositionLink(map));
@@ -195,7 +185,7 @@ function setPositionLink(map) {
       }
 
       if (data.type && data.id) {
-        addObjectToMap(data, map, { zoom: false, style: { opacity: 0.2, fill: false } });
+        map.addObject(data, { zoom: false, style: { opacity: 0.2, fill: false } });
       }
 
       map.markerLayer.clearLayers();
index 47830f8beea33111284db05b264eebdaeb694650..aec35ed2b19cfcfb1b5852f364e25a904b39a050 100644 (file)
@@ -1,61 +1,32 @@
 function initializeExport(map) {
-  $("#exportanchor").click(function (e) {
-    $.ajax({ url: $(this).data('url'), success: function (sidebarHtml) {
-      startExport(sidebarHtml);
-    }});
-    e.preventDefault();
-  });
-
   if (window.location.pathname == "/export") {
-    $("#exportanchor").click();
+    startExport();
   }
 
-  function startExport(sidebarHtml) {
-    var marker;
-
+  function startExport() {
     var locationFilter = new L.LocationFilter({
       enableButton: false,
       adjustButton: false
     }).addTo(map);
 
-    locationFilter.on("change", filterChanged);
+    locationFilter.on("change", update);
 
-    map.on("moveend", mapMoved);
-    map.on("baselayerchange", htmlUrlChanged);
+    map.on("moveend", update);
 
     $("#sidebar_title").html(I18n.t('export.start_rjs.export'));
-    $("#sidebar_content").html(sidebarHtml);
 
     $("#maxlat,#minlon,#maxlon,#minlat").change(boundsChanged);
 
     $("#drag_box").click(enableFilter);
 
-    $("#add_marker").click(startMarker);
-
-    $("#format_osm,#format_mapnik,#format_html").click(formatChanged);
-
-    $("#mapnik_scale").change(mapnikSizeChanged);
-
     openSidebar();
 
-    if (map.getMapBaseLayerId() == "mapnik") {
-      $("#format_mapnik").prop("checked", true);
-    }
-
     setBounds(map.getBounds());
-    formatChanged();
-
-    $("body").removeClass("site-index").addClass("site-export");
 
     $("#sidebar").one("closed", function () {
-      $("body").removeClass("site-export").addClass("site-index");
-
       map.removeLayer(locationFilter);
-      clearMarker();
-
-      map.off("moveend", mapMoved);
-      map.off("baselayerchange", htmlUrlChanged);
-      locationFilter.off("change", filterChanged);
+      map.off("moveend", update);
+      locationFilter.off("change", update);
     });
 
     function getBounds() {
@@ -63,22 +34,6 @@ function initializeExport(map) {
                             L.latLng($("#maxlat").val(), $("#maxlon").val()));
     }
 
-    function getScale() {
-      var bounds = map.getBounds(),
-        centerLat = bounds.getCenter().lat,
-        halfWorldMeters = 6378137 * Math.PI * Math.cos(centerLat * Math.PI / 180),
-        meters = halfWorldMeters * (bounds.getEast() - bounds.getWest()) / 180,
-        pixelsPerMeter = map.getSize().x / meters,
-        metersPerPixel = 1 / (92 * 39.3701);
-      return Math.round(1 / (pixelsPerMeter * metersPerPixel));
-    }
-
-    function getMercatorBounds() {
-      var bounds = getBounds();
-      return L.bounds(L.CRS.EPSG3857.project(bounds.getSouthWest()),
-                      L.CRS.EPSG3857.project(bounds.getNorthEast()));
-    }
-
     function boundsChanged() {
       var bounds = getBounds();
 
@@ -87,7 +42,6 @@ function initializeExport(map) {
 
       enableFilter();
       validateControls();
-      mapnikSizeChanged();
     }
 
     function enableFilter() {
@@ -99,186 +53,21 @@ function initializeExport(map) {
       locationFilter.enable();
     }
 
-    function filterChanged() {
-      setBounds(locationFilter.getBounds());
+    function update() {
+      setBounds(locationFilter.isEnabled() ? locationFilter.getBounds() : map.getBounds());
       validateControls();
     }
 
-    function startMarker() {
-      $("#add_marker").html(I18n.t('export.start_rjs.click_add_marker'));
-
-      map.on("click", endMarker);
-
-      return false;
-    }
-
-    function endMarker(event) {
-      map.off("click", endMarker);
-
-      $("#add_marker").html(I18n.t('export.start_rjs.change_marker'));
-      $("#marker_inputs").show();
-
-      var latlng = event.latlng;
-
-      if (marker) {
-        map.removeLayer(marker);
-      }
-
-      marker = L.marker(latlng).addTo(map);
-
-      $("#marker_lon").val(latlng.lng.toFixed(5));
-      $("#marker_lat").val(latlng.lat.toFixed(5));
-
-      htmlUrlChanged();
-    }
-
-    function clearMarker() {
-      $("#marker_lon,#marker_lat").val("");
-      $("#marker_inputs").hide();
-      $("#add_marker").html(I18n.t('export.start_rjs.add_marker'));
-
-      if (marker) {
-        map.removeLayer(marker);
-      }
-    }
-
-    function mapMoved() {
-      if (!locationFilter.isEnabled()) {
-        setBounds(map.getBounds());
-        validateControls();
-      }
-    }
-
     function setBounds(bounds) {
       var precision = zoomPrecision(map.getZoom());
-
       $("#minlon").val(bounds.getWest().toFixed(precision));
       $("#minlat").val(bounds.getSouth().toFixed(precision));
       $("#maxlon").val(bounds.getEast().toFixed(precision));
       $("#maxlat").val(bounds.getNorth().toFixed(precision));
-
-      mapnikSizeChanged();
-      htmlUrlChanged();
     }
 
     function validateControls() {
-      var bounds = getBounds();
-
-      var tooLarge = bounds.getSize() > OSM.MAX_REQUEST_AREA;
-      if (tooLarge) {
-        $("#export_osm_too_large").show();
-      } else {
-        $("#export_osm_too_large").hide();
-      }
-
-      var max_scale = maxMapnikScale();
-      var disabled = true;
-
-      if ($("#format_osm").prop("checked")) {
-        disabled = tooLarge;
-      } else if ($("#format_mapnik").prop("checked")) {
-        disabled = $("#mapnik_scale").val() < max_scale;
-      }
-
-      $("#export_commit").prop("disabled", disabled);
-      $("#mapnik_max_scale").html(roundScale(max_scale));
-    }
-
-    function htmlUrlChanged() {
-      var bounds = getBounds();
-      var layerName = map.getMapBaseLayerId();
-
-      var url = "http://" + OSM.SERVER_URL + "/export/embed.html?bbox=" + bounds.toBBoxString() + "&amp;layer=" + layerName;
-      var markerUrl = "";
-
-      if ($("#marker_lat").val() && $("#marker_lon").val()) {
-        markerUrl = "&amp;mlat=" + $("#marker_lat").val() + "&amp;mlon=" + $("#marker_lon").val();
-        url += "&amp;marker=" + $("#marker_lat").val() + "," + $("#marker_lon").val();
-      }
-
-      var html = '<iframe width="425" height="350" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="'+url+'" style="border: 1px solid black"></iframe>';
-
-      // Create "larger map" link
-      var center = bounds.getCenter();
-
-      var zoom = map.getBoundsZoom(bounds);
-
-      var layers = map.getLayersCode();
-
-      var text = I18n.t('export.start_rjs.view_larger_map');
-      var escaped = [];
-
-      for (var i = 0; i < text.length; ++i) {
-        var c = text.charCodeAt(i);
-        escaped.push(c < 127 ? text.charAt(i) : "&#" + c + ";");
-      }
-
-      html += '<br /><small><a href="http://' + OSM.SERVER_URL + '/?lat='+center.lat+'&amp;lon='+center.lng+'&amp;zoom='+zoom+'&amp;layers='+layers+markerUrl+'">'+escaped.join("")+'</a></small>';
-
-      $("#export_html_text").val(html);
-
-      if ($("#format_html").prop("checked")) {
-        $("#export_html_text").prop("selected", true);
-      }
-    }
-
-    function formatChanged() {
-      $("#export_commit").show();
-
-      if ($("#format_osm").prop("checked")) {
-        $("#export_osm").show();
-      } else {
-        $("#export_osm").hide();
-      }
-
-      if ($("#format_mapnik").prop("checked")) {
-        $("#mapnik_scale").val(getScale());
-        $("#export_mapnik").show();
-
-        mapnikSizeChanged();
-      } else {
-        $("#export_mapnik").hide();
-      }
-
-      if ($("#format_html").prop("checked")) {
-        $("#export_html").show();
-        $("#export_commit").hide();
-        $("#export_html_text").prop("selected", true);
-      } else {
-        $("#export_html").hide();
-
-        clearMarker();
-      }
-
-      validateControls();
-    }
-
-    function maxMapnikScale() {
-      var size = getMercatorBounds().getSize();
-
-      return Math.floor(Math.sqrt(size.x * size.y / 0.3136));
-    }
-
-    function mapnikImageSize(scale) {
-      var size = getMercatorBounds().getSize();
-
-      return {w: Math.round(size.x / scale / 0.00028),
-              h: Math.round(size.y / scale / 0.00028)};
-    }
-
-    function roundScale(scale) {
-      var precision = 5 * Math.pow(10, Math.floor(Math.LOG10E * Math.log(scale)) - 2);
-
-      return precision * Math.ceil(scale / precision);
-    }
-
-    function mapnikSizeChanged() {
-      var size = mapnikImageSize($("#mapnik_scale").val());
-
-      $("#mapnik_image_width").html(size.w);
-      $("#mapnik_image_height").html(size.h);
-
-      validateControls();
+      $("#export_osm_too_large").toggle(getBounds().getSize() > OSM.MAX_REQUEST_AREA);
     }
   }
 }
index 93b60c3e7a09f6c1e907a36e5f71afb7579bba45..63576c06caa4256cd45d4d4bad4436b5b19f6a4c 100644 (file)
@@ -190,7 +190,7 @@ function initializeNotes(map, params) {
       notes[feature.properties.id] = updateMarker(marker, feature);
       newNote = null;
 
-      addNoteButton.removeClass("disabled").addClass("geolink");
+      addNoteButton.removeClass("active").addClass("geolink");
     }
   }
 
@@ -223,9 +223,9 @@ function initializeNotes(map, params) {
     e.preventDefault();
     e.stopPropagation();
 
-    if (addNoteButton.hasClass("disabled")) return;
+    if (addNoteButton.hasClass("active")) return;
 
-    addNoteButton.removeClass("geolink").addClass("disabled");
+    addNoteButton.removeClass("geolink").addClass("active");
 
     map.addLayer(noteLayer);
 
@@ -262,7 +262,7 @@ function initializeNotes(map, params) {
     newNote.addTo(noteLayer).bindPopup(popupContent[0], popupOptions()).openPopup();
 
     newNote.on("remove", function (e) {
-      addNoteButton.removeClass("disabled").addClass("geolink");
+      addNoteButton.removeClass("active").addClass("geolink");
     }).on("dragstart", function (e) {
       $(newNote).stopTime("removenote");
     }).on("dragend", function (e) {
index a50df013e51799871b0f845744a3044c15c9e605..a645ed253b7149ee04cfa58aa7c4806be62c58cb 100644 (file)
@@ -37,6 +37,10 @@ L.extend(L.Map.prototype, {
       params.mlon = marker.getLatLng().lng.toFixed(precision);
     }
 
+    if (this._object) {
+      params[this._object.type] = this._object.id;
+    }
+
     var url = 'http://' + OSM.SERVER_URL + '/',
       query = querystring.stringify(params),
       hash = OSM.formatHash(this);
@@ -50,7 +54,8 @@ L.extend(L.Map.prototype, {
   getShortUrl: function(marker) {
     var zoom = this.getZoom(),
       latLng = marker && this.hasLayer(marker) ? marker.getLatLng() : this.getCenter(),
-      str = '',
+      str = window.location.hostname.match(/^www\.openstreetmap\.org/i) ?
+        'http://osm.org/go/' : 'http://' + window.location.hostname + '/go/',
       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)),
@@ -83,12 +88,63 @@ L.extend(L.Map.prototype, {
       return (x << 1) | y;
     }
 
+    var params = {};
+
     if (marker && this.hasLayer(marker)) {
-      str += '?m'
+      params.m = '';
+    }
+
+    if (this._object) {
+      params[this._object.type] = this._object.id;
+    }
+
+    var query = querystring.stringify(params);
+    if (query) {
+      str += '?' + query;
     }
 
-    return (window.location.hostname.match(/^www\.openstreetmap\.org/i) ?
-            'http://osm.org/go/' : 'http://' + window.location.hostname + '/go/') + str;
+    return str;
+  },
+
+  addObject: function(object, options) {
+    this._object = object;
+
+    if (this._objectLoader) this._objectLoader.abort();
+    if (this._objectLayer) this.removeLayer(this._objectLayer);
+
+    var map = this;
+    this._objectLoader = $.ajax({
+      url: OSM.apiUrl(object),
+      dataType: "xml",
+      success: function (xml) {
+        map._objectLayer = new L.OSM.DataLayer(null, {
+          styles: {
+            node: options.style,
+            way: options.style,
+            area: options.style
+          }
+        });
+
+        map._objectLayer.interestingNode = function (node, ways, relations) {
+          if (object.type === "node") {
+            return true;
+          } else if (object.type === "relation") {
+            for (var i = 0; i < relations.length; i++)
+              if (relations[i].members.indexOf(node) != -1)
+                return true;
+          } else {
+            return false;
+          }
+        };
+
+        map._objectLayer.addData(xml);
+
+        if (options.zoom) map.fitBounds(map._objectLayer.getBounds());
+        if (options.callback) options.callback(map._objectLayer.getBounds());
+
+        map._objectLayer.addTo(map);
+      }
+    });
   }
 });
 
index c5124e39d6cf139e4e5b1115e2c691fed532303d..d88ce5d6e2c7fb881bf2810e46e4198cbffe23c1 100644 (file)
@@ -5,7 +5,7 @@ L.OSM.key = function (options) {
     var $container = $('<div>')
       .attr('class', 'control-key');
 
-    $('<a>')
+    var button = $('<a>')
       .attr('class', 'control-button')
       .attr('href', '#')
       .attr('title', I18n.t('javascripts.key.tooltip'))
@@ -39,6 +39,10 @@ L.OSM.key = function (options) {
       .on('show', shown)
       .on('hide', hidden);
 
+    map.on('baselayerchange', updateButton);
+
+    updateButton();
+
     function shown() {
       map.on('zoomend baselayerchange', update);
       $section.load('/key', update);
@@ -51,7 +55,14 @@ L.OSM.key = function (options) {
     function toggle(e) {
       e.stopPropagation();
       e.preventDefault();
-      options.sidebar.togglePane($ui);
+      if (!button.hasClass('disabled')) {
+        options.sidebar.togglePane($ui, button);
+      }
+    }
+
+    function updateButton() {
+      var layer = map.getMapBaseLayerId();
+      button.toggleClass('disabled', layer !== 'mapnik');
     }
 
     function update() {
index edcbfbd4dd9dd94e73879908644b879f768dc51a..a364588c1dfe073f7778f0390df016b9bdc488fc 100644 (file)
@@ -7,7 +7,7 @@ L.OSM.layers = function(options) {
     var $container = $('<div>')
       .attr('class', 'control-layers');
 
-    var link = $('<a>')
+    var button = $('<a>')
       .attr('class', 'control-button')
       .attr('href', '#')
       .attr('title', 'Layers')
@@ -156,7 +156,7 @@ L.OSM.layers = function(options) {
     function toggle(e) {
       e.stopPropagation();
       e.preventDefault();
-      options.sidebar.togglePane($ui);
+      options.sidebar.togglePane($ui, button);
     }
 
     return $container[0];
index bea877e6686c0da8be68412fd808cc5c55f1e5e4..441acfd7463929ff65bfb9aa4e3753169f96f2af 100644 (file)
@@ -1,11 +1,16 @@
 L.OSM.share = function (options) {
-  var control = L.control(options);
+  var control = L.control(options),
+    marker = L.marker([0, 0], {draggable: true}),
+    locationFilter = new L.LocationFilter({
+      enableButton: false,
+      adjustButton: false
+    });
 
   control.onAdd = function (map) {
     var $container = $('<div>')
       .attr('class', 'control-share');
 
-    $('<a>')
+    var button = $('<a>')
       .attr('class', 'control-button')
       .attr('href', '#')
       .attr('title', 'Share')
@@ -29,6 +34,8 @@ L.OSM.share = function (options) {
         $('<h4>')
           .text(I18n.t('javascripts.share.title')));
 
+    // Link / Embed
+
     var $linkSection = $('<div>')
       .attr('class', 'section share-link')
       .appendTo($ui);
@@ -37,37 +44,311 @@ L.OSM.share = function (options) {
       .text(I18n.t('javascripts.share.link'))
       .appendTo($linkSection);
 
-    var $shortLink, $longLink;
+    var $form = $('<form>')
+      .attr('class', 'standard-form')
+      .appendTo($linkSection);
+
+    $('<div>')
+      .attr('class', 'form-row')
+      .appendTo($form)
+      .append(
+        $('<label>')
+          .attr('for', 'link_marker')
+          .append(
+            $('<input>')
+              .attr('id', 'link_marker')
+              .attr('type', 'checkbox')
+              .bind('change', toggleMarker))
+          .append(I18n.t('javascripts.share.include_marker')));
+
+    $('<div>')
+      .attr('class', 'share-tabs')
+      .appendTo($form)
+      .append($('<a>')
+        .attr('class', 'active')
+        .attr('for', 'long_input')
+        .attr('id', 'long_link')
+        .text(I18n.t('javascripts.share.long_link')))
+      .append($('<a>')
+        .attr('for', 'short_input')
+        .attr('id', 'short_link')
+        .text(I18n.t('javascripts.share.short_link')))
+      .append($('<a>')
+        .attr('for', 'embed_html')
+        .attr('href', '#')
+        .text(I18n.t('javascripts.share.embed')))
+      .on('click', 'a', function(e) {
+        e.preventDefault();
+        var id = '#' + $(this).attr('for');
+        $linkSection.find('.share-tabs a')
+          .removeClass('active');
+        $(this).addClass('active');
+        $linkSection.find('.share-tab')
+          .hide();
+        $linkSection.find('.share-tab:has(' + id + ')')
+          .show()
+          .find('input, textarea')
+          .select();
+      });
+
+    $('<div>')
+      .attr('class', 'form-row share-tab')
+      .css('display', 'block')
+      .appendTo($form)
+      .append($('<input>')
+        .attr('id', 'long_input')
+        .attr('type', 'text')
+        .on('click', select));
+
+    $('<div>')
+      .attr('class', 'form-row share-tab')
+      .appendTo($form)
+      .append($('<input>')
+        .attr('id', 'short_input')
+        .attr('type', 'text')
+        .on('click', select));
 
-    $('<ul>')
-      .appendTo($linkSection)
-      .append($('<li>')
-        .append($longLink = $('<a>')
-          .text(I18n.t('javascripts.share.long_link'))))
-      .append($('<li>')
-        .append($shortLink = $('<a>')
-          .text(I18n.t('javascripts.share.short_link'))));
+    $('<div>')
+      .attr('class', 'form-row share-tab')
+      .appendTo($form)
+      .append(
+        $('<textarea>')
+          .attr('id', 'embed_html')
+          .on('click', select))
+      .append(
+        $('<p>')
+          .attr('class', 'deemphasize')
+          .text(I18n.t('javascripts.share.paste_html'))
+          .appendTo($linkSection));
 
+    // Image
+
+    var $imageSection = $('<div>')
+      .attr('class', 'section share-image')
+      .appendTo($ui);
+
+    $('<h4>')
+      .text(I18n.t('javascripts.share.image'))
+      .appendTo($imageSection);
+
+    $form = $('<form>')
+      .attr('class', 'standard-form')
+      .attr('action', '/export/finish')
+      .attr('method', 'post')
+      .appendTo($imageSection);
+
+    $('<div>')
+      .attr('class', 'form-row')
+      .appendTo($form)
+      .append(
+        $('<label>')
+          .attr('for', 'image_filter')
+          .append(
+            $('<input>')
+              .attr('id', 'image_filter')
+              .attr('type', 'checkbox')
+              .bind('change', toggleFilter))
+          .append(I18n.t('javascripts.share.custom_dimensions')));
+
+    $('<div>')
+      .attr('class', 'form-row')
+      .appendTo($form)
+      .append(
+        $('<label>')
+          .attr('for', 'mapnik_format')
+          .text(I18n.t('javascripts.share.format')))
+      .append($('<select>')
+        .attr('name', 'mapnik_format')
+        .attr('id', 'mapnik_format')
+        .append($('<option>').val('png').text('PNG').prop('selected', true))
+        .append($('<option>').val('jpeg').text('JPEG'))
+        .append($('<option>').val('svg').text('SVG'))
+        .append($('<option>').val('pdf').text('PDF')));
+
+    $('<div>')
+      .attr('class', 'form-row')
+      .appendTo($form)
+      .append($('<label>')
+        .attr('for', 'mapnik_scale')
+        .text(I18n.t('javascripts.share.scale')))
+      .append('1 : ')
+      .append($('<input>')
+        .attr('name', 'mapnik_scale')
+        .attr('id', 'mapnik_scale')
+        .attr('type', 'text')
+        .on('change', update));
+
+    ['minlon', 'minlat', 'maxlon', 'maxlat'].forEach(function(name) {
+      $('<input>')
+        .attr('id', 'mapnik_' + name)
+        .attr('name', name)
+        .attr('type', 'hidden')
+        .appendTo($form);
+    });
+
+    $('<input>')
+      .attr('name', 'format')
+      .attr('value', 'mapnik')
+      .attr('type', 'hidden')
+      .appendTo($form);
+
+    $('<p>')
+      .attr('class', 'deemphasize')
+      .html(I18n.t('javascripts.share.image_size') + ' <span id="mapnik_image_width"></span> x <span id="mapnik_image_height"></span>')
+      .appendTo($form);
+
+    $('<input>')
+      .attr('type', 'submit')
+      .attr('value', I18n.t('javascripts.share.download'))
+      .appendTo($form);
+
+    locationFilter
+      .on('change', update)
+      .addTo(map);
+
+    marker.on('dragend', movedMarker);
+    map.on('move', movedMap);
     map.on('moveend layeradd layerremove', update);
 
     options.sidebar.addPane($ui);
 
+    $ui
+      .on('hide', hidden);
+
+    function hidden() {
+      map.removeLayer(marker);
+      map.options.scrollWheelZoom = map.options.doubleClickZoom = true;
+      locationFilter.disable();
+      update();
+    }
+
     function toggle(e) {
       e.stopPropagation();
       e.preventDefault();
-      options.sidebar.togglePane($ui);
+
+      $('#mapnik_scale').val(getScale());
+      marker.setLatLng(map.getCenter());
+
+      update();
+      options.sidebar.togglePane($ui, button);
+    }
+
+    function toggleMarker() {
+      if ($(this).is(':checked')) {
+        marker.setLatLng(map.getCenter());
+        map.addLayer(marker);
+        map.options.scrollWheelZoom = map.options.doubleClickZoom = 'center';
+      } else {
+        map.removeLayer(marker);
+        map.options.scrollWheelZoom = map.options.doubleClickZoom = true;
+      }
+      update();
+    }
+
+    function toggleFilter() {
+      if ($(this).is(':checked')) {
+        locationFilter.setBounds(map.getBounds().pad(-0.2));
+        locationFilter.enable();
+      } else {
+        locationFilter.disable();
+      }
+      update();
+    }
+
+    function movedMap() {
+      marker.setLatLng(map.getCenter());
+      update();
+    }
+
+    function movedMarker() {
+      if (map.hasLayer(marker)) {
+        map.off('move', movedMap);
+        map.on('moveend', updateOnce);
+        map.panTo(marker.getLatLng());
+      }
+    }
+
+    function updateOnce() {
+      map.off('moveend', updateOnce);
+      map.on('move', movedMap);
       update();
     }
 
     function update() {
-      $shortLink.attr('href', map.getShortUrl());
-      $longLink.attr('href', map.getUrl());
+      var bounds = map.getBounds();
+
+      $('#link_marker')
+        .prop('checked', map.hasLayer(marker));
+
+      $('#image_filter')
+        .prop('checked', locationFilter.isEnabled());
+
+      // Link / Embed
+
+      $('#short_input').val(map.getShortUrl(marker));
+      $('#long_input').val(map.getUrl(marker));
+      $('#short_link').attr('href', map.getShortUrl(marker));
+      $('#long_link').attr('href', map.getUrl(marker));
+
+      var params = {
+        bbox: bounds.toBBoxString(),
+        layer: map.getMapBaseLayerId()
+      };
+
+      if (map.hasLayer(marker)) {
+        params.marker = marker.getLatLng().lat + ',' + marker.getLatLng().lng;
+      }
+
+      $('#embed_html').val(
+        '<iframe width="425" height="350" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="' +
+          escapeHTML('http://' + OSM.SERVER_URL + '/export/embed.html?' + $.param(params)) +
+          '" style="border: 1px solid black"></iframe><br/>' +
+          '<small><a href="' + escapeHTML(map.getUrl(marker)) + '</a></small>');
+
+      // Image
+
+      if (locationFilter.isEnabled()) {
+        bounds = locationFilter.getBounds();
+      }
+
+      var scale = $("#mapnik_scale").val(),
+        size = L.bounds(L.CRS.EPSG3857.project(bounds.getSouthWest()),
+                        L.CRS.EPSG3857.project(bounds.getNorthEast())).getSize(),
+        maxScale = Math.floor(Math.sqrt(size.x * size.y / 0.3136));
+
+      $('#mapnik_minlon').val(bounds.getWest());
+      $('#mapnik_minlat').val(bounds.getSouth());
+      $('#mapnik_maxlon').val(bounds.getEast());
+      $('#mapnik_maxlat').val(bounds.getNorth());
+
+      if (scale < maxScale) {
+        scale = roundScale(maxScale);
+        $("#mapnik_scale").val(scale);
+      }
+
+      $("#mapnik_image_width").text(Math.round(size.x / scale / 0.00028));
+      $("#mapnik_image_height").text(Math.round(size.y / scale / 0.00028));
     }
 
     function select() {
       $(this).select();
     }
 
+    function getScale() {
+      var bounds = map.getBounds(),
+        centerLat = bounds.getCenter().lat,
+        halfWorldMeters = 6378137 * Math.PI * Math.cos(centerLat * Math.PI / 180),
+        meters = halfWorldMeters * (bounds.getEast() - bounds.getWest()) / 180,
+        pixelsPerMeter = map.getSize().x / meters,
+        metersPerPixel = 1 / (92 * 39.3701);
+      return Math.round(1 / (pixelsPerMeter * metersPerPixel));
+    }
+
+    function roundScale(scale) {
+      var precision = 5 * Math.pow(10, Math.floor(Math.LOG10E * Math.log(scale)) - 2);
+      return precision * Math.ceil(scale / precision);
+    }
+
     return $container[0];
   };
 
index 8c4dee308ada2bb36068aaf2f7fe430a9501279c..db9e7aef2505228010751b145e38771e48cc7564 100644 (file)
@@ -2,6 +2,7 @@ L.OSM.sidebar = function(selector) {
   var control = {},
     sidebar = $(selector),
     current = $(),
+    currentButton  = $(),
     map;
 
   control.addTo = function (_) {
@@ -15,17 +16,21 @@ L.OSM.sidebar = function(selector) {
       .appendTo(sidebar);
   };
 
-  control.togglePane = function(pane) {
+  control.togglePane = function(pane, button) {
     current
       .hide()
       .trigger('hide');
 
+    currentButton
+      .removeClass('active');
+
     if (current === pane) {
       $(sidebar).hide();
-      current = $();
+      current = currentButton = $();
     } else {
       $(sidebar).show();
       current = pane;
+      currentButton = button || $();
     }
 
     map.invalidateSize({pan: false, animate: false});
@@ -33,6 +38,9 @@ L.OSM.sidebar = function(selector) {
     current
       .show()
       .trigger('show');
+
+    currentButton
+      .addClass('active');
   };
 
   return control;
index 6d26763f8986ab851f5b1b547a0e6e451a772f56..98299070d2e3ed9e2308909e0a2d330745582551 100644 (file)
@@ -1,5 +1,3 @@
-var objectLoader;
-
 function getUserIcon(url) {
   return L.icon({
     iconUrl: url || <%= asset_path('marker-red.png').to_json %>,
@@ -10,41 +8,3 @@ function getUserIcon(url) {
     shadowSize: [41, 41]
   });
 }
-
-function addObjectToMap(object, map, options) {
-  if (objectLoader) objectLoader.abort();
-  if (map.objectLayer) map.removeLayer(map.objectLayer);
-
-  objectLoader = $.ajax({
-    url: OSM.apiUrl(object),
-    dataType: "xml",
-    success: function (xml) {
-      map.objectLayer = new L.OSM.DataLayer(null, {
-        styles: {
-          node: options.style,
-          way: options.style,
-          area: options.style
-        }
-      });
-
-      map.objectLayer.interestingNode = function (node, ways, relations) {
-        if (object.type === "node") {
-          return true;
-        } else if (object.type === "relation") {
-          for (var i = 0; i < relations.length; i++)
-            if (relations[i].members.indexOf(node) != -1)
-              return true;
-        } else {
-          return false;
-        }
-      };
-
-      map.objectLayer.addData(xml);
-
-      if (options.zoom) map.fitBounds(map.objectLayer.getBounds());
-      if (options.callback) options.callback(map.objectLayer.getBounds());
-
-      map.objectLayer.addTo(map);
-    }
-  });
-}
index e157977d839a415ade02b8f8942bc47a4e11df84..df5edbf7ea6e54d2e6ce4b348fd5a27df23d6d6f 100644 (file)
@@ -306,7 +306,7 @@ table {
 .left_menu {
   left: 0px;
   margin: 0;
-  padding: $lineheight/4 $lineheight/2;
+  padding: $lineheight/4 $lineheight/2 $lineheight/2 $lineheight/2;
   font-size: 12px;
   line-height: 1.25;
   list-style-type: none;
@@ -332,10 +332,6 @@ table {
     font-size: 12px;
     margin: 0;
   }
-
-  li:last-child h4 {
-    padding-top: 0;
-  }
 }
 
 /*
@@ -476,8 +472,7 @@ a.donate {
 
 .site-index #tabnav a#viewanchor,
 .site-edit #tabnav a#editanchor,
-.changeset-list #tabnav a#historyanchor,
-.site-export #tabnav a#exportanchor {
+.changeset-list #tabnav a#historyanchor {
   border-bottom: 1px solid #aaa;
   background: #9ed485;
   color: #000;
@@ -536,37 +531,48 @@ a.donate {
   display: block;
   height: 40px;
   width: 40px;
-  background-color: white;
-  background-color: rgba(255,255,255,.8);
-  border-radius: 4px;
+  background-color: #333;
+  background-color: rgba(0,0,0,.6);
+  -bottom: 1px solid #333; 
+  border-radius: 4px 0 0 4px;
   margin-bottom: 10px;
   outline: none;
+
+  &:hover {
+    background-color: black;
+  }
+
+  &.active {
+    background-color: #9ed485;
+  }
+
+  &.disabled {
+    background-color: #333;
+    background-color: rgba(0,0,0,.5);
+    cursor: default;
+  }
+
+  .icon {
+    margin: 10px;
+  }
 }
 
 .leaflet-control .zoomin,
 .control-layers .control-button {
   margin-bottom: 0px;
-  border-radius: 4px 4px 0px 0px;
+  border-radius: 4px 0 0 0;
 }
 
 .site .leaflet-control .zoomout,
 .control-key .control-button {
-  margin-bottom: 0px;
-  border-radius: 0px;
+  margin-bottom: 0;
+  border-radius: 0;
 }
 
-.leaflet-control .zoomout,
+.leaflet-control .zoomout, // For non-main page maps
 .control-locate .control-button,
 .control-share .control-button {
-  border-radius: 0px 0px 4px 4px;
-}
-
-.leaflet-control .control-button:hover {
-  background-color: white;
-}
-
-.leaflet-control .control-button .icon {
-  margin: 10px;
+  border-radius: 0 0 0 4px;
 }
 
 /* Rules for the home page */
@@ -603,11 +609,14 @@ a.donate {
   }
 }
 
-.layers-ui {
-  ul, li:last-child {
+.layers-ui,
+.share-ui {
+  ul, li:last-child, p:last-child {
     margin-bottom: 0;
   }
+}
 
+.layers-ui {
   li {
     border-radius: 4px;
     overflow: hidden;
@@ -635,18 +644,63 @@ a.donate {
 }
 
 .share-ui {
+  .share-tabs {
+    margin-bottom: 10px;
+
+    a {
+      color: #fff;
+      text-decoration: none;
+      background-color: $lightblue;
+      padding: 5px 10px;
+    }
+
+    a:first-child {
+      border-right: 1px solid #fff;
+      border-radius: 4px 0 0 4px;
+    }
+
+    a:last-child {
+      border-left: 1px solid #fff;
+      border-radius: 0 4px 4px 0;
+    }
+
+    a.active {
+      background-color: $blue;
+    }
+  }
+
+  .share-tab {
+    display: none;
+  }
+
   .share-link {
-    li {
-      display: inline-block;
-      width: 50%;
+    input[type=text],
+    textarea {
+      width: 100%;
+      font-family: monospace;
+      font-size: small;
     }
   }
+
+  .share-image {
+    label {
+      margin-right: 10px;
+    }
+  }
+
+  #embed_html {
+    resize: vertical;
+  }
+
+  #mapnik_scale {
+    width: 100px;
+  }
 }
 
-.site-index .leaflet-top,
-.site-export .leaflet-top {
+.leaflet-top.leaflet-right {
   top: $lineheight/2 !important;
   .leaflet-control {
+    margin-right: 0px !important;
     margin-top: 0px !important;
   }
 }
@@ -851,20 +905,6 @@ ul.results-list li { border-bottom: 1px solid #ccc; }
   margin: $lineheight/4;
 }
 
-.export_details input[type="text"]#export_html_text {
-  width: 100%;
-}
-
-#sidebar #marker_inputs li:last-child {
-  margin-bottom: $lineheight/2;
-}
-
-#export_osm,
-#export_mapnik,
-#export_osmarender {
-  display: none;
-}
-
 /* Rules for the main content area */
 
 #content {
@@ -1612,7 +1652,6 @@ textarea {
 textarea {
   padding: 5px;
   width: 100%;
-  height: 100% !important;
 }
 
 /* Rules for user images */
index cdb16970fb02787e67dc411e668f3918932f80b9..0bc1ac5bb736c3211e860bf7d530756a56a0aba3 100644 (file)
@@ -1,6 +1,5 @@
-<%= form_tag :action => "finish" do %>
-
-  <h4><%= t'export.start.area_to_export' %></h4>
+<%= form_tag :controller => "export", :action => "finish" do %>
+  <%= hidden_field_tag 'format', 'osm' %>
 
   <div class="export_bounds inner12">
     <div class='export_area_inputs'>
     <a id="drag_box" class='export_hint button' href="#"><%= t'export.start.manually_select' %></a>
   </div>
 
-  <h4><%= t'export.start.format_to_export' %></h4>
-
-  <ul class="export_details inner12">
-    <li>
-      <%= radio_button_tag("format", "osm") %>
-      <label for='format_osm'><%= t'export.start.osm_xml_data' %></label>
-    </li>
-    <li>
-      <%= radio_button_tag("format", "mapnik") %>
-      <label for='format_mapnik'><%= t'export.start.map_image' %></label>
-    </li>
-    <li>
-      <%= radio_button_tag("format", "html") %>
-      <label for='format_html'><%= t'export.start.embeddable_html' %></label></li>
-  </ul>
-
   <div id="export_osm">
     <h4><%= t'export.start.licence' %></h4>
 
 
       <div class="export_details inner12">
         <p><%= t'export.start.too_large.body' %></p>
-      </div>
-    </div>
-  </div>
+        <dl>
+          <dt><a href="http://planet.openstreetmap.org/"><%= t'export.start.too_large.planet.title' %></a></dt>
+          <dd><%= t'export.start.too_large.planet.description' %></dd>
 
-  <div id="export_mapnik">
-    <h4><%= t'export.start.options' %></h4>
-
-    <ul class="export_details inner12">
-      <li><%= t'export.start.format' %> <%= select_tag("mapnik_format", options_for_select([["PNG", "png"], ["JPEG", "jpeg"], ["SVG", "svg"], ["PDF", "pdf"]], "png")) %></li>
-      <li><%= t'export.start.scale' %> 1 : <%= text_field_tag("mapnik_scale", nil) %> <p class="deemphasize export_hint">(<%= t'export.start.max' %> 1 : <span id="mapnik_max_scale"></span>)</p></li>
-      <li><%= t'export.start.image_size' %> <span id="mapnik_image_width"></span> x <span id="mapnik_image_height"></span></li>
-    </ul>
-  </div>
+          <dt><a href="http://download.geofabrik.de/"><%= t'export.start.too_large.geofabrik.title' %></a></dt>
+          <dd><%= t'export.start.too_large.geofabrik.description' %></dd>
 
-  <div id="export_html">
-    <h4><%= t'export.start.options' %></h4>
+          <dt><a href="http://metro.teczno.com/"><%= t'export.start.too_large.metro.title' %></a></dt>
+          <dd><%= t'export.start.too_large.metro.description' %></dd>
 
-    <div class="export_details inner12">
-      <ul id="marker_inputs" style="display:none">
-        <li><%= t'export.start.latitude' %> <input type="text" id="marker_lat"/></li>
-        <li><%= t'export.start.longitude' %> <input type="text" id="marker_lon"/></li>
-      </ul>
-      <a id="add_marker" class='button' href="#"><%= t'export.start.add_marker' %></a>
-    </div>
-
-    <h4><%= t'export.start.output' %></h4>
-
-    <div class="export_details inner12">
-      <input type="text" id="export_html_text"/>
-      <p class='deemphasize'><%= t'export.start.paste_html' %></p>
+          <dt><a href="http://wiki.openstreetmap.org/wiki/Download"><%= t'export.start.too_large.other.title' %></a></dt>
+          <dd><%= t'export.start.too_large.other.description' %></dd>
+        </dl>
+      </div>
     </div>
   </div>
 
   <div class="inner12">
     <%= submit_tag t('export.start.export_button'), :id => "export_commit" %>
   </div>
-
 <% end %>
index 0ba203fde18a1c0e4b0c9b31a551a51ebdd11ca9..44edfc6d129aa7f6273192b49dddcbec969975b1 100644 (file)
           </ul>
         </li>
         <li>
-          <h4><%= link_to t('layouts.gps_traces'), traces_path, {
-            :id => 'traceanchor',
-            :title => t('layouts.gps_traces_tooltip')
-          } %></h4>
+          <h4><%= t'layouts.data' %></h4>
+          <ul>
+            <li><%= link_to t('layouts.export_data'), export_path %></li>
+          </ul>
+          <ul>
+            <li><%= link_to t('layouts.gps_traces'), traces_path %></li>
+          </ul>
         </li>
         <%= yield :left_menu %>
       </ul>
           :title => t('javascripts.site.history_tooltip'),
           :class => 'geolink bbox'
         } %></li>
-        <li><%= link_to t('layouts.export'), export_path, {
-          :id => 'exportanchor',
-          :title => t('layouts.export_tooltip'),
-          :data => { :url => url_for(:controller => :export, :action => :start) },
-          :class => 'geolink llz layers'
-        } %></li>
       </ul>
     </div>
     <div id="editmenu" class="menu">
index db5f44356c1292d4959268d9bec54b385a995b7e..cc3cf48150e228d24a70270802297aa8ae6f0e0e 100644 (file)
@@ -4,5 +4,6 @@
     <a class="sidebar_close" href="#"><%= t 'site.sidebar.close' %></a>
   </div>
   <div id="sidebar_content">
+    <%= render :template => 'export/start' if params[:export] %>
   </div>
 </div>
index 06944ce4e3ee70bd0b0f7c0e87ab2ed279e12be5..aabe978f546ee89f3cd309f084335400b255ab1b 100644 (file)
@@ -427,7 +427,19 @@ en:
       export_details: 'OpenStreetMap data is licensed under the <a href="http://opendatacommons.org/licenses/odbl/1.0/">Open Data Commons Open Database License</a> (ODbL).'
       too_large:
         heading: "Area Too Large"
-        body: "This area is too large to be exported as OpenStreetMap XML Data. Please zoom in or select a smaller area."
+        body: "This area is too large to be exported as OpenStreetMap XML Data. Please zoom in or select a smaller area, or use one of the following sources for bulk data downloads:"
+        planet:
+          title: "Planet OSM"
+          description: "Regularly-updated copies of the complete OpenStreetMap database"
+        geofabrik:
+          title: "Geofabrik Downloads"
+          description: "Regularly-updated extracts of continents, countries, and selected cities"
+        metro:
+          title: "Metro Extracts"
+          description: "Extracts for major world cities and their surrounding areas"
+        other:
+          title: "Other Sources"
+          description: "Additional sources listed on the OpenStreetMap wiki"
       options: "Options"
       format: "Format"
       scale: "Scale"
@@ -980,8 +992,8 @@ en:
     view_tooltip: View the map
     edit: Edit
     history: History
-    export: Export
-    export_tooltip: Export map data
+    data: Data
+    export_data: Export Data
     gps_traces: GPS Traces
     gps_traces_tooltip: Manage GPS traces
     user_diaries: User Diaries
@@ -2039,9 +2051,20 @@ en:
     share:
       title: "Share"
       cancel: "Cancel"
-      link: "Link"
+      image: "Image"
+      link: "Link or HTML"
+      long_link: "Link"
       short_link: "Short Link"
-      long_link: "Long Link"
+      embed: "HTML"
+      custom_dimensions: "Set custom dimensions"
+      format: "Format:"
+      scale: "Scale:"
+      image_size: "Image will show standard layer at "
+      download: "Download"
+      short_url: "Short URL"
+      include_marker: "Include marker"
+      center_marker: "Center map on marker"
+      paste_html: "Paste HTML to embed in website"
     key:
       title: "Map Key"
       tooltip: "Map Key"
index 794496b35130fb5121ef764b3947b33187787ff5..b972941d97a06cbb5705ce998d7382fa682e355c 100644 (file)
@@ -1752,6 +1752,7 @@ L.Map = L.Class.extend({
 
                var oldSize = this.getSize();
                this._sizeChanged = true;
+               this._initialCenter = null;
 
                if (this.options.maxBounds) {
                        this.setMaxBounds(this.options.maxBounds);
@@ -1825,7 +1826,7 @@ L.Map = L.Class.extend({
        getCenter: function () { // (Boolean) -> LatLng
                this._checkIfLoaded();
 
-               if (!this._moved()) {
+               if (this._initialCenter && !this._moved()) {
                        return this._initialCenter;
                }
                return this.layerPointToLatLng(this._getCenterLayerPoint());
@@ -6765,15 +6766,22 @@ L.Map.mergeOptions({
 
 L.Map.DoubleClickZoom = L.Handler.extend({
        addHooks: function () {
-               this._map.on('dblclick', this._onDoubleClick);
+               this._map.on('dblclick', this._onDoubleClick, this);
        },
 
        removeHooks: function () {
-               this._map.off('dblclick', this._onDoubleClick);
+               this._map.off('dblclick', this._onDoubleClick, this);
        },
 
        _onDoubleClick: function (e) {
-               this.setZoomAround(e.containerPoint, this._zoom + 1);
+               var map = this._map,
+                   zoom = map.getZoom() + 1;
+
+               if (map.options.doubleClickZoom === 'center') {
+                       map.setZoom(zoom);
+               } else {
+                       map.setZoomAround(e.containerPoint, zoom);
+               }
        }
 });
 
@@ -6833,7 +6841,11 @@ L.Map.ScrollWheelZoom = L.Handler.extend({
 
                if (!delta) { return; }
 
-               map.setZoomAround(this._lastMousePos, zoom + delta);
+               if (map.options.scrollWheelZoom === 'center') {
+                       map.setZoom(zoom + delta);
+               } else {
+                       map.setZoomAround(this._lastMousePos, zoom + delta);
+               }
        }
 });