6c1c1610f373461a37fe7ddacabf13d40ef0a206
[rails.git] / app / assets / javascripts / index.js
1 //= require_self
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
13 //= require index/note
14 //= require router
15
16 $(document).ready(function () {
17   var params = OSM.mapParams();
18
19   var map = new L.OSM.Map("map", {
20     zoomControl: false,
21     layerControl: false
22   });
23
24   map.attributionControl.setPrefix('');
25
26   map.hash = L.hash(map);
27
28   $(window).on('popstate', function(e) {
29     // popstate is triggered when the hash changes as well as on actual navigation
30     // events. We want to update the hash on the latter and not the former.
31     if (e.originalEvent.state) {
32       map.hash.update();
33     }
34   });
35
36   map.updateLayers(params);
37
38   $(window).on("hashchange", function () {
39     map.updateLayers(OSM.mapParams());
40   });
41
42   map.on("baselayerchange", function (e) {
43     if (map.getZoom() > e.layer.options.maxZoom) {
44       map.setView(map.getCenter(), e.layer.options.maxZoom, { reset: true });
45     }
46   });
47
48   var position = $('html').attr('dir') === 'rtl' ? 'topleft' : 'topright';
49
50   L.OSM.zoom({position: position})
51     .addTo(map);
52
53   L.control.locate({
54     position: position,
55     strings: {
56       title: I18n.t('javascripts.map.locate.title'),
57       popup: I18n.t('javascripts.map.locate.popup')
58     }
59   }).addTo(map);
60
61   var sidebar = L.OSM.sidebar('#map-ui')
62     .addTo(map);
63
64   L.OSM.layers({
65     position: position,
66     layers: map.baseLayers,
67     sidebar: sidebar
68   }).addTo(map);
69
70   L.OSM.key({
71     position: position,
72     sidebar: sidebar
73   }).addTo(map);
74
75   L.OSM.share({
76     position: position,
77     sidebar: sidebar,
78     short: true
79   }).addTo(map);
80
81   L.OSM.note({
82     position: position,
83     sidebar: sidebar
84   }).addTo(map);
85
86   L.control.scale()
87     .addTo(map);
88
89   if (OSM.STATUS != 'api_offline' && OSM.STATUS != 'database_offline') {
90     initializeNotes(map);
91     if (params.layers.indexOf(map.noteLayer.options.code) >= 0) {
92       map.addLayer(map.noteLayer);
93     }
94
95     initializeBrowse(map);
96     if (params.layers.indexOf(map.dataLayer.options.code) >= 0) {
97       map.addLayer(map.dataLayer);
98     }
99   }
100
101   $('.leaflet-control .control-button').tooltip({placement: 'left', container: 'body'});
102
103   map.on('moveend layeradd layerremove', function() {
104     updatelinks(
105       map.getCenter().wrap(),
106       map.getZoom(),
107       map.getLayersCode(),
108       map._object);
109
110     var expiry = new Date();
111     expiry.setYear(expiry.getFullYear() + 10);
112     $.cookie("_osm_location", cookieContent(map), { expires: expiry });
113
114     // Trigger hash update on layer changes.
115     map.hash.onMapMove();
116   });
117
118   if (OSM.PIWIK) {
119     map.on('layeradd', function (e) {
120       if (e.layer.options) {
121         var goal = OSM.PIWIK.goals[e.layer.options.keyid];
122
123         if (goal) {
124           $('body').trigger('piwikgoal', goal);
125         }
126       }
127     });
128   }
129
130   if (params.bounds) {
131     map.fitBounds(params.bounds);
132   } else {
133     map.setView([params.lat, params.lon], params.zoom);
134   }
135
136   var marker = L.marker([0, 0], {icon: getUserIcon()});
137
138   if (params.marker) {
139     marker.setLatLng([params.mlat, params.mlon]).addTo(map);
140   }
141
142   $("#homeanchor").on("click", function(e) {
143     e.preventDefault();
144
145     var data = $(this).data(),
146       center = L.latLng(data.lat, data.lon);
147
148     map.setView(center, data.zoom);
149     marker.setLatLng(center).addTo(map);
150   });
151
152   $("a[data-editor=remote]").click(function(e) {
153       remoteEditHandler(map.getBounds());
154       e.preventDefault();
155   });
156
157   if (OSM.preferred_editor == "remote" && $('body').hasClass("site-edit")) {
158     remoteEditHandler(map.getBounds());
159   }
160
161   if (OSM.params().edit_help) {
162     $('#editanchor')
163       .removeAttr('title')
164       .tooltip({
165         placement: 'bottom',
166         title: I18n.t('javascripts.edit_help')
167       })
168       .tooltip('show');
169
170     $('body').one('click', function() {
171       $('#editanchor').tooltip('hide');
172     });
173   }
174
175   OSM.Index = function(map) {
176     var page = {};
177
178     page.pushstate = page.popstate = function(path) {
179       $("#content").addClass("overlay-sidebar");
180       map.invalidateSize();
181       $('#sidebar_content').load(path + "?xhr=1", function(a, b, xhr) {
182         if (xhr.getResponseHeader('X-Page-Title')) {
183           document.title = xhr.getResponseHeader('X-Page-Title');
184         }
185       });
186     };
187
188     page.unload = function() {
189       $("#content").removeClass("overlay-sidebar");
190       map.invalidateSize();
191     };
192
193     return page;
194   };
195
196   OSM.Browse = function(map) {
197     var page = {};
198
199     page.pushstate = page.popstate = function(path, type, id) {
200       $('#sidebar_content').load(path + "?xhr=1", function(a, b, xhr) {
201         if (xhr.getResponseHeader('X-Page-Title')) {
202           document.title = xhr.getResponseHeader('X-Page-Title');
203         }
204         page.load(path, type, id);
205       });
206     };
207
208     page.load = function(path, type, id) {
209       if (OSM.STATUS === 'api_offline' || OSM.STATUS === 'database_offline') return;
210
211       if (type === 'note') {
212         map.noteLayer.showNote(parseInt(id));
213       } else {
214         map.addObject({type: type, id: parseInt(id)}, {zoom: true});
215       }
216     };
217
218     page.unload = function() {
219       map.removeObject();
220     };
221
222     return page;
223   };
224
225   var history = OSM.History(map),
226     note = OSM.Note(map);
227
228   OSM.route = OSM.Router({
229     "/":                           OSM.Index(map),
230     "/search":                     OSM.Search(map),
231     "/export":                     OSM.Export(map),
232     "/history":                    history,
233     "/user/:display_name/edits":   history,
234     "/browse/friends":             history,
235     "/browse/nearby":              history,
236     "/browse/note/:id":            note,
237     "/browse/:type/:id(/history)": OSM.Browse(map)
238   });
239
240   $(document).on("click", "a", function(e) {
241     if (e.isDefaultPrevented() || e.isPropagationStopped()) return;
242     if (this.host === window.location.host && OSM.route(this.pathname + this.search + this.hash)) e.preventDefault();
243   });
244
245   $(".search_form").on("submit", function(e) {
246     e.preventDefault();
247     $("header").addClass("closed");
248     OSM.route("/search?query=" + encodeURIComponent($(this).find("input[name=query]").val()) + OSM.formatHash(map));
249   });
250
251   $(".describe_location").on("click", function(e) {
252     e.preventDefault();
253     var precision = zoomPrecision(map.getZoom());
254     OSM.route("/search?query=" + encodeURIComponent(
255       map.getCenter().lat.toFixed(precision) + "," +
256       map.getCenter().lng.toFixed(precision)));
257   });
258 });