]> git.openstreetmap.org Git - rails.git/blob - app/assets/javascripts/index/search.js
Merge branch 'jfire2' into routing
[rails.git] / app / assets / javascripts / index / search.js
1 OSM.Search = function(map) {
2   $(".search_form input[name=query]").on("input", function(e) {
3     if ($(e.target).val() == "") {
4       $(".describe_location").fadeIn(100);
5     } else {
6       $(".describe_location").fadeOut(100);
7     }
8   });
9
10   $(".search_form").on("submit", function(e) {
11     e.preventDefault();
12     $("header").addClass("closed");
13     var query = $(this).find("input[name=query]").val();
14     if (query) {
15       OSM.router.route("/search?query=" + encodeURIComponent(query) + OSM.formatHash(map));
16     } else {
17       OSM.router.route("/" + OSM.formatHash(map));
18     }
19   });
20
21   $(".describe_location").on("click", function(e) {
22     e.preventDefault();
23     var precision = OSM.zoomPrecision(map.getZoom());
24     OSM.router.route("/search?query=" + encodeURIComponent(
25         map.getCenter().lat.toFixed(precision) + "," +
26         map.getCenter().lng.toFixed(precision)));
27   });
28
29   $("#sidebar_content")
30     .on("click", ".search_more a", clickSearchMore)
31     .on("click", ".search_results_entry a.set_position", clickSearchResult);
32
33   function clickSearchMore(e) {
34     e.preventDefault();
35     e.stopPropagation();
36
37     var div = $(this).parents(".search_more");
38
39     $(this).hide();
40     div.find(".loader").show();
41
42     $.get($(this).attr("href"), function(data) {
43       div.replaceWith(data);
44     });
45   }
46
47   function clickSearchResult(e) {
48     var data = $(this).data(),
49       center = L.latLng(data.lat, data.lon);
50
51     if (data.minLon && data.minLat && data.maxLon && data.maxLat) {
52       map.fitBounds([[data.minLat, data.minLon], [data.maxLat, data.maxLon]]);
53     } else {
54       map.setView(center, data.zoom);
55     }
56
57     // Let clicks to object browser links propagate.
58     if (data.type && data.id) return;
59
60     marker.setLatLng(center).addTo(map);
61
62     e.preventDefault();
63     e.stopPropagation();
64   }
65
66   var marker = L.marker([0, 0], {icon: getUserIcon()});
67
68   var page = {};
69
70   page.pushstate = page.popstate = function(path) {
71     var params = querystring.parse(path.substring(path.indexOf('?') + 1));
72     $(".search_form input[name=query]").val(params.query);
73     OSM.loadSidebarContent(path, page.load);
74   };
75
76   page.load = function() {
77     $(".search_results_entry").each(function() {
78       var entry = $(this);
79       $.ajax({
80         url: entry.data("href"),
81         method: 'GET',
82         data: {
83           zoom: map.getZoom(),
84           minlon: map.getBounds().getWest(),
85           minlat: map.getBounds().getSouth(),
86           maxlon: map.getBounds().getEast(),
87           maxlat: map.getBounds().getNorth()
88         },
89         success: function(html) {
90           entry.html(html);
91         }
92       });
93     });
94
95     return map.getState();
96   };
97
98   page.unload = function() {
99     map.removeLayer(marker);
100     map.removeObject();
101     $(".search_form input[name=query]").val("");
102     $(".describe_location").fadeIn(100);
103   };
104
105   return page;
106 };