Improve the layout of the object browser views.
authorTom Hughes <tom@compton.nu>
Tue, 24 Jun 2008 16:44:45 +0000 (16:44 +0000)
committerTom Hughes <tom@compton.nu>
Tue, 24 Jun 2008 16:44:45 +0000 (16:44 +0000)
26 files changed:
app/models/old_node.rb
app/models/old_relation.rb
app/models/old_way.rb
app/models/relation.rb
app/models/way.rb
app/views/browse/_common.rhtml [deleted file]
app/views/browse/_common_details.rhtml [new file with mode: 0644]
app/views/browse/_common_editedby.rhtml [deleted file]
app/views/browse/_containing_relation.rhtml [new file with mode: 0644]
app/views/browse/_map.rhtml
app/views/browse/_member.rhtml [deleted file]
app/views/browse/_navigation.rhtml
app/views/browse/_node_details.rhtml [new file with mode: 0644]
app/views/browse/_relation_details.rhtml [new file with mode: 0644]
app/views/browse/_relation_member.rhtml [new file with mode: 0644]
app/views/browse/_relation_members.rhtml [deleted file]
app/views/browse/_tag.rhtml
app/views/browse/_tag_table.rhtml [deleted file]
app/views/browse/_way_details.rhtml [new file with mode: 0644]
app/views/browse/node.rhtml
app/views/browse/node_history.rhtml
app/views/browse/relation.rhtml
app/views/browse/relation_history.rhtml
app/views/browse/way.rhtml
app/views/browse/way_history.rhtml
config/routes.rb

index 7bafca0531a631767bc673617c005c770d345205..76eab8427b2c570cce79846887706eb6c10923b6 100644 (file)
@@ -58,4 +58,14 @@ class OldNode < ActiveRecord::Base
     end
     hash
   end
+
+  # Pretend we're not in any ways
+  def ways
+    return []
+  end
+
+  # Pretend we're not in any relations
+  def containing_relation_members
+    return []
+  end
 end
index 6da7814c28a40d442e856239e09149b2ca8727c5..bac03c4d2eff6811a9dc4b5d2c32e3bb988e76b3 100644 (file)
@@ -107,5 +107,20 @@ class OldRelation < ActiveRecord::Base
       el1 << e
     end
     return el1
-  end 
+  end
+
+  # Temporary method to match interface to nodes
+  def tags_as_hash
+    return self.tags
+  end
+
+  # Temporary method to match interface to relations
+  def relation_members
+    return self.old_members
+  end
+
+  # Pretend we're not in any relations
+  def containing_relation_members
+    return []
+  end
 end
index a2b165e42716f5cfa7f095aa76654616274f95b5..1abb23bbbac13292b4f5f6949781b5cd4b55ff8f 100644 (file)
@@ -108,5 +108,20 @@ class OldWay < ActiveRecord::Base
       el1 << e
     end
     return el1
-  end 
+  end
+
+  # Temporary method to match interface to nodes
+  def tags_as_hash
+    return self.tags
+  end
+
+  # Temporary method to match interface to ways
+  def way_nodes
+    return self.old_nodes
+  end
+
+  # Pretend we're not in any relations
+  def containing_relation_members
+    return []
+  end
 end
index 71ddc4a554f0e696b83187d1df5014bade7946c3..a1dc9f81d646195704f3dfc2a326997c39d63157 100644 (file)
@@ -257,4 +257,8 @@ class Relation < ActiveRecord::Base
     return false
   end
 
+  # Temporary method to match interface to nodes
+  def tags_as_hash
+    return self.tags
+  end
 end
index 8ae6b40846944a41dca2ac03c542824fbb68fea1..b042be59eca4baecfecfe20e8fd3e3a0e9d610f3 100644 (file)
@@ -257,4 +257,9 @@ class Way < ActiveRecord::Base
     self.delete_with_relations_and_history(user)
 
   end
+
+  # Temporary method to match interface to nodes
+  def tags_as_hash
+    return self.tags
+  end
 end
diff --git a/app/views/browse/_common.rhtml b/app/views/browse/_common.rhtml
deleted file mode 100644 (file)
index f237bfe..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-<% if obj.visible %>
-<%= render :partial => 'map', :locals => { :type => type, :id => obj.id } %>
-<% else %>
-Deleted
-<% end %>
-<ul>
-<% if obj.visible %>
-<li><%= link_to h("API"), :controller => type, :action => "read", :id => obj.id %></li>
-<% end %>
-<li><%= link_to h("History"), :controller => "old_" + type, :action => "history", :id => obj.id %> 
-    (<%= link_to h("HTML"), :action => type+"_history", :id => obj.id %>)</li>
-</ul>
-<%= render :partial => 'common_editedby', :locals => { :obj => obj } %>
diff --git a/app/views/browse/_common_details.rhtml b/app/views/browse/_common_details.rhtml
new file mode 100644 (file)
index 0000000..ee5f22c
--- /dev/null
@@ -0,0 +1,22 @@
+<tr>
+  <th>Edited at:</th>
+  <td><%= h(common_details.timestamp) %></td>
+</tr>
+
+<% if common_details.user.data_public %>
+  <tr>
+    <th>Edited by:</th>
+    <td><%= link_to h(common_details.user.display_name), :controller => "user", :action => "view", :display_name => common_details.user.display_name %></td>
+  </tr>
+<% end %>
+
+<% unless common_details.tags_as_hash.empty? %>
+  <tr valign="top">
+    <th>Tags:</th>
+    <td>
+      <table padding="0">
+        <%= render :partial => "tag", :collection => common_details.tags_as_hash %>
+      </table>
+    </td>
+  </tr>      
+<% end %>
diff --git a/app/views/browse/_common_editedby.rhtml b/app/views/browse/_common_editedby.rhtml
deleted file mode 100644 (file)
index 0f00f3e..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-Last edited: <%= h(obj.timestamp) %>
-<% if obj.user.data_public %>
-by <%= link_to h(obj.user.display_name), :controller => 'user', :action => 'view' , :display_name => obj.user.display_name %>
-<% end %>
diff --git a/app/views/browse/_containing_relation.rhtml b/app/views/browse/_containing_relation.rhtml
new file mode 100644 (file)
index 0000000..b33dea5
--- /dev/null
@@ -0,0 +1,8 @@
+<tr>
+  <td>
+    <%= link_to "Relation " + containing_relation.id.to_s, :action => "relation", :id => containing_relation.id.to_s %>
+    <% unless containing_relation.member_role.blank? %>
+      (as <%= h(containing_relation.member_role) %>)
+    <% end %>
+  </td>
+</tr>
index a0fcc06aae471aab057a6c73e89451058e23b275..9ca0a163af6941489c82fd85295f81ce865e70d6 100644 (file)
@@ -1,44 +1,58 @@
 <%= javascript_include_tag '/openlayers/OpenLayers.js' %>
 <%= javascript_include_tag '/openlayers/OpenStreetMap.js' %>
 <%= javascript_include_tag 'map.js' %>
-<div style="float:right">
 <div id="small_map" style="width:250px; height: 300px; border: solid 1px black">
 </div>
+<span id="loading">Loading...</span>
+<a id="larger_map" href=""></a>
 <script type="text/javascript">
   function init() {
-  var obj_type = '<%= type %>';
-  var obj_id = <%= id %>;
-  var url = "/api/<%= "#{API_VERSION}" %>/<%= type %>/<%= id %>";
-  if (obj_type != "node") {
-    url += "/full";
-  }
-  var map = createMap('small_map', {controls: [new OpenLayers.Control.Navigation()]});
-  var osm_layer = new OpenLayers.Layer.GML("OSM", url, {format: OpenLayers.Format.OSM, projection: new OpenLayers.Projection("EPSG:4326")});
-  osm_layer.events.register("loadend", osm_layer, function() {
-    $("loading").innerHTML = "";
-    if (this.features.length) { 
+    var obj_type = "<%= type %>";
+    var obj_id = <%= id %>;
+    var url = "/api/<%= "#{API_VERSION}" %>/<%= type %>/<%= id %>";
+
+    if (obj_type != "node") {
+      url += "/full";
+    }
+
+    var map = createMap("small_map", {
+      controls: [ new OpenLayers.Control.Navigation() ]
+    });
+
+    var osm_layer = new OpenLayers.Layer.GML("OSM", url, {
+      format: OpenLayers.Format.OSM,
+      projection: new OpenLayers.Projection("EPSG:4326")
+    });
+
+    osm_layer.events.register("loadend", osm_layer, function() {
+      $("loading").innerHTML = "";
+
+      if (this.features.length) { 
         var extent =  this.features[0].geometry.getBounds();
+
         for (var i = 1; i < this.features.length; i++) {
-            extent.extend(this.features[i].geometry.getBounds());
+          extent.extend(this.features[i].geometry.getBounds());
         }
+
         if (extent) {
-               this.map.zoomToExtent(extent);
+          this.map.zoomToExtent(extent);
         } else {
-               this.map.zoomToMaxExtent();
+          this.map.zoomToMaxExtent();
        }
+
        var center = getMapCenter();
         $("larger_map").href = '/?lat='+center.lat+'&lon='+center.lon+'&zoom='+this.map.getZoom();
         $("larger_map").innerHTML = "View Larger Map";
-    } else {
+      } else {
         $("small_map").style.display = "none";
-    }
-  })   
-  map.addLayer(osm_layer);
-  osm_layer.loadGML();
-  osm_layer.loaded = true;
-}
-window.onload = init;
+      }
+    });
+
+    map.addLayer(osm_layer);
+
+    osm_layer.loadGML();
+    osm_layer.loaded = true;
+  }
+
+  window.onload = init;
 </script>
-<span id="loading">Loading...</span>
-<a id="larger_map" href=""></a>
-</div>
diff --git a/app/views/browse/_member.rhtml b/app/views/browse/_member.rhtml
deleted file mode 100644 (file)
index 29a72b1..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-<tr>
-  <td><%= link_to member.member_id.to_s, :action => member.member_type, :id => member.member_id %></td>
-  <td><%= h(member.member_type) %></td>
-  <td><%= h(member.member_role) %></td>
-</tr> 
index 269184e028a713889011e1b71e5d003394c87367..57e724d4258a7a907f03475ac01f7fa6c02d971a 100644 (file)
@@ -1,13 +1,13 @@
 <div style="float:right; text-align:center; width: 250px;">
-<% if @prev %>
-< 
-<%= link_to @prev.id.to_s, :action => type, :id => @prev.id %>
-<% end %>
-<% if @prev and @next %>
-| 
-<% end %>
-<% if @next %>
-<%= link_to @next.id.to_s, :action => type, :id => @next.id %>
->
-<% end %>
+  <% if @prev %>
+    &lt;
+    <%= link_to @prev.id.to_s, :id => @prev.id %>
+  <% end %>
+  <% if @prev and @next %>
+    
+  <% end %>
+  <% if @next %>
+    <%= link_to @next.id.to_s, :id => @next.id %>
+    &gt;
+  <% end %>
 </div>
diff --git a/app/views/browse/_node_details.rhtml b/app/views/browse/_node_details.rhtml
new file mode 100644 (file)
index 0000000..e3d11e0
--- /dev/null
@@ -0,0 +1,19 @@
+<table>
+
+  <%= render :partial => "common_details", :object => node_details %>
+
+  <% unless node_details.ways.empty? and node_details.containing_relation_members.empty? %>
+    <tr valign="top">
+      <th>Part of:</th>
+      <td>
+        <table padding="0">
+          <% node_details.ways.each do |way| %>
+            <tr><td><%= link_to "Way " + way.id.to_s, :action => "way", :id => way.id.to_s %></td></tr>
+          <% end %>
+          <%= render :partial => "containing_relation", :collection => node_details.containing_relation_members %>
+        </table>
+      </td>
+    </tr>      
+  <% end %>
+
+</table>
diff --git a/app/views/browse/_relation_details.rhtml b/app/views/browse/_relation_details.rhtml
new file mode 100644 (file)
index 0000000..b8874d9
--- /dev/null
@@ -0,0 +1,27 @@
+<table>
+
+  <%= render :partial => "common_details", :object => relation_details %>
+
+  <% unless relation_details.relation_members.empty? %>
+    <tr valign="top">
+      <th>Members:</th>
+      <td>
+        <table padding="0">
+          <%= render :partial => "relation_member", :collection => relation_details.relation_members %>
+        </table>
+      </td>
+    </tr>   
+  <% end %>
+
+  <% unless relation_details.containing_relation_members.empty? %>
+    <tr>
+      <th>Part of:</th>
+      <td>
+        <table padding="0">
+          <%= render :partial => "containing_relation", :collection => relation_details.containing_relation_members %>
+        </table>
+      </td>
+    </tr>      
+  <% end %>
+
+</table>
diff --git a/app/views/browse/_relation_member.rhtml b/app/views/browse/_relation_member.rhtml
new file mode 100644 (file)
index 0000000..516d9e3
--- /dev/null
@@ -0,0 +1,10 @@
+<tr>
+  <td>
+    <%= h(relation_member.member_type.capitalize) %>
+    <%= link_to relation_member.member_id.to_s, :action => relation_member.member_type, :id => relation_member.member_id %>
+    <% unless relation_member.member_role.blank? %>
+      as
+      <%= h(relation_member.member_role) %>
+    <% end %>
+  </td>
+</tr> 
diff --git a/app/views/browse/_relation_members.rhtml b/app/views/browse/_relation_members.rhtml
deleted file mode 100644 (file)
index ebe20ba..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-<% if members.length != 0 %>
-<h3>Members</h3> 
-<table id="keyvalue" cellpadding="3">
-  <tr>
-    <th>ID</th>
-    <th>Type</th>
-    <th>Role</th>
-  </tr>
-  <%= render :partial => 'member', :collection => members  %>
-</table>
-<% end %>
index 009d39e7945f2c2b124466462d447667986c6173..8a57387bf82bd5047a481000f049a87ea78a0a2a 100644 (file)
@@ -1,4 +1,3 @@
 <tr>
-  <td><%= h(tag[0]) %></td><td><%= h(tag[1]) %></td>
+  <td><%= h(tag[0]) %> = <%= h(tag[1]) %></td>
 </tr> 
-
diff --git a/app/views/browse/_tag_table.rhtml b/app/views/browse/_tag_table.rhtml
deleted file mode 100644 (file)
index dca1c0a..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-<% if tags.length != 0 %>
-<h3>Tags</h3>
-<table id="keyvalue" cellpadding="3">
-  <tr>
-    <th>Key</th>
-    <th>Value</th>
-  </tr>
-  <%= render :partial => 'tag', :collection => tags  %>
-</table>
-<% end %>
diff --git a/app/views/browse/_way_details.rhtml b/app/views/browse/_way_details.rhtml
new file mode 100644 (file)
index 0000000..99b8e1d
--- /dev/null
@@ -0,0 +1,27 @@
+<table>
+
+  <%= render :partial => "common_details", :object => way_details %>
+
+  <tr valign="top">
+    <th>Nodes:</th>
+    <td>
+      <table padding="0">
+        <% way_details.way_nodes.each do |wn| %>
+          <tr><td><%= link_to "Node " + wn.node_id.to_s, :action => "node", :id => wn.node_id.to_s %></td></tr>
+        <% end %>
+      </table>
+    </td>
+  </tr>
+
+  <% unless way_details.containing_relation_members.empty? %>
+    <tr>
+      <th>Part of:</th>
+      <td>
+        <table padding="0">
+          <%= render :partial => "containing_relation", :collection => way_details.containing_relation_members %>
+        </table>
+      </td>
+    </tr>      
+  <% end %>
+
+</table>
index c050cf00269983835f7239282494d05c4014eb49..075c1917f3367dd324e9ee2281bcdbbbc82299b5 100644 (file)
@@ -1,15 +1,26 @@
-<%= render :partial => 'navigation', :locals => { :type => "node" } %>
-<h2>Node Browser: <%= h(@name) %></h2>
-<%= render :partial => 'common', :locals => { :obj => @node, :type => "node" } %>
-<%= render :partial => 'tag_table', :locals => { :tags => @node.tags_as_hash } %>
-<% if @node.ways.length != 0 %> 
-  <br style="clear:both" />
-  <div style="float:right; width: 250px;">
-  <h2>Part of:</h2>
-  <ul>
-    <% @node.ways.each do |way| %>
-    <li> <%= link_to "Way " + way.id.to_s, :action => "way", :id => way.id.to_s %> </li>
-    <% end %>
-  </ul>
-  </div>
-<% end %>
+<table width="100%">
+  <tr>
+    <td>
+      <h2>Node: <%= h(@name) %></h2>
+    </td>
+    <td>
+      <%= render :partial => "navigation" %>
+    </td>
+  </tr>
+  <tr valign="top">
+    <td>
+      <%= render :partial => "node_details", :object => @node %>
+      <hr />
+      <%= link_to "Download XML", :controller => "node", :action => "read" %>
+      or
+      <%= link_to "view history", :action => "node_history" %>
+    </td>
+    <td align="right">
+      <% if @node.visible %>
+        <%= render :partial => "map", :locals => { :type => "node", :id => @node.id } %>
+      <% else %>
+        Deleted
+      <% end %>
+    </td>
+  </tr>
+</table>
index ad46202b7fe286ae3b08e7eea106522cd201e175..ffa42bef657989e5f7056518187b2971e14527c3 100644 (file)
@@ -1,8 +1,22 @@
 <h2>Node History: <%= h(@name) %></h2>
-<%= render :partial => 'common', :locals => { :obj => @node, :type => "node" } %>
-<h2>Hisorical Versions</h2> 
-<% @node.old_nodes.reverse.each do |node| %>
-<%= render :partial => 'common_editedby', :locals => { :obj => node } %>
-<%= render :partial => 'tag_table', :locals => { :tags => node.tags_as_hash } %>
-<hr />
-<% end %>
+
+<table width="100%">
+  <tr valign="top">
+    <td>
+      <% @node.old_nodes.reverse.each do |node| %>
+        <%= render :partial => "node_details", :object => node %>
+        <hr />
+      <% end %>
+      <%= link_to "Download XML", :controller => "old_node", :action => "history" %>
+      or
+      <%= link_to "view details", :action => "node" %>
+    </td>
+    <td align="right">
+      <% if @node.visible %>
+        <%= render :partial => "map", :locals => { :type => "node", :id => @node.id } %>
+      <% else %>
+        Deleted
+      <% end %>
+    </td>
+  </tr>
+</table>
index 574a4ea2b66b9715f3d757f3ce0b81757b805bfa..8d4f94bf5a040f470aa8f4fdfe41a025db693974 100644 (file)
@@ -1,5 +1,26 @@
-<%= render :partial => 'navigation', :locals => { :type => "relation" } %>
-<h2>Relation Browser: <%= h(@name) %></h2>
-<%= render :partial => 'common', :locals => { :obj => @relation, :type => "relation" } %>
-<%= render :partial => 'tag_table', :locals => { :tags => @relation.tags } %>
-<%= render :partial => 'relation_members', :locals => { :members => @relation.relation_members } %>
+<table width="100%">
+  <tr>
+    <td>
+      <h2>Relation: <%= h(@name) %></h2>
+    </td>
+    <td>
+      <%= render :partial => "navigation" %>
+    </td>
+  </tr>
+  <tr valign="top">
+    <td>
+      <%= render :partial => "relation_details", :object => @relation %>
+      <hr />
+      <%= link_to "Download XML", :controller => "relation", :action => "read" %>
+      or
+      <%= link_to "view history", :action => "relation_history" %>
+    </td>
+    <td align="right">
+      <% if @relation.visible %>
+        <%= render :partial => "map", :locals => { :type => "relation", :id => @relation.id } %>
+      <% else %>
+        Deleted
+      <% end %>
+    </td>
+  </tr>
+</table>
index f3a75cd07f4a503110357d5faa20a06635ae4367..f4b3e1faacf353acd019c97f1a6cfdfedbd70cec 100644 (file)
@@ -1,9 +1,22 @@
 <h2>Relation History: <%= h(@name) %></h2>
-<%= render :partial => 'common', :locals => { :obj => @relation, :type => "relation" } %>
-<h2>Hisorical Versions</h2> 
-<% @relation.old_relations.reverse.each do |relation| %>
-<%= render :partial => 'common_editedby', :locals => { :obj => relation } %>
-<%= render :partial => 'tag_table', :locals => { :tags => relation.tags } %>
-<%= render :partial => 'relation_members', :locals => { :members => relation.old_members } %>
-<hr />
-<% end %>
+
+<table width="100%">
+  <tr valign="top">
+    <td>
+      <% @relation.old_relations.reverse.each do |relation| %>
+        <%= render :partial => "relation_details", :object => relation %>
+        <hr />
+      <% end %>
+      <%= link_to "Download XML", :controller => "old_relation", :action => "history" %>
+      or
+      <%= link_to "view details", :action => "relation" %>
+    </td>
+    <td align="right">
+      <% if @relation.visible %>
+        <%= render :partial => "map", :locals => { :type => "relation", :id => @relation.id } %>
+      <% else %>
+        Deleted
+      <% end %>
+    </td>
+  </tr>
+</table>
index e1c306071549ab3e5e6ab82ca7b530abbef8961c..75b333443196e8040d7b9cace58f3fbe74d58e97 100644 (file)
@@ -1,16 +1,26 @@
-<%= render :partial => 'navigation', :locals => { :type => "way" } %>
-<h2>Way Browser: <%= h(@name) %></h2>
-<%= render :partial => 'common', :locals => { :obj => @way, :type => "way" } %>
-<%= render :partial => 'tag_table', :locals => { :tags => @way.tags } %>
-
-<% if @way.nodes.length != 0 %> 
-  <br style="clear:both" />
-  <div style="float:right; width: 250px;">
-  <h2>Parts:</h2>
-  <ul>
-    <% @way.nodes.each do |node| %>
-    <li> <%= link_to "Node " + node.id.to_s, :action => "node", :id => node.id.to_s %> </li>
-    <% end %>
-  </ul>
-  </div>
-<% end %>
+<table width="100%">
+  <tr>
+    <td>
+      <h2>Way: <%= h(@name) %></h2>
+    </td>
+    <td>
+      <%= render :partial => "navigation" %>
+    </td>
+  </tr>
+  <tr valign="top">
+    <td>
+      <%= render :partial => "way_details", :object => @way %>
+      <hr />
+      <%= link_to "Download XML", :controller => "way", :action => "read" %>
+      or
+      <%= link_to "view history", :action => "way_history" %>
+    </td>
+    <td align="right">
+      <% if @way.visible %>
+        <%= render :partial => "map", :locals => { :type => "way", :id => @way.id } %>
+      <% else %>
+        Deleted
+      <% end %>
+    </td>
+  </tr>
+</table>
index 32aadb3ff0b2f9f8b27fdbaba6092ecd90ce8010..1eaf52ed532a50cc9fbe35239effd1029ce46a12 100644 (file)
@@ -1,8 +1,22 @@
 <h2>Way History: <%= h(@name) %></h2>
-<%= render :partial => 'common', :locals => { :obj => @way, :type => "way" } %>
-<h2>Hisorical Versions</h2> 
-<% @way.old_ways.reverse.each do |way| %>
-<%= render :partial => 'common_editedby', :locals => { :obj => way } %>
-<%= render :partial => 'tag_table', :locals => { :tags => way.tags } %>
-<hr />
-<% end %>
+
+<table width="100%">
+  <tr valign="top">
+    <td>
+      <% @way.old_ways.reverse.each do |way| %>
+        <%= render :partial => "way_details", :object => way %>
+        <hr />
+      <% end %>
+      <%= link_to "Download XML", :controller => "old_way", :action => "history" %>
+      or
+      <%= link_to "view details", :action => "way" %>
+    </td>
+    <td align="right">
+      <% if @way.visible %>
+        <%= render :partial => "map", :locals => { :type => "way", :id => @way.id } %>
+      <% else %>
+        Deleted
+      <% end %>
+    </td>
+  </tr>
+</table>
index 52636b3859ec2e4b1dcbd71f61a923a717ffbb0e..854e7f00364370c8fd4e41c743324761f27103ef 100644 (file)
@@ -58,8 +58,8 @@ ActionController::Routing::Routes.draw do |map|
   map.connect "api/#{API_VERSION}/swf/trackpoints", :controller =>'swf', :action =>'trackpoints'
   
   # Data browsing
-  map.connect '/browse/start', :controller => 'browse', :action => 'start'
   map.connect '/browse', :controller => 'browse', :action => 'index'
+  map.connect '/browse/start', :controller => 'browse', :action => 'start'
   map.connect '/browse/way/:id', :controller => 'browse', :action => 'way', :id => /\d+/
   map.connect '/browse/way/:id/history', :controller => 'browse', :action => 'way_history', :id => /\d+/
   map.connect '/browse/node/:id', :controller => 'browse', :action => 'node', :id => /\d+/