2 //= require leaflet.sidebar
3 //= require leaflet.locate
4 //= require leaflet.layers
5 //= require leaflet.key
6 //= require leaflet.note
7 //= require leaflet.share
8 //= require index/search
9 //= require index/browse
10 //= require index/export
11 //= require index/notes
12 //= require index/history
15 $(document).ready(function () {
16 var params = OSM.mapParams();
18 var map = L.map("map", {
23 map.attributionControl.setPrefix('');
25 map.hash = L.hash(map);
27 $(window).on('popstate', function(e) {
28 // popstate is triggered when the hash changes as well as on actual navigation
29 // events. We want to update the hash on the latter and not the former.
30 if (e.originalEvent.state) {
35 var copyright = I18n.t('javascripts.map.copyright', {copyright_url: '/copyright'});
39 attribution: copyright,
42 name: I18n.t("javascripts.map.base.standard")
45 attribution: copyright + ". Tiles courtesy of <a href='http://www.opencyclemap.org/' target='_blank'>Andy Allan</a>",
48 name: I18n.t("javascripts.map.base.cycle_map")
50 new L.OSM.TransportMap({
51 attribution: copyright + ". Tiles courtesy of <a href='http://www.opencyclemap.org/' target='_blank'>Andy Allan</a>",
53 keyid: "transportmap",
54 name: I18n.t("javascripts.map.base.transport_map")
56 new L.OSM.MapQuestOpen({
57 attribution: copyright + ". Tiles courtesy of <a href='http://www.mapquest.com/' target='_blank'>MapQuest</a> <img src='http://developer.mapquest.com/content/osm/mq_logo.png'>",
60 name: I18n.t("javascripts.map.base.mapquest")
63 attribution: copyright + ". Tiles courtesy of <a href='http://hot.openstreetmap.org/' target='_blank'>Humanitarian OpenStreetMap Team</a>",
66 name: I18n.t("javascripts.map.base.hot")
70 function updateLayers(params) {
71 var layerParam = params.layers || "M";
74 for (var i = layers.length - 1; i >= 0; i--) {
75 if (layerParam.indexOf(layers[i].options.code) >= 0) {
76 map.addLayer(layers[i]);
77 layersAdded = layersAdded + layers[i].options.code;
78 } else if (i == 0 && layersAdded == "") {
79 map.addLayer(layers[i]);
81 map.removeLayer(layers[i]);
88 $(window).on("hashchange", function () {
89 updateLayers(OSM.mapParams());
92 map.on("baselayerchange", function (e) {
93 if (map.getZoom() > e.layer.options.maxZoom) {
94 map.setView(map.getCenter(), e.layer.options.maxZoom, { reset: true });
98 map.noteLayer = new L.LayerGroup();
99 map.noteLayer.options = {code: 'N'};
101 map.dataLayer = new L.OSM.DataLayer(null);
102 map.dataLayer.options.code = 'D';
104 if (OSM.STATUS != 'api_offline' && OSM.STATUS != 'database_offline') {
105 if (params.layers.indexOf(map.noteLayer.options.code) >= 0) {
106 map.addLayer(map.noteLayer);
109 if (params.layers.indexOf(map.dataLayer.options.code) >= 0) {
110 map.addLayer(map.dataLayer);
114 var position = $('html').attr('dir') === 'rtl' ? 'topleft' : 'topright';
116 L.OSM.zoom({position: position})
122 title: I18n.t('javascripts.map.locate.title'),
123 popup: I18n.t('javascripts.map.locate.popup')
127 var sidebar = L.OSM.sidebar('#map-ui')
155 $('.leaflet-control .control-button').tooltip({placement: 'left', container: 'body'});
157 map.on('moveend layeradd layerremove', function() {
159 map.getCenter().wrap(),
164 var expiry = new Date();
165 expiry.setYear(expiry.getFullYear() + 10);
166 $.cookie("_osm_location", cookieContent(map), { expires: expiry });
168 // Trigger hash update on layer changes.
169 map.hash.onMapMove();
173 map.on('layeradd', function (e) {
174 if (e.layer.options) {
175 var goal = OSM.PIWIK.goals[e.layer.options.keyid];
178 $('body').trigger('piwikgoal', goal);
185 map.fitBounds(params.bounds);
187 map.setView([params.lat, params.lon], params.zoom);
190 var marker = L.marker([0, 0], {icon: getUserIcon()});
193 marker.setLatLng([params.mlat, params.mlon]).addTo(map);
196 $("#homeanchor").on("click", function(e) {
199 var data = $(this).data(),
200 center = L.latLng(data.lat, data.lon);
202 map.setView(center, data.zoom);
203 marker.setLatLng(center).addTo(map);
206 $("a[data-editor=remote]").click(function(e) {
207 remoteEditHandler(map.getBounds());
211 if (OSM.preferred_editor == "remote" && $('body').hasClass("site-edit")) {
212 remoteEditHandler(map.getBounds());
215 if (OSM.params().edit_help) {
220 title: I18n.t('javascripts.edit_help')
224 $('body').one('click', function() {
225 $('#editanchor').tooltip('hide');
229 initializeBrowse(map);
230 initializeNotes(map);
232 OSM.Index = function(map) {
233 var page = {}, minimized = false;
235 page.pushstate = page.popstate = function(path) {
236 if (minimized) $("#sidebar").addClass("minimized");
237 map.invalidateSize();
238 $("#view_tab").addClass("current");
239 $('#sidebar_content').load(path);
242 page.unload = function() {
243 $("#view_tab").removeClass("current");
246 page.minimizeSidebar = function() {
247 $("#sidebar").addClass("minimized");
248 map.invalidateSize();
252 $(document).on("click", "#sidebar_content .close", page.minimizeSidebar);
257 OSM.Browse = function(map) {
260 page.pushstate = page.popstate = function(path, type, id) {
261 $("#sidebar").removeClass("minimized");
262 map.invalidateSize();
263 $('#sidebar_content').load(path, function() {
264 page.load(path, type, id);
268 page.load = function(path, type, id) {
269 if (OSM.STATUS === 'api_offline' || OSM.STATUS === 'database_offline') return;
271 if (type === 'note') {
272 map.noteLayer.showNote(parseInt(id));
274 map.addObject({type: type, id: parseInt(id)}, {zoom: true});
278 page.unload = function() {
285 var history = OSM.History(map);
287 OSM.route = OSM.Router({
289 "/search": OSM.Search(map),
290 "/export": OSM.Export(map),
292 "/user/:display_name/edits": history,
293 "/browse/friends": history,
294 "/browse/nearby": history,
295 "/browse/:type/:id(/history)": OSM.Browse(map)
298 $(document).on("click", "a", function(e) {
299 if (e.isDefaultPrevented() || e.isPropagationStopped()) return;
300 if (this.host === window.location.host && OSM.route(this.pathname + this.search + this.hash)) e.preventDefault();
303 $("#search_form").on("submit", function(e) {
305 OSM.route("/search?query=" + encodeURIComponent($("#query").val()) + OSM.formatHash(map));
308 $("#describe_location").on("click", function(e) {
310 var precision = zoomPrecision(map.getZoom());
311 OSM.route("/search?query=" + encodeURIComponent(
312 map.getCenter().lat.toFixed(precision) + "," +
313 map.getCenter().lng.toFixed(precision)));