});
}
- initializeSearch(map);
initializeBrowse(map, params);
initializeNotes(map, params);
var router = OSM.Router({
"/": OSM.Index(map),
+ "/search": OSM.Search(map),
"/export": OSM.Export(map),
"/browse/changesets": OSM.ChangesetList(map),
"/browse/:type/:id(/history)": OSM.Browse(map)
$(document).on("click", "a", function(e) {
if (router(this.pathname + this.search + this.hash)) e.preventDefault();
});
+
+ $("#search_form").on("submit", function(e) {
+ e.preventDefault();
+ router("/search?query=" + encodeURIComponent($("#query").val()) + OSM.formatHash(map));
+ });
+
+ $("#describe_location").on("click", function(e) {
+ e.preventDefault();
+ router("/search?query=" + encodeURIComponent(map.getCenter().lat + "," + map.getCenter().lng));
+ });
});
-function initializeSearch(map) {
- $("#search_form").submit(submitSearch);
- $("#describe_location").click(describeLocation);
-
- if ($("#query").val()) {
- $("#search_form").submit();
- }
-
+OSM.Search = function(map) {
$("#query")
.on("focus", function() {
$("#describe_location").fadeOut(100);
$("#sidebar_content").on("click", ".search_results_entry a.set_position", clickSearchResult);
- var marker = L.marker([0, 0], {icon: getUserIcon()});
-
- function submitSearch(e) {
- e.preventDefault();
-
- var bounds = map.getBounds();
-
- $("#sidebar_content").load($(this).attr("action"), {
- query: $("#query").val(),
- zoom: map.getZoom(),
- minlon: bounds.getWest(),
- minlat: bounds.getSouth(),
- maxlon: bounds.getEast(),
- maxlat: bounds.getNorth()
- });
-
- $("#sidebar").one("closed", function () {
- map.removeLayer(marker);
- map.removeObject();
- });
- }
-
function clickSearchResult(e) {
e.preventDefault();
if (data.minLon && data.minLat && data.maxLon && data.maxLat) {
map.fitBounds([[data.minLat, data.minLon],
- [data.maxLat, data.maxLon]]);
+ [data.maxLat, data.maxLon]]);
} else {
map.setView(center, data.zoom);
}
}
}
- function describeLocation(e) {
- e.preventDefault();
-
- var center = map.getCenter(),
- zoom = map.getZoom();
+ var marker = L.marker([0, 0], {icon: getUserIcon()});
- $("#sidebar_content").load($(this).attr("href"), {
- lat: center.lat,
- lon: center.lng,
- zoom: zoom
+ var page = {};
+
+ page.pushstate = page.popstate = function(path) {
+ var params = querystring.parse(path.substring(path.indexOf('?') + 1));
+ $("#query").val(params.query);
+ $("#sidebar_content").load(path, page.load);
+ };
+
+ page.load = function() {
+ $(".search_results_entry").each(function() {
+ var entry = $(this);
+ $.ajax({
+ url: entry.data("href"),
+ method: 'GET',
+ data: {
+ zoom: map.getZoom(),
+ minlon: map.getBounds().getWest(),
+ minlat: map.getBounds().getSouth(),
+ maxlon: map.getBounds().getEast(),
+ maxlat: map.getBounds().getNorth()
+ },
+ success: function(html) {
+ entry.html(html);
+ }
+ });
});
- }
-}
+ };
+
+ page.unload = function() {
+ map.removeLayer(marker);
+ map.removeObject();
+ $("#query").val("");
+ };
+
+ return page;
+};
.replace(namedParam, function(match, optional){
return optional ? match : '([^\/]+)';
})
- .replace(splatParam, '(.*?)') + '(?:$|[?#])');
+ .replace(splatParam, '(.*?)') + '(?:\\?.*)?$');
var route = {};
}
};
- var currentPath = window.location.pathname,
+ var currentPath = window.location.pathname + window.location.search,
currentRoute = routes.recognize(currentPath);
currentRoute.run('load', currentPath);
if (window.history && window.history.pushState) {
$(window).on('popstate', function() {
- var path = window.location.pathname;
+ var path = window.location.pathname + window.location.search;
if (path === currentPath) return;
currentRoute.run('unload');
currentPath = path;
@sources.push "osm_nominatim"
@sources.push "geonames" if defined?(GEONAMES_USERNAME)
end
+
+ render :layout => map_layout
end
def search_us_postcode
<h2><%= t('site.sidebar.search_results') %></h2>
<% @sources.each do |source| %>
<h4><%= raw(t "geocoder.search.title.#{source}") %></h4>
- <div class="search_results_entry" id="<%= "search_#{source}" %>">
+ <div class="search_results_entry" data-href="<%= url_for params.merge(:action => "search_#{source}") %>">
<%= image_tag "searching.gif", :class => "search_searching" %>
</div>
- <script type="text/javascript">
- $("#search_<%= source %>").load("<%= raw url_for params.merge(:action => "search_#{source}") %>");
- </script>
<% end %>
<% content_for :content do %>
<div id="sidebar">
- <%= form_tag url_for(:controller => :geocoder, :action => :search), :id => "search_form" do %>
+ <%= form_tag search_path, :id => "search_form" do %>
<%= submit_tag t('site.search.submit_text') %>
<div id='query_wrapper'>
<%= text_field_tag :query, params[:query],
:placeholder => t('site.search.search') %>
- <%= link_to t('site.search.where_am_i'),
- { :controller => :geocoder, :action => :description },
- { :id => "describe_location", :title => t('site.search.where_am_i_title') } %>
+ <%= link_to t('site.search.where_am_i'), '#', { :id => "describe_location", :title => t('site.search.where_am_i_title') } %>
</div>
<% end %>
match '/users/:status' => 'user#list', :via => [:get, :post]
# geocoder
- match '/geocoder/search' => 'geocoder#search', :via => :post
+ match '/search' => 'geocoder#search', :via => :get, :as => :search
match '/geocoder/search_us_postcode' => 'geocoder#search_us_postcode', :via => :get
match '/geocoder/search_uk_postcode' => 'geocoder#search_uk_postcode', :via => :get
match '/geocoder/search_ca_postcode' => 'geocoder#search_ca_postcode', :via => :get