]> git.openstreetmap.org Git - rails.git/commitdiff
Merge branch 'master' into openstreetbugs
authorTom Hughes <tom@compton.nu>
Thu, 20 Sep 2012 15:01:24 +0000 (16:01 +0100)
committerTom Hughes <tom@compton.nu>
Thu, 20 Sep 2012 15:01:24 +0000 (16:01 +0100)
Conflicts:
Gemfile
app/helpers/application_helper.rb
app/views/site/index.html.erb

14 files changed:
1  2 
Gemfile
Gemfile.lock
app/assets/javascripts/application.js
app/assets/stylesheets/common.css.scss
app/controllers/browse_controller.rb
app/helpers/application_helper.rb
app/models/user.rb
app/views/browse/_map.html.erb
app/views/site/index.html.erb
app/views/user/view.html.erb
config/example.application.yml
config/locales/de.yml
config/locales/en.yml
config/routes.rb

diff --combined Gemfile
index 25b10fe7b09c3895944fae03c49849846bc8bc0d,ad2f04c29feb32f232178d13a5a9012a490de45a..5193881af82a3b155aa93d978fbbbfb959dff66c
+++ b/Gemfile
@@@ -24,14 -24,11 +24,12 @@@ gem 'composite_primary_keys', '>= 5.0.8
  gem 'http_accept_language', '>= 1.0.2'
  gem 'paperclip', '~> 2.0'
  gem 'deadlock_retry', '>= 1.2.0'
+ gem 'i18n-js', '>= 3.0.0.rc2'
 +gem 'jsonify-rails'
  
  # We need ruby-openid 2.2.0 or later for ruby 1.9 support
  gem 'ruby-openid', '>= 2.2.0'
  
- # Browser detection support
- gem 'browser'
  # Markdown formatting support
  gem 'redcarpet'
  
diff --combined Gemfile.lock
index 158694564993cb1f7b9232757d8171d60d33f6fc,1ec7948d14a67411e68d19c1af81543bfdcfc026..666b6a094208b470635be70e676fa64647ef6126
@@@ -31,9 -31,8 +31,8 @@@ GE
        multi_json (~> 1.0)
      arel (3.0.2)
      bigdecimal (1.1.0)
-     browser (0.1.4)
--    builder (3.0.0)
--    cocaine (0.2.1)
++    builder (3.0.3)
++    cocaine (0.3.0)
      coffee-rails (3.2.2)
        coffee-script (>= 2.2.0)
        railties (~> 3.2.0)
      http_accept_language (1.0.2)
      httpauth (0.1)
      httpclient (2.2.7)
--    i18n (0.6.0)
++    i18n (0.6.1)
+     i18n-js (3.0.0.rc2)
+       i18n
      iconv (0.1)
      journey (1.0.4)
--    jquery-rails (2.1.1)
++    jquery-rails (2.1.2)
        railties (>= 3.1.0, < 5.0)
        thor (~> 0.14)
      json (1.7.5)
 +    jsonify (0.3.1)
 +      multi_json (~> 1.0)
 +    jsonify-rails (0.3.2)
 +      actionpack
 +      jsonify (< 0.4.0)
      jwt (0.1.5)
        multi_json (>= 1.0)
      libv8 (3.3.10.4)
        i18n (>= 0.4.0)
        mime-types (~> 1.16)
        treetop (~> 1.4.8)
--    memcached (1.4.3)
++    memcached (1.4.5)
      mime-types (1.19)
--    minitest (3.3.0)
++    minitest (3.4.0)
      multi_json (1.3.6)
      multipart-post (1.1.5)
      nokogiri (1.5.5)
--    oauth (0.4.6)
++    oauth (0.4.7)
      oauth-plugin (0.4.1)
        multi_json
        oauth (~> 0.4.4)
        activesupport (>= 2.3.2)
        cocaine (>= 0.0.2)
        mime-types
--    pg (0.14.0)
++    pg (0.14.1)
      polyglot (0.3.3)
      rack (1.4.1)
      rack-cache (1.2)
        activesupport (= 3.2.8)
        bundler (~> 1.0)
        railties (= 3.2.8)
--    rails-i18n (0.6.5)
++    rails-i18n (0.6.6)
        i18n (~> 0.5)
      railties (3.2.8)
        actionpack (= 3.2.8)
        libv8 (~> 3.3.10)
      thor (0.16.0)
      tilt (1.3.3)
--    timecop (0.4.5)
++    timecop (0.5.1)
      treetop (1.4.10)
        polyglot
        polyglot (>= 0.3.1)
      tzinfo (0.3.33)
--    uglifier (1.2.7)
++    uglifier (1.3.0)
        execjs (>= 0.3.0)
--      multi_json (~> 1.3)
++      multi_json (~> 1.0, >= 1.0.2)
      validates_email_format_of (1.5.3)
  
  PLATFORMS
  DEPENDENCIES
    SystemTimer (>= 1.1.3)
    bigdecimal
-   browser
    coffee-rails (~> 3.2.1)
    composite_primary_keys (>= 5.0.8)
    deadlock_retry (>= 1.2.0)
    htmlentities
    http_accept_language (>= 1.0.2)
    httpclient
+   i18n-js (>= 3.0.0.rc2)
    iconv
    jquery-rails
 +  jsonify-rails
    libxml-ruby (>= 2.0.5)
    memcached (>= 1.4.1)
    minitest
index 311798aa57379fe18a0a14a6410768d40356bb11,e345f30743f62a6b2ee3f1dabc5ecaf295ba35c8..71eb717118cb8689acb317f52c45e1f5d30502e5
@@@ -2,23 -2,45 +2,46 @@@
  //= require jquery_ujs
  //= require jquery.autogrowtextarea
  //= require jquery.timers
+ //= require jquery.cookie
+ //= require augment
+ //= require openlayers
+ //= require i18n/translations
+ //= require globals
+ //= require params
+ //= require piwik
+ //= require browse
+ //= require export
+ //= require map
+ //= require key
+ //= require menu
+ //= require sidebar
+ //= require richtext
+ //= require resize
++//= require notes
+ function zoomPrecision(zoom) {
+     var decimals = Math.pow(10, Math.floor(zoom/3));
+     return function(x) {
+          return Math.round(x * decimals) / decimals;
+     };
+ }
  
  /*
   * Called as the user scrolls/zooms around to aniplate hrefs of the
   * view tab and various other links
   */
  function updatelinks(lon,lat,zoom,layers,minlon,minlat,maxlon,maxlat,objtype,objid) {
-   var decimals = Math.pow(10, Math.floor(zoom/3));
+   var toPrecision = zoomPrecision(zoom);
    var node;
  
-   lat = Math.round(lat * decimals) / decimals;
-   lon = Math.round(lon * decimals) / decimals;
+   lat = toPrecision(lat);
+   lon = toPrecision(lon);
  
    if (minlon) {
-     minlon = Math.round(minlon * decimals) / decimals;
-     minlat = Math.round(minlat * decimals) / decimals;
-     maxlon = Math.round(maxlon * decimals) / decimals;
-     maxlat = Math.round(maxlat * decimals) / decimals;
+     minlon = toPrecision(minlon);
+     minlat = toPrecision(minlat);
+     maxlon = toPrecision(maxlon);
+     maxlat = toPrecision(maxlat);
    }
  
    $(".geolink").each(function (index, link) {
        args[objtype] = objid;
      }
  
-     var classes = $(link).attr("class").split(" ");
-     $(classes).each(function (index, classname) {
-       if (match = classname.match(/^minzoom([0-9]+)$/)) {
-         var minzoom = match[1];
+     var minzoom = $(link).data("minzoom");
+     if (minzoom) {
          var name = link.id.replace(/anchor$/, "");
  
          $(link).off("click.minzoom");
  
          if (zoom >= minzoom) {
-           $(link).attr("title", i18n("javascripts.site." + name + "_tooltip"));
+           $(link).attr("title", I18n.t("javascripts.site." + name + "_tooltip"));
            $(link).removeClass("disabled");
          } else {
-           $(link).on("click.minzoom", function () { alert(i18n("javascripts.site." + name + "_zoom_alert")); return false; });
-           $(link).attr("title", i18n("javascripts.site." + name + "_disabled_tooltip"));
+           $(link).on("click.minzoom", function () { alert(I18n.t("javascripts.site." + name + "_zoom_alert")); return false; });
+           $(link).attr("title", I18n.t("javascripts.site." + name + "_disabled_tooltip"));
            $(link).addClass("disabled");
          }
-       }
-     });
+     }
  
      link.href = setArgs(link.href, args);
    });
@@@ -144,26 -162,6 +163,6 @@@ function setArgs(url, args) 
     return url.replace(/\?.*$/, "") + "?" + queryitems.join("&");
  }
  
- /*
-  * Called to interpolate JavaScript variables in strings using a
-  * similar syntax to rails I18n string interpolation - the only
-  * difference is that [[foo]] is the placeholder syntax instead
-  * of {{foo}} which allows the same string to be processed by both
-  * rails and then later by javascript.
-  */
- function i18n(string, keys) {
-   string = i18n_strings[string] || string;
-   for (var key in keys) {
-     var re_key = '\\[\\[' + key + '\\]\\]';
-     var re = new RegExp(re_key, "g");
-     string = string.replace(re, keys[key]);
-   }
-   return string;
- }
  /*
   * Called to interlace the bits in x and y, making a Morton code.
   */
@@@ -208,62 -206,18 +207,18 @@@ function makeShortCode(lat, lon, zoom) 
  }
  
  /*
-  * Click handler to switch a rich text control to preview mode
+  * Forms which have been cached by rails may have he wrong
+  * authenticity token, so patch up any forms with the correct
+  * token taken from the page header.
   */
- function previewRichtext(event) {
-   var editor = $(this).parents(".richtext_container").find("textarea");
-   var preview = $(this).parents(".richtext_container").find(".richtext_preview");
-   var width = editor.outerWidth() - preview.outerWidth() + preview.innerWidth();
-   var minHeight = editor.outerHeight() - preview.outerHeight() + preview.innerHeight();
-   if (preview.contents().length == 0) {
-     preview.oneTime(500, "loading", function () {
-       preview.addClass("loading");
-     });
-     preview.load(editor.attr("data-preview-url"), { text: editor.val() }, function () {
-       preview.stopTime("loading");
-       preview.removeClass("loading");
-     });
-   }
-   editor.hide();
-   preview.width(width);
-   preview.css("min-height", minHeight + "px");
-   preview.show();
-   $(this).siblings(".richtext_doedit").prop("disabled", false);
-   $(this).prop("disabled", true);
-   event.preventDefault();
- }
- /*
-  * Click handler to switch a rich text control to edit mode
-  */
- function editRichtext(event) {
-   var editor = $(this).parents(".richtext_container").find("textarea");
-   var preview = $(this).parents(".richtext_container").find(".richtext_preview");
-   preview.hide();
-   editor.show();
-   $(this).siblings(".richtext_dopreview").prop("disabled", false);
-   $(this).prop("disabled", true);
-   event.preventDefault();
- }
+ $(document).ready(function () {
+   var auth_token = $("meta[name=csrf-token]").attr("content");
+   $("form input[name=authenticity_token]").val(auth_token);
+ });
  
  /*
-  * Setup any rich text controls
+  * Enable auto expansion for all text areas
   */
  $(document).ready(function () {
-   $(".richtext_preview").hide();
-   $(".richtext_content textarea").change(function () { 
-     $(this).parents(".richtext_container").find(".richtext_preview").empty();
-   });
-   $(".richtext_doedit").prop("disabled", true);
-   $(".richtext_dopreview").prop("disabled", false);
-   $(".richtext_doedit").click(editRichtext);
-   $(".richtext_dopreview").click(previewRichtext);
+   $("textarea").autoGrow();
  });
index f2f16ec85ec93e70a05bbada359a9f38229fcee0,0f71004812c693e19cfe11da89c3379e51aab128..c897e1184c2844cff303fd2739dd9958cad631b0
@@@ -64,6 -64,10 +64,10 @@@ h2 
    margin: 25px 0 5px 0;
  }
  
+ #logo img {
+   border: 0px;
+ }
  #logo h1 {
    font-size: 18px;
    line-height: 20px;
    display: none;
  }
  
+ #small-title img {
+   border: 0px;
+ }
  /* Rules for the introductory text displayed in the left sidebar to new users */
  
  .sidebar-copy {
    padding: 5px 10px;
    text-decoration: none;
    color: #333;
+   -webkit-transition: color 200ms ease-in;
+   -moz-transition: color 200ms ease-in;
+   -o-transition: color 200ms ease-in;
+   transition: color 200ms ease-in;
  }
  
- #tabnav a:link.active, #tabnav a:visited.active {
+ body.site-index #tabnav a#viewanchor,
+ body.site-edit #tabnav a#editanchor,
+ body.changeset-list #tabnav a#historyanchor,
+ body.site-export #tabnav a#exportanchor {
    border-bottom: 1px solid #aaa;
    background: #9ed485;
    color: #000;
  
  #map {
    margin: 0px;
+   border: 0px;
    padding: 0px;
  }
  
    padding-right: 5px;
  }
  
- #mapkey .mapkey-table-key {
+ #mapkey .mapkey-table-key img {
+   display: block;
+   margin-left: auto;
+   margin-right: auto;
  }
  
  #mapkey .mapkey-table-value {
    bottom: 0px;
  }
  
#content.site_index,
#content.site_edit,
#content.site_export {
.site-index #content,
.site-edit #content,
.site-export #content {
    border: 0px;
    padding: 0px;
  }
  
  /* Rules for the home page */
  
- .site_index #map {
+ .site-index #map {
    position: absolute;
    top: 0px;
    bottom: 0px;
    right: 0px;
  }
  
- .site_export #map {
+ .site-export #map {
    position: absolute;
    top: 0px;
    bottom: 0px;
  
  /* Rules for the edit page */
  
- .site_edit #map {
+ .site-edit #map {
    position: absolute;
    top: 0px;
    bottom: 0px;
    left: 0px;
    right: 0px;
+   overflow: hidden;
  }
  
  /* Rules for the changeset list shown by the history tab etc */
@@@ -718,23 -738,6 +738,23 @@@ table.browse_details th 
    white-space: nowrap;
  }
  
 +td.browse_comments {
 +  padding: 0px;
 +}
 +
 +td.browse_comments table {
 +  border-collapse: collapse;
 +}
 +
 +td.browse_comments table td {
 +  padding-bottom: 10px;
 +}
 +
 +td.browse_comments table td span.by {
 +  font-size: small;
 +  color: #999999;
 +}
 +
  #browse_map {
    width: 250px;
  }
@@@ -941,14 -944,14 +961,14 @@@ p#contributorGuidance 
  
  /* Rules for the user view */
  
- .user_view .user_map {
+ .user-view .user_map {
    position: relative;
    width: 400px;
    height: 400px; 
    border: 1px solid #ccc;
  }
  
- .user_view .user_map p#no_home_location {
+ .user-view .user_map p#no_home_location {
    position: absolute;
    top: 0px;
    bottom: 0px;
index 73f0940d869b6cf6ccfbdeff483affd78c577e3c,e3833a7d11669ae45915f7844abcc40b62470deb..2c22a9b83af7bb121cf06b3ddfa624a7f0b25202
@@@ -1,5 -1,5 +1,5 @@@
  class BrowseController < ApplicationController
-   layout 'site'
+   layout 'site', :except => [ :start ]
  
    before_filter :authorize_web  
    before_filter :set_locale 
@@@ -7,11 -7,6 +7,6 @@@
    around_filter :web_timeout, :except => [:start]
  
    def start 
-     @max_features = case
-                     when browser.ie? && browser.version.to_i < 8 then 100
-                     when browser.ie? && browser.version.to_i < 9 then 500
-                     else 2000
-                     end
    end
    
    def relation
    rescue ActiveRecord::RecordNotFound
      render :action => "not_found", :status => :not_found
    end
 +
 +  def note
 +    @type = "note"
 +    @note = Note.find(params[:id])
 +    @next = Note.find(:first, :order => "id ASC", :conditions => [ "status != 'hidden' AND id > :id", { :id => @note.id }] )
 +    @prev = Note.find(:first, :order => "id DESC", :conditions => [ "status != 'hidden' AND id < :id", { :id => @note.id }] )
 +  rescue ActiveRecord::RecordNotFound
 +    render :action => "not_found", :status => :not_found
 +  end
  end
index e6a1e58e688721a0272c4f0a489424c5a86dc7c3,e0c299ca54ce0e4b2a6c329b5f7be0b6d7eb75ac..fb422cc17ead31643db19b04a2f55a9f358f5a85
@@@ -9,14 -9,6 +9,6 @@@ module ApplicationHelpe
      end
    end
  
-   def html_escape_unicode(text)
-     chars = ActiveSupport::Multibyte::Unicode.u_unpack(text).map do |c|
-       c < 127 ? c.chr : "&##{c.to_s};"
-     end
-     return chars.join("")
-   end
    def rss_link_to(*args)
      return link_to(image_tag("RSS.gif", :size => "16x16", :border => 0), Hash[*args], { :class => "rsssmall" });
    end
      return link_to(image_tag("RSS.gif", :size => "16x16", :border => 0), Hash[*args], { :class => "rsssmall" });
    end
  
-   def javascript_strings
-     js = ""
-     js << "<script type='text/javascript'>\n"
-     js << "i18n_strings = new Array();\n"
-     js << javascript_strings_for_key("javascripts")
-     js << "</script>\n"
-     return raw(js)
-   end
    def style_rules
      css = ""
  
        end
      end
    end
- private
-   def javascript_strings_for_key(key)
-     js = ""
-     value = I18n.t(key, :locale => "en")
-     if value.is_a?(String)
-       js << "i18n_strings['#{key}'] = '" << escape_javascript(t(key)) << "';\n"
-     else
-       value.each_key do |k|
-         js << javascript_strings_for_key("#{key}.#{k}")
-       end
-     end
-     return js
-   end
 +
 +  def friendly_date(date)
 +    content_tag(:span, time_ago_in_words(date), :title => l(date, :format => :friendly))
 +  end
 +
 +  def note_author(object, link_options = {})
 +    if object.author.nil?
 +      h(object.author_name)
 +    else
 +      link_to h(object.author_name), link_options.merge({:controller => "user", :action => "view", :display_name => object.author_name})
 +    end
 +  end
  end
diff --combined app/models/user.rb
index e126adb98401ea656041a9a3a58f9599d9bbffeb,3b2a12ca0314ec0cbcae633b08cf0bb733cfbef8..889c40451e45707b2babfadc7c04f8ad1638eb4d
@@@ -12,8 -12,6 +12,8 @@@ class User < ActiveRecord::Bas
    has_many :tokens, :class_name => "UserToken"
    has_many :preferences, :class_name => "UserPreference"
    has_many :changesets, :order => 'created_at DESC'
 +  has_many :note_comments, :foreign_key => :author_id
 +  has_many :notes, :through => :note_comments
  
    has_many :client_applications
    has_many :oauth_tokens, :class_name => "OauthToken", :order => "authorized_at desc", :include => [:client_application]
      self.image = nil
      self.email_valid = false
      self.new_email = nil
+     self.openid_url = nil
      self.status = "deleted"
      self.save
    end
index d8ca30a15a220550da4fbe2d0616b036d2b77d4b,6dba6cff3beffea723d1c1e8d7f6f310991128db..44823218bf16d7fafc1a8b5b02645cb3539dfe70
@@@ -1,22 -1,15 +1,19 @@@
- <%= javascript_include_tag 'openlayers.js' %>
- <%= javascript_include_tag 'map.js' %>
  <iframe id="linkloader" style="display: none">
  </iframe>
  
  <div id="browse_map">
 -  <% if map.instance_of? Changeset or (map.instance_of? Node and map.version > 1) or map.visible %>
 +  <% if map.instance_of? Changeset or (map.instance_of? Node and map.version > 1) or map.visible? %>
    <div id="small_map">
    </div>
    <span id="loading"><%= t 'browse.map.loading' %></span>
 +  <% if map.instance_of? Note -%>
 +  <%= link_to(t("browse.map.larger.area"), { :controller => :site, :action => :index, :notes => "yes" }, { :id => "area_larger_map", :class => "geolink bbox" }) %>
 +  <% else -%>
    <%= link_to(t("browse.map.larger.area"), { :controller => :site, :action => :index, :box => "yes" }, { :id => "area_larger_map", :class => "geolink bbox" }) %>
 +  <% end -%>
    <br />
    <%= link_to(h(t("browse.map.edit.area")) + content_tag(:span, "â–¾", :class => "menuicon"), { :controller => :site, :action => :edit }, { :id => "area_edit", :class => "geolink bbox" }) %>
 -  <% unless map.instance_of? Changeset %>
 +  <% unless map.instance_of? Changeset or map.instance_of? Note %>
      <br />
      <%= link_to(t("browse.map.larger." + map.class.to_s.downcase), { :controller => :site, :action => :index }, { :id => "object_larger_map", :class => "geolink object" }) %>
      <br />
    </ul>
  </div>
  
 -<% if map.instance_of? Changeset or (map.instance_of? Node and map.version > 1) or map.visible %>
 +<% if map.instance_of? Changeset or (map.instance_of? Node and map.version > 1) or map.visible? %>
    <script type="text/javascript">
-     OpenLayers.Lang.setCode("<%= I18n.locale.to_s %>");
      function remoteEditHandler(event, bbox, select) {
        var left = bbox.left - 0.0001;
        var top = bbox.top + 0.0001;
          });
          <% end -%>
  
 -        updatelinks(centre.lon, centre.lat, 16, null, minlon, minlat, maxlon, maxlat);
 -      <% else -%>
 +        updatelinks(centre.lon, centre.lat, 16, null, minlon, minlat, maxlon, maxlat)
 +      <% elsif map.instance_of? Note %>
 +        var centre = new OpenLayers.LonLat(<%= map.lon %>, <%= map.lat %>);
 +
 +        setMapCenter(centre, 16);
 +        addMarkerToMap(centre);
 +
 +        var bbox = getMapExtent();
 +
 +        $("#loading").hide();
 +        $("#browse_map .geolink").show();
 +
 +        $("#remote_area_edit").click(function (event) {
 +          return remoteEditHandler(event, bbox);
 +        });
 +
 +        <% if preferred_editor == "remote" -%>
 +        $("#area_edit").click(function (event) {
 +          return remoteEditHandler(event, bbox);
 +        });
 +        <% end -%>
 +
 +        updatelinks(centre.lon, centre.lat, 16, null, bbox.left, bbox.bottom, bbox.right, bbox.top)
 +      <% else %>
          var obj_type = "<%= map.class.name.downcase %>";
          var obj_id = <%= map.id %>;
          var obj_version = <%= map.version %>;
index 4b37fc8afe0a8a2943db79f688e321d45c00cbfd,8f8d8737be1780be7b1fe12263272c759bb05111..58bc59c204b53cc3e6c252e627eb24476687b923
@@@ -6,12 -6,11 +6,12 @@@
  
  <% unless STATUS == :api_offline or STATUS == :database_offline -%>
    <% content_for :editmenu do -%>
-     <li><%= link_to t("browse.start_rjs.data_layer_name"), "#", :id => "show_data" %></li>
 +    <li><%= link_to t("browse.start_rjs.notes_layer_name"), "#", :id => "show_notes" %></li>
+     <li><%= link_to t("browse.start_rjs.data_layer_name"), { :controller => :browse, :action => :start }, :id => "show_data" %></li>
    <% end -%>
  <% end -%>
  
- <%= render :partial => 'sidebar', :locals => { :onopen => "resizeMap();", :onclose => "resizeMap();" } %>
+ <%= render :partial => 'sidebar' %>
  <%= render :partial => 'key' %>
  <%= render :partial => 'search' %>
  
@@@ -26,7 -25,6 +26,7 @@@
    <div id="permalink">
      <a href="/" id="permalinkanchor" class="geolink llz layers object"><%= t 'site.index.permalink' %></a>
      <a href="/" id="shortlinkanchor"><%= t 'site.index.shortlink' %></a>
 +    <a href="#" id="createnoteanchor">Report a problem</a>    
    </div>
  </div>
  
        <td class="attribution_project"><%= t'site.index.license.project_url' %></td>
      </tr>
      <tr>
-       <td colspan="2" class="attribution_notice"><%=
-         t'site.index.license.notice',
-           :license_name => t('site.index.license.license_name'),
-           :project_name => t('site.index.license.project_name')
-         %></td>
+       <td colspan="2" class="attribution_notice"><%= t'site.index.license.copyright' %></td>
      </tr>
    </table>
  </div>
  
- <%
- if params[:mlon] and params[:mlat]
-     marker = true
-     mlon = params[:mlon].to_f
-     mlat = params[:mlat].to_f
- end
- if params[:node] or params[:way] or params[:relation]
-     object = true
-     object_zoom = true
-     if params[:node]
-         object_type = 'node'
-         object_id = params[:node].to_i
-     elsif params[:way]
-         object_type = 'way'
-         object_id = params[:way].to_i
-     elsif params[:relation]
-         object_type = 'relation'
-         object_id = params[:relation].to_i
-     end
- end
- # Decide on a lat lon to initialise the map with. Various ways of doing this
- if params[:bbox]
-     bbox = true
-     minlon, minlat, maxlon, maxlat = params[:bbox].split(",").collect { |c| c.to_f }
-     layers = params[:layers]
-     box = true if params[:box] == "yes"
-     object_zoom = false
- elsif params[:minlon] and params[:minlat] and params[:maxlon] and params[:maxlat]
-     bbox = true
-     minlon = params[:minlon].to_f
-     minlat = params[:minlat].to_f
-     maxlon = params[:maxlon].to_f
-     maxlat = params[:maxlat].to_f
-     layers = params[:layers]
-     box = true if params[:box]=="yes"
-     object_zoom = false
- elsif params[:lon] and params[:lat]
-     lon =  params[:lon].to_f
-     lat =  params[:lat].to_f
-     zoom =  params.fetch(:zoom, 5).to_i
-     layers = params[:layers]
-     object_zoom = false
- elsif params[:mlon] and params[:mlat]
-     lon = params[:mlon].to_f
-     lat = params[:mlat].to_f
-     zoom =  params.fetch(:zoom, 12).to_i
-     layers = params[:layers]
-     object_zoom = false
- elsif cookies.key?("_osm_location")
-     lon,lat,zoom,layers = cookies["_osm_location"].split("|")
- elsif @user and !@user.home_lon.nil? and !@user.home_lat.nil?
-     lon =  @user.home_lon
-     lat =  @user.home_lat
-     zoom = 10
- else
-     unless STATUS == :database_readonly or STATUS == :database_offline
-       session[:location] = OSM::IPLocation(request.env['REMOTE_ADDR']) unless session[:location]
-     end
-     if session[:location]
-         bbox = true
-         minlon = session[:location][:minlon]
-         minlat = session[:location][:minlat]
-         maxlon = session[:location][:maxlon]
-         maxlat = session[:location][:maxlat]
-     else
-         lon =  -0.1
-         lat =  51.5
-         zoom =  params.fetch(:zoom, 5).to_i
-     end
-     layers = params[:layers]
- end
- %>
- <%= javascript_include_tag 'openlayers.js' %>
- <%= javascript_include_tag 'map.js' %>
- <%= javascript_include_tag 'notes.js' %>
- <%= render :partial => 'resize' %>
  <script type="text/javascript">
    var marker;
    var map;
-   OpenLayers.Lang.setCode("<%= I18n.locale.to_s %>");
+   var params = OSM.mapParams();
  
 +  <% if @user %>
 +    var loginName = "<%= @user.display_name %>"
 +  <% end %>
 +
    function mapInit(){
      map = createMap("map");
  
-     <% unless object_zoom %>
-       <% if bbox %>
-         var bbox = new OpenLayers.Bounds(<%= minlon %>, <%= minlat %>, <%= maxlon %>, <%= maxlat %>);
 +    <% unless STATUS == :api_offline or STATUS == :database_offline %>
 +      map.dataLayer = new OpenLayers.Layer("<%= I18n.t 'browse.start_rjs.data_layer_name' %>", {
 +          visibility: false,
 +          displayInLayerSwitcher: false
 +      });
 +      map.addLayer(map.dataLayer);
 +
 +      map.noteLayer = addNoteLayer(map, "<%= notes_url :format => 'json' %>", $("#createnoteanchor"), 11);
 +
 +      <% if params[:notes] == "yes" -%>
 +      map.noteLayer.setVisibility(true);
 +      <% end -%>
 +    <% end %>
 +
+     if (!params.object_zoom) {
+       if (params.bbox) {
+         var bbox = new OpenLayers.Bounds(params.minlon, params.minlat, params.maxlon, params.maxlat);
  
          map.zoomToExtent(proj(bbox));
  
-         <% if box %>
+         if (params.box) {
            $(window).load(function() { addBoxToMap(bbox) });
-         <% end %>
-       <% else %>
-         var centre = new OpenLayers.LonLat(<%= lon %>, <%= lat %>);
-         <% if params[:scale].to_f > 0 then -%>
-         var zoom = <%= scale_to_zoom params[:scale] %>;
-         <% else -%>
-         var zoom = <%= zoom %>;
-         <% end -%>
-         setMapCenter(centre, zoom);
-       <% end %>
-     <% end %>
+         }
+       } else {
+         setMapCenter(new OpenLayers.LonLat(params.lon, params.lat), params.zoom);
+       }
+     }
  
-     <% if !layers.nil? and !layers.empty? %>
-       setMapLayers("<%= layers %>");
-     <% end %>
+     if (params.layers) {
+       setMapLayers(params.layers);
+     }
  
-     <% if marker %>
-       marker = addMarkerToMap(new OpenLayers.LonLat(<%= mlon %>, <%= mlat %>));
-     <% end %>
+     if (params.marker) {
+       marker = addMarkerToMap(new OpenLayers.LonLat(params.mlon, params.mlat));
+     }
  
-     <% if object %>
-       var url = "/api/<%= "#{API_VERSION}" %>/<%= object_type %>/<%= object_id %>";
+     if (params.object) {
+       var url = "/api/" + OSM.API_VERSION + "/" + params.object_type + "/" + params.object_id;
  
-       <% if object_type != "node" %>
+       if (params.object_type != "node") {
          url += "/full";
-       <% end %>
+       }
  
-       $(window).load(function() { addObjectToMap(url, <%= object_zoom %>) });
-     <% end %>
+       $(window).load(function() { addObjectToMap(url, params.object_zoom) });
+     }
  
      map.events.register("moveend", map, updateLocation);
      map.events.register("changelayer", map, updateLocation);
    }
  
    $(document).ready(function () {
-     $("#show_data").click(function () {
-       $.ajax({ url: "<%= url_for :controller => :browse, :action => :start %>" });
 +    $("#show_notes").click(function () {
 +      map.noteLayer.setVisibility(true);
 +    });
 +
+     $("#show_data").click(function (e) {
+       $.ajax({ url: $(this).attr('href'), success: function (sidebarHtml) {
+         startBrowse(sidebarHtml);
+       }});
+       e.preventDefault();
      });
  
      $("body").on("click", "a.set_position", function () {
      var layers = getMapLayers();
      var extents = unproj(map.getExtent());
      var expiry = new Date();
-     var objtype;
-     var objid;
-     <% if object %>
-       objtype = "<%= object_type %>";
-       objid = <%= object_id %>;
-     <% end %>
  
-     updatelinks(lonlat.lon, lonlat.lat, zoom, layers, extents.left, extents.bottom, extents.right, extents.top, objtype, objid);
+     updatelinks(lonlat.lon, lonlat.lat, zoom, layers, extents.left, extents.bottom, extents.right, extents.top, params.object_type, params.object_id);
  
      expiry.setYear(expiry.getFullYear() + 10);
-     document.cookie = "_osm_location=" + lonlat.lon + "|" + lonlat.lat + "|" + zoom + "|" + layers + "; expires=" + expiry.toGMTString();
+     $.cookie("_osm_location", [lonlat.lon, lonlat.lat, zoom, layers].join("|"), {expires: expiry});
    }
  
    function remoteEditHandler(event) {
  
    $(document).ready(function () {
      $("#exportanchor").click(function (e) {
-       $.ajax({ url: "<%= url_for :controller => :export, :action => :start %>" });
+       $.ajax({ url: "<%= url_for :controller => :export, :action => :start %>", success: function (sidebarHtml) {
+         startExport(sidebarHtml);
+       }});
        e.preventDefault();
      });
  
-     <% if params[:action] == 'export' -%>
-     $.ajax({ url: "<%= url_for :controller => :export, :action => :start %>" });
+     <% if params[:export] -%>
+     $("#exportanchor").click();
      <% end -%>
  
      <% if params[:query] -%>
index 97811d3a496e8ea4857ac33ea2b3070863a334af,31e9d7585c6dbdb0f8d5da9f2e72221b211b1499..eb84069932bd7edcc2a54e945d5cd1f666a9afe1
@@@ -11,8 -11,6 +11,8 @@@
      <%= link_to t('user.view.my traces'), :controller => 'trace', :action=>'mine' %>
      <span class='count-number'><%= number_with_delimiter(@user.traces.size) %></span>
      |
 +    <%= link_to t('user.view.my notes'), :controller => 'note', :action=> 'mine' %>
 +    |
      <%= link_to t('user.view.my diary'), :controller => 'diary_entry', :action => 'list', :display_name => @user.display_name %>
      |
      <%= link_to t('user.view.my comments' ), :controller => 'diary_entry', :action => 'comments', :display_name => @user.display_name %>
@@@ -35,8 -33,6 +35,8 @@@
      <%= link_to t('user.view.traces'), :controller => 'trace', :action => 'list', :display_name => @this_user.display_name %>
      <span class='count-number'><%= number_with_delimiter(@this_user.traces.size) %></span>
      |
 +    <%= link_to t('user.view.notes'), :controller => 'note', :action=> 'mine' %>
 +    |
      <!-- Displaying another user's profile page -->
      <%= link_to t('user.view.send message'), :controller => 'message', :action => 'new', :display_name => @this_user.display_name %>
      |
    <% end %>
  </div>
  
- <p><b><%= t 'user.view.mapper since' %></b> <%= l @this_user.creation_time, :format => :friendly %> <%= t 'user.view.ago', :time_in_words_ago => time_ago_in_words(@this_user.creation_time) %></p>
+ <div id="description"><%= @this_user.description.to_html %></div>
  
- <p><b><%= t 'user.view.ct status' %></b>
+ <p class='deemphasize'><small>
+ <%= t 'user.view.mapper since' %> <%= l @this_user.creation_time.to_date, :format => :long %>
+ /
+ <%= t 'user.view.ct status' %>
  <% if not @this_user.terms_agreed.nil? -%>
- <%= t 'user.view.ct accepted', :ago =>time_ago_in_words(@this_user.terms_agreed)  %> 
+ <%= t 'user.view.ct accepted', :ago =>time_ago_in_words(@this_user.terms_agreed)  %>
  <% elsif not @this_user.terms_seen? -%>
  <%= t 'user.view.ct undecided' %>
  <% else -%>
  <%= t 'user.view.ct declined' %>
  <% end -%>
+ </small>
  </p>
  
  <% if @user and @user.administrator? -%>
    <p><b><%= t 'user.view.spam score' %></b> <%= @this_user.spam_score %></p>
  <% end -%>
  
- <h3><%= t 'user.view.description' %></h3>
- <div id="description"><%= @this_user.description.to_html %></div>
  <% if @user and @this_user.id == @user.id %>
    <div id="map" class="user_map">
      <% if @this_user.home_lat.nil? or @this_user.home_lon.nil? %>
index 593509297aa0cd095cf2434025392667fb2b2730,d3af9705d461b34ae540cc6d69a77735d2457c71..c795fc0d9e4966b219d9c54ce7ea8b3142dbc3c8
@@@ -3,6 -3,9 +3,9 @@@ defaults: &default
    server_url: "www.openstreetmap.org"
    # The generator
    generator: "OpenStreetMap server"
+   copyright_owner: "OpenStreetMap and contributors"
+   attribution_url: "http://www.openstreetmap.org/copyright"
+   license_url: "http://opendatacommons.org/licenses/odbl/1-0/"
    # Sender addresses for emails
    email_from: "OpenStreetMap <webmaster@openstreetmap.org>"
    email_return_path: "bounces@openstreetmap.org"
@@@ -24,8 -27,6 +27,8 @@@
    max_number_of_nodes: 50000
    # Maximum number of nodes that can be in a way (checked on save)
    max_number_of_way_nodes: 2000
 +  # The maximum area you're allowed to request notes from, in square degrees
 +  max_note_request_area: 25
    # Zoom level to use for postcode results from the geocoder
    postcode_zoom: 15
    # Zoom level to use for geonames results from the geocoder
diff --combined config/locales/de.yml
index 48e10aaba580e6fbed42d1281596975efd5f3ea9,bf0ec64ea821622fb3efc3209b3cce9e65f8c315..2129d754404e4005db762aa0e73113d1a495d09a
@@@ -224,11 -224,11 +224,11 @@@ de
        data_layer_name: Kartendaten durchsuchen
        details: Details
        drag_a_box: Einen Rahmen Ã¼ber die Karte aufziehen, um einen Bereich auszuwählen
-       edited_by_user_at_timestamp: Bearbeitet von [[user]] am [[timestamp]]
+       edited_by_user_at_timestamp: Bearbeitet von %{user} am %{timestamp}
        hide_areas: Gebiete ausblenden
-       history_for_feature: Chronik für [[feature]]
+       history_for_feature: Chronik für %{feature}
        load_data: Daten laden
-       loaded_an_area_with_num_features: Du hast einen Bereich geladen, der [[num_features]] Elemente enthält. Manche Browser haben Probleme bei der Darstellung einer solch großen Datenmenge. Normalerweise ist es am besten, nur weniger als [[max_features]] Elemente zu betrachten. Alles andere macht deinen Browser langsam bzw. lässt ihn nicht mehr auf Eingaben reagieren. Sofern du dir sicher bist, dass du dir diese Daten anzeigen lassen möchtest, klicke unten auf â€žDaten laden“.
+       loaded_an_area_with_num_features: Du hast einen Bereich geladen, der %{num_features} Elemente enthält. Manche Browser haben Probleme bei der Darstellung einer solch großen Datenmenge. Normalerweise ist es am besten, nur weniger als %{max_features} Elemente zu betrachten. Alles andere macht deinen Browser langsam bzw. lässt ihn nicht mehr auf Eingaben reagieren. Sofern du dir sicher bist, dass du dir diese Daten anzeigen lassen möchtest, klicke unten auf â€žDaten laden“.
        loading: Lade â€¦
        manually_select: Einen anderen Kartenausschnitt manuell auswählen
        object_list: 
          heading: Objektliste
          history: 
            type: 
-             node: Knoten [[id]]
-             way: Weg [[id]]
+             node: Knoten %{id}
+             way: Weg %{id}
          selected: 
            type: 
-             node: Knoten [[id]]
-             way: Weg [[id]]
+             node: Knoten %{id}
+             way: Weg %{id}
          type: 
            node: Knoten
            way: Weg
        private_user: Anonymer Benutzer
        show_areas: Gebiete einblenden
        show_history: Chronik
-       unable_to_load_size: "Konnte nicht geladen werden: Bereich der Größe [[bbox_size]] ist zu groß (soll kleiner als %{max_bbox_size} sein)"
+       unable_to_load_size: "Das Laden ist nicht möglich: Der Größe %{bbox_size} des Bereichs ist zu groß und muss kleiner als %{max_bbox_size} sein."
        wait: Verarbeiten â€¦
        zoom_or_select: Karte vergrößern oder einen Bereich auf der Karte auswählen
      tag_details: 
        history_disabled_tooltip: Reinzoomen um Ã„nderungen für diesen Bereich anzuzeigen
        history_tooltip: Ã„nderungen für diesen Bereich anzeigen
        history_zoom_alert: Du musst näher heranzoomen, um die Chronik zu sehen
 +    osb:
 +      Fixed Error: Behobener Fehler
 +      Unresolved Error: Offener Fehler
 +      Description: Beschreibung
 +      Comment: Kommentar
 +      Has been fixed: Der Fehler wurde bereits behoben. Es kann jedoch bis zu einigen Tagen dauern, bis die Kartenansicht aktualisiert wird.
 +      Comment/Close: Kommentieren/Schließen
 +      Nickname: Benutzername
 +      Add comment: Kommentar hinzufügen
 +      Mark as fixed: Als behoben markieren
 +      Cancel: Abbrechen
 +      Create OpenStreetBug: OpenStreetBug melden
 +      Create bug: Bug anlegen
 +      Bug description: Fehlerbeschreibung
 +      Create: Anlegeeen
 +      Permalink: Permalink
    layouts: 
      community: Gemeinschaft
      community_blogs: Blogs
      intro_2_license: Freien Lizenz
      intro_2_use: genutzt
      intro_2_use_url: http://wiki.openstreetmap.org/wiki/DE:Using_OpenStreetMap
-     license: 
-       title: Daten von OpenStreetMap stehen unter der â€žCreative Commons Attribution-Share Alike 2.0 Generic“-Lizenz
      log_in: Anmelden
      log_in_tooltip: Für dein Benutzerkonto anmelden
      logo: 
      partners_url: http://wiki.openstreetmap.org/wiki/Partners
      sign_up: Registrieren
      sign_up_tooltip: Ein Benutzerkonto zum Daten bearbeiten erstellen
-     sotm2012: Komm zur OpenStreetMap-Konferenz â€žThe State of the Map“ 2012 vom 6. bis 8. September in Tokio!
      tag_line: Die freie Wiki-Weltkarte
      user_diaries: Benutzer-Blogs
      user_diaries_tooltip: Benutzer-Blogs lesen
        title: Ãœber diese Ãœbersetzung
      legal_babble: 
        contributors_at_html: "<strong>Österreich</strong>: Enthält Daten der <a href=\"http://data.wien.gv.at/\">Stadt Wien</a>, lizenziert gemäß <a href=\"http://creativecommons.org/licenses/by/3.0/at/deed.de\">CC BY AT</a>, <a href=\"http://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm\">des Lands Vorarlberg</a> und des Lands Tirol (<a href=\"http://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/\">lizenziert gemäß CC BY AT mit Anpassungen zur Lizenz</a>)."
-       contributors_au_html: "<strong>Australien</strong>: Enthält Daten zu Siedlungen, die auf Daten des <i>Australian Bureau of Statistics</i> basieren."
        contributors_ca_html: "<strong>Kanada</strong>: Enthält Daten von GeoBase&reg;, GeoGratis (&copy; <i>Department of Natural Resources Canada</i>), CanVec (&copy; <i>Department of Natural Resources Canada</i>) und StatCan (<i>Geography Division, Statistics Canada</i>)."
        contributors_footer_1_html: Für weitere diesbezügliche Einzelheiten sowie anderer Datenquellen, die zur Verbesserung von OpenStreetMap genutzt wurden, besuche bitte <a  href="http://wiki.openstreetmap.org/wiki/Contributors">die Seite Ã¼ber die Mitwirkenden</a> im Wiki von OpenStreetMap.
        contributors_footer_2_html: Die Einbeziehung von Daten bei OpenStreetMap impliziert nicht, dass der ursprüngliche Datenlieferant OpenStreetMap unterstützt, Gewährleistung gibt, noch Haftung Ã¼bernimmt.
        contributors_intro_html: Die von uns verwendete Lizenz CC BY-SA verlangt, dass du &bdquo;in dem betreffenden Medium in angemessener Weise, auf die ursprünglichen Bearbeiter hinweist.&ldquo; Einige an OpenStreetMap Mitwirkende verlangen keine Ã¼ber den Vermerk &bdquo;OpenStreetMap und Mitwirkende&ldquo; hinausgehende Hinweise. Wo allerdings Daten von nationalen Kartografierungsinstitutionen oder aus anderen umfangreichen Quellen einbezogen wurden, ist es sinnvoll, deren Lizenzhinweise direkt wiederzugeben oder auf diese auf dieser Website zu verlinken.
        contributors_nl_html: "<strong>Niederlande</strong>: Enthält, &copy; AND-Daten, 2007 (<a href=\"http://www.and.com\">www.and.com</a>)"
        contributors_nz_html: "<strong>Neuseeland</strong>: Enthält Daten aus <i>Land Information New Zealand</i>. Urheberrecht vorbehalten."
-       contributors_pl_html: "<strong>Polen</strong>: Enthält Daten aus <a href=\"http://ump.waw.pl/\">UMP-pcPL Karten</a>. Urheberrechtlich geschützt, UMP-pcPL und Mitwirkende. <a href=\"http://wiki.openstreetmap.org/wiki/UMP2OSM_Importing\">Mehr zur Nutzung der UMP-Daten durch OSM</a>"
        contributors_title_html: Unsere Mitwirkenden
        contributors_za_html: "<strong>Südafrika</strong>: Enthält Daten von <i><a href=\"http://www.ngi.gov.za/\">Chief Directorate: National Geo-Spatial Information</a></i>, Staatliches Urheberrecht vorbehalten."
        credit_1_html: Sofern du Bilder von OpenStreetMap verwendest, so ist mindestens &bdquo;&copy; OpenStreetMap und Mitwirkende, CC BY-SA&ldquo; als Quelle anzugeben. Werden hingegen ausschließlich Geodaten genutzt, so ist mindestens &bdquo;Geodaten &copy; OpenStreetMap und Mitwirkende, CC BY-SA&ldquo; anzugeben.
        intro_2_html: Es steht dir frei unsere Daten und Karten zu kopieren, weiterzugeben, zu Ã¼bermittelt sowie anzupassen, sofern du OpenStreetMap und die Mitwirkenden als Quelle angibst. Für den Fall, dass du auf Basis unserer Daten und Karten Anpassungen vornimmst, oder sie als Basis für weitere Bearbeitungen verwendest, kannst du das Ergebnis auch nur gemäß der selben Lizenz weitergeben. Der vollständige Lizenztext ist unter <a href="http://creativecommons.org/licenses/by-sa/2.0/legalcode">Lizenz</a> einsehbar und erläutert deine Rechte und Pflichten.
        more_1_html: Mehr dazu, wie unsere Daten verwendet werden können, kann man unter <a href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">Häufige rechtliche Fragen</a> nachlesen.
        more_2_html: Die Mitwirkenden von OpenStreetMap weisen wir darauf hin, dass du keinesfalls Daten aus urheberrechtlich geschützten Quellen verwenden darfst (z. B. Google Maps oder gedruckte Kartenwerke), ohne vorher die ausdrückliche Erlaubnis des Rechteinhabers erhalten zu haben.
-       more_3_html: Obwohl OpenStreetMap aus freien Daten besteht, können wir Dritten keine kostenfreie Programmierschnittstelle (API) für Karten bereitstellen. Siehe hierzu die <a href="http://wiki.openstreetmap.org/wiki/API_usage_policy">Richtlinie zur Nutzung einer API</a>, die <a href="http://wiki.openstreetmap.org/wiki/Tile_usage_policy">Richtlinie zur Nutzung von Kachelgrafiken</a> und die <a href="http://wiki.openstreetmap.org/wiki/Nominatim#Usage_Policy">Richtlinie zur Nutzung von Daten von Nominatim</a>.
        more_title_html: Mehr hierzu in Erfahrung bringen
        title_html: Urheberrecht und Lizenz
      native: 
      index: 
        js_1: Dein Browser unterstützt kein JavaScript oder du hast es deaktiviert.
        js_2: OpenStreetMap nutzt JavaScript für die Kartendarstellung.
-       license: 
-         license_name: Creative Commons â€žNamensnennung, Weitergabe unter gleichen Bedingungen 2.0“
-         notice: Lizenziert unter %{license_name} Lizenz durch das %{project_name} und seine Mitwirkenden.
-         project_name: OpenStreetMap Projekt
        permalink: Permanentlink
        remote_failed: Das Bearbeiten ist fehlgeschlagen. Stelle sicher, dass JOSM oder Merkaartor gestartet ist und die Remote-Control-Option aktiviert ist.
        shortlink: Shortlink
        lost password link: Passwort vergessen?
        new to osm: Neu bei OpenStreetMap?
        no account: Du hast noch kein Benutzerkonto?
-       notice: <a href="http://wiki.openstreetmap.org/wiki/DE:ODbL/Wir_wechseln_die_Lizenz">Informiere dich Ã¼ber den bevorstehenden Lizenzwechsel bei OpenStreetMap</a> (<a href="http://wiki.openstreetmap.org/wiki/ODbL/We_Are_Changing_The_License">Ãœbersetzungen</a>) (<a href="http://wiki.openstreetmap.org/wiki/Talk:ODbL/Upcoming">Diskussion</a>)
-       notice_terms: OpenStreetMap stellt am 1. April 2012 auf eine neuen Lizenz um. Es handelt sich bei der neuen Lizenz um eine ebenso freie Lizenz, wie es die aktuelle ist, allerdings sind deren rechtliche Rahmenbedingungen besser auf die Bedürfnisse unserer Kartendatenbank abgestimmt. Wir würden es sehr begrüßen, sofern wir deine Beiträge zu OpenStreetMap weiterhin speichern und zugänglich machen könnten. Dies ist allerdings nur dann möglich, sofern du zustimmst, dass wir dies gemäß den Bedingungen der neuen Lizenz auch tun dürfen. Anderenfalls müssen wir deine Beiträge aus der Datenbank löschen.<br /><br />Bitte melde dich an, um die neuen Bedingungen zu lesen und zu akzeptieren. Vielen Dank.
        openid: "%{logo} OpenID:"
        openid invalid: Deine OpenID scheint leider fehlerhaft zu sein.
        openid missing provider: Wir konnten leider keine Verbindung zu deinem OpenID-Dienst herstellen.
diff --combined config/locales/en.yml
index 1b553b6b4ae252bb7355590eaea7d407522acbef,65cc2bda33dd16e0d68c616d227d860d7de180ed..de129f7662fe0be3d814ec1075dbfc4c74eab8ea
@@@ -120,8 -120,6 +120,8 @@@ en
          next_relation_tooltip: "Next relation"
          prev_changeset_tooltip: "Previous changeset"
          next_changeset_tooltip: "Next changeset"
 +        prev_note_tooltip: "Previous note"
 +        next_note_tooltip: "Next note"
      changeset_details:
        created_at: "Created at:"
        closed_at: "Closed at:"
        view_data: "View data for current map view"
        manually_select: "Manually select a different area"
      start_rjs:
 +      notes_layer_name: "Browse Notes"
        data_layer_name: "Browse Map Data"
        data_frame_title: "Data"
        zoom_or_select: "Zoom in or select an area of the map to view"
        manually_select: "Manually select a different area"
        hide_areas: "Hide areas"
        show_areas: "Show areas"
-       loaded_an_area_with_num_features: "You have loaded an area which contains [[num_features]] features. In general, some browsers may not cope well with displaying this quantity of data. Generally, browsers work best at displaying less than [[max_features]] features at a time: doing anything else may make your browser slow/unresponsive. If you are sure you want to display this data, you may do so by clicking the button below."
+       loaded_an_area_with_num_features: "You have loaded an area which contains %{num_features} features. In general, some browsers may not cope well with displaying this quantity of data. Generally, browsers work best at displaying less than %{max_features} features at a time: doing anything else may make your browser slow/unresponsive. If you are sure you want to display this data, you may do so by clicking the button below."
        load_data: "Load Data"
-       unable_to_load_size: "Unable to load: Bounding box size of [[bbox_size]] is too large (must be smaller than %{max_bbox_size})"
+       unable_to_load_size: "Unable to load: Bounding box size of %{bbox_size} is too large (must be smaller than %{max_bbox_size})"
        loading: "Loading..."
        show_history: "Show History"
        wait: "Wait..."
-       history_for_feature: "History for [[feature]]"
+       history_for_feature: "History for %{feature}"
        details: "Details"
        private_user: "private user"
-       edited_by_user_at_timestamp: "Edited by [[user]] at [[timestamp]]"
+       edited_by_user_at_timestamp: "Edited by %{user} at %{timestamp}"
        object_list:
          heading: "Object list"
          back: "Display object list"
          details: "Details"
          selected:
            type:
-             node: "Node [[id]]"
-             way: "Way [[id]]"
+             node: "Node %{id}"
+             way: "Way %{id}"
              # There is no 'relation' type because it is not represented in OpenLayers
          history:
            type:
-             node: "Node [[id]]"
-             way: "Way [[id]]"
+             node: "Node %{id}"
+             way: "Way %{id}"
              # There is no 'relation' type because it is not represented in OpenLayers
      tag_details:
        tags: "Tags:"
        download_xml: "Download XML"
        view_history: "View history"
        edit: "Edit way"
 +    note:
 +      open_title: "Unresolved issue: %{note_name}"
 +      closed_title: "Resolved issue: %{note_name}"
 +      opened: "Opened:"
 +      last_modified: "Last modified:"
 +      closed: "Closed:"
 +      at_by: "%{when} ago by %{user}"
 +      description: "Description:"
 +      comments: "Comments:"
    changeset:
      changeset_paging_nav:
        showing_page: "Showing page %{page}"
        map_image: "Map Image (shows standard layer)"
        embeddable_html: "Embeddable HTML"
        licence: "Licence"
-       export_details: 'OpenStreetMap data is licensed under the <a href="http://creativecommons.org/licenses/by-sa/2.0/">Creative Commons Attribution-ShareAlike 2.0 license</a>.'
+       export_details: 'OpenStreetMap data is licensed under the <a href="http://opendatacommons.org/licenses/odbl/1.0/">Open Data Commons Open Database License</a> (ODbL).'
        too_large:
          heading: "Area Too Large"
          body: "This area is too large to be exported as OpenStreetMap XML Data. Please zoom in or select a smaller area."
          us_postcode: 'Results from <a href="http://geocoder.us/">Geocoder.us</a>'
          uk_postcode: 'Results from <a href="http://www.npemap.org.uk/">NPEMap / FreeThe Postcode</a>'
          ca_postcode: 'Results from <a href="http://geocoder.ca/">Geocoder.CA</a>'
-         osm_namefinder: 'Results from <a href="http://gazetteer.openstreetmap.org/namefinder/">OpenStreetMap Namefinder</a>'
          osm_nominatim: 'Results from <a href="http://nominatim.openstreetmap.org/">OpenStreetMap Nominatim</a>'
          geonames: 'Results from <a href="http://www.geonames.org/">GeoNames</a>'
-     search_osm_namefinder:
-       prefix: "%{type}"
-       suffix_place: ", %{distance} %{direction} of %{placename}"
-       suffix_parent: "%{suffix} (%{parentdistance} %{parentdirection} of %{parentname})"
-       suffix_suburb: "%{suffix}, %{parentname}"
      search_osm_nominatim:
        prefix_format: "%{name}"
        prefix:
            weir: "Weir"
      description:
        title:
-         osm_namefinder: '%{types} from <a href="http://gazetteer.openstreetmap.org/namefinder/">OpenStreetMap Namefinder</a>'
          osm_nominatim: 'Location from <a href="http://nominatim.openstreetmap.org/">OpenStreetMap Nominatim</a>'
          geonames: 'Location from <a href="http://www.geonames.org/">GeoNames</a>'
        types:
          cities: Cities
          towns: Towns
          places: Places
-     description_osm_namefinder:
-       prefix: "%{distance} %{direction} of %{type}"
      results:
        no_results: "No results found"
        more_results: "More results"
      community_blogs_title: "Blogs from members of the OpenStreetMap community"
      foundation: Foundation
      foundation_title: The OpenStreetMap Foundation
-     sotm2012: 'Come to the 2012 OpenStreetMap Conference, The State of the Map, September 6-8th in Tokyo!'
-     license:
-       alt: CC BY-SA 2.0
-       title: OpenStreetMap data is licensed under the Creative Commons Attribution-Share Alike 2.0 Generic License
+     sotm2012: 'Come to the 2012 United States OpenStreetMap Conference, The State of the Map US, October 13-14th in Portland, Oregon!'
      make_a_donation:
        title: Support OpenStreetMap with a monetary donation
        text: Make a Donation
        title_html: Copyright and License
        intro_1_html: |
          OpenStreetMap is <i>open data</i>, licensed under the <a
-         href="http://creativecommons.org/licenses/by-sa/2.0/">Creative
-         Commons Attribution-ShareAlike 2.0</a> licence (CC BY-SA).
+         href="http://opendatacommons.org/licenses/odbl/">Open Data
+         Commons Open Database License</a> (ODbL).
        intro_2_html: |
-         You are free to copy, distribute, transmit and adapt our maps
-         and data, as long as you credit OpenStreetMap and its
-         contributors. If you alter or build upon our maps or data, you
+         You are free to copy, distribute, transmit and adapt our data,
+         as long as you credit OpenStreetMap and its
+         contributors. If you alter or build upon our data, you
          may distribute the result only under the same licence. The
-         full <a
-         href="http://creativecommons.org/licenses/by-sa/2.0/legalcode">legal
+         full <a href="http://opendatacommons.org/licenses/odbl/1.0/">legal
          code</a> explains your rights and responsibilities.
+       intro_3_html: |
+         The cartography in our map tiles, and our documentation, are
+         licensed under the <a href="http://creativecommons.org/licenses/by-sa/2.0/">Creative 
+         Commons Attribution-ShareAlike 2.0</a> license (CC-BY-SA).
        credit_title_html: How to credit OpenStreetMap
        credit_1_html: |
-         If you are using OpenStreetMap map images, we request that
-         your credit reads at least &ldquo;&copy; OpenStreetMap
-         contributors, CC BY-SA&rdquo;. If you are using map data only,
-         we request &ldquo;Map data &copy; OpenStreetMap contributors,
-         CC BY-SA&rdquo;.
+         We require that you use the credit &ldquo;&copy; OpenStreetMap 
+         contributors&rdquo;.
        credit_2_html: |
-         Where possible, OpenStreetMap should be hyperlinked to <a
-         href="http://www.openstreetmap.org/">http://www.openstreetmap.org/</a>
-         and CC BY-SA to <a
-         href="http://creativecommons.org/licenses/by-sa/2.0/">http://creativecommons.org/licenses/by-sa/2.0/</a>. If
-         you are using a medium where links are not possible (e.g. a
-         printed work), we suggest you direct your readers to
-         www.openstreetmap.org (perhaps by expanding
-         &lsquo;OpenStreetMap&rsquo; to this full address) and to
-         www.creativecommons.org.
+         You must also make it clear that the data is available under the Open 
+         Database License, and if using our map tiles, that the cartography is 
+         licensed as CC-BY-SA. You may do this by linking to 
+         <a href="http://www.openstreetmap.org/copyright">this copyright page</a>. 
+         Alternatively, and as a requirement if you are distributing OSM in a 
+         data form, you can name and link directly to the license(s). In media 
+         where links are not possible (e.g. printed works), we suggest you 
+         direct your readers to openstreetmap.org (perhaps by expanding 
+         'OpenStreetMap' to this full address), to opendatacommons.org, and 
+         if relevant, to creativecommons.org.
        more_title_html: Finding out more
        more_1_html: |
-         Read more about using our data at the <a
+         Read more about using our data, and how to credit us, at the <a
          href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">Legal
          FAQ</a>.
        more_2_html: |
-         OSM contributors are reminded never to add data from any
-         copyrighted sources (e.g. Google Maps or printed maps) without
-         explicit permission from the copyright holders.
-       more_3_html: |
          Although OpenStreetMap is open data, we cannot provide a
          free-of-charge map API for third-party developers.
          See our <a href="http://wiki.openstreetmap.org/wiki/API_usage_policy">API Usage Policy</a>,
          and <a href="http://wiki.openstreetmap.org/wiki/Nominatim#Usage_Policy">Nominatim Usage Policy</a>.
        contributors_title_html: Our contributors
        contributors_intro_html: |
-         Our CC BY-SA licence requires you to &ldquo;give the Original
-         Author credit reasonable to the medium or means You are
-         utilising&rdquo;. Individual OSM mappers do not request a
-         credit over and above that to &ldquo;OpenStreetMap
-         contributors&rdquo;, but where data from a national mapping
-         agency or other major source has been included in
-         OpenStreetMap, it may be reasonable to credit them by directly
-         reproducing their credit or by linking to it on this page.
-       contributors_au_html: |
-         <strong>Australia</strong>: Contains suburb data based
-         on Australian Bureau of Statistics data.
+         Our contributors are thousands of individuals. We also include
+         openly-licensed data from national mapping agencies
+         and other sources, among them:
        contributors_at_html: |
          <strong>Austria</strong>: Contains data from
          <a href="http://data.wien.gv.at/">Stadt Wien</a> (under
        contributors_nz_html: |
          <strong>New Zealand</strong>: Contains data sourced from
          Land Information New Zealand. Crown Copyright reserved.
-       contributors_pl_html: |
-         <strong>Poland</strong>: Contains data from <a
-         href="http://ump.waw.pl/">UMP-pcPL maps</a>. Copyright
-         UMP-pcPL contributors.
-         <a href="http://wiki.openstreetmap.org/wiki/UMP2OSM_Importing">
-         More about OSM&apos;s use of UMP data</a>
        contributors_za_html: |
          <strong>South Africa</strong>: Contains data sourced from
          <a href="http://www.ngi.gov.za/">Chief Directorate:
        contributors_gb_html: |
          <strong>United Kingdom</strong>: Contains Ordnance
          Survey data &copy; Crown copyright and database right
-         2010.
+         2010-12.
        contributors_footer_1_html: |
          For further details of these, and other sources that have been used
          to help improve OpenStreetMap, please see the <a
          Inclusion of data in OpenStreetMap does not imply that the original
          data provider endorses OpenStreetMap, provides any warranty, or
          accepts any liability.
+       infringement_title_html: Copyright infringement
+       infringement_1_html: |
+         OSM contributors are reminded never to add data from any
+         copyrighted sources (e.g. Google Maps or printed maps) without
+         explicit permission from the copyright holders.
+       infringement_2_html: |
+         If you believe that copyrighted material has been inappropriately 
+         added to the OpenStreetMap database or this site, please refer 
+         to our <a href="http://www.osmfoundation.org/wiki/License/Takedown_procedure">takedown 
+         procedure</a> or file directly at our 
+         <a href="http://dmca.openstreetmap.org/">on-line filing page</a>.
    notifier:
      diary_comment_notification:
        subject: "[OpenStreetMap] %{user} commented on your diary entry"
        greeting: "Hi,"
        hopefully_you: "Someone (possibly you) has asked for the password to be reset on this email address's openstreetmap.org account."
        click_the_link: "If this is you, please click the link below to reset your password."
 +    note_plain:
 +      subject_own: "[OpenStreetMap] %{commenter} has commented on one of your notes"
 +      subject_other: "[OpenStreetMap] %{commenter} has commented on a note you are interested in"
 +      greeting: "Hi,"
 +      your_note: "%{commenter} has left a comment on one of your map notes near %{place}."
 +      commented_note: "%{commenter} has left a comment on a map note you have commented on. The note is near %{place}."
 +      details: "More details about the note can be found at %{URL}."
    message:
      inbox:
        title: "Inbox"
        permalink: Permalink
        shortlink: Shortlink
        license:
-         notice: "Licensed under the %{license_name} license by the %{project_name} and its contributors."
-         license_name: "Creative Commons Attribution-Share Alike 2.0"
-         license_url: "http://creativecommons.org/licenses/by-sa/2.0/"
-         project_name: "OpenStreetMap project"
+         copyright: "Copyright OpenStreetMap and contributors, under an open license"
+         license_url: "http://openstreetmap.org/copyright"
          project_url: "http://openstreetmap.org"
        remote_failed: "Editing failed - make sure JOSM or Merkaartor is loaded and the remote control option is enabled"
      edit:
        account not active: "Sorry, your account is not active yet.<br />Please use the link in the account confirmation email to activate your account, or <a href=\"%{reconfirm}\">request a new confirmation email</a>."
        account is suspended: Sorry, your account has been suspended due to suspicious activity.<br />Please contact the <a href="%{webmaster}">webmaster</a> if you wish to discuss this.
        auth failure: "Sorry, could not log in with those details."
-       notice: "<a href=\"http://www.osmfoundation.org/wiki/License/We_Are_Changing_The_License\">Find out more about OpenStreetMap's upcoming license change</a> (<a href=\"http://wiki.openstreetmap.org/wiki/ODbL/We_Are_Changing_The_License\">translations</a>) (<a href=\"http://wiki.openstreetmap.org/wiki/Talk:ODbL/Upcoming\">discussion</a>)"
-       notice_terms: "OpenStreetMap is moving to a new licence on 1st April 2012. It's just as open as our current one, but the legal bits are much better suited to our map database. We'd love to keep your contributions in OpenStreetMap, but we can only do so if you agree to let us distribute them under the new licence. Otherwise, we'll have to remove them from the database.<br /><br />Please log in, then take a few seconds to review and accept the new terms. Thank you!"
        openid missing provider: "Sorry, could not contact your OpenID provider"
        openid invalid: "Sorry, your OpenID seems to be malformed"
        openid_logo_alt: "Log in with an OpenID"
        new diary entry: new diary entry
        my edits: my edits
        my traces: my traces
 +      my notes: my map notes
        my settings: my settings
        my comments: my comments
        oauth settings: oauth settings
        diary: diary
        edits: edits
        traces: traces
 +      notes: map notes
        remove as friend: remove as friend
        add as friend: add as friend
        mapper since: "Mapper since:"
        back: "View all blocks"
        revoker: "Revoker:"
        needs_view: "The user needs to log in before this block will be cleared."
 +  note:
 +    description:
 +      opened_at_by: "Created %{when} ago by %{user}"
 +      commented_at_by: "Updated %{when} ago by %{user}"
 +      closed_at_by: "Resolved %{when} ago by %{user}"
 +      reopened_at_by: "Reactivated %{when} ago by %{user}"
 +    rss:
 +      title: "OpenStreetMap Notes"
 +      description_area: "A list of notes, reported, commented on or closed in your area [(%{min_lat}|%{min_lon}) -- (%{max_lat}|%{max_lon})]"
 +      description_item: "An rss feed for note %{id}"
 +      closed: "closed note (near %{place})"
 +      new: "new note (near %{place})"
 +      comment: "new comment (near %{place})"
 +    mine:
 +      title: "Notes submitted or commented on by %{user}"
 +      heading: "%{user}'s notes"
 +      description: "Notes submitted or commented on by %{user}"
 +      id: "Id"
 +      last_changed: "Last changed"
    javascripts:
      map:
        base:
        history_tooltip: View edits for this area
        history_disabled_tooltip: Zoom in to view edits for this area
        history_zoom_alert: You must zoom in to view edits for this area
 +    note:
 +      closed: Closed Note
 +      open: Open Note
 +      details: Details
 +      permalink: Permalink
 +      description: Description
 +      comment: Comment
 +      render_warning: This error has been fixed already. However, it might take a couple of days before the map image is updated.
 +      update: Update
 +      nickname: Nickname
 +      login: Login
 +      add_comment: Add Comment
 +      close: Close
 +      cancel: Cancel
 +      create: Create Note
 +      create_title: Report a problem with the map
 +      create_help1: Please drag the marker to the location of the problem
 +      create_help2: and descripe it as accurate as possible
 +      report: Report Problem
 +      edityourself: You can also edit the map directly your self
    redaction:
      edit:
        description: "Description"
diff --combined config/routes.rb
index 6fbe07f8ed108259526dc7b2fdd72c63e0b0c8f4,b84d27243f3f31750f5511ba0941e0276f9a4c86..1a980e6363d669e33f218edca2a68535cd1e276b
@@@ -73,31 -73,11 +73,31 @@@ OpenStreetMap::Application.routes.draw 
    match 'api/0.6/gpx/:id/data' => 'trace#api_data', :via => :get
    
    # AMF (ActionScript) API
 -
    match 'api/0.6/amf/read' => 'amf#amf_read', :via => :post
    match 'api/0.6/amf/write' => 'amf#amf_write', :via => :post
    match 'api/0.6/swf/trackpoints' => 'swf#trackpoints', :via => :get
  
 +  # Map notes API
 +  scope "api/0.6" do
 +    resources :notes, :except => [ :new, :edit, :update ], :constraints => { :id => /\d+/ }, :defaults => { :format => "xml" } do
 +      collection do
 +        get 'search'
 +        get 'feed', :defaults => { :format => "rss" }
 +      end
 +
 +      member do
 +        post 'comment'
 +        post 'close'
 +      end
 +    end
 +
 +    match 'notes/addPOIexec' => 'notes#create', :via => :post
 +    match 'notes/closePOIexec' => 'notes#close', :via => :post
 +    match 'notes/editPOIexec' => 'notes#comment', :via => :post
 +    match 'notes/getGPX' => 'notes#index', :via => :get, :format => "gpx"
 +    match 'notes/getRSSfeed' => 'notes#feed', :via => :get, :format => "rss"
 +  end
 +
    # Data browsing
    match '/browse/start' => 'browse#start', :via => :get
    match '/browse/way/:id' => 'browse#way', :via => :get, :id => /\d+/
    match '/browse/relation/:id' => 'browse#relation', :via => :get, :id => /\d+/
    match '/browse/relation/:id/history' => 'browse#relation_history', :via => :get, :id => /\d+/
    match '/browse/changeset/:id' => 'browse#changeset', :via => :get, :as => :changeset, :id => /\d+/
 +  match '/browse/note/:id' => 'browse#note', :via => :get, :id => /\d+/
    match '/user/:display_name/edits' => 'changeset#list', :via => :get
    match '/user/:display_name/edits/feed' => 'changeset#feed', :via => :get, :format => :atom
 +  match '/user/:display_name/notes' => 'notes#mine', :via => :get
    match '/browse/friends' => 'changeset#list', :via => :get, :friends => true, :as => "friend_changesets"
    match '/browse/nearby' => 'changeset#list', :via => :get, :nearby => true, :as => "nearby_changesets"
    match '/browse/changesets' => 'changeset#list', :via => :get
    match '/copyright' => 'site#copyright', :via => :get
    match '/history' => 'changeset#list', :via => :get
    match '/history/feed' => 'changeset#feed', :via => :get, :format => :atom
-   match '/export' => 'site#export', :via => :get
+   match '/export' => 'site#index', :export => true, :via => :get
    match '/login' => 'user#login', :via => [:get, :post]
    match '/logout' => 'user#logout', :via => [:get, :post]
    match '/offline' => 'site#offline', :via => :get
-   match '/key' => 'site#key', :via => :post
+   match '/key' => 'site#key', :via => :get
    match '/user/new' => 'user#new', :via => :get
    match '/user/terms' => 'user#terms', :via => [:get, :post]
    match '/user/save' => 'user#save', :via => :post