]> git.openstreetmap.org Git - rails.git/blob - app/assets/javascripts/index.js
Refactor out 'globals' from more functions
[rails.git] / app / assets / javascripts / index.js
1 //= require_self
2 //= require leaflet.layers
3 //= require leaflet.share
4 //= require leaflet.note
5 //= require leaflet.locate
6 //= require leaflet.customzoom
7 //= require index/browse
8 //= require index/export
9 //= require index/key
10 //= require index/notes
11
12 function allLayers() {
13   return [{
14     layer: new L.OSM.Mapnik({
15       attribution: '',
16       code: "M"
17     }),
18     keyid: "mapnik",
19     name: I18n.t("javascripts.map.base.standard")
20   }, {
21     layer: new L.OSM.CycleMap({
22       attribution: "Tiles courtesy of <a href='http://www.opencyclemap.org/' target='_blank'>Andy Allan</a>",
23       code: "C"
24     }),
25     keyid: "cyclemap",
26     name: I18n.t("javascripts.map.base.cycle_map")
27   }, {
28     layer: new L.OSM.TransportMap({
29       attribution: "Tiles courtesy of <a href='http://www.opencyclemap.org/' target='_blank'>Andy Allan</a>",
30       code: "T"
31     }),
32     keyid: "transportmap",
33     name: I18n.t("javascripts.map.base.transport_map")
34   }, {
35     layer: new L.OSM.MapQuestOpen({
36       attribution: "Tiles courtesy of <a href='http://www.mapquest.com/' target='_blank'>MapQuest</a> <img src='http://developer.mapquest.com/content/osm/mq_logo.png'>",
37       code: "Q"
38     }),
39     keyid: "mapquest",
40     name: I18n.t("javascripts.map.base.mapquest")
41   }];
42 }
43
44 $(document).ready(function () {
45   var params = OSM.mapParams();
46
47   var map = L.map("map", {
48     zoomControl: false,
49     layerControl: false
50   });
51
52   map.attributionControl.setPrefix('');
53
54   var layers = allLayers();
55
56   layers[0].layer.addTo(map);
57
58   $("#map").on("resized", function () {
59     map.invalidateSize();
60   });
61
62   L.control.customZoom({position: 'topright'})
63     .addTo(map);
64
65   var uiPane = $('#map-ui')[0];
66
67   L.OSM.layers({
68     position: 'topright',
69     layers: layers,
70     uiPane: uiPane
71   }).addTo(map);
72
73   L.control.share({
74     getUrl: getShortUrl,
75     uiPane: uiPane
76   }).addTo(map);
77
78   L.control.note({ position: 'topright' }).addTo(map);
79   L.control.locate({ position: 'topright' }).addTo(map);
80   L.control.scale().addTo(map);
81
82   map.on('moveend layeradd layerremove', updateLocation);
83
84   map.markerLayer = L.layerGroup().addTo(map);
85
86   if (!params.object_zoom) {
87     if (params.bbox) {
88       var bbox = L.latLngBounds([params.minlat, params.minlon],
89                                 [params.maxlat, params.maxlon]);
90
91       map.fitBounds(bbox);
92
93       if (params.box) {
94         L.rectangle(bbox, {
95           weight: 2,
96           color: '#e90',
97           fillOpacity: 0
98         }).addTo(map);
99       }
100     } else {
101       map.setView([params.lat, params.lon], params.zoom);
102     }
103   }
104
105   if (params.layers) {
106     var foundLayer = false;
107     for (var i = 0; i < layers.length; i++) {
108       if (params.layers.indexOf(layers[i].layer.options.code) >= 0) {
109         map.addLayer(layers[i].layer);
110         foundLayer = true;
111       } else {
112         map.removeLayer(layers[i].layer);
113       }
114     }
115     if (!foundLayer) {
116       map.addLayer(layers[0].layer);
117     }
118   }
119
120   if (params.marker) {
121     L.marker([params.mlat, params.mlon], {icon: getUserIcon()}).addTo(map.markerLayer);
122   }
123
124   if (params.object) {
125     addObjectToMap(params.object, map, { zoom: params.object_zoom });
126   }
127
128   handleResize();
129
130   $("body").on("click", "a.set_position", setPositionLink(map));
131
132   $("a[data-editor=remote]").click(function(e) {
133       remoteEditHandler(map.getBounds());
134       e.preventDefault();
135   });
136
137   if (OSM.preferred_editor == "remote" && $('body').hasClass("site-edit")) {
138     remoteEditHandler(map.getBounds());
139   }
140
141   $(window).resize(handleResize);
142
143   $("#search_form").submit(submitSearch(map));
144
145
146   if ($("#query").val()) {
147     $("#search_form").submit();
148   }
149
150   // Focus the search field for browsers that don't support
151   // the HTML5 'autofocus' attribute
152   if (!("autofocus" in document.createElement("input"))) {
153     $("#query").focus();
154   }
155 });
156
157 // non-scoped utilities
158 function getMapBaseLayer() {
159   for (var i = 0; i < layers.length; i++) {
160     if (map.hasLayer(layers[i].layer)) {
161       return layers[i];
162     }
163   }
164 }
165
166 function getMapLayers(map) {
167   var layerConfig = '';
168   for (var i in map._layers) { // TODO: map.eachLayer
169     var layer = map._layers[i];
170     if (layer.options && layer.options.code) {
171       layerConfig += layer.options.code;
172     }
173   }
174   return layerConfig;
175 }
176
177 // generate a cookie-safe string of map state
178 function cookieContent(map) {
179   var center = map.getCenter().wrap();
180   return [center.lng, center.lat, map.getZoom(), getMapLayers(map)].join('|');
181 }
182
183 function updateLocation() {
184   updatelinks(this.getCenter().wrap(),
185       this.getZoom(),
186       getMapLayers(this),
187       this.getBounds().wrap(), {});
188
189   var expiry = new Date();
190   expiry.setYear(expiry.getFullYear() + 10);
191   $.cookie("_osm_location", cookieContent(this), { expires: expiry });
192 }
193
194 function setPositionLink(map) {
195   return function(e) {
196       var data = $(this).data(),
197           center = L.latLng(data.lat, data.lon);
198
199       if (data.minLon && data.minLat && data.maxLon && data.maxLat) {
200         map.fitBounds([[data.minLat, data.minLon],
201                        [data.maxLat, data.maxLon]]);
202       } else {
203         map.setView(center, data.zoom);
204       }
205
206       if (data.type && data.id) {
207         addObjectToMap(data, map, { zoom: true, style: { opacity: 0.2, fill: false } });
208       }
209
210       map.markerLayer.clearLayers();
211       L.marker(center, {icon: getUserIcon()}).addTo(map.markerLayer);
212
213       return e.preventDefault();
214   };
215 }
216
217 function submitSearch(map) {
218   return function(e) {
219     var bounds = map.getBounds();
220
221     $("#sidebar_title").html(I18n.t('site.sidebar.search_results'));
222     $("#sidebar_content").load($(this).attr("action"), {
223       query: $("#query").val(),
224       minlon: bounds.getWestLng(),
225       minlat: bounds.getSouthLat(),
226       maxlon: bounds.getEastLng(),
227       maxlat: bounds.getNorthLat()
228     }, openSidebar);
229
230     return e.preventDefault();
231   };
232 }