Merge branch 'master' into openstreetbugs
authorTom Hughes <tom@compton.nu>
Thu, 8 Mar 2012 18:23:27 +0000 (18:23 +0000)
committerTom Hughes <tom@compton.nu>
Thu, 8 Mar 2012 18:23:27 +0000 (18:23 +0000)
Conflicts:
Gemfile
Gemfile.lock
lib/migrate.rb

565 files changed:
.gitignore
Gemfile
Gemfile.lock
LICENSE [new file with mode: 0644]
README.md [new file with mode: 0644]
README.mkdn [deleted file]
app/assets/images/tab_bottom.gif [deleted file]
app/assets/images/users/images/large.png [moved from app/assets/images/anon_large.png with 100% similarity]
app/assets/images/users/images/small.png [moved from app/assets/images/anon_small.png with 100% similarity]
app/assets/javascripts/map.js.erb
app/assets/javascripts/menu.js
app/assets/javascripts/site.js
app/assets/stylesheets/common.css.scss
app/assets/stylesheets/large.css
app/assets/stylesheets/ltr.css.scss
app/assets/stylesheets/rtl.css.scss
app/assets/stylesheets/small.css.scss
app/controllers/amf_controller.rb
app/controllers/application_controller.rb
app/controllers/changeset_controller.rb
app/controllers/diary_entry_controller.rb
app/controllers/site_controller.rb
app/controllers/trace_controller.rb
app/controllers/user_controller.rb
app/controllers/user_roles_controller.rb
app/helpers/application_helper.rb
app/helpers/browse_helper.rb
app/models/acl.rb
app/models/changeset_tag.rb
app/models/client_application.rb
app/models/diary_comment.rb
app/models/diary_entry.rb
app/models/diary_sweeper.rb
app/models/language.rb
app/models/message.rb
app/models/node.rb
app/models/node_tag.rb
app/models/oauth_nonce.rb
app/models/old_node.rb
app/models/old_node_tag.rb
app/models/old_relation.rb
app/models/old_relation_member.rb
app/models/old_relation_tag.rb
app/models/old_way.rb
app/models/old_way_node.rb
app/models/old_way_tag.rb
app/models/relation.rb
app/models/relation_member.rb
app/models/relation_tag.rb
app/models/request_token.rb
app/models/trace.rb
app/models/tracepoint.rb
app/models/tracetag.rb
app/models/user.rb
app/models/user_block.rb
app/models/user_preference.rb
app/models/user_sweeper.rb
app/models/user_token.rb
app/models/way.rb
app/models/way_node.rb
app/models/way_tag.rb
app/views/browse/_changeset_details.html.erb
app/views/browse/node.html.erb
app/views/browse/relation.html.erb
app/views/browse/way.html.erb
app/views/changeset/list.html.erb
app/views/diary_entry/comments.html.erb [new file with mode: 0644]
app/views/diary_entry/list.html.erb
app/views/export/_sidebar.html.erb
app/views/export/start.js.erb
app/views/layouts/_head.html.erb
app/views/layouts/site.html.erb
app/views/message/_message_count.html.erb
app/views/message/outbox.html.erb
app/views/site/_resize.html.erb
app/views/site/copyright.html.erb
app/views/site/index.html.erb
app/views/user/account.html.erb
app/views/user/api_details.builder
app/views/user/blocked.html.erb [new file with mode: 0644]
app/views/user/list.html.erb
app/views/user/login.html.erb
app/views/user/new.html.erb
app/views/user/view.html.erb
config/application.rb
config/environments/development.rb
config/environments/production.rb
config/environments/test.rb
config/example.application.yml
config/example.database.yml [moved from config/postgres.example.database.yml with 100% similarity]
config/initializers/action_cache_path.rb [new file with mode: 0644]
config/initializers/action_mailer.rb
config/initializers/buffered_logger.rb
config/initializers/classic_pagination.rb [moved from vendor/plugins/classic_pagination/init.rb with 93% similarity]
config/initializers/composite_primary_keys.rb [deleted file]
config/initializers/file_column.rb [deleted file]
config/initializers/http_accept_language.rb [new file with mode: 0644]
config/initializers/i18n.rb
config/initializers/inflections.rb
config/initializers/mail.rb [new file with mode: 0644]
config/initializers/memcached.rb [deleted file]
config/initializers/output_compression.rb [new file with mode: 0644]
config/initializers/paperclip.rb [new file with mode: 0644]
config/initializers/session_store.rb
config/locales/af.yml
config/locales/aln.yml
config/locales/ar.yml
config/locales/arz.yml
config/locales/ast.yml
config/locales/be-TARASK.yml
config/locales/br.yml
config/locales/ca.yml
config/locales/cs.yml
config/locales/da.yml
config/locales/de-AT.yml [deleted file]
config/locales/de-CH.yml [deleted file]
config/locales/de.yml
config/locales/dsb.yml
config/locales/el.yml
config/locales/en-AU.yml [deleted file]
config/locales/en-GB.yml [deleted file]
config/locales/en-US.yml [deleted file]
config/locales/en.yml
config/locales/eo.yml
config/locales/es-AR.yml [deleted file]
config/locales/es-CL.yml [deleted file]
config/locales/es-CO.yml [deleted file]
config/locales/es-MX.yml [deleted file]
config/locales/es-PE.yml [deleted file]
config/locales/es.yml
config/locales/et.yml
config/locales/eu.yml
config/locales/fa.yml
config/locales/fi.yml
config/locales/fr-CA.yml [deleted file]
config/locales/fr-CH.yml [deleted file]
config/locales/fr.yml
config/locales/fur.yml
config/locales/gl-ES.yml [deleted file]
config/locales/gl.yml
config/locales/gsw-CH.yml [deleted file]
config/locales/he.yml
config/locales/hi-IN.yml [deleted file]
config/locales/hr.yml
config/locales/hsb.yml
config/locales/hu.yml
config/locales/ia.yml
config/locales/is.yml
config/locales/it.yml
config/locales/ja.yml
config/locales/ka.yml
config/locales/lb.yml
config/locales/lt.yml
config/locales/lv.yml
config/locales/mk.yml
config/locales/ms.yml
config/locales/nb.yml
config/locales/nds.yml
config/locales/ne.yml
config/locales/nl.yml
config/locales/nn.yml
config/locales/pl.yml
config/locales/pt-BR.yml
config/locales/pt-PT.yml [deleted file]
config/locales/pt.yml
config/locales/ro.yml
config/locales/ru.yml
config/locales/sk.yml
config/locales/sl.yml
config/locales/sq.yml
config/locales/sr-EC.yml
config/locales/sr-EL.yml
config/locales/sv-SE.yml [deleted file]
config/locales/sv.yml
config/locales/ta.yml [new file with mode: 0644]
config/locales/tl.yml
config/locales/tr.yml
config/locales/uk.yml
config/locales/vi.yml
config/locales/zh-CN.yml
config/locales/zh-TW.yml
config/mysql.example.database.yml [deleted file]
config/pluralizers.rb [deleted file]
config/routes.rb
db/.gitignore [deleted file]
db/README
db/functions/Makefile
db/functions/maptile.c
db/functions/quadtile.c
db/functions/xid_to_int4.c
db/migrate/001_create_osm_db.rb
db/migrate/002_cleanup_osm_db.rb
db/migrate/003_sql_session_store_setup.rb
db/migrate/004_user_enhancements.rb
db/migrate/005_tile_tracepoints.rb
db/migrate/006_tile_nodes.rb
db/migrate/007_add_relations.rb
db/migrate/008_remove_segments.rb
db/migrate/010_diary_comments.rb
db/migrate/018_create_acls.rb
db/migrate/020_populate_node_tags_and_remove.rb
db/migrate/021_move_to_innodb.rb
db/migrate/022_key_constraints.rb
db/migrate/023_add_changesets.rb
db/migrate/024_order_relation_members.rb
db/migrate/025_add_end_time_to_changesets.rb
db/migrate/029_add_user_foreign_keys.rb
db/migrate/030_add_foreign_keys.rb
db/migrate/031_create_countries.rb
db/migrate/034_create_languages.rb
db/migrate/035_change_user_locale.rb
db/migrate/039_add_more_controls_to_gpx_files.rb
db/migrate/042_add_foreign_keys_to_oauth_tables.rb
db/migrate/044_create_user_roles.rb
db/migrate/045_create_user_blocks.rb
db/migrate/046_alter_user_roles_and_blocks.rb
db/migrate/051_add_status_to_user.rb
db/migrate/20111212183945_add_lowercase_user_indexes.rb
db/migrate/20120123184321_switch_to_paperclip.rb [new file with mode: 0644]
db/migrate/20120208122334_merge_acl_address_and_mask.rb [new file with mode: 0644]
db/migrate/20120208194454_add_domain_to_acl.rb [new file with mode: 0644]
db/migrate/20120219161649_add_user_image_fingerprint.rb [new file with mode: 0644]
db/structure.sql [new file with mode: 0644]
lib/classic_pagination/pagination.rb [moved from vendor/gems/composite_primary_keys-2.2.2/test/plugins/pagination.rb with 100% similarity]
lib/classic_pagination/pagination_helper.rb [moved from vendor/gems/composite_primary_keys-2.2.2/test/plugins/pagination_helper.rb with 100% similarity]
lib/mem_cache.rb [new file with mode: 0644]
lib/memcache.rb [new file with mode: 0644]
lib/migrate.rb
lib/osm.rb
lib/output_compression/LICENSE [moved from vendor/plugins/output_compression/LICENSE with 100% similarity]
lib/output_compression/README [moved from vendor/plugins/output_compression/README with 100% similarity]
lib/output_compression/output_compression.rb [moved from vendor/plugins/output_compression/lib/output_compression.rb with 100% similarity]
lib/potlatch2.rb
lib/session_persistence.rb [moved from vendor/gems/composite_primary_keys-2.2.2/lib/composite_primary_keys.rb with 52% similarity]
public/403.html
public/404.html
public/500.html
public/potlatch2/locales/ast.swf [new file with mode: 0644]
public/potlatch2/locales/br.swf [new file with mode: 0644]
public/potlatch2/locales/de_DE.swf
public/potlatch2/locales/en_GB.swf
public/potlatch2/locales/en_US.swf
public/potlatch2/locales/es_ES.swf [new file with mode: 0644]
public/potlatch2/locales/fi.swf [new file with mode: 0644]
public/potlatch2/locales/fr_FR.swf
public/potlatch2/locales/he.swf [new file with mode: 0644]
public/potlatch2/locales/hsb.swf [new file with mode: 0644]
public/potlatch2/locales/ja_JP.swf
public/potlatch2/locales/mk.swf [new file with mode: 0644]
public/potlatch2/locales/ms.swf [new file with mode: 0644]
public/potlatch2/locales/nb_NO.swf [new file with mode: 0644]
public/potlatch2/locales/nl_NL.swf [new file with mode: 0644]
public/potlatch2/locales/nn_NO.swf [new file with mode: 0644]
public/potlatch2/locales/pl_PL.swf
public/potlatch2/locales/ru.swf [new file with mode: 0644]
public/potlatch2/locales/sq.swf [new file with mode: 0644]
public/potlatch2/locales/tr.swf [new file with mode: 0644]
public/potlatch2/locales/vi_VN.swf
public/potlatch2/locales/zh_CN.swf [new file with mode: 0644]
public/potlatch2/map_features/buildings.xml
public/potlatch2/map_features/landuse.xml
public/potlatch2/potlatch2.swf
public/potlatch2/stylesheets/core_ways.css
public/potlatch2/stylesheets/snapshot.css
script/deliver-message
script/update-spam-blocks
test/fixtures/diary_comments.yml
test/fixtures/diary_entries.yml
test/fixtures/users.yml
test/functional/way_controller_test.rb
test/integration/user_blocks_test.rb
test/unit/diary_comment_test.rb
test/unit/diary_entry_test.rb
test/unit/i18n_test.rb [new file with mode: 0644]
test/unit/node_test.rb
test/unit/oauth_token_test.rb
test/unit/trace_test.rb
test/unit/tracetag_test.rb
test/unit/user_test.rb
vendor/gems/composite_primary_keys-2.2.2/._History.txt [deleted file]
vendor/gems/composite_primary_keys-2.2.2/._Manifest.txt [deleted file]
vendor/gems/composite_primary_keys-2.2.2/._README_DB2.txt [deleted file]
vendor/gems/composite_primary_keys-2.2.2/.specification [deleted file]
vendor/gems/composite_primary_keys-2.2.2/History.txt [deleted file]
vendor/gems/composite_primary_keys-2.2.2/Manifest.txt [deleted file]
vendor/gems/composite_primary_keys-2.2.2/README.txt [deleted file]
vendor/gems/composite_primary_keys-2.2.2/README_DB2.txt [deleted file]
vendor/gems/composite_primary_keys-2.2.2/Rakefile [deleted file]
vendor/gems/composite_primary_keys-2.2.2/init.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/install.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/lib/._composite_primary_keys.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/lib/adapter_helper/._base.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/lib/adapter_helper/base.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/lib/adapter_helper/mysql.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/lib/adapter_helper/oracle.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/lib/adapter_helper/postgresql.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/lib/adapter_helper/sqlite3.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/lib/composite_primary_keys/._associations.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/lib/composite_primary_keys/._base.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/lib/composite_primary_keys/._version.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/lib/composite_primary_keys/association_preload.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/lib/composite_primary_keys/associations.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/lib/composite_primary_keys/attribute_methods.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/lib/composite_primary_keys/base.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/lib/composite_primary_keys/calculations.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/lib/composite_primary_keys/composite_arrays.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/lib/composite_primary_keys/connection_adapters/ibm_db_adapter.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/lib/composite_primary_keys/connection_adapters/oracle_adapter.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/lib/composite_primary_keys/connection_adapters/postgresql_adapter.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/lib/composite_primary_keys/connection_adapters/sqlite3_adapter.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/lib/composite_primary_keys/fixtures.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/lib/composite_primary_keys/migration.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/lib/composite_primary_keys/reflection.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/lib/composite_primary_keys/version.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/loader.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/local/._paths.rb.sample [deleted file]
vendor/gems/composite_primary_keys-2.2.2/local/database_connections.rb.sample [deleted file]
vendor/gems/composite_primary_keys-2.2.2/local/paths.rb.sample [deleted file]
vendor/gems/composite_primary_keys-2.2.2/local/tasks.rb.sample [deleted file]
vendor/gems/composite_primary_keys-2.2.2/scripts/console.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/scripts/txt2html [deleted file]
vendor/gems/composite_primary_keys-2.2.2/scripts/txt2js [deleted file]
vendor/gems/composite_primary_keys-2.2.2/tasks/activerecord_selection.rake [deleted file]
vendor/gems/composite_primary_keys-2.2.2/tasks/databases.rake [deleted file]
vendor/gems/composite_primary_keys-2.2.2/tasks/databases/mysql.rake [deleted file]
vendor/gems/composite_primary_keys-2.2.2/tasks/databases/oracle.rake [deleted file]
vendor/gems/composite_primary_keys-2.2.2/tasks/databases/postgresql.rake [deleted file]
vendor/gems/composite_primary_keys-2.2.2/tasks/databases/sqlite3.rake [deleted file]
vendor/gems/composite_primary_keys-2.2.2/tasks/deployment.rake [deleted file]
vendor/gems/composite_primary_keys-2.2.2/tasks/local_setup.rake [deleted file]
vendor/gems/composite_primary_keys-2.2.2/tasks/website.rake [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/._test_associations.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/._test_exists.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/._test_find.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/README_tests.txt [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/abstract_unit.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/connections/native_ibm_db/connection.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/connections/native_mysql/connection.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/connections/native_oracle/connection.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/connections/native_postgresql/connection.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/connections/native_sqlite/connection.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/fixtures/._article.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/fixtures/._articles.yml [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/fixtures/._comment.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/fixtures/._department.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/fixtures/._departments.yml [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/fixtures/._employee.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/fixtures/._group.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/fixtures/._hack.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/fixtures/._membership.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/fixtures/._memberships.yml [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/fixtures/._product.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/fixtures/._reading.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/fixtures/._reference_code.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/fixtures/article.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/fixtures/articles.yml [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/fixtures/comment.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/fixtures/comments.yml [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/fixtures/db_definitions/db2-create-tables.sql [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/fixtures/db_definitions/db2-drop-tables.sql [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/fixtures/db_definitions/mysql.sql [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/fixtures/db_definitions/oracle.drop.sql [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/fixtures/db_definitions/oracle.sql [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/fixtures/db_definitions/postgresql.sql [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/fixtures/db_definitions/sqlite.sql [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/fixtures/department.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/fixtures/departments.yml [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/fixtures/employee.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/fixtures/employees.yml [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/fixtures/group.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/fixtures/groups.yml [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/fixtures/hack.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/fixtures/hacks.yml [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/fixtures/membership.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/fixtures/membership_status.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/fixtures/membership_statuses.yml [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/fixtures/memberships.yml [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/fixtures/product.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/fixtures/product_tariff.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/fixtures/product_tariffs.yml [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/fixtures/products.yml [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/fixtures/reading.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/fixtures/readings.yml [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/fixtures/reference_code.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/fixtures/reference_codes.yml [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/fixtures/reference_type.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/fixtures/reference_types.yml [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/fixtures/street.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/fixtures/streets.yml [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/fixtures/suburb.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/fixtures/suburbs.yml [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/fixtures/tariff.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/fixtures/tariffs.yml [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/fixtures/user.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/fixtures/users.yml [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/hash_tricks.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/test_associations.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/test_attribute_methods.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/test_attributes.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/test_clone.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/test_composite_arrays.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/test_create.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/test_delete.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/test_dummy.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/test_exists.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/test_find.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/test_ids.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/test_miscellaneous.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/test_pagination.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/test_polymorphic.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/test_santiago.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/test_tutorial_examle.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/test/test_update.rb [deleted file]
vendor/gems/composite_primary_keys-2.2.2/tmp/test.db [deleted file]
vendor/gems/composite_primary_keys-2.2.2/website/index.html [deleted file]
vendor/gems/composite_primary_keys-2.2.2/website/index.txt [deleted file]
vendor/gems/composite_primary_keys-2.2.2/website/javascripts/rounded_corners_lite.inc.js [deleted file]
vendor/gems/composite_primary_keys-2.2.2/website/stylesheets/screen.css [deleted file]
vendor/gems/composite_primary_keys-2.2.2/website/template.js [deleted file]
vendor/gems/composite_primary_keys-2.2.2/website/template.rhtml [deleted file]
vendor/gems/composite_primary_keys-2.2.2/website/version-raw.js [deleted file]
vendor/gems/composite_primary_keys-2.2.2/website/version-raw.txt [deleted file]
vendor/gems/composite_primary_keys-2.2.2/website/version.js [deleted file]
vendor/gems/composite_primary_keys-2.2.2/website/version.txt [deleted file]
vendor/plugins/classic_pagination/CHANGELOG [deleted file]
vendor/plugins/classic_pagination/README [deleted file]
vendor/plugins/classic_pagination/Rakefile [deleted file]
vendor/plugins/classic_pagination/install.rb [deleted file]
vendor/plugins/classic_pagination/lib/pagination.rb [deleted file]
vendor/plugins/classic_pagination/lib/pagination_helper.rb [deleted file]
vendor/plugins/classic_pagination/test/fixtures/companies.yml [deleted file]
vendor/plugins/classic_pagination/test/fixtures/company.rb [deleted file]
vendor/plugins/classic_pagination/test/fixtures/developer.rb [deleted file]
vendor/plugins/classic_pagination/test/fixtures/developers.yml [deleted file]
vendor/plugins/classic_pagination/test/fixtures/developers_projects.yml [deleted file]
vendor/plugins/classic_pagination/test/fixtures/project.rb [deleted file]
vendor/plugins/classic_pagination/test/fixtures/projects.yml [deleted file]
vendor/plugins/classic_pagination/test/fixtures/replies.yml [deleted file]
vendor/plugins/classic_pagination/test/fixtures/reply.rb [deleted file]
vendor/plugins/classic_pagination/test/fixtures/schema.sql [deleted file]
vendor/plugins/classic_pagination/test/fixtures/topic.rb [deleted file]
vendor/plugins/classic_pagination/test/fixtures/topics.yml [deleted file]
vendor/plugins/classic_pagination/test/helper.rb [deleted file]
vendor/plugins/classic_pagination/test/pagination_helper_test.rb [deleted file]
vendor/plugins/classic_pagination/test/pagination_test.rb [deleted file]
vendor/plugins/deadlock_retry/README [deleted file]
vendor/plugins/deadlock_retry/Rakefile [deleted file]
vendor/plugins/deadlock_retry/init.rb [deleted file]
vendor/plugins/deadlock_retry/lib/deadlock_retry.rb [deleted file]
vendor/plugins/deadlock_retry/test/deadlock_retry_test.rb [deleted file]
vendor/plugins/file_column/CHANGELOG [deleted file]
vendor/plugins/file_column/README [deleted file]
vendor/plugins/file_column/Rakefile [deleted file]
vendor/plugins/file_column/TODO [deleted file]
vendor/plugins/file_column/init.rb [deleted file]
vendor/plugins/file_column/lib/file_column.rb [deleted file]
vendor/plugins/file_column/lib/file_column_helper.rb [deleted file]
vendor/plugins/file_column/lib/file_compat.rb [deleted file]
vendor/plugins/file_column/lib/magick_file_column.rb [deleted file]
vendor/plugins/file_column/lib/rails_file_column.rb [deleted file]
vendor/plugins/file_column/lib/test_case.rb [deleted file]
vendor/plugins/file_column/lib/validations.rb [deleted file]
vendor/plugins/file_column/test/abstract_unit.rb [deleted file]
vendor/plugins/file_column/test/connection.rb [deleted file]
vendor/plugins/file_column/test/file_column_helper_test.rb [deleted file]
vendor/plugins/file_column/test/file_column_test.rb [deleted file]
vendor/plugins/file_column/test/fixtures/entry.rb [deleted file]
vendor/plugins/file_column/test/fixtures/invalid-image.jpg [deleted file]
vendor/plugins/file_column/test/fixtures/kerb.jpg [deleted file]
vendor/plugins/file_column/test/fixtures/mysql.sql [deleted file]
vendor/plugins/file_column/test/fixtures/schema.rb [deleted file]
vendor/plugins/file_column/test/fixtures/skanthak.png [deleted file]
vendor/plugins/file_column/test/magick_test.rb [deleted file]
vendor/plugins/file_column/test/magick_view_only_test.rb [deleted file]
vendor/plugins/http_accept_language/README.rdoc [deleted file]
vendor/plugins/http_accept_language/Rakefile [deleted file]
vendor/plugins/http_accept_language/VERSION [deleted file]
vendor/plugins/http_accept_language/init.rb [deleted file]
vendor/plugins/http_accept_language/lib/http_accept_language.rb [deleted file]
vendor/plugins/http_accept_language/test/http_accept_language_test.rb [deleted file]
vendor/plugins/output_compression/Rakefile [deleted file]
vendor/plugins/output_compression/init.rb [deleted file]
vendor/plugins/output_compression/lib/tasks/output_compression_tasks.rake [deleted file]
vendor/plugins/output_compression/test/output_compression_test.rb [deleted file]
vendor/plugins/session-persistence/MIT_LICENSE [deleted file]
vendor/plugins/session-persistence/README.rdoc [deleted file]
vendor/plugins/session-persistence/init.rb [deleted file]
vendor/plugins/session-persistence/lib/session_persistence.rb [deleted file]
vendor/plugins/session-persistence/test/session_timeout_test.rb [deleted file]
vendor/rails-locales/ar.yml [deleted file]
vendor/rails-locales/az.yml [deleted file]
vendor/rails-locales/bg.yml [deleted file]
vendor/rails-locales/bn-IN.yml [deleted file]
vendor/rails-locales/bs.yml [deleted file]
vendor/rails-locales/ca.yml [deleted file]
vendor/rails-locales/cs.yml [deleted file]
vendor/rails-locales/csb.yml [deleted file]
vendor/rails-locales/cy.yml [deleted file]
vendor/rails-locales/da.yml [deleted file]
vendor/rails-locales/de-AT.yml [deleted file]
vendor/rails-locales/de-CH.yml [deleted file]
vendor/rails-locales/de.yml [deleted file]
vendor/rails-locales/dsb.yml [deleted file]
vendor/rails-locales/el.yml [deleted file]
vendor/rails-locales/en-AU.yml [deleted file]
vendor/rails-locales/en-GB.yml [deleted file]
vendor/rails-locales/en-IN.yml [deleted file]
vendor/rails-locales/en-US.yml [deleted file]
vendor/rails-locales/eo.yml [deleted file]
vendor/rails-locales/es-AR.yml [deleted file]
vendor/rails-locales/es-CL.yml [deleted file]
vendor/rails-locales/es-CO.yml [deleted file]
vendor/rails-locales/es-MX.yml [deleted file]
vendor/rails-locales/es-PE.yml [deleted file]
vendor/rails-locales/es.yml [deleted file]
vendor/rails-locales/et.yml [deleted file]
vendor/rails-locales/eu.yml [deleted file]
vendor/rails-locales/fa.yml [deleted file]
vendor/rails-locales/fi.yml [deleted file]
vendor/rails-locales/fr-CA.yml [deleted file]
vendor/rails-locales/fr-CH.yml [deleted file]
vendor/rails-locales/fr.yml [deleted file]
vendor/rails-locales/fun/en-AU.rb [deleted file]
vendor/rails-locales/fun/gibberish.rb [deleted file]
vendor/rails-locales/fur.yml [deleted file]
vendor/rails-locales/gl-ES.yml [deleted file]
vendor/rails-locales/gsw-CH.yml [deleted file]
vendor/rails-locales/he.yml [deleted file]
vendor/rails-locales/hi-IN.yml [deleted file]
vendor/rails-locales/hi.yml [deleted file]
vendor/rails-locales/hr.yml [deleted file]
vendor/rails-locales/hsb.yml [deleted file]
vendor/rails-locales/hu.yml [deleted file]
vendor/rails-locales/id.yml [deleted file]
vendor/rails-locales/is.yml [deleted file]
vendor/rails-locales/it.yml [deleted file]
vendor/rails-locales/ja.yml [deleted file]
vendor/rails-locales/kn.yml [deleted file]
vendor/rails-locales/ko.yml [deleted file]
vendor/rails-locales/lo.yml [deleted file]
vendor/rails-locales/lt.yml [deleted file]
vendor/rails-locales/lv.yml [deleted file]
vendor/rails-locales/mk.yml [deleted file]
vendor/rails-locales/mn.yml [deleted file]
vendor/rails-locales/nb.yml [deleted file]
vendor/rails-locales/nl.yml [deleted file]
vendor/rails-locales/nn.yml [deleted file]
vendor/rails-locales/pl.yml [deleted file]
vendor/rails-locales/pt-BR.yml [deleted file]
vendor/rails-locales/pt-PT.yml [deleted file]
vendor/rails-locales/rm.yml [deleted file]
vendor/rails-locales/ro.yml [deleted file]
vendor/rails-locales/ru.yml [deleted file]
vendor/rails-locales/sk.yml [deleted file]
vendor/rails-locales/sl.yml [deleted file]
vendor/rails-locales/sr-Latn.yml [deleted file]
vendor/rails-locales/sr.yml [deleted file]
vendor/rails-locales/sv-SE.yml [deleted file]
vendor/rails-locales/sw.yml [deleted file]
vendor/rails-locales/th.yml [deleted file]
vendor/rails-locales/tr.yml [deleted file]
vendor/rails-locales/uk.yml [deleted file]
vendor/rails-locales/vi.yml [deleted file]
vendor/rails-locales/zh-CN.yml [deleted file]
vendor/rails-locales/zh-TW.yml [deleted file]

index 2b8b7bd68ae25333db8773682be1566e03bcd1c7..021bc9be273ff5d4456244db843fbb58d5407cd9 100644 (file)
@@ -1,4 +1,5 @@
 log
 public/assets
+public/attachments
 tmp
 .DS_Store
diff --git a/Gemfile b/Gemfile
index 0f867f3d55a566210665c7a14731e89e4bdccfee..65de156e17b6a1d3b327663079f55faa44f63c0a 100644 (file)
--- a/Gemfile
+++ b/Gemfile
@@ -2,7 +2,7 @@
 source 'http://rubygems.org'
 
 # Require rails
-gem 'rails', '3.1.3'
+gem 'rails', '3.2.2'
 
 # Require the postgres database driver
 gem 'pg'
@@ -11,21 +11,24 @@ gem 'pg'
 gem 'jquery-rails'
 
 # Load rails plugins
-gem 'rails-i18n-updater'
+gem 'rails-i18n', ">= 0.5.1"
 gem 'dynamic_form'
 gem 'rinku', '>= 1.2.2', :require => 'rails_rinku'
 gem 'oauth-plugin', '>= 0.4.0.pre7'
 gem 'open_id_authentication', '>= 1.1.0'
 gem 'validates_email_format_of', '>= 1.5.1'
-gem 'composite_primary_keys', '>= 4.1.1'
+gem 'composite_primary_keys', '>= 5.0.0'
+gem 'http_accept_language', '>= 1.0.2'
+gem 'paperclip', '~> 2.0'
+gem 'deadlock_retry', '>= 1.2.0'
 gem 'jsonify-rails'
 
+# Character conversion support for ruby 1.8
+gem 'iconv', :platforms => :ruby_18
+
 # Load libxml support for XML parsing and generation
 gem 'libxml-ruby', '>= 2.0.5', :require => 'libxml'
 
-# Load ImageMagick support for user picture resizing
-gem 'rmagick', :require => 'RMagick'
-
 # Load HTML sanitizer
 gem 'sanitize'
 
@@ -36,8 +39,7 @@ gem 'SystemTimer', '>= 1.1.3', :require => 'system_timer', :platforms => :ruby_1
 gem 'httpclient'
 
 # Load memcache in case we are using it
-gem 'memcache-client'
-gem 'memcached'
+gem 'memcached', '>= 1.4.1'
 
 # Gems needed for running tests
 group :test do
@@ -46,8 +48,8 @@ end
 
 # Gems needed for compiling assets
 group :assets do
-  gem 'sass-rails', "  ~> 3.1.0"
-  gem 'coffee-rails', "~> 3.1.0"
-  gem 'uglifier'
+  gem 'sass-rails', '~> 3.2.3'
+  gem 'coffee-rails', '~> 3.2.1'
+  gem 'uglifier', '>= 1.0.3'
   gem 'therubyracer'
 end
index 482d9c3edac768aea5309a05d2fd9602c3f969a0..e212d100374d22d9a3c1c61dc04ded678984ccda 100644 (file)
@@ -2,76 +2,80 @@ GEM
   remote: http://rubygems.org/
   specs:
     SystemTimer (1.2.3)
-    actionmailer (3.1.3)
-      actionpack (= 3.1.3)
-      mail (~> 2.3.0)
-    actionpack (3.1.3)
-      activemodel (= 3.1.3)
-      activesupport (= 3.1.3)
+    actionmailer (3.2.2)
+      actionpack (= 3.2.2)
+      mail (~> 2.4.0)
+    actionpack (3.2.2)
+      activemodel (= 3.2.2)
+      activesupport (= 3.2.2)
       builder (~> 3.0.0)
       erubis (~> 2.7.0)
-      i18n (~> 0.6)
-      rack (~> 1.3.5)
+      journey (~> 1.0.1)
+      rack (~> 1.4.0)
       rack-cache (~> 1.1)
-      rack-mount (~> 0.8.2)
       rack-test (~> 0.6.1)
-      sprockets (~> 2.0.3)
-    activemodel (3.1.3)
-      activesupport (= 3.1.3)
+      sprockets (~> 2.1.2)
+    activemodel (3.2.2)
+      activesupport (= 3.2.2)
       builder (~> 3.0.0)
-      i18n (~> 0.6)
-    activerecord (3.1.3)
-      activemodel (= 3.1.3)
-      activesupport (= 3.1.3)
-      arel (~> 2.2.1)
+    activerecord (3.2.2)
+      activemodel (= 3.2.2)
+      activesupport (= 3.2.2)
+      arel (~> 3.0.2)
       tzinfo (~> 0.3.29)
-    activeresource (3.1.3)
-      activemodel (= 3.1.3)
-      activesupport (= 3.1.3)
-    activesupport (3.1.3)
+    activeresource (3.2.2)
+      activemodel (= 3.2.2)
+      activesupport (= 3.2.2)
+    activesupport (3.2.2)
+      i18n (~> 0.6)
       multi_json (~> 1.0)
-    addressable (2.2.6)
-    arel (2.2.1)
+    addressable (2.2.7)
+    arel (3.0.2)
     builder (3.0.0)
-    coffee-rails (3.1.1)
+    cocaine (0.2.1)
+    coffee-rails (3.2.2)
       coffee-script (>= 2.2.0)
-      railties (~> 3.1.0)
+      railties (~> 3.2.0)
     coffee-script (2.2.0)
       coffee-script-source
       execjs
-    coffee-script-source (1.1.3)
-    composite_primary_keys (4.1.1)
-      activerecord (~> 3.1)
+    coffee-script-source (1.2.0)
+    composite_primary_keys (5.0.1)
+      activerecord (~> 3.2.0)
+    deadlock_retry (1.2.0)
     dynamic_form (1.1.4)
     erubis (2.7.0)
-    execjs (1.2.9)
+    execjs (1.3.0)
       multi_json (~> 1.0)
-    faraday (0.7.5)
-      addressable (~> 2.2.6)
-      multipart-post (~> 1.1.3)
-      rack (< 2, >= 1.1.0)
+    faraday (0.7.6)
+      addressable (~> 2.2)
+      multipart-post (~> 1.1)
+      rack (~> 1.1)
     hike (1.2.1)
-    httpclient (2.2.3)
+    http_accept_language (1.0.2)
+    httpclient (2.2.4)
     i18n (0.6.0)
-    jquery-rails (1.0.18)
-      railties (~> 3.0)
+    iconv (0.1)
+    journey (1.0.3)
+    jquery-rails (2.0.1)
+      railties (>= 3.2.0, < 5.0)
       thor (~> 0.14)
-    json (1.6.1)
-    jsonify (0.2.0)
-    jsonify-rails (0.2.0)
+    json (1.6.5)
+    jsonify (0.3.1)
+      multi_json (~> 1.0)
+    jsonify-rails (0.3.1)
       actionpack
-      jsonify (>= 0.2.0)
+      jsonify (>= 0.3.1)
     libv8 (3.3.10.4)
     libxml-ruby (2.2.2)
-    mail (2.3.0)
+    mail (2.4.3)
       i18n (>= 0.4.0)
       mime-types (~> 1.16)
       treetop (~> 1.4.8)
-    memcache-client (1.8.5)
-    memcached (1.3.5)
+    memcached (1.4.1)
     mime-types (1.17.2)
-    multi_json (1.0.3)
-    multipart-post (1.1.3)
+    multi_json (1.1.0)
+    multipart-post (1.1.5)
     nokogiri (1.5.0)
     oauth (0.4.5)
     oauth-plugin (0.4.0.rc2)
@@ -79,18 +83,21 @@ GEM
       oauth (~> 0.4.4)
       oauth2
       rack
-    oauth2 (0.5.1)
-      faraday (~> 0.7.4)
-      multi_json (~> 1.0.3)
+    oauth2 (0.5.2)
+      faraday (~> 0.7)
+      multi_json (~> 1.0)
     open_id_authentication (1.1.0)
       rack-openid (~> 1.3)
-    pg (0.11.0)
+    paperclip (2.7.0)
+      activerecord (>= 2.3.0)
+      activesupport (>= 2.3.2)
+      cocaine (>= 0.0.2)
+      mime-types
+    pg (0.13.2)
     polyglot (0.3.3)
-    rack (1.3.5)
-    rack-cache (1.1)
+    rack (1.4.1)
+    rack-cache (1.2)
       rack (>= 0.4)
-    rack-mount (0.8.3)
-      rack (>= 1.0.0)
     rack-openid (1.3.1)
       rack (>= 1.1.0)
       ruby-openid (>= 2.1.8)
@@ -98,44 +105,40 @@ GEM
       rack
     rack-test (0.6.1)
       rack (>= 1.0)
-    rails (3.1.3)
-      actionmailer (= 3.1.3)
-      actionpack (= 3.1.3)
-      activerecord (= 3.1.3)
-      activeresource (= 3.1.3)
-      activesupport (= 3.1.3)
+    rails (3.2.2)
+      actionmailer (= 3.2.2)
+      actionpack (= 3.2.2)
+      activerecord (= 3.2.2)
+      activeresource (= 3.2.2)
+      activesupport (= 3.2.2)
       bundler (~> 1.0)
-      railties (= 3.1.3)
-    rails-i18n-updater (1.0.1)
-      actionpack
-      activesupport
-      rails
-    railties (3.1.3)
-      actionpack (= 3.1.3)
-      activesupport (= 3.1.3)
+      railties (= 3.2.2)
+    rails-i18n (0.5.1)
+      i18n (~> 0.5)
+    railties (3.2.2)
+      actionpack (= 3.2.2)
+      activesupport (= 3.2.2)
       rack-ssl (~> 1.3.2)
       rake (>= 0.8.7)
       rdoc (~> 3.4)
       thor (~> 0.14.6)
     rake (0.9.2.2)
-    rdoc (3.11)
+    rdoc (3.12)
       json (~> 1.4)
-    rinku (1.4.1)
-    rmagick (2.13.1)
+    rinku (1.5.1)
     ruby-openid (2.1.8)
     sanitize (2.0.3)
-      nokogiri (< 1.6, >= 1.4.4)
-    sass (3.1.10)
-    sass-rails (3.1.5)
-      actionpack (~> 3.1.0)
-      railties (~> 3.1.0)
-      sass (~> 3.1.10)
-      tilt (~> 1.3.2)
-    sprockets (2.0.3)
+      nokogiri (>= 1.4.4, < 1.6)
+    sass (3.1.15)
+    sass-rails (3.2.4)
+      railties (~> 3.2.0)
+      sass (>= 3.1.10)
+      tilt (~> 1.3)
+    sprockets (2.1.2)
       hike (~> 1.2)
       rack (~> 1.0)
-      tilt (!= 1.3.0, ~> 1.1)
-    therubyracer (0.9.9)
+      tilt (~> 1.1, != 1.3.0)
+    therubyracer (0.9.10)
       libv8 (~> 3.3.10)
     thor (0.14.6)
     tilt (1.3.3)
@@ -143,8 +146,8 @@ GEM
     treetop (1.4.10)
       polyglot
       polyglot (>= 0.3.1)
-    tzinfo (0.3.31)
-    uglifier (1.1.0)
+    tzinfo (0.3.32)
+    uglifier (1.2.3)
       execjs (>= 0.3.0)
       multi_json (>= 1.0.2)
     validates_email_format_of (1.5.3)
@@ -154,25 +157,27 @@ PLATFORMS
 
 DEPENDENCIES
   SystemTimer (>= 1.1.3)
-  coffee-rails (~> 3.1.0)
-  composite_primary_keys (>= 4.1.1)
+  coffee-rails (~> 3.2.1)
+  composite_primary_keys (>= 5.0.0)
+  deadlock_retry (>= 1.2.0)
   dynamic_form
+  http_accept_language (>= 1.0.2)
   httpclient
+  iconv
   jquery-rails
   jsonify-rails
   libxml-ruby (>= 2.0.5)
-  memcache-client
-  memcached
+  memcached (>= 1.4.1)
   oauth-plugin (>= 0.4.0.pre7)
   open_id_authentication (>= 1.1.0)
+  paperclip (~> 2.0)
   pg
-  rails (= 3.1.3)
-  rails-i18n-updater
+  rails (= 3.2.2)
+  rails-i18n (>= 0.5.1)
   rinku (>= 1.2.2)
-  rmagick
   sanitize
-  sass-rails (~> 3.1.0)
+  sass-rails (~> 3.2.3)
   therubyracer
   timecop
-  uglifier
+  uglifier (>= 1.0.3)
   validates_email_format_of (>= 1.5.1)
diff --git a/LICENSE b/LICENSE
new file mode 100644 (file)
index 0000000..d159169
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,339 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                            NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/README.md b/README.md
new file mode 100644 (file)
index 0000000..edad66c
--- /dev/null
+++ b/README.md
@@ -0,0 +1,132 @@
+# Description
+
+This is the Rails port, the [Ruby on Rails](http://rubyonrails.org/)
+application that powers [OpenStreetMap](http://www.openstreetmap.org).
+
+The Rails port provides almost all the services which are available 
+on the OpenStreetMap site, including:
+
+* The web site itself, including the edit pages.
+* The editing [API](http://wiki.openstreetmap.org/wiki/API_v0.6).
+* Browse pages - a web front-end to the OpenStreetMap data.
+* The user system, including preferences, diary entries, friends and
+  user-to-user messaging.
+* GPX uploads, browsing and API.
+
+There are some non-Rails services which the site includes, for 
+example; tiles, geocoding, GPX file loading. There are also some
+utilities which provide other services on the OpenStreetMap site,
+or improve its function, but are not integrated with the Rails 
+port, for example; Osmosis, CGImap.
+
+# License
+
+This software is licensed under the [GNU General Public License 2.0](http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt),
+a copy of which can be found in the LICENSE file.
+
+# Running it
+
+You can find documentation on [how to setup and
+run](http://wiki.openstreetmap.org/wiki/The_Rails_Port) the software
+on the OpenStreetMap wiki.
+
+# Hacking it
+
+The canonical Git repository for this software is hosted at
+[git.openstreetmap.org](http://git.openstreetmap.org/?p=rails.git),
+but much of the development is done on GitHub and for most people
+[this repository on Github](https://github.com/openstreetmap/openstreetmap-website)
+will be a better place to start.
+
+Anybody hacking on the code is welcome to join the
+[rails-dev](http://lists.openstreetmap.org/listinfo/rails-dev) mailing
+list where other people hacking on the code hang out and will be happy
+to help with any problems you may encounter.
+
+There are also weekly IRC meetings, at 1800 GMT on Mondays in #osm-ewg on
+the OFTC network where questions can be asked and ideas discussed. For more 
+information, please see [the EWG page]
+(http://www.osmfoundation.org/wiki/Engineering_Working_Group#Meetings). You can
+join the channel using your favourite IRC client or [irc.openstreetmap.org](http://irc.openstreetmap.org/).
+
+## Rails
+
+If you're not already familiar with Ruby on Rails then it's probably
+worth having a look at [Rails Guides](http://guides.rubyonrails.org/) for an introduction.
+
+While working with Rails you will probably find the [API documentation](http://api.rubyonrails.org/)
+helpful as a reference.
+
+## Coding style
+
+When writing code it is generally a good idea to try and match your
+formatting to hat of any existing code in the same file, or to other
+similar files if you are writing new code. Consistency of layout is
+far more important that the layout itself as it makes reading code
+much easier.
+
+One golden rule of formatting -- please don't use tabs in your code
+as they will cause the file to be formatted differently for different
+people depending on how they have their editor configured.
+
+## Testing
+
+Having a good suite of tests is very important to the stability and
+maintainability of any code base. The tests in the Rails port code are
+by no means complete, but they are extensive, and must continue to be
+so with any new functionality which is written. Tests are also useful
+in giving others confidence in the code you've written, and can
+greatly speed up the process of merging in new code.
+
+When hacking, you should:
+
+* Write new tests to cover the new functionality you've added.
+* Where appropriate, modify existing tests to reflect new or changed
+functionality.
+* Never comment out or remove a test just because it doesn't pass.
+
+## Comments
+
+Sometimes it's not apparent from the code itself what it does, or,
+more importantly, **why** it does that. Good comments help your fellow
+developers to read the code and satisfy themselves that it's doing the
+right thing.
+
+When hacking, you should:
+
+* Comment your code - don't go overboard, but explain the bits which
+might be difficult to understand what the code does, why it does it
+and why it should be the way it is.
+* Check existing comments to ensure that they are not misleading.
+
+## Committing
+
+When you submit patches, the project maintainer has to read them and
+understand them. This is difficult enough at the best of times, and
+misunderstanding patches can lead to them being more difficult to
+merge. To help wit this, when submitting you should:
+
+* Split up large patches into smaller units of functionality.
+* Keep your commit messages relevant to the changes in each individual
+unit.
+
+When writing commit messages please try and stick to the same style as
+other commits, namely:
+
+* A one line summary, starting with a capital and with no full stop.
+* A blank line.
+* Full description, as proper sentences with capitals and full stops.
+
+For simple commits the one line summary is often enough and the body
+of the commit message can be left out.
+
+## Sending the patches
+
+If you have forked on GitHub then the best way to submit your patches is to
+push your changes back to GitHub and then send a "pull request" on GitHub.
+
+Otherwise you should either push your changes to a publicly visible git repository
+and send the details to the [rails-dev](http://lists.openstreetmap.org/listinfo/rails-dev)
+list or generate patches with `git format-patch` and send them to the
+[rails-dev](http://lists.openstreetmap.org/listinfo/rails-dev) list.
+
diff --git a/README.mkdn b/README.mkdn
deleted file mode 100644 (file)
index 24814ff..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-# Description
-
-This is the Rails port. The Ruby on Rails application that powers
-http://www.openstreetmap.org.
-
-# Running it
-
-You can find documentation on how to setup and run the software on the
-OpenStreetMap wiki:
-
-* http://wiki.openstreetmap.org/wiki/The_Rails_Port
-    
-# Hacking it
-
-The canonnical Git repository for this software is hosted at
-git.openstreetmap.org:
-
-* http://git.openstreetmap.org/?p=rails.git
-    
-See commiting to the rails port on the wiki for getting your patches
-integrated:
-
-* http://wiki.openstreetmap.org/wiki/Committing_to_the_rails_port
-
diff --git a/app/assets/images/tab_bottom.gif b/app/assets/images/tab_bottom.gif
deleted file mode 100644 (file)
index da70aaf..0000000
Binary files a/app/assets/images/tab_bottom.gif and /dev/null differ
index acfa108224abc8c827e7a78e0914ec1dc19f960e..f2397210412e1853071c83f26b82d9a79a0badf3 100644 (file)
@@ -24,7 +24,7 @@ function createMap(divName, options) {
       theme: "<%= asset_path 'theme/default/style.css' %>"
    });
 
-   var mapnik = new OpenLayers.Layer.OSM.Mapnik(i18n("javascripts.map.base.mapnik"), {
+   var mapnik = new OpenLayers.Layer.OSM.Mapnik(i18n("javascripts.map.base.standard"), {
       attribution: "",
       keyid: "mapnik",
       displayOutsideMaxExtent: true,
@@ -33,15 +33,6 @@ function createMap(divName, options) {
    });
    map.addLayer(mapnik);
 
-   var osmarender = new OpenLayers.Layer.OSM.Osmarender(i18n("javascripts.map.base.osmarender"), {
-      attribution: "",
-      keyid: "osmarender",
-      displayOutsideMaxExtent: true,
-      wrapDateLine: true,
-      layerCode: "O"
-   });
-   map.addLayer(osmarender);
-
    var cyclemap = new OpenLayers.Layer.OSM.CycleMap(i18n("javascripts.map.base.cycle_map"), {
       attribution: "Tiles courtesy of <a href='http://www.opencyclemap.org/' target='_blank'>Andy Allan</a>",
       keyid: "cyclemap",
@@ -75,11 +66,9 @@ function createMap(divName, options) {
    });
    map.addLayer(mapquest);
 
-   var numZoomLevels = Math.max(mapnik.numZoomLevels, osmarender.numZoomLevels);
-
    markers = new OpenLayers.Layer.Markers("Markers", {
       displayInLayerSwitcher: false,
-      numZoomLevels: numZoomLevels,
+      numZoomLevels: 20,
       maxExtent: new OpenLayers.Bounds(-20037508,-20037508,20037508,20037508),
       maxResolution: 156543,
       units: "m",
index 8db1be4b9acebd6e44bd208e63eb7aecdac4a2eb..e829f2aa6664fda4f6f4ce636612c373a7c94784 100644 (file)
@@ -35,7 +35,7 @@ function enterMenuAnchor(event, anchor, menu, delay, align) {
     clearTimeout(menu.timer);
 
     if (delay > 0) {
-      menu.timer = setTimeout(function () { openMenu(anchor, menu, align) }, delay);
+      menu.timer = setTimeout(function () { openMenu(anchor, menu, align); }, delay);
     } else {
       openMenu(event, menu, align);
     }
@@ -48,7 +48,7 @@ function enterMenuAnchor(event, anchor, menu, delay, align) {
 function leaveMenuAnchor(event, anchor, menu) {
   var to = event.relatedTarget;
 
-  if (!menu.is(to) && menu.has(to).length == 0) {
+  if (!menu.is(to) && menu.has(to).length === 0) {
     menu.hide();
   }
 
@@ -61,7 +61,7 @@ function leaveMenuAnchor(event, anchor, menu) {
 function leaveMenu(event, anchor, menu) {
   var to = event.relatedTarget;
 
-  if (!anchor.is(to) && menu.has(to).length == 0) {
+  if (!anchor.is(to) && menu.has(to).length === 0) {
     menu.hide();
   }
 
@@ -75,9 +75,9 @@ function createMenu(anchorid, menuid, delay, align) {
   var anchor = $("#" + anchorid);
   var menu = $("#" + menuid);
 
-  anchor.mouseup(function (event) { closeMenu(menu) });
-  anchor.mouseover(function (event) { enterMenuAnchor(anchor, anchor, menu, delay, align) });
-  anchor.mouseout(function (event) { leaveMenuAnchor(event, anchor, menu) });
-  menu.mouseup(function (event) { closeMenu(menu) });
-  menu.mouseout(function (event) { leaveMenu(event, anchor, menu) });
+  anchor.mouseup(function (event) { closeMenu(menu); });
+  anchor.mouseover(function (event) { enterMenuAnchor(anchor, anchor, menu, delay, align); });
+  anchor.mouseout(function (event) { leaveMenuAnchor(event, anchor, menu); });
+  menu.mouseup(function (event) { closeMenu(menu); });
+  menu.mouseout(function (event) { leaveMenu(event, anchor, menu); });
 }
index ea7585a44bb894f1775f12855aaa9593ae4e2e82..93a5127f9ed85ba316c94cf7323505ad0e6e6d84 100644 (file)
@@ -45,12 +45,13 @@ function updatelinks(lon,lat,zoom,layers,minlon,minlat,maxlon,maxlat,objtype,obj
         var minzoom = match[1];
         var name = link.id.replace(/anchor$/, "");
 
+        $(link).off("click.minzoom");
+
         if (zoom >= minzoom) {
-          $(link).off("click");
           $(link).attr("title", i18n("javascripts.site." + name + "_tooltip"));
           $(link).removeClass("disabled");
         } else {
-          $(link).click(function () { alert(i18n("javascripts.site." + name + "_zoom_alert")); return false; });
+          $(link).on("click.minzoom", function () { alert(i18n("javascripts.site." + name + "_zoom_alert")); return false; });
           $(link).attr("title", i18n("javascripts.site." + name + "_disabled_tooltip"));
           $(link).addClass("disabled");
         }
@@ -72,17 +73,17 @@ function updatelinks(lon,lat,zoom,layers,minlon,minlat,maxlon,maxlat,objtype,obj
 
     // This is a hack to omit the default mapnik layer from the shortlink.
     if (layers && layers != "M") {
-      args["layers"] = layers;
+      args.layers = layers;
     }
     else {
-      delete args["layers"];
+      delete args.layers;
     }
 
     // Here we're assuming that all parameters but ?layers= and
     // ?{node,way,relation}= can be safely omitted from the shortlink
     // which encodes lat/lon/zoom. If new URL parameters are added to
     // the main slippy map this needs to be changed.
-    if (args["layers"] || args[objtype]) {
+    if (args.layers || args[objtype]) {
       this.href = setArgs(prefix + "/go/" + code, args);
     } else {
       this.href = prefix + "/go/" + code;
@@ -105,7 +106,7 @@ function shortlinkPrefix() {
  * Called to get the arguments from a URL as a hash.
  */
 function getArgs(url) {
-  var args = new Object();
+  var args = {};
   var querystart = url.indexOf("?");
 
   if (querystart >= 0) {
@@ -116,7 +117,7 @@ function getArgs(url) {
         if (match = queryitems[i].match(/^(.*)=(.*)$/)) {
            args[unescape(match[1])] = unescape(match[2]);
         } else {
-           args[unescape(queryitems[i])] = null
+           args[unescape(queryitems[i])] = null;
         }
      }
   }
@@ -128,10 +129,9 @@ function getArgs(url) {
  * Called to set the arguments on a URL from the given hash.
  */
 function setArgs(url, args) {
-   var queryitems = new Array();
+   var queryitems = [];
 
-   for (arg in args)
-   {
+   for (arg in args) {
       if (args[arg] == null) {
          queryitems.push(escape(arg));
       } else {
@@ -167,7 +167,7 @@ function getStyle(el, property) {
  * rails and then later by javascript.
  */
 function i18n(string, keys) {
-  string = i18n_strings[string] || string
+  string = i18n_strings[string] || string;
 
   for (var key in keys) {
     var re_key = '\\[\\[' + key + '\\]\\]';
index a0846e96edfe412551d376e588909aa706c54c85..42b5f539737624b23c6f7acac32477f6901749ae 100644 (file)
@@ -3,8 +3,10 @@
 /* Default rules for the body of every page */
 
 body {
-  font-family: Arial,sans-serif;
-  color: #000;
+  font-family: 'Helvetica Neue',Arial,sans-serif;
+  font-size: 14px;
+  line-height: 20px;
+  color: #222;
   background-color: #fff;
   margin: 0px;
   padding: 0px;
@@ -34,12 +36,22 @@ hr {
   height: 1px;
 }
 
+/* Default rules for headings */
+
+h2 {
+  margin: 5px 0;
+  font-size: 25px;
+  line-height: 30px;
+}
+
 /* Rules for the whole left sidebar, including the logo */
 
 #left {
   position: absolute;
   top: 0px;
-  min-width: 170px;
+  width: 185px;
+  font-size: 11px;
+  line-height: 12px;
 }
 
 /* Rules for the OpenStreetMap logo in the top left corner */
@@ -48,22 +60,20 @@ hr {
   width: 170px;
   min-width: 170px;
   padding: 5px;
-  margin: 5px;
-  height: 150px;
-  background: #fff;
-  border: 1px solid #ccd;
-  border-radius: 5px;
-  -moz-border-radius: 5px;
+  text-align: center;
+  margin: 25px 0 5px 0;
 }
 
 #logo h1 {
-  font-size: 14px;
+  font-size: 18px;
+  line-height: 20px;
   text-align: center;
   margin: 0px;
 }
 
 #logo h2 {
   font-size: 10px;
+  line-height: 15px;
   margin: 0px;
 }
 
@@ -76,13 +86,7 @@ hr {
 /* Rules for the introductory text displayed in the left sidebar to new users */
 
 #intro {
-  width: 170px;
-  padding: 5px;
-  margin: 5px;
-  border: 1px solid #ccc;
-  font-size: 11px;
-  border-radius: 5px;
-  -moz-border-radius: 5px;
+  border-top: 1px solid #ccc;
 }
 
 #intro p {
@@ -119,7 +123,7 @@ hr {
   padding: 5px;
   border: 1px solid #ccc;
   background: #ea0;
-  line-height: 1.2em;
+  line-height: 20px;
   font-size: 14px;
   border-radius: 5px;
   -moz-border-radius: 5px;
@@ -128,21 +132,13 @@ hr {
 /* Rules for the menu displayed in the left sidebar */
 
 .left_menu {
-  width: 170px;
-  min-width: 170px;
-  margin: 5px;
   padding: 5px;
-  border: 1px solid #ccc;
-  background: #ddd;
-  line-height: 1.2em;
+  margin: 4px 0;
+  border-top: 1px solid #ccc;
+  border-bottom: 1px solid #ccc;
+  line-height: 20px;
   font-size: 14px;
   font-weight: bold;
-  border-radius: 5px;
-  -moz-border-radius: 5px;
-}
-
-.left_menu td {
-  font-size: 12px;
 }
 
 .left_menu h1 {
@@ -182,22 +178,15 @@ hr {
  */
 
 .optionalbox {
-  width: 170px;
-  min-width: 170px;
-  margin: 5px;
   padding: 5px;
-  border: 1px solid #ccc;
-  line-height: 1.2em;
-  font-size: 12px;
-  background: #eee;
-  border-radius: 5px;
-  -moz-border-radius: 5px;
+  margin: 4px 0;
+  border-top: 1px solid #ccc;
 }
 
 .optionalbox h1 {
   font-size: 14px;
   font-weight: bold;
-  line-height: 22px;
+  line-height: 20px;
   margin: 0px;
   vertical-align: bottom;
 }
@@ -205,13 +194,13 @@ hr {
 /* Rules for the search box */
 
 .whereami {
-  line-height: 22px;
+  line-height: 20px;
   vertical-align: bottom;
 }
 
 .search_container {
-  height: 16px;
-  padding-bottom: 6px;
+  height: 15px;
+  padding-bottom: 5px;
 }
 
 #search_field form {
@@ -231,21 +220,19 @@ hr {
 }
 
 .search_help {
-  font-size: 10px;
-  line-height: 1em;
-  margin-top: 3px;
+  margin-top: 2px;
   margin-bottom: 0px;
 }
 
 /* Rules for donation request box */
 
 .donate {
-  width: 170px;
-  margin: 5px;
+  width: 155px;
+  margin: 10px 5px;
   padding: 5px;
   border: 1px solid #ccc;
   background: #cbeea7;
-  line-height: 1.2em;
+  line-height: 20px;
   text-align: center;
   font-size: 14px;
   border-radius: 5px;
@@ -261,66 +248,58 @@ hr {
 
 /* Rules for tabbed navigation bar */
 
-#tabnav
-{
-  height: 20px;
-  margin: 0px;
-  padding-top: 5px;
-  background: image-url('tab_bottom.gif') repeat-x bottom;
+#top-bar {
+  border-bottom: 1px solid #ccc;
+  height: 29px;
 }
 
-#tabnav li
-{
-  margin: 0px; 
+#tabnav {
+  padding: 0;
+  margin: 0;
+  overflow:hidden;
+}
+
+#tabnav li {
+  margin: 0px;
   padding: 0px;
   display: inline;
   list-style-type: none;
 }
 
-#tabnav a, #tabnav a:link, #tabnav a:visited 
-{
-  background: #f3f3f3;
-  font-size: 13px;
-  line-height: 14px;
+#tabnav a, #tabnav a:link, #tabnav a:visited {
+  background: #fff;
+  font-size: 14px;
+  line-height: 19px;
   font-weight: bold;
-  padding: 2px 10px;
-  border: 1px solid #ccc;
+  padding: 5px 10px;
   text-decoration: none;
   color: #333;
-  border-top-right-radius: 5px;
-  -moz-border-radius-topright: 5px;
-  border-top-left-radius: 5px;
-  -moz-border-radius-topleft: 5px;
 }
 
-#tabnav a:link.active, #tabnav a:visited.active
-{
-  border-bottom: 1px solid #fff;
-  background: #fff;
+#tabnav a:link.active, #tabnav a:visited.active {
+  border-bottom: 1px solid #aaa;
+  background: #9ed485;
   color: #000;
 }
 
-#tabnav a:link:hover, #tabnav a:visited:hover
-{
-  background: #fff;
+#tabnav a:link:hover, #tabnav a:visited:hover {
+  text-decoration:underline;
 }
 
-#tabnav a:link.disabled, #tabnav a:visited.disabled,
-#tabnav a:link:hover.disabled, #tabnav a:visited:hover.disabled
-{
-  background: #bbbbbb;
-  color: white
+#tabnav a:link.disabled,
+#tabnav a:visited.disabled,
+#tabnav a:link:hover.disabled,
+#tabnav a:visited:hover.disabled {
+  color: #888;
 }
 
 /* Rules for greeting bar in the top right corner */
 
 #greeting {
-  height: 20px;
+  height: 28px;
   margin: 0px;
-  padding-top: 5px;
   font-size: 13px;
-  line-height: 14px;
-  background: image-url('tab_bottom.gif') repeat-x bottom;
+  line-height: 28px;
 }
 
 .greeting-bar-unread {
@@ -338,8 +317,7 @@ hr {
 /* Rules for OpenLayers maps */
 
 #map {
-  border: 1px solid black;
-  margin: 0px; 
+  margin: 0px;
   padding: 0px;
 }
 
@@ -353,10 +331,16 @@ hr {
 #permalink {
   z-index: 10000;
   position: absolute;
-  bottom: 15px;
-  right: 15px;
+  bottom: 0px;
+  right: 0px;
+  padding: 5px;
+  background:#fff;
   text-align: right;
-  font-size: smaller;
+  font-size: 12px;
+}
+
+#permalink a {
+  padding: 5px;
 }
 
 /* Rules for edit menu */
@@ -396,7 +380,6 @@ hr {
 #sidebar {
   display: none;
   position: absolute;
-  border: 1px solid black;
   margin: 0px;
   padding: 0px;
   width: 30%;
@@ -408,7 +391,7 @@ hr {
   overflow: auto;
   position: absolute;
   font-size: 13px;
-  line-height: 14px;
+  line-height: 15px;
   top: 29px;
   bottom: 0px;
   left: 0px;
@@ -417,11 +400,10 @@ hr {
 
 #sidebar .sidebar_title {
   margin: 0px;
-  padding: 3px 6px;
+  padding: 3px 6px 4px 6px;
   height: 29px;
   font-size: 14px;
   line-height: 15px;
-  border-bottom: 1px solid black;
   background: #bbb;
 }
 
@@ -454,14 +436,14 @@ hr {
 
 .search_results_heading {
   margin: 0px;
-  padding: 3px 6px;
-  border: 1px solid #ccc;
-  background: #ddd;
+  padding: 2px 5px;
+  border-bottom: 1px solid #ccc;
+  font-weight: bold;
 }
 
 .search_results_entry {
   margin: 0px;
-  padding: 2px 6px;
+  padding: 2px 5px;
 }
 
 .search_results_error {
@@ -488,9 +470,9 @@ hr {
 
 .export_heading {
   margin: 0px;
-  padding: 3px 6px;
-  border: 1px solid #ccc;
-  background: #ddd;
+  padding: 2px 5px;
+  border-bottom: 1px solid #ccc;
+  font-weight: bold;
 }
 
 .export_bounds {
@@ -531,11 +513,17 @@ hr {
 /* Rules for the main content area */
 
 #content {
-  padding: 0px;
+  padding: 10px;
   margin: 0px;
-  position: absolute; 
-  bottom: 10px;
-  line-height: 1.2em;
+  position: absolute;
+  bottom: 0px;
+}
+
+#content.site_index,
+#content.site_edit,
+#content.site_export {
+  border: 0px;
+  padding: 0px;
 }
 
 #slim_container {
@@ -744,6 +732,7 @@ td.browse_comments table td span.by {
   position: relative;
   width: 90%;
   height: 400px;
+  border: 1px solid #ccc;
   display: none;
 }
 
@@ -847,6 +836,7 @@ p#contributorGuidance {
   position: relative;
   width: 500px;
   height: 400px; 
+  border: 1px solid #ccc;
 }
 
 #accountImage td {
@@ -875,6 +865,7 @@ p#contributorGuidance {
   position: relative;
   width: 400px;
   height: 400px; 
+  border: 1px solid #ccc;
 }
 
 .user_view .user_map p#no_home_location {
@@ -993,18 +984,20 @@ p#contributorGuidance {
 .fieldName {
   vertical-align: top;
   font-weight: bold;
+  font-size: 12px;
+  line-height: 20px;
 }
 
 .minorNote {
   font-size: 0.8em;
 }
 
-input[type="text"], input[type="email"], input[type="url"], input[type="password"], textarea {
-  border: 1px solid black;
-}
-
-input[type="submit"] {
-  border: 1px solid black;
+input[type="text"],
+input[type="email"],
+input[type="url"],
+input[type="password"],
+textarea {
+  border: 1px solid #888;
 }
 
 /* Rules for user images */
@@ -1042,11 +1035,11 @@ abbr.geo {
 
 /* Rules for doing distinct colour of alternate table rows */
 
-.table0 { 
+.table0 {
   background: #f6f6f6;
 }
 
-.table1 { 
+.table1 {
   background: #fff;
 }
 
index 9d664ef2662195f6c42ae8bfeeaa5b7bed75ec7b..2cf195632dda1d0dc533812df5c1291ca729f0f9 100644 (file)
@@ -9,7 +9,7 @@
 /* Rules for the main content area */
 
 #content {
-  top: 35px;
+  top: 30px;
 }
 
 /* Rules for OpenLayers maps */
index 817404a799d879e34ad2e65cca634774444028c9..5eba8ddb9f798d38a3fda13a3246d08eff0d87d2 100644 (file)
@@ -68,15 +68,15 @@ html body {
 
 /* Rules for tabbed navigation bar */
 
-#tabnav
-{
-  padding-left: 215px;
+#top-bar {
+  margin-left: 185px;
 }
 
-#tabnav a, #tabnav a:link, #tabnav a:visited 
-{
+#tabnav a,
+#tabnav a:link,
+#tabnav a:visited {
   float: left;
-  margin-right: 4px;
+  margin-right: 1px;
 }
 
 /* Rules for greeting bar in the top right corner */
@@ -92,6 +92,12 @@ html body {
   left: 15px
 }
 
+/* Rules for OpenLayers maps */
+
+#map {
+  border-left: 1px solid #ccc;
+}
+
 /* Rules for attribution text under the main map shown on printouts */
 
 .attribution_license {
@@ -106,7 +112,7 @@ html body {
 
 #sidebar {
   left: 0px;
-  margin-right: 3px;
+  border-left: 1px solid #ccc;
 }
 
 #sidebar #sidebar_title {
@@ -120,8 +126,9 @@ html body {
 /* Rules for the main content area */
 
 #content {
-  left: 192px;
-  right: 10px;
+  border-left: 1px solid #ccc;
+  left: 185px;
+  right: 0px;
   text-align: left;
 }
 
@@ -187,12 +194,6 @@ html body {
   float: right;
 }
 
-/* Rules for the login page */
-
-#login_wrapper input[type=submit] {
-  float: right;
-}
-
 /* Rules for the account confirmation page */
 
 form#termsForm div#buttons {
@@ -230,7 +231,7 @@ form#termsForm input#agree {
   text-align: right;
 }
 
-input.openid_url { 
+input.openid_url {
   background: image-url('openid_input.png') repeat-y left white;
   padding-left: 16px;
 }
index 953efd7a66bc5b2b4f7e7cf1a34e2be4ab220889..b9223e5228e8f729a7b2af6cfbdbdfb40757a994 100644 (file)
@@ -68,16 +68,15 @@ html body {
 
 /* Rules for tabbed navigation bar */
 
-
-#tabnav
-{
-  padding-right: 215px;
+#top-bar {
+  margin-right: 185px
 }
 
-#tabnav a, #tabnav a:link, #tabnav a:visited 
-{
+#tabnav a,
+#tabnav a:link,
+#tabnav a:visited {
   float: right;
-  margin-left: 4px;
+  margin-left: 1px;
 }
 
 /* Rules for greeting bar in the top right corner */
@@ -93,6 +92,12 @@ html body {
   right: 15px
 }
 
+/* Rules for OpenLayers maps */
+
+#map {
+  border-right: 1px solid #ccc;
+}
+
 /* Rules for attribution text under the main map shown on printouts */
 
 .attribution_license {
@@ -107,7 +112,7 @@ html body {
 
 #sidebar {
   right: 0px;
-  margin-left: 3px;
+  border-right: 1px solid #ccc;
 }
 
 #sidebar #sidebar_title {
@@ -121,8 +126,9 @@ html body {
 /* Rules for the main content area */
 
 #content {
-  right: 192px;
-  left: 10px;
+  border-right: 1px solid #ccc;
+  right: 185px;
+  left: 0px;
   text-align: right;
 }
 
@@ -188,12 +194,6 @@ html body {
   float: left;
 }
 
-/* Rules for the login page */
-
-#login_wrapper input[type=submit] {
-  float: left;
-}
-
 /* Rules for the account confirmation page */
 
 form#termsForm div#buttons {
@@ -231,7 +231,7 @@ form#termsForm input#agree {
   text-align: left;
 }
 
-input.openid_url { 
+input.openid_url {
   background: image-url('openid_input.png') repeat-y right white;
   padding-right: 16px;
 }
index 07b5d7b1075f534e2bc46f1b2ab865990b6d3632..412cf720371594f7780ae458dc8b6cc660a34608 100644 (file)
@@ -17,24 +17,23 @@ h1 {
 }
 
 /* Rules for tabbed navigation bar */
+#top-bar {
+  margin: 0;
+}
 
-#tabnav
-{
+#tabnav {
   height: 14px;
   margin: 0px;
-  padding-left: 3px;
   padding-top: 5px;
   margin-top: 18px;
-  background: image-url('tab_bottom.gif') repeat-x bottom;
   font-size: 10px;
   line-height: 10px;
 }
 
-#tabnav a, #tabnav a:link, #tabnav a:visited 
-{
+#tabnav a, #tabnav a:link, #tabnav a:visited {
   font-size: 10px;
   line-height: 10px;
-  padding: 1px 5px;
+  padding: 2px 5px;
   margin-right: 1px;
 }
 
index 86e57a2d1bd9c6642510d46a2f26520d7a6936df..139a7a65078058ac2a791161c9797faf72a1e9e8 100644 (file)
@@ -128,7 +128,7 @@ class AmfController < ApplicationController
 
   def amf_handle_error_with_timeout(call,rootobj,rootid)
     amf_handle_error(call,rootobj,rootid) do
-      Timeout::timeout(API_TIMEOUT, OSM::APITimeoutError) do
+      OSM::Timer.timeout(API_TIMEOUT, OSM::APITimeoutError) do
         yield
       end
     end
index 96bf915c0f9e3034fe9c0cb2029c1feb8ae1861b..6caed05940a0bf024dbd51259f67fe04a68bbf92 100644 (file)
@@ -1,4 +1,5 @@
 class ApplicationController < ActionController::Base
+  include SessionPersistence
 
   protect_from_forgery
 
@@ -266,7 +267,7 @@ class ApplicationController < ActionController::Base
       report_error message, :bad_request
     rescue OSM::APIError => ex
       report_error ex.message, ex.status
-    rescue ActionController::UnknownAction => ex
+    rescue AbstractController::ActionNotFound => ex
       raise
     rescue Exception => ex
       logger.info("API threw unexpected #{ex.class} exception: #{ex.message}")
@@ -286,7 +287,7 @@ class ApplicationController < ActionController::Base
   ##
   # wrap an api call in a timeout
   def api_call_timeout
-    SystemTimer.timeout_after(API_TIMEOUT) do
+    OSM::Timer.timeout(API_TIMEOUT) do
       yield
     end
   rescue Timeout::Error
@@ -296,11 +297,17 @@ class ApplicationController < ActionController::Base
   ##
   # wrap a web page in a timeout
   def web_timeout
-    SystemTimer.timeout_after(WEB_TIMEOUT) do
+    OSM::Timer.timeout(WEB_TIMEOUT) do
       yield
     end
-  rescue ActionView::TemplateError => ex
-    if ex.original_exception.is_a?(Timeout::Error)
+  rescue ActionView::Template::Error => ex
+    ex = ex.original_exception
+
+    if ex.is_a?(ActiveRecord::StatementInvalid) and ex.message =~ /^Timeout::Error/
+      ex = Timeout::Error.new
+    end
+
+    if ex.is_a?(Timeout::Error)
       render :action => "timeout"
     else
       raise
@@ -327,7 +334,7 @@ class ApplicationController < ActionController::Base
     end)
 
     options[:cache_path] = Proc.new do |controller|
-      cache_path.merge(controller.params).merge(:locale => I18n.locale)
+      cache_path.merge(controller.params).merge(:host => SERVER_URL, :locale => I18n.locale)
     end
 
     actions.push(options)
@@ -339,7 +346,7 @@ class ApplicationController < ActionController::Base
   # extend expire_action to expire all variants
   def expire_action(options = {})
     I18n.available_locales.each do |locale|
-      super options.merge(:locale => locale)
+      super options.merge(:host => SERVER_URL, :locale => locale)
     end
   end
 
index b736e332b04431d3e6e0cc1cb76484c406fd313f..cfe86de51fd462842e075353c8044f6027205dbb 100644 (file)
@@ -276,6 +276,15 @@ class ChangesetController < ApplicationController
         end
       end
 
+      if params[:nearby]
+        if @user
+          changesets = changesets.where(:user_id => @user.nearby)
+        elsif request.format == :html
+          require_user
+          return
+        end
+      end
+
       if params[:bbox]
         bbox = BoundingBox.from_bbox_params(params)
       elsif params[:minlon] and params[:minlat] and params[:maxlon] and params[:maxlat]
@@ -295,6 +304,10 @@ class ChangesetController < ApplicationController
         @title =  t 'changeset.list.title_friend'
         @heading =  t 'changeset.list.heading_friend'
         @description = t 'changeset.list.description_friend'
+      elsif params[:nearby] and @user
+        @title = t 'changeset.list.title_nearby'
+        @heading = t 'changeset.list.heading_nearby'
+        @description = t 'changeset.list.description_nearby'
       elsif user and bbox
         @title =  t 'changeset.list.title_user_bbox', :user => user.display_name, :bbox => bbox.to_s
         @heading =  t 'changeset.list.heading_user_bbox', :user => user.display_name, :bbox => bbox.to_s
@@ -319,9 +332,9 @@ class ChangesetController < ApplicationController
       @bbox = bbox
       
       @edits = changesets.order("changesets.created_at DESC").offset((@page - 1) * @page_size).limit(@page_size).preload(:user, :changeset_tags)
-    end
 
-    render :action => :list
+      render :action => :list
+    end
   end
 
   ##
index 0444f5a89d7b269299fb2ae9fa51702be052a0e6..f87b02ef9b916b7b879a0a166db79d09e5f26577 100644 (file)
@@ -8,8 +8,9 @@ class DiaryEntryController < ApplicationController
   before_filter :check_database_writable, :only => [:new, :edit]
   before_filter :require_administrator, :only => [:hide, :hidecomment]
 
-  caches_action :list, :view, :layout => false
+  caches_action :list, :layout => false, :unless => :user_specific_list?
   caches_action :rss, :layout => true
+  caches_action :view, :layout => false
   cache_sweeper :diary_sweeper, :only => [:new, :edit, :comment, :hide, :hidecomment]
 
   def new
@@ -98,6 +99,34 @@ class DiaryEntryController < ApplicationController
                                         },
                                         :order => 'created_at DESC',
                                         :per_page => 20)
+    elsif params[:friends]
+      if @user
+        @title = t 'diary_entry.list.title_friends'
+        @entry_pages, @entries = paginate(:diary_entries, :include => :user,
+                                          :conditions => {
+                                            :user_id => @user.friend_users,
+                                            :visible => true
+                                          },
+                                          :order => 'created_at DESC',
+                                          :per_page => 20)
+      else
+          require_user
+          return     
+      end
+    elsif params[:nearby]
+      if @user
+        @title = t 'diary_entry.list.title_nearby'
+        @entry_pages, @entries = paginate(:diary_entries, :include => :user,
+                                          :conditions => {
+                                            :user_id => @user.nearby,
+                                            :visible => true
+                                          },
+                                          :order => 'created_at DESC',
+                                          :per_page => 20)                                        
+      else
+          require_user
+          return     
+      end                                  
     else
       @title = t 'diary_entry.list.title'
       @entry_pages, @entries = paginate(:diary_entries, :include => :user,
@@ -166,6 +195,22 @@ class DiaryEntryController < ApplicationController
     comment.update_attributes(:visible => false)
     redirect_to :action => "view", :display_name => comment.diary_entry.user.display_name, :id => comment.diary_entry.id
   end
+
+  def comments
+    @this_user = User.active.find_by_display_name(params[:display_name])
+
+    if @this_user
+      @comment_pages, @comments = paginate(:diary_comments,
+                                           :conditions => { :user_id => @this_user },
+                                           :order => 'created_at DESC',
+                                           :per_page => 20)
+      @page = (params[:page] || 1).to_i
+    else
+       @title = t'diary_entry.no_such_user.title'
+       @not_found_user = params[:display_name]
+       render :action => 'no_such_user', :status => :not_found
+    end                                                
+  end  
 private
   ##
   # require that the user is a administrator, or fill out a helpful error message
@@ -176,4 +221,10 @@ private
       redirect_to :controller => 'diary_entry', :action => 'view', :display_name => params[:id]
     end
   end
+
+  ##
+  # is this list user specific?
+  def user_specific_list?
+    params[:friends] or params[:nearby]
+  end
 end
index 36f57d6c27d26a5003f95e4b66aa0584e6654d4e..cf4465b9c5b185bcdd3b760073083b51c1b842aa 100644 (file)
@@ -1,5 +1,6 @@
 class SiteController < ApplicationController
   layout 'site', :except => [:key, :permalink]
+  layout false, :only => [:key, :permalink]
 
   before_filter :authorize_web
   before_filter :set_locale
@@ -80,4 +81,8 @@ class SiteController < ApplicationController
       @zoom = '17' if @zoom.nil?
     end
   end
+
+  def copyright
+    @locale = params[:copyright_locale] || I18n.locale
+  end
 end
index cdfa5e3cbe76f60b460fb1e8843225b6a00a101d..e3f41f0ace69ef5148804aef75cbf17cb1004819 100644 (file)
@@ -153,7 +153,7 @@ class TraceController < ApplicationController
         @trace.errors.add(:gpx_file, "can't be blank")
       end
     else
-      @trace = Trace.new(:visibility => default_visibility)
+      @trace = Trace.new({:visibility => default_visibility}, :without_protection => true)
     end
 
     @title = t 'trace.create.upload_trace'
@@ -163,7 +163,9 @@ class TraceController < ApplicationController
     trace = Trace.find(params[:id])
 
     if trace.visible? and (trace.public? or (@user and @user == trace.user))
-      if request.format == Mime::XML
+      if Acl.no_trace_download(request.remote_ip)
+        render :nothing => true, :status => :forbidden
+      elsif request.format == Mime::XML
         send_file(trace.xml_file, :filename => "#{trace.id}.xml", :type => Mime::XML.to_s, :disposition => 'attachment')
       else
         send_file(trace.trace_name, :filename => "#{trace.id}#{trace.extension_name}", :type => trace.mime_type, :disposition => 'attachment')
@@ -222,7 +224,7 @@ class TraceController < ApplicationController
     end
 
     if params[:tag]
-      traces = traces.where("EXISTS (SELECT * FROM gpx_file_tags AS gft WHERE gft.gpx_id = gpx_files.id AND gft.tag = ?)")
+      traces = traces.where("EXISTS (SELECT * FROM gpx_file_tags AS gft WHERE gft.gpx_id = gpx_files.id AND gft.tag = ?)", params[:tag])
     end
 
     traces = traces.order("timestamp DESC")
@@ -384,7 +386,7 @@ private
       :inserted => true,
       :user => @user,
       :timestamp => Time.now.getutc
-    })
+    }, :without_protection => true)
 
     Trace.transaction do
       begin
index 89f35a8996e6cea3c9b20808259ae16b76e8d0b2..a591906976b93863760e8d80070a7fab79c9817c 100644 (file)
@@ -38,6 +38,8 @@ class UserController < ApplicationController
       else
         render :action => 'terms'
       end
+    elsif params[:user] and Acl.no_account_creation(request.remote_ip, params[:user][:email].split("@").last)
+      render :action => 'blocked'
     else
       session[:referer] = params[:referer]
 
@@ -79,9 +81,7 @@ class UserController < ApplicationController
   def save
     @title = t 'user.new.title'
 
-    if Acl.address(request.remote_ip).where(:k => "no_account_creation").exists?
-      render :action => 'new'
-    elsif params[:decline]
+    if params[:decline]
       if @user
         @user.terms_seen = true
 
@@ -112,6 +112,8 @@ class UserController < ApplicationController
       else
         redirect_to :action => :account, :display_name => @user.display_name
       end
+    elsif Acl.no_account_creation(request.remote_ip, params[:user][:email].split("@").last)
+      render :action => 'blocked'
     else
       @user = User.new(params[:user])
 
@@ -269,6 +271,8 @@ class UserController < ApplicationController
                        :openid_url => params[:openid])
 
       flash.now[:notice] = t 'user.new.openid association'
+    elsif Acl.no_account_creation(request.remote_ip)
+      render :action => 'blocked'
     end
   end
 
@@ -512,8 +516,7 @@ private
     elsif user = User.authenticate(:username => username, :password => password, :pending => true)
       failed_login t('user.login.account not active', :reconfirm => url_for(:action => 'confirm_resend', :display_name => user.display_name))
     elsif User.authenticate(:username => username, :password => password, :suspended => true)
-      webmaster = link_to t('user.login.webmaster'), "mailto:webmaster@openstreetmap.org"
-      failed_login t('user.login.account suspended', :webmaster => webmaster)
+      failed_login t('user.login.account is suspended', :webmaster => "mailto:webmaster@openstreetmap.org")
     else
       failed_login t('user.login.auth failure')
     end
@@ -546,8 +549,7 @@ private
             when "active", "confirmed" then
               successful_login(user)
             when "suspended" then
-              webmaster = link_to t('user.login.webmaster'), "mailto:webmaster@openstreetmap.org"
-              failed_login t('user.login.account suspended', :webmaster => webmaster)
+              failed_login t('user.login.account is suspended', :webmaster => "mailto:webmaster@openstreetmap.org")
             else
               failed_login t('user.login.auth failure')
           end
@@ -622,7 +624,7 @@ private
     cookies.permanent["_osm_username"] = user.display_name
 
     session[:user] = user.id
-    session_expires_after 1.month if session[:remember_me]
+    session_expires_after 28.days if session[:remember_me]
 
     target = session[:referer] || url_for(:controller => :site, :action => :index)
 
@@ -661,6 +663,8 @@ private
     if user.save
       set_locale
 
+      cookies.permanent["_osm_username"] = user.display_name
+
       if user.new_email.blank?
         flash.now[:notice] = t 'user.account.flash update success'
       else
index 2d867d2d830ded02365bad71b5df5194b1b82832..54dc90dee911e7f62d9a36d48f0250380c4f0673 100644 (file)
@@ -11,7 +11,9 @@ class UserRolesController < ApplicationController
   around_filter :setup_nonce
 
   def grant
-    @this_user.roles.create(:role => @role, :granter_id => @user.id)
+    @this_user.roles.create({
+      :role => @role, :granter_id => @user.id
+    }, :without_protection => true)
     redirect_to :controller => 'user', :action => 'view', :display_name => @this_user.display_name
   end
 
index b30129c5dd51233a6b66b1ebb44b11e0171df9d1..dfbb04138f0e6219e2dc13af47071c904f229ce1 100644 (file)
@@ -89,7 +89,7 @@ module ApplicationHelper
     url = "http://nominatim.openstreetmap.org/reverse?lat=#{lat}&lon=#{lon}&zoom=#{zoom}&accept-language=#{language}"
 
     begin
-      response = Timeout::timeout(4) do
+      response = OSM::Timer.timeout(4) do
         REXML::Document.new(Net::HTTP.get(URI.parse(url)))
       end
     rescue Exception
@@ -106,21 +106,13 @@ module ApplicationHelper
   def user_image(user, options = {})
     options[:class] ||= "user_image"
 
-    if user.image
-      image_tag url_for_file_column(user, "image"), options
-    else
-      image_tag "anon_large.png", options
-    end
+    image_tag user.image.url(:large), options
   end
 
   def user_thumbnail(user, options = {})
     options[:class] ||= "user_thumbnail"
 
-    if user.image
-      image_tag url_for_file_column(user, "image"), options
-    else
-      image_tag "anon_small.png", options
-    end
+    image_tag user.image.url(:small), options
   end
 
   def preferred_editor
index ebcd58dd042b7671ed5f8e9dfd462189899deb07..de439d56fc6700a0c0973b9ad88bd3759b6d2aa9 100644 (file)
@@ -78,7 +78,7 @@ private
 
   def wikipedia_link(key, value)
     # Some k/v's are wikipedia=http://en.wikipedia.org/wiki/Full%20URL
-    return nil if value =~ /^http:\/\//
+    return nil if value =~ /^https?:\/\//
 
     if key == "wikipedia"
       # This regex should match Wikipedia language codes, everything
index 94e37734353ec79dd453a75a72cdd06a6f183185..2db7fb76522a0342324d235367ae51d0c5932c97 100644 (file)
@@ -1,13 +1,17 @@
 class Acl < ActiveRecord::Base
-  scope :address, lambda { |address| where("#{inet_aton} & netmask = address", address) }
-
-private
-
-  def self.inet_aton
-    if self.connection.adapter_name == "MySQL"
-      "inet_aton(?)"
+  def self.match(address, domain = nil)
+    if domain
+      condition = Acl.where("address >>= ? OR domain = ?", address, domain)
     else
-      "?"
+      condition = Acl.where("address >>= ?", address)
     end
   end
+
+  def self.no_account_creation(address, domain = nil)
+    self.match(address, domain).where(:k => "no_account_creation").exists?
+  end
+
+  def self.no_trace_download(address, domain = nil)
+    self.match(address, domain).where(:k => "no_trace_download").exists?
+  end
 end
index bd0417ab4255af3a32ff6a56b4a895a3460a02ee..0425fa6b40ae580587ea0ac736c0831f8333fb57 100644 (file)
@@ -1,5 +1,5 @@
 class ChangesetTag < ActiveRecord::Base
-  set_primary_keys :changeset_id, :k
+  self.primary_keys = "changeset_id", "k"
 
   belongs_to :changeset
 
index 55f34e6e2fc451b9dac06204c9302f4ae1503afa..b1f4022928fad8f6bf27a85de8a00ac1a694483c 100644 (file)
@@ -13,6 +13,11 @@ class ClientApplication < ActiveRecord::Base
   validates_format_of :support_url, :with => /\Ahttp(s?):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/i, :allow_blank=>true
   validates_format_of :callback_url, :with => /\A[a-z][a-z0-9.+-]*:\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/i, :allow_blank=>true
 
+  attr_accessible :name, :url, :support_url, :callback_url,
+                  :allow_read_prefs, :allow_write_prefs,
+                  :allow_write_diary, :allow_write_api,
+                  :allow_read_gpx, :allow_write_gpx
+
   before_validation :generate_keys, :on => :create
 
   attr_accessor :token_callback_url
@@ -54,7 +59,7 @@ class ClientApplication < ActiveRecord::Base
     permissions.each do |p|
       params[p] = true
     end
-    RequestToken.create(params)
+    RequestToken.create(params, :without_protection => true)
   end
 
   def access_token_for_user(user)
@@ -65,7 +70,7 @@ class ClientApplication < ActiveRecord::Base
         params[p] = true
       end
 
-      token = access_tokens.create(params)
+      token = access_tokens.create(params, :without_protection => true)
     end
     
     token
index 0013606d06b55afa885306e38b7777f16518016b..b915e027a9e1f49d62b2443b4f7b2b46f3630224 100644 (file)
@@ -5,6 +5,8 @@ class DiaryComment < ActiveRecord::Base
   validates_presence_of :body
   validates_associated :diary_entry
 
+  attr_accessible :body
+
   def digest
     md5 = Digest::MD5.new
     md5 << diary_entry_id.to_s
index 318672c03bb84f30952de4f4a96036e1bfeb48da..1d836353fee8b30d9f4f1a56396a068966748a49 100644 (file)
@@ -23,4 +23,6 @@ class DiaryEntry < ActiveRecord::Base
   validates_numericality_of :longitude, :allow_nil => true,
                             :greater_than_or_equal_to => -180, :less_than_or_equal_to => 180
   validates_associated :language
+
+  attr_accessible :title, :body, :language_code, :latitude, :longitude
 end
index 9f739cf5e7af761b2390027d824d968a5b63c02d..e7fd030573070df91c56a166b3843acf46628cee 100644 (file)
@@ -27,9 +27,9 @@ private
     expire_action(:controller => 'diary_entry', :action => 'list', :language => entry.language_code, :display_name => nil)
     expire_action(:controller => 'diary_entry', :action => 'list', :language => nil, :display_name => entry.user.display_name)
 
-    expire_action(:controller => 'diary_entry', :action => 'rss', :language => nil, :display_name => nil)
-    expire_action(:controller => 'diary_entry', :action => 'rss', :language => entry.language_code, :display_name => nil)
-    expire_action(:controller => 'diary_entry', :action => 'rss', :language => nil, :display_name => entry.user.display_name)
+    expire_action(:controller => 'diary_entry', :action => 'rss', :format => :rss, :language => nil, :display_name => nil)
+    expire_action(:controller => 'diary_entry', :action => 'rss', :format => :rss, :language => entry.language_code, :display_name => nil)
+    expire_action(:controller => 'diary_entry', :action => 'rss', :format => :rss, :language => nil, :display_name => entry.user.display_name)
 
     if record.is_a?(DiaryEntry)
       expire_fragment(:controller => 'diary_entry', :action => 'view', :display_name => entry.user.display_name, :id => entry.id, :part => "location")
index 7bb0b6e771a7e692aad56464ec969758524cab27..3a63176f618c52f7788111f91e112a7fcb66ebd9 100644 (file)
@@ -1,5 +1,5 @@
 class Language < ActiveRecord::Base
-  set_primary_key :code
+  self.primary_key = "code"
 
   has_many :diary_entries, :foreign_key => 'language'
 
index 053c7a4c0fffaa4382ce6bab58bb6ed73ffef300..0b34160030f980dc41a84f3db1ec47a53627ae10 100644 (file)
@@ -9,6 +9,8 @@ class Message < ActiveRecord::Base
   validates_inclusion_of :message_read, :in => [ true, false ]
   validates_as_utf8 :title
 
+  attr_accessible :title, :body
+
   def digest
     md5 = Digest::MD5.new
     md5 << from_user_id.to_s
index 0f176067d75e8aeb218c51ae8eaf3258f36a0e81..53787245916d5c60bca1e16060e17cd0183791e2 100644 (file)
@@ -4,7 +4,7 @@ class Node < ActiveRecord::Base
   include GeoRecord
   include ConsistencyValidations
 
-  set_table_name 'current_nodes'
+  self.table_name = "current_nodes"
 
   belongs_to :changeset
 
@@ -106,6 +106,10 @@ class Node < ActiveRecord::Base
     # and set manually before the actual delete
     node.visible = true
 
+    # Start with no tags
+    node.tags = Hash.new
+
+    # Add in any tags from the XML
     pt.find('tag').each do |tag|
       raise OSM::APIBadXMLError.new("node", pt, "tag is missing key") if tag['k'].nil?
       raise OSM::APIBadXMLError.new("node", pt, "tag is missing value") if tag['v'].nil?
index 6bc1c555e6e4e79b8cd8923d93f6815ec322a3b6..6f1bf0388a5c0bd3417c8a52fada295dcb838e77 100644 (file)
@@ -1,6 +1,6 @@
 class NodeTag < ActiveRecord::Base
-  set_table_name 'current_node_tags'
-  set_primary_keys :node_id, :k
+  self.table_name = "current_node_tags"
+  self.primary_keys = "node_id", "k"
 
   belongs_to :node
   
index 075351b9140d2724f539387fe3be978974a8148d..3ae50d3a4ba6ad4e06ee49f55f941bacc8b6953e 100644 (file)
@@ -3,7 +3,9 @@
 class OauthNonce < ActiveRecord::Base
   validates_presence_of :nonce, :timestamp
   validates_uniqueness_of :nonce, :scope => :timestamp
-  
+
+  attr_accessible :nonce, :timestamp
+
   # Remembers a nonce and it's associated timestamp. It returns false if it has already been used
   def self.remember(nonce, timestamp)
     oauth_nonce = OauthNonce.create(:nonce => nonce, :timestamp => timestamp)
index f8af91abb3be2c3c4f6a17a161e41eda5ba831c1..64ae1a70c9d8fe2050f2ccb3283bc04414dae030 100644 (file)
@@ -2,8 +2,8 @@ class OldNode < ActiveRecord::Base
   include GeoRecord
   include ConsistencyValidations
 
-  set_table_name 'nodes'
-  set_primary_keys :node_id, :version
+  self.table_name = "nodes"
+  self.primary_keys = "node_id", "version"
 
   validates_presence_of :changeset_id, :timestamp
   validates_inclusion_of :visible, :in => [ true, false ]
index cd5bc4739195d59f7aa8f8825609f6f52e949c8d..eef1e02d508836f43652df4a8059be79b7e1eb2c 100644 (file)
@@ -1,6 +1,6 @@
 class OldNodeTag < ActiveRecord::Base
-  set_table_name 'node_tags'
-  set_primary_keys :node_id, :version, :k
+  self.table_name = "node_tags"
+  self.primary_keys = "node_id", "version", "k"
 
   belongs_to :old_node, :foreign_key => [:node_id, :version]
 
index 87771caab3440b7603d22143db6f51d88ecd8a0f..a75dacd0eba9b04d28a4e6e3264bc6ea58877dae 100644 (file)
@@ -1,8 +1,8 @@
 class OldRelation < ActiveRecord::Base
   include ConsistencyValidations
   
-  set_table_name 'relations'
-  set_primary_keys :relation_id, :version
+  self.table_name = "relations"
+  self.primary_keys = "relation_id", "version"
 
   belongs_to :changeset
 
index 58d7cccfbd0ed98ff0c9494b2eef45a4cde04cbd..77a5a3786eceebfb25c705762f36fe6508d03b94 100644 (file)
@@ -1,6 +1,6 @@
 class OldRelationMember < ActiveRecord::Base
-  set_table_name 'relation_members'
-  set_primary_keys :relation_id, :version, :sequence_id
+  self.table_name = "relation_members"
+  self.primary_keys = "relation_id", "version", "sequence_id"
 
   belongs_to :old_relation, :foreign_key => [:relation_id, :version]
   # A bit messy, referring to the current tables, should do for the data browser for now
index 032a87c77edfd1547d474cd5d4d7c9b4685b6fcf..49324966f506c2624f0055d9f02fc5f82f2e6911 100644 (file)
@@ -1,6 +1,6 @@
 class OldRelationTag < ActiveRecord::Base
-  set_table_name 'relation_tags'
-    set_primary_keys :relation_id, :version, :k
+  self.table_name = "relation_tags"
+  self.primary_keys = "relation_id", "version", "k"
 
   belongs_to :old_relation, :foreign_key => [:relation_id, :version]
   
index 00642cdb3568eeb834aa2580652484e5e7a188d9..db8a6df4061ae3f8d60194c86c885f29462d95a5 100644 (file)
@@ -1,8 +1,8 @@
 class OldWay < ActiveRecord::Base
   include ConsistencyValidations
   
-  set_table_name 'ways'
-  set_primary_keys :way_id, :version
+  self.table_name = "ways"
+  self.primary_keys = "way_id", "version"
 
   belongs_to :changeset
 
index b613be0b4b80b6c79e0ceb8006034650ab24adb8..23ff503edf665ff922e6fe4b874f5484734f488f 100644 (file)
@@ -1,6 +1,6 @@
 class OldWayNode < ActiveRecord::Base
-  set_table_name 'way_nodes'
-  set_primary_keys :way_id, :version, :sequence_id
+  self.table_name = "way_nodes"
+  self.primary_keys = "way_id", "version", "sequence_id"
 
   belongs_to :old_way, :foreign_key => [:way_id, :version]
   # A bit messy, referring to current nodes and ways, should do for the data browser for now
index 9f4adb147fd6572e83f7c00b6e140c0fc14d3eda..9926db1446310fdf46d41aa6592df8f203a59331 100644 (file)
@@ -1,6 +1,6 @@
 class OldWayTag < ActiveRecord::Base
-  set_table_name 'way_tags'
-  set_primary_keys :way_id, :version, :k
+  self.table_name = "way_tags"
+  self.primary_keys = "way_id", "version", "k"
 
   belongs_to :old_way, :foreign_key => [:way_id, :version]
 
index 659c4f18a7297651ad1024cf2a59acdb5f0e26a4..21ee058d8ac80e26f6969c6d7c5b49052e9075f5 100644 (file)
@@ -3,7 +3,7 @@ class Relation < ActiveRecord::Base
   
   include ConsistencyValidations
   
-  set_table_name 'current_relations'
+  self.table_name = "current_relations"
 
   belongs_to :changeset
 
@@ -66,6 +66,10 @@ class Relation < ActiveRecord::Base
     # and manually set to false before the actual delete.
     relation.visible = true
 
+    # Start with no tags
+    relation.tags = Hash.new
+
+    # Add in any tags from the XML
     pt.find('tag').each do |tag|
       raise OSM::APIBadXMLError.new("relation", pt, "tag is missing key") if tag['k'].nil?
       raise OSM::APIBadXMLError.new("relation", pt, "tag is missing value") if tag['v'].nil?
index 389e2ce5234cded24bba7548a567e6b7b9dee124..aba38511ce5e01399bb702a9ef3115b295cd95fa 100644 (file)
@@ -1,26 +1,7 @@
 class RelationMember < ActiveRecord::Base
-  set_table_name 'current_relation_members'  
-  set_primary_keys :relation_id, :sequence_id
+  self.table_name = "current_relation_members"
+  self.primary_keys = "relation_id", "sequence_id"
 
   belongs_to :relation
   belongs_to :member, :polymorphic => true
-
-  after_find :set_class_from_type
-  after_initialize :set_class_from_type
-  before_save :set_type_from_class
-
-  def member_type=(type)
-    self[:member_type] = type
-    self[:member_class] = type.capitalize
-  end
-
-private
-
-  def set_class_from_type
-    self[:member_class] = self.member_type.classify unless self.member_type.nil?
-  end
-
-  def set_type_from_class
-    self.member_type = self[:member_class].classify
-  end
 end
index 2773d0612a30ec2b329df102a9d1f75944fc8664..c665cfef66e0fb19896731d29776d3695715b153 100644 (file)
@@ -1,6 +1,6 @@
 class RelationTag < ActiveRecord::Base
-  set_table_name 'current_relation_tags'
-  set_primary_keys :relation_id, :k
+  self.table_name = "current_relation_tags"
+  self.primary_keys = "relation_id", "k"
 
   belongs_to :relation
 
index 1ac502bc7659e747f2b37ddf7342276533ea9c2d..6e4ec40c357aa46ccbb2a23cb87b5b8f1168f7e2 100644 (file)
@@ -21,7 +21,7 @@ class RequestToken < OauthToken
         params[p] = read_attribute(p)
       }
 
-      access_token = AccessToken.create(params)
+      access_token = AccessToken.create(params, :without_protection => true)
       invalidate!
       access_token
     end
index 3f58cee2ef4008c7604ad4f282290a54d0df12d0..b72fda07dcd7b4b10b13a398b9f89205c936630d 100644 (file)
@@ -1,5 +1,5 @@
 class Trace < ActiveRecord::Base
-  set_table_name 'gpx_files'
+  self.table_name = "gpx_files"
 
   belongs_to :user
   has_many :tags, :class_name => 'Tracetag', :foreign_key => 'gpx_id', :dependent => :delete_all
index d4ba39de39368419f2a2434c0ba5acfb2d8a6493..c4ad8e1232790f35ab6bec2801224ef0f21403e1 100644 (file)
@@ -1,7 +1,7 @@
 class Tracepoint < ActiveRecord::Base
   include GeoRecord
 
-  set_table_name 'gps_points'
+  self.table_name = "gps_points"
 
   validates_numericality_of :trackid, :only_integer => true
   validates_numericality_of :latitude, :only_integer => true
index f9833e141446125128a07ab5e03a6c21ba2f9bde..1b8ba2309de79cdeba32938b4ed2b283841f903f 100644 (file)
@@ -1,8 +1,10 @@
 class Tracetag < ActiveRecord::Base
-  set_table_name 'gpx_file_tags'
+  self.table_name = "gpx_file_tags"
 
   validates_format_of :tag, :with => /^[^\/;.,?]*$/
   validates_length_of :tag, :within => 1..255
 
+  attr_accessible :tag
+
   belongs_to :trace, :foreign_key => 'gpx_id'
 end
index cf506e7c9e7192860d0c75ccea5e746ce7894b2f..0c9e76d54999685bd920542c4daf0aa42d64cbf6 100644 (file)
@@ -41,10 +41,15 @@ class User < ActiveRecord::Base
   validates_numericality_of :home_zoom, :only_integer => true, :allow_nil => true
   validates_inclusion_of :preferred_editor, :in => Editors::ALL_EDITORS, :allow_nil => true
 
+  attr_accessible :display_name, :email, :email_confirmation, :openid_url,
+                  :pass_crypt, :pass_crypt_confirmation, :consider_pd
+
   after_initialize :set_creation_time
   before_save :encrypt_password
 
-  file_column :image, :magick => { :geometry => "100x100>" }
+  has_attached_file :image, 
+    :default_url => "/assets/:class/:attachment/:style.png",
+    :styles => { :large => "100x100>", :small => "50x50>" }
 
   def self.authenticate(options)
     if options[:username] and options[:password]
@@ -198,7 +203,7 @@ class User < ActiveRecord::Base
     diary_entry_score = self.diary_entries.inject(0) { |s,e| s += OSM.spam_score(e.body) }
     diary_comment_score = self.diary_comments.inject(0) { |s,e| s += OSM.spam_score(e.body) }
 
-    score = OSM.spam_score(self.description) * 2
+    score = OSM.spam_score(self.description)
     score += diary_entry_score / self.diary_entries.length if self.diary_entries.length > 0
     score += diary_comment_score / self.diary_comments.length if self.diary_comments.length > 0
     score -= changeset_score
index f8c05c92ca9e9b5b52e509336201f79142e8fc34..7bf8f86b5095dbf4d12697a826d3d6d3a3639203 100644 (file)
@@ -18,9 +18,11 @@ class UserBlock < ActiveRecord::Base
   # revokes the block, allowing the user to use the API again. the argument
   # is the user object who is revoking the ban.
   def revoke!(revoker)
-    update_attributes({ :ends_at => Time.now.getutc(),
-                        :revoker_id => revoker.id,
-                        :needs_view => false })
+    update_attributes({
+      :ends_at => Time.now.getutc(),
+      :revoker_id => revoker.id,
+      :needs_view => false
+    }, :without_protection => true)
   end
 
   private
index 28ef40f1d5c8347597c9f9a790b4d8d002cb63ce..b5110bbf5592fd37b599e8f599ea27c2e77580e7 100644 (file)
@@ -1,5 +1,6 @@
 class UserPreference < ActiveRecord::Base
-  set_primary_keys :user_id, :k
+  self.primary_keys = "user_id", "k"
+
   belongs_to :user
   
   validates_length_of :k, :within => 1..255
index 7e420ae40b42684d4acdbf0dde025ad243dc2c57..a58b93832e74cf3558047cb5c5777df9e780c82b 100644 (file)
@@ -16,11 +16,11 @@ private
         (new_record.nil? or
          old_record.visible? != new_record.visible? or
          old_record.display_name != new_record.display_name or
-         old_record.image != new_record.image)
+         old_record.image.fingerprint != new_record.image.fingerprint)
       old_record.diary_entries.each do |entry|
         expire_action(:controller => 'diary_entry', :action => 'view', :display_name => old_record.display_name, :id => entry.id)
         expire_action(:controller => 'diary_entry', :action => 'list', :language => entry.language_code, :display_name => nil)
-        expire_action(:controller => 'diary_entry', :action => 'rss', :language => entry.language_code, :display_name => nil)
+        expire_action(:controller => 'diary_entry', :action => 'rss', :format => :rss, :language => entry.language_code, :display_name => nil)
       end
 
       old_record.diary_comments.each do |comment|
@@ -30,8 +30,8 @@ private
       expire_action(:controller => 'diary_entry', :action => 'list', :language => nil, :display_name => nil)
       expire_action(:controller => 'diary_entry', :action => 'list', :language => nil, :display_name => old_record.display_name)
 
-      expire_action(:controller => 'diary_entry', :action => 'rss', :language => nil, :display_name => nil)
-      expire_action(:controller => 'diary_entry', :action => 'rss', :language => nil, :display_name => old_record.display_name)
+      expire_action(:controller => 'diary_entry', :action => 'rss', :format => :rss, :language => nil, :display_name => nil)
+      expire_action(:controller => 'diary_entry', :action => 'rss', :format => :rss, :language => nil, :display_name => old_record.display_name)
 
       old_record.traces.each do |trace|
         expire_action(:controller => 'trace', :action => 'view', :id => trace.id)
index dda19118702726214d0cc4f5b2830cbb6e6fd615..9a754d3442c5deeec13b6b35be7e6e59013dc772 100644 (file)
@@ -1,6 +1,8 @@
 class UserToken < ActiveRecord::Base
   belongs_to :user
 
+  attr_accessible :referer
+
   after_initialize :set_defaults
 
 private
index 85aca4334a482125a068c9bd21d573d3e6b9dc7e..adf8b928fa7a75fe8100455d7b51373e515bee7c 100644 (file)
@@ -3,7 +3,7 @@ class Way < ActiveRecord::Base
   
   include ConsistencyValidations
 
-  set_table_name 'current_ways'
+  self.table_name = "current_ways"
   
   belongs_to :changeset
 
@@ -64,6 +64,10 @@ class Way < ActiveRecord::Base
     # and manually set to false before the actual delete.
     way.visible = true
 
+    # Start with no tags
+    way.tags = Hash.new
+
+    # Add in any tags from the XML
     pt.find('tag').each do |tag|
       raise OSM::APIBadXMLError.new("way", pt, "tag is missing key") if tag['k'].nil?
       raise OSM::APIBadXMLError.new("way", pt, "tag is missing value") if tag['v'].nil?
index 1a2e6928a5e9289dba8a711c467a830eb013ef3f..30d9013565eb9ebf3c78f795e9a51ae7c84304b4 100644 (file)
@@ -1,6 +1,6 @@
 class WayNode < ActiveRecord::Base
-  set_table_name 'current_way_nodes'
-  set_primary_keys :way_id, :sequence_id
+  self.table_name = "current_way_nodes"
+  self.primary_keys = "way_id", "sequence_id"
 
   belongs_to :way
   belongs_to :node
index f0c5eea8b9e6900587340ff022d2fb5e42b85440..98ff62f5f389a4148a3748a9af399cee8a20db91 100644 (file)
@@ -1,6 +1,6 @@
 class WayTag < ActiveRecord::Base
-  set_table_name 'current_way_tags'
-  set_primary_keys :way_id, :k
+  self.table_name = "current_way_tags"
+  self.primary_keys = "way_id", "k"
 
   belongs_to :way
   
index 2d7808137bd8de0102c227d84981e2633e16f5f5..eb90fad1044665cd877c0c417aba7d782a419e88 100644 (file)
@@ -33,8 +33,7 @@
           </tr>
           <tr>
             <td><%=bbox.min_lon -%></td>
-            <td>(<a href='/?minlon=<%= bbox.min_lon %>&minlat=<%= bbox.min_lat %>&maxlon=<%= bbox.max_lon %>&maxlat=<%= bbox.max_lat %>
-                  &box=yes' title='<%= t 'browse.changeset_details.show_area_box' %>'><%= t 'browse.changeset_details.box' %></a>)</td>
+            <td>(<%= link_to t('browse.changeset_details.box'), root_path(:minlon => bbox.min_lon, :minlat => bbox.min_lat, :maxlon => bbox.max_lon, :maxlat => bbox.max_lat, :box => 'yes'), :title => t('browse.changeset_details.show_area_box') %>)</td>
             <td><%=bbox.max_lon -%></td>
           </tr>
           <tr>
index 49d535b314b5ed8489b087dbb24d51b50274ae85..7b0ad746cee6c85acf2a44d2da9c4f34d5b6bf8d 100644 (file)
@@ -6,7 +6,7 @@
 <%= stylesheet_link_tag 'browse' %>
 <% end %>
 <%= render :partial => "navigation" %>
-<h2><%= t'browse.node.node_title', :node_name => h(@name) %></h2>
+<h2><%= t'browse.node.node_title', :node_name => @name %></h2>
 <%= render :partial => "map", :object => @node %>
 <%= render :partial => "node_details", :object => @node %>
 <hr />
index 5b222396db1eff45c6d7ea2f76f7f0d9b7339a47..2128d18a9ab226189ee3991f064401c0bb5cf1be 100644 (file)
@@ -6,7 +6,7 @@
 <%= stylesheet_link_tag 'browse' %>
 <% end %>
 <%= render :partial => "navigation" %>
-<h2><%= t'browse.relation.relation_title', :relation_name => h(@name) %></h2>
+<h2><%= t'browse.relation.relation_title', :relation_name => @name %></h2>
 <%= render :partial => "map", :object => @relation %>
 <%= render :partial => "relation_details", :object => @relation %>
 <hr />
index 3489d7c2348b816467edd18914ffeb743ac218f1..41341fef8d4c30d32cb69478e9faaa35981ea45b 100644 (file)
@@ -6,7 +6,7 @@
 <%= stylesheet_link_tag 'browse' %>
 <% end %>
 <%= render :partial => "navigation" %>
-<h2><%= t'browse.way.way_title', :way_name => h(@name) %></h2>
+<h2><%= t'browse.way.way_title', :way_name => @name %></h2>
 <%= render :partial => "map", :object => @way %>
 <%= render :partial => "way_details", :object => @way %>
 <hr />
index 5d12aa83794bb1cb7a8a2344acddc298e7f44b00..bf8adbe20a333d96df02fef1b64d09260f7d3916 100644 (file)
 
 <%= render :partial => 'changeset_paging_nav' %>
 
+<% unless params[:friends] or params[:nearby] -%>
 <%= atom_link_to params.merge({ :page => nil, :action => :feed }) %>
 
-<% content_for :head do %>
+<% content_for :head do -%>
 <%= auto_discovery_link_tag :atom, params.merge({ :page => nil, :action => :feed }) %>
-<% end %>
+<% end -%>
+<% end -%>
diff --git a/app/views/diary_entry/comments.html.erb b/app/views/diary_entry/comments.html.erb
new file mode 100644 (file)
index 0000000..b506ddf
--- /dev/null
@@ -0,0 +1,23 @@
+<h1><%= t('diary_entry.comments.has_commented_on', :display_name => @this_user.display_name) %></h1>
+
+<table width="100%">
+  <tr>
+    <th><%= t 'diary_entry.comments.post' %></th>
+    <th><%= t 'diary_entry.comments.when' %></th>
+    <th><%= t 'diary_entry.comments.comment' %></th>
+  </tr>
+  <% @comments.each do |comment| -%>
+  <% cl = cycle('table0', 'table1') %>
+  <tr class="<%= cl %>">
+    <td><%= link_to comment.diary_entry.title, :action => :view, :display_name => comment.diary_entry.user.display_name, :id => comment.diary_entry.id %></td>
+    <td><span title="<%= l comment.created_at, :format => :friendly %>"><%= t 'diary_entry.comments.ago', :ago => time_ago_in_words(comment.created_at) %></span></td>
+    <td><%= htmlize(comment.body) %></td>
+  </tr>
+  <% end -%>
+</table>
+
+<%= link_to t('diary_entry.comments.older_comments') , { :page => @comment_pages.current.next} if @comment_pages.current.next %>
+<% if @comment_pages.current.next and @comment_pages.current.previous %>
+|
+<% end %>
+<%= link_to t('diary_entry.comments.newer_comments'), { :page => @comment_pages.current.previous } if @comment_pages.current.previous %>
index 03a326d16bbf7f9dee36245148f4f84ed09b609b..9de2efea541efaa8d068a9154a6acada9897cd51 100644 (file)
   <br />
 <% end %>
 
+<% unless params[:friends] or params[:nearby] -%>
 <%= rss_link_to :action => 'rss', :language => params[:language] %>
 
-<% content_for :head do %>
+<% content_for :head do -%>
 <%= auto_discovery_link_tag :atom, :action => 'rss', :language => params[:language] %>
-<% end %>
+<% end -%>
+<% end -%>
index 5f6f634daa80e478b4631c62d0f479f0643ce687..b8f681b2fdcc8534e9401cf84dbe9c88691daec8 100644 (file)
@@ -20,9 +20,7 @@
     <p>
       <%= radio_button_tag("format", "osm") %> <%= t'export.start.osm_xml_data' %>
       <br/>
-      <%= radio_button_tag("format", "mapnik") %> <%= t'export.start.mapnik_image' %>
-      <br/>
-      <%= radio_button_tag("format", "osmarender") %> <%= t'export.start.osmarender_image' %>
+      <%= radio_button_tag("format", "mapnik") %> <%= t'export.start.map_image' %>
       <br/>
       <%= radio_button_tag("format", "html") %> <%= t'export.start.embeddable_html' %>
     </p>
     </div>
   </div>
 
-  <div id="export_osmarender">
-    <p class="export_heading"><%= t'export.start.options' %></p>
-
-    <div class="export_details">
-      <p><%= t'export.start.format' %> <%= select_tag("osmarender_format", options_for_select([["PNG", "png"], ["JPEG", "jpeg"]], "png")) %></p>
-      <p><%= t'export.start.zoom' %> <%= select_tag("osmarender_zoom", options_for_select([4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17])) %></p>
-    </div>
-  </div>
-  
   <div id="export_html">
     <p class="export_heading"><%= t'export.start.options' %></p>
 
index 79d0db4a9e80ab8a21138a94855062c85ffa0999..1134d16d83ce3790a555d766fd3ccd7268e5134c 100644 (file)
@@ -45,7 +45,6 @@ function startExport() {
 
   $("#format_osm").click(formatChanged);
   $("#format_mapnik").click(formatChanged);
-  $("#format_osmarender").click(formatChanged);
   $("#format_html").click(formatChanged);
 
   $("#mapnik_scale").change(mapnikSizeChanged);
@@ -54,8 +53,6 @@ function startExport() {
 
   if (map.baseLayer.name == "Mapnik") {
     $("#format_mapnik").prop("checked", true);
-  } else if (map.baseLayer.name == "Osmarender") {
-    $("#format_osmarender").prop("checked", true);
   }
 
   formatChanged();
@@ -227,20 +224,6 @@ function validateControls() {
   }
 
   $("#mapnik_max_scale").html(roundScale(max_scale));
-
-  var max_zoom = maxOsmarenderZoom();
-
-  $("#osmarender_zoom option").each(function () {
-    if ($(this).val() > max_zoom) {
-      $(this).prop("disabled", true);
-    } else {
-      $(this).prop("disabled", false);
-    }
-  });
-
-  if ($("#osmarender_zoom option").is(":disabled:selected")) {
-    $("#osmarender_zoom option").filter(":enabled").last().prop("selected", true);
-  }
 }
 
 function htmlUrlChanged() {
@@ -291,15 +274,6 @@ function formatChanged() {
     $("#export_mapnik").hide();
   }
 
-  if ($("#format_osmarender").prop("checked")) {
-    var zoom = Math.min(map.getZoom(), maxOsmarenderZoom());
-
-    $("#osmarender_zoom option[value=" + zoom + "]").prop("selected", true);
-    $("#export_osmarender").show();
-  } else {
-    $("#export_osmarender").hide();
-  }
-
   if ($("#format_html").prop("checked")) {
     $("#export_html").show();
     $("#export_commit").hide();
@@ -334,16 +308,6 @@ function mapnikImageSize(scale) {
                              Math.round(bounds.getHeight() / scale / 0.00028));
 }
 
-function maxOsmarenderZoom() {
-  var bounds = new OpenLayers.Bounds($("#minlon").val(), $("#minlat").val(), $("#maxlon").val(), $("#maxlat").val());
-  var xzoom = Math.LOG2E * Math.log(2000 * 1.40625 / bounds.getWidth());
-  var ymin = bounds.bottom * Math.PI / 180;
-  var ymax = bounds.top * Math.PI / 180;
-  var yzoom = Math.LOG2E * (Math.log(2000 * 2 * Math.PI) - Math.log(Math.log((Math.tan(ymax) + 1 / Math.cos(ymax)) / (Math.tan(ymin) + 1 / Math.cos(ymin)))))
-
-  return Math.min(Math.floor(Math.min(xzoom, yzoom)), 17);
-}
-
 function roundScale(scale) {
   var precision = 5 * Math.pow(10, Math.floor(Math.LOG10E * Math.log(scale)) - 2);
 
index 6e876e166727cd3cd17cd5af74f8ac6680328683..8a0f62d922a9ddc4b13f0c21c1c18c5903736743 100644 (file)
@@ -9,11 +9,12 @@
   <%= stylesheet_link_tag "print-#{t 'html.dir'}", :media => "print" %>
   <!--[if IE]><%= stylesheet_link_tag "large-#{t 'html.dir'}", :media => "screen" %><![endif]--> <!-- IE is totally broken with CSS media queries -->
   <%= favicon_link_tag "favicon.ico" %>
+  <%= favicon_link_tag "osm_logo.png", :rel => "apple-touch-icon", :type => "image/png" %>
   <%= tag("link", { :rel => "publisher", :href => "https://plus.google.com/111953119785824514010" }) %>
   <%= tag("link", { :rel => "search", :type => "application/opensearchdescription+xml", :title => "OpenStreetMap Search", :href => asset_path("osm.xml") }) %>
   <%= tag("meta", { :name => "description", :content => "OpenStreetMap is the free wiki world map." }) %>
   <%= style_rules %>
   <%= yield :head %>
   <%= csrf_meta_tag %>
-  <title><%= t 'layouts.project_name.title' %><%= ' | '+ h(@title) if @title %></title>
+  <title><%= t 'layouts.project_name.title' %><%= ' | '+ @title if @title %></title>
 </head>
index a2cd2aa403b9493163805746057fc1b157e436f0..b6fb08986753fe77f4fd8e0d8deabe653aca58c0 100644 (file)
@@ -1,7 +1,7 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<%= I18n.locale %>" lang="<%= I18n.locale %>" dir="<%= t'html.dir' %>">
   <%= render :partial => "layouts/head" %>
-  <body>
+  <body class="<%= params[:controller] %>">
     <div id="small-title">
       <%= link_to(image_tag("osm_logo.png", :size => "16x16", :border => 0, :alt => t('layouts.logo.alt_text')), :controller => 'site', :action => 'index') %>
       <h1><%= t 'layouts.project_name.h1' %></h1>
       <%= yield %>
     </div>
 
-    <span id="greeting">
-      <% if @user and @user.id %>
-        <span id="full-greeting"><%= raw(t 'layouts.welcome_user', :user_link => (link_to h(@user.display_name), {:controller => 'user', :action => 'view', :display_name => @user.display_name}, :title => t('layouts.welcome_user_link_tooltip'))) %></span> 
-        <span id="small-greeting"><%= link_to t('layouts.welcome_user_link_tooltip'), {:controller => 'user', :action => 'view', :display_name => @user.display_name} %></span> | 
-        <%= yield :greeting %>
-        <%= render :partial => "layouts/inbox" %> |
-        <%= link_to t('layouts.logout'), {:controller => 'user', :action => 'logout', :session => request.session_options[:id], :referer => request.fullpath}, {:id => 'logoutanchor', :title => t('layouts.logout_tooltip')}%>
-      <% else %>
-        <%= link_to t('layouts.log_in'), {:controller => 'user', :action => 'login', :referer => request.fullpath}, {:id => 'loginanchor', :title => t('layouts.log_in_tooltip')} %> |
-        <%= link_to t('layouts.sign_up'), {:controller => 'user', :action => 'new'}, {:id => 'registeranchor', :title => t('layouts.sign_up_tooltip')} %>
-      <% end %>
-    </span>
-
-    <div>
+    <div id='top-bar'>
+      <span id="greeting">
+         <% if @user and @user.id %>
+           <span id="full-greeting"><%= raw(t 'layouts.welcome_user', :user_link => (link_to h(@user.display_name), {:controller => 'user', :action => 'view', :display_name => @user.display_name}, :title => t('layouts.welcome_user_link_tooltip'))) %></span> 
+           <span id="small-greeting"><%= link_to t('layouts.welcome_user_link_tooltip'), {:controller => 'user', :action => 'view', :display_name => @user.display_name} %></span> | 
+           <%= yield :greeting %>
+           <%= render :partial => "layouts/inbox" %> |
+           <%= link_to t('layouts.logout'), {:controller => 'user', :action => 'logout', :session => request.session_options[:id], :referer => request.fullpath}, {:id => 'logoutanchor', :title => t('layouts.logout_tooltip')}%>
+         <% else %>
+           <%= link_to t('layouts.log_in'), {:controller => 'user', :action => 'login', :referer => request.fullpath}, {:id => 'loginanchor', :title => t('layouts.log_in_tooltip')} %> |
+           <%= link_to t('layouts.sign_up'), {:controller => 'user', :action => 'new'}, {:id => 'registeranchor', :title => t('layouts.sign_up_tooltip')} %>
+         <% end %>
+      </span>
       <ul id="tabnav">
         <%
         viewclass = 'geolink llz layers'
 
     <div id="left">
       <div id="logo">
-        <center>
-          <h1><%= t 'layouts.project_name.h1' %></h1>
-          <%= link_to(image_tag("osm_logo.png", :size => "120x120", :border => 0, :alt => t('layouts.logo.alt_text')), :controller => 'site', :action => 'index') %><br/>
-          <h2 class="nowrap"><%= t('layouts.tag_line') %></h2>
-        </center>
+        <%= link_to(image_tag("osm_logo.png", :size => "120x120", :border => 0, :alt => t('layouts.logo.alt_text')), :controller => 'site', :action => 'index') %><br/>
+        <h1><%= t 'layouts.project_name.h1' %></h1>
+        <h2 class="nowrap"><%= t('layouts.tag_line') %></h2>
       </div>
 
       <%= yield :optionals %>
index 27b0aa644f0f58cf6e7446b73ef929737164e618..9b5edd26cf3cfad0251d2f6f3664362b2fc392d3 100644 (file)
@@ -1 +1,8 @@
-<p id="inbox-count"><%= t'message.inbox.you_have', :new_count => @user.new_messages.size, :old_count => (@user.messages.size -  @user.new_messages.size) %></p> 
+<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)
+%>
+</p> 
index 9662fdbce397b13076f31dadc325a10aed8fa567..fd89581262a323b2f851cf53d6be3c3c6f4f956b 100644 (file)
@@ -1,6 +1,6 @@
 <h2><%= raw(t'message.outbox.my_inbox', :inbox_link => link_to(t('message.outbox.inbox'), url_for(:controller => "user", :action => "inbox", :id => @user.display_name))) %>/<%= t'message.outbox.outbox' %></h2>
 
-<p><%= t'message.outbox.you_have_sent_messages', :count => @user.sent_messages.size %>
+<p><%= t'message.outbox.messages', :count => @user.sent_messages.size %>
 
 <% if @user.sent_messages.size > 0 %>
   <div id="messages">
index d018cedc913206b87ffa04799a6231ee267eec02..a6583762fea4073778ec986312c373b3b4d74e5e 100644 (file)
@@ -16,6 +16,8 @@
   }
 
   function resizeMap() {
+    var content_width = $("#content").width();
+    var content_height = $("#content").height();
     var sidebar_width = 0 + $("#sidebar:visible").outerWidth(true);
     var left_border = parseFloat($("#map").css("border-left-width"));
     var right_border = parseFloat($("#map").css("border-right-width"));
@@ -27,8 +29,8 @@
     <% else -%>
     $("#map").css("right", (sidebar_width) + "px");
     <% end -%>
-    $("#map").width($("#content").width() - sidebar_width - left_border - right_border);
-    $("#map").height($("#content").height() - top_border - bottom_border);
+    $("#map").width(content_width - sidebar_width - left_border - right_border);
+    $("#map").height(content_height - top_border - bottom_border);
 
     <% if params[:controller] == "site" and params[:action] == "index" -%>
     map.updateSize();
index c83cef99c255a76229f2dfe3b85b0920fa51021c..03dee8716a2bf7379c11b852f9cadc4c2e43db56 100644 (file)
@@ -10,9 +10,9 @@
           { :rel => "license" }) %>
 </p>
 
-<% if I18n.locale == 'en' or params[:copyright_locale] == 'en' %>
+<% if @locale == 'en' %>
   <!-- Maybe ease foreigners back to their native page -->
-  <% if t('license_page.legal_babble') != t('license_page.legal_babble', :locale => :en) %>
+  <% if t('license_page.legal_babble', :locale => I18n.locale) != t('license_page.legal_babble', :locale => :en) %>
     <h2><%= t 'license_page.native.title' %></h2>
     <p>
       <%= raw t 'license_page.native.text',
     </p>
     <hr />
   <% end %>
-
-  <%= raw t('license_page.legal_babble', :locale => :en) %>
 <% else %>
   <!-- Maybe note that this page has been translated -->
-  <% if t('license_page.legal_babble') != t('license_page.legal_babble', :locale => :en) %>
+  <% if t('license_page.legal_babble', :locale => @locale) != t('license_page.legal_babble', :locale => :en) %>
     <h2><%= t 'license_page.foreign.title' %></h2>
     <p>
       <%= raw t 'license_page.foreign.text',
@@ -40,6 +38,6 @@
     </p>
     <hr />
   <% end %>
-
-  <%= raw t('license_page.legal_babble') %>
 <% end %>
+
+<%= raw t('license_page.legal_babble', :locale => @locale) %>
index 7d7d5a16372af3ef9f042075ce2536ae880e19d2..88489610994ac6c5934a60264729d0554105119c 100644 (file)
@@ -18,7 +18,7 @@
 
 <div id="map">
   <div id="permalink">
-    <a href="/" id="permalinkanchor" class="geolink llz layers object"><%= t 'site.index.permalink' %></a><br/>
+    <a href="/" id="permalinkanchor" class="geolink llz layers object"><%= t 'site.index.permalink' %></a>
     <a href="/" id="shortlinkanchor"><%= t 'site.index.shortlink' %></a>
     <a href="#" id="createnoteanchor">Report a problem</a>     
   </div>
index 988cd9121d2981ffff9d5f470163070a9a29aa15..3e8d1b0bf59e6521ad31c77ab05b821bfd39a739 100644 (file)
       <%= t 'user.account.image' %>
     </td>
     <td valign="top">
-      <% if @user.image.nil? %>
-        <%= hidden_field_tag "image_action", "new" %>
-        <%= t 'user.account.new image' %><br /><%= file_column_field "user", "image" %><br /><span class="minorNote"><%= t 'user.account.image size hint' %></span>
-      <% else %>
+      <% if @user.image.file? %>
         <table id="accountImage">
           <tr>
-            <td rowspan="3" valign="top"><%= image_tag url_for_file_column(@user, "image"), :class => "user_image" %></td>
+            <td rowspan="3" valign="top"><%= user_image @user %></td>
             <td><%= radio_button_tag "image_action", "keep", true %></td>
             <td><%= t 'user.account.keep image' %></td>
           </tr>
           </tr>
           <tr>
             <td><%= radio_button_tag "image_action", "new" %></td>
-            <td><%= t 'user.account.replace image' %><br /><%= file_column_field "user", "image", :onchange => "$('image_action_new').checked = true" %><br /><span class="minorNote"><%= t 'user.account.image size hint' %></span></td>
+            <td><%= t 'user.account.replace image' %><br /><%= f.file_field :image, :onchange => "$('image_action_new').prop('checked', true)" %><br /><span class="minorNote"><%= t 'user.account.image size hint' %></span></td>
           </tr>
         </table>
+      <% else %>
+        <%= hidden_field_tag "image_action", "new" %>
+        <%= t 'user.account.new image' %><br /><%= f.file_field :image %><br /><span class="minorNote"><%= t 'user.account.image size hint' %></span>
       <% end %>
     </td>
   </tr>
index a164c7a56338e85884864abbcf2521f47c225500..6e77bfed827cd2be52f3978ec291dd9b0f271807 100644 (file)
@@ -14,8 +14,8 @@ xml.osm("version" => API_VERSION, "generator" => GENERATOR) do
                        :lon => @user.home_lon,
                        :zoom => @user.home_zoom
     end    
-    if @user.image
-      xml.tag! "img", :href => (url_for_file_column(@user, "image", :absolute => true))
+    if @user.image.file?
+      xml.tag! "img", :href => "http://#{SERVER_URL}#{@user.image.url}"
     end
     if @user.languages
       xml.tag! "languages" do
diff --git a/app/views/user/blocked.html.erb b/app/views/user/blocked.html.erb
new file mode 100644 (file)
index 0000000..69e7006
--- /dev/null
@@ -0,0 +1,5 @@
+<h1><%= t 'user.new.heading' %></h1>
+
+<p><%= t 'user.new.no_auto_account_create' %></p>
+
+<p><%= raw t 'user.new.contact_webmaster' %></p>
index c19c0ac6c52544cbaf766f5bca37869446669ae1..398debe1eed046cfb0ccd9d706f76eb4ef75fe4a 100644 (file)
@@ -18,7 +18,7 @@
               :count => @user_pages.current_page.last_item - @user_pages.current_page.first_item + 1
           %>
           <% if @user_pages.page_count > 1 %>
-          | <%= pagination_links_each(@user_pages, {}) { |n| link_to n, params.merge(:page => n) } %>
+          | <%= raw pagination_links_each(@user_pages, {}) { |n| link_to n, params.merge(:page => n) } %>
           <% end %>
         </td>
         <td>
index dc330feaeecb36ab58724200a989f81f04913f46..c185a11b7fa416a3858b2bd2af256d3e4ded1fd3 100644 (file)
@@ -6,14 +6,25 @@
     <%= form_tag({ :action => "login" }, { :id => "login_form" }) do %>
       <%= hidden_field_tag('referer', h(params[:referer])) %>
 
-      <p><%= t 'user.login.with username' %></p>
+      <p><%= t 'user.login.no account' %> <%= link_to t('user.login.register now'), :action => :new, :referer => params[:referer] %></p>
 
       <table id="loginForm">
         <tr><td class="fieldName"><%= t 'user.login.email or username' %></td><td><%= text_field_tag "username", params[:username], :size => 28, :maxlength => 255, :tabindex => 1 %></td></tr>
         <tr><td class="fieldName"><%= t 'user.login.password' %></td><td><%= password_field_tag "password", "", :size => 28, :maxlength => 255, :tabindex => 2 %> <span class="minorNote">(<%= link_to t('user.login.lost password link'), :controller => 'user', :action => 'lost_password' %>)</span></td></tr>
-        <tr><td class="fieldName"><label for="remember_me"><%= t 'user.login.remember' %></label></td><td><%= check_box_tag "remember_me", "yes", false, :tabindex => 3 %></td></tr>
+        <tr>
+          <td></td>
+          <td><%= check_box_tag "remember_me", "yes", false, :tabindex => 3 %>
+            <label for="remember_me">
+              <%= t 'user.login.remember' %></label>
+          </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>
+            <%= submit_tag t('user.login.login_button'), :tabindex => 4 %>
+          </td>
+        </tr>
       </table>
-      <%= submit_tag t('user.login.login_button'), :tabindex => 3 %>
 
       <br clear="all" />
 
 
     <br clear="all" />
   </div>
-
-  <div id="login_signup">
-    <h2><%= t 'user.login.new to osm' %></h2>
-    <p><%= t 'user.login.to make changes' %></p>
-    <p><%= t 'user.login.create account minute' %></p>
-    <p><%= button_to t('user.login.register now'), :action => :new, :referer => params[:referer] %></p>
-
-    <br clear="both">
-  </div>
-
 </div>
 
 <script type="text/javascript">
index 2bf6f528114601e04efc89df4a9e475221c4856b..e8400eb9019a687c629a5c8eac5d5eb82e8e6fdb 100644 (file)
@@ -1,13 +1,5 @@
 <h1><%= t 'user.new.heading' %></h1>
 
-<% if Acl.address(request.remote_ip).where(:k => "no_account_creation").exists? %>
-
-<p><%= t 'user.new.no_auto_account_create' %></p>
-
-<p><%= t 'user.new.contact_webmaster' %></p>
-
-<% else %>
-
 <p><%= t 'user.new.fill_form' %></p>
 
 <%= error_messages_for 'user' %>
@@ -102,5 +94,3 @@ enableOpenID();
 disableOpenID();
 <% end -%>
 </script>
-
-<% end %>
index 0c6968be8c9d259117a923837e73f5d620d7d413..edf290c7b7c7ba143ce634b0ac082e5e449d5e0e 100644 (file)
@@ -21,6 +21,8 @@
     |
     <%= link_to t('user.view.new diary entry'), :controller => 'diary_entry', :action => 'new', :display_name => @user.display_name %>
     |
+    <%= link_to t('user.view.my comments' ), :controller => 'diary_entry', :action => 'comments', :display_name => @this_user.display_name %>
+    |
     <%= link_to t('user.view.my edits'), :controller => 'changeset', :action => 'list', :display_name => @user.display_name %>
     |
     <%= link_to t('user.view.my traces'), :controller => 'trace', :action=> 'mine' %>
@@ -41,6 +43,8 @@
     |
     <%= link_to t('user.view.diary'), :controller => 'diary_entry', :action => 'list', :display_name => @this_user.display_name %>
     |
+    <%= link_to t('user.view.comments'), :controller => 'diary_entry', :action => 'comments', :display_name => @this_user.display_name %>
+    |
     <%= link_to t('user.view.edits'), :controller => 'changeset', :action => 'list', :display_name => @this_user.display_name %>
     |
     <%= link_to t('user.view.traces'), :controller => 'trace', :action => 'list', :display_name => @this_user.display_name %>
   <% if friends.empty? %>
     <%= t 'user.view.no friends' %>
   <% else %>
-               <%= link_to t('user.view.friends_changesets'), {:controller => 'browse', :action => 'friends'} %><br/><br/>
+    <%= link_to t('user.view.friends_changesets'), {:controller => 'browse', :action => 'friends'} %><br/>
+    <%= link_to t('user.view.friends_diaries'), {:controller => 'diary', :action => 'friends'} %><br/><br/>
     <table id="friends">
       <%= render :partial => "contact", :collection => friends %>
     </table>
   <% if nearby.empty? %>
     <%= t 'user.view.no nearby users' %>
   <% else %>
+    <%= link_to t('user.view.nearby_changesets'), {:controller => 'browse', :action => 'nearby'} %><br/>
+    <%= link_to t('user.view.nearby_diaries'), {:controller => 'diary', :action => 'nearby'} %><br/><br/>
     <table id="nearbyusers">
       <%= render :partial => "contact", :collection => nearby %>
     </table>
index 0713451e52cd44f4d015f120c4117a9ad56526c6..25df04b448683afaee2c4214e6774be87e785217 100644 (file)
@@ -14,7 +14,7 @@ end
 
 if defined?(Bundler)
   # If you precompile assets before deploying to production, use this line
-  Bundler.require *Rails.groups(:assets => %w(development test))
+  Bundler.require(*Rails.groups(:assets => %w(development test)))
   # If you want your assets lazily compiled in production, use this line
   # Bundler.require(:default, :assets, Rails.env)
 end
@@ -51,17 +51,28 @@ module OpenStreetMap
     # Configure sensitive parameters which will be filtered from the log file.
     config.filter_parameters += [:password, :pass_crypt, :pass_crypt_confirmation]
 
+    # Use SQL instead of Active Record's schema dumper when creating the database.
+    # This is necessary if your schema can't be completely dumped by the schema dumper,
+    # like if you have constraints or database-specific column types
+    unless STATUS == :database_offline
+      config.active_record.schema_format = :sql
+    end
+
+    # Enforce whitelist mode for mass assignment.
+    # This will create an empty whitelist of attributes available for mass-assignment for all models
+    # in your app. As such, your models will need to explicitly whitelist or blacklist accessible
+    # parameters by using an attr_accessible or attr_protected declaration.
+    config.active_record.whitelist_attributes = true
+
     # Enable the asset pipeline
     config.assets.enabled = true
 
     # Version of your assets, change this if you want to expire all your assets
     config.assets.version = '1.0'
 
-    # Use SQL instead of Active Record's schema dumper when creating the test database.
-    # This is necessary if your schema can't be completely dumped by the schema dumper,
-    # like if you have constraints or database-specific column types
-    unless STATUS == :database_offline
-      config.active_record.schema_format = :sql
+    # Don't eager load models when the database is offline
+    if STATUS == :database_offline
+      config.paths["app/models"].skip_eager_load!
     end
   end
 end
index 12cf912bc3c609e0459a6b55a27cda58262325b6..75f8fee12ba8894deed7b87539c1502799bf5d3e 100644 (file)
@@ -2,7 +2,7 @@ OpenStreetMap::Application.configure do
   # Settings specified here will take precedence over those in config/application.rb
 
   # In the development environment your application's code is reloaded on
-  # every request.  This slows down response time but is perfect for development
+  # every request. This slows down response time but is perfect for development
   # since you don't have to restart the web server when you make code changes.
   config.cache_classes = false
 
@@ -11,7 +11,6 @@ OpenStreetMap::Application.configure do
 
   # Show full error reports and disable caching
   config.consider_all_requests_local       = true
-#  config.action_view.debug_rjs             = true
   config.action_controller.perform_caching = false
 
   # Don't care if the mailer can't send
@@ -23,6 +22,13 @@ OpenStreetMap::Application.configure do
   # Only use best-standards-support built into browsers
   config.action_dispatch.best_standards_support = :builtin
 
+  # Raise exception on mass assignment protection for Active Record models
+  config.active_record.mass_assignment_sanitizer = :strict
+
+  # Log the query plan for queries taking more than this (works
+  # with SQLite, MySQL, and PostgreSQL)
+  config.active_record.auto_explain_threshold_in_seconds = 0.5
+
   # Do not compress assets
   config.assets.compress = false
 
index 6a1f633ae6a96c0183f59833d307b10d1fea538a..56c33ec98398d160f952639c76e8437c806b6e70 100644 (file)
@@ -36,18 +36,20 @@ OpenStreetMap::Application.configure do
   # See everything in the log (default is :info)
   # config.log_level = :debug
 
+  # Prepend all log lines with the following tags
+  # config.log_tags = [ :subdomain, :uuid ]
+
   # Use a different log path in production
   if defined?(LOG_PATH)
     config.paths["log"] = LOG_PATH
   end
 
   # Use a different logger for distributed setups
-  # config.logger = SyslogLogger.new
+  # config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new)
 
   # Use a different cache store in production
   if defined?(MEMCACHE_SERVERS)
-    MEMCACHE = Memcached::Rails.new(MEMCACHE_SERVERS, :binary_protocol => true)
-    config.cache_store = :mem_cache_store, MEMCACHE
+    config.cache_store = :mem_cache_store, MemCache.new(:namespace => "rails:cache", :no_block => true, :buffer_requests => true, :noreply => true)
   end
 
   # Enable serving of images, stylesheets, and JavaScripts from an asset server
@@ -72,4 +74,8 @@ OpenStreetMap::Application.configure do
 
   # Send deprecation notices to registered listeners
   config.active_support.deprecation = :notify
+
+  # Log the query plan for queries taking more than this (works
+  # with SQLite, MySQL, and PostgreSQL)
+  # config.active_record.auto_explain_threshold_in_seconds = 0.5
 end
index fe1d1aa780d93f4f27163276c10cc3088dac96c8..524cc5137ed57ac9ecfc41e1bbc9997902a58d47 100644 (file)
@@ -2,9 +2,9 @@ OpenStreetMap::Application.configure do
   # Settings specified here will take precedence over those in config/application.rb
 
   # The test environment is used exclusively to run your application's
-  # test suite.  You never need to work with it otherwise.  Remember that
+  # test suite. You never need to work with it otherwise. Remember that
   # your test database is "scratch space" for the test suite and is wiped
-  # and recreated between test runs.  Don't rely on the data there!
+  # and recreated between test runs. Don't rely on the data there!
   config.cache_classes = true
 
   # Configure static asset server for tests with Cache-Control for performance
@@ -29,9 +29,9 @@ OpenStreetMap::Application.configure do
   # ActionMailer::Base.deliveries array.
   config.action_mailer.delivery_method = :test
 
+  # Raise exception on mass assignment protection for Active Record models
+  config.active_record.mass_assignment_sanitizer = :strict
+
   # Print deprecation notices to the stderr
   config.active_support.deprecation = :stderr
-
-  # Allow pass debug_assets=true as a query parameter to load pages with unpackaged assets
-  config.assets.allow_debugging = true
 end
index 90e2cc74ed39494fb58fe960d74fddf73de6461a..501b3d2ad4bdbbc64d94faded0b929d7ac304d17 100644 (file)
@@ -57,8 +57,8 @@ defaults: &defaults
   # Location of GPX traces and images
   gpx_trace_dir: "/home/osm/traces"
   gpx_image_dir: "/home/osm/images"
-  # Location of data for file columns
-  #file_column_root: ""
+  # Location of data for attachments
+  attachments_dir: ":rails_root/public/attachments"
   # Log file to use
   #log_path: ""
   # List of memcache servers to use for caching
diff --git a/config/initializers/action_cache_path.rb b/config/initializers/action_cache_path.rb
new file mode 100644 (file)
index 0000000..b25aa14
--- /dev/null
@@ -0,0 +1,19 @@
+module ActionController
+  module Caching
+    module Actions
+      class ActionCachePath
+        def initialize(controller, options = {}, infer_extension = true)
+          if infer_extension
+            @extension = controller.params[:format]
+            options.reverse_merge!(:format => @extension) if options.is_a?(Hash)
+          else
+            @extension = options[:format]
+          end
+
+          path = controller.url_for(options).split(%r{://}).last
+          @path = normalize!(path)
+        end
+      end
+    end
+  end
+end
index e6181072bcb46e12390997d1767907c106fb8c1b..ad729174fde5e8b427d7c14d84f66d18e78e2fd2 100644 (file)
@@ -9,10 +9,8 @@ ActionMailer::Base.smtp_settings = {
 # Monkey patch to allow sending of messages in specific locales
 module ActionMailer
   class Base
-    adv_attr_accessor :locale
-
     def mail_with_locale(*args)
-      old_locale= I18n.locale
+      old_locale = I18n.locale
 
       begin
         I18n.locale = @locale
index 03d88f69c694d60fc5a3cb40a1d8517dee1d682f..b75e74ec64f8580127b8540340b1d458946a9a90 100644 (file)
@@ -7,7 +7,7 @@ module ActiveSupport
       return if @level > severity
       message = (message || (block && block.call) || progname).to_s
       time = Time.now
-      message = "[%s.%06d #%d] %s\n" % [time.strftime("%Y-%m-%d %H:%M:%S"), time.usec, $$, message.sub(/^\n+/, "")]
+      message = "[%s.%06d #%d] %s" % [time.strftime("%Y-%m-%d %H:%M:%S"), time.usec, $$, message.sub(/^\n+/, "")]
       old_add(severity, message)
     end
   end
similarity index 93%
rename from vendor/plugins/classic_pagination/init.rb
rename to config/initializers/classic_pagination.rb
index 25e552f2aa6a07afc221a5a896f2ab31e0f2161f..96e7f64f640938c70de3c5f50a27736b83814c2c 100644 (file)
@@ -21,8 +21,8 @@
 # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #++
 
-require 'pagination'
-require 'pagination_helper'
+require 'classic_pagination/pagination'
+require 'classic_pagination/pagination_helper'
 
 ActionController::Base.class_eval do
   include ActionController::Pagination
diff --git a/config/initializers/composite_primary_keys.rb b/config/initializers/composite_primary_keys.rb
deleted file mode 100644 (file)
index e928df3..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-module ActiveRecord
-  module Associations
-    class AssociationScope
-      def add_constraints(scope)
-        tables = construct_tables
-
-        chain.each_with_index do |reflection, i|
-          table, foreign_table = tables.shift, tables.first
-
-          if reflection.source_macro == :has_and_belongs_to_many
-            join_table = tables.shift
-
-            # CPK
-            # scope = scope.joins(join(
-            #  join_table,
-            #  table[reflection.active_record_primary_key].
-            #    eq(join_table[reflection.association_foreign_key])
-            #))
-            predicate = cpk_join_predicate(table, reflection.association_primary_key,
-                                           join_table, reflection.association_foreign_key)
-            scope = scope.joins(join(join_table, predicate))
-
-            table, foreign_table = join_table, tables.first
-          end
-
-          if reflection.source_macro == :belongs_to
-            if reflection.options[:polymorphic]
-              key = reflection.association_primary_key(klass)
-            else
-              key = reflection.association_primary_key
-            end
-
-            foreign_key = reflection.foreign_key
-          else
-            key         = reflection.foreign_key
-            foreign_key = reflection.active_record_primary_key
-          end
-
-          conditions = self.conditions[i]
-
-          if reflection == chain.last
-            # CPK
-            # scope = scope.where(table[key].eq(owner[foreign_key]))
-            predicate = cpk_join_predicate(table, key, owner, foreign_key)
-            scope = scope.where(predicate)
-
-            if reflection.type
-              scope = scope.where(table[reflection.type].eq(owner.class.base_class.name))
-            end
-
-            conditions.each do |condition|
-              if options[:through] && condition.is_a?(Hash)
-                condition = { table.name => condition }
-              end
-
-              scope = scope.where(interpolate(condition))
-            end
-          else
-            # CPK
-            # constraint = table[key].eq(foreign_table[foreign_key])
-            constraint = cpk_join_predicate(table, key, foreign_table, foreign_key)
-
-            if reflection.type
-              type = chain[i + 1].klass.base_class.name
-              constraint = constraint.and(table[reflection.type].eq(type))
-            end
-
-            scope = scope.joins(join(foreign_table, constraint))
-
-            unless conditions.empty?
-              scope = scope.where(sanitize(conditions, table))
-            end
-          end
-        end
-
-        scope
-      end
-    end
-  end
-end
diff --git a/config/initializers/file_column.rb b/config/initializers/file_column.rb
deleted file mode 100644 (file)
index 6447ef5..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-if defined?(FILE_COLUMN_ROOT)
-  FileColumn::ClassMethods::DEFAULT_OPTIONS[:root_path] = FILE_COLUMN_ROOT
-end
diff --git a/config/initializers/http_accept_language.rb b/config/initializers/http_accept_language.rb
new file mode 100644 (file)
index 0000000..04c3dfa
--- /dev/null
@@ -0,0 +1,12 @@
+#
+# Monkey patch HttpAcceptLanguage pending integration of
+# https://github.com/iain/http_accept_language/pull/6
+#
+module HttpAcceptLanguage
+  def compatible_language_from(available_languages)
+    user_preferred_languages.find do |x|
+      available_languages.find { |y| y.to_s == x.to_s } ||
+      available_languages.find { |y| y.to_s =~ /^#{Regexp.escape(x.to_s)}-/ }
+    end
+  end
+end
index 3c3ba872c2c33e851e5bc3a7f1ddaa0d49d0764b..22704901fd88a700a2c8e4f80022353a7993243f 100644 (file)
@@ -1,5 +1,17 @@
 module I18n
   module Backend
+    class Simple
+      def init_translations_with_mn_cleanup
+        init_translations_without_mn_cleanup
+
+        translations[:mn][:errors][:template].delete(:body)
+        translations[:mn][:activemodel][:errors][:template].delete(:body)
+        translations[:mn][:activerecord][:errors][:template].delete(:body)
+      end
+
+      alias_method_chain :init_translations, :mn_cleanup
+    end
+
     module Fallbacks
       def find_first_string_or_lambda_default(defaults)
         defaults.each_with_index { |default, ix| return ix if default && !default.is_a?(Symbol) }
@@ -18,14 +30,7 @@ module I18n
   end
 end
 
-I18n::Backend::Simple.include(I18n::Backend::Pluralization)
 I18n::Backend::Simple.include(I18n::Backend::PluralizationFallback)
-I18n.load_path << "#{Rails.root}/config/pluralizers.rb"
-
 I18n::Backend::Simple.include(I18n::Backend::Fallbacks)
 
 I18n.fallbacks.map("no" => "nb")
-
-Rails.configuration.after_initialize do
-  I18n.reload!
-end
index 9e8b0131f8ff7e3d3923697eca0b0ffdc77b19ce..5d8d9be237b28d4ebdad9cec9510764ab88154e6 100644 (file)
@@ -8,3 +8,8 @@
 #   inflect.irregular 'person', 'people'
 #   inflect.uncountable %w( fish sheep )
 # end
+#
+# These inflection rules are supported but not enabled by default:
+# ActiveSupport::Inflector.inflections do |inflect|
+#   inflect.acronym 'RESTful'
+# end
diff --git a/config/initializers/mail.rb b/config/initializers/mail.rb
new file mode 100644 (file)
index 0000000..b93c3f6
--- /dev/null
@@ -0,0 +1,25 @@
+module Mail
+  class Ruby18
+    def Ruby18.b_value_decode(str)
+      match = str.match(/\=\?(.+)?\?[Bb]\?(.+)?\?\=/m)
+      if match
+        encoding = match[1]
+        str = Ruby18.decode_base64(match[2])
+        require 'iconv'
+        str = Iconv.conv("UTF-8//TRANSLIT//IGNORE", encoding, str)
+      end
+      str
+    end
+
+    def Ruby18.q_value_decode(str)
+      match = str.match(/\=\?(.+)?\?[Qq]\?(.+)?\?\=/m)
+      if match
+        encoding = match[1]
+        str = Encodings::QuotedPrintable.decode(match[2].gsub(/_/, '=20'))
+        require 'iconv'
+        str = Iconv.conv("UTF-8//TRANSLIT//IGNORE", encoding, str)
+      end
+      str
+    end
+  end
+end
diff --git a/config/initializers/memcached.rb b/config/initializers/memcached.rb
deleted file mode 100644 (file)
index 03066a8..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-if defined?(PhusionPassenger) and defined?(MEMCACHE_SERVERS)
-  PhusionPassenger.on_event(:starting_worker_process) do |forked|
-    if forked
-      MEMCACHE = MEMCACHE.clone
-      RAILS_CACHE = ActiveSupport::Cache::CompressedMemCacheStore.new(MEMCACHE)
-      ActionController::Base.cache_store = RAILS_CACHE
-    end
-  end
-end
diff --git a/config/initializers/output_compression.rb b/config/initializers/output_compression.rb
new file mode 100644 (file)
index 0000000..5a42e2a
--- /dev/null
@@ -0,0 +1 @@
+require 'output_compression/output_compression'
diff --git a/config/initializers/paperclip.rb b/config/initializers/paperclip.rb
new file mode 100644 (file)
index 0000000..6467348
--- /dev/null
@@ -0,0 +1,20 @@
+module Paperclip
+  class AssetUrlGenerator < UrlGenerator
+    include Sprockets::Helpers::IsolatedHelper
+    include Sprockets::Helpers::RailsHelper
+
+    def for(style_name, options)
+      url = super(style_name, options)
+
+      if url =~ /^\/assets\/(.*)$/
+        asset_path($1)
+      else
+        url
+      end
+    end
+  end
+end
+
+Paperclip::Attachment.default_options[:url] = "/attachments/:class/:attachment/:id_partition/:style/:fingerprint.:extension"
+Paperclip::Attachment.default_options[:path] = "#{ATTACHMENTS_DIR}/:class/:attachment/:id_partition/:style/:fingerprint.:extension"
+Paperclip::Attachment.default_options[:url_generator] = Paperclip::AssetUrlGenerator
index a9afad2d644d2433c813c488af2fa60ee36c6027..02548e803a980f777fe5db1160eae22b9037dd1e 100644 (file)
@@ -1,8 +1,35 @@
 # Be sure to restart your server when you modify this file.
 
-if STATUS == :database_offline or STATUS == :database_readonly
-  OpenStreetMap::Application.config.session_store :cookie_store, :key => '_osm_session'
+if defined?(MEMCACHE_SERVERS)
+  unless STATUS == :database_offline or STATUS == :database_readonly
+    module Rack
+      module Session
+        class Memcache
+          def get_session(env, sid)
+            with_lock(env, [nil, {}]) do
+              unless sid and session = @pool.get(sid)
+                if sid and s = ActiveRecord::SessionStore::SqlBypass.find_by_session_id(sid)
+                  session = s.data
+                  s.destroy
+                else
+                  sid, session = generate_sid, {}
+                end
+                
+                unless /^STORED/ =~ @pool.add(sid, session)
+                  raise "Session collision on '#{sid.inspect}'"
+                end
+              end
+              [sid, session]
+            end
+          end
+        end
+      end
+    end
+  end
+
+  cache = MemCache.new(:namespace => "rails:session", :string_return_types => true)
+
+  OpenStreetMap::Application.config.session_store :mem_cache_store, :cache => cache, :key => "_osm_session"
 else
-  ActiveRecord::SessionStore.session_class = ActiveRecord::SessionStore::SqlBypass
-  OpenStreetMap::Application.config.session_store :active_record_store, :key => '_osm_session'
+  OpenStreetMap::Application.config.session_store :cache_store, :key => '_osm_session'
 end
index bf860d9097ff002a6d11ac79d80b5208cc4b18fa..d443ecf3a9e09a4a9bc78143f54322a4362c96d4 100644 (file)
@@ -805,7 +805,6 @@ af:
       people_mapping_nearby: nabygeleë karteerders
       subject: Onderwerp
       title: Inboks
-      you_have: U het %{new_count} nuwe boodskappe en %{old_count} ou boodskappe
     mark: 
       as_read: Boodskap gemerk as gelees
       as_unread: Boodskap gemerk as ongelees
@@ -839,7 +838,6 @@ af:
       subject: Onderwerp
       title: Gestuur
       to: Aan
-      you_have_sent_messages: U het %{count} gestuurde boodskappe
     read: 
       back_to_inbox: Terug na inboks
       back_to_outbox: Terug na uitboks
@@ -1171,7 +1169,6 @@ af:
       password: "Wagwoord:"
       remember: "Onthou my:"
       title: Teken in
-      webmaster: webmeester
     logout: 
       heading: Teken van OpenStreetMap af
       logout_button: Teken uit
index ad082de551340937791f258cfb6c2d79a63f2b63..942b5ede9618eabfca6beac912dbd3a52ef0b207 100644 (file)
@@ -366,11 +366,9 @@ aln:
       licence: Licensa
       longitude: "Lon:"
       manually_select: Manualisht zgedhe ni zon te ndryshme
-      mapnik_image: Mapin fotografi
       max: maks
       options: Opcionet
       osm_xml_data: OpenStreetMap XML të dhana
-      osmarender_image: Osmarender fotografi
       output: Outputi
       paste_html: Fute HTML për me ngjit në web sajt
       scale: Shkallë
@@ -938,7 +936,6 @@ aln:
       people_mapping_nearby: njerëzit pranë hartës
       subject: Tema
       title: Inbox
-      you_have: I ki %{new_count} mesazhe të reja dhe %{old_count} mesazhe të vjetra
     mark: 
       as_read: Mesazhi u bo si i lexum
       as_unread: Mesazhi u bo si i palexum
@@ -974,7 +971,6 @@ aln:
       subject: Titulli
       title: Dalje
       to: Te
-      you_have_sent_messages: I ki %{count} mesazhe të dërgume
     read: 
       back_to_inbox: Kthehu në postë
       back_to_outbox: Kthehu në Dalje
@@ -1400,7 +1396,6 @@ aln:
       title: Perdoruesit
     login: 
       account not active: Na vjen keq, akonti juej nuk asht hala aktiv<br /> Ju lutemi klikoni në linkun e dërguem në email për me aktivizu akountin tuej.
-      account suspended: Me na fal, por llogaria juaj u suspendu për shkak të aktivitetit të dyshimt.<br />Ju lutem kontaktoni %{webmaster} nëse doni ta diskutoni këtë
       auth failure: Na vjen keq, smunem me ju kyc me ato detaje.
       email or username: "Email Adresa ose Username:"
       heading: Kycu
@@ -1409,7 +1404,6 @@ aln:
       password: "Fjalekalimi:"
       remember: "Kujtom mu:"
       title: Kyçu
-      webmaster: webmaster
     logout: 
       heading: Dil nga OpenStreetMap
       logout_button: Dil
index 1ea687d700e8e8359713f66ed5d8c62cf81a5a64..9f7d325633d161e268e579d56c14ef9a791aa8af 100644 (file)
@@ -380,11 +380,9 @@ ar:
       licence: الرخصة
       longitude: "خط الطول:"
       manually_select: اختر يدويًا منطقة أخرى
-      mapnik_image: Mapnik صورة
       max: الأقصى
       options: خيارات
       osm_xml_data: معطيات خريطة الطريق المفتوح بنسق إكس أم أل
-      osmarender_image: Osmarender صورة
       output: الخرج
       paste_html: ألصق HTML لتضمينه في موقع ما
       scale: القياس
@@ -965,7 +963,6 @@ ar:
       people_mapping_nearby: مخططون في جواري
       subject: الموضوع
       title: الوارد
-      you_have: لديك %{new_count} رسالة جديدة و %{old_count} رسالة قديمة
     mark: 
       as_read: عُلّمت الرسالة مقروءة
       as_unread: عُلّمت الرسالة كغير مقروءة
@@ -1001,7 +998,6 @@ ar:
       subject: الموضوع
       title: صندوق الصادر
       to: إلى
-      you_have_sent_messages: لديك %{count} رسالة مرسلة
     read: 
       back_to_inbox: العودة إلى صندوق الوارد
       back_to_outbox: العودة إلى صندوق الصادر
@@ -1427,7 +1423,6 @@ ar:
       heading: المستخدمون
       title: المستخدمون
     login: 
-      account suspended: عذرًا، لقد عُلّق حسابك بسبب نشاط مشبوه.<br />يرجى الاتصال بالمسؤول عن الموقع (%{webmaster}) إذا كنت ترغب في مناقشة هذا الأمر.
       auth failure: آسف، لا يمكن الدخول بتلك التفاصيل.
       create account minute: أنشئ حساباّ. تحتاج فقط إلى دقيقة.
       email or username: "عنوان البريد الإلكتروني أو اسم المستخدم:"
@@ -1439,7 +1434,6 @@ ar:
       register now: تسجل الآن
       remember: "تذكرني:"
       title: ولوج
-      webmaster: المسؤول عن الموقع
     logout: 
       heading: الخروج من خريطة الشارع المفتوحة
       logout_button: اخرج
index 00cf2d443427db061d846ddabe707ec47c9d7f0a..5b9ebef1d92d13f14d65edb73c66e7b94149a206 100644 (file)
@@ -349,11 +349,9 @@ arz:
       licence: الرخصة
       longitude: "خط الطول:"
       manually_select: اختر يدويًا منطقه أخرى
-      mapnik_image: Mapnik صورة
       max: الأقصى
       options: خيارات
       osm_xml_data: معطيات خريطه الطريق المفتوح بنسق إكس أم أل
-      osmarender_image: Osmarender صورة
       output: الخرج
       paste_html: ألصق HTML لتضمينه فى موقع ما
       scale: القياس
@@ -867,7 +865,6 @@ arz:
       people_mapping_nearby: مخططون فى جواري
       subject: الموضوع
       title: الوارد
-      you_have: لديك %{new_count} رساله جديده و %{old_count} رساله قديمة
     mark: 
       as_read: عُلّمت الرساله مقروءة
       as_unread: عُلّمت الرساله كغير مقروءة
@@ -899,7 +896,6 @@ arz:
       subject: الموضوع
       title: صندوق الصادر
       to: إلى
-      you_have_sent_messages: لديك %{count} رساله مرسلة
     read: 
       back_to_inbox: العوده إلى صندوق الوارد
       back_to_outbox: العوده إلى صندوق الصادر
index 60a99cdf56548b61ffa4333e7d33a1ff1ce0a669..082659b0d5b6b503fb45f12e98e3cb9fd215408b 100644 (file)
@@ -36,10 +36,10 @@ ast:
         display_name: Nome a amosar
         email: Corréu
         languages: Llingües
-        pass_crypt: Contraseña
+        pass_crypt: Conseña
     models: 
       acl: Llista de Control d'Accesu
-      changeset: Conxuntu de cambeos
+      changeset: Conxuntu de cambios
       changeset_tag: Etiqueta del conxuntu de cambeos
       country: País
       diary_comment: Comentariu del diariu
@@ -86,7 +86,7 @@ ast:
         title: Conxuntu de cambeos %{id}
         title_comment: Conxuntu de cambeos %{id} - %{comment}
       osmchangexml: osmChange XML
-      title: Conxuntu de cambeos
+      title: Conxuntu de cambios
     changeset_details: 
       belongs_to: "Pertenez a:"
       bounding_box: "Cuadru de llende:"
@@ -127,7 +127,7 @@ ast:
         node: Ver nodiu nún mapa más grande
         relation: Ver rellación nun mapa más grande
         way: Ver la vía nun mapa más grande
-      loading: Cargando
+      loading: Cargando...
     navigation: 
       all: 
         next_changeset_tooltip: Conxuntu de cambeos siguiente
@@ -161,7 +161,7 @@ ast:
     not_found: 
       sorry: Perdón, el/la %{type}  con id %{id} nun se pudo alcontrar.
       type: 
-        changeset: conxuntu de cambeos
+        changeset: conxuntu de cambios
         node: nodiu
         relation: rellación
         way: vía
@@ -202,7 +202,7 @@ ast:
       history_for_feature: Historial de [[feature]]
       load_data: Cargar datos
       loaded_an_area_with_num_features: "Cargasti un área que contién [[num_features]] carauterístiques. Polo xeneral, los restoladores nun pueden amosar bien esta cantidá de datos. Normalmente los restoladores funcionen meyor amosando menos de 100 carauterístiques al tiempu: d'otra miente se tornen lentos/dexen de responder. Si tas seguru d'amosar los datos, pues facelo calcando nel botón d'abaxo."
-      loading: Cargando
+      loading: Cargando...
       manually_select: Seleiciona manualmente un área distinta
       object_list: 
         api: Recuperar esti área de l'API
@@ -235,7 +235,7 @@ ast:
     timeout: 
       sorry: Perdón, los datos pa %{type} con id %{id}, tardaron demasiao en descargase.
       type: 
-        changeset: conxuntu de cambeos
+        changeset: conxuntu de cambios
         node: nodiu
         relation: rellación
         way: vía
@@ -278,21 +278,35 @@ ast:
       saved_at: Guardao el
       user: Usuariu
     list: 
-      description: Cambeos recientes
+      description: Cambios recientes
       description_bbox: Conxuntos de cambeos en %{bbox}
+      description_friend: Conxuntos de cambios de los tos collacios
+      description_nearby: Conxuntos de cambios d'usuarios cercanos
       description_user: Conxuntos de cambeos de %{user}
       description_user_bbox: Conxuntos de cambeos de %{user} en %{bbox}
-      heading: Conxuntos de cambeos
-      heading_bbox: Conxuntos de cambeos
-      heading_user: Conxuntos de cambeos
-      heading_user_bbox: Conxuntos de cambeos
-      title: Conxuntos de cambeos
+      heading: Conxuntos de cambios
+      heading_bbox: Conxuntos de cambios
+      heading_friend: Conxuntos de cambios
+      heading_nearby: Conxuntos de cambios
+      heading_user: Conxuntos de cambios
+      heading_user_bbox: Conxuntos de cambios
+      title: Conxuntos de cambios
       title_bbox: Conxuntos de cambeos en %{bbox}
+      title_friend: Conxuntos de cambios de los tos collacios
+      title_nearby: Conxuntos de cambios d'usuarios cercanos
       title_user: Conxuntos de cambeos de %{user}
       title_user_bbox: Conxuntos de cambeos de %{user} en %{bbox}
     timeout: 
       sorry: Llevó demasiao tiempu baxar la llista de conxuntos de cambeos que pidisti.
   diary_entry: 
+    comments: 
+      ago: hai %{ago}
+      comment: Comentariu
+      has_commented_on: "%{display_name} comentó nes siguientes entraes del diariu"
+      newer_comments: Comentarios nuevos
+      older_comments: Comentarios anteriores
+      post: Publicar
+      when: Cuándo
     diary_comment: 
       comment_from: Comentariu de %{link_user} el %{comment_created_at}
       confirm: Confirmar
@@ -337,6 +351,8 @@ ast:
       older_entries: Entraes anteriores
       recent_entries: "Entraes recientes del diariu:"
       title: Diarios d'usuarios
+      title_friends: Diarios de collacios
+      title_nearby: Diarios d'usuarios cercanos
       user_title: Diariu de %{user}
     location: 
       edit: Editar
@@ -384,11 +400,10 @@ ast:
       licence: Llicencia
       longitude: "Llon:"
       manually_select: Seleiciona manualmente un área distinta
-      mapnik_image: Imaxe de Mapnik
+      map_image: Imaxe del mapa (amuesa la capa estándar)
       max: máx
       options: Opciones
       osm_xml_data: Datos XML d'OpenStreetMap
-      osmarender_image: Imaxe d'Osmarender
       output: Salida
       paste_html: Pegar el HTML pa empotrar nun sitiu web
       scale: Escala
@@ -884,6 +899,7 @@ ast:
       base: 
         cycle_map: Mapa ciclista
         mapquest: MapQuest Open
+        standard: Estándar
         transport_map: Mapa de tresportes
     site: 
       edit_disabled_tooltip: Aumenta pa editar el mapa
@@ -956,7 +972,7 @@ ast:
       english_link: l'orixinal n'inglés
       text: En casu d'haber un conflictu ente esta páxina traducida y %{english_original_link}, la páxina n'inglés tendrá prioridá
       title: Tocante a esta traducción
-    legal_babble: "<h2>Drechos d'autor y llicencia</h2>\n<p>\n   OpenStreetMap son <i>datos abiertos (Open Data)</i>, con llicencia <a\n   href=\"http://creativecommons.org/licenses/by-sa/2.0/deed.es\">Creative Commons Reconocimientu - Compartir igual  2.0</a> (CC-BY-SA).\n</p>\n<p>\n  Puedes copiar, distribuir, tresmitir y adautar los nuesos mapes ya información de mou llibre mentanto yos reconuezas a OpenStreetMap y a los sos collaboradores. Si camudes o creas conteníu sobre los nuesos mapes ya información, podrás distribuir estos cambios baxo la mesma llicencia. El <a href=\"http://creativecommons.org/licenses/by-sa/2.0/legalcode\">códigu llegal completu</a> te desplica los tos drechos y obligaciones.\n</p>\n\n<h3>Cómo dar reconocimientu a OpenStreetMap</h3>\n<p>\n  Si uses imaxes de mapes d'OpenStreetMap, te pidimos que'l testu de reconocimientu ponga polo menos &ldquo;&copy; Collaboradores d'OpenStreetMap, CC-BY-SA&rdquo;. Si sólo vas usar datos del mapa, lo que pidimos ye &ldquo;Datos del mapa &copy; Collaboradores d'OpenstreetMap, CC-BY-SA&rdquo;.\n</p>\n<p>\n  Onde se pueda, OpenStreetMap tendría d'enllazase a <a\n  href=\"http://www.openstreetmap.org/\">http://www.openstreetmap.org/</a>\n  y CC-BY-SA a <a\n  href=\"http://creativecommons.org/licenses/by-sa/2.0/\">http://creativecommons.org/licenses/by-sa/2.0/</a>. Si tas usando un medio que nun permita los enllaces (por casu, en trabayos imprentaos), t'encamentamos dirixir a los llectores a www.openstreetmap.org (por exemplu, ampliando &lsquo;OpenStreetMap&rsquo; a la so direición completa) y a www.creativecommons.org.\n</p>\n\n<h3>Pa saber más...</h3>\n<p>\n  Llee más tocante a cómo utilizar los nuesos datos en <a\n  href=\"http://wiki.openstreetmap.org/wiki/Legal_FAQ\">Entrugues y rempuestes llegales</a> (n'inglés).\n</p>\n<p>\n  Recordamos a los collaboradores d'OSM qu'enxamás amiesten datos que vengan d'una fonte con drechos d'autor acutaos (p. ex. de Google Maps o mapes impresos) ensin el permisu esplícitu de los dueños de los drechos d'autor.\n</p>\n<p>\n  Anque OpenStreetMap son datos abiertos, nun podemos ufrir una API de mapes de baldre pa desendolcadores d'aplicaciones pa terceros.\n\n  Por favor, llee la nuesa <a href=\"http://wiki.openstreetmap.org/wiki/API_usage_policy\">Política d'usu de la API</a> (n'inglés),\n  <a href=\"http://wiki.openstreetmap.org/wiki/Tile_usage_policy\">Política d'usu d'imaxes</a> (n'inglés)\n  y <a href=\"http://wiki.openstreetmap.org/wiki/Nominatim#Usage_Policy\">Política d'usu de Nominatim</a> (n'inglés tamién).\n</p>\n\n<h3>Los nuesos collaboradores</h3>\n<p>\n  La nuesa llicencia CC-BY-SA requier &ldquo;reconocer al autor orixinal, de manera razonable pal mediu o los medios que teas utilizando&rdquo;. Los collaboradores individuales d'OSM nun piden más créditu que &ldquo;Collaboradores d'OpenStreetMap&rdquo;, pero cuando s'incluye n'OpenStreetMap información d'un organismu nacional de cartografía o d'otra fuente importante, ye razonable reproducir el so créditu direutamente o enllazar al mesmu nesta páxina.\n</p>\n\n<!--\nInformación pa los editores de la páxina\n\nLa llista darréu incluye sólo les organizaciones que requieren atribución como condición para que los sos datos puedan utilizase n'OpenStreetMap. Nun ye un catálogu xeneral d'importaciones y nun se tien d'utilizar más que cuando se requiera atribución pa cumplir coles condiciones de la llicencia de los datos importaos.\n\n\nCualesquier amiestu a esta llista tien de discutise primero colos alministradores del sistema d'OSM.\n-->\n\n<ul id=\"contributors\">\n   <li><strong>Australia</strong>: Contien datos de barrios basaos en datos de Australian Bureau of\n   Statistics.</li>\n   <li><strong>Austria</strong>: Contien datos de\n   <a href=\"http://data.wien.gv.at/\">Stadt Wien</a> baxo\n   <a href=\"http://creativecommons.org/licenses/by/3.0/at/deed.de\">CC-BY</a>.</li>\n   <li><strong>Canadá</strong>: Contien datos de GeoBase&reg;, GeoGratis (&copy; Department of Natural\n   Resources Canada), CanVec (&copy; Department of Natural\n   Resources Canada), and StatCan (Geography Division,\n   Statistics Canada).</li>\n   <li><strong>Francia</strong>: Contien datos sacaos de Direction Générale des Impôts.</li>\n   <li><strong>Nueva Zelanda</strong>: Contien datos sacaos de Land Information New Zealand. Crown Copyright reserved.</li>\n   <li><strong>Polonia</strong>: Contien datos de <a\n   href=\"http://ump.waw.pl/\">mapes UMP-pcPL</a>. Copyright collaboradores de\n   UMP-pcPL.</li>\n<li><strong>Reinu Xuníu</strong>: Contien datos de Ordnance Survey &copy; Crown copyright and database right\n   2010.</li>\n</ul>\n\n<p>\n  La inclusión de datos n'OpenStreetMap nun significa que'l fornidor de los datos orixinales sofite OpenStreetMap, ufra garantía dala o aceute dalguna responsabilidá.\n</p>"
+    legal_babble: "<h2>Drechos d'autor y llicencia</h2>\n<p>\n   OpenStreetMap son <i>datos abiertos (Open Data)</i>, con llicencia <a\n   href=\"http://creativecommons.org/licenses/by-sa/2.0/deed.es\">Creative Commons Reconocimientu - Compartir igual  2.0</a> (CC-BY-SA).\n</p>\n<p>\n  Puedes copiar, distribuir, tresmitir y adautar los nuesos mapes y datos de mou llibre, mentanto yos reconozas a OpenStreetMap y a los sos collaboradores. Si camudes o creas conteníu sobre los nuesos mapes o datos, podrás distribuir el resultáu baxo la mesma llicencia. El <a href=\"http://creativecommons.org/licenses/by-sa/2.0/legalcode\">códigu llegal completu</a> t'esplica los tos drechos y obligaciones.\n</p>\n\n<h3>Cómo dar reconocimientu a OpenStreetMap</h3>\n<p>\n  Si uses les imaxes de mapes d'OpenStreetMap, te pidimos que'l testu de reconocimientu ponga polo menos &ldquo;&copy; Collaboradores d'OpenStreetMap, CC-BY-SA&rdquo;. Si sólo vas usar datos del mapa, lo que pidimos ye &ldquo;Datos del mapa &copy; Collaboradores d'OpenstreetMap, CC-BY-SA&rdquo;.\n</p>\n<p>\n  Onde se pueda, OpenStreetMap tendría d'enllazase a <a\n  href=\"http://www.openstreetmap.org/\">http://www.openstreetmap.org/</a>\n  y CC-BY-SA a <a\n  href=\"http://creativecommons.org/licenses/by-sa/2.0/\">http://creativecommons.org/licenses/by-sa/2.0/</a>. Si tas usando un mediu que nun permita los enllaces (por casu, en trabayos imprentaos), t'encamentamos dirixir a los llectores a www.openstreetmap.org (por exemplu, ampliando &lsquo;OpenStreetMap&rsquo; a esta direición completa) y a www.creativecommons.org.\n</p>\n\n<h3>Pa saber más</h3>\n<p>\n  Llei más tocante a cómo utilizar los nuesos datos en <a\n  href=\"http://wiki.openstreetmap.org/wiki/Legal_FAQ\">Entrugues y rempuestes llegales</a> (n'inglés).\n</p>\n<p>\n  Recordamos a los collaboradores d'OSM qu'enxamás amiesten datos que vengan d'una fonte con drechos d'autor acutaos (p. ex. de Google Maps o mapes impresos) ensin el permisu esplícitu de los dueños de los drechos d'autor.\n</p>\n<p>\n  Anque OpenStreetMap son datos abiertos, nun podemos ufrir una API de mapes de baldre pa desendolcadores d'aplicaciones pa terceros.\n\n  Llee la nuesa <a href=\"http://wiki.openstreetmap.org/wiki/API_usage_policy\">Política d'usu de la API</a> (n'inglés),\n  <a href=\"http://wiki.openstreetmap.org/wiki/Tile_usage_policy\">Política d'usu d'imaxes</a> (n'inglés)\n  y <a href=\"http://wiki.openstreetmap.org/wiki/Nominatim#Usage_Policy\">Política d'usu de Nominatim</a> (n'inglés tamién).\n</p>\n\n<h3>Los nuesos collaboradores</h3>\n<p>\n  La nuesa llicencia CC-BY-SA requier &ldquo;reconocer al autor orixinal, de manera razonable pal mediu o los medios que teas utilizando&rdquo;. Los mapeadores individuales d'OSM nun piden más créditu que &ldquo;Collaboradores d'OpenStreetMap&rdquo;, pero cuando s'incluye n'OpenStreetMap información d'un organismu nacional de cartografía o d'otra fuente importante, ye razonable reproducir el so créditu direutamente o enllazar al mesmu nesta páxina.\n</p>\n\n<!--\nInformación pa los editores de la páxina\n\nLa llista darréu incluye sólo les organizaciones que requieren atribución como condición para que los sos datos puedan utilizase n'OpenStreetMap. Nun ye un catálogu xeneral d'importaciones y nun se tien d'utilizar más que cuando se requiera atribución pa cumplir coles condiciones de la llicencia de los datos importaos.\n\n\nCualesquier amiestu a esta llista tien de discutise primero colos alministradores del sistema d'OSM.\n-->\n\n<ul id=\"contributors\">\n   <li><strong>Australia</strong>: Contien datos de barrios basaos en datos de Australian Bureau of\n   Statistics.</li>\n   <li><strong>Austria</strong>: Contien datos de\n   <a href=\"http://data.wien.gv.at/\">Stadt Wien</a> baxo\n   <a href=\"http://creativecommons.org/licenses/by/3.0/at/deed.de\">CC-BY</a>.</li>\n   <li><strong>Canadá</strong>: Contien datos de GeoBase&reg;, GeoGratis (&copy; Department of Natural\n   Resources Canada), CanVec (&copy; Department of Natural\n   Resources Canada), y StatCan (Geography Division,\n   Statistics Canada).</li>\n   <li><strong>Francia</strong>: Contien datos sacaos de Direction Générale des Impôts.</li>\n   <li><strong>Nueva Zelanda</strong>: Contien datos sacaos de Land Information New Zealand. Crown Copyright reserved.</li>\n   <li><strong>Polonia</strong>: Contien datos de <a\n   href=\"http://ump.waw.pl/\">mapes UMP-pcPL</a>. Copyright collaboradores de\n   UMP-pcPL.</li>\n   <a href=\"http://wiki.openstreetmap.org/wiki/UMP2OSM_Importing\">\n   Más tocante al usu n&apos;OSM de datos UMP</a></li>\n   <li><strong>South Africa</strong>: Contién datos sacaod de\n   <a href=\"http://www.ngi.gov.za/\">Chief Directorate:\n   National Geo-Spatial Information</a>, State copyright reserved.</li>\n<li><strong>Reinu Xuníu</strong>: Contien datos de Ordnance Survey &copy; Crown copyright and database right 2010.</li>\n</ul>\n\n<p>\n  La inclusión de datos n'OpenStreetMap nun significa que'l fornidor de los datos orixinales sofite OpenStreetMap, ufra garantía dala o aceute dalguna responsabilidá.\n</p>"
     native: 
       mapping_link: principiar col mapéu
       native_link: versión n'asturianu
@@ -968,13 +984,19 @@ ast:
     inbox: 
       date: Data
       from: De
+      messages: Tienes %{new_messages} y %{old_messages}
       my_inbox: El mio buzón
+      new_messages: 
+        one: "%{count} mensaxe nuevu"
+        other: "%{count} mensaxes nuevos"
       no_messages_yet: Entá nun tienes mensaxes. ¿Y si te pones en contautu con %{people_mapping_nearby_link}?
+      old_messages: 
+        one: "%{count} mensaxe vieyu"
+        other: "%{count} mensaxes vieyos"
       outbox: buzón de salida
       people_mapping_nearby: xente que ta mapeando cerca
       subject: Asuntu
       title: Buzón
-      you_have: Tienes %{new_count} mensaxes nuevos y %{old_count} mensaxes antiguos
     mark: 
       as_read: Mensaxe marcáu como lleíu
       as_unread: Mensaxe marcáu como non lleíu
@@ -1003,6 +1025,9 @@ ast:
     outbox: 
       date: Data
       inbox: buzón
+      messages: 
+        one: Tienes %{count} mensaxe unviáu
+        other: Tienes %{count} mensaxes unviaos
       my_inbox: El mio %{inbox_link}
       no_sent_messages: Entá nun unviasti mensaxes. ¿Y si te pones en contautu con %{people_mapping_nearby_link}?
       outbox: buzón de salida
@@ -1010,7 +1035,6 @@ ast:
       subject: Asuntu
       title: Buzón de salida
       to: Pa
-      you_have_sent_messages: Tienes %{count} mensaxes unviaos
     read: 
       back_to_inbox: Tornar al buzón d'entrada
       back_to_outbox: Tornar al buzón de salida
@@ -1065,16 +1089,16 @@ ast:
       with_description: cola descripción
       your_gpx_file: Paez el to ficheru GPX
     lost_password: 
-      subject: "[OpenStreetMap] Pidíu de reaniciu de contraseña"
+      subject: "[OpenStreetMap] Pidíu de reaniciu de conseña"
     lost_password_html: 
-      click_the_link: Si yes tú, calca nel enllaz d'abaxo pa reaniciar la to contraseña.
+      click_the_link: Si yes tu, calca nel enllaz d'abaxo pa reaniciar la to conseña.
       greeting: Bones,
-      hopefully_you: Dalguién (esperamos que tu) pidió que se-y reanicie la contraseña na cuenta d'openstreetmap.org con estes señes de corréu.
+      hopefully_you: Dalguién (esperamos que tu) pidió que se-y reanicie la conseña na cuenta con estes señes de corréu d'openstreetmap.org.
     lost_password_plain: 
-      click_the_link: Si yes tú, calca nel enllaz d'abaxo pa reaniciar la to contraseña.
+      click_the_link: Si yes tu, calca nel enllaz d'abaxo pa reaniciar la to conseña.
       greeting: Bones,
-      hopefully_you_1: Dalguién (esperamos que tu) pidió que se-y reanicie la contraseña na
-      hopefully_you_2: cuenta d'openstreetmap.org con estes señes de corréu.
+      hopefully_you_1: Dalguién (esperamos que tu) pidió que se-y reanicie la conseña na
+      hopefully_you_2: cuenta con estes señes de corréu d'openstreetmap.org.
     message_notification: 
       footer1: Tamién pues lleer el mensax en %{readurl}
       footer2: y pues contestar en %{replyurl}
@@ -1424,7 +1448,7 @@ ast:
         text: Anguaño, les tos ediciones son anónimes y la xente nun te pue unviar mensaxes o ver la to llocalización. P'amosar lo qu'editasti y permitir que la xente se ponga en contautu contigo pela páxina web, calca nel botón qu'apaez abaxo. <b>Dende'l cambiu al API 0.6, sólo los usuarios públicos pueden editar los datos del mapa</b> (<a href="http://wiki.openstreetmap.org/wiki/Anonymous_edits">por estes razones</a>).<ul><li>Les direiciones de corréu electrónicu nun se fairán públiques.</li><li>Nun ye posible volver atrás d'esta aición, y agora tolos usuarios nuevos son públicos de mou predetermináu.</li></ul>
       replace image: Sustituir la imaxe actual
       return to profile: Volver al perfil
-      save changes button: Guardar cambeos
+      save changes button: Guardar los cambios
       title: Editar la cuenta
       update home location on click: ¿Anovar el llugar d'orixe calcando nel mapa?
     confirm: 
@@ -1461,16 +1485,18 @@ ast:
       summary_no_ip: "%{name} creáu el %{date}"
       title: Usuarios
     login: 
+      account is suspended: Sentímoslo, la to cuenta ta torgada a causa d'actividaes sospechoses.<br />Ponte en contautu col <a href="%{webmaster}">webmaster</a> si quies discutilo.
       account not active: Sentímoslo, la to cuenta inda nun ta activada.<br />Usa l'enllaz del corréu de confirmación de la cuenta p'activala o <a href="%{reconfirm}">pidi otru corréu de confirmación</a>.
-      account suspended: Sentímoslo, la to cuenta ta torgada a causa d'actividaes sospechoses.<br />Ponte en contautu col %{webmaster} si quies discutilo.
       auth failure: Sentímoslo, nun se pudo coneutar al sistema con esos datos.
       create account minute: Crea una cuenta. Lleva namái un minutu.
       email or username: "Direición de corréu o nome d'usuariu:"
       heading: Entrar
       login_button: Entrar
-      lost password link: ¿Perdisti la contraseña?
+      lost password link: ¿Perdisti la conseña?
       new to osm: ¿Yes nuevu con OpenStreetMap?
+      no account: ¿Nun tienes una cuenta?
       notice: <a href="http://www.osmfoundation.org/wiki/License/We_Are_Changing_The_License">Saber más tocante al próximu cambiu de llicencia d'OpenStreetMap</a> (<a href="http://wiki.openstreetmap.org/wiki/ODbL/We_Are_Changing_The_License">traducciones</a>) (<a href="http://wiki.openstreetmap.org/wiki/Talk:ODbL/Upcoming">alderique</a>)
+      notice_terms: OpenStreetMap va movese a una llicencia nueva dende'l 1 d'abril de 2012. Ye igual d'abierta que l'actual, pero les partes llegales s'acomoden meyor a la nuesa base de datos del mapa. Gustaría-nos caltener les tos collaboraciones n'OpenStreetMap, pero namái podemos facelo si aceutes que les distribuyamos baxo la nueva llicencia. D'otra miente, tendremos que desaniciales de la base de datos.<br /><br />Por favor, entra na to cuenta y toma dellos segundos pa revisar y aceutar los nuevos términos. ¡Gracies!
       openid: "%{logo} OpenID:"
       openid invalid: Sentímoslo, la to OpenID paez que ta mal formada
       openid missing provider: Sentímoslo, nun pudimos ponenos en contautu col to sirvidor d'OpenID
@@ -1494,38 +1520,37 @@ ast:
         yahoo: 
           alt: Coneutar con una OpenID de Yahoo
           title: Coneutar con Yahoo
-      password: "Contraseña:"
+      password: "Conseña:"
       register now: Rexistrate agora
       remember: "Recordame:"
       title: Entrar
       to make changes: Pa camudar los datos d'OpenStreetMap, has de tener una cuenta.
-      webmaster: webmaster
       with openid: "D'otra miente, usa la to OpenID pa coneutar:"
-      with username: "¿Yá tienes cuenta en OpenStreetMap? Por favor, coneuta col to nome d'usuariu y contraseña:"
+      with username: "¿Yá tienes cuenta n'OpenStreetMap? Por favor, entra col to nome d'usuariu y conseña:"
     logout: 
       heading: Colar d'OpenStreetMap
       logout_button: Colar
       title: Colar
     lost_password: 
-      email address: "Direición de corréu:"
-      heading: ¿Escaecisti la contraseña?
-      help_text: Escribi les señes de corréu qu'usasti pa date d'alta, t'unviaremos un enllaz que pues usar pa reaniciar la contraseña.
-      new password button: Reaniciar contraseña
+      email address: "Direición de corréu electrónicu:"
+      heading: ¿Escaecisti la conseña?
+      help_text: Escribi les señes de corréu qu'usasti pa date d'alta, t'unviaremos un enllaz que pues usar pa reaniciar la conseña.
+      new password button: Reaniciar conseña
       notice email cannot find: Nun s'alcontró esa direición de corréu.
       notice email on way: Sentimos que la perdieres :-( pero hai un corréu en camín pa que puedas reaniciala ceo.
-      title: Contraseña perdida
+      title: Conseña perdida
     make_friend: 
       already_a_friend: Yá yes collaciu de %{name}.
       failed: Lo sentimos, hebo un fallu al amestar a %{name} como collaciu.
       success: "%{name} agora ye amigu tuyu."
     new: 
       confirm email address: "Confirmar direición de corréu:"
-      confirm password: "Confirma la contraseña:"
+      confirm password: "Confirma la conseña:"
       contact_webmaster: Ponte en contautu col <a href="mailto:webmaster@openstreetmap.org">webmaster</a> p'arreglar la creación d'una cuenta - procuraremos xestionar la solicitú lo más aína que podamos.
       continue: Siguir
       display name: "Nome a amosar:"
       display name description: El nome d'usuariu que s'amuesa en público. Pue camudalo más sero nes preferencies.
-      email address: "Direición de corréu:"
+      email address: "Direición de corréu electrónicu:"
       fill_form: Rellena'l formulariu y t'unviaremos un mensaxe de corréu rápidamente p'activar la to cuenta.
       flash create success message: Gracies por rexistrate. Venimos d'unvia un corréu de confirmación a %{email} y darréu que confirmes la to cuenta tarás preparáu pa mapear. <br /><br />Si uses un sistema escontra'l corréu puxarra qu'unvia solicitúes de confirmación, asegúrate d'amestar webmaster@openstreetmap.org na llista blanca de remitentes seguros, porque nós nun podemos responder solicitúes de confirmación.
       heading: Crear una cuenta d'usuariu
@@ -1533,9 +1558,9 @@ ast:
       no_auto_account_create: Por desgracia anguaño nun podemos crear una cuenta por ti automáticamente.
       not displayed publicly: Nun s'amuesa en público (ver la <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" title="política de protección de datos na wiki, qu'incluye una seición sobro direiciones de corréu">política de protección de datos</a>)
       openid: "%{logo} OpenID:"
-      openid association: "<p>La to OpenID nun ta asociada con una cuenta d'OpenStreetMap entá.</p>\n<ul>\n  <li>Si yes nuevu n'OpenStreetMap, por favor crea una cuenta nueva usando'l formulariu darréu.</li>\n  <li>\n    Si yá tienes una cuenta, puedes entrar nella usando'l to nome\n    d'usuariu y contraseña, y entós asociar la cuenta cola OpenID\n    na configuración de les preferencies d'usuariu.\n  </li>\n</ul>"
-      openid no password: Con OpenID nun fai falta contraseña, pero delles ferramientes estra o sirvidores entá pueden necesitala.
-      password: "Contraseña:"
+      openid association: "<p>La to OpenID nun ta asociada con una cuenta d'OpenStreetMap entá.</p>\n<ul>\n  <li>Si yes nuevu n'OpenStreetMap, por favor crea una cuenta nueva col formulariu darréu.</li>\n  <li>\n    Si yá tienes una cuenta, pues entrar nella col to nome\n    d'usuariu y conseña, y entós asociar la cuenta cola OpenID\n    nes preferencies d'usuariu.\n  </li>\n</ul>"
+      openid no password: Con OpenID nun fai falta una conseña, pero delles ferramientes estra o sirvidores entá puen necesitala.
+      password: "Conseña:"
       terms accepted: ¡Gracies por aceutar les condiciones de collaboración!
       terms declined: Sentimos que decidieres nun aceutar les Condiciones de Collaboración. Pa más información llei <a href="%{url}">esta páxina wiki</a>.
       title: Crear una cuenta
@@ -1552,13 +1577,13 @@ ast:
       not_a_friend: "%{name} nun ye un de los tos amigos."
       success: "%{name} se desanició de los tos amigos."
     reset_password: 
-      confirm password: "Confirma la contraseña:"
-      flash changed: Se camudó la to contraseña
+      confirm password: "Confirma la conseña:"
+      flash changed: Se camudó la to conseña
       flash token bad: Nun s'alcontró esi token, ¿tendríes de comprobar la URL, seique?
-      heading: Reaniciar la contraseña de %{user}
-      password: "Contraseña:"
-      reset: Reaniciar contraseña
-      title: Reaniciar contraseña
+      heading: Reaniciar la conseña de %{user}
+      password: "Conseña:"
+      reset: Reaniciar conseña
+      title: Reaniciar conseña
     set_home: 
       flash success: Llocalización d'aniciu guardada correutamente
     suspended: 
@@ -1588,16 +1613,23 @@ ast:
       block_history: ver los bloqueos recibíos
       blocks by me: bloqueos puestos
       blocks on me: bloqueos recibíos
+      comments: comentarios
       confirm: Confirmar
       confirm_user: confirmar esti usuariu
       create_block: bloquiar esti usuariu
       created from: "Creáu dende:"
+      ct accepted: Aceutada hai %{ago}
+      ct declined: Refugada
+      ct status: "Términos de collaboración:"
+      ct undecided: Indecisu
       deactivate_user: desactivar esti usuariu
       delete_user: desaniciar esti usuariu
       description: Descripción
       diary: diariu
       edits: ediciones
-      email address: "Direición de corréu:"
+      email address: "Direición de corréu electrónicu:"
+      friends_changesets: Esplorar tolos conxuntos de cambios de los collacios
+      friends_diaries: Ver toles entraes de diariu de los collacios
       hide_user: anubrir esti usuariu
       if set location: Si defines el to allugamientu, equí apaecerá un guapu mapa. Pues conseñar un llugar d'orixe na to páxina de %{settings_link}.
       km away: a %{count}km de distancia
@@ -1605,11 +1637,14 @@ ast:
       m away: a %{count}m de distancia
       mapper since: "Mapeador dende:"
       moderator_history: ver los bloqueos puestos
+      my comments: los mios comentarios
       my diary: el mio diariu
       my edits: les mios ediciones
       my settings: les mios preferencies
       my traces: les mios traces
       nearby users: Otros usuarios próximos
+      nearby_changesets: Ver tolos conxuntos de cambios d'usuarios cercanos
+      nearby_diaries: Ver toles entraes de diariu d'usuarios cercanos
       new diary entry: nueva entrada del diariu
       no friends: Entá nun amestasti dengún amigu.
       no nearby users: Entá nun hai otros usuarios que tean mapeando cerca de ti.
index 549734145cecc585f248c0bdcc0c0e7f8074e0d6..5ddd4ccbdc5b93be2ba64c6e4e109316192591ab 100644 (file)
@@ -79,7 +79,7 @@ be-TARASK:
       cookies_needed: Здаецца, што ў Ва забароненыя закладкі (cookies). Калі ласка, дазвольце іх ў Вашым браўзэры перад тым, як працягваць.
     setup_user_auth: 
       blocked: Ваш доступ да API заблякаваны. Калі ласка, увайдзіце праз ўэб-інтэрфэйс, каб даведацца болей.
-      need_to_see_terms: Ð\92аÑ\88 Ð´Ð¾Ñ\81Ñ\82Ñ\83п Ð´Ð° API Ñ\87аÑ\81ова Ð¿Ñ\80Ñ\8bпÑ\8bненÑ\8b. Ð\9aалÑ\96 Ð»Ð°Ñ\81ка, Ñ\83вайдзÑ\96Ñ\86е Ñ\9e Ñ\9eÑ\8dб-Ñ\96нÑ\82Ñ\8dÑ\80Ñ\84Ñ\8dйÑ\81, ÐºÐ°Ð± ÐºÐ°Ð± Ð¿Ð°Ð³Ð»Ñ\8fдзеÑ\86Ñ\8c Ñ\83мовÑ\8b Ñ\9eдзелÑ\83. Вам не абавязкова пагаджацца зь імі, але неабходна зь імі азнаёміцца.
+      need_to_see_terms: Ð\92аÑ\88 Ð´Ð¾Ñ\81Ñ\82Ñ\83п Ð´Ð° API Ñ\87аÑ\81ова Ð¿Ñ\80Ñ\8bпÑ\8bненÑ\8b. Ð\9aалÑ\96 Ð»Ð°Ñ\81ка, Ñ\83вайдзÑ\96Ñ\86е Ñ\9e Ñ\9eÑ\8dб-Ñ\96нÑ\82Ñ\8dÑ\80Ñ\84Ñ\8dйÑ\81, ÐºÐ°Ð± ÐºÐ°Ð± Ð¿Ð°Ð³Ð»Ñ\8fдзеÑ\86Ñ\8c Ñ\83мовÑ\8b Ñ\81Ñ\83пÑ\80аÑ\86оÑ\9eнÑ\96Ñ\86Ñ\82ва. Вам не абавязкова пагаджацца зь імі, але неабходна зь імі азнаёміцца.
   browse: 
     changeset: 
       changeset: "Набор зьменаў: %{id}"
@@ -283,14 +283,20 @@ be-TARASK:
     list: 
       description: Апошнія зьмены
       description_bbox: Набор зьменаў у %{bbox}
+      description_friend: Наборы зьменаў Вашых сяброў
+      description_nearby: Наборы зьменаў для суседніх удзельнікаў
       description_user: Наборы зьменаў %{user}
       description_user_bbox: Набор зьменаў %{user} у %{bbox}
       heading: Наборы зьменаў
       heading_bbox: Наборы зьменаў
+      heading_friend: Наборы зьменаў
+      heading_nearby: Наборы зьменаў
       heading_user: Наборы зьменаў
       heading_user_bbox: Наборы зьменаў
       title: Наборы зьменаў
       title_bbox: Набор зьменаў у %{bbox}
+      title_friend: Наборы зьменаў Вашых сяброў
+      title_nearby: Наборы зьменаў для суседніх удзельнікаў
       title_user: Набор зьменаў %{user}
       title_user_bbox: Набор зьменаў %{user} у %{bbox}
     timeout: 
@@ -341,6 +347,8 @@ be-TARASK:
       older_entries: Старэйшыя запісы
       recent_entries: "Апошнія запісы ў дзёньніку:"
       title: Дзёньнікі карыстальнікаў
+      title_friends: Дзёньнікі сяброў
+      title_nearby: Дзёньнікі суседніх удзельнікаў
       user_title: Дзёньнік %{user}
     location: 
       edit: Рэдагаваць
@@ -388,11 +396,9 @@ be-TARASK:
       licence: Ліцэнзія
       longitude: "Даўгата:"
       manually_select: Выбраць іншы абшар
-      mapnik_image: Выява Mapnik
       max: максымум
       options: Устаноўкі
       osm_xml_data: Зьвесткі OpenStreetMap у фармаце XML
-      osmarender_image: Выява Osmarender
       output: Вывад
       paste_html: HTML-код для ўстаўкі ў вэб-сайт
       scale: Маштаб
@@ -879,6 +885,18 @@ be-TARASK:
           water_point: Пункт водазабесьпячэньня
           waterfall: Вадаспад
           weir: Плаціна
+  javascripts: 
+    map: 
+      base: 
+        cycle_map: Роварная мапа
+        transport_map: Транспартная мапа
+    site: 
+      edit_disabled_tooltip: Павялічыць маштаб мапы для рэдагаваньня
+      edit_tooltip: Рэдагаваць мапу
+      edit_zoom_alert: Неабходна павялічыць маштаб мапы для яе рэдагаваньня
+      history_disabled_tooltip: Павялічыць маштаб для прагляду рэдагаваньняў у гэтым абшары
+      history_tooltip: Прагляд рэдагаваньняў у гэтым абшары
+      history_zoom_alert: Неабходна павялічыць маштаб мапы, каб праглядзець рэдагаваньні ў гэтым абшары
   layouts: 
     community_blogs: Блёгі супольнасьці
     community_blogs_title: Блёгі чальцоў супольнасьці OpenStreetMap
@@ -949,13 +967,13 @@ be-TARASK:
     inbox: 
       date: Дата
       from: Ад
+      messages: Вы маеце %{new_messages} і %{old_messages}
       my_inbox: Мае ўваходзячыя
       no_messages_yet: Вы яшчэ ня маеце паведамленьняў. Чаму б не зьвязацца з %{people_mapping_nearby_link}?
       outbox: зыходзячыя
       people_mapping_nearby: людзьмі, якія жывуць каля Вас
       subject: Тэма
       title: Уваходзячыя
-      you_have: Вы маеце %{new_count} новых паведамленьняў і %{old_count} старых паведамленьняў
     mark: 
       as_read: Паведамленьне пазначанае як прачытанае
       as_unread: Паведамленьне пазначанае як непрачытанае
@@ -991,7 +1009,6 @@ be-TARASK:
       subject: Тэма
       title: Зыходзячыя
       to: Да
-      you_have_sent_messages: Вы маеце %{count} адпраўленых паведамленьняў
     read: 
       back_to_inbox: Вярнуцца да ўваходных
       back_to_outbox: Вярнуцца да выходных
@@ -1105,15 +1122,42 @@ be-TARASK:
     revoke: 
       flash: Вы адклікалі ключ для дастасаваньня %{application}
   oauth_clients: 
+    create: 
+      flash: Інфармацыя пасьпяхова зарэгістраваная
+    destroy: 
+      flash: Зьнішчаная рэгістрацыя кліенцкага дастасаваньня
     edit: 
       submit: Рэдагаваць
       title: Рэдагаваць Вашае дастасаваньне
+    form: 
+      allow_read_gpx: чытаць іх прыватныя GPS-трэкі.
+      allow_read_prefs: чытаць іх налады ўдзельніка.
+      allow_write_api: зьмяняць мапу.
+      allow_write_diary: ствараць запісы ў дзёньніку, камэнтары і знаёміцца.
+      allow_write_gpx: загружаць GPS-трэкі.
+      allow_write_prefs: зьмяняць іх налады ўдзельніка.
+      callback_url: URL-адрас зваротнага выкліку
+      name: Назва
+      requests: "Запытаць наступныя дазволы ад удзельніка:"
+      required: Абавязковае
+      support_url: URL-адрас падтрымкі
+      url: Галоўны URL-адрас дастасаваньня
     index: 
+      application: Назва дастасаваньня
+      issued_at: Выданы ў
+      list_tokens: "Наступныя ключы былі створаныя для дастасаваньняў на Вашае імя:"
+      my_apps: Мае кліенцкія дастасаваньні
       my_tokens: Мае аўтарызаваныя дастасаваньні
+      no_apps: Вы маеце дастасаваньне, якое жадаеце зарэгістраваць для ўзаемадзеяньня з намі праз стандарт %{oauth}? Вам неабходна зарэгістраваць Вашае ўэб-дастасаваньне перад тым, як яно зможа зрабіць OAuth-запыты на гэты сэрвэр.
+      register_new: Зарэгістраваць Вашае дастасаваньне
+      registered_apps: "Вы маеце зарэгістраванымі наступныя кліенцкія дастасаваньні:"
+      revoke: Адклікаць!
       title: Мае падрабязнасьці OAuth
     new: 
       submit: Рэгістрацыя
       title: Зарэгістраваць новае дастасаваньне
+    not_found: 
+      sorry: Прабачце, немагчыма знайсьці гэты %{type}.
     show: 
       access_url: "URL-адрас ключа доступу:"
       allow_read_gpx: чытаць іх прыватныя GPS-трэкі.
@@ -1130,6 +1174,8 @@ be-TARASK:
       support_notice: Мы падтрымліваем HMAC-SHA1 (рэкамэндуецца) і звычайны тэкст у SSL-рэжыме.
       title: Падрабязнасьці OAuth для %{app_name}
       url: "URL-адрас ключа запыту:"
+    update: 
+      flash: Кліенцкая інфармацыя была абноўленая пасьпяхова
   site: 
     edit: 
       anon_edits_link_text: Даведацца ў чым справа.
@@ -1357,6 +1403,10 @@ be-TARASK:
       new email address: "Новы адрас электроннай пошты:"
       new image: Дадаць выяву
       no home location: Вы не падалі Вашае месцазнаходжаньне.
+      openid: 
+        link: http://wiki.openstreetmap.org/wiki/BE:OpenID
+        link text: што гэта?
+        openid: "OpenID:"
       preferred editor: "Пажаданы рэдактар:"
       preferred languages: "Абраныя мовы:"
       profile description: "Апісаньне профілю:"
@@ -1409,8 +1459,8 @@ be-TARASK:
       summary_no_ip: "%{name} створаны %{date}"
       title: Удзельнікі
     login: 
+      account is suspended: Прабачце, але Ваш рахунак быў заблякаваны з-за падазронай актыўнасьці.<br />Калі ласка, зьвяжыцеся з <a href="%{webmaster}">ўэбмайстрам</a> калі Вы жадаеце гэта аспрэчыць.
       account not active: Прабачце, Ваш рахунак пакуль што не актывізаваны.<br />Калі ласка, каб яго актывізаваць, карыстайцеся спасылкай у дасланым Ваш электронным лісьце, ці <a href="%{reconfirm}">падайце запыт на новы электронны ліст з пацьверджаньнем</a>.
-      account suspended: Прабачце, але Ваш рахунак быў заблякаваны з-за падазронай актыўнасьці.<br />Калі ласка, зьвяжыцеся з %{webmaster} калі Вы жадаеце гэта аспрэчыць.
       auth failure: Прабачце, немагчыма ўвайсьці з такім адрасам і паролем.
       create account minute: Стварыць рахунак. Гэта зойме ня болей хвіліны.
       email or username: "Адрас электроннай пошты ці імя карыстальніка:"
@@ -1419,12 +1469,37 @@ be-TARASK:
       lost password link: Забылі пароль?
       new to osm: Упершыню на OpenStreetMap?
       notice: <a href="http://www.osmfoundation.org/wiki/License/We_Are_Changing_The_License">Даведайцеся болей пра плянуемыя зьмены ліцэнзіі OpenStreetMap</a> (<a href="http://wiki.openstreetmap.org/wiki/ODbL/We_Are_Changing_The_License">пераклады</a>) (<a href="http://wiki.openstreetmap.org/wiki/Talk:ODbL/Upcoming">абмеркаваньні</a>)
+      notice_terms: OpenStreetMap перайшоў на новую ліцэнзію з 1 красавіка 2012 году. Яна такая ж адкрытая як папярэдняя, але больш пасуе для нашай базы зьвестак мапы. Мы жадаем, каб Вы засталіся працаваць з OpenStreetMap, але гэта можа адбыцца толькі пасьля таго, калі Вы пагадзіцеся працаваць на ўмовах новай ліцэнзіі. У адваротным выпадку мы выдалім Ваш унёсак з базы зьвестак.<br /><br />Калі ласка, увайдзіце ў сыстэму, потым прачытайце і прыміце новыя ўмовы. Дзякуй!
+      openid: "%{logo} OpenID:"
+      openid invalid: Прабачце, здаецца Ваш OpenID уведзены няслушна
+      openid missing provider: Прабачце, немагчыма зьвязацца з Вашым правайдэрам OpenID
+      openid_logo_alt: Увайсьці ў сыстэму з дапамогай OpenID
+      openid_providers: 
+        aol: 
+          alt: Увайсьці ў сыстэму з дапамогай AOL OpenID
+          title: Увайсьці ў сыстэму з дапамогай AOL
+        google: 
+          alt: Увайсьці ў сыстэму з дапамогай Google OpenID
+          title: Увайсьці ў сыстэму з дапамогай Google
+        myopenid: 
+          alt: Увайсьці ў сыстэму з дапамогай myOpenID OpenID
+          title: Увайсьці ў сыстэму з дапамогай myOpenID
+        openid: 
+          alt: Увайсьці ў сыстэму з дапамогай URL-адрасу OpenID
+          title: Увайсьці ў сыстэму з дапамогай OpenID
+        wordpress: 
+          alt: Увайсьці ў сыстэму з дапамогай Wordpress OpenID
+          title: Увайсьці ў сыстэму з дапамогай Wordpress
+        yahoo: 
+          alt: Увайсьці ў сыстэму з дапамогай Yahoo OpenID
+          title: Увайсьці ў сыстэму з дапамогай Yahoo
       password: "Пароль:"
       register now: Зарэгістравацца зараз
       remember: "Запамятаць мяне:"
       title: Увайсьці
       to make changes: Каб рабіць зьмены ў зьвестках OpenStreetMap, Вам неабходна мець рахунак.
-      webmaster: ўэб-майстар
+      with openid: "Для ўваходу можаце выкарыстаць Ваш OpenID:"
+      with username: "Ужо маеце рахунак OpenStreetMap? Калі ласка, увайдзіце ў сыстэму з Вашым іменем удзельніка і паролем:"
     logout: 
       heading: Выйсьці з OpenStreetMap
       logout_button: Выйсьці
@@ -1455,9 +1530,14 @@ be-TARASK:
       license_agreement: Калі Вы пацьвердзіце Ваш рахунак, Вам трэба будзе пагадзіцца з <a href="http://www.osmfoundation.org/wiki/License/Contributor_Terms">умовамі супрацоўніцтва</a>.
       no_auto_account_create: На жаль, мы зараз ня можам стварыць для Вас рахунак аўтаматычна.
       not displayed publicly: Не паказваецца публічна (глядзіце <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" title="правілы адносна прыватнасьці вікі, у тым ліку сэкцыя пра адрасы электроннай пошты">правілы адносна прыватнасьці</a>)
+      openid: "%{logo} OpenID:"
+      openid association: "<p>Ваш OpenID пакуль ня зьвязаны з рахункам OpenStreetMap.</p>\n<ul>\n  <li>Калі Вы ўпершыню на OpenStreetMap, калі ласка, стварыце новы рахунак з дапамогай формы пададзенай ніжэй.</li>\n  <li>\n    Калі Вы ўжо маеце рахунак, Вы можаце ўвайсьці ў сыстэму\n    з Вашым іменем удзельніка і паролем, а потым зьвязаць яго з Вашым рахункам\n    OpenID на старонцы наладаў Вашага профілю.\n  </li>\n</ul>"
+      openid no password: Падчас выкарыстаньня OpenID пароль не патрэбны, але некаторыя дадатковыя інструмэнты ці сэрвэр могуць яго спытаць.
       password: "Пароль:"
       terms accepted: Дзякуй за тое, што прынялі новыя ўмовы супрацоўніцтва!
+      terms declined: Нам шкада, што Вы вырашылі не прыняць новыя ўмовы супрацоўніцтва. Для атрыманьня дадатковай інфармацыі, калі ласка, глядзіце <a href="%{url}">гэтую вікі-старонку</a>.
       title: Стварыць рахунак
+      use openid: Дадаткова выкарыстоўвайце %{logo} OpenID для ўваходу ў сыстэму
     no_such_user: 
       body: Прабачце, няма ўдзельніка з іменем %{user}. Калі ласка, праверце дакладнасьць напісаньня, ці, магчыма, спасылка па якой Вы перайшлі, няслушная.
       heading: Удзельнік %{user} не існуе
@@ -1489,6 +1569,7 @@ be-TARASK:
       consider_pd: У дадатак да прыведзенага пагадненьня, я пацьвярджаю, што мой унёсак знаходзіцца ў грамадзкім набытку
       consider_pd_why: што гэта?
       decline: Адхіліць
+      guidance: "Інфармацыя, якая дапаможа зразумець гэтыя ўмовы: <a href=\"%{summary}\">кароткае апісаньне</a> і некалькі <a href=\"%{translations}\">неафіцыйных перакладаў</a>"
       heading: Умовы супрацоўніцтва
       legale_names: 
         france: Францыя
@@ -1497,6 +1578,7 @@ be-TARASK:
       legale_select: "Калі ласка, выберыце сваю краіну пражываньня:"
       read and accept: Калі ласка, пачытайце пагадненьне ніжэй і націсьніце кнопку «Згодны», каб пацьвердзіць што Вы пагаджаецеся з умовамі гэтага пагадненьня адносна Вашага існуючага і будучых ўнёскаў.
       title: Умовы супрацоўніцтва
+      you need to accept or decline: Калі ласка, прачытайце, а потым згадзіцеся ці адхіліце новыя ўмовы супрацоўніцтва для працягу.
     view: 
       activate_user: актывізаваць гэтага удзельніка
       add as friend: дадаць у сябры
@@ -1508,12 +1590,18 @@ be-TARASK:
       confirm_user: пацьвердзіць гэтага карыстальніка
       create_block: заблякаваць гэтага ўдзельніка
       created from: "Створана з:"
+      ct accepted: Прынятыя %{ago} таму
+      ct declined: Адхіленыя
+      ct status: "Умовы супрацоўніцтва:"
+      ct undecided: Нявырашана
       deactivate_user: дэактывізаваць гэтага удзельніка
       delete_user: выдаліць гэтага ўдзельніка
       description: Апісаньне
       diary: дзёньнік
       edits: рэдагаваньні
       email address: "Адрас электроннай пошты:"
+      friends_changesets: Праглядзець усе наборы зьменаў сяброў
+      friends_diaries: Праглядзець усе запісы дзёньнікаў сяброў
       hide_user: схаваць гэтага ўдзельніка
       if set location: Калі Вы пазначыце Вашае месцазнаходжаньне, тут зьявіцца прыгожая мапа і дадатковыя інструмэнты. Вы можаце пазначыць Вашае месцазнаходжаньне на Вашай старонцы %{settings_link}.
       km away: "%{count}км ад Вас"
@@ -1526,6 +1614,8 @@ be-TARASK:
       my settings: мае налады
       my traces: мае трэкі
       nearby users: Іншыя бліжэйшыя карыстальнікі
+      nearby_changesets: Праглядзець усе наборы зьменаў суседніх удзельнікаў
+      nearby_diaries: Праглядзець усе запісы дзёньнікаў суседніх удзельнікаў
       new diary entry: новы запіс у дзёньніку
       no friends: Пакуль што Вы не дадалі нікога ў сябры.
       no nearby users: Няма іншых карыстальнікаў, якія прызнаюць, што займаюцца складаньнем мапы каля Вас.
@@ -1541,13 +1631,99 @@ be-TARASK:
           administrator: Скасаваць правы адміністратара
           moderator: Скасаваць доступ мадэратара
       send message: даслаць паведамленьне
-      settings_link_text: устаноўкі
+      settings_link_text: налады
       spam score: "Адзнака спаму:"
       status: "Статус:"
       traces: трэкі
       unhide_user: паказаць гэтага ўдзельніка
       user location: Меcцазнаходжаньне ўдзельніка
       your friends: Вашыя сябры
+  user_block: 
+    blocks_by: 
+      empty: "%{name} яшчэ не стварыў блякаваньняў."
+      heading: Сьпіс блякаваньняў, якія стварыў %{name}
+      title: Блякаваньні створаныя %{name}
+    blocks_on: 
+      empty: "%{name} ня быў яшчэ заблякаваны."
+      heading: Сьпіс блякаваньняў %{name}
+      title: Блякаваньні для %{name}
+    create: 
+      flash: Заблякаваць удзельніка %{name}.
+      try_contacting: Калі ласка, перад блякаваньнем удзельніка зьвяжыцеся зь ім і дайце яму дастаткова часу для адказу.
+      try_waiting: Калі ласка, дайце ўдзельніку дастаткова часу для адказу, перад яго блякаваньнем.
+    edit: 
+      back: Паказаць усе блякаваньні
+      heading: Рэдагаваньне блякаваньня для %{name}
+      needs_view: Ці трэба ўдзельніку ўвайсьці ў сыстэму, перад тым як блякаваньне будзе зьнятае?
+      period: Як доўга, пачынаючы з гэтага моманту, карыстальнік будзе заблякаваны ад API.
+      reason: Падайце прычыну, па якой %{name} блякуецца. Калі ласка, будзьце цярплівы і дзейнічайце разумна, прадстаўляючы ўдзельніку падрабязную інфармацыю пра прычыны блякаваньня. Помніце, што ня ўсе ўдзельнікі разумеюць жаргон супольнасьці, таму выкарыстоўвайце зразумелыя паняцьці.
+      show: Паказаць гэтае блякаваньне
+      submit: Абнавіць блякаваньне
+      title: Рэдагаваньне блякаваньня для %{name}
+    filter: 
+      block_expired: Блякаваньне ўжо скончылася і ня можа рэдагавацца.
+      block_period: Час блякаваньня павінен быць выбраны са значэньняў з разгортваемага сьпісу.
+      not_a_moderator: Вам трэба быць мадэратарам каб выканаць гэтае дзеяньне.
+    helper: 
+      time_future: Канчаецца ў %{time}.
+      time_past: Скончылася %{time} таму.
+      until_login: Актыўнае да моманту ўваходу ўдзельніка ў сыстэму.
+    index: 
+      empty: Блякаваньняў яшчэ не было.
+      heading: Сьпіс блякаваньняў удзельніка
+      title: Блякаваньні ўдзельніка
+    model: 
+      non_moderator_revoke: Трэба быць мадэратарам, каб адклікаць блякяваньне.
+      non_moderator_update: Трэба быць мадэратарам, каб стварыць ці адбавіць блякаваньне.
+    new: 
+      back: Паказаць усе блякаваньні
+      heading: Стварэньне блякаваньня для %{name}
+      needs_view: Удзельніку трэба ўвайсьці ў сыстэму, перад тым як блякаваньне будзе зьнятае
+      period: Як доўга, пачынаючы з гэтага моманту, карыстальнік будзе заблякаваны ад API.
+      reason: Падайце прычыну па якой %{name} блякуецца. Калі ласка, будзьце цярплівы і дзейнічайце разумна, прадстаўляючы ўдзельніку падрабязную інфармацыю пра прычыны блякаваньня, помніце, што паведамленьне будзе бачнае для ўсіх. Помніце, што ня ўсе ўдзельнікі разумеюць жаргон супольнасьці, таму выкарыстоўвайце зразумелыя паняцьці.
+      submit: Стварыць блякаваньне
+      title: Стварэньне блякаваньня для %{name}
+      tried_contacting: Я зьвярнуўся да удзельніка і папрасіў яго спыніцца.
+      tried_waiting: Я даў дастаткова часу ўдзельніку, каб адказаць на тыя паведамленьні.
+    not_found: 
+      back: Вярнуцца да сьпісу
+      sorry: Прабачце, немагчыма знойсьці блякаваньне ўдзельніка з ідэнтыфікатарам %{id}.
+    partial: 
+      confirm: Вы ўпэўнены?
+      creator_name: Стваральнік
+      display_name: Заблякаваны ўдзельнік
+      edit: Рэдагаваць
+      not_revoked: (не адкліканае)
+      reason: Прычына блякаваньня
+      revoke: Адклікаць!
+      revoker_name: Адкліканае
+      show: Паказаць
+      status: Статус
+    revoke: 
+      confirm: Вы ўпэўнены, што жадаеце адклікаць гэтае блякаваньне?
+      flash: Гэтае блякаваньне было адкліканае.
+      heading: Зьняць блякаваньне з %{block_on}, створанае %{block_by}
+      past: Гэтае блякаваньне скончылася %{time} таму і ня можа быць цяпер адкліканае.
+      revoke: Адклікаць!
+      time_future: Гэтае блякаваньне скончыцца ў %{time}.
+      title: Зьняць блякаваньне з %{block_on}
+    show: 
+      back: Паказаць усе блякаваньні
+      confirm: Вы ўпэўнены?
+      edit: Рэдагаваць
+      heading: "%{block_on} заблякаваны %{block_by}"
+      needs_view: Удзельніку трэба ўвайсьці ў сыстэму, перад тым як гэтае блякаваньне будзе зьнятае.
+      reason: "Прычына блякаваньня:"
+      revoke: Адклікаць!
+      revoker: "Адклікаўшы:"
+      show: Паказаць
+      status: Статус
+      time_future: Канчаецца ў %{time}
+      time_past: Скончылася %{time} таму
+      title: "%{block_on} заблякаваны %{block_by}"
+    update: 
+      only_creator_can_edit: Толькі мадэратар, які стварыў блякаваньне, можа яго рэдагаваць.
+      success: Блякаваньне абноўленае.
   user_role: 
     filter: 
       already_has_role: Карыстальнік ужо мае ролю %{role}.
index ced4b2b1c5d9389b42276a255c6eeb1ea3ebdbd7..4c6d6dcfb58344bc5e4bc163e7df65846735ed4e 100644 (file)
@@ -282,14 +282,20 @@ br:
     list: 
       description: Kemmoù graet nevez zo
       description_bbox: Strolladoù kemmoù e-barzh %{bbox}
+      description_friend: Hollad ar c'hemmoù degaset gant ho mignoned
+      description_nearby: Hollad kemmoù deuet gant an implijerien a-dost
       description_user: Strolladoù kemmoù gant %{user}
       description_user_bbox: Strolladoù kemmoù gant %{user} e-barzh %{bbox}
-      heading: Strolladoù kemmoù
-      heading_bbox: strolladoù kemmoù
-      heading_user: Strolladoù kemmoù
-      heading_user_bbox: Strolladoù kemmoù
-      title: Strolladoù kemmoù
+      heading: Hollad kemmoù
+      heading_bbox: Hollad kemmoù
+      heading_friend: Hollad ar c'hemmoù
+      heading_nearby: Hollad kemmoù
+      heading_user: Hollad kemmoù
+      heading_user_bbox: Hollad kemmoù
+      title: Hollad kemmoù
       title_bbox: Strolladoù kemmoù e-barzh %{bbox}
+      title_friend: Hollad ar c'hemmoù degaset gant ho mignoned
+      title_nearby: Hollad kemmoù deuet gant an implijerien a-dost
       title_user: Strolladoù kemmoù gant %{user}
       title_user_bbox: Strolladoù kemmoù gant %{user} e-barzh %{bbox}
     timeout: 
@@ -339,6 +345,8 @@ br:
       older_entries: Enmonedoù koshañ
       recent_entries: "Enmonedoù nevez en deizlevr :"
       title: Deizlevrioù an implijerien
+      title_friends: Marilhoù ar vignoned
+      title_nearby: Marilhoù mignoned a-dost
       user_title: Deizlevr %{user}
     location: 
       edit: Kemmañ
@@ -386,11 +394,9 @@ br:
       licence: Aotre implijout
       longitude: "Hed. :"
       manually_select: Diuzañ un takad disheñvel gant an dorn
-      mapnik_image: Skeudenn Mapnik
       max: d'ar muiañ
       options: Dibarzhioù
       osm_xml_data: Roadennoù XML OpenStreetMap
-      osmarender_image: Skeudenn Osmarender
       output: Er-maez
       paste_html: Pegañ HTML evit bezañ enkorfet en ul lec'hienn web
       scale: Skeuliad
@@ -968,13 +974,19 @@ br:
     inbox: 
       date: Deiziad
       from: A-berzh
+      messages: "%{new_messages} ha %{old_messages} zo evidoc'h"
       my_inbox: Ma boest resev
+      new_messages: 
+        one: "%{count} gemennadenn nevez"
+        other: "%{count} kemennadenn nevez"
       no_messages_yet: N'hoc'h eus kemennadenn ebet c'hoazh. Ha ma'z afec'h e darempred gant darn eus an %{people_mapping_nearby_link}?
+      old_messages: 
+        one: "%{count} gemennadenn gozh"
+        other: "%{count} kemennadenn gozh"
       outbox: boest kas
       people_mapping_nearby: tud o kartennañ en ardremez
       subjec