Merge branch 'master' into moderation
authorAndy Allan <git@gravitystorm.co.uk>
Wed, 2 Aug 2017 11:12:57 +0000 (12:12 +0100)
committerAndy Allan <git@gravitystorm.co.uk>
Wed, 2 Aug 2017 11:12:57 +0000 (12:12 +0100)
127 files changed:
Gemfile
Gemfile.lock
Vendorfile
app/assets/images/banners/banner-sotm-2017.png [new file with mode: 0644]
app/assets/images/banners/donate-2016.jpg [deleted file]
app/assets/images/banners/sotmasia-2016.jpg [deleted file]
app/assets/images/banners/sotmlatam-2016.jpg [deleted file]
app/controllers/api_controller.rb
app/controllers/application_controller.rb
app/controllers/browse_controller.rb
app/controllers/changeset_controller.rb
app/controllers/diary_entry_controller.rb
app/controllers/message_controller.rb
app/controllers/node_controller.rb
app/controllers/notes_controller.rb
app/controllers/oauth_clients_controller.rb
app/controllers/old_controller.rb
app/controllers/redactions_controller.rb
app/controllers/relation_controller.rb
app/controllers/site_controller.rb
app/controllers/trace_controller.rb
app/controllers/user_blocks_controller.rb
app/controllers/user_controller.rb
app/controllers/user_preference_controller.rb
app/controllers/user_roles_controller.rb
app/controllers/way_controller.rb
app/helpers/application_helper.rb
app/helpers/user_roles_helper.rb
app/views/browse/changeset.html.erb
app/views/changeset/history.html.erb
app/views/changeset/list.atom.builder
app/views/diary_entry/view.html.erb
app/views/layouts/_header.html.erb
app/views/layouts/_inbox.html.erb
app/views/layouts/map.html.erb
app/views/message/_message_count.html.erb
app/views/message/inbox.html.erb
app/views/message/new.html.erb
app/views/message/outbox.html.erb
app/views/message/read.html.erb
app/views/oauth/authorize.html.erb
app/views/redactions/show.html.erb
app/views/site/_potlatch.html.erb
app/views/site/_potlatch2.html.erb
app/views/site/edit.html.erb
app/views/site/help.html.erb
app/views/site/id.html.erb
app/views/user/_contact.html.erb
app/views/user/account.html.erb
app/views/user/api_read.builder
app/views/user/new.html.erb
app/views/user/reset_password.html.erb
app/views/user/save.html.erb
app/views/user/view.html.erb
app/views/user_blocks/_block.html.erb
app/views/user_blocks/blocks_by.html.erb
app/views/user_blocks/blocks_on.html.erb
app/views/user_blocks/index.html.erb
app/views/user_blocks/show.html.erb
config/banners.yml
config/example.application.yml
test/controllers/api_controller_test.rb
test/controllers/changeset_controller_test.rb
test/controllers/node_controller_test.rb
test/controllers/notes_controller_test.rb
test/controllers/old_node_controller_test.rb
test/controllers/old_relation_controller_test.rb
test/controllers/old_way_controller_test.rb
test/controllers/relation_controller_test.rb
test/controllers/trace_controller_test.rb
test/controllers/user_controller_test.rb
test/controllers/user_preference_controller_test.rb
test/controllers/way_controller_test.rb
test/helpers/application_helper_test.rb
test/helpers/user_roles_helper_test.rb
test/integration/cors_test.rb
test/integration/user_login_test.rb
vendor/assets/iD/iD.css.erb
vendor/assets/iD/iD.js
vendor/assets/iD/iD/img/iD-sprite.svg
vendor/assets/iD/iD/locales/ar.json
vendor/assets/iD/iD/locales/ast.json
vendor/assets/iD/iD/locales/ca.json
vendor/assets/iD/iD/locales/cs.json
vendor/assets/iD/iD/locales/da.json
vendor/assets/iD/iD/locales/de.json
vendor/assets/iD/iD/locales/dv.json [new file with mode: 0644]
vendor/assets/iD/iD/locales/el.json
vendor/assets/iD/iD/locales/en-GB.json
vendor/assets/iD/iD/locales/en.json
vendor/assets/iD/iD/locales/eo.json
vendor/assets/iD/iD/locales/es.json
vendor/assets/iD/iD/locales/et.json
vendor/assets/iD/iD/locales/fa.json
vendor/assets/iD/iD/locales/fi.json
vendor/assets/iD/iD/locales/fr.json
vendor/assets/iD/iD/locales/gl.json
vendor/assets/iD/iD/locales/hr.json
vendor/assets/iD/iD/locales/hu.json
vendor/assets/iD/iD/locales/hy.json
vendor/assets/iD/iD/locales/it.json
vendor/assets/iD/iD/locales/ja.json
vendor/assets/iD/iD/locales/kn.json
vendor/assets/iD/iD/locales/ko.json
vendor/assets/iD/iD/locales/lt.json
vendor/assets/iD/iD/locales/mk.json
vendor/assets/iD/iD/locales/nl.json
vendor/assets/iD/iD/locales/no.json
vendor/assets/iD/iD/locales/pl.json
vendor/assets/iD/iD/locales/pt-BR.json
vendor/assets/iD/iD/locales/pt.json
vendor/assets/iD/iD/locales/ru.json
vendor/assets/iD/iD/locales/sk.json
vendor/assets/iD/iD/locales/sl.json
vendor/assets/iD/iD/locales/sr.json
vendor/assets/iD/iD/locales/sv.json
vendor/assets/iD/iD/locales/ta.json
vendor/assets/iD/iD/locales/th.json
vendor/assets/iD/iD/locales/tl.json
vendor/assets/iD/iD/locales/tr.json
vendor/assets/iD/iD/locales/uk.json
vendor/assets/iD/iD/locales/vi.json
vendor/assets/iD/iD/locales/yue.json
vendor/assets/iD/iD/locales/zh-CN.json
vendor/assets/iD/iD/locales/zh-HK.json
vendor/assets/iD/iD/locales/zh-TW.json
vendor/assets/leaflet/leaflet.locate.js

diff --git a/Gemfile b/Gemfile
index 0fd68e4e223d962615d3d70de304e9f34813adc7..262a11d03ada33f8d6beeffdeb63697b74a39c1c 100644 (file)
--- a/Gemfile
+++ b/Gemfile
@@ -1,7 +1,7 @@
 source "https://rubygems.org"
 
 # Require rails
-gem "rails", "5.0.4"
+gem "rails", "5.0.5"
 
 # Require things which have moved to gems in ruby 1.9
 gem "bigdecimal", "~> 1.1.0", :platforms => :ruby_19
index f25e2e7f0623ae134fdcb97fc61c21685da4847d..0dcd5bd24b3ddd1021821dd0c1e1f427d402b98f 100644 (file)
@@ -3,41 +3,41 @@ GEM
   specs:
     SystemTimer (1.2.3)
     aasm (4.1.0)
-    actioncable (5.0.4)
-      actionpack (= 5.0.4)
+    actioncable (5.0.5)
+      actionpack (= 5.0.5)
       nio4r (>= 1.2, < 3.0)
       websocket-driver (~> 0.6.1)
-    actionmailer (5.0.4)
-      actionpack (= 5.0.4)
-      actionview (= 5.0.4)
-      activejob (= 5.0.4)
+    actionmailer (5.0.5)
+      actionpack (= 5.0.5)
+      actionview (= 5.0.5)
+      activejob (= 5.0.5)
       mail (~> 2.5, >= 2.5.4)
       rails-dom-testing (~> 2.0)
-    actionpack (5.0.4)
-      actionview (= 5.0.4)
-      activesupport (= 5.0.4)
+    actionpack (5.0.5)
+      actionview (= 5.0.5)
+      activesupport (= 5.0.5)
       rack (~> 2.0)
       rack-test (~> 0.6.3)
       rails-dom-testing (~> 2.0)
       rails-html-sanitizer (~> 1.0, >= 1.0.2)
     actionpack-page_caching (1.1.0)
       actionpack (>= 4.0.0, < 6)
-    actionview (5.0.4)
-      activesupport (= 5.0.4)
+    actionview (5.0.5)
+      activesupport (= 5.0.5)
       builder (~> 3.1)
       erubis (~> 2.7.0)
       rails-dom-testing (~> 2.0)
       rails-html-sanitizer (~> 1.0, >= 1.0.3)
-    activejob (5.0.4)
-      activesupport (= 5.0.4)
+    activejob (5.0.5)
+      activesupport (= 5.0.5)
       globalid (>= 0.3.6)
-    activemodel (5.0.4)
-      activesupport (= 5.0.4)
-    activerecord (5.0.4)
-      activemodel (= 5.0.4)
-      activesupport (= 5.0.4)
+    activemodel (5.0.5)
+      activesupport (= 5.0.5)
+    activerecord (5.0.5)
+      activemodel (= 5.0.5)
+      activesupport (= 5.0.5)
       arel (~> 7.0)
-    activesupport (5.0.4)
+    activesupport (5.0.5)
       concurrent-ruby (~> 1.0, >= 1.0.2)
       i18n (~> 0.7)
       minitest (~> 5.1)
@@ -46,13 +46,13 @@ GEM
       public_suffix (~> 2.0, >= 2.0.2)
     arel (7.1.4)
     ast (2.3.0)
-    autoprefixer-rails (7.1.1.2)
+    autoprefixer-rails (7.1.2.3)
       execjs
     bigdecimal (1.1.0)
     builder (3.2.3)
-    canonical-rails (0.2.0)
+    canonical-rails (0.2.1)
       rails (>= 4.1, < 5.2)
-    capybara (2.14.3)
+    capybara (2.14.4)
       addressable
       mime-types (>= 1.16)
       nokogiri (>= 1.3.3)
@@ -88,13 +88,13 @@ GEM
     dynamic_form (1.1.4)
     erubis (2.7.0)
     execjs (2.7.0)
-    exifr (1.2.5)
+    exifr (1.3.1)
     factory_girl (4.8.0)
       activesupport (>= 3.0.0)
     factory_girl_rails (4.8.0)
       factory_girl (~> 4.8.0)
       railties (>= 3.0.0)
-    faraday (0.12.1)
+    faraday (0.12.2)
       multipart-post (>= 1.2, < 3)
     ffi (1.9.18)
     fspath (3.1.0)
@@ -102,20 +102,20 @@ GEM
     globalid (0.4.0)
       activesupport (>= 4.2.0)
     hashdiff (0.3.4)
-    hashie (3.5.5)
+    hashie (3.5.6)
     htmlentities (4.3.4)
     http_accept_language (2.0.5)
-    i18n (0.8.4)
+    i18n (0.8.6)
     i18n-js (3.0.0)
       i18n (~> 0.6, >= 0.6.6)
-    image_optim (0.24.3)
+    image_optim (0.25.0)
       exifr (~> 1.2, >= 1.2.2)
       fspath (~> 3.0)
       image_size (~> 1.5)
       in_threads (~> 1.3)
       progress (~> 3.0, >= 3.0.1)
-    image_optim_rails (0.4.0)
-      image_optim (~> 0.24.0)
+    image_optim_rails (0.4.1)
+      image_optim (~> 0.24)
       rails
       sprockets
     image_size (1.5.0)
@@ -157,7 +157,7 @@ GEM
     mime-types-data (3.2016.0521)
     mimemagic (0.3.0)
     mini_portile2 (2.2.0)
-    minitest (5.10.2)
+    minitest (5.10.3)
     multi_json (1.12.1)
     multi_xml (0.6.0)
     multipart-post (2.0.0)
@@ -186,7 +186,7 @@ GEM
     omniauth-github (1.3.0)
       omniauth (~> 1.5)
       omniauth-oauth2 (>= 1.4.0, < 2.0)
-    omniauth-google-oauth2 (0.5.0)
+    omniauth-google-oauth2 (0.5.2)
       jwt (~> 1.5)
       multi_json (~> 1.3)
       omniauth (>= 1.1.1)
@@ -212,7 +212,7 @@ GEM
       cocaine (~> 0.5.5)
       mime-types
       mimemagic (= 0.3.0)
-    parallel (1.11.2)
+    parallel (1.12.0)
     parser (2.4.0.0)
       ast (~> 2.2)
     pg (0.21.0)
@@ -224,26 +224,26 @@ GEM
     progress (3.3.1)
     psych (2.2.4)
     public_suffix (2.0.5)
-    r2 (0.2.6)
+    r2 (0.2.7)
     rack (2.0.3)
-    rack-cors (0.4.1)
+    rack-cors (1.0.1)
     rack-openid (1.3.1)
       rack (>= 1.1.0)
       ruby-openid (>= 2.1.8)
     rack-test (0.6.3)
       rack (>= 1.0)
     rack-uri_sanitizer (0.0.2)
-    rails (5.0.4)
-      actioncable (= 5.0.4)
-      actionmailer (= 5.0.4)
-      actionpack (= 5.0.4)
-      actionview (= 5.0.4)
-      activejob (= 5.0.4)
-      activemodel (= 5.0.4)
-      activerecord (= 5.0.4)
-      activesupport (= 5.0.4)
-      bundler (>= 1.3.0, < 2.0)
-      railties (= 5.0.4)
+    rails (5.0.5)
+      actioncable (= 5.0.5)
+      actionmailer (= 5.0.5)
+      actionpack (= 5.0.5)
+      actionview (= 5.0.5)
+      activejob (= 5.0.5)
+      activemodel (= 5.0.5)
+      activerecord (= 5.0.5)
+      activesupport (= 5.0.5)
+      bundler (>= 1.3.0)
+      railties (= 5.0.5)
       sprockets-rails (>= 2.0.0)
     rails-controller-testing (1.0.2)
       actionpack (~> 5.x, >= 5.0.1)
@@ -257,16 +257,16 @@ GEM
     rails-i18n (4.0.2)
       i18n (~> 0.6)
       rails (>= 4.0)
-    railties (5.0.4)
-      actionpack (= 5.0.4)
-      activesupport (= 5.0.4)
+    railties (5.0.5)
+      actionpack (= 5.0.5)
+      activesupport (= 5.0.5)
       method_source
       rake (>= 0.8.7)
       thor (>= 0.18.1, < 2.0)
     rainbow (2.2.2)
       rake
     rake (12.0.0)
-    rb-fsevent (0.9.8)
+    rb-fsevent (0.10.2)
     rb-inotify (0.9.10)
       ffi (>= 0.5.0, < 2)
     record_tag_helper (1.0.0)
@@ -291,14 +291,18 @@ GEM
       crass (~> 1.0.2)
       nokogiri (>= 1.4.4)
       nokogumbo (~> 1.4.1)
-    sass (3.4.24)
+    sass (3.5.1)
+      sass-listen (~> 4.0.0)
+    sass-listen (4.0.0)
+      rb-fsevent (~> 0.9, >= 0.9.4)
+      rb-inotify (~> 0.9, >= 0.9.7)
     sass-rails (5.0.6)
       railties (>= 4.0.0, < 6)
       sass (~> 3.1)
       sprockets (>= 2.8, < 4.0)
       sprockets-rails (>= 2.0, < 4.0)
       tilt (>= 1.1, < 3)
-    secure_headers (3.6.5)
+    secure_headers (3.6.7)
       useragent
     simplecov (0.14.1)
       docile (~> 1.1.0)
@@ -319,8 +323,8 @@ GEM
       ref
     thor (0.19.4)
     thread_safe (0.3.6)
-    tilt (2.0.7)
-    tins (1.14.0)
+    tilt (2.0.8)
+    tins (1.15.0)
     tzinfo (1.2.3)
       thread_safe (~> 0.1)
     uglifier (3.2.0)
@@ -387,7 +391,7 @@ DEPENDENCIES
   r2
   rack-cors
   rack-uri_sanitizer
-  rails (= 5.0.4)
+  rails (= 5.0.5)
   rails-controller-testing
   rails-i18n (~> 4.0.0)
   record_tag_helper
index 502f8b597b97f18a43db4128a0a2e62c195b7462..8c9898dd92be803cf182edc8411e6708c93983ed 100644 (file)
@@ -31,7 +31,7 @@ folder 'vendor/assets' do
       folder 'img', 'src/img'
     end
 
-    from 'git://github.com/domoritz/leaflet-locatecontrol.git', :tag => 'v0.54.0' do
+    from 'git://github.com/domoritz/leaflet-locatecontrol.git', :tag => 'v0.62.0' do
       file 'leaflet.locate.js', 'src/L.Control.Locate.js'
     end
 
diff --git a/app/assets/images/banners/banner-sotm-2017.png b/app/assets/images/banners/banner-sotm-2017.png
new file mode 100644 (file)
index 0000000..a861d1f
Binary files /dev/null and b/app/assets/images/banners/banner-sotm-2017.png differ
diff --git a/app/assets/images/banners/donate-2016.jpg b/app/assets/images/banners/donate-2016.jpg
deleted file mode 100644 (file)
index 7e2e6eb..0000000
Binary files a/app/assets/images/banners/donate-2016.jpg and /dev/null differ
diff --git a/app/assets/images/banners/sotmasia-2016.jpg b/app/assets/images/banners/sotmasia-2016.jpg
deleted file mode 100644 (file)
index fa5f1f0..0000000
Binary files a/app/assets/images/banners/sotmasia-2016.jpg and /dev/null differ
diff --git a/app/assets/images/banners/sotmlatam-2016.jpg b/app/assets/images/banners/sotmlatam-2016.jpg
deleted file mode 100644 (file)
index 97efa75..0000000
Binary files a/app/assets/images/banners/sotmlatam-2016.jpg and /dev/null differ
index c36ded1c0bff58123ab690b2bc754dc557a48728..9324a8ed56a4c4eb2351123a0c7d677ce56fd894 100644 (file)
@@ -305,7 +305,7 @@ class ApiController < ApplicationController
   def permissions
     @permissions = if current_token.present?
                      ClientApplication.all_permissions.select { |p| current_token.read_attribute(p) }
-                   elsif @user
+                   elsif current_user
                      ClientApplication.all_permissions
                    else
                      []
index 534b37058d190e93884928a8f7402c35189d3143..68fc4338ee7a90d66b28d280faeee3be9bd90208 100644 (file)
@@ -5,11 +5,14 @@ class ApplicationController < ActionController::Base
 
   before_action :fetch_body
 
+  attr_accessor :current_user
+  helper_method :current_user
+
   def authorize_web
     if session[:user]
-      @user = User.where(:id => session[:user]).where("status IN ('active', 'confirmed', 'suspended')").first
+      self.current_user = User.where(:id => session[:user]).where("status IN ('active', 'confirmed', 'suspended')").first
 
-      if @user.status == "suspended"
+      if current_user.status == "suspended"
         session.delete(:user)
         session_expires_automatically
 
@@ -17,7 +20,7 @@ class ApplicationController < ActionController::Base
 
       # don't allow access to any auth-requiring part of the site unless
       # the new CTs have been seen (and accept/decline chosen).
-      elsif !@user.terms_seen && flash[:skip_terms].nil?
+      elsif !current_user.terms_seen && flash[:skip_terms].nil?
         flash[:notice] = t "user.terms.you need to accept or decline"
         if params[:referer]
           redirect_to :controller => "user", :action => "terms", :referer => params[:referer]
@@ -26,18 +29,18 @@ class ApplicationController < ActionController::Base
         end
       end
     elsif session[:token]
-      if @user = User.authenticate(:token => session[:token])
-        session[:user] = @user.id
+      if self.current_user = User.authenticate(:token => session[:token])
+        session[:user] = current_user.id
       end
     end
   rescue StandardError => ex
     logger.info("Exception authorizing user: #{ex}")
     reset_session
-    @user = nil
+    self.current_user = nil
   end
 
   def require_user
-    unless @user
+    unless current_user
       if request.get?
         redirect_to :controller => "user", :action => "login", :referer => request.fullpath
       else
@@ -47,7 +50,7 @@ class ApplicationController < ActionController::Base
   end
 
   def require_oauth
-    @oauth = @user.access_token(OAUTH_KEY) if @user && defined? OAUTH_KEY
+    @oauth = current_user.access_token(OAUTH_KEY) if current_user && defined? OAUTH_KEY
   end
 
   ##
@@ -100,7 +103,7 @@ class ApplicationController < ActionController::Base
   def require_allow_write_api
     require_capability(:allow_write_api)
 
-    if REQUIRE_TERMS_AGREED && @user.terms_agreed.nil?
+    if REQUIRE_TERMS_AGREED && current_user.terms_agreed.nil?
       report_error "You must accept the contributor terms before you can edit.", :forbidden
       return false
     end
@@ -122,7 +125,7 @@ class ApplicationController < ActionController::Base
   # require that the user is a moderator, or fill out a helpful error message
   # and return them to the index for the controller this is wrapped from.
   def require_moderator
-    unless @user.moderator?
+    unless current_user.moderator?
       if request.get?
         flash[:error] = t("application.require_moderator.not_a_moderator")
         redirect_to :action => "index"
@@ -133,7 +136,7 @@ class ApplicationController < ActionController::Base
   end
 
   ##
-  # sets up the @user object for use by other methods. this is mostly called
+  # sets up the current_user for use by other methods. this is mostly called
   # from the authorize method, but can be called elsewhere if authorisation
   # is optional.
   def setup_user_auth
@@ -141,19 +144,19 @@ class ApplicationController < ActionController::Base
     unless Authenticator.new(self, [:token]).allow?
       username, passwd = get_auth_data # parse from headers
       # authenticate per-scheme
-      @user = if username.nil?
-                nil # no authentication provided - perhaps first connect (client should retry after 401)
-              elsif username == "token"
-                User.authenticate(:token => passwd) # preferred - random token for user from db, passed in basic auth
-              else
-                User.authenticate(:username => username, :password => passwd) # basic auth
-              end
+      self.current_user = if username.nil?
+                            nil # no authentication provided - perhaps first connect (client should retry after 401)
+                          elsif username == "token"
+                            User.authenticate(:token => passwd) # preferred - random token for user from db, passed in basic auth
+                          else
+                            User.authenticate(:username => username, :password => passwd) # basic auth
+                          end
     end
 
     # have we identified the user?
-    if @user
+    if current_user
       # check if the user has been banned
-      user_block = @user.blocks.active.take
+      user_block = current_user.blocks.active.take
       unless user_block.nil?
         set_locale
         if user_block.zero_hour?
@@ -166,7 +169,7 @@ class ApplicationController < ActionController::Base
       # if the user hasn't seen the contributor terms then don't
       # allow editing - they have to go to the web site and see
       # (but can decline) the CTs to continue.
-      if REQUIRE_TERMS_SEEN && !@user.terms_seen && flash[:skip_terms].nil?
+      if REQUIRE_TERMS_SEEN && !current_user.terms_seen && flash[:skip_terms].nil?
         set_locale
         report_error t("application.setup_user_auth.need_to_see_terms"), :forbidden
       end
@@ -178,7 +181,7 @@ class ApplicationController < ActionController::Base
     setup_user_auth
 
     # handle authenticate pass/fail
-    unless @user
+    unless current_user
       # no auth, the user does not exist or the password was wrong
       response.headers["WWW-Authenticate"] = "Basic realm=\"#{realm}\""
       render :plain => errormessage, :status => :unauthorized
@@ -196,7 +199,7 @@ class ApplicationController < ActionController::Base
   # good idea to do that in this branch.
   def authorize_moderator(errormessage = "Access restricted to moderators")
     # check user is a moderator
-    unless @user.moderator?
+    unless current_user.moderator?
       render :plain => errormessage, :status => :forbidden
       false
     end
@@ -266,7 +269,7 @@ class ApplicationController < ActionController::Base
   end
 
   def require_public_data
-    unless @user.data_public?
+    unless current_user.data_public?
       report_error "You must make your edits public to upload new data", :forbidden
       false
     end
@@ -297,8 +300,8 @@ class ApplicationController < ActionController::Base
   def preferred_languages
     @languages ||= if params[:locale]
                      Locale.list(params[:locale])
-                   elsif @user
-                     @user.preferred_languages
+                   elsif current_user
+                     current_user.preferred_languages
                    else
                      Locale.list(http_accept_language.user_preferred_languages)
                    end
@@ -307,9 +310,9 @@ class ApplicationController < ActionController::Base
   helper_method :preferred_languages
 
   def set_locale
-    if @user && @user.languages.empty? && !http_accept_language.user_preferred_languages.empty?
-      @user.languages = http_accept_language.user_preferred_languages
-      @user.save
+    if current_user && current_user.languages.empty? && !http_accept_language.user_preferred_languages.empty?
+      current_user.languages = http_accept_language.user_preferred_languages
+      current_user.save
     end
 
     I18n.locale = Locale.available.preferred(preferred_languages)
@@ -427,8 +430,8 @@ class ApplicationController < ActionController::Base
   def preferred_editor
     editor = if params[:editor]
                params[:editor]
-             elsif @user && @user.preferred_editor
-               @user.preferred_editor
+             elsif current_user && current_user.preferred_editor
+               current_user.preferred_editor
              else
                DEFAULT_EDITOR
              end
@@ -466,16 +469,6 @@ class ApplicationController < ActionController::Base
     [user, pass]
   end
 
-  # used by oauth plugin to get the current user
-  def current_user
-    @user
-  end
-
-  # used by oauth plugin to set the current user
-  def current_user=(user)
-    @user = user
-  end
-
   # override to stop oauth plugin sending errors
   def invalid_oauth_response; end
 end
index a5aa5277453581036b00fbeb4632cb665885ddb3..41fa14aae07ff05a9f7aa6369fe5184cd208a576 100644 (file)
@@ -58,7 +58,7 @@ class BrowseController < ApplicationController
   def changeset
     @type = "changeset"
     @changeset = Changeset.find(params[:id])
-    @comments = if @user && @user.moderator?
+    @comments = if current_user && current_user.moderator?
                   @changeset.comments.unscope(:where => :visible).includes(:author)
                 else
                   @changeset.comments.includes(:author)
@@ -77,7 +77,7 @@ class BrowseController < ApplicationController
   def note
     @type = "note"
 
-    if @user && @user.moderator?
+    if current_user && current_user.moderator?
       @note = Note.find(params[:id])
       @note_comments = @note.comments.unscope(:where => :visible)
     else
index e80eb16105e2b0938462b060b934e5cb9d46ef53..1c658ccbd61290c35284e4cb152a73de3ff852db 100644 (file)
@@ -28,11 +28,11 @@ class ChangesetController < ApplicationController
     cs = Changeset.from_xml(request.raw_post, true)
 
     # Assume that Changeset.from_xml has thrown an exception if there is an error parsing the xml
-    cs.user_id = @user.id
+    cs.user_id = current_user.id
     cs.save_with_tags!
 
     # Subscribe user to changeset comments
-    cs.subscribers << @user
+    cs.subscribers << current_user
 
     render :plain => cs.id.to_s
   end
@@ -53,7 +53,7 @@ class ChangesetController < ApplicationController
     assert_method :put
 
     changeset = Changeset.find(params[:id])
-    check_changeset_consistency(changeset, @user)
+    check_changeset_consistency(changeset, current_user)
 
     # to close the changeset, we'll just set its closed_at time to
     # now. this might not be enough if there are concurrency issues,
@@ -75,7 +75,7 @@ class ChangesetController < ApplicationController
     assert_method :post
 
     cs = Changeset.find(params[:id])
-    check_changeset_consistency(cs, @user)
+    check_changeset_consistency(cs, current_user)
 
     # keep an array of lons and lats
     lon = []
@@ -127,7 +127,7 @@ class ChangesetController < ApplicationController
     assert_method :post
 
     changeset = Changeset.find(params[:id])
-    check_changeset_consistency(changeset, @user)
+    check_changeset_consistency(changeset, current_user)
 
     diff_reader = DiffReader.new(request.raw_post, changeset)
     Changeset.transaction do
@@ -242,8 +242,8 @@ class ChangesetController < ApplicationController
     changeset = Changeset.find(params[:id])
     new_changeset = Changeset.from_xml(request.raw_post)
 
-    check_changeset_consistency(changeset, @user)
-    changeset.update_from(new_changeset, @user)
+    check_changeset_consistency(changeset, current_user)
+    changeset.update_from(new_changeset, current_user)
     render :xml => changeset.to_xml.to_s
   end
 
@@ -265,7 +265,7 @@ class ChangesetController < ApplicationController
       end
     end
 
-    if (@params[:friends] || @params[:nearby]) && !@user
+    if (@params[:friends] || @params[:nearby]) && !current_user
       require_user
       return
     end
@@ -277,17 +277,17 @@ class ChangesetController < ApplicationController
       changesets = conditions_nonempty(Changeset.all)
 
       if @params[:display_name]
-        changesets = if user.data_public? || user == @user
+        changesets = if user.data_public? || user == current_user
                        changesets.where(:user_id => user.id)
                      else
                        changesets.where("false")
                      end
       elsif @params[:bbox]
         changesets = conditions_bbox(changesets, BoundingBox.from_bbox_params(params))
-      elsif @params[:friends] && @user
-        changesets = changesets.where(:user_id => @user.friend_users.identifiable)
-      elsif @params[:nearby] && @user
-        changesets = changesets.where(:user_id => @user.nearby)
+      elsif @params[:friends] && current_user
+        changesets = changesets.where(:user_id => current_user.friend_users.identifiable)
+      elsif @params[:nearby] && current_user
+        changesets = changesets.where(:user_id => current_user.nearby)
       end
 
       if @params[:max_id]
@@ -324,17 +324,17 @@ class ChangesetController < ApplicationController
     # Add a comment to the changeset
     comment = changeset.comments.create(:changeset => changeset,
                                         :body => body,
-                                        :author => @user)
+                                        :author => current_user)
 
     # Notify current subscribers of the new comment
     changeset.subscribers.visible.each do |user|
-      if @user != user
+      if current_user != user
         Notifier.changeset_comment_notification(comment, user).deliver_now
       end
     end
 
     # Add the commenter to the subscribers if necessary
-    changeset.subscribers << @user unless changeset.subscribers.exists?(@user.id)
+    changeset.subscribers << current_user unless changeset.subscribers.exists?(current_user.id)
 
     # Return a copy of the updated changeset
     render :xml => changeset.to_xml.to_s
@@ -352,10 +352,10 @@ class ChangesetController < ApplicationController
     # Find the changeset and check it is valid
     changeset = Changeset.find(id)
     raise OSM::APIChangesetNotYetClosedError.new(changeset) if changeset.is_open?
-    raise OSM::APIChangesetAlreadySubscribedError.new(changeset) if changeset.subscribers.exists?(@user.id)
+    raise OSM::APIChangesetAlreadySubscribedError.new(changeset) if changeset.subscribers.exists?(current_user.id)
 
     # Add the subscriber
-    changeset.subscribers << @user
+    changeset.subscribers << current_user
 
     # Return a copy of the updated changeset
     render :xml => changeset.to_xml.to_s
@@ -373,10 +373,10 @@ class ChangesetController < ApplicationController
     # Find the changeset and check it is valid
     changeset = Changeset.find(id)
     raise OSM::APIChangesetNotYetClosedError.new(changeset) if changeset.is_open?
-    raise OSM::APIChangesetNotSubscribedError.new(changeset) unless changeset.subscribers.exists?(@user.id)
+    raise OSM::APIChangesetNotSubscribedError.new(changeset) unless changeset.subscribers.exists?(current_user.id)
 
     # Remove the subscriber
-    changeset.subscribers.delete(@user)
+    changeset.subscribers.delete(current_user)
 
     # Return a copy of the updated changeset
     render :xml => changeset.to_xml.to_s
@@ -496,7 +496,7 @@ class ChangesetController < ApplicationController
         # changesets if they're non-public
         setup_user_auth
 
-        raise OSM::APINotFoundError if @user.nil? || @user.id != u.id
+        raise OSM::APINotFoundError if current_user.nil? || current_user.id != u.id
       end
 
       changesets.where(:user_id => u.id)
index 89107ab1ac2f1c22f01398bd67086afbc6f2b62a..1b57fa59b19f4b6948385ff4d06461fa702c94a5 100644 (file)
@@ -14,27 +14,27 @@ class DiaryEntryController < ApplicationController
 
     if request.post?
       @diary_entry = DiaryEntry.new(entry_params)
-      @diary_entry.user = @user
+      @diary_entry.user = current_user
 
       if @diary_entry.save
-        default_lang = @user.preferences.where(:k => "diary.default_language").first
+        default_lang = current_user.preferences.where(:k => "diary.default_language").first
         if default_lang
           default_lang.v = @diary_entry.language_code
           default_lang.save!
         else
-          @user.preferences.create(:k => "diary.default_language", :v => @diary_entry.language_code)
+          current_user.preferences.create(:k => "diary.default_language", :v => @diary_entry.language_code)
         end
 
         # Subscribe user to diary comments
-        @diary_entry.subscriptions.create(:user => @user)
+        @diary_entry.subscriptions.create(:user => current_user)
 
-        redirect_to :action => "list", :display_name => @user.display_name
+        redirect_to :action => "list", :display_name => current_user.display_name
       else
         render :action => "edit"
       end
     else
-      default_lang = @user.preferences.where(:k => "diary.default_language").first
-      lang_code = default_lang ? default_lang.v : @user.preferred_language
+      default_lang = current_user.preferences.where(:k => "diary.default_language").first
+      lang_code = default_lang ? default_lang.v : current_user.preferred_language
       @diary_entry = DiaryEntry.new(entry_params.merge(:language_code => lang_code))
       set_map_location
       render :action => "edit"
@@ -45,7 +45,7 @@ class DiaryEntryController < ApplicationController
     @title = t "diary_entry.edit.title"
     @diary_entry = DiaryEntry.find(params[:id])
 
-    if @user != @diary_entry.user
+    if current_user != @diary_entry.user
       redirect_to :action => "view", :id => params[:id]
     elsif params[:diary_entry] && @diary_entry.update_attributes(entry_params)
       redirect_to :action => "view", :id => params[:id]
@@ -59,18 +59,18 @@ class DiaryEntryController < ApplicationController
   def comment
     @entry = DiaryEntry.find(params[:id])
     @diary_comment = @entry.comments.build(comment_params)
-    @diary_comment.user = @user
+    @diary_comment.user = current_user
     if @diary_comment.save
 
       # Notify current subscribers of the new comment
       @entry.subscribers.visible.each do |user|
-        if @user != user
+        if current_user != user
           Notifier.diary_comment_notification(@diary_comment, user).deliver_now
         end
       end
 
       # Add the commenter to the subscribers if necessary
-      @entry.subscriptions.create(:user => @user) unless @entry.subscribers.exists?(@user.id)
+      @entry.subscriptions.create(:user => current_user) unless @entry.subscribers.exists?(current_user.id)
 
       redirect_to :action => "view", :display_name => @entry.user.display_name, :id => @entry.id
     else
@@ -83,7 +83,7 @@ class DiaryEntryController < ApplicationController
   def subscribe
     diary_entry = DiaryEntry.find(params[:id])
 
-    diary_entry.subscriptions.create(:user => @user) unless diary_entry.subscribers.exists?(@user.id)
+    diary_entry.subscriptions.create(:user => current_user) unless diary_entry.subscribers.exists?(current_user.id)
 
     redirect_to :action => "view", :display_name => diary_entry.user.display_name, :id => diary_entry.id
   rescue ActiveRecord::RecordNotFound
@@ -93,7 +93,7 @@ class DiaryEntryController < ApplicationController
   def unsubscribe
     diary_entry = DiaryEntry.find(params[:id])
 
-    diary_entry.subscriptions.where(:user => @user).delete_all if diary_entry.subscribers.exists?(@user.id)
+    diary_entry.subscriptions.where(:user => current_user).delete_all if diary_entry.subscribers.exists?(current_user.id)
 
     redirect_to :action => "view", :display_name => diary_entry.user.display_name, :id => diary_entry.id
   rescue ActiveRecord::RecordNotFound
@@ -112,17 +112,17 @@ class DiaryEntryController < ApplicationController
         return
       end
     elsif params[:friends]
-      if @user
+      if current_user
         @title = t "diary_entry.list.title_friends"
-        @entries = DiaryEntry.where(:user_id => @user.friend_users)
+        @entries = DiaryEntry.where(:user_id => current_user.friend_users)
       else
         require_user
         return
       end
     elsif params[:nearby]
-      if @user
+      if current_user
         @title = t "diary_entry.list.title_nearby"
-        @entries = DiaryEntry.where(:user_id => @user.nearby)
+        @entries = DiaryEntry.where(:user_id => current_user.nearby)
       else
         require_user
         return
@@ -237,7 +237,7 @@ class DiaryEntryController < ApplicationController
   # require that the user is a administrator, or fill out a helpful error message
   # and return them to the user page.
   def require_administrator
-    unless @user.administrator?
+    unless current_user.administrator?
       flash[:error] = t("user.filter.not_an_administrator")
       redirect_to :action => "view"
     end
@@ -250,13 +250,13 @@ class DiaryEntryController < ApplicationController
       @lon = @diary_entry.longitude
       @lat = @diary_entry.latitude
       @zoom = 12
-    elsif @user.home_lat.nil? || @user.home_lon.nil?
+    elsif current_user.home_lat.nil? || current_user.home_lon.nil?
       @lon = params[:lon] || -0.1
       @lat = params[:lat] || 51.5
       @zoom = params[:zoom] || 4
     else
-      @lon = @user.home_lon
-      @lat = @user.home_lat
+      @lon = current_user.home_lon
+      @lat = current_user.home_lat
       @zoom = 12
     end
   end
index 450313e6247ca6262f14f0dd892cd4ad084770e4..9b39f1c0588152d814d7104576697bd37f7f7da0 100644 (file)
@@ -14,18 +14,18 @@ class MessageController < ApplicationController
   # The display_name param is the display name of the user that the message is being sent to.
   def new
     if request.post?
-      if @user.sent_messages.where("sent_on >= ?", Time.now.getutc - 1.hour).count >= MAX_MESSAGES_PER_HOUR
+      if current_user.sent_messages.where("sent_on >= ?", Time.now.getutc - 1.hour).count >= MAX_MESSAGES_PER_HOUR
         flash[:error] = t "message.new.limit_exceeded"
       else
         @message = Message.new(message_params)
         @message.to_user_id = @this_user.id
-        @message.from_user_id = @user.id
+        @message.from_user_id = current_user.id
         @message.sent_on = Time.now.getutc
 
         if @message.save
           flash[:notice] = t "message.new.message_sent"
           Notifier.message_notification(@message).deliver_now
-          redirect_to :action => "inbox", :display_name => @user.display_name
+          redirect_to :action => "inbox", :display_name => current_user.display_name
         end
       end
     end
@@ -38,7 +38,7 @@ class MessageController < ApplicationController
   def reply
     message = Message.find(params[:message_id])
 
-    if message.to_user_id == @user.id
+    if message.to_user_id == current_user.id
       message.update(:message_read => true)
 
       @message = Message.new(
@@ -51,7 +51,7 @@ class MessageController < ApplicationController
 
       render :action => "new"
     else
-      flash[:notice] = t "message.reply.wrong_user", :user => @user.display_name
+      flash[:notice] = t "message.reply.wrong_user", :user => current_user.display_name
       redirect_to :controller => "user", :action => "login", :referer => request.fullpath
     end
   rescue ActiveRecord::RecordNotFound
@@ -64,11 +64,11 @@ class MessageController < ApplicationController
     @title = t "message.read.title"
     @message = Message.find(params[:message_id])
 
-    if @message.to_user_id == @user.id || @message.from_user_id == @user.id
-      @message.message_read = true if @message.to_user_id == @user.id
+    if @message.to_user_id == current_user.id || @message.from_user_id == current_user.id
+      @message.message_read = true if @message.to_user_id == current_user.id
       @message.save
     else
-      flash[:notice] = t "message.read.wrong_user", :user => @user.display_name
+      flash[:notice] = t "message.read.wrong_user", :user => current_user.display_name
       redirect_to :controller => "user", :action => "login", :referer => request.fullpath
     end
   rescue ActiveRecord::RecordNotFound
@@ -79,24 +79,24 @@ class MessageController < ApplicationController
   # Display the list of messages that have been sent to the user.
   def inbox
     @title = t "message.inbox.title"
-    if @user && params[:display_name] == @user.display_name
+    if current_user && params[:display_name] == current_user.display_name
     else
-      redirect_to :action => "inbox", :display_name => @user.display_name
+      redirect_to :action => "inbox", :display_name => current_user.display_name
     end
   end
 
   # Display the list of messages that the user has sent to other users.
   def outbox
     @title = t "message.outbox.title"
-    if @user && params[:display_name] == @user.display_name
+    if current_user && params[:display_name] == current_user.display_name
     else
-      redirect_to :action => "outbox", :display_name => @user.display_name
+      redirect_to :action => "outbox", :display_name => current_user.display_name
     end
   end
 
   # Set the message as being read or unread.
   def mark
-    @message = Message.where("to_user_id = ? OR from_user_id = ?", @user.id, @user.id).find(params[:message_id])
+    @message = Message.where("to_user_id = ? OR from_user_id = ?", current_user.id, current_user.id).find(params[:message_id])
     if params[:mark] == "unread"
       message_read = false
       notice = t "message.mark.as_unread"
@@ -107,7 +107,7 @@ class MessageController < ApplicationController
     @message.message_read = message_read
     if @message.save && !request.xhr?
       flash[:notice] = notice
-      redirect_to :action => "inbox", :display_name => @user.display_name
+      redirect_to :action => "inbox", :display_name => current_user.display_name
     end
   rescue ActiveRecord::RecordNotFound
     @title = t "message.no_such_message.title"
@@ -116,16 +116,16 @@ class MessageController < ApplicationController
 
   # Delete the message.
   def delete
-    @message = Message.where("to_user_id = ? OR from_user_id = ?", @user.id, @user.id).find(params[:message_id])
-    @message.from_user_visible = false if @message.sender == @user
-    @message.to_user_visible = false if @message.recipient == @user
+    @message = Message.where("to_user_id = ? OR from_user_id = ?", current_user.id, current_user.id).find(params[:message_id])
+    @message.from_user_visible = false if @message.sender == current_user
+    @message.to_user_visible = false if @message.recipient == current_user
     if @message.save && !request.xhr?
       flash[:notice] = t "message.delete.deleted"
 
       if params[:referer]
         redirect_to params[:referer]
       else
-        redirect_to :action => "inbox", :display_name => @user.display_name
+        redirect_to :action => "inbox", :display_name => current_user.display_name
       end
     end
   rescue ActiveRecord::RecordNotFound
index 9f6703b07688dbeb716fffb35cd47b34abb56760..3eb127cb149fda5095238c741c276d322fbf52fe 100644 (file)
@@ -18,7 +18,7 @@ class NodeController < ApplicationController
     node = Node.from_xml(request.raw_post, true)
 
     # Assume that Node.from_xml has thrown an exception if there is an error parsing the xml
-    node.create_with_history @user
+    node.create_with_history current_user
     render :plain => node.id.to_s
   end
 
@@ -44,7 +44,7 @@ class NodeController < ApplicationController
       raise OSM::APIBadUserInput.new("The id in the url (#{node.id}) is not the same as provided in the xml (#{new_node.id})")
     end
 
-    node.update_from(new_node, @user)
+    node.update_from(new_node, current_user)
     render :plain => node.version.to_s
   end
 
@@ -58,7 +58,7 @@ class NodeController < ApplicationController
     unless new_node && new_node.id == node.id
       raise OSM::APIBadUserInput.new("The id in the url (#{node.id}) is not the same as provided in the xml (#{new_node.id})")
     end
-    node.delete_with_history!(new_node, @user)
+    node.delete_with_history!(new_node, current_user)
     render :plain => node.version.to_s
   end
 
index 20894c4e83dbe1a0e426eee4a329d66d0945a249..f577dc2f28198580c72944fcb231d12861f54772 100644 (file)
@@ -160,7 +160,7 @@ class NotesController < ApplicationController
     # Find the note and check it is valid
     @note = Note.find_by(:id => id)
     raise OSM::APINotFoundError unless @note
-    raise OSM::APIAlreadyDeletedError.new("note", @note.id) unless @note.visible? || @user.moderator?
+    raise OSM::APIAlreadyDeletedError.new("note", @note.id) unless @note.visible? || current_user.moderator?
     raise OSM::APINoteAlreadyOpenError.new(@note) unless @note.closed? || !@note.visible?
 
     # Reopen the note and add a comment
@@ -286,7 +286,7 @@ class NotesController < ApplicationController
         @page = (params[:page] || 1).to_i
         @page_size = 10
         @notes = @this_user.notes
-        @notes = @notes.visible unless @user && @user.moderator?
+        @notes = @notes.visible unless current_user && current_user.moderator?
         @notes = @notes.order("updated_at DESC, id").distinct.offset((@page - 1) * @page_size).limit(@page_size).preload(:comments => :author).to_a
       else
         @title = t "user.no_such_user.title"
@@ -341,8 +341,8 @@ class NotesController < ApplicationController
   def add_comment(note, text, event, notify = true)
     attributes = { :visible => true, :event => event, :body => text }
 
-    if @user
-      attributes[:author_id] = @user.id
+    if current_user
+      attributes[:author_id] = current_user.id
     else
       attributes[:author_ip] = request.remote_ip
     end
@@ -350,7 +350,7 @@ class NotesController < ApplicationController
     comment = note.comments.create!(attributes)
 
     note.comments.map(&:author).uniq.each do |user|
-      if notify && user && user != @user && user.visible?
+      if notify && user && user != current_user && user.visible?
         Notifier.note_comment_notification(comment, user).deliver_now
       end
     end
index 1c1877ad4e3414e140bcda772482a3efa56fc751..76fdd642119f4adaa4763cb0c10fe91432435c1a 100644 (file)
@@ -6,8 +6,8 @@ class OauthClientsController < ApplicationController
   before_action :require_user
 
   def index
-    @client_applications = @user.client_applications
-    @tokens = @user.oauth_tokens.authorized
+    @client_applications = current_user.client_applications
+    @tokens = current_user.oauth_tokens.authorized
   end
 
   def new
@@ -15,7 +15,7 @@ class OauthClientsController < ApplicationController
   end
 
   def create
-    @client_application = @user.client_applications.build(application_params)
+    @client_application = current_user.client_applications.build(application_params)
     if @client_application.save
       flash[:notice] = t "oauth_clients.create.flash"
       redirect_to :action => "show", :id => @client_application.id
@@ -25,21 +25,21 @@ class OauthClientsController < ApplicationController
   end
 
   def show
-    @client_application = @user.client_applications.find(params[:id])
+    @client_application = current_user.client_applications.find(params[:id])
   rescue ActiveRecord::RecordNotFound
     @type = "client application"
     render :action => "not_found", :status => :not_found
   end
 
   def edit
-    @client_application = @user.client_applications.find(params[:id])
+    @client_application = current_user.client_applications.find(params[:id])
   rescue ActiveRecord::RecordNotFound
     @type = "client application"
     render :action => "not_found", :status => :not_found
   end
 
   def update
-    @client_application = @user.client_applications.find(params[:id])
+    @client_application = current_user.client_applications.find(params[:id])
     if @client_application.update_attributes(application_params)
       flash[:notice] = t "oauth_clients.update.flash"
       redirect_to :action => "show", :id => @client_application.id
@@ -52,7 +52,7 @@ class OauthClientsController < ApplicationController
   end
 
   def destroy
-    @client_application = @user.client_applications.find(params[:id])
+    @client_application = current_user.client_applications.find(params[:id])
     @client_application.destroy
     flash[:notice] = t "oauth_clients.destroy.flash"
     redirect_to :action => "index"
index 16f1083de162fff06e5ce3f2f95bc31e0aad61b4..3815f5ae05fe231f079384cf7b27dc7a0922b30f 100644 (file)
@@ -70,6 +70,6 @@ class OldController < ApplicationController
   private
 
   def show_redactions?
-    @user && @user.moderator? && params[:show_redactions] == "true"
+    current_user && current_user.moderator? && params[:show_redactions] == "true"
   end
 end
index 129318191a65c4566ebf5f3a472c4893fc065121..f15060d5b596d2ca62be7fc0c0334e7a25e706a3 100644 (file)
@@ -19,7 +19,7 @@ class RedactionsController < ApplicationController
 
   def create
     @redaction = Redaction.new
-    @redaction.user = @user
+    @redaction.user = current_user
     @redaction.title = params[:redaction][:title]
     @redaction.description = params[:redaction][:description]
     # note that the description format will default to 'markdown'
index 846d623f29dc7dd2ed0531280cba4dbc1abc2fb2..97e83204939c7061f68dd8d877d1cda294fa4283 100644 (file)
@@ -15,7 +15,7 @@ class RelationController < ApplicationController
     relation = Relation.from_xml(request.raw_post, true)
 
     # Assume that Relation.from_xml has thrown an exception if there is an error parsing the xml
-    relation.create_with_history @user
+    relation.create_with_history current_user
     render :plain => relation.id.to_s
   end
 
@@ -39,7 +39,7 @@ class RelationController < ApplicationController
       raise OSM::APIBadUserInput.new("The id in the url (#{relation.id}) is not the same as provided in the xml (#{new_relation.id})")
     end
 
-    relation.update_from new_relation, @user
+    relation.update_from new_relation, current_user
     render :plain => relation.version.to_s
   end
 
@@ -47,7 +47,7 @@ class RelationController < ApplicationController
     relation = Relation.find(params[:id])
     new_relation = Relation.from_xml(request.raw_post)
     if new_relation && new_relation.id == relation.id
-      relation.delete_with_history!(new_relation, @user)
+      relation.delete_with_history!(new_relation, current_user)
       render :plain => relation.version.to_s
     else
       head :bad_request
index 5ca5c0aabcdda8202fef65b8fd51b2ca015e604d..c727f86d9a55ab5084da81ce8ad637040024e500 100644 (file)
@@ -92,8 +92,8 @@ class SiteController < ApplicationController
       @lat = note.lat
       @lon = note.lon
       @zoom = 17
-    elsif params[:gpx] && @user
-      trace = Trace.visible_to(@user).find(params[:gpx])
+    elsif params[:gpx] && current_user
+      trace = Trace.visible_to(current_user).find(params[:gpx])
       @lat = trace.latitude
       @lon = trace.longitude
       @zoom = 16
index 916a470245541e1d3201882c9f3d6bccfc289904..eaeb4f5d0686de96901a87023c3eb6a817a6a639 100644 (file)
@@ -32,7 +32,7 @@ class TraceController < ApplicationController
     # set title
     @title = if target_user.nil?
                t "trace.list.public_traces"
-             elsif @user && @user == target_user
+             elsif current_user && current_user == target_user
                t "trace.list.your_traces"
              else
                t "trace.list.public_traces_from", :user => target_user.display_name
@@ -46,13 +46,13 @@ class TraceController < ApplicationController
     # 3 - user's traces, logged in as same user = all user's traces
     # 4 - user's traces, not logged in as that user = all user's public traces
     @traces = if target_user.nil? # all traces
-                if @user
-                  Trace.visible_to(@user) # 1
+                if current_user
+                  Trace.visible_to(current_user) # 1
                 else
                   Trace.visible_to_all # 2
                 end
-              elsif @user && @user == target_user
-                @user.traces # 3 (check vs user id, so no join + can't pick up non-public traces by changing name)
+              elsif current_user && current_user == target_user
+                current_user.traces # 3 (check vs user id, so no join + can't pick up non-public traces by changing name)
               else
                 target_user.traces.visible_to_all # 4
               end
@@ -86,14 +86,14 @@ class TraceController < ApplicationController
   end
 
   def mine
-    redirect_to :action => :list, :display_name => @user.display_name
+    redirect_to :action => :list, :display_name => current_user.display_name
   end
 
   def view
     @trace = Trace.find(params[:id])
 
     if @trace && @trace.visible? &&
-       (@trace.public? || @trace.user == @user)
+       (@trace.public? || @trace.user == current_user)
       @title = t "trace.view.title", :name => @trace.name
     else
       flash[:error] = t "trace.view.trace_not_found"
@@ -119,18 +119,18 @@ class TraceController < ApplicationController
         if @trace.id
           flash[:notice] = t "trace.create.trace_uploaded"
 
-          if @user.traces.where(:inserted => false).count > 4
-            flash[:warning] = t "trace.trace_header.traces_waiting", :count => @user.traces.where(:inserted => false).count
+          if current_user.traces.where(:inserted => false).count > 4
+            flash[:warning] = t "trace.trace_header.traces_waiting", :count => current_user.traces.where(:inserted => false).count
           end
 
-          redirect_to :action => :list, :display_name => @user.display_name
+          redirect_to :action => :list, :display_name => current_user.display_name
         end
       else
         @trace = Trace.new(:name => "Dummy",
                            :tagstring => params[:trace][:tagstring],
                            :description => params[:trace][:description],
                            :visibility => params[:trace][:visibility],
-                           :inserted => false, :user => @user,
+                           :inserted => false, :user => current_user,
                            :timestamp => Time.now.getutc)
         @trace.valid?
         @trace.errors.add(:gpx_file, "can't be blank")
@@ -145,7 +145,7 @@ class TraceController < ApplicationController
   def data
     trace = Trace.find(params[:id])
 
-    if trace.visible? && (trace.public? || (@user && @user == trace.user))
+    if trace.visible? && (trace.public? || (current_user && current_user == trace.user))
       if Acl.no_trace_download(request.remote_ip)
         head :forbidden
       elsif request.format == Mime[:xml]
@@ -167,7 +167,7 @@ class TraceController < ApplicationController
 
     if !@trace.visible?
       head :not_found
-    elsif @user.nil? || @trace.user != @user
+    elsif current_user.nil? || @trace.user != current_user
       head :forbidden
     else
       @title = t "trace.edit.title", :name => @trace.name
@@ -177,7 +177,7 @@ class TraceController < ApplicationController
         @trace.tagstring = params[:trace][:tagstring]
         @trace.visibility = params[:trace][:visibility]
         if @trace.save
-          redirect_to :action => "view", :display_name => @user.display_name
+          redirect_to :action => "view", :display_name => current_user.display_name
         end
       end
     end
@@ -190,13 +190,13 @@ class TraceController < ApplicationController
 
     if !trace.visible?
       head :not_found
-    elsif @user.nil? || trace.user != @user
+    elsif current_user.nil? || trace.user != current_user
       head :forbidden
     else
       trace.visible = false
       trace.save
       flash[:notice] = t "trace.delete.scheduled_for_deletion"
-      redirect_to :action => :list, :display_name => @user.display_name
+      redirect_to :action => :list, :display_name => current_user.display_name
     end
   rescue ActiveRecord::RecordNotFound
     head :not_found
@@ -219,7 +219,7 @@ class TraceController < ApplicationController
     trace = Trace.find(params[:id])
 
     if trace.visible? && trace.inserted?
-      if trace.public? || (@user && @user == trace.user)
+      if trace.public? || (current_user && current_user == trace.user)
         expires_in 7.days, :private => !trace.public?, :public => trace.public?
         send_file(trace.large_picture_name, :filename => "#{trace.id}.gif", :type => "image/gif", :disposition => "inline")
       else
@@ -236,7 +236,7 @@ class TraceController < ApplicationController
     trace = Trace.find(params[:id])
 
     if trace.visible? && trace.inserted?
-      if trace.public? || (@user && @user == trace.user)
+      if trace.public? || (current_user && current_user == trace.user)
         expires_in 7.days, :private => !trace.public?, :public => trace.public?
         send_file(trace.icon_picture_name, :filename => "#{trace.id}_icon.gif", :type => "image/gif", :disposition => "inline")
       else
@@ -252,7 +252,7 @@ class TraceController < ApplicationController
   def api_read
     trace = Trace.visible.find(params[:id])
 
-    if trace.public? || trace.user == @user
+    if trace.public? || trace.user == current_user
       render :xml => trace.to_xml.to_s
     else
       head :forbidden
@@ -262,7 +262,7 @@ class TraceController < ApplicationController
   def api_update
     trace = Trace.visible.find(params[:id])
 
-    if trace.user == @user
+    if trace.user == current_user
       new_trace = Trace.from_xml(request.raw_post)
 
       unless new_trace && new_trace.id == trace.id
@@ -283,7 +283,7 @@ class TraceController < ApplicationController
   def api_delete
     trace = Trace.visible.find(params[:id])
 
-    if trace.user == @user
+    if trace.user == current_user
       trace.visible = false
       trace.save!
 
@@ -296,7 +296,7 @@ class TraceController < ApplicationController
   def api_data
     trace = Trace.visible.find(params[:id])
 
-    if trace.public? || trace.user == @user
+    if trace.public? || trace.user == current_user
       if request.format == Mime[:xml]
         send_file(trace.xml_file, :filename => "#{trace.id}.xml", :type => request.format.to_s, :disposition => "attachment")
       elsif request.format == Mime[:gpx]
@@ -357,7 +357,7 @@ class TraceController < ApplicationController
       :description => description,
       :visibility => visibility,
       :inserted => true,
-      :user => @user,
+      :user => current_user,
       :timestamp => Time.now.getutc
     )
 
@@ -390,11 +390,11 @@ class TraceController < ApplicationController
     end
 
     # Finally save the user's preferred privacy level
-    if pref = @user.preferences.where(:k => "gps.trace.visibility").first
+    if pref = current_user.preferences.where(:k => "gps.trace.visibility").first
       pref.v = visibility
       pref.save
     else
-      @user.preferences.create(:k => "gps.trace.visibility", :v => visibility)
+      current_user.preferences.create(:k => "gps.trace.visibility", :v => visibility)
     end
   end
 
@@ -407,11 +407,11 @@ class TraceController < ApplicationController
   end
 
   def default_visibility
-    visibility = @user.preferences.where(:k => "gps.trace.visibility").first
+    visibility = current_user.preferences.where(:k => "gps.trace.visibility").first
 
     if visibility
       visibility.v
-    elsif @user.preferences.where(:k => "gps.trace.public", :v => "default").first.nil?
+    elsif current_user.preferences.where(:k => "gps.trace.public", :v => "default").first.nil?
       "private"
     else
       "public"
index ea5cdab10353987042340320a840b2fa1488f69e..45cd537288d424bfbc627a084c4526c09b18640b 100644 (file)
@@ -20,7 +20,7 @@ class UserBlocksController < ApplicationController
   end
 
   def show
-    if @user && @user.id == @user_block.user_id
+    if current_user && current_user.id == @user_block.user_id
       @user_block.needs_view = false
       @user_block.save!
     end
@@ -38,7 +38,7 @@ class UserBlocksController < ApplicationController
     if @valid_params
       @user_block = UserBlock.new(
         :user_id => @this_user.id,
-        :creator_id => @user.id,
+        :creator_id => current_user.id,
         :reason => params[:user_block][:reason],
         :ends_at => Time.now.getutc + @block_period.hours,
         :needs_view => params[:user_block][:needs_view]
@@ -57,7 +57,7 @@ class UserBlocksController < ApplicationController
 
   def update
     if @valid_params
-      if @user_block.creator_id != @user.id
+      if @user_block.creator_id != current_user.id
         flash[:error] = t("user_block.update.only_creator_can_edit")
         redirect_to :action => "edit"
       elsif @user_block.update_attributes(
@@ -79,7 +79,7 @@ class UserBlocksController < ApplicationController
   # revokes the block, setting the end_time to now
   def revoke
     if params[:confirm]
-      if @user_block.revoke! @user
+      if @user_block.revoke! current_user
         flash[:notice] = t "user_block.revoke.flash"
         redirect_to(@user_block)
       end
index 82373c90a791a7507977626967c25e1b2f2e5940..d3ed53c1bc040353d52d8b23884bf6decf13cd31 100644 (file)
@@ -28,10 +28,10 @@ class UserController < ApplicationController
     else
       @title = t "user.terms.title"
 
-      if @user && @user.terms_agreed?
+      if current_user && current_user.terms_agreed?
         # Already agreed to terms, so just show settings
-        redirect_to :action => :account, :display_name => @user.display_name
-      elsif @user.nil? && session[:new_user].nil?
+        redirect_to :action => :account, :display_name => current_user.display_name
+      elsif current_user.nil? && session[:new_user].nil?
         redirect_to :action => :login, :referer => request.fullpath
       end
     end
@@ -41,52 +41,52 @@ class UserController < ApplicationController
     @title = t "user.new.title"
 
     if params[:decline]
-      if @user
-        @user.terms_seen = true
+      if current_user
+        current_user.terms_seen = true
 
-        if @user.save
+        if current_user.save
           flash[:notice] = t("user.new.terms declined", :url => t("user.new.terms declined url")).html_safe
         end
 
         if params[:referer]
           redirect_to params[:referer]
         else
-          redirect_to :action => :account, :display_name => @user.display_name
+          redirect_to :action => :account, :display_name => current_user.display_name
         end
       else
         redirect_to t("user.terms.declined")
       end
-    elsif @user
-      unless @user.terms_agreed?
-        @user.consider_pd = params[:user][:consider_pd]
-        @user.terms_agreed = Time.now.getutc
-        @user.terms_seen = true
+    elsif current_user
+      unless current_user.terms_agreed?
+        current_user.consider_pd = params[:user][:consider_pd]
+        current_user.terms_agreed = Time.now.getutc
+        current_user.terms_seen = true
 
-        flash[:notice] = t "user.new.terms accepted" if @user.save
+        flash[:notice] = t "user.new.terms accepted" if current_user.save
       end
 
       if params[:referer]
         redirect_to params[:referer]
       else
-        redirect_to :action => :account, :display_name => @user.display_name
+        redirect_to :action => :account, :display_name => current_user.display_name
       end
     else
-      @user = session.delete(:new_user)
-
-      if check_signup_allowed(@user.email)
-        @user.data_public = true
-        @user.description = "" if @user.description.nil?
-        @user.creation_ip = request.remote_ip
-        @user.languages = http_accept_language.user_preferred_languages
-        @user.terms_agreed = Time.now.getutc
-        @user.terms_seen = true
-
-        if @user.auth_uid.blank?
-          @user.auth_provider = nil
-          @user.auth_uid = nil
+      self.current_user = session.delete(:new_user)
+
+      if check_signup_allowed(current_user.email)
+        current_user.data_public = true
+        current_user.description = "" if current_user.description.nil?
+        current_user.creation_ip = request.remote_ip
+        current_user.languages = http_accept_language.user_preferred_languages
+        current_user.terms_agreed = Time.now.getutc
+        current_user.terms_seen = true
+
+        if current_user.auth_uid.blank?
+          current_user.auth_provider = nil
+          current_user.auth_uid = nil
         end
 
-        if @user.save
+        if current_user.save
           flash[:piwik_goal] = PIWIK["goals"]["signup"] if defined?(PIWIK)
 
           referer = welcome_path
@@ -103,13 +103,13 @@ class UserController < ApplicationController
             # Use default
           end
 
-          if @user.status == "active"
+          if current_user.status == "active"
             session[:referer] = referer
-            successful_login(@user)
+            successful_login(current_user)
           else
-            session[:token] = @user.tokens.create.token
-            Notifier.signup_confirm(@user, @user.tokens.create(:referer => referer)).deliver_now
-            redirect_to :action => "confirm", :display_name => @user.display_name
+            session[:token] = current_user.tokens.create.token
+            Notifier.signup_confirm(current_user, current_user.tokens.create(:referer => referer)).deliver_now
+            redirect_to :action => "confirm", :display_name => current_user.display_name
           end
         else
           render :action => "new", :referer => params[:referer]
@@ -120,29 +120,29 @@ class UserController < ApplicationController
 
   def account
     @title = t "user.account.title"
-    @tokens = @user.oauth_tokens.authorized
+    @tokens = current_user.oauth_tokens.authorized
 
     if params[:user] && params[:user][:display_name] && params[:user][:description]
       if params[:user][:auth_provider].blank? ||
-         (params[:user][:auth_provider] == @user.auth_provider &&
-          params[:user][:auth_uid] == @user.auth_uid)
-        update_user(@user, params)
+         (params[:user][:auth_provider] == current_user.auth_provider &&
+          params[:user][:auth_uid] == current_user.auth_uid)
+        update_user(current_user, params)
       else
         session[:new_user_settings] = params
         redirect_to auth_url(params[:user][:auth_provider], params[:user][:auth_uid])
       end
     elsif errors = session.delete(:user_errors)
       errors.each do |attribute, error|
-        @user.errors.add(attribute, error)
+        current_user.errors.add(attribute, error)
       end
     end
   end
 
   def go_public
-    @user.data_public = true
-    @user.save
+    current_user.data_public = true
+    current_user.save
     flash[:notice] = t "user.go_public.flash success"
-    redirect_to :action => "account", :display_name => @user.display_name
+    redirect_to :action => "account", :display_name => current_user.display_name
   end
 
   def lost_password
@@ -175,18 +175,18 @@ class UserController < ApplicationController
       token = UserToken.find_by(:token => params[:token])
 
       if token
-        @user = token.user
+        self.current_user = token.user
 
         if params[:user]
-          @user.pass_crypt = params[:user][:pass_crypt]
-          @user.pass_crypt_confirmation = params[:user][:pass_crypt_confirmation]
-          @user.status = "active" if @user.status == "pending"
-          @user.email_valid = true
+          current_user.pass_crypt = params[:user][:pass_crypt]
+          current_user.pass_crypt_confirmation = params[:user][:pass_crypt_confirmation]
+          current_user.status = "active" if current_user.status == "pending"
+          current_user.email_valid = true
 
-          if @user.save
+          if current_user.save
             token.destroy
             flash[:notice] = t "user.reset_password.flash changed"
-            successful_login(@user)
+            successful_login(current_user)
           end
         end
       else
@@ -202,7 +202,7 @@ class UserController < ApplicationController
     @title = t "user.new.title"
     @referer = params[:referer] || session[:referer]
 
-    if @user
+    if current_user
       # The user is logged in already, so don't show them the signup
       # page, instead send them to the home page
       if @referer
@@ -211,43 +211,45 @@ class UserController < ApplicationController
         redirect_to :controller => "site", :action => "index"
       end
     elsif params.key?(:auth_provider) && params.key?(:auth_uid)
-      @user = User.new(:email => params[:email],
-                       :email_confirmation => params[:email],
-                       :display_name => params[:nickname],
-                       :auth_provider => params[:auth_provider],
-                       :auth_uid => params[:auth_uid])
+      self.current_user = User.new(:email => params[:email],
+                                   :email_confirmation => params[:email],
+                                   :display_name => params[:nickname],
+                                   :auth_provider => params[:auth_provider],
+                                   :auth_uid => params[:auth_uid])
 
       flash.now[:notice] = render_to_string :partial => "auth_association"
     else
       check_signup_allowed
+
+      self.current_user = User.new
     end
   end
 
   def create
-    @user = User.new(user_params)
+    self.current_user = User.new(user_params)
 
-    if check_signup_allowed(@user.email)
+    if check_signup_allowed(current_user.email)
       session[:referer] = params[:referer]
 
-      @user.status = "pending"
+      current_user.status = "pending"
 
-      if @user.auth_provider.present? && @user.pass_crypt.empty?
+      if current_user.auth_provider.present? && current_user.pass_crypt.empty?
         # We are creating an account with external authentication and
         # no password was specified so create a random one
-        @user.pass_crypt = SecureRandom.base64(16)
-        @user.pass_crypt_confirmation = @user.pass_crypt
+        current_user.pass_crypt = SecureRandom.base64(16)
+        current_user.pass_crypt_confirmation = current_user.pass_crypt
       end
 
-      if @user.invalid?
+      if current_user.invalid?
         # Something is wrong with a new user, so rerender the form
         render :action => "new"
-      elsif @user.auth_provider.present?
+      elsif current_user.auth_provider.present?
         # Verify external authenticator before moving on
-        session[:new_user] = @user
-        redirect_to auth_url(@user.auth_provider, @user.auth_uid)
+        session[:new_user] = current_user
+        redirect_to auth_url(current_user.auth_provider, current_user.auth_uid)
       else
         # Save the user record
-        session[:new_user] = @user
+        session[:new_user] = current_user
         redirect_to :action => :terms
       end
     end
@@ -345,23 +347,23 @@ class UserController < ApplicationController
     if request.post?
       token = UserToken.find_by(:token => params[:confirm_string])
       if token && token.user.new_email?
-        @user = token.user
-        @user.email = @user.new_email
-        @user.new_email = nil
-        @user.email_valid = true
-        gravatar_enabled = gravatar_enable(@user)
-        if @user.save
+        self.current_user = token.user
+        current_user.email = current_user.new_email
+        current_user.new_email = nil
+        current_user.email_valid = true
+        gravatar_enabled = gravatar_enable(current_user)
+        if current_user.save
           flash[:notice] = if gravatar_enabled
-                             t("user.confirm_email.success") + " " + gravatar_status_message(@user)
+                             t("user.confirm_email.success") + " " + gravatar_status_message(current_user)
                            else
                              t("user.confirm_email.success")
                            end
         else
-          flash[:errors] = @user.errors
+          flash[:errors] = current_user.errors
         end
         token.destroy
-        session[:user] = @user.id
-        redirect_to :action => "account", :display_name => @user.display_name
+        session[:user] = current_user.id
+        redirect_to :action => "account", :display_name => current_user.display_name
       elsif token
         flash[:error] = t "user.confirm_email.failure"
         redirect_to :action => "account", :display_name => token.user.display_name
@@ -380,13 +382,13 @@ class UserController < ApplicationController
   end
 
   def api_details
-    @this_user = @user
+    @this_user = current_user
     render :action => :api_read, :content_type => "text/xml"
   end
 
   def api_gpx_files
     doc = OSM::API.new.get_xml_doc
-    @user.traces.reload.each do |trace|
+    current_user.traces.reload.each do |trace|
       doc.root << trace.to_xml_node
     end
     render :xml => doc.to_s
@@ -396,7 +398,7 @@ class UserController < ApplicationController
     @this_user = User.find_by(:display_name => params[:display_name])
 
     if @this_user &&
-       (@this_user.visible? || (@user && @user.administrator?))
+       (@this_user.visible? || (current_user && current_user.administrator?))
       @title = @this_user.display_name
     else
       render_unknown_user params[:display_name]
@@ -409,9 +411,9 @@ class UserController < ApplicationController
     if @new_friend
       if request.post?
         friend = Friend.new
-        friend.user_id = @user.id
+        friend.user_id = current_user.id
         friend.friend_user_id = @new_friend.id
-        if @user.is_friends_with?(@new_friend)
+        if current_user.is_friends_with?(@new_friend)
           flash[:warning] = t "user.make_friend.already_a_friend", :name => @new_friend.display_name
         elsif friend.save
           flash[:notice] = t "user.make_friend.success", :name => @new_friend.display_name
@@ -436,8 +438,8 @@ class UserController < ApplicationController
 
     if @friend
       if request.post?
-        if @user.is_friends_with?(@friend)
-          Friend.where(:user_id => @user.id, :friend_user_id => @friend.id).delete_all
+        if current_user.is_friends_with?(@friend)
+          Friend.where(:user_id => current_user.id, :friend_user_id => @friend.id).delete_all
           flash[:notice] = t "user.remove_friend.success", :name => @friend.display_name
         else
           flash[:error] = t "user.remove_friend.not_a_friend", :name => @friend.display_name
@@ -514,14 +516,14 @@ class UserController < ApplicationController
     end
 
     if settings = session.delete(:new_user_settings)
-      @user.auth_provider = provider
-      @user.auth_uid = uid
+      current_user.auth_provider = provider
+      current_user.auth_uid = uid
 
-      update_user(@user, settings)
+      update_user(current_user, settings)
 
-      session[:user_errors] = @user.errors.as_json
+      session[:user_errors] = current_user.errors.as_json
 
-      redirect_to :action => "account", :display_name => @user.display_name
+      redirect_to :action => "account", :display_name => current_user.display_name
     elsif session[:new_user]
       session[:new_user].auth_provider = provider
       session[:new_user].auth_uid = uid
@@ -547,7 +549,7 @@ class UserController < ApplicationController
         when "active", "confirmed" then
           successful_login(user, request.env["omniauth.params"]["referer"])
         when "suspended" then
-          failed_login t("user.login.account is suspended", :webmaster => "mailto:#{SUPPORT_EMAIL}")
+          failed_login t("user.login.account is suspended", :webmaster => "mailto:#{SUPPORT_EMAIL}").html_safe
         else
           failed_login t("user.login.auth failure")
         end
@@ -575,7 +577,7 @@ class UserController < ApplicationController
     elsif user = User.authenticate(:username => username, :password => password, :pending => true)
       unconfirmed_login(user)
     elsif User.authenticate(:username => username, :password => password, :suspended => true)
-      failed_login t("user.login.account is suspended", :webmaster => "mailto:#{SUPPORT_EMAIL}"), username
+      failed_login t("user.login.account is suspended", :webmaster => "mailto:#{SUPPORT_EMAIL}").html_safe, username
     else
       failed_login t("user.login.auth failure"), username
     end
@@ -725,8 +727,8 @@ class UserController < ApplicationController
             # Ignore errors sending email
           end
         else
-          @user.errors.add(:new_email, @user.errors[:email])
-          @user.errors.add(:email, [])
+          current_user.errors.add(:new_email, current_user.errors[:email])
+          current_user.errors.add(:email, [])
         end
 
         user.restore_email!
@@ -738,7 +740,7 @@ class UserController < ApplicationController
   # require that the user is a administrator, or fill out a helpful error message
   # and return them to the user page.
   def require_administrator
-    if @user && !@user.administrator?
+    if current_user && !current_user.administrator?
       flash[:error] = t("user.filter.not_an_administrator")
 
       if params[:display_name]
@@ -746,7 +748,7 @@ class UserController < ApplicationController
       else
         redirect_to :action => "login", :referer => request.fullpath
       end
-    elsif !@user
+    elsif !current_user
       redirect_to :action => "login", :referer => request.fullpath
     end
   end
@@ -754,7 +756,7 @@ class UserController < ApplicationController
   ##
   # require that the user in the URL is the logged in user
   def require_self
-    head :forbidden if params[:display_name] != @user.display_name
+    head :forbidden if params[:display_name] != current_user.display_name
   end
 
   ##
index dd4ea8bb1fb82a8586f564629d035ae0ffe0330c..4b556aed011741dc0e4f952c7136ee29aaa973a1 100644 (file)
@@ -11,7 +11,7 @@ class UserPreferenceController < ApplicationController
   def read
     doc = OSM::API.new.get_xml_doc
 
-    prefs = @user.preferences
+    prefs = current_user.preferences
 
     el1 = XML::Node.new "preferences"
 
@@ -26,14 +26,14 @@ class UserPreferenceController < ApplicationController
   ##
   # return the value for a single preference
   def read_one
-    pref = UserPreference.find([@user.id, params[:preference_key]])
+    pref = UserPreference.find([current_user.id, params[:preference_key]])
 
     render :plain => pref.v.to_s
   end
 
   # update the entire set of preferences
   def update
-    old_preferences = @user.preferences.each_with_object({}) do |preference, preferences|
+    old_preferences = current_user.preferences.each_with_object({}) do |preference, preferences|
       preferences[preference.k] = preference
     end
 
@@ -47,7 +47,7 @@ class UserPreferenceController < ApplicationController
       elsif new_preferences.include?(pt["k"])
         raise OSM::APIDuplicatePreferenceError.new(pt["k"])
       else
-        preference = @user.preferences.build(:k => pt["k"], :v => pt["v"])
+        preference = current_user.preferences.build(:k => pt["k"], :v => pt["v"])
       end
 
       new_preferences[preference.k] = preference
@@ -64,10 +64,10 @@ class UserPreferenceController < ApplicationController
   # update the value of a single preference
   def update_one
     begin
-      pref = UserPreference.find([@user.id, params[:preference_key]])
+      pref = UserPreference.find([current_user.id, params[:preference_key]])
     rescue ActiveRecord::RecordNotFound
       pref = UserPreference.new
-      pref.user = @user
+      pref.user = current_user
       pref.k = params[:preference_key]
     end
 
@@ -80,7 +80,7 @@ class UserPreferenceController < ApplicationController
   ##
   # delete a single preference
   def delete_one
-    UserPreference.find([@user.id, params[:preference_key]]).delete
+    UserPreference.find([current_user.id, params[:preference_key]]).delete
 
     render :plain => ""
   end
index 9c0339c7a72c5f50825151df15a9a098512e201d..2f5b5a84c6219cf537a63d880293128b765e6299 100644 (file)
@@ -10,7 +10,7 @@ class UserRolesController < ApplicationController
   before_action :in_role, :only => [:revoke]
 
   def grant
-    @this_user.roles.create(:role => @role, :granter_id => @user.id)
+    @this_user.roles.create(:role => @role, :granter_id => current_user.id)
     redirect_to :controller => "user", :action => "view", :display_name => @this_user.display_name
   end
 
@@ -25,7 +25,7 @@ class UserRolesController < ApplicationController
   # require that the user is an administrator, or fill out a helpful error message
   # and return them to theuser page.
   def require_administrator
-    unless @user.administrator?
+    unless current_user.administrator?
       flash[:error] = t "user_role.filter.not_an_administrator"
       redirect_to :controller => "user", :action => "view", :display_name => @this_user.display_name
     end
index f7f270575024100ef365c1ecf2d152f982957fd8..8e9e00b884bcfc04bf7b2f7937cbfd09367c9b76 100644 (file)
@@ -15,7 +15,7 @@ class WayController < ApplicationController
     way = Way.from_xml(request.raw_post, true)
 
     # Assume that Way.from_xml has thrown an exception if there is an error parsing the xml
-    way.create_with_history @user
+    way.create_with_history current_user
     render :plain => way.id.to_s
   end
 
@@ -39,7 +39,7 @@ class WayController < ApplicationController
       raise OSM::APIBadUserInput.new("The id in the url (#{way.id}) is not the same as provided in the xml (#{new_way.id})")
     end
 
-    way.update_from(new_way, @user)
+    way.update_from(new_way, current_user)
     render :plain => way.version.to_s
   end
 
@@ -49,7 +49,7 @@ class WayController < ApplicationController
     new_way = Way.from_xml(request.raw_post)
 
     if new_way && new_way.id == way.id
-      way.delete_with_history!(new_way, @user)
+      way.delete_with_history!(new_way, current_user)
       render :plain => way.version.to_s
     else
       head :bad_request
index c5b08e515dcfd3279961607f9ff399e9acac963e..d27b47f275f815397cd7315d578bc9c960e51d9d 100644 (file)
@@ -21,12 +21,12 @@ module ApplicationHelper
     css = ""
 
     css << ".hidden { display: none !important }"
-    css << ".hide_unless_logged_in { display: none !important }" unless @user
-    css << ".hide_if_logged_in { display: none !important }" if @user
-    css << ".hide_if_user_#{@user.id} { display: none !important }" if @user
-    css << ".show_if_user_#{@user.id} { display: inline !important }" if @user
-    css << ".hide_unless_administrator { display: none !important }" unless @user && @user.administrator?
-    css << ".hide_unless_moderator { display: none !important }" unless @user && @user.moderator?
+    css << ".hide_unless_logged_in { display: none !important }" unless current_user
+    css << ".hide_if_logged_in { display: none !important }" if current_user
+    css << ".hide_if_user_#{current_user.id} { display: none !important }" if current_user
+    css << ".show_if_user_#{current_user.id} { display: inline !important }" if current_user
+    css << ".hide_unless_administrator { display: none !important }" unless current_user && current_user.administrator?
+    css << ".hide_unless_moderator { display: none !important }" unless current_user && current_user.moderator?
 
     content_tag(:style, css, :type => "text/css")
   end
@@ -107,11 +107,11 @@ module ApplicationHelper
       :preferred_editor => preferred_editor
     }
 
-    if @user
-      data[:user] = @user.id.to_json
+    if current_user
+      data[:user] = current_user.id.to_json
 
-      unless @user.home_lon.nil? || @user.home_lat.nil?
-        data[:user_home] = { :lat => @user.home_lat, :lon => @user.home_lon }
+      unless current_user.home_lon.nil? || current_user.home_lat.nil?
+        data[:user_home] = { :lat => current_user.home_lat, :lon => current_user.home_lon }
       end
     end
 
index 7093a96b2b160dc9d4733d69ab58d74075813082..805abb58f38f323889cf2ebb3b1226d2a30234c2 100644 (file)
@@ -6,7 +6,7 @@ module UserRolesHelper
   end
 
   def role_icon(user, role)
-    if @user && @user.administrator?
+    if current_user && current_user.administrator?
       if user.has_role?(role)
         image = "roles/#{role}"
         alt = t("user.view.role.revoke.#{role}")
index 46d68c5d2d663ff896d8eb72fee59dc294818df0..be00868632d58eb125cf961975a839456a6bdd86 100644 (file)
@@ -20,7 +20,7 @@
 
   <div class="buttons clearfix subscribe-buttons">
     <form action="#" class="hide_unless_logged_in">
-      <% if @user and @changeset.subscribers.exists?(@user.id) %>
+      <% if current_user and @changeset.subscribers.exists?(current_user.id) %>
         <input class="action-button" type="submit" name="unsubscribe" value="<%= t('javascripts.changesets.show.unsubscribe') %>" data-method="POST" data-url="<%= changeset_unsubscribe_url(@changeset) %>" />
       <% else %>
         <input class="action-button" type="submit" name="subscribe" value="<%= t('javascripts.changesets.show.subscribe') %>" data-method="POST" data-url="<%= changeset_subscribe_url(@changeset) %>" />
                     :when => friendly_date(comment.created_at), :exact_time => l(comment.created_at),
                     :user => link_to(h(comment.author.display_name), {:controller => "user", :action => "view",
                     :display_name => comment.author.display_name})).html_safe %>
-                  <% if @user and @user.moderator? %>
+                  <% if current_user and current_user.moderator? %>
                     — <span class="action-button deemphasize" data-comment-id="<%= comment.id %>" data-method="POST" data-url="<%= changeset_comment_hide_url(comment.id) %>"><%= t('javascripts.changesets.show.hide_comment') %></span>
                   <% end %>
                 </small>
                 <%= comment.body.to_html %>
               </li>
-            <% elsif @user and @user.moderator? %>
+            <% elsif current_user and current_user.moderator? %>
               <li id="c<%= comment.id %>">
                 <small class='deemphasize'>
                   <%= t("browse.changeset.hidden_commented_by",
index 1516118eb92683b4edb30bb33b0f5ccfac7d2a7a..17faf7f8d8e80956d8ba655b2cdf7b367460801b 100644 (file)
@@ -5,7 +5,7 @@
 <% end -%>
 
 <%
-   set_title(changeset_list_title(params, @user))
+   set_title(changeset_list_title(params, current_user))
    if params[:display_name]
      @heading = t('changeset.list.title_user', :user => link_to(params[:display_name], :controller => "user", :action => "view", :display_name => params[:display_name])).html_safe
    else
index 0235d182afbea03b092169b1b7be61db27fce942..ace586ae54cd25d64e987b1164d03fa7a3defcb5 100644 (file)
@@ -2,7 +2,7 @@ atom_feed(:language => I18n.locale, :schema_date => 2009,
           :id => url_for(@params.merge(:only_path => false)),
           :root_url => url_for(@params.merge(:action => :list, :format => nil, :only_path => false)),
           "xmlns:georss" => "http://www.georss.org/georss") do |feed|
-  feed.title changeset_list_title(params, @user)
+  feed.title changeset_list_title(params, current_user)
 
   feed.updated @edits.map { |e| [e.created_at, e.closed_at].max }.max
   feed.icon image_url("favicon.ico")
index 23a5230c1f86c54d5a0a92cec51c69128eef14e2..5079074e844fbc745a60304f15185af581fbe0bc 100644 (file)
@@ -25,9 +25,9 @@
     <%= richtext_area :diary_comment, :body, :cols => 80, :rows => 15 %>
     <%= submit_tag t('diary_entry.view.save_button') %>
   <% end %>
-  <% if @user and @entry.subscribers.exists?(@user.id) %>
+  <% if current_user and @entry.subscribers.exists?(current_user.id) %>
     <div class="diary-subscribe-buttons"><%= link_to t('javascripts.changesets.show.unsubscribe'), diary_entry_unsubscribe_path(:display_name => @entry.user.display_name, :id => @entry.id), :method => :post, :class => :button %></div>
-  <% elsif @user %>
+  <% elsif current_user %>
     <div class="diary-subscribe-buttons"><%= link_to t('javascripts.changesets.show.subscribe'), diary_entry_subscribe_path(:display_name => @entry.user.display_name, :id => @entry.id), :method => :post, :class => :button %></div>
   <% end %>
 <% end %>
index cd18e79dfc22401f74b4c569f88fc28e76542fff..a6bc4c6f7697691dcd029650510db133dbeeb5c2 100644 (file)
         </ul>
       </li>
     </ul>
-    <% if @user && @user.id %>
+    <% if current_user && current_user.id %>
       <div class='dropdown user-menu logged-in'>
         <a class='dropdown-toggle' data-toggle='dropdown' href="#">
-          <%= user_thumbnail_tiny(@user, :width => 25, :height => 25)
+          <%= user_thumbnail_tiny(current_user, :width => 25, :height => 25)
           %><%= render :partial => 'layouts/inbox'
-        %><span class="user-button"><span class='username'><%= @user.display_name %></span>
+        %><span class="user-button"><span class='username'><%= current_user.display_name %></span>
           <b class="caret"></b></span>
         </a>
         <ul class='dropdown-menu'>
           <li>
-            <%= link_to inbox_path(:display_name => @user.display_name) do %>
-              <span class='count-number'><%= number_with_delimiter(@user.new_messages.size) %></span>
+            <%= link_to inbox_path(:display_name => current_user.display_name) do %>
+              <span class='count-number'><%= number_with_delimiter(current_user.new_messages.size) %></span>
               <%= t('user.view.my messages') %>
             <% end %>
           </li>
           <li>
-            <%= link_to t('user.view.my profile'), user_path(:display_name => @user.display_name) %>
+            <%= link_to t('user.view.my profile'), user_path(:display_name => current_user.display_name) %>
           </li>
           <li>
-            <%= link_to t('user.view.my settings'), :controller => 'user', :action => 'account', :display_name => @user.display_name %>
+            <%= link_to t('user.view.my settings'), :controller => 'user', :action => 'account', :display_name => current_user.display_name %>
           </li>
           <li class="divider"></li>
           <li>
index cdd708e1cb5a0508ca6981b148f53c1ae42c4e41..79a1db2da4fa56f150b45e343e548bd3f501464e 100644 (file)
@@ -1,3 +1,3 @@
-<% if @user.new_messages.size > 0 %>
-<span id="inboxanchor" class="count-number"><%= @user.new_messages.size %></span>
+<% if current_user.new_messages.size > 0 %>
+<span id="inboxanchor" class="count-number"><%= current_user.new_messages.size %></span>
 <% end %>
index 5df2081497fa1cb7e80b89dd85b49ab48a945d8e..9bed9d274ee8ab560c53d040353871bef793f1a9 100644 (file)
@@ -4,14 +4,14 @@
 
 <% content_for(:body_class) { "map-layout" } %>
 
-<% if @user and !@user.home_lon.nil? and !@user.home_lat.nil? %>
+<% if current_user and !current_user.home_lon.nil? and !current_user.home_lat.nil? %>
   <% content_for :greeting do %>
     <%= link_to t("layouts.home"),
                 "#",
                 :id => "homeanchor",
                 :class => "set_position",
-                :data => { :lat => @user.home_lat,
-                           :lon => @user.home_lon,
+                :data => { :lat => current_user.home_lat,
+                           :lon => current_user.home_lon,
                            :zoom => 15 } %>
   <% end %>
 <% end %>
@@ -38,7 +38,7 @@
       <%= yield %>
     </div>
 
-    <% unless @user %>
+    <% unless current_user %>
       <div class="welcome">
         <h2><%= t 'layouts.intro_header' %></h2>
         <div class="close-wrap"><span class="icon close"></span></div>
index 9b5edd26cf3cfad0251d2f6f3664362b2fc392d3..3a995c17144bb37e389a8de93c49e0d77dbbc83b 100644 (file)
@@ -1,8 +1,8 @@
 <p id="inbox-count">
 <%= t "message.inbox.messages",
-      :new_messages => t("message.inbox.new_messages", 
-                         :count => @user.new_messages.size),
-      :old_messages => t("message.inbox.old_messages", 
-                         :count => @user.messages.size - @user.new_messages.size)
+      :new_messages => t("message.inbox.new_messages",
+                         :count => current_user.new_messages.size),
+      :old_messages => t("message.inbox.old_messages",
+                         :count => current_user.messages.size - current_user.new_messages.size)
 %>
-</p> 
+</p>
index 4a898c0857b6c276c9df20b34f1f6e319b55b24f..919a3e4023c132a3476b661fe89a9e1d423cf5d5 100644 (file)
@@ -1,10 +1,10 @@
 <% content_for :heading do %>
-  <h2><%= t'message.inbox.my_inbox'%>/<%= link_to t('message.inbox.outbox'), outbox_path(@user.display_name) %></h2>
+  <h2><%= t'message.inbox.my_inbox'%>/<%= link_to t('message.inbox.outbox'), outbox_path(current_user.display_name) %></h2>
 <% end %>
 
   <h4><%= render :partial => "message_count" %></h4>
 
-<% if @user.messages.size > 0 %>
+<% if current_user.messages.size > 0 %>
   <table class="messages">
     <thead>
       <tr>
@@ -16,9 +16,9 @@
       </tr>
     </thead>
     <tbody>
-        <%= render :partial => "message_summary", :collection => @user.messages %>
+        <%= render :partial => "message_summary", :collection => current_user.messages %>
     </tbody>
   </table>
 <% else %>
-  <div><%= raw(t'message.inbox.no_messages_yet', :people_mapping_nearby_link => link_to(t('message.inbox.people_mapping_nearby'), :controller => 'user', :action => 'view', :display_name => @user.display_name)) %></div>
+  <div><%= raw(t'message.inbox.no_messages_yet', :people_mapping_nearby_link => link_to(t('message.inbox.people_mapping_nearby'), :controller => 'user', :action => 'view', :display_name => current_user.display_name)) %></div>
 <% end %>
index f7c26aea1fa90bf2a159e81ae5ec0b20473cb5cb..b2534e47b367c71dd0db8dedef604237e908a187 100644 (file)
@@ -16,7 +16,7 @@
     </div>
     <div class='buttons'>
       <%= submit_tag t('message.new.send_button') %>
-      <%= link_to t('message.new.back_to_inbox'), { :controller => 'message', :action => 'inbox', :display_name => @user.display_name }, :class => 'deemphasize button' %>
+      <%= link_to t('message.new.back_to_inbox'), { :controller => 'message', :action => 'inbox', :display_name => current_user.display_name }, :class => 'deemphasize button' %>
     </div>
   </fieldset>
 <% end %>
index ebf04c9fb37f015129f5ae19ab3c47607f1dda50..288c235ebd3c5718d588595e8e6b0717c70eca6d 100644 (file)
@@ -1,10 +1,10 @@
 <% content_for :heading do %>
-  <h2><%= raw(t'message.outbox.my_inbox', :inbox_link => link_to(t('message.outbox.inbox'), inbox_path(@user.display_name))) %>/<%= t'message.outbox.outbox' %></h2>
+  <h2><%= raw(t'message.outbox.my_inbox', :inbox_link => link_to(t('message.outbox.inbox'), inbox_path(current_user.display_name))) %>/<%= t'message.outbox.outbox' %></h2>
 <% end %>
 
-<h4><%= t'message.outbox.messages', :count => @user.sent_messages.size %></h4>
+<h4><%= t'message.outbox.messages', :count => current_user.sent_messages.size %></h4>
 
-<% if @user.sent_messages.size > 0 %>
+<% if current_user.sent_messages.size > 0 %>
   <table class="messages">
     <thead>
       <tr>
@@ -15,9 +15,9 @@
       </tr>
     </thead>
     <tbody>
-      <%= render :partial => "sent_message_summary", :collection => @user.sent_messages %>
+      <%= render :partial => "sent_message_summary", :collection => current_user.sent_messages %>
     </tbody>
   </table>
 <% else %>
-  <div class="messages"><%= raw(t'message.outbox.no_sent_messages', :people_mapping_nearby_link => link_to(t('message.outbox.people_mapping_nearby'), :controller => 'user', :action => 'view', :display_name => @user.display_name)) %></div>
+  <div class="messages"><%= raw(t'message.outbox.no_sent_messages', :people_mapping_nearby_link => link_to(t('message.outbox.people_mapping_nearby'), :controller => 'user', :action => 'view', :display_name => current_user.display_name)) %></div>
 <% end %>
index 8e175ef671f6a212d384ab9c415e9443ceffe5f0..6621c3e8ed760481bc87a39749c6ff7c48ca477e 100644 (file)
@@ -1,4 +1,4 @@
-<% if @user == @message.recipient %>
+<% if current_user == @message.recipient %>
   <% content_for :heading do %>
     <h2><%= h(@message.title) %></h2>
   <% end %>
@@ -36,5 +36,5 @@
 
 <% end %>
 
-  <%= link_to t('message.read.back'), {:controller => 'message', :action => 'outbox', :display_name => @user.display_name }, :class => "button deemphasize" %>
+  <%= link_to t('message.read.back'), {:controller => 'message', :action => 'outbox', :display_name => current_user.display_name }, :class => "button deemphasize" %>
   </div>
index c0271350d3f2d0bfd512cb64e7a250d95cf7f14f..6c8bc3a9e92f8e384d6aae20dd506eb8ced9a5fc 100644 (file)
@@ -2,7 +2,7 @@
   <h1><%= t "oauth.oauthorize.title" %></h1>
 <% end %>
 
-<p><%= raw t("oauth.oauthorize.request_access", :app_name => link_to(@token.client_application.name, @token.client_application.url), :user => link_to(@user.display_name, :controller => :user, :action => :view, :display_name => @user.display_name)) %></p>
+<p><%= raw t("oauth.oauthorize.request_access", :app_name => link_to(@token.client_application.name, @token.client_application.url), :user => link_to(current_user.display_name, :controller => :user, :action => :view, :display_name => current_user.display_name)) %></p>
 
 <%= form_tag authorize_url do %>
   <%= hidden_field_tag "oauth_token", @token.token %>
index 174fe97e4f60559a02c57509d997b4c375a53591..b9786992ce8542f70577455a999c14512312ce6b 100644 (file)
@@ -12,8 +12,8 @@
   <%= @redaction.description.to_html %>
 </p>
 
-<% if @user and @user.moderator? %>
-<div class="buttons">  
+<% if current_user and current_user.moderator? %>
+<div class="buttons">
   <%= button_to t('redaction.show.edit'), edit_redaction_path(@redaction), :method => :get %></td>
   <%= button_to t('redaction.show.destroy'), @redaction, :method => "delete", :remote => true, :data => { :confirm => t('redaction.show.confirm') } %>
 </div>
index b0d20a9ae134ea9b4ebdd4ec64b6764571fcc4fc..5b59f5f2427527b461e4d4a4484f031f919657a2 100644 (file)
@@ -1,7 +1,7 @@
 <%= javascript_include_tag "edit/potlatch" %>
 
 <div id="map">
-  <% session[:token] = @user.tokens.create.token unless session[:token] and UserToken.find_by_token(session[:token]) -%>
+  <% session[:token] = current_user.tokens.create.token unless session[:token] and UserToken.find_by_token(session[:token]) -%>
   <% data = { :token => session[:token] } -%>
   <% data[:lat] = @lat if @lat -%>
   <% data[:lon] = @lon if @lon -%>
index 2cc4ab2d572ec23170d8b63397b09114e84c8fdc..9e01eef302ab204e49d4d2d5278bd896b6aa7663 100644 (file)
@@ -1,13 +1,13 @@
 <%= javascript_include_tag "edit/potlatch2" %>
 
 <div id="map">
-  <% session[:token] = @user.tokens.create.token unless session[:token] and UserToken.find_by_token(session[:token]) -%>
+  <% session[:token] = current_user.tokens.create.token unless session[:token] and UserToken.find_by_token(session[:token]) -%>
   <% data = { :token => session[:token] } -%>
   <% data[:lat] = @lat if @lat -%>
   <% data[:lon] = @lon if @lon -%>
   <% data[:zoom] = @zoom if @zoom -%>
   <% if defined? POTLATCH2_KEY %>
-  <% token = @user.access_token(POTLATCH2_KEY) %>
+  <% token = current_user.access_token(POTLATCH2_KEY) %>
   <% data[:token] = token.token -%>
   <% data[:token_secret] = token.secret -%>
   <% data[:consumer_key] = token.client_application.key -%>
index ae313e1f263424119711c275207607d4843a824c..81095140ed8f1fbdf47a64fdd8330e880c9a1dda 100644 (file)
@@ -3,9 +3,9 @@
     <p><%= t 'layouts.osm_offline' %></p>
   <% elsif STATUS == :database_readonly or STATUS == :api_readonly %>
     <p><%= t 'layouts.osm_read_only' %></p>
-  <% elsif !@user.data_public? %>
+  <% elsif !current_user.data_public? %>
     <p><%= t 'site.edit.not_public' %></p>
-    <p><%= raw t 'site.edit.not_public_description', :user_page => (link_to t('site.edit.user_page_link'), {:controller => 'user', :action => 'account', :display_name => @user.display_name, :anchor => 'public'}) %></p>
+    <p><%= raw t 'site.edit.not_public_description', :user_page => (link_to t('site.edit.user_page_link'), {:controller => 'user', :action => 'account', :display_name => current_user.display_name, :anchor => 'public'}) %></p>
     <p><%= raw t 'site.edit.anon_edits', :link => link_to(t('site.edit.anon_edits_link_text'), t('site.edit.anon_edits_link')) %></p>
   <% else %>
     <%= render :partial => preferred_editor %>
index 5097dd340464cf3d9a05463965d1827124a3acf7..dff2108cacbc7831b48cbb9572ffd9069698f470 100644 (file)
@@ -5,7 +5,7 @@
 <p class='introduction'><%= t "help_page.introduction" %></p>
 
 <% ['welcome', 'beginners_guide', 'help', 'mailing_lists', 'forums', 'irc', 'switch2osm', 'wiki'].each do |site| %>
-  <% unless site == 'welcome' && !@user %>
+  <% unless site == 'welcome' && !current_user %>
   <div class='<%= site %> help-item'>
   <h3>
     <a href='<%= t "help_page.#{site}.url" %>'>
index a38a81534355d77e54684bee2f6df25eb1dce7de..c115ea59ff47d5c71596f603585535a8c66453bc 100644 (file)
@@ -10,7 +10,7 @@
 <body>
 <% data = {} -%>
 <% if defined? ID_KEY %>
-<% token = @user.access_token(ID_KEY) %>
+<% token = current_user.access_token(ID_KEY) %>
 <% data[:token] = token.token -%>
 <% data[:token_secret] = token.secret -%>
 <% data[:consumer_key] = token.client_application.key -%>
index 4811389f12f61b22368b8b84a7c178b142b4f77a..08b982cd76c097f117d9fb891ce2e1f9e475196f 100644 (file)
@@ -37,7 +37,7 @@
     <ul class='secondary-actions clearfix deemphasize'>
       <li><%= link_to t('user.view.send message'), :controller => 'message', :action => 'new', :display_name => contact.display_name %></li>
       <li>
-        <% if @user.is_friends_with?(contact) %>
+        <% if current_user.is_friends_with?(contact) %>
           <%= link_to t('user.view.remove as friend'), remove_friend_path(:display_name => contact.display_name, :referer => request.fullpath), :method => :post %>
         <% else %>
           <%= link_to t('user.view.add as friend'), make_friend_path(:display_name => contact.display_name, :referer => request.fullpath), :method => :post %>
index 47a84e99bcbb86823f90ba45096889a3c453ba74..752d1cd017740bc9f83bd9b9c01ce68fee263e62 100644 (file)
@@ -5,13 +5,13 @@
 <% content_for :heading do %>
   <h1><%= t 'user.account.my settings' %></h1>
   <ul class='secondary-actions clearfix'>
-    <li><%= link_to t('user.account.return to profile'), :controller => 'user', :action => 'view', :display_name => @user.display_name %></li>
+    <li><%= link_to t('user.account.return to profile'), :controller => 'user', :action => 'view', :display_name => current_user.display_name %></li>
     <li><%= link_to t('user.view.oauth settings'), :controller => 'oauth_clients', :action => 'index' %></li>
   </ul>
 <% end %>
 
-<%= error_messages_for 'user' %>
-<%= form_for :user, :html => { :multipart => true, :id => 'accountForm', :class => 'standard-form', :autocomplete => :off } do |f| %>
+<%= error_messages_for current_user %>
+<%= form_for current_user, :url => { :action => :account }, :html => { :multipart => true, :id => 'accountForm', :class => 'standard-form', :autocomplete => :off } do |f| %>
   <fieldset>
     <div class="form-row">
       <label class="standard-label"><%= t 'user.new.display name' %></label>
@@ -22,7 +22,7 @@
   <fieldset>
     <div class="form-row">
       <label class="standard-label"><%= t 'user.account.current email address' %></label>
-      <input type="email" disabled value="<%= @user.email %>" />
+      <input type="email" disabled value="<%= current_user.email %>" />
       <span class="form-help deemphasize"><%= t 'user.account.email never displayed publicly' %></span>
     </div>
 
@@ -58,7 +58,7 @@
     <div class="form-row">
       <label class="standard-label"><%= t 'user.account.public editing.heading' %></label>
       <span class="form-help deemphasize">
-        <% if @user.data_public? %>
+        <% if current_user.data_public? %>
           <%= t 'user.account.public editing.enabled' %>
           (<a href="<%= t 'user.account.public editing.enabled link' %>" target="_new"><%= t 'user.account.public editing.enabled link text' %></a>)
         <% else %>
     <div class="form-row">
       <label class="standard-label"><%= t 'user.account.contributor terms.heading' %></label>
       <span class="form-help deemphasize">
-        <% if @user.terms_agreed? %>
+        <% if current_user.terms_agreed? %>
           <%= t 'user.account.contributor terms.agreed' %>
           (<a href="<%= t 'user.account.contributor terms.link' %>" target="_new"><%= t 'user.account.contributor terms.link text' %></a>)
-          <% if @user.consider_pd? %>
+          <% if current_user.consider_pd? %>
             <%= t 'user.account.contributor terms.agreed_with_pd' %>
           <% end %>
         <% else %>
@@ -92,7 +92,7 @@
   <fieldset class="form-divider">
     <div class='form-row'>
       <label class="standard-label"><%= t 'user.account.profile description' %></label>
-      <%= richtext_area :user, :description, :cols => 80, :rows => 20 %>
+      <%= richtext_area :user, :description, :object => current_user, :cols => 80, :rows => 20 %>
     </div>
 
     <div class="form-row">
 
     <div class='form-row accountImage'>
       <label class="standard-label"><%= t 'user.account.image' %></label>
-        <%= user_image @user %>
+        <%= user_image current_user %>
         <ul class='form-list accountImage-options'>
-        <% if @user.image.file? %>
+        <% if current_user.image.file? %>
         <li>
-          <%= radio_button_tag "image_action", "keep", !@user.image_use_gravatar %>
+          <%= radio_button_tag "image_action", "keep", !current_user.image_use_gravatar %>
           <label class='standard-label' for='image_action_keep'><%= t 'user.account.keep image' %></label>
         </li>
         <% end %>
-        <% if @user.image.file? || @user.image_use_gravatar? %>
+        <% if current_user.image.file? || current_user.image_use_gravatar? %>
         <li>
           <%= radio_button_tag "image_action", "delete" %>
           <label class='standard-label' for='image_action_delete'><%= t 'user.account.delete image' %></label>
         </li>
         <% end %>
-        <% if @user.image.file? %>
+        <% if current_user.image.file? %>
           <li>
             <%= radio_button_tag "image_action", "new" %>
             <label class='standard-label' for='image_action_new'>
         </li>
         <% end %>
         <li>
-          <%= radio_button_tag "image_action", "gravatar", @user.image_use_gravatar %>
+          <%= radio_button_tag "image_action", "gravatar", current_user.image_use_gravatar %>
           <label class='standard-label' for='image_action_gravatar'>
             <%= t 'user.account.gravatar.gravatar' %>
             <span class='form-help deemphasize'> (<a href="<%= t 'user.account.gravatar.link' %>" target="_new"><%= t 'user.account.gravatar.link text' %></a>)</span>
   <fieldset class="form-divider">
     <div class='form-row location clearfix'>
     <label class="standard-label"><%= t 'user.account.home location' %></label>
-    <div id="homerow" <% unless @user.home_lat and @user.home_lon %>class="nohome"<%end%> >
+    <div id="homerow" <% unless current_user.home_lat and current_user.home_lon %>class="nohome"<%end%> >
       <p class="message form-help deemphasize"><%= t 'user.account.no home location' %></p>
         <div class='form-column'>
           <label class="standard-label secondary"><%= t 'user.account.latitude' %></label>
     </div>
 
     <div class="form-row">
-      <input type="checkbox" name="updatehome" value="1" <% unless @user.home_lat and @user.home_lon %> checked="checked" <% end %> id="updatehome" />
+      <input type="checkbox" name="updatehome" value="1" <% unless current_user.home_lat and current_user.home_lon %> checked="checked" <% end %> id="updatehome" />
       <label class="standard-label" for="updatehome"><%= t 'user.account.update home location on click' %></label>
     </div>
     <%= content_tag "div", "", :id => "map", :class => "content_map settings_map set_location" %>
   <%= submit_tag t('user.account.save changes button') %>
 <% end %>
 
-<% unless @user.data_public? %>
+<% unless current_user.data_public? %>
 <a name="public"></a>
 <h2><%= t 'user.account.public editing note.heading' %></h2>
 <%= raw t 'user.account.public editing note.text' %>
index 7136b9f5867af6de53994dcad04ff5527a4f95d7..0e8bfa5eff34f1e5358fb75ceab8c6e36cf16558 100644 (file)
@@ -4,7 +4,7 @@ xml.osm("version" => API_VERSION, "generator" => GENERATOR) do
                    :display_name => @this_user.display_name,
                    :account_created => @this_user.creation_time.xmlschema do
     xml.tag! "description", @this_user.description if @this_user.description
-    if @user && @user == @this_user
+    if current_user && current_user == @this_user
       xml.tag! "contributor-terms", :agreed => @this_user.terms_agreed.present?,
                                     :pd => @this_user.consider_pd
     else
@@ -28,7 +28,7 @@ xml.osm("version" => API_VERSION, "generator" => GENERATOR) do
                            :active => @this_user.blocks_created.active.size
       end
     end
-    if @user && @user == @this_user
+    if current_user && current_user == @this_user
       if @this_user.home_lat && @this_user.home_lon
         xml.tag! "home", :lat => @this_user.home_lat,
                          :lon => @this_user.home_lon,
index fcd775a484eca5046710e344a2ecdc92dce5fe3c..5a207060eeaf101548c6400f4f5b4808caf09ec3 100644 (file)
@@ -8,7 +8,7 @@
   <div class='header-illustration new-user-arm'></div>
 <% end %>
 
-<%= form_for :user, :url => { :action => 'create' }, :html => { :class => 'standard-form fillL col6 inner22' } do %>
+<%= form_for current_user, :url => { :action => 'create' }, :html => { :class => 'standard-form fillL col6 inner22' } do |f| %>
   <%= hidden_field_tag('referer', h(@referer)) unless @referer.nil? %>
 
   <fieldset>
       <label for="email" class="standard-label">
         <%= t 'user.new.email address' %>
       </label>
-      <%= email_field(:user, :email, { :tabindex => 1 }) %>
-      <%= error_message_on(:user, :email) %>
+      <%= f.email_field(:email, { :tabindex => 1 }) %>
+      <%= f.error_message_on(:email) %>
     </div>
     <div class="form-row">
       <label for="email_confirmation" class="standard-label">
         <%= t 'user.new.confirm email address' %>
       </label>
-      <%= email_field(:user, :email_confirmation, { :tabindex => 2 }) %>
-      <%= error_message_on(:user, :email_confirmation) %>
+      <%= f.email_field(:email_confirmation, { :tabindex => 2 }) %>
+      <%= f.error_message_on(:email_confirmation) %>
     </div>
     <span class="form-help deemphasize"><%= raw(t 'user.new.not displayed publicly') %></span>
   </fieldset>
@@ -34,8 +34,8 @@
       <label for="display_name" class="standard-label">
         <%= t 'user.new.display name' %>
       </label>
-      <%= text_field(:user, :display_name, { :tabindex => 3 }) %>
-      <%= error_message_on(:user, :display_name) %>
+      <%= f.text_field(:display_name, { :tabindex => 3 }) %>
+      <%= f.error_message_on(:display_name) %>
     </div>
     <span class="form-help deemphasize"><%= t 'user.new.display name description' %></span>
   </fieldset>
@@ -45,9 +45,9 @@
       <label for="openid_url" class="standard-label">
         <%= raw t 'user.new.external auth' %>
       </label>
-      <%= select(:user, :auth_provider, Auth::PROVIDERS, { :default => "", :tabindex => 4 }) %>
-      <%= text_field(:user, :auth_uid, { :tabindex => 5 }) %>
-      <%= error_message_on(:user, :auth_uid) %>
+      <%= f.select(:auth_provider, Auth::PROVIDERS, { :default => "", :tabindex => 4 }) %>
+      <%= f.text_field(:auth_uid, { :tabindex => 5 }) %>
+      <%= f.error_message_on(:auth_uid) %>
     </div>
     <span class="form-help deemphasize"><%= t 'user.new.auth no password' %></span>
   </fieldset>
       <label for='user[pass_crypt]' class="standard-label">
         <%= t 'user.new.password' %>
       </label>
-      <%= password_field(:user, :pass_crypt, { :tabindex => 6 }) %>
-      <%= error_message_on(:user, :pass_crypt) %>
+      <%= f.password_field(:pass_crypt, { :tabindex => 6 }) %>
+      <%= f.error_message_on(:pass_crypt) %>
     </div>
     <div class="form-row">
       <label class="standard-label">
         <%= t 'user.new.confirm password' %>
       </label>
-      <%= password_field(:user, :pass_crypt_confirmation, { :tabindex => 7 }) %>
-      <%= error_message_on(:user, :pass_crypt_confirmation) %>
+      <%= f.password_field(:pass_crypt_confirmation, { :tabindex => 7 }) %>
+      <%= f.error_message_on(:pass_crypt_confirmation) %>
     </div>
   </fieldset>
 
index d1718a5e4853f074a77c3b6dd488a62c1057e68e..4cb94374ade7f47069d80448106efad3320194c2 100644 (file)
@@ -1,5 +1,5 @@
 <% content_for :heading do %>
-  <h1><%= t 'user.reset_password.heading', :user => @user.display_name %></h1>
+  <h1><%= t 'user.reset_password.heading', :user => current_user.display_name %></h1>
 <% end %>
 
 <%= error_messages_for :user %>
index f8a80b26c60c3296b4fedddcf4c97dc16becd78e..7134a167f1d89291d52f702ad76901e964283f8a 100644 (file)
@@ -1 +1 @@
-<%= @user.email %>
+<%= current_user.email %>
index a23f15e55a2a4590a81e122e01749b7722b3e054..777f16389b47b99a132f68d2b7a557e1b8e02bd0 100644 (file)
@@ -3,42 +3,42 @@
     <%= user_image @this_user %>
     <div class='userinformation-inner'>
       <h1><%= @this_user.display_name %><%= role_icons(@this_user) %></h1>
-      <% if @user and @this_user.id == @user.id %>
+      <% if current_user and @this_user.id == current_user.id %>
         <!-- Displaying user's own profile page to themself -->
         <ul class='secondary-actions clearfix'>
           <li>
-            <%= link_to t('user.view.my edits'), :controller => 'changeset', :action => 'list', :display_name => @user.display_name %>
-            <span class='count-number'><%= number_with_delimiter(@user.changesets.size) %></span>
+            <%= link_to t('user.view.my edits'), :controller => 'changeset', :action => 'list', :display_name => current_user.display_name %>
+            <span class='count-number'><%= number_with_delimiter(current_user.changesets.size) %></span>
           </li>
           <li>
             <%= link_to t('user.view.my notes'), :controller => 'notes', :action=> 'mine' %>
           </li>
           <li>
             <%= link_to t('user.view.my traces'), :controller => 'trace', :action=>'mine' %>
-            <span class='count-number'><%= number_with_delimiter(@user.traces.size) %></span>
+            <span class='count-number'><%= number_with_delimiter(current_user.traces.size) %></span>
           </li>
           <li>
-            <%= link_to t('user.view.my diary'), :controller => 'diary_entry', :action => 'list', :display_name => @user.display_name %>
-            <span class='count-number'><%= number_with_delimiter(@user.diary_entries.size) %></span>
+            <%= link_to t('user.view.my diary'), :controller => 'diary_entry', :action => 'list', :display_name => current_user.display_name %>
+            <span class='count-number'><%= number_with_delimiter(current_user.diary_entries.size) %></span>
           </li>
           <li>
-            <%= link_to t('user.view.my comments' ), :controller => 'diary_entry', :action => 'comments', :display_name => @user.display_name %>
+            <%= link_to t('user.view.my comments' ), :controller => 'diary_entry', :action => 'comments', :display_name => current_user.display_name %>
           </li>
           <li>
-            <%= link_to t('user.view.my settings'), :controller => 'user', :action => 'account', :display_name => @user.display_name %>
+            <%= link_to t('user.view.my settings'), :controller => 'user', :action => 'account', :display_name => current_user.display_name %>
           </li>
 
-          <% if @user.blocks.exists? %>
+          <% if current_user.blocks.exists? %>
             <li>
-              <%= link_to t('user.view.blocks on me'), :controller => 'user_blocks', :action => 'blocks_on', :display_name => @user.display_name %>
-              <span class='count-number'><%= number_with_delimiter(@user.blocks.active.size) %></span>
+              <%= link_to t('user.view.blocks on me'), :controller => 'user_blocks', :action => 'blocks_on', :display_name => current_user.display_name %>
+              <span class='count-number'><%= number_with_delimiter(current_user.blocks.active.size) %></span>
             </li>
           <% end %>
 
-          <% if @user and @user.moderator? and @user.blocks_created.exists? %>
+          <% if current_user and current_user.moderator? and current_user.blocks_created.exists? %>
             <li>
-              <%= link_to t('user.view.blocks by me'), :controller => 'user_blocks', :action => 'blocks_by', :display_name => @user.display_name %>
-              <span class='count-number'><%= number_with_delimiter(@user.blocks_created.active.size) %></span>
+              <%= link_to t('user.view.blocks by me'), :controller => 'user_blocks', :action => 'blocks_by', :display_name => current_user.display_name %>
+              <span class='count-number'><%= number_with_delimiter(current_user.blocks_created.active.size) %></span>
             </li>
           <% end %>
 
@@ -73,9 +73,9 @@
             <%= link_to t('user.view.comments'), :controller => 'diary_entry', :action => 'comments', :display_name => @this_user.display_name %>
           </li>
           <li>
-            <% if @user and @user.is_friends_with?(@this_user) %>
+            <% if current_user and current_user.is_friends_with?(@this_user) %>
               <%= link_to t('user.view.remove as friend'), remove_friend_path(:display_name => @this_user.display_name), :method => :post %>
-            <% elsif @user %>
+            <% elsif current_user %>
               <%= link_to t('user.view.add as friend'), make_friend_path(:display_name => @this_user.display_name), :method => :post %>
             <% else %>
               <%= link_to t('user.view.add as friend'), make_friend_path(:display_name => @this_user.display_name) %>
@@ -96,7 +96,7 @@
             </li>
           <% end %>
 
-          <% if @user and @user.moderator? %>
+          <% if current_user and current_user.moderator? %>
             <li>
             <%= link_to t('user.view.create_block'), :controller => 'user_blocks', :action => 'new', :display_name => @this_user.display_name %>
             </li>
 
       <% end %>
 
-      <% if @user and @user.administrator? %>
+      <% if current_user and current_user.administrator? %>
 
         <ul class='secondary-actions clearfix'>
           <% if ["active", "confirmed"].include? @this_user.status %>
 
   </div>
 
-  <% if @user and @user.administrator? -%>
+  <% if current_user and current_user.administrator? -%>
     <div class='admin-user-info deemphasize'>
       <small><b><%= t 'user.view.email address' %></b> <%= @this_user.email %></small>
       <% unless @this_user.creation_ip.nil? -%>
 
 <% end %>
 
-  <% if @user and @this_user.id == @user.id %>
+  <% if current_user and @this_user.id == current_user.id %>
     <% if @this_user.home_lat.nil? or @this_user.home_lon.nil? %>
       <div id="map" class="content_map">
-        <p id="no_home_location"><%= raw(t 'user.view.if set location', :settings_link => (link_to t('user.view.settings_link_text'), :controller => 'user', :action => 'account', :display_name => @user.display_name)) %></p>
+        <p id="no_home_location"><%= raw(t 'user.view.if set location', :settings_link => (link_to t('user.view.settings_link_text'), :controller => 'user', :action => 'account', :display_name => current_user.display_name)) %></p>
       </div>
     <% else %>
       <% content_for :head do %>
       <% end %>
       <%
         user_data = {
-          :lon => @user.home_lon,
-          :lat => @user.home_lat,
+          :lon => current_user.home_lon,
+          :lat => current_user.home_lat,
           :icon => image_path("marker-red.png"),
-          :description => render(:partial => "popup", :object => @user, :locals => {:type => "your location"})
+          :description => render(:partial => "popup", :object => current_user, :locals => {:type => "your location"})
         }
       %>
       <%= content_tag "div", "", :id => "map", :class => "content_map", :data => {:user => user_data} %>
index 362cfd107bcf9b5c371629515958e6c239e16902..501ae92d0ca1a80defd631320be9e59c868bd24a 100644 (file)
@@ -17,7 +17,7 @@
     <% end %>
   </td>
   <td class="<%= c1 %>"><%= link_to t('user_block.partial.show'), block %></td>
-  <td class="<%= c1 %>"><% if @user and @user.id == block.creator_id and block.active? %><%= link_to t('user_block.partial.edit'), edit_user_block_path(block) %><% end %></td>
+  <td class="<%= c1 %>"><% if current_user and current_user.id == block.creator_id and block.active? %><%= link_to t('user_block.partial.edit'), edit_user_block_path(block) %><% end %></td>
   <% if show_revoke_link %>
   <td class="<%= c1 %>"><% if block.active? %><%= link_to t('user_block.partial.revoke'), :controller => 'user_blocks', :action => 'revoke', :id => block.id %><% end %></td>
   <% end %>
index a8d761288406adf1868850074a704d1f8a3e7ca5..d2f888e7d185f8a30ef13c06316dad0c1b8b8a73 100644 (file)
@@ -4,7 +4,7 @@
 <% end %>
 
 <% unless @user_blocks.empty? %>
-<%= render :partial => 'blocks', :locals => { :show_revoke_link => (@user and @user.moderator?), :show_user_name => true, :show_creator_name => false } %>
+<%= render :partial => 'blocks', :locals => { :show_revoke_link => (current_user and current_user.moderator?), :show_user_name => true, :show_creator_name => false } %>
 <% else %>
 <p><%= t "user_block.blocks_by.empty", :name => h(@this_user.display_name) %></p>
 <% end %>
index 8e91935ed4f5ea7ae3a122fe6e1c1d2e2a8d7ee7..3973355317d03f04d24481c7ad58d000d6358344 100644 (file)
@@ -3,7 +3,7 @@
   <h1><%= raw(t('user_block.blocks_on.heading', :name => link_to(h(@this_user.display_name), {:controller => 'user', :action => 'view', :display_name => @this_user.display_name}))) %></h1>
 <% end %>
 <% unless @user_blocks.empty? %>
-<%= render :partial => 'blocks', :locals => { :show_revoke_link => (@user and @user.moderator?), :show_user_name => false, :show_creator_name => true } %>
+<%= render :partial => 'blocks', :locals => { :show_revoke_link => (current_user and current_user.moderator?), :show_user_name => false, :show_creator_name => true } %>
 <% else %>
 <p><%= t "user_block.blocks_on.empty", :name => h(@this_user.display_name) %></p>
 <% end %>
index 8cf7e81b753a81e1b6b765a3350d137eed4a83f4..ce7f12b9150db41336b1d0c778cf1f0b9bdabbf8 100644 (file)
@@ -4,7 +4,7 @@
 <% end %>
 
 <% unless @user_blocks.empty? %>
-<%= render :partial => 'blocks', :locals => { :show_revoke_link => (@user and @user.moderator?), :show_user_name => true, :show_creator_name => true } %>
+<%= render :partial => 'blocks', :locals => { :show_revoke_link => (current_user and current_user.moderator?), :show_user_name => true, :show_creator_name => true } %>
 <% else %>
 <p><%= t "user_block.index.empty" %></p>
 <% end %>
index ccd6df06faf5b3bccee26756f5175f69cf6d7c48..cc0caa6f3f2d44590c0e39d5e83e4a517d00b60c 100644 (file)
                                      {:controller => 'user', :action => 'view', :display_name => @user_block.creator.display_name})) %></h1>
 <ul class='secondary-actions clearfix'>
   <% if @user_block.ends_at > Time.now.getutc %>
-    <% if @user and @user.id == @user_block.creator_id %>
+    <% if current_user and current_user.id == @user_block.creator_id %>
       <li><%= link_to t('user_block.show.edit'), edit_user_block_path(@user_block) %></li>
     <% end %>
-    <% if @user and @user.moderator? %>
+    <% if current_user and current_user.moderator? %>
       <li><%= link_to(t('user_block.show.revoke'),{:controller => 'user_blocks', :action => 'revoke', :id => @user_block.id}) %></li>
     <% end %>
   <% end %>
index 3b151afba025abaf4db23dbcb682921dbdb11a63..7bdf169bf1bcf971b7e7ab64517f3c88bd17e3ed 100644 (file)
@@ -1,20 +1,6 @@
-sotmasia2016:
-  id: sotmasia2016
-  alt: State of the Map Asia 2016
-  link: http://stateofthemap.asia/
-  img: banners/sotmasia-2016.jpg
-  enddate: 2016-oct-01
-
-donate2016:
-  id: donate2016
-  alt: OpenStreetMap Funding Drive 2016
-  link: https://donate.openstreetmap.org/
-  img: banners/donate-2016.jpg
-  enddate: 2016-oct-31
-
-sotmlatam2016:
-  id: sotmlatam2016
-  alt: State of the Map Latam 2016
-  link: http://state.osmlatam.org/
-  img: banners/sotmlatam-2016.jpg
-  enddate: 2016-nov-25
+sotm2017:
+  id: sotm2017
+  alt: State of the Map 2017
+  link: http://2017.stateofthemap.org/
+  img: banners/banner-sotm-2017.png
+  enddate: 2017-aug-27
index 9c5c7a180ca3fb7eb3ee2ffeb1baef6e51861272..5c60ccd16b4f9e6042896f5e222822c7df3a2349 100644 (file)
@@ -50,9 +50,8 @@ defaults: &defaults
   #messages_domain: "messages.openstreetmap.org"
   # Geonames authentication details
   #geonames_username: ""
-  # Quova authentication details
-  #quova_username: ""
-  #quova_password: ""
+  # GeoIP database
+  #geoip_database: ""
   # Users to show as being nearby
   nearby_users: 30
   # Max radius, in km, for nearby users
index 9cdbd718c99b49d0f0f8325fe7f594fc0b1f0179..11d850ac35f67edfab51a043b96b9970005cccd5 100644 (file)
@@ -406,7 +406,7 @@ class ApiControllerTest < ActionController::TestCase
   end
 
   def test_permissions_basic_auth
-    basic_authorization(create(:user).email, "test")
+    basic_authorization create(:user).email, "test"
     get :permissions
     assert_response :success
     assert_select "osm > permissions", :count => 1 do
index 654682ac083ad34722af114f206a9e191ffbd53f..9bf3a4b8ee0e9d5cbc994f87528bb866a8837f97 100644 (file)
@@ -1321,7 +1321,7 @@ EOF
     node = create(:node)
 
     ## First try with a non-public user, which should get a forbidden
-    basic_authorization(create(:user, :data_public => false).email, "test")
+    basic_authorization create(:user, :data_public => false).email, "test"
 
     # create a temporary changeset
     content "<osm><changeset>" +
@@ -1331,7 +1331,7 @@ EOF
     assert_response :forbidden
 
     ## Now try with a normal user
-    basic_authorization(create(:user).email, "test")
+    basic_authorization create(:user).email, "test"
 
     # create a temporary changeset
     content "<osm><changeset>" +
@@ -1377,7 +1377,7 @@ EOF
   #
   # NOTE: the error turned out to be something else completely!
   def test_josm_upload
-    basic_authorization(create(:user).email, "test")
+    basic_authorization create(:user).email, "test"
 
     # create a temporary changeset
     content "<osm><changeset>" +
@@ -1439,7 +1439,7 @@ OSMFILE
     node = create(:node)
     node2 = create(:node)
     way = create(:way)
-    basic_authorization(create(:user).email, "test")
+    basic_authorization create(:user).email, "test"
 
     # create a temporary changeset
     content "<osm><changeset>" +
@@ -2147,7 +2147,7 @@ EOF
     deleted_user = create(:user, :deleted)
     private_user_closed_changeset = create(:changeset, :closed, :user => private_user)
 
-    basic_authorization(user.email, "test")
+    basic_authorization user.email, "test"
 
     assert_difference "ChangesetComment.count", 1 do
       assert_no_difference "ActionMailer::Base.deliveries.size" do
@@ -2176,7 +2176,7 @@ EOF
 
     ActionMailer::Base.deliveries.clear
 
-    basic_authorization(user2.email, "test")
+    basic_authorization user2.email, "test"
 
     assert_difference "ChangesetComment.count", 1 do
       assert_difference "ActionMailer::Base.deliveries.size", 2 do
@@ -2205,7 +2205,7 @@ EOF
     post :comment, :params => { :id => create(:changeset, :closed).id, :text => "This is a comment" }
     assert_response :unauthorized
 
-    basic_authorization(create(:user).email, "test")
+    basic_authorization create(:user).email, "test"
 
     # bad changeset id
     assert_no_difference "ChangesetComment.count" do
@@ -2235,7 +2235,7 @@ EOF
   ##
   # test subscribe success
   def test_subscribe_success
-    basic_authorization(create(:user).email, "test")
+    basic_authorization create(:user).email, "test"
     changeset = create(:changeset, :closed)
 
     assert_difference "changeset.subscribers.count", 1 do
@@ -2256,7 +2256,7 @@ EOF
     end
     assert_response :unauthorized
 
-    basic_authorization(user.email, "test")
+    basic_authorization user.email, "test"
 
     # bad changeset id
     assert_no_difference "changeset.subscribers.count" do
@@ -2284,7 +2284,7 @@ EOF
   # test unsubscribe success
   def test_unsubscribe_success
     user = create(:user)
-    basic_authorization(user.email, "test")
+    basic_authorization user.email, "test"
     changeset = create(:changeset, :closed)
     changeset.subscribers.push(user)
 
@@ -2304,7 +2304,7 @@ EOF
     end
     assert_response :unauthorized
 
-    basic_authorization(create(:user).email, "test")
+    basic_authorization create(:user).email, "test"
 
     # bad changeset id
     assert_no_difference "changeset.subscribers.count" do
@@ -2338,14 +2338,14 @@ EOF
     assert_response :unauthorized
     assert_equal true, comment.reload.visible
 
-    basic_authorization(create(:user).email, "test")
+    basic_authorization create(:user).email, "test"
 
     # not a moderator
     post :hide_comment, :params => { :id => comment.id }
     assert_response :forbidden
     assert_equal true, comment.reload.visible
 
-    basic_authorization(create(:moderator_user).email, "test")
+    basic_authorization create(:moderator_user).email, "test"
 
     # bad comment id
     post :hide_comment, :params => { :id => 999111 }
@@ -2359,7 +2359,7 @@ EOF
     comment = create(:changeset_comment)
     assert_equal true, comment.visible
 
-    basic_authorization(create(:moderator_user).email, "test")
+    basic_authorization create(:moderator_user).email, "test"
 
     post :hide_comment, :params => { :id => comment.id }
     assert_response :success
@@ -2377,14 +2377,14 @@ EOF
     assert_response :unauthorized
     assert_equal false, comment.reload.visible
 
-    basic_authorization(create(:user).email, "test")
+    basic_authorization create(:user).email, "test"
 
     # not a moderator
     post :unhide_comment, :params => { :id => comment.id }
     assert_response :forbidden
     assert_equal false, comment.reload.visible
 
-    basic_authorization(create(:moderator_user).email, "test")
+    basic_authorization create(:moderator_user).email, "test"
 
     # bad comment id
     post :unhide_comment, :params => { :id => 999111 }
@@ -2398,7 +2398,7 @@ EOF
     comment = create(:changeset_comment, :visible => false)
     assert_equal false, comment.visible
 
-    basic_authorization(create(:moderator_user).email, "test")
+    basic_authorization create(:moderator_user).email, "test"
 
     post :unhide_comment, :params => { :id => comment.id }
     assert_response :success
index 7aeb5066b502ad161244ac5bca2f316f6a22e85b..f2ef39dff3f63cdddb4eae6e3e50970c492d0970 100644 (file)
@@ -46,7 +46,7 @@ class NodeControllerTest < ActionController::TestCase
     assert_response :unauthorized, "node upload did not return unauthorized status"
 
     ## Now try with the user which doesn't have their data public
-    basic_authorization(private_user.email, "test")
+    basic_authorization private_user.email, "test"
 
     # create a minimal xml file
     content("<osm><node lat='#{lat}' lon='#{lon}' changeset='#{private_changeset.id}'/></osm>")
@@ -57,7 +57,7 @@ class NodeControllerTest < ActionController::TestCase
     assert_require_public_data "node create did not return forbidden status"
 
     ## Now try with the user that has the public data
-    basic_authorization(user.email, "test")
+    basic_authorization user.email, "test"
 
     # create a minimal xml file
     content("<osm><node lat='#{lat}' lon='#{lon}' changeset='#{changeset.id}'/></osm>")
@@ -83,7 +83,7 @@ class NodeControllerTest < ActionController::TestCase
     user = create(:user)
     changeset = create(:changeset, :user => user)
 
-    basic_authorization(user.email, "test")
+    basic_authorization user.email, "test"
     lat = 3.434
     lon = 3.23
 
@@ -160,7 +160,7 @@ class NodeControllerTest < ActionController::TestCase
     assert_response :unauthorized
 
     ## now set auth for the non-data public user
-    basic_authorization(private_user.email, "test")
+    basic_authorization private_user.email, "test"
 
     # try to delete with an invalid (closed) changeset
     content update_changeset(private_node.to_xml, private_user_closed_changeset.id)
@@ -208,7 +208,7 @@ class NodeControllerTest < ActionController::TestCase
     changeset = create(:changeset, :user => user)
     closed_changeset = create(:changeset, :closed, :user => user)
     node = create(:node, :changeset => changeset)
-    basic_authorization(user.email, "test")
+    basic_authorization user.email, "test"
 
     # try to delete with an invalid (closed) changeset
     content update_changeset(node.to_xml, closed_changeset.id)
@@ -295,7 +295,7 @@ class NodeControllerTest < ActionController::TestCase
     ## Second test with the private user
 
     # setup auth
-    basic_authorization(private_user.email, "test")
+    basic_authorization private_user.email, "test"
 
     ## trying to break changesets
 
@@ -347,7 +347,7 @@ class NodeControllerTest < ActionController::TestCase
     assert_response :forbidden
 
     # setup auth
-    basic_authorization(user.email, "test")
+    basic_authorization user.email, "test"
 
     ## trying to break changesets
 
@@ -465,7 +465,7 @@ class NodeControllerTest < ActionController::TestCase
     existing_tag = create(:node_tag)
     assert_equal true, existing_tag.node.changeset.user.data_public
     # setup auth
-    basic_authorization(existing_tag.node.changeset.user.email, "test")
+    basic_authorization existing_tag.node.changeset.user.email, "test"
 
     # add an identical tag to the node
     tag_xml = XML::Node.new("tag")
@@ -492,7 +492,7 @@ class NodeControllerTest < ActionController::TestCase
     changeset = create(:changeset, :user => user)
 
     ## First try with the non-data public user
-    basic_authorization(private_user.email, "test")
+    basic_authorization private_user.email, "test"
 
     # try and put something into a string that the API might
     # use unquoted and therefore allow code injection...
@@ -503,7 +503,7 @@ class NodeControllerTest < ActionController::TestCase
     assert_require_public_data "Shouldn't be able to create with non-public user"
 
     ## Then try with the public data user
-    basic_authorization(user.email, "test")
+    basic_authorization user.email, "test"
 
     # try and put something into a string that the API might
     # use unquoted and therefore allow code injection...
index e19810851bef03039c75bd6fa16b94b0964ab65a..200f284d8080b1345801bd062703f9e01c458b3a 100644 (file)
@@ -303,7 +303,7 @@ class NotesControllerTest < ActionController::TestCase
 
     ActionMailer::Base.deliveries.clear
 
-    basic_authorization(third_user.email, "test")
+    basic_authorization third_user.email, "test"
 
     assert_difference "NoteComment.count", 1 do
       assert_difference "ActionMailer::Base.deliveries.size", 2 do
@@ -397,7 +397,7 @@ class NotesControllerTest < ActionController::TestCase
     post :close, :params => { :id => open_note_with_comment.id, :text => "This is a close comment", :format => "json" }
     assert_response :unauthorized
 
-    basic_authorization(user.email, "test")
+    basic_authorization user.email, "test"
 
     post :close, :params => { :id => open_note_with_comment.id, :text => "This is a close comment", :format => "json" }
     assert_response :success
@@ -428,7 +428,7 @@ class NotesControllerTest < ActionController::TestCase
     post :close
     assert_response :unauthorized
 
-    basic_authorization(create(:user).email, "test")
+    basic_authorization create(:user).email, "test"
 
     post :close
     assert_response :bad_request
@@ -454,7 +454,7 @@ class NotesControllerTest < ActionController::TestCase
     post :reopen, :params => { :id => closed_note_with_comment.id, :text => "This is a reopen comment", :format => "json" }
     assert_response :unauthorized
 
-    basic_authorization(user.email, "test")
+    basic_authorization user.email, "test"
 
     post :reopen, :params => { :id => closed_note_with_comment.id, :text => "This is a reopen comment", :format => "json" }
     assert_response :success
@@ -487,7 +487,7 @@ class NotesControllerTest < ActionController::TestCase
     post :reopen, :params => { :id => hidden_note_with_comment.id }
     assert_response :unauthorized
 
-    basic_authorization(create(:user).email, "test")
+    basic_authorization create(:user).email, "test"
 
     post :reopen, :params => { :id => 12345 }
     assert_response :not_found
@@ -606,12 +606,12 @@ class NotesControllerTest < ActionController::TestCase
     delete :destroy, :params => { :id => open_note_with_comment.id, :text => "This is a hide comment", :format => "json" }
     assert_response :unauthorized
 
-    basic_authorization(user.email, "test")
+    basic_authorization user.email, "test"
 
     delete :destroy, :params => { :id => open_note_with_comment.id, :text => "This is a hide comment", :format => "json" }
     assert_response :forbidden
 
-    basic_authorization(moderator_user.email, "test")
+    basic_authorization moderator_user.email, "test"
 
     delete :destroy, :params => { :id => open_note_with_comment.id, :text => "This is a hide comment", :format => "json" }
     assert_response :success
@@ -636,12 +636,12 @@ class NotesControllerTest < ActionController::TestCase
     delete :destroy, :params => { :id => 12345, :format => "json" }
     assert_response :unauthorized
 
-    basic_authorization(user.email, "test")
+    basic_authorization user.email, "test"
 
     delete :destroy, :params => { :id => 12345, :format => "json" }
     assert_response :forbidden
 
-    basic_authorization(moderator_user.email, "test")
+    basic_authorization moderator_user.email, "test"
 
     delete :destroy, :params => { :id => 12345, :format => "json" }
     assert_response :not_found
index be4254279addff7e10ecc9ccabb46e0abc6e4259..a05326e1e4493c5a2763f6aa7136a8c7a87d1393 100644 (file)
@@ -40,7 +40,7 @@ class OldNodeControllerTest < ActionController::TestCase
     propagate_tags(node, node.old_nodes.last)
 
     ## First try this with a non-public user
-    basic_authorization(private_user.email, "test")
+    basic_authorization private_user.email, "test"
 
     # setup a simple XML node
     xml_doc = private_node.to_xml
@@ -89,7 +89,7 @@ class OldNodeControllerTest < ActionController::TestCase
     # probably should check that they didn't get written to the database
 
     ## Now do it with the public user
-    basic_authorization(user.email, "test")
+    basic_authorization user.email, "test"
 
     # setup a simple XML node
 
@@ -206,7 +206,7 @@ class OldNodeControllerTest < ActionController::TestCase
   # test the redaction of an old version of a node, while being
   # authorised as a normal user.
   def test_redact_node_normal_user
-    basic_authorization(create(:user).email, "test")
+    basic_authorization create(:user).email, "test"
 
     node = create(:node, :with_history, :version => 4)
     node_v3 = node.old_nodes.find_by(:version => 3)
@@ -220,7 +220,7 @@ class OldNodeControllerTest < ActionController::TestCase
   # test that, even as moderator, the current version of a node
   # can't be redacted.
   def test_redact_node_current_version
-    basic_authorization(create(:moderator_user).email, "test")
+    basic_authorization create(:moderator_user).email, "test"
 
     node = create(:node, :with_history, :version => 4)
     node_v4 = node.old_nodes.find_by(:version => 4)
@@ -242,7 +242,7 @@ class OldNodeControllerTest < ActionController::TestCase
     assert_response :forbidden, "Redacted node shouldn't be visible via the version API."
 
     # not even to a logged-in user
-    basic_authorization(create(:user).email, "test")
+    basic_authorization create(:user).email, "test"
     get :version, :params => { :id => node_v1.node_id, :version => node_v1.version }
     assert_response :forbidden, "Redacted node shouldn't be visible via the version API, even when logged in."
   end
@@ -259,7 +259,7 @@ class OldNodeControllerTest < ActionController::TestCase
     assert_select "osm node[id='#{node_v1.node_id}'][version='#{node_v1.version}']", 0, "redacted node #{node_v1.node_id} version #{node_v1.version} shouldn't be present in the history."
 
     # not even to a logged-in user
-    basic_authorization(create(:user).email, "test")
+    basic_authorization create(:user).email, "test"
     get :history, :params => { :id => node_v1.node_id }
     assert_response :success, "Redaction shouldn't have stopped history working."
     assert_select "osm node[id='#{node_v1.node_id}'][version='#{node_v1.version}']", 0, "redacted node #{node_v1.node_id} version #{node_v1.version} shouldn't be present in the history, even when logged in."
@@ -271,7 +271,7 @@ class OldNodeControllerTest < ActionController::TestCase
   def test_redact_node_moderator
     node = create(:node, :with_history, :version => 4)
     node_v3 = node.old_nodes.find_by(:version => 3)
-    basic_authorization(create(:moderator_user).email, "test")
+    basic_authorization create(:moderator_user).email, "test"
 
     do_redact_node(node_v3, create(:redaction))
     assert_response :success, "should be OK to redact old version as moderator."
@@ -297,13 +297,13 @@ class OldNodeControllerTest < ActionController::TestCase
   def test_redact_node_is_redacted
     node = create(:node, :with_history, :version => 4)
     node_v3 = node.old_nodes.find_by(:version => 3)
-    basic_authorization(create(:moderator_user).email, "test")
+    basic_authorization create(:moderator_user).email, "test"
 
     do_redact_node(node_v3, create(:redaction))
     assert_response :success, "should be OK to redact old version as moderator."
 
     # re-auth as non-moderator
-    basic_authorization(create(:user).email, "test")
+    basic_authorization create(:user).email, "test"
 
     # check can't see the redacted data
     get :version, :params => { :id => node_v3.node_id, :version => node_v3.version }
@@ -336,7 +336,7 @@ class OldNodeControllerTest < ActionController::TestCase
     node_v1 = node.old_nodes.find_by(:version => 1)
     node_v1.redact!(create(:redaction))
 
-    basic_authorization(user.email, "test")
+    basic_authorization user.email, "test"
 
     post :redact, :params => { :id => node_v1.node_id, :version => node_v1.version }
     assert_response :forbidden, "should need to be moderator to unredact."
@@ -351,7 +351,7 @@ class OldNodeControllerTest < ActionController::TestCase
     node_v1 = node.old_nodes.find_by(:version => 1)
     node_v1.redact!(create(:redaction))
 
-    basic_authorization(moderator_user.email, "test")
+    basic_authorization moderator_user.email, "test"
 
     post :redact, :params => { :id => node_v1.node_id, :version => node_v1.version }
     assert_response :success, "should be OK to unredact old version as moderator."
@@ -366,7 +366,7 @@ class OldNodeControllerTest < ActionController::TestCase
     assert_response :success, "Unredaction shouldn't have stopped history working."
     assert_select "osm node[id='#{node_v1.node_id}'][version='#{node_v1.version}']", 1, "node #{node_v1.node_id} version #{node_v1.version} should now be present in the history for moderators without passing flag."
 
-    basic_authorization(create(:user).email, "test")
+    basic_authorization create(:user).email, "test"
 
     # check normal user can now see the redacted data
     get :version, :params => { :id => node_v1.node_id, :version => node_v1.version }
index 28fd78f3b1a84be00ff18dac25fd50abdedbc9df..be91962f8fff776af17f1a1049503eeb9d5bc32d 100644 (file)
@@ -50,7 +50,7 @@ class OldRelationControllerTest < ActionController::TestCase
     relation = create(:relation, :with_history, :version => 4)
     relation_v3 = relation.old_relations.find_by(:version => 3)
 
-    basic_authorization(create(:user).email, "test")
+    basic_authorization create(:user).email, "test"
 
     do_redact_relation(relation_v3, create(:redaction))
     assert_response :forbidden, "should need to be moderator to redact."
@@ -63,7 +63,7 @@ class OldRelationControllerTest < ActionController::TestCase
     relation = create(:relation, :with_history, :version => 4)
     relation_latest = relation.old_relations.last
 
-    basic_authorization(create(:moderator_user).email, "test")
+    basic_authorization create(:moderator_user).email, "test"
 
     do_redact_relation(relation_latest, create(:redaction))
     assert_response :bad_request, "shouldn't be OK to redact current version as moderator."
@@ -81,7 +81,7 @@ class OldRelationControllerTest < ActionController::TestCase
     assert_response :forbidden, "Redacted relation shouldn't be visible via the version API."
 
     # not even to a logged-in user
-    basic_authorization(create(:user).email, "test")
+    basic_authorization create(:user).email, "test"
     get :version, :params => { :id => relation_v1.relation_id, :version => relation_v1.version }
     assert_response :forbidden, "Redacted relation shouldn't be visible via the version API, even when logged in."
   end
@@ -98,7 +98,7 @@ class OldRelationControllerTest < ActionController::TestCase
     assert_select "osm relation[id='#{relation_v1.relation_id}'][version='#{relation_v1.version}']", 0, "redacted relation #{relation_v1.relation_id} version #{relation_v1.version} shouldn't be present in the history."
 
     # not even to a logged-in user
-    basic_authorization(create(:user).email, "test")
+    basic_authorization create(:user).email, "test"
     get :version, :params => { :id => relation_v1.relation_id, :version => relation_v1.version }
     get :history, :params => { :id => relation_v1.relation_id }
     assert_response :success, "Redaction shouldn't have stopped history working."
@@ -112,7 +112,7 @@ class OldRelationControllerTest < ActionController::TestCase
     relation = create(:relation, :with_history, :version => 4)
     relation_v3 = relation.old_relations.find_by(:version => 3)
 
-    basic_authorization(create(:moderator_user).email, "test")
+    basic_authorization create(:moderator_user).email, "test"
 
     do_redact_relation(relation_v3, create(:redaction))
     assert_response :success, "should be OK to redact old version as moderator."
@@ -139,13 +139,13 @@ class OldRelationControllerTest < ActionController::TestCase
     relation = create(:relation, :with_history, :version => 4)
     relation_v3 = relation.old_relations.find_by(:version => 3)
 
-    basic_authorization(create(:moderator_user).email, "test")
+    basic_authorization create(:moderator_user).email, "test"
 
     do_redact_relation(relation_v3, create(:redaction))
     assert_response :success, "should be OK to redact old version as moderator."
 
     # re-auth as non-moderator
-    basic_authorization(create(:user).email, "test")
+    basic_authorization create(:user).email, "test"
 
     # check can't see the redacted data
     get :version, :params => { :id => relation_v3.relation_id, :version => relation_v3.version }
@@ -177,7 +177,7 @@ class OldRelationControllerTest < ActionController::TestCase
     relation_v1 = relation.old_relations.find_by(:version => 1)
     relation_v1.redact!(create(:redaction))
 
-    basic_authorization(create(:user).email, "test")
+    basic_authorization create(:user).email, "test"
 
     post :redact, :params => { :id => relation_v1.relation_id, :version => relation_v1.version }
     assert_response :forbidden, "should need to be moderator to unredact."
@@ -191,7 +191,7 @@ class OldRelationControllerTest < ActionController::TestCase
     relation_v1 = relation.old_relations.find_by(:version => 1)
     relation_v1.redact!(create(:redaction))
 
-    basic_authorization(create(:moderator_user).email, "test")
+    basic_authorization create(:moderator_user).email, "test"
 
     post :redact, :params => { :id => relation_v1.relation_id, :version => relation_v1.version }
     assert_response :success, "should be OK to unredact old version as moderator."
@@ -206,7 +206,7 @@ class OldRelationControllerTest < ActionController::TestCase
     assert_response :success, "Redaction shouldn't have stopped history working."
     assert_select "osm relation[id='#{relation_v1.relation_id}'][version='#{relation_v1.version}']", 1, "relation #{relation_v1.relation_id} version #{relation_v1.version} should still be present in the history for moderators."
 
-    basic_authorization(create(:user).email, "test")
+    basic_authorization create(:user).email, "test"
 
     # check normal user can now see the redacted data
     get :version, :params => { :id => relation_v1.relation_id, :version => relation_v1.version }
index 176f7384d993ee247321e775f8041a28a8eb8cf7..1fff791877764d777990a205d56afb4dccf0f431 100644 (file)
@@ -90,7 +90,7 @@ class OldWayControllerTest < ActionController::TestCase
   # test the redaction of an old version of a way, while being
   # authorised as a normal user.
   def test_redact_way_normal_user
-    basic_authorization(create(:user).email, "test")
+    basic_authorization create(:user).email, "test"
     way = create(:way, :with_history, :version => 4)
     way_v3 = way.old_ways.find_by(:version => 3)
 
@@ -102,7 +102,7 @@ class OldWayControllerTest < ActionController::TestCase
   # test that, even as moderator, the current version of a way
   # can't be redacted.
   def test_redact_way_current_version
-    basic_authorization(create(:moderator_user).email, "test")
+    basic_authorization create(:moderator_user).email, "test"
     way = create(:way, :with_history, :version => 4)
     way_latest = way.old_ways.last
 
@@ -122,7 +122,7 @@ class OldWayControllerTest < ActionController::TestCase
     assert_response :forbidden, "Redacted way shouldn't be visible via the version API."
 
     # not even to a logged-in user
-    basic_authorization(create(:user).email, "test")
+    basic_authorization create(:user).email, "test"
     get :version, :params => { :id => way_v1.way_id, :version => way_v1.version }
     assert_response :forbidden, "Redacted way shouldn't be visible via the version API, even when logged in."
   end
@@ -139,7 +139,7 @@ class OldWayControllerTest < ActionController::TestCase
     assert_select "osm way[id='#{way_v1.way_id}'][version='#{way_v1.version}']", 0, "redacted way #{way_v1.way_id} version #{way_v1.version} shouldn't be present in the history."
 
     # not even to a logged-in user
-    basic_authorization(create(:user).email, "test")
+    basic_authorization create(:user).email, "test"
     get :version, :params => { :id => way_v1.way_id, :version => way_v1.version }
     get :history, :params => { :id => way_v1.way_id }
     assert_response :success, "Redaction shouldn't have stopped history working."
@@ -152,7 +152,7 @@ class OldWayControllerTest < ActionController::TestCase
   def test_redact_way_moderator
     way = create(:way, :with_history, :version => 4)
     way_v3 = way.old_ways.find_by(:version => 3)
-    basic_authorization(create(:moderator_user).email, "test")
+    basic_authorization create(:moderator_user).email, "test"
 
     do_redact_way(way_v3, create(:redaction))
     assert_response :success, "should be OK to redact old version as moderator."
@@ -178,13 +178,13 @@ class OldWayControllerTest < ActionController::TestCase
   def test_redact_way_is_redacted
     way = create(:way, :with_history, :version => 4)
     way_v3 = way.old_ways.find_by(:version => 3)
-    basic_authorization(create(:moderator_user).email, "test")
+    basic_authorization create(:moderator_user).email, "test"
 
     do_redact_way(way_v3, create(:redaction))
     assert_response :success, "should be OK to redact old version as moderator."
 
     # re-auth as non-moderator
-    basic_authorization(create(:user).email, "test")
+    basic_authorization create(:user).email, "test"
 
     # check can't see the redacted data
     get :version, :params => { :id => way_v3.way_id, :version => way_v3.version }
@@ -216,7 +216,7 @@ class OldWayControllerTest < ActionController::TestCase
     way_v1 = way.old_ways.find_by(:version => 1)
     way_v1.redact!(create(:redaction))
 
-    basic_authorization(create(:user).email, "test")
+    basic_authorization create(:user).email, "test"
 
     post :redact, :params => { :id => way_v1.way_id, :version => way_v1.version }
     assert_response :forbidden, "should need to be moderator to unredact."
@@ -231,7 +231,7 @@ class OldWayControllerTest < ActionController::TestCase
     way_v1 = way.old_ways.find_by(:version => 1)
     way_v1.redact!(create(:redaction))
 
-    basic_authorization(moderator_user.email, "test")
+    basic_authorization moderator_user.email, "test"
 
     post :redact, :params => { :id => way_v1.way_id, :version => way_v1.version }
     assert_response :success, "should be OK to unredact old version as moderator."
@@ -246,7 +246,7 @@ class OldWayControllerTest < ActionController::TestCase
     assert_response :success, "Unredaction shouldn't have stopped history working."
     assert_select "osm way[id='#{way_v1.way_id}'][version='#{way_v1.version}']", 1, "way #{way_v1.way_id} version #{way_v1.version} should still be present in the history for moderators."
 
-    basic_authorization(create(:user).email, "test")
+    basic_authorization create(:user).email, "test"
 
     # check normal user can now see the unredacted data
     get :version, :params => { :id => way_v1.way_id, :version => way_v1.version }
index 487d99b8016b7f1c81ec747e77ab03d85ea424e3..4b41cbc22229f42206692445fa88e71998b26bb6 100644 (file)
@@ -514,7 +514,7 @@ class RelationControllerTest < ActionController::TestCase
     assert_response :unauthorized
 
     ## Then try with the private user, to make sure that you get a forbidden
-    basic_authorization(private_user.email, "test")
+    basic_authorization private_user.email, "test"
 
     # this shouldn't work, as we should need the payload...
     delete :delete, :params => { :id => relation.id }
@@ -556,7 +556,7 @@ class RelationControllerTest < ActionController::TestCase
     assert_response :forbidden
 
     ## now set auth for the public user
-    basic_authorization(user.email, "test")
+    basic_authorization user.email, "test"
 
     # this shouldn't work, as we should need the payload...
     delete :delete, :params => { :id => relation.id }
@@ -739,7 +739,7 @@ class RelationControllerTest < ActionController::TestCase
     way1 = create(:way_with_nodes, :nodes_count => 2)
     way2 = create(:way_with_nodes, :nodes_count => 2)
 
-    basic_authorization(user.email, "test")
+    basic_authorization user.email, "test"
 
     doc_str = <<OSM.strip_heredoc
       <osm>
@@ -814,14 +814,14 @@ OSM
     doc = XML::Parser.string(doc_str).parse
 
     ## First try with the private user
-    basic_authorization(private_user.email, "test")
+    basic_authorization private_user.email, "test"
 
     content doc
     put :create
     assert_response :forbidden
 
     ## Now try with the public user
-    basic_authorization(user.email, "test")
+    basic_authorization user.email, "test"
 
     content doc
     put :create
@@ -855,7 +855,7 @@ OSM
       </osm>
 OSM
     doc = XML::Parser.string(doc_str).parse
-    basic_authorization(user.email, "test")
+    basic_authorization user.email, "test"
 
     content doc
     put :create
@@ -936,7 +936,7 @@ OSM
   # that the changeset bounding box is +bbox+.
   def check_changeset_modify(bbox)
     ## First test with the private user to check that you get a forbidden
-    basic_authorization(create(:user, :data_public => false).email, "test")
+    basic_authorization create(:user, :data_public => false).email, "test"
 
     # create a new changeset for this operation, so we are assured
     # that the bounding box will be newly-generated.
@@ -947,7 +947,7 @@ OSM
     end
 
     ## Now do the whole thing with the public user
-    basic_authorization(create(:user).email, "test")
+    basic_authorization create(:user).email, "test"
 
     # create a new changeset for this operation, so we are assured
     # that the bounding box will be newly-generated.
index e53809840b0aa53c8b9c4bdfe27fe0ff8fc952d6..4610852fb7d012e63ed4569bdc79bb9bca037749 100644 (file)
@@ -692,12 +692,12 @@ class TraceControllerTest < ActionController::TestCase
     assert_response :unauthorized
 
     # Now with some other user, which should work since the trace is public
-    basic_authorization(create(:user).display_name, "test")
+    basic_authorization create(:user).display_name, "test"
     get :api_read, :params => { :id => public_trace_file.id }
     assert_response :success
 
     # And finally we should be able to do it with the owner of the trace
-    basic_authorization(public_trace_file.user.display_name, "test")
+    basic_authorization public_trace_file.user.display_name, "test"
     get :api_read, :params => { :id => public_trace_file.id }
     assert_response :success
   end
@@ -711,12 +711,12 @@ class TraceControllerTest < ActionController::TestCase
     assert_response :unauthorized
 
     # Now try with another user, which shouldn't work since the trace is anon
-    basic_authorization(create(:user).display_name, "test")
+    basic_authorization create(:user).display_name, "test"
     get :api_read, :params => { :id => anon_trace_file.id }
     assert_response :forbidden
 
     # And finally we should be able to get the trace details with the trace owner
-    basic_authorization(anon_trace_file.user.display_name, "test")
+    basic_authorization anon_trace_file.user.display_name, "test"
     get :api_read, :params => { :id => anon_trace_file.id }
     assert_response :success
   end
@@ -730,12 +730,12 @@ class TraceControllerTest < ActionController::TestCase
     assert_response :unauthorized
 
     # Login, and try again
-    basic_authorization(deleted_trace_file.user.display_name, "test")
+    basic_authorization deleted_trace_file.user.display_name, "test"
     get :api_read, :params => { :id => 0 }
     assert_response :not_found
 
     # Now try a trace which did exist but has been deleted
-    basic_authorization(deleted_trace_file.user.display_name, "test")
+    basic_authorization deleted_trace_file.user.display_name, "test"
     get :api_read, :params => { :id => deleted_trace_file.id }
     assert_response :not_found
   end
@@ -749,12 +749,12 @@ class TraceControllerTest < ActionController::TestCase
     assert_response :unauthorized
 
     # Now with some other user, which should work since the trace is public
-    basic_authorization(create(:user).display_name, "test")
+    basic_authorization create(:user).display_name, "test"
     get :api_data, :params => { :id => public_trace_file.id }
     check_trace_data public_trace_file
 
     # And finally we should be able to do it with the owner of the trace
-    basic_authorization(public_trace_file.user.display_name, "test")
+    basic_authorization public_trace_file.user.display_name, "test"
     get :api_data, :params => { :id => public_trace_file.id }
     check_trace_data public_trace_file
   end
@@ -764,7 +764,7 @@ class TraceControllerTest < ActionController::TestCase
     identifiable_trace_file = create(:trace, :visibility => "identifiable", :fixture => "d")
 
     # Authenticate as the owner of the trace we will be using
-    basic_authorization(identifiable_trace_file.user.display_name, "test")
+    basic_authorization identifiable_trace_file.user.display_name, "test"
 
     # First get the data as is
     get :api_data, :params => { :id => identifiable_trace_file.id }
@@ -788,12 +788,12 @@ class TraceControllerTest < ActionController::TestCase
     assert_response :unauthorized
 
     # Now with some other user, which shouldn't work since the trace is anon
-    basic_authorization(create(:user).display_name, "test")
+    basic_authorization create(:user).display_name, "test"
     get :api_data, :params => { :id => anon_trace_file.id }
     assert_response :forbidden
 
     # And finally we should be able to do it with the owner of the trace
-    basic_authorization(anon_trace_file.user.display_name, "test")
+    basic_authorization anon_trace_file.user.display_name, "test"
     get :api_data, :params => { :id => anon_trace_file.id }
     check_trace_data anon_trace_file
   end
@@ -807,12 +807,12 @@ class TraceControllerTest < ActionController::TestCase
     assert_response :unauthorized
 
     # Login, and try again
-    basic_authorization(create(:user).display_name, "test")
+    basic_authorization create(:user).display_name, "test"
     get :api_data, :params => { :id => 0 }
     assert_response :not_found
 
     # Now try a trace which did exist but has been deleted
-    basic_authorization(deleted_trace_file.user.display_name, "test")
+    basic_authorization deleted_trace_file.user.display_name, "test"
     get :api_data, :params => { :id => deleted_trace_file.id }
     assert_response :not_found
   end
@@ -831,7 +831,7 @@ class TraceControllerTest < ActionController::TestCase
     # Now authenticated
     create(:user_preference, :user => user, :k => "gps.trace.visibility", :v => "identifiable")
     assert_not_equal "trackable", user.preferences.where(:k => "gps.trace.visibility").first.v
-    basic_authorization(user.display_name, "test")
+    basic_authorization user.display_name, "test"
     post :api_create, :params => { :file => file, :description => "New Trace", :tags => "new,trace", :visibility => "trackable" }
     assert_response :success
     trace = Trace.find(response.body.to_i)
@@ -849,7 +849,7 @@ class TraceControllerTest < ActionController::TestCase
 
     # Now authenticated, with the legacy public flag
     assert_not_equal "public", user.preferences.where(:k => "gps.trace.visibility").first.v
-    basic_authorization(user.display_name, "test")
+    basic_authorization user.display_name, "test"
     post :api_create, :params => { :file => file, :description => "New Trace", :tags => "new,trace", :public => 1 }
     assert_response :success
     trace = Trace.find(response.body.to_i)
@@ -868,7 +868,7 @@ class TraceControllerTest < ActionController::TestCase
     # Now authenticated, with the legacy private flag
     second_user = create(:user)
     assert_nil second_user.preferences.where(:k => "gps.trace.visibility").first
-    basic_authorization(second_user.display_name, "test")
+    basic_authorization second_user.display_name, "test"
     post :api_create, :params => { :file => file, :description => "New Trace", :tags => "new,trace", :public => 0 }
     assert_response :success
     trace = Trace.find(response.body.to_i)
@@ -894,32 +894,32 @@ class TraceControllerTest < ActionController::TestCase
     assert_response :unauthorized
 
     # Now with some other user, which should fail
-    basic_authorization(create(:user).display_name, "test")
+    basic_authorization create(:user).display_name, "test"
     content public_trace_file.to_xml
     put :api_update, :params => { :id => public_trace_file.id }
     assert_response :forbidden
 
     # Now with a trace which doesn't exist
-    basic_authorization(create(:user).display_name, "test")
+    basic_authorization create(:user).display_name, "test"
     content public_trace_file.to_xml
     put :api_update, :params => { :id => 0 }
     assert_response :not_found
 
     # Now with a trace which did exist but has been deleted
-    basic_authorization(deleted_trace_file.user.display_name, "test")
+    basic_authorization deleted_trace_file.user.display_name, "test"
     content deleted_trace_file.to_xml
     put :api_update, :params => { :id => deleted_trace_file.id }
     assert_response :not_found
 
     # Now try an update with the wrong ID
-    basic_authorization(public_trace_file.user.display_name, "test")
+    basic_authorization public_trace_file.user.display_name, "test"
     content anon_trace_file.to_xml
     put :api_update, :params => { :id => public_trace_file.id }
     assert_response :bad_request,
                     "should not be able to update a trace with a different ID from the XML"
 
     # And finally try an update that should work
-    basic_authorization(public_trace_file.user.display_name, "test")
+    basic_authorization public_trace_file.user.display_name, "test"
     t = public_trace_file
     t.description = "Changed description"
     t.visibility = "private"
@@ -940,22 +940,22 @@ class TraceControllerTest < ActionController::TestCase
     assert_response :unauthorized
 
     # Now with some other user, which should fail
-    basic_authorization(create(:user).display_name, "test")
+    basic_authorization create(:user).display_name, "test"
     delete :api_delete, :params => { :id => public_trace_file.id }
     assert_response :forbidden
 
     # Now with a trace which doesn't exist
-    basic_authorization(create(:user).display_name, "test")
+    basic_authorization create(:user).display_name, "test"
     delete :api_delete, :params => { :id => 0 }
     assert_response :not_found
 
     # And finally we should be able to do it with the owner of the trace
-    basic_authorization(public_trace_file.user.display_name, "test")
+    basic_authorization public_trace_file.user.display_name, "test"
     delete :api_delete, :params => { :id => public_trace_file.id }
     assert_response :success
 
     # Try it a second time, which should fail
-    basic_authorization(public_trace_file.user.display_name, "test")
+    basic_authorization public_trace_file.user.display_name, "test"
     delete :api_delete, :params => { :id => public_trace_file.id }
     assert_response :not_found
   end
index df5ba7fe70c5ca17d266ac87d5e7c55e0bc47499..4dcb1108a8ae4bb0b41de22bed38997a2f596b50 100644 (file)
@@ -782,6 +782,10 @@ class UserControllerTest < ActionController::TestCase
     get :account, :params => { :display_name => user.display_name }, :session => { :user => user }
     assert_response :success
     assert_template :account
+    assert_select "form#accountForm" do |form|
+      assert_equal "post", form.attr("method").to_s
+      assert_equal "/user/#{URI.encode(user.display_name)}/account", form.attr("action").to_s
+    end
 
     # Updating the description should work
     user.description = "new description"
@@ -1093,7 +1097,7 @@ class UserControllerTest < ActionController::TestCase
     assert_response :unauthorized
 
     # check that we get a response when logged in
-    basic_authorization(user.email, "test")
+    basic_authorization user.email, "test"
     get :api_details
     assert_response :success
     assert_equal "text/xml", response.content_type
@@ -1148,7 +1152,7 @@ class UserControllerTest < ActionController::TestCase
     assert_response :unauthorized
 
     # check that we get a response when logged in
-    basic_authorization(user.email, "test")
+    basic_authorization user.email, "test"
     get :api_gpx_files
     assert_response :success
     assert_equal "application/xml", response.content_type
index 2287993e820d7c2b99d7b32721055d044acdb42a..7f614587d543903763de1bed468a151a7bdb5fa2 100644 (file)
@@ -34,7 +34,7 @@ class UserPreferenceControllerTest < ActionController::TestCase
     assert_response :unauthorized, "should be authenticated"
 
     # authenticate as a user with no preferences
-    basic_authorization(create(:user).email, "test")
+    basic_authorization create(:user).email, "test"
 
     # try the read again
     get :read
@@ -48,7 +48,7 @@ class UserPreferenceControllerTest < ActionController::TestCase
     user = create(:user)
     user_preference = create(:user_preference, :user => user)
     user_preference2 = create(:user_preference, :user => user)
-    basic_authorization(user.email, "test")
+    basic_authorization user.email, "test"
 
     # try the read again
     get :read
@@ -74,7 +74,7 @@ class UserPreferenceControllerTest < ActionController::TestCase
     assert_response :unauthorized, "should be authenticated"
 
     # authenticate as a user with preferences
-    basic_authorization(user.email, "test")
+    basic_authorization user.email, "test"
 
     # try the read again
     get :read_one, :params => { :preference_key => "key" }
@@ -107,7 +107,7 @@ class UserPreferenceControllerTest < ActionController::TestCase
     end
 
     # authenticate as a user with preferences
-    basic_authorization(user.email, "test")
+    basic_authorization user.email, "test"
 
     # try the put again
     assert_no_difference "UserPreference.count" do
@@ -158,7 +158,7 @@ class UserPreferenceControllerTest < ActionController::TestCase
     end
 
     # authenticate as a user with preferences
-    basic_authorization(user.email, "test")
+    basic_authorization user.email, "test"
 
     # try adding a new preference
     assert_difference "UserPreference.count", 1 do
@@ -195,7 +195,7 @@ class UserPreferenceControllerTest < ActionController::TestCase
     assert_equal "value", UserPreference.find([user.id, "key"]).v
 
     # authenticate as a user with preferences
-    basic_authorization(user.email, "test")
+    basic_authorization user.email, "test"
 
     # try the delete again
     assert_difference "UserPreference.count", -1 do
index b93a13759db9f9794abaa852bdb2dd59412f0beb..415033b48412400197d4477f197bcada8df19fb1 100644 (file)
@@ -278,7 +278,7 @@ class WayControllerTest < ActionController::TestCase
     assert_response :unauthorized
 
     # now set auth using the private user
-    basic_authorization(private_user.email, "test")
+    basic_authorization private_user.email, "test"
 
     # this shouldn't work as with the 0.6 api we need pay load to delete
     delete :delete, :params => { :id => private_way.id }
@@ -327,7 +327,7 @@ class WayControllerTest < ActionController::TestCase
 
     ### Now check with a public user
     # now set auth
-    basic_authorization(user.email, "test")
+    basic_authorization user.email, "test"
 
     # this shouldn't work as with the 0.6 api we need pay load to delete
     delete :delete, :params => { :id => way.id }
@@ -397,7 +397,7 @@ class WayControllerTest < ActionController::TestCase
     ## Second test with the private user
 
     # setup auth
-    basic_authorization(private_user.email, "test")
+    basic_authorization private_user.email, "test"
 
     ## trying to break changesets
 
@@ -435,7 +435,7 @@ class WayControllerTest < ActionController::TestCase
     ## Finally test with the public user
 
     # setup auth
-    basic_authorization(user.email, "test")
+    basic_authorization user.email, "test"
 
     ## trying to break changesets
 
@@ -519,7 +519,7 @@ class WayControllerTest < ActionController::TestCase
 
     ## Try with the non-public user
     # setup auth
-    basic_authorization(private_user.email, "test")
+    basic_authorization private_user.email, "test"
 
     # add an identical tag to the way
     tag_xml = XML::Node.new("tag")
@@ -538,7 +538,7 @@ class WayControllerTest < ActionController::TestCase
 
     ## Now try with the public user
     # setup auth
-    basic_authorization(user.email, "test")
+    basic_authorization user.email, "test"
 
     # add an identical tag to the way
     tag_xml = XML::Node.new("tag")
@@ -569,7 +569,7 @@ class WayControllerTest < ActionController::TestCase
 
     ## Try with the non-public user
     # setup auth
-    basic_authorization(private_user.email, "test")
+    basic_authorization private_user.email, "test"
 
     # add an identical tag to the way
     tag_xml = XML::Node.new("tag")
@@ -588,7 +588,7 @@ class WayControllerTest < ActionController::TestCase
 
     ## Now try with the public user
     # setup auth
-    basic_authorization(user.email, "test")
+    basic_authorization user.email, "test"
 
     # add an identical tag to the way
     tag_xml = XML::Node.new("tag")
@@ -617,7 +617,7 @@ class WayControllerTest < ActionController::TestCase
 
     ## First test with the non-public user so should be rejected
     # setup auth
-    basic_authorization(private_user.email, "test")
+    basic_authorization private_user.email, "test"
 
     # create duplicate tag
     tag_xml = XML::Node.new("tag")
@@ -638,7 +638,7 @@ class WayControllerTest < ActionController::TestCase
 
     ## Now test with the public user
     # setup auth
-    basic_authorization(user.email, "test")
+    basic_authorization user.email, "test"
 
     # create duplicate tag
     tag_xml = XML::Node.new("tag")
@@ -671,7 +671,7 @@ class WayControllerTest < ActionController::TestCase
 
     ## First make sure that you can't with a non-public user
     # setup auth
-    basic_authorization(private_user.email, "test")
+    basic_authorization private_user.email, "test"
 
     # add the tag into the existing xml
     way_str = "<osm><way changeset='#{private_changeset.id}'>"
@@ -687,7 +687,7 @@ class WayControllerTest < ActionController::TestCase
 
     ## Now do it with a public user
     # setup auth
-    basic_authorization(user.email, "test")
+    basic_authorization user.email, "test"
 
     # add the tag into the existing xml
     way_str = "<osm><way changeset='#{changeset.id}'>"
index 720113e65d7310081febc35fcf182ba2e3163c64..d1c41d62c105cb905197cd53303c34bd5bc7be55 100644 (file)
@@ -1,6 +1,8 @@
 require "test_helper"
 
 class ApplicationHelperTest < ActionView::TestCase
+  attr_accessor :current_user
+
   def setup
     I18n.locale = "en"
   end
@@ -46,7 +48,7 @@ class ApplicationHelperTest < ActionView::TestCase
   end
 
   def test_style_rules
-    @user = nil
+    self.current_user = nil
 
     css = style_rules
     assert_match /\.hidden /, css
@@ -57,36 +59,36 @@ class ApplicationHelperTest < ActionView::TestCase
     assert_match /\.hide_unless_administrator /, css
     assert_match /\.hide_unless_moderator /, css
 
-    @user = create(:user)
+    self.current_user = create(:user)
 
     css = style_rules
     assert_match /\.hidden /, css
     assert_no_match /\.hide_unless_logged_in /, css
     assert_match /\.hide_if_logged_in /, css
-    assert_match /\.hide_if_user_#{@user.id} /, css
-    assert_match /\.show_if_user_#{@user.id} /, css
+    assert_match /\.hide_if_user_#{current_user.id} /, css
+    assert_match /\.show_if_user_#{current_user.id} /, css
     assert_match /\.hide_unless_administrator /, css
     assert_match /\.hide_unless_moderator /, css
 
-    @user = create(:moderator_user)
+    self.current_user = create(:moderator_user)
 
     css = style_rules
     assert_match /\.hidden /, css
     assert_no_match /\.hide_unless_logged_in /, css
     assert_match /\.hide_if_logged_in /, css
-    assert_match /\.hide_if_user_#{@user.id} /, css
-    assert_match /\.show_if_user_#{@user.id} /, css
+    assert_match /\.hide_if_user_#{current_user.id} /, css
+    assert_match /\.show_if_user_#{current_user.id} /, css
     assert_match /\.hide_unless_administrator /, css
     assert_no_match /\.hide_unless_moderator /, css
 
-    @user = create(:administrator_user)
+    self.current_user = create(:administrator_user)
 
     css = style_rules
     assert_match /\.hidden /, css
     assert_no_match /\.hide_unless_logged_in /, css
     assert_match /\.hide_if_logged_in /, css
-    assert_match /\.hide_if_user_#{@user.id} /, css
-    assert_match /\.show_if_user_#{@user.id} /, css
+    assert_match /\.hide_if_user_#{current_user.id} /, css
+    assert_match /\.show_if_user_#{current_user.id} /, css
     assert_no_match /\.hide_unless_administrator /, css
     assert_match /\.hide_unless_moderator /, css
   end
index 880c16e5909429305533498b096e9da00cca7a10..3ffc9fbff9b5937572cb0be9b4ba688649ba668e 100644 (file)
@@ -1,11 +1,12 @@
 require "test_helper"
 
 class UserRolesHelperTest < ActionView::TestCase
+  attr_accessor :current_user
+
   def test_role_icon_normal
-    user = create(:user)
-    @user = user
+    self.current_user = create(:user)
 
-    icon = role_icon(user, "moderator")
+    icon = role_icon(current_user, "moderator")
     assert_dom_equal "", icon
 
     icon = role_icon(create(:moderator_user), "moderator")
@@ -13,7 +14,7 @@ class UserRolesHelperTest < ActionView::TestCase
   end
 
   def test_role_icon_administrator
-    @user = create(:administrator_user)
+    self.current_user = create(:administrator_user)
 
     user = create(:user)
     icon = role_icon(user, "moderator")
@@ -25,10 +26,9 @@ class UserRolesHelperTest < ActionView::TestCase
   end
 
   def test_role_icons_normal
-    user = create(:user)
-    @user = user
+    self.current_user = create(:user)
 
-    icons = role_icons(user)
+    icons = role_icons(current_user)
     assert_dom_equal "  ", icons
 
     icons = role_icons(create(:moderator_user))
@@ -39,7 +39,7 @@ class UserRolesHelperTest < ActionView::TestCase
   end
 
   def test_role_icons_administrator
-    @user = create(:administrator_user)
+    self.current_user = create(:administrator_user)
 
     user = create(:user)
     icons = role_icons(user)
index 05754da7185d4735c9a95796b98377e3befdfeee..9ff7e360e50f1c903342e293da2659dfe2706c23 100644 (file)
@@ -8,15 +8,20 @@ class CORSTest < ActionDispatch::IntegrationTest
     }
 
     assert_response :success
-    assert_equal "http://www.example.com", response.headers["Access-Control-Allow-Origin"]
+    assert_equal "*", response.headers["Access-Control-Allow-Origin"]
+    assert_equal "text/plain", response.content_type
+    assert_equal "", response.body
   end
 
   def test_non_api_routes_dont_allow_cross_origin_requests
-    assert_raises ActionController::RoutingError do
-      process :options, "/", :headers => {
-        "HTTP_ORIGIN" => "http://www.example.com",
-        "HTTP_ACCESS_CONTROL_REQUEST_METHOD" => "GET"
-      }
-    end
+    process :options, "/", :headers => {
+      "HTTP_ORIGIN" => "http://www.example.com",
+      "HTTP_ACCESS_CONTROL_REQUEST_METHOD" => "GET"
+    }
+
+    assert_response :success
+    assert_nil response.headers["Access-Control-Allow-Origin"]
+    assert_nil response.content_type
+    assert_equal "", response.body
   end
 end
index 538c039993135975eeb3d2a228f2f153081e93fe..2c3e61be67aeef01a5e88752bcc03789d9726bed 100644 (file)
@@ -113,7 +113,9 @@ class UserLoginTest < ActionDispatch::IntegrationTest
 
     assert_template "login"
     assert_select "span.username", false
-    assert_select "div.flash.error", /your account has been suspended/
+    assert_select "div.flash.error", /your account has been suspended/ do
+      assert_select "a[href='mailto:openstreetmap@example.com']", "webmaster"
+    end
   end
 
   def test_login_email_password_suspended_upcase
@@ -123,7 +125,9 @@ class UserLoginTest < ActionDispatch::IntegrationTest
 
     assert_template "login"
     assert_select "span.username", false
-    assert_select "div.flash.error", /your account has been suspended/
+    assert_select "div.flash.error", /your account has been suspended/ do
+      assert_select "a[href='mailto:openstreetmap@example.com']", "webmaster"
+    end
   end
 
   def test_login_email_password_suspended_titlecase
@@ -133,7 +137,9 @@ class UserLoginTest < ActionDispatch::IntegrationTest
 
     assert_template "login"
     assert_select "span.username", false
-    assert_select "div.flash.error", /your account has been suspended/
+    assert_select "div.flash.error", /your account has been suspended/ do
+      assert_select "a[href='mailto:openstreetmap@example.com']", "webmaster"
+    end
   end
 
   def test_login_email_password_blocked
@@ -264,7 +270,9 @@ class UserLoginTest < ActionDispatch::IntegrationTest
 
     assert_template "login"
     assert_select "span.username", false
-    assert_select "div.flash.error", /your account has been suspended/
+    assert_select "div.flash.error", /your account has been suspended/ do
+      assert_select "a[href='mailto:openstreetmap@example.com']", "webmaster"
+    end
   end
 
   def test_login_username_password_suspended_upcase
@@ -274,7 +282,9 @@ class UserLoginTest < ActionDispatch::IntegrationTest
 
     assert_template "login"
     assert_select "span.username", false
-    assert_select "div.flash.error", /your account has been suspended/
+    assert_select "div.flash.error", /your account has been suspended/ do
+      assert_select "a[href='mailto:openstreetmap@example.com']", "webmaster"
+    end
   end
 
   def test_login_username_password_suspended_downcase
@@ -284,7 +294,9 @@ class UserLoginTest < ActionDispatch::IntegrationTest
 
     assert_template "login"
     assert_select "span.username", false
-    assert_select "div.flash.error", /your account has been suspended/
+    assert_select "div.flash.error", /your account has been suspended/ do
+      assert_select "a[href='mailto:openstreetmap@example.com']", "webmaster"
+    end
   end
 
   def test_login_username_password_blocked
index c7e02c29b221de4b77f59dcf173e7f30dc48fac4..5066b7ab22e0d22cf009f96f26620ed66687155b 100644 (file)
@@ -434,8 +434,9 @@ text.gpx {
     fill: #FF26D4;
 }
 
+/* Default - light gray */
 path.area.stroke {
-    stroke: #fff;
+    stroke: #ddd;
     stroke-width: 1;
 }
 path.area.fill {
@@ -455,33 +456,16 @@ path.stroke.old-multipolygon {
     stroke-linecap: butt;
 }
 
-path.stroke.tag-natural {
-    stroke: rgb(182, 225, 153);
-}
-path.fill.tag-natural {
-    stroke: rgba(182, 225, 153, 0.3);
-    fill: rgba(182, 225, 153, 0.3);
-}
-.preset-icon-fill-area.tag-natural {
-    border-color: rgb(182, 225, 153);
-    background-color: rgba(182, 225, 153, 0.3);
-}
-
+/* Green things */
 path.stroke.tag-landuse,
-path.stroke.tag-natural-wood,
-path.stroke.tag-natural-tree,
-path.stroke.tag-natural-grassland,
-path.stroke.tag-natural-grass,
+path.stroke.tag-natural,
 path.stroke.tag-leisure-nature_reserve,
 path.stroke.tag-leisure-pitch,
 path.stroke.tag-leisure-park {
     stroke: rgb(140, 208, 95);
 }
 path.fill.tag-landuse,
-path.fill.tag-natural-wood,
-path.fill.tag-natural-tree,
-path.fill.tag-natural-grassland,
-path.fill.tag-natural-grass,
+path.fill.tag-natural,
 path.fill.tag-leisure-nature_reserve,
 path.fill.tag-leisure-pitch,
 path.fill.tag-leisure-park {
@@ -489,10 +473,7 @@ path.fill.tag-leisure-park {
     fill: rgba(140, 208, 95, 0.3);
 }
 .preset-icon-fill-area.tag-landuse,
-.preset-icon-fill-area.tag-natural-wood,
-.preset-icon-fill-area.tag-natural-tree,
-.preset-icon-fill-area.tag-natural-grassland,
-.preset-icon-fill-area.tag-natural-grass,
+.preset-icon-fill-area.tag-natural,
 .preset-icon-fill-area.tag-leisure-nature_reserve,
 .preset-icon-fill-area.tag-leisure-pitch,
 .preset-icon-fill-area.tag-leisure-park {
@@ -500,6 +481,7 @@ path.fill.tag-leisure-park {
     background-color: rgba(140, 208, 95, 0.3);
 }
 
+/* Blue things */
 path.stroke.tag-amenity-swimming_pool,
 path.stroke.tag-leisure-swimming_pool,
 path.stroke.tag-natural-water,
@@ -530,13 +512,27 @@ path.fill.tag-natural-water {
     background-color: rgba(119, 211, 222, 0.3);
 }
 
+/* Yellow things */
+.pattern-color-beach,
+.pattern-color-sand,
+.pattern-color-scrub {
+    fill: rgba(255, 255, 148, 0.2);
+}
+path.stroke.tag-leisure-pitch.tag-sport-beachvolleyball,
+path.stroke.tag-natural-beach,
+path.stroke.tag-natural-sand,
+path.stroke.tag-natural-scrub,
 path.stroke.tag-amenity-childcare,
 path.stroke.tag-amenity-kindergarten,
 path.stroke.tag-amenity-school,
 path.stroke.tag-amenity-college,
 path.stroke.tag-amenity-university {
-    stroke: rgb(255, 255, 148);
+    stroke: rgba(255, 255, 148, 0.75);
 }
+path.fill.tag-leisure-pitch.tag-sport-beachvolleyball,
+path.fill.tag-natural-beach,
+path.fill.tag-natural-sand,
+path.fill.tag-natural-scrub,
 path.fill.tag-amenity-childcare,
 path.fill.tag-amenity-kindergarten,
 path.fill.tag-amenity-school,
@@ -545,6 +541,10 @@ path.fill.tag-amenity-university {
     stroke: rgba(255, 255, 148, 0.15);
     fill: rgba(255, 255, 148, 0.15);
 }
+.preset-icon-fill-area.tag-leisure-pitch.tag-sport-beachvolleyball,
+.preset-icon-fill-area.tag-natural-beach,
+.preset-icon-fill-area.tag-natural-sand,
+.preset-icon-fill-area.tag-natural-scrub,
 .preset-icon-fill-area.tag-amenity-childcare,
 .preset-icon-fill-area.tag-amenity-kindergarten,
 .preset-icon-fill-area.tag-amenity-school,
@@ -554,33 +554,52 @@ path.fill.tag-amenity-university {
     background-color: rgba(255, 255, 148, 0.15);
 }
 
-path.stroke.tag-landuse-residential {
+/* Gold things */
+.pattern-color-construction {
+    fill: rgba(196, 189, 25, 0.3);
+}
+path.stroke.tag-landuse-residential,
+path.stroke.tag-landuse.tag-status,
+path.stroke.tag-landuse-construction {
     stroke: rgb(196, 189, 25);
 }
 path.fill.tag-landuse-residential {
     stroke: rgba(196, 189, 25, 0.3);
     fill: rgba(196, 189, 25, 0.3);
 }
-.preset-icon-fill-area.tag-landuse-residential {
+.preset-icon-fill-area.tag-landuse-residential,
+.preset-icon-fill-area.tag-landuse.tag-status,
+.preset-icon-fill-area.tag-landuse-construction {
     border-color: rgb(196, 189, 25);
     background: rgba(196, 189, 25, 0.3);
 }
 
+/* Orange things */
 path.stroke.tag-landuse-retail,
-path.stroke.tag-landuse-commercial {
+path.stroke.tag-landuse-commercial,
+path.stroke.tag-landuse-landfill,
+path.stroke.tag-military,
+path.stroke.tag-landuse-military {
     stroke: rgb(214, 136, 26);
 }
 path.fill.tag-landuse-retail,
-path.fill.tag-landuse-commercial {
+path.fill.tag-landuse-commercial,
+path.fill.tag-landuse-landfill,
+path.fill.tag-military,
+path.fill.tag-landuse-military {
     stroke: rgba(214, 136, 26, 0.3);
     fill: rgba(214, 136, 26, 0.3);
 }
 .preset-icon-fill-area.tag-landuse-retail,
-.preset-icon-fill-area.tag-landuse-commercial {
+.preset-icon-fill-area.tag-landuse-commercial,
+.preset-icon-fill-area.tag-landuse-landfill,
+.preset-icon-fill-area.tag-military,
+.preset-icon-fill-area.tag-landuse-military {
     border-color: rgb(214, 136, 26);
     background-color: rgba(214, 136, 26, 0.3);
 }
 
+/* Pink things */
 path.stroke.tag-landuse-industrial,
 path.stroke.tag-power-plant {
     stroke: rgb(228, 164, 245);
@@ -596,127 +615,42 @@ path.fill.tag-power-plant {
     background-color: rgba(228, 164, 245, 0.3);
 }
 
-path.stroke.tag-natural-bare_rock,
-path.stroke.tag-natural-scree,
-path.stroke.tag-landuse-railway,
-path.stroke.tag-landuse-quarry {
-    stroke: rgb(166, 149, 123);
-}
-path.fill.tag-natural-bare_rock,
-path.fill.tag-natural-scree,
-path.fill.tag-landuse-railway,
-path.fill.tag-landuse-quarry {
-    stroke: rgba(166, 149, 123, 0.2);
-    fill: rgba(166, 149, 123, 0.2);
-}
-.preset-icon-fill-area.tag-natural-bare_rock,
-.preset-icon-fill-area.tag-natural-scree,
-.preset-icon-fill-area.tag-landuse-railway,
-.preset-icon-fill-area.tag-landuse-quarry {
-    border-color: rgb(166, 149, 123);
-    background-color: rgba(166, 149, 123, 0.2);
-}
-
-path.stroke.tag-landuse-landfill {
-    stroke: rgb(255, 153, 51);
-}
-path.fill.tag-landuse-landfill {
-    stroke: rgba(255, 153, 51, 0.2);
-    fill: rgba(255, 153, 51, 0.2);
-}
-.preset-icon-fill-area.tag-landuse-landfill {
-    border-color: rgb(255, 153, 51);
-    background-color: rgba(255, 153, 51, 0.2);
-}
-
-.pattern-color-construction {
-    fill: rgba(196, 189, 25, 0.2);
-}
-path.stroke.tag-landuse.tag-status,
-path.stroke.tag-landuse-construction {
-    stroke: rgb(196, 189, 25);
-}
-.preset-icon-fill-area.tag-landuse.tag-status,
-.preset-icon-fill-area.tag-landuse-construction {
-    border-color: rgb(196, 189, 25);
-    background-color: rgba(196, 189, 25, 0.2);
-}
-
-path.stroke.tag-military,
-path.stroke.tag-landuse-military {
-    stroke: rgb(214, 136, 26);
-}
-path.fill.tag-military,
-path.fill.tag-landuse-military {
-    stroke: rgba(214, 136, 26, 0.2);
-    fill: rgba(214, 136, 26, 0.2);
-}
-.preset-icon-fill-area.tag-military,
-.preset-icon-fill-area.tag-landuse-military {
-    border-color: rgb(214, 136, 26);
-    background-color: rgba(214, 136, 26, 0.2);
-}
-
+/* Teal things */
 .pattern-color-wetland {
-    fill: rgba(182, 225, 153, 0.2);
+    fill: rgba(153, 225, 170, 0.3);
 }
 path.stroke.tag-natural-wetland {
-    stroke: rgb(182, 225, 153);
+    stroke: rgb(153, 225, 170);
 }
 .preset-icon-fill-area.tag-natural-wetland {
-    border-color: rgb(182, 225, 153);
-    background-color: rgba(182, 225, 153, 0.2);
-}
-
-.pattern-color-meadow {
-    fill: rgba(182, 225, 153, 0.2);
-}
-path.stroke.tag-landuse-meadow {
-    stroke: rgb(182, 225, 153);
-}
-.preset-icon-fill-area.tag-landuse-meadow {
-    border-color: rgb(182, 225, 153);
-    background-color: rgba(182, 225, 153, 0.2);
-}
-
-.pattern-color-beach,
-.pattern-color-sand {
-    fill: rgba(255, 255, 126, 0.2);
-}
-path.stroke.tag-natural-beach,
-path.stroke.tag-natural-sand {
-    stroke: rgb(255, 255, 126);
-}
-.preset-icon-fill-area.tag-natural-beach,
-.preset-icon-fill-area.tag-natural-sand {
-    border-color: rgb(255, 255, 126);
-    background-color: rgba(255, 255, 126, 0.2);
-}
-
-.pattern-color-scrub {
-    fill: rgba(219, 240, 139, 0.2);
-}
-path.stroke.tag-natural-scrub {
-    stroke: rgb(219, 240, 139);
-}
-.preset-icon-fill-area.tag-natural-scrub {
-    border-color: rgb(219, 240, 139);
-    background-color: rgba(219, 240, 139, 0.2);
+    border-color: rgb(153, 225, 170);
+    background-color: rgba(153, 225, 170, 0.2);
 }
 
+/* Light Green things */
+.pattern-color-cemetery,
+.pattern-color-orchard,
+.pattern-color-meadow,
 .pattern-color-farm,
 .pattern-color-farmland {
-    fill: rgba(140, 208, 95, 0.2);
+    fill: rgba(191, 232, 63, 0.2);
 }
+path.stroke.tag-landuse-cemetery,
+path.stroke.tag-landuse-orchard,
+path.stroke.tag-landuse-meadow,
 path.stroke.tag-landuse-farm,
 path.stroke.tag-landuse-farmland {
-    stroke: rgb(140, 208, 95);
+    stroke: rgb(191, 232, 63);
 }
+.preset-icon-fill-area.tag-landuse-cemetery,
+.preset-icon-fill-area.tag-landuse-orchard,
+.preset-icon-fill-area.tag-landuse-meadow,
 .preset-icon-fill-area.tag-landuse-farm,
 .preset-icon-fill-area.tag-landuse-farmland {
-    background-color: rgba(140, 208, 95, 0.2);
+    background-color: rgba(191, 232, 63, 0.2);
 }
 
+/* Tan things */
 path.stroke.tag-landuse-farmyard {
     stroke: rgb(245, 220, 186);
 }
@@ -729,29 +663,51 @@ path.fill.tag-landuse-farmyard {
     background: rgba(245, 220, 186, 0.3);
 }
 
-.pattern-color-cemetery,
-.pattern-color-orchard {
-    fill: rgba(140, 208, 95, 0.2);
+/* Dark Gray things */
+path.stroke.tag-amenity-parking,
+path.stroke.tag-leisure-pitch.tag-sport-basketball,
+path.stroke.tag-leisure-pitch.tag-sport-skateboard,
+path.stroke.tag-natural-bare_rock,
+path.stroke.tag-natural-scree,
+path.stroke.tag-landuse-railway,
+path.stroke.tag-landuse-quarry {
+    stroke: #bbb;
 }
-path.stroke.tag-landuse-cemetery,
-path.stroke.tag-landuse-orchard {
-    stroke: rgb(140, 208, 95);
+path.fill.tag-amenity-parking,
+path.fill.tag-leisure-pitch.tag-sport-basketball,
+path.fill.tag-leisure-pitch.tag-sport-skateboard,
+path.fill.tag-natural-bare_rock,
+path.fill.tag-natural-scree,
+path.fill.tag-landuse-railway,
+path.fill.tag-landuse-quarry {
+    stroke: rgba(140, 140, 140, 0.5);
+    fill: rgba(140, 140, 140, 0.5);
 }
-.preset-icon-fill-area.tag-landuse-cemetery,
-.preset-icon-fill-area.tag-landuse-orchard {
-    background-color: rgba(140, 208, 95, 0.2);
+.preset-icon-fill-area.tag-amenity-parking,
+.preset-icon-fill-area.tag-leisure-pitch.tag-sport-basketball,
+.preset-icon-fill-area.tag-leisure-pitch.tag-sport-skateboard,
+.preset-icon-fill-area.tag-natural-bare_rock,
+.preset-icon-fill-area.tag-natural-scree,
+.preset-icon-fill-area.tag-landuse-railway,
+.preset-icon-fill-area.tag-landuse-quarry {
+    border-color: rgb(170, 170, 170);
+    background-color: rgba(140, 140, 140, 0.5);
 }
 
-path.stroke.tag-amenity-parking {
-    stroke: rgb(170, 170, 170);
+/* Light gray overrides */
+path.stroke.tag-natural-cave_entrance,
+path.stroke.tag-natural-glacier {
+    stroke: #ddd;
 }
-path.fill.tag-amenity-parking {
-    stroke: rgba(170, 170, 170, 0.3);
-    fill: rgba(170, 170, 170, 0.3);
+path.fill.tag-natural-cave_entrance,
+path.fill.tag-natural-glacier {
+    stroke: rgba(255, 255, 255, 0.3);
+    fill: rgba(255, 255, 255, 0.3);
 }
-.preset-icon-fill-area.tag-amenity-parking {
+.preset-icon-fill-area.tag-natural-cave_entrance,
+.preset-icon-fill-area.tag-natural-glacier {
     border-color: rgb(170, 170, 170);
-    background-color: rgba(170, 170, 170, 0.3);
+    background: rgba(170, 170, 170, 0.3);
 }
 
 /* highways */
@@ -769,10 +725,11 @@ path.stroke.tag-highway {
 
 /* highway areas */
 
-path.stroke.area.tag-highway {
+path.stroke.area.tag-highway,
+.low-zoom path.stroke.area.tag-highway {
     stroke: #fff;
     stroke-dasharray: none;
-    stroke-width: 2;
+    stroke-width: 1;
 }
 
 /* wide highways */
@@ -1217,6 +1174,20 @@ path.casing.tag-service {
     stroke:#666;
 }
 
+/* with `service=* tag`  (e.g. parking_aisle, alley, drive-through */
+.preset-icon .icon.highway-service.tag-service {
+    color: #dcd9b9;
+    fill: #666;
+}
+path.stroke.tag-highway-service.tag-service,
+path.stroke.tag-service.tag-service {
+    stroke: #dcd9b9;
+}
+path.casing.tag-highway-service.tag-service,
+path.casing.tag-service.tag-service {
+    stroke: #666;
+}
+
 .preset-icon .icon.highway-track {
     color: #eaeaea;
     fill: #c5b59f;
@@ -1346,10 +1317,11 @@ g.midpoint.tag-highway-bridleway .fill {
 /* aeroways */
 
 /* areas */
-path.stroke.area.tag-aeroway {
-    stroke:#fff;
+path.stroke.area.tag-aeroway,
+.low-zoom path.stroke.area.tag-aeroway {
+    stroke: #fff;
     stroke-dasharray: none;
-    stroke-width: 2;
+    stroke-width: 1;
 }
 
 /* narrow aeroways (taxiway) */
@@ -1444,6 +1416,20 @@ path.fill.tag-aeroway-runway {
     fill: #eee;
 }
 
+/* railway areas */
+
+path.stroke.area.tag-railway,
+.low-zoom path.stroke.area.tag-railway {
+    stroke: white;
+    stroke-width: 1;
+    stroke-dasharray: none;
+}
+
+path.casing.area.tag-railway,
+.low-zoom path.casing.area.tag-railway {
+    stroke: none;
+}
+
 /* narrow widths */
 
 path.shadow.tag-railway {
@@ -1505,23 +1491,41 @@ path.stroke.tag-railway-subway {
 }
 
 
+/* railway platforms - like sidewalks */
+
+path.shadow.tag-railway-platform {
+    stroke-width: 16;
+}
 path.casing.tag-railway-platform {
-    stroke: none;
+    stroke: #fff;
+    stroke-width: 5;
+    stroke-linecap: round;
+    stroke-dasharray: none;
 }
 path.stroke.tag-railway-platform {
-    stroke: #999;
-    stroke-width: 4;
-    stroke-dasharray: none;
+    stroke: #ae8681;
+    stroke-width: 3;
+    stroke-linecap: butt;
+    stroke-dasharray: 6, 6;
 }
 
-
-.area.stroke.tag-railway {
-    stroke: white;
+.low-zoom path.shadow.tag-railway-platform {
+    stroke-width: 12;
+}
+.low-zoom path.casing.tag-railway-platform {
+    stroke-width: 3;
+}
+.low-zoom path.stroke.tag-railway-platform {
     stroke-width: 1;
-    stroke-dasharray: none;
+    stroke-linecap: butt;
+    stroke-dasharray: 3, 3;
 }
-.area.casing.tag-railway {
-    stroke: none;
+
+g.midpoint.tag-railway-platform .fill {
+    fill: #fff;
+    stroke: #333;
+    stroke-opacity: .8;
+    opacity: .8;
 }
 /* waterways */
 
@@ -1983,9 +1987,9 @@ path.fill.tag-amenity-shelter {
 
 .layer-mapillary-signs .icon-sign .icon-sign-body {
     min-width: 20px;
-    height: 28px;
-    width: 28px;
-    border: 2px solid transparent;
+    height: 24px;
+    width: 24px;
+    outline: 2px solid transparent;
     pointer-events: visible;
     cursor: pointer; /* Opera */
     cursor: url(<%= asset_path("iD/img/cursor-select-mapillary.png") %>) 6 1, pointer; /* FF */
@@ -1994,23 +1998,61 @@ path.fill.tag-amenity-shelter {
 }
 
 .layer-mapillary-signs .icon-sign:hover .icon-sign-body {
-    border: 2px solid rgba(255,198,0,0.8);
+    outline: 2px solid rgba(255,198,0,0.8);
     z-index: 80;
- }
+}
 
 .layer-mapillary-signs .icon-sign.selected .icon-sign-body {
-    border: 2px solid rgba(255,0,0,0.8);
+    outline: 2px solid rgba(255,0,0,0.8);
     z-index: 80;
- }
+}
 
-.layer-mapillary-signs .icon-sign .t {
-    font-size: 28px;
-    z-index: 70;
+
+/* Mapillary viewer */
+#mly .domRenderer .TagSymbol {
+    font-size: 10px;
+    background-color: rgba(0, 0, 0, 0.4);
+    padding: 0 4px;
+    border-radius: 4px;
+    transform: translate(-50%, -120%) !important;
 }
 
-.layer-mapillary-signs .icon-sign:hover .t,
-.layer-mapillary-signs .icon-sign.selected .t {
-    z-index: 80;
+#mly .domRenderer .Attribution {
+    width: 100%;
+    font-size: 10px;
+    text-align: right;
+}
+
+.mapillary-wrap {
+    position: absolute;
+    bottom: 30px;
+    width: 330px;
+    height: 250px;
+    padding: 5px;
+    background-color: #fff;
+}
+
+.mapillary-wrap.hidden {
+    visibility: hidden;
+}
+
+.mapillary-wrap button.thumb-hide {
+    border-radius: 0;
+    padding: 5px;
+    position: absolute;
+    right: 0;
+    top: 0;
+    z-index: 500;
+}
+
+.mly-wrapper {
+    visibility: hidden;
+    width: 100%;
+    height: 100%;
+}
+
+.mly-wrapper.active {
+    visibility: visible;
 }
 /* Fill Styles */
 
@@ -4041,6 +4083,14 @@ img.wiki-image {
     background: rgba(0,0,0,.8);
 }
 
+/* hidden field to prevent user from tabbing out of the sidebar */
+input.key-trap {
+    height: 0px;
+    width: 0px;
+    padding: 0px;
+    border: 1px solid rgba(0,0,0,0);
+}
+
 /* Fullscreen button */
 div.full-screen {
     float: right;
@@ -6034,37 +6084,6 @@ li.hide + li.version .badge .tooltip .tooltip-arrow {
     color: #7092FF;
 }
 
-.mapillary-wrap {
-    position: absolute;
-    bottom: 30px;
-    width: 330px;
-    height: 250px;
-    padding: 5px;
-    background-color: #fff;
-}
-
-.mapillary-wrap.hidden {
-    visibility: hidden;
-}
-
-.mapillary-wrap button.thumb-hide {
-    border-radius: 0;
-    padding: 5px;
-    position: absolute;
-    right: 0;
-    top: 0;
-    z-index: 500;
-}
-
-.mly-wrapper {
-    visibility: hidden;
-    width: 100%;
-    height: 100%;
-}
-
-.mly-wrapper.active {
-    visibility: visible;
-}
 
 /* Right-to-left localization settings */
 
index 3c0935a3d45f91d373649a784084169d2bd543ed..8aa803c099189be28f5647ba08725de5add1aff4 100644 (file)
@@ -18602,7 +18602,7 @@ var dataDeprecated = [{"old":{"amenity":"firepit"},"replace":{"leisure":"firepit
 
 var dataDiscarded = ["created_by","odbl","odbl:note","tiger:upload_uuid","tiger:tlid","tiger:source","tiger:separated","geobase:datasetName","geobase:uuid","sub_sea:type","KSJ2:ADS","KSJ2:ARE","KSJ2:AdminArea","KSJ2:COP_label","KSJ2:DFD","KSJ2:INT","KSJ2:INT_label","KSJ2:LOC","KSJ2:LPN","KSJ2:OPC","KSJ2:PubFacAdmin","KSJ2:RAC","KSJ2:RAC_label","KSJ2:RIC","KSJ2:RIN","KSJ2:WSC","KSJ2:coordinate","KSJ2:curve_id","KSJ2:curve_type","KSJ2:filename","KSJ2:lake_id","KSJ2:lat","KSJ2:long","KSJ2:river_id","yh:LINE_NAME","yh:LINE_NUM","yh:STRUCTURE","yh:TOTYUMONO","yh:TYPE","yh:WIDTH","yh:WIDTH_RANK","SK53_bulk:load"];
 
-var dataLocales = {"af":{"rtl":false},"ar":{"rtl":true},"ar-AA":{"rtl":true},"ast":{"rtl":false},"bg":{"rtl":false},"bg-BG":{"rtl":false},"bn":{"rtl":false},"bs":{"rtl":false},"ca":{"rtl":false},"cs":{"rtl":false},"da":{"rtl":false},"de":{"rtl":false},"el":{"rtl":false},"en-GB":{"rtl":false},"eo":{"rtl":false},"es":{"rtl":false},"et":{"rtl":false},"fa":{"rtl":true},"fi":{"rtl":false},"fr":{"rtl":false},"gan":{"rtl":false},"gl":{"rtl":false},"gu":{"rtl":false},"he":{"rtl":true},"hi":{"rtl":false},"hr":{"rtl":false},"hu":{"rtl":false},"hy":{"rtl":false},"ia":{"rtl":false},"id":{"rtl":false},"is":{"rtl":false},"it":{"rtl":false},"ja":{"rtl":false},"jv":{"rtl":false},"km":{"rtl":false},"kn":{"rtl":false},"ko":{"rtl":false},"ku":{"rtl":true},"lij":{"rtl":false},"lt":{"rtl":false},"lv":{"rtl":false},"mg":{"rtl":false},"mk":{"rtl":false},"ml":{"rtl":false},"mn":{"rtl":false},"ms":{"rtl":false},"ne":{"rtl":false},"nl":{"rtl":false},"nn":{"rtl":false},"no":{"rtl":false},"nv":{"rtl":false},"pl":{"rtl":false},"pt":{"rtl":false},"pt-BR":{"rtl":false},"rm":{"rtl":false},"ro":{"rtl":false},"ru":{"rtl":false},"sc":{"rtl":false},"si":{"rtl":false},"sk":{"rtl":false},"sl":{"rtl":false},"sq":{"rtl":false},"sr":{"rtl":false},"sv":{"rtl":false},"ta":{"rtl":false},"te":{"rtl":false},"th":{"rtl":false},"tl":{"rtl":false},"tr":{"rtl":false},"uk":{"rtl":false},"ur":{"rtl":true},"vi":{"rtl":false},"yue":{"rtl":false},"zh":{"rtl":false},"zh-CN":{"rtl":false},"zh-HK":{"rtl":false},"zh-TW":{"rtl":false}};
+var dataLocales = {"af":{"rtl":false},"ar":{"rtl":true},"ar-AA":{"rtl":true},"ast":{"rtl":false},"bg":{"rtl":false},"bg-BG":{"rtl":false},"bn":{"rtl":false},"bs":{"rtl":false},"ca":{"rtl":false},"cs":{"rtl":false},"da":{"rtl":false},"de":{"rtl":false},"dv":{"rtl":false},"el":{"rtl":false},"en-GB":{"rtl":false},"eo":{"rtl":false},"es":{"rtl":false},"et":{"rtl":false},"fa":{"rtl":true},"fi":{"rtl":false},"fr":{"rtl":false},"gan":{"rtl":false},"gl":{"rtl":false},"gu":{"rtl":false},"he":{"rtl":true},"hi":{"rtl":false},"hr":{"rtl":false},"hu":{"rtl":false},"hy":{"rtl":false},"ia":{"rtl":false},"id":{"rtl":false},"is":{"rtl":false},"it":{"rtl":false},"ja":{"rtl":false},"jv":{"rtl":false},"km":{"rtl":false},"kn":{"rtl":false},"ko":{"rtl":false},"ku":{"rtl":true},"lij":{"rtl":false},"lt":{"rtl":false},"lv":{"rtl":false},"mg":{"rtl":false},"mk":{"rtl":false},"ml":{"rtl":false},"mn":{"rtl":false},"ms":{"rtl":false},"ne":{"rtl":false},"nl":{"rtl":false},"nn":{"rtl":false},"no":{"rtl":false},"nv":{"rtl":false},"pl":{"rtl":false},"pt":{"rtl":false},"pt-BR":{"rtl":false},"rm":{"rtl":false},"ro":{"rtl":false},"ru":{"rtl":false},"sc":{"rtl":false},"si":{"rtl":false},"sk":{"rtl":false},"sl":{"rtl":false},"sq":{"rtl":false},"sr":{"rtl":false},"sv":{"rtl":false},"ta":{"rtl":false},"te":{"rtl":false},"th":{"rtl":false},"tl":{"rtl":false},"tr":{"rtl":false},"uk":{"rtl":false},"ur":{"rtl":true},"vi":{"rtl":false},"yue":{"rtl":false},"zh":{"rtl":false},"zh-CN":{"rtl":false},"zh-HK":{"rtl":false},"zh-TW":{"rtl":false}};
 
 var dataPhoneFormats = {"us":"+1-202-555-1234","ca":"+1-226-555-1234","bs":"+1-242-555-1234","bb":"+1-246-555-1234","ai":"+1-264-555-1234","ag":"+1-268-555-1234","vg":"+1-284-555-1234","vi":"+1-340-555-1234","ky":"+1-345-555-1234","bm":"+1-441-555-1234","gd":"+1-473-555-1234","tc":"+1-649-555-1234","ms":"+1-664-555-1234","mp":"+1-670-555-1234","gu":"+1-671-555-1234","as":"+1-684-555-1234","sx":"+1-721-555-1234","lc":"+1-758-555-1234","dm":"+1-767-555-1234","vc":"+1-784-555-1234","pr":"+1-787-555-1234","do":"+1-809-555-1234","tt":"+1-868-555-1234","kn":"+1-869-555-1234","jm":"+1-876-555-1234","za":"+27 11 907 1111","nl":"+31 42 123 4567","fr":"+33 1 23 45 67 89","es":"+34 989 12 34 56","pt":"+351 211 123456","ie":"+353 20 912 3456","fi":"+358 40 123 4567","hu":"+36 1 123 45 67","hr":"+385 01 123 4567","si":"+386 31 123 4567","it":"+39 01 123 456","va":"+39 01 123 456","gb":"+44 1632 961234","gg":"+44 1632 961234","im":"+44 1632 961234","je":"+44 1632 961234","se":"+46 31 123 4567","no":"+47 22 12 34 56","sj":"+47 22 12 34 56","pl":"+48 42 123 4567","de":"+49 89 1234567","br":"+55 11 0982 1098","ru":"+7 495 1234567","kz":"+7 495 1234567","vn":"+84 1 234 5678","hk":"+852 1234 5678","cn":"+86 10 12345678","tw":"+886 1 2345 6789","tr":"+90 312 123 4567","ua":"+380 44 123 4567"};
 
@@ -18622,17 +18622,17 @@ var dataDriveLeft = {
        features: features$1
 };
 
-var en = {"modes":{"add_area":{"title":"Area","description":"Add parks, buildings, lakes or other areas to the map.","tail":"Click on the map to start drawing an area, like a park, lake, or building."},"add_line":{"title":"Line","description":"Add highways, streets, pedestrian paths, canals or other lines to the map.","tail":"Click on the map to start drawing a road, path, or route."},"add_point":{"title":"Point","description":"Add restaurants, monuments, postal boxes or other points to the map.","tail":"Click on the map to add a point."},"browse":{"title":"Browse","description":"Pan and zoom the map."},"draw_area":{"tail":"Click to add nodes to your area. Click the first node to finish the area."},"draw_line":{"tail":"Click to add more nodes to the line. Click on other lines to connect to them, and double-click to end the line."}},"operations":{"add":{"annotation":{"point":"Added a point.","vertex":"Added a node to a way.","relation":"Added a relation."}},"start":{"annotation":{"line":"Started a line.","area":"Started an area."}},"continue":{"key":"A","title":"Continue","description":"Continue this line.","not_eligible":"No line can be continued here.","multiple":"Several lines can be continued here. To choose a line, press the Shift key and click on it to select it.","annotation":{"line":"Continued a line.","area":"Continued an area."}},"cancel_draw":{"annotation":"Canceled drawing."},"change_role":{"annotation":"Changed the role of a relation member."},"change_tags":{"annotation":"Changed tags."},"circularize":{"title":"Circularize","description":{"line":"Make this line circular.","area":"Make this area circular."},"key":"O","annotation":{"line":"Made a line circular.","area":"Made an area circular."},"not_closed":"This can't be made circular because it's not a loop.","too_large":"This can't be made circular because not enough of it is currently visible.","connected_to_hidden":"This can't be made circular because it is connected to a hidden feature."},"orthogonalize":{"title":"Square","description":{"line":"Square the corners of this line.","area":"Square the corners of this area."},"key":"S","annotation":{"line":"Squared the corners of a line.","area":"Squared the corners of an area."},"not_squarish":"This can't be made square because it is not squarish.","too_large":"This can't be made square because not enough of it is currently visible.","connected_to_hidden":"This can't be made square because it is connected to a hidden feature."},"straighten":{"title":"Straighten","description":"Straighten this line.","key":"S","annotation":"Straightened a line.","too_bendy":"This can't be straightened because it bends too much.","connected_to_hidden":"This line can't be straightened because it is connected to a hidden feature."},"delete":{"title":"Delete","description":{"single":"Delete this feature permanently.","multiple":"Delete these features permanently."},"annotation":{"point":"Deleted a point.","vertex":"Deleted a node from a way.","line":"Deleted a line.","area":"Deleted an area.","relation":"Deleted a relation.","multiple":"Deleted {n} features."},"too_large":{"single":"This feature can't be deleted because not enough of it is currently visible.","multiple":"These features can't be deleted because not enough of them are currently visible."},"incomplete_relation":{"single":"This feature can't be deleted because it hasn't been fully downloaded.","multiple":"These features can't be deleted because they haven't been fully downloaded."},"part_of_relation":{"single":"This feature can't be deleted because it is part of a larger relation. You must remove it from the relation first.","multiple":"These features can't be deleted because they are part of larger relations. You must remove them from the relations first."},"connected_to_hidden":{"single":"This feature can't be deleted because it is connected to a hidden feature.","multiple":"These features can't be deleted because some are connected to hidden features."}},"add_member":{"annotation":"Added a member to a relation."},"delete_member":{"annotation":"Removed a member from a relation."},"connect":{"annotation":{"point":"Connected a way to a point.","vertex":"Connected a way to another.","line":"Connected a way to a line.","area":"Connected a way to an area."}},"disconnect":{"title":"Disconnect","description":"Disconnect these lines/areas from each other.","key":"D","annotation":"Disconnected lines/areas.","not_connected":"There aren't enough lines/areas here to disconnect.","connected_to_hidden":"This can't be disconnected because it is connected to a hidden feature.","relation":"This can't be disconnected because it connects members of a relation."},"merge":{"title":"Merge","description":"Merge these features.","key":"C","annotation":"Merged {n} features.","not_eligible":"These features can't be merged.","not_adjacent":"These features can't be merged because their endpoints aren't connected.","restriction":"These features can't be merged because at least one is a member of a \"{relation}\" relation.","incomplete_relation":"These features can't be merged because at least one hasn't been fully downloaded.","conflicting_tags":"These features can't be merged because some of their tags have conflicting values."},"move":{"title":"Move","description":{"single":"Move this feature to a different location.","multiple":"Move these features to a different location."},"key":"M","annotation":{"point":"Moved a point.","vertex":"Moved a node in a way.","line":"Moved a line.","area":"Moved an area.","multiple":"Moved multiple features."},"incomplete_relation":{"single":"This feature can't be moved because it hasn't been fully downloaded.","multiple":"These features can't be moved because they haven't been fully downloaded."},"too_large":{"single":"This feature can't be moved because not enough of it is currently visible.","multiple":"These features can't be moved because not enough of them are currently visible."},"connected_to_hidden":{"single":"This feature can't be moved because it is connected to a hidden feature.","multiple":"These features can't be moved because some are connected to hidden features."}},"reflect":{"title":{"long":"Reflect Long","short":"Reflect Short"},"description":{"long":{"single":"Reflect this feature across its long axis.","multiple":"Reflect these features across their long axis."},"short":{"single":"Reflect this feature across its short axis.","multiple":"Reflect these features across their short axis."}},"key":{"long":"T","short":"Y"},"annotation":{"long":{"single":"Reflected a feature across its long axis.","multiple":"Reflected multiple features across their long axis."},"short":{"single":"Reflected a feature across its short axis.","multiple":"Reflected multiple features across their short axis."}},"incomplete_relation":{"single":"This feature can't be reflected because it hasn't been fully downloaded.","multiple":"These features can't be reflected because they haven't been fully downloaded."},"too_large":{"single":"This feature can't be reflected because not enough of it is currently visible.","multiple":"These features can't be reflected because not enough of them are currently visible."},"connected_to_hidden":{"single":"This feature can't be reflected because it is connected to a hidden feature.","multiple":"These features can't be reflected because some are connected to hidden features."}},"rotate":{"title":"Rotate","description":{"single":"Rotate this feature around its center point.","multiple":"Rotate these features around their center point."},"key":"R","annotation":{"line":"Rotated a line.","area":"Rotated an area.","multiple":"Rotated multiple features."},"incomplete_relation":{"single":"This feature can't be rotated because it hasn't been fully downloaded.","multiple":"These features can't be rotated because they haven't been fully downloaded."},"too_large":{"single":"This feature can't be rotated because not enough of it is currently visible.","multiple":"These features can't be rotated because not enough of them are currently visible."},"connected_to_hidden":{"single":"This feature can't be rotated because it is connected to a hidden feature.","multiple":"These features can't be rotated because some are connected to hidden features."}},"reverse":{"title":"Reverse","description":"Make this line go in the opposite direction.","key":"V","annotation":"Reversed a line."},"split":{"title":"Split","description":{"line":"Split this line into two at this node.","area":"Split the boundary of this area into two.","multiple":"Split the lines/area boundaries at this node into two."},"key":"X","annotation":{"line":"Split a line.","area":"Split an area boundary.","multiple":"Split {n} lines/area boundaries."},"not_eligible":"Lines can't be split at their beginning or end.","multiple_ways":"There are too many lines here to split.","connected_to_hidden":"This can't be split because it is connected to a hidden feature."},"restriction":{"help":{"select":"Click to select a road segment.","toggle":"Click to toggle turn restrictions.","toggle_on":"Click to add a \"{restriction}\" restriction.","toggle_off":"Click to remove the \"{restriction}\" restriction."},"annotation":{"create":"Added a turn restriction","delete":"Deleted a turn restriction"}}},"undo":{"tooltip":"Undo: {action}","nothing":"Nothing to undo."},"redo":{"tooltip":"Redo: {action}","nothing":"Nothing to redo."},"tooltip_keyhint":"Shortcut:","browser_notice":"This editor is supported in Firefox, Chrome, Safari, Opera, and Internet Explorer 11 and above. Please upgrade your browser or use Potlatch 2 to edit the map.","translate":{"translate":"Translate","localized_translation_label":"Multilingual name","localized_translation_language":"Choose language","localized_translation_name":"Name"},"zoom_in_edit":"Zoom in to Edit","login":"login","logout":"logout","loading_auth":"Connecting to OpenStreetMap...","report_a_bug":"Report a bug","help_translate":"Help translate","feature_info":{"hidden_warning":"{count} hidden features","hidden_details":"These features are currently hidden: {details}"},"status":{"error":"Unable to connect to API.","offline":"The API is offline. Please try editing later.","readonly":"The API is read-only. You will need to wait to save your changes.","rateLimit":"The API is limiting anonymous connections.  You can fix this by logging in."},"commit":{"title":"Upload to OpenStreetMap","description_placeholder":"Brief description of your contributions (required)","message_label":"Changeset Comment","upload_explanation":"The changes you upload will be visible on all maps that use OpenStreetMap data.","upload_explanation_with_user":"The changes you upload as {user} will be visible on all maps that use OpenStreetMap data.","save":"Upload","cancel":"Cancel","changes":"{count} Changes","warnings":"Warnings","modified":"Modified","deleted":"Deleted","created":"Created","about_changeset_comments":"About changeset comments","about_changeset_comments_link":"//wiki.openstreetmap.org/wiki/Good_changeset_comments","google_warning":"You mentioned Google in this comment: remember that copying from Google Maps is strictly forbidden.","google_warning_link":"http://www.openstreetmap.org/copyright"},"contributors":{"list":"Edits by {users}","truncated_list":"Edits by {users} and {count} others"},"info_panels":{"key":"I","background":{"key":"B","title":"Background","zoom":"Zoom","vintage":"Vintage","unknown":"Unknown","show_tiles":"Show Tiles","hide_tiles":"Hide Tiles"},"history":{"key":"H","title":"History","selected":"{n} selected","version":"Version","last_edit":"Last Edit","edited_by":"Edited By","changeset":"Changeset","unknown":"Unknown","link_text":"History on openstreetmap.org"},"location":{"key":"L","title":"Location","unknown_location":"Unknown Location"},"measurement":{"key":"M","title":"Measurement","selected":"{n} selected","geometry":"Geometry","closed":"closed","center":"Center","perimeter":"Perimeter","length":"Length","area":"Area","centroid":"Centroid","location":"Location","metric":"Metric","imperial":"Imperial"}},"geometry":{"point":"point","vertex":"vertex","line":"line","area":"area","relation":"relation"},"geocoder":{"search":"Search worldwide...","no_results_visible":"No results in visible map area","no_results_worldwide":"No results found"},"geolocate":{"title":"Show My Location","locating":"Locating, please wait..."},"inspector":{"no_documentation_combination":"There is no documentation available for this tag combination","no_documentation_key":"There is no documentation available for this key","documentation_redirect":"This documentation has been redirected to a new page","show_more":"Show More","view_on_osm":"View on openstreetmap.org","all_fields":"All fields","all_tags":"All tags","all_members":"All members","all_relations":"All relations","new_relation":"New relation...","role":"Role","choose":"Select feature type","results":"{n} results for {search}","reference":"View on OpenStreetMap Wiki","back_tooltip":"Change feature","remove":"Remove","search":"Search","multiselect":"Selected features","unknown":"Unknown","incomplete":"<not downloaded>","feature_list":"Search features","edit":"Edit feature","check":{"yes":"Yes","no":"No","reverser":"Change Direction"},"radio":{"structure":{"type":"Type","default":"Default","layer":"Layer"}},"add":"Add","none":"None","node":"Node","way":"Way","relation":"Relation","location":"Location","add_fields":"Add field:"},"background":{"title":"Background","description":"Background settings","key":"B","percent_brightness":"{opacity}% brightness","none":"None","best_imagery":"Best known imagery source for this location","switch":"Switch back to this background","custom":"Custom","custom_button":"Edit custom background","custom_prompt":"Enter a tile URL template. Valid tokens are:\n   - {zoom}/{z}, {x}, {y} for Z/X/Y tile scheme\n   - {ty} for flipped TMS-style Y coordinates\n   - {u} for quadtile scheme\n   - {switch:a,b,c} for DNS server multiplexing\n\nExample:\n{example}","fix_misalignment":"Adjust imagery offset","imagery_source_faq":"Where does this imagery come from?","reset":"reset","offset":"Drag anywhere in the gray area below to adjust the imagery offset, or enter the offset values in meters.","minimap":{"description":"Minimap","tooltip":"Show a zoomed out map to help locate the area currently displayed.","key":"/"}},"map_data":{"title":"Map Data","description":"Map Data","key":"F","data_layers":"Data Layers","fill_area":"Fill Areas","map_features":"Map Features","autohidden":"These features have been automatically hidden because too many would be shown on the screen.  You can zoom in to edit them."},"feature":{"points":{"description":"Points","tooltip":"Points of Interest"},"traffic_roads":{"description":"Traffic Roads","tooltip":"Highways, Streets, etc."},"service_roads":{"description":"Service Roads","tooltip":"Service Roads, Parking Aisles, Tracks, etc."},"paths":{"description":"Paths","tooltip":"Sidewalks, Foot Paths, Cycle Paths, etc."},"buildings":{"description":"Buildings","tooltip":"Buildings, Shelters, Garages, etc."},"landuse":{"description":"Landuse Features","tooltip":"Forests, Farmland, Parks, Residential, Commercial, etc."},"boundaries":{"description":"Boundaries","tooltip":"Administrative Boundaries"},"water":{"description":"Water Features","tooltip":"Rivers, Lakes, Ponds, Basins, etc."},"rail":{"description":"Rail Features","tooltip":"Railways"},"power":{"description":"Power Features","tooltip":"Power Lines, Power Plants, Substations, etc."},"past_future":{"description":"Past/Future","tooltip":"Proposed, Construction, Abandoned, Demolished, etc."},"others":{"description":"Others","tooltip":"Everything Else"}},"area_fill":{"wireframe":{"description":"No Fill (Wireframe)","tooltip":"Enabling wireframe mode makes it easy to see the background imagery.","key":"W"},"partial":{"description":"Partial Fill","tooltip":"Areas are drawn with fill only around their inner edges. (Recommended for beginner mappers)"},"full":{"description":"Full Fill","tooltip":"Areas are drawn fully filled."}},"restore":{"heading":"You have unsaved changes","description":"Do you wish to restore unsaved changes from a previous editing session?","restore":"Restore my changes","reset":"Discard my changes"},"save":{"title":"Save","help":"Review your changes and upload them to OpenStreetMap, making them visible to other users.","no_changes":"No changes to save.","error":"Errors occurred while trying to save","status_code":"Server returned status code {code}","unknown_error_details":"Please ensure you are connected to the internet.","uploading":"Uploading changes to OpenStreetMap...","unsaved_changes":"You have unsaved changes","conflict":{"header":"Resolve conflicting edits","count":"Conflict {num} of {total}","previous":"< Previous","next":"Next >","keep_local":"Keep mine","keep_remote":"Use theirs","restore":"Restore","delete":"Leave Deleted","download_changes":"Or download your changes.","done":"All conflicts resolved!","help":"Another user changed some of the same map features you changed.\nClick on each feature below for more details about the conflict, and choose whether to keep\nyour changes or the other user's changes.\n"}},"merge_remote_changes":{"conflict":{"deleted":"This feature has been deleted by {user}.","location":"This feature was moved by both you and {user}.","nodelist":"Nodes were changed by both you and {user}.","memberlist":"Relation members were changed by both you and {user}.","tags":"You changed the <b>{tag}</b> tag to \"{local}\" and {user} changed it to \"{remote}\"."}},"success":{"edited_osm":"Edited OSM!","just_edited":"You just edited OpenStreetMap!","view_on_osm":"View on OSM","facebook":"Share on Facebook","twitter":"Share on Twitter","google":"Share on Google+","help_html":"Your changes should appear in the \"Standard\" layer in a few minutes. Other layers, and certain features, may take longer.","help_link_text":"Details","help_link_url":"https://wiki.openstreetmap.org/wiki/FAQ#I_have_just_made_some_changes_to_the_map._How_do_I_get_to_see_my_changes.3F"},"confirm":{"okay":"OK","cancel":"Cancel"},"splash":{"welcome":"Welcome to the iD OpenStreetMap editor","text":"iD is a friendly but powerful tool for contributing to the world's best free world map. This is version {version}. For more information see {website} and report bugs at {github}.","walkthrough":"Start the Walkthrough","start":"Edit Now"},"source_switch":{"live":"live","lose_changes":"You have unsaved changes. Switching the map server will discard them. Are you sure you want to switch servers?","dev":"dev"},"version":{"whats_new":"What's new in iD {version}"},"tag_reference":{"description":"Description","on_wiki":"{tag} on wiki.osm.org","used_with":"used with {type}"},"validations":{"disconnected_highway":"Disconnected highway","disconnected_highway_tooltip":"Roads should be connected to other roads or building entrances.","old_multipolygon":"Multipolygon tags on outer way","old_multipolygon_tooltip":"This style of multipolygon is deprecated. Please assign the tags to the parent multipolygon instead of the outer way.","untagged_point":"Untagged point","untagged_point_tooltip":"Select a feature type that describes what this point is.","untagged_line":"Untagged line","untagged_line_tooltip":"Select a feature type that describes what this line is.","untagged_area":"Untagged area","untagged_area_tooltip":"Select a feature type that describes what this area is.","untagged_relation":"Untagged relation","untagged_relation_tooltip":"Select a feature type that describes what this relation is.","many_deletions":"You're deleting {n} features. Are you sure you want to do this? This will delete them from the map that everyone else sees on openstreetmap.org.","tag_suggests_area":"The tag {tag} suggests line should be area, but it is not an area","deprecated_tags":"Deprecated tags: {tags}"},"zoom":{"in":"Zoom In","out":"Zoom Out"},"cannot_zoom":"Cannot zoom out further in current mode.","full_screen":"Toggle Full Screen","gpx":{"local_layer":"Local file","drag_drop":"Drag and drop a .gpx, .geojson or .kml file on the page, or click the button to the right to browse","zoom":"Zoom to layer","browse":"Browse for a file"},"mapillary_images":{"tooltip":"Street-level photos from Mapillary","title":"Photo Overlay (Mapillary)"},"mapillary_signs":{"tooltip":"Traffic signs from Mapillary (must enable Photo Overlay)","title":"Traffic Sign Overlay (Mapillary)"},"mapillary":{"view_on_mapillary":"View this image on Mapillary"},"help":{"title":"Help","key":"H","help":"# Help\n\nThis is an editor for [OpenStreetMap](http://www.openstreetmap.org/), the\nfree and editable map of the world. You can use it to add and update\ndata in your area, making an open-source and open-data map of the world\nbetter for everyone.\n\nEdits that you make on this map will be visible to everyone who uses\nOpenStreetMap. In order to make an edit, you'll need to\n[log in](https://www.openstreetmap.org/login).\n\nThe [iD editor](http://ideditor.com/) is a collaborative project with [source\ncode available on GitHub](https://github.com/openstreetmap/iD).\n","editing_saving":"# Editing & Saving\n\nThis editor is designed to work primarily online, and you're accessing\nit through a website right now.\n\n### Selecting Features\n\nTo select a map feature, like a road or point of interest, click\non it on the map. This will highlight the selected feature, open a panel with\ndetails about it, and show a menu of things you can do with the feature.\n\nTo select multiple features, hold down the 'Shift' key. Then either click\non the features you want to select, or drag on the map to draw a rectangle.\nThis will draw a box and select all the points within it.\n\n### Saving Edits\n\nWhen you make changes like editing roads, buildings, and places, these are\nstored locally until you save them to the server. Don't worry if you make\na mistake - you can undo changes by clicking the undo button, and redo\nchanges by clicking the redo button.\n\nClick 'Save' to finish a group of edits - for instance, if you've completed\nan area of town and would like to start on a new area. You'll have a chance\nto review what you've done, and the editor supplies helpful suggestions\nand warnings if something doesn't seem right about the changes.\n\nIf everything looks good, you can enter a short comment explaining the change\nyou made, and click 'Save' again to post the changes\nto [OpenStreetMap.org](http://www.openstreetmap.org/), where they are visible\nto all other users and available for others to build and improve upon.\n\nIf you can't finish your edits in one sitting, you can leave the editor\nwindow and come back (on the same browser and computer), and the\neditor application will offer to restore your work.\n\n### Using the editor\n\nYou can view a list of keyboard shortcuts by pressing the `?` key.\n","roads":"# Roads\n\nYou can create, fix, and delete roads with this editor. Roads can be all\nkinds: paths, highways, trails, cycleways, and more - any often-crossed\nsegment should be mappable.\n\n### Selecting\n\nClick on a road to select it. An outline should become visible, along\nwith a small tools menu on the map and a sidebar showing more information\nabout the road.\n\n### Modifying\n\nOften you'll see roads that aren't aligned to the imagery behind them\nor to a GPS track. You can adjust these roads so they are in the correct\nplace.\n\nFirst click on the road you want to change. This will highlight it and show\ncontrol points along it that you can drag to better locations. If\nyou want to add new control points for more detail, double-click a part\nof the road without a node, and one will be added.\n\nIf the road connects to another road, but doesn't properly connect on\nthe map, you can drag one of its control points onto the other road in\norder to join them. Having roads connect is important for the map\nand essential for providing driving directions.\n\nYou can also click the 'Move' tool or press the `M` shortcut key to move the entire road at\none time, and then click again to save that movement.\n\n### Deleting\n\nIf a road is entirely incorrect - you can see that it doesn't exist in satellite\nimagery and ideally have confirmed locally that it's not present - you can delete\nit, which removes it from the map. Be cautious when deleting features -\nlike any other edit, the results are seen by everyone and satellite imagery\nis often out of date, so the road could simply be newly built.\n\nYou can delete a road by clicking on it to select it, then clicking the\ntrash can icon or pressing the 'Delete' key.\n\n### Creating\n\nFound somewhere there should be a road but there isn't? Click the 'Line'\nicon in the top-left of the editor or press the shortcut key `2` to start drawing\na line.\n\nClick on the start of the road on the map to start drawing. If the road\nbranches off from an existing road, start by clicking on the place where they connect.\n\nThen click on points along the road so that it follows the right path, according\nto satellite imagery or GPS. If the road you are drawing crosses another road, connect\nit by clicking on the intersection point. When you're done drawing, double-click\nor press 'Return' or 'Enter' on your keyboard.\n","gps":"# GPS\n\nCollected GPS traces are one valuable source of data for OpenStreetMap. This editor\nsupports local traces - `.gpx` files on your local computer. You can collect\nthis kind of GPS trace with a number of smartphone applications as well as\npersonal GPS hardware.\n\nFor information on how to perform a GPS survey, read\n[Mapping with a smartphone, GPS, or paper](http://learnosm.org/en/mobile-mapping/).\n\nTo use a GPX track for mapping, drag and drop the GPX file onto the map\neditor. If it's recognized, it will be added to the map as a bright purple\nline. Click on the 'Map Data' menu on the right side to enable,\ndisable, or zoom to this new GPX-powered layer.\n\nThe GPX track isn't directly uploaded to OpenStreetMap - the best way to\nuse it is to draw on the map, using it as a guide for the new features that\nyou add, and also to [upload it to OpenStreetMap](http://www.openstreetmap.org/trace/create)\nfor other users to use.\n","imagery":"# Imagery\n\nAerial imagery is an important resource for mapping. A combination of\nairplane flyovers, satellite views, and freely-compiled sources are available\nin the editor under the 'Background Settings' menu on the right.\n\nBy default a [Bing Maps](http://www.bing.com/maps/) satellite layer is\npresented in the editor, but as you pan and zoom the map to new geographical\nareas, new sources will become available. Some countries, like the United\nStates, France, and Denmark have very high-quality imagery available for some areas.\n\nImagery is sometimes offset from the map data because of a mistake on the\nimagery provider's side. If you see a lot of roads shifted from the background,\ndon't immediately move them all to match the background. Instead you can adjust\nthe imagery so that it matches the existing data by clicking 'Fix alignment' at\nthe bottom of the Background Settings UI.\n","addresses":"# Addresses\n\nAddresses are some of the most useful information for the map.\n\nAlthough addresses are often represented as parts of streets, in OpenStreetMap\nthey're recorded as attributes of buildings and places along streets.\n\nYou can add address information to places mapped as building outlines\nas well as those mapped as single points. The optimal source of address\ndata is from an on-the-ground survey or personal knowledge - as with any\nother feature, copying from commercial sources like Google Maps is strictly\nforbidden.\n","inspector":"# Using the Inspector\n\nThe inspector is the section on the left side of the page that allows you to\nedit the details of the selected feature.\n\n### Selecting a Feature Type\n\nAfter you add a point, line, or area, you can choose what type of feature it\nis, like whether it's a highway or residential road, supermarket or cafe.\nThe inspector will display buttons for common feature types, and you can\nfind others by typing what you're looking for in the search box.\n\nClick the 'i' in the bottom-right-hand corner of a feature type button to\nlearn more about it. Click a button to choose that type.\n\n### Using Forms and Editing Tags\n\nAfter you choose a feature type, or when you select a feature that already\nhas a type assigned, the inspector will display fields with details about\nthe feature like its name and address.\n\nBelow the fields you see, you can click the 'Add field' dropdown to add\nother details, like a Wikipedia link, wheelchair access, and more.\n\nAt the bottom of the inspector, click 'Additional tags' to add arbitrary\nother tags to the element. [Taginfo](http://taginfo.openstreetmap.org/) is a\ngreat resource for learn more about popular tag combinations.\n\nChanges you make in the inspector are automatically applied to the map.\nYou can undo them at any time by clicking the 'Undo' button.\n","buildings":"# Buildings\n\nOpenStreetMap is the world's largest database of buildings. You can create\nand improve this database.\n\n### Selecting\n\nYou can select a building by clicking on its border. This will highlight the\nbuilding and open a small tools menu and a sidebar showing more information\nabout the building.\n\n### Modifying\n\nSometimes buildings are incorrectly placed or have incorrect tags.\n\nTo move an entire building, select it, then click the 'Move' tool. Move your\nmouse to shift the building, and click when it's correctly placed.\n\nTo fix the specific shape of a building, click and drag the nodes that form\nits border into better places.\n\n### Creating\n\nOne of the main questions around adding buildings to the map is that\nOpenStreetMap records buildings both as shapes and points. The rule of thumb\nis to _map a building as a shape whenever possible_, and map companies, homes,\namenities, and other things that operate out of buildings as points placed\nwithin the building shape.\n\nStart drawing a building as a shape by clicking the 'Area' button in the top\nleft of the interface, and end it either by pressing 'Return' on your keyboard\nor clicking on the first node drawn to close the shape.\n\n### Deleting\n\nIf a building is entirely incorrect - you can see that it doesn't exist in satellite\nimagery and ideally have confirmed locally that it's not present - you can delete\nit, which removes it from the map. Be cautious when deleting features -\nlike any other edit, the results are seen by everyone and satellite imagery\nis often out of date, so the building could simply be newly built.\n\nYou can delete a building by clicking on it to select it, then clicking the\ntrash can icon or pressing the 'Delete' key.\n","relations":"# Relations\n\nA relation is a special type of feature in OpenStreetMap that groups together\nother features. For example, two common types of relations are *route relations*,\nwhich group together sections of road that belong to a specific freeway or\nhighway, and *multipolygons*, which group together several lines that define\na complex area (one with several pieces or holes in it like a donut).\n\nThe group of features in a relation are called *members*. In the sidebar, you can\nsee which relations a feature is a member of, and click on a relation there\nto select the it. When the relation is selected, you can see all of its\nmembers listed in the sidebar and highlighted on the map.\n\nFor the most part, iD will take care of maintaining relations automatically\nwhile you edit. The main thing you should be aware of is that if you delete a\nsection of road to redraw it more accurately, you should make sure that the\nnew section is a member of the same relations as the original.\n\n## Editing Relations\n\nIf you want to edit relations, here are the basics.\n\nTo add a feature to a relation, select the feature, click the \"+\" button in the\n\"All relations\" section of the sidebar, and select or type the name of the relation.\n\nTo create a new relation, select the first feature that should be a member,\nclick the \"+\" button in the \"All relations\" section, and select \"New relation...\".\n\nTo remove a feature from a relation, select the feature and click the trash\nbutton next to the relation you want to remove it from.\n\nYou can create multipolygons with holes using the \"Merge\" tool. Draw two areas (inner\nand outer), hold the Shift key and click on each of them to select them both, and then\nclick the \"Merge\" (+) button.\n"},"intro":{"done":"done","ok":"OK","graph":{"block_number":"<value for addr:block_number>","city":"Three Rivers","county":"<value for addr:county>","district":"<value for addr:district>","hamlet":"<value for addr:hamlet>","neighbourhood":"<value for addr:neighbourhood>","postcode":"49093","province":"<value for addr:province>","quarter":"<value for addr:quarter>","state":"MI","subdistrict":"<value for addr:subdistrict>","suburb":"<value for addr:suburb>","countrycode":"us","name":{"1st-avenue":"1st Avenue","2nd-avenue":"2nd Avenue","4th-avenue":"4th Avenue","5th-avenue":"5th Avenue","6th-avenue":"6th Avenue","6th-street":"6th Street","7th-avenue":"7th Avenue","8th-avenue":"8th Avenue","9th-avenue":"9th Avenue","10th-avenue":"10th Avenue","11th-avenue":"11th Avenue","12th-avenue":"12th Avenue","access-point-employment":"Access Point Employment","adams-street":"Adams Street","andrews-elementary-school":"Andrews Elementary School","andrews-street":"Andrews Street","armitage-street":"Armitage Street","barrows-school":"Barrows School","battle-street":"Battle Street","bennett-street":"Bennett Street","bowman-park":"Bowman Park","collins-drive":"Collins Drive","conrail-railroad":"Conrail Railroad","conservation-park":"Conservation Park","constantine-street":"Constantine Street","cushman-street":"Cushman Street","dollar-tree":"Dollar Tree","douglas-avenue":"Douglas Avenue","east-street":"East Street","elm-street":"Elm Street","flower-street":"Flower Street","foster-street":"Foster Street","french-street":"French Street","garden-street":"Garden Street","gem-pawnbroker":"Gem Pawnbroker","golden-finch-framing":"Golden Finch Framing","grant-avenue":"Grant Avenue","hoffman-pond":"Hoffman Pond","hoffman-street":"Hoffman Street","hook-avenue":"Hook Avenue","jefferson-street":"Jefferson Street","kelsey-street":"Kelsey Street","lafayette-park":"LaFayette Park","las-coffee-cafe":"L.A.'s Coffee Cafe","lincoln-avenue":"Lincoln Avenue","lowrys-books":"Lowry's Books","lynns-garage":"Lynn's Garage","main-street-barbell":"Main Street Barbell","main-street-cafe":"Main Street Cafe","main-street-fitness":"Main Street Fitness","main-street":"Main Street","maple-street":"Maple Street","marina-park":"Marina Park","market-street":"Market Street","memory-isle-park":"Memory Isle Park","memory-isle":"Memory Isle","michigan-avenue":"Michigan Avenue","middle-street":"Middle Street","millard-street":"Millard Street","moore-street":"Moore Street","morris-avenue":"Morris Avenue","mural-mall":"Mural Mall","paisanos-bar-and-grill":"Paisano's Bar and Grill","paisley-emporium":"Paisley Emporium","paparazzi-tattoo":"Paparazzi Tattoo","pealer-street":"Pealer Street","pine-street":"Pine Street","pizza-hut":"Pizza Hut","portage-avenue":"Portage Avenue","portage-river":"Portage River","preferred-insurance-services":"Preferred Insurance Services","railroad-drive":"Railroad Drive","river-city-appliance":"River City Appliance","river-drive":"River Drive","river-road":"River Road","river-street":"River Street","riverside-cemetery":"Riverside Cemetery","riverwalk-trail":"Riverwalk Trail","riviera-theatre":"Riviera Theatre","rocky-river":"Rocky River","saint-joseph-river":"Saint Joseph River","scidmore-park-petting-zoo":"Scidmore Park Petting Zoo","scidmore-park":"Scidmore Park","scouter-park":"Scouter Park","sherwin-williams":"Sherwin-Williams","south-street":"South Street","southern-michigan-bank":"Southern Michigan Bank","spring-street":"Spring Street","sturgeon-river-road":"Sturgeon River Road","three-rivers-city-hall":"Three Rivers City Hall","three-rivers-elementary-school":"Three Rivers Elementary School","three-rivers-fire-department":"Three Rivers Fire Department","three-rivers-high-school":"Three Rivers High School","three-rivers-middle-school":"Three Rivers Middle School","three-rivers-municipal-airport":"Three Rivers Municipal Airport","three-rivers-post-office":"Three Rivers Post Office","three-rivers-public-library":"Three Rivers Public Library","three-rivers":"Three Rivers","unique-jewelry":"Unique Jewelry","walnut-street":"Walnut Street","washington-street":"Washington Street","water-street":"Water Street","west-street":"West Street","wheeler-street":"Wheeler Street","william-towing":"William Towing","willow-drive":"Willow Drive","wood-street":"Wood Street","world-fare":"World Fare"}},"welcome":{"title":"Welcome","welcome":"Welcome! This walkthrough will teach you the basics of editing on OpenStreetMap.","practice":"All of the data in this walkthrough is just for practicing, and any edits that you make in the walkthrough will not be saved.","words":"This walkthrough will introduce some new words and concepts. When we introduce a new word, we'll use *italics*.","mouse":"You can use any input device to edit the map, but this walkthrough assumes you have a mouse with left and right buttons. **If you want to attach a mouse, do so now, then click OK.**","leftclick":"When this tutorial asks you to click or double-click, we mean with the left button. On a trackpad it might be a single-click or single-finger tap. **Left-click {num} times.**","rightclick":"Sometimes we'll also ask you to right-click. This might be the same as control-click, or two-finger tap on a trackpad. Your keyboard might even have a 'menu' key that works like right-click. **Right-click {num} times.**","chapters":"So far, so good! You can use the buttons below to skip chapters at any time or to restart a chapter if you get stuck. Let's begin! **Click '{next}' to continue.**"},"navigation":{"title":"Navigation","drag":"The main map area shows OpenStreetMap data on top of a background.{br}You can drag the map by pressing and holding the left mouse button while moving the mouse around. You can also use the arrow keys on your keyboard. **Drag the map!**","zoom":"You can zoom in or out by scrolling with the mouse wheel or trackpad, or by clicking the {plus} / {minus} buttons. **Zoom the map!**","features":"We use the word *features* to describe the things that appear on the map. Anything in the real world can be mapped as a feature on OpenStreetMap.","points_lines_areas":"Map features are represented using *points, lines, or areas.*","nodes_ways":"In OpenStreetMap, points are sometimes called *nodes*, and lines and areas are sometimes called *ways*.","click_townhall":"All features on the map can be selected by clicking on them. **Click on the point to select it.**","selected_townhall":"Great! The point is now selected. Selected features are drawn with a pulsing glow.","editor_townhall":"When a feature is selected, the *feature editor* is displayed alongside the map.","preset_townhall":"The top part of the feature editor shows the feature's type. This point is a {preset}.","fields_townhall":"The middle part of the feature editor contains *fields* showing the feature's attributes, such as its name and address.","close_townhall":"**Close the feature editor by hitting escape or pressing the {button} button in the upper corner.**","search_street":"You can also search for features in the current view, or worldwide. **Search for '{name}'.**","choose_street":"**Choose {name} from the list to select it.**","selected_street":"Great! {name} is now selected.","editor_street":"The fields shown for a street are different than the fields that were shown for the town hall.{br}For this selected street, the feature editor shows fields like '{field1}' and '{field2}'. **Close the feature editor by hitting escape or pressing the {button} button.**","play":"Try moving the map and clicking on some other features to see what kinds of things can be added to OpenStreetMap. **When you are ready to continue to the next chapter, click '{next}'.**"},"points":{"title":"Points","add_point":"*Points* can be used to represent features such as shops, restaurants, and monuments.{br}They mark a specific location, and describe what's there. **Click the {button} Point button to add a new point.**","place_point":"To place the new point on the map, position your mouse cursor where the point should go, then left-click or press the spacebar. **Move the mouse pointer over this building, then left-click or press the spacebar.**","search_cafe":"There are many different features that can be represented by points. The point you just added is a cafe. **Search for '{preset}'.**","choose_cafe":"**Choose {preset} from the list.**","feature_editor":"The point is now marked as a cafe. Using the feature editor, we can add more information about the cafe.","add_name":"In OpenStreetMap, all of the fields are optional, and it's OK to leave a field blank if you are unsure.{br}Let's pretend that you have local knowledge of this cafe, and you know its name. **Add a name for the cafe.**","add_close":"The feature editor will remember all of your changes automatically. **When you are finished adding the name, hit escape, enter, or click the {button} button to close the feature editor.**","reselect":"Often points will already exist, but have mistakes or be incomplete. We can edit existing points. **Click to select the cafe you just created.**","update":"Let's fill in some more details for this cafe. You can change its name, add a cuisine, or add an address. **Change the cafe details.**","update_close":"**When you are finished updating the cafe, hit escape, enter, or click the {button} button to close the feature editor.**","rightclick":"You can right-click on any feature to see the *edit menu*, which shows a list of editing operations that can be performed. **Right-click to select the point you created and show the edit menu.**","delete":"It's OK to delete features that don't exist in the real world.{br}Deleting a feature from OpenStreetMap removes it from the map that everyone uses, so you should make sure a feature is really gone before you delete it. **Click on the {button} button to delete the point.**","undo":"You can always undo any changes up until you save your edits to OpenStreetMap. **Click on the {button} button to undo the delete and get the point back.**","play":"Now that you know how to create and edit points, try creating a few more points for practice! **When you are ready to continue to the next chapter, click '{next}'.**"},"areas":{"title":"Areas","add_playground":"*Areas* are used to show the boundaries of features like lakes, buildings, and residential areas.{br}They can be also be used for more detailed mapping of many features you might normally map as points. **Click the {button} Area button to add a new area.**","start_playground":"Let's add this playground to the map by drawing an area. Areas are drawn by placing *nodes* along the outer edge of the feature. **Click or press spacebar to place a starting node on one of the corners of the playground.**","continue_playground":"Continue drawing the area by placing more nodes along the playground's edge. It is OK to connect the area to the existing walking paths.{br}Tip: You can hold down the '{alt}' key to prevent nodes from connecting to other features. **Continue drawing an area for the playground.**","finish_playground":"Finish the area by pressing enter, or clicking again on either the first or last node. **Finish drawing an area for the playground.**","search_playground":"**Search for '{preset}'.**","choose_playground":"**Choose {preset} from the list.**","add_field":"This playground doesn't have an official name, so we won't add anything in the Name field.{br}Instead let's add some additional details about the playground to the Description field. **Open the Add Field list.**","choose_field":"**Choose {field} from the list.**","retry_add_field":"You didn't select the {field} field. Let's try again.","describe_playground":"**Add a description, then click the {button} button to close the feature editor.**","play":"Good job! Try drawing a few more areas, and see what other kinds of area features you can add to OpenStreetMap. **When you are ready to continue to the next chapter, click '{next}'.**"},"lines":{"title":"Lines","add_line":"*Lines* are used to represent features such as roads, railroads, and rivers. **Click the {button} Line button to add a new line.**","start_line":"Here is a road that is missing. Let's add it!{br}In OpenStreetMap, lines should be drawn down the center of the road. You can drag and zoom the map while drawing if necessary. **Start a new line by clicking at the top end of this missing road.**","intersect":"Click or press spacebar to add more nodes to the line.{br}Roads, and many other types of lines, are part of a larger network. It is important for these lines to be connected properly in order for routing applications to work. **Click on {name} to create an intersection connecting the two lines.**","retry_intersect":"The road needs to intersect {name}. Let's try again!","continue_line":"Continue drawing the line for the new road. Remember that you can drag and zoom the map if needed.{br}When you are finished drawing, click on the last node again. **Finish drawing the road.**","choose_category_road":"**Select {category} from the list.**","choose_preset_residential":"There are many different types of roads, but this one is a residential road. **Choose the {preset} type.**","retry_preset_residential":"You didn't select the {preset} type. **Click here to choose again.**","name_road":"**Give this road a name, then hit escape, enter, or click the {button} button to close the feature editor.**","did_name_road":"Looks good! Next we will learn how to update the shape of a line.","update_line":"Sometimes you will need to change the shape of an existing line. Here is a road that doesn't look quite right.","add_node":"We can add some nodes to this line to improve its shape. One way to add a node is to double-click the line where you want to add a node. **Double-click on the line to create a new node.**","start_drag_endpoint":"When a line is selected, you can drag any of its nodes by clicking and holding down the left mouse button while you drag. **Drag the endpoint to the place where these roads should intersect.**","finish_drag_endpoint":"This spot looks good. **Release the left mouse button to finish dragging.**","start_drag_midpoint":"Small triangles are drawn at the *midpoints* between nodes. Another way to create a new node is to drag a midpoint to a new location. **Drag the midpoint triangle to create a new node along the curve of the road.**","continue_drag_midpoint":"This line is looking much better! Continue to adjust this line by double-clicking or dragging midpoints until the curve matches the road shape. **When you're happy with how the line looks, click OK.**","delete_lines":"It's OK to delete lines for roads that don't exist in the real world.{br}Here's an example where the city planned a {street} but never built it. We can improve this part of the map by deleting the extra lines.","rightclick_intersection":"The last real street is {street1}, so we will *split* {street2} at this intersection and remove everything above it. **Right click on the intersection node.**","split_intersection":"**Click on the {button} button to split {street}.**","retry_split":"You didn't click the Split button. Try again.","did_split_multi":"Good job! {street1} is now split into two pieces. The top part can be removed. **Click the top part of {street2} to select it.**","did_split_single":"**Click the top part of {street2} to select it.**","multi_select":"{selected} is now selected. Let's also select {other1}. You can shift-click to select multiple things. **Shift-click on {other2}.**","multi_rightclick":"Good! Both lines to delete are now selected. **Right-click on one of the lines to show the edit menu.**","multi_delete":"**Click on the {button} button to delete the extra lines.**","retry_delete":"You didn't click the Delete button. Try again.","play":"Great! Use the skills that you've learned in this chapter to practice editing some more lines. **When you are ready to continue to the next chapter, click '{next}'.**"},"buildings":{"title":"Buildings","add_building":"OpenStreetMap is the world's largest database of buildings.{br}You can help improve this database by tracing buildings that aren't already mapped. **Click the {button} Area button to add a new area.**","start_building":"Let's add this house to the map by tracing its outline.{br}Buildings should be traced around their footprint as accurately as possible. **Click or press spacebar to place a starting node on one of the corners of the building.**","continue_building":"Continue adding more nodes to trace the outline of the building. Remember that you can zoom in if you want to add more details.{br}Finish the building by pressing enter, or clicking again on either the first or last node. **Finish tracing the building.**","retry_building":"It looks like you had some trouble placing the nodes at the building corners. Try again!","choose_category_building":"**Choose {category} from the list.**","choose_preset_house":"There are many different types of buildings, but this one is clearly a house.{br}If you're not sure of the type, it's OK to just choose the generic Building type. **Choose the {preset} type.**","close":"**Hit escape or click the {button} button to close the feature editor.**","rightclick_building":"**Right-click to select the building you created and show the edit menu.**","square_building":"The house that you just added will look even better with perfectly square corners. **Click on the {button} button to square the building shape.**","retry_square":"You didn't click the Square button. Try again.","done_square":"See how the corners of the building moved into place? Let's learn another useful trick.","add_tank":"Next we'll trace this circular storage tank. **Click the {button} Area button to add a new area.**","start_tank":"Don't worry, you won't need to draw a perfect circle. Just draw an area inside the tank that touches its edge. **Click or press spacebar to place a starting node on the edge of the tank.**","continue_tank":"Add a few more nodes around the edge. The circle will be created outside the nodes that you draw.{br}Finish the area by pressing enter, or clicking again on either the first or last node. **Finish tracing the tank.**","search_tank":"**Search for '{preset}'.**","choose_tank":"**Choose {preset} from the list.**","rightclick_tank":"**Right-click to select the storage tank you created and show the edit menu.**","circle_tank":"**Click on the {button} button to make the tank a circle.**","retry_circle":"You didn't click the Circularize button. Try again.","play":"Great Job! Practice tracing a few more buildings, and try some of the other commands on the edit menu. **When you are ready to continue to the next chapter, click '{next}'.**"},"startediting":{"title":"Start Editing","help":"You're now ready to edit OpenStreetMap!{br}You can replay this walkthrough anytime or view more documentation by clicking the {button} Help button or pressing the '{key}' key.","shortcuts":"You can view a list of commands along with their keyboard shortcuts by pressing the '{key}' key.","save":"Don't forget to regularly save your changes!","start":"Start mapping!"}},"shortcuts":{"title":"Keyboard shortcuts","tooltip":"Show the keyboard shortcuts screen.","toggle":{"key":"?"},"key":{"alt":"Alt","backspace":"Backspace","cmd":"Cmd","ctrl":"Ctrl","delete":"Delete","del":"Del","end":"End","enter":"Enter","esc":"Esc","home":"Home","option":"Option","pause":"Pause","pgdn":"PgDn","pgup":"PgUp","return":"Return","shift":"Shift","space":"Space"},"gesture":{"drag":"drag"},"or":"-or-","browsing":{"title":"Browsing","navigation":{"title":"Navigation","pan":"Pan map","pan_more":"Pan map by one screenful","zoom":"Zoom in / Zoom out","zoom_more":"Zoom in / Zoom out by a lot"},"help":{"title":"Help","help":"Show help/documentation","keyboard":"Show keyboard shortcuts"},"display_options":{"title":"Display options","background":"Show background options","background_switch":"Switch back to last background","map_data":"Show map data options","fullscreen":"Enter full screen mode","wireframe":"Toggle wireframe mode","minimap":"Toggle minimap"},"selecting":{"title":"Selecting features","select_one":"Select a single feature","select_multi":"Select multiple features","lasso":"Draw a selection lasso around features"},"with_selected":{"title":"With feature selected","edit_menu":"Toggle edit menu"},"vertex_selected":{"title":"With node selected","previous":"Jump to previous node","next":"Jump to next node","first":"Jump to first node","last":"Jump to last node","change_parent":"Switch parent way"}},"editing":{"title":"Editing","drawing":{"title":"Drawing","add_point":"'Add point' mode","add_line":"'Add line' mode","add_area":"'Add area' mode","place_point":"Place a point","disable_snap":"Hold to disable point snapping","stop_line":"Finish drawing a line or area"},"operations":{"title":"Operations","continue_line":"Continue a line at the selected node","merge":"Combine (merge) selected features","disconnect":"Disconnect features at the selected node","split":"Split a line into two at the selected node","reverse":"Reverse a line","move":"Move selected features","rotate":"Rotate selected features","orthogonalize":"Straighten line / Square area corners","circularize":"Circularize a closed line or area","reflect_long":"Reflect features across the longer axis","reflect_short":"Reflect features across the shorter axis","delete":"Delete selected features"},"commands":{"title":"Commands","copy":"Copy selected features","paste":"Paste copied features","undo":"Undo last action","redo":"Redo last action","save":"Save changes"}},"tools":{"title":"Tools","info":{"title":"Information","all":"Toggle all information panels","background":"Toggle background panel","history":"Toggle history panel","location":"Toggle location panel","measurement":"Toggle measurement panel"}}},"presets":{"categories":{"category-barrier":{"name":"Barrier Features"},"category-building":{"name":"Building Features"},"category-golf":{"name":"Golf Features"},"category-landuse":{"name":"Land Use Features"},"category-natural-area":{"name":"Natural Features"},"category-natural-line":{"name":"Natural Features"},"category-natural-point":{"name":"Natural Features"},"category-path":{"name":"Path Features"},"category-rail":{"name":"Rail Features"},"category-restriction":{"name":"Restriction Features"},"category-road":{"name":"Road Features"},"category-route":{"name":"Route Features"},"category-water-area":{"name":"Water Features"},"category-water-line":{"name":"Water Features"}},"fields":{"access_simple":{"label":"Allowed Access"},"access_toilets":{"label":"Access"},"access":{"label":"Allowed Access","placeholder":"Not Specified","types":{"access":"All","foot":"Foot","motor_vehicle":"Motor Vehicles","bicycle":"Bicycles","horse":"Horses"},"options":{"yes":{"title":"Allowed","description":"Access permitted by law; a right of way"},"no":{"title":"Prohibited","description":"Access not permitted to the general public"},"permissive":{"title":"Permissive","description":"Access permitted until such time as the owner revokes the permission"},"private":{"title":"Private","description":"Access permitted only with permission of the owner on an individual basis"},"designated":{"title":"Designated","description":"Access permitted according to signs or specific local laws"},"destination":{"title":"Destination","description":"Access permitted only to reach a destination"},"dismount":{"title":"Dismount","description":"Access permitted but rider must dismount"}}},"address":{"label":"Address","placeholders":{"block_number":"Block Number","block_number!jp":"Block No.","city":"City","city!jp":"City/Town/Village/Tokyo Special Ward","city!vn":"City/Town","conscriptionnumber":"123","country":"Country","county":"County","county!jp":"District","district":"District","district!vn":"Arrondissement/Town/District","floor":"Floor","hamlet":"Hamlet","housename":"Housename","housenumber":"123","housenumber!jp":"Building No./Lot No.","neighbourhood":"Neighbourhood","neighbourhood!jp":"Chōme/Aza/Koaza","place":"Place","postcode":"Postcode","province":"Province","province!jp":"Prefecture","quarter":"Quarter","quarter!jp":"Ōaza/Machi","state":"State","street":"Street","subdistrict":"Subdistrict","subdistrict!vn":"Ward/Commune/Townlet","suburb":"Suburb","suburb!jp":"Ward"}},"admin_level":{"label":"Admin Level"},"aerialway":{"label":"Type"},"aerialway/access":{"label":"Access","options":{"entry":"Entry","exit":"Exit","both":"Both"}},"aerialway/bubble":{"label":"Bubble"},"aerialway/capacity":{"label":"Capacity (per hour)","placeholder":"500, 2500, 5000..."},"aerialway/duration":{"label":"Duration (minutes)","placeholder":"1, 2, 3..."},"aerialway/heating":{"label":"Heated"},"aerialway/occupancy":{"label":"Occupancy","placeholder":"2, 4, 8..."},"aerialway/summer/access":{"label":"Access (summer)","options":{"entry":"Entry","exit":"Exit","both":"Both"}},"aeroway":{"label":"Type"},"amenity":{"label":"Type"},"animal_boarding":{"label":"For Animals"},"animal_breeding":{"label":"For Animals"},"animal_shelter":{"label":"For Animals"},"area/highway":{"label":"Type"},"artist":{"label":"Artist"},"artwork_type":{"label":"Type"},"atm":{"label":"ATM"},"backrest":{"label":"Backrest"},"barrier":{"label":"Type"},"bath/open_air":{"label":"Open Air"},"bath/sand_bath":{"label":"Sand Bath"},"bath/type":{"label":"Specialty","options":{"onsen":"Japanese Onsen","foot_bath":"Foot Bath","hot_spring":"Hot Spring"}},"beauty":{"label":"Shop Type"},"bench":{"label":"Bench"},"bicycle_parking":{"label":"Type"},"bin":{"label":"Waste Bin"},"blood_components":{"label":"Blood Components","options":{"whole":"whole blood","plasma":"plasma","platelets":"platelets","stemcells":"stem cell samples"}},"board_type":{"label":"Type"},"boundary":{"label":"Type"},"brand":{"label":"Brand"},"building_area":{"label":"Building"},"building":{"label":"Building"},"bunker_type":{"label":"Type"},"camera/direction":{"label":"Direction (Degrees Clockwise)","placeholder":"45, 90, 180, 270"},"camera/mount":{"label":"Camera Mount"},"camera/type":{"label":"Camera Type","options":{"fixed":"Fixed","panning":"Panning","dome":"Dome"}},"capacity":{"label":"Capacity","placeholder":"50, 100, 200..."},"cardinal_direction":{"label":"Direction","options":{"N":"North","E":"East","S":"South","W":"West","NE":"Northeast","SE":"Southeast","SW":"Southwest","NW":"Northwest","NNE":"North-northeast","ENE":"East-northeast","ESE":"East-southeast","SSE":"South-southeast","SSW":"South-southwest","WSW":"West-southwest","WNW":"West-northwest","NNW":"North-northwest"}},"castle_type":{"label":"Type"},"clock_direction":{"label":"Direction","options":{"clockwise":"Clockwise","anticlockwise":"Counterclockwise"}},"club":{"label":"Type"},"collection_times":{"label":"Collection Times"},"communication_multi":{"label":"Communication Types"},"construction":{"label":"Type"},"contact/webcam":{"label":"Webcam URL","placeholder":"http://example.com/"},"content":{"label":"Contents"},"country":{"label":"Country"},"covered":{"label":"Covered"},"craft":{"label":"Type"},"crop":{"label":"Crops"},"crossing":{"label":"Type"},"cuisine":{"label":"Cuisines"},"currency_multi":{"label":"Currency Types"},"cycle_network":{"label":"Network"},"cycleway":{"label":"Bike Lanes","placeholder":"none","types":{"cycleway:left":"Left side","cycleway:right":"Right side"},"options":{"none":{"title":"None","description":"No bike lane"},"lane":{"title":"Standard bike lane","description":"A bike lane separated from auto traffic by a painted line"},"shared_lane":{"title":"Shared bike lane","description":"A bike lane with no separation from auto traffic"},"track":{"title":"Bike track","description":"A bike lane separated from traffic by a physical barrier"},"share_busway":{"title":"Bike lane shared with bus","description":"A bike lane shared with a bus lane"},"opposite_lane":{"title":"Opposite bike lane","description":"A bike lane that travels in the opposite direction of traffic"},"opposite":{"title":"Contraflow bike lane","description":"A bike lane that travels in both directions on a one-way street"}}},"date":{"label":"Date"},"delivery":{"label":"Delivery"},"denomination":{"label":"Denomination"},"denotation":{"label":"Denotation"},"description":{"label":"Description"},"diaper":{"label":"Diaper Changing Available"},"display":{"label":"Display"},"dock":{"label":"Type"},"drive_through":{"label":"Drive-Through"},"electrified":{"label":"Electrification","placeholder":"Contact Line, Electrified Rail...","options":{"contact_line":"Contact Line","rail":"Electrified Rail","yes":"Yes (unspecified)","no":"No"}},"elevation":{"label":"Elevation"},"email":{"label":"Email","placeholder":"example@example.com"},"emergency":{"label":"Emergency"},"entrance":{"label":"Type"},"except":{"label":"Exceptions"},"fax":{"label":"Fax","placeholder":"+31 42 123 4567"},"fee":{"label":"Fee"},"fence_type":{"label":"Type"},"fire_hydrant/position":{"label":"Position","options":{"lane":"Lane","parking_lot":"Parking Lot","sidewalk":"Sidewalk","green":"Green"}},"fire_hydrant/type":{"label":"Type","options":{"pillar":"Pillar/Aboveground","underground":"Underground","wall":"Wall","pond":"Pond"}},"fixme":{"label":"Fix Me"},"fuel_multi":{"label":"Fuel Types"},"fuel":{"label":"Fuel"},"gauge":{"label":"Gauge"},"gender":{"label":"Gender","placeholder":"Unknown","options":{"male":"Male","female":"Female","unisex":"Unisex"}},"generator/method":{"label":"Method"},"generator/source":{"label":"Source"},"generator/type":{"label":"Type"},"golf_hole":{"label":"Reference","placeholder":"Hole number (1-18)"},"grape_variety":{"label":"Grape Varieties"},"handicap":{"label":"Handicap","placeholder":"1-18"},"handrail":{"label":"Handrail"},"height":{"label":"Height (Meters)"},"highway":{"label":"Type"},"historic":{"label":"Type"},"historic/civilization":{"label":"Historic Civilization"},"hoops":{"label":"Hoops","placeholder":"1, 2, 4..."},"iata":{"label":"IATA"},"icao":{"label":"ICAO"},"incline_steps":{"label":"Incline","options":{"up":"Up","down":"Down"}},"incline":{"label":"Incline"},"indoor":{"label":"Indoor"},"information":{"label":"Type"},"inscription":{"label":"Inscription"},"internet_access":{"label":"Internet Access","options":{"yes":"Yes","no":"No","wlan":"Wifi","wired":"Wired","terminal":"Terminal"}},"internet_access/fee":{"label":"Internet Access Fee"},"internet_access/ssid":{"label":"SSID (Network Name)"},"kerb":{"label":"Curb"},"label":{"label":"Label"},"lamp_type":{"label":"Type"},"landuse":{"label":"Type"},"lanes":{"label":"Lanes","placeholder":"1, 2, 3..."},"layer":{"label":"Layer"},"leaf_cycle_singular":{"label":"Leaf Cycle","options":{"evergreen":"Evergreen","deciduous":"Deciduous","semi_evergreen":"Semi-Evergreen","semi_deciduous":"Semi-Deciduous"}},"leaf_cycle":{"label":"Leaf Cycle","options":{"evergreen":"Evergreen","deciduous":"Deciduous","semi_evergreen":"Semi-Evergreen","semi_deciduous":"Semi-Deciduous","mixed":"Mixed"}},"leaf_type_singular":{"label":"Leaf Type","options":{"broadleaved":"Broadleaved","needleleaved":"Needleleaved","leafless":"Leafless"}},"leaf_type":{"label":"Leaf Type","options":{"broadleaved":"Broadleaved","needleleaved":"Needleleaved","mixed":"Mixed","leafless":"Leafless"}},"leisure":{"label":"Type"},"length":{"label":"Length (Meters)"},"level":{"label":"Level"},"levels":{"label":"Levels","placeholder":"2, 4, 6..."},"lit":{"label":"Lit"},"location":{"label":"Location"},"man_made":{"label":"Type"},"manhole":{"label":"Type"},"map_size":{"label":"Coverage"},"map_type":{"label":"Type"},"maxheight":{"label":"Max Height","placeholder":"4, 4.5, 5, 14'0\", 14'6\", 15'0\""},"maxspeed":{"label":"Speed Limit","placeholder":"40, 50, 60..."},"maxstay":{"label":"Max Stay"},"maxweight":{"label":"Max Weight"},"mtb/scale":{"label":"Mountain Biking Difficulty","placeholder":"0, 1, 2, 3...","options":{"0":"0: Solid gravel/packed earth, no obstacles, wide curves","1":"1: Some loose surface, small obstacles, wide curves","2":"2: Much loose surface, large obstacles, easy hairpins","3":"3: Slippery surface, large obstacles, tight hairpins","4":"4: Loose surface or boulders, dangerous hairpins","5":"5: Maximum difficulty, boulder fields, landslides","6":"6: Not rideable except by the very best mountain bikers"}},"mtb/scale/imba":{"label":"IMBA Trail Difficulty","placeholder":"Easy, Medium, Difficult...","options":{"0":"Easiest (white circle)","1":"Easy (green circle)","2":"Medium (blue square)","3":"Difficult (black diamond)","4":"Extremely Difficult (double black diamond)"}},"mtb/scale/uphill":{"label":"Mountain Biking Uphill Difficulty","placeholder":"0, 1, 2, 3...","options":{"0":"0: Avg. incline <10%, gravel/packed earth, no obstacles","1":"1: Avg. incline <15%, gravel/packed earth, few small objects","2":"2: Avg. incline <20%, stable surface, fistsize rocks/roots","3":"3: Avg. incline <25%, variable surface, fistsize rocks/branches","4":"4: Avg. incline <30%, poor condition, big rocks/branches","5":"5: Very steep, bike generally needs to be pushed or carried"}},"name":{"label":"Name","placeholder":"Common name (if any)"},"natural":{"label":"Natural"},"network_bicycle":{"label":"Network Type","placeholder":"Local, Regional, National, International","options":{"lcn":"Local","rcn":"Regional","ncn":"National","icn":"International"}},"network_foot":{"label":"Network Type","placeholder":"Local, Regional, National, International","options":{"lwn":"Local","rwn":"Regional","nwn":"National","iwn":"International"}},"network_horse":{"label":"Network Type","placeholder":"Local, Regional, National, International","options":{"lhn":"Local","rhn":"Regional","nhn":"National","ihn":"International"}},"network_road":{"label":"Network"},"network":{"label":"Network"},"note":{"label":"Note"},"office":{"label":"Type"},"oneway_yes":{"label":"One Way","options":{"undefined":"Assumed to be Yes","yes":"Yes","no":"No"}},"oneway":{"label":"One Way","options":{"undefined":"Assumed to be No","yes":"Yes","no":"No"}},"opening_hours":{"label":"Hours"},"operator":{"label":"Operator"},"outdoor_seating":{"label":"Outdoor Seating"},"par":{"label":"Par","placeholder":"3, 4, 5..."},"parallel_direction":{"label":"Direction","options":{"forward":"Forward","backward":"Backward"}},"park_ride":{"label":"Park and Ride"},"parking":{"label":"Type","options":{"surface":"Surface","multi-storey":"Multilevel","underground":"Underground","sheds":"Sheds","carports":"Carports","garage_boxes":"Garage Boxes","lane":"Roadside Lane"}},"payment_multi":{"label":"Payment Types"},"phone":{"label":"Phone","placeholder":"+31 42 123 4567"},"piste/difficulty":{"label":"Difficulty","placeholder":"Easy, Intermediate, Advanced...","options":{"novice":"Novice (instructional)","easy":"Easy (green circle)","intermediate":"Intermediate (blue square)","advanced":"Advanced (black diamond)","expert":"Expert (double black diamond)","freeride":"Freeride (off-piste)","extreme":"Extreme (climbing equipment required)"}},"piste/grooming":{"label":"Grooming","options":{"classic":"Classic","mogul":"Mogul","backcountry":"Backcountry","classic+skating":"Classic and Skating","scooter":"Scooter/Snowmobile","skating":"Skating"}},"piste/type":{"label":"Type","options":{"downhill":"Downhill","nordic":"Nordic","skitour":"Skitour","sled":"Sled","hike":"Hike","sleigh":"Sleigh","ice_skate":"Ice Skate","snow_park":"Snow Park","playground":"Playground"}},"place":{"label":"Type"},"plant":{"label":"Plant"},"population":{"label":"Population"},"power_supply":{"label":"Power Supply"},"power":{"label":"Type"},"produce":{"label":"Produce"},"product":{"label":"Products"},"railway":{"label":"Type"},"recycling_accepts":{"label":"Accepts"},"recycling_type":{"label":"Recycling Type","options":{"container":"Container","centre":"Recycling Center"}},"ref":{"label":"Reference"},"relation":{"label":"Type"},"religion":{"label":"Religion"},"restriction":{"label":"Type"},"restrictions":{"label":"Turn Restrictions"},"rooms":{"label":"Rooms"},"route_master":{"label":"Type"},"route":{"label":"Type"},"sac_scale":{"label":"Hiking Difficulty","placeholder":"Mountain Hiking, Alpine Hiking...","options":{"hiking":"T1: Hiking","mountain_hiking":"T2: Mountain Hiking","demanding_mountain_hiking":"T3: Demanding Mountain Hiking","alpine_hiking":"T4: Alpine Hiking","demanding_alpine_hiking":"T5: Demanding Alpine Hiking","difficult_alpine_hiking":"T6: Difficult Alpine Hiking"}},"sanitary_dump_station":{"label":"Toilet Disposal"},"seasonal":{"label":"Seasonal"},"second_hand":{"label":"Sells Used","placeholder":"Yes, No, Only","options":{"yes":"Yes","no":"No","only":"Only"}},"service_rail":{"label":"Service Type","options":{"spur":"Spur","yard":"Yard","siding":"Siding","crossover":"Crossover"}},"service_times":{"label":"Service Times"},"service":{"label":"Type"},"service/bicycle":{"label":"Services"},"service/vehicle":{"label":"Services"},"shelter_type":{"label":"Type"},"shelter":{"label":"Shelter"},"shop":{"label":"Type"},"site":{"label":"Type"},"smoking":{"label":"Smoking","placeholder":"No, Separated, Yes...","options":{"no":"No smoking anywhere","separated":"In smoking areas, not physically isolated","isolated":"In smoking areas, physically isolated","outside":"Allowed outside","yes":"Allowed everywhere","dedicated":"Dedicated to smokers (e.g. smokers' club)"}},"smoothness":{"label":"Smoothness","placeholder":"Thin Rollers, Wheels, Off-Road...","options":{"excellent":"Thin Rollers: rollerblade, skateboard","good":"Thin Wheels: racing bike","intermediate":"Wheels: city bike, wheelchair, scooter","bad":"Robust Wheels: trekking bike, car, rickshaw","very_bad":"High Clearance: light duty off-road vehicle","horrible":"Off-Road: heavy duty off-road vehicle","very_horrible":"Specialized off-road: tractor, ATV","impassable":"Impassable / No wheeled vehicle"}},"social_facility_for":{"label":"People Served"},"social_facility":{"label":"Type"},"source":{"label":"Source"},"sport_ice":{"label":"Sports"},"sport_racing_motor":{"label":"Sports"},"sport_racing_nonmotor":{"label":"Sports"},"sport":{"label":"Sports"},"stars":{"label":"Stars"},"start_date":{"label":"Start Date"},"step_count":{"label":"Number of Steps"},"stop":{"label":"Stop Type","options":{"all":"All Ways","minor":"Minor Road"}},"structure":{"label":"Structure","placeholder":"Unknown","options":{"bridge":"Bridge","tunnel":"Tunnel","embankment":"Embankment","cutting":"Cutting","ford":"Ford"}},"studio":{"label":"Type"},"substation":{"label":"Type"},"supervised":{"label":"Supervised"},"support":{"label":"Support"},"surface":{"label":"Surface"},"surveillance":{"label":"Surveillance Kind"},"surveillance/type":{"label":"Surveillance Type","options":{"camera":"Camera","guard":"Guard","ALPR":"Automatic License Plate Reader"}},"surveillance/zone":{"label":"Surveillance Zone"},"tactile_paving":{"label":"Tactile Paving"},"takeaway":{"label":"Takeaway","placeholder":"Yes, No, Takeaway Only...","options":{"yes":"Yes","no":"No","only":"Takeaway Only"}},"toilets/disposal":{"label":"Disposal","options":{"flush":"Flush","pitlatrine":"Pit/Latrine","chemical":"Chemical","bucket":"Bucket"}},"toll":{"label":"Toll"},"tomb":{"label":"Type"},"tourism":{"label":"Type"},"tower/construction":{"label":"Construction","placeholder":"Guyed, Lattice, Concealed, ..."},"tower/type":{"label":"Type"},"tracktype":{"label":"Track Type","placeholder":"Solid, Mostly Solid, Soft...","options":{"grade1":"Solid: paved or heavily compacted hardcore surface","grade2":"Mostly Solid: gravel/rock with some soft material mixed in","grade3":"Even mixture of hard and soft materials","grade4":"Mostly Soft: soil/sand/grass with some hard material mixed in","grade5":"Soft: soil/sand/grass"}},"traffic_calming":{"label":"Type"},"traffic_signals":{"label":"Type"},"trail_visibility":{"label":"Trail Visibility","placeholder":"Excellent, Good, Bad...","options":{"excellent":"Excellent: unambiguous path or markers everywhere","good":"Good: markers visible, sometimes require searching","intermediate":"Intermediate: few markers, path mostly visible","bad":"Bad: no markers, path sometimes invisible/pathless","horrible":"Horrible: often pathless, some orientation skills required","no":"No: pathless, excellent orientation skills required"}},"trees":{"label":"Trees"},"tunnel":{"label":"Tunnel"},"vending":{"label":"Type of Goods"},"visibility":{"label":"Visibility","options":{"house":"Up to 5m (16ft)","street":"5 to 20m (16 to 65ft)","area":"Over 20m (65ft)"}},"wall":{"label":"Type"},"water_point":{"label":"Water Point"},"water":{"label":"Type"},"waterway":{"label":"Type"},"website":{"label":"Website","placeholder":"http://example.com/"},"wetland":{"label":"Type"},"wheelchair":{"label":"Wheelchair Access"},"width":{"label":"Width (Meters)"},"wikipedia":{"label":"Wikipedia"}},"presets":{"aerialway":{"name":"Aerialway","terms":"ski lift,funifor,funitel"},"aeroway":{"name":"Aeroway","terms":""},"amenity":{"name":"Amenity","terms":""},"highway":{"name":"Highway","terms":""},"place":{"name":"Place","terms":""},"power":{"name":"Power","terms":""},"railway":{"name":"Railway","terms":""},"roundabout":{"name":"Roundabout","terms":""},"waterway":{"name":"Waterway","terms":""},"address":{"name":"Address","terms":""},"advertising/billboard":{"name":"Billboard","terms":""},"aerialway/cable_car":{"name":"Cable Car","terms":"tramway,ropeway"},"aerialway/chair_lift":{"name":"Chair Lift","terms":""},"aerialway/drag_lift":{"name":"Drag Lift","terms":""},"aerialway/gondola":{"name":"Gondola","terms":""},"aerialway/goods":{"name":"Goods Aerialway","terms":""},"aerialway/magic_carpet":{"name":"Magic Carpet Lift","terms":""},"aerialway/mixed_lift":{"name":"Mixed Lift","terms":""},"aerialway/platter":{"name":"Platter Lift","terms":"button lift,poma lift"},"aerialway/pylon":{"name":"Aerialway Pylon","terms":""},"aerialway/rope_tow":{"name":"Rope Tow Lift","terms":"handle tow,bugel lift"},"aerialway/station":{"name":"Aerialway Station","terms":""},"aerialway/t-bar":{"name":"T-bar Lift","terms":""},"aeroway/aerodrome":{"name":"Airport","terms":"airplane,airport,aerodrome"},"aeroway/apron":{"name":"Apron","terms":"ramp"},"aeroway/gate":{"name":"Airport Gate","terms":""},"aeroway/hangar":{"name":"Hangar","terms":""},"aeroway/helipad":{"name":"Helipad","terms":"helicopter,helipad,heliport"},"aeroway/runway":{"name":"Runway","terms":"landing strip"},"aeroway/taxiway":{"name":"Taxiway","terms":""},"aeroway/terminal":{"name":"Airport Terminal","terms":"airport,aerodrome"},"amenity/coworking_space":{"name":"Coworking Space","terms":""},"amenity/nursing_home":{"name":"Nursing Home","terms":""},"amenity/register_office":{"name":"Register Office","terms":""},"amenity/swimming_pool":{"name":"Swimming Pool","terms":""},"amenity/animal_boarding":{"name":"Animal Boarding Facility","terms":"boarding,cat,dog,horse,kitten,pet boarding,pet care,pet hotel,puppy,reptile"},"amenity/animal_breeding":{"name":"Animal Breeding Facility","terms":"breeding,bull,cat,cow,dog,horse,husbandry,kitten,livestock,pet breeding,puppy,reptile"},"amenity/animal_shelter":{"name":"Animal Shelter","terms":"adoption,aspca,cat,dog,horse,kitten,pet care,pet rescue,puppy,raptor,reptile,rescue,spca"},"amenity/arts_centre":{"name":"Arts Center","terms":""},"amenity/atm":{"name":"ATM","terms":"money,cash,machine"},"amenity/bank":{"name":"Bank","terms":"credit union,check,deposit,fund,investment,repository,reserve,safe,savings,stock,treasury,trust,vault"},"amenity/bar":{"name":"Bar","terms":"dive,beer,bier,booze"},"amenity/bbq":{"name":"Barbecue/Grill","terms":"bbq,grill"},"amenity/bench":{"name":"Bench","terms":"seat"},"amenity/bicycle_parking":{"name":"Bicycle Parking","terms":"bike"},"amenity/bicycle_rental":{"name":"Bicycle Rental","terms":"bike"},"amenity/bicycle_repair_station":{"name":"Bicycle Repair Tool Stand","terms":"bike,repair,chain,pump"},"amenity/biergarten":{"name":"Beer Garden","terms":"beer,bier,booze"},"amenity/boat_rental":{"name":"Boat Rental","terms":""},"amenity/bureau_de_change":{"name":"Currency Exchange","terms":"bureau de change,money changer"},"amenity/bus_station":{"name":"Bus Station","terms":""},"amenity/cafe":{"name":"Cafe","terms":"bistro,coffee,tea"},"amenity/car_rental":{"name":"Car Rental","terms":""},"amenity/car_sharing":{"name":"Car Sharing","terms":""},"amenity/car_wash":{"name":"Car Wash","terms":""},"amenity/casino":{"name":"Casino","terms":"gambling,roulette,craps,poker,blackjack"},"amenity/charging_station":{"name":"Charging Station","terms":"EV,Electric Vehicle,Supercharger"},"amenity/childcare":{"name":"Nursery/Childcare","terms":"daycare,orphanage,playgroup"},"amenity/cinema":{"name":"Cinema","terms":"drive-in,film,flick,movie,theater,picture,show,screen"},"amenity/clinic":{"name":"Clinic","terms":"medical,urgentcare"},"amenity/clock":{"name":"Clock","terms":""},"amenity/college":{"name":"College Grounds","terms":"university"},"amenity/community_centre":{"name":"Community Center","terms":"event,hall"},"amenity/compressed_air":{"name":"Compressed Air","terms":""},"amenity/courthouse":{"name":"Courthouse","terms":""},"amenity/crematorium":{"name":"Crematorium","terms":"cemetery,funeral"},"amenity/dentist":{"name":"Dentist","terms":"tooth,teeth"},"amenity/doctors":{"name":"Doctor","terms":"medic*"},"amenity/dojo":{"name":"Dojo / Martial Arts Academy","terms":"martial arts,dojang"},"amenity/drinking_water":{"name":"Drinking Water","terms":"fountain,potable"},"amenity/driving_school":{"name":"Driving School","terms":""},"amenity/embassy":{"name":"Embassy","terms":""},"amenity/fast_food":{"name":"Fast Food","terms":"restaurant,takeaway"},"amenity/ferry_terminal":{"name":"Ferry Terminal","terms":""},"amenity/fire_station":{"name":"Fire Station","terms":""},"amenity/food_court":{"name":"Food Court","terms":"fast food,restaurant,food"},"amenity/fountain":{"name":"Fountain","terms":""},"amenity/fuel":{"name":"Gas Station","terms":"petrol,fuel,gasoline,propane,diesel,lng,cng,biodiesel"},"amenity/grave_yard":{"name":"Graveyard","terms":""},"amenity/grit_bin":{"name":"Grit Bin","terms":"salt,sand"},"amenity/hospital":{"name":"Hospital Grounds","terms":"clinic,doctor,emergency room,health,infirmary,institution,sanatorium,sanitarium,sick,surgery,ward"},"amenity/hunting_stand":{"name":"Hunting Stand","terms":"game,gun,lookout,rifle,shoot*,wild,watch"},"amenity/ice_cream":{"name":"Ice Cream Shop","terms":"gelato,sorbet,sherbet,frozen,yogurt"},"amenity/internet_cafe":{"name":"Internet Cafe","terms":"cybercafe,taxiphone,teleboutique,coffee,cafe,net,lanhouse"},"amenity/kindergarten":{"name":"Preschool/Kindergarten Grounds","terms":"kindergarden,pre-school"},"amenity/library":{"name":"Library","terms":"book"},"amenity/marketplace":{"name":"Marketplace","terms":""},"amenity/motorcycle_parking":{"name":"Motorcycle Parking","terms":""},"amenity/nightclub":{"name":"Nightclub","terms":"disco*,night club,dancing,dance club"},"amenity/parking_entrance":{"name":"Parking Garage Entrance/Exit","terms":""},"amenity/parking_space":{"name":"Parking Space","terms":""},"amenity/parking":{"name":"Car Parking","terms":""},"amenity/pavilion":{"name":"Pavilion","terms":""},"amenity/pharmacy":{"name":"Pharmacy","terms":"drug*,med*,prescription"},"amenity/place_of_worship":{"name":"Place of Worship","terms":"abbey,basilica,bethel,cathedral,chancel,chantry,chapel,church,fold,house of God,house of prayer,house of worship,minster,mission,mosque,oratory,parish,sacellum,sanctuary,shrine,synagogue,tabernacle,temple"},"amenity/place_of_worship/buddhist":{"name":"Buddhist Temple","terms":"stupa,vihara,monastery,temple,pagoda,zendo,dojo"},"amenity/place_of_worship/christian":{"name":"Church","terms":"christian,abbey,basilica,bethel,cathedral,chancel,chantry,chapel,fold,house of God,house of prayer,house of worship,minster,mission,oratory,parish,sacellum,sanctuary,shrine,tabernacle,temple"},"amenity/place_of_worship/jewish":{"name":"Synagogue","terms":"jewish"},"amenity/place_of_worship/muslim":{"name":"Mosque","terms":"muslim"},"amenity/planetarium":{"name":"Planetarium","terms":"museum,astronomy,observatory"},"amenity/police":{"name":"Police","terms":"badge,constable,constabulary,cop,detective,fed,law,enforcement,officer,patrol"},"amenity/post_box":{"name":"Mailbox","terms":"letter,post"},"amenity/post_office":{"name":"Post Office","terms":"letter,mail"},"amenity/prison":{"name":"Prison Grounds","terms":"cell,jail"},"amenity/pub":{"name":"Pub","terms":"alcohol,drink,dive,beer,bier,booze"},"amenity/public_bath":{"name":"Public Bath","terms":"onsen,foot bath,hot springs"},"amenity/public_bookcase":{"name":"Public Bookcase","terms":"library,bookcrossing"},"amenity/ranger_station":{"name":"Ranger Station","terms":"visitor center,visitor centre,permit center,permit centre,backcountry office,warden office,warden center"},"amenity/recycling_centre":{"name":"Recycling Center","terms":"bottle,can,dump,glass,garbage,rubbish,scrap,trash"},"amenity/recycling":{"name":"Recycling","terms":"bin,can,bottle,glass,garbage,rubbish,scrap,trash"},"amenity/restaurant":{"name":"Restaurant","terms":"bar,breakfast,cafe,café,canteen,coffee,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/sanitary_dump_station":{"name":"RV Toilet Disposal","terms":"Motor Home,Camper,Sanitary,Dump Station,Elsan,CDP,CTDP,Chemical Toilet"},"amenity/school":{"name":"School Grounds","terms":"academy,elementary school,middle school,high school"},"amenity/scrapyard":{"name":"Scrap Yard","terms":"car,junk,metal,salvage,scrap,u-pull-it,vehicle,wreck,yard"},"amenity/shelter":{"name":"Shelter","terms":"lean-to,gazebo,picnic"},"amenity/social_facility":{"name":"Social Facility","terms":""},"amenity/social_facility/food_bank":{"name":"Food Bank","terms":""},"amenity/social_facility/group_home":{"name":"Elderly Group Home","terms":"old,senior,living"},"amenity/social_facility/homeless_shelter":{"name":"Homeless Shelter","terms":"houseless,unhoused,displaced"},"amenity/social_facility/nursing_home":{"name":"Nursing Home","terms":"elderly,living,nursing,old,senior"},"amenity/studio":{"name":"Studio","terms":"recording,radio,television"},"amenity/taxi":{"name":"Taxi Stand","terms":"cab"},"amenity/telephone":{"name":"Telephone","terms":"phone"},"amenity/theatre":{"name":"Theater","terms":"theatre,performance,play,musical"},"amenity/toilets":{"name":"Toilets","terms":"bathroom,restroom,outhouse,privy,head,lavatory,latrine,water closet,WC,W.C."},"amenity/townhall":{"name":"Town Hall","terms":"village,city,government,courthouse,municipal"},"amenity/university":{"name":"University Grounds","terms":"college"},"amenity/vending_machine":{"name":"Vending Machine","terms":""},"amenity/vending_machine/news_papers":{"name":"Newspaper Vending Machine","terms":"newspaper"},"amenity/vending_machine/cigarettes":{"name":"Cigarette Vending Machine","terms":"cigarette"},"amenity/vending_machine/condoms":{"name":"Condom Vending Machine","terms":"condom"},"amenity/vending_machine/drinks":{"name":"Drink Vending Machine","terms":"drink,soda,beverage,juice,pop"},"amenity/vending_machine/excrement_bags":{"name":"Excrement Bag Vending Machine","terms":"excrement bags,poop,dog,animal"},"amenity/vending_machine/newspapers":{"name":"Newspaper Vending Machine","terms":"newspaper"},"amenity/vending_machine/parcel_pickup_dropoff":{"name":"Parcel Pickup/Dropoff Vending Machine","terms":"parcel,mail,pickup"},"amenity/vending_machine/parking_tickets":{"name":"Parking Ticket Vending Machine","terms":"parking,ticket"},"amenity/vending_machine/public_transport_tickets":{"name":"Transit Ticket Vending Machine","terms":"bus,train,ferry,rail,ticket,transportation"},"amenity/vending_machine/sweets":{"name":"Snack Vending Machine","terms":"candy,gum,chip,pretzel,cookie,cracker"},"amenity/veterinary":{"name":"Veterinary","terms":"pet clinic,veterinarian,animal hospital,pet doctor"},"amenity/waste_basket":{"name":"Waste Basket","terms":"bin,garbage,rubbish,litter,trash"},"amenity/waste_disposal":{"name":"Garbage Dumpster","terms":"garbage,rubbish,litter,trash"},"amenity/waste_transfer_station":{"name":"Waste Transfer Station","terms":"dump,garbage,recycling,rubbish,scrap,trash"},"amenity/water_point":{"name":"RV Drinking Water","terms":""},"amenity/watering_place":{"name":"Animal Watering Place","terms":""},"area":{"name":"Area","terms":""},"area/highway":{"name":"Road Surface","terms":""},"barrier":{"name":"Barrier","terms":""},"barrier/entrance":{"name":"Entrance","terms":""},"barrier/block":{"name":"Block","terms":""},"barrier/bollard":{"name":"Bollard","terms":""},"barrier/border_control":{"name":"Border Control","terms":""},"barrier/cattle_grid":{"name":"Cattle Grid","terms":""},"barrier/city_wall":{"name":"City Wall","terms":""},"barrier/cycle_barrier":{"name":"Cycle Barrier","terms":""},"barrier/ditch":{"name":"Trench","terms":""},"barrier/fence":{"name":"Fence","terms":""},"barrier/gate":{"name":"Gate","terms":""},"barrier/hedge":{"name":"Hedge","terms":""},"barrier/kissing_gate":{"name":"Kissing Gate","terms":""},"barrier/lift_gate":{"name":"Lift Gate","terms":""},"barrier/retaining_wall":{"name":"Retaining Wall","terms":""},"barrier/stile":{"name":"Stile","terms":""},"barrier/toll_booth":{"name":"Toll Booth","terms":""},"barrier/wall":{"name":"Wall","terms":""},"boundary/administrative":{"name":"Administrative Boundary","terms":""},"building":{"name":"Building","terms":""},"building/bunker":{"name":"Bunker","terms":""},"building/entrance":{"name":"Entrance/Exit","terms":""},"building/train_station":{"name":"Train Station","terms":""},"building/apartments":{"name":"Apartments","terms":""},"building/barn":{"name":"Barn","terms":""},"building/cabin":{"name":"Cabin","terms":""},"building/cathedral":{"name":"Cathedral Building","terms":""},"building/chapel":{"name":"Chapel Building","terms":""},"building/church":{"name":"Church Building","terms":""},"building/college":{"name":"College Building","terms":"university"},"building/commercial":{"name":"Commercial Building","terms":""},"building/construction":{"name":"Building Under Construction","terms":""},"building/detached":{"name":"Detached House","terms":"home,single,family,residence,dwelling"},"building/dormitory":{"name":"Dormitory","terms":""},"building/garage":{"name":"Garage","terms":""},"building/garages":{"name":"Garages","terms":""},"building/greenhouse":{"name":"Greenhouse","terms":""},"building/hospital":{"name":"Hospital Building","terms":""},"building/hotel":{"name":"Hotel Building","terms":""},"building/house":{"name":"House","terms":"home,family,residence,dwelling"},"building/hut":{"name":"Hut","terms":""},"building/industrial":{"name":"Industrial Building","terms":""},"building/kindergarten":{"name":"Preschool/Kindergarten Building","terms":"kindergarden,pre-school"},"building/public":{"name":"Public Building","terms":""},"building/residential":{"name":"Residential Building","terms":""},"building/retail":{"name":"Retail Building","terms":""},"building/roof":{"name":"Roof","terms":""},"building/school":{"name":"School Building","terms":"academy,elementary school,middle school,high school"},"building/semidetached_house":{"name":"Semi-Detached House","terms":"home,double,duplex,twin,family,residence,dwelling"},"building/shed":{"name":"Shed","terms":""},"building/stable":{"name":"Stable","terms":""},"building/static_caravan":{"name":"Static Mobile Home","terms":""},"building/terrace":{"name":"Row Houses","terms":"home,terrace,brownstone,family,residence,dwelling"},"building/university":{"name":"University Building","terms":"college"},"building/warehouse":{"name":"Warehouse","terms":""},"camp_site/camp_pitch":{"name":"Camp Pitch","terms":"tent,rv"},"club":{"name":"Club","terms":"social"},"craft":{"name":"Craft","terms":""},"craft/jeweler":{"name":"Jeweler","terms":""},"craft/locksmith":{"name":"Locksmith","terms":""},"craft/optician":{"name":"Optician","terms":""},"craft/tailor":{"name":"Tailor","terms":"clothes,suit"},"craft/basket_maker":{"name":"Basket Maker","terms":""},"craft/beekeeper":{"name":"Beekeeper","terms":""},"craft/blacksmith":{"name":"Blacksmith","terms":""},"craft/boatbuilder":{"name":"Boat Builder","terms":""},"craft/bookbinder":{"name":"Bookbinder","terms":"book repair"},"craft/brewery":{"name":"Brewery","terms":"alcohol,beer,beverage,bier,booze,cider"},"craft/carpenter":{"name":"Carpenter","terms":"woodworker"},"craft/carpet_layer":{"name":"Carpet Layer","terms":""},"craft/caterer":{"name":"Caterer","terms":""},"craft/clockmaker":{"name":"Clockmaker","terms":""},"craft/confectionery":{"name":"Confectionery","terms":"sweets,candy"},"craft/distillery":{"name":"Distillery","terms":"alcohol,beverage,bourbon,booze,brandy,gin,hooch,liquor,mezcal,moonshine,rum,scotch,spirits,still,tequila,vodka,whiskey,whisky"},"craft/dressmaker":{"name":"Dressmaker","terms":"seamstress"},"craft/electrician":{"name":"Electrician","terms":"power,wire"},"craft/electronics_repair":{"name":"Electronics Repair Shop","terms":""},"craft/gardener":{"name":"Gardener","terms":"landscaper,grounds keeper"},"craft/glaziery":{"name":"Glaziery","terms":"glass,stained-glass,window"},"craft/handicraft":{"name":"Handicraft","terms":""},"craft/hvac":{"name":"HVAC","terms":"heat*,vent*,air conditioning"},"craft/insulator":{"name":"Insulator","terms":""},"craft/key_cutter":{"name":"Key Cutter","terms":""},"craft/metal_construction":{"name":"Metal Construction","terms":""},"craft/painter":{"name":"Painter","terms":""},"craft/photographer":{"name":"Photographer","terms":""},"craft/photographic_laboratory":{"name":"Photographic Laboratory","terms":"film"},"craft/plasterer":{"name":"Plasterer","terms":""},"craft/plumber":{"name":"Plumber","terms":"pipe"},"craft/pottery":{"name":"Pottery","terms":"ceramic"},"craft/rigger":{"name":"Rigger","terms":""},"craft/roofer":{"name":"Roofer","terms":""},"craft/saddler":{"name":"Saddler","terms":""},"craft/sailmaker":{"name":"Sailmaker","terms":""},"craft/sawmill":{"name":"Sawmill","terms":"lumber"},"craft/scaffolder":{"name":"Scaffolder","terms":""},"craft/sculpter":{"name":"Sculpter","terms":""},"craft/shoemaker":{"name":"Shoemaker","terms":"cobbler"},"craft/stonemason":{"name":"Stonemason","terms":"masonry"},"craft/sweep":{"name":"Chimney Sweep","terms":""},"craft/tiler":{"name":"Tiler","terms":""},"craft/tinsmith":{"name":"Tinsmith","terms":""},"craft/upholsterer":{"name":"Upholsterer","terms":""},"craft/watchmaker":{"name":"Watchmaker","terms":""},"craft/window_construction":{"name":"Window Construction","terms":"glass"},"craft/winery":{"name":"Winery","terms":""},"embankment":{"name":"Embankment","terms":""},"emergency/designated":{"name":"Emergency Access Designated","terms":""},"emergency/destination":{"name":"Emergency Access Destination","terms":""},"emergency/no":{"name":"Emergency Access No","terms":""},"emergency/official":{"name":"Emergency Access Official","terms":""},"emergency/private":{"name":"Emergency Access Private","terms":""},"emergency/yes":{"name":"Emergency Access Yes","terms":""},"emergency/ambulance_station":{"name":"Ambulance Station","terms":"EMS,EMT,rescue"},"emergency/defibrillator":{"name":"Defibrillator","terms":"AED"},"emergency/fire_hydrant":{"name":"Fire Hydrant","terms":"fire plug"},"emergency/phone":{"name":"Emergency Phone","terms":""},"entrance":{"name":"Entrance/Exit","terms":""},"footway/crossing":{"name":"Street Crossing","terms":""},"footway/crosswalk":{"name":"Pedestrian Crosswalk","terms":"zebra crossing"},"footway/sidewalk":{"name":"Sidewalk","terms":""},"ford":{"name":"Ford","terms":""},"golf/bunker":{"name":"Sand Trap","terms":"hazard,bunker"},"golf/fairway":{"name":"Fairway","terms":""},"golf/green":{"name":"Putting Green","terms":""},"golf/hole":{"name":"Golf Hole","terms":""},"golf/lateral_water_hazard_area":{"name":"Lateral Water Hazard","terms":""},"golf/lateral_water_hazard_line":{"name":"Lateral Water Hazard","terms":""},"golf/rough":{"name":"Rough","terms":""},"golf/tee":{"name":"Tee Box","terms":"teeing ground"},"golf/water_hazard_area":{"name":"Water Hazard","terms":""},"golf/water_hazard_line":{"name":"Water Hazard","terms":""},"healthcare/blood_donation":{"name":"Blood Donor Center","terms":"blood bank,blood donation,blood transfusion,apheresis,plasmapheresis,plateletpheresis,stem cell donation"},"highway/bridleway":{"name":"Bridle Path","terms":"bridleway,equestrian,horse"},"highway/bus_stop":{"name":"Bus Stop","terms":""},"highway/corridor":{"name":"Indoor Corridor","terms":"gallery,hall,hallway,indoor,passage,passageway"},"highway/crossing":{"name":"Street Crossing","terms":""},"highway/crosswalk":{"name":"Pedestrian Crosswalk","terms":"zebra crossing"},"highway/cycleway":{"name":"Cycle Path","terms":"bike"},"highway/elevator":{"name":"Elevator","terms":"lift"},"highway/footway":{"name":"Foot Path","terms":"hike,hiking,trackway,trail,walk"},"highway/give_way":{"name":"Yield Sign","terms":"give way,yield,sign"},"highway/living_street":{"name":"Living Street","terms":""},"highway/mini_roundabout":{"name":"Mini-Roundabout","terms":""},"highway/motorway_junction":{"name":"Motorway Junction / Exit","terms":""},"highway/motorway_link":{"name":"Motorway Link","terms":"ramp,on ramp,off ramp"},"highway/motorway":{"name":"Motorway","terms":"autobahn,expressway,freeway,highway,interstate,parkway,thruway,turnpike"},"highway/path":{"name":"Path","terms":"hike,hiking,trackway,trail,walk"},"highway/pedestrian":{"name":"Pedestrian Street","terms":""},"highway/primary_link":{"name":"Primary Link","terms":"ramp,on ramp,off ramp"},"highway/primary":{"name":"Primary Road","terms":""},"highway/raceway":{"name":"Racetrack (Motorsport)","terms":"auto*,formula one,kart,motocross,nascar,race*,track"},"highway/residential":{"name":"Residential Road","terms":""},"highway/rest_area":{"name":"Rest Area","terms":"rest stop"},"highway/road":{"name":"Unknown Road","terms":""},"highway/secondary_link":{"name":"Secondary Link","terms":"ramp,on ramp,off ramp"},"highway/secondary":{"name":"Secondary Road","terms":""},"highway/service":{"name":"Service Road","terms":""},"highway/service/alley":{"name":"Alley","terms":""},"highway/service/drive-through":{"name":"Drive-Through","terms":""},"highway/service/driveway":{"name":"Driveway","terms":""},"highway/service/emergency_access":{"name":"Emergency Access","terms":""},"highway/service/parking_aisle":{"name":"Parking Aisle","terms":""},"highway/services":{"name":"Service Area","terms":"services,travel plaza,service station"},"highway/speed_camera":{"name":"Speed Camera","terms":""},"highway/steps":{"name":"Steps","terms":"stairs,staircase"},"highway/stop":{"name":"Stop Sign","terms":"stop,halt,sign"},"highway/street_lamp":{"name":"Street Lamp","terms":"streetlight,street light,lamp,light,gaslight"},"highway/tertiary_link":{"name":"Tertiary Link","terms":"ramp,on ramp,off ramp"},"highway/tertiary":{"name":"Tertiary Road","terms":""},"highway/track":{"name":"Unmaintained Track Road","terms":"woods road,forest road,logging road,fire road,farm road,agricultural road,ranch road,carriage road,primitive,unmaintained,rut,offroad,4wd,4x4,four wheel drive,atv,quad,jeep,double track,two track"},"highway/traffic_mirror":{"name":"Traffic Mirror","terms":"blind spot,convex,corner,curved,roadside,round,safety,sphere,visibility"},"highway/traffic_signals":{"name":"Traffic Signals","terms":"light,stoplight,traffic light"},"highway/trunk_link":{"name":"Trunk Link","terms":"ramp,on ramp,off ramp"},"highway/trunk":{"name":"Trunk Road","terms":""},"highway/turning_circle":{"name":"Turning Circle","terms":"cul-de-sac"},"highway/turning_loop":{"name":"Turning Loop (Island)","terms":"cul-de-sac"},"highway/unclassified":{"name":"Minor/Unclassified Road","terms":""},"historic":{"name":"Historic Site","terms":""},"historic/archaeological_site":{"name":"Archaeological Site","terms":""},"historic/boundary_stone":{"name":"Boundary Stone","terms":""},"historic/castle":{"name":"Castle","terms":""},"historic/memorial":{"name":"Memorial","terms":""},"historic/monument":{"name":"Monument","terms":""},"historic/ruins":{"name":"Ruins","terms":""},"historic/tomb":{"name":"Tomb","terms":""},"historic/wayside_cross":{"name":"Wayside Cross","terms":""},"historic/wayside_shrine":{"name":"Wayside Shrine","terms":""},"junction":{"name":"Junction","terms":""},"landuse":{"name":"Land Use","terms":""},"landuse/farm":{"name":"Farmland","terms":""},"landuse/allotments":{"name":"Community Garden","terms":"allotment,garden"},"landuse/aquaculture":{"name":"Aquaculture","terms":"fish farm,crustacean,algae,aquafarming,shrimp farm,oyster farm,mariculture,algaculture"},"landuse/basin":{"name":"Basin","terms":""},"landuse/cemetery":{"name":"Cemetery","terms":""},"landuse/churchyard":{"name":"Churchyard","terms":""},"landuse/commercial":{"name":"Commercial Area","terms":""},"landuse/construction":{"name":"Construction","terms":""},"landuse/farmland":{"name":"Farmland","terms":"crop,grow,plant"},"landuse/farmyard":{"name":"Farmyard","terms":"crop,grow,plant"},"landuse/forest":{"name":"Forest","terms":"tree"},"landuse/garages":{"name":"Garages","terms":""},"landuse/grass":{"name":"Grass","terms":""},"landuse/harbour":{"name":"Harbor","terms":"boat"},"landuse/industrial":{"name":"Industrial Area","terms":""},"landuse/landfill":{"name":"Landfill","terms":"dump"},"landuse/meadow":{"name":"Meadow","terms":""},"landuse/military":{"name":"Military Area","terms":""},"landuse/military/airfield":{"name":"Military Airfield","terms":"air force,army,base,bomb,fight,force,guard,heli*,jet,marine,navy,plane,troop,war"},"landuse/military/barracks":{"name":"Barracks","terms":"air force,army,base,fight,force,guard,marine,navy,troop,war"},"landuse/military/bunker":{"name":"Military Bunker","terms":"air force,army,base,fight,force,guard,marine,navy,troop,war"},"landuse/military/checkpoint":{"name":"Checkpoint","terms":"air force,army,base,force,guard,marine,navy,troop,war"},"landuse/military/danger_area":{"name":"Danger Area","terms":"air force,army,base,blast,bomb,explo*,force,guard,mine,marine,navy,troop,war"},"landuse/military/naval_base":{"name":"Naval Base","terms":"base,fight,force,guard,marine,navy,ship,sub,troop,war"},"landuse/military/nuclear_explosion_site":{"name":"Nuclear Explosion Site","terms":"atom,blast,bomb,detonat*,nuke,site,test"},"landuse/military/obstacle_course":{"name":"Obstacle Course","terms":"army,base,force,guard,marine,navy,troop,war"},"landuse/military/office":{"name":"Military Office","terms":"air force,army,base,enlist,fight,force,guard,marine,navy,recruit,troop,war"},"landuse/military/range":{"name":"Military Range","terms":"air force,army,base,fight,fire,force,guard,gun,marine,navy,rifle,shoot*,snip*,train,troop,war"},"landuse/military/training_area":{"name":"Training Area","terms":"air force,army,base,fight,fire,force,guard,gun,marine,navy,rifle,shoot*,snip*,train,troop,war"},"landuse/orchard":{"name":"Orchard","terms":"fruit"},"landuse/plant_nursery":{"name":"Plant Nursery","terms":"flower,garden,grow,vivero"},"landuse/quarry":{"name":"Quarry","terms":""},"landuse/railway":{"name":"Railway Corridor","terms":"rail,train,track"},"landuse/recreation_ground":{"name":"Recreation Ground","terms":"playing fields"},"landuse/residential":{"name":"Residential Area","terms":""},"landuse/retail":{"name":"Retail Area","terms":""},"landuse/vineyard":{"name":"Vineyard","terms":"grape,wine"},"leisure":{"name":"Leisure","terms":""},"leisure/adult_gaming_centre":{"name":"Adult Gaming Center","terms":"gambling,slot machine"},"leisure/bird_hide":{"name":"Bird Hide","terms":"machan,ornithology"},"leisure/bowling_alley":{"name":"Bowling Alley","terms":""},"leisure/common":{"name":"Common","terms":"open space"},"leisure/dance":{"name":"Dance Hall","terms":"ballroom,jive,swing,tango,waltz"},"leisure/dog_park":{"name":"Dog Park","terms":""},"leisure/firepit":{"name":"Firepit","terms":"fireplace,campfire"},"leisure/fitness_centre":{"name":"Gym / Fitness Center","terms":"health,gym,leisure,studio"},"leisure/fitness_centre/yoga":{"name":"Yoga Studio","terms":"studio"},"leisure/fitness_station":{"name":"Outdoor Fitness Station","terms":"fitness,gym"},"leisure/garden":{"name":"Garden","terms":""},"leisure/golf_course":{"name":"Golf Course","terms":"links"},"leisure/horse_riding":{"name":"Horseback Riding Facility","terms":"equestrian,stable"},"leisure/ice_rink":{"name":"Ice Rink","terms":"hockey,skating,curling"},"leisure/marina":{"name":"Marina","terms":"boat"},"leisure/miniature_golf":{"name":"Miniature Golf","terms":"crazy golf,mini golf,putt-putt"},"leisure/nature_reserve":{"name":"Nature Reserve","terms":"protected,wildlife"},"leisure/park":{"name":"Park","terms":"esplanade,estate,forest,garden,grass,green,grounds,lawn,lot,meadow,parkland,place,playground,plaza,pleasure garden,recreation area,square,tract,village green,woodland"},"leisure/picnic_table":{"name":"Picnic Table","terms":"bench"},"leisure/pitch":{"name":"Sport Pitch","terms":"field"},"leisure/pitch/american_football":{"name":"American Football Field","terms":""},"leisure/pitch/baseball":{"name":"Baseball Diamond","terms":""},"leisure/pitch/basketball":{"name":"Basketball Court","terms":""},"leisure/pitch/beachvolleyball":{"name":"Beach Volleyball Court","terms":"volleyball"},"leisure/pitch/bowls":{"name":"Bowling Green","terms":""},"leisure/pitch/cricket":{"name":"Cricket Field","terms":""},"leisure/pitch/equestrian":{"name":"Riding Arena","terms":"dressage,equestrian,horse,horseback,riding"},"leisure/pitch/rugby_league":{"name":"Rugby League Field","terms":""},"leisure/pitch/rugby_union":{"name":"Rugby Union Field","terms":""},"leisure/pitch/skateboard":{"name":"Skate Park","terms":""},"leisure/pitch/soccer":{"name":"Soccer Field","terms":"football"},"leisure/pitch/table_tennis":{"name":"Ping Pong Table","terms":"table tennis,ping pong"},"leisure/pitch/tennis":{"name":"Tennis Court","terms":""},"leisure/pitch/volleyball":{"name":"Volleyball Court","terms":""},"leisure/playground":{"name":"Playground","terms":"jungle gym,play area"},"leisure/resort":{"name":"Resort","terms":""},"leisure/running_track":{"name":"Racetrack (Running)","terms":"race*,running,sprint,track"},"leisure/slipway":{"name":"Slipway","terms":"boat launch,boat ramp"},"leisure/sports_centre":{"name":"Sports Center / Complex","terms":""},"leisure/sports_centre/swimming":{"name":"Swimming Pool Facility","terms":"dive,water"},"leisure/stadium":{"name":"Stadium","terms":""},"leisure/swimming_pool":{"name":"Swimming Pool","terms":"dive,water"},"leisure/track":{"name":"Racetrack (Non-Motorsport)","terms":"cycle,dog,greyhound,horse,race*,track"},"leisure/water_park":{"name":"Water Park","terms":"swim,pool,dive"},"line":{"name":"Line","terms":""},"man_made":{"name":"Man Made","terms":""},"man_made/embankment":{"name":"Embankment","terms":""},"man_made/adit":{"name":"Adit","terms":"entrance,underground,mine,cave"},"man_made/breakwater":{"name":"Breakwater","terms":""},"man_made/bridge":{"name":"Bridge","terms":""},"man_made/chimney":{"name":"Chimney","terms":""},"man_made/cutline":{"name":"Cut line","terms":""},"man_made/flagpole":{"name":"Flagpole","terms":""},"man_made/gasometer":{"name":"Gasometer","terms":"gas holder"},"man_made/groyne":{"name":"Groyne","terms":""},"man_made/lighthouse":{"name":"Lighthouse","terms":""},"man_made/mast":{"name":"Mast","terms":"antenna,broadcast tower,cell phone tower,cell tower,communication mast,communication tower,guyed tower,mobile phone tower,radio mast,radio tower,television tower,transmission mast,transmission tower,tv tower"},"man_made/observation":{"name":"Observation Tower","terms":"lookout tower,fire tower"},"man_made/petroleum_well":{"name":"Oil Well","terms":"drilling rig,oil derrick,oil drill,oil horse,oil rig,oil pump,petroleum well,pumpjack"},"man_made/pier":{"name":"Pier","terms":"dock"},"man_made/pipeline":{"name":"Pipeline","terms":""},"man_made/pumping_station":{"name":"Pumping Station","terms":""},"man_made/silo":{"name":"Silo","terms":"grain,corn,wheat"},"man_made/storage_tank":{"name":"Storage Tank","terms":"water,oil,gas,petrol"},"man_made/surveillance_camera":{"name":"Surveillance Camera","terms":"anpr,alpr,camera,car plate recognition,cctv,guard,license plate recognition,monitoring,number plate recognition,security,video,webcam"},"man_made/surveillance":{"name":"Surveillance","terms":"anpr,alpr,camera,car plate recognition,cctv,guard,license plate recognition,monitoring,number plate recognition,security,video,webcam"},"man_made/survey_point":{"name":"Survey Point","terms":""},"man_made/tower":{"name":"Tower","terms":""},"man_made/wastewater_plant":{"name":"Wastewater Plant","terms":"sewage*,water treatment plant,reclamation plant"},"man_made/water_tower":{"name":"Water Tower","terms":""},"man_made/water_well":{"name":"Water Well","terms":""},"man_made/water_works":{"name":"Water Works","terms":""},"man_made/works":{"name":"Factory","terms":"assembly,build,brewery,car,plant,plastic,processing,manufacture,refinery"},"manhole":{"name":"Manhole","terms":"cover,hole,sewer,sewage,telecom"},"manhole/drain":{"name":"Storm Drain","terms":"cover,drain,hole,rain,sewer,sewage,storm"},"natural":{"name":"Natural","terms":""},"natural/bare_rock":{"name":"Bare Rock","terms":"rock"},"natural/bay":{"name":"Bay","terms":""},"natural/beach":{"name":"Beach","terms":"shore"},"natural/cave_entrance":{"name":"Cave Entrance","terms":"cavern,hollow,grotto,shelter,cavity"},"natural/cliff":{"name":"Cliff","terms":"escarpment"},"natural/coastline":{"name":"Coastline","terms":"shore"},"natural/fell":{"name":"Fell","terms":""},"natural/glacier":{"name":"Glacier","terms":""},"natural/grassland":{"name":"Grassland","terms":"prairie,savanna"},"natural/heath":{"name":"Heath","terms":""},"natural/peak":{"name":"Peak","terms":"acme,aiguille,alp,climax,crest,crown,hill,mount,mountain,pinnacle,summit,tip,top"},"natural/ridge":{"name":"Ridge","terms":"crest"},"natural/saddle":{"name":"Saddle","terms":"pass,mountain pass,top"},"natural/sand":{"name":"Sand","terms":"desert"},"natural/scree":{"name":"Scree","terms":"loose rocks"},"natural/scrub":{"name":"Scrub","terms":"bush,shrubs"},"natural/spring":{"name":"Spring","terms":""},"natural/tree_row":{"name":"Tree row","terms":""},"natural/tree":{"name":"Tree","terms":""},"natural/volcano":{"name":"Volcano","terms":"mountain,crater"},"natural/water":{"name":"Water","terms":""},"natural/water/lake":{"name":"Lake","terms":"lakelet,loch,mere"},"natural/water/pond":{"name":"Pond","terms":"lakelet,millpond,tarn,pool,mere"},"natural/water/reservoir":{"name":"Reservoir","terms":""},"natural/wetland":{"name":"Wetland","terms":""},"natural/wood":{"name":"Wood","terms":"tree"},"noexit/yes":{"name":"No Exit","terms":"no exit,road end,dead end"},"office":{"name":"Office","terms":""},"office/travel_agent":{"name":"Travel Agency","terms":""},"office/accountant":{"name":"Accountant","terms":""},"office/administrative":{"name":"Administrative Office","terms":""},"office/architect":{"name":"Architect","terms":""},"office/company":{"name":"Company Office","terms":""},"office/coworking":{"name":"Coworking Space","terms":"coworking,office"},"office/educational_institution":{"name":"Educational Institution","terms":""},"office/employment_agency":{"name":"Employment Agency","terms":"job"},"office/estate_agent":{"name":"Real Estate Office","terms":""},"office/financial":{"name":"Financial Office","terms":""},"office/government":{"name":"Government Office","terms":""},"office/government/register_office":{"name":"Register Office","terms":"clerk,marriage,death,birth,certificate"},"office/insurance":{"name":"Insurance Office","terms":""},"office/it":{"name":"IT Office","terms":""},"office/lawyer":{"name":"Law Office","terms":""},"office/lawyer/notary":{"name":"Notary Office","terms":"clerk,signature,wills,deeds,estate"},"office/newspaper":{"name":"Newspaper","terms":""},"office/ngo":{"name":"NGO Office","terms":""},"office/physician":{"name":"Physician","terms":""},"office/political_party":{"name":"Political Party","terms":""},"office/research":{"name":"Research Office","terms":""},"office/telecommunication":{"name":"Telecom Office","terms":""},"office/therapist":{"name":"Therapist","terms":""},"piste":{"name":"Piste/Ski Trail","terms":"ski,sled,sleigh,snowboard,nordic,downhill,snowmobile"},"place/farm":{"name":"Farm","terms":""},"place/city":{"name":"City","terms":""},"place/hamlet":{"name":"Hamlet","terms":""},"place/island":{"name":"Island","terms":"archipelago,atoll,bar,cay,isle,islet,key,reef"},"place/isolated_dwelling":{"name":"Isolated Dwelling","terms":""},"place/locality":{"name":"Locality","terms":""},"place/neighbourhood":{"name":"Neighborhood","terms":"neighbourhood"},"place/quarter":{"name":"Sub-Borough / Quarter","terms":"boro,borough,quarter"},"place/square":{"name":"Square","terms":""},"place/suburb":{"name":"Borough / Suburb","terms":"boro,borough,quarter"},"place/town":{"name":"Town","terms":""},"place/village":{"name":"Village","terms":""},"point":{"name":"Point","terms":""},"power/sub_station":{"name":"Substation","terms":""},"power/generator":{"name":"Power Generator","terms":"hydro,solar,turbine,wind"},"power/line":{"name":"Power Line","terms":""},"power/minor_line":{"name":"Minor Power Line","terms":""},"power/plant":{"name":"Power Station Grounds","terms":"coal,gas,generat*,hydro,nuclear,power,station"},"power/pole":{"name":"Power Pole","terms":""},"power/substation":{"name":"Substation","terms":""},"power/tower":{"name":"High-Voltage Tower","terms":""},"power/transformer":{"name":"Transformer","terms":""},"public_transport/platform":{"name":"Platform","terms":""},"public_transport/stop_position":{"name":"Stop Position","terms":""},"railway/abandoned":{"name":"Abandoned Railway","terms":""},"railway/crossing":{"name":"Railway Crossing (Path)","terms":"crossing,pedestrian crossing,railroad crossing,level crossing,grade crossing,path through railroad,train crossing"},"railway/disused":{"name":"Disused Railway","terms":""},"railway/funicular":{"name":"Funicular","terms":"venicular,cliff railway,cable car,cable railway,funicular railway"},"railway/halt":{"name":"Railway Halt","terms":"break,interrupt,rest,wait,interruption"},"railway/level_crossing":{"name":"Railway Crossing (Road)","terms":"crossing,railroad crossing,level crossing,grade crossing,road through railroad,train crossing"},"railway/monorail":{"name":"Monorail","terms":""},"railway/narrow_gauge":{"name":"Narrow Gauge Rail","terms":"narrow gauge railway,narrow gauge railroad"},"railway/platform":{"name":"Railway Platform","terms":""},"railway/rail":{"name":"Rail","terms":""},"railway/station":{"name":"Railway Station","terms":"train station,station"},"railway/subway_entrance":{"name":"Subway Entrance","terms":"metro,transit"},"railway/subway":{"name":"Subway","terms":"metro,transit"},"railway/tram_stop":{"name":"Tram Stop","terms":"light rail,streetcar,tram,trolley"},"railway/tram":{"name":"Tram","terms":"light rail,streetcar,tram,trolley"},"relation":{"name":"Relation","terms":""},"route/ferry":{"name":"Ferry Route","terms":""},"shop":{"name":"Shop","terms":""},"shop/fishmonger":{"name":"Fishmonger","terms":""},"shop/vacant":{"name":"Vacant Shop","terms":""},"shop/alcohol":{"name":"Liquor Store","terms":"alcohol,beer,booze,wine"},"shop/anime":{"name":"Anime Shop","terms":"manga,japan,cosplay,figurine,dakimakura"},"shop/antiques":{"name":"Antiques Shop","terms":""},"shop/appliance":{"name":"Appliance Store","terms":"air conditioner,appliance,dishwasher,dryer,freezer,fridge,grill,kitchen,oven,refrigerator,stove,washer,washing machine"},"shop/art":{"name":"Art Store","terms":"art*,exhibit*,gallery"},"shop/baby_goods":{"name":"Baby Goods Store","terms":""},"shop/bag":{"name":"Bag/Luggage Store","terms":"handbag,purse"},"shop/bakery":{"name":"Bakery","terms":""},"shop/bathroom_furnishing":{"name":"Bathroom Furnishing Store","terms":""},"shop/beauty":{"name":"Beauty Shop","terms":"spa,salon,tanning"},"shop/beauty/nails":{"name":"Nail Salon","terms":"manicure,pedicure"},"shop/beauty/tanning":{"name":"Tanning Salon","terms":""},"shop/bed":{"name":"Bedding/Mattress Store","terms":""},"shop/beverages":{"name":"Beverage Store","terms":""},"shop/bicycle":{"name":"Bicycle Shop","terms":"bike,repair"},"shop/bookmaker":{"name":"Bookmaker","terms":"betting"},"shop/books":{"name":"Book Store","terms":""},"shop/boutique":{"name":"Boutique","terms":""},"shop/butcher":{"name":"Butcher","terms":"meat"},"shop/candles":{"name":"Candle Shop","terms":""},"shop/car_parts":{"name":"Car Parts Store","terms":"auto"},"shop/car_repair":{"name":"Car Repair Shop","terms":"auto,garage,service"},"shop/car":{"name":"Car Dealership","terms":"auto"},"shop/carpet":{"name":"Carpet Store","terms":"rug"},"shop/charity":{"name":"Charity Store","terms":"thrift,op shop,nonprofit"},"shop/cheese":{"name":"Cheese Store","terms":""},"shop/chemist":{"name":"Drugstore","terms":"med*,drug*,gift"},"shop/chocolate":{"name":"Chocolate Store","terms":""},"shop/clothes":{"name":"Clothing Store","terms":""},"shop/coffee":{"name":"Coffee Store","terms":""},"shop/computer":{"name":"Computer Store","terms":""},"shop/confectionery":{"name":"Candy Store","terms":""},"shop/convenience":{"name":"Convenience Store","terms":""},"shop/copyshop":{"name":"Copy Store","terms":""},"shop/cosmetics":{"name":"Cosmetics Store","terms":""},"shop/craft":{"name":"Arts and Crafts Store","terms":"art*,paint*,frame"},"shop/curtain":{"name":"Curtain Store","terms":"drape*,window"},"shop/dairy":{"name":"Dairy Store","terms":"milk,egg,cheese"},"shop/deli":{"name":"Deli","terms":"lunch,meat,sandwich"},"shop/department_store":{"name":"Department Store","terms":""},"shop/doityourself":{"name":"DIY Store","terms":""},"shop/dry_cleaning":{"name":"Dry Cleaner","terms":""},"shop/e-cigarette":{"name":"E-Cigarette Shop","terms":"electronic,vapor"},"shop/electronics":{"name":"Electronics Store","terms":"appliance,audio,blueray,camera,computer,dvd,home theater,radio,speaker,tv,video"},"shop/erotic":{"name":"Erotic Store","terms":"sex,porn"},"shop/fabric":{"name":"Fabric Store","terms":"sew"},"shop/farm":{"name":"Produce Stand","terms":"farm shop,farm stand"},"shop/fashion":{"name":"Fashion Store","terms":""},"shop/florist":{"name":"Florist","terms":"flower"},"shop/frame":{"name":"Framing Shop","terms":"art*,paint*,photo*,frame"},"shop/funeral_directors":{"name":"Funeral Home","terms":"undertaker,memorial home"},"shop/furnace":{"name":"Furnace Store","terms":"oven,stove"},"shop/furniture":{"name":"Furniture Store","terms":"chair,sofa,table"},"shop/garden_centre":{"name":"Garden Center","terms":"landscape,mulch,shrub,tree"},"shop/gas":{"name":"Bottled Gas Shop","terms":"cng,lpg,natural gas,propane,refill,tank"},"shop/gift":{"name":"Gift Shop","terms":"souvenir"},"shop/greengrocer":{"name":"Greengrocer","terms":"fruit,vegetable"},"shop/hairdresser":{"name":"Hairdresser","terms":"barber"},"shop/hardware":{"name":"Hardware Store","terms":""},"shop/hearing_aids":{"name":"Hearing Aids Store","terms":""},"shop/herbalist":{"name":"Herbalist","terms":""},"shop/hifi":{"name":"Hifi Store","terms":"stereo,video"},"shop/houseware":{"name":"Houseware Store","terms":"home,household"},"shop/interior_decoration":{"name":"Interior Decoration Store","terms":""},"shop/jewelry":{"name":"Jeweler","terms":"diamond,gem,ring"},"shop/kiosk":{"name":"News Kiosk","terms":""},"shop/kitchen":{"name":"Kitchen Design Store","terms":""},"shop/laundry":{"name":"Laundry","terms":""},"shop/leather":{"name":"Leather Store","terms":""},"shop/locksmith":{"name":"Locksmith","terms":"key,lockpick"},"shop/lottery":{"name":"Lottery Shop","terms":""},"shop/mall":{"name":"Mall","terms":"shopping"},"shop/massage":{"name":"Massage Shop","terms":""},"shop/medical_supply":{"name":"Medical Supply Store","terms":""},"shop/mobile_phone":{"name":"Mobile Phone Store","terms":""},"shop/money_lender":{"name":"Money Lender","terms":""},"shop/motorcycle":{"name":"Motorcycle Dealership","terms":"bike"},"shop/music":{"name":"Music Store","terms":"CD,vinyl"},"shop/musical_instrument":{"name":"Musical Instrument Store","terms":"guitar"},"shop/newsagent":{"name":"Newspaper/Magazine Shop","terms":""},"shop/nutrition_supplements":{"name":"Nutrition Supplements Store","terms":""},"shop/optician":{"name":"Optician","terms":"eye,glasses"},"shop/organic":{"name":"Organic Goods Store","terms":""},"shop/outdoor":{"name":"Outdoors Store","terms":"camping,climbing,hiking"},"shop/paint":{"name":"Paint Store","terms":""},"shop/pastry":{"name":"Pastry Shop","terms":"patisserie,cake shop,cakery"},"shop/pawnbroker":{"name":"Pawn Shop","terms":""},"shop/perfumery":{"name":"Perfume Store","terms":""},"shop/pet":{"name":"Pet Store","terms":"animal,cat,dog,fish,kitten,puppy,reptile"},"shop/photo":{"name":"Photography Store","terms":"camera,film"},"shop/pyrotechnics":{"name":"Fireworks Store","terms":""},"shop/radiotechnics":{"name":"Radio/Electronic Component Store","terms":""},"shop/religion":{"name":"Religious Store","terms":""},"shop/scuba_diving":{"name":"Scuba Diving Shop","terms":""},"shop/seafood":{"name":"Seafood Shop","terms":"fishmonger"},"shop/second_hand":{"name":"Consignment/Thrift Store","terms":"secondhand,second hand,resale,thrift,used"},"shop/shoes":{"name":"Shoe Store","terms":""},"shop/sports":{"name":"Sporting Goods Store","terms":""},"shop/stationery":{"name":"Stationery Store","terms":"card,paper"},"shop/storage_rental":{"name":"Storage Rental","terms":""},"shop/supermarket":{"name":"Supermarket","terms":"grocery,store,shop"},"shop/tailor":{"name":"Tailor","terms":"clothes,suit"},"shop/tattoo":{"name":"Tattoo Parlor","terms":""},"shop/tea":{"name":"Tea Store","terms":""},"shop/ticket":{"name":"Ticket Seller","terms":""},"shop/tobacco":{"name":"Tobacco Shop","terms":""},"shop/toys":{"name":"Toy Store","terms":""},"shop/travel_agency":{"name":"Travel Agency","terms":""},"shop/tyres":{"name":"Tire Store","terms":""},"shop/vacuum_cleaner":{"name":"Vacuum Cleaner Store","terms":""},"shop/variety_store":{"name":"Variety Store","terms":""},"shop/video_games":{"name":"Video Game Store","terms":""},"shop/video":{"name":"Video Store","terms":"DVD"},"shop/watches":{"name":"Watches Shop","terms":""},"shop/water_sports":{"name":"Watersport/Swim Shop","terms":""},"shop/weapons":{"name":"Weapon Shop","terms":"ammo,gun,knife,knives"},"shop/window_blind":{"name":"Window Blind Store","terms":""},"shop/wine":{"name":"Wine Shop","terms":""},"tourism":{"name":"Tourism","terms":""},"tourism/alpine_hut":{"name":"Alpine Hut","terms":""},"tourism/apartment":{"name":"Guest Apartment / Condo","terms":""},"tourism/aquarium":{"name":"Aquarium","terms":"fish,sea,water"},"tourism/artwork":{"name":"Artwork","terms":"mural,sculpture,statue"},"tourism/attraction":{"name":"Tourist Attraction","terms":""},"tourism/camp_site":{"name":"Campground","terms":"tent,rv"},"tourism/caravan_site":{"name":"RV Park","terms":"Motor Home,Camper"},"tourism/chalet":{"name":"Chalet","terms":""},"tourism/gallery":{"name":"Art Gallery","terms":"art*,exhibit*,paint*,photo*,sculpt*"},"tourism/guest_house":{"name":"Guest House","terms":"B&B,Bed and Breakfast"},"tourism/hostel":{"name":"Hostel","terms":""},"tourism/hotel":{"name":"Hotel","terms":""},"tourism/information":{"name":"Information","terms":""},"tourism/information/board":{"name":"Information Board","terms":""},"tourism/information/guidepost":{"name":"Guidepost","terms":""},"tourism/information/map":{"name":"Map","terms":""},"tourism/information/office":{"name":"Tourist Information Office","terms":""},"tourism/motel":{"name":"Motel","terms":""},"tourism/museum":{"name":"Museum","terms":"art*,exhibit*,gallery,foundation,hall,institution,paint*,photo*,sculpt*"},"tourism/picnic_site":{"name":"Picnic Site","terms":"camp"},"tourism/theme_park":{"name":"Theme Park","terms":""},"tourism/viewpoint":{"name":"Viewpoint","terms":""},"tourism/zoo":{"name":"Zoo","terms":"animal"},"traffic_calming":{"name":"Traffic Calming","terms":"bump,hump,slow,speed"},"traffic_calming/bump":{"name":"Speed Bump","terms":"hump,speed,slow"},"traffic_calming/chicane":{"name":"Traffic Chicane","terms":"driveway link,speed,slow"},"traffic_calming/choker":{"name":"Traffic Choker","terms":"speed,slow"},"traffic_calming/cushion":{"name":"Speed Cushion","terms":"bump,hump,speed,slow"},"traffic_calming/dip":{"name":"Dip","terms":"speed,slow"},"traffic_calming/hump":{"name":"Speed Hump","terms":"bump,speed,slow"},"traffic_calming/island":{"name":"Traffic Island","terms":"circle,roundabout,slow"},"traffic_calming/rumble_strip":{"name":"Rumble Strip","terms":"audible lines,sleeper lines,growlers"},"traffic_calming/table":{"name":"Raised Pedestrian Crossing","terms":"flat top,hump,speed,slow"},"type/multipolygon":{"name":"Multipolygon","terms":""},"type/boundary":{"name":"Boundary","terms":""},"type/boundary/administrative":{"name":"Administrative Boundary","terms":""},"type/restriction":{"name":"Restriction","terms":""},"type/restriction/no_left_turn":{"name":"No Left Turn","terms":""},"type/restriction/no_right_turn":{"name":"No Right Turn","terms":""},"type/restriction/no_straight_on":{"name":"No Straight On","terms":""},"type/restriction/no_u_turn":{"name":"No U-turn","terms":""},"type/restriction/only_left_turn":{"name":"Left Turn Only","terms":""},"type/restriction/only_right_turn":{"name":"Right Turn Only","terms":""},"type/restriction/only_straight_on":{"name":"No Turns","terms":""},"type/route_master":{"name":"Route Master","terms":""},"type/route":{"name":"Route","terms":""},"type/route/bicycle":{"name":"Cycle Route","terms":""},"type/route/bus":{"name":"Bus Route","terms":""},"type/route/detour":{"name":"Detour Route","terms":""},"type/route/ferry":{"name":"Ferry Route","terms":""},"type/route/foot":{"name":"Foot Route","terms":""},"type/route/hiking":{"name":"Hiking Route","terms":""},"type/route/horse":{"name":"Riding Route","terms":""},"type/route/pipeline":{"name":"Pipeline Route","terms":""},"type/route/power":{"name":"Power Route","terms":""},"type/route/road":{"name":"Road Route","terms":""},"type/route/train":{"name":"Train Route","terms":""},"type/route/tram":{"name":"Tram Route","terms":""},"type/site":{"name":"Site","terms":""},"vertex":{"name":"Other","terms":""},"waterway/boatyard":{"name":"Boatyard","terms":""},"waterway/canal":{"name":"Canal","terms":""},"waterway/dam":{"name":"Dam","terms":""},"waterway/ditch":{"name":"Ditch","terms":""},"waterway/dock":{"name":"Wet Dock / Dry Dock","terms":"boat,ship,vessel,marine"},"waterway/drain":{"name":"Drain","terms":""},"waterway/fuel":{"name":"Marine Fuel Station","terms":"petrol,gas,diesel,boat"},"waterway/river":{"name":"River","terms":"beck,branch,brook,course,creek,estuary,rill,rivulet,run,runnel,stream,tributary,watercourse"},"waterway/riverbank":{"name":"Riverbank","terms":""},"waterway/sanitary_dump_station":{"name":"Marine Toilet Disposal","terms":"Boat,Watercraft,Sanitary,Dump Station,Pumpout,Pump out,Elsan,CDP,CTDP,Chemical Toilet"},"waterway/stream":{"name":"Stream","terms":"beck,branch,brook,burn,course,creek,current,drift,flood,flow,freshet,race,rill,rindle,rivulet,run,runnel,rush,spate,spritz,surge,tide,torrent,tributary,watercourse"},"waterway/water_point":{"name":"Marine Drinking Water","terms":""},"waterway/waterfall":{"name":"Waterfall","terms":"fall"},"waterway/weir":{"name":"Weir","terms":""}}},"imagery":{"Bing":{"description":"Satellite and aerial imagery.","name":"Bing aerial imagery"},"DigitalGlobe-Premium":{"attribution":{"text":"Terms & Feedback"},"description":"Premium DigitalGlobe satellite imagery.","name":"DigitalGlobe Premium Imagery"},"DigitalGlobe-Standard":{"attribution":{"text":"Terms & Feedback"},"description":"Standard DigitalGlobe satellite imagery.","name":"DigitalGlobe Standard Imagery"},"MAPNIK":{"attribution":{"text":"© OpenStreetMap contributors, CC-BY-SA"},"description":"The default OpenStreetMap layer.","name":"OpenStreetMap (Standard)"},"Mapbox":{"attribution":{"text":"Terms & Feedback"},"description":"Satellite and aerial imagery.","name":"Mapbox Satellite"},"New_and_Misaligned_TIGER_Roads-2013":{"description":"At zoom level 16+, public domain map data from the US Census. At lower zooms, only changes since 2006 minus changes already incorporated into OpenStreetMap","name":"New & Misaligned TIGER Roads"},"OSM_Inspector-Addresses":{"attribution":{"text":"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},"name":"OSM Inspector: Addresses"},"OSM_Inspector-Geometry":{"attribution":{"text":"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},"name":"OSM Inspector: Geometry"},"OSM_Inspector-Highways":{"attribution":{"text":"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},"name":"OSM Inspector: Highways"},"OSM_Inspector-Multipolygon":{"attribution":{"text":"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},"name":"OSM Inspector: Area"},"OSM_Inspector-Places":{"attribution":{"text":"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},"name":"OSM Inspector: Places"},"OSM_Inspector-Routing":{"attribution":{"text":"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},"name":"OSM Inspector: Routing"},"OSM_Inspector-Tagging":{"attribution":{"text":"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},"name":"OSM Inspector: Tagging"},"Waymarked_Trails-Cycling":{"attribution":{"text":"© Sarah Hoffmann, CC by-SA 3.0, map data OpenStreetMap contributors, ODbL 1.0"},"name":"Waymarked Trails: Cycling"},"Waymarked_Trails-Hiking":{"attribution":{"text":"© Sarah Hoffmann, CC by-SA 3.0, map data OpenStreetMap contributors, ODbL 1.0"},"name":"Waymarked Trails: Hiking"},"Waymarked_Trails-MTB":{"attribution":{"text":"© Sarah Hoffmann, CC by-SA 3.0, map data OpenStreetMap contributors, ODbL 1.0"},"name":"Waymarked Trails: MTB"},"Waymarked_Trails-Skating":{"attribution":{"text":"© Sarah Hoffmann, CC by-SA 3.0, map data OpenStreetMap contributors, ODbL 1.0"},"name":"Waymarked Trails: Skating"},"Waymarked_Trails-Winter_Sports":{"attribution":{"text":"© Michael Spreng, CC by-SA 3.0, map data OpenStreetMap contributors, ODbL 1.0"},"name":"Waymarked Trails: Winter Sports"},"basemap.at":{"attribution":{"text":"basemap.at"},"description":"Basemap of Austria, based on goverment data.","name":"basemap.at"},"basemap.at-orthofoto":{"attribution":{"text":"basemap.at"},"description":"Orthofoto layer provided by basemap.at. \"Successor\" of geoimage.at imagery.","name":"basemap.at Orthofoto"},"hike_n_bike":{"attribution":{"text":"© OpenStreetMap contributors"},"name":"Hike & Bike"},"mapbox_locator_overlay":{"attribution":{"text":"Terms & Feedback"},"description":"Shows major features to help orient you.","name":"Locator Overlay"},"openpt_map":{"attribution":{"text":"© OpenStreetMap contributors, CC-BY-SA"},"name":"OpenPT Map (overlay)"},"osm-gps":{"attribution":{"text":"© OpenStreetMap contributors"},"description":"Public GPS traces uploaded to OpenStreetMap.","name":"OpenStreetMap GPS traces"},"osm-mapnik-black_and_white":{"attribution":{"text":"© OpenStreetMap contributors, CC-BY-SA"},"name":"OpenStreetMap (Standard Black & White)"},"osm-mapnik-german_style":{"attribution":{"text":"© OpenStreetMap contributors, CC-BY-SA"},"name":"OpenStreetMap (German Style)"},"qa_no_address":{"attribution":{"text":"Simon Poole, Data ©OpenStreetMap contributors"},"name":"QA No Address"},"skobbler":{"attribution":{"text":"© Tiles: skobbler Map data: OpenStreetMap contributors"},"name":"skobbler"},"stamen-terrain-background":{"attribution":{"text":"Map tiles by Stamen Design, under CC BY 3.0"},"name":"Stamen Terrain"},"tf-cycle":{"attribution":{"text":"Maps © Thunderforest, Data © OpenStreetMap contributors"},"name":"Thunderforest OpenCycleMap"},"tf-landscape":{"attribution":{"text":"Maps © Thunderforest, Data © OpenStreetMap contributors"},"name":"Thunderforest Landscape"}}};
+var en = {"modes":{"add_area":{"title":"Area","description":"Add parks, buildings, lakes or other areas to the map.","tail":"Click on the map to start drawing an area, like a park, lake, or building."},"add_line":{"title":"Line","description":"Add highways, streets, pedestrian paths, canals or other lines to the map.","tail":"Click on the map to start drawing a road, path, or route."},"add_point":{"title":"Point","description":"Add restaurants, monuments, postal boxes or other points to the map.","tail":"Click on the map to add a point."},"browse":{"title":"Browse","description":"Pan and zoom the map."},"draw_area":{"tail":"Click to add nodes to your area. Click the first node to finish the area."},"draw_line":{"tail":"Click to add more nodes to the line. Click on other lines to connect to them, and double-click to end the line."}},"operations":{"add":{"annotation":{"point":"Added a point.","vertex":"Added a node to a way.","relation":"Added a relation."}},"start":{"annotation":{"line":"Started a line.","area":"Started an area."}},"continue":{"key":"A","title":"Continue","description":"Continue this line.","not_eligible":"No line can be continued here.","multiple":"Several lines can be continued here. To choose a line, press the Shift key and click on it to select it.","annotation":{"line":"Continued a line.","area":"Continued an area."}},"cancel_draw":{"annotation":"Canceled drawing."},"change_role":{"annotation":"Changed the role of a relation member."},"change_tags":{"annotation":"Changed tags."},"circularize":{"title":"Circularize","description":{"line":"Make this line circular.","area":"Make this area circular."},"key":"O","annotation":{"line":"Made a line circular.","area":"Made an area circular."},"not_closed":"This can't be made circular because it's not a loop.","too_large":"This can't be made circular because not enough of it is currently visible.","connected_to_hidden":"This can't be made circular because it is connected to a hidden feature."},"orthogonalize":{"title":"Square","description":{"line":"Square the corners of this line.","area":"Square the corners of this area."},"key":"S","annotation":{"line":"Squared the corners of a line.","area":"Squared the corners of an area."},"not_squarish":"This can't be made square because it is not squarish.","too_large":"This can't be made square because not enough of it is currently visible.","connected_to_hidden":"This can't be made square because it is connected to a hidden feature."},"straighten":{"title":"Straighten","description":"Straighten this line.","key":"S","annotation":"Straightened a line.","too_bendy":"This can't be straightened because it bends too much.","connected_to_hidden":"This line can't be straightened because it is connected to a hidden feature."},"delete":{"title":"Delete","description":{"single":"Delete this feature permanently.","multiple":"Delete these features permanently."},"annotation":{"point":"Deleted a point.","vertex":"Deleted a node from a way.","line":"Deleted a line.","area":"Deleted an area.","relation":"Deleted a relation.","multiple":"Deleted {n} features."},"too_large":{"single":"This feature can't be deleted because not enough of it is currently visible.","multiple":"These features can't be deleted because not enough of them are currently visible."},"incomplete_relation":{"single":"This feature can't be deleted because it hasn't been fully downloaded.","multiple":"These features can't be deleted because they haven't been fully downloaded."},"part_of_relation":{"single":"This feature can't be deleted because it is part of a larger relation. You must remove it from the relation first.","multiple":"These features can't be deleted because they are part of larger relations. You must remove them from the relations first."},"connected_to_hidden":{"single":"This feature can't be deleted because it is connected to a hidden feature.","multiple":"These features can't be deleted because some are connected to hidden features."}},"add_member":{"annotation":"Added a member to a relation."},"delete_member":{"annotation":"Removed a member from a relation."},"connect":{"annotation":{"point":"Connected a way to a point.","vertex":"Connected a way to another.","line":"Connected a way to a line.","area":"Connected a way to an area."}},"disconnect":{"title":"Disconnect","description":"Disconnect these lines/areas from each other.","key":"D","annotation":"Disconnected lines/areas.","not_connected":"There aren't enough lines/areas here to disconnect.","connected_to_hidden":"This can't be disconnected because it is connected to a hidden feature.","relation":"This can't be disconnected because it connects members of a relation."},"merge":{"title":"Merge","description":"Merge these features.","key":"C","annotation":"Merged {n} features.","not_eligible":"These features can't be merged.","not_adjacent":"These features can't be merged because their endpoints aren't connected.","restriction":"These features can't be merged because at least one is a member of a \"{relation}\" relation.","incomplete_relation":"These features can't be merged because at least one hasn't been fully downloaded.","conflicting_tags":"These features can't be merged because some of their tags have conflicting values."},"move":{"title":"Move","description":{"single":"Move this feature to a different location.","multiple":"Move these features to a different location."},"key":"M","annotation":{"point":"Moved a point.","vertex":"Moved a node in a way.","line":"Moved a line.","area":"Moved an area.","multiple":"Moved multiple features."},"incomplete_relation":{"single":"This feature can't be moved because it hasn't been fully downloaded.","multiple":"These features can't be moved because they haven't been fully downloaded."},"too_large":{"single":"This feature can't be moved because not enough of it is currently visible.","multiple":"These features can't be moved because not enough of them are currently visible."},"connected_to_hidden":{"single":"This feature can't be moved because it is connected to a hidden feature.","multiple":"These features can't be moved because some are connected to hidden features."}},"reflect":{"title":{"long":"Reflect Long","short":"Reflect Short"},"description":{"long":{"single":"Reflect this feature across its long axis.","multiple":"Reflect these features across their long axis."},"short":{"single":"Reflect this feature across its short axis.","multiple":"Reflect these features across their short axis."}},"key":{"long":"T","short":"Y"},"annotation":{"long":{"single":"Reflected a feature across its long axis.","multiple":"Reflected multiple features across their long axis."},"short":{"single":"Reflected a feature across its short axis.","multiple":"Reflected multiple features across their short axis."}},"incomplete_relation":{"single":"This feature can't be reflected because it hasn't been fully downloaded.","multiple":"These features can't be reflected because they haven't been fully downloaded."},"too_large":{"single":"This feature can't be reflected because not enough of it is currently visible.","multiple":"These features can't be reflected because not enough of them are currently visible."},"connected_to_hidden":{"single":"This feature can't be reflected because it is connected to a hidden feature.","multiple":"These features can't be reflected because some are connected to hidden features."}},"rotate":{"title":"Rotate","description":{"single":"Rotate this feature around its center point.","multiple":"Rotate these features around their center point."},"key":"R","annotation":{"line":"Rotated a line.","area":"Rotated an area.","multiple":"Rotated multiple features."},"incomplete_relation":{"single":"This feature can't be rotated because it hasn't been fully downloaded.","multiple":"These features can't be rotated because they haven't been fully downloaded."},"too_large":{"single":"This feature can't be rotated because not enough of it is currently visible.","multiple":"These features can't be rotated because not enough of them are currently visible."},"connected_to_hidden":{"single":"This feature can't be rotated because it is connected to a hidden feature.","multiple":"These features can't be rotated because some are connected to hidden features."}},"reverse":{"title":"Reverse","description":"Make this line go in the opposite direction.","key":"V","annotation":"Reversed a line."},"split":{"title":"Split","description":{"line":"Split this line into two at this node.","area":"Split the boundary of this area into two.","multiple":"Split the lines/area boundaries at this node into two."},"key":"X","annotation":{"line":"Split a line.","area":"Split an area boundary.","multiple":"Split {n} lines/area boundaries."},"not_eligible":"Lines can't be split at their beginning or end.","multiple_ways":"There are too many lines here to split.","connected_to_hidden":"This can't be split because it is connected to a hidden feature."},"restriction":{"help":{"select":"Click to select a road segment.","toggle":"Click to toggle turn restrictions.","toggle_on":"Click to add a \"{restriction}\" restriction.","toggle_off":"Click to remove the \"{restriction}\" restriction."},"annotation":{"create":"Added a turn restriction","delete":"Deleted a turn restriction"}}},"undo":{"tooltip":"Undo: {action}","nothing":"Nothing to undo."},"redo":{"tooltip":"Redo: {action}","nothing":"Nothing to redo."},"tooltip_keyhint":"Shortcut:","browser_notice":"This editor is supported in Firefox, Chrome, Safari, Opera, and Internet Explorer 11 and above. Please upgrade your browser or use Potlatch 2 to edit the map.","translate":{"translate":"Translate","localized_translation_label":"Multilingual name","localized_translation_language":"Choose language","localized_translation_name":"Name"},"zoom_in_edit":"Zoom in to Edit","login":"login","logout":"logout","loading_auth":"Connecting to OpenStreetMap...","report_a_bug":"Report a bug","help_translate":"Help translate","feature_info":{"hidden_warning":"{count} hidden features","hidden_details":"These features are currently hidden: {details}"},"status":{"error":"Unable to connect to API.","offline":"The API is offline. Please try editing later.","readonly":"The API is read-only. You will need to wait to save your changes.","rateLimit":"The API is limiting anonymous connections.  You can fix this by logging in."},"commit":{"title":"Upload to OpenStreetMap","description_placeholder":"Brief description of your contributions (required)","message_label":"Changeset Comment","upload_explanation":"The changes you upload will be visible on all maps that use OpenStreetMap data.","upload_explanation_with_user":"The changes you upload as {user} will be visible on all maps that use OpenStreetMap data.","save":"Upload","cancel":"Cancel","changes":"{count} Changes","warnings":"Warnings","modified":"Modified","deleted":"Deleted","created":"Created","about_changeset_comments":"About changeset comments","about_changeset_comments_link":"//wiki.openstreetmap.org/wiki/Good_changeset_comments","google_warning":"You mentioned Google in this comment: remember that copying from Google Maps is strictly forbidden.","google_warning_link":"http://www.openstreetmap.org/copyright"},"contributors":{"list":"Edits by {users}","truncated_list":"Edits by {users} and {count} others"},"info_panels":{"key":"I","background":{"key":"B","title":"Background","zoom":"Zoom","vintage":"Vintage","unknown":"Unknown","show_tiles":"Show Tiles","hide_tiles":"Hide Tiles"},"history":{"key":"H","title":"History","selected":"{n} selected","version":"Version","last_edit":"Last Edit","edited_by":"Edited By","changeset":"Changeset"