require 'rexml/document'
def search
- @query = params[:query]
- @results = Array.new
-
- if @query.match(/^\d{5}(-\d{4})?$/)
- @results.push search_us_postcode(@query)
- elsif @query.match(/(GIR 0AA|[A-PR-UWYZ]([0-9]{1,2}|([A-HK-Y][0-9]|[A-HK-Y][0-9]([0-9]|[ABEHMNPRV-Y]))|[0-9][A-HJKS-UW])\s*[0-9][ABD-HJLNP-UW-Z]{2})/i)
- @results.push search_uk_postcode(@query)
- elsif @query.match(/[A-Z]\d[A-Z]\s*\d[A-Z]\d/i)
- @results.push search_ca_postcode(@query)
+ query = params[:query]
+ results = Array.new
+
+ if query.match(/^\d{5}(-\d{4})?$/)
+ results.push search_us_postcode(query)
+ elsif query.match(/(GIR 0AA|[A-PR-UWYZ]([0-9]{1,2}|([A-HK-Y][0-9]|[A-HK-Y][0-9]([0-9]|[ABEHMNPRV-Y]))|[0-9][A-HJKS-UW])\s*[0-9][ABD-HJLNP-UW-Z]{2})/i)
+ results.push search_uk_postcode(query)
+ elsif query.match(/[A-Z]\d[A-Z]\s*\d[A-Z]\d/i)
+ results.push search_ca_postcode(query)
else
- @results.push search_osm_namefinder(@query)
- @results.push search_geonames(@query)
+ results.push search_osm_namefinder(query)
+ results.push search_geonames(query)
+ end
+
+ results_count = count_results(results)
+
+ render :update do |page|
+ if results_count == 1
+ position = results.collect { |s| s[:results] }.compact.flatten[0]
+ page.call "setPosition", position[:lat], position[:lon], position[:zoom]
+ else
+ page.replace_html :search_results_content, :partial => 'results', :object => results
+ page.call "openSearchResults"
+ end
end
end
return "north-west" if bearing >= 292.5 and bearing < 337.5
return "west"
end
+
+ def count_results(results)
+ count = 0
+
+ results.each do |source|
+ count += source[:results].length if source[:results]
+ end
+
+ return count
+ end
end
<script type="text/javascript">
<!--
+ function startSearch() {
+ $("search_field").style.display = "none";
+ $("search_active").style.display = "inline";
+ }
+
+ function endSearch() {
+ $("search_field").style.display = "inline";
+ $("search_active").style.display = "none";
+ }
+
function openSearchResults() {
$("search_results").style.display = "block";
- $("search_results_content").innerHTML = "<p class='search_results_entry'>Searching...</p>";
<%= onopen %>
}
}
<% if params[:query] %>
- <%= remote_function(:update => :search_results_content,
- :loading => "openSearchResults()",
+ <%= remote_function(:loading => "startSearch()",
+ :complete => "endSearch()",
:url => { :controller => :geocoder, :action => :search, :query => params[:query] }) %>
<% end %>
// -->
<% content_for "optionals" do %>
<div class="optionalbox">
<span class="oboxheader">Search</span>
- <% form_remote_tag(:update => :search_results_content,
- :loading => "openSearchResults()",
+ <div class="search_form">
+ <span id="search_field">
+ <% form_remote_tag(:loading => "startSearch()",
+ :complete => "endSearch()",
:url => { :controller => :geocoder, :action => :search }) do %>
<%= text_field_tag :query, params[:query] %>
<% end %>
+ </span>
+ <p id="search_active">Searching...</p>
+ </div>
<p class="search_help">
examples: 'Alkmaar', 'Regent Street, Cambridge', 'CB2 5AQ',
or 'post offices near Lünen'