L.OSM.share = function (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 = $('
') .attr('class', 'deemphasize') .text(I18n.t('javascripts.share.paste_html')) .appendTo($linkSection)); // Geo URI var $geoUriSection = $('
') .attr('class', 'deemphasize') .html(I18n.t('javascripts.share.image_size') + ' x ') .appendTo($form); $('') .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(); $('#mapnik_scale').val(getScale()); marker.setLatLng(map.getCenter()); update(); options.sidebar.togglePane($ui, button); $('.leaflet-control .control-button').tooltip('hide'); } 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 escapeHTML(string) { var htmlEscapes = { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }; return string === null ? '' : (string + '').replace(/[&<>"']/g, function(match) { return htmlEscapes[match]; }); } function update() { 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)) { var latLng = marker.getLatLng().wrap(); params.marker = latLng.lat + ',' + latLng.lng; } $('#embed_html').val( '' + '' + escapeHTML(I18n.t('javascripts.share.view_larger_map')) + ''); // Geo URI $('#geo_uri') .attr('href', map.getGeoUri(marker)) .html(map.getGeoUri(marker)); // 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]; }; return control; };