aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore5
-rw-r--r--.travis.yml41
-rw-r--r--.tx/config9
-rw-r--r--Makefile.PL2
-rw-r--r--README.md11
-rwxr-xr-xbin/ec2-rewrite-conf20
-rwxr-xr-xbin/fetch-comments4
-rw-r--r--bin/fetch-comments-24hs26
-rwxr-xr-xbin/gettext-extract12
-rwxr-xr-xbin/gettext-nget-patch18
-rwxr-xr-xbin/install-as-user112
-rwxr-xr-xbin/install_perl_modules8
-rwxr-xr-xbin/make_css17
-rwxr-xr-xbin/make_emptyhomes_welsh_po14
-rwxr-xr-xbin/make_po (renamed from bin/make_emptyhomes_po)18
-rwxr-xr-xbin/open311-populate-service-list16
-rwxr-xr-xbin/oxfordshire/open311_service_request.cgi535
-rwxr-xr-xbin/problem-creation-graph14
-rwxr-xr-xbin/problems-filed-graph6
-rwxr-xr-xbin/rotate-photos34
-rwxr-xr-xbin/send-comments26
-rw-r--r--bin/site-specific-install.sh53
-rw-r--r--carton.lock389
m---------commonlib0
-rw-r--r--conf/apache-vhost.conf.example34
-rw-r--r--conf/crontab.example32
-rw-r--r--conf/crontab.ugly32
-rw-r--r--conf/general.yml-example20
-rw-r--r--conf/httpd.conf-example40
-rw-r--r--conf/nginx.conf.example75
-rw-r--r--conf/packages.ubuntu-precise16
-rwxr-xr-xconf/sysvinit.example53
-rw-r--r--data/zurich/openlayers.zurich.cfg42
-rw-r--r--db/alert_types.sql18
-rw-r--r--db/generate_secret.sql8
-rw-r--r--db/migrate_from_osgb36_to_wgs84.pl10
-rw-r--r--db/schema.sql28
-rw-r--r--db/schema_0021-add_external_source_columns_to_problem.sql8
-rw-r--r--db/schema_0022-add_interest_count_to_problems.sql6
-rw-r--r--db/schema_0023-add_can_be_devolved_and_category_config.sql13
-rw-r--r--db/schema_0024-add_non_public_categories_and_problems.sql37
-rw-r--r--db/schema_0026-change_interest_count_default.sql9
-rw-r--r--db/schema_0027-add_sub_category_to_problem.sql6
-rw-r--r--locale/FixMyStreet.po807
-rw-r--r--locale/cy_GB.UTF-8/LC_MESSAGES/EmptyHomes.po1183
-rw-r--r--locale/de_CH.UTF-8/LC_MESSAGES/FixMyStreet.po (renamed from locale/de_DE.UTF-8/LC_MESSAGES/FixMyStreet.po)1296
-rw-r--r--locale/nb_NO.UTF-8/LC_MESSAGES/FixMyStreet.po1316
-rw-r--r--locale/nn_NO.UTF-8/LC_MESSAGES/FixMyStreet.po1189
-rw-r--r--notes/no-update-server2
-rw-r--r--perllib/CrossSell.pm3
-rw-r--r--perllib/FixMyStreet/App.pm3
-rw-r--r--perllib/FixMyStreet/App/Controller/Admin.pm77
-rw-r--r--perllib/FixMyStreet/App/Controller/Alert.pm2
-rw-r--r--perllib/FixMyStreet/App/Controller/Around.pm3
-rw-r--r--perllib/FixMyStreet/App/Controller/Contact.pm7
-rw-r--r--perllib/FixMyStreet/App/Controller/Council.pm1
-rw-r--r--perllib/FixMyStreet/App/Controller/Dashboard.pm2
-rwxr-xr-xperllib/FixMyStreet/App/Controller/JS.pm2
-rw-r--r--perllib/FixMyStreet/App/Controller/Location.pm44
-rw-r--r--perllib/FixMyStreet/App/Controller/Open311.pm2
-rw-r--r--perllib/FixMyStreet/App/Controller/Photo.pm3
-rwxr-xr-xperllib/FixMyStreet/App/Controller/Questionnaire.pm2
-rw-r--r--perllib/FixMyStreet/App/Controller/Report.pm24
-rw-r--r--perllib/FixMyStreet/App/Controller/Report/New.pm86
-rw-r--r--perllib/FixMyStreet/App/Controller/Report/Update.pm5
-rw-r--r--perllib/FixMyStreet/App/Controller/Reports.pm75
-rw-r--r--perllib/FixMyStreet/App/Controller/Root.pm7
-rwxr-xr-xperllib/FixMyStreet/App/Controller/Rss.pm13
-rw-r--r--perllib/FixMyStreet/App/View/Web.pm1
-rw-r--r--perllib/FixMyStreet/Cobrand/Bromley.pm6
-rw-r--r--perllib/FixMyStreet/Cobrand/Default.pm147
-rw-r--r--perllib/FixMyStreet/Cobrand/FiksGataMi.pm2
-rw-r--r--perllib/FixMyStreet/Cobrand/FixMyBarangay.pm54
-rw-r--r--perllib/FixMyStreet/Cobrand/LichfieldDC.pm12
-rw-r--r--perllib/FixMyStreet/Cobrand/Oxfordshire.pm55
-rw-r--r--perllib/FixMyStreet/Cobrand/SeeSomething.pm148
-rw-r--r--perllib/FixMyStreet/Cobrand/Stevenage.pm41
-rw-r--r--perllib/FixMyStreet/Cobrand/UK.pm23
-rw-r--r--perllib/FixMyStreet/Cobrand/UKCouncils.pm14
-rw-r--r--perllib/FixMyStreet/Cobrand/Zurich.pm16
-rw-r--r--perllib/FixMyStreet/DB/Result/Comment.pm12
-rw-r--r--perllib/FixMyStreet/DB/Result/Contact.pm14
-rw-r--r--perllib/FixMyStreet/DB/Result/Open311conf.pm7
-rw-r--r--perllib/FixMyStreet/DB/Result/Problem.pm26
-rw-r--r--perllib/FixMyStreet/DB/ResultSet/AlertType.pm27
-rw-r--r--perllib/FixMyStreet/DB/ResultSet/Nearby.pm1
-rw-r--r--perllib/FixMyStreet/DB/ResultSet/Problem.pm97
-rw-r--r--perllib/FixMyStreet/DB/ResultSet/Questionnaire.pm7
-rw-r--r--perllib/FixMyStreet/EmailSend.pm5
-rw-r--r--perllib/FixMyStreet/Geocode.pm24
-rw-r--r--perllib/FixMyStreet/Geocode/Bing.pm9
-rw-r--r--perllib/FixMyStreet/Geocode/Google.pm7
-rw-r--r--perllib/FixMyStreet/Geocode/OSM.pm13
-rw-r--r--perllib/FixMyStreet/Geocode/Zurich.pm107
-rw-r--r--perllib/FixMyStreet/Map.pm25
-rw-r--r--perllib/FixMyStreet/Map/OSM.pm25
-rw-r--r--perllib/FixMyStreet/Map/Zurich.pm177
-rw-r--r--perllib/FixMyStreet/SendReport.pm10
-rw-r--r--perllib/FixMyStreet/SendReport/Email.pm13
-rw-r--r--perllib/FixMyStreet/SendReport/EmptyHomes.pm2
-rw-r--r--perllib/FixMyStreet/SendReport/NI.pm2
-rw-r--r--perllib/FixMyStreet/SendReport/Open311.pm51
-rw-r--r--perllib/FixMyStreet/TestMech.pm107
-rw-r--r--perllib/Geo/Coordinates/CH1903.pm105
-rw-r--r--perllib/Open311.pm57
-rw-r--r--perllib/Open311/GetServiceRequestUpdates.pm19
-rw-r--r--perllib/Open311/PopulateServiceList.pm33
-rw-r--r--perllib/PoChange.pm26
-rw-r--r--perllib/Utils.pm86
-rw-r--r--phonegap/Android/.classpath2
-rw-r--r--phonegap/Android/AndroidManifest.xml17
-rw-r--r--phonegap/Android/gen/org/mysociety/FixMyStreet/R.java23
-rwxr-xr-xphonegap/Android/libs/cordova-1.8.0.jarbin163938 -> 0 bytes
-rw-r--r--phonegap/Android/libs/cordova-2.1.0.jarbin0 -> 191253 bytes
-rw-r--r--phonegap/Android/proguard-project.txt20
-rw-r--r--phonegap/Android/proguard.cfg40
-rw-r--r--phonegap/Android/project.properties7
-rw-r--r--phonegap/Android/res/drawable-hdpi/ic_action_search.pngbin0 -> 3120 bytes
-rw-r--r--phonegap/Android/res/drawable-hdpi/ic_launcher.pngbin4147 -> 3014 bytes
-rw-r--r--phonegap/Android/res/drawable-ldpi/ic_launcher.pngbin1723 -> 1504 bytes
-rw-r--r--phonegap/Android/res/drawable-mdpi/ic_action_search.pngbin0 -> 3030 bytes
-rw-r--r--phonegap/Android/res/drawable-mdpi/ic_launcher.pngbin2574 -> 1969 bytes
-rw-r--r--phonegap/Android/res/drawable-xhdpi/ic_action_search.pngbin0 -> 3199 bytes
-rw-r--r--phonegap/Android/res/drawable-xhdpi/ic_launcher.pngbin0 -> 4006 bytes
-rw-r--r--phonegap/Android/res/layout/activity_main.xml14
-rw-r--r--phonegap/Android/res/layout/main.xml12
-rw-r--r--phonegap/Android/res/menu/activity_main.xml6
-rw-r--r--phonegap/Android/res/values-v11/styles.xml5
-rw-r--r--phonegap/Android/res/values-v14/styles.xml5
-rw-r--r--phonegap/Android/res/values/strings.xml2
-rw-r--r--phonegap/Android/res/xml/config.xml (renamed from phonegap/Android/res/xml/plugins.xml)20
-rw-r--r--phonegap/Android/res/xml/cordova.xml5
-rw-r--r--phonegap/iPhone/Default-568h@2x.pngbin0 -> 18594 bytes
-rw-r--r--phonegap/iPhone/FixMyStreet.xcodeproj/project.pbxproj128
-rw-r--r--phonegap/iPhone/FixMyStreet.xcodeproj/xcuserdata/struan.xcuserdatad/xcschemes/FixMyStreet.xcscheme6
-rw-r--r--phonegap/iPhone/FixMyStreet/Classes/AppDelegate.h19
-rw-r--r--phonegap/iPhone/FixMyStreet/Classes/AppDelegate.m64
-rw-r--r--phonegap/iPhone/FixMyStreet/Classes/MainViewController.h6
-rw-r--r--phonegap/iPhone/FixMyStreet/Cordova.plist4
-rwxr-xr-xphonegap/iPhone/FixMyStreet/verify.sh12
-rw-r--r--phonegap/iphone_cordova.js5226
-rw-r--r--phonegap/www/about.html4
-rw-r--r--phonegap/www/account.html (renamed from phonegap/www/sign_in.html)16
-rw-r--r--phonegap/www/around.html6
-rwxr-xr-xphonegap/www/cordova-android-2.1.0.js (renamed from phonegap/android_cordova.js)974
-rw-r--r--phonegap/www/cordova-independent.js12
-rwxr-xr-x[-rw-r--r--]phonegap/www/cordova-ios-2.1.0.js (renamed from phonegap/www/cordova-1.8.0.js)577
-rw-r--r--phonegap/www/css/mobile.css6
-rw-r--r--phonegap/www/email_sent.html2
-rw-r--r--phonegap/www/index.html8
-rw-r--r--phonegap/www/js/mobile.js100
-rw-r--r--phonegap/www/no_connection.html2
-rw-r--r--phonegap/www/report_created.html2
-rw-r--r--phonegap/www/signed_in.html83
-rw-r--r--t/app/controller/admin.t352
-rw-r--r--t/app/controller/alert.t2
-rw-r--r--t/app/controller/alert_new.t210
-rw-r--r--t/app/controller/around.t31
-rw-r--r--t/app/controller/index.t19
-rw-r--r--t/app/controller/questionnaire.t26
-rw-r--r--t/app/controller/report_display.t31
-rw-r--r--t/app/controller/report_interest_count.t143
-rw-r--r--t/app/controller/report_new.t385
-rw-r--r--t/app/controller/report_new_open311.t2
-rw-r--r--t/app/controller/report_updates.t43
-rw-r--r--t/app/controller/reports.t42
-rw-r--r--t/app/helpers/send_email.t2
-rw-r--r--t/app/model/alert_type.t47
-rw-r--r--t/app/model/problem.t55
-rw-r--r--t/cobrand/councils.t18
-rw-r--r--t/cobrand/get_council_sender.t8
-rw-r--r--t/i18n.t11
-rw-r--r--t/open311.t79
-rw-r--r--t/open311/getservicerequestupdates.t57
-rw-r--r--t/open311/populate-service-list.t178
-rw-r--r--templates/email/default/confirm_report_sent.txt9
-rw-r--r--templates/email/fixmybarangay/login.txt14
-rw-r--r--templates/email/fixmybarangay/signature.txt2
-rw-r--r--templates/email/fixmybarangay/site-name.txt1
-rw-r--r--templates/email/seesomething/confirm_report_sent.txt10
-rw-r--r--templates/email/seesomething/submit.txt25
-rw-r--r--templates/email/zurich/alert-moderation-overdue.txt10
-rw-r--r--templates/email/zurich/alert-overdue.txt13
-rwxr-xr-xtemplates/email/zurich/problem-confirm.txt16
-rwxr-xr-xtemplates/email/zurich/reply-autoresponse.txt10
-rwxr-xr-xtemplates/email/zurich/submit.txt10
-rw-r--r--templates/web/bromley/around/intro.html1
-rw-r--r--templates/web/default/admin/council_contacts.html37
-rw-r--r--templates/web/default/admin/council_edit.html30
-rw-r--r--templates/web/default/admin/footer.html3
-rw-r--r--templates/web/default/admin/header.html14
-rw-r--r--templates/web/default/admin/index.html2
-rw-r--r--templates/web/default/admin/list_updates.html2
-rw-r--r--templates/web/default/admin/problem_row.html2
-rw-r--r--templates/web/default/admin/report_edit.html1
-rw-r--r--templates/web/default/admin/search_abuse.html21
-rw-r--r--templates/web/default/admin/search_users.html4
-rw-r--r--templates/web/default/admin/stats.html6
-rw-r--r--templates/web/default/admin/update_edit.html2
-rwxr-xr-xtemplates/web/default/around/_report_banner.html10
-rwxr-xr-xtemplates/web/default/around/_updates.html12
-rw-r--r--templates/web/default/around/around_index.html54
-rwxr-xr-xtemplates/web/default/around/display_location.html135
-rwxr-xr-xtemplates/web/default/around/tabbed_lists.html23
-rw-r--r--templates/web/default/common_header_tags.html1
-rw-r--r--templates/web/default/dashboard/index.html2
-rwxr-xr-xtemplates/web/default/faq/faq-en-gb.html2
-rw-r--r--templates/web/default/index-steps.html25
-rw-r--r--templates/web/default/index.html21
-rw-r--r--templates/web/default/js/validation_rules.html7
-rw-r--r--templates/web/default/js/validation_strings.html4
-rw-r--r--templates/web/default/maps/openlayers.html2
-rw-r--r--templates/web/default/questionnaire/completed-open.html6
-rw-r--r--templates/web/default/questionnaire/completed.html4
-rw-r--r--templates/web/default/questionnaire/index.html4
-rw-r--r--templates/web/default/report/_main.html41
-rw-r--r--templates/web/default/report/_support.html11
-rw-r--r--templates/web/default/report/display.html169
-rw-r--r--templates/web/default/report/new/category.html2
-rw-r--r--templates/web/default/report/new/category_extras.html4
-rw-r--r--templates/web/default/report/new/fill_in_details_form.html2
-rw-r--r--templates/web/default/report/new/notes.html2
-rw-r--r--templates/web/default/report/photo.html8
-rw-r--r--templates/web/default/report/update-form.html165
-rw-r--r--templates/web/default/report_created.html9
-rwxr-xr-xtemplates/web/default/reports/body.html (renamed from templates/web/default/reports/council.html)0
-rwxr-xr-xtemplates/web/default/reports/index.html1
-rwxr-xr-xtemplates/web/default/reports/ward.html2
-rw-r--r--templates/web/emptyhomes/faq/faq-cy.html2
-rwxr-xr-xtemplates/web/emptyhomes/faq/faq-en-gb.html2
-rw-r--r--templates/web/emptyhomes/report/display.html2
-rwxr-xr-xtemplates/web/emptyhomes/reports/body.html (renamed from templates/web/emptyhomes/reports/council.html)0
-rw-r--r--templates/web/fixmybarangay/_barangay_buttons.html4
-rw-r--r--templates/web/fixmybarangay/alert/_list.html45
-rw-r--r--templates/web/fixmybarangay/alert/index.html45
-rw-r--r--templates/web/fixmybarangay/around/tabbed_lists.html18
-rw-r--r--templates/web/fixmybarangay/auth/sign_out.html8
-rw-r--r--templates/web/fixmybarangay/faq/faq-en-gb.html135
-rw-r--r--templates/web/fixmybarangay/footer.html158
-rw-r--r--templates/web/fixmybarangay/header.html77
-rw-r--r--templates/web/fixmybarangay/report/_message_manager.html293
-rw-r--r--templates/web/fixmybarangay/report/new/councils_text.html5
-rw-r--r--templates/web/fixmybarangay/report/new/fill_in_details_text.html12
-rw-r--r--templates/web/fixmybarangay/report/new/notes.html11
-rwxr-xr-xtemplates/web/fixmybarangay/reports/index.html59
-rwxr-xr-xtemplates/web/fixmystreet/around/_report_banner.html14
-rwxr-xr-xtemplates/web/fixmystreet/around/_updates.html5
-rwxr-xr-xtemplates/web/fixmystreet/around/display_location.html121
-rw-r--r--templates/web/fixmystreet/around/intro.html2
-rw-r--r--templates/web/fixmystreet/around/postcode_form.html18
-rw-r--r--templates/web/fixmystreet/around/tabbed_lists.html14
-rw-r--r--templates/web/fixmystreet/auth/general.html4
-rwxr-xr-xtemplates/web/fixmystreet/faq/faq-en-gb.html5
-rw-r--r--templates/web/fixmystreet/header.html17
-rw-r--r--templates/web/fixmystreet/index.html19
-rw-r--r--templates/web/fixmystreet/my/my.html4
-rw-r--r--templates/web/fixmystreet/questionnaire/completed-open.html6
-rw-r--r--templates/web/fixmystreet/report/_main.html21
-rw-r--r--templates/web/fixmystreet/report/display.html173
-rw-r--r--templates/web/fixmystreet/report/new/category_extras.html8
-rw-r--r--templates/web/fixmystreet/report/new/fill_in_details_form.html33
-rw-r--r--templates/web/fixmystreet/report/new/fill_in_details_text.html5
-rw-r--r--templates/web/fixmystreet/report/new/notes.html2
-rw-r--r--templates/web/fixmystreet/report/photo.html8
-rw-r--r--templates/web/fixmystreet/report/update-form.html150
-rw-r--r--templates/web/fixmystreet/report/updates-sidebar-notes.html2
-rwxr-xr-xtemplates/web/fixmystreet/reports/_extras.html24
-rw-r--r--templates/web/oxfordshire/around/intro.html1
-rwxr-xr-xtemplates/web/oxfordshire/faq/faq-en-gb.html206
-rw-r--r--templates/web/oxfordshire/footer.html51
-rw-r--r--templates/web/oxfordshire/header.html94
-rw-r--r--templates/web/oxfordshire/report/new/councils_text_all.html18
-rw-r--r--templates/web/oxfordshire/report/new/fill_in_details_text.html6
-rw-r--r--templates/web/oxfordshire/report/new/notes.html10
-rw-r--r--templates/web/seesomething/admin/footer.html7
-rw-r--r--templates/web/seesomething/admin/header.html2
-rw-r--r--templates/web/seesomething/admin/stats.html63
-rw-r--r--templates/web/seesomething/around/around_index.html24
-rw-r--r--templates/web/seesomething/around/display_location.html49
-rw-r--r--templates/web/seesomething/around/postcode_form.html17
-rw-r--r--templates/web/seesomething/auth/general.html46
-rw-r--r--templates/web/seesomething/auth/sign_out.html7
-rw-r--r--templates/web/seesomething/footer.html22
-rw-r--r--templates/web/seesomething/front/stats.html0
-rw-r--r--templates/web/seesomething/front/tips.html3
-rw-r--r--templates/web/seesomething/index.html43
-rw-r--r--templates/web/seesomething/js/validation_rules.html13
-rw-r--r--templates/web/seesomething/js/validation_strings.html15
-rw-r--r--templates/web/seesomething/report/display.html9
-rw-r--r--templates/web/seesomething/report/new/category.html14
-rw-r--r--templates/web/seesomething/report/new/fill_in_details_form.html104
-rw-r--r--templates/web/seesomething/report_created.html29
-rw-r--r--templates/web/seesomething/set_body_class.html1
-rw-r--r--templates/web/southampton/front/news.html9
-rw-r--r--templates/web/southampton/header.html1
-rw-r--r--templates/web/southampton/report/photo.html6
-rw-r--r--templates/web/southampton/tokens/confirm_problem.html14
-rw-r--r--templates/web/stevenage/around/intro.html2
-rw-r--r--templates/web/stevenage/footer.html56
-rw-r--r--templates/web/stevenage/header.html110
-rw-r--r--templates/web/zurich/around/intro.html1
-rwxr-xr-xtemplates/web/zurich/faq/faq-de.html2
-rw-r--r--templates/web/zurich/footer.html31
-rw-r--r--templates/web/zurich/maps/zurich.html14
-rw-r--r--templates/web/zurich/report/new/fill_in_details_form.html136
-rw-r--r--templates/web/zurich/report/update-form.html0
-rw-r--r--web/.gitignore4
-rw-r--r--web/cobrands/barnet/_colours.scss8
-rw-r--r--web/cobrands/barnet/layout.scss7
-rw-r--r--web/cobrands/bromley/_colours.scss11
-rw-r--r--web/cobrands/bromley/layout.scss8
-rw-r--r--web/cobrands/default/_colours.scss13
-rw-r--r--web/cobrands/default/layout.scss25
-rw-r--r--web/cobrands/fixmybarangay/_colours.scss10
-rw-r--r--web/cobrands/fixmybarangay/base.scss40
-rw-r--r--web/cobrands/fixmybarangay/config.rb25
-rw-r--r--web/cobrands/fixmybarangay/images/city6.pngbin0 -> 227275 bytes
-rw-r--r--web/cobrands/fixmybarangay/images/city7.pngbin0 -> 126124 bytes
-rw-r--r--web/cobrands/fixmybarangay/images/fmb-spinner-16x16.gifbin0 -> 1850 bytes
-rw-r--r--web/cobrands/fixmybarangay/images/ie_front_logo.gifbin0 -> 3473 bytes
-rw-r--r--web/cobrands/fixmybarangay/images/ie_logo.pngbin0 -> 2143 bytes
-rw-r--r--web/cobrands/fixmybarangay/images/mobile-22x40.pngbin0 -> 454 bytes
-rw-r--r--web/cobrands/fixmybarangay/images/pat3.pngbin0 -> 3028 bytes
-rw-r--r--web/cobrands/fixmybarangay/images/sprite.pngbin0 -> 17752 bytes
-rw-r--r--web/cobrands/fixmybarangay/layout.scss136
-rw-r--r--web/cobrands/fixmybarangay/message_manager.scss241
-rw-r--r--web/cobrands/fixmybarangay/message_manager_client.js777
-rw-r--r--web/cobrands/fixmybarangay/messages.js26
-rw-r--r--web/cobrands/fixmybarangay/position_map.js22
-rw-r--r--web/cobrands/fixmybarangay/test-texts.json17
-rw-r--r--web/cobrands/fixmystreet/_base.scss123
-rw-r--r--web/cobrands/fixmystreet/_colours.scss12
-rw-r--r--web/cobrands/fixmystreet/_layout.scss94
-rw-r--r--web/cobrands/fixmystreet/fixmystreet.js63
-rw-r--r--web/cobrands/fixmystreet/images/share.pngbin0 -> 435 bytes
-rw-r--r--web/cobrands/fixmystreet/layout.scss21
-rw-r--r--web/cobrands/oxfordshire/_colours.scss16
-rw-r--r--web/cobrands/oxfordshire/base.scss40
-rw-r--r--web/cobrands/oxfordshire/config.rb25
-rwxr-xr-xweb/cobrands/oxfordshire/images/bg-y.jpgbin0 -> 1287 bytes
-rwxr-xr-xweb/cobrands/oxfordshire/images/bg.jpgbin0 -> 1590 bytes
-rw-r--r--web/cobrands/oxfordshire/images/divider1x32.pngbin0 -> 167 bytes
-rwxr-xr-xweb/cobrands/oxfordshire/images/dot6x6.jpgbin0 -> 1145 bytes
-rw-r--r--web/cobrands/oxfordshire/images/fms-logo-105x20.pngbin0 -> 2348 bytes
-rw-r--r--web/cobrands/oxfordshire/images/fms-logo-inverse.pngbin0 -> 1299 bytes
-rwxr-xr-xweb/cobrands/oxfordshire/images/footer.jpgbin0 -> 16093 bytes
-rwxr-xr-xweb/cobrands/oxfordshire/images/header.jpgbin0 -> 112470 bytes
-rwxr-xr-xweb/cobrands/oxfordshire/images/logo.jpgbin0 -> 12774 bytes
-rw-r--r--web/cobrands/oxfordshire/images/tab-green.pngbin0 -> 819 bytes
-rw-r--r--web/cobrands/oxfordshire/images/tabs-featured-on.pngbin0 -> 162 bytes
-rw-r--r--web/cobrands/oxfordshire/images/tabs-featured.pngbin0 -> 175 bytes
-rw-r--r--web/cobrands/oxfordshire/layout.scss154
-rw-r--r--web/cobrands/oxfordshire/oxfordshire.scss184
-rw-r--r--web/cobrands/oxfordshire/position_map.js19
-rw-r--r--web/cobrands/southampton/css.scss8
-rw-r--r--web/cobrands/stevenage/_colours.scss11
-rw-r--r--web/cobrands/stevenage/_council_header.scss762
-rw-r--r--web/cobrands/stevenage/base.scss13
-rw-r--r--web/cobrands/stevenage/config.rb25
-rw-r--r--web/cobrands/stevenage/layout.scss252
-rw-r--r--web/cobrands/zurich/Zurich-WMTSCapabilities.xml178
-rw-r--r--web/cobrands/zurich/_colours.scss18
-rw-r--r--web/cobrands/zurich/_zurich.scss32
-rw-r--r--web/cobrands/zurich/bg_mainnav_portal.pngbin0 -> 272 bytes
-rw-r--r--web/cobrands/zurich/layout.scss81
-rw-r--r--web/cobrands/zurich/logo_portal.jpgbin0 -> 6525 bytes
-rw-r--r--web/cobrands/zurich/logo_portal.x.jpgbin0 -> 365 bytes
-rw-r--r--web/css/core.scss10
-rw-r--r--web/js/OpenLayers.2.11.zurich.js1384
-rw-r--r--web/js/OpenLayers.Projection.CH1903.js128
-rw-r--r--web/js/fixmystreet.js17
-rw-r--r--web/js/map-OpenLayers.js72
-rw-r--r--web/js/map-wmts-zurich.js83
-rw-r--r--web/js/modernizr.custom.js6
374 files changed, 17344 insertions, 10417 deletions
diff --git a/.gitignore b/.gitignore
index 5f56f9b27..862e1b7b3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -17,6 +17,7 @@ tags
*.mo
FixMyStreet-EmptyHomes.po
+FixMyBarangay.po
/web/cobrands/fiksgatami/css.css
/web/cobrands/southampton/css.css
@@ -26,8 +27,12 @@ FixMyStreet-EmptyHomes.po
/web/cobrands/default/*.css
/web/cobrands/fixmystreet/*.css
/web/cobrands/bromley/*.css
+/web/cobrands/fixmybarangay/*.css
+/web/cobrands/oxfordshire/*.css
+/web/cobrands/stevenage/*.css
/web/cobrands/barnet/*.css
/web/cobrands/zurich/*.css
+/web/cobrands/seesomething
/web/photo
/local
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 000000000..542ffd816
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,41 @@
+notifications:
+ email: false
+ irc:
+ channels:
+ - "irc.mysociety.org#fixmystreet"
+ use_notice: true
+ skip_join: true
+
+language: perl
+perl:
+ - "5.14"
+
+branches:
+ only:
+ - master
+
+before_install:
+ - sudo apt-get update -qq
+ - sudo apt-get install -qq jhead
+# A couple of other modules that normally come from packages, but no system stuff here
+ - cpanm -q Carton Locale::gettext Math::BigInt::GMP SOAP::Lite
+ - sudo locale-gen cy_GB.UTF-8 en_GB.UTF-8 nb_NO.UTF-8
+install:
+ - carton install --deployment
+before_script:
+ - psql -c 'create database fms;' -U postgres
+ - psql fms postgres < db/schema.sql
+ - psql fms postgres < db/alert_types.sql
+ - psql fms postgres < db/generate_secret.sql
+ - >
+ sed -r -e "s,(FMS_DB_USER:) 'fms',\\1 'postgres',"
+ -e "s,cobrand_one,fixmystreet,"
+ -e "s,cobrand_two: 'hostname_substring2',fixmystreet: 'localhost',"
+ -e "s,(BASE_URL:) 'http://www.example.org',\\1 'http://localhost',"
+ -e "s,(MAPIT_URL:) '',\\1 'http://mapit.mysociety.org/',"
+ conf/general.yml-example > conf/general.yml
+ - ./bin/cron-wrapper ./bin/make_po FixMyStreet-EmptyHomes
+ - ./bin/cron-wrapper ./bin/make_emptyhomes_welsh_po
+ - commonlib/bin/gettext-makemo FixMyStreet
+script: "bin/cron-wrapper perl /usr/bin/prove -rl t"
+
diff --git a/.tx/config b/.tx/config
new file mode 100644
index 000000000..44db89d9e
--- /dev/null
+++ b/.tx/config
@@ -0,0 +1,9 @@
+[main]
+host = https://www.transifex.com
+type = PO
+
+[fixmystreet.master]
+file_filter = locale/<lang>.UTF-8/LC_MESSAGES/FixMyStreet.po
+source_file = locale/FixMyStreet.po
+source_lang = en
+
diff --git a/Makefile.PL b/Makefile.PL
index aba781785..92f08e405 100644
--- a/Makefile.PL
+++ b/Makefile.PL
@@ -49,6 +49,8 @@ test_requires 'Test::More' => '0.88';
test_requires 'Test::WWW::Mechanize::Catalyst';
test_requires 'Sub::Override';
+tests 't/*.t t/*/*.t t/*/*/*.t t/*/*/*/*.t t/*/*/*/*/*.t';
+
catalyst;
install_script glob('script/*.pl');
diff --git a/README.md b/README.md
index 32d3c4740..616e88a66 100644
--- a/README.md
+++ b/README.md
@@ -13,12 +13,17 @@ already been reported and leave updates. Users can also subscribe to email or
RSS alerts of problems in their area.
It was created in 2007 by [mySociety](http://www.mysociety.org/) for reporting
-problems to UK councils and has been copied around the world.
+problems to UK councils and has been copied around the world. The FixMyStreet
+Platform is now at version 1.0.
+
+## Releases
+
+* v1.0 (24th October 2012) - Official launch of the FixMyStreet platform
## Installation
-We're working hard to make FixMyStreet Platform easy to install and re-use in
-other countries - please see our site at <http://code.fixmystreet.com/> for
+We've been working hard to make FixMyStreet Platform easy to install and re-use
+in other countries - please see our site at <http://code.fixmystreet.com/> for
help and documentation in installing FixMyStreet Platform.
## Examples
diff --git a/bin/ec2-rewrite-conf b/bin/ec2-rewrite-conf
new file mode 100755
index 000000000..0163ef511
--- /dev/null
+++ b/bin/ec2-rewrite-conf
@@ -0,0 +1,20 @@
+#!/bin/sh
+
+# This is a helper script for writing the current EC2 hostname into
+# the FixMyStreet configuration file. Its intended usage is for lines
+# like these to be added to /etc/rc.local:
+#
+# su -l -c /home/fms/fixmystreet/bin/ec2-rewrite-conf fms
+# /etc/init.d/apache2 restart
+
+set -e
+
+BIN_DIR=$(dirname $(readlink -f $0))
+CONF_DIR=$BIN_DIR/../conf
+
+HOST=`curl -s http://169.254.169.254/latest/meta-data/public-hostname`
+
+sed -i -r \
+ -e "s,^( *BASE_URL:).*,\\1 'http://$HOST'," \
+ -e "s,^( *EMAIL_DOMAIN:).*,\\1 '$HOST'," \
+ $CONF_DIR/general.yml
diff --git a/bin/fetch-comments b/bin/fetch-comments
index 4bbcc9d21..ef099fcc9 100755
--- a/bin/fetch-comments
+++ b/bin/fetch-comments
@@ -5,11 +5,13 @@ use warnings;
require 5.8.0;
use FixMyStreet::App;
+use CronFns;
+my ($verbose, $nomail) = CronFns::options();
use Open311;
use Open311::GetServiceRequestUpdates;
-my $updates = Open311::GetServiceRequestUpdates->new;
+my $updates = Open311::GetServiceRequestUpdates->new( verbose => $verbose );
$updates->fetch;
diff --git a/bin/fetch-comments-24hs b/bin/fetch-comments-24hs
new file mode 100644
index 000000000..b84f09ba7
--- /dev/null
+++ b/bin/fetch-comments-24hs
@@ -0,0 +1,26 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+use DateTime;
+use DateTime::Format::W3CDTF;
+require 5.8.0;
+
+use FixMyStreet::App;
+use CronFns;
+my ($verbose, $nomail) = CronFns::options();
+
+use Open311;
+use Open311::GetServiceRequestUpdates;
+
+my $dt = DateTime->now();
+my $dt_24hrs_ago = $dt->clone;
+$dt_24hrs_ago->add( hours => -24 );
+
+my $updates = Open311::GetServiceRequestUpdates->new(
+ verbose => 1,
+ start_date => DateTime::Format::W3CDTF->format_datetime( $dt_24hrs_ago ),
+ end_date => DateTime::Format::W3CDTF->format_datetime( $dt )
+);
+
+$updates->fetch;
diff --git a/bin/gettext-extract b/bin/gettext-extract
index 55623e86c..e77cf9cb0 100755
--- a/bin/gettext-extract
+++ b/bin/gettext-extract
@@ -31,23 +31,27 @@ rm -f $PO
xgettext.pl --gnu-gettext --verbose --output $PO --plugin perl=* --plugin tt2 --directory perllib --directory templates/web --directory db --directory bin
# Fix headers
-TEMP=`tempfile`
+# no such thing as tempfile on OS X
+TEMP=`tempfile 2>/dev/null || mktemp /tmp/gettext-extract.XXXXXX`
NOW=`date +"%Y-%m-%d %H:%M%z"`
+# strictly POSIX sed on e.g. OS X doesn't let you used \n in replacements so we do this
+nl=$'\n';
cat $PO | sed "
s/SOME DESCRIPTIVE TITLE/FixMyStreet original .po file, autogenerated by gettext-extract/;
s/YEAR THE PACKAGE'S COPYRIGHT HOLDER/2011 UK Citizens Online Democracy/;
s/PACKAGE package/main FixMyStreet code/;
s/FIRST AUTHOR <EMAIL@ADDRESS>, YEAR./Matthew Somerville <matthew@mysociety.org>, 2011-06-03./;
- s/PACKAGE VERSION/1.0\\\n\"\n\"Report-Msgid-Bugs-To: matthew@mysociety.org/;
+ s/PACKAGE VERSION/1.0\\\n\"\\$nl\"Report-Msgid-Bugs-To: matthew@mysociety.org/;
s/POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE/POT-Creation-Date: $NOW/;
s/LL@li.org/team@fixmystreet.com/;
s/charset=CHARSET/charset=UTF-8/;
- s/8bit/8bit\\\n\"\n\"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;/;
+ s/8bit/8bit\\\n\"\\$nl\"Plural-Forms: nplurals=2; plural=n != 1;/;
" >> $TEMP
mv $TEMP $PO
echo "$( bin/gettext-nget-patch )" >> $PO
-bin/make_emptyhomes_po
+bin/make_po FixMyStreet-EmptyHomes
+bin/make_po FixMyBarangay
diff --git a/bin/gettext-nget-patch b/bin/gettext-nget-patch
index 223bcc816..5ebd8bbcb 100755
--- a/bin/gettext-nget-patch
+++ b/bin/gettext-nget-patch
@@ -9,6 +9,7 @@ my %out;
find( sub {
next unless -f;
+ next if $File::Find::name =~ /ttc$/;
open (FP, $_) or die $!;
while (<FP>) {
next unless /nget/;
@@ -17,16 +18,17 @@ find( sub {
do {
$text .= <FP>;
} until $text =~ /\)/;
- $text =~ /nget\(\s*"(.*?)"\s*,\s*"(.*?)"\s*,\s*(.*?)\s*\)/s;
- $out{$1} = {
- file => $File::Find::name,
- line => $line,
- s => $1,
- p => $2,
- };
+ if ($text =~ /nget\(\s*"(.*?)"\s*,\s*"(.*?)"\s*,\s*(.*?)\s*\)/s) {
+ $out{$1} = {
+ file => $File::Find::name,
+ line => $line,
+ s => $1,
+ p => $2,
+ };
+ }
}
close FP;
-}, 'templates');
+}, 'templates', 'perllib');
foreach (values %out) {
print <<EOF;
diff --git a/bin/install-as-user b/bin/install-as-user
new file mode 100755
index 000000000..2e0816966
--- /dev/null
+++ b/bin/install-as-user
@@ -0,0 +1,112 @@
+#!/bin/sh
+
+set -e
+set -x
+
+if [ $# -ne 3 ]
+then
+ cat >&2 <<EOUSAGE
+Usage: $0 <UNIX-USER> <HOST> <INSTALLATION-DIRECTORY>
+EOUSAGE
+ exit 1
+fi
+
+UNIX_USER="$1"
+HOST="$2"
+DIRECTORY="$3"
+DB_NAME="fixmystreet"
+
+# Check that the arguments we've been passed are sensible:
+
+IP_ADDRESS_FOR_HOST="$(dig +short $HOST)"
+
+if [ x = x"$IP_ADDRESS_FOR_HOST" ]
+then
+ echo "The hostname $HOST didn't resolve to an IP address"
+ exit 1
+fi
+
+if ! id "$UNIX_USER" 2> /dev/null > /dev/null
+then
+ echo "The user '$UNIX_USER' didn't exist."
+ exit 1
+fi
+
+if [ "$(whoami)" != "$UNIX_USER" ]
+then
+ echo "This script should be run by the user '$UNIX_USER'."
+ exit 1
+fi
+
+REPOSITORY="$DIRECTORY/fixmystreet"
+LINK_DESTINATION="$HOME/fixmystreet"
+
+ln -sfn "$REPOSITORY" $LINK_DESTINATION
+cd "$REPOSITORY"
+
+# Add regularly scheduled tasks to cron:
+
+TEMPORARY_CRONTAB=$(mktemp)
+
+echo crontab file is $TEMPORARY_CRONTAB
+
+cp "$REPOSITORY"/conf/crontab.example "$TEMPORARY_CRONTAB"
+
+sed -i \
+ -e 's,$FMS,'"$REPOSITORY,g" \
+ -e 's,$LOCK_DIR,'"$DIRECTORY,g" \
+ "$TEMPORARY_CRONTAB"
+
+crontab $TEMPORARY_CRONTAB
+
+# Install the compass gem locally - it's required for generating the
+# CSS:
+
+export GEM_HOME="$DIRECTORY/gems"
+mkdir -p "$GEM_HOME"
+export GEM_PATH=
+export PATH="$GEM_HOME/bin:$PATH"
+
+gem install --no-ri --no-rdoc compass
+
+# Use compass to generate the CSS, if it doesn't seem to already
+# exist:
+
+if [ ! -f web/cobrands/default/base.css ]
+then
+ bin/make_css
+fi
+
+# Write sensible values into the config file:
+
+sed -r \
+ -e "s,^( *FMS_DB_HOST:).*,\\1 ''," \
+ -e "s,^( *FMS_DB_NAME:).*,\\1 '$DB_NAME'," \
+ -e "s,^( *FMS_DB_USER:).*,\\1 '$UNIX_USER'," \
+ -e "s,^( *BASE_URL:).*,\\1 'http://$HOST'," \
+ -e "s,^( *EMAIL_DOMAIN:).*,\\1 '$HOST'," \
+ -e "s,^( *CONTACT_EMAIL:).*,\\1 'help@$HOST'," \
+ -e "s,^( *DO_NOT_REPLY_EMAIL:).*,\\1 'help@$HOST'," \
+ conf/general.yml-example > conf/general.yml
+
+# Create the database if it doesn't exist:
+if ! psql -l | egrep "^ *$DB_NAME *\|" > /dev/null
+then
+ createdb --owner "$UNIX_USER" "$DB_NAME"
+ echo 'CREATE LANGUAGE plpgsql;' | psql -U "$UNIX_USER" "$DB_NAME" || true
+ psql -U "$UNIX_USER" "$DB_NAME" < "$REPOSITORY"/db/schema.sql
+ psql -U "$UNIX_USER" "$DB_NAME" < "$REPOSITORY"/db/alert_types.sql
+ psql -U "$UNIX_USER" "$DB_NAME" < "$REPOSITORY"/db/generate_secret.sql
+fi
+
+# Install the required Perl modules - this may take a very long time:
+
+cd "$FMS_REPOSITORY"
+bin/install_perl_modules
+
+# Generate po and mo files (these invocations taken from Kagee's script):
+
+bin/cron-wrapper bin/make_po FixMyStreet-EmptyHomes
+bin/cron-wrapper bin/make_emptyhomes_welsh_po
+
+commonlib/bin/gettext-makemo FixMyStreet
diff --git a/bin/install_perl_modules b/bin/install_perl_modules
index 2df4ffbf8..2311ae5f1 100755
--- a/bin/install_perl_modules
+++ b/bin/install_perl_modules
@@ -1,5 +1,7 @@
#!/bin/bash
+set -e
+
DIR="$( cd -P "$( dirname "${BASH_SOURCE[0]}" )" && pwd | sed -e 's/\/bin$//' )"
$DIR/bin/cpanm -l $DIR/local Carton
@@ -9,11 +11,7 @@ export PERL5LIB=$DIR/local/lib/perl5
carton install --deployment
-perl -MImage::Magick -e 'exit()' >/dev/null 2>&1
-
-HAVE_IM=$?
-
-if [ $HAVE_IM -ne 0 ]
+if ! perl -MImage::Magick -e 'exit()' >/dev/null 2>&1
then
read -p "Image::Magick is not installed. Do you want to attempt to install it?" yn
case $yn in
diff --git a/bin/make_css b/bin/make_css
index 9d033b5dc..cd78e7f13 100755
--- a/bin/make_css
+++ b/bin/make_css
@@ -14,14 +14,19 @@
DIRECTORY=$(cd `dirname $0`/../web && pwd)
# FixMyStreet uses compass
-compass compile --output-style compressed $DIRECTORY/cobrands/fixmystreet
-compass compile --output-style compressed $DIRECTORY/cobrands/bromley
-compass compile --output-style compressed $DIRECTORY/cobrands/barnet
-compass compile --output-style compressed $DIRECTORY/cobrands/zurich
-compass compile --output-style compressed $DIRECTORY/cobrands/default
+NEWSTYLE=${1:-"fixmystreet bromley fixmybarangay barnet zurich default stevenage oxfordshire"}
+NEWSTYLE_REGEX=${NEWSTYLE// /\\|}
+for site in $NEWSTYLE; do
+ compass compile --output-style compressed $DIRECTORY/cobrands/$site
+done
+
+# If given a command line argument, assume was a compass directory and exit
+if [ -n "$1" ]; then
+ exit 0
+fi
# The rest are plain sass
-for scss in `find $DIRECTORY -name "*.scss" -exec dirname {} \; | uniq | grep -v "cobrands/\(fixmystreet\|bromley\|barnet\|default\|zurich\)"`
+for scss in `find $DIRECTORY -name "*.scss" -exec dirname {} \; | uniq | grep -v "cobrands/\($NEWSTYLE_REGEX\)"`
do
sass --scss --update --style compressed $scss
done
diff --git a/bin/make_emptyhomes_welsh_po b/bin/make_emptyhomes_welsh_po
index b3dd441a0..f4f6850d6 100755
--- a/bin/make_emptyhomes_welsh_po
+++ b/bin/make_emptyhomes_welsh_po
@@ -87,15 +87,21 @@ while(<MAINPO>) {
$new_buffer =~ s/"\n"//g;
if ($lookup{$new_buffer} && $lookup{$new_buffer}[1]) {
- print OUTPO "#, fuzzy\n";
- }
+ print OUTPO "#, fuzzy\n";
+ }
print OUTPO $buffer;
if ($lookup{$new_buffer}) {
print OUTPO $lookup{$new_buffer}[0];
} else {
- print __LINE__ . "\n";
- die "Failed to find match with buffer: $new_buffer";
+ if (m/^msgstr\[0\] ""/) {
+ $new_buffer =~ s/^msgid "/msgstr[0] "/m;
+ $new_buffer =~ s/^msgid_plural "/msgstr[1] "/m;
+ $_ = <MAINPO>; # skip untranslated plural
+ } else {
+ $new_buffer =~ s/^msgid "/msgstr "/;
+ }
+ print OUTPO $new_buffer;
}
$buffer = "";
diff --git a/bin/make_emptyhomes_po b/bin/make_po
index 10e840599..76dc4566b 100755
--- a/bin/make_emptyhomes_po
+++ b/bin/make_po
@@ -1,8 +1,8 @@
#!/usr/bin/perl -w
use strict;
-# Generates EmptyHomes version of .po file, which is a translation
-# into a language the same as English, only "problem" becomes "empty property".
+# Generates a version of .po file, which is a translation
+# into a language the same as English, with replacement as specified in PoChange
use POSIX;
use FindBin;
@@ -13,14 +13,16 @@ chdir("$FindBin::Bin/../locale");
mkdir("en_GB.UTF-8");
mkdir("en_GB.UTF-8/LC_MESSAGES");
+my $pofile = shift;
+
open(MAINPO, "FixMyStreet.po") or die "";
-open(EHAPO, ">FixMyStreet-EmptyHomes.po") or die "";
-open(NEWPO, ">en_GB.UTF-8/LC_MESSAGES/FixMyStreet-EmptyHomes.po") or die "";
+open(EHAPO, ">$pofile.po") or die "";
+open(NEWPO, ">en_GB.UTF-8/LC_MESSAGES/$pofile.po") or die "";
-print NEWPO "# AUTOMATICALLY GENERATED by make_emptyhomes_po, do not edit\n";
+print NEWPO "# AUTOMATICALLY GENERATED by make_po, do not edit\n";
print NEWPO "#\n";
-print EHAPO "# AUTOMATICALLY GENERATED by make_emptyhomes_po, do not edit\n";
+print EHAPO "# AUTOMATICALLY GENERATED by make_po, do not edit\n";
print EHAPO "#\n";
my $buffer = "";
@@ -30,7 +32,7 @@ while(<MAINPO>) {
s/#, fuzzy/#/;
}
if (m/"Last-Translator: FULL NAME/) {
- $_ = '"Last-Translator: mysociety/bin/make_emptyhomes_po\\n"'."\n";
+ $_ = '"Last-Translator: mysociety/bin/make_po\\n"'."\n";
}
if (m/"PO-Revision-Date: YEAR-MO-DA/) {
my $time = POSIX::strftime("%Y-%m-%d %H:%M%z", localtime(time()));
@@ -56,7 +58,7 @@ while(<MAINPO>) {
} elsif ($start && (m/^msgstr ""/ || m/^msgstr\[0\] ""/)) {
# start of translated text - translate English into Empty Homes language
- $buffer = PoChange::fixmystreet_to_reportemptyhomes($buffer);
+ $buffer = PoChange::translate($pofile, $buffer);
print EHAPO $buffer;
diff --git a/bin/open311-populate-service-list b/bin/open311-populate-service-list
index 33be61af7..dc8fa3f7b 100755
--- a/bin/open311-populate-service-list
+++ b/bin/open311-populate-service-list
@@ -1,14 +1,26 @@
-#!/usr/bin/perl
+#!/usr/bin/env perl
use strict;
use warnings;
use FixMyStreet::App;
use Open311::PopulateServiceList;
+use Getopt::Long::Descriptive;
+my ($opt, $usage) = describe_options(
+ '%c %o',
+ ['verbose|v', "print out all services as they are found"],
+ ['warn|w', "output warnings about any issues"],
+ ['help', "print usage message and exit" ],
+);
+print($usage->text), exit if $opt->help;
my $council_list = FixMyStreet::App->model('DB::Open311conf')->search( {
+ area_id => { '!=', 2237 }, # XXX Until Oxfordshire does do so
send_method => 'Open311'
} );
-my $p = Open311::PopulateServiceList->new( council_list => $council_list );
+my $verbose = 0;
+$verbose = 1 if $opt->warn;
+$verbose = 2 if $opt->verbose;
+my $p = Open311::PopulateServiceList->new( council_list => $council_list, verbose => $verbose );
$p->process_councils;
diff --git a/bin/oxfordshire/open311_service_request.cgi b/bin/oxfordshire/open311_service_request.cgi
new file mode 100755
index 000000000..821295ac7
--- /dev/null
+++ b/bin/oxfordshire/open311_service_request.cgi
@@ -0,0 +1,535 @@
+#!/usr/bin/perl
+
+# script for absobring incoming Open311 service request POSTs and
+# passing them into Bentley EXOR backend via create_enquiry stored
+# procedure.
+#
+# mySociety: http://code.fixmystreet.com/
+#-----------------------------------------------------------------
+
+use strict;
+use CGI;
+use Time::Piece;
+use Encode qw(from_to);
+use DBI;
+use DBD::Oracle qw(:ora_types);
+### for local testing (no Oracle):
+# use constant { ORA_VARCHAR2=>1, ORA_DATE=>1, ORA_NUMBER=>1};
+
+###################################################################
+# Config file: values in the config file override any values set
+# in the code below for the following things:
+#
+# host: SXX-SAN-FOO_BAR
+# sid: FOOBAR
+# port: 1531
+# username: foo
+# password: FooBar
+# testing: 0
+# encode-to-win1252: 1
+#
+# Absence of the config file fails silently in case you really are
+# using values directly set in this script.
+#------------------------------------------------------------------
+my $CONFIG_FILENAME = "/usr/local/etc/fixmystreet.config";
+
+use constant {
+ GENERAL_SERVICE_ERROR => 400,
+ CODE_OR_ID_NOT_FOUND => 404,
+ CODE_OR_ID_NOT_PROVIDED => 400,
+ BAD_METHOD => 405,
+ FATAL_ERROR => 500
+};
+
+my $DB_SERVER_NAME = 'FOO';
+my $DB_HOST = $DB_SERVER_NAME; # did this just in case we need to add more to the name (e.g, domain)
+my $DB_PORT = '1531';
+my $ORACLE_SID = 'FOOBAR';
+my $USERNAME = 'FIXMYSTREET';
+my $PASSWORD = 'XXX';
+my $STORED_PROC_NAME = 'PEM.create_enquiry';
+
+# NB can override these settings in the config file!
+
+# Strip control chars:
+# 'ruthless' removes everything (i.e. all POSIX control chars)
+# 'desc' removes everything, but keeps tabs and newlines in the 'description' field, where they matter
+# 'normal' keeps tabs and newlines
+my $STRIP_CONTROL_CHARS = 'ruthless';
+
+my $ENCODE_TO_WIN1252 = 1; # force encoding to Win-1252 for PEM data
+
+my $TESTING_WRITE_TO_FILE = 0; # write to file instead of DB
+my $OUT_FILENAME = "fms-test.txt"; # dump data here if TESTING_WRITE_TO_FILE is true
+my $TEST_SERVICE_DISCOVERY = 0; # switch to 1 to run service discovery, which confirms the DB connection at least
+my $RUN_FAKE_INSERT_TEST = 0; # command-line execution attempts insert with fake data (mimics a POST request)
+
+# Config file overrides existing values for these, if present:
+if ($CONFIG_FILENAME && open(CONF, $CONFIG_FILENAME)) {
+ while (<CONF>) {
+ next if /^#/;
+ if (/^\s*password:\s*(\S+)\s*$/i) {
+ $PASSWORD = $1;
+ } elsif (/^\s*sid:\s*(\S+)\s*$/i) {
+ $ORACLE_SID = $1;
+ } elsif (/^\s*username:\s*(\S+)\s*$/i) {
+ $USERNAME = $1;
+ } elsif (/^\s*port:\s*(\S+)\s*$/i) {
+ $DB_PORT = $1;
+ } elsif (/^\s*host:\s*(\S+)\s*$/i) {
+ $DB_HOST = $1;
+ } elsif (/^\s*testing:\s*(\S+)\s*$/i) {
+ $TESTING_WRITE_TO_FILE = $1;
+ } elsif (/^\s*test-service-discovery:\s*(\S+)\s*$/i) {
+ $TEST_SERVICE_DISCOVERY = $1;
+ } elsif (/^\s*strip-control-chars:\s*(\S+)\s*$/i) {
+ $STRIP_CONTROL_CHARS = lc $1;
+ } elsif (/^\s*encode-to-win1252:\s*(\S+)\s*$/i) {
+ $ENCODE_TO_WIN1252 = $1;
+ } elsif (/^\s*run-fake-insert-test:\s*(\S+)\s*$/i) {
+ $RUN_FAKE_INSERT_TEST = $1;
+ }
+ }
+}
+
+# assuming Oracle environment is happily set already, don't need these:
+# my $ORACLE_HOME = "/app/oracle/product/11.2.0/db_1";
+# $ENV{ORACLE_HOME} = $ORACLE_HOME;
+# $ENV{ORACLE_SID} = $ORACLE_SID;
+# $ENV{PATH} ="$ORACLE_HOME/bin";
+# $ENV{LD_LIBRARY_PATH}="$ORACLE_HOME/lib";
+
+my %PEM_BOUND_VAR_TYPES = get_pem_field_types();
+
+my $ERR_MSG = 'error'; # unique key in data hash
+
+# incoming (Open311, from FMS) field names
+# note: attribute[*] are being sent by FMS explicitly as attributes for Oxfordshire
+my %F = (
+ 'ACCOUNT_ID' => 'account_id',
+ 'ADDRESS_ID' => 'address_id',
+ 'ADDRESS_STRING' => 'address_string',
+ 'API_KEY' => 'api_key',
+ 'CLOSEST_ADDRESS' => 'attribute[closest_address]',
+ 'DESCRIPTION' => 'description',
+ 'DEVICE_ID' => 'device_id',
+ 'EASTING' => 'attribute[easting]',
+ 'EMAIL' => 'email',
+ 'FIRST_NAME' => 'first_name',
+ 'FMS_ID' => 'attribute[external_id]',
+ 'LAST_NAME' => 'last_name',
+ 'LAT' => 'lat',
+ 'LONG' => 'long',
+ 'MEDIA_URL' => 'media_url',
+ 'NORTHING' => 'attribute[northing]',
+ 'PHONE' => 'phone',
+ 'REQUESTED_DATETIME' => 'requested_datetime',
+ 'SERVICE_CODE' => 'service_code',
+ 'STATUS' => 'status',
+
+);
+
+my $req = new CGI;
+
+# normally, POST requests are inserting service requests
+# and GET requests are for returning service requests, although OCC aren't planning on
+# using that (it's part of the Open311 spec).
+# So actually the service discovery is more useful, so send in a 'services' param
+# to see that.
+#
+# But for testing the db connection, set $TEST_SERVICE_DISCOVERY so that
+# *all* requests simply do a service discovery by setting (possibly via the config file)
+
+if ($TEST_SERVICE_DISCOVERY) {
+ get_service_discovery($req); # to test
+}elsif ($ENV{'REQUEST_METHOD'} eq "POST") {
+ post_service_request($req);
+} elsif ($req -> param('services')) {
+ get_service_discovery($req);
+} elsif ($RUN_FAKE_INSERT_TEST) {
+ # allow a GET to make an insert, for testing (from the commandnd line!)
+ print "Running fake insert test... returned: " . get_FAKE_INSERT();
+ print "\nSee $OUT_FILENAME for data" if $TESTING_WRITE_TO_FILE;
+ print "\n";
+} else {
+ get_service_requests($req);
+}
+
+#----------------------------------------------------
+# post_service_request
+# accepts an incoming service request
+# If everything goes well, it puts it in the database and
+# returns the PEM ID to the caller
+#----------------------------------------------------
+sub post_service_request {
+ my $req = shift;
+ my %data;
+ my $pem_id = 0;
+
+ foreach (values %F) {
+ $data{$_} = $req -> param($_);
+ $data{$_} =~ s/^\s+|\s+$//g; # trim
+ }
+
+ error_and_exit(CODE_OR_ID_NOT_PROVIDED, "missing service code (Open311 requires one)")
+ unless $data{$F{SERVICE_CODE}};
+ error_and_exit(GENERAL_SERVICE_ERROR, "the service code you provided ($data{$F{SERVICE_CODE}}) was not recognised by this server")
+ unless service_exists($data{$F{SERVICE_CODE}});
+ error_and_exit(GENERAL_SERVICE_ERROR, "no address or long-lat provided")
+ unless ( (is_longlat($data{$F{LONG}}) && is_longlat($data{$F{LAT}})) || $data{$F{ADDRESS_STRING}} );
+
+ $pem_id = insert_into_pem(\%data);
+
+ if (! $pem_id) {
+ error_and_exit(FATAL_ERROR, $data{$ERR_MSG} || "failed to get PEM ID");
+ } else {
+ print <<XML;
+Content-type: text/xml
+
+<?xml version="1.0" encoding="utf-8"?>
+<service_requests>
+ <request>
+ <service_request_id>$pem_id</service_request_id>
+ </request>
+</service_requests>
+XML
+ }
+}
+
+#------------------------------------------------------------------
+# error_and_exit
+# args: HTTP status code, error message
+# Sends out the HTTP status code and message
+# and temrinates execution
+#------------------------------------------------------------------
+sub error_and_exit {
+ my ($status, $msg) = @_;
+ print "Status: $status $msg\n\n$msg\n";
+ exit;
+}
+
+#------------------------------------------------------------------
+# is_longlat
+# returns true if this looks like a long/lat value
+#------------------------------------------------------------------
+sub is_longlat {
+ return $_[0] =~ /^-?\d+\.\d+$/o? 1 : 0;
+}
+
+#------------------------------------------------------------------
+# get_db_connection
+# no args: uses globals, possibly read from config
+# returns handle for the connection (otherwise terminates)
+#------------------------------------------------------------------
+sub get_db_connection {
+ return DBI->connect( "dbi:Oracle:host=$DB_HOST;sid=$ORACLE_SID;port=$DB_PORT", $USERNAME, $PASSWORD )
+ or error_and_exit(FATAL_ERROR, "failed to connect to database: " . $DBI::errstr, "");
+}
+
+#------------------------------------------------------------------
+# service_exists
+# lookup the service code, to check that it exists
+# SELECT det_code, det_name FROM higatlas.doc_enquiry_types WHERE
+# det_dtp_code = 'REQS' AND det_dcl_code ='SERV' AND det_con_id=1
+# Actually, FMS is expected to be sending good codes because they
+# come from here anyway, and are expected to be stable. But could
+# cache and check... probably overkill since DB insert will probably
+# throw the error anyway.
+#------------------------------------------------------------------
+sub service_exists {
+ my $service_code = shift;
+ return 1;
+}
+
+#------------------------------------------------------------------
+# dump_to_file
+# args: ref to hash of data
+# for testing, log the incoming data into a local file
+# NB throws a fatal error
+#------------------------------------------------------------------
+sub dump_to_file {
+ my $h = shift; # href to data hash
+ if (open (OUTFILE, ">$OUT_FILENAME")) {
+ print OUTFILE "Data dump: " . gmtime() . "\n" . '-' x 64 . "\n\n";
+ foreach (sort keys %$h) {
+ print OUTFILE "$_ => " . $$h{$_} . "\n";
+ }
+ print OUTFILE "\n\n" . '-' x 64 . "\n[end]\n";
+ close OUTFILE;
+ $$h{$ERR_MSG} = "NB did not write to DB (see $OUT_FILENAME instead: switch off \$TESTING_WRITE_TO_FILE to stop this)";
+ } else {
+ $$h{$ERR_MSG} = "failed to write to outfile ($!)";
+ }
+ return 0; # test always throws an error so no risk of production confusion!
+}
+
+#------------------------------------------------------------------
+# insert_into_pem
+# args: hashref to data hash
+# returns PEM id of the new record (or passes an error message
+# into the data hash if no id is available)
+#------------------------------------------------------------------
+sub insert_into_pem {
+ my $h = shift; # href to data hash
+
+ my $pem_id;
+ my $error_value;
+ my $error_product;
+
+ # set specifc vars up where further processing on them might be needed:
+ my $undef = undef;
+ my $status = $$h{$F{STATUS}};
+ my $service_code = $$h{$F{SERVICE_CODE}};
+ my $description = $$h{$F{DESCRIPTION}};
+ my $media_url = $$h{$F{MEDIA_URL}};
+ if ($media_url) {
+ # don't put URL for full images into the database (because they're too big to see on a Blackberry)
+ $media_url =~ s/\.full(\.jpe?g)$/$1/;
+ $description .= ($STRIP_CONTROL_CHARS ne 'ruthless'? "\n\n":" ") . "Photo: $media_url";
+ }
+ my $location = $$h{$F{CLOSEST_ADDRESS}};
+ if ($location) {
+ # strip out everything apart from "Nearest" preamble
+ $location=~s/(Nearest road)[^:]+:/$1:/;
+ $location=~s/(Nearest postcode)[^:]+:(.*?)(\(\w+ away\))?\s*(\n|$)/$1: $2/;
+ }
+
+ my %bindings;
+ # comments here are suggested values
+ # field lengths are from OCC's Java portlet
+ # fixed values
+ $bindings{":ce_cat"} = 'REQS'; # or REQS ?
+ $bindings{":ce_class"} = 'SERV'; # 'FRML' ?
+ $bindings{":ce_contact_type"} = 'ENQUIRER'; # 'ENQUIRER'
+ $bindings{":ce_status_code"} = 'RE'; # RE=received (?)
+ $bindings{":ce_compl_user_type"}= 'USER'; # 'USER'
+
+ # ce_incident_datetime is *not* an optional param, but FMS isn't sending it at the moment
+ $bindings{":ce_incident_datetime"}=$$h{$F{REQUESTED_DATETIME}} || Time::Piece->new->strftime('%Y-%m-%d %H:%M');
+
+ # especially FMS-specific:
+ $bindings{":ce_source"} = "FMS"; # important, and specific to this script!
+ $bindings{":ce_doc_reference"} = $$h{$F{FMS_ID}}; # FMS id
+ $bindings{":ce_enquiry_type"} = $service_code;
+
+ # incoming data
+ $bindings{":ce_x"} = $$h{$F{EASTING}};
+ $bindings{":ce_y"} = $$h{$F{NORTHING}};
+ $bindings{":ce_forename"} = strip($$h{$F{FIRST_NAME}}, 30); # 'CLIFF'
+ $bindings{":ce_surname"} = strip($$h{$F{LAST_NAME}}, 30); # 'STEWART'
+ $bindings{":ce_work_phone"} = strip($$h{$F{PHONE}}, 25); # '0117 600 4200'
+ $bindings{":ce_email"} = strip($$h{$F{EMAIL}}, 50); # 'info@exor.co.uk'
+ $bindings{":ce_description"} = strip($description, 2000, $F{DESCRIPTION}); # 'Large Pothole'
+
+ # nearest address guesstimate
+ $bindings{":ce_location"} = strip($location, 254);
+
+ if ($TESTING_WRITE_TO_FILE) {
+ return dump_to_file(\%bindings);
+ }
+
+ # everything ready: now put it into the database
+ my $dbh = get_db_connection();
+
+ my $sth = $dbh->prepare(q#
+ BEGIN
+ PEM.create_enquiry(
+ ce_cat => :ce_cat,
+ ce_class => :ce_class,
+ ce_forename => :ce_forename,
+ ce_surname => :ce_surname,
+ ce_contact_type => :ce_contact_type,
+ ce_location => :ce_location,
+ ce_work_phone => :ce_work_phone,
+ ce_email => :ce_email,
+ ce_description => :ce_description,
+ ce_enquiry_type => :ce_enquiry_type,
+ ce_source => :ce_source,
+ ce_incident_datetime => to_Date(:ce_incident_datetime,'YYYY-MM-DD HH24:MI'),
+ ce_x => :ce_x,
+ ce_y => :ce_y,
+ ce_doc_reference => :ce_doc_reference,
+ ce_status_code => :ce_status_code,
+ ce_compl_user_type => :ce_compl_user_type,
+ error_value => :error_value,
+ error_product => :error_product,
+ ce_doc_id => :ce_doc_id);
+ END;
+#);
+
+ foreach my $name (sort keys %bindings) {
+ next if grep {$name eq $_} (':error_value', ':error_product', ':ce_doc_id'); # return values (see below)
+ $sth->bind_param(
+ $name,
+ $bindings{$name},
+ $PEM_BOUND_VAR_TYPES{$name} || ORA_VARCHAR2
+ );
+ }
+ # return values are bound explicitly here:
+ $sth->bind_param_inout(":error_value", \$error_value, 12); #> l_ERROR_VALUE # number
+ $sth->bind_param_inout(":error_product", \$error_product, 10); #> l_ERROR_PRODUCT (will always be 'DOC')
+ $sth->bind_param_inout(":ce_doc_id", \$pem_id, 12); #> l_ce_doc_id # number
+
+ # not used, but from the example docs, for reference
+ # $sth->bind_param(":ce_contact_title", $undef); # 'MR'
+ # $sth->bind_param(":ce_postcode", $undef); # 'BS11EJ' NB no spaces, upper case
+ # $sth->bind_param(":ce_building_no", $undef); # '1'
+ # $sth->bind_param(":ce_building_name", $undef); # 'CLIFTON HEIGHTS'
+ # $sth->bind_param(":ce_street", $undef); # 'HIGH STREET'
+ # $sth->bind_param(":ce_town", $undef); # 'BRSITOL'
+ # $sth->bind_param(":ce_enquiry_type", $undef); # 'CD' , ce_source => 'T'
+ # $sth->bind_param(":ce_cpr_id", $undef); # '5' (priority)
+ # $sth->bind_param(":ce_rse_he_id", $undef); #> nm3net.get_ne_id('1200D90970/09001','L')
+ # $sth->bind_param(":ce_compl_target", $undef); # '08-JAN-2004'
+ # $sth->bind_param(":ce_compl_corresp_date",$undef); # '02-JAN-2004'
+ # $sth->bind_param(":ce_compl_corresp_deliv_date", $undef); # '02-JAN-2004'
+ # $sth->bind_param(":ce_resp_of", $undef); # 'GBOWLER'
+ # $sth->bind_param(":ce_hct_vip", $undef); # 'CO'
+ # $sth->bind_param(":ce_hct_home_phone", $undef); # '0117 900 6201'
+ # $sth->bind_param(":ce_hct_mobile_phone", $undef); # '07111 1111111'
+ # $sth->bind_param(":ce_compl_remarks", $undef); # remarks (notes) max 254 char
+
+ $sth->execute();
+ $dbh->disconnect;
+
+ # if error, maybe need to look it up:
+ # error_value is the index HER_NO in table HIG_ERRORS, which has messages
+ # actually err_product not helpful (wil always be "DOC")
+ $$h{$ERR_MSG} = "$error_value $error_product" if ($error_value || $error_product);
+
+ return $pem_id;
+}
+
+#------------------------------------------------------------------
+# strip
+# args: data, max-length, field-name
+# Trims, strips control chars, truncates to max-length
+# Field-name only matters for description field
+#------------------------------------------------------------------
+sub strip {
+ my ($s, $max_len, $field_name) = @_;
+ if ($STRIP_CONTROL_CHARS) {
+ if ($STRIP_CONTROL_CHARS eq 'ruthless') {
+ $s =~ s/[[:cntrl:]]/ /g; # strip all control chars, simples
+ } elsif ($STRIP_CONTROL_CHARS eq 'desc') {
+ if ($field_name eq $F{DESCRIPTION}) {
+ $s =~ s/[^\t\n[:^cntrl:]]/ /g; # leave tabs and newlines
+ } else {
+ $s =~ s/[[:cntrl:]]/ /g; # strip all control chars, simples
+ }
+ } else {
+ $s =~ s/[^\t\n[:^cntrl:]]/ /g; # leave tabs and newlines
+ }
+ }
+ from_to($s, 'utf8', 'Windows-1252') if $ENCODE_TO_WIN1252;
+ return $max_len? substr($s, 0, 2000) : $s;
+}
+
+#------------------------------------------------------------------
+# get_service_requests
+# Strictly speaking, Open311 would expect the GET request for service
+# requests to respond with all service requests (within a specified
+# period). But as we're not using that, do a service discovery
+# instead.
+#------------------------------------------------------------------
+sub get_service_requests {
+ # error_and_exit(BAD_METHOD, "sorry, currently only handling incoming Open311 service requests: use POST method");
+ get_service_discovery(); # for now
+}
+
+#------------------------------------------------------------------
+# get_FAKE_INSERT
+# for testing off command line, force the data
+#------------------------------------------------------------------
+sub get_FAKE_INSERT {
+ my %fake_data = (
+ $F{'DESCRIPTION'} => 'Testing, description: A acute (requires Latin-1): [á] '
+ . ' pound sign (requires WinLatin-1): [£] omega tonos (requires UTF-8): [ώ]',
+ $F{'EASTING'} => '45119',
+ $F{'EMAIL'} => 'email@example.com',
+ $F{'FIRST_NAME'} => 'Dave',
+ $F{'FMS_ID'} => '1012',
+ $F{'LAST_NAME'} => 'Test',
+ $F{'LAT'} => '51.756741605999',
+ $F{'LONG'} => '-1.2596387532192',
+ $F{'NORTHING'} => '206709',
+ $F{'SERVICE_CODE'} => 'OT',
+ $F{'MEDIA_URL'} => 'http://www.example.com/pothole.jpg',
+ $F{'CLOSEST_ADDRESS'} => <<TEXT
+Nearest road to the pin placed on the map (automatically generated by Bing Maps): St Giles, Oxford, OX1 3
+
+Nearest postcode to the pin placed on the map (automatically generated): OX1 2LA (46m away)
+TEXT
+ );
+ return insert_into_pem(\%fake_data)
+}
+
+#------------------------------------------------------------------
+# get_service_discovery
+# Although not really implementing this, use it as a test to read the
+# db and confirm connectivity.
+#------------------------------------------------------------------
+sub get_service_discovery {
+ my $dbh = get_db_connection();
+ my $ary_ref = $dbh->selectall_arrayref(qq(select det_code, det_name from higatlas.doc_enquiry_types where det_dtp_code = 'REQS' AND det_dcl_code='SERV' and det_con_id=1));
+ # rough and ready XML dump now (should use XML Simple to build/escape properly!)
+ my $xml = "";
+ foreach my $row(@{$ary_ref}) {
+ if (defined $row) {
+ my ($code, $name) = @$row;
+ $xml.= <<XML;
+ <service>
+ <service_code>$code</service_code>
+ <metadata>false</metadata>
+ <type>realtime</type>
+ <keywords/>
+ <group/>
+ <service_name>$name</service_name>
+ <description/>
+ </service>
+XML
+ }
+ }
+ print <<XML;
+Content-type: text/xml
+
+<?xml version="1.0" encoding="utf-8"?>
+<services>
+$xml
+</services>
+XML
+}
+
+#------------------------------------------------------------------
+# get_pem_field_types
+# return hash of types by field name: any not explicitly set here
+# can be defaulted to VARCHAR2
+#------------------------------------------------------------------
+sub get_pem_field_types {
+ return (
+ ':ce_incident_datetime' => ORA_DATE,
+ ':ce_x' => ORA_NUMBER,
+ ':ce_y' => ORA_NUMBER,
+ ':ce_date_expires' => ORA_DATE,
+ ':ce_issue_number' => ORA_NUMBER,
+ ':ce_status_date' => ORA_DATE,
+ ':ce_compl_ack_date' => ORA_DATE,
+ ':ce_compl_peo_date' => ORA_DATE,
+ ':ce_compl_target' => ORA_DATE,
+ ':ce_compl_complete' => ORA_DATE,
+ ':ce_compl_from' => ORA_DATE,
+ ':ce_compl_to' => ORA_DATE,
+ ':ce_compl_corresp_date' => ORA_DATE,
+ ':ce_compl_corresp_deliv_date' => ORA_DATE,
+ ':ce_compl_no_of_petitioners' => ORA_NUMBER,
+ ':ce_compl_est_cost' => ORA_NUMBER,
+ ':ce_compl_adv_cost' => ORA_NUMBER,
+ ':ce_compl_act_cost' => ORA_NUMBER,
+ ':ce_compl_follow_up1' => ORA_DATE,
+ ':ce_compl_follow_up2' => ORA_DATE,
+ ':ce_compl_follow_uo3' => ORA_DATE,
+ ':ce_date_time_arrived' => ORA_DATE,
+ ':error_value' => ORA_NUMBER,
+ ':ce_doc_id' => ORA_NUMBER,
+ )
+}
diff --git a/bin/problem-creation-graph b/bin/problem-creation-graph
index 6692ae724..b96d45540 100755
--- a/bin/problem-creation-graph
+++ b/bin/problem-creation-graph
@@ -26,12 +26,12 @@ else
DATE="2007-02-01"
fi
-SOURCEA=/tmp/bci-creation-rate-graph-data-$RANDOM$RANDOM
-SOURCEB=/tmp/bci-creation-rate-graph-data-$RANDOM$RANDOM
-SOURCEC=/tmp/bci-creation-rate-graph-data-$RANDOM$RANDOM
-SOURCED=/tmp/bci-creation-rate-graph-data-$RANDOM$RANDOM
-SOURCEE=/tmp/bci-creation-rate-graph-data-$RANDOM$RANDOM
-GPSCRIPT=/tmp/bci-creation-rate-graph-script-$RANDOM$RANDOM
+SOURCEA=/tmp/fms-creation-rate-graph-data-$RANDOM$RANDOM
+SOURCEB=/tmp/fms-creation-rate-graph-data-$RANDOM$RANDOM
+SOURCEC=/tmp/fms-creation-rate-graph-data-$RANDOM$RANDOM
+SOURCED=/tmp/fms-creation-rate-graph-data-$RANDOM$RANDOM
+SOURCEE=/tmp/fms-creation-rate-graph-data-$RANDOM$RANDOM
+GPSCRIPT=/tmp/fms-creation-rate-graph-script-$RANDOM$RANDOM
# where status in ('draft')
@@ -104,6 +104,6 @@ END
#echo "gpscript $GPSCRIPT"
export GDFONTPATH=/usr/share/fonts/truetype/ttf-bitstream-vera
-gnuplot < $GPSCRIPT > fixmystreet/web/bci-live-creation$EXTENSION 2>/dev/null
+gnuplot < $GPSCRIPT > fixmystreet/web/fms-live-creation$EXTENSION 2>/dev/null
diff --git a/bin/problems-filed-graph b/bin/problems-filed-graph
index 8addacd62..e5946b078 100755
--- a/bin/problems-filed-graph
+++ b/bin/problems-filed-graph
@@ -20,8 +20,8 @@ source fixmystreet/commonlib/shlib/deployfns
read_conf fixmystreet/conf/general.yml
-SOURCEO=/tmp/bci-report-rate-graph-data-nonwmc-$RANDOM$RANDOM
-GPSCRIPT=/tmp/bci-report-rate-graph-script-$RANDOM$RANDOM
+SOURCEO=/tmp/fms-report-rate-graph-data-nonwmc-$RANDOM$RANDOM
+GPSCRIPT=/tmp/fms-report-rate-graph-script-$RANDOM$RANDOM
echo "select
date(created), count(*)
@@ -57,5 +57,5 @@ END
#echo "gpscript $GPSCRIPT"
export GDFONTPATH=/usr/share/fonts/truetype/ttf-bitstream-vera
-gnuplot < $GPSCRIPT > fixmystreet/web/bci-live-line$EXTENSION 2>/dev/null
+gnuplot < $GPSCRIPT > fixmystreet/web/fms-live-line$EXTENSION 2>/dev/null
diff --git a/bin/rotate-photos b/bin/rotate-photos
index faf2748e6..31a60ff6c 100755
--- a/bin/rotate-photos
+++ b/bin/rotate-photos
@@ -16,6 +16,8 @@ use FindBin;
use lib "$FindBin::Bin/../perllib";
use lib "$FindBin::Bin/../commonlib/perllib";
+use Digest::SHA1 qw(sha1_hex);
+
use Utils;
use mySociety::Config;
use mySociety::DBHandle qw(dbh select_all);
@@ -36,17 +38,27 @@ my $r = select_all("select id, photo from problem where service='iPhone'");
foreach (@$r) {
my $id = $_->{id};
my $photo = $_->{photo};
- my ($fh, $filename) = mySociety::TempFiles::named_tempfile('.jpeg');
- print $fh $photo;
- close $fh;
- my $out = `jhead -autorot $filename`;
- if ($out) {
- open(FP, $filename) or die $!;
- $photo = join('', <FP>);
- close FP;
- Utils::workaround_pg_bytea("update problem set photo=? where id=?", 1, $photo, $id);
- dbh()->commit();
+
+ if (length($photo) == 40) {
+ # If photo field contains a hash
+ my $filename = mySociety::Config::get('UPLOAD_DIR') . "$photo.jpeg";
+ `jhead -autorot $filename`;
+ } else {
+ my ($fh, $filename) = mySociety::TempFiles::named_tempfile('.jpeg');
+ print $fh $photo;
+ close $fh;
+ my $out = `jhead -autorot $filename`;
+ if ($out) {
+ open(FP, $filename) or die $!;
+ $photo = join('', <FP>);
+ close FP;
+ my $fileid = sha1_hex($photo);
+ rename $filename, mySociety::Config::get('UPLOAD_DIR') . "$fileid.jpeg";
+ dbh()->do('UPDATE problem SET photo=? WHERE id=?', {}, $fileid, $id);
+ dbh()->commit();
+ } else {
+ unlink $filename;
+ }
}
- unlink $filename;
}
diff --git a/bin/send-comments b/bin/send-comments
index b60c46e5d..24b436ac8 100755
--- a/bin/send-comments
+++ b/bin/send-comments
@@ -41,6 +41,7 @@ my $councils = FixMyStreet::App->model('DB::Open311Conf')->search( {
} );
while ( my $council = $councils->next ) {
+ my $use_extended = 0;
my $comments = FixMyStreet::App->model('DB::Comment')->search( {
'me.whensent' => undef,
'me.external_id' => undef,
@@ -56,21 +57,46 @@ while ( my $council = $councils->next ) {
}
);
+ if ( $council->area_id == 2482 ) {
+ $use_extended = 1;
+ }
+
my %open311_conf = (
endpoint => $council->endpoint,
jurisdiction => $council->jurisdiction,
api_key => $council->api_key,
+ use_extended_updates => $use_extended,
);
+
if ( $council->send_extended_statuses ) {
$open311_conf{extended_statuses} = 1;
}
my $o = Open311->new( %open311_conf );
+ if ( $council->area_id =~ /2482/ ) {
+ my $endpoints = $o->endpoints;
+ $endpoints->{update} = 'update.xml';
+ $endpoints->{service_request_updates} = 'update.xml';
+ $o->endpoints( $endpoints );
+ }
+
while ( my $comment = $comments->next ) {
my $cobrand = FixMyStreet::Cobrand->get_class_for_moniker($comment->cobrand)->new();
+ # actually this should be OK for any devolved endpoint if original Open311->can_be_devolved, presumably
+ if ( $cobrand->moniker eq "fixmybarangay") {
+ my $sender = $cobrand->get_council_sender( $council->area_id, undef, $comment->problem->category );
+ my $config = $sender->{config};
+ $o = Open311->new(
+ endpoint => $config->endpoint,
+ jurisdiction => $config->jurisdiction,
+ api_key => $config->api_key,
+ use_extended_updates => 1, # FMB uses extended updates
+ );
+ }
+
if ( $comment->send_fail_count ) {
next if bromley_retry_timeout( $comment );
}
diff --git a/bin/site-specific-install.sh b/bin/site-specific-install.sh
new file mode 100644
index 000000000..6ebac7970
--- /dev/null
+++ b/bin/site-specific-install.sh
@@ -0,0 +1,53 @@
+#!/bin/sh
+
+PARENT_SCRIPT_URL=https://github.com/mysociety/commonlib/blob/master/bin/install-site.sh
+
+misuse() {
+ echo The variable $1 was not defined, and it should be.
+ echo This script should not be run directly - instead, please run:
+ echo $PARENT_SCRIPT_URL
+ exit 1
+}
+
+# Strictly speaking we don't need to check all of these, but it might
+# catch some errors made when changing install-site.sh
+
+[ -z "$DIRECTORY" ] && misuse DIRECTORY
+[ -z "$UNIX_USER" ] && misuse UNIX_USER
+[ -z "$REPOSITORY" ] && misuse REPOSITORY
+[ -z "$REPOSITORY_URL" ] && misuse REPOSITORY_URL
+[ -z "$BRANCH" ] && misuse BRANCH
+[ -z "$SITE" ] && misuse SITE
+[ -z "$DEFAULT_SERVER" ] && misuse DEFAULT_SERVER
+[ -z "$HOST" ] && misuse HOST
+[ -z "$DISTRIBUTION" ] && misuse DISTRIBUTION
+[ -z "$VERSION" ] && misuse VERSION
+
+install_nginx
+
+install_website_packages
+
+su -l -c "touch '$DIRECTORY/admin-htpasswd'" "$UNIX_USER"
+
+add_website_to_nginx
+
+add_postgresql_user
+
+su -l -c "$REPOSITORY/bin/install-as-user '$UNIX_USER' '$HOST' '$DIRECTORY'" "$UNIX_USER"
+
+install_sysvinit_script
+
+if [ $DEFAULT_SERVER = true ] && [ x != x$EC2_HOSTNAME ]
+then
+ # If we're setting up as the default on an EC2 instance,
+ # make sure the ec2-rewrite-conf script is called from
+ # /etc/rc.local
+ overwrite_rc_local
+fi
+
+# Tell the user what to do next:
+
+echo Installation complete - you should now be able to view the site at:
+echo http://$HOST/
+echo Or you can run the tests by switching to the "'$UNIX_USER'" user and
+echo running: $REPOSITORY/bin/cron-wrapper prove -r t
diff --git a/carton.lock b/carton.lock
index cdca29bff..2d284b099 100644
--- a/carton.lock
+++ b/carton.lock
@@ -13615,6 +13615,84 @@
"target" : "Encode::Locale",
"version" : "1.02"
},
+ "Error" : {
+ "dist" : "Error-0.17018",
+ "module" : "Error",
+ "mymeta" : {
+ "abstract" : "Error/exception handling in an OO-ish way",
+ "author" : [
+ "Shlomi Fish <shlomif@iglu.org.il>"
+ ],
+ "dynamic_config" : 0,
+ "generated_by" : "Module::Build version 0.4002, CPAN::Meta::Converter version 2.112150",
+ "license" : [
+ "perl_5"
+ ],
+ "meta-spec" : {
+ "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
+ "version" : "2"
+ },
+ "name" : "Error",
+ "prereqs" : {
+ "configure" : {
+ "requires" : {
+ "Module::Build" : "0.38"
+ }
+ },
+ "runtime" : {
+ "requires" : {
+ "Scalar::Util" : 0,
+ "perl" : "v5.6.0",
+ "warnings" : 0
+ }
+ }
+ },
+ "provides" : {
+ "Error" : {
+ "file" : "lib/Error.pm",
+ "version" : "0.17018"
+ },
+ "Error::Simple" : {
+ "file" : "lib/Error.pm",
+ "version" : "0.17018"
+ },
+ "Error::WarnDie" : {
+ "file" : "lib/Error.pm",
+ "version" : 0
+ },
+ "Error::subs" : {
+ "file" : "lib/Error.pm",
+ "version" : 0
+ }
+ },
+ "release_status" : "stable",
+ "resources" : {
+ "license" : [
+ "http://dev.perl.org/licenses/"
+ ]
+ },
+ "version" : "0.17018"
+ },
+ "name" : "Error",
+ "pathname" : "S/SH/SHLOMIF/Error-0.17018.tar.gz",
+ "provides" : {
+ "Error" : {
+ "file" : "Error.pm",
+ "version" : "0.17018"
+ },
+ "Error::Simple" : {
+ "file" : "Error.pm",
+ "version" : "0.17018"
+ },
+ "Error::WarnDie" : {
+ "file" : "Error.pm"
+ },
+ "Error::subs" : {
+ "file" : "Error.pm"
+ }
+ },
+ "version" : "0.17018"
+ },
"Eval::Closure" : {
"dist" : "Eval-Closure-0.06",
"mymeta" : {
@@ -14600,6 +14678,52 @@
},
"version" : "0.22"
},
+ "File::Copy::Recursive" : {
+ "dist" : "File-Copy-Recursive-0.38",
+ "module" : "File::Copy::Recursive",
+ "mymeta" : {
+ "abstract" : "unknown",
+ "author" : [
+ "unknown"
+ ],
+ "dynamic_config" : 0,
+ "generated_by" : "ExtUtils::MakeMaker version 6.30, CPAN::Meta::Converter version 2.112150",
+ "license" : [
+ "unknown"
+ ],
+ "meta-spec" : {
+ "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
+ "version" : "2"
+ },
+ "name" : "File-Copy-Recursive",
+ "prereqs" : {
+ "build" : {
+ "requires" : {
+ "ExtUtils::MakeMaker" : 0
+ }
+ },
+ "runtime" : {
+ "requires" : {
+ "File::Copy" : 0,
+ "File::Spec" : 0
+ }
+ }
+ },
+ "release_status" : "stable",
+ "version" : "0.38",
+ "x_installdirs" : "site",
+ "x_version_from" : "Recursive.pm"
+ },
+ "name" : "File::Copy::Recursive",
+ "pathname" : "D/DM/DMUEY/File-Copy-Recursive-0.38.tar.gz",
+ "provides" : {
+ "File::Copy::Recursive" : {
+ "file" : "File/Copy/Recursive.pm",
+ "version" : "0.38"
+ }
+ },
+ "version" : "0.38"
+ },
"File::Find::Closures" : {
"dist" : "File-Find-Closures-1.09",
"mymeta" : {
@@ -17259,6 +17383,163 @@
"target" : "IO::Scalar",
"version" : "2.110"
},
+ "IO::Tty" : {
+ "dist" : "IO-Tty-1.10",
+ "module" : "IO::Pty",
+ "mymeta" : {
+ "abstract" : "Pseudo ttys and constants",
+ "author" : [
+ "Roland Giersig <RGiersig@cpan.org>"
+ ],
+ "dynamic_config" : 0,
+ "generated_by" : "ExtUtils::MakeMaker version 6.56, CPAN::Meta::Converter version 2.112150",
+ "license" : [
+ "perl_5"
+ ],
+ "meta-spec" : {
+ "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
+ "version" : "2"
+ },
+ "name" : "IO-Tty",
+ "no_index" : {
+ "directory" : [
+ "t",
+ "inc"
+ ]
+ },
+ "prereqs" : {
+ "build" : {
+ "requires" : {
+ "Test::More" : 0
+ }
+ },
+ "configure" : {
+ "requires" : {
+ "ExtUtils::MakeMaker" : 0
+ }
+ },
+ "runtime" : {
+ "requires" : {}
+ }
+ },
+ "release_status" : "stable",
+ "resources" : {
+ "repository" : {
+ "url" : "https://expectperl.svn.sourceforge.net/svnroot/expectperl/IO-Tty/trunk"
+ }
+ },
+ "version" : "1.10"
+ },
+ "name" : "IO::Tty",
+ "pathname" : "T/TO/TODDR/IO-Tty-1.10.tar.gz",
+ "provides" : {
+ "IO::Pty" : {
+ "file" : "IO/Pty.pm",
+ "version" : "1.10"
+ },
+ "IO::Tty" : {
+ "file" : "IO/Tty.pm",
+ "version" : "1.10"
+ },
+ "IO::Tty::Constant" : {
+ "file" : "IO/Tty/Constant.pm"
+ }
+ },
+ "version" : "1.10"
+ },
+ "IPC::Run" : {
+ "dist" : "IPC-Run-0.92",
+ "module" : "IPC::Run",
+ "mymeta" : {
+ "abstract" : "system() and background procs w/ piping, redirs, ptys (Unix, Win32)",
+ "author" : [
+ "Barrie Slaymaker <barries@slaysys.com>"
+ ],
+ "dynamic_config" : 0,
+ "generated_by" : "ExtUtils::MakeMaker version 6.62, CPAN::Meta::Converter version 2.120351, CPAN::Meta::Converter version 2.112150",
+ "license" : [
+ "perl_5"
+ ],
+ "meta-spec" : {
+ "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
+ "version" : "2"
+ },
+ "name" : "IPC-Run",
+ "no_index" : {
+ "directory" : [
+ "t",
+ "inc"
+ ]
+ },
+ "prereqs" : {
+ "build" : {
+ "requires" : {
+ "ExtUtils::MakeMaker" : 0
+ }
+ },
+ "configure" : {
+ "requires" : {
+ "ExtUtils::MakeMaker" : 0
+ }
+ },
+ "runtime" : {
+ "recommends" : {
+ "IO::Pty" : "1.08"
+ },
+ "requires" : {
+ "IO::Pty" : "1.08",
+ "Test::More" : "0.47"
+ }
+ }
+ },
+ "release_status" : "stable",
+ "resources" : {
+ "bugtracker" : {
+ "web" : "https://rt.cpan.org/NoAuth/Bugs.html?Dist=IPC-Run"
+ },
+ "license" : [
+ "http://dev.perl.org/licenses/"
+ ],
+ "repository" : {
+ "url" : "https://github.com/toddr/IPC-Run"
+ }
+ },
+ "version" : "0.92"
+ },
+ "name" : "IPC::Run",
+ "pathname" : "T/TO/TODDR/IPC-Run-0.92.tar.gz",
+ "provides" : {
+ "IPC::Run" : {
+ "file" : "IPC/Run.pm",
+ "version" : "0.92"
+ },
+ "IPC::Run::Debug" : {
+ "file" : "IPC/Run/Debug.pm",
+ "version" : "0.90"
+ },
+ "IPC::Run::IO" : {
+ "file" : "IPC/Run/IO.pm",
+ "version" : "0.90"
+ },
+ "IPC::Run::Timer" : {
+ "file" : "IPC/Run/Timer.pm",
+ "version" : "0.90"
+ },
+ "IPC::Run::Win32Helper" : {
+ "file" : "IPC/Run/Win32Helper.pm",
+ "version" : "0.90"
+ },
+ "IPC::Run::Win32IO" : {
+ "file" : "IPC/Run/Win32IO.pm",
+ "version" : "0.90"
+ },
+ "IPC::Run::Win32Pump" : {
+ "file" : "IPC/Run/Win32Pump.pm",
+ "version" : "0.90"
+ }
+ },
+ "version" : "0.92"
+ },
"IPC::Run3" : {
"dist" : "IPC-Run3-0.044",
"mymeta" : {
@@ -20056,6 +20337,68 @@
},
"version" : "1.08"
},
+ "Module::Signature" : {
+ "dist" : "Module-Signature-0.68",
+ "module" : "Module::Signature",
+ "mymeta" : {
+ "abstract" : "Module signature file manipulation",
+ "author" : [
+ "唐鳳 <cpan@audreyt.org>"
+ ],
+ "dynamic_config" : 0,
+ "generated_by" : "Module::Install version 1.00, CPAN::Meta::Converter version 2.112150",
+ "license" : [
+ "unknown"
+ ],
+ "meta-spec" : {
+ "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
+ "version" : "2"
+ },
+ "name" : "Module-Signature",
+ "no_index" : {
+ "directory" : [
+ "inc",
+ "t"
+ ]
+ },
+ "prereqs" : {
+ "build" : {
+ "requires" : {
+ "ExtUtils::MakeMaker" : "6.42",
+ "IPC::Run" : 0,
+ "Test::More" : 0
+ }
+ },
+ "configure" : {
+ "requires" : {
+ "ExtUtils::MakeMaker" : "6.42"
+ }
+ },
+ "runtime" : {
+ "requires" : {
+ "IO::Socket::INET" : 0,
+ "perl" : "5.005"
+ }
+ }
+ },
+ "release_status" : "stable",
+ "resources" : {
+ "repository" : {
+ "url" : "http://github.com/audreyt/module-signature"
+ }
+ },
+ "version" : "0.68"
+ },
+ "name" : "Module::Signature",
+ "pathname" : "F/FL/FLORA/Module-Signature-0.68.tar.gz",
+ "provides" : {
+ "Module::Signature" : {
+ "file" : "Module/Signature.pm",
+ "version" : "0.68"
+ }
+ },
+ "version" : "0.68"
+ },
"Moose" : {
"dist" : "Moose-2.0401",
"mymeta" : {
@@ -31355,6 +31698,52 @@
"target" : "XML::SAX::Base",
"version" : "1.08"
},
+ "XML::SAX::Expat" : {
+ "dist" : "XML-SAX-Expat-0.40",
+ "module" : "XML::SAX::Expat",
+ "mymeta" : {
+ "abstract" : "SAX Driver for Expat",
+ "author" : [
+ "Robin Berjon"
+ ],
+ "dynamic_config" : 0,
+ "generated_by" : "ExtUtils::MakeMaker version 6.44, CPAN::Meta::Converter version 2.112150",
+ "license" : [
+ "perl_5"
+ ],
+ "meta-spec" : {
+ "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
+ "version" : "2"
+ },
+ "name" : "XML-SAX-Expat",
+ "prereqs" : {
+ "build" : {
+ "requires" : {
+ "ExtUtils::MakeMaker" : 0
+ }
+ },
+ "runtime" : {
+ "requires" : {
+ "XML::NamespaceSupport" : "0.03",
+ "XML::Parser" : "2.27",
+ "XML::SAX" : "0.03",
+ "XML::SAX::Base" : "1.00"
+ }
+ }
+ },
+ "release_status" : "stable",
+ "version" : "0.40"
+ },
+ "name" : "XML::SAX::Expat",
+ "pathname" : "B/BJ/BJOERN/XML-SAX-Expat-0.40.tar.gz",
+ "provides" : {
+ "XML::SAX::Expat" : {
+ "file" : "XML/SAX/Expat.pm",
+ "version" : "0.40"
+ }
+ },
+ "version" : "0.40"
+ },
"XML::Simple" : {
"dist" : "XML-Simple-2.18",
"mymeta" : {
diff --git a/commonlib b/commonlib
-Subproject f81ec03692fac90792fc102f88f0afbf3d2f73b
+Subproject e832140e07bba7697726cae50ec0da26fb54788
diff --git a/conf/apache-vhost.conf.example b/conf/apache-vhost.conf.example
new file mode 100644
index 000000000..97a34fe66
--- /dev/null
+++ b/conf/apache-vhost.conf.example
@@ -0,0 +1,34 @@
+# An example Apache virtualhost configuration file.
+#
+# See our installation help at http://code.fixmystreet.com/
+
+<VirtualHost *:80>
+ ServerName fixmystreet.yourservername
+ DocumentRoot /home/yourname/fixmystreet/web/
+
+ # Pull in the specific config
+ Include /home/yourname/fixmystreet/conf/httpd.conf
+
+ <Directory /home/yourname/fixmystreet/web>
+ # You also need to enable cgi files to run as CGI scripts. For example:
+ # on production servers these are run under fastcgi
+ Options +ExecCGI
+ AddHandler cgi-script .cgi
+ AllowOverride None
+ </Directory>
+
+ <Location /admin>
+ #
+ # WARNING - enable auth here on production machine
+ #
+ </Location>
+
+ Alias /admin/ /home/yourname/fixmystreet/web-admin/
+
+ Alias /jslib/ /home/yourname/fixmystreet/commonlib/jslib/
+ <Location /jslib>
+ AddOutputFilter DEFLATE js
+ Header append Cache-Control "no-transform"
+ </Location>
+
+</VirtualHost>
diff --git a/conf/crontab.example b/conf/crontab.example
new file mode 100644
index 000000000..47c018573
--- /dev/null
+++ b/conf/crontab.example
@@ -0,0 +1,32 @@
+# Timed tasks for FixMyStreet.
+
+# This is an example crontab that you may want to use as a basis for
+# one on your own server. You should replace $FMS with the path to the
+# clone of the FixMyStreet repository that you are using. You should
+# also replace $LOCK_DIR with a writeable directory for the lock files.
+
+# Copyright (c) 2007 UK Citizens Online Democracy. All rights reserved.
+# Email: matthew@mysociety.org. WWW: http://www.mysociety.org/
+
+PATH=/usr/local/bin:/usr/bin:/bin
+
+# send-reports has three rows so that its 8am entry can be run with --verbose to send a morning summary of anything that's gone wrong
+5,10,15,20,25,30,35,40,45,50,55 * * * * "$FMS/commonlib/bin/run-with-lockfile.sh" -n "$FMS/send-reports.lock" "$FMS/bin/cron-wrapper send-reports" || echo "stalled?"
+0 0-7,9-23 * * * "$FMS/commonlib/bin/run-with-lockfile.sh" -n "$LOCK_DIR/send-reports.lock" "$FMS/bin/cron-wrapper send-reports" || echo "stalled?"
+0 8 * * * "$FMS/commonlib/bin/run-with-lockfile.sh" -n "$LOCK_DIR/send-reports.lock" "$FMS/bin/cron-wrapper send-reports --verbose" || echo "stalled?"
+
+2 * * * * "$FMS/commonlib/bin/run-with-lockfile.sh" -n "$LOCK_DIR/send-alerts.lock" "$FMS/bin/cron-wrapper send-alerts" || echo "stalled?"
+0,30 * * * * "$FMS/commonlib/bin/run-with-lockfile.sh" -n "$LOCK_DIR/send-questionnaires.lock" "$FMS/bin/cron-wrapper send-questionnaires" || echo "stalled?"
+5,10,15,20,25,30,35,40,45,50,55 * * * * "$FMS/commonlib/bin/run-with-lockfile.sh" -n "$LOCK_DIR/send-comments.lock" "$FMS/bin/cron-wrapper send-comments" || echo "stalled?"
+5,10,15,20,25,30,35,40,45,50,55 * * * * "$FMS/commonlib/bin/run-with-lockfile.sh" -n "$LOCK_DIR/fetch-comments.lock" "$FMS/bin/cron-wrapper fetch-comments" || echo "stalled?"
+
+0 0-7,9-23 * * * "$FMS/commonlib/bin/run-with-lockfile.sh" -n "$LOCK_DIR/open311-populate-service-list.lock" "$FMS/bin/cron-wrapper open311-populate-service-list" || echo "stalled?"
+0 8 * * * "$FMS/commonlib/bin/run-with-lockfile.sh" -n "$LOCK_DIR/open311-populate-service-list.lock" "$FMS/bin/cron-wrapper open311-populate-service-list --warn" || echo "stalled?"
+
+# Once an hour, update the all reports stats
+13 * * * * "$FMS/bin/cron-wrapper" update-all-reports
+
+# Once a day on all servers
+39 2 * * * "$FMS/bin/problems-filed-graph"
+43 2 * * * "$FMS/bin/problem-creation-graph"
+00 8 * * * "$FMS/bin/check-for-zombies" $UNIX_USER
diff --git a/conf/crontab.ugly b/conf/crontab.ugly
index 8b851eac2..5c6e92662 100644
--- a/conf/crontab.ugly
+++ b/conf/crontab.ugly
@@ -16,29 +16,31 @@ MAILTO=!!(*= $user *)!!@mysociety.org
# On only one server
!!(* if ($vhost eq 'reportemptyhomes.com') { *)!!
-5,10,15,20,25,30,35,40,45,50,55 * * * * !!(*= $user *)!! run-with-lockfile -n /data/vhost/!!(*= $vhost *)!!/send-reports.lock "/data/vhost/!!(*= $vhost *)!!/fixmystreet/bin/cron-wrapper send-reports" || echo "stalled?"
-0 0-11,13-23 * * * !!(*= $user *)!! run-with-lockfile -n /data/vhost/!!(*= $vhost *)!!/send-reports.lock "/data/vhost/!!(*= $vhost *)!!/fixmystreet/bin/cron-wrapper send-reports" || echo "stalled?"
-0 12 * * * !!(*= $user *)!! run-with-lockfile -n /data/vhost/!!(*= $vhost *)!!/send-reports.lock "/data/vhost/!!(*= $vhost *)!!/fixmystreet/bin/cron-wrapper send-reports --verbose" || echo "stalled?"
+*/5 * * * * !!(*= $user *)!! run-with-lockfile -n /data/vhost/!!(*= $vhost *)!!/send-reports.lock "/data/vhost/!!(*= $vhost *)!!/fixmystreet/bin/cron-wrapper send-reports --verbose" || echo "stalled?"
#2 * * * * !!(*= $user *)!! run-with-lockfile -n /data/vhost/!!(*= $vhost *)!!/send-alerts.lock "/data/vhost/!!(*= $vhost *)!!/fixmystreet/bin/cron-wrapper send-alerts" || echo "stalled?"
0,30 * * * * !!(*= $user *)!! run-with-lockfile -n /data/vhost/!!(*= $vhost *)!!/send-questionnaires.lock "/data/vhost/!!(*= $vhost *)!!/fixmystreet/bin/cron-wrapper send-questionnaires" || echo "stalled?"
-!!(* } elsif ($vhost eq 'bromley.test.mysociety.org') { *)!!
-*/2 * * * * !!(*= $user *)!! run-with-lockfile -n /data/vhost/!!(*= $vhost *)!!/send-reports.lock "/data/vhost/!!(*= $vhost *)!!/fixmystreet/bin/cron-wrapper send-reports" || echo "stalled?"
-2 * * * * !!(*= $user *)!! run-with-lockfile -n /data/vhost/!!(*= $vhost *)!!/send-alerts.lock "/data/vhost/!!(*= $vhost *)!!/fixmystreet/bin/cron-wrapper send-alerts" || echo "stalled?"
-0,30 * * * * !!(*= $user *)!! run-with-lockfile -n /data/vhost/!!(*= $vhost *)!!/send-questionnaires.lock "/data/vhost/!!(*= $vhost *)!!/fixmystreet/bin/cron-wrapper send-questionnaires" || echo "stalled?"
-*/2 * * * * !!(*= $user *)!! run-with-lockfile -n /data/vhost/!!(*= $vhost *)!!/send-comments.lock "/data/vhost/!!(*= $vhost *)!!/fixmystreet/bin/cron-wrapper send-comments" || echo "stalled?"
-*/2 * * * * !!(*= $user *)!! run-with-lockfile -n /data/vhost/!!(*= $vhost *)!!/fetch-comments.lock "/data/vhost/!!(*= $vhost *)!!/fixmystreet/bin/cron-wrapper fetch-comments" || echo "stalled?"
-0,30 * * * * !!(*= $user *)!! run-with-lockfile -n /data/vhost/!!(*= $vhost *)!!/open311-populate-service-list.lock "/data/vhost/!!(*= $vhost *)!!/fixmystreet/bin/cron-wrapper open311-populate-service-list" || echo "stalled?"
-!!(* } elsif (($vhost eq 'www.fixmystreet.com') || ($vhost eq 'integration-staging.fixmystreet.com')) { *)!!
+!!(* } elsif (($vhost eq 'www.fixmystreet.com') || ($vhost eq 'bromley.test.mysociety.org') || ($vhost eq 'barnet.fixmystreet.staging.mysociety.org') || ($vhost eq 'oxfordshire.fixmystreet.staging.mysociety.org') || ($vhost eq 'demo.fixmybarangay.com') || ($vhost eq 'www.fixmybarangay.com') || ($vhost eq 'stevenage.test.mysociety.org')) { *)!!
5,10,15,20,25,30,35,40,45,50,55 * * * * !!(*= $user *)!! run-with-lockfile -n /data/vhost/!!(*= $vhost *)!!/send-reports.lock "/data/vhost/!!(*= $vhost *)!!/fixmystreet/bin/cron-wrapper send-reports" || echo "stalled?"
-0 0-8,10,11,13,14,16,17,19-23 * * * !!(*= $user *)!! run-with-lockfile -n /data/vhost/!!(*= $vhost *)!!/send-reports.lock "/data/vhost/!!(*= $vhost *)!!/fixmystreet/bin/cron-wrapper send-reports" || echo "stalled?"
-0 9,12,15,18 * * * !!(*= $user *)!! run-with-lockfile -n /data/vhost/!!(*= $vhost *)!!/send-reports.lock "/data/vhost/!!(*= $vhost *)!!/fixmystreet/bin/cron-wrapper send-reports --verbose" || echo "stalled?"
+0 0-7,9-11,13-15,17-23 * * * !!(*= $user *)!! run-with-lockfile -n /data/vhost/!!(*= $vhost *)!!/send-reports.lock "/data/vhost/!!(*= $vhost *)!!/fixmystreet/bin/cron-wrapper send-reports" || echo "stalled?"
+0 8,12,16 * * * !!(*= $user *)!! run-with-lockfile -n /data/vhost/!!(*= $vhost *)!!/send-reports.lock "/data/vhost/!!(*= $vhost *)!!/fixmystreet/bin/cron-wrapper send-reports --verbose" || echo "stalled?"
2 * * * * !!(*= $user *)!! run-with-lockfile -n /data/vhost/!!(*= $vhost *)!!/send-alerts.lock "/data/vhost/!!(*= $vhost *)!!/fixmystreet/bin/cron-wrapper send-alerts" || echo "stalled?"
0,30 * * * * !!(*= $user *)!! run-with-lockfile -n /data/vhost/!!(*= $vhost *)!!/send-questionnaires.lock "/data/vhost/!!(*= $vhost *)!!/fixmystreet/bin/cron-wrapper send-questionnaires" || echo "stalled?"
5,10,15,20,25,30,35,40,45,50,55 * * * * !!(*= $user *)!! run-with-lockfile -n /data/vhost/!!(*= $vhost *)!!/send-comments.lock "/data/vhost/!!(*= $vhost *)!!/fixmystreet/bin/cron-wrapper send-comments" || echo "stalled?"
-5,10,15,20,25,30,35,40,45,50,55 * * * * !!(*= $user *)!! run-with-lockfile -n /data/vhost/!!(*= $vhost *)!!/fetch-comments.lock "/data/vhost/!!(*= $vhost *)!!/fixmystreet/bin/cron-wrapper fetch-comments" || echo "stalled?"
-0,30 * * * * !!(*= $user *)!! run-with-lockfile -n /data/vhost/!!(*= $vhost *)!!/open311-populate-service-list.lock "/data/vhost/!!(*= $vhost *)!!/fixmystreet/bin/cron-wrapper open311-populate-service-list" || echo "stalled?"
+5,10,15,20,25,30,35,40,45,50,55 0-7,9-23 * * * !!(*= $user *)!! run-with-lockfile -n /data/vhost/!!(*= $vhost *)!!/fetch-comments.lock "/data/vhost/!!(*= $vhost *)!!/fixmystreet/bin/cron-wrapper fetch-comments" || echo "stalled?"
+10,15,20,25,30,35,40,45,50,55 8 * * * !!(*= $user *)!! run-with-lockfile -n /data/vhost/!!(*= $vhost *)!!/fetch-comments.lock "/data/vhost/!!(*= $vhost *)!!/fixmystreet/bin/cron-wrapper fetch-comments" || echo "stalled?"
+5 8 * * * !!(*= $user *)!! run-with-lockfile -n /data/vhost/!!(*= $vhost *)!!/fetch-comments.lock "/data/vhost/!!(*= $vhost *)!!/fixmystreet/bin/cron-wrapper fetch-comments --verbose" || echo "stalled?"
+5 1 * * * !!(*= $user *)!! run-with-lockfile -n /data/vhost/!!(*= $vhost *)!!/fetch-comments.lock "/data/vhost/!!(*= $vhost *)!!/fixmystreet/bin/cron-wrapper fetch-comments-24hs" || echo "stalled?"
+
+30 * * * * !!(*= $user *)!! run-with-lockfile -n /data/vhost/!!(*= $vhost *)!!/open311-populate-service-list.lock "/data/vhost/!!(*= $vhost *)!!/fixmystreet/bin/cron-wrapper open311-populate-service-list" || echo "stalled?"
+0 0-7,9-23 * * * !!(*= $user *)!! run-with-lockfile -n /data/vhost/!!(*= $vhost *)!!/open311-populate-service-list.lock "/data/vhost/!!(*= $vhost *)!!/fixmystreet/bin/cron-wrapper open311-populate-service-list" || echo "stalled?"
+0 8 * * * !!(*= $user *)!! run-with-lockfile -n /data/vhost/!!(*= $vhost *)!!/open311-populate-service-list.lock "/data/vhost/!!(*= $vhost *)!!/fixmystreet/bin/cron-wrapper open311-populate-service-list --warn" || echo "stalled?"
+
+!!(* } elsif ($vhost eq 'seesomething.mysociety.org') { *)!!
+5,10,15,20,25,30,35,40,45,50,55 * * * * !!(*= $user *)!! run-with-lockfile -n /data/vhost/!!(*= $vhost *)!!/send-reports.lock "/data/vhost/!!(*= $vhost *)!!/fixmystreet/bin/cron-wrapper send-reports" || echo "stalled?"
+0 0-7,9-11,13-15,17-23 * * * !!(*= $user *)!! run-with-lockfile -n /data/vhost/!!(*= $vhost *)!!/send-reports.lock "/data/vhost/!!(*= $vhost *)!!/fixmystreet/bin/cron-wrapper send-reports" || echo "stalled?"
+0 8,12,16 * * * !!(*= $user *)!! run-with-lockfile -n /data/vhost/!!(*= $vhost *)!!/send-reports.lock "/data/vhost/!!(*= $vhost *)!!/fixmystreet/bin/cron-wrapper send-reports --verbose" || echo "stalled?"
!!(* } *)!!
# Once an hour, update the all reports stats
diff --git a/conf/general.yml-example b/conf/general.yml-example
index fd9ecad21..a8da589d1 100644
--- a/conf/general.yml-example
+++ b/conf/general.yml-example
@@ -22,6 +22,10 @@ BASE_URL: 'http://www.example.org'
EMAIL_DOMAIN: 'example.org'
CONTACT_EMAIL: 'team@example.org'
CONTACT_NAME: 'FixMyStreet'
+# Address used for emails you don't expect a reply to (e.g. confirmation
+# emails); can be same as CONTACT_EMAIL above, of course, if you don't have a
+# special address.
+DO_NOT_REPLY_EMAIL: 'do-not-reply@example.org'
# Whether this is a development site or not.
STAGING_SITE: 1
@@ -36,6 +40,10 @@ EXAMPLE_PLACES: [ 'High Street', 'Main Street' ]
LANGUAGES:
- 'en-gb,English,en_GB'
+# If you're running an installation that is being used in a different time zone
+# from the server, you can set the time zone here (standard time zone string)
+TIME_ZONE: ""
+
# File locations for uploaded photos and cached geocoding results.
UPLOAD_DIR: '../upload/'
GEO_CACHE: '../cache/'
@@ -65,8 +73,12 @@ MAPIT_TYPES: [ 'ZZZ' ]
# MAPIT_TYPES_CHILDREN: [ 'DIW', 'LBW', 'MTW', 'UTE', 'UTW', 'CED', 'COP', 'LGW' ]
MAPIT_TYPES_CHILDREN: ''
+# Which service to use to look up results from e.g. front page searches.
+# Possible choices are Google, Bing, or OSM (blank will use OSM by default).
+GEOCODER: ''
+
# If you wish to use Google Maps or Bing Maps Geocoding, get and put the
-# relevant key here. Without a key, geocoding will use OSM's Nominatim.
+# relevant key here.
GOOGLE_MAPS_API_KEY: ''
BING_MAPS_API_KEY: ''
@@ -127,9 +139,12 @@ GAZE_URL: 'http://gaze.mysociety.org/gaze'
# Should problem reports link to the council summary pages?
AREA_LINKS_FROM_PROBLEMS: '0'
-# Used to override the STAGING SERVER safety mechanism in send-reports
+# used to override the STAGING SERVER safety mechanism in send-reports
TESTING_COUNCILS: ''
+# if you're using Message Manager, include the URL here (see https://github.com/mysociety/message-manager/)
+MESSAGE_MANAGER_URL: ''
+
# -----------------------------------------------------------------------
# fixmystreet.com specific config variables. You won't need any of these.
@@ -139,4 +154,3 @@ LONDON_REPORTIT_KEY: ''
LONDON_REPORTIT_SECRET: ''
AUTH_SHARED_SECRET: ''
HEARFROMYOURMP_BASE_URL: ''
-
diff --git a/conf/httpd.conf-example b/conf/httpd.conf-example
index e7900161e..ab17dcec3 100644
--- a/conf/httpd.conf-example
+++ b/conf/httpd.conf-example
@@ -1,42 +1,10 @@
# Apache configuration for FixMyStreet.
#
-# Add lines something like this to your /etc/apache2/sites-enabled/fixmystreet -
-# replacing '/home/yourname/fixmystreet' with the path to your install
+# This file should be included in an Apache <VirtualHost> section. An
+# example of such a virtualhost configuration file can be found in the
+# file apache-vhost.conf.example in this directory.
#
-# # FixMyStreet
-# <VirtualHost *:80>
-# ServerName fixmystreet.yourservername
-# DocumentRoot /home/yourname/fixmystreet/web/
-#
-# # Pull in the specific config
-# Include /home/yourname/fixmystreet/conf/httpd.conf
-#
-# <Directory /home/yourname/fixmystreet/web>
-# # You also need to enable cgi files to run as CGI scripts. For example:
-# # on production servers these are run under fastcgi
-# Options +ExecCGI
-# AddHandler cgi-script .cgi
-# AllowOverride None
-# </Directory>
-#
-# <Location /admin>
-# #
-# # WARNING - enable auth here on production machine
-# #
-# Options +ExecCGI
-# AddHandler cgi-script .cgi
-# </Location>
-#
-# Alias /admin/ /home/yourname/fixmystreet/web-admin/
-#
-# Alias /jslib/ "/home/yourname/fixmystreet/commonlib/jslib/"
-#
-# </VirtualHost>
-#
-#
-# Copyright (c) 2011 UK Citizens Online Democracy. All rights reserved.
-# Email: team@mysociety.org
-# WWW: http://www.mysociety.org
+# See our installation help at http://code.fixmystreet.com/
RewriteEngine on
# RewriteLog /var/log/apache2/rewrite.log
diff --git a/conf/nginx.conf.example b/conf/nginx.conf.example
new file mode 100644
index 000000000..7b26afdbf
--- /dev/null
+++ b/conf/nginx.conf.example
@@ -0,0 +1,75 @@
+# An example configuration for running FixMyStreet under nginx. You
+# will also need to set up the FixMyStreet Catalyst FastCGI backend.
+# An example sysvinit script to help with this is shown given in the file
+# sysvinit-catalyst-fastcgi.example in this directory.
+#
+# See our installation help at http://code.fixmystreet.com/
+
+server {
+
+ access_log /var/www/fixmystreet/logs/access.log;
+ error_log /var/www/fixmystreet/logs/error.log;
+
+ listen 80;
+ root /var/www/fixmystreet/fixmystreet/web;
+ error_page 503 /down.html;
+
+ # Make sure that Javascript and CSS are compressed. (HTML is
+ # already compressed under the default configuration of the nginx
+ # package.)
+
+ gzip on;
+ gzip_disable "msie6";
+ gzip_types application/javascript application/x-javascript text/css;
+
+ # Set a long expiry time for CSS and Javascript, and prevent
+ # the mangling of Javascript by proxies:
+
+ location ~ \.css$ {
+ expires 10y;
+ }
+
+ location ~ \.js$ {
+ add_header Cache-Control no-transform;
+ expires 10y;
+ try_files $uri @catalyst;
+ }
+
+ # These rewrite rules are ported from the Apache configuration in
+ # conf/httpd.conf
+
+ rewrite ^/rss/council/([0-9]+)$ /rss/reports/$1 permanent;
+ rewrite ^/report$ /reports permanent;
+ rewrite '^/{/rss/(.*)}$' /rss/$1 permanent;
+ rewrite '^/reports/{/rss/(.*)}$' /rss/$1 permanent;
+ rewrite ^/alerts/?$ /alert permanent;
+
+ location /mapit {
+ proxy_pass http://mapit.mysociety.org/;
+ proxy_set_header X-Real-IP $remote_addr;
+ }
+
+ location /admin {
+ auth_basic "FixMyStreet admin interface";
+ auth_basic_user_file /var/www/fixmystreet/admin-htpasswd;
+ try_files $uri @catalyst;
+ }
+
+ location / {
+ if (-f $document_root/down.html) {
+ return 503;
+ }
+ try_files $uri @catalyst;
+ }
+
+ location /down.html {
+ internal;
+ }
+
+ location @catalyst {
+ include /etc/nginx/fastcgi_params;
+ fastcgi_param PATH_INFO $fastcgi_script_name;
+ fastcgi_param SCRIPT_NAME '';
+ fastcgi_pass 127.0.0.1:9000;
+ }
+}
diff --git a/conf/packages.ubuntu-precise b/conf/packages.ubuntu-precise
new file mode 100644
index 000000000..fc8a7d511
--- /dev/null
+++ b/conf/packages.ubuntu-precise
@@ -0,0 +1,16 @@
+make
+jhead
+liberror-perl
+liblocale-gettext-perl
+libsoap-lite-perl
+memcached
+perl
+perlmagick
+libmath-bigint-gmp-perl
+gettext
+libhaml-ruby
+postgresql-9.1
+postgresql-server-dev-9.1
+gnuplot
+ttf-bitstream-vera
+libexpat1-dev
diff --git a/conf/sysvinit.example b/conf/sysvinit.example
new file mode 100755
index 000000000..44424281b
--- /dev/null
+++ b/conf/sysvinit.example
@@ -0,0 +1,53 @@
+#! /bin/sh
+### BEGIN INIT INFO
+# Provides: application-catalyst-fixmystreet
+# Required-Start: $local_fs $network
+# Required-Stop: $local_fs $network
+# Default-Start: 2 3 4 5
+# Default-Stop: 0 1 6
+# Short-Description: Starts the FastCGI app server for the "FixMyStreet" site
+# Description: The FastCGI application server for the "FixMyStreet" site
+### END INIT INFO
+
+# This example sysvinit script is based on the helpful example here:
+# http://richard.wallman.org.uk/2010/02/howto-deploy-a-catalyst-application-using-fastcgi-and-nginx/
+
+PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
+SITE_HOME=/var/www/fixmystreet
+NAME=fixmystreet
+DESC="FixMyStreet app server"
+USER=fms
+
+echo $DAEMON
+test -f $DAEMON || exit 0
+
+set -e
+
+start_daemon() {
+ su -l -c "cd $SITE_HOME/fixmystreet && bin/cron-wrapper web/fixmystreet_app_fastcgi.cgi -d -l :9000 -n 2" $USER
+}
+
+stop_daemon() {
+ pkill -f perl-fcgi -u $USER || true
+}
+
+case "$1" in
+ start)
+ start_daemon
+ ;;
+ stop)
+ stop_daemon
+ ;;
+ reload|restart|force-reload)
+ stop_daemon
+ sleep 5
+ start_daemon
+ ;;
+ *)
+ N=/etc/init.d/$NAME
+ echo "Usage: $N {start|stop|reload|restart|force-reload}" >&2
+ exit 1
+ ;;
+esac
+
+exit 0
diff --git a/data/zurich/openlayers.zurich.cfg b/data/zurich/openlayers.zurich.cfg
new file mode 100644
index 000000000..7046384f2
--- /dev/null
+++ b/data/zurich/openlayers.zurich.cfg
@@ -0,0 +1,42 @@
+# This file includes the OpenLayers code that FixMyStreet currently uses.
+
+[first]
+
+[last]
+
+[include]
+# Have to include the renderers manually
+OpenLayers/Renderer/Canvas.js
+OpenLayers/Renderer/SVG.js
+OpenLayers/Renderer/VML.js
+OpenLayers/Strategy/Fixed.js
+OpenLayers/Strategy/BBOX.js
+OpenLayers/Control/ArgParser.js
+OpenLayers/Control/Attribution.js
+OpenLayers/Control/DragFeature.js
+OpenLayers/Control/Navigation.js
+OpenLayers/Control/PanZoom.js
+OpenLayers/Control/PinchZoom.js
+OpenLayers/Control/Permalink.js
+OpenLayers/Control/SelectFeature.js
+OpenLayers/Format/JSON.js
+OpenLayers/Format/KML.js
+OpenLayers/Handler/Click.js
+OpenLayers/Feature/Vector.js
+OpenLayers/Rule.js
+OpenLayers/Style.js
+OpenLayers/StyleMap.js
+OpenLayers/Geometry/Point.js
+OpenLayers/Protocol/HTTP.js
+OpenLayers/Layer/SphericalMercator.js # For 4326
+OpenLayers/Layer/Vector.js
+OpenLayers/Layer/XYZ.js
+OpenLayers/Popup/FramedCloud.js
+
+# Zurich things
+OpenLayers/Format/WMTSCapabilities/v1_0_0.js
+OpenLayers/Format/WMTSCapabilities.js
+OpenLayers/Layer/WMTS.js
+
+[exclude]
+
diff --git a/db/alert_types.sql b/db/alert_types.sql
index 4ebd33cf9..4116d29dc 100644
--- a/db/alert_types.sql
+++ b/db/alert_types.sql
@@ -17,7 +17,7 @@ insert into alert_type
item_title, item_link, item_description, template)
values ('new_problems', '', '',
'New problems on FixMyStreet', '/', 'The latest problems reported by users',
- 'problem', 'problem.state in (''confirmed'', ''investigating'', ''planned'', ''in progress'', ''fixed'', ''fixed - council'', ''fixed - user'', ''closed'')', 'created desc',
+ 'problem', 'problem.non_public = ''f'' and problem.state in (''confirmed'', ''investigating'', ''planned'', ''in progress'', ''fixed'', ''fixed - council'', ''fixed - user'', ''closed'')', 'created desc',
'{{title}}, {{confirmed}}', '/report/{{id}}', '{{detail}}', 'alert-problem');
-- New fixed problems anywhere on the site
@@ -28,7 +28,7 @@ insert into alert_type
item_title, item_link, item_description, template)
values ('new_fixed_problems', '', '',
'Problems recently reported fixed on FixMyStreet', '/', 'The latest problems reported fixed by users',
- 'problem', 'problem.state in (''fixed'', ''fixed - user'', ''fixed - council'')', 'lastupdate desc',
+ 'problem', 'problem.non_public = ''f'' and problem.state in (''fixed'', ''fixed - user'', ''fixed - council'')', 'lastupdate desc',
'{{title}}, {{confirmed}}', '/report/{{id}}', '{{detail}}', 'alert-problem');
-- New problems around a location
@@ -39,7 +39,7 @@ insert into alert_type
item_title, item_link, item_description, template)
values ('local_problems', '', '',
'New local problems on FixMyStreet', '/', 'The latest local problems reported by users',
- 'problem_find_nearby(?, ?, ?) as nearby,problem', 'nearby.problem_id = problem.id and problem.state in (''confirmed'', ''investigating'', ''planned'', ''in progress'', ''fixed'', ''fixed - council'', ''fixed - user'', ''closed'')', 'created desc',
+ 'problem_find_nearby(?, ?, ?) as nearby,problem', 'nearby.problem_id = problem.id and problem.non_public = ''f'' and problem.state in (''confirmed'', ''investigating'', ''planned'', ''in progress'', ''fixed'', ''fixed - council'', ''fixed - user'', ''closed'')', 'created desc',
'{{title}}, {{confirmed}}', '/report/{{id}}', '{{detail}}', 'alert-problem-nearby');
-- New problems around a location
@@ -50,7 +50,7 @@ insert into alert_type
item_title, item_link, item_description, template)
values ('local_problems_state', '', '',
'New local problems on FixMyStreet', '/', 'The latest local problems reported by users',
- 'problem_find_nearby(?, ?, ?) as nearby,problem', 'nearby.problem_id = problem.id and problem.state in (?)', 'created desc',
+ 'problem_find_nearby(?, ?, ?) as nearby,problem', 'nearby.problem_id = problem.id and problem.non_public = ''f'' and problem.state in (?)', 'created desc',
'{{title}}, {{confirmed}}', '/report/{{id}}', '{{detail}}', 'alert-problem-nearby');
-- New problems around a postcode
@@ -61,7 +61,7 @@ insert into alert_type
item_title, item_link, item_description, template)
values ('postcode_local_problems', '', '',
'New problems near {{POSTCODE}} on FixMyStreet', '/', 'The latest local problems reported by users',
- 'problem_find_nearby(?, ?, ?) as nearby,problem', 'nearby.problem_id = problem.id and problem.state in (''confirmed'', ''investigating'', ''planned'', ''in progress'', ''fixed'', ''fixed - council'', ''fixed - user'', ''closed'')', 'created desc',
+ 'problem_find_nearby(?, ?, ?) as nearby,problem', 'nearby.problem_id = problem.id and problem.non_public = ''f'' and problem.state in (''confirmed'', ''investigating'', ''planned'', ''in progress'', ''fixed'', ''fixed - council'', ''fixed - user'', ''closed'')', 'created desc',
'{{title}}, {{confirmed}}', '/report/{{id}}', '{{detail}}', 'alert-problem-nearby');
-- New problems around a postcode with a particular state
@@ -72,7 +72,7 @@ insert into alert_type
item_title, item_link, item_description, template)
values ('postcode_local_problems_state', '', '',
'New problems near {{POSTCODE}} on FixMyStreet', '/', 'The latest local problems reported by users',
- 'problem_find_nearby(?, ?, ?) as nearby,problem', 'nearby.problem_id = problem.id and problem.state in (?)', 'created desc',
+ 'problem_find_nearby(?, ?, ?) as nearby,problem', 'nearby.problem_id = problem.id and problem.non_public = ''f'' and problem.state in (?)', 'created desc',
'{{title}}, {{confirmed}}', '/report/{{id}}', '{{detail}}', 'alert-problem-nearby');
-- New problems sent to a particular council
@@ -83,7 +83,7 @@ insert into alert_type
item_title, item_link, item_description, template)
values ('council_problems', '', '',
'New problems to {{COUNCIL}} on FixMyStreet', '/reports', 'The latest problems for {{COUNCIL}} reported by users',
- 'problem', 'problem.state in (''confirmed'', ''investigating'', ''planned'', ''in progress'', ''fixed'', ''fixed - council'', ''fixed - user'', ''closed'') and (council like ''%''||?||''%''
+ 'problem', 'problem.non_public = ''f'' and problem.state in (''confirmed'', ''investigating'', ''planned'', ''in progress'', ''fixed'', ''fixed - council'', ''fixed - user'', ''closed'') and (council like ''%''||?||''%''
or council is null) and areas like ''%,''||?||'',%''', 'created desc',
'{{title}}, {{confirmed}}', '/report/{{id}}', '{{detail}}', 'alert-problem-council'
);
@@ -97,7 +97,7 @@ insert into alert_type
values ('ward_problems', '', '',
'New problems for {{COUNCIL}} within {{WARD}} ward on FixMyStreet', '/reports',
'The latest problems for {{COUNCIL}} within {{WARD}} ward reported by users',
- 'problem', 'problem.state in (''confirmed'', ''investigating'', ''planned'', ''in progress'', ''fixed'', ''fixed - council'', ''fixed - user'', ''closed'') and (council like ''%''||?||''%''
+ 'problem', 'problem.non_public = ''f'' and problem.state in (''confirmed'', ''investigating'', ''planned'', ''in progress'', ''fixed'', ''fixed - council'', ''fixed - user'', ''closed'') and (council like ''%''||?||''%''
or council is null) and areas like ''%,''||?||'',%''', 'created desc',
'{{title}}, {{confirmed}}', '/report/{{id}}', '{{detail}}', 'alert-problem-ward'
);
@@ -111,7 +111,7 @@ insert into alert_type
values ('area_problems', '', '',
'New problems within {{NAME}}''s boundary on FixMyStreet', '/reports',
'The latest problems within {{NAME}}''s boundary reported by users', 'problem',
- 'problem.state in (''confirmed'', ''investigating'', ''planned'', ''in progress'', ''fixed'', ''fixed - council'', ''fixed - user'', ''closed'') and areas like ''%,''||?||'',%''', 'created desc',
+ 'problem.non_public = ''f'' and problem.state in (''confirmed'', ''investigating'', ''planned'', ''in progress'', ''fixed'', ''fixed - council'', ''fixed - user'', ''closed'') and areas like ''%,''||?||'',%''', 'created desc',
'{{title}}, {{confirmed}}', '/report/{{id}}', '{{detail}}', 'alert-problem-area'
);
diff --git a/db/generate_secret.sql b/db/generate_secret.sql
new file mode 100644
index 000000000..ad4b48200
--- /dev/null
+++ b/db/generate_secret.sql
@@ -0,0 +1,8 @@
+-- assumes there's a secret table (from the schema.sql)
+-- use your own secret if you have one :-)
+-- otherwise you can use this to populate the secret table with a random secret
+
+-- empty the table in case it has a value already (i.e., this is *destructive*!)
+delete from secret;
+
+insert into secret values (md5(random()::text));
diff --git a/db/migrate_from_osgb36_to_wgs84.pl b/db/migrate_from_osgb36_to_wgs84.pl
index abd504fb8..676ffea9b 100644
--- a/db/migrate_from_osgb36_to_wgs84.pl
+++ b/db/migrate_from_osgb36_to_wgs84.pl
@@ -21,11 +21,11 @@ use Utils;
BEGIN {
mySociety::Config::set_file("$FindBin::Bin/../conf/general");
mySociety::DBHandle::configure(
- Name => mySociety::Config::get('BCI_DB_NAME'),
- User => mySociety::Config::get('BCI_DB_USER'),
- Password => mySociety::Config::get('BCI_DB_PASS'),
- Host => mySociety::Config::get( 'BCI_DB_HOST', undef ),
- Port => mySociety::Config::get( 'BCI_DB_PORT', undef )
+ Name => mySociety::Config::get('FMS_DB_NAME'),
+ User => mySociety::Config::get('FMS_DB_USER'),
+ Password => mySociety::Config::get('FMS_DB_PASS'),
+ Host => mySociety::Config::get( 'FMS_DB_HOST', undef ),
+ Port => mySociety::Config::get( 'FMS_DB_PORT', undef )
);
}
diff --git a/db/schema.sql b/db/schema.sql
index 437541898..021c5561d 100644
--- a/db/schema.sql
+++ b/db/schema.sql
@@ -81,7 +81,16 @@ create table contacts (
note text not null,
-- extra fields required for open311
- extra text
+ extra text,
+
+ -- for things like missed bin collections
+ non_public boolean default 'f',
+
+ -- per contact endpoint configuration
+ endpoint text,
+ jurisdiction text default '',
+ api_key text default '',
+ send_method text
);
create unique index contacts_area_id_category_idx on contacts(area_id, category);
@@ -202,10 +211,24 @@ create table problem (
send_fail_timestamp timestamp,
-- record send_method used, which can be used to infer usefulness of external_id
- send_method_used text
+ send_method_used text,
+
+ -- for things like missed bin collections
+ non_public BOOLEAN default 'f',
+
+ -- record details about messages from external sources, eg. message manager
+ external_source text,
+ external_source_id text,
+
+ -- number of me toos
+ interest_count integer default 0,
+
+ -- subcategory to enable filtering in reporting --
+ subcategory text
);
create index problem_state_latitude_longitude_idx on problem(state, latitude, longitude);
create index problem_user_id_idx on problem ( user_id );
+create index problem_external_body_idx on problem(lower(external_body));
create table questionnaire (
id serial not null primary key,
@@ -447,5 +470,6 @@ create table open311conf (
send_comments boolean not null default 'f',
comment_user_id int references users(id),
suppress_alerts boolean not null default 'f',
+ can_be_devolved boolean not null default 'f',
send_extended_statuses boolean not null default 'f'
);
diff --git a/db/schema_0021-add_external_source_columns_to_problem.sql b/db/schema_0021-add_external_source_columns_to_problem.sql
new file mode 100644
index 000000000..a74bcce7d
--- /dev/null
+++ b/db/schema_0021-add_external_source_columns_to_problem.sql
@@ -0,0 +1,8 @@
+begin;
+
+ALTER table problem
+ ADD column external_source TEXT;
+ALTER table problem
+ ADD column external_source_id TEXT;
+
+commit;
diff --git a/db/schema_0022-add_interest_count_to_problems.sql b/db/schema_0022-add_interest_count_to_problems.sql
new file mode 100644
index 000000000..62092aa0a
--- /dev/null
+++ b/db/schema_0022-add_interest_count_to_problems.sql
@@ -0,0 +1,6 @@
+begin;
+
+ALTER table problem
+ ADD COLUMN interest_count integer;
+
+commit;
diff --git a/db/schema_0023-add_can_be_devolved_and_category_config.sql b/db/schema_0023-add_can_be_devolved_and_category_config.sql
new file mode 100644
index 000000000..6eba0919a
--- /dev/null
+++ b/db/schema_0023-add_can_be_devolved_and_category_config.sql
@@ -0,0 +1,13 @@
+begin;
+
+ALTER table open311conf
+ ADD column can_be_devolved BOOL NOT NULL DEFAULT 'f';
+
+ALTER table contacts
+ ADD column endpoint TEXT,
+ ADD column jurisdiction TEXT DEFAULT '',
+ ADD column api_key TEXT DEFAULT '',
+ ADD column send_method TEXT
+;
+
+commit;
diff --git a/db/schema_0024-add_non_public_categories_and_problems.sql b/db/schema_0024-add_non_public_categories_and_problems.sql
new file mode 100644
index 000000000..c133b3ef2
--- /dev/null
+++ b/db/schema_0024-add_non_public_categories_and_problems.sql
@@ -0,0 +1,37 @@
+BEGIN;
+
+ ALTER TABLE contacts
+ ADD COLUMN non_public BOOLEAN DEFAULT 'f';
+
+ ALTER TABLE problem
+ ADD COLUMN non_public BOOLEAN DEFAULT 'f';
+
+
+ UPDATE alert_type set item_where = 'nearby.problem_id = problem.id and problem.non_public = ''f'' and problem.state in
+ (''confirmed'', ''investigating'', ''planned'', ''in progress'',
+ ''fixed'', ''fixed - council'', ''fixed - user'', ''closed'')' WHERE ref = 'postcode_local_problems';
+ UPDATE alert_type set item_where = 'problem.non_public = ''f'' and problem.state in
+ (''confirmed'', ''investigating'', ''planned'', ''in progress'',
+ ''fixed'', ''fixed - council'', ''fixed - user'', ''closed'' )' WHERE ref = 'new_problems';
+ UPDATE alert_type set item_where = 'problem.non_public = ''f'' and problem.state in (''fixed'', ''fixed - user'', ''fixed - council'')' WHERE ref = 'new_fixed_problems';
+ UPDATE alert_type set item_where = 'nearby.problem_id = problem.id and problem.non_public = ''f'' and problem.state in
+ (''confirmed'', ''investigating'', ''planned'', ''in progress'',
+ ''fixed'', ''fixed - council'', ''fixed - user'', ''closed'')' WHERE ref = 'local_problems';
+ UPDATE alert_type set item_where = 'problem.non_public = ''f'' and problem.state in
+ (''confirmed'', ''investigating'', ''planned'', ''in progress'',
+ ''fixed'', ''fixed - council'', ''fixed - user'', ''closed'') and
+ (council like ''%''||?||''%'' or council is null) and
+ areas like ''%,''||?||'',%''' WHERE ref = 'council_problems';
+ UPDATE alert_type set item_where = 'problem.non_public = ''f'' and problem.state in
+ (''confirmed'', ''investigating'', ''planned'', ''in progress'',
+ ''fixed'', ''fixed - council'', ''fixed - user'', ''closed'') and
+ (council like ''%''||?||''%'' or council is null) and
+ areas like ''%,''||?||'',%''' WHERE ref = 'ward_problems';
+ UPDATE alert_type set item_where = 'problem.non_public = ''f'' and problem.state in
+ (''confirmed'', ''investigating'', ''planned'', ''in progress'',
+ ''fixed'', ''fixed - council'', ''fixed - user'', ''closed'') and
+ areas like ''%,''||?||'',%''' WHERE ref = 'area_problems';
+
+commit;
+
+COMMIT;
diff --git a/db/schema_0026-change_interest_count_default.sql b/db/schema_0026-change_interest_count_default.sql
new file mode 100644
index 000000000..7c78f6fe8
--- /dev/null
+++ b/db/schema_0026-change_interest_count_default.sql
@@ -0,0 +1,9 @@
+BEGIN;
+
+ ALTER TABLE problem
+ ALTER COLUMN interest_count SET DEFAULT 0;
+
+ UPDATE problem SET interest_count = 0
+ WHERE interest_count IS NULL;
+
+COMMIT;
diff --git a/db/schema_0027-add_sub_category_to_problem.sql b/db/schema_0027-add_sub_category_to_problem.sql
new file mode 100644
index 000000000..6787bd371
--- /dev/null
+++ b/db/schema_0027-add_sub_category_to_problem.sql
@@ -0,0 +1,6 @@
+begin;
+
+ALTER TABLE problem
+ ADD COLUMN subcategory TEXT;
+
+commit;
diff --git a/locale/FixMyStreet.po b/locale/FixMyStreet.po
index e5d9ef692..44584597a 100644
--- a/locale/FixMyStreet.po
+++ b/locale/FixMyStreet.po
@@ -8,16 +8,16 @@ msgid ""
msgstr ""
"Project-Id-Version: 1.0\n"
"Report-Msgid-Bugs-To: matthew@mysociety.org\n"
-"POT-Creation-Date: 2012-08-21 09:54+0100\n"
+"POT-Creation-Date: 2012-12-10 13:18+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <team@fixmystreet.com>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:555 perllib/FixMyStreet/DB/ResultSet/Problem.pm:337
+#: perllib/FixMyStreet/DB/Result/Problem.pm:560 perllib/FixMyStreet/DB/ResultSet/Problem.pm:339
msgid " and "
msgstr ""
@@ -41,83 +41,51 @@ msgstr ""
msgid "%d council contacts &ndash; %d confirmed, %d unconfirmed"
msgstr ""
-#: perllib/Utils.pm:293
-msgid "%d day"
-msgstr ""
-
-#: perllib/Utils.pm:293
-msgid "%d days"
-msgstr ""
-
#: templates/web/default/admin/council_list.html:27
msgid "%d edits by %s"
msgstr ""
-#: perllib/Utils.pm:294
-msgid "%d hour"
-msgstr ""
-
-#: perllib/Utils.pm:294
-msgid "%d hours"
-msgstr ""
-
#: templates/web/default/admin/index.html:16
msgid "%d live updates"
msgstr ""
-#: perllib/Utils.pm:295
-msgid "%d minute"
-msgstr ""
-
-#: perllib/Utils.pm:295
-msgid "%d minutes"
-msgstr ""
-
#: templates/web/default/admin/index.html:18
msgid "%d questionnaires sent &ndash; %d answered (%s%%)"
msgstr ""
-#: perllib/Utils.pm:292
-msgid "%d week"
-msgstr ""
-
-#: perllib/Utils.pm:292
-msgid "%d weeks"
+#: templates/web/default/report/_support.html:3
+msgid "%d supporters"
msgstr ""
-#: templates/web/default/reports/council.html:0 templates/web/default/reports/council.html:26 templates/web/emptyhomes/reports/council.html:11 templates/web/emptyhomes/reports/council.html:13
+#: templates/web/default/reports/body.html:0 templates/web/default/reports/body.html:26 templates/web/emptyhomes/reports/body.html:11 templates/web/emptyhomes/reports/body.html:13
msgid "%s - Summary reports"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:605
+#: perllib/FixMyStreet/DB/Result/Problem.pm:610
msgid "%s ref:&nbsp;%s"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/UK.pm:288 perllib/FixMyStreet/Cobrand/UK.pm:300
+#: perllib/FixMyStreet/Cobrand/UK.pm:279 perllib/FixMyStreet/Cobrand/UK.pm:291
msgid "%s ward, %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:488
+#: perllib/FixMyStreet/DB/Result/Problem.pm:496
msgid "%s, reported anonymously at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:490
+#: perllib/FixMyStreet/DB/Result/Problem.pm:498
msgid "%s, reported by %s at %s"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/UK.pm:315 perllib/FixMyStreet/Cobrand/UK.pm:327
+#: perllib/FixMyStreet/Cobrand/UK.pm:306 perllib/FixMyStreet/Cobrand/UK.pm:318
msgid "%s, within %s ward"
msgstr ""
-#: templates/web/default/admin/stats.html:5
-msgid "%sreports between %s and %s"
-msgstr ""
-
#: templates/web/default/email_sent.html:28
msgid "(Don't worry &mdash; %s)"
msgstr ""
-#: templates/web/default/admin/report_blocks.html:11
+#: templates/web/default/admin/report_blocks.html:11 templates/web/default/admin/search_users.html:23
msgid "(Email in abuse table)"
msgstr ""
@@ -137,7 +105,7 @@ msgstr ""
msgid "(fixed)"
msgstr ""
-#: templates/web/default/index.html:12 templates/web/default/index.html:8 templates/web/fixmystreet/around/postcode_form.html:7
+#: templates/web/default/index.html:12 templates/web/default/index.html:8 templates/web/fixmystreet/around/intro.html:2
msgid "(like graffiti, fly tipping, broken paving slabs, or street lighting)"
msgstr ""
@@ -145,7 +113,7 @@ msgstr ""
msgid "(not sent to council)"
msgstr ""
-#: templates/web/default/report/new/fill_in_details_form.html:217
+#: templates/web/default/report/new/fill_in_details_form.html:217 templates/web/zurich/report/new/fill_in_details_form.html:118
msgid "(optional)"
msgstr ""
@@ -157,19 +125,19 @@ msgstr ""
msgid "(we never show your email address or phone number)"
msgstr ""
-#: templates/web/default/report/display.html:209
+#: templates/web/default/report/update-form.html:156
msgid "(we never show your email)"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:284
+#: perllib/FixMyStreet/App/Controller/Admin.pm:285
msgid "*unknown*"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:629 perllib/FixMyStreet/App/Controller/Report/New.pm:655 perllib/FixMyStreet/DB/Result/Problem.pm:345
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:628 perllib/FixMyStreet/App/Controller/Report/New.pm:656 perllib/FixMyStreet/DB/Result/Problem.pm:353
msgid "-- Pick a category --"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:609 perllib/FixMyStreet/DB/Result/Problem.pm:351
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:608 perllib/FixMyStreet/DB/Result/Problem.pm:359
msgid "-- Pick a property type --"
msgstr ""
@@ -177,6 +145,10 @@ msgstr ""
msgid ". You can <a href=\"%s%s\">view the problem on this site</a>."
msgstr ""
+#: templates/web/default/report/_support.html:3
+msgid "1 supporter"
+msgstr ""
+
#: templates/web/default/questionnaire/completed.html:20
msgid "<p style=\"font-size:150%\">Thank you very much for filling in our questionnaire; glad to hear it&rsquo;s been fixed.</p>"
msgstr ""
@@ -191,7 +163,7 @@ msgid ""
"</p>"
msgstr ""
-#: templates/web/fixmystreet/questionnaire/completed-open.html:1
+#: templates/web/fixmystreet/questionnaire/completed-open.html:6
msgid ""
"<p style=\"font-size:150%\">We&rsquo;re sorry to hear that. We have two\n"
"suggestions: why not try <a href=\"http://www.writetothem.com/\">writing direct\n"
@@ -201,7 +173,7 @@ msgid ""
"</p>"
msgstr ""
-#: templates/web/default/questionnaire/completed-open.html:1
+#: templates/web/default/questionnaire/completed-open.html:6
msgid ""
"<p style=\"font-size:150%\">We&rsquo;re sorry to hear that. We have two\n"
"suggestions: why not try writing to your local representative or, if it&rsquo;s\n"
@@ -241,7 +213,7 @@ msgid ""
"site and leave an update.</p>"
msgstr ""
-#: templates/web/default/around/display_location.html:70 templates/web/default/around/display_location.html:72 templates/web/emptyhomes/around/display_location.html:36 templates/web/emptyhomes/around/display_location.html:38
+#: templates/web/default/around/_report_banner.html:3 templates/web/default/around/_report_banner.html:5 templates/web/emptyhomes/around/display_location.html:36 templates/web/emptyhomes/around/display_location.html:38
msgid "<small>If you cannot see the map, <a href='%s' rel='nofollow'>skip this step</a>.</small>"
msgstr ""
@@ -249,15 +221,15 @@ msgstr ""
msgid "<strong>%d</strong> live problems"
msgstr ""
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:172
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:193
msgid "<strong>No</strong> Let me confirm my report by email"
msgstr ""
-#: templates/web/fixmystreet/report/display.html:148
+#: templates/web/fixmystreet/report/update-form.html:108
msgid "<strong>No</strong> Let me confirm my update by email"
msgstr ""
-#: templates/web/fixmystreet/auth/general.html:46
+#: templates/web/fixmystreet/auth/general.html:50
msgid "<strong>No</strong> let me sign in by email"
msgstr ""
@@ -269,11 +241,11 @@ msgstr ""
msgid "<strong>No</strong>, let me confirm my report by email:"
msgstr ""
-#: templates/web/default/report/display.html:164
+#: templates/web/default/report/update-form.html:115
msgid "<strong>No</strong>, let me confirm my update by email:"
msgstr ""
-#: templates/web/default/auth/general.html:37 templates/web/default/report/display.html:142 templates/web/default/report/new/fill_in_details_form.html:140 templates/web/fixmystreet/auth/general.html:32 templates/web/fixmystreet/auth/general.html:34 templates/web/fixmystreet/report/display.html:131 templates/web/fixmystreet/report/new/fill_in_details_form.html:154
+#: templates/web/default/auth/general.html:37 templates/web/default/report/new/fill_in_details_form.html:140 templates/web/default/report/update-form.html:93 templates/web/fixmystreet/auth/general.html:36 templates/web/fixmystreet/auth/general.html:38 templates/web/fixmystreet/report/new/fill_in_details_form.html:169 templates/web/fixmystreet/report/update-form.html:85
msgid "<strong>Yes</strong> I have a password"
msgstr ""
@@ -281,11 +253,11 @@ msgstr ""
msgid "About us"
msgstr ""
-#: templates/web/default/admin/council_contacts.html:66
+#: templates/web/default/admin/council_contacts.html:72
msgid "Add new category"
msgstr ""
-#: templates/web/default/my/my.html:56 templates/web/fixmystreet/my/my.html:56
+#: templates/web/default/my/my.html:56 templates/web/fixmystreet/my/my.html:60
msgid "Added %s"
msgstr ""
@@ -301,15 +273,11 @@ msgstr ""
msgid "Alert %d disabled (created %s)"
msgstr ""
-#: templates/web/bromley/report/display.html:207 templates/web/default/report/display.html:214 templates/web/fixmystreet/report/display.html:189
+#: templates/web/bromley/report/display.html:207 templates/web/default/report/update-form.html:161 templates/web/fixmystreet/report/update-form.html:146
msgid "Alert me to future updates"
msgstr ""
-#: templates/web/default/admin/stats.html:5
-msgid "All"
-msgstr ""
-
-#: templates/web/default/reports/index.html:3
+#: templates/web/default/reports/index.html:3 templates/web/fixmybarangay/reports/index.html:3
msgid "All Reports"
msgstr ""
@@ -317,10 +285,14 @@ msgstr ""
msgid "All confirmed"
msgstr ""
-#: templates/web/barnet/footer.html:20 templates/web/bromley/footer.html:21 templates/web/bromley/header.html:77 templates/web/default/footer.html:11 templates/web/fiksgatami/footer.html:7 templates/web/fiksgatami/nn/footer.html:7 templates/web/fixmystreet/footer.html:49 templates/web/reading/footer.html:8
+#: templates/web/barnet/footer.html:20 templates/web/bromley/footer.html:21 templates/web/bromley/header.html:77 templates/web/default/footer.html:11 templates/web/fiksgatami/footer.html:7 templates/web/fiksgatami/nn/footer.html:7 templates/web/fixmybarangay/footer.html:20 templates/web/fixmystreet/footer.html:49 templates/web/reading/footer.html:8 templates/web/stevenage/footer.html:43 templates/web/zurich/footer.html:12
msgid "All reports"
msgstr ""
+#: templates/web/default/admin/stats.html:5
+msgid "All reports between %s and %s"
+msgstr ""
+
#: templates/web/default/report/new/councils_text_some.html:2
msgid "All the information you provide here will be sent to"
msgstr ""
@@ -333,7 +305,7 @@ msgstr ""
msgid "All the information you provide here will be sent to <strong>%s</strong> or a relevant local body such as <strong>TfL</strong>, via the London Report-It system."
msgstr ""
-#: templates/web/bromley/report/new/fill_in_details_form.html:4 templates/web/bromley/report/new/fill_in_details_form.html:6 templates/web/default/report/new/councils_text_all.html:17 templates/web/default/report/new/councils_text_all.html:19 templates/web/default/report/new/fill_in_details_form.html:11 templates/web/default/report/new/fill_in_details_form.html:13 templates/web/fixmystreet/report/new/fill_in_details_form.html:6 templates/web/fixmystreet/report/new/fill_in_details_form.html:8
+#: templates/web/bromley/report/new/fill_in_details_form.html:4 templates/web/bromley/report/new/fill_in_details_form.html:6 templates/web/default/report/new/councils_text_all.html:17 templates/web/default/report/new/councils_text_all.html:19 templates/web/default/report/new/fill_in_details_form.html:11 templates/web/default/report/new/fill_in_details_form.html:13 templates/web/fixmystreet/report/new/fill_in_details_form.html:6 templates/web/fixmystreet/report/new/fill_in_details_form.html:8 templates/web/zurich/report/new/fill_in_details_form.html:6 templates/web/zurich/report/new/fill_in_details_form.html:8
msgid "All the information you provide here will be sent to <strong>%s</strong>."
msgstr ""
@@ -357,11 +329,11 @@ msgstr ""
msgid "Are you a <strong>developer</strong>? Would you like to contribute to FixMyStreet?"
msgstr ""
-#: templates/web/fixmystreet/footer.html:17
+#: templates/web/fixmystreet/footer.html:17 templates/web/stevenage/footer.html:17
msgid "Are you a developer?"
msgstr ""
-#: templates/web/fixmystreet/footer.html:21
+#: templates/web/fixmystreet/footer.html:21 templates/web/stevenage/footer.html:21
msgid "Are you from a council?"
msgstr ""
@@ -377,6 +349,14 @@ msgstr ""
msgid "Ban email address"
msgstr ""
+#: templates/web/fixmybarangay/report/new/notes.html:7
+msgid "Be sure to choose the right category, because we use that to determine to whom the report is sent."
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1032
+msgid "Bodies"
+msgstr ""
+
#: templates/web/fiksgatami/footer.html:16 templates/web/fiksgatami/nn/footer.html:16
msgid "Built by <a href=\"http://www.mysociety.org/\">mySociety</a> and maintained by <a href=\"http://www.nuug.no/\">NUUG</a>"
msgstr ""
@@ -385,11 +365,11 @@ msgstr ""
msgid "By Date"
msgstr ""
-#: templates/web/fixmystreet/around/display_location.html:80 templates/web/fixmystreet/around/display_location.html:82
+#: templates/web/fixmystreet/around/_report_banner.html:10 templates/web/fixmystreet/around/_report_banner.html:8
msgid "Can't see the map? <a href='%s' rel='nofollow'>Skip this step</a>"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:632 perllib/FixMyStreet/App/Controller/Report/New.pm:657 templates/web/bromley/report/new/fill_in_details_form.html:68 templates/web/default/admin/council_contacts.html:35 templates/web/default/admin/index.html:36 templates/web/default/admin/list_flagged.html:14 templates/web/default/admin/search_reports.html:17 templates/web/fixmystreet/report/new/fill_in_details_form.html:72
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:631 perllib/FixMyStreet/App/Controller/Report/New.pm:658 templates/web/bromley/report/new/fill_in_details_form.html:68 templates/web/default/admin/council_contacts.html:37 templates/web/default/admin/index.html:36 templates/web/default/admin/list_flagged.html:14 templates/web/default/admin/search_reports.html:17 templates/web/fixmystreet/report/new/fill_in_details_form.html:74 templates/web/zurich/report/new/fill_in_details_form.html:68
msgid "Category"
msgstr ""
@@ -397,11 +377,11 @@ msgstr ""
msgid "Category fix rate for problems > 4 weeks old"
msgstr ""
-#: templates/web/default/admin/council_contacts.html:72 templates/web/default/admin/council_edit.html:23 templates/web/default/admin/report_edit.html:25 templates/web/default/report/new/fill_in_details_form.html:67
+#: templates/web/default/admin/council_contacts.html:78 templates/web/default/admin/council_edit.html:23 templates/web/default/admin/report_edit.html:25 templates/web/default/report/new/fill_in_details_form.html:67
msgid "Category:"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:334
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:336
msgid "Category: %s"
msgstr ""
@@ -409,19 +389,19 @@ msgstr ""
msgid "Change Password"
msgstr ""
-#: templates/web/fixmystreet/around/display_location.html:72 templates/web/fixmystreet/around/display_location.html:73
+#: templates/web/default/js/validation_strings.html:22 templates/web/fixmystreet/around/_report_banner.html:2
msgid "Click map to report a problem"
msgstr ""
-#: templates/web/bromley/report/display.html:80 templates/web/bromley/report/display.html:82 templates/web/default/admin/report_edit.html:18 templates/web/default/admin/report_edit.html:20 templates/web/default/dashboard/index.html:136 templates/web/default/dashboard/index.html:138 templates/web/default/report/display.html:79 templates/web/default/report/display.html:81 templates/web/fixmystreet/report/banner.html:15 templates/web/fixmystreet/report/display.html:74 templates/web/fixmystreet/report/display.html:76
+#: templates/web/bromley/report/display.html:80 templates/web/bromley/report/display.html:82 templates/web/default/admin/report_edit.html:18 templates/web/default/admin/report_edit.html:20 templates/web/default/dashboard/index.html:138 templates/web/default/dashboard/index.html:140 templates/web/default/report/update-form.html:30 templates/web/default/report/update-form.html:32 templates/web/fixmystreet/report/banner.html:15 templates/web/fixmystreet/report/update-form.html:28 templates/web/fixmystreet/report/update-form.html:30
msgid "Closed"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:690
+#: perllib/FixMyStreet/DB/Result/Problem.pm:695
msgid "Closed by council"
msgstr ""
-#: templates/web/default/my/my.html:32 templates/web/fixmystreet/my/my.html:32
+#: templates/web/default/my/my.html:32 templates/web/fixmystreet/my/my.html:36
msgid "Closed reports"
msgstr ""
@@ -429,7 +409,7 @@ msgstr ""
msgid "Closed:"
msgstr ""
-#: templates/web/default/around/display_location.html:103 templates/web/default/around/display_location.html:105
+#: templates/web/default/around/tabbed_lists.html:10 templates/web/default/around/tabbed_lists.html:12
msgid "Closest nearby problems <small>(within&nbsp;%skm)</small>"
msgstr ""
@@ -449,23 +429,27 @@ msgstr ""
msgid "Cobrand:"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:358
+#: perllib/FixMyStreet/App/Controller/Admin.pm:365
msgid "Configuration updated"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:372
+#: perllib/FixMyStreet/App/Controller/Admin.pm:380
msgid "Configuration updated - contacts will be generated automatically later"
msgstr ""
-#: templates/web/default/admin/council_contacts.html:153
+#: templates/web/default/admin/council_edit.html:34
+msgid "Configure Endpoint"
+msgstr ""
+
+#: templates/web/default/admin/council_contacts.html:168
msgid "Configure Open311"
msgstr ""
-#: templates/web/default/admin/council_contacts.html:105
+#: templates/web/default/admin/council_contacts.html:116
msgid "Configure Open311 integration"
msgstr ""
-#: templates/web/default/admin/council_contacts.html:42
+#: templates/web/default/admin/council_contacts.html:46
msgid "Confirm"
msgstr ""
@@ -473,14 +457,22 @@ msgstr ""
msgid "Confirm account"
msgstr ""
-#: templates/web/default/questionnaire/creator_fixed.html:1 templates/web/default/tokens/confirm_problem.html:1 templates/web/default/tokens/confirm_problem.html:3 templates/web/default/tokens/confirm_update.html:1 templates/web/default/tokens/confirm_update.html:3 templates/web/emptyhomes/tokens/confirm_problem.html:1 templates/web/emptyhomes/tokens/confirm_problem.html:3
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:187 templates/web/fixmystreet/report/update-form.html:103
+msgid "Confirm by email below, providing a new password at that point. When you confirm, your password will be updated."
+msgstr ""
+
+#: templates/web/default/questionnaire/creator_fixed.html:1 templates/web/default/tokens/confirm_problem.html:1 templates/web/default/tokens/confirm_problem.html:3 templates/web/default/tokens/confirm_update.html:1 templates/web/default/tokens/confirm_update.html:3 templates/web/emptyhomes/tokens/confirm_problem.html:1 templates/web/emptyhomes/tokens/confirm_problem.html:3 templates/web/southampton/tokens/confirm_problem.html:1 templates/web/southampton/tokens/confirm_problem.html:3
msgid "Confirmation"
msgstr ""
-#: templates/web/default/admin/council_contacts.html:37 templates/web/default/admin/council_contacts.html:82 templates/web/default/admin/council_edit.html:28 templates/web/default/admin/council_edit.html:43 templates/web/default/admin/stats.html:5
+#: templates/web/default/admin/council_contacts.html:39 templates/web/default/admin/council_contacts.html:88 templates/web/default/admin/council_edit.html:28 templates/web/default/admin/council_edit.html:71
msgid "Confirmed"
msgstr ""
+#: templates/web/default/admin/stats.html:5
+msgid "Confirmed reports between %s and %s"
+msgstr ""
+
#: templates/web/default/admin/problem_row.html:23 templates/web/default/admin/report_edit.html:34
msgid "Confirmed:"
msgstr ""
@@ -501,7 +493,7 @@ msgstr ""
msgid "Contact the team"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1150 perllib/FixMyStreet/App/Controller/Admin.pm:1178
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1159 perllib/FixMyStreet/App/Controller/Admin.pm:1187
msgid "Could not find user"
msgstr ""
@@ -509,7 +501,7 @@ msgstr ""
msgid "Council"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1022 templates/web/default/admin/council_list.html:1
+#: templates/web/default/admin/council_list.html:1
msgid "Council contacts"
msgstr ""
@@ -533,7 +525,7 @@ msgstr ""
msgid "Create a report"
msgstr ""
-#: templates/web/default/admin/council_contacts.html:96
+#: templates/web/default/admin/council_contacts.html:107
msgid "Create category"
msgstr ""
@@ -557,11 +549,11 @@ msgstr ""
msgid "Dashboard"
msgstr ""
-#: templates/web/default/admin/council_contacts.html:38 templates/web/default/admin/council_contacts.html:85 templates/web/default/admin/council_edit.html:29 templates/web/default/admin/council_edit.html:44
+#: templates/web/default/admin/council_contacts.html:40 templates/web/default/admin/council_contacts.html:91 templates/web/default/admin/council_edit.html:29 templates/web/default/admin/council_edit.html:72
msgid "Deleted"
msgstr ""
-#: templates/web/bromley/report/new/fill_in_details_form.html:54 templates/web/fixmystreet/report/new/fill_in_details_form.html:64
+#: templates/web/bromley/report/new/fill_in_details_form.html:54 templates/web/fixmystreet/report/new/fill_in_details_form.html:66 templates/web/zurich/report/new/fill_in_details_form.html:60
msgid "Details"
msgstr ""
@@ -569,11 +561,19 @@ msgstr ""
msgid "Details:"
msgstr ""
+#: templates/web/default/admin/council_contacts.html:41
+msgid "Devolved"
+msgstr ""
+
#: templates/web/default/admin/council_list.html:23
msgid "Diligency prize league table"
msgstr ""
-#: templates/web/default/auth/general.html:32 templates/web/fixmystreet/auth/general.html:29 templates/web/fixmystreet/report/display.html:128 templates/web/fixmystreet/report/new/fill_in_details_form.html:150
+#: templates/web/fixmystreet/auth/general.html:30
+msgid "Do you have a FixMyBarangay password?"
+msgstr ""
+
+#: templates/web/default/auth/general.html:32 templates/web/fixmystreet/auth/general.html:32 templates/web/fixmystreet/report/new/fill_in_details_form.html:165 templates/web/fixmystreet/report/update-form.html:82
msgid "Do you have a FixMyStreet password?"
msgstr ""
@@ -597,23 +597,23 @@ msgstr ""
msgid "Editing user %d"
msgstr ""
-#: templates/web/default/admin/council_edit.html:45
+#: templates/web/default/admin/council_edit.html:73
msgid "Editor"
msgstr ""
-#: templates/web/bromley/report/display.html:126 templates/web/default/admin/council_contacts.html:36 templates/web/default/admin/council_edit.html:42 templates/web/default/admin/list_flagged.html:12 templates/web/default/admin/list_flagged.html:35 templates/web/default/admin/list_updates.html:8 templates/web/default/admin/search_abuse.html:11 templates/web/default/admin/search_reports.html:15 templates/web/default/admin/search_users.html:13 templates/web/fixmystreet/auth/general.html:20 templates/web/fixmystreet/report/display.html:120
+#: templates/web/bromley/report/display.html:126 templates/web/default/admin/council_contacts.html:38 templates/web/default/admin/council_edit.html:70 templates/web/default/admin/list_flagged.html:12 templates/web/default/admin/list_flagged.html:35 templates/web/default/admin/list_updates.html:8 templates/web/default/admin/search_reports.html:15 templates/web/default/admin/search_users.html:13 templates/web/fixmystreet/auth/general.html:20 templates/web/fixmystreet/report/update-form.html:74
msgid "Email"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1126
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1135
msgid "Email added to abuse list"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1123
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1132
msgid "Email already in abuse list"
msgstr ""
-#: templates/web/default/around/display_location.html:85
+#: templates/web/default/around/_updates.html:5
msgid "Email me new local problems"
msgstr ""
@@ -621,19 +621,19 @@ msgstr ""
msgid "Email me updates"
msgstr ""
-#: templates/web/default/admin/council_contacts.html:77 templates/web/default/admin/council_edit.html:26 templates/web/default/admin/report_edit.html:31 templates/web/default/admin/update_edit.html:24 templates/web/default/admin/user_edit.html:11 templates/web/default/alert/updates.html:13 templates/web/default/report/display.html:34
+#: templates/web/default/admin/council_contacts.html:83 templates/web/default/admin/council_edit.html:26 templates/web/default/admin/report_edit.html:31 templates/web/default/admin/update_edit.html:24 templates/web/default/admin/user_edit.html:11 templates/web/default/alert/updates.html:13 templates/web/default/report/display.html:34
msgid "Email:"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:611
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:610
msgid "Empty flat or maisonette"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:610
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:609
msgid "Empty house or bungalow"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:613
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:612
msgid "Empty office or other commercial"
msgstr ""
@@ -641,11 +641,11 @@ msgstr ""
msgid "Empty property details form"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:614
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:613
msgid "Empty pub or bar"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:615
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:614
msgid "Empty public building - school, hospital, etc."
msgstr ""
@@ -661,6 +661,10 @@ msgstr ""
msgid "End month:"
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:9
+msgid "Enter a Z&uuml;rich street name"
+msgstr ""
+
#: templates/web/emptyhomes/index.html:40 templates/web/emptyhomes/index.html:41
msgid "Enter a nearby GB postcode, or street name and area"
msgstr ""
@@ -677,15 +681,15 @@ msgstr ""
msgid "Enter a nearby street name and area"
msgstr ""
-#: templates/web/default/auth/general.html:64 templates/web/default/report/display.html:171 templates/web/default/report/new/fill_in_details_form.html:169
+#: templates/web/default/auth/general.html:64 templates/web/default/report/new/fill_in_details_form.html:169 templates/web/default/report/update-form.html:122
msgid "Enter a new password:"
msgstr ""
-#: templates/web/bromley/report/display.html:148 templates/web/bromley/report/new/fill_in_details_form.html:189 templates/web/fixmystreet/auth/general.html:57 templates/web/fixmystreet/report/display.html:160 templates/web/fixmystreet/report/new/fill_in_details_form.html:200
+#: templates/web/bromley/report/display.html:148 templates/web/bromley/report/new/fill_in_details_form.html:189 templates/web/fixmystreet/auth/general.html:61 templates/web/fixmystreet/report/new/fill_in_details_form.html:221 templates/web/fixmystreet/report/update-form.html:120
msgid "Enter a password"
msgstr ""
-#: templates/web/default/index.html:33 templates/web/emptyhomes/index.html:58 templates/web/fixmystreet/index.html:41
+#: templates/web/default/index-steps.html:11 templates/web/emptyhomes/index.html:58
msgid "Enter details of the problem"
msgstr ""
@@ -693,7 +697,7 @@ msgstr ""
msgid "Error"
msgstr ""
-#: templates/web/default/admin/council_contacts.html:11 templates/web/default/admin/council_edit.html:18
+#: templates/web/default/admin/council_contacts.html:13 templates/web/default/admin/council_edit.html:18
msgid "Example postcode %s"
msgstr ""
@@ -725,14 +729,10 @@ msgstr ""
msgid "FixMyStreet"
msgstr ""
-#: templates/web/default/admin/header.html:13
+#: templates/web/default/admin/header.html:10
msgid "FixMyStreet admin:"
msgstr ""
-#: templates/web/default/admin/header.html:3
-msgid "FixMyStreet administration"
-msgstr ""
-
#: templates/web/default/alert/index.html:11
msgid ""
"FixMyStreet has a variety of RSS feeds and email alerts for local problems, including\n"
@@ -750,7 +750,7 @@ msgid ""
"for the county council."
msgstr ""
-#: templates/web/bromley/report/display.html:80 templates/web/bromley/report/display.html:82 templates/web/default/admin/index.html:36 templates/web/default/admin/report_edit.html:18 templates/web/default/admin/report_edit.html:20 templates/web/default/dashboard/index.html:136 templates/web/default/dashboard/index.html:138 templates/web/default/report/display.html:79 templates/web/default/report/display.html:81 templates/web/fixmystreet/report/banner.html:12 templates/web/fixmystreet/report/display.html:74 templates/web/fixmystreet/report/display.html:76
+#: templates/web/bromley/report/display.html:80 templates/web/bromley/report/display.html:82 templates/web/default/admin/index.html:36 templates/web/default/admin/report_edit.html:18 templates/web/default/admin/report_edit.html:20 templates/web/default/dashboard/index.html:138 templates/web/default/dashboard/index.html:140 templates/web/default/report/update-form.html:30 templates/web/default/report/update-form.html:32 templates/web/fixmystreet/report/banner.html:12 templates/web/fixmystreet/report/update-form.html:28 templates/web/fixmystreet/report/update-form.html:30
msgid "Fixed"
msgstr ""
@@ -762,7 +762,7 @@ msgstr ""
msgid "Fixed - User"
msgstr ""
-#: templates/web/default/my/my.html:27 templates/web/fixmystreet/my/my.html:27
+#: templates/web/default/my/my.html:27 templates/web/fixmystreet/my/my.html:31
msgid "Fixed reports"
msgstr ""
@@ -774,7 +774,7 @@ msgstr ""
msgid "Flag user"
msgstr ""
-#: templates/web/default/admin/search_users.html:15
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1037 templates/web/default/admin/search_users.html:15
msgid "Flagged"
msgstr ""
@@ -782,7 +782,7 @@ msgstr ""
msgid "Flagged:"
msgstr ""
-#: templates/web/default/reports/_ward-list.html:3 templates/web/emptyhomes/reports/council.html:19 templates/web/fixmystreet/reports/_ward-list.html:4
+#: templates/web/default/reports/_ward-list.html:3 templates/web/emptyhomes/reports/body.html:19 templates/web/fixmystreet/reports/_ward-list.html:4
msgid "Follow a ward link to view only reports within that ward."
msgstr ""
@@ -790,7 +790,11 @@ msgstr ""
msgid "For council(s):"
msgstr ""
-#: templates/web/default/faq/faq-en-gb.html:1 templates/web/emptyhomes/faq/faq-cy.html:1 templates/web/emptyhomes/faq/faq-en-gb.html:1 templates/web/fiksgatami/faq/faq-nb.html:1 templates/web/fiksgatami/nn/faq/faq-nn.html:1 templates/web/fixmystreet/faq/faq-en-gb.html:1 templates/web/fixmystreet/static/privacy.html:1 templates/web/zurich/faq/faq-de.html:1
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:186 templates/web/fixmystreet/report/update-form.html:102
+msgid "Forgotten your password?"
+msgstr ""
+
+#: templates/web/default/faq/faq-en-gb.html:1 templates/web/emptyhomes/faq/faq-cy.html:1 templates/web/emptyhomes/faq/faq-en-gb.html:1 templates/web/fiksgatami/faq/faq-nb.html:1 templates/web/fiksgatami/nn/faq/faq-nn.html:1 templates/web/fixmybarangay/faq/faq-en-gb.html:1 templates/web/fixmystreet/faq/faq-en-gb.html:1 templates/web/fixmystreet/static/privacy.html:1 templates/web/zurich/faq/faq-de.html:1
msgid "Frequently Asked Questions"
msgstr ""
@@ -802,7 +806,7 @@ msgstr ""
msgid "GeoRSS on Google Maps"
msgstr ""
-#: templates/web/bromley/report/display.html:30 templates/web/fixmystreet/report/display.html:23
+#: templates/web/bromley/report/display.html:30 templates/web/fixmystreet/report/display.html:31
msgid "Get updates"
msgstr ""
@@ -814,11 +818,11 @@ msgstr ""
msgid "Get updates of problems in this %s"
msgstr ""
-#: templates/web/default/alert/_list.html:83 templates/web/fixmystreet/alert/_list.html:82
+#: templates/web/default/alert/_list.html:83 templates/web/fixmybarangay/alert/_list.html:28 templates/web/fixmystreet/alert/_list.html:82
msgid "Give me an RSS feed"
msgstr ""
-#: templates/web/default/alert/index.html:34 templates/web/default/around/postcode_form.html:8 templates/web/emptyhomes/index.html:47 templates/web/fixmystreet/around/postcode_form.html:18
+#: templates/web/default/alert/index.html:34 templates/web/default/around/postcode_form.html:8 templates/web/emptyhomes/index.html:47 templates/web/fixmystreet/around/postcode_form.html:21
msgid "Go"
msgstr ""
@@ -842,7 +846,7 @@ msgstr ""
msgid "Have you ever reported a problem to a council before, or is this your first time?"
msgstr ""
-#: templates/web/barnet/footer.html:24 templates/web/bromley/footer.html:25 templates/web/bromley/header.html:81 templates/web/default/footer.html:15 templates/web/emptyhomes/header.html:28 templates/web/fiksgatami/footer.html:9 templates/web/fiksgatami/nn/footer.html:9 templates/web/fixmystreet/footer.html:53 templates/web/reading/footer.html:10
+#: templates/web/barnet/footer.html:24 templates/web/bromley/footer.html:25 templates/web/bromley/header.html:81 templates/web/default/footer.html:15 templates/web/emptyhomes/header.html:28 templates/web/fiksgatami/footer.html:9 templates/web/fiksgatami/nn/footer.html:9 templates/web/fixmybarangay/footer.html:24 templates/web/fixmystreet/footer.html:53 templates/web/reading/footer.html:10 templates/web/stevenage/footer.html:47 templates/web/zurich/footer.html:14
msgid "Help"
msgstr ""
@@ -850,7 +854,7 @@ msgstr ""
msgid "Here are the types of local problem alerts for &lsquo;%s&rsquo;."
msgstr ""
-#: templates/web/barnet/header.html:70 templates/web/bromley/header.html:64 templates/web/bromley/header.html:99 templates/web/fixmybarangay/header.html.orig:42 templates/web/fixmystreet/header.html:47 templates/web/zurich/header.html:47
+#: templates/web/barnet/header.html:70 templates/web/bromley/header.html:64 templates/web/bromley/header.html:99 templates/web/fixmybarangay/header.html:64 templates/web/fixmystreet/header.html:49 templates/web/stevenage/header.html:97 templates/web/zurich/header.html:47
msgid "Hi %s"
msgstr ""
@@ -858,23 +862,23 @@ msgstr ""
msgid "Hidden"
msgstr ""
-#: templates/web/default/around/display_location.html:58 templates/web/fixmystreet/around/display_location.html:58
+#: templates/web/default/around/display_location.html:63
msgid "Hide old"
msgstr ""
-#: templates/web/default/around/display_location.html:53 templates/web/fixmystreet/around/display_location.html:54
+#: templates/web/default/around/display_location.html:58
msgid "Hide pins"
msgstr ""
-#: templates/web/default/admin/council_edit.html:38
+#: templates/web/default/admin/council_edit.html:66
msgid "History"
msgstr ""
-#: templates/web/default/index.html:28 templates/web/emptyhomes/index.html:53 templates/web/fixmystreet/index.html:36
+#: templates/web/default/index-steps.html:1 templates/web/emptyhomes/index.html:53
msgid "How to report a problem"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:637
+#: perllib/FixMyStreet/App/Controller/Admin.pm:648
msgid "I am afraid you cannot confirm unconfirmed reports."
msgstr ""
@@ -921,7 +925,7 @@ msgstr ""
msgid "Illegal feed selection"
msgstr ""
-#: templates/web/bromley/report/display.html:80 templates/web/bromley/report/display.html:82 templates/web/default/admin/report_edit.html:18 templates/web/default/admin/report_edit.html:20 templates/web/default/dashboard/index.html:136 templates/web/default/dashboard/index.html:138 templates/web/default/report/display.html:79 templates/web/default/report/display.html:81 templates/web/fixmystreet/report/display.html:74 templates/web/fixmystreet/report/display.html:76
+#: templates/web/bromley/report/display.html:80 templates/web/bromley/report/display.html:82 templates/web/default/admin/report_edit.html:18 templates/web/default/admin/report_edit.html:20 templates/web/default/dashboard/index.html:138 templates/web/default/dashboard/index.html:140 templates/web/default/report/update-form.html:30 templates/web/default/report/update-form.html:32 templates/web/fixmystreet/report/update-form.html:28 templates/web/fixmystreet/report/update-form.html:30
msgid "In Progress"
msgstr ""
@@ -945,7 +949,7 @@ msgstr ""
msgid "Invalid agency_responsible value %s"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:942
+#: perllib/FixMyStreet/App/Controller/Admin.pm:952
msgid "Invalid end date"
msgstr ""
@@ -953,11 +957,11 @@ msgstr ""
msgid "Invalid format %s specified."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:932
+#: perllib/FixMyStreet/App/Controller/Admin.pm:942
msgid "Invalid start date"
msgstr ""
-#: templates/web/bromley/report/display.html:80 templates/web/bromley/report/display.html:81 templates/web/default/admin/report_edit.html:18 templates/web/default/admin/report_edit.html:19 templates/web/default/dashboard/index.html:136 templates/web/default/dashboard/index.html:137 templates/web/default/report/display.html:79 templates/web/default/report/display.html:80 templates/web/fixmystreet/report/display.html:74 templates/web/fixmystreet/report/display.html:75
+#: templates/web/bromley/report/display.html:80 templates/web/bromley/report/display.html:81 templates/web/default/admin/report_edit.html:18 templates/web/default/admin/report_edit.html:19 templates/web/default/dashboard/index.html:138 templates/web/default/dashboard/index.html:139 templates/web/default/report/update-form.html:30 templates/web/default/report/update-form.html:31 templates/web/fixmystreet/report/update-form.html:28 templates/web/fixmystreet/report/update-form.html:29
msgid "Investigating"
msgstr ""
@@ -965,7 +969,7 @@ msgstr ""
msgid "It is worth noting however that the process can sometimes be slow, especially if the property is in very poor repair or the owner is unwilling to act. In most cases it can take six months or more before you can expect to see anything change and sometimes there may be considerable barries to a property being brought back into use. This doesn&rsquo;t mean the council isn&rsquo;t doing anything. We encourage councils to update the website so you can see what is happening. It may be a long process, but you reporting your concerns about this property to the council is a valuable first step."
msgstr ""
-#: templates/web/bromley/report/display.html:166 templates/web/bromley/report/new/fill_in_details_form.html:209 templates/web/default/auth/general.html:44 templates/web/default/report/display.html:151 templates/web/default/report/new/fill_in_details_form.html:149 templates/web/fixmystreet/auth/general.html:42 templates/web/fixmystreet/report/display.html:144 templates/web/fixmystreet/report/new/fill_in_details_form.html:167
+#: templates/web/bromley/report/display.html:166 templates/web/bromley/report/new/fill_in_details_form.html:209 templates/web/default/auth/general.html:44 templates/web/default/report/new/fill_in_details_form.html:149 templates/web/default/report/update-form.html:102 templates/web/fixmystreet/auth/general.html:46 templates/web/fixmystreet/report/new/fill_in_details_form.html:182 templates/web/fixmystreet/report/update-form.html:98
msgid "Keep me signed in on this computer"
msgstr ""
@@ -973,7 +977,7 @@ msgstr ""
msgid "Last Name"
msgstr ""
-#: templates/web/default/admin/council_contacts.html:39
+#: templates/web/default/admin/council_contacts.html:42
msgid "Last editor"
msgstr ""
@@ -985,19 +989,15 @@ msgstr ""
msgid "Last&nbsp;update:"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1028
-msgid "List Flagged"
-msgstr ""
-
-#: templates/web/default/admin/council_contacts.html:14 templates/web/default/admin/council_contacts.html:16
+#: templates/web/default/admin/council_contacts.html:16 templates/web/default/admin/council_contacts.html:18
msgid "List all reported problems"
msgstr ""
-#: templates/web/bromley/report/new/fill_in_details_form.html:69 templates/web/default/report/new/fill_in_details_form.html:68 templates/web/fixmystreet/report/new/fill_in_details_form.html:73
+#: templates/web/bromley/report/new/fill_in_details_form.html:69 templates/web/default/report/new/fill_in_details_form.html:68 templates/web/fixmystreet/report/new/fill_in_details_form.html:75 templates/web/zurich/report/new/fill_in_details_form.html:69
msgid "Loading..."
msgstr ""
-#: templates/web/default/alert/choose.html:1 templates/web/default/alert/choose.html:3 templates/web/default/alert/index.html:1 templates/web/default/alert/index.html:3 templates/web/default/alert/list.html:1 templates/web/default/alert/list.html:5 templates/web/default/alert/updates.html:1 templates/web/default/tokens/confirm_alert.html:1 templates/web/default/tokens/confirm_alert.html:3 templates/web/emptyhomes/alert/index.html:1 templates/web/emptyhomes/alert/index.html:3 templates/web/fixmystreet/alert/updates.html:1
+#: templates/web/default/alert/choose.html:1 templates/web/default/alert/choose.html:3 templates/web/default/alert/index.html:1 templates/web/default/alert/index.html:3 templates/web/default/alert/list.html:1 templates/web/default/alert/list.html:5 templates/web/default/alert/updates.html:1 templates/web/default/tokens/confirm_alert.html:1 templates/web/default/tokens/confirm_alert.html:3 templates/web/emptyhomes/alert/index.html:1 templates/web/emptyhomes/alert/index.html:3 templates/web/fixmybarangay/alert/index.html:1 templates/web/fixmybarangay/alert/index.html:3 templates/web/fixmystreet/alert/updates.html:1
msgid "Local RSS feeds and email alerts"
msgstr ""
@@ -1005,11 +1005,11 @@ msgstr ""
msgid "Local RSS feeds and email alerts for ‘%s’"
msgstr ""
-#: templates/web/barnet/footer.html:22 templates/web/bromley/footer.html:23 templates/web/bromley/header.html:79 templates/web/default/footer.html:13 templates/web/fiksgatami/footer.html:8 templates/web/fiksgatami/nn/footer.html:8 templates/web/fixmystreet/footer.html:51 templates/web/reading/footer.html:9
+#: templates/web/barnet/footer.html:22 templates/web/bromley/footer.html:23 templates/web/bromley/header.html:79 templates/web/default/footer.html:13 templates/web/fiksgatami/footer.html:8 templates/web/fiksgatami/nn/footer.html:8 templates/web/fixmybarangay/footer.html:22 templates/web/fixmystreet/footer.html:51 templates/web/reading/footer.html:9 templates/web/stevenage/footer.html:45
msgid "Local alerts"
msgstr ""
-#: templates/web/default/index.html:32 templates/web/emptyhomes/index.html:57 templates/web/fixmystreet/index.html:40
+#: templates/web/default/index-steps.html:10 templates/web/emptyhomes/index.html:57
msgid "Locate the problem on a map of the area"
msgstr ""
@@ -1037,7 +1037,7 @@ msgstr ""
msgid "More problems nearby"
msgstr ""
-#: templates/web/default/admin/list_flagged.html:11 templates/web/default/admin/list_flagged.html:34 templates/web/default/admin/list_updates.html:7 templates/web/default/admin/search_reports.html:14 templates/web/default/admin/search_users.html:12 templates/web/default/reports/index.html:15 templates/web/emptyhomes/reports/index.html:10 templates/web/fiksgatami/nn/reports/index.html:9 templates/web/fiksgatami/reports/index.html:9 templates/web/fixmystreet/auth/general.html:52 templates/web/fixmystreet/report/display.html:177 templates/web/fixmystreet/report/new/fill_in_details_form.html:117 templates/web/fixmystreet/report/new/fill_in_details_form.html:176
+#: templates/web/default/admin/list_flagged.html:11 templates/web/default/admin/list_flagged.html:34 templates/web/default/admin/list_updates.html:7 templates/web/default/admin/search_reports.html:14 templates/web/default/admin/search_users.html:12 templates/web/default/reports/index.html:15 templates/web/emptyhomes/reports/index.html:10 templates/web/fiksgatami/nn/reports/index.html:9 templates/web/fiksgatami/reports/index.html:9 templates/web/fixmybarangay/reports/index.html:19 templates/web/fixmystreet/auth/general.html:56 templates/web/fixmystreet/report/new/fill_in_details_form.html:120 templates/web/fixmystreet/report/new/fill_in_details_form.html:197 templates/web/fixmystreet/report/update-form.html:134 templates/web/zurich/report/new/fill_in_details_form.html:118
msgid "Name"
msgstr ""
@@ -1049,19 +1049,19 @@ msgstr ""
msgid "Navigation"
msgstr ""
-#: perllib/FixMyStreet/Geocode/OSM.pm:159
+#: perllib/FixMyStreet/Geocode/OSM.pm:166
msgid "Nearest named road to the pin placed on the map (automatically generated using OpenStreetMap): %s%s"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/UK.pm:161
+#: perllib/FixMyStreet/Cobrand/UK.pm:152
msgid "Nearest postcode to the pin placed on the map (automatically generated): %s (%sm away)"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Default.pm:404 perllib/FixMyStreet/Cobrand/Default.pm:444
+#: perllib/FixMyStreet/Cobrand/Default.pm:407 perllib/FixMyStreet/Cobrand/Default.pm:447
msgid "Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:245
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:265
msgid ""
"Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s\n"
"\n"
@@ -1071,11 +1071,11 @@ msgstr ""
msgid "Nearly Done! Now check your email..."
msgstr ""
-#: templates/web/default/reports/index.html:16
+#: templates/web/default/reports/index.html:16 templates/web/fixmybarangay/reports/index.html:20
msgid "New <br>problems"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:314
+#: perllib/FixMyStreet/App/Controller/Admin.pm:320
msgid "New category contact added"
msgstr ""
@@ -1139,7 +1139,7 @@ msgstr ""
msgid "New!"
msgstr ""
-#: templates/web/default/admin/council_contacts.html:48 templates/web/default/admin/council_contacts.html:49 templates/web/default/admin/council_edit.html:4 templates/web/default/admin/list_updates.html:30 templates/web/default/admin/list_updates.html:31 templates/web/default/admin/list_updates.html:32 templates/web/default/admin/problem_row.html:19 templates/web/default/admin/report_edit.html:28 templates/web/default/admin/report_edit.html:41 templates/web/default/admin/update_edit.html:16 templates/web/default/questionnaire/creator_fixed.html:16 templates/web/default/questionnaire/index.html:107 templates/web/default/questionnaire/index.html:68 templates/web/fixmystreet/questionnaire/index.html:101 templates/web/fixmystreet/questionnaire/index.html:62
+#: templates/web/default/admin/council_contacts.html:52 templates/web/default/admin/council_contacts.html:53 templates/web/default/admin/council_contacts.html:54 templates/web/default/admin/council_edit.html:4 templates/web/default/admin/list_updates.html:30 templates/web/default/admin/list_updates.html:31 templates/web/default/admin/list_updates.html:32 templates/web/default/admin/problem_row.html:19 templates/web/default/admin/report_edit.html:28 templates/web/default/admin/report_edit.html:41 templates/web/default/admin/update_edit.html:16 templates/web/default/questionnaire/creator_fixed.html:16 templates/web/default/questionnaire/index.html:107 templates/web/default/questionnaire/index.html:68 templates/web/fixmystreet/questionnaire/index.html:101 templates/web/fixmystreet/questionnaire/index.html:62
msgid "No"
msgstr ""
@@ -1147,7 +1147,7 @@ msgstr ""
msgid "No council"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:328
+#: perllib/FixMyStreet/DB/Result/Problem.pm:336
msgid "No council selected"
msgstr ""
@@ -1175,6 +1175,14 @@ msgstr ""
msgid "No problems have been reported yet."
msgstr ""
+#: templates/web/default/report/_support.html:3
+msgid "No supporters"
+msgstr ""
+
+#: templates/web/default/admin/council_contacts.html:57
+msgid "Non Public"
+msgstr ""
+
#: templates/web/default/admin/council_list.html:5 templates/web/default/admin/report_edit.html:16
msgid "None"
msgstr ""
@@ -1183,11 +1191,11 @@ msgstr ""
msgid "Not reported before"
msgstr ""
-#: templates/web/default/report/_main.html:11 templates/web/emptyhomes/report/display.html:24 templates/web/fixmystreet/report/_main.html:13
+#: templates/web/default/report/_main.html:14 templates/web/emptyhomes/report/display.html:24
msgid "Not reported to council"
msgstr ""
-#: templates/web/default/admin/council_contacts.html:40 templates/web/default/admin/council_edit.html:46
+#: templates/web/default/admin/council_contacts.html:43 templates/web/default/admin/council_edit.html:74
msgid "Note"
msgstr ""
@@ -1195,7 +1203,7 @@ msgstr ""
msgid "Note that when including unconfirmed reports we use the date the report was created which may not be in the same month the report was confirmed so the numbers may jump about a little"
msgstr ""
-#: templates/web/default/admin/council_contacts.html:89 templates/web/default/admin/council_edit.html:31
+#: templates/web/default/admin/council_contacts.html:95 templates/web/default/admin/council_edit.html:32
msgid "Note:"
msgstr ""
@@ -1203,7 +1211,7 @@ msgstr ""
msgid "Note: <strong>%s</strong>"
msgstr ""
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:149
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:164
msgid "Now to submit your report&hellip;"
msgstr ""
@@ -1211,11 +1219,11 @@ msgstr ""
msgid "Now to submit your report&hellip; do you have a FixMyStreet password?"
msgstr ""
-#: templates/web/fixmystreet/report/display.html:127
+#: templates/web/fixmystreet/report/update-form.html:81
msgid "Now to submit your update&hellip;"
msgstr ""
-#: templates/web/default/report/display.html:133
+#: templates/web/default/report/update-form.html:84
msgid "Now to submit your update&hellip; do you have a FixMyStreet password?"
msgstr ""
@@ -1223,7 +1231,7 @@ msgstr ""
msgid "Offensive? Unsuitable? Tell us"
msgstr ""
-#: templates/web/default/reports/index.html:18
+#: templates/web/default/reports/index.html:18 templates/web/fixmybarangay/reports/index.html:22
msgid "Old / unknown <br>problems"
msgstr ""
@@ -1235,11 +1243,11 @@ msgstr ""
msgid "Old state"
msgstr ""
-#: templates/web/default/reports/index.html:20
+#: templates/web/default/reports/index.html:20 templates/web/fixmybarangay/reports/index.html:24
msgid "Older <br>fixed"
msgstr ""
-#: templates/web/default/reports/index.html:17
+#: templates/web/default/reports/index.html:17 templates/web/fixmybarangay/reports/index.html:21
msgid "Older <br>problems"
msgstr ""
@@ -1251,11 +1259,11 @@ msgstr ""
msgid "Older problems"
msgstr ""
-#: templates/web/bromley/report/display.html:80 templates/web/default/admin/report_edit.html:18 templates/web/default/admin/update_edit.html:19 templates/web/default/dashboard/index.html:136 templates/web/default/report/display.html:79 templates/web/fixmystreet/report/display.html:74
+#: templates/web/bromley/report/display.html:80 templates/web/default/admin/report_edit.html:18 templates/web/default/admin/update_edit.html:19 templates/web/default/dashboard/index.html:138 templates/web/default/report/update-form.html:30 templates/web/fixmystreet/report/update-form.html:28
msgid "Open"
msgstr ""
-#: templates/web/default/my/my.html:22 templates/web/fixmystreet/my/my.html:22
+#: templates/web/default/my/my.html:22 templates/web/fixmystreet/my/my.html:26
msgid "Open reports"
msgstr ""
@@ -1279,7 +1287,7 @@ msgstr ""
msgid "Or you can subscribe to an alert based upon what ward or council you&rsquo;re in:"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:655 perllib/FixMyStreet/App/Controller/Report/New.pm:656 perllib/FixMyStreet/App/Controller/Report/New.pm:999 perllib/FixMyStreet/DB/Result/Problem.pm:497 perllib/FixMyStreet/DB/Result/Problem.pm:507 perllib/FixMyStreet/DB/Result/Problem.pm:517 perllib/FixMyStreet/DB/Result/Problem.pm:529 perllib/FixMyStreet/DB/ResultSet/Problem.pm:329 perllib/FixMyStreet/DB/ResultSet/Problem.pm:338
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:1006 perllib/FixMyStreet/App/Controller/Report/New.pm:656 perllib/FixMyStreet/App/Controller/Report/New.pm:657 perllib/FixMyStreet/DB/Result/Problem.pm:505 perllib/FixMyStreet/DB/Result/Problem.pm:515 perllib/FixMyStreet/DB/Result/Problem.pm:525 perllib/FixMyStreet/DB/Result/Problem.pm:537 perllib/FixMyStreet/DB/ResultSet/Problem.pm:331 perllib/FixMyStreet/DB/ResultSet/Problem.pm:340
msgid "Other"
msgstr ""
@@ -1299,7 +1307,7 @@ msgstr ""
msgid "Partial"
msgstr ""
-#: templates/web/bromley/report/display.html:145 templates/web/bromley/report/new/fill_in_details_form.html:186 templates/web/fixmystreet/auth/general.html:55 templates/web/fixmystreet/report/display.html:157 templates/web/fixmystreet/report/new/fill_in_details_form.html:197
+#: templates/web/bromley/report/display.html:145 templates/web/bromley/report/new/fill_in_details_form.html:186 templates/web/fixmystreet/auth/general.html:59 templates/web/fixmystreet/report/new/fill_in_details_form.html:218 templates/web/fixmystreet/report/update-form.html:117
msgid "Password (optional)"
msgstr ""
@@ -1307,19 +1315,19 @@ msgstr ""
msgid "Password:"
msgstr ""
-#: templates/web/bromley/report/new/fill_in_details_form.html:136 templates/web/bromley/report/new/fill_in_details_form.html:183 templates/web/fixmystreet/report/new/fill_in_details_form.html:133 templates/web/fixmystreet/report/new/fill_in_details_form.html:194
+#: templates/web/bromley/report/new/fill_in_details_form.html:136 templates/web/bromley/report/new/fill_in_details_form.html:183 templates/web/fixmystreet/report/new/fill_in_details_form.html:148 templates/web/fixmystreet/report/new/fill_in_details_form.html:215 templates/web/zurich/report/new/fill_in_details_form.html:124
msgid "Phone number (optional)"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:260 templates/web/default/admin/report_edit.html:32 templates/web/default/report/new/fill_in_details_form.html:215
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:262 templates/web/default/admin/report_edit.html:32 templates/web/default/report/new/fill_in_details_form.html:215
msgid "Phone:"
msgstr ""
-#: templates/web/bromley/report/display.html:109 templates/web/bromley/report/new/fill_in_details_form.html:104 templates/web/fixmystreet/report/display.html:103 templates/web/fixmystreet/report/new/fill_in_details_form.html:108
+#: templates/web/bromley/report/display.html:109 templates/web/bromley/report/new/fill_in_details_form.html:104 templates/web/fixmystreet/report/new/fill_in_details_form.html:92 templates/web/fixmystreet/report/update-form.html:57 templates/web/zurich/report/new/fill_in_details_form.html:86
msgid "Photo"
msgstr ""
-#: templates/web/default/questionnaire/index.html:95 templates/web/default/report/display.html:109 templates/web/default/report/new/fill_in_details_form.html:102 templates/web/fixmystreet/questionnaire/index.html:90
+#: templates/web/default/questionnaire/index.html:95 templates/web/default/report/new/fill_in_details_form.html:102 templates/web/default/report/update-form.html:60 templates/web/fixmystreet/questionnaire/index.html:90
msgid "Photo:"
msgstr ""
@@ -1327,7 +1335,7 @@ msgstr ""
msgid "Photos of recent nearby reports"
msgstr ""
-#: templates/web/bromley/report/display.html:80 templates/web/bromley/report/display.html:81 templates/web/default/admin/report_edit.html:18 templates/web/default/admin/report_edit.html:19 templates/web/default/dashboard/index.html:136 templates/web/default/dashboard/index.html:137 templates/web/default/report/display.html:79 templates/web/default/report/display.html:80 templates/web/fixmystreet/report/display.html:74 templates/web/fixmystreet/report/display.html:75
+#: templates/web/bromley/report/display.html:80 templates/web/bromley/report/display.html:81 templates/web/default/admin/report_edit.html:18 templates/web/default/admin/report_edit.html:19 templates/web/default/dashboard/index.html:138 templates/web/default/dashboard/index.html:139 templates/web/default/report/update-form.html:30 templates/web/default/report/update-form.html:31 templates/web/fixmystreet/report/update-form.html:28 templates/web/fixmystreet/report/update-form.html:29
msgid "Planned"
msgstr ""
@@ -1351,11 +1359,11 @@ msgstr ""
msgid "Please check your email address is correct"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:819 perllib/FixMyStreet/App/Controller/Report/New.pm:826 perllib/FixMyStreet/App/Controller/Report/New.pm:845 perllib/FixMyStreet/App/Controller/Report/New.pm:884 perllib/FixMyStreet/DB/Result/Problem.pm:347 templates/web/default/js/validation_strings.html:9
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:822 perllib/FixMyStreet/App/Controller/Report/New.pm:829 perllib/FixMyStreet/App/Controller/Report/New.pm:848 perllib/FixMyStreet/App/Controller/Report/New.pm:891 perllib/FixMyStreet/DB/Result/Problem.pm:355 templates/web/default/js/validation_strings.html:9
msgid "Please choose a category"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:353
+#: perllib/FixMyStreet/DB/Result/Problem.pm:361
msgid "Please choose a property type"
msgstr ""
@@ -1371,7 +1379,7 @@ msgid ""
msgstr ""
#: templates/web/default/report/new/notes.html:7 templates/web/fixmystreet/report/new/notes.html:6
-msgid "Please do not be abusive &mdash; abusing your council devalues the service for all users."
+msgid "Please do not be abusive&nbsp;&mdash; abusing your council devalues the service for all users."
msgstr ""
#: perllib/FixMyStreet/DB/Result/Comment.pm:146 templates/web/default/js/validation_strings.html:2
@@ -1382,7 +1390,7 @@ msgstr ""
msgid "Please enter a password"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:97 perllib/FixMyStreet/DB/Result/Problem.pm:322 templates/web/default/js/validation_strings.html:3
+#: perllib/FixMyStreet/App/Controller/Contact.pm:97 perllib/FixMyStreet/DB/Result/Problem.pm:330 templates/web/default/js/validation_strings.html:3
msgid "Please enter a subject"
msgstr ""
@@ -1394,7 +1402,7 @@ msgstr ""
msgid "Please enter a valid email address"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:325 templates/web/default/js/validation_strings.html:4
+#: perllib/FixMyStreet/DB/Result/Problem.pm:333 templates/web/default/js/validation_strings.html:4
msgid "Please enter some details"
msgstr ""
@@ -1402,7 +1410,7 @@ msgstr ""
msgid "Please enter your email"
msgstr ""
-#: templates/web/bromley/report/new/fill_in_details_form.html:149 templates/web/fixmystreet/report/new/fill_in_details_form.html:146
+#: templates/web/bromley/report/new/fill_in_details_form.html:149 templates/web/fixmystreet/report/new/fill_in_details_form.html:161 templates/web/zurich/report/new/fill_in_details_form.html:110
msgid "Please enter your email address"
msgstr ""
@@ -1410,11 +1418,11 @@ msgstr ""
msgid "Please enter your first name"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:340 templates/web/default/js/validation_strings.html:7
+#: perllib/FixMyStreet/DB/Result/Problem.pm:348 templates/web/default/js/validation_strings.html:7
msgid "Please enter your full name, councils need this information – if you do not wish your name to be shown on the site, untick the box below"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Contact.pm:95 perllib/FixMyStreet/DB/Result/Comment.pm:143 perllib/FixMyStreet/DB/Result/Problem.pm:333 perllib/FixMyStreet/DB/Result/User.pm:97 templates/web/default/js/validation_strings.html:6
+#: perllib/FixMyStreet/App/Controller/Contact.pm:95 perllib/FixMyStreet/DB/Result/Comment.pm:143 perllib/FixMyStreet/DB/Result/Problem.pm:341 perllib/FixMyStreet/DB/Result/User.pm:97 templates/web/default/js/validation_strings.html:6
msgid "Please enter your name"
msgstr ""
@@ -1436,10 +1444,17 @@ msgid ""
"to read, as does a lack of punctuation."
msgstr ""
-#: templates/web/default/report/new/fill_in_details_text.html:1 templates/web/default/report/new/fill_in_details_text.html:11 templates/web/fixmystreet/report/new/fill_in_details_text.html:1 templates/web/fixmystreet/report/new/fill_in_details_text.html:11
+#: templates/web/default/report/new/fill_in_details_text.html:1 templates/web/default/report/new/fill_in_details_text.html:11 templates/web/fixmybarangay/report/new/fill_in_details_text.html:1 templates/web/fixmybarangay/report/new/fill_in_details_text.html:10 templates/web/fixmystreet/report/new/fill_in_details_text.html:1 templates/web/fixmystreet/report/new/fill_in_details_text.html:8
msgid "Please fill in details of the problem below."
msgstr ""
+#: templates/web/fixmybarangay/report/new/fill_in_details_text.html:1 templates/web/fixmybarangay/report/new/fill_in_details_text.html:3
+msgid ""
+"Please fill in details of the problem below. Leave as much detail as you can, \n"
+"and if possible describe the exact location of\n"
+"the problem (e.g. if there is a streetlight number or road name)."
+msgstr ""
+
#: templates/web/default/report/new/fill_in_details_text.html:1 templates/web/default/report/new/fill_in_details_text.html:3
msgid ""
"Please fill in details of the problem below. The council won't be able\n"
@@ -1448,15 +1463,15 @@ msgid ""
"photo of the problem if you have one), etc."
msgstr ""
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:68
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:70 templates/web/zurich/report/new/fill_in_details_form.html:64
msgid "Please fill in details of the problem."
msgstr ""
-#: templates/web/bromley/report/new/fill_in_details_form.html:28 templates/web/default/report/new/fill_in_details_form.html:27 templates/web/fixmystreet/report/new/fill_in_details_form.html:34
+#: templates/web/bromley/report/new/fill_in_details_form.html:28 templates/web/default/report/new/fill_in_details_form.html:27 templates/web/fixmystreet/report/new/fill_in_details_form.html:35 templates/web/zurich/report/new/fill_in_details_form.html:35
msgid "Please fill in the form below with details of the problem, and describe the location as precisely as possible in the details box."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:241
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:243
msgid "Please indicate whether you'd like to receive another questionnaire"
msgstr ""
@@ -1464,7 +1479,7 @@ msgstr ""
msgid "Please note that updates are not sent to the council."
msgstr ""
-#: templates/web/default/report/display.html:56
+#: templates/web/default/report/update-form.html:7
msgid "Please note that updates are not sent to the council. If you leave your name it will be public. Your information will only be used in accordance with our <a href=\"/faq#privacy\">privacy policy</a>"
msgstr ""
@@ -1472,23 +1487,23 @@ msgstr ""
msgid "Please note that updates are not sent to the relevant department. If you leave your name it will be public. Your information will only be used in accordance with our <a href=\"/faq#privacy\">privacy policy</a>"
msgstr ""
-#: templates/web/bromley/report/new/fill_in_details_form.html:23 templates/web/default/report/new/fill_in_details_form.html:5 templates/web/fixmystreet/report/new/fill_in_details_form.html:25
+#: templates/web/bromley/report/new/fill_in_details_form.html:23 templates/web/default/report/new/fill_in_details_form.html:5 templates/web/fixmystreet/report/new/fill_in_details_form.html:26 templates/web/zurich/report/new/fill_in_details_form.html:26
msgid "Please note your report has <strong>not yet been sent</strong>. Choose a category and add further information below, then submit."
msgstr ""
-#: templates/web/default/report/new/notes.html:1 templates/web/fixmystreet/report/new/notes.html:1
+#: templates/web/default/report/new/notes.html:1 templates/web/fixmybarangay/report/new/notes.html:1 templates/web/fixmystreet/report/new/notes.html:1
msgid "Please note:"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:244
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:246
msgid "Please provide some explanation as to why you're reopening this report"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:251
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:253
msgid "Please provide some text as well as a photo"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:116 perllib/FixMyStreet/App/Controller/Questionnaire.pm:237
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:116 perllib/FixMyStreet/App/Controller/Questionnaire.pm:239
msgid "Please say whether you've ever reported a problem to your council before"
msgstr ""
@@ -1500,7 +1515,7 @@ msgstr ""
msgid "Please select the type of alert you want"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:233
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:235
msgid "Please state whether or not the problem has been fixed"
msgstr ""
@@ -1508,11 +1523,11 @@ msgstr ""
msgid "Please take a look at the updates that have been left."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Photo.pm:176
+#: perllib/FixMyStreet/App/Controller/Photo.pm:175
msgid "Please upload a JPEG image only"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Photo.pm:183
+#: perllib/FixMyStreet/App/Controller/Photo.pm:182
msgid "Please upload a JPEG image only\n"
msgstr ""
@@ -1520,11 +1535,11 @@ msgstr ""
msgid "Please write a message"
msgstr ""
-#: templates/web/bromley/report/display.html:70 templates/web/fixmystreet/report/display.html:69
+#: templates/web/bromley/report/display.html:70 templates/web/fixmystreet/report/update-form.html:23
msgid "Please write your update here"
msgstr ""
-#: templates/web/bromley/report/display.html:121 templates/web/bromley/report/display.html:149 templates/web/bromley/report/display.html:161 templates/web/default/contact/index.html:93 templates/web/default/report/display.html:119 templates/web/default/report/display.html:156 templates/web/default/report/display.html:178 templates/web/fixmystreet/contact/index.html:93 templates/web/fixmystreet/report/display.html:115 templates/web/fixmystreet/report/display.html:139 templates/web/fixmystreet/report/display.html:161
+#: templates/web/bromley/report/display.html:121 templates/web/bromley/report/display.html:149 templates/web/bromley/report/display.html:161 templates/web/default/contact/index.html:93 templates/web/default/report/update-form.html:107 templates/web/default/report/update-form.html:129 templates/web/default/report/update-form.html:70 templates/web/fixmystreet/contact/index.html:93 templates/web/fixmystreet/report/update-form.html:121 templates/web/fixmystreet/report/update-form.html:69 templates/web/fixmystreet/report/update-form.html:93
msgid "Post"
msgstr ""
@@ -1540,6 +1555,10 @@ msgstr ""
msgid "Posted by %s at %s"
msgstr ""
+#: templates/web/default/admin/council_contacts.html:100 templates/web/default/admin/council_edit.html:30 templates/web/default/admin/report_edit.html:43
+msgid "Private"
+msgstr ""
+
#: templates/web/default/maps/openlayers.html:85
msgid "Problem"
msgstr ""
@@ -1560,7 +1579,7 @@ msgstr ""
msgid "Problem breakdown by state"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:819
+#: perllib/FixMyStreet/App/Controller/Admin.pm:849
msgid "Problem marked as open."
msgstr ""
@@ -1572,15 +1591,15 @@ msgstr ""
msgid "Problems"
msgstr ""
-#: templates/web/default/around/display_location.html:81
+#: templates/web/default/around/_updates.html:1
msgid "Problems in this area"
msgstr ""
-#: templates/web/bromley/report/display.html:31 templates/web/fixmystreet/around/display_location.html:98 templates/web/fixmystreet/report/display.html:24
+#: templates/web/bromley/report/display.html:31 templates/web/fixmystreet/around/tabbed_lists.html:4 templates/web/fixmystreet/report/display.html:35
msgid "Problems nearby"
msgstr ""
-#: templates/web/fixmystreet/around/display_location.html:97
+#: templates/web/fixmystreet/around/tabbed_lists.html:3
msgid "Problems on the map"
msgstr ""
@@ -1592,19 +1611,19 @@ msgstr ""
msgid "Problems within %.1fkm of this location"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Default.pm:609 perllib/FixMyStreet/Cobrand/EmptyHomes.pm:95 perllib/FixMyStreet/Cobrand/FiksGataMi.pm:162 perllib/FixMyStreet/Cobrand/UK.pm:240
+#: perllib/FixMyStreet/Cobrand/Default.pm:612 perllib/FixMyStreet/Cobrand/EmptyHomes.pm:95 perllib/FixMyStreet/Cobrand/FiksGataMi.pm:162 perllib/FixMyStreet/Cobrand/UK.pm:231
msgid "Problems within %s"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:103 perllib/FixMyStreet/Cobrand/UK.pm:254
+#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:103 perllib/FixMyStreet/Cobrand/UK.pm:245
msgid "Problems within %s ward"
msgstr ""
-#: templates/web/default/reports/council.html:0 templates/web/default/reports/council.html:29
+#: templates/web/default/reports/body.html:0 templates/web/default/reports/body.html:29
msgid "Problems within %s, FixMyStreet"
msgstr ""
-#: templates/web/default/alert/_list.html:40 templates/web/fixmystreet/alert/_list.html:42
+#: templates/web/default/alert/_list.html:40 templates/web/fixmybarangay/alert/_list.html:13 templates/web/fixmystreet/alert/_list.html:42
msgid "Problems within the boundary of:"
msgstr ""
@@ -1612,15 +1631,15 @@ msgstr ""
msgid "Properties recently reported as put back to use on reportemptyhomes.com"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:617
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:616
msgid "Property type:"
msgstr ""
-#: templates/web/bromley/report/new/fill_in_details_form.html:52 templates/web/fixmystreet/report/new/fill_in_details_form.html:62
+#: templates/web/bromley/report/new/fill_in_details_form.html:52 templates/web/fixmystreet/report/new/fill_in_details_form.html:64
msgid "Provide a title"
msgstr ""
-#: templates/web/bromley/report/display.html:57 templates/web/default/report/display.html:51 templates/web/fixmystreet/report/display.html:50
+#: templates/web/bromley/report/display.html:57 templates/web/default/report/update-form.html:3 templates/web/fixmystreet/report/update-form.html:4
msgid "Provide an update"
msgstr ""
@@ -1628,10 +1647,14 @@ msgstr ""
msgid "Providing a password is optional, but doing so will allow you to more easily report future problems, leave updates and manage your reports."
msgstr ""
-#: templates/web/bromley/report/display.html:142 templates/web/default/report/display.html:175 templates/web/default/report/new/fill_in_details_form.html:173 templates/web/fixmystreet/report/display.html:154 templates/web/fixmystreet/report/new/fill_in_details_form.html:191
+#: templates/web/bromley/report/display.html:142 templates/web/default/report/new/fill_in_details_form.html:173 templates/web/default/report/update-form.html:126 templates/web/fixmystreet/report/new/fill_in_details_form.html:212 templates/web/fixmystreet/report/update-form.html:114
msgid "Providing a password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports."
msgstr ""
+#: templates/web/default/admin/council_contacts.html:44 templates/web/default/admin/council_contacts.html:57
+msgid "Public"
+msgstr ""
+
#: templates/web/default/questionnaire/completed.html:1 templates/web/default/questionnaire/completed.html:2 templates/web/default/questionnaire/index.html:0 templates/web/default/questionnaire/index.html:14 templates/web/default/questionnaire/index.html:4 templates/web/fixmystreet/questionnaire/index.html:0 templates/web/fixmystreet/questionnaire/index.html:14 templates/web/fixmystreet/questionnaire/index.html:32 templates/web/fixmystreet/questionnaire/index.html:4
msgid "Questionnaire"
msgstr ""
@@ -1644,27 +1667,27 @@ msgstr ""
msgid "Questionnaire %d sent for problem %d"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:190
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:192
msgid "Questionnaire filled in by problem reporter"
msgstr ""
-#: templates/web/bromley/report/display.html:37 templates/web/default/alert/_list.html:21 templates/web/default/around/display_location.html:1 templates/web/default/around/display_location.html:3 templates/web/default/report/display.html:42 templates/web/default/reports/_rss.html:1 templates/web/fixmystreet/alert/_list.html:22 templates/web/fixmystreet/alert/updates.html:9 templates/web/fixmystreet/around/display_location.html:1 templates/web/fixmystreet/around/display_location.html:3 templates/web/fixmystreet/report/display.html:30
+#: templates/web/bromley/report/display.html:37 templates/web/default/alert/_list.html:21 templates/web/default/around/display_location.html:1 templates/web/default/around/display_location.html:3 templates/web/default/report/display.html:42 templates/web/default/reports/_rss.html:1 templates/web/fixmystreet/alert/_list.html:22 templates/web/fixmystreet/alert/updates.html:9 templates/web/fixmystreet/report/display.html:49
msgid "RSS feed"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/UK.pm:283 perllib/FixMyStreet/Cobrand/UK.pm:295
+#: perllib/FixMyStreet/Cobrand/UK.pm:274 perllib/FixMyStreet/Cobrand/UK.pm:286
msgid "RSS feed for %s"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/UK.pm:289 perllib/FixMyStreet/Cobrand/UK.pm:301
+#: perllib/FixMyStreet/Cobrand/UK.pm:280 perllib/FixMyStreet/Cobrand/UK.pm:292
msgid "RSS feed for %s ward, %s"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:178 perllib/FixMyStreet/Cobrand/FiksGataMi.pm:186 perllib/FixMyStreet/Cobrand/FiksGataMi.pm:196 perllib/FixMyStreet/Cobrand/FiksGataMi.pm:204 perllib/FixMyStreet/Cobrand/UK.pm:309 perllib/FixMyStreet/Cobrand/UK.pm:321
+#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:178 perllib/FixMyStreet/Cobrand/FiksGataMi.pm:186 perllib/FixMyStreet/Cobrand/FiksGataMi.pm:196 perllib/FixMyStreet/Cobrand/FiksGataMi.pm:204 perllib/FixMyStreet/Cobrand/UK.pm:300 perllib/FixMyStreet/Cobrand/UK.pm:312
msgid "RSS feed of %s"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/UK.pm:314 perllib/FixMyStreet/Cobrand/UK.pm:326
+#: perllib/FixMyStreet/Cobrand/UK.pm:305 perllib/FixMyStreet/Cobrand/UK.pm:317
msgid "RSS feed of %s, within %s ward"
msgstr ""
@@ -1676,31 +1699,31 @@ msgstr ""
msgid "RSS feed of problems in this %s"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Default.pm:610 perllib/FixMyStreet/Cobrand/EmptyHomes.pm:96 perllib/FixMyStreet/Cobrand/FiksGataMi.pm:161 perllib/FixMyStreet/Cobrand/UK.pm:247
+#: perllib/FixMyStreet/Cobrand/Default.pm:613 perllib/FixMyStreet/Cobrand/EmptyHomes.pm:96 perllib/FixMyStreet/Cobrand/FiksGataMi.pm:161 perllib/FixMyStreet/Cobrand/UK.pm:238
msgid "RSS feed of problems within %s"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:102 perllib/FixMyStreet/Cobrand/UK.pm:253
+#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:102 perllib/FixMyStreet/Cobrand/UK.pm:244
msgid "RSS feed of problems within %s ward"
msgstr ""
-#: templates/web/default/around/display_location.html:1 templates/web/default/around/display_location.html:4 templates/web/fixmystreet/around/display_location.html:1 templates/web/fixmystreet/around/display_location.html:4
+#: templates/web/default/around/display_location.html:1 templates/web/default/around/display_location.html:4
msgid "RSS feed of recent local problems"
msgstr ""
-#: templates/web/bromley/report/display.html:37 templates/web/default/report/display.html:42 templates/web/fixmystreet/alert/updates.html:9 templates/web/fixmystreet/report/display.html:30
+#: templates/web/bromley/report/display.html:37 templates/web/default/report/display.html:42 templates/web/fixmystreet/alert/updates.html:9 templates/web/fixmystreet/report/display.html:49
msgid "RSS feed of updates to this problem"
msgstr ""
-#: templates/web/bromley/report/display.html:39 templates/web/default/alert/updates.html:9 templates/web/default/report/display.html:33 templates/web/fixmystreet/alert/updates.html:14 templates/web/fixmystreet/report/display.html:32
+#: templates/web/bromley/report/display.html:39 templates/web/default/alert/updates.html:9 templates/web/default/report/display.html:33 templates/web/fixmystreet/alert/updates.html:14 templates/web/fixmystreet/report/display.html:51
msgid "Receive email when updates are left on this problem."
msgstr ""
-#: templates/web/default/around/display_location.html:0 templates/web/default/around/display_location.html:34 templates/web/fixmystreet/around/display_location.html:0 templates/web/fixmystreet/around/display_location.html:34
+#: templates/web/default/around/display_location.html:0 templates/web/default/around/display_location.html:34
msgid "Recent local problems, FixMyStreet"
msgstr ""
-#: templates/web/default/reports/index.html:19
+#: templates/web/default/reports/index.html:19 templates/web/fixmybarangay/reports/index.html:23
msgid "Recently <br>fixed"
msgstr ""
@@ -1708,7 +1731,7 @@ msgstr ""
msgid "Recently fixed"
msgstr ""
-#: templates/web/default/index.html:50 templates/web/fixmystreet/index.html:62
+#: templates/web/default/index.html:37 templates/web/fixmystreet/index.html:45
msgid "Recently reported problems"
msgstr ""
@@ -1716,11 +1739,15 @@ msgstr ""
msgid "Remember that FixMyStreet is primarily for reporting physical problems that can be fixed. If your problem is not appropriate for submission via this site remember that you can contact your council directly using their own website."
msgstr ""
+#: templates/web/fixmybarangay/report/new/notes.html:9
+msgid "Remember that, for the pilot project, FixMyBarangay is only for reporting potholes and streetlights in bgy. Luz or Basak San Nicolas."
+msgstr ""
+
#: templates/web/default/admin/report_blocks.html:16
msgid "Remove flag"
msgstr ""
-#: templates/web/default/admin/report_edit.html:53 templates/web/default/admin/update_edit.html:48
+#: templates/web/default/admin/report_edit.html:54 templates/web/default/admin/update_edit.html:48
msgid "Remove photo (can't be undone!)"
msgstr ""
@@ -1728,11 +1755,11 @@ msgstr ""
msgid "Report Empty Homes"
msgstr ""
-#: templates/web/barnet/footer.html:16 templates/web/bromley/footer.html:17 templates/web/default/footer.html:7 templates/web/emptyhomes/header.html:27 templates/web/fiksgatami/footer.html:5 templates/web/fiksgatami/nn/footer.html:5 templates/web/fixmystreet/footer.html:45 templates/web/reading/footer.html:6
+#: templates/web/barnet/footer.html:16 templates/web/bromley/footer.html:17 templates/web/default/footer.html:7 templates/web/emptyhomes/header.html:27 templates/web/fiksgatami/footer.html:5 templates/web/fiksgatami/nn/footer.html:5 templates/web/fixmystreet/footer.html:45 templates/web/reading/footer.html:6 templates/web/stevenage/footer.html:39 templates/web/zurich/footer.html:10
msgid "Report a problem"
msgstr ""
-#: templates/web/bromley/report/display.html:28 templates/web/fixmystreet/report/display.html:22
+#: templates/web/bromley/report/display.html:28 templates/web/fixmystreet/report/display.html:29
msgid "Report abuse"
msgstr ""
@@ -1740,11 +1767,11 @@ msgstr ""
msgid "Report empty properties"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Rss.pm:277
+#: perllib/FixMyStreet/App/Controller/Rss.pm:286
msgid "Report on %s"
msgstr ""
-#: templates/web/default/index.html:15 templates/web/fixmystreet/around/postcode_form.html:6
+#: templates/web/default/index.html:15 templates/web/fixmystreet/around/intro.html:1 templates/web/stevenage/around/intro.html:1 templates/web/zurich/around/intro.html:1
msgid "Report, view, or discuss local problems"
msgstr ""
@@ -1756,7 +1783,7 @@ msgstr ""
msgid "Reported %s, to %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:512 templates/web/default/contact/index.html:45 templates/web/fixmystreet/contact/index.html:46
+#: perllib/FixMyStreet/DB/Result/Problem.pm:520 templates/web/default/contact/index.html:45 templates/web/fixmystreet/contact/index.html:46
msgid "Reported anonymously at %s"
msgstr ""
@@ -1764,39 +1791,43 @@ msgstr ""
msgid "Reported before"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:504
+#: perllib/FixMyStreet/DB/Result/Problem.pm:512
msgid "Reported by %s anonymously at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:535 templates/web/default/contact/index.html:47 templates/web/fixmystreet/contact/index.html:48
+#: perllib/FixMyStreet/DB/Result/Problem.pm:543 templates/web/default/contact/index.html:47 templates/web/fixmystreet/contact/index.html:48
msgid "Reported by %s at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:526
+#: perllib/FixMyStreet/DB/Result/Problem.pm:534
msgid "Reported by %s by %s at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:500
+#: perllib/FixMyStreet/DB/Result/Problem.pm:508
msgid "Reported by %s in the %s category anonymously at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:520
+#: perllib/FixMyStreet/DB/Result/Problem.pm:528
msgid "Reported by %s in the %s category by %s at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:508
+#: perllib/FixMyStreet/DB/Result/Problem.pm:516
msgid "Reported in the %s category anonymously at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:530
+#: perllib/FixMyStreet/DB/Result/Problem.pm:538
msgid "Reported in the %s category by %s at %s"
msgstr ""
-#: templates/web/default/around/around_index.html:1 templates/web/default/report/new/fill_in_details.html:0 templates/web/default/report/new/fill_in_details.html:3 templates/web/default/report/new/fill_in_details_form.html:1 templates/web/fixmystreet/around/around_index.html:2 templates/web/fixmystreet/report/new/fill_in_details.html:0 templates/web/fixmystreet/report/new/fill_in_details.html:5 templates/web/fixmystreet/report/new/fill_in_details_form.html:2
+#: templates/web/default/around/around_index.html:1 templates/web/default/report/new/fill_in_details.html:0 templates/web/default/report/new/fill_in_details.html:3 templates/web/default/report/new/fill_in_details_form.html:1 templates/web/fixmystreet/around/around_index.html:2 templates/web/fixmystreet/report/new/fill_in_details.html:0 templates/web/fixmystreet/report/new/fill_in_details.html:5 templates/web/fixmystreet/report/new/fill_in_details_form.html:2 templates/web/zurich/report/new/fill_in_details_form.html:2
msgid "Reporting a problem"
msgstr ""
-#: templates/web/default/around/display_location.html:95
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1033
+msgid "Reports"
+msgstr ""
+
+#: templates/web/default/around/tabbed_lists.html:3
msgid "Reports on and around the map"
msgstr ""
@@ -1804,35 +1835,27 @@ msgstr ""
msgid "Resend report"
msgstr ""
-#: perllib/FixMyStreet/Geocode/OSM.pm:166
+#: perllib/FixMyStreet/Geocode/OSM.pm:173
msgid "Road operator for this named road (derived from road reference number and type): %s"
msgstr ""
-#: perllib/FixMyStreet/Geocode/OSM.pm:163
+#: perllib/FixMyStreet/Geocode/OSM.pm:170
msgid "Road operator for this named road (from OpenStreetMap): %s"
msgstr ""
-#: templates/web/default/admin/council_edit.html:35
+#: templates/web/default/admin/council_edit.html:63
msgid "Save changes"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1027
-msgid "Search Abuse"
-msgstr ""
-
-#: templates/web/default/admin/search_abuse.html:1
-msgid "Search Abuse Table"
-msgstr ""
-
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1023 templates/web/default/admin/list_flagged.html:1 templates/web/default/admin/search_reports.html:1
+#: templates/web/default/admin/list_flagged.html:1 templates/web/default/admin/search_reports.html:1
msgid "Search Reports"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1026 templates/web/default/admin/search_users.html:1
+#: templates/web/default/admin/search_users.html:1
msgid "Search Users"
msgstr ""
-#: templates/web/default/admin/search_abuse.html:4 templates/web/default/admin/search_reports.html:5 templates/web/default/admin/search_users.html:5
+#: templates/web/default/admin/search_reports.html:5 templates/web/default/admin/search_users.html:5
msgid "Search:"
msgstr ""
@@ -1840,7 +1863,7 @@ msgstr ""
msgid "Select which type of alert you'd like and click the button for an RSS feed, or enter your email address to subscribe to an email alert."
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:618
+#: perllib/FixMyStreet/DB/Result/Problem.pm:623
msgid "Sent to %s %s later"
msgstr ""
@@ -1852,6 +1875,10 @@ msgstr ""
msgid "Service:"
msgstr ""
+#: templates/web/fixmystreet/report/display.html:33
+msgid "Share"
+msgstr ""
+
#: templates/web/emptyhomes/static/about.html:21
msgid "Shelter Cymru"
msgstr ""
@@ -1869,19 +1896,19 @@ msgid ""
" significant contribution to the supply of affordable homes in Wales."
msgstr ""
-#: templates/web/bromley/report/display.html:203 templates/web/bromley/report/new/fill_in_details_form.html:129 templates/web/bromley/report/new/fill_in_details_form.html:175 templates/web/default/report/display.html:208 templates/web/default/report/new/fill_in_details_form.html:210 templates/web/fixmystreet/report/display.html:185 templates/web/fixmystreet/report/new/fill_in_details_form.html:126 templates/web/fixmystreet/report/new/fill_in_details_form.html:186
+#: templates/web/bromley/report/display.html:203 templates/web/bromley/report/new/fill_in_details_form.html:129 templates/web/bromley/report/new/fill_in_details_form.html:175 templates/web/default/report/new/fill_in_details_form.html:210 templates/web/default/report/update-form.html:155 templates/web/fixmystreet/report/new/fill_in_details_form.html:139 templates/web/fixmystreet/report/new/fill_in_details_form.html:207 templates/web/fixmystreet/report/update-form.html:142
msgid "Show my name publicly"
msgstr ""
-#: templates/web/default/around/display_location.html:60 templates/web/fixmystreet/around/display_location.html:60
+#: templates/web/default/around/display_location.html:65
msgid "Show old"
msgstr ""
-#: templates/web/default/around/display_location.html:51 templates/web/fixmystreet/around/display_location.html:52
+#: templates/web/default/around/display_location.html:56
msgid "Show pins"
msgstr ""
-#: templates/web/default/auth/general.html:3 templates/web/default/auth/general.html:49 templates/web/fixmybarangay/header.html.orig:46 templates/web/fixmystreet/auth/general.html:3 templates/web/fixmystreet/auth/general.html:38 templates/web/fixmystreet/auth/general.html:58 templates/web/fixmystreet/header.html:51 templates/web/zurich/header.html:51
+#: templates/web/default/auth/general.html:3 templates/web/default/auth/general.html:49 templates/web/fixmybarangay/header.html:68 templates/web/fixmystreet/auth/general.html:3 templates/web/fixmystreet/auth/general.html:42 templates/web/fixmystreet/auth/general.html:62 templates/web/fixmystreet/header.html:53 templates/web/stevenage/header.html:101 templates/web/zurich/header.html:51
msgid "Sign in"
msgstr ""
@@ -1893,7 +1920,7 @@ msgstr ""
msgid "Sign in or create an account"
msgstr ""
-#: templates/web/bromley/auth/sign_out.html:1 templates/web/default/auth/sign_out.html:1 templates/web/default/header.html:30 templates/web/emptyhomes/header.html:41 templates/web/fiksgatami/header.html:22 templates/web/fiksgatami/nn/header.html:22 templates/web/lichfielddc/header.html:177 templates/web/reading/header.html:33
+#: templates/web/bromley/auth/sign_out.html:1 templates/web/default/auth/sign_out.html:1 templates/web/default/header.html:30 templates/web/emptyhomes/header.html:41 templates/web/fiksgatami/header.html:22 templates/web/fiksgatami/nn/header.html:22 templates/web/fixmybarangay/auth/sign_out.html:1 templates/web/lichfielddc/header.html:177 templates/web/reading/header.html:33
msgid "Sign out"
msgstr ""
@@ -1901,11 +1928,11 @@ msgstr ""
msgid "Signed in as %s"
msgstr ""
-#: templates/web/default/report/new/fill_in_details_text.html:1 templates/web/fixmystreet/report/new/fill_in_details_text.html:1
+#: templates/web/default/report/new/fill_in_details_text.html:1 templates/web/fixmybarangay/report/new/fill_in_details_text.html:1 templates/web/fixmystreet/report/new/fill_in_details_text.html:1
msgid "Some categories may require additional information."
msgstr ""
-#: templates/web/default/alert/index.html:42
+#: templates/web/default/alert/index.html:42 templates/web/fixmybarangay/alert/index.html:32
msgid "Some photos of recent reports"
msgstr ""
@@ -1917,7 +1944,7 @@ msgstr ""
msgid "Some unconfirmeds"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/UK.pm:97
+#: perllib/FixMyStreet/Cobrand/UK.pm:89
msgid "Sorry, that appears to be a Crown dependency postcode, which we don't cover."
msgstr ""
@@ -1925,11 +1952,11 @@ msgstr ""
msgid "Sorry, there has been an error confirming your problem."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:214 perllib/FixMyStreet/Geocode.pm:27 perllib/FixMyStreet/Geocode/Bing.pm:51 perllib/FixMyStreet/Geocode/Google.pm:69
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:211 perllib/FixMyStreet/Geocode.pm:28 perllib/FixMyStreet/Geocode/Bing.pm:58 perllib/FixMyStreet/Geocode/Google.pm:74 perllib/FixMyStreet/Geocode/OSM.pm:66
msgid "Sorry, we could not find that location."
msgstr ""
-#: perllib/FixMyStreet/Geocode/Bing.pm:46 perllib/FixMyStreet/Geocode/Google.pm:64 perllib/FixMyStreet/Geocode/OSM.pm:59
+#: perllib/FixMyStreet/Geocode/Bing.pm:53 perllib/FixMyStreet/Geocode/Google.pm:69 perllib/FixMyStreet/Geocode/Zurich.pm:82
msgid "Sorry, we could not parse that location. Please try again."
msgstr ""
@@ -1949,15 +1976,15 @@ msgstr ""
msgid "Start month:"
msgstr ""
-#: templates/web/bromley/report/display.html:78 templates/web/default/admin/list_flagged.html:18 templates/web/default/admin/list_updates.html:6 templates/web/default/admin/search_reports.html:21 templates/web/fixmystreet/report/display.html:72
+#: templates/web/bromley/report/display.html:78 templates/web/default/admin/list_flagged.html:18 templates/web/default/admin/list_updates.html:6 templates/web/default/admin/search_reports.html:21 templates/web/fixmystreet/report/update-form.html:26
msgid "State"
msgstr ""
-#: templates/web/default/admin/report_edit.html:17 templates/web/default/admin/update_edit.html:18 templates/web/default/report/display.html:77
+#: templates/web/default/admin/report_edit.html:17 templates/web/default/admin/update_edit.html:18 templates/web/default/report/update-form.html:28
msgid "State:"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1029 templates/web/default/admin/stats.html:1
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1038 templates/web/default/admin/stats.html:1
msgid "Stats"
msgstr ""
@@ -1965,7 +1992,7 @@ msgstr ""
msgid "Still open, via questionnaire, %s"
msgstr ""
-#: templates/web/bromley/report/new/fill_in_details_form.html:48 templates/web/fixmystreet/contact/index.html:79 templates/web/fixmystreet/report/new/fill_in_details_form.html:58
+#: templates/web/bromley/report/new/fill_in_details_form.html:48 templates/web/fixmystreet/contact/index.html:79 templates/web/fixmystreet/report/new/fill_in_details_form.html:60
msgid "Subject"
msgstr ""
@@ -1973,11 +2000,11 @@ msgstr ""
msgid "Subject:"
msgstr ""
-#: templates/web/bromley/report/new/fill_in_details_form.html:140 templates/web/bromley/report/new/fill_in_details_form.html:190 templates/web/bromley/report/new/fill_in_details_form.html:204 templates/web/default/questionnaire/creator_fixed.html:19 templates/web/default/report/new/fill_in_details_form.html:114 templates/web/default/report/new/fill_in_details_form.html:154 templates/web/default/report/new/fill_in_details_form.html:176 templates/web/fixmystreet/report/new/fill_in_details_form.html:137 templates/web/fixmystreet/report/new/fill_in_details_form.html:162 templates/web/fixmystreet/report/new/fill_in_details_form.html:201
+#: templates/web/bromley/report/new/fill_in_details_form.html:140 templates/web/bromley/report/new/fill_in_details_form.html:190 templates/web/bromley/report/new/fill_in_details_form.html:204 templates/web/default/questionnaire/creator_fixed.html:19 templates/web/default/report/new/fill_in_details_form.html:114 templates/web/default/report/new/fill_in_details_form.html:154 templates/web/default/report/new/fill_in_details_form.html:176 templates/web/fixmystreet/report/new/fill_in_details_form.html:152 templates/web/fixmystreet/report/new/fill_in_details_form.html:177 templates/web/fixmystreet/report/new/fill_in_details_form.html:222 templates/web/zurich/report/new/fill_in_details_form.html:128
msgid "Submit"
msgstr ""
-#: templates/web/default/admin/report_edit.html:56 templates/web/default/admin/update_edit.html:51 templates/web/default/admin/user_edit.html:20
+#: templates/web/default/admin/report_edit.html:57 templates/web/default/admin/update_edit.html:51 templates/web/default/admin/user_edit.html:20
msgid "Submit changes"
msgstr ""
@@ -1985,23 +2012,31 @@ msgstr ""
msgid "Submit questionnaire"
msgstr ""
-#: templates/web/bromley/report/display.html:44 templates/web/default/alert/updates.html:17 templates/web/default/report/display.html:38 templates/web/fixmystreet/alert/updates.html:23 templates/web/fixmystreet/report/display.html:37
+#: templates/web/bromley/report/display.html:44 templates/web/default/alert/updates.html:17 templates/web/default/report/display.html:38 templates/web/fixmystreet/alert/updates.html:23 templates/web/fixmystreet/report/display.html:56
msgid "Subscribe"
msgstr ""
-#: templates/web/default/alert/_list.html:97 templates/web/fixmystreet/alert/_list.html:92
+#: templates/web/default/alert/_list.html:97 templates/web/fixmybarangay/alert/_list.html:42 templates/web/fixmystreet/alert/_list.html:92
msgid "Subscribe me to an email alert"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1021 templates/web/default/admin/index.html:1
+#: templates/web/fixmybarangay/alert/_list.html:6
+msgid "Subscribe to an alert based upon what baranagay you&rsquo;re in:"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1031 templates/web/default/admin/index.html:1
msgid "Summary"
msgstr ""
-#: templates/web/default/reports/index.html:1 templates/web/emptyhomes/reports/index.html:1 templates/web/fiksgatami/nn/reports/index.html:1 templates/web/fiksgatami/reports/index.html:1
+#: templates/web/default/reports/index.html:1 templates/web/emptyhomes/reports/index.html:1 templates/web/fiksgatami/nn/reports/index.html:1 templates/web/fiksgatami/reports/index.html:1 templates/web/fixmybarangay/reports/index.html:1
msgid "Summary reports"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1025 templates/web/default/admin/questionnaire.html:1
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1035
+msgid "Survey"
+msgstr ""
+
+#: templates/web/default/admin/questionnaire.html:1
msgid "Survey Results"
msgstr ""
@@ -2009,7 +2044,7 @@ msgstr ""
msgid "Text"
msgstr ""
-#: templates/web/default/admin/council_contacts.html:18
+#: templates/web/default/admin/council_contacts.html:20
msgid "Text only version"
msgstr ""
@@ -2057,27 +2092,31 @@ msgstr ""
msgid "Thanks, glad to hear it's been fixed! Could we just ask if you have ever reported a problem to a council before?"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Photo.pm:190
+#: perllib/FixMyStreet/App/Controller/Photo.pm:189
msgid "That image doesn't appear to have uploaded correctly (%s), please try again."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Council.pm:91
+#: perllib/FixMyStreet/App/Controller/Council.pm:90
msgid "That location does not appear to be covered by a council; perhaps it is offshore or outside the country. Please try again."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Location.pm:107
+#: perllib/FixMyStreet/App/Controller/Location.pm:121
msgid "That location does not appear to be in the UK; please try again."
msgstr ""
-#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:63 perllib/FixMyStreet/Cobrand/UK.pm:90
+#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:63 perllib/FixMyStreet/Cobrand/UK.pm:82
msgid "That postcode was not recognised, sorry."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:605
+#: perllib/FixMyStreet/App/Controller/Admin.pm:616
msgid "That problem will now be resent."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report.pm:75
+#: perllib/FixMyStreet/App/Controller/Report.pm:98
+msgid "That report cannot be viewed on FixMyStreet."
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Report.pm:92
msgid "That report has been removed from FixMyStreet."
msgstr ""
@@ -2105,11 +2144,7 @@ msgid "The confirmation email <strong>may</strong> take a few minutes to arrive
msgstr ""
#: templates/web/fixmystreet/report/new/fill_in_details_text.html:1 templates/web/fixmystreet/report/new/fill_in_details_text.html:3
-msgid ""
-"The council won&rsquo;t be able to help unless you leave as much\n"
-"detail as you can. Please describe the exact location of the problem (e.g. on a\n"
-"wall), what it is, how long it has been there, a description (and a photo of\n"
-"the problem if you have one), etc."
+msgid "The council won&rsquo;t be able to help unless you leave as much detail as you can. Please describe the exact location of the problem (e.g. on a wall), what it is, how long it has been there, a description (and a photo of the problem if you have one), etc."
msgstr ""
#: templates/web/fixmystreet/questionnaire/index.html:43
@@ -2120,7 +2155,7 @@ msgstr ""
msgid "The details of your problem are available on the right hand side of this page."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Dashboard.pm:60 perllib/FixMyStreet/App/Controller/Reports.pm:44 perllib/FixMyStreet/App/Controller/Reports.pm:75
+#: perllib/FixMyStreet/App/Controller/Dashboard.pm:60 perllib/FixMyStreet/App/Controller/Reports.pm:43 perllib/FixMyStreet/App/Controller/Reports.pm:74
msgid "The error was: %s"
msgstr ""
@@ -2128,7 +2163,7 @@ msgstr ""
msgid "The following Open311 v2 attributes are returned for each request: service_request_id, description, lat, long, media_url, status, requested_datetime, updated_datetime, service_code and service_name."
msgstr ""
-#: perllib/FixMyStreet/Geocode/OSM.pm:158
+#: perllib/FixMyStreet/Geocode/OSM.pm:165
msgid "The following information about the nearest road might be inaccurate or irrelevant, if the problem is close to several roads or close to a road without a name registered in OpenStreetMap."
msgstr ""
@@ -2188,15 +2223,15 @@ msgstr ""
msgid "The simplest alert is our geographic one:"
msgstr ""
-#: templates/web/barnet/report/new/councils_text_all.html:3 templates/web/default/report/new/councils_extra_text.html:1 templates/web/default/report/new/councils_text_some.html:10 templates/web/default/report/new/councils_text_some.html:11 templates/web/default/report/new/fill_in_details_form.html:17 templates/web/fixmystreet/report/new/fill_in_details_form.html:12
+#: templates/web/barnet/report/new/councils_text_all.html:3 templates/web/default/report/new/councils_extra_text.html:1 templates/web/default/report/new/councils_text_some.html:10 templates/web/default/report/new/councils_text_some.html:11 templates/web/default/report/new/fill_in_details_form.html:17 templates/web/fixmystreet/report/new/fill_in_details_form.html:12 templates/web/zurich/report/new/fill_in_details_form.html:12
msgid "The subject and details of the problem will be public, plus your name if you give us permission."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:269
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:271
msgid "The user could not locate the problem on a map, but to see the area around the location they entered"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Reports.pm:72
+#: perllib/FixMyStreet/App/Controller/Reports.pm:71
msgid "There was a problem showing the All Reports page. Please try again later."
msgstr ""
@@ -2204,7 +2239,7 @@ msgstr ""
msgid "There was a problem showing this page. Please try again later."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:733 perllib/FixMyStreet/App/Controller/Report/Update.pm:130 templates/web/default/auth/general.html:23 templates/web/fixmystreet/auth/general.html:24
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:736 perllib/FixMyStreet/App/Controller/Report/Update.pm:134 templates/web/default/auth/general.html:23 templates/web/fixmystreet/auth/general.html:24
msgid "There was a problem with your email/password combination. If you cannot remember your password, or do not have one, please fill in the &lsquo;sign in by email&rsquo; section of the form."
msgstr ""
@@ -2212,7 +2247,7 @@ msgstr ""
msgid "There was a problem with your email/password combination. Please try again."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/Update.pm:252
+#: perllib/FixMyStreet/App/Controller/Report/Update.pm:256
msgid "There was a problem with your update. Please try again."
msgstr ""
@@ -2220,7 +2255,7 @@ msgstr ""
msgid "There were problems with your report. Please see below."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/Update.pm:279
+#: perllib/FixMyStreet/App/Controller/Report/Update.pm:283
msgid "There were problems with your update. Please see below."
msgstr ""
@@ -2228,15 +2263,15 @@ msgstr ""
msgid "This API implementation is work in progress and not yet stabilized. It will change without warnings in the future."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:339
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:341
msgid "This email has been sent to both councils covering the location of the problem, as the user did not categorise it; please ignore it if you're not the correct council to deal with the issue, or let us know what category of problem this is so we can add it to our system."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:342
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:344
msgid "This email has been sent to several councils covering the location of the problem, as the category selected is provided for all of them; please ignore it if you're not the correct council to deal with the issue."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:865 perllib/FixMyStreet/Cobrand/UK.pm:62
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:868 perllib/FixMyStreet/Cobrand/UK.pm:54
msgid "This information is required"
msgstr ""
@@ -2244,14 +2279,18 @@ msgstr ""
msgid "This is a developer site; things might break at any time, and the database will be periodically deleted."
msgstr ""
-#: templates/web/emptyhomes/reports/council.html:58
+#: templates/web/emptyhomes/reports/body.html:58
msgid "This is a summary of all reports for one %s."
msgstr ""
-#: templates/web/emptyhomes/reports/council.html:60
+#: templates/web/emptyhomes/reports/body.html:60
msgid "This is a summary of all reports for this %s."
msgstr ""
+#: templates/web/fixmybarangay/reports/index.html:7
+msgid "This is a summary of all reports on this site; select a particular barangay to see the reports sent there."
+msgstr ""
+
#: templates/web/default/reports/index.html:7 templates/web/emptyhomes/reports/index.html:4 templates/web/fiksgatami/nn/reports/index.html:4 templates/web/fiksgatami/reports/index.html:4
msgid "This is a summary of all reports on this site; select a particular council to see the reports sent there."
msgstr ""
@@ -2260,11 +2299,11 @@ msgstr ""
msgid "This problem has been closed"
msgstr ""
-#: templates/web/bromley/report/display.html:96 templates/web/default/report/banner.html:12 templates/web/default/report/display.html:95 templates/web/emptyhomes/report/display.html:12 templates/web/fixmystreet/report/display.html:90
+#: templates/web/bromley/report/display.html:96 templates/web/default/report/banner.html:12 templates/web/default/report/update-form.html:46 templates/web/emptyhomes/report/display.html:12 templates/web/fixmystreet/report/update-form.html:44
msgid "This problem has been fixed"
msgstr ""
-#: templates/web/bromley/report/display.html:90 templates/web/default/report/display.html:90 templates/web/fixmystreet/report/display.html:84
+#: templates/web/bromley/report/display.html:90 templates/web/default/report/update-form.html:41 templates/web/fixmystreet/report/update-form.html:38
msgid "This problem has not been fixed"
msgstr ""
@@ -2276,23 +2315,23 @@ msgstr ""
msgid "This problem is old and of unknown status."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:83
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:86
msgid "This report is currently marked as closed."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:81
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:84
msgid "This report is currently marked as fixed."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:85
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:88
msgid "This report is currently marked as open."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:262
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:264
msgid "This web page also contains a photo of the problem, provided by the user."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1024 templates/web/default/admin/timeline.html:1
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1034 templates/web/default/admin/timeline.html:1
msgid "Timeline"
msgstr ""
@@ -2300,7 +2339,7 @@ msgstr ""
msgid "Title"
msgstr ""
-#: templates/web/default/around/display_location.html:69
+#: templates/web/default/around/_report_banner.html:2
msgid "To <strong>report a problem</strong>, click on the map at the correct location."
msgstr ""
@@ -2312,7 +2351,7 @@ msgstr ""
msgid "To find out what local alerts we have for you, please enter your postcode or street name and area"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:268
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:270
msgid "To view a map of the precise location of this issue"
msgstr ""
@@ -2320,7 +2359,7 @@ msgstr ""
msgid "Total"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Reports.pm:43
+#: perllib/FixMyStreet/App/Controller/Reports.pm:42
msgid "Unable to look up areas in MaPit. Please try again later."
msgstr ""
@@ -2332,15 +2371,15 @@ msgstr ""
msgid "Unknown"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Rss.pm:164
+#: perllib/FixMyStreet/App/Controller/Rss.pm:173
msgid "Unknown alert type"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report.pm:70
+#: perllib/FixMyStreet/App/Controller/Report.pm:87
msgid "Unknown problem ID"
msgstr ""
-#: templates/web/bromley/report/display.html:66 templates/web/fixmystreet/report/display.html:65
+#: templates/web/bromley/report/display.html:66 templates/web/fixmystreet/report/update-form.html:19
msgid "Update"
msgstr ""
@@ -2376,15 +2415,15 @@ msgstr ""
msgid "Update reopened problem"
msgstr ""
-#: templates/web/default/admin/council_contacts.html:62
+#: templates/web/default/admin/council_contacts.html:68
msgid "Update statuses"
msgstr ""
-#: templates/web/default/report/display.html:71
+#: templates/web/default/report/update-form.html:22
msgid "Update:"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:694 perllib/FixMyStreet/App/Controller/Admin.pm:809 perllib/FixMyStreet/App/Controller/Admin.pm:889
+#: perllib/FixMyStreet/App/Controller/Admin.pm:708 perllib/FixMyStreet/App/Controller/Admin.pm:839 perllib/FixMyStreet/App/Controller/Admin.pm:899
msgid "Updated!"
msgstr ""
@@ -2400,19 +2439,19 @@ msgstr ""
msgid "Updates to this problem, FixMyStreet"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1182
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1191
msgid "User flag removed"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1154
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1163
msgid "User flagged"
msgstr ""
-#: templates/web/default/admin/list_flagged.html:30
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1036 templates/web/default/admin/list_flagged.html:30
msgid "Users"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:309 perllib/FixMyStreet/App/Controller/Admin.pm:339
+#: perllib/FixMyStreet/App/Controller/Admin.pm:315 perllib/FixMyStreet/App/Controller/Admin.pm:345
msgid "Values updated"
msgstr ""
@@ -2420,7 +2459,7 @@ msgstr ""
msgid "View report on site"
msgstr ""
-#: templates/web/default/reports/council.html:18
+#: templates/web/default/reports/body.html:18
msgid "View reports by ward"
msgstr ""
@@ -2428,15 +2467,15 @@ msgstr ""
msgid "View your report"
msgstr ""
-#: templates/web/default/around/display_location.html:0 templates/web/default/around/display_location.html:33 templates/web/emptyhomes/around/display_location.html:0 templates/web/emptyhomes/around/display_location.html:16 templates/web/fixmystreet/around/display_location.html:0 templates/web/fixmystreet/around/display_location.html:33
+#: templates/web/default/around/display_location.html:0 templates/web/default/around/display_location.html:33 templates/web/emptyhomes/around/display_location.html:0 templates/web/emptyhomes/around/display_location.html:16
msgid "Viewing a location"
msgstr ""
-#: templates/web/bromley/report/display.html:0 templates/web/default/report/display.html:0 templates/web/emptyhomes/report/display.html:2 templates/web/fixmystreet/report/display.html:0
+#: templates/web/bromley/report/display.html:0 templates/web/default/report/display.html:0 templates/web/emptyhomes/report/display.html:1 templates/web/emptyhomes/report/display.html:2 templates/web/fixmystreet/report/display.html:0
msgid "Viewing a problem"
msgstr ""
-#: templates/web/default/reports/council.html:20 templates/web/emptyhomes/reports/council.html:18
+#: templates/web/default/reports/body.html:20 templates/web/emptyhomes/reports/body.html:18
msgid "Wards of this council"
msgstr ""
@@ -2452,23 +2491,23 @@ msgstr ""
msgid "We may contact you periodically to ask if anything has changed with the property you reported."
msgstr ""
-#: templates/web/bromley/report/display.html:141 templates/web/fixmystreet/report/display.html:153
+#: templates/web/bromley/report/display.html:141 templates/web/fixmystreet/report/update-form.html:113
msgid "We never show your email"
msgstr ""
-#: templates/web/bromley/report/new/fill_in_details_form.html:133 templates/web/bromley/report/new/fill_in_details_form.html:179 templates/web/fixmystreet/report/new/fill_in_details_form.html:130 templates/web/fixmystreet/report/new/fill_in_details_form.html:190
+#: templates/web/bromley/report/new/fill_in_details_form.html:133 templates/web/bromley/report/new/fill_in_details_form.html:179 templates/web/fixmystreet/report/new/fill_in_details_form.html:144 templates/web/fixmystreet/report/new/fill_in_details_form.html:211 templates/web/zurich/report/new/fill_in_details_form.html:114
msgid "We never show your email address or phone number."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:349
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:351
msgid "We realise this problem might be the responsibility of %s; however, we don't currently have any contact details for them. If you know of an appropriate contact address, please do get in touch."
msgstr ""
-#: templates/web/default/index.html:34 templates/web/emptyhomes/index.html:59 templates/web/fixmystreet/index.html:45
+#: templates/web/default/index-steps.html:16 templates/web/emptyhomes/index.html:59
msgid "We send it to the council on your behalf"
msgstr ""
-#: templates/web/bromley/report/new/fill_in_details_form.html:217 templates/web/default/report/new/notes.html:5
+#: templates/web/bromley/report/new/fill_in_details_form.html:217 templates/web/default/report/new/notes.html:5 templates/web/fixmybarangay/report/new/notes.html:5
msgid "We will only use your personal information in accordance with our <a href=\"/faq#privacy\">privacy policy.</a>"
msgstr ""
@@ -2484,7 +2523,7 @@ msgstr ""
msgid "We'd love to hear what you think about this site. Just fill in the form, or send an email to <a href='mailto:%s'>%s</a>:"
msgstr ""
-#: templates/web/default/admin/council_contacts.html:41 templates/web/default/admin/council_edit.html:41
+#: templates/web/default/admin/council_contacts.html:45 templates/web/default/admin/council_edit.html:69
msgid "When edited"
msgstr ""
@@ -2492,7 +2531,7 @@ msgstr ""
msgid "When sent"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:612
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:611
msgid "Whole block of empty flats"
msgstr ""
@@ -2500,11 +2539,11 @@ msgstr ""
msgid "With request searches, it is also possible to search for agency_responsible to limit the requests to those sent to a single administration. The search term is the administration ID provided by <a href=\"%s\">MaPit</a>."
msgstr ""
-#: templates/web/fixmystreet/footer.html:22
+#: templates/web/fixmystreet/footer.html:22 templates/web/stevenage/footer.html:22
msgid "Would you like better integration with FixMyStreet? <a href=\"http://www.mysociety.org/for-councils/fixmystreet/\">Find out about FixMyStreet for councils</a>."
msgstr ""
-#: templates/web/fixmystreet/footer.html:18
+#: templates/web/fixmystreet/footer.html:18 templates/web/stevenage/footer.html:18
msgid "Would you like to contribute to FixMyStreet? Our code is open source and <a href=\"http://github.com/mysociety/fixmystreet\">available on GitHub</a>."
msgstr ""
@@ -2512,7 +2551,7 @@ msgstr ""
msgid "Would you like to receive another questionnaire in 4 weeks, reminding you to check the status?"
msgstr ""
-#: templates/web/default/report/new/notes.html:8 templates/web/fixmystreet/report/new/notes.html:7
+#: templates/web/default/report/new/notes.html:8 templates/web/fixmybarangay/report/new/notes.html:8 templates/web/fixmystreet/report/new/notes.html:7
msgid "Writing your message entirely in block capitals makes it hard to read, as does a lack of punctuation."
msgstr ""
@@ -2520,11 +2559,11 @@ msgstr ""
msgid "Year"
msgstr ""
-#: templates/web/default/admin/council_contacts.html:48 templates/web/default/admin/council_contacts.html:49 templates/web/default/admin/council_edit.html:5 templates/web/default/admin/list_updates.html:30 templates/web/default/admin/list_updates.html:31 templates/web/default/admin/list_updates.html:32 templates/web/default/admin/problem_row.html:19 templates/web/default/admin/report_edit.html:27 templates/web/default/admin/report_edit.html:41 templates/web/default/admin/search_users.html:23 templates/web/default/admin/update_edit.html:15 templates/web/default/questionnaire/creator_fixed.html:14 templates/web/default/questionnaire/index.html:105 templates/web/default/questionnaire/index.html:66 templates/web/fixmystreet/questionnaire/index.html:60 templates/web/fixmystreet/questionnaire/index.html:99
+#: templates/web/default/admin/council_contacts.html:52 templates/web/default/admin/council_contacts.html:53 templates/web/default/admin/council_contacts.html:54 templates/web/default/admin/council_edit.html:5 templates/web/default/admin/list_updates.html:30 templates/web/default/admin/list_updates.html:31 templates/web/default/admin/list_updates.html:32 templates/web/default/admin/problem_row.html:19 templates/web/default/admin/report_edit.html:27 templates/web/default/admin/report_edit.html:41 templates/web/default/admin/search_users.html:23 templates/web/default/admin/update_edit.html:15 templates/web/default/questionnaire/creator_fixed.html:14 templates/web/default/questionnaire/index.html:105 templates/web/default/questionnaire/index.html:66 templates/web/fixmystreet/questionnaire/index.html:60 templates/web/fixmystreet/questionnaire/index.html:99
msgid "Yes"
msgstr ""
-#: templates/web/bromley/report/display.html:155 templates/web/bromley/report/new/fill_in_details_form.html:198 templates/web/fixmystreet/report/display.html:133 templates/web/fixmystreet/report/new/fill_in_details_form.html:156
+#: templates/web/bromley/report/display.html:155 templates/web/bromley/report/new/fill_in_details_form.html:198 templates/web/fixmystreet/report/new/fill_in_details_form.html:171 templates/web/fixmystreet/report/update-form.html:87
msgid "Yes I have a password"
msgstr ""
@@ -2536,11 +2575,11 @@ msgstr ""
msgid "You are reporting the following update for being abusive, containing personal information, or similar:"
msgstr ""
-#: templates/web/emptyhomes/reports/council.html:64
+#: templates/web/emptyhomes/reports/body.html:64
msgid "You can <a href=\"%s\">view all reports for the council</a> or <a href=\"/reports\">show all councils</a>."
msgstr ""
-#: templates/web/emptyhomes/reports/council.html:66
+#: templates/web/emptyhomes/reports/body.html:66
msgid "You can <a href=\"/reports\">show all councils</a>."
msgstr ""
@@ -2552,19 +2591,19 @@ msgstr ""
msgid "You have already answered this questionnaire. If you have a question, please <a href='%s'>get in touch</a>, or <a href='%s'>view your problem</a>.\n"
msgstr ""
-#: templates/web/bromley/report/new/fill_in_details_form.html:97 templates/web/default/questionnaire/index.html:92 templates/web/default/report/new/fill_in_details_form.html:93 templates/web/fixmystreet/questionnaire/index.html:87 templates/web/fixmystreet/report/new/fill_in_details_form.html:101
+#: templates/web/bromley/report/new/fill_in_details_form.html:97 templates/web/default/questionnaire/index.html:92 templates/web/default/report/new/fill_in_details_form.html:93 templates/web/fixmystreet/questionnaire/index.html:87 templates/web/fixmystreet/report/new/fill_in_details_form.html:99 templates/web/zurich/report/new/fill_in_details_form.html:93
msgid "You have already attached a photo to this report, attaching another one will replace it."
msgstr ""
-#: templates/web/bromley/report/display.html:106 templates/web/default/report/display.html:106 templates/web/fixmystreet/report/display.html:100
+#: templates/web/bromley/report/display.html:106 templates/web/default/report/update-form.html:57 templates/web/fixmystreet/report/update-form.html:54
msgid "You have already attached a photo to this update, attaching another one will replace it."
msgstr ""
-#: templates/web/default/auth/sign_out.html:3
+#: templates/web/default/auth/sign_out.html:3 templates/web/fixmybarangay/auth/sign_out.html:3
msgid "You have been signed out"
msgstr ""
-#: templates/web/bromley/report/new/fill_in_details_form.html:25 templates/web/default/report/new/fill_in_details_form.html:7 templates/web/fixmystreet/report/new/fill_in_details_form.html:27
+#: templates/web/bromley/report/new/fill_in_details_form.html:25 templates/web/default/report/new/fill_in_details_form.html:7 templates/web/fixmystreet/report/new/fill_in_details_form.html:28 templates/web/zurich/report/new/fill_in_details_form.html:28
msgid "You have located the problem at the point marked with a green pin on the map. If this is not the correct location, simply click on the map again. "
msgstr ""
@@ -2588,7 +2627,7 @@ msgstr ""
msgid "You have successfully deleted your alert."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:740 perllib/FixMyStreet/App/Controller/Report/Update.pm:136
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:743 perllib/FixMyStreet/App/Controller/Report/Update.pm:140
msgid "You have successfully signed in; please check and confirm your details are accurate:"
msgstr ""
@@ -2604,11 +2643,11 @@ msgstr ""
msgid "Your Reports"
msgstr ""
-#: templates/web/bromley/report/display.html:41 templates/web/bromley/report/display.html:43 templates/web/bromley/report/new/fill_in_details_form.html:145 templates/web/fixmystreet/alert/_list.html:89 templates/web/fixmystreet/alert/updates.html:19 templates/web/fixmystreet/alert/updates.html:22 templates/web/fixmystreet/contact/index.html:72 templates/web/fixmystreet/report/display.html:34 templates/web/fixmystreet/report/display.html:36 templates/web/fixmystreet/report/new/fill_in_details_form.html:142
+#: templates/web/bromley/report/display.html:41 templates/web/bromley/report/display.html:43 templates/web/bromley/report/new/fill_in_details_form.html:145 templates/web/fixmystreet/alert/_list.html:89 templates/web/fixmystreet/alert/updates.html:19 templates/web/fixmystreet/alert/updates.html:22 templates/web/fixmystreet/contact/index.html:72 templates/web/fixmystreet/report/display.html:53 templates/web/fixmystreet/report/display.html:55 templates/web/fixmystreet/report/new/fill_in_details_form.html:115 templates/web/fixmystreet/report/new/fill_in_details_form.html:157 templates/web/zurich/report/new/fill_in_details_form.html:106
msgid "Your email"
msgstr ""
-#: templates/web/bromley/report/display.html:130 templates/web/fixmystreet/auth/general.html:26 templates/web/fixmystreet/report/display.html:124
+#: templates/web/bromley/report/display.html:130 templates/web/fixmystreet/auth/general.html:26 templates/web/fixmystreet/report/update-form.html:78
msgid "Your email address"
msgstr ""
@@ -2616,7 +2655,7 @@ msgstr ""
msgid "Your email address:"
msgstr ""
-#: templates/web/default/alert/_list.html:92 templates/web/default/report/display.html:128 templates/web/default/report/new/fill_in_details_form.html:124
+#: templates/web/default/alert/_list.html:92 templates/web/default/report/new/fill_in_details_form.html:124 templates/web/default/report/update-form.html:79 templates/web/fixmybarangay/alert/_list.html:37
msgid "Your email:"
msgstr ""
@@ -2632,15 +2671,15 @@ msgstr ""
msgid "Your last name"
msgstr ""
-#: templates/web/fixmystreet/auth/general.html:53 templates/web/fixmystreet/contact/index.html:65 templates/web/fixmystreet/report/display.html:181 templates/web/fixmystreet/report/new/fill_in_details_form.html:121 templates/web/fixmystreet/report/new/fill_in_details_form.html:181
+#: templates/web/fixmystreet/auth/general.html:57 templates/web/fixmystreet/contact/index.html:65 templates/web/fixmystreet/report/new/fill_in_details_form.html:124 templates/web/fixmystreet/report/new/fill_in_details_form.html:202 templates/web/fixmystreet/report/update-form.html:138 templates/web/zurich/report/new/fill_in_details_form.html:122
msgid "Your name"
msgstr ""
-#: templates/web/default/auth/general.html:59 templates/web/default/contact/index.html:68 templates/web/default/report/display.html:202 templates/web/default/report/new/fill_in_details_form.html:203
+#: templates/web/default/auth/general.html:59 templates/web/default/contact/index.html:68 templates/web/default/report/new/fill_in_details_form.html:203 templates/web/default/report/update-form.html:149
msgid "Your name:"
msgstr ""
-#: templates/web/bromley/report/display.html:160 templates/web/bromley/report/new/fill_in_details_form.html:203 templates/web/fixmystreet/auth/general.html:37 templates/web/fixmystreet/report/display.html:138 templates/web/fixmystreet/report/new/fill_in_details_form.html:161
+#: templates/web/bromley/report/display.html:160 templates/web/bromley/report/new/fill_in_details_form.html:203 templates/web/fixmystreet/auth/general.html:41 templates/web/fixmystreet/report/new/fill_in_details_form.html:176 templates/web/fixmystreet/report/update-form.html:92
msgid "Your password"
msgstr ""
@@ -2648,7 +2687,7 @@ msgstr ""
msgid "Your password has been changed"
msgstr ""
-#: templates/web/bromley/report/new/fill_in_details_form.html:137 templates/web/bromley/report/new/fill_in_details_form.html:184 templates/web/fixmystreet/report/new/fill_in_details_form.html:134 templates/web/fixmystreet/report/new/fill_in_details_form.html:195
+#: templates/web/bromley/report/new/fill_in_details_form.html:137 templates/web/bromley/report/new/fill_in_details_form.html:184 templates/web/fixmystreet/report/new/fill_in_details_form.html:149 templates/web/fixmystreet/report/new/fill_in_details_form.html:216 templates/web/zurich/report/new/fill_in_details_form.html:125
msgid "Your phone number"
msgstr ""
@@ -2656,11 +2695,11 @@ msgstr ""
msgid "Your report"
msgstr ""
-#: templates/web/barnet/footer.html:18 templates/web/bromley/footer.html:19 templates/web/bromley/header.html:75 templates/web/default/footer.html:9 templates/web/fiksgatami/footer.html:6 templates/web/fiksgatami/nn/footer.html:6 templates/web/fixmystreet/footer.html:47 templates/web/reading/footer.html:7
+#: templates/web/barnet/footer.html:18 templates/web/bromley/footer.html:19 templates/web/bromley/header.html:75 templates/web/default/footer.html:9 templates/web/fiksgatami/footer.html:6 templates/web/fiksgatami/nn/footer.html:6 templates/web/fixmystreet/footer.html:47 templates/web/reading/footer.html:7 templates/web/stevenage/footer.html:41
msgid "Your reports"
msgstr ""
-#: templates/web/default/my/my.html:45 templates/web/fixmystreet/my/my.html:45
+#: templates/web/default/my/my.html:45 templates/web/fixmystreet/my/my.html:49
msgid "Your updates"
msgstr ""
@@ -2672,15 +2711,19 @@ msgstr ""
msgid "by %s"
msgstr ""
-#: templates/web/default/reports/council.html:12 templates/web/default/reports/council.html:13 templates/web/emptyhomes/reports/council.html:6 templates/web/emptyhomes/reports/council.html:7
+#: templates/web/default/reports/body.html:12 templates/web/default/reports/body.html:13 templates/web/emptyhomes/reports/body.html:6 templates/web/emptyhomes/reports/body.html:7
msgid "council"
msgstr ""
+#: perllib/FixMyStreet/DB/Result/Problem.pm:608
+msgid "council ref:&nbsp;%s"
+msgstr ""
+
#: templates/web/default/admin/report_edit.html:15
msgid "didn't use map"
msgstr ""
-#: templates/web/default/alert/index.html:33 templates/web/fixmystreet/around/postcode_form.html:17
+#: templates/web/default/alert/index.html:33 templates/web/fixmystreet/around/postcode_form.html:20
msgid "e.g. ‘%s’ or ‘%s’"
msgstr ""
@@ -2688,7 +2731,7 @@ msgstr ""
msgid "from %d different users"
msgstr ""
-#: perllib/Utils.pm:289
+#: perllib/Utils.pm:267
msgid "less than a minute"
msgstr ""
@@ -2700,14 +2743,18 @@ msgstr ""
msgid "marked as fixed"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:112 templates/web/default/admin/questionnaire.html:15 templates/web/default/admin/questionnaire.html:16
+#: perllib/FixMyStreet/App/Controller/Admin.pm:113 templates/web/default/admin/questionnaire.html:15 templates/web/default/admin/questionnaire.html:16
msgid "n/a"
msgstr ""
-#: templates/web/default/alert/_list.html:87 templates/web/fixmystreet/alert/_list.html:85
+#: templates/web/default/alert/_list.html:87 templates/web/fixmybarangay/alert/_list.html:32 templates/web/fixmystreet/alert/_list.html:85
msgid "or"
msgstr ""
+#: templates/web/default/js/validation_strings.html:21
+msgid "or locate me automatically"
+msgstr ""
+
#: templates/web/default/admin/report_edit.html:15
msgid "originally entered"
msgstr ""
@@ -2720,27 +2767,23 @@ msgstr ""
msgid "reopened"
msgstr ""
-#: templates/web/barnet/header.html:71 templates/web/bromley/header.html:100 templates/web/bromley/header.html:65 templates/web/fixmybarangay/header.html.orig:43 templates/web/fixmystreet/header.html:48 templates/web/zurich/header.html:48
+#: templates/web/barnet/header.html:71 templates/web/bromley/header.html:100 templates/web/bromley/header.html:65 templates/web/fixmybarangay/header.html:65 templates/web/fixmystreet/header.html:50 templates/web/stevenage/header.html:98 templates/web/zurich/header.html:48
msgid "sign out"
msgstr ""
-#: templates/web/bromley/report/new/fill_in_details_form.html:4 templates/web/bromley/report/new/fill_in_details_form.html:7 templates/web/default/report/new/fill_in_details_form.html:11 templates/web/default/report/new/fill_in_details_form.html:14 templates/web/fixmystreet/report/new/fill_in_details_form.html:6 templates/web/fixmystreet/report/new/fill_in_details_form.html:9
+#: templates/web/bromley/report/new/fill_in_details_form.html:4 templates/web/bromley/report/new/fill_in_details_form.html:7 templates/web/default/report/new/fill_in_details_form.html:11 templates/web/default/report/new/fill_in_details_form.html:14 templates/web/fixmystreet/report/new/fill_in_details_form.html:6 templates/web/fixmystreet/report/new/fill_in_details_form.html:9 templates/web/zurich/report/new/fill_in_details_form.html:6 templates/web/zurich/report/new/fill_in_details_form.html:9
msgid "the local council"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:541
-msgid "the map was not used so pin location may be inaccurate"
+#: templates/web/default/report/_main.html:6
+msgid "there is no pin shown as the user did not use the map"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:603
-msgid "their ref:&nbsp;%s"
-msgstr ""
-
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:330
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:332
msgid "this type of local problem"
msgstr ""
-#: perllib/Utils.pm:263
+#: perllib/Utils.pm:241
msgid "today"
msgstr ""
@@ -2756,7 +2799,7 @@ msgstr ""
msgid "user is problem owner"
msgstr ""
-#: templates/web/default/reports/council.html:0 templates/web/default/reports/council.html:9 templates/web/emptyhomes/reports/council.html:0 templates/web/emptyhomes/reports/council.html:3
+#: templates/web/default/reports/body.html:0 templates/web/default/reports/body.html:9 templates/web/emptyhomes/reports/body.html:0 templates/web/emptyhomes/reports/body.html:3
msgid "ward"
msgstr ""
@@ -2784,6 +2827,34 @@ msgstr ""
msgid "your update will not be posted"
msgstr ""
+#: templates/web/emptyhomes/front/stats.html:17
+#, perl-format
+msgid "<big>%s</big> report recently"
+msgid_plural "<big>%s</big> reports recently"
+msgstr[0] ""
+msgstr[1] ""
+
+#: perllib/Utils.pm:286
+#, perl-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#: perllib/Utils.pm:288
+#, perl-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/web/default/front/stats.html:29
+#, perl-format
+msgid "<big>%s</big> update on reports"
+msgid_plural "<big>%s</big> updates on reports"
+msgstr[0] ""
+msgstr[1] ""
+
#: templates/web/emptyhomes/report/new/councils_text_none.html:3
#, perl-format
msgid "We do not yet have details for the council that covers this location."
@@ -2791,10 +2862,10 @@ msgid_plural "We do not yet have details for the councils that cover this locati
msgstr[0] ""
msgstr[1] ""
-#: templates/web/emptyhomes/front/stats.html:17
+#: perllib/Utils.pm:282
#, perl-format
-msgid "<big>%s</big> report recently"
-msgid_plural "<big>%s</big> reports recently"
+msgid "%d week"
+msgid_plural "%d weeks"
msgstr[0] ""
msgstr[1] ""
@@ -2819,9 +2890,9 @@ msgid_plural "We do <strong>not</strong> yet have details for the other councils
msgstr[0] ""
msgstr[1] ""
-#: templates/web/default/front/stats.html:29
+#: perllib/Utils.pm:284
#, perl-format
-msgid "<big>%s</big> update on reports"
-msgid_plural "<big>%s</big> updates on reports"
+msgid "%d day"
+msgid_plural "%d days"
msgstr[0] ""
msgstr[1] ""
diff --git a/locale/cy_GB.UTF-8/LC_MESSAGES/EmptyHomes.po b/locale/cy_GB.UTF-8/LC_MESSAGES/EmptyHomes.po
index be85a97c5..337bd8a40 100644
--- a/locale/cy_GB.UTF-8/LC_MESSAGES/EmptyHomes.po
+++ b/locale/cy_GB.UTF-8/LC_MESSAGES/EmptyHomes.po
@@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 1.0\n"
"Report-Msgid-Bugs-To: matthew@mysociety.org\n"
-"POT-Creation-Date: 2012-08-21 09:54+0100\n"
+"POT-Creation-Date: 2012-12-10 13:18+0000\n"
"PO-Revision-Date: 2009-07-10 14:20-0000\n"
"Last-Translator: Mark Smith <Mark.Smith@trosol.co.uk>\n"
"Language-Team: mySociety\n"
@@ -20,8 +20,8 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:555
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:337
+#: perllib/FixMyStreet/DB/Result/Problem.pm:560
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:339
msgid " and "
msgstr ""
@@ -56,97 +56,57 @@ msgstr ""
msgid "%d council contacts &ndash; %d confirmed, %d unconfirmed"
msgstr ""
-#: perllib/Utils.pm:293
-#, fuzzy
-msgid "%d day"
-msgstr "diwrnod"
-
-#: perllib/Utils.pm:293
-#, fuzzy
-msgid "%d days"
-msgstr "diwrnod"
-
#: templates/web/default/admin/council_list.html:27
msgid "%d edits by %s"
msgstr ""
-#: perllib/Utils.pm:294
-#, fuzzy
-msgid "%d hour"
-msgstr "awr"
-
-#: perllib/Utils.pm:294
-#, fuzzy
-msgid "%d hours"
-msgstr "awr"
-
#: templates/web/default/admin/index.html:16
#, fuzzy
msgid "%d live updates"
msgstr "Anfonwch ddiweddariadau ataf i drwy'r e-bost"
-#: perllib/Utils.pm:295
-#, fuzzy
-msgid "%d minute"
-msgstr "munud"
-
-#: perllib/Utils.pm:295
-#, fuzzy
-msgid "%d minutes"
-msgstr "munud"
-
#: templates/web/default/admin/index.html:18
msgid "%d questionnaires sent &ndash; %d answered (%s%%)"
msgstr ""
-#: perllib/Utils.pm:292
-#, fuzzy
-msgid "%d week"
-msgstr "wythnos"
-
-#: perllib/Utils.pm:292
-#, fuzzy
-msgid "%d weeks"
-msgstr "wythnos"
+#: templates/web/default/report/_support.html:3
+msgid "%d supporters"
+msgstr ""
-#: templates/web/default/reports/council.html:0
-#: templates/web/default/reports/council.html:26
-#: templates/web/emptyhomes/reports/council.html:11
-#: templates/web/emptyhomes/reports/council.html:13
+#: templates/web/default/reports/body.html:0
+#: templates/web/default/reports/body.html:26
+#: templates/web/emptyhomes/reports/body.html:11
+#: templates/web/emptyhomes/reports/body.html:13
msgid "%s - Summary reports"
msgstr "%s - Adroddiadau cryno"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:605
+#: perllib/FixMyStreet/DB/Result/Problem.pm:610
msgid "%s ref:&nbsp;%s"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/UK.pm:288 perllib/FixMyStreet/Cobrand/UK.pm:300
+#: perllib/FixMyStreet/Cobrand/UK.pm:279 perllib/FixMyStreet/Cobrand/UK.pm:291
msgid "%s ward, %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:488
+#: perllib/FixMyStreet/DB/Result/Problem.pm:496
msgid "%s, reported anonymously at %s"
msgstr "Rhoddodd %s wybod yn ddi-enw am %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:490
+#: perllib/FixMyStreet/DB/Result/Problem.pm:498
msgid "%s, reported by %s at %s"
msgstr "Adroddwyd am %s gan %s am %s"
-#: perllib/FixMyStreet/Cobrand/UK.pm:315 perllib/FixMyStreet/Cobrand/UK.pm:327
+#: perllib/FixMyStreet/Cobrand/UK.pm:306 perllib/FixMyStreet/Cobrand/UK.pm:318
#, fuzzy
msgid "%s, within %s ward"
msgstr "Eiddo gwag yn ward %s"
-#: templates/web/default/admin/stats.html:5
-#, fuzzy
-msgid "%sreports between %s and %s"
-msgstr "Adroddwyd am %s gan %s am %s"
-
#: templates/web/default/email_sent.html:28
msgid "(Don't worry &mdash; %s)"
msgstr ""
#: templates/web/default/admin/report_blocks.html:11
+#: templates/web/default/admin/search_users.html:23
msgid "(Email in abuse table)"
msgstr ""
@@ -173,7 +133,7 @@ msgid "(returned to use)"
msgstr "(wedi'i adfer i'w ddefnyddio)"
#: templates/web/default/index.html:12 templates/web/default/index.html:8
-#: templates/web/fixmystreet/around/postcode_form.html:7
+#: templates/web/fixmystreet/around/intro.html:2
msgid " "
msgstr " "
@@ -184,6 +144,7 @@ msgid "(not sent to council)"
msgstr "Ni roddwyd gwybod i'r cyngor am hyn"
#: templates/web/default/report/new/fill_in_details_form.html:217
+#: templates/web/zurich/report/new/fill_in_details_form.html:118
msgid "(optional)"
msgstr "(dewisol)"
@@ -197,24 +158,24 @@ msgstr "Ni roddwyd gwybod i'r cyngor am hyn"
msgid "(we never show your email address or phone number)"
msgstr "(nid ydym byth yn dangos eich cyfeiriad e-bost na'ch rhif ffôn)"
-#: templates/web/default/report/display.html:209
+#: templates/web/default/report/update-form.html:156
#, fuzzy
msgid "(we never show your email)"
msgstr "(nid ydym byth yn dangos eich cyfeiriad e-bost na'ch rhif ffôn)"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:284
+#: perllib/FixMyStreet/App/Controller/Admin.pm:285
msgid "*unknown*"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:629
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:655
-#: perllib/FixMyStreet/DB/Result/Problem.pm:345
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:628
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:656
+#: perllib/FixMyStreet/DB/Result/Problem.pm:353
#, fuzzy
msgid "-- Pick a category --"
msgstr "-- Dewiswch fath o eiddo --"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:609
-#: perllib/FixMyStreet/DB/Result/Problem.pm:351
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:608
+#: perllib/FixMyStreet/DB/Result/Problem.pm:359
msgid "-- Pick a property type --"
msgstr "-- Dewiswch fath o eiddo --"
@@ -224,6 +185,10 @@ msgstr "-- Dewiswch fath o eiddo --"
msgid ". You can <a href=\"%s%s\">view the empty property on this site</a>."
msgstr ". Gallwch <a href=\"%s\">weld yr eiddo gwag ar y safle hwn</a>."
+#: templates/web/default/report/_support.html:3
+msgid "1 supporter"
+msgstr ""
+
#: templates/web/default/questionnaire/completed.html:20
#, fuzzy
msgid ""
@@ -255,7 +220,7 @@ msgstr ""
"chyhoeddi</a>?\n"
"</p>\n"
-#: templates/web/fixmystreet/questionnaire/completed-open.html:1
+#: templates/web/fixmystreet/questionnaire/completed-open.html:6
#, fuzzy
msgid ""
"<p style=\"font-size:150%\">We&rsquo;re sorry to hear that. We have two\n"
@@ -277,7 +242,7 @@ msgstr ""
"chyhoeddi</a>?\n"
"</p>\n"
-#: templates/web/default/questionnaire/completed-open.html:1
+#: templates/web/default/questionnaire/completed-open.html:6
#, fuzzy
msgid ""
"<p style=\"font-size:150%\">We&rsquo;re sorry to hear that. We have two\n"
@@ -376,8 +341,8 @@ msgstr ""
"mwy o wybodaeth am statws eich eiddo gwag, dewch yn ôl i'r safle\n"
"a rhowch ddiweddariad yno.</p>\n"
-#: templates/web/default/around/display_location.html:70
-#: templates/web/default/around/display_location.html:72
+#: templates/web/default/around/_report_banner.html:3
+#: templates/web/default/around/_report_banner.html:5
#: templates/web/emptyhomes/around/display_location.html:36
#: templates/web/emptyhomes/around/display_location.html:38
#, fuzzy
@@ -393,17 +358,17 @@ msgstr ""
msgid "<strong>%d</strong> live empty properties"
msgstr "Adrodd am eiddo gwag a gweld y rhain"
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:172
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:193
#, fuzzy
msgid "<strong>No</strong> Let me confirm my report by email"
msgstr "Adrodd am eiddo gwag a gweld y rhain"
-#: templates/web/fixmystreet/report/display.html:148
+#: templates/web/fixmystreet/report/update-form.html:108
#, fuzzy
msgid "<strong>No</strong> Let me confirm my update by email"
msgstr "Adrodd am eiddo gwag a gweld y rhain"
-#: templates/web/fixmystreet/auth/general.html:46
+#: templates/web/fixmystreet/auth/general.html:50
#, fuzzy
msgid "<strong>No</strong> let me sign in by email"
msgstr "Adrodd am eiddo gwag a gweld y rhain"
@@ -417,18 +382,18 @@ msgstr ""
msgid "<strong>No</strong>, let me confirm my report by email:"
msgstr "Adrodd am eiddo gwag a gweld y rhain"
-#: templates/web/default/report/display.html:164
+#: templates/web/default/report/update-form.html:115
#, fuzzy
msgid "<strong>No</strong>, let me confirm my update by email:"
msgstr "Adrodd am eiddo gwag a gweld y rhain"
#: templates/web/default/auth/general.html:37
-#: templates/web/default/report/display.html:142
#: templates/web/default/report/new/fill_in_details_form.html:140
-#: templates/web/fixmystreet/auth/general.html:32
-#: templates/web/fixmystreet/auth/general.html:34
-#: templates/web/fixmystreet/report/display.html:131
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:154
+#: templates/web/default/report/update-form.html:93
+#: templates/web/fixmystreet/auth/general.html:36
+#: templates/web/fixmystreet/auth/general.html:38
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:169
+#: templates/web/fixmystreet/report/update-form.html:85
#, fuzzy
msgid "<strong>Yes</strong> I have a password"
msgstr "Adrodd am eiddo gwag a gweld y rhain"
@@ -441,11 +406,11 @@ msgstr "Adrodd am eiddo gwag a gweld y rhain"
msgid "About us"
msgstr "Amdanom ni"
-#: templates/web/default/admin/council_contacts.html:66
+#: templates/web/default/admin/council_contacts.html:72
msgid "Add new category"
msgstr ""
-#: templates/web/default/my/my.html:56 templates/web/fixmystreet/my/my.html:56
+#: templates/web/default/my/my.html:56 templates/web/fixmystreet/my/my.html:60
msgid "Added %s"
msgstr ""
@@ -462,16 +427,13 @@ msgid "Alert %d disabled (created %s)"
msgstr ""
#: templates/web/bromley/report/display.html:207
-#: templates/web/default/report/display.html:214
-#: templates/web/fixmystreet/report/display.html:189
+#: templates/web/default/report/update-form.html:161
+#: templates/web/fixmystreet/report/update-form.html:146
msgid "Alert me to future updates"
msgstr "Rhowch wybod i mi am ddiweddariadau yn y dyfodol"
-#: templates/web/default/admin/stats.html:5
-msgid "All"
-msgstr ""
-
#: templates/web/default/reports/index.html:3
+#: templates/web/fixmybarangay/reports/index.html:3
#, fuzzy
msgid "All Reports"
msgstr "Adroddiadau"
@@ -484,11 +446,19 @@ msgstr ""
#: templates/web/bromley/header.html:77 templates/web/default/footer.html:11
#: templates/web/fiksgatami/footer.html:7
#: templates/web/fiksgatami/nn/footer.html:7
+#: templates/web/fixmybarangay/footer.html:20
#: templates/web/fixmystreet/footer.html:49
-#: templates/web/reading/footer.html:8
-msgid "Reports"
+#: templates/web/reading/footer.html:8 templates/web/stevenage/footer.html:43
+#: templates/web/zurich/footer.html:12
+#, fuzzy
+msgid "All reports"
msgstr "Adroddiadau"
+#: templates/web/default/admin/stats.html:5
+#, fuzzy
+msgid "All reports between %s and %s"
+msgstr "Adroddwyd am %s gan %s am %s"
+
#: templates/web/default/report/new/councils_text_some.html:2
msgid "All the information you provide here will be sent to"
msgstr ""
@@ -526,6 +496,8 @@ msgstr ""
#: templates/web/default/report/new/fill_in_details_form.html:13
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:6
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:8
+#: templates/web/zurich/report/new/fill_in_details_form.html:6
+#: templates/web/zurich/report/new/fill_in_details_form.html:8
msgid ""
"All the information you provide here will be sent to <strong>%s</strong>."
msgstr ""
@@ -569,10 +541,12 @@ msgid ""
msgstr ""
#: templates/web/fixmystreet/footer.html:17
+#: templates/web/stevenage/footer.html:17
msgid "Are you a developer?"
msgstr ""
#: templates/web/fixmystreet/footer.html:21
+#: templates/web/stevenage/footer.html:21
#, fuzzy
msgid "Are you from a council?"
msgstr "Ni roddwyd gwybod i'r cyngor am hyn"
@@ -593,6 +567,16 @@ msgstr ""
msgid "Ban email address"
msgstr "Eich cyfeiriad e-bost:"
+#: templates/web/fixmybarangay/report/new/notes.html:7
+msgid ""
+"Be sure to choose the right category, because we use that to determine to "
+"whom the report is sent."
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1032
+msgid "Bodies"
+msgstr ""
+
#: templates/web/fiksgatami/footer.html:16
#: templates/web/fiksgatami/nn/footer.html:16
msgid ""
@@ -604,22 +588,23 @@ msgstr ""
msgid "By Date"
msgstr ""
-#: templates/web/fixmystreet/around/display_location.html:80
-#: templates/web/fixmystreet/around/display_location.html:82
+#: templates/web/fixmystreet/around/_report_banner.html:10
+#: templates/web/fixmystreet/around/_report_banner.html:8
#, fuzzy
msgid "Can't see the map? <a href='%s' rel='nofollow'>Skip this step</a>"
msgstr ""
"<small>Os na allwch weld y map, <a href='%s' rel='nofollow'>ewch heibio\n"
" i'r cam hwn</a>.</small>"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:632
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:657
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:631
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:658
#: templates/web/bromley/report/new/fill_in_details_form.html:68
-#: templates/web/default/admin/council_contacts.html:35
+#: templates/web/default/admin/council_contacts.html:37
#: templates/web/default/admin/index.html:36
#: templates/web/default/admin/list_flagged.html:14
#: templates/web/default/admin/search_reports.html:17
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:72
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:74
+#: templates/web/zurich/report/new/fill_in_details_form.html:68
#, fuzzy
msgid "Category"
msgstr "Categori:"
@@ -628,14 +613,14 @@ msgstr "Categori:"
msgid "Category fix rate for empty properties > 4 weeks old"
msgstr ""
-#: templates/web/default/admin/council_contacts.html:72
+#: templates/web/default/admin/council_contacts.html:78
#: templates/web/default/admin/council_edit.html:23
#: templates/web/default/admin/report_edit.html:25
#: templates/web/default/report/new/fill_in_details_form.html:67
msgid "Category:"
msgstr "Categori:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:334
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:336
#, fuzzy
msgid "Category: %s"
msgstr "Categori:"
@@ -646,8 +631,8 @@ msgstr "Categori:"
msgid "Change Password"
msgstr ""
-#: templates/web/fixmystreet/around/display_location.html:72
-#: templates/web/fixmystreet/around/display_location.html:73
+#: templates/web/default/js/validation_strings.html:22
+#: templates/web/fixmystreet/around/_report_banner.html:2
#, fuzzy
msgid "Click map to report an empty property"
msgstr "Sut i roi gwybod am eiddo gwag"
@@ -656,22 +641,22 @@ msgstr "Sut i roi gwybod am eiddo gwag"
#: templates/web/bromley/report/display.html:82
#: templates/web/default/admin/report_edit.html:18
#: templates/web/default/admin/report_edit.html:20
-#: templates/web/default/dashboard/index.html:136
#: templates/web/default/dashboard/index.html:138
-#: templates/web/default/report/display.html:79
-#: templates/web/default/report/display.html:81
+#: templates/web/default/dashboard/index.html:140
+#: templates/web/default/report/update-form.html:30
+#: templates/web/default/report/update-form.html:32
#: templates/web/fixmystreet/report/banner.html:15
-#: templates/web/fixmystreet/report/display.html:74
-#: templates/web/fixmystreet/report/display.html:76
+#: templates/web/fixmystreet/report/update-form.html:28
+#: templates/web/fixmystreet/report/update-form.html:30
msgid "Closed"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:690
+#: perllib/FixMyStreet/DB/Result/Problem.pm:695
#, fuzzy
msgid "Closed by council"
msgstr "Ni roddwyd gwybod i'r cyngor am hyn"
-#: templates/web/default/my/my.html:32 templates/web/fixmystreet/my/my.html:32
+#: templates/web/default/my/my.html:32 templates/web/fixmystreet/my/my.html:36
#, fuzzy
msgid "Closed reports"
msgstr "Cuddio hen adroddiadau "
@@ -680,8 +665,8 @@ msgstr "Cuddio hen adroddiadau "
msgid "Closed:"
msgstr ""
-#: templates/web/default/around/display_location.html:103
-#: templates/web/default/around/display_location.html:105
+#: templates/web/default/around/tabbed_lists.html:10
+#: templates/web/default/around/tabbed_lists.html:12
msgid "Closest nearby empty properties <small>(within&nbsp;%skm)</small>"
msgstr "Yr eiddo gwag cyfagos agosaf <small>(within&nbsp;%skm)</small>"
@@ -705,24 +690,29 @@ msgstr ""
msgid "Cobrand:"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:358
+#: perllib/FixMyStreet/App/Controller/Admin.pm:365
#, fuzzy
msgid "Configuration updated"
msgstr "Cadarnhau"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:372
+#: perllib/FixMyStreet/App/Controller/Admin.pm:380
msgid "Configuration updated - contacts will be generated automatically later"
msgstr ""
-#: templates/web/default/admin/council_contacts.html:153
+#: templates/web/default/admin/council_edit.html:34
+#, fuzzy
+msgid "Configure Endpoint"
+msgstr "Cadarnhau"
+
+#: templates/web/default/admin/council_contacts.html:168
msgid "Configure Open311"
msgstr ""
-#: templates/web/default/admin/council_contacts.html:105
+#: templates/web/default/admin/council_contacts.html:116
msgid "Configure Open311 integration"
msgstr ""
-#: templates/web/default/admin/council_contacts.html:42
+#: templates/web/default/admin/council_contacts.html:46
#, fuzzy
msgid "Confirm"
msgstr "Cadarnhau"
@@ -732,6 +722,13 @@ msgstr "Cadarnhau"
msgid "Confirm account"
msgstr "Cadarnhau"
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:187
+#: templates/web/fixmystreet/report/update-form.html:103
+msgid ""
+"Confirm by email below, providing a new password at that point. When you "
+"confirm, your password will be updated."
+msgstr ""
+
#: templates/web/default/questionnaire/creator_fixed.html:1
#: templates/web/default/tokens/confirm_problem.html:1
#: templates/web/default/tokens/confirm_problem.html:3
@@ -739,18 +736,24 @@ msgstr "Cadarnhau"
#: templates/web/default/tokens/confirm_update.html:3
#: templates/web/emptyhomes/tokens/confirm_problem.html:1
#: templates/web/emptyhomes/tokens/confirm_problem.html:3
+#: templates/web/southampton/tokens/confirm_problem.html:1
+#: templates/web/southampton/tokens/confirm_problem.html:3
msgid "Confirmation"
msgstr "Cadarnhau"
-#: templates/web/default/admin/council_contacts.html:37
-#: templates/web/default/admin/council_contacts.html:82
+#: templates/web/default/admin/council_contacts.html:39
+#: templates/web/default/admin/council_contacts.html:88
#: templates/web/default/admin/council_edit.html:28
-#: templates/web/default/admin/council_edit.html:43
-#: templates/web/default/admin/stats.html:5
+#: templates/web/default/admin/council_edit.html:71
#, fuzzy
msgid "Confirmed"
msgstr "Cadarnhau"
+#: templates/web/default/admin/stats.html:5
+#, fuzzy
+msgid "Confirmed reports between %s and %s"
+msgstr "Adroddwyd am %s gan %s am %s"
+
#: templates/web/default/admin/problem_row.html:23
#: templates/web/default/admin/report_edit.html:34
#, fuzzy
@@ -783,8 +786,8 @@ msgstr "Cysylltwch â Ni"
msgid "Contact the team"
msgstr "Cysylltu â'r tîm"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1150
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1178
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1159
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1187
msgid "Could not find user"
msgstr ""
@@ -796,7 +799,6 @@ msgstr ""
msgid "Council"
msgstr "cyngor"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1022
#: templates/web/default/admin/council_list.html:1
#, fuzzy
msgid "Council contacts"
@@ -829,7 +831,7 @@ msgstr "Cysylltu"
msgid "Create a report"
msgstr "Categori:"
-#: templates/web/default/admin/council_contacts.html:96
+#: templates/web/default/admin/council_contacts.html:107
#, fuzzy
msgid "Create category"
msgstr "Categori:"
@@ -858,15 +860,16 @@ msgstr ""
msgid "Dashboard"
msgstr ""
-#: templates/web/default/admin/council_contacts.html:38
-#: templates/web/default/admin/council_contacts.html:85
+#: templates/web/default/admin/council_contacts.html:40
+#: templates/web/default/admin/council_contacts.html:91
#: templates/web/default/admin/council_edit.html:29
-#: templates/web/default/admin/council_edit.html:44
+#: templates/web/default/admin/council_edit.html:72
msgid "Deleted"
msgstr ""
#: templates/web/bromley/report/new/fill_in_details_form.html:54
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:64
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:66
+#: templates/web/zurich/report/new/fill_in_details_form.html:60
#, fuzzy
msgid "Details"
msgstr "Manylion:"
@@ -876,14 +879,23 @@ msgstr "Manylion:"
msgid "Details:"
msgstr "Manylion:"
+#: templates/web/default/admin/council_contacts.html:41
+msgid "Devolved"
+msgstr ""
+
#: templates/web/default/admin/council_list.html:23
msgid "Diligency prize league table"
msgstr ""
+#: templates/web/fixmystreet/auth/general.html:30
+#, fuzzy
+msgid "Do you have a FixMyBarangay password?"
+msgstr "Diweddariadau i reportemptyhomes.com"
+
#: templates/web/default/auth/general.html:32
-#: templates/web/fixmystreet/auth/general.html:29
-#: templates/web/fixmystreet/report/display.html:128
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:150
+#: templates/web/fixmystreet/auth/general.html:32
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:165
+#: templates/web/fixmystreet/report/update-form.html:82
#, fuzzy
msgid "Do you have a reportemptyhomes.com password?"
msgstr "Diweddariadau i reportemptyhomes.com"
@@ -914,34 +926,33 @@ msgstr "Cyflwyno'ch diweddariad"
msgid "Editing user %d"
msgstr "Cyflwyno'ch diweddariad"
-#: templates/web/default/admin/council_edit.html:45
+#: templates/web/default/admin/council_edit.html:73
msgid "Editor"
msgstr ""
#: templates/web/bromley/report/display.html:126
-#: templates/web/default/admin/council_contacts.html:36
-#: templates/web/default/admin/council_edit.html:42
+#: templates/web/default/admin/council_contacts.html:38
+#: templates/web/default/admin/council_edit.html:70
#: templates/web/default/admin/list_flagged.html:12
#: templates/web/default/admin/list_flagged.html:35
#: templates/web/default/admin/list_updates.html:8
-#: templates/web/default/admin/search_abuse.html:11
#: templates/web/default/admin/search_reports.html:15
#: templates/web/default/admin/search_users.html:13
#: templates/web/fixmystreet/auth/general.html:20
-#: templates/web/fixmystreet/report/display.html:120
+#: templates/web/fixmystreet/report/update-form.html:74
#, fuzzy
msgid "Email"
msgstr "E-bost:"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1126
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1135
msgid "Email added to abuse list"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1123
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1132
msgid "Email already in abuse list"
msgstr ""
-#: templates/web/default/around/display_location.html:85
+#: templates/web/default/around/_updates.html:5
msgid "Email me new local empty properties"
msgstr "Anfonwch fanylion eiddo gwag lleol newydd ataf i drwy'r e-bost"
@@ -949,7 +960,7 @@ msgstr "Anfonwch fanylion eiddo gwag lleol newydd ataf i drwy'r e-bost"
msgid "Email me updates"
msgstr "Anfonwch ddiweddariadau ataf i drwy'r e-bost"
-#: templates/web/default/admin/council_contacts.html:77
+#: templates/web/default/admin/council_contacts.html:83
#: templates/web/default/admin/council_edit.html:26
#: templates/web/default/admin/report_edit.html:31
#: templates/web/default/admin/update_edit.html:24
@@ -959,15 +970,15 @@ msgstr "Anfonwch ddiweddariadau ataf i drwy'r e-bost"
msgid "Email:"
msgstr "E-bost:"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:611
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:610
msgid "Empty flat or maisonette"
msgstr "Fflat neu fflat deulawr gwag"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:610
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:609
msgid "Empty house or bungalow"
msgstr "Tŷ neu fyngalo gwag"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:613
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:612
msgid "Empty office or other commercial"
msgstr "Swyddfa wag neu fan masnachol gwag arall"
@@ -975,11 +986,11 @@ msgstr "Swyddfa wag neu fan masnachol gwag arall"
msgid "Empty property details form"
msgstr "Ffurflen manylion eiddo gwag"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:614
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:613
msgid "Empty pub or bar"
msgstr "Tafarn neu far gwag"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:615
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:614
msgid "Empty public building - school, hospital, etc."
msgstr "Adeilad cyhoeddus gwag - ysgol, ysbyty, ac ati."
@@ -996,6 +1007,11 @@ msgstr "diwrnod"
msgid "End month:"
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:9
+#, fuzzy
+msgid "Enter a Z&uuml;rich street name"
+msgstr "Cofnodwch god post Prydeinig, neu enw stryd ac ardal gerllaw:"
+
#: templates/web/emptyhomes/index.html:40
#: templates/web/emptyhomes/index.html:41
msgid "Enter a nearby GB postcode, or street name and area"
@@ -1020,23 +1036,23 @@ msgid "Enter a nearby street name and area"
msgstr "Cofnodwch god post Prydeinig, neu enw stryd ac ardal gerllaw:"
#: templates/web/default/auth/general.html:64
-#: templates/web/default/report/display.html:171
#: templates/web/default/report/new/fill_in_details_form.html:169
+#: templates/web/default/report/update-form.html:122
#, fuzzy
msgid "Enter a new password:"
msgstr "Ychwanegwch neges"
#: templates/web/bromley/report/display.html:148
#: templates/web/bromley/report/new/fill_in_details_form.html:189
-#: templates/web/fixmystreet/auth/general.html:57
-#: templates/web/fixmystreet/report/display.html:160
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:200
+#: templates/web/fixmystreet/auth/general.html:61
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:221
+#: templates/web/fixmystreet/report/update-form.html:120
#, fuzzy
msgid "Enter a password"
msgstr "Ychwanegwch neges"
-#: templates/web/default/index.html:33 templates/web/emptyhomes/index.html:58
-#: templates/web/fixmystreet/index.html:41
+#: templates/web/default/index-steps.html:11
+#: templates/web/emptyhomes/index.html:58
msgid "Enter details of the empty property"
msgstr "Rhowch fanylion yr eiddo gwag"
@@ -1050,7 +1066,7 @@ msgstr "Rhowch fanylion yr eiddo gwag"
msgid "Error"
msgstr "Gwall"
-#: templates/web/default/admin/council_contacts.html:11
+#: templates/web/default/admin/council_contacts.html:13
#: templates/web/default/admin/council_edit.html:18
msgid "Example postcode %s"
msgstr ""
@@ -1095,16 +1111,11 @@ msgstr "Trwsio<span id=\"my\">Fy</span>Stryd"
msgid "reportemptyhomes.com"
msgstr "reportemptyhomes.com"
-#: templates/web/default/admin/header.html:13
+#: templates/web/default/admin/header.html:10
#, fuzzy
msgid "reportemptyhomes.com admin:"
msgstr "reportemptyhomes.com"
-#: templates/web/default/admin/header.html:3
-#, fuzzy
-msgid "reportemptyhomes.com administration"
-msgstr "Diweddariadau i reportemptyhomes.com"
-
#: templates/web/default/alert/index.html:11
msgid ""
"reportemptyhomes.com has a variety of RSS feeds and email alerts for local "
@@ -1148,13 +1159,13 @@ msgstr ""
#: templates/web/default/admin/index.html:36
#: templates/web/default/admin/report_edit.html:18
#: templates/web/default/admin/report_edit.html:20
-#: templates/web/default/dashboard/index.html:136
#: templates/web/default/dashboard/index.html:138
-#: templates/web/default/report/display.html:79
-#: templates/web/default/report/display.html:81
+#: templates/web/default/dashboard/index.html:140
+#: templates/web/default/report/update-form.html:30
+#: templates/web/default/report/update-form.html:32
#: templates/web/fixmystreet/report/banner.html:12
-#: templates/web/fixmystreet/report/display.html:74
-#: templates/web/fixmystreet/report/display.html:76
+#: templates/web/fixmystreet/report/update-form.html:28
+#: templates/web/fixmystreet/report/update-form.html:30
msgid "Fixed"
msgstr ""
@@ -1170,7 +1181,7 @@ msgstr "cyngor"
msgid "Fixed - User"
msgstr "Cuddio hen adroddiadau "
-#: templates/web/default/my/my.html:27 templates/web/fixmystreet/my/my.html:27
+#: templates/web/default/my/my.html:27 templates/web/fixmystreet/my/my.html:31
#, fuzzy
msgid "Fixed reports"
msgstr "Cuddio hen adroddiadau "
@@ -1183,6 +1194,7 @@ msgstr ""
msgid "Flag user"
msgstr ""
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1037
#: templates/web/default/admin/search_users.html:15
msgid "Flagged"
msgstr ""
@@ -1193,7 +1205,7 @@ msgid "Flagged:"
msgstr ""
#: templates/web/default/reports/_ward-list.html:3
-#: templates/web/emptyhomes/reports/council.html:19
+#: templates/web/emptyhomes/reports/body.html:19
#: templates/web/fixmystreet/reports/_ward-list.html:4
msgid "Follow a ward link to view only reports within that ward."
msgstr ""
@@ -1203,11 +1215,18 @@ msgstr ""
msgid "For council(s):"
msgstr "cyngor"
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:186
+#: templates/web/fixmystreet/report/update-form.html:102
+#, fuzzy
+msgid "Forgotten your password?"
+msgstr "Adroddiadau"
+
#: templates/web/default/faq/faq-en-gb.html:1
#: templates/web/emptyhomes/faq/faq-cy.html:1
#: templates/web/emptyhomes/faq/faq-en-gb.html:1
#: templates/web/fiksgatami/faq/faq-nb.html:1
#: templates/web/fiksgatami/nn/faq/faq-nn.html:1
+#: templates/web/fixmybarangay/faq/faq-en-gb.html:1
#: templates/web/fixmystreet/faq/faq-en-gb.html:1
#: templates/web/fixmystreet/static/privacy.html:1
#: templates/web/zurich/faq/faq-de.html:1
@@ -1223,7 +1242,7 @@ msgid "GeoRSS on Google Maps"
msgstr ""
#: templates/web/bromley/report/display.html:30
-#: templates/web/fixmystreet/report/display.html:23
+#: templates/web/fixmystreet/report/display.html:31
#, fuzzy
msgid "Get updates"
msgstr "Anfonwch ddiweddariadau ataf i drwy'r e-bost"
@@ -1241,6 +1260,7 @@ msgid "Get updates of empty properties in this %s"
msgstr "Porthiant RSS o eiddo gwag yn yr %s hwn"
#: templates/web/default/alert/_list.html:83
+#: templates/web/fixmybarangay/alert/_list.html:28
#: templates/web/fixmystreet/alert/_list.html:82
msgid "Give me an RSS feed"
msgstr "Rhowch borthiant RSS i mi"
@@ -1248,7 +1268,7 @@ msgstr "Rhowch borthiant RSS i mi"
#: templates/web/default/alert/index.html:34
#: templates/web/default/around/postcode_form.html:8
#: templates/web/emptyhomes/index.html:47
-#: templates/web/fixmystreet/around/postcode_form.html:18
+#: templates/web/fixmystreet/around/postcode_form.html:21
msgid "Go"
msgstr "Ewch"
@@ -1285,8 +1305,10 @@ msgstr ""
#: templates/web/emptyhomes/header.html:28
#: templates/web/fiksgatami/footer.html:9
#: templates/web/fiksgatami/nn/footer.html:9
+#: templates/web/fixmybarangay/footer.html:24
#: templates/web/fixmystreet/footer.html:53
-#: templates/web/reading/footer.html:10
+#: templates/web/reading/footer.html:10 templates/web/stevenage/footer.html:47
+#: templates/web/zurich/footer.html:14
msgid "FAQs"
msgstr "Cwestiynau Cyffredin"
@@ -1298,9 +1320,9 @@ msgstr ""
#: templates/web/barnet/header.html:70 templates/web/bromley/header.html:64
#: templates/web/bromley/header.html:99
-#: templates/web/fixmybarangay/header.html.orig:42
-#: templates/web/fixmystreet/header.html:47
-#: templates/web/zurich/header.html:47
+#: templates/web/fixmybarangay/header.html:64
+#: templates/web/fixmystreet/header.html:49
+#: templates/web/stevenage/header.html:97 templates/web/zurich/header.html:47
msgid "Hi %s"
msgstr ""
@@ -1311,26 +1333,24 @@ msgstr ""
msgid "Hidden"
msgstr "Cuddio pinnau"
-#: templates/web/default/around/display_location.html:58
-#: templates/web/fixmystreet/around/display_location.html:58
+#: templates/web/default/around/display_location.html:63
msgid "Hide old"
msgstr ""
-#: templates/web/default/around/display_location.html:53
-#: templates/web/fixmystreet/around/display_location.html:54
+#: templates/web/default/around/display_location.html:58
msgid "Hide pins"
msgstr "Cuddio pinnau"
-#: templates/web/default/admin/council_edit.html:38
+#: templates/web/default/admin/council_edit.html:66
msgid "History"
msgstr ""
-#: templates/web/default/index.html:28 templates/web/emptyhomes/index.html:53
-#: templates/web/fixmystreet/index.html:36
+#: templates/web/default/index-steps.html:1
+#: templates/web/emptyhomes/index.html:53
msgid "How to report an empty property"
msgstr "Sut i roi gwybod am eiddo gwag"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:637
+#: perllib/FixMyStreet/App/Controller/Admin.pm:648
msgid "I am afraid you cannot confirm unconfirmed reports."
msgstr ""
@@ -1418,12 +1438,12 @@ msgstr "Dewis porthiant annilys"
#: templates/web/bromley/report/display.html:82
#: templates/web/default/admin/report_edit.html:18
#: templates/web/default/admin/report_edit.html:20
-#: templates/web/default/dashboard/index.html:136
#: templates/web/default/dashboard/index.html:138
-#: templates/web/default/report/display.html:79
-#: templates/web/default/report/display.html:81
-#: templates/web/fixmystreet/report/display.html:74
-#: templates/web/fixmystreet/report/display.html:76
+#: templates/web/default/dashboard/index.html:140
+#: templates/web/default/report/update-form.html:30
+#: templates/web/default/report/update-form.html:32
+#: templates/web/fixmystreet/report/update-form.html:28
+#: templates/web/fixmystreet/report/update-form.html:30
msgid "In Progress"
msgstr ""
@@ -1452,7 +1472,7 @@ msgstr ""
msgid "Invalid agency_responsible value %s"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:942
+#: perllib/FixMyStreet/App/Controller/Admin.pm:952
#, fuzzy
msgid "Invalid end date"
msgstr "Rhowch ddiweddariad"
@@ -1461,7 +1481,7 @@ msgstr "Rhowch ddiweddariad"
msgid "Invalid format %s specified."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:932
+#: perllib/FixMyStreet/App/Controller/Admin.pm:942
msgid "Invalid start date"
msgstr ""
@@ -1469,12 +1489,12 @@ msgstr ""
#: templates/web/bromley/report/display.html:81
#: templates/web/default/admin/report_edit.html:18
#: templates/web/default/admin/report_edit.html:19
-#: templates/web/default/dashboard/index.html:136
-#: templates/web/default/dashboard/index.html:137
-#: templates/web/default/report/display.html:79
-#: templates/web/default/report/display.html:80
-#: templates/web/fixmystreet/report/display.html:74
-#: templates/web/fixmystreet/report/display.html:75
+#: templates/web/default/dashboard/index.html:138
+#: templates/web/default/dashboard/index.html:139
+#: templates/web/default/report/update-form.html:30
+#: templates/web/default/report/update-form.html:31
+#: templates/web/fixmystreet/report/update-form.html:28
+#: templates/web/fixmystreet/report/update-form.html:29
#, fuzzy
msgid "Investigating"
msgstr "Mordwyo "
@@ -1506,11 +1526,11 @@ msgstr ""
#: templates/web/bromley/report/display.html:166
#: templates/web/bromley/report/new/fill_in_details_form.html:209
#: templates/web/default/auth/general.html:44
-#: templates/web/default/report/display.html:151
#: templates/web/default/report/new/fill_in_details_form.html:149
-#: templates/web/fixmystreet/auth/general.html:42
-#: templates/web/fixmystreet/report/display.html:144
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:167
+#: templates/web/default/report/update-form.html:102
+#: templates/web/fixmystreet/auth/general.html:46
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:182
+#: templates/web/fixmystreet/report/update-form.html:98
msgid "Keep me signed in on this computer"
msgstr ""
@@ -1521,7 +1541,7 @@ msgstr ""
msgid "Last Name"
msgstr "Anfonwch ddiweddariadau ataf i drwy'r e-bost"
-#: templates/web/default/admin/council_contacts.html:39
+#: templates/web/default/admin/council_contacts.html:42
msgid "Last editor"
msgstr ""
@@ -1534,19 +1554,16 @@ msgstr "Anfonwch ddiweddariadau ataf i drwy'r e-bost"
msgid "Last&nbsp;update:"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1028
-msgid "List Flagged"
-msgstr ""
-
-#: templates/web/default/admin/council_contacts.html:14
#: templates/web/default/admin/council_contacts.html:16
+#: templates/web/default/admin/council_contacts.html:18
#, fuzzy
msgid "List all reported empty properties"
msgstr "Eiddo gwag yr adroddwyd amdanynt yn ddiweddar"
#: templates/web/bromley/report/new/fill_in_details_form.html:69
#: templates/web/default/report/new/fill_in_details_form.html:68
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:73
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:75
+#: templates/web/zurich/report/new/fill_in_details_form.html:69
msgid "Loading..."
msgstr ""
@@ -1561,6 +1578,8 @@ msgstr ""
#: templates/web/default/tokens/confirm_alert.html:3
#: templates/web/emptyhomes/alert/index.html:1
#: templates/web/emptyhomes/alert/index.html:3
+#: templates/web/fixmybarangay/alert/index.html:1
+#: templates/web/fixmybarangay/alert/index.html:3
#: templates/web/fixmystreet/alert/updates.html:1
msgid "Local RSS feeds and email alerts"
msgstr "Porthiannau RSS a hysbysiadau e-bost lleol"
@@ -1577,13 +1596,14 @@ msgstr "Porthiannau RSS a hysbysiadau e-bost lleol"
#: templates/web/bromley/header.html:79 templates/web/default/footer.html:13
#: templates/web/fiksgatami/footer.html:8
#: templates/web/fiksgatami/nn/footer.html:8
+#: templates/web/fixmybarangay/footer.html:22
#: templates/web/fixmystreet/footer.html:51
-#: templates/web/reading/footer.html:9
+#: templates/web/reading/footer.html:9 templates/web/stevenage/footer.html:45
msgid "Get local reports"
msgstr "Gweld adroddiadau lleol"
-#: templates/web/default/index.html:32 templates/web/emptyhomes/index.html:57
-#: templates/web/fixmystreet/index.html:40
+#: templates/web/default/index-steps.html:10
+#: templates/web/emptyhomes/index.html:57
msgid "Locate the empty property on a map of the area"
msgstr "Chwiliwch am leoliad yr eiddo gwag ar fap o'r ardal"
@@ -1625,10 +1645,12 @@ msgstr "Mwy o eiddo gwag cyfagos"
#: templates/web/emptyhomes/reports/index.html:10
#: templates/web/fiksgatami/nn/reports/index.html:9
#: templates/web/fiksgatami/reports/index.html:9
-#: templates/web/fixmystreet/auth/general.html:52
-#: templates/web/fixmystreet/report/display.html:177
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:117
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:176
+#: templates/web/fixmybarangay/reports/index.html:19
+#: templates/web/fixmystreet/auth/general.html:56
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:120
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:197
+#: templates/web/fixmystreet/report/update-form.html:134
+#: templates/web/zurich/report/new/fill_in_details_form.html:118
msgid "Name"
msgstr "Enw"
@@ -1644,26 +1666,26 @@ msgstr "Enw:"
msgid "Navigation"
msgstr "Mordwyo "
-#: perllib/FixMyStreet/Geocode/OSM.pm:159
+#: perllib/FixMyStreet/Geocode/OSM.pm:166
msgid ""
"Nearest named road to the pin placed on the map (automatically generated "
"using OpenStreetMap): %s%s"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/UK.pm:161
+#: perllib/FixMyStreet/Cobrand/UK.pm:152
msgid ""
"Nearest postcode to the pin placed on the map (automatically generated): %s "
"(%sm away)"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Default.pm:404
-#: perllib/FixMyStreet/Cobrand/Default.pm:444
+#: perllib/FixMyStreet/Cobrand/Default.pm:407
+#: perllib/FixMyStreet/Cobrand/Default.pm:447
msgid ""
"Nearest road to the pin placed on the map (automatically generated by Bing "
"Maps): %s"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:245
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:265
msgid ""
"Nearest road to the pin placed on the map (automatically generated by Bing "
"Maps): %s\n"
@@ -1675,11 +1697,12 @@ msgid "Nearly Done! Now check your email..."
msgstr ""
#: templates/web/default/reports/index.html:16
+#: templates/web/fixmybarangay/reports/index.html:20
#, fuzzy
msgid "New <br>empty properties"
msgstr "Adroddiadau newydd am eiddo gwag"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:314
+#: perllib/FixMyStreet/App/Controller/Admin.pm:320
msgid "New category contact added"
msgstr ""
@@ -1762,8 +1785,9 @@ msgstr ""
msgid "New!"
msgstr "Newydd!"
-#: templates/web/default/admin/council_contacts.html:48
-#: templates/web/default/admin/council_contacts.html:49
+#: templates/web/default/admin/council_contacts.html:52
+#: templates/web/default/admin/council_contacts.html:53
+#: templates/web/default/admin/council_contacts.html:54
#: templates/web/default/admin/council_edit.html:4
#: templates/web/default/admin/list_updates.html:30
#: templates/web/default/admin/list_updates.html:31
@@ -1786,7 +1810,7 @@ msgstr "Nac ydw"
msgid "No council"
msgstr "cyngor"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:328
+#: perllib/FixMyStreet/DB/Result/Problem.pm:336
msgid "No council selected"
msgstr "Ni ddewiswyd cyngor"
@@ -1817,6 +1841,14 @@ msgstr "Ni ddaethpwyd o hyd i unrhyw eiddo gwag."
msgid "No empty properties have been reported yet."
msgstr "Ni roddwyd gwybod eto am unrhyw eiddo gwag."
+#: templates/web/default/report/_support.html:3
+msgid "No supporters"
+msgstr ""
+
+#: templates/web/default/admin/council_contacts.html:57
+msgid "Non Public"
+msgstr ""
+
#: templates/web/default/admin/council_list.html:5
#: templates/web/default/admin/report_edit.html:16
#, fuzzy
@@ -1828,14 +1860,13 @@ msgstr "Nac ydw"
msgid "Not reported before"
msgstr "Wedi adrodd o'r blaen"
-#: templates/web/default/report/_main.html:11
+#: templates/web/default/report/_main.html:14
#: templates/web/emptyhomes/report/display.html:24
-#: templates/web/fixmystreet/report/_main.html:13
msgid "Not reported to council"
msgstr "Ni roddwyd gwybod i'r cyngor am hyn"
-#: templates/web/default/admin/council_contacts.html:40
-#: templates/web/default/admin/council_edit.html:46
+#: templates/web/default/admin/council_contacts.html:43
+#: templates/web/default/admin/council_edit.html:74
#, fuzzy
msgid "Note"
msgstr "Nac ydw"
@@ -1847,8 +1878,8 @@ msgid ""
"numbers may jump about a little"
msgstr ""
-#: templates/web/default/admin/council_contacts.html:89
-#: templates/web/default/admin/council_edit.html:31
+#: templates/web/default/admin/council_contacts.html:95
+#: templates/web/default/admin/council_edit.html:32
#, fuzzy
msgid "Note:"
msgstr "Nac ydw"
@@ -1857,7 +1888,7 @@ msgstr "Nac ydw"
msgid "Note: <strong>%s</strong>"
msgstr ""
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:149
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:164
msgid "Now to submit your report&hellip;"
msgstr ""
@@ -1867,11 +1898,11 @@ msgid ""
"password?"
msgstr ""
-#: templates/web/fixmystreet/report/display.html:127
+#: templates/web/fixmystreet/report/update-form.html:81
msgid "Now to submit your update&hellip;"
msgstr ""
-#: templates/web/default/report/display.html:133
+#: templates/web/default/report/update-form.html:84
msgid ""
"Now to submit your update&hellip; do you have a reportemptyhomes.com "
"password?"
@@ -1883,6 +1914,7 @@ msgid "Offensive? Unsuitable? Tell us"
msgstr "Sarhaus? Anaddas? Rhowch wybod i ni"
#: templates/web/default/reports/index.html:18
+#: templates/web/fixmybarangay/reports/index.html:22
#, fuzzy
msgid "Old / unknown <br>empty properties"
msgstr "ID eiddo gwag anhysbys"
@@ -1897,11 +1929,13 @@ msgid "Old state"
msgstr ""
#: templates/web/default/reports/index.html:20
+#: templates/web/fixmybarangay/reports/index.html:24
#, fuzzy
msgid "Older <br>returned to use"
msgstr "Wedi'u hadfer i'w defnyddio ers amser"
#: templates/web/default/reports/index.html:17
+#: templates/web/fixmybarangay/reports/index.html:21
#, fuzzy
msgid "Older <br>empty properties"
msgstr "Adroddiadau hŷn o eiddo gwag"
@@ -1921,13 +1955,13 @@ msgstr "Adroddiadau hŷn o eiddo gwag"
#: templates/web/bromley/report/display.html:80
#: templates/web/default/admin/report_edit.html:18
#: templates/web/default/admin/update_edit.html:19
-#: templates/web/default/dashboard/index.html:136
-#: templates/web/default/report/display.html:79
-#: templates/web/fixmystreet/report/display.html:74
+#: templates/web/default/dashboard/index.html:138
+#: templates/web/default/report/update-form.html:30
+#: templates/web/fixmystreet/report/update-form.html:28
msgid "Open"
msgstr ""
-#: templates/web/default/my/my.html:22 templates/web/fixmystreet/my/my.html:22
+#: templates/web/default/my/my.html:22 templates/web/fixmystreet/my/my.html:26
#, fuzzy
msgid "Open reports"
msgstr "Cuddio hen adroddiadau "
@@ -1959,15 +1993,15 @@ msgstr ""
"Neu, gallwch danysgrifio am hysbysiad yn ôl pa ward neu gyngor yr ydych yn "
"byw ynddo:"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:655
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:1006
#: perllib/FixMyStreet/App/Controller/Report/New.pm:656
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:999
-#: perllib/FixMyStreet/DB/Result/Problem.pm:497
-#: perllib/FixMyStreet/DB/Result/Problem.pm:507
-#: perllib/FixMyStreet/DB/Result/Problem.pm:517
-#: perllib/FixMyStreet/DB/Result/Problem.pm:529
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:329
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:338
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:657
+#: perllib/FixMyStreet/DB/Result/Problem.pm:505
+#: perllib/FixMyStreet/DB/Result/Problem.pm:515
+#: perllib/FixMyStreet/DB/Result/Problem.pm:525
+#: perllib/FixMyStreet/DB/Result/Problem.pm:537
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:331
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:340
msgid "Other"
msgstr "Arall"
@@ -1994,9 +2028,9 @@ msgstr ""
#: templates/web/bromley/report/display.html:145
#: templates/web/bromley/report/new/fill_in_details_form.html:186
-#: templates/web/fixmystreet/auth/general.html:55
-#: templates/web/fixmystreet/report/display.html:157
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:197
+#: templates/web/fixmystreet/auth/general.html:59
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:218
+#: templates/web/fixmystreet/report/update-form.html:117
#, fuzzy
msgid "Password (optional)"
msgstr "(dewisol)"
@@ -2007,13 +2041,14 @@ msgstr ""
#: templates/web/bromley/report/new/fill_in_details_form.html:136
#: templates/web/bromley/report/new/fill_in_details_form.html:183
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:133
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:194
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:148
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:215
+#: templates/web/zurich/report/new/fill_in_details_form.html:124
#, fuzzy
msgid "Phone number (optional)"
msgstr "(dewisol)"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:260
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:262
#: templates/web/default/admin/report_edit.html:32
#: templates/web/default/report/new/fill_in_details_form.html:215
msgid "Phone:"
@@ -2021,15 +2056,16 @@ msgstr "Rhif ffôn:"
#: templates/web/bromley/report/display.html:109
#: templates/web/bromley/report/new/fill_in_details_form.html:104
-#: templates/web/fixmystreet/report/display.html:103
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:108
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:92
+#: templates/web/fixmystreet/report/update-form.html:57
+#: templates/web/zurich/report/new/fill_in_details_form.html:86
#, fuzzy
msgid "Photo"
msgstr "Ffotograff:"
#: templates/web/default/questionnaire/index.html:95
-#: templates/web/default/report/display.html:109
#: templates/web/default/report/new/fill_in_details_form.html:102
+#: templates/web/default/report/update-form.html:60
#: templates/web/fixmystreet/questionnaire/index.html:90
msgid "Photo:"
msgstr "Ffotograff:"
@@ -2042,12 +2078,12 @@ msgstr "Ffotograffau o adroddiadau cyfagos diweddar"
#: templates/web/bromley/report/display.html:81
#: templates/web/default/admin/report_edit.html:18
#: templates/web/default/admin/report_edit.html:19
-#: templates/web/default/dashboard/index.html:136
-#: templates/web/default/dashboard/index.html:137
-#: templates/web/default/report/display.html:79
-#: templates/web/default/report/display.html:80
-#: templates/web/fixmystreet/report/display.html:74
-#: templates/web/fixmystreet/report/display.html:75
+#: templates/web/default/dashboard/index.html:138
+#: templates/web/default/dashboard/index.html:139
+#: templates/web/default/report/update-form.html:30
+#: templates/web/default/report/update-form.html:31
+#: templates/web/fixmystreet/report/update-form.html:28
+#: templates/web/fixmystreet/report/update-form.html:29
msgid "Planned"
msgstr ""
@@ -2081,16 +2117,16 @@ msgstr "Rhowch eich cyfeiriad e-bost"
msgid "Please check your email address is correct"
msgstr "Rhowch gyfeiriad e-bost dilys"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:819
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:826
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:845
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:884
-#: perllib/FixMyStreet/DB/Result/Problem.pm:347
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:822
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:829
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:848
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:891
+#: perllib/FixMyStreet/DB/Result/Problem.pm:355
#: templates/web/default/js/validation_strings.html:9
msgid "Please choose a category"
msgstr "Dewiswch gategori"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:353
+#: perllib/FixMyStreet/DB/Result/Problem.pm:361
msgid "Please choose a property type"
msgstr "Dewiswch fath o eiddo"
@@ -2118,8 +2154,8 @@ msgstr ""
#: templates/web/default/report/new/notes.html:7
#: templates/web/fixmystreet/report/new/notes.html:6
msgid ""
-"Please do not be abusive &mdash; abusing your council devalues the service "
-"for all users."
+"Please do not be abusive&nbsp;&mdash; abusing your council devalues the "
+"service for all users."
msgstr ""
#: perllib/FixMyStreet/DB/Result/Comment.pm:146
@@ -2134,7 +2170,7 @@ msgid "Please enter a password"
msgstr "Ychwanegwch neges"
#: perllib/FixMyStreet/App/Controller/Contact.pm:97
-#: perllib/FixMyStreet/DB/Result/Problem.pm:322
+#: perllib/FixMyStreet/DB/Result/Problem.pm:330
#: templates/web/default/js/validation_strings.html:3
msgid "Please enter a subject"
msgstr "Rhowch enw'r pwnc"
@@ -2150,7 +2186,7 @@ msgstr "Cofnodwch gyfeiriad e-bost dilys"
msgid "Please enter a valid email address"
msgstr "Cofnodwch gyfeiriad e-bost dilys"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:325
+#: perllib/FixMyStreet/DB/Result/Problem.pm:333
#: templates/web/default/js/validation_strings.html:4
msgid "Please enter some details"
msgstr "Cofnodwch fanylion"
@@ -2167,7 +2203,8 @@ msgid "Please enter your email"
msgstr "Cofnodwch eich cyfeiriad e-bost"
#: templates/web/bromley/report/new/fill_in_details_form.html:149
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:146
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:161
+#: templates/web/zurich/report/new/fill_in_details_form.html:110
#, fuzzy
msgid "Please enter your email address"
msgstr "Cofnodwch eich cyfeiriad e-bost"
@@ -2177,7 +2214,7 @@ msgstr "Cofnodwch eich cyfeiriad e-bost"
msgid "Please enter your first name"
msgstr "Cofnodwch eich enw"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:340
+#: perllib/FixMyStreet/DB/Result/Problem.pm:348
#: templates/web/default/js/validation_strings.html:7
#, fuzzy
msgid ""
@@ -2189,7 +2226,7 @@ msgstr ""
#: perllib/FixMyStreet/App/Controller/Contact.pm:95
#: perllib/FixMyStreet/DB/Result/Comment.pm:143
-#: perllib/FixMyStreet/DB/Result/Problem.pm:333
+#: perllib/FixMyStreet/DB/Result/Problem.pm:341
#: perllib/FixMyStreet/DB/Result/User.pm:97
#: templates/web/default/js/validation_strings.html:6
msgid "Please enter your name"
@@ -2227,11 +2264,22 @@ msgstr ""
#: templates/web/default/report/new/fill_in_details_text.html:1
#: templates/web/default/report/new/fill_in_details_text.html:11
+#: templates/web/fixmybarangay/report/new/fill_in_details_text.html:1
+#: templates/web/fixmybarangay/report/new/fill_in_details_text.html:10
#: templates/web/fixmystreet/report/new/fill_in_details_text.html:1
-#: templates/web/fixmystreet/report/new/fill_in_details_text.html:11
+#: templates/web/fixmystreet/report/new/fill_in_details_text.html:8
msgid "Please fill in details of the empty property below."
msgstr "Llenwch fanylion yr eiddo gwag isod."
+#: templates/web/fixmybarangay/report/new/fill_in_details_text.html:1
+#: templates/web/fixmybarangay/report/new/fill_in_details_text.html:3
+msgid ""
+"Please fill in details of the empty property below. Leave as much detail as "
+"you can, \n"
+"and if possible describe the exact location of\n"
+"the empty property (e.g. if there is a streetlight number or road name)."
+msgstr ""
+
#: templates/web/default/report/new/fill_in_details_text.html:1
#: templates/web/default/report/new/fill_in_details_text.html:3
msgid ""
@@ -2244,14 +2292,16 @@ msgid ""
"photo of the empty property if you have one), etc."
msgstr ""
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:68
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:70
+#: templates/web/zurich/report/new/fill_in_details_form.html:64
#, fuzzy
msgid "Please fill in details of the empty property."
msgstr "Llenwch fanylion yr eiddo gwag isod."
#: templates/web/bromley/report/new/fill_in_details_form.html:28
#: templates/web/default/report/new/fill_in_details_form.html:27
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:34
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:35
+#: templates/web/zurich/report/new/fill_in_details_form.html:35
#, fuzzy
msgid ""
"Please fill in the form below with details of the empty property, and "
@@ -2260,7 +2310,7 @@ msgstr ""
"Llenwch y ffurflen isod gyda manylion yr eiddo gwag,\n"
"a disgrifiwch y lleoliad mor fanwl ag y bo modd yn y blwch manylion."
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:241
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:243
msgid "Please indicate whether you'd like to receive another questionnaire"
msgstr "Nodwch a fyddech chi'n hoffi derbyn holiadur arall"
@@ -2268,7 +2318,7 @@ msgstr "Nodwch a fyddech chi'n hoffi derbyn holiadur arall"
msgid "Please note that updates are not sent to the council."
msgstr "Sylwer nad yw diweddariadau'n cael eu hanfon at y cyngor."
-#: templates/web/default/report/display.html:56
+#: templates/web/default/report/update-form.html:7
msgid ""
"Please note that updates are not sent to the council. If you leave your name "
"it will be public. Your information will only be used in accordance with our "
@@ -2284,27 +2334,29 @@ msgstr ""
#: templates/web/bromley/report/new/fill_in_details_form.html:23
#: templates/web/default/report/new/fill_in_details_form.html:5
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:25
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:26
+#: templates/web/zurich/report/new/fill_in_details_form.html:26
msgid ""
"Please note your report has <strong>not yet been sent</strong>. Choose a "
"category and add further information below, then submit."
msgstr ""
#: templates/web/default/report/new/notes.html:1
+#: templates/web/fixmybarangay/report/new/notes.html:1
#: templates/web/fixmystreet/report/new/notes.html:1
msgid "Please note:"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:244
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:246
msgid "Please provide some explanation as to why you're reopening this report"
msgstr "Rhowch ychydig o esboniad pam rydych yn ailagor yr adroddiad hwn"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:251
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:253
msgid "Please provide some text as well as a photo"
msgstr "Rhowch rywfaint o destun yn ogystal â ffotograff"
#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:116
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:237
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:239
msgid ""
"Please say whether you've ever reported an empty property to your council "
"before"
@@ -2320,7 +2372,7 @@ msgstr "Dewiswch y porthiant rydych chi eisiau ei gael"
msgid "Please select the type of alert you want"
msgstr "Dewiswch y math o hysbysiad rydych chi eisiau ei gael"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:233
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:235
msgid "Please state whether or not the empty property has been returned to use"
msgstr ""
"Cofnodwch a yw'r eiddo gwag wedi cael ei adfer i'w ddefnyddio, ai peidio"
@@ -2329,11 +2381,11 @@ msgstr ""
msgid "Please take a look at the updates that have been left."
msgstr "Ewch i fwrw golwg ar y diweddariadau sydd wedi cael eu gadael."
-#: perllib/FixMyStreet/App/Controller/Photo.pm:176
+#: perllib/FixMyStreet/App/Controller/Photo.pm:175
msgid "Please upload a JPEG image only"
msgstr "Dim ond llun JPEG y dylech lwytho i fyny."
-#: perllib/FixMyStreet/App/Controller/Photo.pm:183
+#: perllib/FixMyStreet/App/Controller/Photo.pm:182
#, fuzzy
msgid "Please upload a JPEG image only\n"
msgstr "Dim ond llun JPEG y dylech lwytho i fyny."
@@ -2343,7 +2395,7 @@ msgid "Please write a message"
msgstr "Ysgrifennwch neges"
#: templates/web/bromley/report/display.html:70
-#: templates/web/fixmystreet/report/display.html:69
+#: templates/web/fixmystreet/report/update-form.html:23
#, fuzzy
msgid "Please write your update here"
msgstr "Rhowch eich enw"
@@ -2352,13 +2404,13 @@ msgstr "Rhowch eich enw"
#: templates/web/bromley/report/display.html:149
#: templates/web/bromley/report/display.html:161
#: templates/web/default/contact/index.html:93
-#: templates/web/default/report/display.html:119
-#: templates/web/default/report/display.html:156
-#: templates/web/default/report/display.html:178
+#: templates/web/default/report/update-form.html:107
+#: templates/web/default/report/update-form.html:129
+#: templates/web/default/report/update-form.html:70
#: templates/web/fixmystreet/contact/index.html:93
-#: templates/web/fixmystreet/report/display.html:115
-#: templates/web/fixmystreet/report/display.html:139
-#: templates/web/fixmystreet/report/display.html:161
+#: templates/web/fixmystreet/report/update-form.html:121
+#: templates/web/fixmystreet/report/update-form.html:69
+#: templates/web/fixmystreet/report/update-form.html:93
msgid "Post"
msgstr "Postio"
@@ -2375,6 +2427,12 @@ msgstr "Cofnodwyd gan %s am %s"
msgid "Posted by %s at %s"
msgstr "Cofnodwyd gan %s am %s"
+#: templates/web/default/admin/council_contacts.html:100
+#: templates/web/default/admin/council_edit.html:30
+#: templates/web/default/admin/report_edit.html:43
+msgid "Private"
+msgstr ""
+
#: templates/web/default/maps/openlayers.html:85
msgid "Empty property"
msgstr "Eiddo gwag"
@@ -2399,7 +2457,7 @@ msgstr "Eiddo gwag yn %s"
msgid "Empty property breakdown by state"
msgstr "ni fydd eich eiddo gwag yn cael ei bostio"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:819
+#: perllib/FixMyStreet/App/Controller/Admin.pm:849
#, fuzzy
msgid "Empty property marked as open."
msgstr "Ffurflen manylion eiddo gwag"
@@ -2413,18 +2471,18 @@ msgstr ""
msgid "Empty properties"
msgstr "Eiddo gwag"
-#: templates/web/default/around/display_location.html:81
+#: templates/web/default/around/_updates.html:1
msgid "Empty properties in this area"
msgstr "Eiddo gwag yn yr ardal hon"
#: templates/web/bromley/report/display.html:31
-#: templates/web/fixmystreet/around/display_location.html:98
-#: templates/web/fixmystreet/report/display.html:24
+#: templates/web/fixmystreet/around/tabbed_lists.html:4
+#: templates/web/fixmystreet/report/display.html:35
#, fuzzy
msgid "Empty properties nearby"
msgstr "Mwy o eiddo gwag cyfagos"
-#: templates/web/fixmystreet/around/display_location.html:97
+#: templates/web/fixmystreet/around/tabbed_lists.html:3
#, fuzzy
msgid "Empty properties on the map"
msgstr "Eiddo gwag yn yr ardal hon"
@@ -2443,24 +2501,25 @@ msgstr ""
msgid "Empty properties within %.1fkm of this location"
msgstr "Eiddo gwag o fewn %skm o'r lleoliad hwn"
-#: perllib/FixMyStreet/Cobrand/Default.pm:609
+#: perllib/FixMyStreet/Cobrand/Default.pm:612
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:95
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:162
-#: perllib/FixMyStreet/Cobrand/UK.pm:240
+#: perllib/FixMyStreet/Cobrand/UK.pm:231
msgid "Empty properties within %s"
msgstr "Eiddo gwag yn %s"
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:103
-#: perllib/FixMyStreet/Cobrand/UK.pm:254
+#: perllib/FixMyStreet/Cobrand/UK.pm:245
msgid "Empty properties within %s ward"
msgstr "Eiddo gwag yn ward %s"
-#: templates/web/default/reports/council.html:0
-#: templates/web/default/reports/council.html:29
+#: templates/web/default/reports/body.html:0
+#: templates/web/default/reports/body.html:29
msgid "Empty properties within %s, reportemptyhomes.com"
msgstr "Eiddo gwag o fewn %s, reportemptyhomes.com"
#: templates/web/default/alert/_list.html:40
+#: templates/web/fixmybarangay/alert/_list.html:13
#: templates/web/fixmystreet/alert/_list.html:42
msgid "Empty properties within the boundary of:"
msgstr "Eiddo gwag o fewn ffiniau:"
@@ -2471,19 +2530,19 @@ msgstr ""
"Eiddo y cafwyd adroddiadau diweddar ar reportemptyhomes.com eu bod wedi cael "
"eu hadfer i'w defnyddio"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:617
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:616
msgid "Property type:"
msgstr "Math o eiddo:"
#: templates/web/bromley/report/new/fill_in_details_form.html:52
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:62
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:64
#, fuzzy
msgid "Provide a title"
msgstr "Rhowch ddiweddariad"
#: templates/web/bromley/report/display.html:57
-#: templates/web/default/report/display.html:51
-#: templates/web/fixmystreet/report/display.html:50
+#: templates/web/default/report/update-form.html:3
+#: templates/web/fixmystreet/report/update-form.html:4
msgid "Provide an update"
msgstr "Rhowch ddiweddariad"
@@ -2494,15 +2553,20 @@ msgid ""
msgstr ""
#: templates/web/bromley/report/display.html:142
-#: templates/web/default/report/display.html:175
#: templates/web/default/report/new/fill_in_details_form.html:173
-#: templates/web/fixmystreet/report/display.html:154
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:191
+#: templates/web/default/report/update-form.html:126
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:212
+#: templates/web/fixmystreet/report/update-form.html:114
msgid ""
"Providing a password is optional, but doing so will allow you to more easily "
"report empty properties, leave updates and manage your reports."
msgstr ""
+#: templates/web/default/admin/council_contacts.html:44
+#: templates/web/default/admin/council_contacts.html:57
+msgid "Public"
+msgstr ""
+
#: templates/web/default/questionnaire/completed.html:1
#: templates/web/default/questionnaire/completed.html:2
#: templates/web/default/questionnaire/index.html:0
@@ -2525,7 +2589,7 @@ msgstr "Llenwyd yr holiadur gan yr unigolyn a roddodd wybod am yr eiddo gwag"
msgid "Questionnaire %d sent for empty property %d"
msgstr "Llenwyd yr holiadur gan yr unigolyn a roddodd wybod am yr eiddo gwag"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:190
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:192
msgid "Questionnaire filled in by empty property reporter"
msgstr "Llenwyd yr holiadur gan yr unigolyn a roddodd wybod am yr eiddo gwag"
@@ -2537,18 +2601,16 @@ msgstr "Llenwyd yr holiadur gan yr unigolyn a roddodd wybod am yr eiddo gwag"
#: templates/web/default/reports/_rss.html:1
#: templates/web/fixmystreet/alert/_list.html:22
#: templates/web/fixmystreet/alert/updates.html:9
-#: templates/web/fixmystreet/around/display_location.html:1
-#: templates/web/fixmystreet/around/display_location.html:3
-#: templates/web/fixmystreet/report/display.html:30
+#: templates/web/fixmystreet/report/display.html:49
msgid "RSS feed"
msgstr "Porthiant RSS"
-#: perllib/FixMyStreet/Cobrand/UK.pm:283 perllib/FixMyStreet/Cobrand/UK.pm:295
+#: perllib/FixMyStreet/Cobrand/UK.pm:274 perllib/FixMyStreet/Cobrand/UK.pm:286
#, fuzzy
msgid "RSS feed for %s"
msgstr "Porthiant RSS %s"
-#: perllib/FixMyStreet/Cobrand/UK.pm:289 perllib/FixMyStreet/Cobrand/UK.pm:301
+#: perllib/FixMyStreet/Cobrand/UK.pm:280 perllib/FixMyStreet/Cobrand/UK.pm:292
#, fuzzy
msgid "RSS feed for %s ward, %s"
msgstr "Porthiant RSS %s"
@@ -2557,11 +2619,11 @@ msgstr "Porthiant RSS %s"
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:186
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:196
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:204
-#: perllib/FixMyStreet/Cobrand/UK.pm:309 perllib/FixMyStreet/Cobrand/UK.pm:321
+#: perllib/FixMyStreet/Cobrand/UK.pm:300 perllib/FixMyStreet/Cobrand/UK.pm:312
msgid "RSS feed of %s"
msgstr "Porthiant RSS %s"
-#: perllib/FixMyStreet/Cobrand/UK.pm:314 perllib/FixMyStreet/Cobrand/UK.pm:326
+#: perllib/FixMyStreet/Cobrand/UK.pm:305 perllib/FixMyStreet/Cobrand/UK.pm:317
#, fuzzy
msgid "RSS feed of %s, within %s ward"
msgstr "Porthiant RSS %s"
@@ -2575,31 +2637,29 @@ msgstr "Porthiant RSS o eiddo gwag sydd gerllaw"
msgid "RSS feed of empty properties in this %s"
msgstr "Porthiant RSS o eiddo gwag yn yr %s hwn"
-#: perllib/FixMyStreet/Cobrand/Default.pm:610
+#: perllib/FixMyStreet/Cobrand/Default.pm:613
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:96
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:161
-#: perllib/FixMyStreet/Cobrand/UK.pm:247
+#: perllib/FixMyStreet/Cobrand/UK.pm:238
#, fuzzy
msgid "RSS feed of empty properties within %s"
msgstr "Porthiant RSS o eiddo gwag yn yr %s hwn"
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:102
-#: perllib/FixMyStreet/Cobrand/UK.pm:253
+#: perllib/FixMyStreet/Cobrand/UK.pm:244
#, fuzzy
msgid "RSS feed of empty properties within %s ward"
msgstr "Porthiant RSS o eiddo gwag yn yr %s hwn"
#: templates/web/default/around/display_location.html:1
#: templates/web/default/around/display_location.html:4
-#: templates/web/fixmystreet/around/display_location.html:1
-#: templates/web/fixmystreet/around/display_location.html:4
msgid "RSS feed of recent local empty properties"
msgstr "Porthiant RSS o eiddo gwag lleol diweddar"
#: templates/web/bromley/report/display.html:37
#: templates/web/default/report/display.html:42
#: templates/web/fixmystreet/alert/updates.html:9
-#: templates/web/fixmystreet/report/display.html:30
+#: templates/web/fixmystreet/report/display.html:49
msgid "RSS feed of updates to this empty property"
msgstr "Porthiant RSS o ddiweddariadau i'r eiddo gwag hwn"
@@ -2607,7 +2667,7 @@ msgstr "Porthiant RSS o ddiweddariadau i'r eiddo gwag hwn"
#: templates/web/default/alert/updates.html:9
#: templates/web/default/report/display.html:33
#: templates/web/fixmystreet/alert/updates.html:14
-#: templates/web/fixmystreet/report/display.html:32
+#: templates/web/fixmystreet/report/display.html:51
msgid "Receive email when updates are left on this empty property."
msgstr ""
"Derbyn neges e-bost pan fydd diweddariadau'n cael eu rhoi am yr eiddo gwag "
@@ -2615,12 +2675,11 @@ msgstr ""
#: templates/web/default/around/display_location.html:0
#: templates/web/default/around/display_location.html:34
-#: templates/web/fixmystreet/around/display_location.html:0
-#: templates/web/fixmystreet/around/display_location.html:34
msgid "Recent local empty properties, reportemptyhomes.com"
msgstr "Eiddo gwag lleol diweddar, reportemptyhomes.com"
#: templates/web/default/reports/index.html:19
+#: templates/web/fixmybarangay/reports/index.html:23
#, fuzzy
msgid "Recently <br>returned to use"
msgstr "Wedi'u hadfer i'w defnyddio'n ddiweddar"
@@ -2631,7 +2690,7 @@ msgstr "Wedi'u hadfer i'w defnyddio'n ddiweddar"
msgid "Recently returned to use"
msgstr "Wedi'u hadfer i'w defnyddio'n ddiweddar"
-#: templates/web/default/index.html:50 templates/web/fixmystreet/index.html:62
+#: templates/web/default/index.html:37 templates/web/fixmystreet/index.html:45
msgid "Recently reported empty properties"
msgstr "Eiddo gwag yr adroddwyd amdanynt yn ddiweddar"
@@ -2644,11 +2703,17 @@ msgid ""
"council directly using their own website."
msgstr ""
+#: templates/web/fixmybarangay/report/new/notes.html:9
+msgid ""
+"Remember that, for the pilot project, FixMyBarangay is only for reporting "
+"potholes and streetlights in bgy. Luz or Basak San Nicolas."
+msgstr ""
+
#: templates/web/default/admin/report_blocks.html:16
msgid "Remove flag"
msgstr ""
-#: templates/web/default/admin/report_edit.html:53
+#: templates/web/default/admin/report_edit.html:54
#: templates/web/default/admin/update_edit.html:48
msgid "Remove photo (can't be undone!)"
msgstr ""
@@ -2662,12 +2727,13 @@ msgstr "Adrodd am Eiddo Gwag"
#: templates/web/fiksgatami/footer.html:5
#: templates/web/fiksgatami/nn/footer.html:5
#: templates/web/fixmystreet/footer.html:45
-#: templates/web/reading/footer.html:6
+#: templates/web/reading/footer.html:6 templates/web/stevenage/footer.html:39
+#: templates/web/zurich/footer.html:10
msgid "Report a property"
msgstr "Rhoi gwybod am eiddo"
#: templates/web/bromley/report/display.html:28
-#: templates/web/fixmystreet/report/display.html:22
+#: templates/web/fixmystreet/report/display.html:29
#, fuzzy
msgid "Report abuse"
msgstr "Adroddiadau"
@@ -2677,13 +2743,15 @@ msgstr "Adroddiadau"
msgid "Report empty properties"
msgstr "Adrodd am eiddo gwag a gweld y rhain"
-#: perllib/FixMyStreet/App/Controller/Rss.pm:277
+#: perllib/FixMyStreet/App/Controller/Rss.pm:286
#, fuzzy
msgid "Report on %s"
msgstr "Adroddiadau"
#: templates/web/default/index.html:15
-#: templates/web/fixmystreet/around/postcode_form.html:6
+#: templates/web/fixmystreet/around/intro.html:1
+#: templates/web/stevenage/around/intro.html:1
+#: templates/web/zurich/around/intro.html:1
msgid "Report and view empty properties"
msgstr "Adrodd am eiddo gwag a gweld y rhain"
@@ -2697,7 +2765,7 @@ msgstr "Adroddiadau"
msgid "Reported %s, to %s"
msgstr "Adroddwyd gan %s am %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:512
+#: perllib/FixMyStreet/DB/Result/Problem.pm:520
#: templates/web/default/contact/index.html:45
#: templates/web/fixmystreet/contact/index.html:46
msgid "Reported anonymously at %s"
@@ -2709,33 +2777,33 @@ msgstr "Adroddwyd yn ddi-enw am %s"
msgid "Reported before"
msgstr "Wedi adrodd o'r blaen"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:504
+#: perllib/FixMyStreet/DB/Result/Problem.pm:512
msgid "Reported by %s anonymously at %s"
msgstr "Adroddwyd gan %s yn ddi-enw am %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:535
+#: perllib/FixMyStreet/DB/Result/Problem.pm:543
#: templates/web/default/contact/index.html:47
#: templates/web/fixmystreet/contact/index.html:48
msgid "Reported by %s at %s"
msgstr "Adroddwyd gan %s am %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:526
+#: perllib/FixMyStreet/DB/Result/Problem.pm:534
msgid "Reported by %s by %s at %s"
msgstr "Adroddwyd gan %s trwy %s am %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:500
+#: perllib/FixMyStreet/DB/Result/Problem.pm:508
msgid "Reported by %s in the %s category anonymously at %s"
msgstr "Adroddwyd am hyn gan %s yn y categori %s yn ddi-enw, am %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:520
+#: perllib/FixMyStreet/DB/Result/Problem.pm:528
msgid "Reported by %s in the %s category by %s at %s"
msgstr "Adroddwyd gan %s yn y categori %s trwy %s am %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:508
+#: perllib/FixMyStreet/DB/Result/Problem.pm:516
msgid "Reported in the %s category anonymously at %s"
msgstr "Adroddiwyd yn y categori %s yn ddi-enw am %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:530
+#: perllib/FixMyStreet/DB/Result/Problem.pm:538
msgid "Reported in the %s category by %s at %s"
msgstr "Adroddwyd yn y categori %s gan %s am %s"
@@ -2747,10 +2815,15 @@ msgstr "Adroddwyd yn y categori %s gan %s am %s"
#: templates/web/fixmystreet/report/new/fill_in_details.html:0
#: templates/web/fixmystreet/report/new/fill_in_details.html:5
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:2
+#: templates/web/zurich/report/new/fill_in_details_form.html:2
msgid "Reporting an empty property"
msgstr "Adrodd am eiddo gwag"
-#: templates/web/default/around/display_location.html:95
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1033
+msgid "Reports"
+msgstr "Adroddiadau"
+
+#: templates/web/default/around/tabbed_lists.html:3
msgid "Reports on and around the map"
msgstr "Adroddiadau ar ac yng nghyffiniau'r map"
@@ -2759,43 +2832,31 @@ msgstr "Adroddiadau ar ac yng nghyffiniau'r map"
msgid "Resend report"
msgstr "Cuddio hen adroddiadau "
-#: perllib/FixMyStreet/Geocode/OSM.pm:166
+#: perllib/FixMyStreet/Geocode/OSM.pm:173
msgid ""
"Road operator for this named road (derived from road reference number and "
"type): %s"
msgstr ""
-#: perllib/FixMyStreet/Geocode/OSM.pm:163
+#: perllib/FixMyStreet/Geocode/OSM.pm:170
msgid "Road operator for this named road (from OpenStreetMap): %s"
msgstr ""
-#: templates/web/default/admin/council_edit.html:35
+#: templates/web/default/admin/council_edit.html:63
msgid "Save changes"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1027
-#, fuzzy
-msgid "Search Abuse"
-msgstr "Adroddiadau cryno"
-
-#: templates/web/default/admin/search_abuse.html:1
-msgid "Search Abuse Table"
-msgstr ""
-
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1023
#: templates/web/default/admin/list_flagged.html:1
#: templates/web/default/admin/search_reports.html:1
#, fuzzy
msgid "Search Reports"
msgstr "Adroddiadau cryno"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1026
#: templates/web/default/admin/search_users.html:1
#, fuzzy
msgid "Search Users"
msgstr "Adroddiadau cryno"
-#: templates/web/default/admin/search_abuse.html:4
#: templates/web/default/admin/search_reports.html:5
#: templates/web/default/admin/search_users.html:5
msgid "Search:"
@@ -2812,7 +2873,7 @@ msgstr ""
"porthiant RSS,\n"
"neu rhowch eich cyfeiriad e-bost i danysgrifio am hysbysiad e-bost."
-#: perllib/FixMyStreet/DB/Result/Problem.pm:618
+#: perllib/FixMyStreet/DB/Result/Problem.pm:623
msgid "Sent to %s %s later"
msgstr "Anfonwyd at %s %s yn ddiweddarach"
@@ -2825,6 +2886,10 @@ msgstr "Pwnc:"
msgid "Service:"
msgstr ""
+#: templates/web/fixmystreet/report/display.html:33
+msgid "Share"
+msgstr ""
+
#: templates/web/emptyhomes/static/about.html:21
msgid "Shelter Cymru"
msgstr ""
@@ -2868,32 +2933,30 @@ msgstr ""
#: templates/web/bromley/report/display.html:203
#: templates/web/bromley/report/new/fill_in_details_form.html:129
#: templates/web/bromley/report/new/fill_in_details_form.html:175
-#: templates/web/default/report/display.html:208
#: templates/web/default/report/new/fill_in_details_form.html:210
-#: templates/web/fixmystreet/report/display.html:185
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:126
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:186
+#: templates/web/default/report/update-form.html:155
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:139
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:207
+#: templates/web/fixmystreet/report/update-form.html:142
msgid "Show my name publicly"
msgstr ""
-#: templates/web/default/around/display_location.html:60
-#: templates/web/fixmystreet/around/display_location.html:60
+#: templates/web/default/around/display_location.html:65
msgid "Show old"
msgstr ""
-#: templates/web/default/around/display_location.html:51
-#: templates/web/fixmystreet/around/display_location.html:52
+#: templates/web/default/around/display_location.html:56
msgid "Show pins"
msgstr "Dangos pinnau"
#: templates/web/default/auth/general.html:3
#: templates/web/default/auth/general.html:49
-#: templates/web/fixmybarangay/header.html.orig:46
+#: templates/web/fixmybarangay/header.html:68
#: templates/web/fixmystreet/auth/general.html:3
-#: templates/web/fixmystreet/auth/general.html:38
-#: templates/web/fixmystreet/auth/general.html:58
-#: templates/web/fixmystreet/header.html:51
-#: templates/web/zurich/header.html:51
+#: templates/web/fixmystreet/auth/general.html:42
+#: templates/web/fixmystreet/auth/general.html:62
+#: templates/web/fixmystreet/header.html:53
+#: templates/web/stevenage/header.html:101 templates/web/zurich/header.html:51
msgid "Sign in"
msgstr ""
@@ -2912,6 +2975,7 @@ msgstr ""
#: templates/web/emptyhomes/header.html:41
#: templates/web/fiksgatami/header.html:22
#: templates/web/fiksgatami/nn/header.html:22
+#: templates/web/fixmybarangay/auth/sign_out.html:1
#: templates/web/lichfielddc/header.html:177
#: templates/web/reading/header.html:33
msgid "Sign out"
@@ -2927,11 +2991,13 @@ msgid "Signed in as %s"
msgstr ""
#: templates/web/default/report/new/fill_in_details_text.html:1
+#: templates/web/fixmybarangay/report/new/fill_in_details_text.html:1
#: templates/web/fixmystreet/report/new/fill_in_details_text.html:1
msgid "Some categories may require additional information."
msgstr ""
#: templates/web/default/alert/index.html:42
+#: templates/web/fixmybarangay/alert/index.html:32
msgid "Some photos of recent reports"
msgstr "Rhai ffotograffau o adroddiadau diweddar"
@@ -2944,7 +3010,7 @@ msgstr ""
msgid "Some unconfirmeds"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/UK.pm:97
+#: perllib/FixMyStreet/Cobrand/UK.pm:89
msgid ""
"Sorry, that appears to be a Crown dependency postcode, which we don't cover."
msgstr ""
@@ -2953,15 +3019,16 @@ msgstr ""
msgid "Sorry, there has been an error confirming your empty property."
msgstr "Sori, bu gwall wrth gadarnhau eich eiddo gwag."
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:214
-#: perllib/FixMyStreet/Geocode.pm:27 perllib/FixMyStreet/Geocode/Bing.pm:51
-#: perllib/FixMyStreet/Geocode/Google.pm:69
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:211
+#: perllib/FixMyStreet/Geocode.pm:28 perllib/FixMyStreet/Geocode/Bing.pm:58
+#: perllib/FixMyStreet/Geocode/Google.pm:74
+#: perllib/FixMyStreet/Geocode/OSM.pm:66
msgid "Sorry, we could not find that location."
msgstr "Sori, ni fu modd i ni ddod o hyd i'r lleoliad hwnnw."
-#: perllib/FixMyStreet/Geocode/Bing.pm:46
-#: perllib/FixMyStreet/Geocode/Google.pm:64
-#: perllib/FixMyStreet/Geocode/OSM.pm:59
+#: perllib/FixMyStreet/Geocode/Bing.pm:53
+#: perllib/FixMyStreet/Geocode/Google.pm:69
+#: perllib/FixMyStreet/Geocode/Zurich.pm:82
msgid "Sorry, we could not parse that location. Please try again."
msgstr ""
"Sori, ni fu modd i ni ddosrannu'r lleoliad hwnnw. Rhowch gynnig arall arni."
@@ -2989,19 +3056,19 @@ msgstr ""
#: templates/web/default/admin/list_flagged.html:18
#: templates/web/default/admin/list_updates.html:6
#: templates/web/default/admin/search_reports.html:21
-#: templates/web/fixmystreet/report/display.html:72
+#: templates/web/fixmystreet/report/update-form.html:26
#, fuzzy
msgid "State"
msgstr "Diweddariad:"
#: templates/web/default/admin/report_edit.html:17
#: templates/web/default/admin/update_edit.html:18
-#: templates/web/default/report/display.html:77
+#: templates/web/default/report/update-form.html:28
#, fuzzy
msgid "State:"
msgstr "Diweddariad:"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1029
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1038
#: templates/web/default/admin/stats.html:1
#, fuzzy
msgid "Stats"
@@ -3014,7 +3081,7 @@ msgstr "Anfon yr holiadur"
#: templates/web/bromley/report/new/fill_in_details_form.html:48
#: templates/web/fixmystreet/contact/index.html:79
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:58
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:60
#, fuzzy
msgid "Subject"
msgstr "Pwnc:"
@@ -3032,13 +3099,14 @@ msgstr "Pwnc:"
#: templates/web/default/report/new/fill_in_details_form.html:114
#: templates/web/default/report/new/fill_in_details_form.html:154
#: templates/web/default/report/new/fill_in_details_form.html:176
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:137
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:162
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:201
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:152
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:177
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:222
+#: templates/web/zurich/report/new/fill_in_details_form.html:128
msgid "Submit"
msgstr "Anfon"
-#: templates/web/default/admin/report_edit.html:56
+#: templates/web/default/admin/report_edit.html:57
#: templates/web/default/admin/update_edit.html:51
#: templates/web/default/admin/user_edit.html:20
#, fuzzy
@@ -3054,16 +3122,24 @@ msgstr "Anfon yr holiadur"
#: templates/web/default/alert/updates.html:17
#: templates/web/default/report/display.html:38
#: templates/web/fixmystreet/alert/updates.html:23
-#: templates/web/fixmystreet/report/display.html:37
+#: templates/web/fixmystreet/report/display.html:56
msgid "Subscribe"
msgstr "Tanysgrifio"
#: templates/web/default/alert/_list.html:97
+#: templates/web/fixmybarangay/alert/_list.html:42
#: templates/web/fixmystreet/alert/_list.html:92
msgid "Subscribe me to an email alert"
msgstr "Dymunaf danysgrifio i rybuddion drwy e-bost"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1021
+#: templates/web/fixmybarangay/alert/_list.html:6
+#, fuzzy
+msgid "Subscribe to an alert based upon what baranagay you&rsquo;re in:"
+msgstr ""
+"Neu, gallwch danysgrifio am hysbysiad yn ôl pa ward neu gyngor yr ydych yn "
+"byw ynddo:"
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1031
#: templates/web/default/admin/index.html:1
#, fuzzy
msgid "Summary"
@@ -3073,10 +3149,14 @@ msgstr "Adroddiadau cryno"
#: templates/web/emptyhomes/reports/index.html:1
#: templates/web/fiksgatami/nn/reports/index.html:1
#: templates/web/fiksgatami/reports/index.html:1
+#: templates/web/fixmybarangay/reports/index.html:1
msgid "Summary reports"
msgstr "Adroddiadau cryno"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1025
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1035
+msgid "Survey"
+msgstr ""
+
#: templates/web/default/admin/questionnaire.html:1
msgid "Survey Results"
msgstr ""
@@ -3085,7 +3165,7 @@ msgstr ""
msgid "Text"
msgstr ""
-#: templates/web/default/admin/council_contacts.html:18
+#: templates/web/default/admin/council_contacts.html:20
msgid "Text only version"
msgstr ""
@@ -3185,14 +3265,14 @@ msgstr ""
"i ni'ch holi chi, a ydych erioed wedi rhoi gwybod i'r cyngor am eiddo gwag "
"cyn hyn?"
-#: perllib/FixMyStreet/App/Controller/Photo.pm:190
+#: perllib/FixMyStreet/App/Controller/Photo.pm:189
msgid ""
"That image doesn't appear to have uploaded correctly (%s), please try again."
msgstr ""
"Nid yw'n ymddangos bod y ddelwedd honno wedi llwytho i fyny'n gywir (%s), "
"rhowch gynnig arni eto."
-#: perllib/FixMyStreet/App/Controller/Council.pm:91
+#: perllib/FixMyStreet/App/Controller/Council.pm:90
#, fuzzy
msgid ""
"That location does not appear to be covered by a council; perhaps it is "
@@ -3201,7 +3281,7 @@ msgstr ""
"Nid yw'n ymddangos bod cyngor yn gyfrifol am y lleoliad hwnnw, efallai ei "
"fod ar y môr - chwiliwch am fan mwy penodol."
-#: perllib/FixMyStreet/App/Controller/Location.pm:107
+#: perllib/FixMyStreet/App/Controller/Location.pm:121
#, fuzzy
msgid "That location does not appear to be in the UK; please try again."
msgstr ""
@@ -3209,16 +3289,21 @@ msgstr ""
"arni."
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:63
-#: perllib/FixMyStreet/Cobrand/UK.pm:90
+#: perllib/FixMyStreet/Cobrand/UK.pm:82
msgid "That postcode was not recognised, sorry."
msgstr "Ni chafodd y cod post hwnnw ei gydnabod, sori."
-#: perllib/FixMyStreet/App/Controller/Admin.pm:605
+#: perllib/FixMyStreet/App/Controller/Admin.pm:616
#, fuzzy
msgid "That empty property will now be resent."
msgstr "ni fydd eich eiddo gwag yn cael ei bostio"
-#: perllib/FixMyStreet/App/Controller/Report.pm:75
+#: perllib/FixMyStreet/App/Controller/Report.pm:98
+#, fuzzy
+msgid "That report cannot be viewed on reportemptyhomes.com."
+msgstr "Mae'r adroddiad hwnnw wedi cael ei dynnu oddi ar reportemptyhomes.com"
+
+#: perllib/FixMyStreet/App/Controller/Report.pm:92
msgid "That report has been removed from reportemptyhomes.com."
msgstr "Mae'r adroddiad hwnnw wedi cael ei dynnu oddi ar reportemptyhomes.com"
@@ -3274,11 +3359,9 @@ msgstr ""
#: templates/web/fixmystreet/report/new/fill_in_details_text.html:1
#: templates/web/fixmystreet/report/new/fill_in_details_text.html:3
msgid ""
-"The council won&rsquo;t be able to help unless you leave as much\n"
-"detail as you can. Please describe the exact location of the empty property "
-"(e.g. on a\n"
-"wall), what it is, how long it has been there, a description (and a photo "
-"of\n"
+"The council won&rsquo;t be able to help unless you leave as much detail as "
+"you can. Please describe the exact location of the empty property (e.g. on a "
+"wall), what it is, how long it has been there, a description (and a photo of "
"the empty property if you have one), etc."
msgstr ""
@@ -3295,8 +3378,8 @@ msgid ""
msgstr "Mae manylion eich eiddo gwag ar gael ar ochr dde'r dudalen hon."
#: perllib/FixMyStreet/App/Controller/Dashboard.pm:60
-#: perllib/FixMyStreet/App/Controller/Reports.pm:44
-#: perllib/FixMyStreet/App/Controller/Reports.pm:75
+#: perllib/FixMyStreet/App/Controller/Reports.pm:43
+#: perllib/FixMyStreet/App/Controller/Reports.pm:74
#, fuzzy
msgid "The error was: %s"
msgstr "Testun y gwall oedd:"
@@ -3308,7 +3391,7 @@ msgid ""
"requested_datetime, updated_datetime, service_code and service_name."
msgstr ""
-#: perllib/FixMyStreet/Geocode/OSM.pm:158
+#: perllib/FixMyStreet/Geocode/OSM.pm:165
msgid ""
"The following information about the nearest road might be inaccurate or "
"irrelevant, if the empty property is close to several roads or close to a "
@@ -3405,12 +3488,13 @@ msgstr "Yr hysbysiad symlaf yw ein hysbysiad daearyddol:"
#: templates/web/default/report/new/councils_text_some.html:11
#: templates/web/default/report/new/fill_in_details_form.html:17
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:12
+#: templates/web/zurich/report/new/fill_in_details_form.html:12
msgid ""
"The subject and details of the empty property will be public, plus your name "
"if you give us permission."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:269
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:271
msgid ""
"The user could not locate the empty property on a map, but to see the area "
"around the location they entered"
@@ -3418,7 +3502,7 @@ msgstr ""
"Ni allai'r defnyddiwr leoli'r eiddo gwag ar fap, ond i weld yr ardal o "
"gwmpas y lleoliad a gofnodwyd ganddynt "
-#: perllib/FixMyStreet/App/Controller/Reports.pm:72
+#: perllib/FixMyStreet/App/Controller/Reports.pm:71
msgid ""
"There was an empty property showing the All Reports page. Please try again "
"later."
@@ -3429,8 +3513,8 @@ msgstr ""
msgid "There was an empty property showing this page. Please try again later."
msgstr "Cafwyd anhawsterau gyda'ch diweddariad. Gweler isod"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:733
-#: perllib/FixMyStreet/App/Controller/Report/Update.pm:130
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:736
+#: perllib/FixMyStreet/App/Controller/Report/Update.pm:134
#: templates/web/default/auth/general.html:23
#: templates/web/fixmystreet/auth/general.html:24
msgid ""
@@ -3445,7 +3529,7 @@ msgid ""
"again."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/Update.pm:252
+#: perllib/FixMyStreet/App/Controller/Report/Update.pm:256
#, fuzzy
msgid "There was an empty property with your update. Please try again."
msgstr "Cafwyd anhawsterau gyda'ch diweddariad. Gweler isod"
@@ -3454,7 +3538,7 @@ msgstr "Cafwyd anhawsterau gyda'ch diweddariad. Gweler isod"
msgid "There were problems with your report. Please see below."
msgstr "Cafwyd anhawsterau gyda'ch adroddiad. Gweler isod."
-#: perllib/FixMyStreet/App/Controller/Report/Update.pm:279
+#: perllib/FixMyStreet/App/Controller/Report/Update.pm:283
msgid "There were problems with your update. Please see below."
msgstr "Cafwyd anhawsterau gyda'ch diweddariad. Gweler isod"
@@ -3464,7 +3548,7 @@ msgid ""
"change without warnings in the future."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:339
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:341
msgid ""
"This email has been sent to both councils covering the location of the empty "
"property, as the user did not categorise it; please ignore it if you're not "
@@ -3472,15 +3556,15 @@ msgid ""
"empty property this is so we can add it to our system."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:342
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:344
msgid ""
"This email has been sent to several councils covering the location of the "
"empty property, as the category selected is provided for all of them; please "
"ignore it if you're not the correct council to deal with the issue."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:865
-#: perllib/FixMyStreet/Cobrand/UK.pm:62
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:868
+#: perllib/FixMyStreet/Cobrand/UK.pm:54
msgid "This information is required"
msgstr ""
@@ -3491,14 +3575,23 @@ msgid ""
"will be periodically deleted."
msgstr "Safle datblygwr yw hwn; gallai pethau dorri unrhyw bryd."
-#: templates/web/emptyhomes/reports/council.html:58
+#: templates/web/emptyhomes/reports/body.html:58
msgid "This is a summary of all reports for one %s."
msgstr "Dyma grynodeb o'r holl adroddiadau ar gyfer y %s."
-#: templates/web/emptyhomes/reports/council.html:60
+#: templates/web/emptyhomes/reports/body.html:60
msgid "This is a summary of all reports for this %s."
msgstr ""
+#: templates/web/fixmybarangay/reports/index.html:7
+#, fuzzy
+msgid ""
+"This is a summary of all reports on this site; select a particular barangay "
+"to see the reports sent there."
+msgstr ""
+"Dyma grynodeb o'r holl adroddiadau ar y safle hwn; dewiswch gyngor penodol i "
+"weld yr adroddiadau a anfonwyd ato."
+
#: templates/web/default/reports/index.html:7
#: templates/web/emptyhomes/reports/index.html:4
#: templates/web/fiksgatami/nn/reports/index.html:4
@@ -3517,15 +3610,15 @@ msgstr "Mae'r eiddo gwag hwn wedi cael ei adfer i'w ddefnyddio"
#: templates/web/bromley/report/display.html:96
#: templates/web/default/report/banner.html:12
-#: templates/web/default/report/display.html:95
+#: templates/web/default/report/update-form.html:46
#: templates/web/emptyhomes/report/display.html:12
-#: templates/web/fixmystreet/report/display.html:90
+#: templates/web/fixmystreet/report/update-form.html:44
msgid "This empty property has been returned to use"
msgstr "Mae'r eiddo gwag hwn wedi cael ei adfer i'w ddefnyddio"
#: templates/web/bromley/report/display.html:90
-#: templates/web/default/report/display.html:90
-#: templates/web/fixmystreet/report/display.html:84
+#: templates/web/default/report/update-form.html:41
+#: templates/web/fixmystreet/report/update-form.html:38
#, fuzzy
msgid "This empty property has not been returned to use"
msgstr "Mae'r eiddo gwag hwn wedi cael ei adfer i'w ddefnyddio"
@@ -3539,21 +3632,21 @@ msgstr "Mae'r eiddo gwag hwn wedi cael ei adfer i'w ddefnyddio"
msgid "This empty property is old and of unknown status."
msgstr "Mae'r eiddo gwag hwn yn hen ac nid yw ei statws yn hysbys."
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:83
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:86
#, fuzzy
msgid "This report is currently marked as closed."
msgstr "Mae'r eiddo gwag hwn wedi cael ei adfer i'w ddefnyddio"
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:81
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:84
#, fuzzy
msgid "This report is currently marked as returned to use."
msgstr "Mae'r eiddo gwag hwn wedi cael ei adfer i'w ddefnyddio"
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:85
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:88
msgid "This report is currently marked as open."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:262
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:264
msgid ""
"This web page also contains a photo of the empty property, provided by the "
"user."
@@ -3561,7 +3654,7 @@ msgstr ""
"Mae'r dudalen we hon hefyd yn cynnwys ffotograff o'r eiddo gwag, wedi'i "
"ddarparu gan y defnyddiwr."
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1024
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1034
#: templates/web/default/admin/timeline.html:1
msgid "Timeline"
msgstr ""
@@ -3571,7 +3664,7 @@ msgstr ""
msgid "Title"
msgstr ""
-#: templates/web/default/around/display_location.html:69
+#: templates/web/default/around/_report_banner.html:2
#, fuzzy
msgid ""
"To <strong>report an empty property</strong>, click on the map at the "
@@ -3599,7 +3692,7 @@ msgstr ""
"ward chi,\n"
"cofnodwch eich cod post Prydeinig neu enw stryd ac ardal:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:268
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:270
msgid "To view a map of the precise location of this issue"
msgstr "Gweld map o union leoliad y broblem hon"
@@ -3610,7 +3703,7 @@ msgstr "Gweld map o union leoliad y broblem hon"
msgid "Total"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Reports.pm:43
+#: perllib/FixMyStreet/App/Controller/Reports.pm:42
msgid "Unable to look up areas in MaPit. Please try again later."
msgstr ""
@@ -3624,17 +3717,17 @@ msgstr ""
msgid "Unknown"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Rss.pm:164
+#: perllib/FixMyStreet/App/Controller/Rss.pm:173
#, fuzzy
msgid "Unknown alert type"
msgstr "ID eiddo gwag anhysbys"
-#: perllib/FixMyStreet/App/Controller/Report.pm:70
+#: perllib/FixMyStreet/App/Controller/Report.pm:87
msgid "Unknown empty property ID"
msgstr "ID eiddo gwag anhysbys"
#: templates/web/bromley/report/display.html:66
-#: templates/web/fixmystreet/report/display.html:65
+#: templates/web/fixmystreet/report/update-form.html:19
#, fuzzy
msgid "Update"
msgstr "Diweddariad:"
@@ -3682,18 +3775,18 @@ msgstr ""
msgid "Update reopened empty property"
msgstr "Sut i roi gwybod am eiddo gwag"
-#: templates/web/default/admin/council_contacts.html:62
+#: templates/web/default/admin/council_contacts.html:68
#, fuzzy
msgid "Update statuses"
msgstr "Diweddariadau"
-#: templates/web/default/report/display.html:71
+#: templates/web/default/report/update-form.html:22
msgid "Update:"
msgstr "Diweddariad:"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:694
-#: perllib/FixMyStreet/App/Controller/Admin.pm:809
-#: perllib/FixMyStreet/App/Controller/Admin.pm:889
+#: perllib/FixMyStreet/App/Controller/Admin.pm:708
+#: perllib/FixMyStreet/App/Controller/Admin.pm:839
+#: perllib/FixMyStreet/App/Controller/Admin.pm:899
#, fuzzy
msgid "Updated!"
msgstr "Diweddariadau"
@@ -3717,20 +3810,21 @@ msgstr "Diweddariadau am {{title}}"
msgid "Updates to this empty property, reportemptyhomes.com"
msgstr "Diweddariadau i'r eiddo gwag hwn, reportemptyhomes.com"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1182
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1191
msgid "User flag removed"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1154
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1163
msgid "User flagged"
msgstr ""
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1036
#: templates/web/default/admin/list_flagged.html:30
msgid "Users"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:309
-#: perllib/FixMyStreet/App/Controller/Admin.pm:339
+#: perllib/FixMyStreet/App/Controller/Admin.pm:315
+#: perllib/FixMyStreet/App/Controller/Admin.pm:345
#, fuzzy
msgid "Values updated"
msgstr "Anfonwch ddiweddariadau ataf i drwy'r e-bost"
@@ -3741,7 +3835,7 @@ msgstr "Anfonwch ddiweddariadau ataf i drwy'r e-bost"
msgid "View report on site"
msgstr "Adroddiadau"
-#: templates/web/default/reports/council.html:18
+#: templates/web/default/reports/body.html:18
#, fuzzy
msgid "View reports by ward"
msgstr "Adroddiadau"
@@ -3754,20 +3848,19 @@ msgstr "Gweld eich adroddiad"
#: templates/web/default/around/display_location.html:33
#: templates/web/emptyhomes/around/display_location.html:0
#: templates/web/emptyhomes/around/display_location.html:16
-#: templates/web/fixmystreet/around/display_location.html:0
-#: templates/web/fixmystreet/around/display_location.html:33
msgid "Viewing a location"
msgstr "Gweld lleoliad"
#: templates/web/bromley/report/display.html:0
#: templates/web/default/report/display.html:0
+#: templates/web/emptyhomes/report/display.html:1
#: templates/web/emptyhomes/report/display.html:2
#: templates/web/fixmystreet/report/display.html:0
msgid "Viewing an empty property"
msgstr "Gweld eiddo gwag"
-#: templates/web/default/reports/council.html:20
-#: templates/web/emptyhomes/reports/council.html:18
+#: templates/web/default/reports/body.html:20
+#: templates/web/emptyhomes/reports/body.html:18
msgid "Wards of this council"
msgstr ""
@@ -3794,28 +3887,29 @@ msgid ""
msgstr ""
#: templates/web/bromley/report/display.html:141
-#: templates/web/fixmystreet/report/display.html:153
+#: templates/web/fixmystreet/report/update-form.html:113
#, fuzzy
msgid "We never show your email"
msgstr "(nid ydym byth yn dangos eich cyfeiriad e-bost na'ch rhif ffôn)"
#: templates/web/bromley/report/new/fill_in_details_form.html:133
#: templates/web/bromley/report/new/fill_in_details_form.html:179
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:130
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:190
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:144
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:211
+#: templates/web/zurich/report/new/fill_in_details_form.html:114
#, fuzzy
msgid "We never show your email address or phone number."
msgstr "(nid ydym byth yn dangos eich cyfeiriad e-bost na'ch rhif ffôn)"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:349
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:351
msgid ""
"We realise this empty property might be the responsibility of %s; however, "
"we don't currently have any contact details for them. If you know of an "
"appropriate contact address, please do get in touch."
msgstr ""
-#: templates/web/default/index.html:34 templates/web/emptyhomes/index.html:59
-#: templates/web/fixmystreet/index.html:45
+#: templates/web/default/index-steps.html:16
+#: templates/web/emptyhomes/index.html:59
msgid ""
"The details will be sent directly to the right person in the local council "
"for them to take action"
@@ -3825,6 +3919,7 @@ msgstr ""
#: templates/web/bromley/report/new/fill_in_details_form.html:217
#: templates/web/default/report/new/notes.html:5
+#: templates/web/fixmybarangay/report/new/notes.html:5
msgid ""
"We will only use your personal information in accordance with our <a href=\"/"
"faq#privacy\">privacy policy.</a>"
@@ -3856,8 +3951,8 @@ msgstr ""
"Byddai'n dda gennym glywed eich barn am y wefan hon. Llenwch y ffurflen, neu "
"anfonwch neges e-bost at <a href='mailto:%s'>%s</a>:"
-#: templates/web/default/admin/council_contacts.html:41
-#: templates/web/default/admin/council_edit.html:41
+#: templates/web/default/admin/council_contacts.html:45
+#: templates/web/default/admin/council_edit.html:69
msgid "When edited"
msgstr ""
@@ -3866,7 +3961,7 @@ msgstr ""
msgid "When sent"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:612
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:611
msgid "Whole block of empty flats"
msgstr "Bloc cyfan o fflatiau gwag"
@@ -3878,6 +3973,7 @@ msgid ""
msgstr ""
#: templates/web/fixmystreet/footer.html:22
+#: templates/web/stevenage/footer.html:22
msgid ""
"Would you like better integration with reportemptyhomes.com? <a href="
"\"http://www.mysociety.org/for-councils/fixmystreet/\">Find out about "
@@ -3885,6 +3981,7 @@ msgid ""
msgstr ""
#: templates/web/fixmystreet/footer.html:18
+#: templates/web/stevenage/footer.html:18
msgid ""
"Would you like to contribute to reportemptyhomes.com? Our code is open "
"source and <a href=\"http://github.com/mysociety/fixmystreet\">available on "
@@ -3899,6 +3996,7 @@ msgid ""
msgstr ""
#: templates/web/default/report/new/notes.html:8
+#: templates/web/fixmybarangay/report/new/notes.html:8
#: templates/web/fixmystreet/report/new/notes.html:7
msgid ""
"Writing your message entirely in block capitals makes it hard to read, as "
@@ -3909,8 +4007,9 @@ msgstr ""
msgid "Year"
msgstr ""
-#: templates/web/default/admin/council_contacts.html:48
-#: templates/web/default/admin/council_contacts.html:49
+#: templates/web/default/admin/council_contacts.html:52
+#: templates/web/default/admin/council_contacts.html:53
+#: templates/web/default/admin/council_contacts.html:54
#: templates/web/default/admin/council_edit.html:5
#: templates/web/default/admin/list_updates.html:30
#: templates/web/default/admin/list_updates.html:31
@@ -3930,8 +4029,8 @@ msgstr "Ydw"
#: templates/web/bromley/report/display.html:155
#: templates/web/bromley/report/new/fill_in_details_form.html:198
-#: templates/web/fixmystreet/report/display.html:133
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:156
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:171
+#: templates/web/fixmystreet/report/update-form.html:87
#, fuzzy
msgid "Yes I have a password"
msgstr "Adrodd am eiddo gwag a gweld y rhain"
@@ -3952,7 +4051,7 @@ msgid ""
"personal information, or similar:"
msgstr ""
-#: templates/web/emptyhomes/reports/council.html:64
+#: templates/web/emptyhomes/reports/body.html:64
#, fuzzy
msgid ""
"You can <a href=\"%s\">view all reports for the council</a> or <a href=\"/"
@@ -3961,7 +4060,7 @@ msgstr ""
"Gallwch <a href=\"%s\">weld llai o fanylion</a> neu fynd yn ôl a <a href=\"/"
"reports\">dangos pob cyngor</a>."
-#: templates/web/emptyhomes/reports/council.html:66
+#: templates/web/emptyhomes/reports/body.html:66
#, fuzzy
msgid "You can <a href=\"/reports\">show all councils</a>."
msgstr "Gallwch <a href=\"%s\">weld mwy o fanylion</a>."
@@ -3989,27 +4088,30 @@ msgstr ""
#: templates/web/default/questionnaire/index.html:92
#: templates/web/default/report/new/fill_in_details_form.html:93
#: templates/web/fixmystreet/questionnaire/index.html:87
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:101
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:99
+#: templates/web/zurich/report/new/fill_in_details_form.html:93
msgid ""
"You have already attached a photo to this report, attaching another one will "
"replace it."
msgstr ""
#: templates/web/bromley/report/display.html:106
-#: templates/web/default/report/display.html:106
-#: templates/web/fixmystreet/report/display.html:100
+#: templates/web/default/report/update-form.html:57
+#: templates/web/fixmystreet/report/update-form.html:54
msgid ""
"You have already attached a photo to this update, attaching another one will "
"replace it."
msgstr ""
#: templates/web/default/auth/sign_out.html:3
+#: templates/web/fixmybarangay/auth/sign_out.html:3
msgid "You have been signed out"
msgstr ""
#: templates/web/bromley/report/new/fill_in_details_form.html:25
#: templates/web/default/report/new/fill_in_details_form.html:7
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:27
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:28
+#: templates/web/zurich/report/new/fill_in_details_form.html:28
#, fuzzy
msgid ""
"You have located the empty property at the point marked with a green pin on "
@@ -4046,8 +4148,8 @@ msgstr "Rydych wedi dileu'ch hysbysiad yn llwyddiannus."
msgid "You have successfully deleted your alert."
msgstr "Rydych wedi dileu'ch hysbysiad yn llwyddiannus."
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:740
-#: perllib/FixMyStreet/App/Controller/Report/Update.pm:136
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:743
+#: perllib/FixMyStreet/App/Controller/Report/Update.pm:140
#, fuzzy
msgid ""
"You have successfully signed in; please check and confirm your details are "
@@ -4079,16 +4181,18 @@ msgstr "Adroddiadau"
#: templates/web/fixmystreet/alert/updates.html:19
#: templates/web/fixmystreet/alert/updates.html:22
#: templates/web/fixmystreet/contact/index.html:72
-#: templates/web/fixmystreet/report/display.html:34
-#: templates/web/fixmystreet/report/display.html:36
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:142
+#: templates/web/fixmystreet/report/display.html:53
+#: templates/web/fixmystreet/report/display.html:55
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:115
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:157
+#: templates/web/zurich/report/new/fill_in_details_form.html:106
#, fuzzy
msgid "Your email"
msgstr "Eich cyfeiriad e-bost:"
#: templates/web/bromley/report/display.html:130
#: templates/web/fixmystreet/auth/general.html:26
-#: templates/web/fixmystreet/report/display.html:124
+#: templates/web/fixmystreet/report/update-form.html:78
#, fuzzy
msgid "Your email address"
msgstr "Eich cyfeiriad e-bost:"
@@ -4099,8 +4203,9 @@ msgid "Your email address:"
msgstr "Eich cyfeiriad e-bost:"
#: templates/web/default/alert/_list.html:92
-#: templates/web/default/report/display.html:128
#: templates/web/default/report/new/fill_in_details_form.html:124
+#: templates/web/default/report/update-form.html:79
+#: templates/web/fixmybarangay/alert/_list.html:37
msgid "Your email:"
msgstr "Eich cyfeiriad e-bost:"
@@ -4124,27 +4229,28 @@ msgstr ""
msgid "Your last name"
msgstr "Eich enw:"
-#: templates/web/fixmystreet/auth/general.html:53
+#: templates/web/fixmystreet/auth/general.html:57
#: templates/web/fixmystreet/contact/index.html:65
-#: templates/web/fixmystreet/report/display.html:181
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:121
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:181
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:124
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:202
+#: templates/web/fixmystreet/report/update-form.html:138
+#: templates/web/zurich/report/new/fill_in_details_form.html:122
#, fuzzy
msgid "Your name"
msgstr "Eich enw:"
#: templates/web/default/auth/general.html:59
#: templates/web/default/contact/index.html:68
-#: templates/web/default/report/display.html:202
#: templates/web/default/report/new/fill_in_details_form.html:203
+#: templates/web/default/report/update-form.html:149
msgid "Your name:"
msgstr "Eich enw:"
#: templates/web/bromley/report/display.html:160
#: templates/web/bromley/report/new/fill_in_details_form.html:203
-#: templates/web/fixmystreet/auth/general.html:37
-#: templates/web/fixmystreet/report/display.html:138
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:161
+#: templates/web/fixmystreet/auth/general.html:41
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:176
+#: templates/web/fixmystreet/report/update-form.html:92
#, fuzzy
msgid "Your password"
msgstr "Adroddiadau"
@@ -4155,8 +4261,9 @@ msgstr ""
#: templates/web/bromley/report/new/fill_in_details_form.html:137
#: templates/web/bromley/report/new/fill_in_details_form.html:184
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:134
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:195
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:149
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:216
+#: templates/web/zurich/report/new/fill_in_details_form.html:125
msgid "Your phone number"
msgstr ""
@@ -4170,12 +4277,12 @@ msgstr "Adroddiadau"
#: templates/web/fiksgatami/footer.html:6
#: templates/web/fiksgatami/nn/footer.html:6
#: templates/web/fixmystreet/footer.html:47
-#: templates/web/reading/footer.html:7
+#: templates/web/reading/footer.html:7 templates/web/stevenage/footer.html:41
#, fuzzy
msgid "Your reports"
msgstr "Adroddiadau"
-#: templates/web/default/my/my.html:45 templates/web/fixmystreet/my/my.html:45
+#: templates/web/default/my/my.html:45 templates/web/fixmystreet/my/my.html:49
#, fuzzy
msgid "Your updates"
msgstr "Adroddiadau"
@@ -4188,19 +4295,23 @@ msgstr "Eich&nbsp;cyfeiriad e-bost:"
msgid "by %s"
msgstr ""
-#: templates/web/default/reports/council.html:12
-#: templates/web/default/reports/council.html:13
-#: templates/web/emptyhomes/reports/council.html:6
-#: templates/web/emptyhomes/reports/council.html:7
+#: templates/web/default/reports/body.html:12
+#: templates/web/default/reports/body.html:13
+#: templates/web/emptyhomes/reports/body.html:6
+#: templates/web/emptyhomes/reports/body.html:7
msgid "council"
msgstr "cyngor"
+#: perllib/FixMyStreet/DB/Result/Problem.pm:608
+msgid "council ref:&nbsp;%s"
+msgstr ""
+
#: templates/web/default/admin/report_edit.html:15
msgid "didn't use map"
msgstr ""
#: templates/web/default/alert/index.html:33
-#: templates/web/fixmystreet/around/postcode_form.html:17
+#: templates/web/fixmystreet/around/postcode_form.html:20
msgid "e.g. ‘%s’ or ‘%s’"
msgstr ""
@@ -4208,7 +4319,7 @@ msgstr ""
msgid "from %d different users"
msgstr ""
-#: perllib/Utils.pm:289
+#: perllib/Utils.pm:267
msgid "less than a minute"
msgstr "llai na munud"
@@ -4220,17 +4331,22 @@ msgstr ""
msgid "marked as returned to use"
msgstr "cofnodwyd bod hyn wedi'i adfer i'w ddefnyddio"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:112
+#: perllib/FixMyStreet/App/Controller/Admin.pm:113
#: templates/web/default/admin/questionnaire.html:15
#: templates/web/default/admin/questionnaire.html:16
msgid "n/a"
msgstr ""
#: templates/web/default/alert/_list.html:87
+#: templates/web/fixmybarangay/alert/_list.html:32
#: templates/web/fixmystreet/alert/_list.html:85
msgid "or"
msgstr "neu"
+#: templates/web/default/js/validation_strings.html:21
+msgid "or locate me automatically"
+msgstr ""
+
#: templates/web/default/admin/report_edit.html:15
msgid "originally entered"
msgstr ""
@@ -4245,9 +4361,9 @@ msgstr "wedi'i ailagor"
#: templates/web/barnet/header.html:71 templates/web/bromley/header.html:100
#: templates/web/bromley/header.html:65
-#: templates/web/fixmybarangay/header.html.orig:43
-#: templates/web/fixmystreet/header.html:48
-#: templates/web/zurich/header.html:48
+#: templates/web/fixmybarangay/header.html:65
+#: templates/web/fixmystreet/header.html:50
+#: templates/web/stevenage/header.html:98 templates/web/zurich/header.html:48
msgid "sign out"
msgstr ""
@@ -4257,25 +4373,22 @@ msgstr ""
#: templates/web/default/report/new/fill_in_details_form.html:14
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:6
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:9
+#: templates/web/zurich/report/new/fill_in_details_form.html:6
+#: templates/web/zurich/report/new/fill_in_details_form.html:9
#, fuzzy
msgid "the local council"
msgstr "Ni roddwyd gwybod i'r cyngor am hyn"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:541
-msgid "the map was not used so pin location may be inaccurate"
+#: templates/web/default/report/_main.html:6
+msgid "there is no pin shown as the user did not use the map"
msgstr ""
-"ni ddefnyddiwyd y map felly mae'n bosibl na fydd lleoliad y pin yn gywir"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:603
-msgid "their ref:&nbsp;%s"
-msgstr ""
-
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:330
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:332
#, fuzzy
msgid "this type of local empty property"
msgstr "Anfonwch fanylion eiddo gwag lleol newydd ataf i drwy'r e-bost"
-#: perllib/Utils.pm:263
+#: perllib/Utils.pm:241
msgid "today"
msgstr "heddiw"
@@ -4292,10 +4405,10 @@ msgstr ""
msgid "user is empty property owner"
msgstr "Adroddiadau hŷn o eiddo gwag"
-#: templates/web/default/reports/council.html:0
-#: templates/web/default/reports/council.html:9
-#: templates/web/emptyhomes/reports/council.html:0
-#: templates/web/emptyhomes/reports/council.html:3
+#: templates/web/default/reports/body.html:0
+#: templates/web/default/reports/body.html:9
+#: templates/web/emptyhomes/reports/body.html:0
+#: templates/web/emptyhomes/reports/body.html:3
msgid "ward"
msgstr ""
@@ -4332,6 +4445,34 @@ msgstr "ni fydd eich eiddo gwag yn cael ei bostio"
msgid "your update will not be posted"
msgstr "ni fydd eich diweddariad yn cael ei bostio"
+#: templates/web/emptyhomes/front/stats.html:17
+#, perl-format
+msgid "<big>%s</big> report recently"
+msgid_plural "<big>%s</big> reports recently"
+msgstr[0] "<big>%s</big> adroddiad yn ddiweddar"
+msgstr[1] "<big>%s</big> o adroddiadau yn ddiweddar"
+
+#: perllib/Utils.pm:286
+#, fuzzy, perl-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "awr"
+msgstr[1] "awr"
+
+#: perllib/Utils.pm:288
+#, fuzzy, perl-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "munud"
+msgstr[1] "munud"
+
+#: templates/web/default/front/stats.html:29
+#, perl-format
+msgid "<big>%s</big> update on reports"
+msgid_plural "<big>%s</big> updates on reports"
+msgstr[0] "<big>%s</big> diweddariad ar adroddiadau"
+msgstr[1] "<big>%s</big> diweddariad ar adroddiadau"
+
#: templates/web/emptyhomes/report/new/councils_text_none.html:3
#, perl-format
msgid "We do not yet have details for the council that covers this location."
@@ -4340,12 +4481,12 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: templates/web/emptyhomes/front/stats.html:17
-#, perl-format
-msgid "<big>%s</big> report recently"
-msgid_plural "<big>%s</big> reports recently"
-msgstr[0] "<big>%s</big> adroddiad yn ddiweddar"
-msgstr[1] "<big>%s</big> o adroddiadau yn ddiweddar"
+#: perllib/Utils.pm:282
+#, fuzzy, perl-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] "wythnos"
+msgstr[1] "wythnos"
#: templates/web/emptyhomes/front/stats.html:12
#, perl-format
@@ -4372,12 +4513,40 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: templates/web/default/front/stats.html:29
-#, perl-format
-msgid "<big>%s</big> update on reports"
-msgid_plural "<big>%s</big> updates on reports"
-msgstr[0] "<big>%s</big> diweddariad ar adroddiadau"
-msgstr[1] "<big>%s</big> diweddariad ar adroddiadau"
+#: perllib/Utils.pm:284
+#, fuzzy, perl-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] "diwrnod"
+msgstr[1] "diwrnod"
+
+#, fuzzy
+#~ msgid "reportemptyhomes.com administration"
+#~ msgstr "Diweddariadau i reportemptyhomes.com"
+
+#, fuzzy
+#~ msgid "Search Abuse"
+#~ msgstr "Adroddiadau cryno"
+
+#, fuzzy
+#~ msgid "%d days"
+#~ msgstr "diwrnod"
+
+#, fuzzy
+#~ msgid "%d hours"
+#~ msgstr "awr"
+
+#, fuzzy
+#~ msgid "%d minutes"
+#~ msgstr "munud"
+
+#, fuzzy
+#~ msgid "%d weeks"
+#~ msgstr "wythnos"
+
+#~ msgid "the map was not used so pin location may be inaccurate"
+#~ msgstr ""
+#~ "ni ddefnyddiwyd y map felly mae'n bosibl na fydd lleoliad y pin yn gywir"
#, fuzzy
#~ msgid "reportemptyhomes.com for Councils"
diff --git a/locale/de_DE.UTF-8/LC_MESSAGES/FixMyStreet.po b/locale/de_CH.UTF-8/LC_MESSAGES/FixMyStreet.po
index dd68c3694..024e86f26 100644
--- a/locale/de_DE.UTF-8/LC_MESSAGES/FixMyStreet.po
+++ b/locale/de_CH.UTF-8/LC_MESSAGES/FixMyStreet.po
@@ -1,23 +1,23 @@
# Copyright (C) 2011 UK Citizens Online Democracy
# This file is distributed under the same license as the main FixMyStreet code.
-# Matthew Somerville &lt;matthew@mysociety.org&gt;, 2011-06-03.
+# Matthew Somerville <matthew@mysociety.org>, 2011-06-03.
#
msgid ""
msgstr ""
"Project-Id-Version: 1.0\n"
"Report-Msgid-Bugs-To: matthew@mysociety.org\n"
-"POT-Creation-Date: 2012-08-21 09:54+0100\n"
-"PO-Revision-Date: 2012-08-21 09:08+0100\n"
-"Last-Translator: FULL NAME &lt;EMAIL@ADDRESS&gt;\n"
-"Language-Team: LANGUAGE &lt;team@fixmystreet.com&gt;\n"
+"POT-Creation-Date: 2012-12-10 13:18+0000\n"
+"PO-Revision-Date: 2012-11-20 17:17+0100\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <team@fixmystreet.com>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:555
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:337
+#: perllib/FixMyStreet/DB/Result/Problem.pm:560
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:339
msgid " and "
msgstr "und"
@@ -50,86 +50,55 @@ msgstr ""
msgid "%d council contacts &ndash; %d confirmed, %d unconfirmed"
msgstr ""
-#: perllib/Utils.pm:293
-msgid "%d day"
-msgstr "%d Tag"
-
-#: perllib/Utils.pm:293
-msgid "%d days"
-msgstr "%d Tage"
-
#: templates/web/default/admin/council_list.html:27
msgid "%d edits by %s"
msgstr ""
-#: perllib/Utils.pm:294
-msgid "%d hour"
-msgstr "%d Stunde"
-
-#: perllib/Utils.pm:294
-msgid "%d hours"
-msgstr "%d Stunden"
-
#: templates/web/default/admin/index.html:16
msgid "%d live updates"
msgstr ""
-#: perllib/Utils.pm:295
-msgid "%d minute"
-msgstr "%d Minute"
-
-#: perllib/Utils.pm:295
-msgid "%d minutes"
-msgstr "%d Minuten"
-
#: templates/web/default/admin/index.html:18
msgid "%d questionnaires sent &ndash; %d answered (%s%%)"
msgstr ""
-#: perllib/Utils.pm:292
-msgid "%d week"
-msgstr "%d Woche"
-
-#: perllib/Utils.pm:292
-msgid "%d weeks"
-msgstr "%d Wochen"
+#: templates/web/default/report/_support.html:3
+msgid "%d supporters"
+msgstr ""
-#: templates/web/default/reports/council.html:0
-#: templates/web/default/reports/council.html:26
-#: templates/web/emptyhomes/reports/council.html:11
-#: templates/web/emptyhomes/reports/council.html:13
+#: templates/web/default/reports/body.html:0
+#: templates/web/default/reports/body.html:26
+#: templates/web/emptyhomes/reports/body.html:11
+#: templates/web/emptyhomes/reports/body.html:13
msgid "%s - Summary reports"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:605
+#: perllib/FixMyStreet/DB/Result/Problem.pm:610
msgid "%s ref:&nbsp;%s"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/UK.pm:288 perllib/FixMyStreet/Cobrand/UK.pm:300
+#: perllib/FixMyStreet/Cobrand/UK.pm:279 perllib/FixMyStreet/Cobrand/UK.pm:291
msgid "%s ward, %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:488
+#: perllib/FixMyStreet/DB/Result/Problem.pm:496
msgid "%s, reported anonymously at %s"
-msgstr "%s anonym gemeldet um %s"
+msgstr "%s, gemeldet um %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:490
+#: perllib/FixMyStreet/DB/Result/Problem.pm:498
msgid "%s, reported by %s at %s"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/UK.pm:315 perllib/FixMyStreet/Cobrand/UK.pm:327
+#: perllib/FixMyStreet/Cobrand/UK.pm:306 perllib/FixMyStreet/Cobrand/UK.pm:318
msgid "%s, within %s ward"
msgstr ""
-#: templates/web/default/admin/stats.html:5
-msgid "%sreports between %s and %s"
-msgstr ""
-
#: templates/web/default/email_sent.html:28
msgid "(Don't worry &mdash; %s)"
msgstr ""
#: templates/web/default/admin/report_blocks.html:11
+#: templates/web/default/admin/search_users.html:23
msgid "(Email in abuse table)"
msgstr ""
@@ -157,7 +126,7 @@ msgid "(fixed)"
msgstr "(gel&ouml;st)"
#: templates/web/default/index.html:12 templates/web/default/index.html:8
-#: templates/web/fixmystreet/around/postcode_form.html:7
+#: templates/web/fixmystreet/around/intro.html:2
msgid "(like graffiti, fly tipping, broken paving slabs, or street lighting)"
msgstr "(z.B. illegale Deponien, Strassensch&auml;den, Graffitis usw.)"
@@ -167,6 +136,7 @@ msgid "(not sent to council)"
msgstr ""
#: templates/web/default/report/new/fill_in_details_form.html:217
+#: templates/web/zurich/report/new/fill_in_details_form.html:118
msgid "(optional)"
msgstr "(optional)"
@@ -177,31 +147,38 @@ msgstr ""
#: templates/web/default/report/new/fill_in_details_form.html:211
msgid "(we never show your email address or phone number)"
-msgstr "(ihre eMail-Adresse oder Telefonnummer werden nie angezeigt)"
+msgstr "(ihre E-Mail Adresse und Telefonnummer werden nie angezeigt)"
-#: templates/web/default/report/display.html:209
+#: templates/web/default/report/update-form.html:156
msgid "(we never show your email)"
-msgstr "(ihre eMail-Adresse wird nie angezeigt)"
+msgstr "(ihre E-Mail Adresse wird nie angezeigt)"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:284
+#: perllib/FixMyStreet/App/Controller/Admin.pm:285
msgid "*unknown*"
msgstr "*unbekannt*"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:629
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:655
-#: perllib/FixMyStreet/DB/Result/Problem.pm:345
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:628
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:656
+#: perllib/FixMyStreet/DB/Result/Problem.pm:353
msgid "-- Pick a category --"
msgstr "-- W&auml;hlen Sie eine Kategorie --"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:609
-#: perllib/FixMyStreet/DB/Result/Problem.pm:351
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:608
+#: perllib/FixMyStreet/DB/Result/Problem.pm:359
msgid "-- Pick a property type --"
msgstr ""
#: templates/web/default/tokens/confirm_problem.html:14
#: templates/web/default/tokens/confirm_problem.html:22
+#, fuzzy
msgid ". You can <a href=\"%s%s\">view the problem on this site</a>."
msgstr ""
+"Danke &amp;mdash; Sie k&ouml;nnen Ihre aktualisierte Meldung <a href=\"%s"
+"\">auf der Webseite anschauen</a>"
+
+#: templates/web/default/report/_support.html:3
+msgid "1 supporter"
+msgstr ""
#: templates/web/default/questionnaire/completed.html:20
msgid ""
@@ -220,7 +197,7 @@ msgid ""
"</p>"
msgstr ""
-#: templates/web/fixmystreet/questionnaire/completed-open.html:1
+#: templates/web/fixmystreet/questionnaire/completed-open.html:6
msgid ""
"<p style=\"font-size:150%\">We&rsquo;re sorry to hear that. We have two\n"
"suggestions: why not try <a href=\"http://www.writetothem.com/\">writing "
@@ -232,7 +209,7 @@ msgid ""
"</p>"
msgstr ""
-#: templates/web/default/questionnaire/completed-open.html:1
+#: templates/web/default/questionnaire/completed-open.html:6
msgid ""
"<p style=\"font-size:150%\">We&rsquo;re sorry to hear that. We have two\n"
"suggestions: why not try writing to your local representative or, if "
@@ -285,58 +262,52 @@ msgid ""
"site and leave an update.</p>"
msgstr ""
-#: templates/web/default/around/display_location.html:70
-#: templates/web/default/around/display_location.html:72
+#: templates/web/default/around/_report_banner.html:3
+#: templates/web/default/around/_report_banner.html:5
#: templates/web/emptyhomes/around/display_location.html:36
#: templates/web/emptyhomes/around/display_location.html:38
-#, fuzzy
msgid ""
"<small>If you cannot see the map, <a href='%s' rel='nofollow'>skip this "
"step</a>.</small>"
msgstr ""
-"Karte nicht sichtbar? <a href='%s' rel='nofollow'>&Uuml;berspringen "
-"Sie diesen Schritt</a>.</small>"
+"Karte nicht sichtbar? <a href='%s' rel='nofollow'>&Uuml;berspringen</a>.</"
+"small>"
#: templates/web/default/admin/index.html:14
msgid "<strong>%d</strong> live problems"
msgstr ""
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:172
-#, fuzzy
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:193
msgid "<strong>No</strong> Let me confirm my report by email"
-msgstr "Meldung per eMail best&auml;tigen"
+msgstr "Meldung per E-Mail best&auml;tigen"
-#: templates/web/fixmystreet/report/display.html:148
-#, fuzzy
+#: templates/web/fixmystreet/report/update-form.html:108
msgid "<strong>No</strong> Let me confirm my update by email"
-msgstr "Meldung per eMail best&auml;tigen"
+msgstr ""
-#: templates/web/fixmystreet/auth/general.html:46
-#, fuzzy
+#: templates/web/fixmystreet/auth/general.html:50
msgid "<strong>No</strong> let me sign in by email"
-msgstr "Meldung per eMail best&auml;tigen"
+msgstr ""
#: templates/web/default/auth/general.html:55
msgid "<strong>No</strong>, I do not, let me sign in by email:"
msgstr ""
#: templates/web/default/report/new/fill_in_details_form.html:162
-#, fuzzy
msgid "<strong>No</strong>, let me confirm my report by email:"
-msgstr "Meldung per eMail best&auml;tigen"
+msgstr ""
-#: templates/web/default/report/display.html:164
-#, fuzzy
+#: templates/web/default/report/update-form.html:115
msgid "<strong>No</strong>, let me confirm my update by email:"
-msgstr "Meldung per eMail best&auml;tigen"
+msgstr ""
#: templates/web/default/auth/general.html:37
-#: templates/web/default/report/display.html:142
#: templates/web/default/report/new/fill_in_details_form.html:140
-#: templates/web/fixmystreet/auth/general.html:32
-#: templates/web/fixmystreet/auth/general.html:34
-#: templates/web/fixmystreet/report/display.html:131
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:154
+#: templates/web/default/report/update-form.html:93
+#: templates/web/fixmystreet/auth/general.html:36
+#: templates/web/fixmystreet/auth/general.html:38
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:169
+#: templates/web/fixmystreet/report/update-form.html:85
msgid "<strong>Yes</strong> I have a password"
msgstr ""
@@ -348,11 +319,11 @@ msgstr ""
msgid "About us"
msgstr "&Uuml;ber uns"
-#: templates/web/default/admin/council_contacts.html:66
+#: templates/web/default/admin/council_contacts.html:72
msgid "Add new category"
msgstr "F&uuml;ge neue Kategorie hinzu"
-#: templates/web/default/my/my.html:56 templates/web/fixmystreet/my/my.html:56
+#: templates/web/default/my/my.html:56 templates/web/fixmystreet/my/my.html:60
msgid "Added %s"
msgstr ""
@@ -369,16 +340,13 @@ msgid "Alert %d disabled (created %s)"
msgstr ""
#: templates/web/bromley/report/display.html:207
-#: templates/web/default/report/display.html:214
-#: templates/web/fixmystreet/report/display.html:189
+#: templates/web/default/report/update-form.html:161
+#: templates/web/fixmystreet/report/update-form.html:146
msgid "Alert me to future updates"
msgstr ""
-#: templates/web/default/admin/stats.html:5
-msgid "All"
-msgstr "Alle"
-
#: templates/web/default/reports/index.html:3
+#: templates/web/fixmybarangay/reports/index.html:3
msgid "All Reports"
msgstr "Alle Meldungen"
@@ -390,11 +358,18 @@ msgstr "Alle best&auml;tigten"
#: templates/web/bromley/header.html:77 templates/web/default/footer.html:11
#: templates/web/fiksgatami/footer.html:7
#: templates/web/fiksgatami/nn/footer.html:7
+#: templates/web/fixmybarangay/footer.html:20
#: templates/web/fixmystreet/footer.html:49
-#: templates/web/reading/footer.html:8
+#: templates/web/reading/footer.html:8 templates/web/stevenage/footer.html:43
+#: templates/web/zurich/footer.html:12
msgid "All reports"
msgstr "Alle Meldungen"
+#: templates/web/default/admin/stats.html:5
+#, fuzzy
+msgid "All reports between %s and %s"
+msgstr "Gemeldet von %s um %s"
+
#: templates/web/default/report/new/councils_text_some.html:2
msgid "All the information you provide here will be sent to"
msgstr ""
@@ -422,6 +397,8 @@ msgstr ""
#: templates/web/default/report/new/fill_in_details_form.html:13
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:6
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:8
+#: templates/web/zurich/report/new/fill_in_details_form.html:6
+#: templates/web/zurich/report/new/fill_in_details_form.html:8
msgid ""
"All the information you provide here will be sent to <strong>%s</strong>."
msgstr ""
@@ -457,10 +434,12 @@ msgid ""
msgstr ""
#: templates/web/fixmystreet/footer.html:17
+#: templates/web/stevenage/footer.html:17
msgid "Are you a developer?"
msgstr ""
#: templates/web/fixmystreet/footer.html:21
+#: templates/web/stevenage/footer.html:21
msgid "Are you from a council?"
msgstr ""
@@ -479,6 +458,16 @@ msgstr ""
msgid "Ban email address"
msgstr ""
+#: templates/web/fixmybarangay/report/new/notes.html:7
+msgid ""
+"Be sure to choose the right category, because we use that to determine to "
+"whom the report is sent."
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1032
+msgid "Bodies"
+msgstr ""
+
#: templates/web/fiksgatami/footer.html:16
#: templates/web/fiksgatami/nn/footer.html:16
msgid ""
@@ -490,22 +479,22 @@ msgstr ""
msgid "By Date"
msgstr ""
-#: templates/web/fixmystreet/around/display_location.html:80
-#: templates/web/fixmystreet/around/display_location.html:82
-#, fuzzy
+#: templates/web/fixmystreet/around/_report_banner.html:10
+#: templates/web/fixmystreet/around/_report_banner.html:8
msgid "Can't see the map? <a href='%s' rel='nofollow'>Skip this step</a>"
msgstr ""
-"Karte nicht sichtbar? <a href='%s' rel='nofollow'>&Uuml;berspringen "
-"Sie diesen Schritt</a>"
+"Karte nicht sichtbar? <a href='%s' rel='nofollow'>&Uuml;berspringen Sie "
+"diesen Schritt</a>"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:632
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:657
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:631
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:658
#: templates/web/bromley/report/new/fill_in_details_form.html:68
-#: templates/web/default/admin/council_contacts.html:35
+#: templates/web/default/admin/council_contacts.html:37
#: templates/web/default/admin/index.html:36
#: templates/web/default/admin/list_flagged.html:14
#: templates/web/default/admin/search_reports.html:17
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:72
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:74
+#: templates/web/zurich/report/new/fill_in_details_form.html:68
msgid "Category"
msgstr "Kategorie"
@@ -513,14 +502,14 @@ msgstr "Kategorie"
msgid "Category fix rate for problems > 4 weeks old"
msgstr ""
-#: templates/web/default/admin/council_contacts.html:72
+#: templates/web/default/admin/council_contacts.html:78
#: templates/web/default/admin/council_edit.html:23
#: templates/web/default/admin/report_edit.html:25
#: templates/web/default/report/new/fill_in_details_form.html:67
msgid "Category:"
msgstr "Kategorie:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:334
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:336
msgid "Category: %s"
msgstr "Kategorie: %s"
@@ -530,30 +519,30 @@ msgstr "Kategorie: %s"
msgid "Change Password"
msgstr "Passwort &auml;ndern"
-#: templates/web/fixmystreet/around/display_location.html:72
-#: templates/web/fixmystreet/around/display_location.html:73
+#: templates/web/default/js/validation_strings.html:22
+#: templates/web/fixmystreet/around/_report_banner.html:2
msgid "Click map to report a problem"
-msgstr "Klicken Sie in die Karte um eine Meldung zu erfassen"
+msgstr "Mangel lokalisieren"
#: templates/web/bromley/report/display.html:80
#: templates/web/bromley/report/display.html:82
#: templates/web/default/admin/report_edit.html:18
#: templates/web/default/admin/report_edit.html:20
-#: templates/web/default/dashboard/index.html:136
#: templates/web/default/dashboard/index.html:138
-#: templates/web/default/report/display.html:79
-#: templates/web/default/report/display.html:81
+#: templates/web/default/dashboard/index.html:140
+#: templates/web/default/report/update-form.html:30
+#: templates/web/default/report/update-form.html:32
#: templates/web/fixmystreet/report/banner.html:15
-#: templates/web/fixmystreet/report/display.html:74
-#: templates/web/fixmystreet/report/display.html:76
+#: templates/web/fixmystreet/report/update-form.html:28
+#: templates/web/fixmystreet/report/update-form.html:30
msgid "Closed"
msgstr "Geschlossen"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:690
+#: perllib/FixMyStreet/DB/Result/Problem.pm:695
msgid "Closed by council"
msgstr ""
-#: templates/web/default/my/my.html:32 templates/web/fixmystreet/my/my.html:32
+#: templates/web/default/my/my.html:32 templates/web/fixmystreet/my/my.html:36
msgid "Closed reports"
msgstr ""
@@ -561,8 +550,8 @@ msgstr ""
msgid "Closed:"
msgstr "Geschlossen:"
-#: templates/web/default/around/display_location.html:103
-#: templates/web/default/around/display_location.html:105
+#: templates/web/default/around/tabbed_lists.html:10
+#: templates/web/default/around/tabbed_lists.html:12
msgid "Closest nearby problems <small>(within&nbsp;%skm)</small>"
msgstr ""
@@ -586,23 +575,27 @@ msgstr ""
msgid "Cobrand:"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:358
+#: perllib/FixMyStreet/App/Controller/Admin.pm:365
msgid "Configuration updated"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:372
+#: perllib/FixMyStreet/App/Controller/Admin.pm:380
msgid "Configuration updated - contacts will be generated automatically later"
msgstr ""
-#: templates/web/default/admin/council_contacts.html:153
+#: templates/web/default/admin/council_edit.html:34
+msgid "Configure Endpoint"
+msgstr ""
+
+#: templates/web/default/admin/council_contacts.html:168
msgid "Configure Open311"
msgstr ""
-#: templates/web/default/admin/council_contacts.html:105
+#: templates/web/default/admin/council_contacts.html:116
msgid "Configure Open311 integration"
msgstr ""
-#: templates/web/default/admin/council_contacts.html:42
+#: templates/web/default/admin/council_contacts.html:46
msgid "Confirm"
msgstr "Best&auml;tigen"
@@ -610,6 +603,13 @@ msgstr "Best&auml;tigen"
msgid "Confirm account"
msgstr ""
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:187
+#: templates/web/fixmystreet/report/update-form.html:103
+msgid ""
+"Confirm by email below, providing a new password at that point. When you "
+"confirm, your password will be updated."
+msgstr ""
+
#: templates/web/default/questionnaire/creator_fixed.html:1
#: templates/web/default/tokens/confirm_problem.html:1
#: templates/web/default/tokens/confirm_problem.html:3
@@ -617,17 +617,22 @@ msgstr ""
#: templates/web/default/tokens/confirm_update.html:3
#: templates/web/emptyhomes/tokens/confirm_problem.html:1
#: templates/web/emptyhomes/tokens/confirm_problem.html:3
+#: templates/web/southampton/tokens/confirm_problem.html:1
+#: templates/web/southampton/tokens/confirm_problem.html:3
msgid "Confirmation"
msgstr "Best&auml;tigung"
-#: templates/web/default/admin/council_contacts.html:37
-#: templates/web/default/admin/council_contacts.html:82
+#: templates/web/default/admin/council_contacts.html:39
+#: templates/web/default/admin/council_contacts.html:88
#: templates/web/default/admin/council_edit.html:28
-#: templates/web/default/admin/council_edit.html:43
-#: templates/web/default/admin/stats.html:5
+#: templates/web/default/admin/council_edit.html:71
msgid "Confirmed"
msgstr "Best&auml;tigt"
+#: templates/web/default/admin/stats.html:5
+msgid "Confirmed reports between %s and %s"
+msgstr ""
+
#: templates/web/default/admin/problem_row.html:23
#: templates/web/default/admin/report_edit.html:34
msgid "Confirmed:"
@@ -658,8 +663,8 @@ msgstr ""
msgid "Contact the team"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1150
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1178
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1159
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1187
msgid "Could not find user"
msgstr ""
@@ -670,7 +675,6 @@ msgstr ""
msgid "Council"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1022
#: templates/web/default/admin/council_list.html:1
msgid "Council contacts"
msgstr ""
@@ -698,7 +702,7 @@ msgstr ""
msgid "Create a report"
msgstr "Erfasse eine Meldung"
-#: templates/web/default/admin/council_contacts.html:96
+#: templates/web/default/admin/council_contacts.html:107
msgid "Create category"
msgstr ""
@@ -726,15 +730,16 @@ msgstr ""
msgid "Dashboard"
msgstr ""
-#: templates/web/default/admin/council_contacts.html:38
-#: templates/web/default/admin/council_contacts.html:85
+#: templates/web/default/admin/council_contacts.html:40
+#: templates/web/default/admin/council_contacts.html:91
#: templates/web/default/admin/council_edit.html:29
-#: templates/web/default/admin/council_edit.html:44
+#: templates/web/default/admin/council_edit.html:72
msgid "Deleted"
msgstr "Gel&ouml;scht"
#: templates/web/bromley/report/new/fill_in_details_form.html:54
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:64
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:66
+#: templates/web/zurich/report/new/fill_in_details_form.html:60
msgid "Details"
msgstr "Beschreibung"
@@ -743,14 +748,22 @@ msgstr "Beschreibung"
msgid "Details:"
msgstr "Beschreibung:"
+#: templates/web/default/admin/council_contacts.html:41
+msgid "Devolved"
+msgstr ""
+
#: templates/web/default/admin/council_list.html:23
msgid "Diligency prize league table"
msgstr "Weiss ich nicht"
+#: templates/web/fixmystreet/auth/general.html:30
+msgid "Do you have a FixMyBarangay password?"
+msgstr ""
+
#: templates/web/default/auth/general.html:32
-#: templates/web/fixmystreet/auth/general.html:29
-#: templates/web/fixmystreet/report/display.html:128
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:150
+#: templates/web/fixmystreet/auth/general.html:32
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:165
+#: templates/web/fixmystreet/report/update-form.html:82
msgid "Do you have a FixMyStreet password?"
msgstr ""
@@ -777,33 +790,32 @@ msgstr ""
msgid "Editing user %d"
msgstr ""
-#: templates/web/default/admin/council_edit.html:45
+#: templates/web/default/admin/council_edit.html:73
msgid "Editor"
msgstr ""
#: templates/web/bromley/report/display.html:126
-#: templates/web/default/admin/council_contacts.html:36
-#: templates/web/default/admin/council_edit.html:42
+#: templates/web/default/admin/council_contacts.html:38
+#: templates/web/default/admin/council_edit.html:70
#: templates/web/default/admin/list_flagged.html:12
#: templates/web/default/admin/list_flagged.html:35
#: templates/web/default/admin/list_updates.html:8
-#: templates/web/default/admin/search_abuse.html:11
#: templates/web/default/admin/search_reports.html:15
#: templates/web/default/admin/search_users.html:13
#: templates/web/fixmystreet/auth/general.html:20
-#: templates/web/fixmystreet/report/display.html:120
+#: templates/web/fixmystreet/report/update-form.html:74
msgid "Email"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1126
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1135
msgid "Email added to abuse list"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1123
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1132
msgid "Email already in abuse list"
msgstr ""
-#: templates/web/default/around/display_location.html:85
+#: templates/web/default/around/_updates.html:5
msgid "Email me new local problems"
msgstr ""
@@ -811,7 +823,7 @@ msgstr ""
msgid "Email me updates"
msgstr "Schicken sie mir Aktualisierungen"
-#: templates/web/default/admin/council_contacts.html:77
+#: templates/web/default/admin/council_contacts.html:83
#: templates/web/default/admin/council_edit.html:26
#: templates/web/default/admin/report_edit.html:31
#: templates/web/default/admin/update_edit.html:24
@@ -821,15 +833,15 @@ msgstr "Schicken sie mir Aktualisierungen"
msgid "Email:"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:611
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:610
msgid "Empty flat or maisonette"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:610
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:609
msgid "Empty house or bungalow"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:613
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:612
msgid "Empty office or other commercial"
msgstr ""
@@ -837,11 +849,11 @@ msgstr ""
msgid "Empty property details form"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:614
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:613
msgid "Empty pub or bar"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:615
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:614
msgid "Empty public building - school, hospital, etc."
msgstr ""
@@ -857,10 +869,14 @@ msgstr ""
msgid "End month:"
msgstr ""
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:9
+msgid "Enter a Z&uuml;rich street name"
+msgstr "Ungef&auml;hre Adresse des Mangels"
+
#: templates/web/emptyhomes/index.html:40
#: templates/web/emptyhomes/index.html:41
msgid "Enter a nearby GB postcode, or street name and area"
-msgstr "Geben Sie eine Adresse an"
+msgstr "Geben Sie die ungef&auml;hre Adresse des Mangels an"
#: perllib/FixMyStreet/Cobrand/UK.pm:18
#, fuzzy
@@ -869,33 +885,33 @@ msgstr "Geben Sie eine Adresse an"
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:25
msgid "Enter a nearby postcode, or street name and area"
-msgstr "Geben Sie eine Adresse an"
+msgstr "Ungef&auml;hre Adresse des Mangels"
#: templates/web/default/around/postcode_form.html:1
#: templates/web/default/around/postcode_form.html:2
#: templates/web/fixmystreet/around/postcode_form.html:10
#: templates/web/fixmystreet/around/postcode_form.html:11
msgid "Enter a nearby street name and area"
-msgstr "Geben Sie eine Adresse an"
+msgstr "Ungef&auml;hre Adresse des Mangels"
#: templates/web/default/auth/general.html:64
-#: templates/web/default/report/display.html:171
#: templates/web/default/report/new/fill_in_details_form.html:169
+#: templates/web/default/report/update-form.html:122
msgid "Enter a new password:"
msgstr ""
#: templates/web/bromley/report/display.html:148
#: templates/web/bromley/report/new/fill_in_details_form.html:189
-#: templates/web/fixmystreet/auth/general.html:57
-#: templates/web/fixmystreet/report/display.html:160
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:200
+#: templates/web/fixmystreet/auth/general.html:61
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:221
+#: templates/web/fixmystreet/report/update-form.html:120
msgid "Enter a password"
msgstr ""
-#: templates/web/default/index.html:33 templates/web/emptyhomes/index.html:58
-#: templates/web/fixmystreet/index.html:41
+#: templates/web/default/index-steps.html:11
+#: templates/web/emptyhomes/index.html:58
msgid "Enter details of the problem"
-msgstr "Beschreiben sie den Mangel"
+msgstr "Beschreiben Sie den Mangel"
#: templates/web/default/auth/token.html:5
#: templates/web/default/errors/generic.html:1
@@ -907,7 +923,7 @@ msgstr "Beschreiben sie den Mangel"
msgid "Error"
msgstr "Fehler"
-#: templates/web/default/admin/council_contacts.html:11
+#: templates/web/default/admin/council_contacts.html:13
#: templates/web/default/admin/council_edit.html:18
msgid "Example postcode %s"
msgstr "Beispieladresse"
@@ -947,14 +963,10 @@ msgstr ""
msgid "FixMyStreet"
msgstr ""
-#: templates/web/default/admin/header.html:13
+#: templates/web/default/admin/header.html:10
msgid "FixMyStreet admin:"
msgstr ""
-#: templates/web/default/admin/header.html:3
-msgid "FixMyStreet administration"
-msgstr ""
-
#: templates/web/default/alert/index.html:11
msgid ""
"FixMyStreet has a variety of RSS feeds and email alerts for local problems, "
@@ -984,13 +996,13 @@ msgstr ""
#: templates/web/default/admin/index.html:36
#: templates/web/default/admin/report_edit.html:18
#: templates/web/default/admin/report_edit.html:20
-#: templates/web/default/dashboard/index.html:136
#: templates/web/default/dashboard/index.html:138
-#: templates/web/default/report/display.html:79
-#: templates/web/default/report/display.html:81
+#: templates/web/default/dashboard/index.html:140
+#: templates/web/default/report/update-form.html:30
+#: templates/web/default/report/update-form.html:32
#: templates/web/fixmystreet/report/banner.html:12
-#: templates/web/fixmystreet/report/display.html:74
-#: templates/web/fixmystreet/report/display.html:76
+#: templates/web/fixmystreet/report/update-form.html:28
+#: templates/web/fixmystreet/report/update-form.html:30
msgid "Fixed"
msgstr "Gel&ouml;st"
@@ -1004,7 +1016,7 @@ msgstr ""
msgid "Fixed - User"
msgstr ""
-#: templates/web/default/my/my.html:27 templates/web/fixmystreet/my/my.html:27
+#: templates/web/default/my/my.html:27 templates/web/fixmystreet/my/my.html:31
msgid "Fixed reports"
msgstr ""
@@ -1016,6 +1028,7 @@ msgstr ""
msgid "Flag user"
msgstr ""
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1037
#: templates/web/default/admin/search_users.html:15
msgid "Flagged"
msgstr ""
@@ -1026,7 +1039,7 @@ msgid "Flagged:"
msgstr ""
#: templates/web/default/reports/_ward-list.html:3
-#: templates/web/emptyhomes/reports/council.html:19
+#: templates/web/emptyhomes/reports/body.html:19
#: templates/web/fixmystreet/reports/_ward-list.html:4
msgid "Follow a ward link to view only reports within that ward."
msgstr ""
@@ -1035,11 +1048,18 @@ msgstr ""
msgid "For council(s):"
msgstr ""
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:186
+#: templates/web/fixmystreet/report/update-form.html:102
+#, fuzzy
+msgid "Forgotten your password?"
+msgstr "Ihr Passwort"
+
#: templates/web/default/faq/faq-en-gb.html:1
#: templates/web/emptyhomes/faq/faq-cy.html:1
#: templates/web/emptyhomes/faq/faq-en-gb.html:1
#: templates/web/fiksgatami/faq/faq-nb.html:1
#: templates/web/fiksgatami/nn/faq/faq-nn.html:1
+#: templates/web/fixmybarangay/faq/faq-en-gb.html:1
#: templates/web/fixmystreet/faq/faq-en-gb.html:1
#: templates/web/fixmystreet/static/privacy.html:1
#: templates/web/zurich/faq/faq-de.html:1
@@ -1055,15 +1075,14 @@ msgid "GeoRSS on Google Maps"
msgstr ""
#: templates/web/bromley/report/display.html:30
-#: templates/web/fixmystreet/report/display.html:23
+#: templates/web/fixmystreet/report/display.html:31
msgid "Get updates"
msgstr ""
#: templates/web/fixmystreet/reports/_rss.html:3
#: templates/web/fixmystreet/reports/_rss.html:9
-#, fuzzy
msgid "Get updates of %s problems"
-msgstr "Beschreiben sie den Mangel"
+msgstr "Beschreiben Sie den Mangel"
#: templates/web/fixmystreet/reports/_rss.html:11
#: templates/web/fixmystreet/reports/_rss.html:3
@@ -1071,6 +1090,7 @@ msgid "Get updates of problems in this %s"
msgstr ""
#: templates/web/default/alert/_list.html:83
+#: templates/web/fixmybarangay/alert/_list.html:28
#: templates/web/fixmystreet/alert/_list.html:82
msgid "Give me an RSS feed"
msgstr ""
@@ -1078,7 +1098,7 @@ msgstr ""
#: templates/web/default/alert/index.html:34
#: templates/web/default/around/postcode_form.html:8
#: templates/web/emptyhomes/index.html:47
-#: templates/web/fixmystreet/around/postcode_form.html:18
+#: templates/web/fixmystreet/around/postcode_form.html:21
msgid "Go"
msgstr "Los"
@@ -1112,8 +1132,10 @@ msgstr ""
#: templates/web/emptyhomes/header.html:28
#: templates/web/fiksgatami/footer.html:9
#: templates/web/fiksgatami/nn/footer.html:9
+#: templates/web/fixmybarangay/footer.html:24
#: templates/web/fixmystreet/footer.html:53
-#: templates/web/reading/footer.html:10
+#: templates/web/reading/footer.html:10 templates/web/stevenage/footer.html:47
+#: templates/web/zurich/footer.html:14
msgid "Help"
msgstr "Hilfe"
@@ -1124,9 +1146,9 @@ msgstr ""
#: templates/web/barnet/header.html:70 templates/web/bromley/header.html:64
#: templates/web/bromley/header.html:99
-#: templates/web/fixmybarangay/header.html.orig:42
-#: templates/web/fixmystreet/header.html:47
-#: templates/web/zurich/header.html:47
+#: templates/web/fixmybarangay/header.html:64
+#: templates/web/fixmystreet/header.html:49
+#: templates/web/stevenage/header.html:97 templates/web/zurich/header.html:47
msgid "Hi %s"
msgstr "Hallo %s"
@@ -1136,26 +1158,24 @@ msgstr "Hallo %s"
msgid "Hidden"
msgstr "Unsichtbar"
-#: templates/web/default/around/display_location.html:58
-#: templates/web/fixmystreet/around/display_location.html:58
+#: templates/web/default/around/display_location.html:63
msgid "Hide old"
msgstr "Alte ausblenden"
-#: templates/web/default/around/display_location.html:53
-#: templates/web/fixmystreet/around/display_location.html:54
+#: templates/web/default/around/display_location.html:58
msgid "Hide pins"
msgstr "Stecknadeln ausblenden"
-#: templates/web/default/admin/council_edit.html:38
+#: templates/web/default/admin/council_edit.html:66
msgid "History"
msgstr "History"
-#: templates/web/default/index.html:28 templates/web/emptyhomes/index.html:53
-#: templates/web/fixmystreet/index.html:36
+#: templates/web/default/index-steps.html:1
+#: templates/web/emptyhomes/index.html:53
msgid "How to report a problem"
msgstr "Erfasse eine neue Meldung:"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:637
+#: perllib/FixMyStreet/App/Controller/Admin.pm:648
msgid "I am afraid you cannot confirm unconfirmed reports."
msgstr ""
@@ -1226,12 +1246,12 @@ msgstr ""
#: templates/web/bromley/report/display.html:82
#: templates/web/default/admin/report_edit.html:18
#: templates/web/default/admin/report_edit.html:20
-#: templates/web/default/dashboard/index.html:136
#: templates/web/default/dashboard/index.html:138
-#: templates/web/default/report/display.html:79
-#: templates/web/default/report/display.html:81
-#: templates/web/fixmystreet/report/display.html:74
-#: templates/web/fixmystreet/report/display.html:76
+#: templates/web/default/dashboard/index.html:140
+#: templates/web/default/report/update-form.html:30
+#: templates/web/default/report/update-form.html:32
+#: templates/web/fixmystreet/report/update-form.html:28
+#: templates/web/fixmystreet/report/update-form.html:30
msgid "In Progress"
msgstr "In Bearbeitung"
@@ -1259,7 +1279,7 @@ msgstr ""
msgid "Invalid agency_responsible value %s"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:942
+#: perllib/FixMyStreet/App/Controller/Admin.pm:952
msgid "Invalid end date"
msgstr "Ung&ultiges Enddatum"
@@ -1267,7 +1287,7 @@ msgstr "Ung&ultiges Enddatum"
msgid "Invalid format %s specified."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:932
+#: perllib/FixMyStreet/App/Controller/Admin.pm:942
msgid "Invalid start date"
msgstr "Ung&ultiges Startdatum"
@@ -1275,12 +1295,12 @@ msgstr "Ung&ultiges Startdatum"
#: templates/web/bromley/report/display.html:81
#: templates/web/default/admin/report_edit.html:18
#: templates/web/default/admin/report_edit.html:19
-#: templates/web/default/dashboard/index.html:136
-#: templates/web/default/dashboard/index.html:137
-#: templates/web/default/report/display.html:79
-#: templates/web/default/report/display.html:80
-#: templates/web/fixmystreet/report/display.html:74
-#: templates/web/fixmystreet/report/display.html:75
+#: templates/web/default/dashboard/index.html:138
+#: templates/web/default/dashboard/index.html:139
+#: templates/web/default/report/update-form.html:30
+#: templates/web/default/report/update-form.html:31
+#: templates/web/fixmystreet/report/update-form.html:28
+#: templates/web/fixmystreet/report/update-form.html:29
msgid "Investigating"
msgstr ""
@@ -1300,11 +1320,11 @@ msgstr ""
#: templates/web/bromley/report/display.html:166
#: templates/web/bromley/report/new/fill_in_details_form.html:209
#: templates/web/default/auth/general.html:44
-#: templates/web/default/report/display.html:151
#: templates/web/default/report/new/fill_in_details_form.html:149
-#: templates/web/fixmystreet/auth/general.html:42
-#: templates/web/fixmystreet/report/display.html:144
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:167
+#: templates/web/default/report/update-form.html:102
+#: templates/web/fixmystreet/auth/general.html:46
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:182
+#: templates/web/fixmystreet/report/update-form.html:98
msgid "Keep me signed in on this computer"
msgstr ""
@@ -1315,7 +1335,7 @@ msgstr ""
msgid "Last Name"
msgstr "Letzte Bearbeitung"
-#: templates/web/default/admin/council_contacts.html:39
+#: templates/web/default/admin/council_contacts.html:42
msgid "Last editor"
msgstr "Letzter Bearbeiter"
@@ -1328,18 +1348,15 @@ msgstr "Letzte Bearbeitung"
msgid "Last&nbsp;update:"
msgstr "Letzte Bearbeitung"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1028
-msgid "List Flagged"
-msgstr ""
-
-#: templates/web/default/admin/council_contacts.html:14
#: templates/web/default/admin/council_contacts.html:16
+#: templates/web/default/admin/council_contacts.html:18
msgid "List all reported problems"
msgstr "Liste aller Meldungen"
#: templates/web/bromley/report/new/fill_in_details_form.html:69
#: templates/web/default/report/new/fill_in_details_form.html:68
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:73
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:75
+#: templates/web/zurich/report/new/fill_in_details_form.html:69
msgid "Loading..."
msgstr ""
@@ -1354,6 +1371,8 @@ msgstr ""
#: templates/web/default/tokens/confirm_alert.html:3
#: templates/web/emptyhomes/alert/index.html:1
#: templates/web/emptyhomes/alert/index.html:3
+#: templates/web/fixmybarangay/alert/index.html:1
+#: templates/web/fixmybarangay/alert/index.html:3
#: templates/web/fixmystreet/alert/updates.html:1
msgid "Local RSS feeds and email alerts"
msgstr ""
@@ -1369,15 +1388,16 @@ msgstr ""
#: templates/web/bromley/header.html:79 templates/web/default/footer.html:13
#: templates/web/fiksgatami/footer.html:8
#: templates/web/fiksgatami/nn/footer.html:8
+#: templates/web/fixmybarangay/footer.html:22
#: templates/web/fixmystreet/footer.html:51
-#: templates/web/reading/footer.html:9
+#: templates/web/reading/footer.html:9 templates/web/stevenage/footer.html:45
msgid "Local alerts"
msgstr "RSS"
-#: templates/web/default/index.html:32 templates/web/emptyhomes/index.html:57
-#: templates/web/fixmystreet/index.html:40
+#: templates/web/default/index-steps.html:10
+#: templates/web/emptyhomes/index.html:57
msgid "Locate the problem on a map of the area"
-msgstr "Identifizieren Sie den Mangel auf der Karte"
+msgstr "Lokalisieren Sie den Mangel auf der Karte"
#: perllib/FixMyStreet/Map/OSM.pm:44
msgid ""
@@ -1415,10 +1435,12 @@ msgstr "Meldungen in der Nähe"
#: templates/web/emptyhomes/reports/index.html:10
#: templates/web/fiksgatami/nn/reports/index.html:9
#: templates/web/fiksgatami/reports/index.html:9
-#: templates/web/fixmystreet/auth/general.html:52
-#: templates/web/fixmystreet/report/display.html:177
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:117
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:176
+#: templates/web/fixmybarangay/reports/index.html:19
+#: templates/web/fixmystreet/auth/general.html:56
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:120
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:197
+#: templates/web/fixmystreet/report/update-form.html:134
+#: templates/web/zurich/report/new/fill_in_details_form.html:118
msgid "Name"
msgstr "Name"
@@ -1434,26 +1456,26 @@ msgstr "Name:"
msgid "Navigation"
msgstr "Navigation"
-#: perllib/FixMyStreet/Geocode/OSM.pm:159
+#: perllib/FixMyStreet/Geocode/OSM.pm:166
msgid ""
"Nearest named road to the pin placed on the map (automatically generated "
"using OpenStreetMap): %s%s"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/UK.pm:161
+#: perllib/FixMyStreet/Cobrand/UK.pm:152
msgid ""
"Nearest postcode to the pin placed on the map (automatically generated): %s "
"(%sm away)"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Default.pm:404
-#: perllib/FixMyStreet/Cobrand/Default.pm:444
+#: perllib/FixMyStreet/Cobrand/Default.pm:407
+#: perllib/FixMyStreet/Cobrand/Default.pm:447
msgid ""
"Nearest road to the pin placed on the map (automatically generated by Bing "
"Maps): %s"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:245
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:265
msgid ""
"Nearest road to the pin placed on the map (automatically generated by Bing "
"Maps): %s\n"
@@ -1465,11 +1487,11 @@ msgid "Nearly Done! Now check your email..."
msgstr "Fast Fertig! Bitte checken Sie ihre Mailbox..."
#: templates/web/default/reports/index.html:16
-#, fuzzy
+#: templates/web/fixmybarangay/reports/index.html:20
msgid "New <br>problems"
-msgstr "Neue Meldungen"
+msgstr "Neue <br>Meldungen"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:314
+#: perllib/FixMyStreet/App/Controller/Admin.pm:320
msgid "New category contact added"
msgstr ""
@@ -1538,8 +1560,9 @@ msgstr ""
msgid "New!"
msgstr "Neu!"
-#: templates/web/default/admin/council_contacts.html:48
-#: templates/web/default/admin/council_contacts.html:49
+#: templates/web/default/admin/council_contacts.html:52
+#: templates/web/default/admin/council_contacts.html:53
+#: templates/web/default/admin/council_contacts.html:54
#: templates/web/default/admin/council_edit.html:4
#: templates/web/default/admin/list_updates.html:30
#: templates/web/default/admin/list_updates.html:31
@@ -1561,7 +1584,7 @@ msgstr "Nein"
msgid "No council"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:328
+#: perllib/FixMyStreet/DB/Result/Problem.pm:336
msgid "No council selected"
msgstr ""
@@ -1591,6 +1614,14 @@ msgstr "Keine Meldungen gefunden."
msgid "No problems have been reported yet."
msgstr "Bisher wurden noch keine Meldungen erfasst."
+#: templates/web/default/report/_support.html:3
+msgid "No supporters"
+msgstr ""
+
+#: templates/web/default/admin/council_contacts.html:57
+msgid "Non Public"
+msgstr ""
+
#: templates/web/default/admin/council_list.html:5
#: templates/web/default/admin/report_edit.html:16
msgid "None"
@@ -1600,14 +1631,13 @@ msgstr "Keine"
msgid "Not reported before"
msgstr ""
-#: templates/web/default/report/_main.html:11
+#: templates/web/default/report/_main.html:14
#: templates/web/emptyhomes/report/display.html:24
-#: templates/web/fixmystreet/report/_main.html:13
msgid "Not reported to council"
msgstr ""
-#: templates/web/default/admin/council_contacts.html:40
-#: templates/web/default/admin/council_edit.html:46
+#: templates/web/default/admin/council_contacts.html:43
+#: templates/web/default/admin/council_edit.html:74
msgid "Note"
msgstr ""
@@ -1618,8 +1648,8 @@ msgid ""
"numbers may jump about a little"
msgstr ""
-#: templates/web/default/admin/council_contacts.html:89
-#: templates/web/default/admin/council_edit.html:31
+#: templates/web/default/admin/council_contacts.html:95
+#: templates/web/default/admin/council_edit.html:32
msgid "Note:"
msgstr ""
@@ -1627,7 +1657,7 @@ msgstr ""
msgid "Note: <strong>%s</strong>"
msgstr ""
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:149
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:164
msgid "Now to submit your report&hellip;"
msgstr ""
@@ -1635,11 +1665,11 @@ msgstr ""
msgid "Now to submit your report&hellip; do you have a FixMyStreet password?"
msgstr ""
-#: templates/web/fixmystreet/report/display.html:127
+#: templates/web/fixmystreet/report/update-form.html:81
msgid "Now to submit your update&hellip;"
msgstr ""
-#: templates/web/default/report/display.html:133
+#: templates/web/default/report/update-form.html:84
msgid "Now to submit your update&hellip; do you have a FixMyStreet password?"
msgstr ""
@@ -1649,6 +1679,7 @@ msgid "Offensive? Unsuitable? Tell us"
msgstr ""
#: templates/web/default/reports/index.html:18
+#: templates/web/fixmybarangay/reports/index.html:22
msgid "Old / unknown <br>problems"
msgstr ""
@@ -1662,13 +1693,14 @@ msgid "Old state"
msgstr ""
#: templates/web/default/reports/index.html:20
+#: templates/web/fixmybarangay/reports/index.html:24
msgid "Older <br>fixed"
msgstr ""
#: templates/web/default/reports/index.html:17
-#, fuzzy
+#: templates/web/fixmybarangay/reports/index.html:21
msgid "Older <br>problems"
-msgstr "Neue Meldungen"
+msgstr ""
#: templates/web/emptyhomes/reports/index.html:14
#: templates/web/fiksgatami/nn/reports/index.html:14
@@ -1685,13 +1717,13 @@ msgstr ""
#: templates/web/bromley/report/display.html:80
#: templates/web/default/admin/report_edit.html:18
#: templates/web/default/admin/update_edit.html:19
-#: templates/web/default/dashboard/index.html:136
-#: templates/web/default/report/display.html:79
-#: templates/web/fixmystreet/report/display.html:74
+#: templates/web/default/dashboard/index.html:138
+#: templates/web/default/report/update-form.html:30
+#: templates/web/fixmystreet/report/update-form.html:28
msgid "Open"
msgstr "&Ouml;ffnen"
-#: templates/web/default/my/my.html:22 templates/web/fixmystreet/my/my.html:22
+#: templates/web/default/my/my.html:22 templates/web/fixmystreet/my/my.html:26
msgid "Open reports"
msgstr ""
@@ -1719,15 +1751,15 @@ msgid ""
"re in:"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:655
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:1006
#: perllib/FixMyStreet/App/Controller/Report/New.pm:656
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:999
-#: perllib/FixMyStreet/DB/Result/Problem.pm:497
-#: perllib/FixMyStreet/DB/Result/Problem.pm:507
-#: perllib/FixMyStreet/DB/Result/Problem.pm:517
-#: perllib/FixMyStreet/DB/Result/Problem.pm:529
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:329
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:338
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:657
+#: perllib/FixMyStreet/DB/Result/Problem.pm:505
+#: perllib/FixMyStreet/DB/Result/Problem.pm:515
+#: perllib/FixMyStreet/DB/Result/Problem.pm:525
+#: perllib/FixMyStreet/DB/Result/Problem.pm:537
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:331
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:340
msgid "Other"
msgstr ""
@@ -1753,9 +1785,9 @@ msgstr ""
#: templates/web/bromley/report/display.html:145
#: templates/web/bromley/report/new/fill_in_details_form.html:186
-#: templates/web/fixmystreet/auth/general.html:55
-#: templates/web/fixmystreet/report/display.html:157
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:197
+#: templates/web/fixmystreet/auth/general.html:59
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:218
+#: templates/web/fixmystreet/report/update-form.html:117
msgid "Password (optional)"
msgstr ""
@@ -1765,12 +1797,13 @@ msgstr ""
#: templates/web/bromley/report/new/fill_in_details_form.html:136
#: templates/web/bromley/report/new/fill_in_details_form.html:183
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:133
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:194
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:148
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:215
+#: templates/web/zurich/report/new/fill_in_details_form.html:124
msgid "Phone number (optional)"
msgstr "Telefonnummer (optional)"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:260
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:262
#: templates/web/default/admin/report_edit.html:32
#: templates/web/default/report/new/fill_in_details_form.html:215
msgid "Phone:"
@@ -1778,14 +1811,15 @@ msgstr "Telefonnummer:"
#: templates/web/bromley/report/display.html:109
#: templates/web/bromley/report/new/fill_in_details_form.html:104
-#: templates/web/fixmystreet/report/display.html:103
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:108
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:92
+#: templates/web/fixmystreet/report/update-form.html:57
+#: templates/web/zurich/report/new/fill_in_details_form.html:86
msgid "Photo"
msgstr "Foto"
#: templates/web/default/questionnaire/index.html:95
-#: templates/web/default/report/display.html:109
#: templates/web/default/report/new/fill_in_details_form.html:102
+#: templates/web/default/report/update-form.html:60
#: templates/web/fixmystreet/questionnaire/index.html:90
msgid "Photo:"
msgstr "Foto:"
@@ -1798,12 +1832,12 @@ msgstr "Fotos von neuen Meldungen in der N&auml;he"
#: templates/web/bromley/report/display.html:81
#: templates/web/default/admin/report_edit.html:18
#: templates/web/default/admin/report_edit.html:19
-#: templates/web/default/dashboard/index.html:136
-#: templates/web/default/dashboard/index.html:137
-#: templates/web/default/report/display.html:79
-#: templates/web/default/report/display.html:80
-#: templates/web/fixmystreet/report/display.html:74
-#: templates/web/fixmystreet/report/display.html:75
+#: templates/web/default/dashboard/index.html:138
+#: templates/web/default/dashboard/index.html:139
+#: templates/web/default/report/update-form.html:30
+#: templates/web/default/report/update-form.html:31
+#: templates/web/fixmystreet/report/update-form.html:28
+#: templates/web/fixmystreet/report/update-form.html:29
msgid "Planned"
msgstr "Geplant"
@@ -1825,25 +1859,25 @@ msgstr ""
#: templates/web/default/auth/token.html:17
msgid "Please check your email"
-msgstr "Bitte &uuml;berpr&uuml;fen sie ihre eMail"
+msgstr "Bitte &uuml;berpr&uuml;fen sie ihr E-Mail"
#: templates/web/default/auth/general.html:14
#: templates/web/default/auth/general.html:8
#: templates/web/fixmystreet/auth/general.html:15
#: templates/web/fixmystreet/auth/general.html:9
msgid "Please check your email address is correct"
-msgstr "Bitte &uuml;berpr&uuml;fen Sie ob Ihre eMail-Adresse korrekt ist"
+msgstr "Bitte &uuml;berpr&uuml;fen Sie ob Ihre E-Mail Adresse korrekt ist"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:819
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:826
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:845
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:884
-#: perllib/FixMyStreet/DB/Result/Problem.pm:347
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:822
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:829
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:848
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:891
+#: perllib/FixMyStreet/DB/Result/Problem.pm:355
#: templates/web/default/js/validation_strings.html:9
msgid "Please choose a category"
msgstr "Bitte w&auml;hlen Sie eine Kategorie"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:353
+#: perllib/FixMyStreet/DB/Result/Problem.pm:361
msgid "Please choose a property type"
msgstr ""
@@ -1863,13 +1897,10 @@ msgstr ""
#: templates/web/default/report/new/notes.html:7
#: templates/web/fixmystreet/report/new/notes.html:6
-#, fuzzy
msgid ""
-"Please do not be abusive &mdash; abusing your council devalues the service "
-"for all users."
+"Please do not be abusive&nbsp;&mdash; abusing your council devalues the "
+"service for all users."
msgstr ""
-"Bitte missbrauchen Sie diesen Service nicht. Die Schaden damit nicht nur der "
-"Verwaltung, sondern s&auml;mtlichen Bewohnern von Z&uuml,rich."
#: perllib/FixMyStreet/DB/Result/Comment.pm:146
#: templates/web/default/js/validation_strings.html:2
@@ -1882,7 +1913,7 @@ msgid "Please enter a password"
msgstr ""
#: perllib/FixMyStreet/App/Controller/Contact.pm:97
-#: perllib/FixMyStreet/DB/Result/Problem.pm:322
+#: perllib/FixMyStreet/DB/Result/Problem.pm:330
#: templates/web/default/js/validation_strings.html:3
msgid "Please enter a subject"
msgstr ""
@@ -1891,14 +1922,14 @@ msgstr ""
#: templates/web/default/js/validation_strings.html:12
#: templates/web/default/js/validation_strings.html:16
msgid "Please enter a valid email"
-msgstr "Bitte geben Sie eine g&uuml;ltige eMail-Adresse an"
+msgstr "Bitte geben Sie eine g&uuml;ltige E-Mail Adresse an"
#: perllib/FixMyStreet/App/Controller/Alert.pm:346
#: perllib/FixMyStreet/App/Controller/Contact.pm:107
msgid "Please enter a valid email address"
-msgstr "Bitte geben Sie eine g&uuml;ltige eMail-Adresse an"
+msgstr "Bitte geben Sie eine g&uuml;ltige E-Mail Adresse an"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:325
+#: perllib/FixMyStreet/DB/Result/Problem.pm:333
#: templates/web/default/js/validation_strings.html:4
msgid "Please enter some details"
msgstr "Bitte geben Sie einiges Details an"
@@ -1912,19 +1943,20 @@ msgstr "Bitte geben Sie einiges Details an"
#: templates/web/fixmystreet/auth/general.html:14
#: templates/web/fixmystreet/auth/general.html:9
msgid "Please enter your email"
-msgstr "Bitte geben Sie Ihre eMail-Adresse an"
+msgstr "Bitte geben Sie Ihre E-Mail Adresse an"
#: templates/web/bromley/report/new/fill_in_details_form.html:149
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:146
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:161
+#: templates/web/zurich/report/new/fill_in_details_form.html:110
msgid "Please enter your email address"
-msgstr "Bitte geben Sie eine Ihre eMail-Adresse an"
+msgstr "Bitte geben Sie Ihre E-Mail Adresse an."
#: templates/web/default/js/validation_strings.html:19
#, fuzzy
msgid "Please enter your first name"
msgstr "Bitte geben Sie Ihren Namen an"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:340
+#: perllib/FixMyStreet/DB/Result/Problem.pm:348
#: templates/web/default/js/validation_strings.html:7
msgid ""
"Please enter your full name, councils need this information – if you do not "
@@ -1933,7 +1965,7 @@ msgstr ""
#: perllib/FixMyStreet/App/Controller/Contact.pm:95
#: perllib/FixMyStreet/DB/Result/Comment.pm:143
-#: perllib/FixMyStreet/DB/Result/Problem.pm:333
+#: perllib/FixMyStreet/DB/Result/Problem.pm:341
#: perllib/FixMyStreet/DB/Result/User.pm:97
#: templates/web/default/js/validation_strings.html:6
msgid "Please enter your name"
@@ -1945,9 +1977,8 @@ msgid "Please enter your second name"
msgstr "Bitte geben Sie Ihren Namen an"
#: templates/web/default/js/validation_strings.html:18
-#, fuzzy
msgid "Please enter your title"
-msgstr "Bitte geben Sie Ihre eMail-Adresse an"
+msgstr "Bitte geben Sie Iher E-Mail-Adresse an"
#: templates/web/emptyhomes/report/new/fill_in_details_text.html:1
msgid ""
@@ -1964,11 +1995,28 @@ msgstr ""
#: templates/web/default/report/new/fill_in_details_text.html:1
#: templates/web/default/report/new/fill_in_details_text.html:11
+#: templates/web/fixmybarangay/report/new/fill_in_details_text.html:1
+#: templates/web/fixmybarangay/report/new/fill_in_details_text.html:10
#: templates/web/fixmystreet/report/new/fill_in_details_text.html:1
-#: templates/web/fixmystreet/report/new/fill_in_details_text.html:11
+#: templates/web/fixmystreet/report/new/fill_in_details_text.html:8
msgid "Please fill in details of the problem below."
msgstr ""
+#: templates/web/fixmybarangay/report/new/fill_in_details_text.html:1
+#: templates/web/fixmybarangay/report/new/fill_in_details_text.html:3
+#, fuzzy
+msgid ""
+"Please fill in details of the problem below. Leave as much detail as you "
+"can, \n"
+"and if possible describe the exact location of\n"
+"the problem (e.g. if there is a streetlight number or road name)."
+msgstr ""
+"Bitte beschreiben sie Ihre Meldung weiter unten. Wir k&ouml;nnen den Mangel "
+"nur beheben, wenn Sie soviel Details wie m&ouml;glich angeben: Beschreiben "
+"sie die exakte Lage (z.B. An der Wand Richtung Strasse), was genau der "
+"Mangel ist, wie lange dieser schon da ist und laden sie wenn m&ouml;glich "
+"ein Photo des Mangels hoch."
+
#: templates/web/default/report/new/fill_in_details_text.html:1
#: templates/web/default/report/new/fill_in_details_text.html:3
msgid ""
@@ -1985,19 +2033,21 @@ msgstr ""
"Mangel ist, wie lange dieser schon da ist und laden sie wenn m&ouml;glich "
"ein Photo des Mangels hoch."
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:68
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:70
+#: templates/web/zurich/report/new/fill_in_details_form.html:64
msgid "Please fill in details of the problem."
-msgstr ""
+msgstr "Beschreiben Sie den Mangel."
#: templates/web/bromley/report/new/fill_in_details_form.html:28
#: templates/web/default/report/new/fill_in_details_form.html:27
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:34
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:35
+#: templates/web/zurich/report/new/fill_in_details_form.html:35
msgid ""
"Please fill in the form below with details of the problem, and describe the "
"location as precisely as possible in the details box."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:241
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:243
msgid "Please indicate whether you'd like to receive another questionnaire"
msgstr ""
@@ -2005,7 +2055,7 @@ msgstr ""
msgid "Please note that updates are not sent to the council."
msgstr ""
-#: templates/web/default/report/display.html:56
+#: templates/web/default/report/update-form.html:7
msgid ""
"Please note that updates are not sent to the council. If you leave your name "
"it will be public. Your information will only be used in accordance with our "
@@ -2013,35 +2063,40 @@ msgid ""
msgstr ""
#: templates/web/barnet/report/updates-sidebar-notes.html:1
+#, fuzzy
msgid ""
"Please note that updates are not sent to the relevant department. If you "
"leave your name it will be public. Your information will only be used in "
"accordance with our <a href=\"/faq#privacy\">privacy policy</a>"
msgstr ""
+"Wir verwenden Ihre pers&ouml;nlichen Daten nur entsprechend unserer <a href="
+"\"/faq#privacy\">Datenschutzrichtlinien.</a>"
#: templates/web/bromley/report/new/fill_in_details_form.html:23
#: templates/web/default/report/new/fill_in_details_form.html:5
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:25
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:26
+#: templates/web/zurich/report/new/fill_in_details_form.html:26
msgid ""
"Please note your report has <strong>not yet been sent</strong>. Choose a "
"category and add further information below, then submit."
msgstr ""
#: templates/web/default/report/new/notes.html:1
+#: templates/web/fixmybarangay/report/new/notes.html:1
#: templates/web/fixmystreet/report/new/notes.html:1
msgid "Please note:"
msgstr "Hinweise:"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:244
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:246
msgid "Please provide some explanation as to why you're reopening this report"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:251
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:253
msgid "Please provide some text as well as a photo"
msgstr ""
#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:116
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:237
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:239
msgid ""
"Please say whether you've ever reported a problem to your council before"
msgstr ""
@@ -2054,7 +2109,7 @@ msgstr ""
msgid "Please select the type of alert you want"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:233
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:235
msgid "Please state whether or not the problem has been fixed"
msgstr ""
@@ -2062,11 +2117,11 @@ msgstr ""
msgid "Please take a look at the updates that have been left."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Photo.pm:176
+#: perllib/FixMyStreet/App/Controller/Photo.pm:175
msgid "Please upload a JPEG image only"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Photo.pm:183
+#: perllib/FixMyStreet/App/Controller/Photo.pm:182
msgid "Please upload a JPEG image only\n"
msgstr ""
@@ -2075,7 +2130,7 @@ msgid "Please write a message"
msgstr ""
#: templates/web/bromley/report/display.html:70
-#: templates/web/fixmystreet/report/display.html:69
+#: templates/web/fixmystreet/report/update-form.html:23
msgid "Please write your update here"
msgstr ""
@@ -2083,13 +2138,13 @@ msgstr ""
#: templates/web/bromley/report/display.html:149
#: templates/web/bromley/report/display.html:161
#: templates/web/default/contact/index.html:93
-#: templates/web/default/report/display.html:119
-#: templates/web/default/report/display.html:156
-#: templates/web/default/report/display.html:178
+#: templates/web/default/report/update-form.html:107
+#: templates/web/default/report/update-form.html:129
+#: templates/web/default/report/update-form.html:70
#: templates/web/fixmystreet/contact/index.html:93
-#: templates/web/fixmystreet/report/display.html:115
-#: templates/web/fixmystreet/report/display.html:139
-#: templates/web/fixmystreet/report/display.html:161
+#: templates/web/fixmystreet/report/update-form.html:121
+#: templates/web/fixmystreet/report/update-form.html:69
+#: templates/web/fixmystreet/report/update-form.html:93
msgid "Post"
msgstr ""
@@ -2105,6 +2160,12 @@ msgstr ""
msgid "Posted by %s at %s"
msgstr ""
+#: templates/web/default/admin/council_contacts.html:100
+#: templates/web/default/admin/council_edit.html:30
+#: templates/web/default/admin/report_edit.html:43
+msgid "Private"
+msgstr ""
+
#: templates/web/default/maps/openlayers.html:85
msgid "Problem"
msgstr "Meldung"
@@ -2125,7 +2186,7 @@ msgstr ""
msgid "Problem breakdown by state"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:819
+#: perllib/FixMyStreet/App/Controller/Admin.pm:849
msgid "Problem marked as open."
msgstr ""
@@ -2137,17 +2198,17 @@ msgstr ""
msgid "Problems"
msgstr "Meldungen"
-#: templates/web/default/around/display_location.html:81
+#: templates/web/default/around/_updates.html:1
msgid "Problems in this area"
msgstr "Meldungen in dieser Gegend"
#: templates/web/bromley/report/display.html:31
-#: templates/web/fixmystreet/around/display_location.html:98
-#: templates/web/fixmystreet/report/display.html:24
+#: templates/web/fixmystreet/around/tabbed_lists.html:4
+#: templates/web/fixmystreet/report/display.html:35
msgid "Problems nearby"
msgstr "Meldungen in der N&auml;he"
-#: templates/web/fixmystreet/around/display_location.html:97
+#: templates/web/fixmystreet/around/tabbed_lists.html:3
msgid "Problems on the map"
msgstr "Meldungen auf der Karte"
@@ -2160,24 +2221,25 @@ msgstr "Meldungen, welche k&uuml;rzlich gel&ouml;st wurden"
msgid "Problems within %.1fkm of this location"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Default.pm:609
+#: perllib/FixMyStreet/Cobrand/Default.pm:612
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:95
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:162
-#: perllib/FixMyStreet/Cobrand/UK.pm:240
+#: perllib/FixMyStreet/Cobrand/UK.pm:231
msgid "Problems within %s"
msgstr "Meldungen innerhalb %s"
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:103
-#: perllib/FixMyStreet/Cobrand/UK.pm:254
+#: perllib/FixMyStreet/Cobrand/UK.pm:245
msgid "Problems within %s ward"
msgstr ""
-#: templates/web/default/reports/council.html:0
-#: templates/web/default/reports/council.html:29
+#: templates/web/default/reports/body.html:0
+#: templates/web/default/reports/body.html:29
msgid "Problems within %s, FixMyStreet"
msgstr ""
#: templates/web/default/alert/_list.html:40
+#: templates/web/fixmybarangay/alert/_list.html:13
#: templates/web/fixmystreet/alert/_list.html:42
msgid "Problems within the boundary of:"
msgstr ""
@@ -2186,18 +2248,18 @@ msgstr ""
msgid "Properties recently reported as put back to use on reportemptyhomes.com"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:617
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:616
msgid "Property type:"
msgstr ""
#: templates/web/bromley/report/new/fill_in_details_form.html:52
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:62
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:64
msgid "Provide a title"
msgstr ""
#: templates/web/bromley/report/display.html:57
-#: templates/web/default/report/display.html:51
-#: templates/web/fixmystreet/report/display.html:50
+#: templates/web/default/report/update-form.html:3
+#: templates/web/fixmystreet/report/update-form.html:4
msgid "Provide an update"
msgstr "Meldung aktualisieren"
@@ -2208,15 +2270,20 @@ msgid ""
msgstr ""
#: templates/web/bromley/report/display.html:142
-#: templates/web/default/report/display.html:175
#: templates/web/default/report/new/fill_in_details_form.html:173
-#: templates/web/fixmystreet/report/display.html:154
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:191
+#: templates/web/default/report/update-form.html:126
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:212
+#: templates/web/fixmystreet/report/update-form.html:114
msgid ""
"Providing a password is optional, but doing so will allow you to more easily "
"report problems, leave updates and manage your reports."
msgstr ""
+#: templates/web/default/admin/council_contacts.html:44
+#: templates/web/default/admin/council_contacts.html:57
+msgid "Public"
+msgstr ""
+
#: templates/web/default/questionnaire/completed.html:1
#: templates/web/default/questionnaire/completed.html:2
#: templates/web/default/questionnaire/index.html:0
@@ -2237,7 +2304,7 @@ msgstr ""
msgid "Questionnaire %d sent for problem %d"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:190
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:192
msgid "Questionnaire filled in by problem reporter"
msgstr ""
@@ -2249,17 +2316,15 @@ msgstr ""
#: templates/web/default/reports/_rss.html:1
#: templates/web/fixmystreet/alert/_list.html:22
#: templates/web/fixmystreet/alert/updates.html:9
-#: templates/web/fixmystreet/around/display_location.html:1
-#: templates/web/fixmystreet/around/display_location.html:3
-#: templates/web/fixmystreet/report/display.html:30
+#: templates/web/fixmystreet/report/display.html:49
msgid "RSS feed"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/UK.pm:283 perllib/FixMyStreet/Cobrand/UK.pm:295
+#: perllib/FixMyStreet/Cobrand/UK.pm:274 perllib/FixMyStreet/Cobrand/UK.pm:286
msgid "RSS feed for %s"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/UK.pm:289 perllib/FixMyStreet/Cobrand/UK.pm:301
+#: perllib/FixMyStreet/Cobrand/UK.pm:280 perllib/FixMyStreet/Cobrand/UK.pm:292
msgid "RSS feed for %s ward, %s"
msgstr ""
@@ -2267,11 +2332,11 @@ msgstr ""
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:186
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:196
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:204
-#: perllib/FixMyStreet/Cobrand/UK.pm:309 perllib/FixMyStreet/Cobrand/UK.pm:321
+#: perllib/FixMyStreet/Cobrand/UK.pm:300 perllib/FixMyStreet/Cobrand/UK.pm:312
msgid "RSS feed of %s"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/UK.pm:314 perllib/FixMyStreet/Cobrand/UK.pm:326
+#: perllib/FixMyStreet/Cobrand/UK.pm:305 perllib/FixMyStreet/Cobrand/UK.pm:317
msgid "RSS feed of %s, within %s ward"
msgstr ""
@@ -2284,29 +2349,27 @@ msgstr ""
msgid "RSS feed of problems in this %s"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/Default.pm:610
+#: perllib/FixMyStreet/Cobrand/Default.pm:613
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:96
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:161
-#: perllib/FixMyStreet/Cobrand/UK.pm:247
+#: perllib/FixMyStreet/Cobrand/UK.pm:238
msgid "RSS feed of problems within %s"
msgstr ""
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:102
-#: perllib/FixMyStreet/Cobrand/UK.pm:253
+#: perllib/FixMyStreet/Cobrand/UK.pm:244
msgid "RSS feed of problems within %s ward"
msgstr ""
#: templates/web/default/around/display_location.html:1
#: templates/web/default/around/display_location.html:4
-#: templates/web/fixmystreet/around/display_location.html:1
-#: templates/web/fixmystreet/around/display_location.html:4
msgid "RSS feed of recent local problems"
msgstr ""
#: templates/web/bromley/report/display.html:37
#: templates/web/default/report/display.html:42
#: templates/web/fixmystreet/alert/updates.html:9
-#: templates/web/fixmystreet/report/display.html:30
+#: templates/web/fixmystreet/report/display.html:49
msgid "RSS feed of updates to this problem"
msgstr ""
@@ -2314,21 +2377,19 @@ msgstr ""
#: templates/web/default/alert/updates.html:9
#: templates/web/default/report/display.html:33
#: templates/web/fixmystreet/alert/updates.html:14
-#: templates/web/fixmystreet/report/display.html:32
+#: templates/web/fixmystreet/report/display.html:51
msgid "Receive email when updates are left on this problem."
msgstr "Erhalten Sie Aktualisierungen dieser Meldung."
#: templates/web/default/around/display_location.html:0
#: templates/web/default/around/display_location.html:34
-#: templates/web/fixmystreet/around/display_location.html:0
-#: templates/web/fixmystreet/around/display_location.html:34
msgid "Recent local problems, FixMyStreet"
msgstr ""
#: templates/web/default/reports/index.html:19
-#, fuzzy
+#: templates/web/fixmybarangay/reports/index.html:23
msgid "Recently <br>fixed"
-msgstr "K&uuml;rzlich gel&ouml;st"
+msgstr "K&uuml;rzlich <br>gel&ouml;st"
#: templates/web/emptyhomes/reports/index.html:13
#: templates/web/fiksgatami/nn/reports/index.html:13
@@ -2336,9 +2397,9 @@ msgstr "K&uuml;rzlich gel&ouml;st"
msgid "Recently fixed"
msgstr "K&uuml;rzlich gel&ouml;st"
-#: templates/web/default/index.html:50 templates/web/fixmystreet/index.html:62
+#: templates/web/default/index.html:37 templates/web/fixmystreet/index.html:45
msgid "Recently reported problems"
-msgstr "K&uuml;rzlich erfasste Meldungen"
+msgstr "K&uuml;rzlich erfasste Meldungen:"
#: templates/web/default/report/new/notes.html:9
#: templates/web/fixmystreet/report/new/notes.html:8
@@ -2348,16 +2409,23 @@ msgid ""
"site remember that you can contact your council directly using their own "
"website."
msgstr ""
-"Fix My Z&uuml;rich wird prim&auml;r daf&uuml;r verwendet, physische M&auml;"
-"ngel zu melden, welche behoben werden k&ouml;nnen. Wenn Ihr Problem daf&uuml;"
-"r nicht passend erscheint, k&ouml;nnen sie die entsprechende Dienststelle "
-"weiterhin telefonisch oder per eMail erreichen."
+"Fix My Z&uuml;rich dient dazu M&auml;ngel an der Infrastruktur zu melden. "
+"Meldungen und W&uuml;nsche bez&uuml;glich Verbesserungen an der "
+"Infrastruktur sowie Gestaltungsvorschl&auml;ge k&ouml;nnen über Fix My "
+"Z&uuml;rich nicht ber&uuml;cksichtigt werden. Notf&auml;lle m&uuml;ssen der "
+"Polizei gemeldet werden via Telefon 117."
+
+#: templates/web/fixmybarangay/report/new/notes.html:9
+msgid ""
+"Remember that, for the pilot project, FixMyBarangay is only for reporting "
+"potholes and streetlights in bgy. Luz or Basak San Nicolas."
+msgstr ""
#: templates/web/default/admin/report_blocks.html:16
msgid "Remove flag"
msgstr ""
-#: templates/web/default/admin/report_edit.html:53
+#: templates/web/default/admin/report_edit.html:54
#: templates/web/default/admin/update_edit.html:48
msgid "Remove photo (can't be undone!)"
msgstr ""
@@ -2371,12 +2439,13 @@ msgstr ""
#: templates/web/fiksgatami/footer.html:5
#: templates/web/fiksgatami/nn/footer.html:5
#: templates/web/fixmystreet/footer.html:45
-#: templates/web/reading/footer.html:6
+#: templates/web/reading/footer.html:6 templates/web/stevenage/footer.html:39
+#: templates/web/zurich/footer.html:10
msgid "Report a problem"
msgstr "Eine Meldung erfassen"
#: templates/web/bromley/report/display.html:28
-#: templates/web/fixmystreet/report/display.html:22
+#: templates/web/fixmystreet/report/display.html:29
msgid "Report abuse"
msgstr "Missbrauch melden"
@@ -2384,14 +2453,16 @@ msgstr "Missbrauch melden"
msgid "Report empty properties"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Rss.pm:277
+#: perllib/FixMyStreet/App/Controller/Rss.pm:286
msgid "Report on %s"
msgstr ""
#: templates/web/default/index.html:15
-#: templates/web/fixmystreet/around/postcode_form.html:6
+#: templates/web/fixmystreet/around/intro.html:1
+#: templates/web/stevenage/around/intro.html:1
+#: templates/web/zurich/around/intro.html:1
msgid "Report, view, or discuss local problems"
-msgstr "Melden sie M&auml;ngel an der Infrastruktur von Z&uuml;rich"
+msgstr "Melden Sie M&auml;ngel an der Infrastruktur von Z&uuml;rich"
#: templates/web/default/my/my.html:74
msgid "Reported %s"
@@ -2401,7 +2472,7 @@ msgstr ""
msgid "Reported %s, to %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:512
+#: perllib/FixMyStreet/DB/Result/Problem.pm:520
#: templates/web/default/contact/index.html:45
#: templates/web/fixmystreet/contact/index.html:46
msgid "Reported anonymously at %s"
@@ -2413,33 +2484,33 @@ msgstr "Anonym gemeldet um"
msgid "Reported before"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:504
+#: perllib/FixMyStreet/DB/Result/Problem.pm:512
msgid "Reported by %s anonymously at %s"
msgstr "Anonym gemeldet von %s um %s "
-#: perllib/FixMyStreet/DB/Result/Problem.pm:535
+#: perllib/FixMyStreet/DB/Result/Problem.pm:543
#: templates/web/default/contact/index.html:47
#: templates/web/fixmystreet/contact/index.html:48
msgid "Reported by %s at %s"
msgstr "Gemeldet von %s um %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:526
+#: perllib/FixMyStreet/DB/Result/Problem.pm:534
msgid "Reported by %s by %s at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:500
+#: perllib/FixMyStreet/DB/Result/Problem.pm:508
msgid "Reported by %s in the %s category anonymously at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:520
+#: perllib/FixMyStreet/DB/Result/Problem.pm:528
msgid "Reported by %s in the %s category by %s at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:508
+#: perllib/FixMyStreet/DB/Result/Problem.pm:516
msgid "Reported in the %s category anonymously at %s"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:530
+#: perllib/FixMyStreet/DB/Result/Problem.pm:538
msgid "Reported in the %s category by %s at %s"
msgstr ""
@@ -2451,10 +2522,16 @@ msgstr ""
#: templates/web/fixmystreet/report/new/fill_in_details.html:0
#: templates/web/fixmystreet/report/new/fill_in_details.html:5
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:2
+#: templates/web/zurich/report/new/fill_in_details_form.html:2
msgid "Reporting a problem"
-msgstr "Verfassen Sie eine Meldung"
+msgstr "Ihre Meldung"
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1033
+#, fuzzy
+msgid "Reports"
+msgstr "Alle Meldungen"
-#: templates/web/default/around/display_location.html:95
+#: templates/web/default/around/tabbed_lists.html:3
msgid "Reports on and around the map"
msgstr ""
@@ -2462,40 +2539,29 @@ msgstr ""
msgid "Resend report"
msgstr ""
-#: perllib/FixMyStreet/Geocode/OSM.pm:166
+#: perllib/FixMyStreet/Geocode/OSM.pm:173
msgid ""
"Road operator for this named road (derived from road reference number and "
"type): %s"
msgstr ""
-#: perllib/FixMyStreet/Geocode/OSM.pm:163
+#: perllib/FixMyStreet/Geocode/OSM.pm:170
msgid "Road operator for this named road (from OpenStreetMap): %s"
msgstr ""
-#: templates/web/default/admin/council_edit.html:35
+#: templates/web/default/admin/council_edit.html:63
msgid "Save changes"
msgstr "&Auml;nderungen speichern"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1027
-msgid "Search Abuse"
-msgstr ""
-
-#: templates/web/default/admin/search_abuse.html:1
-msgid "Search Abuse Table"
-msgstr ""
-
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1023
#: templates/web/default/admin/list_flagged.html:1
#: templates/web/default/admin/search_reports.html:1
msgid "Search Reports"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1026
#: templates/web/default/admin/search_users.html:1
msgid "Search Users"
msgstr ""
-#: templates/web/default/admin/search_abuse.html:4
#: templates/web/default/admin/search_reports.html:5
#: templates/web/default/admin/search_users.html:5
msgid "Search:"
@@ -2508,7 +2574,7 @@ msgid ""
"or enter your email address to subscribe to an email alert."
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:618
+#: perllib/FixMyStreet/DB/Result/Problem.pm:623
msgid "Sent to %s %s later"
msgstr ""
@@ -2520,6 +2586,10 @@ msgstr "Gesendet:"
msgid "Service:"
msgstr ""
+#: templates/web/fixmystreet/report/display.html:33
+msgid "Share"
+msgstr ""
+
#: templates/web/emptyhomes/static/about.html:21
msgid "Shelter Cymru"
msgstr ""
@@ -2544,32 +2614,30 @@ msgstr ""
#: templates/web/bromley/report/display.html:203
#: templates/web/bromley/report/new/fill_in_details_form.html:129
#: templates/web/bromley/report/new/fill_in_details_form.html:175
-#: templates/web/default/report/display.html:208
#: templates/web/default/report/new/fill_in_details_form.html:210
-#: templates/web/fixmystreet/report/display.html:185
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:126
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:186
+#: templates/web/default/report/update-form.html:155
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:139
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:207
+#: templates/web/fixmystreet/report/update-form.html:142
msgid "Show my name publicly"
msgstr ""
-#: templates/web/default/around/display_location.html:60
-#: templates/web/fixmystreet/around/display_location.html:60
+#: templates/web/default/around/display_location.html:65
msgid "Show old"
msgstr ""
-#: templates/web/default/around/display_location.html:51
-#: templates/web/fixmystreet/around/display_location.html:52
+#: templates/web/default/around/display_location.html:56
msgid "Show pins"
msgstr "Zeige Stecknadeln"
#: templates/web/default/auth/general.html:3
#: templates/web/default/auth/general.html:49
-#: templates/web/fixmybarangay/header.html.orig:46
+#: templates/web/fixmybarangay/header.html:68
#: templates/web/fixmystreet/auth/general.html:3
-#: templates/web/fixmystreet/auth/general.html:38
-#: templates/web/fixmystreet/auth/general.html:58
-#: templates/web/fixmystreet/header.html:51
-#: templates/web/zurich/header.html:51
+#: templates/web/fixmystreet/auth/general.html:42
+#: templates/web/fixmystreet/auth/general.html:62
+#: templates/web/fixmystreet/header.html:53
+#: templates/web/stevenage/header.html:101 templates/web/zurich/header.html:51
msgid "Sign in"
msgstr ""
@@ -2588,6 +2656,7 @@ msgstr ""
#: templates/web/emptyhomes/header.html:41
#: templates/web/fiksgatami/header.html:22
#: templates/web/fiksgatami/nn/header.html:22
+#: templates/web/fixmybarangay/auth/sign_out.html:1
#: templates/web/lichfielddc/header.html:177
#: templates/web/reading/header.html:33
msgid "Sign out"
@@ -2603,11 +2672,13 @@ msgid "Signed in as %s"
msgstr ""
#: templates/web/default/report/new/fill_in_details_text.html:1
+#: templates/web/fixmybarangay/report/new/fill_in_details_text.html:1
#: templates/web/fixmystreet/report/new/fill_in_details_text.html:1
msgid "Some categories may require additional information."
msgstr ""
#: templates/web/default/alert/index.html:42
+#: templates/web/fixmybarangay/alert/index.html:32
msgid "Some photos of recent reports"
msgstr ""
@@ -2620,7 +2691,7 @@ msgstr ""
msgid "Some unconfirmeds"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/UK.pm:97
+#: perllib/FixMyStreet/Cobrand/UK.pm:89
msgid ""
"Sorry, that appears to be a Crown dependency postcode, which we don't cover."
msgstr ""
@@ -2629,15 +2700,16 @@ msgstr ""
msgid "Sorry, there has been an error confirming your problem."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:214
-#: perllib/FixMyStreet/Geocode.pm:27 perllib/FixMyStreet/Geocode/Bing.pm:51
-#: perllib/FixMyStreet/Geocode/Google.pm:69
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:211
+#: perllib/FixMyStreet/Geocode.pm:28 perllib/FixMyStreet/Geocode/Bing.pm:58
+#: perllib/FixMyStreet/Geocode/Google.pm:74
+#: perllib/FixMyStreet/Geocode/OSM.pm:66
msgid "Sorry, we could not find that location."
msgstr ""
-#: perllib/FixMyStreet/Geocode/Bing.pm:46
-#: perllib/FixMyStreet/Geocode/Google.pm:64
-#: perllib/FixMyStreet/Geocode/OSM.pm:59
+#: perllib/FixMyStreet/Geocode/Bing.pm:53
+#: perllib/FixMyStreet/Geocode/Google.pm:69
+#: perllib/FixMyStreet/Geocode/Zurich.pm:82
msgid "Sorry, we could not parse that location. Please try again."
msgstr ""
@@ -2662,17 +2734,17 @@ msgstr ""
#: templates/web/default/admin/list_flagged.html:18
#: templates/web/default/admin/list_updates.html:6
#: templates/web/default/admin/search_reports.html:21
-#: templates/web/fixmystreet/report/display.html:72
+#: templates/web/fixmystreet/report/update-form.html:26
msgid "State"
msgstr ""
#: templates/web/default/admin/report_edit.html:17
#: templates/web/default/admin/update_edit.html:18
-#: templates/web/default/report/display.html:77
+#: templates/web/default/report/update-form.html:28
msgid "State:"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1029
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1038
#: templates/web/default/admin/stats.html:1
msgid "Stats"
msgstr ""
@@ -2683,7 +2755,7 @@ msgstr ""
#: templates/web/bromley/report/new/fill_in_details_form.html:48
#: templates/web/fixmystreet/contact/index.html:79
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:58
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:60
msgid "Subject"
msgstr "Titel"
@@ -2700,13 +2772,14 @@ msgstr "Titel:"
#: templates/web/default/report/new/fill_in_details_form.html:114
#: templates/web/default/report/new/fill_in_details_form.html:154
#: templates/web/default/report/new/fill_in_details_form.html:176
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:137
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:162
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:201
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:152
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:177
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:222
+#: templates/web/zurich/report/new/fill_in_details_form.html:128
msgid "Submit"
msgstr "Abschicken"
-#: templates/web/default/admin/report_edit.html:56
+#: templates/web/default/admin/report_edit.html:57
#: templates/web/default/admin/update_edit.html:51
#: templates/web/default/admin/user_edit.html:20
msgid "Submit changes"
@@ -2721,16 +2794,21 @@ msgstr ""
#: templates/web/default/alert/updates.html:17
#: templates/web/default/report/display.html:38
#: templates/web/fixmystreet/alert/updates.html:23
-#: templates/web/fixmystreet/report/display.html:37
+#: templates/web/fixmystreet/report/display.html:56
msgid "Subscribe"
msgstr ""
#: templates/web/default/alert/_list.html:97
+#: templates/web/fixmybarangay/alert/_list.html:42
#: templates/web/fixmystreet/alert/_list.html:92
msgid "Subscribe me to an email alert"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1021
+#: templates/web/fixmybarangay/alert/_list.html:6
+msgid "Subscribe to an alert based upon what baranagay you&rsquo;re in:"
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1031
#: templates/web/default/admin/index.html:1
msgid "Summary"
msgstr "Zusammenfassung"
@@ -2739,10 +2817,14 @@ msgstr "Zusammenfassung"
#: templates/web/emptyhomes/reports/index.html:1
#: templates/web/fiksgatami/nn/reports/index.html:1
#: templates/web/fiksgatami/reports/index.html:1
+#: templates/web/fixmybarangay/reports/index.html:1
msgid "Summary reports"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1025
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1035
+msgid "Survey"
+msgstr ""
+
#: templates/web/default/admin/questionnaire.html:1
msgid "Survey Results"
msgstr ""
@@ -2751,7 +2833,7 @@ msgstr ""
msgid "Text"
msgstr ""
-#: templates/web/default/admin/council_contacts.html:18
+#: templates/web/default/admin/council_contacts.html:20
msgid "Text only version"
msgstr ""
@@ -2825,31 +2907,36 @@ msgid ""
"reported a problem to a council before?"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Photo.pm:190
+#: perllib/FixMyStreet/App/Controller/Photo.pm:189
msgid ""
"That image doesn't appear to have uploaded correctly (%s), please try again."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Council.pm:91
+#: perllib/FixMyStreet/App/Controller/Council.pm:90
msgid ""
"That location does not appear to be covered by a council; perhaps it is "
"offshore or outside the country. Please try again."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Location.pm:107
+#: perllib/FixMyStreet/App/Controller/Location.pm:121
msgid "That location does not appear to be in the UK; please try again."
msgstr ""
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:63
-#: perllib/FixMyStreet/Cobrand/UK.pm:90
+#: perllib/FixMyStreet/Cobrand/UK.pm:82
msgid "That postcode was not recognised, sorry."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:605
+#: perllib/FixMyStreet/App/Controller/Admin.pm:616
msgid "That problem will now be resent."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report.pm:75
+#: perllib/FixMyStreet/App/Controller/Report.pm:98
+#, fuzzy
+msgid "That report cannot be viewed on FixMyStreet."
+msgstr "Diese Meldung wurde von Fix My Z&uuml;rich entfernt."
+
+#: perllib/FixMyStreet/App/Controller/Report.pm:92
msgid "That report has been removed from FixMyStreet."
msgstr "Diese Meldung wurde von Fix My Z&uuml;rich entfernt."
@@ -2889,20 +2976,15 @@ msgstr ""
#: templates/web/fixmystreet/report/new/fill_in_details_text.html:1
#: templates/web/fixmystreet/report/new/fill_in_details_text.html:3
-#, fuzzy
msgid ""
-"The council won&rsquo;t be able to help unless you leave as much\n"
-"detail as you can. Please describe the exact location of the problem (e.g. "
-"on a\n"
-"wall), what it is, how long it has been there, a description (and a photo "
-"of\n"
-"the problem if you have one), etc."
+"The council won&rsquo;t be able to help unless you leave as much detail as "
+"you can. Please describe the exact location of the problem (e.g. on a wall), "
+"what it is, how long it has been there, a description (and a photo of the "
+"problem if you have one), etc."
msgstr ""
-"Bitte beschreiben sie Ihre Meldung weiter unten. Wir k&ouml;nnen den Mangel "
-"nur beheben, wenn Sie soviel Details wie m&ouml;glich angeben: Beschreiben "
-"sie die exakte Lage (z.B. An der Wand Richtung Strasse), was genau der "
-"Mangel ist, wie lange dieser schon da ist und laden sie wenn m&ouml;glich "
-"ein Photo des Mangels hoch."
+"Bitte machen Sie so genaue Angaben wie m&ouml;glich: Beschreiben Sie die Art "
+"des Mangels und wo er sich befindet (z.B. an der Wand). Senden Sie uns ein "
+"Photo des Mangels."
#: templates/web/fixmystreet/questionnaire/index.html:43
msgid "The details of your problem are available from the other tab above."
@@ -2915,8 +2997,8 @@ msgid ""
msgstr ""
#: perllib/FixMyStreet/App/Controller/Dashboard.pm:60
-#: perllib/FixMyStreet/App/Controller/Reports.pm:44
-#: perllib/FixMyStreet/App/Controller/Reports.pm:75
+#: perllib/FixMyStreet/App/Controller/Reports.pm:43
+#: perllib/FixMyStreet/App/Controller/Reports.pm:74
msgid "The error was: %s"
msgstr ""
@@ -2927,7 +3009,7 @@ msgid ""
"requested_datetime, updated_datetime, service_code and service_name."
msgstr ""
-#: perllib/FixMyStreet/Geocode/OSM.pm:158
+#: perllib/FixMyStreet/Geocode/OSM.pm:165
msgid ""
"The following information about the nearest road might be inaccurate or "
"irrelevant, if the problem is close to several roads or close to a road "
@@ -3002,18 +3084,19 @@ msgstr ""
#: templates/web/default/report/new/councils_text_some.html:11
#: templates/web/default/report/new/fill_in_details_form.html:17
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:12
+#: templates/web/zurich/report/new/fill_in_details_form.html:12
msgid ""
"The subject and details of the problem will be public, plus your name if you "
"give us permission."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:269
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:271
msgid ""
"The user could not locate the problem on a map, but to see the area around "
"the location they entered"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Reports.pm:72
+#: perllib/FixMyStreet/App/Controller/Reports.pm:71
msgid ""
"There was a problem showing the All Reports page. Please try again later."
msgstr ""
@@ -3022,8 +3105,8 @@ msgstr ""
msgid "There was a problem showing this page. Please try again later."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:733
-#: perllib/FixMyStreet/App/Controller/Report/Update.pm:130
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:736
+#: perllib/FixMyStreet/App/Controller/Report/Update.pm:134
#: templates/web/default/auth/general.html:23
#: templates/web/fixmystreet/auth/general.html:24
msgid ""
@@ -3037,7 +3120,7 @@ msgid ""
"There was a problem with your email/password combination. Please try again."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/Update.pm:252
+#: perllib/FixMyStreet/App/Controller/Report/Update.pm:256
msgid "There was a problem with your update. Please try again."
msgstr ""
@@ -3045,7 +3128,7 @@ msgstr ""
msgid "There were problems with your report. Please see below."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/Update.pm:279
+#: perllib/FixMyStreet/App/Controller/Report/Update.pm:283
msgid "There were problems with your update. Please see below."
msgstr ""
@@ -3055,7 +3138,7 @@ msgid ""
"change without warnings in the future."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:339
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:341
msgid ""
"This email has been sent to both councils covering the location of the "
"problem, as the user did not categorise it; please ignore it if you're not "
@@ -3063,15 +3146,15 @@ msgid ""
"problem this is so we can add it to our system."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:342
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:344
msgid ""
"This email has been sent to several councils covering the location of the "
"problem, as the category selected is provided for all of them; please ignore "
"it if you're not the correct council to deal with the issue."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:865
-#: perllib/FixMyStreet/Cobrand/UK.pm:62
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:868
+#: perllib/FixMyStreet/Cobrand/UK.pm:54
msgid "This information is required"
msgstr "Diese Information wird ben&ouml;tigt"
@@ -3081,14 +3164,20 @@ msgid ""
"will be periodically deleted."
msgstr ""
-#: templates/web/emptyhomes/reports/council.html:58
+#: templates/web/emptyhomes/reports/body.html:58
msgid "This is a summary of all reports for one %s."
msgstr ""
-#: templates/web/emptyhomes/reports/council.html:60
+#: templates/web/emptyhomes/reports/body.html:60
msgid "This is a summary of all reports for this %s."
msgstr ""
+#: templates/web/fixmybarangay/reports/index.html:7
+msgid ""
+"This is a summary of all reports on this site; select a particular barangay "
+"to see the reports sent there."
+msgstr ""
+
#: templates/web/default/reports/index.html:7
#: templates/web/emptyhomes/reports/index.html:4
#: templates/web/fiksgatami/nn/reports/index.html:4
@@ -3104,15 +3193,15 @@ msgstr ""
#: templates/web/bromley/report/display.html:96
#: templates/web/default/report/banner.html:12
-#: templates/web/default/report/display.html:95
+#: templates/web/default/report/update-form.html:46
#: templates/web/emptyhomes/report/display.html:12
-#: templates/web/fixmystreet/report/display.html:90
+#: templates/web/fixmystreet/report/update-form.html:44
msgid "This problem has been fixed"
msgstr "Dieser Mangel wurde behoben"
#: templates/web/bromley/report/display.html:90
-#: templates/web/default/report/display.html:90
-#: templates/web/fixmystreet/report/display.html:84
+#: templates/web/default/report/update-form.html:41
+#: templates/web/fixmystreet/report/update-form.html:38
msgid "This problem has not been fixed"
msgstr "Dieser Mangel wurde nicht behoben"
@@ -3124,24 +3213,24 @@ msgstr "Dieser Mangel ist in Bearbeitung"
msgid "This problem is old and of unknown status."
msgstr "Dieses Problem ist alt und hat einen unbekannten Status"
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:83
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:86
msgid "This report is currently marked as closed."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:81
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:84
msgid "This report is currently marked as fixed."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:85
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:88
msgid "This report is currently marked as open."
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:262
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:264
msgid ""
"This web page also contains a photo of the problem, provided by the user."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1024
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1034
#: templates/web/default/admin/timeline.html:1
msgid "Timeline"
msgstr ""
@@ -3151,7 +3240,7 @@ msgstr ""
msgid "Title"
msgstr "Titel"
-#: templates/web/default/around/display_location.html:69
+#: templates/web/default/around/_report_banner.html:2
msgid ""
"To <strong>report a problem</strong>, click on the map at the correct "
"location."
@@ -3170,7 +3259,7 @@ msgid ""
"street name and area"
msgstr "Geben Sie eine Adresse an"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:268
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:270
msgid "To view a map of the precise location of this issue"
msgstr ""
@@ -3181,7 +3270,7 @@ msgstr ""
msgid "Total"
msgstr "Total"
-#: perllib/FixMyStreet/App/Controller/Reports.pm:43
+#: perllib/FixMyStreet/App/Controller/Reports.pm:42
msgid "Unable to look up areas in MaPit. Please try again later."
msgstr ""
@@ -3195,16 +3284,16 @@ msgstr "Unbest&auml;tigt"
msgid "Unknown"
msgstr "Unbekannt"
-#: perllib/FixMyStreet/App/Controller/Rss.pm:164
+#: perllib/FixMyStreet/App/Controller/Rss.pm:173
msgid "Unknown alert type"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report.pm:70
+#: perllib/FixMyStreet/App/Controller/Report.pm:87
msgid "Unknown problem ID"
msgstr ""
#: templates/web/bromley/report/display.html:66
-#: templates/web/fixmystreet/report/display.html:65
+#: templates/web/fixmystreet/report/update-form.html:19
msgid "Update"
msgstr "Beschreibung"
@@ -3242,17 +3331,17 @@ msgstr ""
msgid "Update reopened problem"
msgstr ""
-#: templates/web/default/admin/council_contacts.html:62
+#: templates/web/default/admin/council_contacts.html:68
msgid "Update statuses"
msgstr ""
-#: templates/web/default/report/display.html:71
+#: templates/web/default/report/update-form.html:22
msgid "Update:"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:694
-#: perllib/FixMyStreet/App/Controller/Admin.pm:809
-#: perllib/FixMyStreet/App/Controller/Admin.pm:889
+#: perllib/FixMyStreet/App/Controller/Admin.pm:708
+#: perllib/FixMyStreet/App/Controller/Admin.pm:839
+#: perllib/FixMyStreet/App/Controller/Admin.pm:899
msgid "Updated!"
msgstr ""
@@ -3275,20 +3364,21 @@ msgstr ""
msgid "Updates to this problem, FixMyStreet"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1182
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1191
msgid "User flag removed"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1154
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1163
msgid "User flagged"
msgstr ""
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1036
#: templates/web/default/admin/list_flagged.html:30
msgid "Users"
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Admin.pm:309
-#: perllib/FixMyStreet/App/Controller/Admin.pm:339
+#: perllib/FixMyStreet/App/Controller/Admin.pm:315
+#: perllib/FixMyStreet/App/Controller/Admin.pm:345
msgid "Values updated"
msgstr ""
@@ -3297,7 +3387,7 @@ msgstr ""
msgid "View report on site"
msgstr ""
-#: templates/web/default/reports/council.html:18
+#: templates/web/default/reports/body.html:18
msgid "View reports by ward"
msgstr ""
@@ -3309,20 +3399,19 @@ msgstr ""
#: templates/web/default/around/display_location.html:33
#: templates/web/emptyhomes/around/display_location.html:0
#: templates/web/emptyhomes/around/display_location.html:16
-#: templates/web/fixmystreet/around/display_location.html:0
-#: templates/web/fixmystreet/around/display_location.html:33
msgid "Viewing a location"
msgstr ""
#: templates/web/bromley/report/display.html:0
#: templates/web/default/report/display.html:0
+#: templates/web/emptyhomes/report/display.html:1
#: templates/web/emptyhomes/report/display.html:2
#: templates/web/fixmystreet/report/display.html:0
msgid "Viewing a problem"
msgstr ""
-#: templates/web/default/reports/council.html:20
-#: templates/web/emptyhomes/reports/council.html:18
+#: templates/web/default/reports/body.html:20
+#: templates/web/emptyhomes/reports/body.html:18
msgid "Wards of this council"
msgstr ""
@@ -3346,47 +3435,47 @@ msgid ""
msgstr ""
#: templates/web/bromley/report/display.html:141
-#: templates/web/fixmystreet/report/display.html:153
+#: templates/web/fixmystreet/report/update-form.html:113
msgid "We never show your email"
-msgstr "Ihre eMail wird nie angezeigt"
+msgstr "Ihr E-Mail wird nie angezeigt"
#: templates/web/bromley/report/new/fill_in_details_form.html:133
#: templates/web/bromley/report/new/fill_in_details_form.html:179
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:130
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:190
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:144
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:211
+#: templates/web/zurich/report/new/fill_in_details_form.html:114
msgid "We never show your email address or phone number."
-msgstr "Ihre eMail-Adresse oder Telefonnummer werden nie angezeigt"
+msgstr "Ihre E-Mail Adresse oder Telefonnummer werden nie angezeigt"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:349
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:351
msgid ""
"We realise this problem might be the responsibility of %s; however, we don't "
"currently have any contact details for them. If you know of an appropriate "
"contact address, please do get in touch."
msgstr ""
-#: templates/web/default/index.html:34 templates/web/emptyhomes/index.html:59
-#: templates/web/fixmystreet/index.html:45
+#: templates/web/default/index-steps.html:16
+#: templates/web/emptyhomes/index.html:59
msgid "We send it to the council on your behalf"
msgstr ""
#: templates/web/bromley/report/new/fill_in_details_form.html:217
#: templates/web/default/report/new/notes.html:5
-#, fuzzy
+#: templates/web/fixmybarangay/report/new/notes.html:5
msgid ""
"We will only use your personal information in accordance with our <a href=\"/"
"faq#privacy\">privacy policy.</a>"
msgstr ""
-"Wir verwenden Ihre pers&ouml;nlichen Daten nur entsprechend unserer <a "
-"href=\"/faq#privacy\">Datenschutzrichtlinien.</a>"
+"Wir verwenden Ihre pers&ouml;nlichen Daten nur entsprechend unserer <a href="
+"\"/faq#privacy\">Datenschutzrichtlinien.</a>"
#: templates/web/fixmystreet/report/new/notes.html:4
-#, fuzzy
msgid ""
"We will only use your personal information in accordance with our <a href=\"/"
"privacy\">privacy policy.</a>"
msgstr ""
-"Wir verwenden Ihre pers&ouml;nlichen Daten nur entsprechend unserer <a "
-"href=\"/faq#privacy\">Datenschutzrichtlinien.</a>"
+"Ihre pers&ouml;nlichen Angaben werden nur f&uuml;r interne Zwecke verwendet "
+"und nicht ver&ouml;ffentlicht."
#: templates/web/emptyhomes/contact/blurb.html:2
msgid ""
@@ -3401,8 +3490,8 @@ msgid ""
"send an email to <a href='mailto:%s'>%s</a>:"
msgstr ""
-#: templates/web/default/admin/council_contacts.html:41
-#: templates/web/default/admin/council_edit.html:41
+#: templates/web/default/admin/council_contacts.html:45
+#: templates/web/default/admin/council_edit.html:69
msgid "When edited"
msgstr "Wann editiert"
@@ -3411,7 +3500,7 @@ msgstr "Wann editiert"
msgid "When sent"
msgstr "Wann gesendet"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:612
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:611
msgid "Whole block of empty flats"
msgstr ""
@@ -3423,6 +3512,7 @@ msgid ""
msgstr ""
#: templates/web/fixmystreet/footer.html:22
+#: templates/web/stevenage/footer.html:22
msgid ""
"Would you like better integration with FixMyStreet? <a href=\"http://www."
"mysociety.org/for-councils/fixmystreet/\">Find out about FixMyStreet for "
@@ -3430,6 +3520,7 @@ msgid ""
msgstr ""
#: templates/web/fixmystreet/footer.html:18
+#: templates/web/stevenage/footer.html:18
msgid ""
"Would you like to contribute to FixMyStreet? Our code is open source and <a "
"href=\"http://github.com/mysociety/fixmystreet\">available on GitHub</a>."
@@ -3443,6 +3534,7 @@ msgid ""
msgstr ""
#: templates/web/default/report/new/notes.html:8
+#: templates/web/fixmybarangay/report/new/notes.html:8
#: templates/web/fixmystreet/report/new/notes.html:7
msgid ""
"Writing your message entirely in block capitals makes it hard to read, as "
@@ -3455,8 +3547,9 @@ msgstr ""
msgid "Year"
msgstr "Jahr"
-#: templates/web/default/admin/council_contacts.html:48
-#: templates/web/default/admin/council_contacts.html:49
+#: templates/web/default/admin/council_contacts.html:52
+#: templates/web/default/admin/council_contacts.html:53
+#: templates/web/default/admin/council_contacts.html:54
#: templates/web/default/admin/council_edit.html:5
#: templates/web/default/admin/list_updates.html:30
#: templates/web/default/admin/list_updates.html:31
@@ -3476,8 +3569,8 @@ msgstr "Ja"
#: templates/web/bromley/report/display.html:155
#: templates/web/bromley/report/new/fill_in_details_form.html:198
-#: templates/web/fixmystreet/report/display.html:133
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:156
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:171
+#: templates/web/fixmystreet/report/update-form.html:87
msgid "Yes I have a password"
msgstr ""
@@ -3495,13 +3588,13 @@ msgid ""
"personal information, or similar:"
msgstr ""
-#: templates/web/emptyhomes/reports/council.html:64
+#: templates/web/emptyhomes/reports/body.html:64
msgid ""
"You can <a href=\"%s\">view all reports for the council</a> or <a href=\"/"
"reports\">show all councils</a>."
msgstr ""
-#: templates/web/emptyhomes/reports/council.html:66
+#: templates/web/emptyhomes/reports/body.html:66
msgid "You can <a href=\"/reports\">show all councils</a>."
msgstr ""
@@ -3524,34 +3617,36 @@ msgstr ""
#: templates/web/default/questionnaire/index.html:92
#: templates/web/default/report/new/fill_in_details_form.html:93
#: templates/web/fixmystreet/questionnaire/index.html:87
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:101
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:99
+#: templates/web/zurich/report/new/fill_in_details_form.html:93
msgid ""
"You have already attached a photo to this report, attaching another one will "
"replace it."
msgstr ""
#: templates/web/bromley/report/display.html:106
-#: templates/web/default/report/display.html:106
-#: templates/web/fixmystreet/report/display.html:100
+#: templates/web/default/report/update-form.html:57
+#: templates/web/fixmystreet/report/update-form.html:54
msgid ""
"You have already attached a photo to this update, attaching another one will "
"replace it."
msgstr ""
#: templates/web/default/auth/sign_out.html:3
+#: templates/web/fixmybarangay/auth/sign_out.html:3
msgid "You have been signed out"
msgstr ""
#: templates/web/bromley/report/new/fill_in_details_form.html:25
#: templates/web/default/report/new/fill_in_details_form.html:7
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:27
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:28
+#: templates/web/zurich/report/new/fill_in_details_form.html:28
msgid ""
"You have located the problem at the point marked with a green pin on the "
"map. If this is not the correct location, simply click on the map again. "
msgstr ""
-"Der gr&uml;ne Pin auf der Karte repr&auml;sentiert ihre Meldung. Falls "
-"dieser Ort nicht der Richtige ist, klicken Sie einfach nochmals am richtigen "
-"Ort auf die Karte."
+"Der gr&uuml;ne lokalisiert Ihre Meldung auf der Karte. Falls dieser Ort "
+"nicht stimmt, kann der Pin verschoben werden."
#: templates/web/default/tokens/confirm_alert.html:7
msgid "You have successfully confirmed your alert."
@@ -3577,8 +3672,8 @@ msgstr ""
msgid "You have successfully deleted your alert."
msgstr ""
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:740
-#: perllib/FixMyStreet/App/Controller/Report/Update.pm:136
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:743
+#: perllib/FixMyStreet/App/Controller/Report/Update.pm:140
msgid ""
"You have successfully signed in; please check and confirm your details are "
"accurate:"
@@ -3608,27 +3703,30 @@ msgstr ""
#: templates/web/fixmystreet/alert/updates.html:19
#: templates/web/fixmystreet/alert/updates.html:22
#: templates/web/fixmystreet/contact/index.html:72
-#: templates/web/fixmystreet/report/display.html:34
-#: templates/web/fixmystreet/report/display.html:36
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:142
+#: templates/web/fixmystreet/report/display.html:53
+#: templates/web/fixmystreet/report/display.html:55
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:115
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:157
+#: templates/web/zurich/report/new/fill_in_details_form.html:106
msgid "Your email"
-msgstr "Ihre eMail"
+msgstr "Ihre E-Mail Adresse"
#: templates/web/bromley/report/display.html:130
#: templates/web/fixmystreet/auth/general.html:26
-#: templates/web/fixmystreet/report/display.html:124
+#: templates/web/fixmystreet/report/update-form.html:78
msgid "Your email address"
-msgstr "Ihre eMail-Adresse"
+msgstr "Ihre E-Mail Adresse"
#: templates/web/default/auth/general.html:27
msgid "Your email address:"
-msgstr "Ihre eMail-Adresse:"
+msgstr "Ihre E-Mail Adresse:"
#: templates/web/default/alert/_list.html:92
-#: templates/web/default/report/display.html:128
#: templates/web/default/report/new/fill_in_details_form.html:124
+#: templates/web/default/report/update-form.html:79
+#: templates/web/fixmybarangay/alert/_list.html:37
msgid "Your email:"
-msgstr "Ihre eMail:"
+msgstr "Ihre E-Mail:"
#: templates/web/bromley/report/display.html:193
#: templates/web/bromley/report/new/fill_in_details_form.html:117
@@ -3643,8 +3741,8 @@ msgid ""
"Your information will only be used in accordance with our <a href=\"/privacy"
"\">privacy policy</a>"
msgstr ""
-"Wir verwenden Ihre pers&ouml;nlichen Daten nur entsprechend unserer <a "
-"href=\"/faq#privacy\">Datenschutzrichtlinien.</a>"
+"Wir verwenden Ihre pers&ouml;nlichen Daten nur entsprechend unserer <a href="
+"\"/faq#privacy\">Datenschutzrichtlinien.</a>"
#: templates/web/bromley/report/display.html:199
#: templates/web/bromley/report/new/fill_in_details_form.html:123
@@ -3653,26 +3751,27 @@ msgstr ""
msgid "Your last name"
msgstr "Ihr Name"
-#: templates/web/fixmystreet/auth/general.html:53
+#: templates/web/fixmystreet/auth/general.html:57
#: templates/web/fixmystreet/contact/index.html:65
-#: templates/web/fixmystreet/report/display.html:181
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:121
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:181
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:124
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:202
+#: templates/web/fixmystreet/report/update-form.html:138
+#: templates/web/zurich/report/new/fill_in_details_form.html:122
msgid "Your name"
msgstr "Ihr Name"
#: templates/web/default/auth/general.html:59
#: templates/web/default/contact/index.html:68
-#: templates/web/default/report/display.html:202
#: templates/web/default/report/new/fill_in_details_form.html:203
+#: templates/web/default/report/update-form.html:149
msgid "Your name:"
msgstr "Ihr Name:"
#: templates/web/bromley/report/display.html:160
#: templates/web/bromley/report/new/fill_in_details_form.html:203
-#: templates/web/fixmystreet/auth/general.html:37
-#: templates/web/fixmystreet/report/display.html:138
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:161
+#: templates/web/fixmystreet/auth/general.html:41
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:176
+#: templates/web/fixmystreet/report/update-form.html:92
msgid "Your password"
msgstr "Ihr Passwort"
@@ -3682,8 +3781,9 @@ msgstr "Ihr Passwort wurde ge&auml;ndert"
#: templates/web/bromley/report/new/fill_in_details_form.html:137
#: templates/web/bromley/report/new/fill_in_details_form.html:184
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:134
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:195
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:149
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:216
+#: templates/web/zurich/report/new/fill_in_details_form.html:125
msgid "Your phone number"
msgstr "Ihre Telefonnummer"
@@ -3696,36 +3796,39 @@ msgstr "Ihre Meldung"
#: templates/web/fiksgatami/footer.html:6
#: templates/web/fiksgatami/nn/footer.html:6
#: templates/web/fixmystreet/footer.html:47
-#: templates/web/reading/footer.html:7
+#: templates/web/reading/footer.html:7 templates/web/stevenage/footer.html:41
msgid "Your reports"
msgstr "Ihre Meldungen"
-#: templates/web/default/my/my.html:45 templates/web/fixmystreet/my/my.html:45
+#: templates/web/default/my/my.html:45 templates/web/fixmystreet/my/my.html:49
msgid "Your updates"
msgstr ""
#: templates/web/default/contact/index.html:76
-#, fuzzy
msgid "Your&nbsp;email:"
-msgstr "Ihre eMail:"
+msgstr "Ihre E-Mail Adresse:"
#: templates/web/default/admin/timeline.html:6
msgid "by %s"
msgstr ""
-#: templates/web/default/reports/council.html:12
-#: templates/web/default/reports/council.html:13
-#: templates/web/emptyhomes/reports/council.html:6
-#: templates/web/emptyhomes/reports/council.html:7
+#: templates/web/default/reports/body.html:12
+#: templates/web/default/reports/body.html:13
+#: templates/web/emptyhomes/reports/body.html:6
+#: templates/web/emptyhomes/reports/body.html:7
msgid "council"
msgstr ""
+#: perllib/FixMyStreet/DB/Result/Problem.pm:608
+msgid "council ref:&nbsp;%s"
+msgstr ""
+
#: templates/web/default/admin/report_edit.html:15
msgid "didn't use map"
msgstr "hat Karte nicht verwendet"
#: templates/web/default/alert/index.html:33
-#: templates/web/fixmystreet/around/postcode_form.html:17
+#: templates/web/fixmystreet/around/postcode_form.html:20
msgid "e.g. ‘%s’ or ‘%s’"
msgstr ""
@@ -3733,7 +3836,7 @@ msgstr ""
msgid "from %d different users"
msgstr ""
-#: perllib/Utils.pm:289
+#: perllib/Utils.pm:267
msgid "less than a minute"
msgstr "weniger als einer Minute"
@@ -3745,17 +3848,22 @@ msgstr ""
msgid "marked as fixed"
msgstr "als gel&ouml;st markiert"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:112
+#: perllib/FixMyStreet/App/Controller/Admin.pm:113
#: templates/web/default/admin/questionnaire.html:15
#: templates/web/default/admin/questionnaire.html:16
msgid "n/a"
msgstr ""
#: templates/web/default/alert/_list.html:87
+#: templates/web/fixmybarangay/alert/_list.html:32
#: templates/web/fixmystreet/alert/_list.html:85
msgid "or"
msgstr "oder"
+#: templates/web/default/js/validation_strings.html:21
+msgid "or locate me automatically"
+msgstr "oder automatisch lokalisieren"
+
#: templates/web/default/admin/report_edit.html:15
msgid "originally entered"
msgstr ""
@@ -3770,9 +3878,9 @@ msgstr ""
#: templates/web/barnet/header.html:71 templates/web/bromley/header.html:100
#: templates/web/bromley/header.html:65
-#: templates/web/fixmybarangay/header.html.orig:43
-#: templates/web/fixmystreet/header.html:48
-#: templates/web/zurich/header.html:48
+#: templates/web/fixmybarangay/header.html:65
+#: templates/web/fixmystreet/header.html:50
+#: templates/web/stevenage/header.html:98 templates/web/zurich/header.html:48
msgid "sign out"
msgstr "ausloggen"
@@ -3782,24 +3890,20 @@ msgstr "ausloggen"
#: templates/web/default/report/new/fill_in_details_form.html:14
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:6
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:9
+#: templates/web/zurich/report/new/fill_in_details_form.html:6
+#: templates/web/zurich/report/new/fill_in_details_form.html:9
msgid "the local council"
msgstr ""
-#: perllib/FixMyStreet/DB/Result/Problem.pm:541
-msgid "the map was not used so pin location may be inaccurate"
-msgstr ""
-"Die Karte wurde nicht verwendet und die Stecknadel k&ouml;nnte demnach "
-"ungenau sein"
-
-#: perllib/FixMyStreet/DB/Result/Problem.pm:603
-msgid "their ref:&nbsp;%s"
+#: templates/web/default/report/_main.html:6
+msgid "there is no pin shown as the user did not use the map"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:330
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:332
msgid "this type of local problem"
msgstr ""
-#: perllib/Utils.pm:263
+#: perllib/Utils.pm:241
msgid "today"
msgstr "heute"
@@ -3815,10 +3919,10 @@ msgstr ""
msgid "user is problem owner"
msgstr ""
-#: templates/web/default/reports/council.html:0
-#: templates/web/default/reports/council.html:9
-#: templates/web/emptyhomes/reports/council.html:0
-#: templates/web/emptyhomes/reports/council.html:3
+#: templates/web/default/reports/body.html:0
+#: templates/web/default/reports/body.html:9
+#: templates/web/emptyhomes/reports/body.html:0
+#: templates/web/emptyhomes/reports/body.html:3
msgid "ward"
msgstr ""
@@ -3852,6 +3956,34 @@ msgstr ""
msgid "your update will not be posted"
msgstr ""
+#: templates/web/emptyhomes/front/stats.html:17
+#, perl-format
+msgid "<big>%s</big> report recently"
+msgid_plural "<big>%s</big> reports recently"
+msgstr[0] ""
+msgstr[1] ""
+
+#: perllib/Utils.pm:286
+#, perl-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d Stunde"
+msgstr[1] "%d Stunden"
+
+#: perllib/Utils.pm:288
+#, perl-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d Minute"
+msgstr[1] "%d Minuten"
+
+#: templates/web/default/front/stats.html:29
+#, perl-format
+msgid "<big>%s</big> update on reports"
+msgid_plural "<big>%s</big> updates on reports"
+msgstr[0] "<big>%s</big> Meldung bearbeitet"
+msgstr[1] "<big>%s</big> Meldungen bearbeitet"
+
#: templates/web/emptyhomes/report/new/councils_text_none.html:3
#, perl-format
msgid "We do not yet have details for the council that covers this location."
@@ -3859,12 +3991,12 @@ msgid_plural ""
"We do not yet have details for the councils that cover this location."
msgstr[0] ""
-#: templates/web/emptyhomes/front/stats.html:17
+#: perllib/Utils.pm:282
#, perl-format
-msgid "<big>%s</big> report recently"
-msgid_plural "<big>%s</big> reports recently"
-msgstr[0] ""
-msgstr[1] ""
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] "%d Woche"
+msgstr[1] "%d Wochen"
#: templates/web/emptyhomes/front/stats.html:12
#, perl-format
@@ -3877,8 +4009,8 @@ msgstr[1] "<big>%s</big> Meldungen in der letzten Woche"
#, perl-format
msgid "<big>%s</big> fixed in past month"
msgid_plural "<big>%s</big> fixed in past month"
-msgstr[0] "<big>%s</big> im letzten Monat behoben"
-msgstr[1] "<big>%s</big> im letzten Monat gehoben"
+msgstr[0] "<big>%s</big> bearbeiteter Mangel im letzten Monat"
+msgstr[1] "<big>%s</big> bearbeitete M&auml;ngel im letzten Monat"
#: templates/web/default/report/new/councils_text_some.html:14
#, perl-format
@@ -3891,9 +4023,17 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: templates/web/default/front/stats.html:29
+#: perllib/Utils.pm:284
#, perl-format
-msgid "<big>%s</big> update on reports"
-msgid_plural "<big>%s</big> updates on reports"
-msgstr[0] "<big>%s</big> Meldung bearbeitet"
-msgstr[1] "<big>%s</big> Meldungen bearbeitet"
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] "%d Tag"
+msgstr[1] "%d Tage"
+
+#~ msgid "All"
+#~ msgstr "Alle"
+
+#~ msgid "the map was not used so pin location may be inaccurate"
+#~ msgstr ""
+#~ "Die Karte wurde nicht verwendet und die Stecknadel k&ouml;nnte demnach "
+#~ "ungenau sein"
diff --git a/locale/nb_NO.UTF-8/LC_MESSAGES/FixMyStreet.po b/locale/nb_NO.UTF-8/LC_MESSAGES/FixMyStreet.po
index 58b307d58..db0887cd7 100644
--- a/locale/nb_NO.UTF-8/LC_MESSAGES/FixMyStreet.po
+++ b/locale/nb_NO.UTF-8/LC_MESSAGES/FixMyStreet.po
@@ -5,23 +5,25 @@
#
# Matthew Somerville <matthew@mysociety.org>, 2008-04-15.
# Petter Reinholdtsen <pere@hungry.com>, 2011.
+# Anders Einar Hilden <hildenae@gmail.com>, 2012.
msgid ""
msgstr ""
"Project-Id-Version: FixMyStreet\n"
"Report-Msgid-Bugs-To: matthew@mysociety.org\n"
-"POT-Creation-Date: 2012-08-21 09:54+0100\n"
-"PO-Revision-Date: 2012-08-07 01:09+0100\n"
+"POT-Creation-Date: 2012-12-10 13:18+0000\n"
+"PO-Revision-Date: 2012-09-14 00:22+0100\n"
"Last-Translator: Anders Einar Hilden <hildenae@gmail.com>\n"
"Language-Team: Norwegian Bokmål <i18n-nb@lister.ping.uio.no>\n"
-"Language: \n"
+"Language: Norwegian Bokmål\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: KBabel 1.11.4\n"
+"X-Poedit-Basepath: ../../../\n"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:555
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:337
+#: perllib/FixMyStreet/DB/Result/Problem.pm:560
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:339
msgid " and "
msgstr " og "
@@ -54,86 +56,55 @@ msgstr "%d bekreftede varsler, %d ubekreftede"
msgid "%d council contacts &ndash; %d confirmed, %d unconfirmed"
msgstr "%d administrasjonskontakter &ndash; %d bekreftet, %d ubekreftet"
-#: perllib/Utils.pm:293
-msgid "%d day"
-msgstr "%d dag"
-
-#: perllib/Utils.pm:293
-msgid "%d days"
-msgstr "%d dager"
-
#: templates/web/default/admin/council_list.html:27
msgid "%d edits by %s"
msgstr "%d redigeringer av %s"
-#: perllib/Utils.pm:294
-msgid "%d hour"
-msgstr "%d time"
-
-#: perllib/Utils.pm:294
-msgid "%d hours"
-msgstr "%d timer"
-
#: templates/web/default/admin/index.html:16
msgid "%d live updates"
msgstr "%d aktive oppdateringer"
-#: perllib/Utils.pm:295
-msgid "%d minute"
-msgstr "%d minutt"
-
-#: perllib/Utils.pm:295
-msgid "%d minutes"
-msgstr "%d minutter"
-
#: templates/web/default/admin/index.html:18
msgid "%d questionnaires sent &ndash; %d answered (%s%%)"
msgstr "%d spørreskjema sendt &ndash; %d besvart (%s%%)"
-#: perllib/Utils.pm:292
-msgid "%d week"
-msgstr "%d uke"
-
-#: perllib/Utils.pm:292
-msgid "%d weeks"
-msgstr "%d uker"
+#: templates/web/default/report/_support.html:3
+msgid "%d supporters"
+msgstr ""
-#: templates/web/default/reports/council.html:0
-#: templates/web/default/reports/council.html:26
-#: templates/web/emptyhomes/reports/council.html:11
-#: templates/web/emptyhomes/reports/council.html:13
+#: templates/web/default/reports/body.html:0
+#: templates/web/default/reports/body.html:26
+#: templates/web/emptyhomes/reports/body.html:11
+#: templates/web/emptyhomes/reports/body.html:13
msgid "%s - Summary reports"
msgstr "%s - oppsummeringsrapporter"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:605
+#: perllib/FixMyStreet/DB/Result/Problem.pm:610
msgid "%s ref:&nbsp;%s"
-msgstr ""
+msgstr "%s ref:&nbsp;%s"
-#: perllib/FixMyStreet/Cobrand/UK.pm:288 perllib/FixMyStreet/Cobrand/UK.pm:300
+#: perllib/FixMyStreet/Cobrand/UK.pm:279 perllib/FixMyStreet/Cobrand/UK.pm:291
msgid "%s ward, %s"
msgstr "%s bydel, %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:488
+#: perllib/FixMyStreet/DB/Result/Problem.pm:496
msgid "%s, reported anonymously at %s"
msgstr "%s, rapportert anonymt %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:490
+#: perllib/FixMyStreet/DB/Result/Problem.pm:498
msgid "%s, reported by %s at %s"
msgstr "%s, rapportert av %s %s"
-#: perllib/FixMyStreet/Cobrand/UK.pm:315 perllib/FixMyStreet/Cobrand/UK.pm:327
+#: perllib/FixMyStreet/Cobrand/UK.pm:306 perllib/FixMyStreet/Cobrand/UK.pm:318
msgid "%s, within %s ward"
msgstr "%s, innefor bydel %s"
-#: templates/web/default/admin/stats.html:5
-msgid "%sreports between %s and %s"
-msgstr "%srapporter mellom %s og %s"
-
#: templates/web/default/email_sent.html:28
msgid "(Don't worry &mdash; %s)"
msgstr "(Ingen grunn til bekymring &mdash; %s)"
#: templates/web/default/admin/report_blocks.html:11
+#: templates/web/default/admin/search_users.html:23
msgid "(Email in abuse table)"
msgstr "(Epost i misbrukstabellen)"
@@ -150,9 +121,8 @@ msgstr "(alternativt kan RSS-strømmen tilpasses, innenfor"
#: templates/web/default/around/around_map_list_items.html:12
#: templates/web/default/around/on_map_list_items.html:9
#: templates/web/fixmystreet/report/_item.html:23
-#, fuzzy
msgid "(closed)"
-msgstr "Lukket"
+msgstr "(lukket)"
#: templates/web/default/around/around_map_list_items.html:10
#: templates/web/default/around/on_map_list_items.html:7
@@ -161,7 +131,7 @@ msgid "(fixed)"
msgstr "(løst)"
#: templates/web/default/index.html:12 templates/web/default/index.html:8
-#: templates/web/fixmystreet/around/postcode_form.html:7
+#: templates/web/fixmystreet/around/intro.html:2
msgid "(like graffiti, fly tipping, broken paving slabs, or street lighting)"
msgstr "(som tagging, søppel, hull i veien, eller ødelagte gatelys)"
@@ -171,6 +141,7 @@ msgid "(not sent to council)"
msgstr "(ikke rapportert til administrasjonen)"
#: templates/web/default/report/new/fill_in_details_form.html:217
+#: templates/web/zurich/report/new/fill_in_details_form.html:118
msgid "(optional)"
msgstr "(valgfritt)"
@@ -184,31 +155,34 @@ msgstr "(sendt til begge)"
msgid "(we never show your email address or phone number)"
msgstr "(vi viser aldri din e-postadresse eller telefonnummer)"
-#: templates/web/default/report/display.html:209
+#: templates/web/default/report/update-form.html:156
msgid "(we never show your email)"
msgstr "(vi viser aldri din e-postadresse)"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:284
+#: perllib/FixMyStreet/App/Controller/Admin.pm:285
msgid "*unknown*"
msgstr "*ukjent*"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:629
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:655
-#: perllib/FixMyStreet/DB/Result/Problem.pm:345
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:628
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:656
+#: perllib/FixMyStreet/DB/Result/Problem.pm:353
msgid "-- Pick a category --"
msgstr "-- Velg en kategori --"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:609
-#: perllib/FixMyStreet/DB/Result/Problem.pm:351
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:608
+#: perllib/FixMyStreet/DB/Result/Problem.pm:359
msgid "-- Pick a property type --"
msgstr "-- Velg en eiendomsstype --"
-# Bør "portalen" byttes ut med et annet ord? (trenger kontekst)
+# Trenger kontekst for bedre oversettelse
#: templates/web/default/tokens/confirm_problem.html:14
#: templates/web/default/tokens/confirm_problem.html:22
-#, fuzzy
msgid ". You can <a href=\"%s%s\">view the problem on this site</a>."
-msgstr ". Du kan <a href=\"%s\">lese om problemet på portalen </a>."
+msgstr ". Du kan <a href=\"%s\">lese om problemet på denne siden</a>."
+
+#: templates/web/default/report/_support.html:3
+msgid "1 supporter"
+msgstr ""
#: templates/web/default/questionnaire/completed.html:20
msgid ""
@@ -218,8 +192,8 @@ msgstr ""
"<p style=\"font-size:150%\">Tusen takk for at du fylte ut vårt spørreskjema. "
"Vi er glad for å høre at ditt problem er blitt fikset.</p>"
+# Er pledgebank noe vi vil sende uvitende, norske innbyggere til?
#: templates/web/fiksgatami/questionnaire/completed-open.html:1
-#, fuzzy
msgid ""
"<p style=\"font-size:150%\">We&rsquo;re sorry to hear that. We have two\n"
"suggestions: why not try <a href=\"http://www.norge.no/styresmakter/"
@@ -229,15 +203,14 @@ msgid ""
"<a href=\"http://www.pledgebank.com/new\">make and publicise a pledge</a>?\n"
"</p>"
msgstr ""
-"<p style=\"font-size:150%%\">Det var trist å høre dette. Vi har to forslag: "
+"<p style=\"font-size:150%\">Det var trist å høre dette. Vi har to forslag: "
"hva med å forsøke\n"
-"<a href=\"%s\">å skrive direkte til dine representanter</a>, eller hvis det "
-"er et problem som kan fikses\n"
+"<a href=\"http://www.norge.no/styresmakter/\">å skrive direkte til dine \n"
+"representanter</a>, eller hvis det er et problem som kan fikses\n"
"av folk i nabolaget som jobber sammen, hva med å <a href=\"http://www."
"pledgebank.com/new\">publisere en utfordring om å bidra</a>?</p>"
-#: templates/web/fixmystreet/questionnaire/completed-open.html:1
-#, fuzzy
+#: templates/web/fixmystreet/questionnaire/completed-open.html:6
msgid ""
"<p style=\"font-size:150%\">We&rsquo;re sorry to hear that. We have two\n"
"suggestions: why not try <a href=\"http://www.writetothem.com/\">writing "
@@ -248,15 +221,14 @@ msgid ""
"<a href=\"http://www.pledgebank.com/new\">make and publicise a pledge</a>?\n"
"</p>"
msgstr ""
-"<p style=\"font-size:150%%\">Det var trist å høre dette. Vi har to forslag: "
+"<p style=\"font-size:150%\">Det var trist å høre dette. Vi har to forslag: "
"hva med å forsøke\n"
"<a href=\"%s\">å skrive direkte til dine representanter</a>, eller hvis det "
"er et problem som kan fikses\n"
"av folk i nabolaget som jobber sammen, hva med å <a href=\"http://www."
"pledgebank.com/new\">publisere en utfordring om å bidra</a>?</p>"
-#: templates/web/default/questionnaire/completed-open.html:1
-#, fuzzy
+#: templates/web/default/questionnaire/completed-open.html:6
msgid ""
"<p style=\"font-size:150%\">We&rsquo;re sorry to hear that. We have two\n"
"suggestions: why not try writing to your local representative or, if "
@@ -267,8 +239,8 @@ msgid ""
msgstr ""
"<p style=\"font-size:150%%\">Det var trist å høre dette. Vi har to forslag: "
"hva med å forsøke\n"
-"<a href=\"%s\">å skrive direkte til dine representanter</a>, eller hvis det "
-"er et problem som kan fikses\n"
+"å skrive direkte til dine representanter, eller hvis det er et problem som "
+"kan fikses\n"
"av folk i nabolaget som jobber sammen, hva med å <a href=\"http://www."
"pledgebank.com/new\">publisere en utfordring om å bidra</a>?</p>"
@@ -319,8 +291,8 @@ msgstr ""
"hit til\n"
"nettstedet og legg igjen en oppdatering.</p>"
-#: templates/web/default/around/display_location.html:70
-#: templates/web/default/around/display_location.html:72
+#: templates/web/default/around/_report_banner.html:3
+#: templates/web/default/around/_report_banner.html:5
#: templates/web/emptyhomes/around/display_location.html:36
#: templates/web/emptyhomes/around/display_location.html:38
msgid ""
@@ -334,15 +306,15 @@ msgstr ""
msgid "<strong>%d</strong> live problems"
msgstr "<strong>%d</strong> aktive problemer"
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:172
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:193
msgid "<strong>No</strong> Let me confirm my report by email"
msgstr "<strong>Nei</strong> La meg bekrefte min rapport med e-post"
-#: templates/web/fixmystreet/report/display.html:148
+#: templates/web/fixmystreet/report/update-form.html:108
msgid "<strong>No</strong> Let me confirm my update by email"
msgstr "<strong>Nei</strong> La meg bekrefte min oppdatering med e-post"
-#: templates/web/fixmystreet/auth/general.html:46
+#: templates/web/fixmystreet/auth/general.html:50
msgid "<strong>No</strong> let me sign in by email"
msgstr "<strong>Nei</strong>, la meg logge inn med e-post:"
@@ -354,17 +326,17 @@ msgstr "<strong>Nei</strong>, det gjør jeg ikke. La meg logge inn med e-post:"
msgid "<strong>No</strong>, let me confirm my report by email:"
msgstr "<strong>Nei</strong>, la meg bekrefte min rapport med e-post:"
-#: templates/web/default/report/display.html:164
+#: templates/web/default/report/update-form.html:115
msgid "<strong>No</strong>, let me confirm my update by email:"
msgstr "<strong>Nei</strong>, la meg bekrefte min oppdatering med e-post:"
#: templates/web/default/auth/general.html:37
-#: templates/web/default/report/display.html:142
#: templates/web/default/report/new/fill_in_details_form.html:140
-#: templates/web/fixmystreet/auth/general.html:32
-#: templates/web/fixmystreet/auth/general.html:34
-#: templates/web/fixmystreet/report/display.html:131
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:154
+#: templates/web/default/report/update-form.html:93
+#: templates/web/fixmystreet/auth/general.html:36
+#: templates/web/fixmystreet/auth/general.html:38
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:169
+#: templates/web/fixmystreet/report/update-form.html:85
msgid "<strong>Yes</strong> I have a password"
msgstr "<strong>Ja</strong> Jeg har et passord"
@@ -376,11 +348,11 @@ msgstr "<strong>Ja</strong> Jeg har et passord"
msgid "About us"
msgstr "Om oss"
-#: templates/web/default/admin/council_contacts.html:66
+#: templates/web/default/admin/council_contacts.html:72
msgid "Add new category"
msgstr "Legg til ny kategori"
-#: templates/web/default/my/my.html:56 templates/web/fixmystreet/my/my.html:56
+#: templates/web/default/my/my.html:56 templates/web/fixmystreet/my/my.html:60
msgid "Added %s"
msgstr "La til %s"
@@ -397,16 +369,13 @@ msgid "Alert %d disabled (created %s)"
msgstr "Varsel %d koblet ut (opprettet %s)"
#: templates/web/bromley/report/display.html:207
-#: templates/web/default/report/display.html:214
-#: templates/web/fixmystreet/report/display.html:189
+#: templates/web/default/report/update-form.html:161
+#: templates/web/fixmystreet/report/update-form.html:146
msgid "Alert me to future updates"
msgstr "Send meg varsel ved fremtidige oppdateringer"
-#: templates/web/default/admin/stats.html:5
-msgid "All"
-msgstr "Alle"
-
#: templates/web/default/reports/index.html:3
+#: templates/web/fixmybarangay/reports/index.html:3
msgid "All Reports"
msgstr "Alle rapporter"
@@ -418,23 +387,29 @@ msgstr "Alle bekreftet"
#: templates/web/bromley/header.html:77 templates/web/default/footer.html:11
#: templates/web/fiksgatami/footer.html:7
#: templates/web/fiksgatami/nn/footer.html:7
+#: templates/web/fixmybarangay/footer.html:20
#: templates/web/fixmystreet/footer.html:49
-#: templates/web/reading/footer.html:8
+#: templates/web/reading/footer.html:8 templates/web/stevenage/footer.html:43
+#: templates/web/zurich/footer.html:12
msgid "All reports"
msgstr "Alle rapporter"
+#: templates/web/default/admin/stats.html:5
+#, fuzzy
+msgid "All reports between %s and %s"
+msgstr "%srapporter mellom %s og %s"
+
#: templates/web/default/report/new/councils_text_some.html:2
msgid "All the information you provide here will be sent to"
msgstr "All informasjonen du har lagt inn her vil bli sendt til"
#: templates/web/default/report/new/councils_text_all.html:10
#: templates/web/default/report/new/councils_text_all.html:12
-#, fuzzy
msgid ""
"All the information you provide here will be sent to <strong>%s</strong> or "
"<strong>Roads Service</strong>."
msgstr ""
-"All informasjonen du har lagt inn her vil bli sendt til <strong>%s</strong>."
+"All informasjon du legger inn her vil bli sendt til <strong>%s</strong>."
#: templates/web/default/report/new/councils_text_all.html:3
#: templates/web/default/report/new/councils_text_all.html:5
@@ -455,6 +430,8 @@ msgstr ""
#: templates/web/default/report/new/fill_in_details_form.html:13
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:6
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:8
+#: templates/web/zurich/report/new/fill_in_details_form.html:6
+#: templates/web/zurich/report/new/fill_in_details_form.html:8
msgid ""
"All the information you provide here will be sent to <strong>%s</strong>."
msgstr ""
@@ -497,10 +474,12 @@ msgstr ""
"FiksGataMi?"
#: templates/web/fixmystreet/footer.html:17
+#: templates/web/stevenage/footer.html:17
msgid "Are you a developer?"
msgstr "Er du en utvikler?"
#: templates/web/fixmystreet/footer.html:21
+#: templates/web/stevenage/footer.html:21
msgid "Are you from a council?"
msgstr "Der du fra den lokale administrasjonen?"
@@ -522,6 +501,16 @@ msgstr "For øyeblikket er det kun søk etter og å se på rapporter som fungere
msgid "Ban email address"
msgstr "Bannlys epostadresse"
+#: templates/web/fixmybarangay/report/new/notes.html:7
+msgid ""
+"Be sure to choose the right category, because we use that to determine to "
+"whom the report is sent."
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1032
+msgid "Bodies"
+msgstr ""
+
#: templates/web/fiksgatami/footer.html:16
#: templates/web/fiksgatami/nn/footer.html:16
msgid ""
@@ -535,21 +524,22 @@ msgstr ""
msgid "By Date"
msgstr "På dato"
-#: templates/web/fixmystreet/around/display_location.html:80
-#: templates/web/fixmystreet/around/display_location.html:82
+#: templates/web/fixmystreet/around/_report_banner.html:10
+#: templates/web/fixmystreet/around/_report_banner.html:8
msgid "Can't see the map? <a href='%s' rel='nofollow'>Skip this step</a>"
msgstr ""
"Hvis du ikke kan se kartet, <a href='%s' rel='nofollow'>hopp over dette "
"steget</a>."
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:632
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:657
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:631
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:658
#: templates/web/bromley/report/new/fill_in_details_form.html:68
-#: templates/web/default/admin/council_contacts.html:35
+#: templates/web/default/admin/council_contacts.html:37
#: templates/web/default/admin/index.html:36
#: templates/web/default/admin/list_flagged.html:14
#: templates/web/default/admin/search_reports.html:17
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:72
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:74
+#: templates/web/zurich/report/new/fill_in_details_form.html:68
msgid "Category"
msgstr "Kategori"
@@ -557,14 +547,14 @@ msgstr "Kategori"
msgid "Category fix rate for problems > 4 weeks old"
msgstr "Løsningsrate fordelt på kategori for problemer > 4 uker gamle"
-#: templates/web/default/admin/council_contacts.html:72
+#: templates/web/default/admin/council_contacts.html:78
#: templates/web/default/admin/council_edit.html:23
#: templates/web/default/admin/report_edit.html:25
#: templates/web/default/report/new/fill_in_details_form.html:67
msgid "Category:"
msgstr "Kategori:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:334
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:336
msgid "Category: %s"
msgstr "Kategori: %s"
@@ -574,8 +564,8 @@ msgstr "Kategori: %s"
msgid "Change Password"
msgstr "Bytt passord"
-#: templates/web/fixmystreet/around/display_location.html:72
-#: templates/web/fixmystreet/around/display_location.html:73
+#: templates/web/default/js/validation_strings.html:22
+#: templates/web/fixmystreet/around/_report_banner.html:2
msgid "Click map to report a problem"
msgstr "Klikk i kartet for å rapportere et problem"
@@ -583,21 +573,21 @@ msgstr "Klikk i kartet for å rapportere et problem"
#: templates/web/bromley/report/display.html:82
#: templates/web/default/admin/report_edit.html:18
#: templates/web/default/admin/report_edit.html:20
-#: templates/web/default/dashboard/index.html:136
#: templates/web/default/dashboard/index.html:138
-#: templates/web/default/report/display.html:79
-#: templates/web/default/report/display.html:81
+#: templates/web/default/dashboard/index.html:140
+#: templates/web/default/report/update-form.html:30
+#: templates/web/default/report/update-form.html:32
#: templates/web/fixmystreet/report/banner.html:15
-#: templates/web/fixmystreet/report/display.html:74
-#: templates/web/fixmystreet/report/display.html:76
+#: templates/web/fixmystreet/report/update-form.html:28
+#: templates/web/fixmystreet/report/update-form.html:30
msgid "Closed"
msgstr "Lukket"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:690
+#: perllib/FixMyStreet/DB/Result/Problem.pm:695
msgid "Closed by council"
msgstr "(ikke rapportert til administrasjonen)"
-#: templates/web/default/my/my.html:32 templates/web/fixmystreet/my/my.html:32
+#: templates/web/default/my/my.html:32 templates/web/fixmystreet/my/my.html:36
msgid "Closed reports"
msgstr "Fiksede rapporter"
@@ -605,8 +595,8 @@ msgstr "Fiksede rapporter"
msgid "Closed:"
msgstr "Lukket:"
-#: templates/web/default/around/display_location.html:103
-#: templates/web/default/around/display_location.html:105
+#: templates/web/default/around/tabbed_lists.html:10
+#: templates/web/default/around/tabbed_lists.html:12
msgid "Closest nearby problems <small>(within&nbsp;%skm)</small>"
msgstr "De nærmeste problemene <small>(innenfor&nbsp;%skm)</small>"
@@ -630,23 +620,28 @@ msgstr "Merkevaresamarbeidsdata:"
msgid "Cobrand:"
msgstr "Merkevaresamarbeid:"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:358
+#: perllib/FixMyStreet/App/Controller/Admin.pm:365
msgid "Configuration updated"
msgstr "Oppsett oppdatert"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:372
+#: perllib/FixMyStreet/App/Controller/Admin.pm:380
msgid "Configuration updated - contacts will be generated automatically later"
msgstr "Oppsett oppdatert - kontakter vil bli generert automatisk senere"
-#: templates/web/default/admin/council_contacts.html:153
+#: templates/web/default/admin/council_edit.html:34
+#, fuzzy
+msgid "Configure Endpoint"
+msgstr "Sett opp Open311"
+
+#: templates/web/default/admin/council_contacts.html:168
msgid "Configure Open311"
msgstr "Sett opp Open311"
-#: templates/web/default/admin/council_contacts.html:105
+#: templates/web/default/admin/council_contacts.html:116
msgid "Configure Open311 integration"
msgstr "Sett opp Open311-integrasjon"
-#: templates/web/default/admin/council_contacts.html:42
+#: templates/web/default/admin/council_contacts.html:46
msgid "Confirm"
msgstr "Bekreft"
@@ -654,6 +649,13 @@ msgstr "Bekreft"
msgid "Confirm account"
msgstr "Bekreft konto"
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:187
+#: templates/web/fixmystreet/report/update-form.html:103
+msgid ""
+"Confirm by email below, providing a new password at that point. When you "
+"confirm, your password will be updated."
+msgstr ""
+
#: templates/web/default/questionnaire/creator_fixed.html:1
#: templates/web/default/tokens/confirm_problem.html:1
#: templates/web/default/tokens/confirm_problem.html:3
@@ -661,17 +663,23 @@ msgstr "Bekreft konto"
#: templates/web/default/tokens/confirm_update.html:3
#: templates/web/emptyhomes/tokens/confirm_problem.html:1
#: templates/web/emptyhomes/tokens/confirm_problem.html:3
+#: templates/web/southampton/tokens/confirm_problem.html:1
+#: templates/web/southampton/tokens/confirm_problem.html:3
msgid "Confirmation"
msgstr "Bekreftelse"
-#: templates/web/default/admin/council_contacts.html:37
-#: templates/web/default/admin/council_contacts.html:82
+#: templates/web/default/admin/council_contacts.html:39
+#: templates/web/default/admin/council_contacts.html:88
#: templates/web/default/admin/council_edit.html:28
-#: templates/web/default/admin/council_edit.html:43
-#: templates/web/default/admin/stats.html:5
+#: templates/web/default/admin/council_edit.html:71
msgid "Confirmed"
msgstr "Bekreftet"
+#: templates/web/default/admin/stats.html:5
+#, fuzzy
+msgid "Confirmed reports between %s and %s"
+msgstr "%srapporter mellom %s og %s"
+
#: templates/web/default/admin/problem_row.html:23
#: templates/web/default/admin/report_edit.html:34
msgid "Confirmed:"
@@ -702,8 +710,8 @@ msgstr "Kontakt oss"
msgid "Contact the team"
msgstr "Kontakt prosjektgruppen"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1150
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1178
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1159
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1187
msgid "Could not find user"
msgstr "Kunne ikke finne bruker"
@@ -714,7 +722,6 @@ msgstr "Kunne ikke finne bruker"
msgid "Council"
msgstr "Administrasjon"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1022
#: templates/web/default/admin/council_list.html:1
msgid "Council contacts"
msgstr "Administrasjonskontakter"
@@ -742,7 +749,7 @@ msgstr "Antall"
msgid "Create a report"
msgstr "Lag en rapport"
-#: templates/web/default/admin/council_contacts.html:96
+#: templates/web/default/admin/council_contacts.html:107
msgid "Create category"
msgstr "Lag kategori"
@@ -768,17 +775,18 @@ msgstr "For tiden har 1+ slettet"
#: templates/web/default/dashboard/index.html:5
#: templates/web/default/dashboard/index.html:7
msgid "Dashboard"
-msgstr ""
+msgstr "Oversikt"
-#: templates/web/default/admin/council_contacts.html:38
-#: templates/web/default/admin/council_contacts.html:85
+#: templates/web/default/admin/council_contacts.html:40
+#: templates/web/default/admin/council_contacts.html:91
#: templates/web/default/admin/council_edit.html:29
-#: templates/web/default/admin/council_edit.html:44
+#: templates/web/default/admin/council_edit.html:72
msgid "Deleted"
msgstr "Slettet"
#: templates/web/bromley/report/new/fill_in_details_form.html:54
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:64
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:66
+#: templates/web/zurich/report/new/fill_in_details_form.html:60
msgid "Details"
msgstr "Detaljer"
@@ -787,14 +795,23 @@ msgstr "Detaljer"
msgid "Details:"
msgstr "Detaljer:"
+#: templates/web/default/admin/council_contacts.html:41
+msgid "Devolved"
+msgstr ""
+
#: templates/web/default/admin/council_list.html:23
msgid "Diligency prize league table"
msgstr "Arbeidshester"
+#: templates/web/fixmystreet/auth/general.html:30
+#, fuzzy
+msgid "Do you have a FixMyBarangay password?"
+msgstr "Har du et FiksGataMi-passord?"
+
#: templates/web/default/auth/general.html:32
-#: templates/web/fixmystreet/auth/general.html:29
-#: templates/web/fixmystreet/report/display.html:128
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:150
+#: templates/web/fixmystreet/auth/general.html:32
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:165
+#: templates/web/fixmystreet/report/update-form.html:82
msgid "Do you have a FixMyStreet password?"
msgstr "Har du et FiksGataMi-passord?"
@@ -821,33 +838,32 @@ msgstr "Redigerer oppdatering %d"
msgid "Editing user %d"
msgstr "Redigerer bruker %d"
-#: templates/web/default/admin/council_edit.html:45
+#: templates/web/default/admin/council_edit.html:73
msgid "Editor"
msgstr "Oppdatert av"
#: templates/web/bromley/report/display.html:126
-#: templates/web/default/admin/council_contacts.html:36
-#: templates/web/default/admin/council_edit.html:42
+#: templates/web/default/admin/council_contacts.html:38
+#: templates/web/default/admin/council_edit.html:70
#: templates/web/default/admin/list_flagged.html:12
#: templates/web/default/admin/list_flagged.html:35
#: templates/web/default/admin/list_updates.html:8
-#: templates/web/default/admin/search_abuse.html:11
#: templates/web/default/admin/search_reports.html:15
#: templates/web/default/admin/search_users.html:13
#: templates/web/fixmystreet/auth/general.html:20
-#: templates/web/fixmystreet/report/display.html:120
+#: templates/web/fixmystreet/report/update-form.html:74
msgid "Email"
msgstr "E-post"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1126
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1135
msgid "Email added to abuse list"
msgstr "Epost lagt til misbruksliste"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1123
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1132
msgid "Email already in abuse list"
msgstr "Epost allerede i misbrukslisten"
-#: templates/web/default/around/display_location.html:85
+#: templates/web/default/around/_updates.html:5
msgid "Email me new local problems"
msgstr "Send meg e-post om lokale problemer"
@@ -855,7 +871,7 @@ msgstr "Send meg e-post om lokale problemer"
msgid "Email me updates"
msgstr "Send meg oppdateringer"
-#: templates/web/default/admin/council_contacts.html:77
+#: templates/web/default/admin/council_contacts.html:83
#: templates/web/default/admin/council_edit.html:26
#: templates/web/default/admin/report_edit.html:31
#: templates/web/default/admin/update_edit.html:24
@@ -865,15 +881,15 @@ msgstr "Send meg oppdateringer"
msgid "Email:"
msgstr "E-post:"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:611
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:610
msgid "Empty flat or maisonette"
msgstr "Tom leilighet"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:610
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:609
msgid "Empty house or bungalow"
msgstr "Tomt hus eller bungalow"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:613
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:612
msgid "Empty office or other commercial"
msgstr "Tomt kontor eller forretningsbygg"
@@ -881,11 +897,11 @@ msgstr "Tomt kontor eller forretningsbygg"
msgid "Empty property details form"
msgstr "Tom eiendom detaljskjema"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:614
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:613
msgid "Empty pub or bar"
msgstr "Tom pub eller bar"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:615
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:614
msgid "Empty public building - school, hospital, etc."
msgstr "Tom offentlig bygning - skole, sykehos, etc."
@@ -901,44 +917,50 @@ msgstr "Slutt-dag:"
msgid "End month:"
msgstr "Sluttmåned:"
+# Kan "Oppgi" være bedre?
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:9
+#, fuzzy
+msgid "Enter a Z&uuml;rich street name"
+msgstr "Skriv inn et veinavn og sted"
+
#: templates/web/emptyhomes/index.html:40
#: templates/web/emptyhomes/index.html:41
msgid "Enter a nearby GB postcode, or street name and area"
msgstr "Skriv inn GB-postnummer i nærheten, eller veinavn og sted"
+# Fra UK cobrand
#: perllib/FixMyStreet/Cobrand/UK.pm:18
-#, fuzzy
msgid "Enter a nearby UK postcode, or street name and area"
-msgstr "Skriv inn postnummer i nærheten, eller veinavn og sted"
+msgstr "Skriv inn et britisk postnummer i nærheten, eller veinavn og sted"
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:25
msgid "Enter a nearby postcode, or street name and area"
msgstr "Skriv inn postnummer i nærheten, eller veinavn og sted"
+# Kan "Oppgi" være bedre?
#: templates/web/default/around/postcode_form.html:1
#: templates/web/default/around/postcode_form.html:2
#: templates/web/fixmystreet/around/postcode_form.html:10
#: templates/web/fixmystreet/around/postcode_form.html:11
-#, fuzzy
msgid "Enter a nearby street name and area"
-msgstr "Skriv inn postnummer i nærheten, eller veinavn og sted"
+msgstr "Skriv inn et veinavn og sted"
#: templates/web/default/auth/general.html:64
-#: templates/web/default/report/display.html:171
#: templates/web/default/report/new/fill_in_details_form.html:169
+#: templates/web/default/report/update-form.html:122
msgid "Enter a new password:"
msgstr "Skriv inn et nytt passord:"
#: templates/web/bromley/report/display.html:148
#: templates/web/bromley/report/new/fill_in_details_form.html:189
-#: templates/web/fixmystreet/auth/general.html:57
-#: templates/web/fixmystreet/report/display.html:160
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:200
+#: templates/web/fixmystreet/auth/general.html:61
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:221
+#: templates/web/fixmystreet/report/update-form.html:120
msgid "Enter a password"
msgstr "Skriv inn et nytt passord"
-#: templates/web/default/index.html:33 templates/web/emptyhomes/index.html:58
-#: templates/web/fixmystreet/index.html:41
+#: templates/web/default/index-steps.html:11
+#: templates/web/emptyhomes/index.html:58
msgid "Enter details of the problem"
msgstr "Legg inn detaljer om problemet"
@@ -952,7 +974,7 @@ msgstr "Legg inn detaljer om problemet"
msgid "Error"
msgstr "Feil"
-#: templates/web/default/admin/council_contacts.html:11
+#: templates/web/default/admin/council_contacts.html:13
#: templates/web/default/admin/council_edit.html:18
msgid "Example postcode %s"
msgstr "Eksempel-postnummer %s"
@@ -962,9 +984,8 @@ msgid "Examples:"
msgstr "Eksempler:"
#: templates/web/default/admin/report_edit.html:40
-#, fuzzy
msgid "Extra data:"
-msgstr "Merkevaresamarbeidsdata:"
+msgstr "Ekstra data:"
#: templates/web/bromley/contact/submit.html:14
#: templates/web/default/contact/submit.html:15
@@ -978,9 +999,8 @@ msgstr ""
#: templates/web/bromley/report/display.html:189
#: templates/web/bromley/report/new/fill_in_details_form.html:113
#: templates/web/bromley/report/new/fill_in_details_form.html:160
-#, fuzzy
msgid "First Name"
-msgstr "Første gang"
+msgstr "Fornavn"
#: templates/web/default/questionnaire/index.html:79
#: templates/web/fixmystreet/questionnaire/index.html:73
@@ -996,14 +1016,10 @@ msgstr "Fiks<span id=\"my\">Gata</span>Mi"
msgid "FixMyStreet"
msgstr "FiksGataMi"
-#: templates/web/default/admin/header.html:13
+#: templates/web/default/admin/header.html:10
msgid "FixMyStreet admin:"
msgstr "FiksGataMi-administrator:"
-#: templates/web/default/admin/header.html:3
-msgid "FixMyStreet administration"
-msgstr "Fiksgatami-administrasjon"
-
#: templates/web/default/alert/index.html:11
msgid ""
"FixMyStreet has a variety of RSS feeds and email alerts for local problems, "
@@ -1040,13 +1056,13 @@ msgstr ""
#: templates/web/default/admin/index.html:36
#: templates/web/default/admin/report_edit.html:18
#: templates/web/default/admin/report_edit.html:20
-#: templates/web/default/dashboard/index.html:136
#: templates/web/default/dashboard/index.html:138
-#: templates/web/default/report/display.html:79
-#: templates/web/default/report/display.html:81
+#: templates/web/default/dashboard/index.html:140
+#: templates/web/default/report/update-form.html:30
+#: templates/web/default/report/update-form.html:32
#: templates/web/fixmystreet/report/banner.html:12
-#: templates/web/fixmystreet/report/display.html:74
-#: templates/web/fixmystreet/report/display.html:76
+#: templates/web/fixmystreet/report/update-form.html:28
+#: templates/web/fixmystreet/report/update-form.html:30
msgid "Fixed"
msgstr "Løst"
@@ -1060,7 +1076,7 @@ msgstr "Løst - Administrasjon"
msgid "Fixed - User"
msgstr "Løst - Bruker"
-#: templates/web/default/my/my.html:27 templates/web/fixmystreet/my/my.html:27
+#: templates/web/default/my/my.html:27 templates/web/fixmystreet/my/my.html:31
msgid "Fixed reports"
msgstr "Fiksede rapporter"
@@ -1072,6 +1088,7 @@ msgstr "Løst:"
msgid "Flag user"
msgstr "Flag bruker"
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1037
#: templates/web/default/admin/search_users.html:15
msgid "Flagged"
msgstr "Flagget:"
@@ -1082,7 +1099,7 @@ msgid "Flagged:"
msgstr "Flagget:"
#: templates/web/default/reports/_ward-list.html:3
-#: templates/web/emptyhomes/reports/council.html:19
+#: templates/web/emptyhomes/reports/body.html:19
#: templates/web/fixmystreet/reports/_ward-list.html:4
msgid "Follow a ward link to view only reports within that ward."
msgstr "Følg en bydelslenke for å kun se rapporter innenfor den bydelen."
@@ -1091,11 +1108,18 @@ msgstr "Følg en bydelslenke for å kun se rapporter innenfor den bydelen."
msgid "For council(s):"
msgstr "For administrasjon(ene):"
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:186
+#: templates/web/fixmystreet/report/update-form.html:102
+#, fuzzy
+msgid "Forgotten your password?"
+msgstr "Ditt passord"
+
#: templates/web/default/faq/faq-en-gb.html:1
#: templates/web/emptyhomes/faq/faq-cy.html:1
#: templates/web/emptyhomes/faq/faq-en-gb.html:1
#: templates/web/fiksgatami/faq/faq-nb.html:1
#: templates/web/fiksgatami/nn/faq/faq-nn.html:1
+#: templates/web/fixmybarangay/faq/faq-en-gb.html:1
#: templates/web/fixmystreet/faq/faq-en-gb.html:1
#: templates/web/fixmystreet/static/privacy.html:1
#: templates/web/zurich/faq/faq-de.html:1
@@ -1111,13 +1135,12 @@ msgid "GeoRSS on Google Maps"
msgstr "GeoRSS på Google Maps"
#: templates/web/bromley/report/display.html:30
-#: templates/web/fixmystreet/report/display.html:23
+#: templates/web/fixmystreet/report/display.html:31
msgid "Get updates"
msgstr "Få oppdateringer"
#: templates/web/fixmystreet/reports/_rss.html:3
#: templates/web/fixmystreet/reports/_rss.html:9
-#, fuzzy
msgid "Get updates of %s problems"
msgstr "Få oppdateringer for problemer i denne %s"
@@ -1127,6 +1150,7 @@ msgid "Get updates of problems in this %s"
msgstr "Få oppdateringer for problemer i denne %s"
#: templates/web/default/alert/_list.html:83
+#: templates/web/fixmybarangay/alert/_list.html:28
#: templates/web/fixmystreet/alert/_list.html:82
msgid "Give me an RSS feed"
msgstr "Gi meg en RSS-strøm"
@@ -1134,7 +1158,7 @@ msgstr "Gi meg en RSS-strøm"
#: templates/web/default/alert/index.html:34
#: templates/web/default/around/postcode_form.html:8
#: templates/web/emptyhomes/index.html:47
-#: templates/web/fixmystreet/around/postcode_form.html:18
+#: templates/web/fixmystreet/around/postcode_form.html:21
msgid "Go"
msgstr "Fortsett"
@@ -1171,8 +1195,10 @@ msgstr ""
#: templates/web/emptyhomes/header.html:28
#: templates/web/fiksgatami/footer.html:9
#: templates/web/fiksgatami/nn/footer.html:9
+#: templates/web/fixmybarangay/footer.html:24
#: templates/web/fixmystreet/footer.html:53
-#: templates/web/reading/footer.html:10
+#: templates/web/reading/footer.html:10 templates/web/stevenage/footer.html:47
+#: templates/web/zurich/footer.html:14
msgid "Help"
msgstr "Hjelp"
@@ -1184,9 +1210,9 @@ msgstr ""
#: templates/web/barnet/header.html:70 templates/web/bromley/header.html:64
#: templates/web/bromley/header.html:99
-#: templates/web/fixmybarangay/header.html.orig:42
-#: templates/web/fixmystreet/header.html:47
-#: templates/web/zurich/header.html:47
+#: templates/web/fixmybarangay/header.html:64
+#: templates/web/fixmystreet/header.html:49
+#: templates/web/stevenage/header.html:97 templates/web/zurich/header.html:47
msgid "Hi %s"
msgstr "Hei, %s"
@@ -1196,26 +1222,24 @@ msgstr "Hei, %s"
msgid "Hidden"
msgstr "Skjul"
-#: templates/web/default/around/display_location.html:58
-#: templates/web/fixmystreet/around/display_location.html:58
+#: templates/web/default/around/display_location.html:63
msgid "Hide old"
msgstr "Skjul gamle"
-#: templates/web/default/around/display_location.html:53
-#: templates/web/fixmystreet/around/display_location.html:54
+#: templates/web/default/around/display_location.html:58
msgid "Hide pins"
msgstr "Skjul nåler"
-#: templates/web/default/admin/council_edit.html:38
+#: templates/web/default/admin/council_edit.html:66
msgid "History"
msgstr "Historie"
-#: templates/web/default/index.html:28 templates/web/emptyhomes/index.html:53
-#: templates/web/fixmystreet/index.html:36
+#: templates/web/default/index-steps.html:1
+#: templates/web/emptyhomes/index.html:53
msgid "How to report a problem"
msgstr "Hvordan rapportere et problem"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:637
+#: perllib/FixMyStreet/App/Controller/Admin.pm:648
msgid "I am afraid you cannot confirm unconfirmed reports."
msgstr "Jeg er redd du ikke kan bekrefte ubekreftede rapporter."
@@ -1300,12 +1324,12 @@ msgstr "Ugyldig valg av feed"
#: templates/web/bromley/report/display.html:82
#: templates/web/default/admin/report_edit.html:18
#: templates/web/default/admin/report_edit.html:20
-#: templates/web/default/dashboard/index.html:136
#: templates/web/default/dashboard/index.html:138
-#: templates/web/default/report/display.html:79
-#: templates/web/default/report/display.html:81
-#: templates/web/fixmystreet/report/display.html:74
-#: templates/web/fixmystreet/report/display.html:76
+#: templates/web/default/dashboard/index.html:140
+#: templates/web/default/report/update-form.html:30
+#: templates/web/default/report/update-form.html:32
+#: templates/web/fixmystreet/report/update-form.html:28
+#: templates/web/fixmystreet/report/update-form.html:30
msgid "In Progress"
msgstr "Under arbeid"
@@ -1337,7 +1361,7 @@ msgstr "Feil has_photo-verdi \"%s\""
msgid "Invalid agency_responsible value %s"
msgstr "Ugyldig agency_responsible-verdi %s"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:942
+#: perllib/FixMyStreet/App/Controller/Admin.pm:952
msgid "Invalid end date"
msgstr "Ugyldig slutt-dato"
@@ -1345,7 +1369,7 @@ msgstr "Ugyldig slutt-dato"
msgid "Invalid format %s specified."
msgstr "Ugyldig format %s oppgitt."
-#: perllib/FixMyStreet/App/Controller/Admin.pm:932
+#: perllib/FixMyStreet/App/Controller/Admin.pm:942
msgid "Invalid start date"
msgstr "Ugyldig startdato"
@@ -1353,12 +1377,12 @@ msgstr "Ugyldig startdato"
#: templates/web/bromley/report/display.html:81
#: templates/web/default/admin/report_edit.html:18
#: templates/web/default/admin/report_edit.html:19
-#: templates/web/default/dashboard/index.html:136
-#: templates/web/default/dashboard/index.html:137
-#: templates/web/default/report/display.html:79
-#: templates/web/default/report/display.html:80
-#: templates/web/fixmystreet/report/display.html:74
-#: templates/web/fixmystreet/report/display.html:75
+#: templates/web/default/dashboard/index.html:138
+#: templates/web/default/dashboard/index.html:139
+#: templates/web/default/report/update-form.html:30
+#: templates/web/default/report/update-form.html:31
+#: templates/web/fixmystreet/report/update-form.html:28
+#: templates/web/fixmystreet/report/update-form.html:29
msgid "Investigating"
msgstr "Undersøkes"
@@ -1378,22 +1402,21 @@ msgstr ""
#: templates/web/bromley/report/display.html:166
#: templates/web/bromley/report/new/fill_in_details_form.html:209
#: templates/web/default/auth/general.html:44
-#: templates/web/default/report/display.html:151
#: templates/web/default/report/new/fill_in_details_form.html:149
-#: templates/web/fixmystreet/auth/general.html:42
-#: templates/web/fixmystreet/report/display.html:144
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:167
+#: templates/web/default/report/update-form.html:102
+#: templates/web/fixmystreet/auth/general.html:46
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:182
+#: templates/web/fixmystreet/report/update-form.html:98
msgid "Keep me signed in on this computer"
msgstr "Husk min innlogging på denne datamaskinen"
#: templates/web/bromley/report/display.html:195
#: templates/web/bromley/report/new/fill_in_details_form.html:119
#: templates/web/bromley/report/new/fill_in_details_form.html:166
-#, fuzzy
msgid "Last Name"
-msgstr "Siste oppdatering:"
+msgstr "Etternavn"
-#: templates/web/default/admin/council_contacts.html:39
+#: templates/web/default/admin/council_contacts.html:42
msgid "Last editor"
msgstr "Sist redigert av"
@@ -1405,18 +1428,15 @@ msgstr "Siste oppdatering:"
msgid "Last&nbsp;update:"
msgstr "Siste&nbsp;oppdatering:"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1028
-msgid "List Flagged"
-msgstr "List flagget"
-
-#: templates/web/default/admin/council_contacts.html:14
#: templates/web/default/admin/council_contacts.html:16
+#: templates/web/default/admin/council_contacts.html:18
msgid "List all reported problems"
msgstr "List alle rapporterte problemer"
#: templates/web/bromley/report/new/fill_in_details_form.html:69
#: templates/web/default/report/new/fill_in_details_form.html:68
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:73
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:75
+#: templates/web/zurich/report/new/fill_in_details_form.html:69
msgid "Loading..."
msgstr "Laster..."
@@ -1431,6 +1451,8 @@ msgstr "Laster..."
#: templates/web/default/tokens/confirm_alert.html:3
#: templates/web/emptyhomes/alert/index.html:1
#: templates/web/emptyhomes/alert/index.html:3
+#: templates/web/fixmybarangay/alert/index.html:1
+#: templates/web/fixmybarangay/alert/index.html:3
#: templates/web/fixmystreet/alert/updates.html:1
msgid "Local RSS feeds and email alerts"
msgstr "Lokal RSS-strøm og e-postvarsel"
@@ -1446,13 +1468,14 @@ msgstr "Lokal RSS-strøm og e-postvarsel for ‘%s’"
#: templates/web/bromley/header.html:79 templates/web/default/footer.html:13
#: templates/web/fiksgatami/footer.html:8
#: templates/web/fiksgatami/nn/footer.html:8
+#: templates/web/fixmybarangay/footer.html:22
#: templates/web/fixmystreet/footer.html:51
-#: templates/web/reading/footer.html:9
+#: templates/web/reading/footer.html:9 templates/web/stevenage/footer.html:45
msgid "Local alerts"
msgstr "Lokale varsler"
-#: templates/web/default/index.html:32 templates/web/emptyhomes/index.html:57
-#: templates/web/fixmystreet/index.html:40
+#: templates/web/default/index-steps.html:10
+#: templates/web/emptyhomes/index.html:57
msgid "Locate the problem on a map of the area"
msgstr "Lokaliser problemet på kartet over området"
@@ -1495,10 +1518,12 @@ msgstr "Flere problemer i nærheten"
#: templates/web/emptyhomes/reports/index.html:10
#: templates/web/fiksgatami/nn/reports/index.html:9
#: templates/web/fiksgatami/reports/index.html:9
-#: templates/web/fixmystreet/auth/general.html:52
-#: templates/web/fixmystreet/report/display.html:177
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:117
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:176
+#: templates/web/fixmybarangay/reports/index.html:19
+#: templates/web/fixmystreet/auth/general.html:56
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:120
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:197
+#: templates/web/fixmystreet/report/update-form.html:134
+#: templates/web/zurich/report/new/fill_in_details_form.html:118
msgid "Name"
msgstr "Navn"
@@ -1514,7 +1539,7 @@ msgstr "Navn:"
msgid "Navigation"
msgstr "Navigasjon"
-#: perllib/FixMyStreet/Geocode/OSM.pm:159
+#: perllib/FixMyStreet/Geocode/OSM.pm:166
msgid ""
"Nearest named road to the pin placed on the map (automatically generated "
"using OpenStreetMap): %s%s"
@@ -1522,7 +1547,7 @@ msgstr ""
"Nærmeste navngitte vei til nålen plassert på kartet (automatisk generert ved "
"hjelp av OpenStreetMap): %s%s"
-#: perllib/FixMyStreet/Cobrand/UK.pm:161
+#: perllib/FixMyStreet/Cobrand/UK.pm:152
msgid ""
"Nearest postcode to the pin placed on the map (automatically generated): %s "
"(%sm away)"
@@ -1530,8 +1555,8 @@ msgstr ""
"Nærmeste postnummer til nålen plassert på kartet (automatisk generert): %s "
"(%sm unna)"
-#: perllib/FixMyStreet/Cobrand/Default.pm:404
-#: perllib/FixMyStreet/Cobrand/Default.pm:444
+#: perllib/FixMyStreet/Cobrand/Default.pm:407
+#: perllib/FixMyStreet/Cobrand/Default.pm:447
msgid ""
"Nearest road to the pin placed on the map (automatically generated by Bing "
"Maps): %s"
@@ -1539,7 +1564,7 @@ msgstr ""
"Nærmeste vei til nålen plassert på kartet (automatisk generert ved hjelp av "
"Bing Maps): %s"
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:245
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:265
msgid ""
"Nearest road to the pin placed on the map (automatically generated by Bing "
"Maps): %s\n"
@@ -1554,10 +1579,11 @@ msgid "Nearly Done! Now check your email..."
msgstr "Nesten ferdig! Nå må du sjekke e-posten din..."
#: templates/web/default/reports/index.html:16
+#: templates/web/fixmybarangay/reports/index.html:20
msgid "New <br>problems"
msgstr "Nye <br>problemer"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:314
+#: perllib/FixMyStreet/App/Controller/Admin.pm:320
msgid "New category contact added"
msgstr "Ny kategorikontakt lagt til"
@@ -1627,8 +1653,9 @@ msgstr "Ny tilstand"
msgid "New!"
msgstr "Ny!"
-#: templates/web/default/admin/council_contacts.html:48
-#: templates/web/default/admin/council_contacts.html:49
+#: templates/web/default/admin/council_contacts.html:52
+#: templates/web/default/admin/council_contacts.html:53
+#: templates/web/default/admin/council_contacts.html:54
#: templates/web/default/admin/council_edit.html:4
#: templates/web/default/admin/list_updates.html:30
#: templates/web/default/admin/list_updates.html:31
@@ -1650,7 +1677,7 @@ msgstr "Nei"
msgid "No council"
msgstr "Ingen administrasjon"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:328
+#: perllib/FixMyStreet/DB/Result/Problem.pm:336
msgid "No council selected"
msgstr "Ingen administrasjon er valgt"
@@ -1680,6 +1707,14 @@ msgstr "Ingen problemer ble funnet."
msgid "No problems have been reported yet."
msgstr "Ingen problemer er rapportert"
+#: templates/web/default/report/_support.html:3
+msgid "No supporters"
+msgstr ""
+
+#: templates/web/default/admin/council_contacts.html:57
+msgid "Non Public"
+msgstr ""
+
#: templates/web/default/admin/council_list.html:5
#: templates/web/default/admin/report_edit.html:16
msgid "None"
@@ -1689,14 +1724,13 @@ msgstr "Ingen"
msgid "Not reported before"
msgstr "Ikke rapportert tidligere"
-#: templates/web/default/report/_main.html:11
+#: templates/web/default/report/_main.html:14
#: templates/web/emptyhomes/report/display.html:24
-#: templates/web/fixmystreet/report/_main.html:13
msgid "Not reported to council"
msgstr "Ikke rapportert til administrasjonen"
-#: templates/web/default/admin/council_contacts.html:40
-#: templates/web/default/admin/council_edit.html:46
+#: templates/web/default/admin/council_contacts.html:43
+#: templates/web/default/admin/council_edit.html:74
msgid "Note"
msgstr "Merk"
@@ -1710,8 +1744,8 @@ msgstr ""
"opprettet, hvilket ikke trenger være den samme måneden som rapporten var "
"bekreftet, så tallene kan hoppe litt opp og ned."
-#: templates/web/default/admin/council_contacts.html:89
-#: templates/web/default/admin/council_edit.html:31
+#: templates/web/default/admin/council_contacts.html:95
+#: templates/web/default/admin/council_edit.html:32
msgid "Note:"
msgstr "Merk:"
@@ -1719,7 +1753,7 @@ msgstr "Merk:"
msgid "Note: <strong>%s</strong>"
msgstr "Note: <strong>%d</strong>"
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:149
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:164
msgid "Now to submit your report&hellip;"
msgstr "På tide å sende din rapport&hellip;"
@@ -1727,11 +1761,11 @@ msgstr "På tide å sende din rapport&hellip;"
msgid "Now to submit your report&hellip; do you have a FixMyStreet password?"
msgstr "På tide å sende din rapport&hellip; har du et FiksGataMi-passord?"
-#: templates/web/fixmystreet/report/display.html:127
+#: templates/web/fixmystreet/report/update-form.html:81
msgid "Now to submit your update&hellip;"
msgstr "På tide å registrere din oppdatering&hellip;"
-#: templates/web/default/report/display.html:133
+#: templates/web/default/report/update-form.html:84
msgid "Now to submit your update&hellip; do you have a FixMyStreet password?"
msgstr ""
"På tide å registrere din oppdatering&hellip; har du et FiksGataMi-passord?"
@@ -1742,6 +1776,7 @@ msgid "Offensive? Unsuitable? Tell us"
msgstr "Støtende? Upassende? Gi oss beskjed"
#: templates/web/default/reports/index.html:18
+#: templates/web/fixmybarangay/reports/index.html:22
msgid "Old / unknown <br>problems"
msgstr "Gamle / ukjente <br>problemer"
@@ -1755,10 +1790,12 @@ msgid "Old state"
msgstr "Gammel tilstand"
#: templates/web/default/reports/index.html:20
+#: templates/web/fixmybarangay/reports/index.html:24
msgid "Older <br>fixed"
msgstr "Eldre <br>løste"
#: templates/web/default/reports/index.html:17
+#: templates/web/fixmybarangay/reports/index.html:21
msgid "Older <br>problems"
msgstr "Eldre <br>problemer"
@@ -1777,13 +1814,13 @@ msgstr "Eldre problemer"
#: templates/web/bromley/report/display.html:80
#: templates/web/default/admin/report_edit.html:18
#: templates/web/default/admin/update_edit.html:19
-#: templates/web/default/dashboard/index.html:136
-#: templates/web/default/report/display.html:79
-#: templates/web/fixmystreet/report/display.html:74
+#: templates/web/default/dashboard/index.html:138
+#: templates/web/default/report/update-form.html:30
+#: templates/web/fixmystreet/report/update-form.html:28
msgid "Open"
msgstr "Åpen"
-#: templates/web/default/my/my.html:22 templates/web/fixmystreet/my/my.html:22
+#: templates/web/default/my/my.html:22 templates/web/fixmystreet/my/my.html:26
msgid "Open reports"
msgstr "Åpne rapporter"
@@ -1813,15 +1850,15 @@ msgstr ""
"Eller du kan abonnere på varsel basert på bydel eller administrasjon du "
"hører inn under:"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:655
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:1006
#: perllib/FixMyStreet/App/Controller/Report/New.pm:656
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:999
-#: perllib/FixMyStreet/DB/Result/Problem.pm:497
-#: perllib/FixMyStreet/DB/Result/Problem.pm:507
-#: perllib/FixMyStreet/DB/Result/Problem.pm:517
-#: perllib/FixMyStreet/DB/Result/Problem.pm:529
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:329
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:338
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:657
+#: perllib/FixMyStreet/DB/Result/Problem.pm:505
+#: perllib/FixMyStreet/DB/Result/Problem.pm:515
+#: perllib/FixMyStreet/DB/Result/Problem.pm:525
+#: perllib/FixMyStreet/DB/Result/Problem.pm:537
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:331
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:340
msgid "Other"
msgstr "Annet"
@@ -1849,9 +1886,9 @@ msgstr "Delvis"
#: templates/web/bromley/report/display.html:145
#: templates/web/bromley/report/new/fill_in_details_form.html:186
-#: templates/web/fixmystreet/auth/general.html:55
-#: templates/web/fixmystreet/report/display.html:157
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:197
+#: templates/web/fixmystreet/auth/general.html:59
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:218
+#: templates/web/fixmystreet/report/update-form.html:117
msgid "Password (optional)"
msgstr "Passord (valgfritt)"
@@ -1861,12 +1898,13 @@ msgstr "Passord:"
#: templates/web/bromley/report/new/fill_in_details_form.html:136
#: templates/web/bromley/report/new/fill_in_details_form.html:183
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:133
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:194
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:148
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:215
+#: templates/web/zurich/report/new/fill_in_details_form.html:124
msgid "Phone number (optional)"
msgstr "Telefonnummer (valgfritt)"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:260
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:262
#: templates/web/default/admin/report_edit.html:32
#: templates/web/default/report/new/fill_in_details_form.html:215
msgid "Phone:"
@@ -1874,14 +1912,15 @@ msgstr "Telefon:"
#: templates/web/bromley/report/display.html:109
#: templates/web/bromley/report/new/fill_in_details_form.html:104
-#: templates/web/fixmystreet/report/display.html:103
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:108
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:92
+#: templates/web/fixmystreet/report/update-form.html:57
+#: templates/web/zurich/report/new/fill_in_details_form.html:86
msgid "Photo"
msgstr "Bilde"
#: templates/web/default/questionnaire/index.html:95
-#: templates/web/default/report/display.html:109
#: templates/web/default/report/new/fill_in_details_form.html:102
+#: templates/web/default/report/update-form.html:60
#: templates/web/fixmystreet/questionnaire/index.html:90
msgid "Photo:"
msgstr "Bilde:"
@@ -1894,12 +1933,12 @@ msgstr "Bilder av nye problemer i nærheten"
#: templates/web/bromley/report/display.html:81
#: templates/web/default/admin/report_edit.html:18
#: templates/web/default/admin/report_edit.html:19
-#: templates/web/default/dashboard/index.html:136
-#: templates/web/default/dashboard/index.html:137
-#: templates/web/default/report/display.html:79
-#: templates/web/default/report/display.html:80
-#: templates/web/fixmystreet/report/display.html:74
-#: templates/web/fixmystreet/report/display.html:75
+#: templates/web/default/dashboard/index.html:138
+#: templates/web/default/dashboard/index.html:139
+#: templates/web/default/report/update-form.html:30
+#: templates/web/default/report/update-form.html:31
+#: templates/web/fixmystreet/report/update-form.html:28
+#: templates/web/fixmystreet/report/update-form.html:29
msgid "Planned"
msgstr "Planlagt"
@@ -1932,16 +1971,16 @@ msgstr "Vennligst sjekk e-posten du oppgav"
msgid "Please check your email address is correct"
msgstr "Vennligst sjekk at du har skrevet en gyldig e-postadresse"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:819
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:826
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:845
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:884
-#: perllib/FixMyStreet/DB/Result/Problem.pm:347
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:822
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:829
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:848
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:891
+#: perllib/FixMyStreet/DB/Result/Problem.pm:355
#: templates/web/default/js/validation_strings.html:9
msgid "Please choose a category"
msgstr "Velg en kategori"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:353
+#: perllib/FixMyStreet/DB/Result/Problem.pm:361
msgid "Please choose a property type"
msgstr "Velg en type egenskap"
@@ -1950,6 +1989,8 @@ msgid ""
"Please describe the exact location of the report. Example: “2 dumped "
"mattresses outside Number 19 Stockwell Close”"
msgstr ""
+"Vennligst beskriv den nøyaktige posisjonen til problemet. For eksempel: «2 "
+"madrasser dumpet utenfor Jernbanegata 19»"
#: templates/web/default/contact/blurb.html:2
msgid ""
@@ -1966,9 +2007,10 @@ msgstr ""
#: templates/web/default/report/new/notes.html:7
#: templates/web/fixmystreet/report/new/notes.html:6
+#, fuzzy
msgid ""
-"Please do not be abusive &mdash; abusing your council devalues the service "
-"for all users."
+"Please do not be abusive&nbsp;&mdash; abusing your council devalues the "
+"service for all users."
msgstr ""
"Ikke vær ufin &mdash; å kjefte på din administrasjon skader verdien av "
"tjenesten for alle brukerne."
@@ -1984,7 +2026,7 @@ msgid "Please enter a password"
msgstr "Skriv inn et passord"
#: perllib/FixMyStreet/App/Controller/Contact.pm:97
-#: perllib/FixMyStreet/DB/Result/Problem.pm:322
+#: perllib/FixMyStreet/DB/Result/Problem.pm:330
#: templates/web/default/js/validation_strings.html:3
msgid "Please enter a subject"
msgstr "Vennligst legg inn et emne"
@@ -2000,7 +2042,7 @@ msgstr "Legg til en gyldig e-post"
msgid "Please enter a valid email address"
msgstr "Legg inn din e-post"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:325
+#: perllib/FixMyStreet/DB/Result/Problem.pm:333
#: templates/web/default/js/validation_strings.html:4
msgid "Please enter some details"
msgstr "Legg inn opplysninger om problemet"
@@ -2017,16 +2059,16 @@ msgid "Please enter your email"
msgstr "Legg inn din e-post"
#: templates/web/bromley/report/new/fill_in_details_form.html:149
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:146
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:161
+#: templates/web/zurich/report/new/fill_in_details_form.html:110
msgid "Please enter your email address"
msgstr "Vennligst tast inn din e-postadresse"
#: templates/web/default/js/validation_strings.html:19
-#, fuzzy
msgid "Please enter your first name"
-msgstr "Legg inn ditt navn"
+msgstr "Vennligst tast inn ditt fornavn"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:340
+#: perllib/FixMyStreet/DB/Result/Problem.pm:348
#: templates/web/default/js/validation_strings.html:7
msgid ""
"Please enter your full name, councils need this information – if you do not "
@@ -2038,21 +2080,19 @@ msgstr ""
#: perllib/FixMyStreet/App/Controller/Contact.pm:95
#: perllib/FixMyStreet/DB/Result/Comment.pm:143
-#: perllib/FixMyStreet/DB/Result/Problem.pm:333
+#: perllib/FixMyStreet/DB/Result/Problem.pm:341
#: perllib/FixMyStreet/DB/Result/User.pm:97
#: templates/web/default/js/validation_strings.html:6
msgid "Please enter your name"
msgstr "Legg inn ditt navn"
#: templates/web/default/js/validation_strings.html:20
-#, fuzzy
msgid "Please enter your second name"
-msgstr "Legg inn ditt navn"
+msgstr "Vennligst tast inn ditt mellomnavn"
#: templates/web/default/js/validation_strings.html:18
-#, fuzzy
msgid "Please enter your title"
-msgstr "Legg inn din e-post"
+msgstr "Vennligst legg inn din tittel"
#: templates/web/emptyhomes/report/new/fill_in_details_text.html:1
msgid ""
@@ -2069,11 +2109,29 @@ msgstr ""
#: templates/web/default/report/new/fill_in_details_text.html:1
#: templates/web/default/report/new/fill_in_details_text.html:11
+#: templates/web/fixmybarangay/report/new/fill_in_details_text.html:1
+#: templates/web/fixmybarangay/report/new/fill_in_details_text.html:10
#: templates/web/fixmystreet/report/new/fill_in_details_text.html:1
-#: templates/web/fixmystreet/report/new/fill_in_details_text.html:11
+#: templates/web/fixmystreet/report/new/fill_in_details_text.html:8
msgid "Please fill in details of the problem below."
msgstr "Vennligst fyll ut detaljer om problemet under"
+#: templates/web/fixmybarangay/report/new/fill_in_details_text.html:1
+#: templates/web/fixmybarangay/report/new/fill_in_details_text.html:3
+#, fuzzy
+msgid ""
+"Please fill in details of the problem below. Leave as much detail as you "
+"can, \n"
+"and if possible describe the exact location of\n"
+"the problem (e.g. if there is a streetlight number or road name)."
+msgstr ""
+"Vennligst fyll inn detaljene om problemet under. Administrasjonen vil ikke "
+"være i stand\n"
+"til å hjelpe med mindre du legger inn så mange detaljer som du kan. Beskriv\n"
+"eksakt plassering for problemet (f.eks. på en vegg), hva det er, hvor lenge "
+"det har\n"
+"vært der, en beskrivelse (og et bilde av problemet hvis du har et), osv."
+
#: templates/web/default/report/new/fill_in_details_text.html:1
#: templates/web/default/report/new/fill_in_details_text.html:3
msgid ""
@@ -2091,13 +2149,15 @@ msgstr ""
"det har\n"
"vært der, en beskrivelse (og et bilde av problemet hvis du har et), osv."
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:68
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:70
+#: templates/web/zurich/report/new/fill_in_details_form.html:64
msgid "Please fill in details of the problem."
msgstr "Vennligst fyll ut detaljer om problemet."
#: templates/web/bromley/report/new/fill_in_details_form.html:28
#: templates/web/default/report/new/fill_in_details_form.html:27
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:34
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:35
+#: templates/web/zurich/report/new/fill_in_details_form.html:35
msgid ""
"Please fill in the form below with details of the problem, and describe the "
"location as precisely as possible in the details box."
@@ -2105,15 +2165,17 @@ msgstr ""
"Vennligst fyll inn skjemaet under med detaljene om problemet,\n"
"og beskriv plasseringen så nøyaktig som mulig i boksen for detaljer."
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:241
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:243
msgid "Please indicate whether you'd like to receive another questionnaire"
msgstr "Vennligst indiker om du ønsker å motta et nytt spørreskjema"
#: templates/web/fixmystreet/report/updates-sidebar-notes.html:3
msgid "Please note that updates are not sent to the council."
msgstr ""
+"Vær oppmerksom på at oppdaterginger ikke blir videresendt til "
+"administrasjonen."
-#: templates/web/default/report/display.html:56
+#: templates/web/default/report/update-form.html:7
msgid ""
"Please note that updates are not sent to the council. If you leave your name "
"it will be public. Your information will only be used in accordance with our "
@@ -2125,20 +2187,20 @@ msgstr ""
"\">personvernpolicy</a>"
#: templates/web/barnet/report/updates-sidebar-notes.html:1
-#, fuzzy
msgid ""
"Please note that updates are not sent to the relevant department. If you "
"leave your name it will be public. Your information will only be used in "
"accordance with our <a href=\"/faq#privacy\">privacy policy</a>"
msgstr ""
-"Vennligst merk at oppdateringer ikke blir sendt til administrasjonen. Hvis "
-"du legger igjen navnet ditt så vil det være offentlig tilgjengelig. Din "
+"Vennligst merk at oppdateringer ikke vil bli sendt til administrasjonen. "
+"Dersom du legger igjen navnet ditt vil det være synlig for alle. Din "
"informasjon vil kun bli brukt i henhold til våre <a href=\"/faq#privacy"
-"\">personvernpolicy</a>"
+"\">personvernsregler</a>"
#: templates/web/bromley/report/new/fill_in_details_form.html:23
#: templates/web/default/report/new/fill_in_details_form.html:5
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:25
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:26
+#: templates/web/zurich/report/new/fill_in_details_form.html:26
msgid ""
"Please note your report has <strong>not yet been sent</strong>. Choose a "
"category and add further information below, then submit."
@@ -2147,22 +2209,23 @@ msgstr ""
"legg til mer informasjon under før du sender inn."
#: templates/web/default/report/new/notes.html:1
+#: templates/web/fixmybarangay/report/new/notes.html:1
#: templates/web/fixmystreet/report/new/notes.html:1
msgid "Please note:"
msgstr "Vennligst merk deg:"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:244
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:246
msgid "Please provide some explanation as to why you're reopening this report"
msgstr ""
"Vennligst bidra med en forklaring for hvorfor du gjenåpner denne "
"problemrapporten"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:251
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:253
msgid "Please provide some text as well as a photo"
msgstr "Vennligst bidra med litt tekst i tilegg til et bilde"
#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:116
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:237
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:239
msgid ""
"Please say whether you've ever reported a problem to your council before"
msgstr ""
@@ -2177,7 +2240,7 @@ msgstr "Velg den kilden du ønsker"
msgid "Please select the type of alert you want"
msgstr "Vennligst velg hvilken type varsel du ønsker"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:233
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:235
msgid "Please state whether or not the problem has been fixed"
msgstr "Vennligs oppgi om dette problemet er blitt fikset eller ikke"
@@ -2185,21 +2248,20 @@ msgstr "Vennligs oppgi om dette problemet er blitt fikset eller ikke"
msgid "Please take a look at the updates that have been left."
msgstr "Vennligst se over oppdateringene som har blitt lagt inn."
-#: perllib/FixMyStreet/App/Controller/Photo.pm:176
+#: perllib/FixMyStreet/App/Controller/Photo.pm:175
msgid "Please upload a JPEG image only"
msgstr "Vennligst last opp kun JPEG-bilder"
-#: perllib/FixMyStreet/App/Controller/Photo.pm:183
-#, fuzzy
+#: perllib/FixMyStreet/App/Controller/Photo.pm:182
msgid "Please upload a JPEG image only\n"
-msgstr "Vennligst last opp kun JPEG-bilder"
+msgstr "Vennligst last opp kun JPEG eller JPG-bilder\n"
#: perllib/FixMyStreet/App/Controller/Contact.pm:98
msgid "Please write a message"
msgstr "Skriv inn en melding"
#: templates/web/bromley/report/display.html:70
-#: templates/web/fixmystreet/report/display.html:69
+#: templates/web/fixmystreet/report/update-form.html:23
msgid "Please write your update here"
msgstr "Vennligst skriv inn din oppdatering her"
@@ -2207,13 +2269,13 @@ msgstr "Vennligst skriv inn din oppdatering her"
#: templates/web/bromley/report/display.html:149
#: templates/web/bromley/report/display.html:161
#: templates/web/default/contact/index.html:93
-#: templates/web/default/report/display.html:119
-#: templates/web/default/report/display.html:156
-#: templates/web/default/report/display.html:178
+#: templates/web/default/report/update-form.html:107
+#: templates/web/default/report/update-form.html:129
+#: templates/web/default/report/update-form.html:70
#: templates/web/fixmystreet/contact/index.html:93
-#: templates/web/fixmystreet/report/display.html:115
-#: templates/web/fixmystreet/report/display.html:139
-#: templates/web/fixmystreet/report/display.html:161
+#: templates/web/fixmystreet/report/update-form.html:121
+#: templates/web/fixmystreet/report/update-form.html:69
+#: templates/web/fixmystreet/report/update-form.html:93
msgid "Post"
msgstr "Send inn"
@@ -2229,6 +2291,12 @@ msgstr "Lagt inn av %s (<strong>%s</strong>) %s"
msgid "Posted by %s at %s"
msgstr "Sendt inn av %s %s"
+#: templates/web/default/admin/council_contacts.html:100
+#: templates/web/default/admin/council_edit.html:30
+#: templates/web/default/admin/report_edit.html:43
+msgid "Private"
+msgstr ""
+
#: templates/web/default/maps/openlayers.html:85
msgid "Problem"
msgstr "Problem"
@@ -2249,7 +2317,7 @@ msgstr "Problem %s sendt til administrasjon %s"
msgid "Problem breakdown by state"
msgstr "Tilstandsfordeling av problemer"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:819
+#: perllib/FixMyStreet/App/Controller/Admin.pm:849
msgid "Problem marked as open."
msgstr "Problem markert som åpent."
@@ -2261,17 +2329,17 @@ msgstr "Problemtilstandsendring basert på spørreundersøkelsesresultater"
msgid "Problems"
msgstr "Problemer"
-#: templates/web/default/around/display_location.html:81
+#: templates/web/default/around/_updates.html:1
msgid "Problems in this area"
msgstr "Problemer i dette området"
#: templates/web/bromley/report/display.html:31
-#: templates/web/fixmystreet/around/display_location.html:98
-#: templates/web/fixmystreet/report/display.html:24
+#: templates/web/fixmystreet/around/tabbed_lists.html:4
+#: templates/web/fixmystreet/report/display.html:35
msgid "Problems nearby"
msgstr "Problemer i nærheten"
-#: templates/web/fixmystreet/around/display_location.html:97
+#: templates/web/fixmystreet/around/tabbed_lists.html:3
msgid "Problems on the map"
msgstr "Problemer på kartet"
@@ -2284,24 +2352,25 @@ msgstr "Problemer nylig rapportert fikset på FiksGataMi"
msgid "Problems within %.1fkm of this location"
msgstr "Problemer innenfor %.1fkm av denne posisjonen"
-#: perllib/FixMyStreet/Cobrand/Default.pm:609
+#: perllib/FixMyStreet/Cobrand/Default.pm:612
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:95
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:162
-#: perllib/FixMyStreet/Cobrand/UK.pm:240
+#: perllib/FixMyStreet/Cobrand/UK.pm:231
msgid "Problems within %s"
msgstr "Problemer innenfor %s"
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:103
-#: perllib/FixMyStreet/Cobrand/UK.pm:254
+#: perllib/FixMyStreet/Cobrand/UK.pm:245
msgid "Problems within %s ward"
msgstr "Problemer innenfor %s bydel"
-#: templates/web/default/reports/council.html:0
-#: templates/web/default/reports/council.html:29
+#: templates/web/default/reports/body.html:0
+#: templates/web/default/reports/body.html:29
msgid "Problems within %s, FixMyStreet"
msgstr "Problemer innenfor %s, Fiksgatami"
#: templates/web/default/alert/_list.html:40
+#: templates/web/fixmybarangay/alert/_list.html:13
#: templates/web/fixmystreet/alert/_list.html:42
msgid "Problems within the boundary of:"
msgstr "Problemer innenfor grensene av:"
@@ -2311,36 +2380,35 @@ msgid "Properties recently reported as put back to use on reportemptyhomes.com"
msgstr ""
"Eiendommer nylig rapportert som gått tilbake i bruk på reportemptyhomes.com"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:617
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:616
msgid "Property type:"
msgstr "Type egenskap:"
#: templates/web/bromley/report/new/fill_in_details_form.html:52
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:62
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:64
msgid "Provide a title"
msgstr "Oppgi en tittel"
#: templates/web/bromley/report/display.html:57
-#: templates/web/default/report/display.html:51
-#: templates/web/fixmystreet/report/display.html:50
+#: templates/web/default/report/update-form.html:3
+#: templates/web/fixmystreet/report/update-form.html:4
msgid "Provide an update"
msgstr "Bidra med en oppdatering"
#: templates/web/bromley/report/new/fill_in_details_form.html:180
-#, fuzzy
msgid ""
"Providing a password is optional, but doing so will allow you to more easily "
"report future problems, leave updates and manage your reports."
msgstr ""
"Det er valgfritt å oppgi et passord, men om du gjør det vil det bli enklere "
"for deg å rapportere problemer, legge inn oppdateringer og holde oversikt "
-"over dine rapporter"
+"over dine rapporter."
#: templates/web/bromley/report/display.html:142
-#: templates/web/default/report/display.html:175
#: templates/web/default/report/new/fill_in_details_form.html:173
-#: templates/web/fixmystreet/report/display.html:154
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:191
+#: templates/web/default/report/update-form.html:126
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:212
+#: templates/web/fixmystreet/report/update-form.html:114
msgid ""
"Providing a password is optional, but doing so will allow you to more easily "
"report problems, leave updates and manage your reports."
@@ -2349,6 +2417,11 @@ msgstr ""
"for deg å rapportere problemer, legge inn oppdateringer og holde oversikt "
"over dine rapporter"
+#: templates/web/default/admin/council_contacts.html:44
+#: templates/web/default/admin/council_contacts.html:57
+msgid "Public"
+msgstr ""
+
#: templates/web/default/questionnaire/completed.html:1
#: templates/web/default/questionnaire/completed.html:2
#: templates/web/default/questionnaire/index.html:0
@@ -2369,7 +2442,7 @@ msgstr "Spørreskjema %d fylt inn for problem %d, %s til %s"
msgid "Questionnaire %d sent for problem %d"
msgstr "Spørreskjema %d sendt for problem %d"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:190
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:192
msgid "Questionnaire filled in by problem reporter"
msgstr "Spørreskjema fylt inn av feilrapportøren"
@@ -2381,17 +2454,15 @@ msgstr "Spørreskjema fylt inn av feilrapportøren"
#: templates/web/default/reports/_rss.html:1
#: templates/web/fixmystreet/alert/_list.html:22
#: templates/web/fixmystreet/alert/updates.html:9
-#: templates/web/fixmystreet/around/display_location.html:1
-#: templates/web/fixmystreet/around/display_location.html:3
-#: templates/web/fixmystreet/report/display.html:30
+#: templates/web/fixmystreet/report/display.html:49
msgid "RSS feed"
msgstr "RSS-strøm"
-#: perllib/FixMyStreet/Cobrand/UK.pm:283 perllib/FixMyStreet/Cobrand/UK.pm:295
+#: perllib/FixMyStreet/Cobrand/UK.pm:274 perllib/FixMyStreet/Cobrand/UK.pm:286
msgid "RSS feed for %s"
msgstr "RSS-strøm for %s"
-#: perllib/FixMyStreet/Cobrand/UK.pm:289 perllib/FixMyStreet/Cobrand/UK.pm:301
+#: perllib/FixMyStreet/Cobrand/UK.pm:280 perllib/FixMyStreet/Cobrand/UK.pm:292
msgid "RSS feed for %s ward, %s"
msgstr "RSS-strøm for %s bydel, %s"
@@ -2399,11 +2470,11 @@ msgstr "RSS-strøm for %s bydel, %s"
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:186
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:196
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:204
-#: perllib/FixMyStreet/Cobrand/UK.pm:309 perllib/FixMyStreet/Cobrand/UK.pm:321
+#: perllib/FixMyStreet/Cobrand/UK.pm:300 perllib/FixMyStreet/Cobrand/UK.pm:312
msgid "RSS feed of %s"
msgstr "RSS-strøm fra %s"
-#: perllib/FixMyStreet/Cobrand/UK.pm:314 perllib/FixMyStreet/Cobrand/UK.pm:326
+#: perllib/FixMyStreet/Cobrand/UK.pm:305 perllib/FixMyStreet/Cobrand/UK.pm:317
msgid "RSS feed of %s, within %s ward"
msgstr "RSS-strøm av %s, innenfor %s bydel"
@@ -2416,29 +2487,27 @@ msgstr "RSS-strøm med problemer i nærheten"
msgid "RSS feed of problems in this %s"
msgstr "RSS-strøm for problemer i denne %s"
-#: perllib/FixMyStreet/Cobrand/Default.pm:610
+#: perllib/FixMyStreet/Cobrand/Default.pm:613
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:96
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:161
-#: perllib/FixMyStreet/Cobrand/UK.pm:247
+#: perllib/FixMyStreet/Cobrand/UK.pm:238
msgid "RSS feed of problems within %s"
msgstr "RSS-strøm for problemer innenfor %s"
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:102
-#: perllib/FixMyStreet/Cobrand/UK.pm:253
+#: perllib/FixMyStreet/Cobrand/UK.pm:244
msgid "RSS feed of problems within %s ward"
msgstr "RSS-strøm for problemer innenfor %s bydel"
#: templates/web/default/around/display_location.html:1
#: templates/web/default/around/display_location.html:4
-#: templates/web/fixmystreet/around/display_location.html:1
-#: templates/web/fixmystreet/around/display_location.html:4
msgid "RSS feed of recent local problems"
msgstr "RSS-strøm med nylige lokale problemer"
#: templates/web/bromley/report/display.html:37
#: templates/web/default/report/display.html:42
#: templates/web/fixmystreet/alert/updates.html:9
-#: templates/web/fixmystreet/report/display.html:30
+#: templates/web/fixmystreet/report/display.html:49
msgid "RSS feed of updates to this problem"
msgstr "RSS-strøm med oppdateringer for dette problemet"
@@ -2446,18 +2515,17 @@ msgstr "RSS-strøm med oppdateringer for dette problemet"
#: templates/web/default/alert/updates.html:9
#: templates/web/default/report/display.html:33
#: templates/web/fixmystreet/alert/updates.html:14
-#: templates/web/fixmystreet/report/display.html:32
+#: templates/web/fixmystreet/report/display.html:51
msgid "Receive email when updates are left on this problem."
msgstr "Motta e-post når det er oppdateringer på dette problemet"
#: templates/web/default/around/display_location.html:0
#: templates/web/default/around/display_location.html:34
-#: templates/web/fixmystreet/around/display_location.html:0
-#: templates/web/fixmystreet/around/display_location.html:34
msgid "Recent local problems, FixMyStreet"
msgstr "Nylige lokale problemer, FiksGataMi."
#: templates/web/default/reports/index.html:19
+#: templates/web/fixmybarangay/reports/index.html:23
msgid "Recently <br>fixed"
msgstr "Nylig løste <br>problemer"
@@ -2467,7 +2535,7 @@ msgstr "Nylig løste <br>problemer"
msgid "Recently fixed"
msgstr "Nylig løste problemer"
-#: templates/web/default/index.html:50 templates/web/fixmystreet/index.html:62
+#: templates/web/default/index.html:37 templates/web/fixmystreet/index.html:45
msgid "Recently reported problems"
msgstr "Nylig meldte problemer"
@@ -2484,11 +2552,17 @@ msgstr ""
"tjenesten, husk at du kan kontakte administrasjonen direkte via deres egen "
"nettside."
+#: templates/web/fixmybarangay/report/new/notes.html:9
+msgid ""
+"Remember that, for the pilot project, FixMyBarangay is only for reporting "
+"potholes and streetlights in bgy. Luz or Basak San Nicolas."
+msgstr ""
+
#: templates/web/default/admin/report_blocks.html:16
msgid "Remove flag"
msgstr "Fjern flagg"
-#: templates/web/default/admin/report_edit.html:53
+#: templates/web/default/admin/report_edit.html:54
#: templates/web/default/admin/update_edit.html:48
msgid "Remove photo (can't be undone!)"
msgstr "Fjern bilde (kan ikke gjøres om!)"
@@ -2502,12 +2576,13 @@ msgstr "Rapporter tomme hjem"
#: templates/web/fiksgatami/footer.html:5
#: templates/web/fiksgatami/nn/footer.html:5
#: templates/web/fixmystreet/footer.html:45
-#: templates/web/reading/footer.html:6
+#: templates/web/reading/footer.html:6 templates/web/stevenage/footer.html:39
+#: templates/web/zurich/footer.html:10
msgid "Report a problem"
msgstr "Rapporter et problem"
#: templates/web/bromley/report/display.html:28
-#: templates/web/fixmystreet/report/display.html:22
+#: templates/web/fixmystreet/report/display.html:29
msgid "Report abuse"
msgstr "Rapporter misbruk"
@@ -2515,12 +2590,14 @@ msgstr "Rapporter misbruk"
msgid "Report empty properties"
msgstr "Rapporter tomme hjem"
-#: perllib/FixMyStreet/App/Controller/Rss.pm:277
+#: perllib/FixMyStreet/App/Controller/Rss.pm:286
msgid "Report on %s"
msgstr "Rapport på %s"
#: templates/web/default/index.html:15
-#: templates/web/fixmystreet/around/postcode_form.html:6
+#: templates/web/fixmystreet/around/intro.html:1
+#: templates/web/stevenage/around/intro.html:1
+#: templates/web/zurich/around/intro.html:1
msgid "Report, view, or discuss local problems"
msgstr "Rapporter, finn eller diskuter lokale problemer"
@@ -2532,7 +2609,7 @@ msgstr "Rapportert %s"
msgid "Reported %s, to %s"
msgstr "Rapportert %s, til %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:512
+#: perllib/FixMyStreet/DB/Result/Problem.pm:520
#: templates/web/default/contact/index.html:45
#: templates/web/fixmystreet/contact/index.html:46
msgid "Reported anonymously at %s"
@@ -2544,33 +2621,33 @@ msgstr "Rapportert anonymt %s"
msgid "Reported before"
msgstr "Rapportert tidligere"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:504
+#: perllib/FixMyStreet/DB/Result/Problem.pm:512
msgid "Reported by %s anonymously at %s"
msgstr "Publisert av %s anonymt %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:535
+#: perllib/FixMyStreet/DB/Result/Problem.pm:543
#: templates/web/default/contact/index.html:47
#: templates/web/fixmystreet/contact/index.html:48
msgid "Reported by %s at %s"
msgstr "Publisert av %s %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:526
+#: perllib/FixMyStreet/DB/Result/Problem.pm:534
msgid "Reported by %s by %s at %s"
msgstr "Rapporter av %s av %s %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:500
+#: perllib/FixMyStreet/DB/Result/Problem.pm:508
msgid "Reported by %s in the %s category anonymously at %s"
msgstr "Rapportert av %s i kategorien %s anonymt %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:520
+#: perllib/FixMyStreet/DB/Result/Problem.pm:528
msgid "Reported by %s in the %s category by %s at %s"
msgstr "Rapportert av %s i kategorien %s av %s %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:508
+#: perllib/FixMyStreet/DB/Result/Problem.pm:516
msgid "Reported in the %s category anonymously at %s"
msgstr "Rapportert i kategorien %s anonymt %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:530
+#: perllib/FixMyStreet/DB/Result/Problem.pm:538
msgid "Reported in the %s category by %s at %s"
msgstr "Rapportert i kategorien %s av %s %s"
@@ -2582,10 +2659,16 @@ msgstr "Rapportert i kategorien %s av %s %s"
#: templates/web/fixmystreet/report/new/fill_in_details.html:0
#: templates/web/fixmystreet/report/new/fill_in_details.html:5
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:2
+#: templates/web/zurich/report/new/fill_in_details_form.html:2
msgid "Reporting a problem"
msgstr "Legger til et problem"
-#: templates/web/default/around/display_location.html:95
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1033
+#, fuzzy
+msgid "Reports"
+msgstr "Alle rapporter"
+
+#: templates/web/default/around/tabbed_lists.html:3
msgid "Reports on and around the map"
msgstr "Problemer i og rundt kartet"
@@ -2593,7 +2676,7 @@ msgstr "Problemer i og rundt kartet"
msgid "Resend report"
msgstr "Send rapport på nytt"
-#: perllib/FixMyStreet/Geocode/OSM.pm:166
+#: perllib/FixMyStreet/Geocode/OSM.pm:173
msgid ""
"Road operator for this named road (derived from road reference number and "
"type): %s"
@@ -2601,34 +2684,23 @@ msgstr ""
"Veioperatør for denne navngitte veien (utledet fra veiens referansenummer og "
"type) %s"
-#: perllib/FixMyStreet/Geocode/OSM.pm:163
+#: perllib/FixMyStreet/Geocode/OSM.pm:170
msgid "Road operator for this named road (from OpenStreetMap): %s"
msgstr "Veioperatør for denne navngitte veien (fra OpenStreetMap): %s"
-#: templates/web/default/admin/council_edit.html:35
+#: templates/web/default/admin/council_edit.html:63
msgid "Save changes"
msgstr "Lagre endringer"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1027
-msgid "Search Abuse"
-msgstr "Søk etter misbruk"
-
-#: templates/web/default/admin/search_abuse.html:1
-msgid "Search Abuse Table"
-msgstr "Søk i misbrukstabell"
-
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1023
#: templates/web/default/admin/list_flagged.html:1
#: templates/web/default/admin/search_reports.html:1
msgid "Search Reports"
msgstr "Søk i rapporter"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1026
#: templates/web/default/admin/search_users.html:1
msgid "Search Users"
msgstr "Søk i brukere"
-#: templates/web/default/admin/search_abuse.html:4
#: templates/web/default/admin/search_reports.html:5
#: templates/web/default/admin/search_users.html:5
msgid "Search:"
@@ -2643,7 +2715,7 @@ msgstr ""
"Velg hvilken type varsel du ønsker og klikk på knappen for en RSS-kilde, "
"eller skriv inn din e-postadresse for å abonnere på et e-postvarsel."
-#: perllib/FixMyStreet/DB/Result/Problem.pm:618
+#: perllib/FixMyStreet/DB/Result/Problem.pm:623
msgid "Sent to %s %s later"
msgstr "Sendt til %s %s senere"
@@ -2655,6 +2727,10 @@ msgstr "Sendt:"
msgid "Service:"
msgstr "Tjeneste:"
+#: templates/web/fixmystreet/report/display.html:33
+msgid "Share"
+msgstr ""
+
#: templates/web/emptyhomes/static/about.html:21
msgid "Shelter Cymru"
msgstr "Shelter Cymru"
@@ -2679,32 +2755,30 @@ msgstr ""
#: templates/web/bromley/report/display.html:203
#: templates/web/bromley/report/new/fill_in_details_form.html:129
#: templates/web/bromley/report/new/fill_in_details_form.html:175
-#: templates/web/default/report/display.html:208
#: templates/web/default/report/new/fill_in_details_form.html:210
-#: templates/web/fixmystreet/report/display.html:185
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:126
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:186
+#: templates/web/default/report/update-form.html:155
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:139
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:207
+#: templates/web/fixmystreet/report/update-form.html:142
msgid "Show my name publicly"
msgstr "Vis mitt navn offentlig"
-#: templates/web/default/around/display_location.html:60
-#: templates/web/fixmystreet/around/display_location.html:60
+#: templates/web/default/around/display_location.html:65
msgid "Show old"
msgstr "Vis gamle"
-#: templates/web/default/around/display_location.html:51
-#: templates/web/fixmystreet/around/display_location.html:52
+#: templates/web/default/around/display_location.html:56
msgid "Show pins"
msgstr "Vis nåler"
#: templates/web/default/auth/general.html:3
#: templates/web/default/auth/general.html:49
-#: templates/web/fixmybarangay/header.html.orig:46
+#: templates/web/fixmybarangay/header.html:68
#: templates/web/fixmystreet/auth/general.html:3
-#: templates/web/fixmystreet/auth/general.html:38
-#: templates/web/fixmystreet/auth/general.html:58
-#: templates/web/fixmystreet/header.html:51
-#: templates/web/zurich/header.html:51
+#: templates/web/fixmystreet/auth/general.html:42
+#: templates/web/fixmystreet/auth/general.html:62
+#: templates/web/fixmystreet/header.html:53
+#: templates/web/stevenage/header.html:101 templates/web/zurich/header.html:51
msgid "Sign in"
msgstr "Logg inn"
@@ -2723,6 +2797,7 @@ msgstr "Logg inn eller opprett en konto"
#: templates/web/emptyhomes/header.html:41
#: templates/web/fiksgatami/header.html:22
#: templates/web/fiksgatami/nn/header.html:22
+#: templates/web/fixmybarangay/auth/sign_out.html:1
#: templates/web/lichfielddc/header.html:177
#: templates/web/reading/header.html:33
msgid "Sign out"
@@ -2738,11 +2813,13 @@ msgid "Signed in as %s"
msgstr "Logget inn som %s"
#: templates/web/default/report/new/fill_in_details_text.html:1
+#: templates/web/fixmybarangay/report/new/fill_in_details_text.html:1
#: templates/web/fixmystreet/report/new/fill_in_details_text.html:1
msgid "Some categories may require additional information."
msgstr "Noen kategorier krever kanskje mer informasjon"
#: templates/web/default/alert/index.html:42
+#: templates/web/fixmybarangay/alert/index.html:32
msgid "Some photos of recent reports"
msgstr "Noen bilder av nylig meldte problemer"
@@ -2755,7 +2832,7 @@ msgstr "Noe tekst å oversette"
msgid "Some unconfirmeds"
msgstr "Noen ubekreftede"
-#: perllib/FixMyStreet/Cobrand/UK.pm:97
+#: perllib/FixMyStreet/Cobrand/UK.pm:89
msgid ""
"Sorry, that appears to be a Crown dependency postcode, which we don't cover."
msgstr ""
@@ -2768,15 +2845,16 @@ msgstr ""
"Beklager, men det oppsto et problem når vi forsøkte å bekrefte "
"problemrapporten din"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:214
-#: perllib/FixMyStreet/Geocode.pm:27 perllib/FixMyStreet/Geocode/Bing.pm:51
-#: perllib/FixMyStreet/Geocode/Google.pm:69
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:211
+#: perllib/FixMyStreet/Geocode.pm:28 perllib/FixMyStreet/Geocode/Bing.pm:58
+#: perllib/FixMyStreet/Geocode/Google.pm:74
+#: perllib/FixMyStreet/Geocode/OSM.pm:66
msgid "Sorry, we could not find that location."
msgstr "Beklager, vi kunne ikke finne det stedet."
-#: perllib/FixMyStreet/Geocode/Bing.pm:46
-#: perllib/FixMyStreet/Geocode/Google.pm:64
-#: perllib/FixMyStreet/Geocode/OSM.pm:59
+#: perllib/FixMyStreet/Geocode/Bing.pm:53
+#: perllib/FixMyStreet/Geocode/Google.pm:69
+#: perllib/FixMyStreet/Geocode/Zurich.pm:82
msgid "Sorry, we could not parse that location. Please try again."
msgstr "Beklager, vi kunne ikke tolke den posisjonen. Vennligst prøv på nytt."
@@ -2801,17 +2879,17 @@ msgstr "Startmåned:"
#: templates/web/default/admin/list_flagged.html:18
#: templates/web/default/admin/list_updates.html:6
#: templates/web/default/admin/search_reports.html:21
-#: templates/web/fixmystreet/report/display.html:72
+#: templates/web/fixmystreet/report/update-form.html:26
msgid "State"
msgstr "Tilstand"
#: templates/web/default/admin/report_edit.html:17
#: templates/web/default/admin/update_edit.html:18
-#: templates/web/default/report/display.html:77
+#: templates/web/default/report/update-form.html:28
msgid "State:"
msgstr "Tilstand:"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1029
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1038
#: templates/web/default/admin/stats.html:1
msgid "Stats"
msgstr "Statistikk"
@@ -2822,7 +2900,7 @@ msgstr "Fortsatt åpen via spørreskjema, %s"
#: templates/web/bromley/report/new/fill_in_details_form.html:48
#: templates/web/fixmystreet/contact/index.html:79
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:58
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:60
msgid "Subject"
msgstr "Emne"
@@ -2839,13 +2917,14 @@ msgstr "Emne:"
#: templates/web/default/report/new/fill_in_details_form.html:114
#: templates/web/default/report/new/fill_in_details_form.html:154
#: templates/web/default/report/new/fill_in_details_form.html:176
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:137
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:162
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:201
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:152
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:177
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:222
+#: templates/web/zurich/report/new/fill_in_details_form.html:128
msgid "Submit"
msgstr "Send inn"
-#: templates/web/default/admin/report_edit.html:56
+#: templates/web/default/admin/report_edit.html:57
#: templates/web/default/admin/update_edit.html:51
#: templates/web/default/admin/user_edit.html:20
msgid "Submit changes"
@@ -2860,16 +2939,24 @@ msgstr "Send inn spørreskjema"
#: templates/web/default/alert/updates.html:17
#: templates/web/default/report/display.html:38
#: templates/web/fixmystreet/alert/updates.html:23
-#: templates/web/fixmystreet/report/display.html:37
+#: templates/web/fixmystreet/report/display.html:56
msgid "Subscribe"
msgstr "Abonner"
#: templates/web/default/alert/_list.html:97
+#: templates/web/fixmybarangay/alert/_list.html:42
#: templates/web/fixmystreet/alert/_list.html:92
msgid "Subscribe me to an email alert"
msgstr "Jeg ønsker å abonnere på e-postvarsel"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1021
+#: templates/web/fixmybarangay/alert/_list.html:6
+#, fuzzy
+msgid "Subscribe to an alert based upon what baranagay you&rsquo;re in:"
+msgstr ""
+"Eller du kan abonnere på varsel basert på bydel eller administrasjon du "
+"hører inn under:"
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1031
#: templates/web/default/admin/index.html:1
msgid "Summary"
msgstr "Oppsummering"
@@ -2878,10 +2965,15 @@ msgstr "Oppsummering"
#: templates/web/emptyhomes/reports/index.html:1
#: templates/web/fiksgatami/nn/reports/index.html:1
#: templates/web/fiksgatami/reports/index.html:1
+#: templates/web/fixmybarangay/reports/index.html:1
msgid "Summary reports"
msgstr "Oppsummeringsrapporter"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1025
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1035
+#, fuzzy
+msgid "Survey"
+msgstr "Resultater fra spørreundersøkelsen"
+
#: templates/web/default/admin/questionnaire.html:1
msgid "Survey Results"
msgstr "Resultater fra spørreundersøkelsen"
@@ -2890,7 +2982,7 @@ msgstr "Resultater fra spørreundersøkelsen"
msgid "Text"
msgstr "Tekst"
-#: templates/web/default/admin/council_contacts.html:18
+#: templates/web/default/admin/council_contacts.html:20
msgid "Text only version"
msgstr "Tekst-versjon"
@@ -2947,14 +3039,13 @@ msgstr ""
"å løse UKs tomme hjem-krise."
#: templates/web/fixmystreet/around/around_index.html:27
-#, fuzzy
msgid ""
"Thanks for uploading your photo. We now need to locate your problem, so "
"please enter a nearby street name or postcode in the box above&nbsp;:"
msgstr ""
-"Takk for at du lastet opp ditt bilde. Nå trenger vi å plassere ditt problem,"
-"så vær så snill å skriv inn navn på vei i nærheten, eller postnummer i "
-"boksen under&nbsp;:"
+"Takk for at du lastet opp ditt bilde. Vi må nå plassere ditt problem, så "
+"vær så snill å skriv inn navnet på en vei eller et postnummer i området i "
+"boksen ovenfor&nbsp;:"
#: templates/web/default/around/around_index.html:28
msgid ""
@@ -2977,36 +3068,39 @@ msgstr ""
"Takk, glad for å høre at problemet er fikset! Vi vil gjerne spørre deg om du "
"har rapportert et problem til en administrasjon tidligere?"
-#: perllib/FixMyStreet/App/Controller/Photo.pm:190
+#: perllib/FixMyStreet/App/Controller/Photo.pm:189
msgid ""
"That image doesn't appear to have uploaded correctly (%s), please try again."
msgstr "Bildet ser ikke ut til å blitt lastet opp riktig (%s), prøv på nytt."
-#: perllib/FixMyStreet/App/Controller/Council.pm:91
-#, fuzzy
+#: perllib/FixMyStreet/App/Controller/Council.pm:90
msgid ""
"That location does not appear to be covered by a council; perhaps it is "
"offshore or outside the country. Please try again."
msgstr ""
-"Det stedet dekkes ikke av noen administrasjon, kanskje det er til havs - "
-"vennligst forsøk et mer spesifikt sted."
+"Det stedet dekkes ikke av noen administrasjon, kanskje det er til havs eller "
+"utenfor lander - vennligst forsøk et annet sted."
# Should this be "Norge" or "Storbritannia" ?
-#: perllib/FixMyStreet/App/Controller/Location.pm:107
-#, fuzzy
+#: perllib/FixMyStreet/App/Controller/Location.pm:121
msgid "That location does not appear to be in the UK; please try again."
msgstr "Det stedet virker ikke å være i Storbritannia. Vennligst prøv igjen."
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:63
-#: perllib/FixMyStreet/Cobrand/UK.pm:90
+#: perllib/FixMyStreet/Cobrand/UK.pm:82
msgid "That postcode was not recognised, sorry."
msgstr "Det postnummeret ble ikke gjenkjent, beklager."
-#: perllib/FixMyStreet/App/Controller/Admin.pm:605
+#: perllib/FixMyStreet/App/Controller/Admin.pm:616
msgid "That problem will now be resent."
msgstr "Det problemet vil nå bli sendt på nytt."
-#: perllib/FixMyStreet/App/Controller/Report.pm:75
+#: perllib/FixMyStreet/App/Controller/Report.pm:98
+#, fuzzy
+msgid "That report cannot be viewed on FixMyStreet."
+msgstr "Den rapporten har blitt fjernet fra FiksGataMi."
+
+#: perllib/FixMyStreet/App/Controller/Report.pm:92
msgid "That report has been removed from FixMyStreet."
msgstr "Den rapporten har blitt fjernet fra FiksGataMi."
@@ -3052,12 +3146,10 @@ msgstr ""
#: templates/web/fixmystreet/report/new/fill_in_details_text.html:1
#: templates/web/fixmystreet/report/new/fill_in_details_text.html:3
msgid ""
-"The council won&rsquo;t be able to help unless you leave as much\n"
-"detail as you can. Please describe the exact location of the problem (e.g. "
-"on a\n"
-"wall), what it is, how long it has been there, a description (and a photo "
-"of\n"
-"the problem if you have one), etc."
+"The council won&rsquo;t be able to help unless you leave as much detail as "
+"you can. Please describe the exact location of the problem (e.g. on a wall), "
+"what it is, how long it has been there, a description (and a photo of the "
+"problem if you have one), etc."
msgstr ""
"Administrasjonen vil ikke være i stand til å hjelpe med mindre du legger inn "
"så mange\n"
@@ -3079,8 +3171,8 @@ msgstr ""
"Detaljene om ditt problem er tilgjengelig på høyre kant av denne siden."
#: perllib/FixMyStreet/App/Controller/Dashboard.pm:60
-#: perllib/FixMyStreet/App/Controller/Reports.pm:44
-#: perllib/FixMyStreet/App/Controller/Reports.pm:75
+#: perllib/FixMyStreet/App/Controller/Reports.pm:43
+#: perllib/FixMyStreet/App/Controller/Reports.pm:74
msgid "The error was: %s"
msgstr "Feilen var: %s"
@@ -3094,7 +3186,7 @@ msgstr ""
"service_request_id, description, lat, long, media_url, status, "
"requested_datetime, updated_datetime, service_code and service_name."
-#: perllib/FixMyStreet/Geocode/OSM.pm:158
+#: perllib/FixMyStreet/Geocode/OSM.pm:165
msgid ""
"The following information about the nearest road might be inaccurate or "
"irrelevant, if the problem is close to several roads or close to a road "
@@ -3176,6 +3268,7 @@ msgstr "Den enkleste meldingen er vår geografiske:"
#: templates/web/default/report/new/councils_text_some.html:11
#: templates/web/default/report/new/fill_in_details_form.html:17
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:12
+#: templates/web/zurich/report/new/fill_in_details_form.html:12
msgid ""
"The subject and details of the problem will be public, plus your name if you "
"give us permission."
@@ -3183,7 +3276,7 @@ msgstr ""
"Tittelen og detaljene for problemet vil bli offentlig, pluss navnet ditt\n"
"hvis du gir oss tillatelse til det."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:269
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:271
msgid ""
"The user could not locate the problem on a map, but to see the area around "
"the location they entered"
@@ -3191,7 +3284,7 @@ msgstr ""
"Brukeren kunne ikke plassere problemet på et kart, men sjekk området rundt "
"stedet de skrev inn"
-#: perllib/FixMyStreet/App/Controller/Reports.pm:72
+#: perllib/FixMyStreet/App/Controller/Reports.pm:71
msgid ""
"There was a problem showing the All Reports page. Please try again later."
msgstr ""
@@ -3199,14 +3292,11 @@ msgstr ""
"senere."
#: perllib/FixMyStreet/App/Controller/Dashboard.pm:59
-#, fuzzy
msgid "There was a problem showing this page. Please try again later."
-msgstr ""
-"Det var problemer med å vise 'Alle rapporter'-siden. Vennligst prøv igjen "
-"senere."
+msgstr "Det var problemer med å vise denne siden. Vennligst prøv igjen senere."
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:733
-#: perllib/FixMyStreet/App/Controller/Report/Update.pm:130
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:736
+#: perllib/FixMyStreet/App/Controller/Report/Update.pm:134
#: templates/web/default/auth/general.html:23
#: templates/web/fixmystreet/auth/general.html:24
msgid ""
@@ -3225,7 +3315,7 @@ msgstr ""
"Det var problemer med din epost/passord-kombinasjon. Vær så snill å forsøk "
"igjen."
-#: perllib/FixMyStreet/App/Controller/Report/Update.pm:252
+#: perllib/FixMyStreet/App/Controller/Report/Update.pm:256
msgid "There was a problem with your update. Please try again."
msgstr "Det var problemer med din oppdatering. Vær så snill å forsøk igjen."
@@ -3233,7 +3323,7 @@ msgstr "Det var problemer med din oppdatering. Vær så snill å forsøk igjen.
msgid "There were problems with your report. Please see below."
msgstr "Det var problemer med din rapport. Vennligst se under."
-#: perllib/FixMyStreet/App/Controller/Report/Update.pm:279
+#: perllib/FixMyStreet/App/Controller/Report/Update.pm:283
msgid "There were problems with your update. Please see below."
msgstr "Det var problemer med din oppdatering. Vennligst se under."
@@ -3245,7 +3335,7 @@ msgstr ""
"Denne API-implementasjonen er under arbeid og ennå ikke stabil. Den vil "
"endre seg uten advarsel i fremtiden."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:339
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:341
msgid ""
"This email has been sent to both councils covering the location of the "
"problem, as the user did not categorise it; please ignore it if you're not "
@@ -3258,7 +3348,7 @@ msgstr ""
"eller gi oss beskjed om hvilken kategori av problemer dette er så vi kan "
"legge det til i vårt system."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:342
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:344
msgid ""
"This email has been sent to several councils covering the location of the "
"problem, as the category selected is provided for all of them; please ignore "
@@ -3269,8 +3359,8 @@ msgstr ""
"snill å ignorere e-posten hvis dere ikke er korrekt administrasjon for å "
"håndtere denne saken."
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:865
-#: perllib/FixMyStreet/Cobrand/UK.pm:62
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:868
+#: perllib/FixMyStreet/Cobrand/UK.pm:54
msgid "This information is required"
msgstr "Denne informasjonen er påkrevd"
@@ -3282,14 +3372,23 @@ msgstr ""
"Dette er et utviklernettsted. Ting kan knekke når som helst og databasen vil "
"bli periodisk slettet."
-#: templates/web/emptyhomes/reports/council.html:58
+#: templates/web/emptyhomes/reports/body.html:58
msgid "This is a summary of all reports for one %s."
msgstr "Dette er en oppsummering av alle rapporter for en %s."
-#: templates/web/emptyhomes/reports/council.html:60
+#: templates/web/emptyhomes/reports/body.html:60
msgid "This is a summary of all reports for this %s."
msgstr "Dette er en oppsummering for alle rapporter for denne %s."
+#: templates/web/fixmybarangay/reports/index.html:7
+#, fuzzy
+msgid ""
+"This is a summary of all reports on this site; select a particular barangay "
+"to see the reports sent there."
+msgstr ""
+"Dette er en opplisting av alle problemene i denne tjenesten; velg en bestemt "
+"administrasjon for å se problemer som er sendt dit."
+
#: templates/web/default/reports/index.html:7
#: templates/web/emptyhomes/reports/index.html:4
#: templates/web/fiksgatami/nn/reports/index.html:4
@@ -3307,15 +3406,15 @@ msgstr "Dette problemet er lukket"
#: templates/web/bromley/report/display.html:96
#: templates/web/default/report/banner.html:12
-#: templates/web/default/report/display.html:95
+#: templates/web/default/report/update-form.html:46
#: templates/web/emptyhomes/report/display.html:12
-#: templates/web/fixmystreet/report/display.html:90
+#: templates/web/fixmystreet/report/update-form.html:44
msgid "This problem has been fixed"
msgstr "Dette problemet er løst"
#: templates/web/bromley/report/display.html:90
-#: templates/web/default/report/display.html:90
-#: templates/web/fixmystreet/report/display.html:84
+#: templates/web/default/report/update-form.html:41
+#: templates/web/fixmystreet/report/update-form.html:38
msgid "This problem has not been fixed"
msgstr "Dette problemet har ikke blitt løst"
@@ -3327,25 +3426,25 @@ msgstr "Dette problemet er under arbeid"
msgid "This problem is old and of unknown status."
msgstr "Dette problemet er gammel og med ukjent status."
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:83
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:86
msgid "This report is currently marked as closed."
msgstr "Denne rapporten er for tiden markert som lukket."
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:81
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:84
msgid "This report is currently marked as fixed."
msgstr "Denne rapporten er for tiden markert som fikset."
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:85
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:88
msgid "This report is currently marked as open."
msgstr "Denne rapporten er for tiden markert som åpen."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:262
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:264
msgid ""
"This web page also contains a photo of the problem, provided by the user."
msgstr ""
"Denne nettsiden inneholder også et bilde av problemet, sendt inn av brukeren."
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1024
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1034
#: templates/web/default/admin/timeline.html:1
msgid "Timeline"
msgstr "Tidslinje"
@@ -3355,7 +3454,7 @@ msgstr "Tidslinje"
msgid "Title"
msgstr "Tittel"
-#: templates/web/default/around/display_location.html:69
+#: templates/web/default/around/_report_banner.html:2
msgid ""
"To <strong>report a problem</strong>, click on the map at the correct "
"location."
@@ -3370,14 +3469,13 @@ msgstr ""
"For å <strong>rapportere et problem</strong>, klikk på kartet på riktig sted."
#: templates/web/default/alert/index.html:27
-#, fuzzy
msgid ""
"To find out what local alerts we have for you, please enter your postcode or "
"street name and area"
msgstr ""
-"Du finner lokale problemer ved å søke på ditt postnummer, veinavn eller sted:"
+"Du finner lokale problemer ved å søke på ditt postnummer, veinavn eller sted"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:268
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:270
msgid "To view a map of the precise location of this issue"
msgstr "For å se en kart med en mer presis plassering for dette problemet."
@@ -3388,7 +3486,7 @@ msgstr "For å se en kart med en mer presis plassering for dette problemet."
msgid "Total"
msgstr "Totalt"
-#: perllib/FixMyStreet/App/Controller/Reports.pm:43
+#: perllib/FixMyStreet/App/Controller/Reports.pm:42
msgid "Unable to look up areas in MaPit. Please try again later."
msgstr "Klarte ikke slå opp områder i MaPit. Vennligst forsøk igjen senere."
@@ -3402,16 +3500,16 @@ msgstr "Ubekreftet"
msgid "Unknown"
msgstr "Ukjent"
-#: perllib/FixMyStreet/App/Controller/Rss.pm:164
+#: perllib/FixMyStreet/App/Controller/Rss.pm:173
msgid "Unknown alert type"
msgstr "Ukjent varsel-type"
-#: perllib/FixMyStreet/App/Controller/Report.pm:70
+#: perllib/FixMyStreet/App/Controller/Report.pm:87
msgid "Unknown problem ID"
msgstr "Ukjent problem-Id"
#: templates/web/bromley/report/display.html:66
-#: templates/web/fixmystreet/report/display.html:65
+#: templates/web/fixmystreet/report/update-form.html:19
msgid "Update"
msgstr "Oppdatering"
@@ -3449,17 +3547,17 @@ msgstr "En oppdatering markerte dette problemet som fikset."
msgid "Update reopened problem"
msgstr "En oppdatering gjennåpnet problemet"
-#: templates/web/default/admin/council_contacts.html:62
+#: templates/web/default/admin/council_contacts.html:68
msgid "Update statuses"
msgstr "Oppdater tilstanden"
-#: templates/web/default/report/display.html:71
+#: templates/web/default/report/update-form.html:22
msgid "Update:"
msgstr "Oppdatering:"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:694
-#: perllib/FixMyStreet/App/Controller/Admin.pm:809
-#: perllib/FixMyStreet/App/Controller/Admin.pm:889
+#: perllib/FixMyStreet/App/Controller/Admin.pm:708
+#: perllib/FixMyStreet/App/Controller/Admin.pm:839
+#: perllib/FixMyStreet/App/Controller/Admin.pm:899
msgid "Updated!"
msgstr "Oppdatert!"
@@ -3482,20 +3580,21 @@ msgstr "Oppdateringer av {{title}}"
msgid "Updates to this problem, FixMyStreet"
msgstr "Oppdateringer til dette problemet, FiksGataMi"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1182
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1191
msgid "User flag removed"
msgstr "Brukerflagg fjernet"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1154
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1163
msgid "User flagged"
msgstr "Bruker flagget"
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1036
#: templates/web/default/admin/list_flagged.html:30
msgid "Users"
msgstr "Brukere"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:309
-#: perllib/FixMyStreet/App/Controller/Admin.pm:339
+#: perllib/FixMyStreet/App/Controller/Admin.pm:315
+#: perllib/FixMyStreet/App/Controller/Admin.pm:345
msgid "Values updated"
msgstr "Verdier oppdatert"
@@ -3504,10 +3603,9 @@ msgstr "Verdier oppdatert"
msgid "View report on site"
msgstr "Se rapport på nettstedet"
-#: templates/web/default/reports/council.html:18
-#, fuzzy
+#: templates/web/default/reports/body.html:18
msgid "View reports by ward"
-msgstr "Se rapport på nettstedet"
+msgstr "Se rapport per bydel"
#: templates/web/emptyhomes/tokens/confirm_problem.html:39
msgid "View your report"
@@ -3517,20 +3615,19 @@ msgstr "Vis din rapport"
#: templates/web/default/around/display_location.html:33
#: templates/web/emptyhomes/around/display_location.html:0
#: templates/web/emptyhomes/around/display_location.html:16
-#: templates/web/fixmystreet/around/display_location.html:0
-#: templates/web/fixmystreet/around/display_location.html:33
msgid "Viewing a location"
msgstr "Ser på et sted"
#: templates/web/bromley/report/display.html:0
#: templates/web/default/report/display.html:0
+#: templates/web/emptyhomes/report/display.html:1
#: templates/web/emptyhomes/report/display.html:2
#: templates/web/fixmystreet/report/display.html:0
msgid "Viewing a problem"
msgstr "Ser på et problem"
-#: templates/web/default/reports/council.html:20
-#: templates/web/emptyhomes/reports/council.html:18
+#: templates/web/default/reports/body.html:20
+#: templates/web/emptyhomes/reports/body.html:18
msgid "Wards of this council"
msgstr "Bydeler innenfor denne administrasjonen"
@@ -3559,18 +3656,19 @@ msgstr ""
"endret seg med eiedommen du rapporterte."
#: templates/web/bromley/report/display.html:141
-#: templates/web/fixmystreet/report/display.html:153
+#: templates/web/fixmystreet/report/update-form.html:113
msgid "We never show your email"
msgstr "Vi viser aldri din e-postadresse"
#: templates/web/bromley/report/new/fill_in_details_form.html:133
#: templates/web/bromley/report/new/fill_in_details_form.html:179
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:130
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:190
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:144
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:211
+#: templates/web/zurich/report/new/fill_in_details_form.html:114
msgid "We never show your email address or phone number."
msgstr "Vi viser aldri din e-postadresse eller ditt telefonnummer"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:349
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:351
msgid ""
"We realise this problem might be the responsibility of %s; however, we don't "
"currently have any contact details for them. If you know of an appropriate "
@@ -3580,13 +3678,14 @@ msgstr ""
"tiden kontaktinformasjon for dem. Hvis du vet om en egnet kontaktadresse, ta "
"kontakt med oss."
-#: templates/web/default/index.html:34 templates/web/emptyhomes/index.html:59
-#: templates/web/fixmystreet/index.html:45
+#: templates/web/default/index-steps.html:16
+#: templates/web/emptyhomes/index.html:59
msgid "We send it to the council on your behalf"
msgstr "Vi sender til administrasjon på dine vegne"
#: templates/web/bromley/report/new/fill_in_details_form.html:217
#: templates/web/default/report/new/notes.html:5
+#: templates/web/fixmybarangay/report/new/notes.html:5
msgid ""
"We will only use your personal information in accordance with our <a href=\"/"
"faq#privacy\">privacy policy.</a>"
@@ -3595,13 +3694,12 @@ msgstr ""
"faq#privacy\">personvernpolicy.</a>"
#: templates/web/fixmystreet/report/new/notes.html:4
-#, fuzzy
msgid ""
"We will only use your personal information in accordance with our <a href=\"/"
"privacy\">privacy policy.</a>"
msgstr ""
-"Vi vil kun bruke personlig informasjon om deg i henhold til vår <a href=\"/"
-"faq#privacy\">personvernpolicy.</a>"
+"Vi vil kun bruke personlige informasjon om deg i henhold til våre <a href=\"/"
+"faq#privacy\">personvernsregler.</a>"
#: templates/web/emptyhomes/contact/blurb.html:2
msgid ""
@@ -3622,8 +3720,8 @@ msgstr ""
"Vi ønsker å få din tilbakemelding om hva du mener om denne tjenesten. Bare "
"fyll ut skjemaet, eller send en e-post <a href='mailto:%s'>%s</a>:"
-#: templates/web/default/admin/council_contacts.html:41
-#: templates/web/default/admin/council_edit.html:41
+#: templates/web/default/admin/council_contacts.html:45
+#: templates/web/default/admin/council_edit.html:69
msgid "When edited"
msgstr "Når redigert"
@@ -3632,7 +3730,7 @@ msgstr "Når redigert"
msgid "When sent"
msgstr "Når sendt"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:612
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:611
msgid "Whole block of empty flats"
msgstr "Hel blokk med tomme leiligheter"
@@ -3648,7 +3746,7 @@ msgstr ""
"href=\"%s\">MaPit</a>."
#: templates/web/fixmystreet/footer.html:22
-#, fuzzy
+#: templates/web/stevenage/footer.html:22
msgid ""
"Would you like better integration with FixMyStreet? <a href=\"http://www."
"mysociety.org/for-councils/fixmystreet/\">Find out about FixMyStreet for "
@@ -3658,6 +3756,7 @@ msgstr ""
"Finn ut mer om FiksGataMi for administrajoner</a>."
#: templates/web/fixmystreet/footer.html:18
+#: templates/web/stevenage/footer.html:18
msgid ""
"Would you like to contribute to FixMyStreet? Our code is open source and <a "
"href=\"http://github.com/mysociety/fixmystreet\">available on GitHub</a>."
@@ -3675,6 +3774,7 @@ msgstr ""
"sjekke status?"
#: templates/web/default/report/new/notes.html:8
+#: templates/web/fixmybarangay/report/new/notes.html:8
#: templates/web/fixmystreet/report/new/notes.html:7
msgid ""
"Writing your message entirely in block capitals makes it hard to read, as "
@@ -3687,8 +3787,9 @@ msgstr ""
msgid "Year"
msgstr "År"
-#: templates/web/default/admin/council_contacts.html:48
-#: templates/web/default/admin/council_contacts.html:49
+#: templates/web/default/admin/council_contacts.html:52
+#: templates/web/default/admin/council_contacts.html:53
+#: templates/web/default/admin/council_contacts.html:54
#: templates/web/default/admin/council_edit.html:5
#: templates/web/default/admin/list_updates.html:30
#: templates/web/default/admin/list_updates.html:31
@@ -3708,8 +3809,8 @@ msgstr "Ja"
#: templates/web/bromley/report/display.html:155
#: templates/web/bromley/report/new/fill_in_details_form.html:198
-#: templates/web/fixmystreet/report/display.html:133
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:156
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:171
+#: templates/web/fixmystreet/report/update-form.html:87
msgid "Yes I have a password"
msgstr "<strong>Ja</strong>, jeg har et passord"
@@ -3731,7 +3832,7 @@ msgstr ""
"Du rapporterer at følgende oppdatering er støtende, inneholder personlig "
"informasjon, eller lignende:"
-#: templates/web/emptyhomes/reports/council.html:64
+#: templates/web/emptyhomes/reports/body.html:64
msgid ""
"You can <a href=\"%s\">view all reports for the council</a> or <a href=\"/"
"reports\">show all councils</a>."
@@ -3739,7 +3840,7 @@ msgstr ""
"Du kan <a href=\"%s\">se alle rapporter for administrasjonen</a> eller <a "
"href=\"/reports\">se alle administrasjonene</a>."
-#: templates/web/emptyhomes/reports/council.html:66
+#: templates/web/emptyhomes/reports/body.html:66
msgid "You can <a href=\"/reports\">show all councils</a>."
msgstr "Du kan <a href=\"/reports/\">se alle administrasjoner</a>."
@@ -3767,7 +3868,8 @@ msgstr ""
#: templates/web/default/questionnaire/index.html:92
#: templates/web/default/report/new/fill_in_details_form.html:93
#: templates/web/fixmystreet/questionnaire/index.html:87
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:101
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:99
+#: templates/web/zurich/report/new/fill_in_details_form.html:93
msgid ""
"You have already attached a photo to this report, attaching another one will "
"replace it."
@@ -3776,8 +3878,8 @@ msgstr ""
"vil bytte ut dette."
#: templates/web/bromley/report/display.html:106
-#: templates/web/default/report/display.html:106
-#: templates/web/fixmystreet/report/display.html:100
+#: templates/web/default/report/update-form.html:57
+#: templates/web/fixmystreet/report/update-form.html:54
msgid ""
"You have already attached a photo to this update, attaching another one will "
"replace it."
@@ -3786,12 +3888,14 @@ msgstr ""
"annet vil bytte ut dette."
#: templates/web/default/auth/sign_out.html:3
+#: templates/web/fixmybarangay/auth/sign_out.html:3
msgid "You have been signed out"
msgstr "Du er allerede logget ut"
#: templates/web/bromley/report/new/fill_in_details_form.html:25
#: templates/web/default/report/new/fill_in_details_form.html:7
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:27
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:28
+#: templates/web/zurich/report/new/fill_in_details_form.html:28
msgid ""
"You have located the problem at the point marked with a green pin on the "
"map. If this is not the correct location, simply click on the map again. "
@@ -3826,8 +3930,8 @@ msgstr "Du har lykkes med å opprette ditt varsel."
msgid "You have successfully deleted your alert."
msgstr "Sletting av ditt varsel var vellykket."
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:740
-#: perllib/FixMyStreet/App/Controller/Report/Update.pm:136
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:743
+#: perllib/FixMyStreet/App/Controller/Report/Update.pm:140
msgid ""
"You have successfully signed in; please check and confirm your details are "
"accurate:"
@@ -3861,15 +3965,17 @@ msgstr "Dine rapporter"
#: templates/web/fixmystreet/alert/updates.html:19
#: templates/web/fixmystreet/alert/updates.html:22
#: templates/web/fixmystreet/contact/index.html:72
-#: templates/web/fixmystreet/report/display.html:34
-#: templates/web/fixmystreet/report/display.html:36
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:142
+#: templates/web/fixmystreet/report/display.html:53
+#: templates/web/fixmystreet/report/display.html:55
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:115
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:157
+#: templates/web/zurich/report/new/fill_in_details_form.html:106
msgid "Your email"
msgstr "Din e-post"
#: templates/web/bromley/report/display.html:130
#: templates/web/fixmystreet/auth/general.html:26
-#: templates/web/fixmystreet/report/display.html:124
+#: templates/web/fixmystreet/report/update-form.html:78
msgid "Your email address"
msgstr "Din e-postadresse"
@@ -3878,54 +3984,53 @@ msgid "Your email address:"
msgstr "Din e-postadresse:"
#: templates/web/default/alert/_list.html:92
-#: templates/web/default/report/display.html:128
#: templates/web/default/report/new/fill_in_details_form.html:124
+#: templates/web/default/report/update-form.html:79
+#: templates/web/fixmybarangay/alert/_list.html:37
msgid "Your email:"
msgstr "Din e-post"
#: templates/web/bromley/report/display.html:193
#: templates/web/bromley/report/new/fill_in_details_form.html:117
#: templates/web/bromley/report/new/fill_in_details_form.html:164
-#, fuzzy
msgid "Your first name"
-msgstr "Ditt navn"
+msgstr "Ditt fornavn"
#: templates/web/fixmystreet/report/updates-sidebar-notes.html:5
-#, fuzzy
msgid ""
"Your information will only be used in accordance with our <a href=\"/privacy"
"\">privacy policy</a>"
msgstr ""
-"Vi vil kun bruke personlig informasjon om deg i henhold til vår <a href=\"/"
-"faq#privacy\">personvernpolicy.</a>"
+"Vi vil kun bruke personlig informasjon om deg i henhold til våre <a href=\"/"
+"faq#privacy\">personvernsregler.</a>"
#: templates/web/bromley/report/display.html:199
#: templates/web/bromley/report/new/fill_in_details_form.html:123
#: templates/web/bromley/report/new/fill_in_details_form.html:170
-#, fuzzy
msgid "Your last name"
-msgstr "Ditt navn"
+msgstr "Ditt etternavn"
-#: templates/web/fixmystreet/auth/general.html:53
+#: templates/web/fixmystreet/auth/general.html:57
#: templates/web/fixmystreet/contact/index.html:65
-#: templates/web/fixmystreet/report/display.html:181
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:121
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:181
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:124
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:202
+#: templates/web/fixmystreet/report/update-form.html:138
+#: templates/web/zurich/report/new/fill_in_details_form.html:122
msgid "Your name"
msgstr "Ditt navn"
#: templates/web/default/auth/general.html:59
#: templates/web/default/contact/index.html:68
-#: templates/web/default/report/display.html:202
#: templates/web/default/report/new/fill_in_details_form.html:203
+#: templates/web/default/report/update-form.html:149
msgid "Your name:"
msgstr "Ditt navn:"
#: templates/web/bromley/report/display.html:160
#: templates/web/bromley/report/new/fill_in_details_form.html:203
-#: templates/web/fixmystreet/auth/general.html:37
-#: templates/web/fixmystreet/report/display.html:138
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:161
+#: templates/web/fixmystreet/auth/general.html:41
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:176
+#: templates/web/fixmystreet/report/update-form.html:92
msgid "Your password"
msgstr "Ditt passord"
@@ -3935,8 +4040,9 @@ msgstr "Ditt passord har blitt endret"
#: templates/web/bromley/report/new/fill_in_details_form.html:137
#: templates/web/bromley/report/new/fill_in_details_form.html:184
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:134
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:195
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:149
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:216
+#: templates/web/zurich/report/new/fill_in_details_form.html:125
msgid "Your phone number"
msgstr "Ditt telefonnummer"
@@ -3949,11 +4055,11 @@ msgstr "Dine rapporter"
#: templates/web/fiksgatami/footer.html:6
#: templates/web/fiksgatami/nn/footer.html:6
#: templates/web/fixmystreet/footer.html:47
-#: templates/web/reading/footer.html:7
+#: templates/web/reading/footer.html:7 templates/web/stevenage/footer.html:41
msgid "Your reports"
msgstr "Dine oppdateringer"
-#: templates/web/default/my/my.html:45 templates/web/fixmystreet/my/my.html:45
+#: templates/web/default/my/my.html:45 templates/web/fixmystreet/my/my.html:49
msgid "Your updates"
msgstr "Dine oppdateringer"
@@ -3965,19 +4071,24 @@ msgstr "Din&nbsp;e-post:"
msgid "by %s"
msgstr "av %s"
-#: templates/web/default/reports/council.html:12
-#: templates/web/default/reports/council.html:13
-#: templates/web/emptyhomes/reports/council.html:6
-#: templates/web/emptyhomes/reports/council.html:7
+#: templates/web/default/reports/body.html:12
+#: templates/web/default/reports/body.html:13
+#: templates/web/emptyhomes/reports/body.html:6
+#: templates/web/emptyhomes/reports/body.html:7
msgid "council"
msgstr "administrasjon"
+#: perllib/FixMyStreet/DB/Result/Problem.pm:608
+#, fuzzy
+msgid "council ref:&nbsp;%s"
+msgstr "%s ref:&nbsp;%s"
+
#: templates/web/default/admin/report_edit.html:15
msgid "didn't use map"
msgstr "brukte ikke kart"
#: templates/web/default/alert/index.html:33
-#: templates/web/fixmystreet/around/postcode_form.html:17
+#: templates/web/fixmystreet/around/postcode_form.html:20
msgid "e.g. ‘%s’ or ‘%s’"
msgstr "for eksempel «%s» eller «%s»"
@@ -3985,7 +4096,7 @@ msgstr "for eksempel «%s» eller «%s»"
msgid "from %d different users"
msgstr "fra %d forskjellige brukere"
-#: perllib/Utils.pm:289
+#: perllib/Utils.pm:267
msgid "less than a minute"
msgstr "mindre enn et minutt"
@@ -3997,17 +4108,22 @@ msgstr "markert som %s"
msgid "marked as fixed"
msgstr "markert som fikset"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:112
+#: perllib/FixMyStreet/App/Controller/Admin.pm:113
#: templates/web/default/admin/questionnaire.html:15
#: templates/web/default/admin/questionnaire.html:16
msgid "n/a"
msgstr "n/a"
#: templates/web/default/alert/_list.html:87
+#: templates/web/fixmybarangay/alert/_list.html:32
#: templates/web/fixmystreet/alert/_list.html:85
msgid "or"
msgstr "eller"
+#: templates/web/default/js/validation_strings.html:21
+msgid "or locate me automatically"
+msgstr ""
+
#: templates/web/default/admin/report_edit.html:15
msgid "originally entered"
msgstr "søkte etter"
@@ -4022,9 +4138,9 @@ msgstr "åpnet på nytt"
#: templates/web/barnet/header.html:71 templates/web/bromley/header.html:100
#: templates/web/bromley/header.html:65
-#: templates/web/fixmybarangay/header.html.orig:43
-#: templates/web/fixmystreet/header.html:48
-#: templates/web/zurich/header.html:48
+#: templates/web/fixmybarangay/header.html:65
+#: templates/web/fixmystreet/header.html:50
+#: templates/web/stevenage/header.html:98 templates/web/zurich/header.html:48
msgid "sign out"
msgstr "logg ut"
@@ -4034,22 +4150,20 @@ msgstr "logg ut"
#: templates/web/default/report/new/fill_in_details_form.html:14
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:6
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:9
+#: templates/web/zurich/report/new/fill_in_details_form.html:6
+#: templates/web/zurich/report/new/fill_in_details_form.html:9
msgid "the local council"
msgstr "den lokale administrasjonen"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:541
-msgid "the map was not used so pin location may be inaccurate"
-msgstr "kartet ble ikke brukt, så nåleposisjon kan være unøyaktig"
-
-#: perllib/FixMyStreet/DB/Result/Problem.pm:603
-msgid "their ref:&nbsp;%s"
+#: templates/web/default/report/_main.html:6
+msgid "there is no pin shown as the user did not use the map"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:330
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:332
msgid "this type of local problem"
msgstr "denne type lokalt problem"
-#: perllib/Utils.pm:263
+#: perllib/Utils.pm:241
msgid "today"
msgstr "idag"
@@ -4065,10 +4179,10 @@ msgstr "bruker er fra samme administrasjon som problemet - %d"
msgid "user is problem owner"
msgstr "bruker er eier av problemet"
-#: templates/web/default/reports/council.html:0
-#: templates/web/default/reports/council.html:9
-#: templates/web/emptyhomes/reports/council.html:0
-#: templates/web/emptyhomes/reports/council.html:3
+#: templates/web/default/reports/body.html:0
+#: templates/web/default/reports/body.html:9
+#: templates/web/emptyhomes/reports/body.html:0
+#: templates/web/emptyhomes/reports/body.html:3
msgid "ward"
msgstr "bydel"
@@ -4102,6 +4216,34 @@ msgstr "vil ditt problem ikke bli publisert"
msgid "your update will not be posted"
msgstr "din oppdatering vil ikke bli publisert"
+#: templates/web/emptyhomes/front/stats.html:17
+#, perl-format
+msgid "<big>%s</big> report recently"
+msgid_plural "<big>%s</big> reports recently"
+msgstr[0] "<big>%s</big> rapportert<br>nylig"
+msgstr[1] "<big>%s</big> rapportert<br>nylig"
+
+#: perllib/Utils.pm:286
+#, fuzzy, perl-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d time"
+msgstr[1] "%d time"
+
+#: perllib/Utils.pm:288
+#, fuzzy, perl-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d minutt"
+msgstr[1] "%d minutt"
+
+#: templates/web/default/front/stats.html:29
+#, perl-format
+msgid "<big>%s</big> update on reports"
+msgid_plural "<big>%s</big> updates on reports"
+msgstr[0] "<big>%s</big> rapport-<br>oppdatering"
+msgstr[1] "<big>%s</big> rapport-<br>oppdateringer"
+
#: templates/web/emptyhomes/report/new/councils_text_none.html:3
#, perl-format
msgid "We do not yet have details for the council that covers this location."
@@ -4112,12 +4254,12 @@ msgstr[0] ""
msgstr[1] ""
"Vi har ennå ikke detaljer for administrasjonene som dekker dette stedet."
-#: templates/web/emptyhomes/front/stats.html:17
-#, perl-format
-msgid "<big>%s</big> report recently"
-msgid_plural "<big>%s</big> reports recently"
-msgstr[0] "<big>%s</big> rapportert<br>nylig"
-msgstr[1] "<big>%s</big> rapportert<br>nylig"
+#: perllib/Utils.pm:282
+#, fuzzy, perl-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] "%d uke"
+msgstr[1] "%d uke"
#: templates/web/emptyhomes/front/stats.html:12
#, perl-format
@@ -4148,12 +4290,52 @@ msgstr[1] ""
"Vi har ennå <strong>ikke</strong> detaljene for de andre administrasjonene "
"som dekker dette stedet."
-#: templates/web/default/front/stats.html:29
-#, perl-format
-msgid "<big>%s</big> update on reports"
-msgid_plural "<big>%s</big> updates on reports"
-msgstr[0] "<big>%s</big> rapport-<br>oppdatering"
-msgstr[1] "<big>%s</big> rapport-<br>oppdateringer"
+#: perllib/Utils.pm:284
+#, fuzzy, perl-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] "%d dag"
+msgstr[1] "%d dag"
+
+#~ msgid "FixMyStreet administration"
+#~ msgstr "Fiksgatami-administrasjon"
+
+#~ msgid "List Flagged"
+#~ msgstr "List flagget"
+
+#~ msgid "Search Abuse"
+#~ msgstr "Søk etter misbruk"
+
+#~ msgid "Search Abuse Table"
+#~ msgstr "Søk i misbrukstabell"
+
+#~ msgid ""
+#~ "Please do not be abusive &mdash; abusing your council devalues the "
+#~ "service for all users."
+#~ msgstr ""
+#~ "Ikke vær ufin &mdash; å kjefte på din administrasjon skader verdien av "
+#~ "tjenesten for alle brukerne."
+
+#~ msgid "%d days"
+#~ msgstr "%d dager"
+
+#~ msgid "%d hours"
+#~ msgstr "%d timer"
+
+#~ msgid "%d minutes"
+#~ msgstr "%d minutter"
+
+#~ msgid "%d weeks"
+#~ msgstr "%d uker"
+
+#~ msgid "All"
+#~ msgstr "Alle"
+
+#~ msgid "the map was not used so pin location may be inaccurate"
+#~ msgstr "kartet ble ikke brukt, så nåleposisjon kan være unøyaktig"
+
+#~ msgid "their ref:&nbsp;%s"
+#~ msgstr "deres ref:&nbsp;%s"
#~ msgid "FixMyStreet for Councils"
#~ msgstr "FiksGataMi for det offentlige"
diff --git a/locale/nn_NO.UTF-8/LC_MESSAGES/FixMyStreet.po b/locale/nn_NO.UTF-8/LC_MESSAGES/FixMyStreet.po
index 22a04be64..e8b2ee555 100644
--- a/locale/nn_NO.UTF-8/LC_MESSAGES/FixMyStreet.po
+++ b/locale/nn_NO.UTF-8/LC_MESSAGES/FixMyStreet.po
@@ -11,7 +11,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 1.0\n"
"Report-Msgid-Bugs-To: matthew@mysociety.org\n"
-"POT-Creation-Date: 2012-08-21 09:54+0100\n"
+"POT-Creation-Date: 2012-12-10 13:18+0000\n"
"PO-Revision-Date: 2011-12-08 10:56+0100\n"
"Last-Translator: Anders Einar Hilden <hildenae@gmail.com>\n"
"Language-Team: Norwegian Nynorsk <i18n-nn@lister.ping.uio.no>\n"
@@ -21,8 +21,8 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:555
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:337
+#: perllib/FixMyStreet/DB/Result/Problem.pm:560
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:339
msgid " and "
msgstr " og "
@@ -55,86 +55,55 @@ msgstr "%d stadfesta varsel, %d ikkje stadfesta"
msgid "%d council contacts &ndash; %d confirmed, %d unconfirmed"
msgstr "%d administrasjonskontaktar &ndash; %d stadfesta, %d ikkje stadfesta"
-#: perllib/Utils.pm:293
-msgid "%d day"
-msgstr "%d dag"
-
-#: perllib/Utils.pm:293
-msgid "%d days"
-msgstr "%d dagar"
-
#: templates/web/default/admin/council_list.html:27
msgid "%d edits by %s"
msgstr "%d redigeringar av %s"
-#: perllib/Utils.pm:294
-msgid "%d hour"
-msgstr "%d time"
-
-#: perllib/Utils.pm:294
-msgid "%d hours"
-msgstr "%d timar"
-
#: templates/web/default/admin/index.html:16
msgid "%d live updates"
msgstr "%d aktive oppdateringar"
-#: perllib/Utils.pm:295
-msgid "%d minute"
-msgstr "%d minutt"
-
-#: perllib/Utils.pm:295
-msgid "%d minutes"
-msgstr "%d minutt"
-
#: templates/web/default/admin/index.html:18
msgid "%d questionnaires sent &ndash; %d answered (%s%%)"
msgstr "%d spørjeskjema sendt &ndash; %d svart (%s%%)"
-#: perllib/Utils.pm:292
-msgid "%d week"
-msgstr "%d veke"
-
-#: perllib/Utils.pm:292
-msgid "%d weeks"
-msgstr "%d veker"
+#: templates/web/default/report/_support.html:3
+msgid "%d supporters"
+msgstr ""
-#: templates/web/default/reports/council.html:0
-#: templates/web/default/reports/council.html:26
-#: templates/web/emptyhomes/reports/council.html:11
-#: templates/web/emptyhomes/reports/council.html:13
+#: templates/web/default/reports/body.html:0
+#: templates/web/default/reports/body.html:26
+#: templates/web/emptyhomes/reports/body.html:11
+#: templates/web/emptyhomes/reports/body.html:13
msgid "%s - Summary reports"
msgstr "%s – oppsummeringsrapportar"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:605
+#: perllib/FixMyStreet/DB/Result/Problem.pm:610
msgid "%s ref:&nbsp;%s"
msgstr ""
-#: perllib/FixMyStreet/Cobrand/UK.pm:288 perllib/FixMyStreet/Cobrand/UK.pm:300
+#: perllib/FixMyStreet/Cobrand/UK.pm:279 perllib/FixMyStreet/Cobrand/UK.pm:291
msgid "%s ward, %s"
msgstr "%s bydel, %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:488
+#: perllib/FixMyStreet/DB/Result/Problem.pm:496
msgid "%s, reported anonymously at %s"
msgstr "%s, rapportert anonymt %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:490
+#: perllib/FixMyStreet/DB/Result/Problem.pm:498
msgid "%s, reported by %s at %s"
msgstr "%s, rapportert av %s %s"
-#: perllib/FixMyStreet/Cobrand/UK.pm:315 perllib/FixMyStreet/Cobrand/UK.pm:327
+#: perllib/FixMyStreet/Cobrand/UK.pm:306 perllib/FixMyStreet/Cobrand/UK.pm:318
msgid "%s, within %s ward"
msgstr "%s, innanfor bydelen %s"
-#: templates/web/default/admin/stats.html:5
-msgid "%sreports between %s and %s"
-msgstr "%srapportar mellom %s og %s"
-
#: templates/web/default/email_sent.html:28
msgid "(Don't worry &mdash; %s)"
msgstr "(Ingen grunn til å uroa seg &mdash; %s)"
#: templates/web/default/admin/report_blocks.html:11
+#: templates/web/default/admin/search_users.html:23
msgid "(Email in abuse table)"
msgstr "(Epost i misbruktabellen)"
@@ -162,7 +131,7 @@ msgid "(fixed)"
msgstr "(løyst)"
#: templates/web/default/index.html:12 templates/web/default/index.html:8
-#: templates/web/fixmystreet/around/postcode_form.html:7
+#: templates/web/fixmystreet/around/intro.html:2
msgid "(like graffiti, fly tipping, broken paving slabs, or street lighting)"
msgstr "(som tagging, søppel, hol i vegen, eller øydelagte gatelys)"
@@ -172,6 +141,7 @@ msgid "(not sent to council)"
msgstr "(ikkje rapportert til administrasjonen)"
#: templates/web/default/report/new/fill_in_details_form.html:217
+#: templates/web/zurich/report/new/fill_in_details_form.html:118
msgid "(optional)"
msgstr "(valfritt)"
@@ -184,22 +154,22 @@ msgstr "(sendt til begge)"
msgid "(we never show your email address or phone number)"
msgstr "(vi viser aldri e-postadressa di eller telefonnummeret ditt)"
-#: templates/web/default/report/display.html:209
+#: templates/web/default/report/update-form.html:156
msgid "(we never show your email)"
msgstr "(vi viser aldri e-postadressa di)"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:284
+#: perllib/FixMyStreet/App/Controller/Admin.pm:285
msgid "*unknown*"
msgstr "*ukjent*"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:629
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:655
-#: perllib/FixMyStreet/DB/Result/Problem.pm:345
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:628
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:656
+#: perllib/FixMyStreet/DB/Result/Problem.pm:353
msgid "-- Pick a category --"
msgstr "-- Vel ein kategori --"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:609
-#: perllib/FixMyStreet/DB/Result/Problem.pm:351
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:608
+#: perllib/FixMyStreet/DB/Result/Problem.pm:359
msgid "-- Pick a property type --"
msgstr "-- Vel ein eigedomstype --"
@@ -209,6 +179,10 @@ msgstr "-- Vel ein eigedomstype --"
msgid ". You can <a href=\"%s%s\">view the problem on this site</a>."
msgstr ". Du kan <a href=\"%s\">lesa om problemet på portalen</a>."
+#: templates/web/default/report/_support.html:3
+msgid "1 supporter"
+msgstr ""
+
#: templates/web/default/questionnaire/completed.html:20
msgid ""
"<p style=\"font-size:150%\">Thank you very much for filling in our "
@@ -235,7 +209,7 @@ msgstr ""
"av folk i nabolaget som jobbar saman, kva med å <a href=\"http://www."
"pledgebank.com/new\">publisera ei utfordring om å bidra</a>?</p>"
-#: templates/web/fixmystreet/questionnaire/completed-open.html:1
+#: templates/web/fixmystreet/questionnaire/completed-open.html:6
#, fuzzy
msgid ""
"<p style=\"font-size:150%\">We&rsquo;re sorry to hear that. We have two\n"
@@ -254,7 +228,7 @@ msgstr ""
"av folk i nabolaget som jobbar saman, kva med å <a href=\"http://www."
"pledgebank.com/new\">publisera ei utfordring om å bidra</a>?</p>"
-#: templates/web/default/questionnaire/completed-open.html:1
+#: templates/web/default/questionnaire/completed-open.html:6
#, fuzzy
msgid ""
"<p style=\"font-size:150%\">We&rsquo;re sorry to hear that. We have two\n"
@@ -317,8 +291,8 @@ msgstr ""
"informasjon om status for problemet ditt, ver så snill og kom tilbake\n"
"til nettstaden og legg igjen ei oppdatering.</p>"
-#: templates/web/default/around/display_location.html:70
-#: templates/web/default/around/display_location.html:72
+#: templates/web/default/around/_report_banner.html:3
+#: templates/web/default/around/_report_banner.html:5
#: templates/web/emptyhomes/around/display_location.html:36
#: templates/web/emptyhomes/around/display_location.html:38
msgid ""
@@ -332,17 +306,17 @@ msgstr ""
msgid "<strong>%d</strong> live problems"
msgstr "<strong>%d</strong> aktive problem"
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:172
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:193
#, fuzzy
msgid "<strong>No</strong> Let me confirm my report by email"
msgstr "<strong>Nei</strong>, la meg stadfesta rapporten min med e-post:"
-#: templates/web/fixmystreet/report/display.html:148
+#: templates/web/fixmystreet/report/update-form.html:108
#, fuzzy
msgid "<strong>No</strong> Let me confirm my update by email"
msgstr "<strong>Nei</strong>, la meg stadfesta oppdateringa mi med e-post:"
-#: templates/web/fixmystreet/auth/general.html:46
+#: templates/web/fixmystreet/auth/general.html:50
#, fuzzy
msgid "<strong>No</strong> let me sign in by email"
msgstr "<strong>Nei</strong>, det gjer eg ikkje. La meg logga inn med e-post:"
@@ -355,17 +329,17 @@ msgstr "<strong>Nei</strong>, det gjer eg ikkje. La meg logga inn med e-post:"
msgid "<strong>No</strong>, let me confirm my report by email:"
msgstr "<strong>Nei</strong>, la meg stadfesta rapporten min med e-post:"
-#: templates/web/default/report/display.html:164
+#: templates/web/default/report/update-form.html:115
msgid "<strong>No</strong>, let me confirm my update by email:"
msgstr "<strong>Nei</strong>, la meg stadfesta oppdateringa mi med e-post:"
#: templates/web/default/auth/general.html:37
-#: templates/web/default/report/display.html:142
#: templates/web/default/report/new/fill_in_details_form.html:140
-#: templates/web/fixmystreet/auth/general.html:32
-#: templates/web/fixmystreet/auth/general.html:34
-#: templates/web/fixmystreet/report/display.html:131
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:154
+#: templates/web/default/report/update-form.html:93
+#: templates/web/fixmystreet/auth/general.html:36
+#: templates/web/fixmystreet/auth/general.html:38
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:169
+#: templates/web/fixmystreet/report/update-form.html:85
#, fuzzy
msgid "<strong>Yes</strong> I have a password"
msgstr "<strong>Ja</strong>, eg har eit passord:"
@@ -378,11 +352,11 @@ msgstr "<strong>Ja</strong>, eg har eit passord:"
msgid "About us"
msgstr "Om oss"
-#: templates/web/default/admin/council_contacts.html:66
+#: templates/web/default/admin/council_contacts.html:72
msgid "Add new category"
msgstr "Legg til ny kategori"
-#: templates/web/default/my/my.html:56 templates/web/fixmystreet/my/my.html:56
+#: templates/web/default/my/my.html:56 templates/web/fixmystreet/my/my.html:60
msgid "Added %s"
msgstr "La til %s"
@@ -399,16 +373,13 @@ msgid "Alert %d disabled (created %s)"
msgstr "Varsel %d kobla ut (oppretta %s)"
#: templates/web/bromley/report/display.html:207
-#: templates/web/default/report/display.html:214
-#: templates/web/fixmystreet/report/display.html:189
+#: templates/web/default/report/update-form.html:161
+#: templates/web/fixmystreet/report/update-form.html:146
msgid "Alert me to future updates"
msgstr "Send meg varsel ved framtidige oppdateringar"
-#: templates/web/default/admin/stats.html:5
-msgid "All"
-msgstr "Alle"
-
#: templates/web/default/reports/index.html:3
+#: templates/web/fixmybarangay/reports/index.html:3
#, fuzzy
msgid "All Reports"
msgstr "Alle rapportar"
@@ -421,11 +392,18 @@ msgstr "Alle stadfesta"
#: templates/web/bromley/header.html:77 templates/web/default/footer.html:11
#: templates/web/fiksgatami/footer.html:7
#: templates/web/fiksgatami/nn/footer.html:7
+#: templates/web/fixmybarangay/footer.html:20
#: templates/web/fixmystreet/footer.html:49
-#: templates/web/reading/footer.html:8
+#: templates/web/reading/footer.html:8 templates/web/stevenage/footer.html:43
+#: templates/web/zurich/footer.html:12
msgid "All reports"
msgstr "Alle rapportar"
+#: templates/web/default/admin/stats.html:5
+#, fuzzy
+msgid "All reports between %s and %s"
+msgstr "%srapportar mellom %s og %s"
+
#: templates/web/default/report/new/councils_text_some.html:2
msgid "All the information you provide here will be sent to"
msgstr "All informasjonen du har lagt inn her vil sendast til"
@@ -459,6 +437,8 @@ msgstr ""
#: templates/web/default/report/new/fill_in_details_form.html:13
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:6
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:8
+#: templates/web/zurich/report/new/fill_in_details_form.html:6
+#: templates/web/zurich/report/new/fill_in_details_form.html:8
msgid ""
"All the information you provide here will be sent to <strong>%s</strong>."
msgstr ""
@@ -499,10 +479,12 @@ msgid ""
msgstr "Er du ein utviklar? Kunne du tenkja deg å bidra til FiksGataMi?"
#: templates/web/fixmystreet/footer.html:17
+#: templates/web/stevenage/footer.html:17
msgid "Are you a developer?"
msgstr ""
#: templates/web/fixmystreet/footer.html:21
+#: templates/web/stevenage/footer.html:21
#, fuzzy
msgid "Are you from a council?"
msgstr "den lokale administrasjonen"
@@ -525,6 +507,16 @@ msgstr "For augneblunken går det berre an å søkja etter og å sjå på rappor
msgid "Ban email address"
msgstr "Bannlys e-postadresse"
+#: templates/web/fixmybarangay/report/new/notes.html:7
+msgid ""
+"Be sure to choose the right category, because we use that to determine to "
+"whom the report is sent."
+msgstr ""
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1032
+msgid "Bodies"
+msgstr ""
+
#: templates/web/fiksgatami/footer.html:16
#: templates/web/fiksgatami/nn/footer.html:16
msgid ""
@@ -538,22 +530,23 @@ msgstr ""
msgid "By Date"
msgstr "På dato"
-#: templates/web/fixmystreet/around/display_location.html:80
-#: templates/web/fixmystreet/around/display_location.html:82
+#: templates/web/fixmystreet/around/_report_banner.html:10
+#: templates/web/fixmystreet/around/_report_banner.html:8
#, fuzzy
msgid "Can't see the map? <a href='%s' rel='nofollow'>Skip this step</a>"
msgstr ""
"<small>Viss du ikkje kan sjå kartet, <a href='%s' rel='nofollow'>hopp over "
"dette steget</a>.</small>"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:632
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:657
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:631
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:658
#: templates/web/bromley/report/new/fill_in_details_form.html:68
-#: templates/web/default/admin/council_contacts.html:35
+#: templates/web/default/admin/council_contacts.html:37
#: templates/web/default/admin/index.html:36
#: templates/web/default/admin/list_flagged.html:14
#: templates/web/default/admin/search_reports.html:17
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:72
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:74
+#: templates/web/zurich/report/new/fill_in_details_form.html:68
msgid "Category"
msgstr "Kategori"
@@ -561,14 +554,14 @@ msgstr "Kategori"
msgid "Category fix rate for problems > 4 weeks old"
msgstr "Løysingsrate fordelt på kategori for problem > 4 veker gamle"
-#: templates/web/default/admin/council_contacts.html:72
+#: templates/web/default/admin/council_contacts.html:78
#: templates/web/default/admin/council_edit.html:23
#: templates/web/default/admin/report_edit.html:25
#: templates/web/default/report/new/fill_in_details_form.html:67
msgid "Category:"
msgstr "Kategori:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:334
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:336
msgid "Category: %s"
msgstr "Kategori: %s"
@@ -578,8 +571,8 @@ msgstr "Kategori: %s"
msgid "Change Password"
msgstr "Byt passord"
-#: templates/web/fixmystreet/around/display_location.html:72
-#: templates/web/fixmystreet/around/display_location.html:73
+#: templates/web/default/js/validation_strings.html:22
+#: templates/web/fixmystreet/around/_report_banner.html:2
#, fuzzy
msgid "Click map to report a problem"
msgstr "Korleis rapportera eit problem"
@@ -588,22 +581,22 @@ msgstr "Korleis rapportera eit problem"
#: templates/web/bromley/report/display.html:82
#: templates/web/default/admin/report_edit.html:18
#: templates/web/default/admin/report_edit.html:20
-#: templates/web/default/dashboard/index.html:136
#: templates/web/default/dashboard/index.html:138
-#: templates/web/default/report/display.html:79
-#: templates/web/default/report/display.html:81
+#: templates/web/default/dashboard/index.html:140
+#: templates/web/default/report/update-form.html:30
+#: templates/web/default/report/update-form.html:32
#: templates/web/fixmystreet/report/banner.html:15
-#: templates/web/fixmystreet/report/display.html:74
-#: templates/web/fixmystreet/report/display.html:76
+#: templates/web/fixmystreet/report/update-form.html:28
+#: templates/web/fixmystreet/report/update-form.html:30
msgid "Closed"
msgstr "Lukka"
# skal det vera forskjellig tyding frå engelsken her? --KBU
-#: perllib/FixMyStreet/DB/Result/Problem.pm:690
+#: perllib/FixMyStreet/DB/Result/Problem.pm:695
msgid "Closed by council"
msgstr "(ikkje rapportert til administrasjonen)"
-#: templates/web/default/my/my.html:32 templates/web/fixmystreet/my/my.html:32
+#: templates/web/default/my/my.html:32 templates/web/fixmystreet/my/my.html:36
msgid "Closed reports"
msgstr "Lukka rapportar"
@@ -611,8 +604,8 @@ msgstr "Lukka rapportar"
msgid "Closed:"
msgstr "Lukka:"
-#: templates/web/default/around/display_location.html:103
-#: templates/web/default/around/display_location.html:105
+#: templates/web/default/around/tabbed_lists.html:10
+#: templates/web/default/around/tabbed_lists.html:12
msgid "Closest nearby problems <small>(within&nbsp;%skm)</small>"
msgstr "Dei næraste problema <small>(innanfor&nbsp;%skm)</small>"
@@ -636,23 +629,28 @@ msgstr "Data om merkevaresamarbeid:"
msgid "Cobrand:"
msgstr "Merkevaresamarbeid:"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:358
+#: perllib/FixMyStreet/App/Controller/Admin.pm:365
msgid "Configuration updated"
msgstr "Oppsett oppdatert"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:372
+#: perllib/FixMyStreet/App/Controller/Admin.pm:380
msgid "Configuration updated - contacts will be generated automatically later"
msgstr "Oppsett oppdatert - kontaktar vil genererast automatisk seinare"
-#: templates/web/default/admin/council_contacts.html:153
+#: templates/web/default/admin/council_edit.html:34
+#, fuzzy
+msgid "Configure Endpoint"
+msgstr "Sett opp Open311"
+
+#: templates/web/default/admin/council_contacts.html:168
msgid "Configure Open311"
msgstr "Sett opp Open311"
-#: templates/web/default/admin/council_contacts.html:105
+#: templates/web/default/admin/council_contacts.html:116
msgid "Configure Open311 integration"
msgstr "Sett opp Open311-integrasjon"
-#: templates/web/default/admin/council_contacts.html:42
+#: templates/web/default/admin/council_contacts.html:46
msgid "Confirm"
msgstr "Stadfest"
@@ -660,6 +658,13 @@ msgstr "Stadfest"
msgid "Confirm account"
msgstr "Stadfest konto"
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:187
+#: templates/web/fixmystreet/report/update-form.html:103
+msgid ""
+"Confirm by email below, providing a new password at that point. When you "
+"confirm, your password will be updated."
+msgstr ""
+
#: templates/web/default/questionnaire/creator_fixed.html:1
#: templates/web/default/tokens/confirm_problem.html:1
#: templates/web/default/tokens/confirm_problem.html:3
@@ -667,17 +672,23 @@ msgstr "Stadfest konto"
#: templates/web/default/tokens/confirm_update.html:3
#: templates/web/emptyhomes/tokens/confirm_problem.html:1
#: templates/web/emptyhomes/tokens/confirm_problem.html:3
+#: templates/web/southampton/tokens/confirm_problem.html:1
+#: templates/web/southampton/tokens/confirm_problem.html:3
msgid "Confirmation"
msgstr "Stadfesting"
-#: templates/web/default/admin/council_contacts.html:37
-#: templates/web/default/admin/council_contacts.html:82
+#: templates/web/default/admin/council_contacts.html:39
+#: templates/web/default/admin/council_contacts.html:88
#: templates/web/default/admin/council_edit.html:28
-#: templates/web/default/admin/council_edit.html:43
-#: templates/web/default/admin/stats.html:5
+#: templates/web/default/admin/council_edit.html:71
msgid "Confirmed"
msgstr "Stadfesta"
+#: templates/web/default/admin/stats.html:5
+#, fuzzy
+msgid "Confirmed reports between %s and %s"
+msgstr "%srapportar mellom %s og %s"
+
#: templates/web/default/admin/problem_row.html:23
#: templates/web/default/admin/report_edit.html:34
msgid "Confirmed:"
@@ -708,8 +719,8 @@ msgstr "Kontakt oss"
msgid "Contact the team"
msgstr "Kontakt prosjektgruppa"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1150
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1178
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1159
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1187
msgid "Could not find user"
msgstr "Kunne ikkje finna brukaren"
@@ -720,7 +731,6 @@ msgstr "Kunne ikkje finna brukaren"
msgid "Council"
msgstr "Administrasjon"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1022
#: templates/web/default/admin/council_list.html:1
msgid "Council contacts"
msgstr "Administrasjonskontaktar"
@@ -748,7 +758,7 @@ msgstr "Mengd"
msgid "Create a report"
msgstr "Lag ein rapport"
-#: templates/web/default/admin/council_contacts.html:96
+#: templates/web/default/admin/council_contacts.html:107
msgid "Create category"
msgstr "Lag kategori"
@@ -776,15 +786,16 @@ msgstr "For tida har 1+ sletta"
msgid "Dashboard"
msgstr ""
-#: templates/web/default/admin/council_contacts.html:38
-#: templates/web/default/admin/council_contacts.html:85
+#: templates/web/default/admin/council_contacts.html:40
+#: templates/web/default/admin/council_contacts.html:91
#: templates/web/default/admin/council_edit.html:29
-#: templates/web/default/admin/council_edit.html:44
+#: templates/web/default/admin/council_edit.html:72
msgid "Deleted"
msgstr "Sletta"
#: templates/web/bromley/report/new/fill_in_details_form.html:54
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:64
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:66
+#: templates/web/zurich/report/new/fill_in_details_form.html:60
#, fuzzy
msgid "Details"
msgstr "Detaljar:"
@@ -794,14 +805,23 @@ msgstr "Detaljar:"
msgid "Details:"
msgstr "Detaljar:"
+#: templates/web/default/admin/council_contacts.html:41
+msgid "Devolved"
+msgstr ""
+
#: templates/web/default/admin/council_list.html:23
msgid "Diligency prize league table"
msgstr "Arbeidshestar"
+#: templates/web/fixmystreet/auth/general.html:30
+#, fuzzy
+msgid "Do you have a FixMyBarangay password?"
+msgstr "Har du eit FiksGataMi-passord?"
+
#: templates/web/default/auth/general.html:32
-#: templates/web/fixmystreet/auth/general.html:29
-#: templates/web/fixmystreet/report/display.html:128
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:150
+#: templates/web/fixmystreet/auth/general.html:32
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:165
+#: templates/web/fixmystreet/report/update-form.html:82
msgid "Do you have a FixMyStreet password?"
msgstr "Har du eit FiksGataMi-passord?"
@@ -828,33 +848,32 @@ msgstr "Redigerer oppdatering %d"
msgid "Editing user %d"
msgstr "Redigerer brukar %d"
-#: templates/web/default/admin/council_edit.html:45
+#: templates/web/default/admin/council_edit.html:73
msgid "Editor"
msgstr "Oppdatert av"
#: templates/web/bromley/report/display.html:126
-#: templates/web/default/admin/council_contacts.html:36
-#: templates/web/default/admin/council_edit.html:42
+#: templates/web/default/admin/council_contacts.html:38
+#: templates/web/default/admin/council_edit.html:70
#: templates/web/default/admin/list_flagged.html:12
#: templates/web/default/admin/list_flagged.html:35
#: templates/web/default/admin/list_updates.html:8
-#: templates/web/default/admin/search_abuse.html:11
#: templates/web/default/admin/search_reports.html:15
#: templates/web/default/admin/search_users.html:13
#: templates/web/fixmystreet/auth/general.html:20
-#: templates/web/fixmystreet/report/display.html:120
+#: templates/web/fixmystreet/report/update-form.html:74
msgid "Email"
msgstr "E-post"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1126
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1135
msgid "Email added to abuse list"
msgstr "E-post lagd til misbrukliste"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1123
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1132
msgid "Email already in abuse list"
msgstr "E-post allereie i misbruklista"
-#: templates/web/default/around/display_location.html:85
+#: templates/web/default/around/_updates.html:5
msgid "Email me new local problems"
msgstr "Send meg e-post om lokale problem"
@@ -862,7 +881,7 @@ msgstr "Send meg e-post om lokale problem"
msgid "Email me updates"
msgstr "Send meg oppdateringar"
-#: templates/web/default/admin/council_contacts.html:77
+#: templates/web/default/admin/council_contacts.html:83
#: templates/web/default/admin/council_edit.html:26
#: templates/web/default/admin/report_edit.html:31
#: templates/web/default/admin/update_edit.html:24
@@ -872,15 +891,15 @@ msgstr "Send meg oppdateringar"
msgid "Email:"
msgstr "E-post:"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:611
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:610
msgid "Empty flat or maisonette"
msgstr "Tom leilegheit"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:610
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:609
msgid "Empty house or bungalow"
msgstr "Tomt hus eller bungalow"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:613
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:612
msgid "Empty office or other commercial"
msgstr "Tomt kontor eller forretningsbygg"
@@ -888,11 +907,11 @@ msgstr "Tomt kontor eller forretningsbygg"
msgid "Empty property details form"
msgstr "Tom eigedom detaljskjema"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:614
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:613
msgid "Empty pub or bar"
msgstr "Tom pub eller bar"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:615
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:614
msgid "Empty public building - school, hospital, etc."
msgstr "Tom offentleg bygning – skule, sjukehus, osb."
@@ -908,6 +927,11 @@ msgstr "Sluttdag:"
msgid "End month:"
msgstr "Sluttmånad:"
+#: perllib/FixMyStreet/Cobrand/Zurich.pm:9
+#, fuzzy
+msgid "Enter a Z&uuml;rich street name"
+msgstr "Skriv inn postnummer i nærleiken, eller vegnamn og stad"
+
# GB – Great Britain? --KBU
#: templates/web/emptyhomes/index.html:40
#: templates/web/emptyhomes/index.html:41
@@ -932,22 +956,22 @@ msgid "Enter a nearby street name and area"
msgstr "Skriv inn postnummer i nærleiken, eller vegnamn og stad"
#: templates/web/default/auth/general.html:64
-#: templates/web/default/report/display.html:171
#: templates/web/default/report/new/fill_in_details_form.html:169
+#: templates/web/default/report/update-form.html:122
msgid "Enter a new password:"
msgstr "Skriv inn eit nytt passord:"
#: templates/web/bromley/report/display.html:148
#: templates/web/bromley/report/new/fill_in_details_form.html:189
-#: templates/web/fixmystreet/auth/general.html:57
-#: templates/web/fixmystreet/report/display.html:160
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:200
+#: templates/web/fixmystreet/auth/general.html:61
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:221
+#: templates/web/fixmystreet/report/update-form.html:120
#, fuzzy
msgid "Enter a password"
msgstr "Skriv inn eit nytt passord:"
-#: templates/web/default/index.html:33 templates/web/emptyhomes/index.html:58
-#: templates/web/fixmystreet/index.html:41
+#: templates/web/default/index-steps.html:11
+#: templates/web/emptyhomes/index.html:58
msgid "Enter details of the problem"
msgstr "Legg inn detaljar om problemet"
@@ -961,7 +985,7 @@ msgstr "Legg inn detaljar om problemet"
msgid "Error"
msgstr "Feil"
-#: templates/web/default/admin/council_contacts.html:11
+#: templates/web/default/admin/council_contacts.html:13
#: templates/web/default/admin/council_edit.html:18
msgid "Example postcode %s"
msgstr "Postnummerdøme %s"
@@ -1006,14 +1030,10 @@ msgstr "Fiks<span id=\"my\">Gata</span>Mi"
msgid "FixMyStreet"
msgstr "FiksGataMi-administrator:"
-#: templates/web/default/admin/header.html:13
+#: templates/web/default/admin/header.html:10
msgid "FixMyStreet admin:"
msgstr "FiksGataMi-administrator:"
-#: templates/web/default/admin/header.html:3
-msgid "FixMyStreet administration"
-msgstr "Fiksgatami-administrasjon"
-
#: templates/web/default/alert/index.html:11
msgid ""
"FixMyStreet has a variety of RSS feeds and email alerts for local problems, "
@@ -1050,13 +1070,13 @@ msgstr ""
#: templates/web/default/admin/index.html:36
#: templates/web/default/admin/report_edit.html:18
#: templates/web/default/admin/report_edit.html:20
-#: templates/web/default/dashboard/index.html:136
#: templates/web/default/dashboard/index.html:138
-#: templates/web/default/report/display.html:79
-#: templates/web/default/report/display.html:81
+#: templates/web/default/dashboard/index.html:140
+#: templates/web/default/report/update-form.html:30
+#: templates/web/default/report/update-form.html:32
#: templates/web/fixmystreet/report/banner.html:12
-#: templates/web/fixmystreet/report/display.html:74
-#: templates/web/fixmystreet/report/display.html:76
+#: templates/web/fixmystreet/report/update-form.html:28
+#: templates/web/fixmystreet/report/update-form.html:30
msgid "Fixed"
msgstr "Løyst"
@@ -1070,7 +1090,7 @@ msgstr "Løyst – Administrasjon"
msgid "Fixed - User"
msgstr "Løyst – Brukar"
-#: templates/web/default/my/my.html:27 templates/web/fixmystreet/my/my.html:27
+#: templates/web/default/my/my.html:27 templates/web/fixmystreet/my/my.html:31
msgid "Fixed reports"
msgstr "Løyste rapportar"
@@ -1082,6 +1102,7 @@ msgstr "Løyst:"
msgid "Flag user"
msgstr "Flagg brukar"
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1037
#: templates/web/default/admin/search_users.html:15
msgid "Flagged"
msgstr "Flagga:"
@@ -1092,7 +1113,7 @@ msgid "Flagged:"
msgstr "Flagga:"
#: templates/web/default/reports/_ward-list.html:3
-#: templates/web/emptyhomes/reports/council.html:19
+#: templates/web/emptyhomes/reports/body.html:19
#: templates/web/fixmystreet/reports/_ward-list.html:4
msgid "Follow a ward link to view only reports within that ward."
msgstr "Følg ei bydellenkje for å berre sjå rapportar innanfor den bydelen."
@@ -1101,11 +1122,18 @@ msgstr "Følg ei bydellenkje for å berre sjå rapportar innanfor den bydelen."
msgid "For council(s):"
msgstr "For administrasjon(ane):"
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:186
+#: templates/web/fixmystreet/report/update-form.html:102
+#, fuzzy
+msgid "Forgotten your password?"
+msgstr "Rapportane dine"
+
#: templates/web/default/faq/faq-en-gb.html:1
#: templates/web/emptyhomes/faq/faq-cy.html:1
#: templates/web/emptyhomes/faq/faq-en-gb.html:1
#: templates/web/fiksgatami/faq/faq-nb.html:1
#: templates/web/fiksgatami/nn/faq/faq-nn.html:1
+#: templates/web/fixmybarangay/faq/faq-en-gb.html:1
#: templates/web/fixmystreet/faq/faq-en-gb.html:1
#: templates/web/fixmystreet/static/privacy.html:1
#: templates/web/zurich/faq/faq-de.html:1
@@ -1121,7 +1149,7 @@ msgid "GeoRSS on Google Maps"
msgstr "GeoRSS på Google Maps"
#: templates/web/bromley/report/display.html:30
-#: templates/web/fixmystreet/report/display.html:23
+#: templates/web/fixmystreet/report/display.html:31
#, fuzzy
msgid "Get updates"
msgstr "Siste oppdatering:"
@@ -1139,6 +1167,7 @@ msgid "Get updates of problems in this %s"
msgstr "RSS-straum for problem i denne %s-en"
#: templates/web/default/alert/_list.html:83
+#: templates/web/fixmybarangay/alert/_list.html:28
#: templates/web/fixmystreet/alert/_list.html:82
msgid "Give me an RSS feed"
msgstr "Gje meg ein RSS-straum"
@@ -1146,7 +1175,7 @@ msgstr "Gje meg ein RSS-straum"
#: templates/web/default/alert/index.html:34
#: templates/web/default/around/postcode_form.html:8
#: templates/web/emptyhomes/index.html:47
-#: templates/web/fixmystreet/around/postcode_form.html:18
+#: templates/web/fixmystreet/around/postcode_form.html:21
msgid "Go"
msgstr "Hald fram"
@@ -1183,8 +1212,10 @@ msgstr ""
#: templates/web/emptyhomes/header.html:28
#: templates/web/fiksgatami/footer.html:9
#: templates/web/fiksgatami/nn/footer.html:9
+#: templates/web/fixmybarangay/footer.html:24
#: templates/web/fixmystreet/footer.html:53
-#: templates/web/reading/footer.html:10
+#: templates/web/reading/footer.html:10 templates/web/stevenage/footer.html:47
+#: templates/web/zurich/footer.html:14
msgid "Help"
msgstr "Hjelp"
@@ -1195,9 +1226,9 @@ msgstr "Her er dei ulike typane lokale problemvarsel for &laquo;%s&raquo;."
#: templates/web/barnet/header.html:70 templates/web/bromley/header.html:64
#: templates/web/bromley/header.html:99
-#: templates/web/fixmybarangay/header.html.orig:42
-#: templates/web/fixmystreet/header.html:47
-#: templates/web/zurich/header.html:47
+#: templates/web/fixmybarangay/header.html:64
+#: templates/web/fixmystreet/header.html:49
+#: templates/web/stevenage/header.html:97 templates/web/zurich/header.html:47
msgid "Hi %s"
msgstr ""
@@ -1207,26 +1238,24 @@ msgstr ""
msgid "Hidden"
msgstr "Skjult"
-#: templates/web/default/around/display_location.html:58
-#: templates/web/fixmystreet/around/display_location.html:58
+#: templates/web/default/around/display_location.html:63
msgid "Hide old"
msgstr ""
-#: templates/web/default/around/display_location.html:53
-#: templates/web/fixmystreet/around/display_location.html:54
+#: templates/web/default/around/display_location.html:58
msgid "Hide pins"
msgstr "Skjul nåler"
-#: templates/web/default/admin/council_edit.html:38
+#: templates/web/default/admin/council_edit.html:66
msgid "History"
msgstr "Historie"
-#: templates/web/default/index.html:28 templates/web/emptyhomes/index.html:53
-#: templates/web/fixmystreet/index.html:36
+#: templates/web/default/index-steps.html:1
+#: templates/web/emptyhomes/index.html:53
msgid "How to report a problem"
msgstr "Korleis rapportera eit problem"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:637
+#: perllib/FixMyStreet/App/Controller/Admin.pm:648
msgid "I am afraid you cannot confirm unconfirmed reports."
msgstr "Eg er redd du ikkje kan stadfesta ustadfesta rapportar."
@@ -1311,12 +1340,12 @@ msgstr "Ugyldig val av straum"
#: templates/web/bromley/report/display.html:82
#: templates/web/default/admin/report_edit.html:18
#: templates/web/default/admin/report_edit.html:20
-#: templates/web/default/dashboard/index.html:136
#: templates/web/default/dashboard/index.html:138
-#: templates/web/default/report/display.html:79
-#: templates/web/default/report/display.html:81
-#: templates/web/fixmystreet/report/display.html:74
-#: templates/web/fixmystreet/report/display.html:76
+#: templates/web/default/dashboard/index.html:140
+#: templates/web/default/report/update-form.html:30
+#: templates/web/default/report/update-form.html:32
+#: templates/web/fixmystreet/report/update-form.html:28
+#: templates/web/fixmystreet/report/update-form.html:30
msgid "In Progress"
msgstr "Under arbeid"
@@ -1349,7 +1378,7 @@ msgstr "Feil has_photo-verdi «%s»"
msgid "Invalid agency_responsible value %s"
msgstr "Ugyldig agency_responsible-verdi %s"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:942
+#: perllib/FixMyStreet/App/Controller/Admin.pm:952
msgid "Invalid end date"
msgstr "Ugyldig slutt-dato"
@@ -1357,7 +1386,7 @@ msgstr "Ugyldig slutt-dato"
msgid "Invalid format %s specified."
msgstr "Ugyldig format %s oppgjeve."
-#: perllib/FixMyStreet/App/Controller/Admin.pm:932
+#: perllib/FixMyStreet/App/Controller/Admin.pm:942
msgid "Invalid start date"
msgstr "Ugyldig startdato"
@@ -1365,12 +1394,12 @@ msgstr "Ugyldig startdato"
#: templates/web/bromley/report/display.html:81
#: templates/web/default/admin/report_edit.html:18
#: templates/web/default/admin/report_edit.html:19
-#: templates/web/default/dashboard/index.html:136
-#: templates/web/default/dashboard/index.html:137
-#: templates/web/default/report/display.html:79
-#: templates/web/default/report/display.html:80
-#: templates/web/fixmystreet/report/display.html:74
-#: templates/web/fixmystreet/report/display.html:75
+#: templates/web/default/dashboard/index.html:138
+#: templates/web/default/dashboard/index.html:139
+#: templates/web/default/report/update-form.html:30
+#: templates/web/default/report/update-form.html:31
+#: templates/web/fixmystreet/report/update-form.html:28
+#: templates/web/fixmystreet/report/update-form.html:29
msgid "Investigating"
msgstr "Undersøkjer"
@@ -1390,11 +1419,11 @@ msgstr ""
#: templates/web/bromley/report/display.html:166
#: templates/web/bromley/report/new/fill_in_details_form.html:209
#: templates/web/default/auth/general.html:44
-#: templates/web/default/report/display.html:151
#: templates/web/default/report/new/fill_in_details_form.html:149
-#: templates/web/fixmystreet/auth/general.html:42
-#: templates/web/fixmystreet/report/display.html:144
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:167
+#: templates/web/default/report/update-form.html:102
+#: templates/web/fixmystreet/auth/general.html:46
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:182
+#: templates/web/fixmystreet/report/update-form.html:98
msgid "Keep me signed in on this computer"
msgstr "Hugs mi innlogging på denne datamaskina"
@@ -1405,7 +1434,7 @@ msgstr "Hugs mi innlogging på denne datamaskina"
msgid "Last Name"
msgstr "Siste oppdatering:"
-#: templates/web/default/admin/council_contacts.html:39
+#: templates/web/default/admin/council_contacts.html:42
msgid "Last editor"
msgstr "Sist redigert av"
@@ -1417,18 +1446,15 @@ msgstr "Siste oppdatering:"
msgid "Last&nbsp;update:"
msgstr "Siste&nbsp;oppdatering:"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1028
-msgid "List Flagged"
-msgstr "Vis flagga"
-
-#: templates/web/default/admin/council_contacts.html:14
#: templates/web/default/admin/council_contacts.html:16
+#: templates/web/default/admin/council_contacts.html:18
msgid "List all reported problems"
msgstr "Vis alle rapporterte problem"
#: templates/web/bromley/report/new/fill_in_details_form.html:69
#: templates/web/default/report/new/fill_in_details_form.html:68
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:73
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:75
+#: templates/web/zurich/report/new/fill_in_details_form.html:69
msgid "Loading..."
msgstr "Lastar …"
@@ -1443,6 +1469,8 @@ msgstr "Lastar …"
#: templates/web/default/tokens/confirm_alert.html:3
#: templates/web/emptyhomes/alert/index.html:1
#: templates/web/emptyhomes/alert/index.html:3
+#: templates/web/fixmybarangay/alert/index.html:1
+#: templates/web/fixmybarangay/alert/index.html:3
#: templates/web/fixmystreet/alert/updates.html:1
msgid "Local RSS feeds and email alerts"
msgstr "Lokal RSS-straum og e-postvarsel"
@@ -1458,13 +1486,14 @@ msgstr "Lokal RSS-straum og e-postvarsel for «%s»"
#: templates/web/bromley/header.html:79 templates/web/default/footer.html:13
#: templates/web/fiksgatami/footer.html:8
#: templates/web/fiksgatami/nn/footer.html:8
+#: templates/web/fixmybarangay/footer.html:22
#: templates/web/fixmystreet/footer.html:51
-#: templates/web/reading/footer.html:9
+#: templates/web/reading/footer.html:9 templates/web/stevenage/footer.html:45
msgid "Local alerts"
msgstr "Lokale varsel"
-#: templates/web/default/index.html:32 templates/web/emptyhomes/index.html:57
-#: templates/web/fixmystreet/index.html:40
+#: templates/web/default/index-steps.html:10
+#: templates/web/emptyhomes/index.html:57
msgid "Locate the problem on a map of the area"
msgstr "Lokaliser problemet på kartet over området"
@@ -1508,10 +1537,12 @@ msgstr "Fleire problem i nærleiken"
#: templates/web/emptyhomes/reports/index.html:10
#: templates/web/fiksgatami/nn/reports/index.html:9
#: templates/web/fiksgatami/reports/index.html:9
-#: templates/web/fixmystreet/auth/general.html:52
-#: templates/web/fixmystreet/report/display.html:177
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:117
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:176
+#: templates/web/fixmybarangay/reports/index.html:19
+#: templates/web/fixmystreet/auth/general.html:56
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:120
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:197
+#: templates/web/fixmystreet/report/update-form.html:134
+#: templates/web/zurich/report/new/fill_in_details_form.html:118
msgid "Name"
msgstr "Namn"
@@ -1527,7 +1558,7 @@ msgstr "Namn:"
msgid "Navigation"
msgstr "Navigasjon"
-#: perllib/FixMyStreet/Geocode/OSM.pm:159
+#: perllib/FixMyStreet/Geocode/OSM.pm:166
msgid ""
"Nearest named road to the pin placed on the map (automatically generated "
"using OpenStreetMap): %s%s"
@@ -1535,7 +1566,7 @@ msgstr ""
"Næraste namngjevne veg til nålen plassert på kartet (automatisk generert ved "
"hjelp av OpenStreetMap): %s%s"
-#: perllib/FixMyStreet/Cobrand/UK.pm:161
+#: perllib/FixMyStreet/Cobrand/UK.pm:152
msgid ""
"Nearest postcode to the pin placed on the map (automatically generated): %s "
"(%sm away)"
@@ -1543,8 +1574,8 @@ msgstr ""
"Næraste postnummer til nålen plassert på kartet (automatisk generert): %s "
"(%sm unna)"
-#: perllib/FixMyStreet/Cobrand/Default.pm:404
-#: perllib/FixMyStreet/Cobrand/Default.pm:444
+#: perllib/FixMyStreet/Cobrand/Default.pm:407
+#: perllib/FixMyStreet/Cobrand/Default.pm:447
msgid ""
"Nearest road to the pin placed on the map (automatically generated by Bing "
"Maps): %s"
@@ -1552,7 +1583,7 @@ msgstr ""
"Næraste veg til nålen plassert på karta (automatisk generert ved hjelp av "
"Bing Maps): %s"
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:245
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:265
#, fuzzy
msgid ""
"Nearest road to the pin placed on the map (automatically generated by Bing "
@@ -1567,11 +1598,12 @@ msgid "Nearly Done! Now check your email..."
msgstr "Nesten ferdig! No må du sjekka e-posten din …"
#: templates/web/default/reports/index.html:16
+#: templates/web/fixmybarangay/reports/index.html:20
#, fuzzy
msgid "New <br>problems"
msgstr "Nye problem"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:314
+#: perllib/FixMyStreet/App/Controller/Admin.pm:320
msgid "New category contact added"
msgstr "Ny kategorikontakt lagt til"
@@ -1641,8 +1673,9 @@ msgstr "Ny tilstand"
msgid "New!"
msgstr "Ny!"
-#: templates/web/default/admin/council_contacts.html:48
-#: templates/web/default/admin/council_contacts.html:49
+#: templates/web/default/admin/council_contacts.html:52
+#: templates/web/default/admin/council_contacts.html:53
+#: templates/web/default/admin/council_contacts.html:54
#: templates/web/default/admin/council_edit.html:4
#: templates/web/default/admin/list_updates.html:30
#: templates/web/default/admin/list_updates.html:31
@@ -1664,7 +1697,7 @@ msgstr "Nei"
msgid "No council"
msgstr "Ingen administrasjon"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:328
+#: perllib/FixMyStreet/DB/Result/Problem.pm:336
msgid "No council selected"
msgstr "Ingen administrasjon er vald"
@@ -1694,6 +1727,14 @@ msgstr "Fann ingen problem."
msgid "No problems have been reported yet."
msgstr "Ingen problem er rapporterte"
+#: templates/web/default/report/_support.html:3
+msgid "No supporters"
+msgstr ""
+
+#: templates/web/default/admin/council_contacts.html:57
+msgid "Non Public"
+msgstr ""
+
#: templates/web/default/admin/council_list.html:5
#: templates/web/default/admin/report_edit.html:16
msgid "None"
@@ -1703,14 +1744,13 @@ msgstr "Ingen"
msgid "Not reported before"
msgstr "Ikkje rapportert tidlegare"
-#: templates/web/default/report/_main.html:11
+#: templates/web/default/report/_main.html:14
#: templates/web/emptyhomes/report/display.html:24
-#: templates/web/fixmystreet/report/_main.html:13
msgid "Not reported to council"
msgstr "Ikkje rapportert til administrasjonen"
-#: templates/web/default/admin/council_contacts.html:40
-#: templates/web/default/admin/council_edit.html:46
+#: templates/web/default/admin/council_contacts.html:43
+#: templates/web/default/admin/council_edit.html:74
msgid "Note"
msgstr "Merk"
@@ -1724,8 +1764,8 @@ msgstr ""
"var oppretta. Det treng vera den same månaden som rapporten var stadfesta, "
"så tala kan hoppa litt opp og ned."
-#: templates/web/default/admin/council_contacts.html:89
-#: templates/web/default/admin/council_edit.html:31
+#: templates/web/default/admin/council_contacts.html:95
+#: templates/web/default/admin/council_edit.html:32
msgid "Note:"
msgstr "Merk:"
@@ -1733,7 +1773,7 @@ msgstr "Merk:"
msgid "Note: <strong>%s</strong>"
msgstr "Merk: <strong>%s</strong>"
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:149
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:164
#, fuzzy
msgid "Now to submit your report&hellip;"
msgstr "På tide å senda rapporten din, har du eit FiksGataMi-passord?"
@@ -1742,12 +1782,12 @@ msgstr "På tide å senda rapporten din, har du eit FiksGataMi-passord?"
msgid "Now to submit your report&hellip; do you have a FixMyStreet password?"
msgstr "På tide å senda rapporten din, har du eit FiksGataMi-passord?"
-#: templates/web/fixmystreet/report/display.html:127
+#: templates/web/fixmystreet/report/update-form.html:81
#, fuzzy
msgid "Now to submit your update&hellip;"
msgstr "På tide å registrera oppdateringa di, har du eit FiksGataMi-passord?"
-#: templates/web/default/report/display.html:133
+#: templates/web/default/report/update-form.html:84
msgid "Now to submit your update&hellip; do you have a FixMyStreet password?"
msgstr "På tide å registrera oppdateringa di, har du eit FiksGataMi-passord?"
@@ -1757,6 +1797,7 @@ msgid "Offensive? Unsuitable? Tell us"
msgstr "Støytande? Upassende? Sei frå"
#: templates/web/default/reports/index.html:18
+#: templates/web/fixmybarangay/reports/index.html:22
#, fuzzy
msgid "Old / unknown <br>problems"
msgstr "Ukjend problem-ID"
@@ -1771,11 +1812,13 @@ msgid "Old state"
msgstr "Gammal tilstand"
#: templates/web/default/reports/index.html:20
+#: templates/web/fixmybarangay/reports/index.html:24
#, fuzzy
msgid "Older <br>fixed"
msgstr "Eldre løyste"
#: templates/web/default/reports/index.html:17
+#: templates/web/fixmybarangay/reports/index.html:21
#, fuzzy
msgid "Older <br>problems"
msgstr "Eldre problem"
@@ -1795,13 +1838,13 @@ msgstr "Eldre problem"
#: templates/web/bromley/report/display.html:80
#: templates/web/default/admin/report_edit.html:18
#: templates/web/default/admin/update_edit.html:19
-#: templates/web/default/dashboard/index.html:136
-#: templates/web/default/report/display.html:79
-#: templates/web/fixmystreet/report/display.html:74
+#: templates/web/default/dashboard/index.html:138
+#: templates/web/default/report/update-form.html:30
+#: templates/web/fixmystreet/report/update-form.html:28
msgid "Open"
msgstr "Opne"
-#: templates/web/default/my/my.html:22 templates/web/fixmystreet/my/my.html:22
+#: templates/web/default/my/my.html:22 templates/web/fixmystreet/my/my.html:26
msgid "Open reports"
msgstr "Opne rapportar"
@@ -1831,15 +1874,15 @@ msgstr ""
"Eller du kan abonnera på varsel basert på bydel eller administrasjon du "
"høyrer til under:"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:655
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:1006
#: perllib/FixMyStreet/App/Controller/Report/New.pm:656
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:999
-#: perllib/FixMyStreet/DB/Result/Problem.pm:497
-#: perllib/FixMyStreet/DB/Result/Problem.pm:507
-#: perllib/FixMyStreet/DB/Result/Problem.pm:517
-#: perllib/FixMyStreet/DB/Result/Problem.pm:529
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:329
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:338
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:657
+#: perllib/FixMyStreet/DB/Result/Problem.pm:505
+#: perllib/FixMyStreet/DB/Result/Problem.pm:515
+#: perllib/FixMyStreet/DB/Result/Problem.pm:525
+#: perllib/FixMyStreet/DB/Result/Problem.pm:537
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:331
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:340
msgid "Other"
msgstr "Anna"
@@ -1867,9 +1910,9 @@ msgstr "Delvis"
#: templates/web/bromley/report/display.html:145
#: templates/web/bromley/report/new/fill_in_details_form.html:186
-#: templates/web/fixmystreet/auth/general.html:55
-#: templates/web/fixmystreet/report/display.html:157
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:197
+#: templates/web/fixmystreet/auth/general.html:59
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:218
+#: templates/web/fixmystreet/report/update-form.html:117
#, fuzzy
msgid "Password (optional)"
msgstr "(valfritt)"
@@ -1880,13 +1923,14 @@ msgstr "Passord:"
#: templates/web/bromley/report/new/fill_in_details_form.html:136
#: templates/web/bromley/report/new/fill_in_details_form.html:183
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:133
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:194
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:148
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:215
+#: templates/web/zurich/report/new/fill_in_details_form.html:124
#, fuzzy
msgid "Phone number (optional)"
msgstr "(valfritt)"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:260
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:262
#: templates/web/default/admin/report_edit.html:32
#: templates/web/default/report/new/fill_in_details_form.html:215
msgid "Phone:"
@@ -1894,15 +1938,16 @@ msgstr "Telefon:"
#: templates/web/bromley/report/display.html:109
#: templates/web/bromley/report/new/fill_in_details_form.html:104
-#: templates/web/fixmystreet/report/display.html:103
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:108
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:92
+#: templates/web/fixmystreet/report/update-form.html:57
+#: templates/web/zurich/report/new/fill_in_details_form.html:86
#, fuzzy
msgid "Photo"
msgstr "Bilete:"
#: templates/web/default/questionnaire/index.html:95
-#: templates/web/default/report/display.html:109
#: templates/web/default/report/new/fill_in_details_form.html:102
+#: templates/web/default/report/update-form.html:60
#: templates/web/fixmystreet/questionnaire/index.html:90
msgid "Photo:"
msgstr "Bilete:"
@@ -1915,12 +1960,12 @@ msgstr "Bilete av nye problem i nærleiken"
#: templates/web/bromley/report/display.html:81
#: templates/web/default/admin/report_edit.html:18
#: templates/web/default/admin/report_edit.html:19
-#: templates/web/default/dashboard/index.html:136
-#: templates/web/default/dashboard/index.html:137
-#: templates/web/default/report/display.html:79
-#: templates/web/default/report/display.html:80
-#: templates/web/fixmystreet/report/display.html:74
-#: templates/web/fixmystreet/report/display.html:75
+#: templates/web/default/dashboard/index.html:138
+#: templates/web/default/dashboard/index.html:139
+#: templates/web/default/report/update-form.html:30
+#: templates/web/default/report/update-form.html:31
+#: templates/web/fixmystreet/report/update-form.html:28
+#: templates/web/fixmystreet/report/update-form.html:29
msgid "Planned"
msgstr "Planlagt"
@@ -1952,16 +1997,16 @@ msgstr "Ver venleg og sjekk e-posten du oppgav"
msgid "Please check your email address is correct"
msgstr "Ver venleg og sjekk at du har skrive ei gyldig e-postadresse"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:819
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:826
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:845
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:884
-#: perllib/FixMyStreet/DB/Result/Problem.pm:347
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:822
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:829
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:848
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:891
+#: perllib/FixMyStreet/DB/Result/Problem.pm:355
#: templates/web/default/js/validation_strings.html:9
msgid "Please choose a category"
msgstr "Vel ein kategori"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:353
+#: perllib/FixMyStreet/DB/Result/Problem.pm:361
msgid "Please choose a property type"
msgstr "Vel ein type eigenskap"
@@ -1985,9 +2030,10 @@ msgstr ""
#: templates/web/default/report/new/notes.html:7
#: templates/web/fixmystreet/report/new/notes.html:6
+#, fuzzy
msgid ""
-"Please do not be abusive &mdash; abusing your council devalues the service "
-"for all users."
+"Please do not be abusive&nbsp;&mdash; abusing your council devalues the "
+"service for all users."
msgstr ""
"Ikkje ver ufin &mdash; å kjefta på administrasjonen din skader verdet av "
"tenesta for alle brukarane."
@@ -2003,7 +2049,7 @@ msgid "Please enter a password"
msgstr "Skriv inn eit passord"
#: perllib/FixMyStreet/App/Controller/Contact.pm:97
-#: perllib/FixMyStreet/DB/Result/Problem.pm:322
+#: perllib/FixMyStreet/DB/Result/Problem.pm:330
#: templates/web/default/js/validation_strings.html:3
msgid "Please enter a subject"
msgstr "Ver venleg og legg inn eit emne"
@@ -2019,7 +2065,7 @@ msgstr "Ver venleg og legg til ein gyldig e-post"
msgid "Please enter a valid email address"
msgstr "Ver venleg og legg inn e-postadressa di"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:325
+#: perllib/FixMyStreet/DB/Result/Problem.pm:333
#: templates/web/default/js/validation_strings.html:4
msgid "Please enter some details"
msgstr "Ver venleg og legg inn opplysningar om problemet"
@@ -2036,7 +2082,8 @@ msgid "Please enter your email"
msgstr "Ver venleg og legg inn e-posten din"
#: templates/web/bromley/report/new/fill_in_details_form.html:149
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:146
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:161
+#: templates/web/zurich/report/new/fill_in_details_form.html:110
#, fuzzy
msgid "Please enter your email address"
msgstr "Ver venleg og legg inn e-posten din"
@@ -2046,7 +2093,7 @@ msgstr "Ver venleg og legg inn e-posten din"
msgid "Please enter your first name"
msgstr "Ver venleg og legg inn namnet ditt"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:340
+#: perllib/FixMyStreet/DB/Result/Problem.pm:348
#: templates/web/default/js/validation_strings.html:7
#, fuzzy
msgid ""
@@ -2059,7 +2106,7 @@ msgstr ""
#: perllib/FixMyStreet/App/Controller/Contact.pm:95
#: perllib/FixMyStreet/DB/Result/Comment.pm:143
-#: perllib/FixMyStreet/DB/Result/Problem.pm:333
+#: perllib/FixMyStreet/DB/Result/Problem.pm:341
#: perllib/FixMyStreet/DB/Result/User.pm:97
#: templates/web/default/js/validation_strings.html:6
msgid "Please enter your name"
@@ -2090,11 +2137,28 @@ msgstr ""
#: templates/web/default/report/new/fill_in_details_text.html:1
#: templates/web/default/report/new/fill_in_details_text.html:11
+#: templates/web/fixmybarangay/report/new/fill_in_details_text.html:1
+#: templates/web/fixmybarangay/report/new/fill_in_details_text.html:10
#: templates/web/fixmystreet/report/new/fill_in_details_text.html:1
-#: templates/web/fixmystreet/report/new/fill_in_details_text.html:11
+#: templates/web/fixmystreet/report/new/fill_in_details_text.html:8
msgid "Please fill in details of the problem below."
msgstr "Ver venleg og fyll ut detaljar om problemet under."
+#: templates/web/fixmybarangay/report/new/fill_in_details_text.html:1
+#: templates/web/fixmybarangay/report/new/fill_in_details_text.html:3
+#, fuzzy
+msgid ""
+"Please fill in details of the problem below. Leave as much detail as you "
+"can, \n"
+"and if possible describe the exact location of\n"
+"the problem (e.g. if there is a streetlight number or road name)."
+msgstr ""
+"Ver venlg og fyll inn detaljane om problemet under. Administrasjonen\n"
+"vil ikkje vera i stand til å hjelpa med mindre du legg inn så mange\n"
+"detaljar som du kan. Forklar den eksakte plasseringa for problemet\n"
+"(t.d. på ein vegg), kva det er, kor lenge det har vore der, ei\n"
+"skildring (og eit bilete av problemet viss du har eit), osb."
+
#: templates/web/default/report/new/fill_in_details_text.html:1
#: templates/web/default/report/new/fill_in_details_text.html:3
msgid ""
@@ -2111,14 +2175,16 @@ msgstr ""
"(t.d. på ein vegg), kva det er, kor lenge det har vore der, ei\n"
"skildring (og eit bilete av problemet viss du har eit), osb."
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:68
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:70
+#: templates/web/zurich/report/new/fill_in_details_form.html:64
#, fuzzy
msgid "Please fill in details of the problem."
msgstr "Ver venleg og fyll ut detaljar om problemet under."
#: templates/web/bromley/report/new/fill_in_details_form.html:28
#: templates/web/default/report/new/fill_in_details_form.html:27
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:34
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:35
+#: templates/web/zurich/report/new/fill_in_details_form.html:35
msgid ""
"Please fill in the form below with details of the problem, and describe the "
"location as precisely as possible in the details box."
@@ -2126,7 +2192,7 @@ msgstr ""
"Ver venleg og fyll inn skjemaet under med detaljane om problemet,\n"
"og skildra plasseringa så nøyaktig som mogleg i boksen for detaljar."
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:241
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:243
msgid "Please indicate whether you'd like to receive another questionnaire"
msgstr "Ver venleg og indiker om du ynskjer å motta eit nytt spørjeskjema"
@@ -2134,7 +2200,7 @@ msgstr "Ver venleg og indiker om du ynskjer å motta eit nytt spørjeskjema"
msgid "Please note that updates are not sent to the council."
msgstr ""
-#: templates/web/default/report/display.html:56
+#: templates/web/default/report/update-form.html:7
msgid ""
"Please note that updates are not sent to the council. If you leave your name "
"it will be public. Your information will only be used in accordance with our "
@@ -2159,7 +2225,8 @@ msgstr ""
#: templates/web/bromley/report/new/fill_in_details_form.html:23
#: templates/web/default/report/new/fill_in_details_form.html:5
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:25
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:26
+#: templates/web/zurich/report/new/fill_in_details_form.html:26
msgid ""
"Please note your report has <strong>not yet been sent</strong>. Choose a "
"category and add further information below, then submit."
@@ -2168,22 +2235,23 @@ msgstr ""
"og legg til meir informasjon under før du sender inn."
#: templates/web/default/report/new/notes.html:1
+#: templates/web/fixmybarangay/report/new/notes.html:1
#: templates/web/fixmystreet/report/new/notes.html:1
msgid "Please note:"
msgstr "Merk:"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:244
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:246
msgid "Please provide some explanation as to why you're reopening this report"
msgstr ""
"Ver venleg og bidra med ei forklaring på kvifor du gjenopnar denne "
"problemrapporten"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:251
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:253
msgid "Please provide some text as well as a photo"
msgstr "Ver venleg og bidra med litt tekst i tillegg til eit bilete"
#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:116
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:237
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:239
msgid ""
"Please say whether you've ever reported a problem to your council before"
msgstr ""
@@ -2198,7 +2266,7 @@ msgstr "Vel den kjelda du ynskjer"
msgid "Please select the type of alert you want"
msgstr "Ver venleg og vel kva for ein type varsel du ynskjer"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:233
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:235
msgid "Please state whether or not the problem has been fixed"
msgstr "Ver venleg og oppgje om dette problemet har vorte fiksa eller ikkje"
@@ -2206,11 +2274,11 @@ msgstr "Ver venleg og oppgje om dette problemet har vorte fiksa eller ikkje"
msgid "Please take a look at the updates that have been left."
msgstr "Ver venleg og sjå over oppdateringane som er lagt inn."
-#: perllib/FixMyStreet/App/Controller/Photo.pm:176
+#: perllib/FixMyStreet/App/Controller/Photo.pm:175
msgid "Please upload a JPEG image only"
msgstr "Ver venleg og berre last opp JPEG-bilete"
-#: perllib/FixMyStreet/App/Controller/Photo.pm:183
+#: perllib/FixMyStreet/App/Controller/Photo.pm:182
#, fuzzy
msgid "Please upload a JPEG image only\n"
msgstr "Ver venleg og berre last opp JPEG-bilete"
@@ -2220,7 +2288,7 @@ msgid "Please write a message"
msgstr "Skriv inn ei melding"
#: templates/web/bromley/report/display.html:70
-#: templates/web/fixmystreet/report/display.html:69
+#: templates/web/fixmystreet/report/update-form.html:23
#, fuzzy
msgid "Please write your update here"
msgstr "Skriv inn ei melding"
@@ -2229,13 +2297,13 @@ msgstr "Skriv inn ei melding"
#: templates/web/bromley/report/display.html:149
#: templates/web/bromley/report/display.html:161
#: templates/web/default/contact/index.html:93
-#: templates/web/default/report/display.html:119
-#: templates/web/default/report/display.html:156
-#: templates/web/default/report/display.html:178
+#: templates/web/default/report/update-form.html:107
+#: templates/web/default/report/update-form.html:129
+#: templates/web/default/report/update-form.html:70
#: templates/web/fixmystreet/contact/index.html:93
-#: templates/web/fixmystreet/report/display.html:115
-#: templates/web/fixmystreet/report/display.html:139
-#: templates/web/fixmystreet/report/display.html:161
+#: templates/web/fixmystreet/report/update-form.html:121
+#: templates/web/fixmystreet/report/update-form.html:69
+#: templates/web/fixmystreet/report/update-form.html:93
msgid "Post"
msgstr "Send inn"
@@ -2251,6 +2319,12 @@ msgstr "Lagt inn av %s (<strong>%s</strong>) %s"
msgid "Posted by %s at %s"
msgstr "Sendt inn av %s %s"
+#: templates/web/default/admin/council_contacts.html:100
+#: templates/web/default/admin/council_edit.html:30
+#: templates/web/default/admin/report_edit.html:43
+msgid "Private"
+msgstr ""
+
#: templates/web/default/maps/openlayers.html:85
msgid "Problem"
msgstr "Problem"
@@ -2271,7 +2345,7 @@ msgstr "Problem %s sendt til administrasjon %s"
msgid "Problem breakdown by state"
msgstr "Tilstandsfordeling av problem"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:819
+#: perllib/FixMyStreet/App/Controller/Admin.pm:849
msgid "Problem marked as open."
msgstr "Problem markert som ope."
@@ -2283,18 +2357,18 @@ msgstr "Endring av problemtilstand basert på spørjeundersøkingsresultat"
msgid "Problems"
msgstr "Problem"
-#: templates/web/default/around/display_location.html:81
+#: templates/web/default/around/_updates.html:1
msgid "Problems in this area"
msgstr "Problem i dette området"
#: templates/web/bromley/report/display.html:31
-#: templates/web/fixmystreet/around/display_location.html:98
-#: templates/web/fixmystreet/report/display.html:24
+#: templates/web/fixmystreet/around/tabbed_lists.html:4
+#: templates/web/fixmystreet/report/display.html:35
#, fuzzy
msgid "Problems nearby"
msgstr "Fleire problem i nærleiken"
-#: templates/web/fixmystreet/around/display_location.html:97
+#: templates/web/fixmystreet/around/tabbed_lists.html:3
#, fuzzy
msgid "Problems on the map"
msgstr "Problem i dette området"
@@ -2308,24 +2382,25 @@ msgstr "Problem nyleg rapportert fiksa på FiksGataMi"
msgid "Problems within %.1fkm of this location"
msgstr "Problem innanfor %.1fkm av denne posisjonen"
-#: perllib/FixMyStreet/Cobrand/Default.pm:609
+#: perllib/FixMyStreet/Cobrand/Default.pm:612
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:95
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:162
-#: perllib/FixMyStreet/Cobrand/UK.pm:240
+#: perllib/FixMyStreet/Cobrand/UK.pm:231
msgid "Problems within %s"
msgstr "Problem innanfor %s"
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:103
-#: perllib/FixMyStreet/Cobrand/UK.pm:254
+#: perllib/FixMyStreet/Cobrand/UK.pm:245
msgid "Problems within %s ward"
msgstr "Problem innanfor %s bydel"
-#: templates/web/default/reports/council.html:0
-#: templates/web/default/reports/council.html:29
+#: templates/web/default/reports/body.html:0
+#: templates/web/default/reports/body.html:29
msgid "Problems within %s, FixMyStreet"
msgstr "Problem innanfor %s, FiksGataMi"
#: templates/web/default/alert/_list.html:40
+#: templates/web/fixmybarangay/alert/_list.html:13
#: templates/web/fixmystreet/alert/_list.html:42
msgid "Problems within the boundary of:"
msgstr "Problem innanfor grensene av:"
@@ -2334,19 +2409,19 @@ msgstr "Problem innanfor grensene av:"
msgid "Properties recently reported as put back to use on reportemptyhomes.com"
msgstr "Eigedomar nyleg rapportert som tilbake i bruk på reportemptyhomes.com"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:617
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:616
msgid "Property type:"
msgstr "Type eigenskap:"
#: templates/web/bromley/report/new/fill_in_details_form.html:52
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:62
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:64
#, fuzzy
msgid "Provide a title"
msgstr "Bidra med ei oppdatering"
#: templates/web/bromley/report/display.html:57
-#: templates/web/default/report/display.html:51
-#: templates/web/fixmystreet/report/display.html:50
+#: templates/web/default/report/update-form.html:3
+#: templates/web/fixmystreet/report/update-form.html:4
msgid "Provide an update"
msgstr "Bidra med ei oppdatering"
@@ -2361,10 +2436,10 @@ msgstr ""
"oversyn over rapportane dine"
#: templates/web/bromley/report/display.html:142
-#: templates/web/default/report/display.html:175
#: templates/web/default/report/new/fill_in_details_form.html:173
-#: templates/web/fixmystreet/report/display.html:154
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:191
+#: templates/web/default/report/update-form.html:126
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:212
+#: templates/web/fixmystreet/report/update-form.html:114
msgid ""
"Providing a password is optional, but doing so will allow you to more easily "
"report problems, leave updates and manage your reports."
@@ -2373,6 +2448,11 @@ msgstr ""
"enklare for deg å rapportera problem, leggja inn oppdateringar og halda "
"oversyn over rapportane dine"
+#: templates/web/default/admin/council_contacts.html:44
+#: templates/web/default/admin/council_contacts.html:57
+msgid "Public"
+msgstr ""
+
#: templates/web/default/questionnaire/completed.html:1
#: templates/web/default/questionnaire/completed.html:2
#: templates/web/default/questionnaire/index.html:0
@@ -2393,7 +2473,7 @@ msgstr "Spørjeskjema %d fylt inn for problem %d, %s til %s"
msgid "Questionnaire %d sent for problem %d"
msgstr "Spørjeskjema %d sendt for problem %d"
-#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:190
+#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:192
msgid "Questionnaire filled in by problem reporter"
msgstr "Spørjeskjema fylt inn av feilrapportøren"
@@ -2405,17 +2485,15 @@ msgstr "Spørjeskjema fylt inn av feilrapportøren"
#: templates/web/default/reports/_rss.html:1
#: templates/web/fixmystreet/alert/_list.html:22
#: templates/web/fixmystreet/alert/updates.html:9
-#: templates/web/fixmystreet/around/display_location.html:1
-#: templates/web/fixmystreet/around/display_location.html:3
-#: templates/web/fixmystreet/report/display.html:30
+#: templates/web/fixmystreet/report/display.html:49
msgid "RSS feed"
msgstr "RSS-straum"
-#: perllib/FixMyStreet/Cobrand/UK.pm:283 perllib/FixMyStreet/Cobrand/UK.pm:295
+#: perllib/FixMyStreet/Cobrand/UK.pm:274 perllib/FixMyStreet/Cobrand/UK.pm:286
msgid "RSS feed for %s"
msgstr "RSS-straum for %s"
-#: perllib/FixMyStreet/Cobrand/UK.pm:289 perllib/FixMyStreet/Cobrand/UK.pm:301
+#: perllib/FixMyStreet/Cobrand/UK.pm:280 perllib/FixMyStreet/Cobrand/UK.pm:292
msgid "RSS feed for %s ward, %s"
msgstr "RSS-straum for %s bydel, %s"
@@ -2423,11 +2501,11 @@ msgstr "RSS-straum for %s bydel, %s"
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:186
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:196
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:204
-#: perllib/FixMyStreet/Cobrand/UK.pm:309 perllib/FixMyStreet/Cobrand/UK.pm:321
+#: perllib/FixMyStreet/Cobrand/UK.pm:300 perllib/FixMyStreet/Cobrand/UK.pm:312
msgid "RSS feed of %s"
msgstr "RSS-straum frå %s"
-#: perllib/FixMyStreet/Cobrand/UK.pm:314 perllib/FixMyStreet/Cobrand/UK.pm:326
+#: perllib/FixMyStreet/Cobrand/UK.pm:305 perllib/FixMyStreet/Cobrand/UK.pm:317
msgid "RSS feed of %s, within %s ward"
msgstr "RSS-straum av %s, innanfor %s bydel"
@@ -2440,29 +2518,27 @@ msgstr "RSS-straum med problem i nærleiken"
msgid "RSS feed of problems in this %s"
msgstr "RSS-straum for problem i denne %s-en"
-#: perllib/FixMyStreet/Cobrand/Default.pm:610
+#: perllib/FixMyStreet/Cobrand/Default.pm:613
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:96
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:161
-#: perllib/FixMyStreet/Cobrand/UK.pm:247
+#: perllib/FixMyStreet/Cobrand/UK.pm:238
msgid "RSS feed of problems within %s"
msgstr "RSS-straum for problem innanfor %s"
#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:102
-#: perllib/FixMyStreet/Cobrand/UK.pm:253
+#: perllib/FixMyStreet/Cobrand/UK.pm:244
msgid "RSS feed of problems within %s ward"
msgstr "RSS-straum for problem innanfor %s bydel"
#: templates/web/default/around/display_location.html:1
#: templates/web/default/around/display_location.html:4
-#: templates/web/fixmystreet/around/display_location.html:1
-#: templates/web/fixmystreet/around/display_location.html:4
msgid "RSS feed of recent local problems"
msgstr "RSS-straum med nye lokale problem"
#: templates/web/bromley/report/display.html:37
#: templates/web/default/report/display.html:42
#: templates/web/fixmystreet/alert/updates.html:9
-#: templates/web/fixmystreet/report/display.html:30
+#: templates/web/fixmystreet/report/display.html:49
msgid "RSS feed of updates to this problem"
msgstr "RSS-straum med oppdateringar for dette problemet"
@@ -2470,18 +2546,17 @@ msgstr "RSS-straum med oppdateringar for dette problemet"
#: templates/web/default/alert/updates.html:9
#: templates/web/default/report/display.html:33
#: templates/web/fixmystreet/alert/updates.html:14
-#: templates/web/fixmystreet/report/display.html:32
+#: templates/web/fixmystreet/report/display.html:51
msgid "Receive email when updates are left on this problem."
msgstr "Motta e-post når det er oppdateringar på dette problemet"
#: templates/web/default/around/display_location.html:0
#: templates/web/default/around/display_location.html:34
-#: templates/web/fixmystreet/around/display_location.html:0
-#: templates/web/fixmystreet/around/display_location.html:34
msgid "Recent local problems, FixMyStreet"
msgstr "Nye lokale problem, FiksGataMi."
#: templates/web/default/reports/index.html:19
+#: templates/web/fixmybarangay/reports/index.html:23
#, fuzzy
msgid "Recently <br>fixed"
msgstr "Nyleg løyste problem"
@@ -2492,7 +2567,7 @@ msgstr "Nyleg løyste problem"
msgid "Recently fixed"
msgstr "Nyleg løyste problem"
-#: templates/web/default/index.html:50 templates/web/fixmystreet/index.html:62
+#: templates/web/default/index.html:37 templates/web/fixmystreet/index.html:45
msgid "Recently reported problems"
msgstr "Nyleg melde problem"
@@ -2509,11 +2584,17 @@ msgstr ""
"tenesta, hugs at du kan kontakta administrasjonen direkte via deira eiga "
"nettside."
+#: templates/web/fixmybarangay/report/new/notes.html:9
+msgid ""
+"Remember that, for the pilot project, FixMyBarangay is only for reporting "
+"potholes and streetlights in bgy. Luz or Basak San Nicolas."
+msgstr ""
+
#: templates/web/default/admin/report_blocks.html:16
msgid "Remove flag"
msgstr "Fjern flagg"
-#: templates/web/default/admin/report_edit.html:53
+#: templates/web/default/admin/report_edit.html:54
#: templates/web/default/admin/update_edit.html:48
msgid "Remove photo (can't be undone!)"
msgstr "Fjern bilete (kan ikkje gjerast om!)"
@@ -2527,12 +2608,13 @@ msgstr "Rapporter tomme heimar"
#: templates/web/fiksgatami/footer.html:5
#: templates/web/fiksgatami/nn/footer.html:5
#: templates/web/fixmystreet/footer.html:45
-#: templates/web/reading/footer.html:6
+#: templates/web/reading/footer.html:6 templates/web/stevenage/footer.html:39
+#: templates/web/zurich/footer.html:10
msgid "Report a problem"
msgstr "Rapporter eit problem"
#: templates/web/bromley/report/display.html:28
-#: templates/web/fixmystreet/report/display.html:22
+#: templates/web/fixmystreet/report/display.html:29
#, fuzzy
msgid "Report abuse"
msgstr "Rapporter eit problem"
@@ -2542,12 +2624,14 @@ msgstr "Rapporter eit problem"
msgid "Report empty properties"
msgstr "Rapporter tomme heimar"
-#: perllib/FixMyStreet/App/Controller/Rss.pm:277
+#: perllib/FixMyStreet/App/Controller/Rss.pm:286
msgid "Report on %s"
msgstr "Rapport på %s"
#: templates/web/default/index.html:15
-#: templates/web/fixmystreet/around/postcode_form.html:6
+#: templates/web/fixmystreet/around/intro.html:1
+#: templates/web/stevenage/around/intro.html:1
+#: templates/web/zurich/around/intro.html:1
msgid "Report, view, or discuss local problems"
msgstr "Rapporter, finn eller diskuter lokale problem"
@@ -2559,7 +2643,7 @@ msgstr "Rapportert %s"
msgid "Reported %s, to %s"
msgstr "Rapportert %s, til %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:512
+#: perllib/FixMyStreet/DB/Result/Problem.pm:520
#: templates/web/default/contact/index.html:45
#: templates/web/fixmystreet/contact/index.html:46
msgid "Reported anonymously at %s"
@@ -2571,33 +2655,33 @@ msgstr "Rapportert anonymt %s"
msgid "Reported before"
msgstr "Rapportert tidlegare"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:504
+#: perllib/FixMyStreet/DB/Result/Problem.pm:512
msgid "Reported by %s anonymously at %s"
msgstr "Publisert av %s anonymt %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:535
+#: perllib/FixMyStreet/DB/Result/Problem.pm:543
#: templates/web/default/contact/index.html:47
#: templates/web/fixmystreet/contact/index.html:48
msgid "Reported by %s at %s"
msgstr "Publisert av %s %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:526
+#: perllib/FixMyStreet/DB/Result/Problem.pm:534
msgid "Reported by %s by %s at %s"
msgstr "Rapportert av %s av %s %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:500
+#: perllib/FixMyStreet/DB/Result/Problem.pm:508
msgid "Reported by %s in the %s category anonymously at %s"
msgstr "Rapportert av %s i kategorien %s anonymt %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:520
+#: perllib/FixMyStreet/DB/Result/Problem.pm:528
msgid "Reported by %s in the %s category by %s at %s"
msgstr "Rapportert av %s i kategorien %s av %s %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:508
+#: perllib/FixMyStreet/DB/Result/Problem.pm:516
msgid "Reported in the %s category anonymously at %s"
msgstr "Rapportert i kategorien %s anonymt %s"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:530
+#: perllib/FixMyStreet/DB/Result/Problem.pm:538
msgid "Reported in the %s category by %s at %s"
msgstr "Rapportert i kategorien %s av %s %s"
@@ -2609,10 +2693,16 @@ msgstr "Rapportert i kategorien %s av %s %s"
#: templates/web/fixmystreet/report/new/fill_in_details.html:0
#: templates/web/fixmystreet/report/new/fill_in_details.html:5
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:2
+#: templates/web/zurich/report/new/fill_in_details_form.html:2
msgid "Reporting a problem"
msgstr "Legger til eit problem"
-#: templates/web/default/around/display_location.html:95
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1033
+#, fuzzy
+msgid "Reports"
+msgstr "Alle rapportar"
+
+#: templates/web/default/around/tabbed_lists.html:3
msgid "Reports on and around the map"
msgstr "Problem i og rundt kartet"
@@ -2620,7 +2710,7 @@ msgstr "Problem i og rundt kartet"
msgid "Resend report"
msgstr "Send rapport på nytt"
-#: perllib/FixMyStreet/Geocode/OSM.pm:166
+#: perllib/FixMyStreet/Geocode/OSM.pm:173
msgid ""
"Road operator for this named road (derived from road reference number and "
"type): %s"
@@ -2628,34 +2718,23 @@ msgstr ""
"Vegoperatør for denne namngjevne vegen (utleia frå vegreferansenummer og "
"type): %s"
-#: perllib/FixMyStreet/Geocode/OSM.pm:163
+#: perllib/FixMyStreet/Geocode/OSM.pm:170
msgid "Road operator for this named road (from OpenStreetMap): %s"
msgstr "Vegoperatør for denne namngjevne vegen (frå OpenStreetMap): %s"
-#: templates/web/default/admin/council_edit.html:35
+#: templates/web/default/admin/council_edit.html:63
msgid "Save changes"
msgstr "Lagra endringar"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1027
-msgid "Search Abuse"
-msgstr "Søk etter misbruk"
-
-#: templates/web/default/admin/search_abuse.html:1
-msgid "Search Abuse Table"
-msgstr "Søk i misbruktabell"
-
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1023
#: templates/web/default/admin/list_flagged.html:1
#: templates/web/default/admin/search_reports.html:1
msgid "Search Reports"
msgstr "Søk i rapportar"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1026
#: templates/web/default/admin/search_users.html:1
msgid "Search Users"
msgstr "Søk i brukarar"
-#: templates/web/default/admin/search_abuse.html:4
#: templates/web/default/admin/search_reports.html:5
#: templates/web/default/admin/search_users.html:5
msgid "Search:"
@@ -2670,7 +2749,7 @@ msgstr ""
"Vel kva for ein type varsel du ynskjer og klikk på knappen for ei RSS-"
"kjelde, eller skriv inn e-postadressa di for å abonnera på eit e-postvarsel."
-#: perllib/FixMyStreet/DB/Result/Problem.pm:618
+#: perllib/FixMyStreet/DB/Result/Problem.pm:623
msgid "Sent to %s %s later"
msgstr "Sendt til %s %s seinare"
@@ -2682,6 +2761,10 @@ msgstr "Sendt:"
msgid "Service:"
msgstr "Teneste:"
+#: templates/web/fixmystreet/report/display.html:33
+msgid "Share"
+msgstr ""
+
#: templates/web/emptyhomes/static/about.html:21
msgid "Shelter Cymru"
msgstr "Shelter Cymru"
@@ -2706,32 +2789,30 @@ msgstr ""
#: templates/web/bromley/report/display.html:203
#: templates/web/bromley/report/new/fill_in_details_form.html:129
#: templates/web/bromley/report/new/fill_in_details_form.html:175
-#: templates/web/default/report/display.html:208
#: templates/web/default/report/new/fill_in_details_form.html:210
-#: templates/web/fixmystreet/report/display.html:185
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:126
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:186
+#: templates/web/default/report/update-form.html:155
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:139
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:207
+#: templates/web/fixmystreet/report/update-form.html:142
msgid "Show my name publicly"
msgstr "Vis namnet mitt offentleg"
-#: templates/web/default/around/display_location.html:60
-#: templates/web/fixmystreet/around/display_location.html:60
+#: templates/web/default/around/display_location.html:65
msgid "Show old"
msgstr ""
-#: templates/web/default/around/display_location.html:51
-#: templates/web/fixmystreet/around/display_location.html:52
+#: templates/web/default/around/display_location.html:56
msgid "Show pins"
msgstr "Vis nåler"
#: templates/web/default/auth/general.html:3
#: templates/web/default/auth/general.html:49
-#: templates/web/fixmybarangay/header.html.orig:46
+#: templates/web/fixmybarangay/header.html:68
#: templates/web/fixmystreet/auth/general.html:3
-#: templates/web/fixmystreet/auth/general.html:38
-#: templates/web/fixmystreet/auth/general.html:58
-#: templates/web/fixmystreet/header.html:51
-#: templates/web/zurich/header.html:51
+#: templates/web/fixmystreet/auth/general.html:42
+#: templates/web/fixmystreet/auth/general.html:62
+#: templates/web/fixmystreet/header.html:53
+#: templates/web/stevenage/header.html:101 templates/web/zurich/header.html:51
msgid "Sign in"
msgstr "Logg inn"
@@ -2750,6 +2831,7 @@ msgstr "Logg inn eller opprett ein konto"
#: templates/web/emptyhomes/header.html:41
#: templates/web/fiksgatami/header.html:22
#: templates/web/fiksgatami/nn/header.html:22
+#: templates/web/fixmybarangay/auth/sign_out.html:1
#: templates/web/lichfielddc/header.html:177
#: templates/web/reading/header.html:33
msgid "Sign out"
@@ -2765,11 +2847,13 @@ msgid "Signed in as %s"
msgstr "Logga inn som %s"
#: templates/web/default/report/new/fill_in_details_text.html:1
+#: templates/web/fixmybarangay/report/new/fill_in_details_text.html:1
#: templates/web/fixmystreet/report/new/fill_in_details_text.html:1
msgid "Some categories may require additional information."
msgstr "Somme kategoriar krev kanskje meir informasjon"
#: templates/web/default/alert/index.html:42
+#: templates/web/fixmybarangay/alert/index.html:32
msgid "Some photos of recent reports"
msgstr "Nokre bilete av nyleg melde problem"
@@ -2782,7 +2866,7 @@ msgstr "Noko tekst å omsetja"
msgid "Some unconfirmeds"
msgstr "Nokre ustadfesta"
-#: perllib/FixMyStreet/Cobrand/UK.pm:97
+#: perllib/FixMyStreet/Cobrand/UK.pm:89
msgid ""
"Sorry, that appears to be a Crown dependency postcode, which we don't cover."
msgstr ""
@@ -2795,15 +2879,16 @@ msgstr ""
"Orsak, men det oppstod eit problem når vi freista å stadfesta "
"problemrapporten din"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:214
-#: perllib/FixMyStreet/Geocode.pm:27 perllib/FixMyStreet/Geocode/Bing.pm:51
-#: perllib/FixMyStreet/Geocode/Google.pm:69
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:211
+#: perllib/FixMyStreet/Geocode.pm:28 perllib/FixMyStreet/Geocode/Bing.pm:58
+#: perllib/FixMyStreet/Geocode/Google.pm:74
+#: perllib/FixMyStreet/Geocode/OSM.pm:66
msgid "Sorry, we could not find that location."
msgstr "Orsak, vi kunne ikkje finna den staden."
-#: perllib/FixMyStreet/Geocode/Bing.pm:46
-#: perllib/FixMyStreet/Geocode/Google.pm:64
-#: perllib/FixMyStreet/Geocode/OSM.pm:59
+#: perllib/FixMyStreet/Geocode/Bing.pm:53
+#: perllib/FixMyStreet/Geocode/Google.pm:69
+#: perllib/FixMyStreet/Geocode/Zurich.pm:82
msgid "Sorry, we could not parse that location. Please try again."
msgstr ""
"Orsak, vi kunne ikkje tolka den posisjonen. Ver venleg og prøv på nytt."
@@ -2829,17 +2914,17 @@ msgstr "Startmånad:"
#: templates/web/default/admin/list_flagged.html:18
#: templates/web/default/admin/list_updates.html:6
#: templates/web/default/admin/search_reports.html:21
-#: templates/web/fixmystreet/report/display.html:72
+#: templates/web/fixmystreet/report/update-form.html:26
msgid "State"
msgstr "Tilstand"
#: templates/web/default/admin/report_edit.html:17
#: templates/web/default/admin/update_edit.html:18
-#: templates/web/default/report/display.html:77
+#: templates/web/default/report/update-form.html:28
msgid "State:"
msgstr "Tilstand:"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1029
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1038
#: templates/web/default/admin/stats.html:1
msgid "Stats"
msgstr "Statistikk"
@@ -2851,7 +2936,7 @@ msgstr "Skal spørjeskjemaet sendast?"
#: templates/web/bromley/report/new/fill_in_details_form.html:48
#: templates/web/fixmystreet/contact/index.html:79
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:58
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:60
#, fuzzy
msgid "Subject"
msgstr "Emne:"
@@ -2869,13 +2954,14 @@ msgstr "Emne:"
#: templates/web/default/report/new/fill_in_details_form.html:114
#: templates/web/default/report/new/fill_in_details_form.html:154
#: templates/web/default/report/new/fill_in_details_form.html:176
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:137
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:162
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:201
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:152
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:177
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:222
+#: templates/web/zurich/report/new/fill_in_details_form.html:128
msgid "Submit"
msgstr "Send inn"
-#: templates/web/default/admin/report_edit.html:56
+#: templates/web/default/admin/report_edit.html:57
#: templates/web/default/admin/update_edit.html:51
#: templates/web/default/admin/user_edit.html:20
msgid "Submit changes"
@@ -2890,16 +2976,24 @@ msgstr "Send inn spørjeskjema"
#: templates/web/default/alert/updates.html:17
#: templates/web/default/report/display.html:38
#: templates/web/fixmystreet/alert/updates.html:23
-#: templates/web/fixmystreet/report/display.html:37
+#: templates/web/fixmystreet/report/display.html:56
msgid "Subscribe"
msgstr "Abonner"
#: templates/web/default/alert/_list.html:97
+#: templates/web/fixmybarangay/alert/_list.html:42
#: templates/web/fixmystreet/alert/_list.html:92
msgid "Subscribe me to an email alert"
msgstr "Eg ynskjer å abonnera på e-postvarsel"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1021
+#: templates/web/fixmybarangay/alert/_list.html:6
+#, fuzzy
+msgid "Subscribe to an alert based upon what baranagay you&rsquo;re in:"
+msgstr ""
+"Eller du kan abonnera på varsel basert på bydel eller administrasjon du "
+"høyrer til under:"
+
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1031
#: templates/web/default/admin/index.html:1
msgid "Summary"
msgstr "Oppsummering"
@@ -2908,10 +3002,15 @@ msgstr "Oppsummering"
#: templates/web/emptyhomes/reports/index.html:1
#: templates/web/fiksgatami/nn/reports/index.html:1
#: templates/web/fiksgatami/reports/index.html:1
+#: templates/web/fixmybarangay/reports/index.html:1
msgid "Summary reports"
msgstr "Oppsummeringsrapportar"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1025
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1035
+#, fuzzy
+msgid "Survey"
+msgstr "Resultat frå spørjeundersøkinga"
+
#: templates/web/default/admin/questionnaire.html:1
msgid "Survey Results"
msgstr "Resultat frå spørjeundersøkinga"
@@ -2920,7 +3019,7 @@ msgstr "Resultat frå spørjeundersøkinga"
msgid "Text"
msgstr "Tekst"
-#: templates/web/default/admin/council_contacts.html:18
+#: templates/web/default/admin/council_contacts.html:20
msgid "Text only version"
msgstr "Tekst-utgåve"
@@ -3008,13 +3107,13 @@ msgstr ""
"Takk, glad for å høyra at problemet er løyst! Vi vil gjerne spørja deg om du "
"har rapportert eit problem til ein administrasjon tidlegare?"
-#: perllib/FixMyStreet/App/Controller/Photo.pm:190
+#: perllib/FixMyStreet/App/Controller/Photo.pm:189
msgid ""
"That image doesn't appear to have uploaded correctly (%s), please try again."
msgstr ""
"Biletet ser ikkje ut til å ha vorte lasta opp riktig (%s), prøv på nytt."
-#: perllib/FixMyStreet/App/Controller/Council.pm:91
+#: perllib/FixMyStreet/App/Controller/Council.pm:90
#, fuzzy
msgid ""
"That location does not appear to be covered by a council; perhaps it is "
@@ -3023,22 +3122,27 @@ msgstr ""
"Den staden vert ikkje dekt av nokon administrasjon, kanskje det er til\n"
"havs – ver venleg og prøv ein meir spesifikk stad."
-#: perllib/FixMyStreet/App/Controller/Location.pm:107
+#: perllib/FixMyStreet/App/Controller/Location.pm:121
#, fuzzy
msgid "That location does not appear to be in the UK; please try again."
msgstr ""
"Den staden synest ikkje å vera i Storbritannia. Ver venleg og prøv igjen."
#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:63
-#: perllib/FixMyStreet/Cobrand/UK.pm:90
+#: perllib/FixMyStreet/Cobrand/UK.pm:82
msgid "That postcode was not recognised, sorry."
msgstr "Det postnummeret vart ikkje gjenkjent, orsak."
-#: perllib/FixMyStreet/App/Controller/Admin.pm:605
+#: perllib/FixMyStreet/App/Controller/Admin.pm:616
msgid "That problem will now be resent."
msgstr "Det problemet vil no sendast på nytt."
-#: perllib/FixMyStreet/App/Controller/Report.pm:75
+#: perllib/FixMyStreet/App/Controller/Report.pm:98
+#, fuzzy
+msgid "That report cannot be viewed on FixMyStreet."
+msgstr "Den rapporten har vorte fjerna frå FiksGataMi."
+
+#: perllib/FixMyStreet/App/Controller/Report.pm:92
msgid "That report has been removed from FixMyStreet."
msgstr "Den rapporten har vorte fjerna frå FiksGataMi."
@@ -3083,14 +3187,11 @@ msgstr ""
#: templates/web/fixmystreet/report/new/fill_in_details_text.html:1
#: templates/web/fixmystreet/report/new/fill_in_details_text.html:3
-#, fuzzy
msgid ""
-"The council won&rsquo;t be able to help unless you leave as much\n"
-"detail as you can. Please describe the exact location of the problem (e.g. "
-"on a\n"
-"wall), what it is, how long it has been there, a description (and a photo "
-"of\n"
-"the problem if you have one), etc."
+"The council won&rsquo;t be able to help unless you leave as much detail as "
+"you can. Please describe the exact location of the problem (e.g. on a wall), "
+"what it is, how long it has been there, a description (and a photo of the "
+"problem if you have one), etc."
msgstr ""
"Ver venlg og fyll inn detaljane om problemet under. Administrasjonen\n"
"vil ikkje vera i stand til å hjelpa med mindre du legg inn så mange\n"
@@ -3112,8 +3213,8 @@ msgstr ""
"Detaljane om problemet ditt er tilgjengelege på høgre kant av denne sida."
#: perllib/FixMyStreet/App/Controller/Dashboard.pm:60
-#: perllib/FixMyStreet/App/Controller/Reports.pm:44
-#: perllib/FixMyStreet/App/Controller/Reports.pm:75
+#: perllib/FixMyStreet/App/Controller/Reports.pm:43
+#: perllib/FixMyStreet/App/Controller/Reports.pm:74
msgid "The error was: %s"
msgstr "Feilen var: %s"
@@ -3127,7 +3228,7 @@ msgstr ""
"service_request_id, description, lat, long, media_url, status, "
"requested_datetime, updated_datetime, service_code og service_name."
-#: perllib/FixMyStreet/Geocode/OSM.pm:158
+#: perllib/FixMyStreet/Geocode/OSM.pm:165
msgid ""
"The following information about the nearest road might be inaccurate or "
"irrelevant, if the problem is close to several roads or close to a road "
@@ -3210,6 +3311,7 @@ msgstr "Den enklaste meldinga er den geografiske:"
#: templates/web/default/report/new/councils_text_some.html:11
#: templates/web/default/report/new/fill_in_details_form.html:17
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:12
+#: templates/web/zurich/report/new/fill_in_details_form.html:12
msgid ""
"The subject and details of the problem will be public, plus your name if you "
"give us permission."
@@ -3217,7 +3319,7 @@ msgstr ""
"Tittelen og detaljane for problemet vil verta offentlege, pluss namnet ditt\n"
"viss du gjev oss lov til det."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:269
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:271
msgid ""
"The user could not locate the problem on a map, but to see the area around "
"the location they entered"
@@ -3225,7 +3327,7 @@ msgstr ""
"Brukaren kunne ikkje plassera problemet på eit kart, men sjekk områdde rundt "
"staden dei skreiv inn"
-#: perllib/FixMyStreet/App/Controller/Reports.pm:72
+#: perllib/FixMyStreet/App/Controller/Reports.pm:71
msgid ""
"There was a problem showing the All Reports page. Please try again later."
msgstr ""
@@ -3239,8 +3341,8 @@ msgstr ""
"Det oppstod problem med å visa «Alle rapportar»-sida. Ver venleg og prøv "
"igjen seinare."
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:733
-#: perllib/FixMyStreet/App/Controller/Report/Update.pm:130
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:736
+#: perllib/FixMyStreet/App/Controller/Report/Update.pm:134
#: templates/web/default/auth/general.html:23
#: templates/web/fixmystreet/auth/general.html:24
#, fuzzy
@@ -3261,7 +3363,7 @@ msgstr ""
"Det var problem med e-post/passord-kombinasjonen din. Ver venleg og prøv "
"igjen."
-#: perllib/FixMyStreet/App/Controller/Report/Update.pm:252
+#: perllib/FixMyStreet/App/Controller/Report/Update.pm:256
msgid "There was a problem with your update. Please try again."
msgstr "Det var problem med oppdateringa di. Ver venleg og prøv igjen."
@@ -3269,7 +3371,7 @@ msgstr "Det var problem med oppdateringa di. Ver venleg og prøv igjen."
msgid "There were problems with your report. Please see below."
msgstr "Det var problem med rapporten din. Ver venleg og sjå under."
-#: perllib/FixMyStreet/App/Controller/Report/Update.pm:279
+#: perllib/FixMyStreet/App/Controller/Report/Update.pm:283
msgid "There were problems with your update. Please see below."
msgstr "Det var problem med oppdateringa di. Ver venleg og sjå under."
@@ -3281,7 +3383,7 @@ msgstr ""
"Denne API-implementasjonen er under arbeid og ikkje enno stabil. Han vil "
"endra seg utan åtvaring i framtida."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:339
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:341
msgid ""
"This email has been sent to both councils covering the location of the "
"problem, as the user did not categorise it; please ignore it if you're not "
@@ -3294,7 +3396,7 @@ msgstr ""
"eller gjev oss melding om kva for ein kategori av problem dette er så vi kan "
"leggja det til i systemet vårt."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:342
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:344
msgid ""
"This email has been sent to several councils covering the location of the "
"problem, as the category selected is provided for all of them; please ignore "
@@ -3305,8 +3407,8 @@ msgstr ""
"og ignorer e-posten viss de ikkje er korrekt administrasjon for å handtera "
"denne saka."
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:865
-#: perllib/FixMyStreet/Cobrand/UK.pm:62
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:868
+#: perllib/FixMyStreet/Cobrand/UK.pm:54
msgid "This information is required"
msgstr "Denne informasjonen er påkravd"
@@ -3318,14 +3420,23 @@ msgstr ""
"Dette er ein utviklarnettstad. Ting kan knekka når som helst og databasen "
"vil verta periodisk sletta."
-#: templates/web/emptyhomes/reports/council.html:58
+#: templates/web/emptyhomes/reports/body.html:58
msgid "This is a summary of all reports for one %s."
msgstr "Dette er ei oppsummering av alle rapportar for ein %s."
-#: templates/web/emptyhomes/reports/council.html:60
+#: templates/web/emptyhomes/reports/body.html:60
msgid "This is a summary of all reports for this %s."
msgstr "Dette er ei oppsummering for alle rapportar for denne %s-en."
+#: templates/web/fixmybarangay/reports/index.html:7
+#, fuzzy
+msgid ""
+"This is a summary of all reports on this site; select a particular barangay "
+"to see the reports sent there."
+msgstr ""
+"Dette er ei opplisting av alle problema i denne tenesta; vel ein viss "
+"administrasjon for å sjå problem som er sende dit."
+
#: templates/web/default/reports/index.html:7
#: templates/web/emptyhomes/reports/index.html:4
#: templates/web/fiksgatami/nn/reports/index.html:4
@@ -3343,15 +3454,15 @@ msgstr "Dette problemet er lukka"
#: templates/web/bromley/report/display.html:96
#: templates/web/default/report/banner.html:12
-#: templates/web/default/report/display.html:95
+#: templates/web/default/report/update-form.html:46
#: templates/web/emptyhomes/report/display.html:12
-#: templates/web/fixmystreet/report/display.html:90
+#: templates/web/fixmystreet/report/update-form.html:44
msgid "This problem has been fixed"
msgstr "Dette problemet er løyst"
#: templates/web/bromley/report/display.html:90
-#: templates/web/default/report/display.html:90
-#: templates/web/fixmystreet/report/display.html:84
+#: templates/web/default/report/update-form.html:41
+#: templates/web/fixmystreet/report/update-form.html:38
msgid "This problem has not been fixed"
msgstr "Dette problemet har ikkje vorte løyst"
@@ -3363,25 +3474,25 @@ msgstr "Dette problemet er under arbeid"
msgid "This problem is old and of unknown status."
msgstr "Dette problemet er gammalt og med ukjend status."
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:83
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:86
msgid "This report is currently marked as closed."
msgstr "Denne rapporten er for tida markert som lukka."
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:81
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:84
msgid "This report is currently marked as fixed."
msgstr "Denne rapporten er for tida markert som fiksa."
-#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:85
+#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:88
msgid "This report is currently marked as open."
msgstr "Denne rapporten er for tida markert som open."
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:262
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:264
msgid ""
"This web page also contains a photo of the problem, provided by the user."
msgstr ""
"Denne nettsida inneheld òg eit bilete av problemet, sendt inn av brukaren."
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1024
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1034
#: templates/web/default/admin/timeline.html:1
msgid "Timeline"
msgstr "Tidslinje"
@@ -3391,7 +3502,7 @@ msgstr "Tidslinje"
msgid "Title"
msgstr "Tittel"
-#: templates/web/default/around/display_location.html:69
+#: templates/web/default/around/_report_banner.html:2
#, fuzzy
msgid ""
"To <strong>report a problem</strong>, click on the map at the correct "
@@ -3416,7 +3527,7 @@ msgid ""
msgstr ""
"Du finn lokale problem ved å søkja på postnummeret ditt, vegnamn eller stad:"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:268
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:270
msgid "To view a map of the precise location of this issue"
msgstr "For å sjå eit kart med ei meir presis plassering for dette problemet"
@@ -3427,7 +3538,7 @@ msgstr "For å sjå eit kart med ei meir presis plassering for dette problemet"
msgid "Total"
msgstr "Totalt"
-#: perllib/FixMyStreet/App/Controller/Reports.pm:43
+#: perllib/FixMyStreet/App/Controller/Reports.pm:42
msgid "Unable to look up areas in MaPit. Please try again later."
msgstr ""
"Klarte ikkje slå opp område i MaPit. Ver venleg og prøv igjen seinare."
@@ -3443,16 +3554,16 @@ msgstr "Ikkje stadfesta"
msgid "Unknown"
msgstr "*ukjent*"
-#: perllib/FixMyStreet/App/Controller/Rss.pm:164
+#: perllib/FixMyStreet/App/Controller/Rss.pm:173
msgid "Unknown alert type"
msgstr "Ukjend varsel-type"
-#: perllib/FixMyStreet/App/Controller/Report.pm:70
+#: perllib/FixMyStreet/App/Controller/Report.pm:87
msgid "Unknown problem ID"
msgstr "Ukjend problem-ID"
#: templates/web/bromley/report/display.html:66
-#: templates/web/fixmystreet/report/display.html:65
+#: templates/web/fixmystreet/report/update-form.html:19
#, fuzzy
msgid "Update"
msgstr "Oppdatering:"
@@ -3491,17 +3602,17 @@ msgstr "Ei oppdatering markerte dette problemet som fiksa."
msgid "Update reopened problem"
msgstr "Ei oppdatering gjenopna problemet"
-#: templates/web/default/admin/council_contacts.html:62
+#: templates/web/default/admin/council_contacts.html:68
msgid "Update statuses"
msgstr "Oppdater tilstanden"
-#: templates/web/default/report/display.html:71
+#: templates/web/default/report/update-form.html:22
msgid "Update:"
msgstr "Oppdatering:"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:694
-#: perllib/FixMyStreet/App/Controller/Admin.pm:809
-#: perllib/FixMyStreet/App/Controller/Admin.pm:889
+#: perllib/FixMyStreet/App/Controller/Admin.pm:708
+#: perllib/FixMyStreet/App/Controller/Admin.pm:839
+#: perllib/FixMyStreet/App/Controller/Admin.pm:899
msgid "Updated!"
msgstr "Oppdatert!"
@@ -3524,20 +3635,21 @@ msgstr "Oppdateringar av {{title}}"
msgid "Updates to this problem, FixMyStreet"
msgstr "Oppdateringar til dette problemet, FiksGataMi"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1182
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1191
msgid "User flag removed"
msgstr "Brukarflagg fjerna"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:1154
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1163
msgid "User flagged"
msgstr "Brukar flagga"
+#: perllib/FixMyStreet/App/Controller/Admin.pm:1036
#: templates/web/default/admin/list_flagged.html:30
msgid "Users"
msgstr "Brukarar"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:309
-#: perllib/FixMyStreet/App/Controller/Admin.pm:339
+#: perllib/FixMyStreet/App/Controller/Admin.pm:315
+#: perllib/FixMyStreet/App/Controller/Admin.pm:345
msgid "Values updated"
msgstr "Verdi oppdatert"
@@ -3546,7 +3658,7 @@ msgstr "Verdi oppdatert"
msgid "View report on site"
msgstr "Sjå rapport på nettstaden"
-#: templates/web/default/reports/council.html:18
+#: templates/web/default/reports/body.html:18
#, fuzzy
msgid "View reports by ward"
msgstr "Sjå rapport på nettstaden"
@@ -3559,20 +3671,19 @@ msgstr "Vis rapporten din"
#: templates/web/default/around/display_location.html:33
#: templates/web/emptyhomes/around/display_location.html:0
#: templates/web/emptyhomes/around/display_location.html:16
-#: templates/web/fixmystreet/around/display_location.html:0
-#: templates/web/fixmystreet/around/display_location.html:33
msgid "Viewing a location"
msgstr "Ser på ein stad"
#: templates/web/bromley/report/display.html:0
#: templates/web/default/report/display.html:0
+#: templates/web/emptyhomes/report/display.html:1
#: templates/web/emptyhomes/report/display.html:2
#: templates/web/fixmystreet/report/display.html:0
msgid "Viewing a problem"
msgstr "Ser på eit problem"
-#: templates/web/default/reports/council.html:20
-#: templates/web/emptyhomes/reports/council.html:18
+#: templates/web/default/reports/body.html:20
+#: templates/web/emptyhomes/reports/body.html:18
msgid "Wards of this council"
msgstr "Bydelar innanfor denne administrasjonen"
@@ -3602,20 +3713,21 @@ msgstr ""
"endra seg med eiedommen du rapporterte."
#: templates/web/bromley/report/display.html:141
-#: templates/web/fixmystreet/report/display.html:153
+#: templates/web/fixmystreet/report/update-form.html:113
#, fuzzy
msgid "We never show your email"
msgstr "(vi viser aldri e-postadressa di)"
#: templates/web/bromley/report/new/fill_in_details_form.html:133
#: templates/web/bromley/report/new/fill_in_details_form.html:179
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:130
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:190
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:144
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:211
+#: templates/web/zurich/report/new/fill_in_details_form.html:114
#, fuzzy
msgid "We never show your email address or phone number."
msgstr "(vi viser aldri e-postadressa di eller telefonnummeret ditt)"
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:349
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:351
msgid ""
"We realise this problem might be the responsibility of %s; however, we don't "
"currently have any contact details for them. If you know of an appropriate "
@@ -3625,13 +3737,14 @@ msgstr ""
"tida kontaktinformasjon for dei. Viss du veit om ei eigna kontaktadresse, ta "
"kontakt med oss."
-#: templates/web/default/index.html:34 templates/web/emptyhomes/index.html:59
-#: templates/web/fixmystreet/index.html:45
+#: templates/web/default/index-steps.html:16
+#: templates/web/emptyhomes/index.html:59
msgid "We send it to the council on your behalf"
msgstr "Vi sender til administrasjon på dine vegner"
#: templates/web/bromley/report/new/fill_in_details_form.html:217
#: templates/web/default/report/new/notes.html:5
+#: templates/web/fixmybarangay/report/new/notes.html:5
msgid ""
"We will only use your personal information in accordance with our <a href=\"/"
"faq#privacy\">privacy policy.</a>"
@@ -3667,8 +3780,8 @@ msgstr ""
"Vi ynskjer å få tilbakemelding frå deg om kva du meiner om denne tenesta. "
"Berre fyll ut skjemaet, eller send ein e-post <a href='mailto:%s'>%s</a>:"
-#: templates/web/default/admin/council_contacts.html:41
-#: templates/web/default/admin/council_edit.html:41
+#: templates/web/default/admin/council_contacts.html:45
+#: templates/web/default/admin/council_edit.html:69
msgid "When edited"
msgstr "Når redigert"
@@ -3677,7 +3790,7 @@ msgstr "Når redigert"
msgid "When sent"
msgstr "Når sendt"
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:612
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:611
msgid "Whole block of empty flats"
msgstr "Heil blokk med tomme leilegheiter"
@@ -3693,6 +3806,7 @@ msgstr ""
"href=\"%s\">MaPit</a>."
#: templates/web/fixmystreet/footer.html:22
+#: templates/web/stevenage/footer.html:22
msgid ""
"Would you like better integration with FixMyStreet? <a href=\"http://www."
"mysociety.org/for-councils/fixmystreet/\">Find out about FixMyStreet for "
@@ -3700,6 +3814,7 @@ msgid ""
msgstr ""
#: templates/web/fixmystreet/footer.html:18
+#: templates/web/stevenage/footer.html:18
#, fuzzy
msgid ""
"Would you like to contribute to FixMyStreet? Our code is open source and <a "
@@ -3718,6 +3833,7 @@ msgstr ""
"å sjekka status?"
#: templates/web/default/report/new/notes.html:8
+#: templates/web/fixmybarangay/report/new/notes.html:8
#: templates/web/fixmystreet/report/new/notes.html:7
msgid ""
"Writing your message entirely in block capitals makes it hard to read, as "
@@ -3730,8 +3846,9 @@ msgstr ""
msgid "Year"
msgstr "År"
-#: templates/web/default/admin/council_contacts.html:48
-#: templates/web/default/admin/council_contacts.html:49
+#: templates/web/default/admin/council_contacts.html:52
+#: templates/web/default/admin/council_contacts.html:53
+#: templates/web/default/admin/council_contacts.html:54
#: templates/web/default/admin/council_edit.html:5
#: templates/web/default/admin/list_updates.html:30
#: templates/web/default/admin/list_updates.html:31
@@ -3751,8 +3868,8 @@ msgstr "Ja"
#: templates/web/bromley/report/display.html:155
#: templates/web/bromley/report/new/fill_in_details_form.html:198
-#: templates/web/fixmystreet/report/display.html:133
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:156
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:171
+#: templates/web/fixmystreet/report/update-form.html:87
#, fuzzy
msgid "Yes I have a password"
msgstr "<strong>Ja</strong>, eg har eit passord:"
@@ -3775,7 +3892,7 @@ msgstr ""
"Du rapporterer at følgjande oppdatering er støytande, inneheld personleg "
"informasjon, eller liknande:"
-#: templates/web/emptyhomes/reports/council.html:64
+#: templates/web/emptyhomes/reports/body.html:64
msgid ""
"You can <a href=\"%s\">view all reports for the council</a> or <a href=\"/"
"reports\">show all councils</a>."
@@ -3783,7 +3900,7 @@ msgstr ""
"Du kan <a href=\"%s\">sjå alle rapportar for administrasjonen</a> eller <a "
"href=\"/reports\">sjå alle administrasjonane</a>."
-#: templates/web/emptyhomes/reports/council.html:66
+#: templates/web/emptyhomes/reports/body.html:66
msgid "You can <a href=\"/reports\">show all councils</a>."
msgstr "Du kan <a href=\"/reports/\">sjå alle administrasjonar</a>."
@@ -3811,7 +3928,8 @@ msgstr ""
#: templates/web/default/questionnaire/index.html:92
#: templates/web/default/report/new/fill_in_details_form.html:93
#: templates/web/fixmystreet/questionnaire/index.html:87
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:101
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:99
+#: templates/web/zurich/report/new/fill_in_details_form.html:93
msgid ""
"You have already attached a photo to this report, attaching another one will "
"replace it."
@@ -3820,8 +3938,8 @@ msgstr ""
"anna vil byta ut dette."
#: templates/web/bromley/report/display.html:106
-#: templates/web/default/report/display.html:106
-#: templates/web/fixmystreet/report/display.html:100
+#: templates/web/default/report/update-form.html:57
+#: templates/web/fixmystreet/report/update-form.html:54
msgid ""
"You have already attached a photo to this update, attaching another one will "
"replace it."
@@ -3830,12 +3948,14 @@ msgstr ""
"anna vil byta ut dette."
#: templates/web/default/auth/sign_out.html:3
+#: templates/web/fixmybarangay/auth/sign_out.html:3
msgid "You have been signed out"
msgstr "Du er allereie logga ut"
#: templates/web/bromley/report/new/fill_in_details_form.html:25
#: templates/web/default/report/new/fill_in_details_form.html:7
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:27
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:28
+#: templates/web/zurich/report/new/fill_in_details_form.html:28
#, fuzzy
msgid ""
"You have located the problem at the point marked with a green pin on the "
@@ -3870,8 +3990,8 @@ msgstr "Du har oppretta varselet ditt."
msgid "You have successfully deleted your alert."
msgstr "Sletting av varselet ditt var vellukka."
-#: perllib/FixMyStreet/App/Controller/Report/New.pm:740
-#: perllib/FixMyStreet/App/Controller/Report/Update.pm:136
+#: perllib/FixMyStreet/App/Controller/Report/New.pm:743
+#: perllib/FixMyStreet/App/Controller/Report/Update.pm:140
msgid ""
"You have successfully signed in; please check and confirm your details are "
"accurate:"
@@ -3905,16 +4025,18 @@ msgstr "Rapportane dine"
#: templates/web/fixmystreet/alert/updates.html:19
#: templates/web/fixmystreet/alert/updates.html:22
#: templates/web/fixmystreet/contact/index.html:72
-#: templates/web/fixmystreet/report/display.html:34
-#: templates/web/fixmystreet/report/display.html:36
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:142
+#: templates/web/fixmystreet/report/display.html:53
+#: templates/web/fixmystreet/report/display.html:55
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:115
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:157
+#: templates/web/zurich/report/new/fill_in_details_form.html:106
#, fuzzy
msgid "Your email"
msgstr "E-posten din"
#: templates/web/bromley/report/display.html:130
#: templates/web/fixmystreet/auth/general.html:26
-#: templates/web/fixmystreet/report/display.html:124
+#: templates/web/fixmystreet/report/update-form.html:78
#, fuzzy
msgid "Your email address"
msgstr "e-postadressa di:"
@@ -3924,8 +4046,9 @@ msgid "Your email address:"
msgstr "e-postadressa di:"
#: templates/web/default/alert/_list.html:92
-#: templates/web/default/report/display.html:128
#: templates/web/default/report/new/fill_in_details_form.html:124
+#: templates/web/default/report/update-form.html:79
+#: templates/web/fixmybarangay/alert/_list.html:37
msgid "Your email:"
msgstr "E-posten din"
@@ -3952,27 +4075,28 @@ msgstr ""
msgid "Your last name"
msgstr "Namnet ditt:"
-#: templates/web/fixmystreet/auth/general.html:53
+#: templates/web/fixmystreet/auth/general.html:57
#: templates/web/fixmystreet/contact/index.html:65
-#: templates/web/fixmystreet/report/display.html:181
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:121
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:181
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:124
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:202
+#: templates/web/fixmystreet/report/update-form.html:138
+#: templates/web/zurich/report/new/fill_in_details_form.html:122
#, fuzzy
msgid "Your name"
msgstr "Namnet ditt:"
#: templates/web/default/auth/general.html:59
#: templates/web/default/contact/index.html:68
-#: templates/web/default/report/display.html:202
#: templates/web/default/report/new/fill_in_details_form.html:203
+#: templates/web/default/report/update-form.html:149
msgid "Your name:"
msgstr "Namnet ditt:"
#: templates/web/bromley/report/display.html:160
#: templates/web/bromley/report/new/fill_in_details_form.html:203
-#: templates/web/fixmystreet/auth/general.html:37
-#: templates/web/fixmystreet/report/display.html:138
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:161
+#: templates/web/fixmystreet/auth/general.html:41
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:176
+#: templates/web/fixmystreet/report/update-form.html:92
#, fuzzy
msgid "Your password"
msgstr "Rapportane dine"
@@ -3983,8 +4107,9 @@ msgstr "Passordet ditt har vorte endra"
#: templates/web/bromley/report/new/fill_in_details_form.html:137
#: templates/web/bromley/report/new/fill_in_details_form.html:184
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:134
-#: templates/web/fixmystreet/report/new/fill_in_details_form.html:195
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:149
+#: templates/web/fixmystreet/report/new/fill_in_details_form.html:216
+#: templates/web/zurich/report/new/fill_in_details_form.html:125
msgid "Your phone number"
msgstr ""
@@ -3998,11 +4123,11 @@ msgstr "Oppdateringane dine"
#: templates/web/fiksgatami/footer.html:6
#: templates/web/fiksgatami/nn/footer.html:6
#: templates/web/fixmystreet/footer.html:47
-#: templates/web/reading/footer.html:7
+#: templates/web/reading/footer.html:7 templates/web/stevenage/footer.html:41
msgid "Your reports"
msgstr "Oppdateringane dine"
-#: templates/web/default/my/my.html:45 templates/web/fixmystreet/my/my.html:45
+#: templates/web/default/my/my.html:45 templates/web/fixmystreet/my/my.html:49
msgid "Your updates"
msgstr "Oppdateringane dine"
@@ -4014,19 +4139,23 @@ msgstr "E-posten&nbsp;din:"
msgid "by %s"
msgstr "av %s"
-#: templates/web/default/reports/council.html:12
-#: templates/web/default/reports/council.html:13
-#: templates/web/emptyhomes/reports/council.html:6
-#: templates/web/emptyhomes/reports/council.html:7
+#: templates/web/default/reports/body.html:12
+#: templates/web/default/reports/body.html:13
+#: templates/web/emptyhomes/reports/body.html:6
+#: templates/web/emptyhomes/reports/body.html:7
msgid "council"
msgstr "administrasjon"
+#: perllib/FixMyStreet/DB/Result/Problem.pm:608
+msgid "council ref:&nbsp;%s"
+msgstr ""
+
#: templates/web/default/admin/report_edit.html:15
msgid "didn't use map"
msgstr "brukte ikkje kart"
#: templates/web/default/alert/index.html:33
-#: templates/web/fixmystreet/around/postcode_form.html:17
+#: templates/web/fixmystreet/around/postcode_form.html:20
msgid "e.g. ‘%s’ or ‘%s’"
msgstr ""
@@ -4034,7 +4163,7 @@ msgstr ""
msgid "from %d different users"
msgstr "frå %d ulike brukarar"
-#: perllib/Utils.pm:289
+#: perllib/Utils.pm:267
msgid "less than a minute"
msgstr "mindre enn eitt minutt"
@@ -4046,17 +4175,22 @@ msgstr "markert som %s"
msgid "marked as fixed"
msgstr "markert som løyst"
-#: perllib/FixMyStreet/App/Controller/Admin.pm:112
+#: perllib/FixMyStreet/App/Controller/Admin.pm:113
#: templates/web/default/admin/questionnaire.html:15
#: templates/web/default/admin/questionnaire.html:16
msgid "n/a"
msgstr "i/t"
#: templates/web/default/alert/_list.html:87
+#: templates/web/fixmybarangay/alert/_list.html:32
#: templates/web/fixmystreet/alert/_list.html:85
msgid "or"
msgstr "eller"
+#: templates/web/default/js/validation_strings.html:21
+msgid "or locate me automatically"
+msgstr ""
+
#: templates/web/default/admin/report_edit.html:15
msgid "originally entered"
msgstr "søkte etter"
@@ -4071,9 +4205,9 @@ msgstr "opna på nytt"
#: templates/web/barnet/header.html:71 templates/web/bromley/header.html:100
#: templates/web/bromley/header.html:65
-#: templates/web/fixmybarangay/header.html.orig:43
-#: templates/web/fixmystreet/header.html:48
-#: templates/web/zurich/header.html:48
+#: templates/web/fixmybarangay/header.html:65
+#: templates/web/fixmystreet/header.html:50
+#: templates/web/stevenage/header.html:98 templates/web/zurich/header.html:48
#, fuzzy
msgid "sign out"
msgstr "Logg ut"
@@ -4084,22 +4218,20 @@ msgstr "Logg ut"
#: templates/web/default/report/new/fill_in_details_form.html:14
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:6
#: templates/web/fixmystreet/report/new/fill_in_details_form.html:9
+#: templates/web/zurich/report/new/fill_in_details_form.html:6
+#: templates/web/zurich/report/new/fill_in_details_form.html:9
msgid "the local council"
msgstr "den lokale administrasjonen"
-#: perllib/FixMyStreet/DB/Result/Problem.pm:541
-msgid "the map was not used so pin location may be inaccurate"
-msgstr "karta vart ikkje brukt, så nåleposisjon kan vera unøyaktig"
-
-#: perllib/FixMyStreet/DB/Result/Problem.pm:603
-msgid "their ref:&nbsp;%s"
+#: templates/web/default/report/_main.html:6
+msgid "there is no pin shown as the user did not use the map"
msgstr ""
-#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:330
+#: perllib/FixMyStreet/DB/ResultSet/Problem.pm:332
msgid "this type of local problem"
msgstr "denne typen lokalt problem"
-#: perllib/Utils.pm:263
+#: perllib/Utils.pm:241
msgid "today"
msgstr "i dag"
@@ -4115,10 +4247,10 @@ msgstr "brukaren er frå same administrasjon som problemet – %d"
msgid "user is problem owner"
msgstr "brukaren er eigaren av problemet"
-#: templates/web/default/reports/council.html:0
-#: templates/web/default/reports/council.html:9
-#: templates/web/emptyhomes/reports/council.html:0
-#: templates/web/emptyhomes/reports/council.html:3
+#: templates/web/default/reports/body.html:0
+#: templates/web/default/reports/body.html:9
+#: templates/web/emptyhomes/reports/body.html:0
+#: templates/web/emptyhomes/reports/body.html:3
msgid "ward"
msgstr "bydel"
@@ -4152,6 +4284,34 @@ msgstr "vil problemet ditt ikkje publiserast"
msgid "your update will not be posted"
msgstr "oppdateringa di vil ikkje publiserast"
+#: templates/web/emptyhomes/front/stats.html:17
+#, perl-format
+msgid "<big>%s</big> report recently"
+msgid_plural "<big>%s</big> reports recently"
+msgstr[0] "<big>%s</big> rapport nyleg"
+msgstr[1] "<big>%s</big> rapportar nyleg"
+
+#: perllib/Utils.pm:286
+#, fuzzy, perl-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] "%d time"
+msgstr[1] "%d time"
+
+#: perllib/Utils.pm:288
+#, fuzzy, perl-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] "%d minutt"
+msgstr[1] "%d minutt"
+
+#: templates/web/default/front/stats.html:29
+#, perl-format
+msgid "<big>%s</big> update on reports"
+msgid_plural "<big>%s</big> updates on reports"
+msgstr[0] "<big>%s</big> rapportoppdatering"
+msgstr[1] "<big>%s</big> rapportoppdateringar"
+
#: templates/web/emptyhomes/report/new/councils_text_none.html:3
#, perl-format
msgid "We do not yet have details for the council that covers this location."
@@ -4162,12 +4322,12 @@ msgstr[0] ""
msgstr[1] ""
"Vi har enno ikkje detaljar for administrasjonane som dekkjer denne staden."
-#: templates/web/emptyhomes/front/stats.html:17
-#, perl-format
-msgid "<big>%s</big> report recently"
-msgid_plural "<big>%s</big> reports recently"
-msgstr[0] "<big>%s</big> rapport nyleg"
-msgstr[1] "<big>%s</big> rapportar nyleg"
+#: perllib/Utils.pm:282
+#, fuzzy, perl-format
+msgid "%d week"
+msgid_plural "%d weeks"
+msgstr[0] "%d veke"
+msgstr[1] "%d veke"
#: templates/web/emptyhomes/front/stats.html:12
#, perl-format
@@ -4198,12 +4358,49 @@ msgstr[1] ""
"Vi har enno <strong>ikkje</strong> detaljane for dei andre administrasjonane "
"som dekkjer denne staden."
-#: templates/web/default/front/stats.html:29
-#, perl-format
-msgid "<big>%s</big> update on reports"
-msgid_plural "<big>%s</big> updates on reports"
-msgstr[0] "<big>%s</big> rapportoppdatering"
-msgstr[1] "<big>%s</big> rapportoppdateringar"
+#: perllib/Utils.pm:284
+#, fuzzy, perl-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] "%d dag"
+msgstr[1] "%d dag"
+
+#~ msgid "FixMyStreet administration"
+#~ msgstr "Fiksgatami-administrasjon"
+
+#~ msgid "List Flagged"
+#~ msgstr "Vis flagga"
+
+#~ msgid "Search Abuse"
+#~ msgstr "Søk etter misbruk"
+
+#~ msgid "Search Abuse Table"
+#~ msgstr "Søk i misbruktabell"
+
+#~ msgid ""
+#~ "Please do not be abusive &mdash; abusing your council devalues the "
+#~ "service for all users."
+#~ msgstr ""
+#~ "Ikkje ver ufin &mdash; å kjefta på administrasjonen din skader verdet av "
+#~ "tenesta for alle brukarane."
+
+#~ msgid "%d days"
+#~ msgstr "%d dagar"
+
+#~ msgid "%d hours"
+#~ msgstr "%d timar"
+
+#~ msgid "%d minutes"
+#~ msgstr "%d minutt"
+
+#~ msgid "%d weeks"
+#~ msgstr "%d veker"
+
+#~ msgid "All"
+#~ msgstr "Alle"
+
+#~ msgid "the map was not used so pin location may be inaccurate"
+#~ msgstr "karta vart ikkje brukt, så nåleposisjon kan vera unøyaktig"
#, fuzzy
#~ msgid "FixMyStreet for Councils"
diff --git a/notes/no-update-server b/notes/no-update-server
index 2d149d850..da3656829 100644
--- a/notes/no-update-server
+++ b/notes/no-update-server
@@ -511,7 +511,7 @@ case "$1" in
;;
update)
fetch_git_source
- fgmdbpassword=$(grep OPTION_BCI_DB_PASS $basedir/fixmystreet/conf/general | cut -d\' -f4)
+ fgmdbpassword=$(grep OPTION_FMS_DB_PASS $basedir/fixmystreet/conf/general | cut -d\' -f4)
midbpassword=$(grep OPTION_MAPIT_DB_PASS $basedir/mapit/conf/general | cut -d\' -f4)
update_fixmystreet_config www-data $fgmdbpassword fixmystreet
diff --git a/perllib/CrossSell.pm b/perllib/CrossSell.pm
index f9a02a61b..f9cde6936 100644
--- a/perllib/CrossSell.pm
+++ b/perllib/CrossSell.pm
@@ -19,7 +19,6 @@ package CrossSell;
use strict;
use LWP::Simple qw($ua get);
-$ua->timeout(5);
use URI::Escape;
use mySociety::AuthToken;
use mySociety::Web qw(ent);
@@ -169,6 +168,8 @@ sub display_advert ($$;$%) {
return '' unless $c->cobrand->moniker eq 'fixmystreet';
+ $ua->timeout(5);
+
#if (defined $data{council} && $data{council} eq '2326') {
# my ($out, $ad) = display_hfyc_cheltenham_advert($email, $name);
# if ($out) {
diff --git a/perllib/FixMyStreet/App.pm b/perllib/FixMyStreet/App.pm
index fda9d665c..9c7aba9e5 100644
--- a/perllib/FixMyStreet/App.pm
+++ b/perllib/FixMyStreet/App.pm
@@ -274,9 +274,8 @@ sub send_email {
my $template = shift;
my $extra_stash_values = shift || {};
- my $sender = $c->cobrand->contact_email;
+ my $sender = $c->config->{DO_NOT_REPLY_EMAIL};
my $sender_name = $c->cobrand->contact_name;
- $sender =~ s/team/fms-DO-NOT-REPLY/;
# create the vars to pass to the email template
my $vars = {
diff --git a/perllib/FixMyStreet/App/Controller/Admin.pm b/perllib/FixMyStreet/App/Controller/Admin.pm
index 54d744ccd..e14c7dc66 100644
--- a/perllib/FixMyStreet/App/Controller/Admin.pm
+++ b/perllib/FixMyStreet/App/Controller/Admin.pm
@@ -7,6 +7,7 @@ BEGIN { extends 'Catalyst::Controller'; }
use POSIX qw(strftime strcoll);
use Digest::MD5 qw(md5_hex);
use mySociety::EmailUtil qw(is_valid_email);
+use if !$ENV{TRAVIS}, 'Image::Magick';
use FixMyStreet::SendReport;
@@ -32,6 +33,11 @@ sub begin : Private {
my ( $self, $c ) = @_;
$c->uri_disposition('relative');
+
+ if ( $c->cobrand->moniker eq 'seesomething' ) {
+ $c->detach( '/auth/redirect' ) unless $c->user_exists;
+ $c->detach( '/auth/redirect' ) unless $c->user->from_council;
+ }
}
sub summary : Path( 'summary' ) : Args(0) {
@@ -299,9 +305,14 @@ sub update_contacts : Private {
$contact->email( $email );
$contact->confirmed( $c->req->param('confirmed') ? 1 : 0 );
$contact->deleted( $c->req->param('deleted') ? 1 : 0 );
+ $contact->non_public( $c->req->param('non_public') ? 1 : 0 );
$contact->note( $c->req->param('note') );
$contact->whenedited( \'ms_current_timestamp()' );
$contact->editor( $editor );
+ $contact->endpoint( $c->req->param('endpoint') );
+ $contact->jurisdiction( $c->req->param('jurisdiction') );
+ $contact->api_key( $c->req->param('api_key') );
+ $contact->send_method( $c->req->param('send_method') );
if ( $contact->in_storage ) {
$c->stash->{updated} = _('Values updated');
@@ -338,7 +349,7 @@ sub update_contacts : Private {
} elsif ( $posted eq 'open311' ) {
$c->forward('check_token');
- my %params = map { $_ => $c->req->param($_) || '' } qw/open311_id endpoint jurisdiction api_key area_id send_method send_comments suppress_alerts extended_statuses comment_user_id/;
+ my %params = map { $_ => $c->req->param($_) || '' } qw/open311_id endpoint jurisdiction api_key area_id send_method send_comments suppress_alerts extended_statuses comment_user_id devolved/;
if ( $params{open311_id} ) {
my $conf = $c->model('DB::Open311Conf')->find( { id => $params{open311_id} } );
@@ -350,6 +361,7 @@ sub update_contacts : Private {
$conf->send_comments( $params{send_comments} || 0);
$conf->suppress_alerts( $params{suppress_alerts} || 0);
$conf->comment_user_id( $params{comment_user_id} || undef );
+ $conf->can_be_devolved( $params{devolved} || 0 );
$conf->send_extended_statuses( $params{extended_statuses} || 0 );
$conf->update();
@@ -365,6 +377,7 @@ sub update_contacts : Private {
$conf->send_comments( $params{send_comments} || 0);
$conf->suppress_alerts( $params{suppress_alerts} || 0);
$conf->comment_user_id( $params{comment_user_id} || undef );
+ $conf->can_be_devolved( $params{devolved} || 0 );
$conf->send_extended_statuses( $params{extended_statuses} || 0 );
$conf->insert();
@@ -461,6 +474,9 @@ sub council_edit : Path('council_edit') : Args(2) {
$c->stash->{history} = $history;
+ my @methods = map { $_ =~ s/FixMyStreet::SendReport:://; $_ } keys %{ FixMyStreet::SendReport->get_senders };
+ $c->stash->{send_methods} = \@methods;
+
return 1;
}
@@ -640,6 +656,7 @@ sub report_edit : Path('report_edit') : Args(1) {
}
my $flagged = $c->req->param('flagged') ? 1 : 0;
+ my $non_public = $c->req->param('non_public') ? 1 : 0;
# do this here so before we update the values in problem
if ( $c->req->param('anonymous') ne $problem->anonymous
@@ -647,7 +664,8 @@ sub report_edit : Path('report_edit') : Args(1) {
|| $c->req->param('email') ne $problem->user->email
|| $c->req->param('title') ne $problem->title
|| $c->req->param('detail') ne $problem->detail
- || $flagged != $problem->flagged )
+ || $flagged != $problem->flagged
+ || $non_public != $problem->non_public )
{
$edited = 1;
}
@@ -658,6 +676,7 @@ sub report_edit : Path('report_edit') : Args(1) {
$problem->state( $c->req->param('state') );
$problem->name( $c->req->param('name') );
$problem->flagged( $flagged );
+ $problem->non_public( $non_public );
if ( $c->req->param('email') ne $problem->user->email ) {
my $user = $c->model('DB::User')->find_or_create(
@@ -725,8 +744,24 @@ sub search_users: Path('search_users') : Args(0) {
]
}
);
+ my @users = $users->all;
+ my %email2user = map { $_->email => $_ } @users;
+ $c->stash->{users} = [ @users ];
+
+ my $emails = $c->model('DB::Abuse')->search(
+ {
+ email => { ilike => $isearch }
+ }
+ );
+ foreach my $email ($emails->all) {
+ # Slight abuse of the boolean flagged value
+ if ($email2user{$email->email}) {
+ $email2user{$email->email}->flagged( 2 );
+ } else {
+ push @{$c->stash->{users}}, { email => $email->email, flagged => 2 };
+ }
+ }
- $c->stash->{users} = [ $users->all ];
}
return 1;
@@ -833,26 +868,6 @@ sub update_edit : Path('update_edit') : Args(1) {
return 1;
}
-sub search_abuse : Path('search_abuse') : Args(0) {
- my ( $self, $c ) = @_;
-
- $c->forward('check_page_allowed');
-
- my $search = $c->req->param('search');
-
- if ($search) {
- my $emails = $c->model('DB::Abuse')->search(
- {
- email => { ilike => "\%$search\%" }
- }
- );
-
- $c->stash->{emails} = [ $emails->all ];
- }
-
- return 1;
-}
-
sub user_edit : Path('user_edit') : Args(1) {
my ( $self, $c, $id ) = @_;
@@ -917,6 +932,10 @@ sub stats : Path('stats') : Args(0) {
$c->forward('set_up_council_details');
+ if ( $c->cobrand->moniker eq 'seesomething' ) {
+ return $c->cobrand->admin_stats();
+ }
+
if ( $c->req->param('getcounts') ) {
my ( $start_date, $end_date, @errors );
@@ -1019,13 +1038,12 @@ sub set_allowed_pages : Private {
if( !$pages ) {
$pages = {
'summary' => [_('Summary'), 0],
- 'council_list' => [_('Council contacts'), 1],
- 'search_reports' => [_('Search Reports'), 2],
+ 'council_list' => [_('Bodies'), 1],
+ 'search_reports' => [_('Reports'), 2],
'timeline' => [_('Timeline'), 3],
- 'questionnaire' => [_('Survey Results'), 4],
- 'search_users' => [_('Search Users'), 5],
- 'search_abuse' => [_('Search Abuse'), 5],
- 'list_flagged' => [_('List Flagged'), 6],
+ 'questionnaire' => [_('Survey'), 4],
+ 'search_users' => [_('Users'), 5],
+ 'list_flagged' => [_('Flagged'), 6],
'stats' => [_('Stats'), 6],
'user_edit' => [undef, undef],
'council_contacts' => [undef, undef],
@@ -1276,7 +1294,6 @@ sub trim {
sub _rotate_image {
my ($photo, $direction) = @_;
- use Image::Magick;
my $image = Image::Magick->new;
$image->BlobToImage($photo);
my $err = $image->Rotate($direction);
diff --git a/perllib/FixMyStreet/App/Controller/Alert.pm b/perllib/FixMyStreet/App/Controller/Alert.pm
index 4e5319a59..91ea61fbc 100644
--- a/perllib/FixMyStreet/App/Controller/Alert.pm
+++ b/perllib/FixMyStreet/App/Controller/Alert.pm
@@ -438,7 +438,7 @@ sub determine_location : Private {
$c->detach('choose');
}
- $c->go('index') if $c->stash->{location_error};
+ $c->go('index');
}
# truncate the lat,lon for nicer urls
diff --git a/perllib/FixMyStreet/App/Controller/Around.pm b/perllib/FixMyStreet/App/Controller/Around.pm
index 3047b195c..f2bb23350 100644
--- a/perllib/FixMyStreet/App/Controller/Around.pm
+++ b/perllib/FixMyStreet/App/Controller/Around.pm
@@ -45,7 +45,7 @@ sub around_index : Path : Args(0) {
|| $c->forward('/location/determine_location_from_pc');
# Check to see if the spot is covered by a council - if not show an error.
- return unless $c->forward('check_location_is_acceptable');
+ return unless $c->cobrand->moniker eq 'fixmybarangay' || $c->forward('check_location_is_acceptable');
# If we have a partial - redirect to /report/new so that it can be
# completed.
@@ -204,6 +204,7 @@ sub display_location : Private {
longitude => $short_longitude,
clickable => 1,
pins => \@pins,
+ area => $c->cobrand->areas_on_around,
);
return 1;
diff --git a/perllib/FixMyStreet/App/Controller/Contact.pm b/perllib/FixMyStreet/App/Controller/Contact.pm
index 926a3f2a5..04360301e 100644
--- a/perllib/FixMyStreet/App/Controller/Contact.pm
+++ b/perllib/FixMyStreet/App/Controller/Contact.pm
@@ -113,6 +113,9 @@ sub validate : Private {
or $c->req->param('update_id')
&& $c->req->param('update_id') !~ /^[1-9]\d*$/;
+ push @errors, _('There was a problem showing this page. Please try again later.')
+ if $c->req->params->{message} && $c->req->params->{message} =~ /\[url=/;
+
unshift @errors,
_('There were problems with your report. Please see below.')
if scalar keys %field_errors;
@@ -184,7 +187,7 @@ generally required to stash
sub setup_request : Private {
my ( $self, $c ) = @_;
- $c->stash->{contact_email} = $c->cobrand->contact_email( 'contact' );
+ $c->stash->{contact_email} = $c->cobrand->contact_email;
$c->stash->{contact_email} =~ s/\@/&#64;/;
for my $param (qw/em subject message/) {
@@ -206,7 +209,7 @@ Sends the email
sub send_email : Private {
my ( $self, $c ) = @_;
- my $recipient = $c->cobrand->contact_email( 'contact' );
+ my $recipient = $c->cobrand->contact_email;
my $recipient_name = $c->cobrand->contact_name();
$c->stash->{host} = $c->req->header('HOST');
diff --git a/perllib/FixMyStreet/App/Controller/Council.pm b/perllib/FixMyStreet/App/Controller/Council.pm
index a6ce533e4..cb9e78421 100644
--- a/perllib/FixMyStreet/App/Controller/Council.pm
+++ b/perllib/FixMyStreet/App/Controller/Council.pm
@@ -52,7 +52,6 @@ sub load_and_check_councils : Private {
my $short_latitude = Utils::truncate_coordinate($latitude);
my $short_longitude = Utils::truncate_coordinate($longitude);
- # TODO: I think we want in_gb_locale around the MaPit line, needs testing
my $all_councils;
if ( $c->stash->{fetch_all_areas} ) {
my %area_types = map { $_ => 1 } @$area_types;
diff --git a/perllib/FixMyStreet/App/Controller/Dashboard.pm b/perllib/FixMyStreet/App/Controller/Dashboard.pm
index b52e682a5..17fd8b867 100644
--- a/perllib/FixMyStreet/App/Controller/Dashboard.pm
+++ b/perllib/FixMyStreet/App/Controller/Dashboard.pm
@@ -96,7 +96,7 @@ sub index : Path : Args(0) {
$c->stash->{council} = $council_detail;
my $children = mySociety::MaPit::call('area/children', $council,
- type => $mySociety::VotingArea::council_child_types,
+ type => $c->cobrand->area_types_children,
);
$c->stash->{children} = $children;
diff --git a/perllib/FixMyStreet/App/Controller/JS.pm b/perllib/FixMyStreet/App/Controller/JS.pm
index ae2f06605..d7847af75 100755
--- a/perllib/FixMyStreet/App/Controller/JS.pm
+++ b/perllib/FixMyStreet/App/Controller/JS.pm
@@ -24,6 +24,8 @@ sub validation_strings : LocalRegex('^validation_strings\.(.*?)\.js$') : Args(0)
$c->res->content_type( 'application/javascript' );
}
+sub validation_rules : Path('validation_rules.js') : Args(0) { }
+
__PACKAGE__->meta->make_immutable;
1;
diff --git a/perllib/FixMyStreet/App/Controller/Location.pm b/perllib/FixMyStreet/App/Controller/Location.pm
index c3d754485..fd3fadd9f 100644
--- a/perllib/FixMyStreet/App/Controller/Location.pm
+++ b/perllib/FixMyStreet/App/Controller/Location.pm
@@ -5,6 +5,7 @@ use namespace::autoclean;
BEGIN {extends 'Catalyst::Controller'; }
use Encode;
+use FixMyStreet::Geocode;
=head1 NAME
@@ -64,6 +65,19 @@ sub determine_location_from_pc : Private {
$pc ||= $c->req->param('pc') || return;
$c->stash->{pc} = $pc; # for template
+ if ( $pc =~ /^(-?\d+(?:\.\d+)?)\s*,\s*(-?\d+(?:\.\d+)?)$/ ) {
+ $c->stash->{latitude} = $1;
+ $c->stash->{longitude} = $2;
+ return $c->forward( 'check_location' );
+ }
+ if ( $c->cobrand->country eq 'GB' && $pc =~ /^([A-Z])([A-Z])([\d\s]{4,})$/i) {
+ if (my $convert = gridref_to_latlon( $1, $2, $3 )) {
+ $c->stash->{latitude} = $convert->{latitude};
+ $c->stash->{longitude} = $convert->{longitude};
+ return $c->forward( 'check_location' );
+ }
+ }
+
my ( $latitude, $longitude, $error ) =
FixMyStreet::Geocode::lookup( $pc, $c );
@@ -114,6 +128,36 @@ sub check_location : Private {
return 1;
}
+# Utility function for if someone (rarely) enters a grid reference
+sub gridref_to_latlon {
+ my ( $a, $b, $num ) = @_;
+ $a = ord(uc $a) - 65; $a-- if $a > 7;
+ $b = ord(uc $b) - 65; $b-- if $b > 7;
+ my $e = (($a-2)%5)*5 + $b%5;
+ my $n = 19 - int($a/5)*5 - int($b/5);
+
+ $num =~ s/\s+//g;
+ my $l = length($num);
+ return if $l % 2 or $l > 10;
+
+ $l /= 2;
+ $e .= substr($num, 0, $l);
+ $n .= substr($num, $l);
+
+ if ( $l < 5 ) {
+ $e .= 5;
+ $n .= 5;
+ $e .= 0 x (4-$l);
+ $n .= 0 x (4-$l);
+ }
+
+ my ( $lat, $lon ) = Utils::convert_en_to_latlon( $e, $n );
+ return {
+ latitude => $lat,
+ longitude => $lon,
+ };
+}
+
=head1 AUTHOR
Struan Donald
diff --git a/perllib/FixMyStreet/App/Controller/Open311.pm b/perllib/FixMyStreet/App/Controller/Open311.pm
index 040b0d3e6..3382c0cea 100644
--- a/perllib/FixMyStreet/App/Controller/Open311.pm
+++ b/perllib/FixMyStreet/App/Controller/Open311.pm
@@ -100,7 +100,7 @@ sub error : Private {
sub get_discovery : Private {
my ( $self, $c ) = @_;
- my $contact_email = $c->config->{CONTACT_EMAIL};
+ my $contact_email = $c->cobrand->contact_email;
my $prod_url = 'http://www.fiksgatami.no/open311';
my $test_url = 'http://fiksgatami-dev.nuug.no/open311';
my $prod_changeset = '2011-04-08T00:00:00Z';
diff --git a/perllib/FixMyStreet/App/Controller/Photo.pm b/perllib/FixMyStreet/App/Controller/Photo.pm
index fc4c3fde7..fa4baf045 100644
--- a/perllib/FixMyStreet/App/Controller/Photo.pm
+++ b/perllib/FixMyStreet/App/Controller/Photo.pm
@@ -9,6 +9,7 @@ use Digest::SHA1 qw(sha1_hex);
use File::Path;
use File::Slurp;
use Path::Class;
+use if !$ENV{TRAVIS}, 'Image::Magick';
=head1 NAME
@@ -116,7 +117,6 @@ sub no_photo : Private {
# Shrinks a picture to the specified size, but keeping in proportion.
sub _shrink {
my ($photo, $size) = @_;
- use Image::Magick;
my $image = Image::Magick->new;
$image->BlobToImage($photo);
my $err = $image->Scale(geometry => "$size>");
@@ -130,7 +130,6 @@ sub _shrink {
# Shrinks a picture to 90x60, cropping so that it is exactly that.
sub _crop {
my ($photo) = @_;
- use Image::Magick;
my $image = Image::Magick->new;
$image->BlobToImage($photo);
my $err = $image->Resize( geometry => "90x60^" );
diff --git a/perllib/FixMyStreet/App/Controller/Questionnaire.pm b/perllib/FixMyStreet/App/Controller/Questionnaire.pm
index f0cc72e07..46d6350d7 100755
--- a/perllib/FixMyStreet/App/Controller/Questionnaire.pm
+++ b/perllib/FixMyStreet/App/Controller/Questionnaire.pm
@@ -157,6 +157,8 @@ sub submit_standard : Private {
my $new_state = '';
$new_state = 'fixed - user' if $c->stash->{been_fixed} eq 'Yes' &&
FixMyStreet::DB::Result::Problem->open_states()->{$old_state};
+ $new_state = 'fixed - user' if $c->stash->{been_fixed} eq 'Yes' &&
+ FixMyStreet::DB::Result::Problem->closed_states()->{$old_state};
$new_state = 'confirmed' if $c->stash->{been_fixed} eq 'No' &&
FixMyStreet::DB::Result::Problem->fixed_states()->{$old_state};
diff --git a/perllib/FixMyStreet/App/Controller/Report.pm b/perllib/FixMyStreet/App/Controller/Report.pm
index d36ba32fe..ef966a8a8 100644
--- a/perllib/FixMyStreet/App/Controller/Report.pm
+++ b/perllib/FixMyStreet/App/Controller/Report.pm
@@ -56,6 +56,23 @@ sub display : Path('') : Args(1) {
$c->forward( 'format_problem_for_display' );
}
+sub support : Path('support') : Args(0) {
+ my ( $self, $c ) = @_;
+
+ my $id = $c->req->param('id');
+
+ my $uri =
+ $id
+ ? $c->uri_for( '/report', $id )
+ : $c->uri_for('/');
+
+ if ( $id && $c->cobrand->can_support_problems && $c->user && $c->user->from_council ) {
+ $c->forward( 'load_problem_or_display_error', [ $id ] );
+ $c->stash->{problem}->update( { interest_count => \'interest_count +1' } );
+ }
+ $c->res->redirect( $uri );
+}
+
sub load_problem_or_display_error : Private {
my ( $self, $c, $id ) = @_;
@@ -74,6 +91,13 @@ sub load_problem_or_display_error : Private {
'/page_error_410_gone',
[ _('That report has been removed from FixMyStreet.') ] #
);
+ } elsif ( $problem->non_public ) {
+ if ( !$c->user || $c->user->id != $problem->user->id ) {
+ $c->detach(
+ '/page_error_403_access_denied',
+ [ sprintf(_('That report cannot be viewed on %s.'), $c->cobrand->site_title) ] #
+ );
+ }
}
$c->stash->{problem} = $problem;
diff --git a/perllib/FixMyStreet/App/Controller/Report/New.pm b/perllib/FixMyStreet/App/Controller/Report/New.pm
index ede0cd219..9194f5318 100644
--- a/perllib/FixMyStreet/App/Controller/Report/New.pm
+++ b/perllib/FixMyStreet/App/Controller/Report/New.pm
@@ -4,9 +4,7 @@ use Moose;
use namespace::autoclean;
BEGIN { extends 'Catalyst::Controller'; }
-use FixMyStreet::Geocode;
use Encode;
-use Image::Magick;
use List::MoreUtils qw(uniq);
use POSIX 'strcoll';
use HTML::Entities;
@@ -14,7 +12,6 @@ use mySociety::MaPit;
use Path::Class;
use Utils;
use mySociety::EmailUtil;
-use mySociety::TempFiles;
use JSON;
=head1 NAME
@@ -197,6 +194,7 @@ sub report_form_ajax : Path('ajax') : Args(0) {
councils_text => $councils_text,
category => $category,
extra_name_info => $extra_name_info,
+ categories => $c->stash->{category_options},
}
);
@@ -595,6 +593,8 @@ sub setup_categories_and_councils : Private {
my @category_options = (); # categories to show
my $category_label = undef; # what to call them
my %category_extras = (); # extra fields to fill in for open311
+ my %non_public_categories =
+ (); # categories for which the reports are not public
# FIXME - implement in cobrand
if ( $c->cobrand->moniker eq 'emptyhomes' ) {
@@ -646,6 +646,8 @@ sub setup_categories_and_councils : Private {
$category_extras{ $contact->category } = $contact->extra
if $contact->extra;
+
+ $non_public_categories{ $contact->category } = 1 if $contact->non_public;
}
$seen{$contact->category} = 1;
}
@@ -663,6 +665,7 @@ sub setup_categories_and_councils : Private {
$c->stash->{category_label} = $category_label;
$c->stash->{category_options} = \@category_options;
$c->stash->{category_extras} = \%category_extras;
+ $c->stash->{non_public_categories} = \%non_public_categories;
$c->stash->{category_extras_json} = encode_json \%category_extras;
$c->stash->{extra_name_info} = $first_council->{id} == COUNCIL_ID_BROMLEY ? 1 : 0;
@@ -704,22 +707,31 @@ sub process_user : Private {
my $report = $c->stash->{report};
+ # Extract all the params to a hash to make them easier to work with
+ my %params = map { $_ => scalar $c->req->param($_) }
+ ( 'email', 'name', 'phone', 'password_register', 'fms_extra_title' );
+
+ my $user_title = Utils::trim_text( $params{fms_extra_title} );
+
+ if ( $c->cobrand->allow_anonymous_reports ) {
+ my $anon_details = $c->cobrand->anonymous_account;
+
+ for my $key ( qw( email name ) ) {
+ $params{ $key } ||= $anon_details->{ $key };
+ }
+ }
+
# The user is already signed in
if ( $c->user_exists ) {
my $user = $c->user->obj;
- my %params = map { $_ => scalar $c->req->param($_) } ( 'name', 'phone', 'fms_extra_title' );
$user->name( Utils::trim_text( $params{name} ) ) if $params{name};
$user->phone( Utils::trim_text( $params{phone} ) );
- $user->title( Utils::trim_text( $params{fms_extra_title} ) );
+ $user->title( $user_title ) if $user_title;
$report->user( $user );
$report->name( $user->name );
return 1;
}
- # Extract all the params to a hash to make them easier to work with
- my %params = map { $_ => scalar $c->req->param($_) }
- ( 'email', 'name', 'phone', 'password_register', 'fms_extra_title' );
-
# cleanup the email address
my $email = $params{email} ? lc $params{email} : '';
$email =~ s{\s+}{}g;
@@ -747,7 +759,7 @@ sub process_user : Private {
$report->user->phone( Utils::trim_text( $params{phone} ) );
$report->user->password( Utils::trim_text( $params{password_register} ) )
if $params{password_register};
- $report->user->title( Utils::trim_text( $params{fms_extra_title} ) );
+ $report->user->title( $user_title ) if $user_title;
$report->name( Utils::trim_text( $params{name} ) );
return 1;
@@ -773,7 +785,9 @@ sub process_report : Private {
'detail_offensive',
'may_show_name', #
'category', #
+ 'subcategory', #
'partial', #
+ 'service', #
);
# load the report
@@ -798,9 +812,14 @@ sub process_report : Private {
}
$report->detail( $detail );
+ # mobile device type
+ $report->service( $params{service} ) if $params{service};
+
# set these straight from the params
$report->category( _ $params{category} ) if $params{category};
+ $report->subcategory( $params{subcategory} );
+
my $areas = $c->stash->{all_areas};
$report->areas( ',' . join( ',', sort keys %$areas ) . ',' );
@@ -872,10 +891,14 @@ sub process_report : Private {
};
}
+ if ( $c->stash->{non_public_categories}->{ $report->category } ) {
+ $report->non_public( 1 );
+ }
+
$c->cobrand->process_extras( $c, $contacts[0]->area_id, \@extra );
if ( @extra ) {
- $c->stash->{report_meta} = \@extra;
+ $c->stash->{report_meta} = { map { $_->{name} => $_ } @extra };
$report->extra( \@extra );
}
} elsif ( @{ $c->stash->{area_ids_to_list} } ) {
@@ -914,11 +937,14 @@ sub check_for_errors : Private {
# let the model check for errors
$c->stash->{field_errors} ||= {};
- my %field_errors = (
- %{ $c->stash->{field_errors} },
- %{ $c->stash->{report}->user->check_for_errors },
- %{ $c->stash->{report}->check_for_errors },
- );
+ my %field_errors = $c->cobrand->report_check_for_errors( $c );
+
+ # Zurich, we don't care about title or name
+ # There is no title, and name is optional
+ if ( $c->cobrand->moniker eq 'zurich' ) {
+ delete $field_errors{title};
+ delete $field_errors{name};
+ }
# FIXME: need to check for required bromley fields here
@@ -956,7 +982,14 @@ sub save_user_and_report : Private {
my $report = $c->stash->{report};
# Save or update the user if appropriate
- if ( !$report->user->in_storage ) {
+ if ( $c->cobrand->never_confirm_reports ) {
+ if ( $report->user->in_storage() ) {
+ $report->user->update();
+ } else {
+ $report->user->insert();
+ }
+ $report->confirm();
+ } elsif ( !$report->user->in_storage ) {
# User does not exist.
# Store changes in token for when token is validated.
$c->stash->{token_data} = {
@@ -1001,6 +1034,13 @@ sub save_user_and_report : Private {
# Set unknown to DB unknown
$report->council( undef ) if $report->council eq '-1';
+ # if there is a Message Manager message ID, pass it back to the client view
+ if ($c->cobrand->moniker eq 'fixmybarangay' && $c->req->param('external_source_id')=~/^\d+$/) {
+ $c->stash->{external_source_id} = $c->req->param('external_source_id');
+ $report->external_source_id( $c->req->param('external_source_id') );
+ $report->external_source( $c->config->{MESSAGE_MANAGER_URL} ) ;
+ }
+
# save the report;
$report->in_storage ? $report->update : $report->insert();
@@ -1071,7 +1111,17 @@ sub redirect_or_confirm_creation : Private {
if ( $report->confirmed ) {
# Subscribe problem reporter to email updates
$c->forward( 'create_reporter_alert' );
- my $report_uri = $c->cobrand->base_url_for_report( $report ) . $report->url;
+ my $report_uri;
+
+ if ( $c->cobrand->moniker eq 'fixmybarangay' && $c->user->from_council && $c->stash->{external_source_id}) {
+ $report_uri = $c->uri_for( '/report', $report->id, undef, { external_source_id => $c->stash->{external_source_id} } );
+ } elsif ( $c->cobrand->never_confirm_reports && $report->non_public ) {
+ $c->log->info( 'cobrand was set to always confirm reports and report was non public, success page showed');
+ $c->stash->{template} = 'report_created.html';
+ return 1;
+ } else {
+ $report_uri = $c->cobrand->base_url_for_report( $report ) . $report->url;
+ }
$c->log->info($report->user->id . ' was logged in, redirecting to /report/' . $report->id);
$c->res->redirect($report_uri);
$c->detach;
diff --git a/perllib/FixMyStreet/App/Controller/Report/Update.pm b/perllib/FixMyStreet/App/Controller/Report/Update.pm
index 3fc8bfee8..5e0d9f388 100644
--- a/perllib/FixMyStreet/App/Controller/Report/Update.pm
+++ b/perllib/FixMyStreet/App/Controller/Report/Update.pm
@@ -76,6 +76,10 @@ sub update_problem : Private {
$problem->state('confirmed');
}
+ if ( $c->cobrand->can_support_problems && $c->user && $c->user->from_council && $c->req->param('external_source_id') ) {
+ $problem->interest_count( \'interest_count + 1' );
+ }
+
$problem->lastupdate( \'ms_current_timestamp()' );
$problem->update;
@@ -364,6 +368,7 @@ sub redirect_or_confirm_creation : Private {
if ( $update->confirmed ) {
$c->forward( 'update_problem' );
$c->forward( 'signup_for_alerts' );
+
my $report_uri = $c->cobrand->base_url_for_report( $update->problem ) . $update->problem->url;
$c->res->redirect($report_uri);
$c->detach;
diff --git a/perllib/FixMyStreet/App/Controller/Reports.pm b/perllib/FixMyStreet/App/Controller/Reports.pm
index 37766db44..ec41dc17f 100644
--- a/perllib/FixMyStreet/App/Controller/Reports.pm
+++ b/perllib/FixMyStreet/App/Controller/Reports.pm
@@ -6,7 +6,6 @@ use File::Slurp;
use List::MoreUtils qw(zip);
use POSIX qw(strcoll);
use mySociety::MaPit;
-use mySociety::VotingArea;
BEGIN { extends 'Catalyst::Controller'; }
@@ -71,7 +70,7 @@ sub index : Path : Args(0) {
if ($@) {
$c->stash->{message} = _("There was a problem showing the All Reports page. Please try again later.");
if ($c->config->{STAGING_SITE}) {
- $c->stash->{message} .= '</p><p>Perhaps the bin/update-all-reports script needs running.</p><p>'
+ $c->stash->{message} .= '</p><p>Perhaps the bin/update-all-reports script needs running. Use: bin/cron-wrapper bin/update-all-reports</p><p>'
. sprintf(_('The error was: %s'), $@);
}
$c->stash->{template} = 'errors/generic.html';
@@ -84,13 +83,13 @@ sub index : Path : Args(0) {
=head2 index
-Show the summary page for a particular council.
+Show the summary page for a particular body.
=cut
-sub council : Path : Args(1) {
- my ( $self, $c, $council ) = @_;
- $c->detach( 'ward', [ $council ] );
+sub body : Path : Args(1) {
+ my ( $self, $c, $body ) = @_;
+ $c->detach( 'ward', [ $body ] );
}
=head2 index
@@ -102,7 +101,7 @@ Show the summary page for a particular ward.
sub ward : Path : Args(2) {
my ( $self, $c, $council, $ward ) = @_;
- $c->forward( 'council_check', [ $council ] );
+ $c->forward( 'body_check', [ $council ] );
$c->forward( 'ward_check', [ $ward ] )
if $ward;
$c->forward( 'load_parent' );
@@ -133,9 +132,10 @@ sub ward : Path : Args(2) {
$c->cobrand->tweak_all_reports_map( $c );
# List of wards
- unless ($c->stash->{ward}) {
+ # Ignore external_body special council thing
+ unless ($c->stash->{ward} || !$c->stash->{council}->{id}) {
my $children = mySociety::MaPit::call('area/children', [ $c->stash->{council}->{id} ],
- type => $mySociety::VotingArea::council_child_types,
+ type => $c->cobrand->area_types_children,
);
foreach (values %$children) {
$_->{url} = $c->uri_for( $c->stash->{council_url}
@@ -146,9 +146,9 @@ sub ward : Path : Args(2) {
}
}
-sub rss_council : Regex('^rss/(reports|area)$') : Args(1) {
- my ( $self, $c, $council ) = @_;
- $c->detach( 'rss_ward', [ $council ] );
+sub rss_body : Regex('^rss/(reports|area)$') : Args(1) {
+ my ( $self, $c, $body ) = @_;
+ $c->detach( 'rss_ward', [ $body ] );
}
sub rss_ward : Regex('^rss/(reports|area)$') : Args(2) {
@@ -158,8 +158,8 @@ sub rss_ward : Regex('^rss/(reports|area)$') : Args(2) {
$c->stash->{rss} = 1;
- $c->forward( 'council_check', [ $council ] );
- $c->forward( 'ward_check', [ $ward ] ) if $ward;
+ $c->forward( 'body_check', [ $council ] );
+ $c->forward( 'ward_check', [ $ward ] ) if $ward;
if ($rss eq 'area' && $c->stash->{council}{type} ne 'DIS' && $c->stash->{council}{type} ne 'CTY') {
# Two possibilites are the same for one-tier councils, so redirect one to the other
@@ -170,13 +170,6 @@ sub rss_ward : Regex('^rss/(reports|area)$') : Args(2) {
$url .= '/' . $c->cobrand->short_name( $c->stash->{ward} ) if $c->stash->{ward};
$c->stash->{qs} = "/$url";
- my @params;
- push @params, $c->stash->{council}->{id} if $rss eq 'reports';
- push @params, $c->stash->{ward}
- ? $c->stash->{ward}->{id}
- : $c->stash->{council}->{id};
- $c->stash->{db_params} = [ @params ];
-
if ( $rss eq 'area' && $c->stash->{ward} ) {
# All problems within a particular ward
$c->stash->{type} = 'area_problems';
@@ -203,15 +196,15 @@ sub rss_ward : Regex('^rss/(reports|area)$') : Args(2) {
$c->forward( '/rss/output' );
}
-=head2 council_check
+=head2 body_check
-This action checks the council name (or code) given in a URI exists, is valid
-and so on. If it is, it stores the Area in the stash, otherwise it redirects
-to the all reports page.
+This action checks the council or external_body name (or code) given in a URI
+exists, is valid and so on. If it is, it stores the area or body in the stash,
+otherwise it redirects to the all reports page.
=cut
-sub council_check : Private {
+sub body_check : Private {
my ( $self, $c, $q_council ) = @_;
$q_council =~ s/\+/ /g;
@@ -219,7 +212,7 @@ sub council_check : Private {
# Check cobrand specific incantations - e.g. ONS codes for UK,
# Oslo/ kommunes sharing a name in Norway
- return if $c->cobrand->reports_council_check( $c, $q_council );
+ return if $c->cobrand->reports_body_check( $c, $q_council );
# If we're passed an ID number (don't think this is used anywhere, it
# certainly shouldn't be), just look that up on MaPit and redirect
@@ -230,12 +223,22 @@ sub council_check : Private {
$c->detach( 'redirect_area' );
}
+ if ( $c->cobrand->reports_by_body ) {
+ my $problem = $c->cobrand->problems->search({ 'lower(me.external_body)' => lc $q_council }, { columns => [ 'external_body' ], rows => 1 })->single;
+ if ( $problem ) {
+ # If external_body, put as a council with ID 0 for the moment.
+ $c->stash->{council} = { id => 0, name => $problem->external_body };
+ return;
+ }
+ }
+
# We must now have a string to check
my $area_types = $c->cobrand->area_types;
my $areas = mySociety::MaPit::call( 'areas', $q_council,
type => $area_types,
min_generation => $c->cobrand->area_min_generation
);
+
if (keys %$areas == 1) {
($c->stash->{council}) = values %$areas;
return;
@@ -255,9 +258,8 @@ sub council_check : Private {
=head2 ward_check
This action checks the ward name from a URI exists and is part of the right
-parent, already found with council_check. It either stores the ward Area if
+parent, already found with body_check. It either stores the ward Area if
okay, or redirects to the council page if bad.
-This is currently only used in the UK, hence the use of mySociety::VotingArea.
=cut
@@ -271,7 +273,7 @@ sub ward_check : Private {
my $council = $c->stash->{council};
my $qw = mySociety::MaPit::call('areas', $ward,
- type => $mySociety::VotingArea::council_child_types,
+ type => $c->cobrand->area_types_children,
min_generation => $c->cobrand->area_min_generation
);
foreach my $area (sort { $a->{name} cmp $b->{name} } values %$qw) {
@@ -318,7 +320,8 @@ sub load_and_group_problems : Private {
my $page = $c->req->params->{p} || 1;
my $where = {
- state => [ FixMyStreet::DB::Result::Problem->visible_states() ]
+ non_public => 0,
+ state => [ FixMyStreet::DB::Result::Problem->visible_states() ]
};
if ($c->stash->{ward}) {
$where->{areas} = { 'like', '%,' . $c->stash->{ward}->{id} . ',%' };
@@ -328,6 +331,9 @@ sub load_and_group_problems : Private {
{ 'like', $c->stash->{council}->{id} . ',%' },
{ 'like', '%,' . $c->stash->{council}->{id} },
];
+ } elsif ($c->stash->{council} && $c->stash->{council}->{id} == 0) {
+ # A proxy for an external_body
+ $where->{'lower(external_body)'} = lc $c->stash->{council}->{name};
} elsif ($c->stash->{council}) {
$where->{areas} = { 'like', '%,' . $c->stash->{council}->{id} . ',%' };
$where->{council} = [
@@ -363,6 +369,11 @@ sub load_and_group_problems : Private {
my %problem = zip @cols, @problem;
$problem{is_fixed} = FixMyStreet::DB::Result::Problem->fixed_states()->{$problem{state}};
$c->log->debug( $problem{'cobrand'} . ', cobrand is ' . $c->cobrand->moniker );
+ if ( !$c->stash->{council}->{id} ) {
+ # An external_body entry
+ add_row( \%problem, 0, \%problems, \@pins );
+ next;
+ }
if ( !$problem{council} ) {
# Problem was not sent to any council, add to possible councils
$problem{councils} = 0;
@@ -375,7 +386,7 @@ sub load_and_group_problems : Private {
my @council = split( /,/, $council );
$problem{councils} = scalar @council;
foreach ( @council ) {
- next if $c->stash->{council} && $_ != $c->stash->{council}->{id};
+ next if $_ != $c->stash->{council}->{id};
add_row( \%problem, $_, \%problems, \@pins );
}
}
diff --git a/perllib/FixMyStreet/App/Controller/Root.pm b/perllib/FixMyStreet/App/Controller/Root.pm
index 7f7d7f5fd..769a147bf 100644
--- a/perllib/FixMyStreet/App/Controller/Root.pm
+++ b/perllib/FixMyStreet/App/Controller/Root.pm
@@ -94,6 +94,13 @@ sub page_error_410_gone : Private {
$c->response->status(410);
}
+sub page_error_403_access_denied : Private {
+ my ( $self, $c, $error_msg ) = @_;
+ $c->stash->{template} = 'index.html';
+ $c->stash->{error} = $error_msg;
+ $c->response->status(403);
+}
+
=head2 end
Attempt to render a view, if needed.
diff --git a/perllib/FixMyStreet/App/Controller/Rss.pm b/perllib/FixMyStreet/App/Controller/Rss.pm
index fe4b652ed..baaa3b927 100755
--- a/perllib/FixMyStreet/App/Controller/Rss.pm
+++ b/perllib/FixMyStreet/App/Controller/Rss.pm
@@ -106,10 +106,19 @@ sub local_problems_pc_distance : Path('pc') : Args(2) {
}
-sub local_problems : LocalRegex('^(n|l)/([\d.-]+)[,/]([\d.-]+)(?:/(\d+))?$') {
+sub local_problems_dist : LocalRegex('^(n|l)/([\d.-]+)[,/]([\d.-]+)/(\d+)$') {
my ( $self, $c ) = @_;
+ $c->forward( 'local_problems', $c->req->captures );
+}
+
+sub local_problems_no_dist : LocalRegex('^(n|l)/([\d.-]+)[,/]([\d.-]+)$') {
+ my ( $self, $c ) = @_;
+ $c->forward( 'local_problems', $c->req->captures );
+}
+
+sub local_problems : Private {
+ my ( $self, $c, $type, $a, $b, $d ) = @_;
- my ( $type, $a, $b, $d) = @{ $c->req->captures };
$c->forward( 'get_query_parameters', [ $d ] );
$c->detach( 'redirect_lat_lon', [ $a, $b ] )
diff --git a/perllib/FixMyStreet/App/View/Web.pm b/perllib/FixMyStreet/App/View/Web.pm
index eac194dff..42878be37 100644
--- a/perllib/FixMyStreet/App/View/Web.pm
+++ b/perllib/FixMyStreet/App/View/Web.pm
@@ -171,6 +171,7 @@ sub version {
my $path = FixMyStreet->path_to('web', $file);
$version_hash{$file} = ( stat( $path ) )[9];
}
+ $version_hash{$file} ||= '';
return "$file?$version_hash{$file}";
}
diff --git a/perllib/FixMyStreet/Cobrand/Bromley.pm b/perllib/FixMyStreet/Cobrand/Bromley.pm
index c33135673..0d4894aa8 100644
--- a/perllib/FixMyStreet/Cobrand/Bromley.pm
+++ b/perllib/FixMyStreet/Cobrand/Bromley.pm
@@ -29,7 +29,7 @@ sub disambiguate_location {
my $town = 'Bromley';
# Bing turns High St Bromley into Bromley High St which is in
# Bromley by Bow.
- if ( $string =~ /high\+st/i ) {
+ if ( $string =~ /high\s+st/i ) {
$town .= ', BR1';
}
return {
@@ -80,9 +80,7 @@ sub process_extras {
sub contact_email {
my $self = shift;
- my $type = shift || '';
- return join( '@', 'info', 'bromley.gov.uk' ) if $type eq 'contact';
- return $self->next::method();
+ return join( '@', 'info', 'bromley.gov.uk' );
}
sub contact_name { 'Bromley Council (do not reply)'; }
diff --git a/perllib/FixMyStreet/Cobrand/Default.pm b/perllib/FixMyStreet/Cobrand/Default.pm
index 04265963a..11851c5a1 100644
--- a/perllib/FixMyStreet/Cobrand/Default.pm
+++ b/perllib/FixMyStreet/Cobrand/Default.pm
@@ -4,6 +4,8 @@ use base 'FixMyStreet::Cobrand::Base';
use strict;
use warnings;
use FixMyStreet;
+use FixMyStreet::Geocode::Bing;
+use Encode;
use URI;
use Digest::MD5 qw(md5_hex);
@@ -143,6 +145,14 @@ Can be specified in template.
sub enter_postcode_text { }
+=head2 site_title
+
+The name of the site
+
+=cut
+
+sub site_title { return 'FixMyStreet'; }
+
=head2 set_lang_and_domain
my $set_lang = $cobrand->set_lang_and_domain( $lang, $unicode, $dir )
@@ -158,7 +168,8 @@ sub set_lang_and_domain {
my $lang_override = $self->language_override || $lang;
my $lang_domain = $self->language_domain || 'FixMyStreet';
- my $set_lang = mySociety::Locale::negotiate_language( $languages, $lang_override );
+ my $headers = $self->{c} ? $self->{c}->req->headers : undef;
+ my $set_lang = mySociety::Locale::negotiate_language( $languages, $lang_override, $headers );
mySociety::Locale::gettext_domain( $lang_domain, $unicode, $dir );
mySociety::Locale::change();
return $set_lang;
@@ -590,6 +601,13 @@ For UK sub-cobrands, to specify various alternations needed for them.
=cut
sub is_council { 0; }
+=item is_two_tier
+
+For UK sub-cobrands, to specify various alternations needed for them.
+
+=cut
+sub is_two_tier { 0; }
+
=item council_rss_alert_options
Generate a set of options for council rss alerts.
@@ -615,14 +633,14 @@ sub council_rss_alert_options {
return ( \@options, @reported_to_options ? \@reported_to_options : undef );
}
-=head2 reports_council_check
+=head2 reports_body_check
This function is called by the All Reports page, and lets you do some cobrand
-specific checking on the URL passed to try and match to a relevant area.
+specific checking on the URL passed to try and match to a relevant body.
=cut
-sub reports_council_check {
+sub reports_body_check {
my ( $self, $c, $code ) = @_;
return 0;
}
@@ -644,12 +662,59 @@ Get stats to display on the council reports page
sub get_report_stats { return 0; }
-sub get_council_sender { return 'Email' };
+sub get_council_sender {
+ my ( $self, $area_id, $area_info, $category ) = @_;
+
+ my $send_method;
+
+ my $council_config = FixMyStreet::App->model("DB::Open311conf")->search( { area_id => $area_id } )->first;
+ $send_method = $council_config->send_method if $council_config;
+
+ if ( $council_config && $council_config->can_be_devolved ) {
+ # look up via category
+ my $config = FixMyStreet::App->model("DB::Contact")->search( { area_id => $area_id, category => $category } )->first;
+ if ( $config->send_method ) {
+ return { method => $config->send_method, config => $config };
+ } else {
+ return { method => $send_method, config => $council_config };
+ }
+ } elsif ( $send_method ) {
+ return { method => $send_method, config => $council_config };
+ }
+
+ return $self->_fallback_council_sender( $area_id, $area_info, $category );
+}
+
+sub _fallback_council_sender {
+ my ( $self, $area_id, $area_info, $category ) = @_;
+
+ return { method => 'Email' };
+};
sub example_places {
- return FixMyStreet->config('EXAMPLE_PLACES') || [ 'High Street', 'Main Street' ];
+ my $e = FixMyStreet->config('EXAMPLE_PLACES') || [ 'High Street', 'Main Street' ];
+ $e = [ map { Encode::decode('UTF-8', $_) } @$e ];
+ return $e;
}
+=head2 only_authed_can_create
+
+If true, only users with the from_council flag set are able to create reports.
+
+=cut
+
+sub only_authed_can_create {
+ return 0;
+}
+
+=head2 areas_on_around
+
+If set to an arrayref, will plot those area ID(s) from mapit on all the /around pages.
+
+=cut
+
+sub areas_on_around { []; }
+
sub process_extras {}
=head 2 pin_colour
@@ -675,5 +740,75 @@ Used in some cobrands to improve the intial display for Internet Explorer.
sub tweak_all_reports_map {}
+sub can_support_problems { return 0; }
+
+sub default_map_zoom { undef };
+
+sub users_can_hide { return 0; }
+
+=head2 reports_by_body
+
+Can /reports show reports indexed by external_body? This is a temporary measure
+until the contacts/area/body handling is rewritten to be better.
+
+=cut
+
+sub reports_by_body { 0; }
+
+=head2 default_show_name
+
+Returns true if the show name checkbox should be ticked by default.
+
+=cut
+
+sub default_show_name {
+ 1;
+}
+
+=head2 report_check_for_errors
+
+Perform validation for new reports. Takes Catalyst context object as an argument
+
+=cut
+
+sub report_check_for_errors {
+ my $self = shift;
+ my $c = shift;
+
+ return (
+ %{ $c->stash->{field_errors} },
+ %{ $c->stash->{report}->user->check_for_errors },
+ %{ $c->stash->{report}->check_for_errors },
+ );
+}
+
+sub report_sent_confirmation_email { 0; }
+
+=head2 never_confirm_reports
+
+If true then we never send an email to confirm a report
+
+=cut
+
+sub never_confirm_reports { 0; }
+
+=head2 allow_anonymous_reports
+
+If true then can have reports that are truely anonymous - i.e with no email or name. You
+need to also put details in the anonymous_account function too.
+
+=cut
+
+sub allow_anonymous_reports { 0; }
+
+=head2 anonymous_account
+
+Details to use for anonymous reports. This should return a hashref with an email and
+a name key
+
+=cut
+
+sub anonymous_account { undef; }
+
1;
diff --git a/perllib/FixMyStreet/Cobrand/FiksGataMi.pm b/perllib/FixMyStreet/Cobrand/FiksGataMi.pm
index 85ebf035e..6bec115dd 100644
--- a/perllib/FixMyStreet/Cobrand/FiksGataMi.pm
+++ b/perllib/FixMyStreet/Cobrand/FiksGataMi.pm
@@ -215,7 +215,7 @@ sub council_rss_alert_options {
}
-sub reports_council_check {
+sub reports_body_check {
my ( $self, $c, $council ) = @_;
if ($council eq 'Oslo') {
diff --git a/perllib/FixMyStreet/Cobrand/FixMyBarangay.pm b/perllib/FixMyStreet/Cobrand/FixMyBarangay.pm
new file mode 100644
index 000000000..8ccbb57f5
--- /dev/null
+++ b/perllib/FixMyStreet/Cobrand/FixMyBarangay.pm
@@ -0,0 +1,54 @@
+package FixMyStreet::Cobrand::FixMyBarangay;
+use base 'FixMyStreet::Cobrand::Default';
+
+use strict;
+use warnings;
+
+sub path_to_web_templates {
+ my $self = shift;
+ return [
+ FixMyStreet->path_to( 'templates/web', $self->moniker )->stringify,
+ FixMyStreet->path_to( 'templates/web/fixmystreet' )->stringify
+ ];
+}
+
+sub country {
+ return 'PH';
+}
+
+sub language_domain { 'FixMyBarangay' }
+
+sub area_types {
+ return [ 'BGY' ];
+}
+
+sub disambiguate_location {
+ return {
+ country => 'ph',
+ bing_country => 'Philippines',
+ };
+}
+
+sub only_authed_can_create {
+ return 1;
+}
+
+sub areas_on_around {
+ return [ 1, 2 ];
+}
+
+sub can_support_problems {
+ return 1;
+}
+
+sub reports_by_body { 1 }
+
+sub default_show_name {
+ my $self = shift;
+
+ return 0 if $self->{c}->user->from_council;
+ return 1;
+}
+
+1;
+
diff --git a/perllib/FixMyStreet/Cobrand/LichfieldDC.pm b/perllib/FixMyStreet/Cobrand/LichfieldDC.pm
index 5c8a04681..31d5bf987 100644
--- a/perllib/FixMyStreet/Cobrand/LichfieldDC.pm
+++ b/perllib/FixMyStreet/Cobrand/LichfieldDC.pm
@@ -8,6 +8,7 @@ sub council_id { return 2434; }
sub council_area { return 'Lichfield district'; }
sub council_name { return 'Lichfield District Council'; }
sub council_url { return 'lichfielddc'; }
+sub is_two_tier { return 1; }
# Different to councils parent due to this being a two-tier council. If we get
# more, this can be genericised in the parent.
@@ -26,15 +27,8 @@ sub disambiguate_location {
};
}
-# If we ever link to a county problem report, needs to be to main FixMyStreet
-sub base_url_for_report {
- my ( $self, $report ) = @_;
- my %councils = map { $_ => 1 } @{$report->councils};
- if ( $councils{2434} ) {
- return $self->base_url;
- } else {
- return FixMyStreet->config('BASE_URL');
- }
+sub map_type {
+ return 'OSM';
}
1;
diff --git a/perllib/FixMyStreet/Cobrand/Oxfordshire.pm b/perllib/FixMyStreet/Cobrand/Oxfordshire.pm
new file mode 100644
index 000000000..9aa054020
--- /dev/null
+++ b/perllib/FixMyStreet/Cobrand/Oxfordshire.pm
@@ -0,0 +1,55 @@
+package FixMyStreet::Cobrand::Oxfordshire;
+use base 'FixMyStreet::Cobrand::UKCouncils';
+
+use strict;
+use warnings;
+
+sub council_id { return 2237; }
+sub council_area { return 'Oxfordshire'; }
+sub council_name { return 'Oxfordshire County Council'; }
+sub council_url { return 'oxfordshire'; }
+sub is_two_tier { return 1; }
+
+sub base_url {
+ return FixMyStreet->config('BASE_URL') if FixMyStreet->config('STAGING_SITE');
+ return 'http://fixmystreet.oxfordshire.gov.uk';
+}
+
+# Different to councils parent due to this being a two-tier council. If we get
+# more, this can be genericised in the parent.
+sub problems_clause {
+ return { council => { like => '%2237%' } };
+}
+
+sub path_to_web_templates {
+ my $self = shift;
+ return [
+ FixMyStreet->path_to( 'templates/web', $self->moniker )->stringify,
+ FixMyStreet->path_to( 'templates/web/fixmystreet' )->stringify
+ ];
+}
+
+sub enter_postcode_text {
+ my ($self) = @_;
+ return 'Enter an Oxfordshire postcode, or street name and area';
+}
+
+sub disambiguate_location {
+ my $self = shift;
+ my $string = shift;
+ return {
+ %{ $self->SUPER::disambiguate_location() },
+ centre => '51.765765,-1.322324',
+ span => '0.154963,0.24347', # NB span is not correct
+ bounds => [ 51.459413, -1.719500, 52.168471, -0.870066 ],
+ };
+}
+
+sub example_places {
+ return ( 'OX20 1SZ', 'Park St, Woodstock' );
+}
+
+sub default_show_name { 0 }
+
+1;
+
diff --git a/perllib/FixMyStreet/Cobrand/SeeSomething.pm b/perllib/FixMyStreet/Cobrand/SeeSomething.pm
new file mode 100644
index 000000000..dc28156dc
--- /dev/null
+++ b/perllib/FixMyStreet/Cobrand/SeeSomething.pm
@@ -0,0 +1,148 @@
+package FixMyStreet::Cobrand::SeeSomething;
+use parent 'FixMyStreet::Cobrand::UKCouncils';
+
+use strict;
+use warnings;
+
+sub council_id { return [ 2520, 2522, 2514, 2546, 2519, 2538, 2535 ]; }
+sub council_area { return 'West Midlands'; }
+sub council_name { return 'See Something Say Something'; }
+sub council_url { return 'seesomething'; }
+sub area_types { [ 'MTD' ] }
+sub site_title { return 'See Something, Say Something'; }
+
+
+sub site_restriction {
+ my $self = shift;
+ return { council => { IN => $self->council_id } };
+}
+
+sub problems_clause {
+ my $self = shift;
+ return { council => { IN => $self->council_id } };
+}
+
+sub path_to_web_templates {
+ my $self = shift;
+ return [
+ FixMyStreet->path_to( 'templates/web', $self->moniker )->stringify,
+ FixMyStreet->path_to( 'templates/web/fixmystreet' )->stringify
+ ];
+}
+
+sub council_check {
+ my ( $self, $params, $context ) = @_;
+
+ my $councils = $params->{all_councils};
+ my $council_match = grep { $councils->{$_} } @{ $self->council_id };
+
+ if ($council_match) {
+ return 1;
+ }
+
+ return ( 0, "That location is not covered by See Something, Say Something" );
+}
+
+sub disambiguate_location {
+ my $self = shift;
+ my $string = shift;
+
+ my $town = 'West Midlands';
+
+ return {
+ %{ $self->SUPER::disambiguate_location() },
+ town => $town,
+ centre => '52.4803101685267,-2.2708272758854',
+ span => '1.4002794815887,2.06340043925997',
+ bounds => [ 51.8259444771676, -3.23554082684068, 53.2262239587563, -1.17214038758071 ],
+ };
+}
+
+sub example_places {
+ return ( 'WS1 4NH', 'Austin Drive, Coventry' );
+}
+
+sub send_questionnaires {
+ return 0;
+}
+
+sub ask_ever_reported {
+ return 0;
+}
+
+sub report_sent_confirmation_email { 1; }
+
+sub report_check_for_errors { return (); }
+
+sub never_confirm_reports { 1; }
+
+sub allow_anonymous_reports { 1; }
+
+sub anonymous_account { return { name => 'Anonymous Submission', email => FixMyStreet->config('DO_NOT_REPLY_EMAIL') }; }
+
+sub admin_pages {
+ my $self = shift;
+
+ return {
+ 'stats' => ['Reports', 0],
+ };
+};
+
+sub admin_stats {
+ my $self = shift;
+ my $c = $self->{c};
+
+ my %filters = ();
+
+ my %councils =
+ map {
+ $c->stash->{council_details}->{$_}->{name} =~ s/(?:Borough|City) Council//;
+ $_ => $c->stash->{council_details}->{$_}
+ }
+ @{ $self->council_id };
+
+ $c->stash->{council_details} = \%councils;
+
+ if ( !$c->user_exists || !grep { $_ == $c->user->from_council } @{ $self->council_id } ) {
+ $c->detach( '/page_error_404_not_found' );
+ }
+
+ if ( $c->req->param('category') ) {
+ $filters{category} = $c->req->param('category');
+ $c->stash->{category} = $c->req->param('category');
+ }
+
+ if ( $c->req->param('subcategory') ) {
+ $filters{subcategory} = $c->req->param('subcategory');
+ $c->stash->{subcategory} = $c->req->param('subcategory');
+ }
+
+ if ( $c->req->param('service') ) {
+ $filters{service} = { -ilike => $c->req->param('service') };
+ $c->stash->{service} = $c->req->param('service');
+ }
+
+ my $page = $c->req->params->{p} || 1;
+
+ my $p = $c->model('DB::Problem')->search(
+ {
+ confirmed => { not => undef },
+ %filters
+ },
+ {
+ columns => [ qw(
+ service category subcategory council confirmed
+ ) ],
+ order_by => { -desc=> [ 'confirmed' ] },
+ rows => 20,
+ }
+ )->page( $page );
+
+ $c->stash->{reports} = $p;
+ $c->stash->{pager} = $p->pager;
+
+ return 1;
+}
+
+1;
+
diff --git a/perllib/FixMyStreet/Cobrand/Stevenage.pm b/perllib/FixMyStreet/Cobrand/Stevenage.pm
new file mode 100644
index 000000000..560baba37
--- /dev/null
+++ b/perllib/FixMyStreet/Cobrand/Stevenage.pm
@@ -0,0 +1,41 @@
+package FixMyStreet::Cobrand::Stevenage;
+use parent 'FixMyStreet::Cobrand::UKCouncils';
+
+use strict;
+use warnings;
+
+sub council_id { return 2347; }
+sub council_area { return 'Stevenage'; }
+sub council_name { return 'Stevenage Council'; }
+sub council_url { return 'stevenage'; }
+sub is_two_tier { return 1; }
+
+sub path_to_web_templates {
+ my $self = shift;
+ return [
+ FixMyStreet->path_to( 'templates/web', $self->moniker )->stringify,
+ FixMyStreet->path_to( 'templates/web/fixmystreet' )->stringify
+ ];
+}
+
+sub disambiguate_location {
+ my $self = shift;
+ return {
+ %{ $self->SUPER::disambiguate_location() },
+ town => 'Stevenage',
+ centre => '51.904330,-0.189364',
+ span => '0.063112,0.087585',
+ bounds => [ 51.869319, -0.234382, 51.932431, -0.146796 ],
+ };
+}
+
+sub example_places {
+ return [ 'SG1 1HN', 'Lyton Way' ];
+}
+
+sub default_map_zoom { return 3; }
+
+sub users_can_hide { return 1; }
+
+1;
+
diff --git a/perllib/FixMyStreet/Cobrand/UK.pm b/perllib/FixMyStreet/Cobrand/UK.pm
index 0d6f98590..4eee1869e 100644
--- a/perllib/FixMyStreet/Cobrand/UK.pm
+++ b/perllib/FixMyStreet/Cobrand/UK.pm
@@ -31,19 +31,11 @@ sub disambiguate_location {
};
}
-sub get_council_sender {
- my ( $self, $area_id, $area_info ) = @_;
-
- my $send_method;
-
- my $council_config = FixMyStreet::App->model("DB::Open311conf")->search( { area_id => $area_id } )->first;
- $send_method = $council_config->send_method if $council_config;
-
- return $send_method if $send_method;
-
- return 'London' if $area_info->{type} eq 'LBO';
- return 'NI' if $area_info->{type} eq 'LGD';
- return 'Email';
+sub _fallback_council_sender {
+ my ( $self, $area_id, $area_info, $category ) = @_;
+ return { method => 'London' } if $area_info->{type} eq 'LBO';
+ return { method => 'NI' } if $area_info->{type} eq 'LGD';
+ return { method => 'Email' };
}
sub process_extras {
@@ -53,7 +45,7 @@ sub process_extras {
my $extra = shift;
my $fields = shift || [];
- if ( $area_id == 2482 ) {
+ if ( $area_id eq '2482' ) {
my @fields = ( 'fms_extra_title', @$fields );
for my $field ( @fields ) {
my $value = $ctx->request->param( $field );
@@ -152,7 +144,6 @@ sub find_closest {
my $str = $self->SUPER::find_closest( $latitude, $longitude, $problem );
- # Get nearest postcode from Matthew's random gazetteer (put in MaPit? Or elsewhere?)
my $url = "http://mapit.mysociety.org/nearest/4326/$longitude,$latitude";
my $j = LWP::Simple::get($url);
if ($j) {
@@ -166,7 +157,7 @@ sub find_closest {
return $str;
}
-sub reports_council_check {
+sub reports_body_check {
my ( $self, $c, $code ) = @_;
# Manual misspelling redirect
diff --git a/perllib/FixMyStreet/Cobrand/UKCouncils.pm b/perllib/FixMyStreet/Cobrand/UKCouncils.pm
index a9ebb1b3f..4c80da4f3 100644
--- a/perllib/FixMyStreet/Cobrand/UKCouncils.pm
+++ b/perllib/FixMyStreet/Cobrand/UKCouncils.pm
@@ -86,4 +86,18 @@ sub recent_photos {
return $self->problems->recent_photos( $num, $lat, $lon, $dist );
}
+sub base_url_for_report {
+ my ( $self, $report ) = @_;
+ if ( $self->is_two_tier ) {
+ my %councils = map { $_ => 1 } @{$report->councils};
+ if ( $councils{$self->council_id} ) {
+ return $self->base_url;
+ } else {
+ return FixMyStreet->config('BASE_URL');
+ }
+ } else {
+ return $self->base_url;
+ }
+}
+
1;
diff --git a/perllib/FixMyStreet/Cobrand/Zurich.pm b/perllib/FixMyStreet/Cobrand/Zurich.pm
new file mode 100644
index 000000000..e5d646c8b
--- /dev/null
+++ b/perllib/FixMyStreet/Cobrand/Zurich.pm
@@ -0,0 +1,16 @@
+package FixMyStreet::Cobrand::Zurich;
+use base 'FixMyStreet::Cobrand::Default';
+
+use strict;
+use warnings;
+
+sub enter_postcode_text {
+ my ( $self ) = @_;
+ return _('Enter a Z&uuml;rich street name');
+}
+
+sub example_places {
+ return [ 'Langstrasse', 'Basteiplatz' ];
+}
+
+1;
diff --git a/perllib/FixMyStreet/DB/Result/Comment.pm b/perllib/FixMyStreet/DB/Result/Comment.pm
index 4f155ace3..b551be9ef 100644
--- a/perllib/FixMyStreet/DB/Result/Comment.pm
+++ b/perllib/FixMyStreet/DB/Result/Comment.pm
@@ -54,10 +54,6 @@ __PACKAGE__->add_columns(
{ data_type => "boolean", default_value => \"false", is_nullable => 0 },
"problem_state",
{ data_type => "text", is_nullable => 1 },
- "external_id",
- { data_type => "text", is_nullable => 1 },
- "extra",
- { data_type => "text", is_nullable => 1 },
"send_fail_count",
{ data_type => "integer", default_value => 0, is_nullable => 0 },
"send_fail_reason",
@@ -66,6 +62,10 @@ __PACKAGE__->add_columns(
{ data_type => "timestamp", is_nullable => 1 },
"whensent",
{ data_type => "timestamp", is_nullable => 1 },
+ "external_id",
+ { data_type => "text", is_nullable => 1 },
+ "extra",
+ { data_type => "text", is_nullable => 1 },
);
__PACKAGE__->set_primary_key("id");
__PACKAGE__->belongs_to(
@@ -82,8 +82,8 @@ __PACKAGE__->belongs_to(
);
-# Created by DBIx::Class::Schema::Loader v0.07017 @ 2012-03-26 15:44:18
-# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:nvkElEgSU6XcLd9znSqhmQ
+# Created by DBIx::Class::Schema::Loader v0.07017 @ 2012-07-11 18:53:26
+# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:tSejJzLxHD/fMWjpa10lfA
__PACKAGE__->filter_column(
extra => {
diff --git a/perllib/FixMyStreet/DB/Result/Contact.pm b/perllib/FixMyStreet/DB/Result/Contact.pm
index c32b75d0c..993e3524b 100644
--- a/perllib/FixMyStreet/DB/Result/Contact.pm
+++ b/perllib/FixMyStreet/DB/Result/Contact.pm
@@ -36,13 +36,23 @@ __PACKAGE__->add_columns(
{ data_type => "text", is_nullable => 0 },
"extra",
{ data_type => "text", is_nullable => 1 },
+ "non_public",
+ { data_type => "boolean", default_value => \"false", is_nullable => 1 },
+ "endpoint",
+ { data_type => "text", is_nullable => 1 },
+ "jurisdiction",
+ { data_type => "text", default_value => "", is_nullable => 1 },
+ "api_key",
+ { data_type => "text", default_value => "", is_nullable => 1 },
+ "send_method",
+ { data_type => "text", is_nullable => 1 },
);
__PACKAGE__->set_primary_key("id");
__PACKAGE__->add_unique_constraint("contacts_area_id_category_idx", ["area_id", "category"]);
-# Created by DBIx::Class::Schema::Loader v0.07017 @ 2012-03-08 17:19:55
-# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:hyvU0bMWSFxEPAJT7wqM/Q
+# Created by DBIx::Class::Schema::Loader v0.07017 @ 2012-08-31 10:29:17
+# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:t6yOPhZmedV/eH6AUvHI6w
__PACKAGE__->filter_column(
extra => {
diff --git a/perllib/FixMyStreet/DB/Result/Open311conf.pm b/perllib/FixMyStreet/DB/Result/Open311conf.pm
index 6748db825..f01a20dec 100644
--- a/perllib/FixMyStreet/DB/Result/Open311conf.pm
+++ b/perllib/FixMyStreet/DB/Result/Open311conf.pm
@@ -34,6 +34,8 @@ __PACKAGE__->add_columns(
{ data_type => "integer", is_foreign_key => 1, is_nullable => 1 },
"suppress_alerts",
{ data_type => "boolean", default_value => \"false", is_nullable => 0 },
+ "can_be_devolved",
+ { data_type => "boolean", default_value => \"false", is_nullable => 0 },
"send_extended_statuses",
{ data_type => "boolean", default_value => \"false", is_nullable => 0 },
);
@@ -52,9 +54,8 @@ __PACKAGE__->belongs_to(
);
-# Created by DBIx::Class::Schema::Loader v0.07017 @ 2012-10-03 14:49:22
-# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:OO3kNIohRp+84PGI2154fg
-
+# Created by DBIx::Class::Schema::Loader v0.07017 @ 2012-08-29 14:04:20
+# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:Yoult8K/ldH6DMAKURtr3Q
# You can replace this text with custom code or comments, and it will be preserved on regeneration
1;
diff --git a/perllib/FixMyStreet/DB/Result/Problem.pm b/perllib/FixMyStreet/DB/Result/Problem.pm
index 83939bfab..b1f59e78a 100644
--- a/perllib/FixMyStreet/DB/Result/Problem.pm
+++ b/perllib/FixMyStreet/DB/Result/Problem.pm
@@ -85,13 +85,23 @@ __PACKAGE__->add_columns(
"geocode",
{ data_type => "bytea", is_nullable => 1 },
"send_fail_count",
- { data_type => "integer", is_nullable => 1 },
+ { data_type => "integer", default_value => 0, is_nullable => 0 },
"send_fail_reason",
{ data_type => "text", is_nullable => 1 },
"send_fail_timestamp",
{ data_type => "timestamp", is_nullable => 1 },
"send_method_used",
{ data_type => "text", is_nullable => 1 },
+ "non_public",
+ { data_type => "boolean", default_value => \"false", is_nullable => 1 },
+ "external_source",
+ { data_type => "text", is_nullable => 1 },
+ "external_source_id",
+ { data_type => "text", is_nullable => 1 },
+ "interest_count",
+ { data_type => "integer", is_nullable => 1 },
+ "subcategory",
+ { data_type => "text", is_nullable => 1 },
);
__PACKAGE__->set_primary_key("id");
__PACKAGE__->has_many(
@@ -114,8 +124,8 @@ __PACKAGE__->belongs_to(
);
-# Created by DBIx::Class::Schema::Loader v0.07017 @ 2012-05-03 16:05:20
-# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:EvwI91Ot7SioQWqwnXRTBQ
+# Created by DBIx::Class::Schema::Loader v0.07017 @ 2012-12-03 17:48:10
+# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:xN/RB8Vx50CwyOeBjvJezQ
# Add fake relationship to stored procedure table
__PACKAGE__->has_one(
@@ -606,9 +616,6 @@ sub meta_line {
}
- $meta .= '; ' . _('the map was not used so pin location may be inaccurate')
- unless $problem->used_map;
-
return $meta;
}
@@ -644,7 +651,8 @@ sub body {
# Note: this only makes sense when called on a problem that has been sent!
sub can_display_external_id {
my $self = shift;
- if ($self->external_id && $self->send_method_used && $self->send_method_used eq 'barnet') {
+ if ($self->external_id && $self->send_method_used &&
+ ($self->send_method_used eq 'barnet' || $self->council =~ /2237/)) {
return 1;
}
return 0;
@@ -664,11 +672,11 @@ sub processed_summary_string {
my ( $problem, $c ) = @_;
my ($duration_clause, $external_ref_clause);
if ($problem->whensent) {
- $duration_clause = $problem->duration_string($c)
+ $duration_clause = $problem->duration_string($c);
}
if ($problem->can_display_external_id) {
if ($duration_clause) {
- $external_ref_clause = sprintf(_('their ref:&nbsp;%s'), $problem->external_id);
+ $external_ref_clause = sprintf(_('council ref:&nbsp;%s'), $problem->external_id);
} else {
$external_ref_clause = sprintf(_('%s ref:&nbsp;%s'), $problem->external_body, $problem->external_id);
}
diff --git a/perllib/FixMyStreet/DB/ResultSet/AlertType.pm b/perllib/FixMyStreet/DB/ResultSet/AlertType.pm
index a0320ccc3..d903f8eb2 100644
--- a/perllib/FixMyStreet/DB/ResultSet/AlertType.pm
+++ b/perllib/FixMyStreet/DB/ResultSet/AlertType.pm
@@ -65,6 +65,9 @@ sub email_alerts ($) {
# call checks if this is the host that sends mail for this cobrand.
next unless $cobrand->email_host;
+ # this is for the new_updates alerts
+ next if $row->{non_public} and $row->{user_id} != $row->{alert_user_id};
+
my $hashref_restriction = $cobrand->site_restriction( $row->{cobrand_data} );
FixMyStreet::App->model('DB::AlertSent')->create( {
@@ -91,7 +94,23 @@ sub email_alerts ($) {
}
# this is currently only for new_updates
if ($row->{item_text}) {
- $data{problem_url} = $url . "/report/" . $row->{id};
+ if ( $row->{alert_user_id} == $row->{user_id} ) {
+ # This is an alert to the same user who made the report - make this a login link
+ my $user = FixMyStreet::App->model('DB::User')->find( {
+ id => $row->{alert_user_id}
+ } );
+ $data{alert_email} = $user->email;
+ my $token_obj = FixMyStreet::App->model('DB::Token')->create( {
+ scope => 'email_sign_in',
+ data => {
+ email => $user->email,
+ r => 'report/' . $row->{id},
+ }
+ } );
+ $data{problem_url} = $url . "/M/" . $token_obj->token;
+ } else {
+ $data{problem_url} = $url . "/report/" . $row->{id};
+ }
$data{data} .= $row->{item_name} . ' : ' if $row->{item_name} && !$row->{item_anonymous};
$data{data} .= $row->{item_text} . "\n\n------\n\n";
# this is ward and council problems
@@ -151,6 +170,7 @@ sub email_alerts ($) {
where nearby.problem_id = problem.id
and problem.user_id = users.id
and problem.state in ($states)
+ and problem.non_public = 'f'
and problem.confirmed >= ? and problem.confirmed >= ms_current_timestamp() - '7 days'::interval
and (select whenqueued from alert_sent where alert_sent.alert_id = ? and alert_sent.parameter::integer = problem.id) is null
and users.email <> ?
@@ -210,13 +230,12 @@ sub _send_aggregated_alert_email(%) {
unless -e $template;
$template = Utils::read_file($template);
- my $sender = $cobrand->contact_email;
- (my $from = $sender) =~ s/team/fms-DO-NOT-REPLY/; # XXX
+ my $sender = FixMyStreet->config('DO_NOT_REPLY_EMAIL');
my $result = FixMyStreet::App->send_email_cron(
{
_template_ => $template,
_parameters_ => \%data,
- From => [ $from, _($cobrand->contact_name) ],
+ From => [ $sender, _($cobrand->contact_name) ],
To => $data{alert_email},
},
$sender,
diff --git a/perllib/FixMyStreet/DB/ResultSet/Nearby.pm b/perllib/FixMyStreet/DB/ResultSet/Nearby.pm
index 83fc85a88..191223572 100644
--- a/perllib/FixMyStreet/DB/ResultSet/Nearby.pm
+++ b/perllib/FixMyStreet/DB/ResultSet/Nearby.pm
@@ -8,6 +8,7 @@ sub nearby {
my ( $rs, $c, $dist, $ids, $limit, $mid_lat, $mid_lon, $interval ) = @_;
my $params = {
+ non_public => 0,
state => [ FixMyStreet::DB::Result::Problem::visible_states() ],
};
$params->{'current_timestamp-lastupdate'} = { '<', \"'$interval'::interval" }
diff --git a/perllib/FixMyStreet/DB/ResultSet/Problem.pm b/perllib/FixMyStreet/DB/ResultSet/Problem.pm
index 4036c4b05..faed3b8ac 100644
--- a/perllib/FixMyStreet/DB/ResultSet/Problem.pm
+++ b/perllib/FixMyStreet/DB/ResultSet/Problem.pm
@@ -85,7 +85,8 @@ sub _recent {
$key .= ":$site_key:$num";
my $query = {
- state => [ FixMyStreet::DB::Result::Problem->visible_states() ],
+ non_public => 0,
+ state => [ FixMyStreet::DB::Result::Problem->visible_states() ],
};
$query->{photo} = { '!=', undef } if $photos;
@@ -141,6 +142,7 @@ sub around_map {
$attr->{rows} = $limit if $limit;
my $q = {
+ non_public => 0,
state => [ FixMyStreet::DB::Result::Problem->visible_states() ],
latitude => { '>=', $min_lat, '<', $max_lat },
longitude => { '>=', $min_lon, '<', $max_lon },
@@ -286,6 +288,16 @@ sub send_reports {
$h{closest_address} = $cobrand->find_closest( $h{latitude}, $h{longitude}, $row );
}
+ if ( $cobrand->allow_anonymous_reports &&
+ $row->user->email eq $cobrand->anonymous_account->{'email'}
+ ) {
+ $h{anonymous_report} = 1;
+ $h{user_details} = _('This report was submitted anonymously');
+ } else {
+ $h{user_details} = sprintf(_('Name: %s'), $row->name) . "\n\n";
+ $h{user_details} .= sprintf(_('Email: %s'), $row->user->email) . "\n\n";
+ }
+
my %reporters = ();
my ( $sender_count );
if ($site eq 'emptyhomes') {
@@ -308,8 +320,8 @@ sub send_reports {
foreach my $council (@councils) {
my $name = $areas_info->{$council}->{name};
- my $sender = $cobrand->get_council_sender( $council, $areas_info->{$council} );
- $sender = "FixMyStreet::SendReport::$sender";
+ my $sender_info = $cobrand->get_council_sender( $council, $areas_info->{$council}, $row->category );
+ my $sender = "FixMyStreet::SendReport::" . $sender_info->{method};
if ( ! exists $senders->{ $sender } ) {
warn "No such sender [ $sender ] for council $name ( $council )";
@@ -322,7 +334,7 @@ sub send_reports {
$reporters{ $sender }->skipped;
} else {
push @dear, $name;
- $reporters{ $sender }->add_council( $council, $areas_info->{$council} );
+ $reporters{ $sender }->add_council( $council, $areas_info->{$council}, $sender_info->{config} );
}
}
@@ -334,6 +346,10 @@ sub send_reports {
$h{category_line} = sprintf(_("Category: %s"), $h{category}) . "\n\n";
}
+ if ( $row->subcategory ) {
+ $h{subcategory_line} = sprintf(_("Subcategory: %s"), $row->subcategory) . "\n\n";
+ }
+
$h{councils_name} = join(_(' and '), @dear);
if ($h{category} eq _('Other')) {
$h{multiple} = @dear>1 ? "[ " . _("This email has been sent to both councils covering the location of the problem, as the user did not categorise it; please ignore it if you're not the correct council to deal with the issue, or let us know what category of problem this is so we can add it to our system.") . " ]\n\n"
@@ -361,8 +377,33 @@ sub send_reports {
if (mySociety::Config::get('STAGING_SITE')) {
# on a staging server send emails to ourselves rather than the councils
- my @testing_councils = split( '\|', mySociety::Config::get('TESTING_COUNCILS') || '' );
- unless ( grep { $row->council eq $_ } @testing_councils ) {
+ # however, we can configure a list of councils that we use non email
+ # delivery, e.g. Open311, for testing purposes. For those we want to
+ # send using the non email method and for everyone else we want to use
+ # email
+ my @testing_councils = split( '\|', mySociety::Config::get('TESTING_COUNCILS') );
+
+ # we only care about non missing councils so we get the missing ones
+ # and then essentially throw them away as we're not going to have
+ # configured them to do anything.
+ my %councils = map { $_ => 1 } @{ $row->councils };
+
+ # We now take the councils that we have contact details for and if any of them
+ # are in the list of testing councils we look a bit harder otherwise we throw
+ # away all the non email delivery methods
+ if ( grep { $councils{ $_ } } @testing_councils ) {
+ my %tc = map { $_ => 1 } @testing_councils;
+ my @non_matching = grep { !$tc{$_} } keys %councils;
+ for my $sender ( keys %reporters ) {
+ next if $sender =~ /FixMyStreet::SendReport::(Email|NI)/;
+ for my $council ( @non_matching ) {
+ $reporters{$sender}->delete_council( $council );
+ }
+ }
+ if ( @non_matching ) {
+ $reporters{'FixMyStreet::SendReport::Email'} = FixMyStreet::SendReport::Email->new();
+ }
+ } else {
%reporters = map { $_ => $reporters{$_} } grep { /FixMyStreet::SendReport::(Email|NI)/ } keys %reporters;
unless (%reporters) {
%reporters = ( 'FixMyStreet::SendReport::Email' => FixMyStreet::SendReport::Email->new() );
@@ -393,6 +434,9 @@ sub send_reports {
whensent => \'ms_current_timestamp()',
lastupdate => \'ms_current_timestamp()',
} );
+ if ( $cobrand->report_sent_confirmation_email && !$h{anonymous_report}) {
+ _send_report_sent_email( $row, \%h, $nomail );
+ }
} else {
my @errors;
for my $sender ( keys %reporters ) {
@@ -420,7 +464,48 @@ sub send_reports {
}
printf " %-24s %4d\n", "Total:", $c;
}
+ my $sending_errors = '';
+ my $unsent = FixMyStreet::App->model("DB::Problem")->search( {
+ state => [ 'confirmed', 'fixed' ],
+ whensent => undef,
+ council => { '!=', undef },
+ send_fail_count => { '>', 0 }
+ } );
+ while (my $row = $unsent->next) {
+ $sending_errors .= "* http://www.fixmystreet.com/report/" . $row->id . ", failed "
+ . $row->send_fail_count . " times, last at " . $row->send_fail_timestamp
+ . ", reason " . $row->send_fail_reason . "\n";
+ }
+ if ($sending_errors) {
+ print "The following reports had problems sending:\n$sending_errors";
+ }
}
}
+sub _send_report_sent_email {
+ my $row = shift;
+ my $h = shift;
+ my $nomail = shift;
+
+ my $template = 'confirm_report_sent.txt';
+ my $template_path = FixMyStreet->path_to( "templates", "email", $row->cobrand, $row->lang, $template )->stringify;
+ $template_path = FixMyStreet->path_to( "templates", "email", $row->cobrand, $template )->stringify
+ unless -e $template_path;
+ $template_path = FixMyStreet->path_to( "templates", "email", "default", $template )->stringify
+ unless -e $template_path;
+ $template = Utils::read_file( $template_path );
+
+ my $result = FixMyStreet::App->send_email_cron(
+ {
+ _template_ => $template,
+ _parameters_ => $h,
+ To => $row->user->email,
+ From => mySociety::Config::get('CONTACT_EMAIL'),
+ },
+ mySociety::Config::get('CONTACT_EMAIL'),
+ [ $row->user->email ],
+ $nomail
+ );
+}
+
1;
diff --git a/perllib/FixMyStreet/DB/ResultSet/Questionnaire.pm b/perllib/FixMyStreet/DB/ResultSet/Questionnaire.pm
index bbf0c9a9e..1b9521a9f 100644
--- a/perllib/FixMyStreet/DB/ResultSet/Questionnaire.pm
+++ b/perllib/FixMyStreet/DB/ResultSet/Questionnaire.pm
@@ -62,7 +62,9 @@ sub send_questionnaires_period {
($template = $period) =~ s/ //;
$template = Utils::read_file( FixMyStreet->path_to( "templates/email/emptyhomes/" . $row->lang . "/questionnaire-$template.txt" )->stringify );
} else {
- $template = FixMyStreet->path_to( "templates", "email", $cobrand->moniker, "questionnaire.txt" )->stringify;
+ $template = FixMyStreet->path_to( "templates", "email", $cobrand->moniker, $row->lang, "questionnaire.txt" )->stringify;
+ $template = FixMyStreet->path_to( "templates", "email", $cobrand->moniker, "questionnaire.txt" )->stringify
+ unless -e $template;
$template = FixMyStreet->path_to( "templates", "email", "default", "questionnaire.txt" )->stringify
unless -e $template;
$template = Utils::read_file( $template );
@@ -87,9 +89,8 @@ sub send_questionnaires_period {
} );
$h{url} = $cobrand->base_url($row->cobrand_data) . '/Q/' . $token->token;
- my $sender = $cobrand->contact_email;
+ my $sender = FixMyStreet->config('DO_NOT_REPLY_EMAIL');
my $sender_name = _($cobrand->contact_name);
- $sender =~ s/team/fms-DO-NOT-REPLY/;
print "Sending questionnaire " . $questionnaire->id . ", problem "
. $row->id . ", token " . $token->token . " to "
diff --git a/perllib/FixMyStreet/EmailSend.pm b/perllib/FixMyStreet/EmailSend.pm
index 61d8a70c2..8b6eed462 100644
--- a/perllib/FixMyStreet/EmailSend.pm
+++ b/perllib/FixMyStreet/EmailSend.pm
@@ -2,10 +2,7 @@ package FixMyStreet::EmailSend;
use base Email::Send::SMTP;
sub get_env_sender {
- # Should really use cobrand's contact_email function, but not sure how
- # best to access that from in here.
- my $sender = FixMyStreet->config('CONTACT_EMAIL');
- $sender =~ s/team/fms-DO-NOT-REPLY/;
+ my $sender = FixMyStreet->config('DO_NOT_REPLY_EMAIL');
return $sender;
}
diff --git a/perllib/FixMyStreet/Geocode.pm b/perllib/FixMyStreet/Geocode.pm
index f92e9cc9a..6cfd960ed 100644
--- a/perllib/FixMyStreet/Geocode.pm
+++ b/perllib/FixMyStreet/Geocode.pm
@@ -13,6 +13,7 @@ use URI::Escape;
use FixMyStreet::Geocode::Bing;
use FixMyStreet::Geocode::Google;
use FixMyStreet::Geocode::OSM;
+use FixMyStreet::Geocode::Zurich;
# lookup STRING CONTEXT
# Given a user-inputted string, try and convert it into co-ordinates using either
@@ -33,18 +34,27 @@ sub lookup {
# Canonicalises, and then passes to some external API to look stuff up.
sub string {
my ($s, $c) = @_;
+
+ my $service = $c->config->{GEOCODER};
+ $service = $service->{type} if ref $service;
+ $service = 'OSM' unless $service =~ /^(Bing|Google|OSM|Zurich)$/;
+ $service = 'OSM' if $service eq 'Bing' && !FixMyStreet->config('BING_MAPS_API_KEY');
+ $service = "FixMyStreet::Geocode::${service}::string";
+
+ no strict 'refs';
+ return &$service($s, $c);
+}
+
+# escape STRING CONTEXT
+# Escapes string for putting in URL geocoding call
+sub escape {
+ my ($s, $c) = @_;
$s = lc($s);
$s =~ s/[^-&\w ']/ /g;
$s =~ s/\s+/ /g;
$s = URI::Escape::uri_escape_utf8($s);
$s =~ s/%20/+/g;
- my $params = $c->cobrand->disambiguate_location($s);
- return FixMyStreet::Geocode::Bing::string($s, $c, $params)
- if FixMyStreet->config('BING_MAPS_API_KEY');
- # Fall back to Google API, which allow access with and without a key
- return FixMyStreet::Geocode::Google::string($s, $c, $params)
- if FixMyStreet->config('GOOGLE_MAPS_API_KEY');
- return FixMyStreet::Geocode::OSM::string($s, $c, $params);
+ return $s;
}
1;
diff --git a/perllib/FixMyStreet/Geocode/Bing.pm b/perllib/FixMyStreet/Geocode/Bing.pm
index 18e6b56ce..85eef3d0f 100644
--- a/perllib/FixMyStreet/Geocode/Bing.pm
+++ b/perllib/FixMyStreet/Geocode/Bing.pm
@@ -15,14 +15,21 @@ use File::Path ();
use LWP::Simple;
use Digest::MD5 qw(md5_hex);
+use mySociety::Locale;
+
# string STRING CONTEXT
# Looks up on Bing Maps API, and caches, a user-inputted location.
# Returns array of (LAT, LON, ERROR), where ERROR is either undef, a string, or
# an array of matches if there are more than one. The information in the query
# may be used to disambiguate the location in cobranded versions of the site.
sub string {
- my ( $s, $c, $params ) = @_;
+ my ( $s, $c ) = @_;
+
+ my $params = $c->cobrand->disambiguate_location($s);
+
+ $s = FixMyStreet::Geocode::escape($s);
$s .= '+' . $params->{town} if $params->{town} and $s !~ /$params->{town}/i;
+
my $url = "http://dev.virtualearth.net/REST/v1/Locations?q=$s";
$url .= '&userMapView=' . join(',', @{$params->{bounds}})
if $params->{bounds};
diff --git a/perllib/FixMyStreet/Geocode/Google.pm b/perllib/FixMyStreet/Geocode/Google.pm
index db3a8ae91..fd65b89b1 100644
--- a/perllib/FixMyStreet/Geocode/Google.pm
+++ b/perllib/FixMyStreet/Geocode/Google.pm
@@ -14,6 +14,7 @@ use File::Slurp;
use File::Path ();
use LWP::Simple;
use Digest::MD5 qw(md5_hex);
+use mySociety::Locale;
# string STRING CONTEXT
# Looks up on Google Maps API, and caches, a user-inputted location.
@@ -21,7 +22,11 @@ use Digest::MD5 qw(md5_hex);
# an array of matches if there are more than one. The information in the query
# may be used to disambiguate the location in cobranded versions of the site.
sub string {
- my ( $s, $c, $params ) = @_;
+ my ( $s, $c ) = @_;
+
+ my $params = $c->cobrand->disambiguate_location($s);
+
+ $s = FixMyStreet::Geocode::escape($s);
my $url = 'http://maps.google.com/maps/geo?q=' . $s;
$url .= '&ll=' . $params->{centre} if $params->{centre};
diff --git a/perllib/FixMyStreet/Geocode/OSM.pm b/perllib/FixMyStreet/Geocode/OSM.pm
index ba939b443..fd14b0acc 100644
--- a/perllib/FixMyStreet/Geocode/OSM.pm
+++ b/perllib/FixMyStreet/Geocode/OSM.pm
@@ -15,9 +15,10 @@ use Digest::MD5 qw(md5_hex);
use Encode;
use File::Slurp;
use File::Path ();
-use LWP::Simple;
+use LWP::Simple qw($ua);
use Memcached;
use XML::Simple;
+use mySociety::Locale;
my $osmapibase = "http://www.openstreetmap.org/api/";
my $nominatimbase = "http://nominatim.openstreetmap.org/";
@@ -28,8 +29,13 @@ my $nominatimbase = "http://nominatim.openstreetmap.org/";
# an array of matches if there are more than one. The information in the query
# may be used to disambiguate the location in cobranded versions of the site.
sub string {
- my ( $s, $c, $params ) = @_;
+ my ( $s, $c ) = @_;
+
+ my $params = $c->cobrand->disambiguate_location($s);
+
+ $s = FixMyStreet::Geocode::escape($s);
$s .= '+' . $params->{town} if $params->{town} and $s !~ /$params->{town}/i;
+
my $url = "${nominatimbase}search?";
my %query_params = (
q => $s,
@@ -49,6 +55,7 @@ sub string {
if (-s $cache_file) {
$js = File::Slurp::read_file($cache_file);
} else {
+ $ua->timeout(15);
$js = LWP::Simple::get($url);
$js = encode_utf8($js) if utf8::is_utf8($js);
File::Path::mkpath($cache_dir);
@@ -56,7 +63,7 @@ sub string {
}
if (!$js) {
- return { error => _('Sorry, we could not parse that location. Please try again.') };
+ return { error => _('Sorry, we could not find that location.') };
}
$js = JSON->new->utf8->allow_nonref->decode($js);
diff --git a/perllib/FixMyStreet/Geocode/Zurich.pm b/perllib/FixMyStreet/Geocode/Zurich.pm
new file mode 100644
index 000000000..5aaca2c8e
--- /dev/null
+++ b/perllib/FixMyStreet/Geocode/Zurich.pm
@@ -0,0 +1,107 @@
+#!/usr/bin/perl
+#
+# FixMyStreet::Geocode::Zurich
+# Geocoding with Zurich web service.
+#
+# Thanks to http://msdn.microsoft.com/en-us/library/ms995764.aspx
+# and http://noisemore.wordpress.com/2009/03/19/perl-soaplite-wsse-web-services-security-soapheader/
+# for SOAP::Lite pointers
+#
+# Copyright (c) 2012 UK Citizens Online Democracy. All rights reserved.
+# Email: matthew@mysociety.org; WWW: http://www.mysociety.org/
+
+package FixMyStreet::Geocode::Zurich;
+
+use strict;
+use Digest::MD5 qw(md5_hex);
+use File::Path ();
+use Geo::Coordinates::CH1903;
+use SOAP::Lite;
+use Storable;
+use mySociety::Locale;
+
+my ($soap, $method, $security);
+
+sub setup_soap {
+ return if $soap;
+
+ # Variables for the SOAP web service
+ my $geocoder = FixMyStreet->config('GEOCODER');
+ my $url = $geocoder->{url};
+ my $username = $geocoder->{username};
+ my $password = $geocoder->{password};
+ my $attr = 'http://ch/geoz/fixmyzuerich/service';
+ my $action = "$attr/IFixMyZuerich/";
+
+ # Set up the SOAP handler
+ $security = SOAP::Header->name("Security")->attr({
+ 'mustUnderstand' => 'true',
+ 'xmlns' => 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd'
+ })->value(
+ \SOAP::Header->name(
+ "UsernameToken" => \SOAP::Header->value(
+ SOAP::Header->name('Username', $username),
+ SOAP::Header->name('Password', $password)
+ )
+ )
+ );
+ $soap = SOAP::Lite->on_action( sub { $action . $_[1]; } )->proxy($url);
+ $method = SOAP::Data->name('getLocation')->attr({ xmlns => $attr });
+}
+
+# string STRING CONTEXT
+# Looks up on Zurich web service a user-inputted location.
+# Returns array of (LAT, LON, ERROR), where ERROR is either undef, a string, or
+# an array of matches if there are more than one. The information in the query
+# may be used to disambiguate the location in cobranded versions of the site.
+sub string {
+ my ( $s, $c ) = @_;
+
+ setup_soap();
+
+ my $cache_dir = FixMyStreet->config('GEO_CACHE') . 'zurich/';
+ my $cache_file = $cache_dir . md5_hex($s);
+ my $result;
+ if (-s $cache_file) {
+ $result = retrieve($cache_file);
+ } else {
+ my $search = SOAP::Data->name('search' => $s)->type('');
+ my $count = SOAP::Data->name('count' => 10)->type('');
+ eval {
+ $result = $soap->call($method, $security, $search, $count);
+ };
+ if ($@) {
+ return { error => 'The geocoder appears to be down.' };
+ }
+ $result = $result->result;
+ File::Path::mkpath($cache_dir);
+ store $result, $cache_file if $result;
+ }
+
+ if (!$result || !$result->{Location}) {
+ return { error => _('Sorry, we could not parse that location. Please try again.') };
+ }
+
+ my $results = $result->{Location};
+ $results = [ $results ] unless ref $results eq 'ARRAY';
+
+ my ( $error, @valid_locations, $latitude, $longitude );
+ foreach (@$results) {
+ ($latitude, $longitude) = Geo::Coordinates::CH1903::to_latlon($_->{easting}, $_->{northing});
+ mySociety::Locale::in_gb_locale {
+ push (@$error, {
+ address => $_->{text},
+ latitude => sprintf('%0.6f', $latitude),
+ longitude => sprintf('%0.6f', $longitude)
+ });
+ };
+ push (@valid_locations, $_);
+ last if lc($_->{text}) eq lc($s);
+ }
+
+ return { latitude => $latitude, longitude => $longitude } if scalar @valid_locations == 1;
+ return { error => $error };
+}
+
+1;
+
diff --git a/perllib/FixMyStreet/Map.pm b/perllib/FixMyStreet/Map.pm
index d36b91ffe..a1876e150 100644
--- a/perllib/FixMyStreet/Map.pm
+++ b/perllib/FixMyStreet/Map.pm
@@ -52,10 +52,6 @@ sub set_map_class {
$map_class = $str;
}
-sub header_js {
- return $map_class->header_js(@_);
-}
-
sub display_map {
return $map_class->display_map(@_);
}
@@ -118,7 +114,26 @@ sub _map_features {
}
sub map_pins {
- return $map_class->map_pins(@_);
+ my ($c, $interval) = @_;
+
+ my $bbox = $c->req->param('bbox');
+ my ( $min_lon, $min_lat, $max_lon, $max_lat ) = split /,/, $bbox;
+
+ my ( $around_map, $around_map_list, $nearby, $dist ) =
+ FixMyStreet::Map::map_features_bounds( $c, $min_lon, $min_lat, $max_lon, $max_lat, $interval );
+
+ # create a list of all the pins
+ my @pins = map {
+ # Here we might have a DB::Problem or a DB::Nearby, we always want the problem.
+ my $p = (ref $_ eq 'FixMyStreet::App::Model::DB::Nearby') ? $_->problem : $_;
+ my $colour = $c->cobrand->pin_colour( $p, 'around' );
+ [ $p->latitude, $p->longitude,
+ $colour,
+ $p->id, $p->title
+ ]
+ } @$around_map, @$nearby;
+
+ return (\@pins, $around_map_list, $nearby, $dist);
}
sub click_to_wgs84 {
diff --git a/perllib/FixMyStreet/Map/OSM.pm b/perllib/FixMyStreet/Map/OSM.pm
index 693f42e4f..d8abc9dd6 100644
--- a/perllib/FixMyStreet/Map/OSM.pm
+++ b/perllib/FixMyStreet/Map/OSM.pm
@@ -62,7 +62,7 @@ sub display_map {
# Adjust zoom level dependent upon population density
my $dist = $c->stash->{distance}
|| mySociety::Gaze::get_radius_containing_population( $params{latitude}, $params{longitude}, 200_000 );
- my $default_zoom = $numZoomLevels - 3;
+ my $default_zoom = $c->cobrand->default_map_zoom() ? $c->cobrand->default_map_zoom() : $numZoomLevels - 3;
$default_zoom = $numZoomLevels - 2 if $dist < 10;
# Map centre may be overridden in the query string
@@ -94,29 +94,6 @@ sub display_map {
};
}
-sub map_pins {
- my ($self, $c, $interval) = @_;
-
- my $bbox = $c->req->param('bbox');
- my ( $min_lon, $min_lat, $max_lon, $max_lat ) = split /,/, $bbox;
-
- my ( $around_map, $around_map_list, $nearby, $dist ) =
- FixMyStreet::Map::map_features_bounds( $c, $min_lon, $min_lat, $max_lon, $max_lat, $interval );
-
- # create a list of all the pins
- my @pins = map {
- # Here we might have a DB::Problem or a DB::Nearby, we always want the problem.
- my $p = (ref $_ eq 'FixMyStreet::App::Model::DB::Nearby') ? $_->problem : $_;
- my $colour = $c->cobrand->pin_colour( $p, 'around' );
- [ $p->latitude, $p->longitude,
- $colour,
- $p->id, $p->title
- ]
- } @$around_map, @$nearby;
-
- return (\@pins, $around_map_list, $nearby, $dist);
-}
-
sub compass {
my ( $x, $y, $z ) = @_;
return {
diff --git a/perllib/FixMyStreet/Map/Zurich.pm b/perllib/FixMyStreet/Map/Zurich.pm
new file mode 100644
index 000000000..d2f7a35af
--- /dev/null
+++ b/perllib/FixMyStreet/Map/Zurich.pm
@@ -0,0 +1,177 @@
+#!/usr/bin/perl
+#
+# FixMyStreet:Map::Zurich
+# Zurich have their own tileserver.
+#
+# Copyright (c) 2012 UK Citizens Online Democracy. All rights reserved.
+# Email: steve@mysociety.org; WWW: http://www.mysociety.org/
+
+package FixMyStreet::Map::Zurich;
+
+use strict;
+use Geo::Coordinates::CH1903;
+use Math::Trig;
+use Utils;
+
+use constant ZOOM_LEVELS => 10;
+use constant DEFAULT_ZOOM => 7;
+use constant MIN_ZOOM_LEVEL => 0;
+
+sub map_tiles {
+ my ( $self, %params ) = @_;
+ my ( $col, $row, $z ) = ( $params{x_tile}, $params{y_tile}, $params{matrix_id} );
+ my $tile_url = $self->base_tile_url();
+ return [
+ "$tile_url/$z/" . ($row - 1) . "/" . ($col - 1) . ".jpg",
+ "$tile_url/$z/" . ($row - 1) . "/$col.jpg",
+ "$tile_url/$z/$row/" . ($col - 1) . ".jpg",
+ "$tile_url/$z/$row/$col.jpg",
+ ];
+}
+
+sub base_tile_url {
+ return 'http://www.wmts.stadt-zuerich.ch/Luftbild/MapServer/WMTS/tile/1.0.0/Luftbild/default/nativeTileMatrixSet';
+}
+
+sub copyright {
+ return '&copy; Stadt Z&uuml;rich';
+}
+
+# display_map C PARAMS
+# PARAMS include:
+# latitude, longitude for the centre point of the map
+# CLICKABLE is set if the map is clickable
+# PINS is array of pins to show, location and colour
+sub display_map {
+ my ($self, $c, %params) = @_;
+
+ my $numZoomLevels = ZOOM_LEVELS;
+ my $zoomOffset = MIN_ZOOM_LEVEL;
+# if ($params{any_zoom}) {
+# $numZoomLevels = 10;
+# $zoomOffset = 0;
+# }
+
+ # TODO Adjust zoom level dependent upon population density
+ my $default_zoom = DEFAULT_ZOOM;
+
+ # Map centre may be overridden in the query string
+ $params{latitude} = Utils::truncate_coordinate($c->req->params->{lat} + 0)
+ if defined $c->req->params->{lat};
+ $params{longitude} = Utils::truncate_coordinate($c->req->params->{lon} + 0)
+ if defined $c->req->params->{lon};
+
+ my $zoom = defined $c->req->params->{zoom} ? $c->req->params->{zoom} + 0 : $default_zoom;
+ $zoom = $numZoomLevels - 1 if $zoom >= $numZoomLevels;
+ $zoom = 0 if $zoom < 0;
+ $params{zoom_act} = $zoomOffset + $zoom;
+
+ ($params{x_tile}, $params{y_tile}, $params{matrix_id}) = latlon_to_tile_with_adjust($params{latitude}, $params{longitude}, $params{zoom_act});
+
+ foreach my $pin (@{$params{pins}}) {
+ ($pin->{px}, $pin->{py}) = latlon_to_px($pin->{latitude}, $pin->{longitude}, $params{x_tile}, $params{y_tile}, $params{zoom_act});
+ }
+
+ $c->stash->{map} = {
+ %params,
+ type => 'zurich',
+ map_type => 'OpenLayers.Layer.WMTS',
+ tiles => $self->map_tiles( %params ),
+ copyright => $self->copyright(),
+ zoom => $zoom,
+ zoomOffset => $zoomOffset,
+ numZoomLevels => $numZoomLevels,
+ };
+}
+
+# Given a lat/lon, convert it to Zurch tile co-ordinates (precise).
+sub latlon_to_tile($$$) {
+ my ($lat, $lon, $zoom) = @_;
+
+ my ($x, $y) = Geo::Coordinates::CH1903::from_latlon($lat, $lon);
+
+ my $matrix_id = $zoom - 1;
+ $matrix_id = 0 if $matrix_id < 0;
+
+ my @scales = ( '250000', '125000', '64000', '32000', '16000', '8000', '4000', '2000', '1000', '500' );
+ my $tileOrigin = { lat => 30814423, lon => -29386322 };
+ my $tileSize = 256;
+ my $res = $scales[$zoom] / (39.3701 * 96); # OpenLayers.INCHES_PER_UNIT[units] * OpenLayers.DOTS_PER_INCH
+
+ my $fx = ( $x - $tileOrigin->{lon} ) / ($res * $tileSize);
+ my $fy = ( $tileOrigin->{lat} - $y ) / ($res * $tileSize);
+
+ return ( $fx, $fy, $matrix_id );
+}
+
+# Given a lat/lon, convert it to OSM tile co-ordinates (nearest actual tile,
+# adjusted so the point will be near the centre of a 2x2 tiled map).
+sub latlon_to_tile_with_adjust($$$) {
+ my ($lat, $lon, $zoom) = @_;
+ my ($x_tile, $y_tile, $matrix_id) = latlon_to_tile($lat, $lon, $zoom);
+
+ # Try and have point near centre of map
+ if ($x_tile - int($x_tile) > 0.5) {
+ $x_tile += 1;
+ }
+ if ($y_tile - int($y_tile) > 0.5) {
+ $y_tile += 1;
+ }
+
+ return ( int($x_tile), int($y_tile), $matrix_id );
+}
+
+sub tile_to_latlon {
+ my ($fx, $fy, $zoom) = @_;
+
+ my @scales = ( '250000', '125000', '64000', '32000', '16000', '8000', '4000', '2000', '1000', '500' );
+ my $tileOrigin = { lat => 30814423, lon => -29386322 };
+ my $tileSize = 256;
+ my $res = $scales[$zoom] / (39.3701 * 96); # OpenLayers.INCHES_PER_UNIT[units] * OpenLayers.DOTS_PER_INCH
+
+ my $x = $fx * $res * $tileSize + $tileOrigin->{lon};
+ my $y = $tileOrigin->{lat} - $fy * $res * $tileSize;
+
+ my ($lat, $lon) = Geo::Coordinates::CH1903::to_latlon($x, $y);
+
+ return ( $lat, $lon );
+}
+
+# Given a lat/lon, convert it to pixel co-ordinates from the top left of the map
+sub latlon_to_px($$$$$) {
+ my ($lat, $lon, $x_tile, $y_tile, $zoom) = @_;
+ my ($pin_x_tile, $pin_y_tile) = latlon_to_tile($lat, $lon, $zoom);
+ my $pin_x = tile_to_px($pin_x_tile, $x_tile);
+ my $pin_y = tile_to_px($pin_y_tile, $y_tile);
+ return ($pin_x, $pin_y);
+}
+
+# Convert tile co-ordinates to pixel co-ordinates from top left of map
+# C is centre tile reference of displayed map
+sub tile_to_px {
+ my ($p, $c) = @_;
+ $p = 256 * ($p - $c + 1);
+ $p = int($p + .5 * ($p <=> 0));
+ return $p;
+}
+
+sub click_to_tile {
+ my ($pin_tile, $pin) = @_;
+ $pin -= 256 while $pin > 256;
+ $pin += 256 while $pin < 0;
+ return $pin_tile + $pin / 256;
+}
+
+# Given some click co-ords (the tile they were on, and where in the
+# tile they were), convert to WGS84 and return.
+# XXX Note use of MIN_ZOOM_LEVEL here. (Copied from OSM, needed here?)
+sub click_to_wgs84 {
+ my ($self, $c, $pin_tile_x, $pin_x, $pin_tile_y, $pin_y) = @_;
+ my $tile_x = click_to_tile($pin_tile_x, $pin_x);
+ my $tile_y = click_to_tile($pin_tile_y, $pin_y);
+ my $zoom = MIN_ZOOM_LEVEL + (defined $c->req->params->{zoom} ? $c->req->params->{zoom} : DEFAULT_ZOOM);
+ my ($lat, $lon) = tile_to_latlon($tile_x, $tile_y, $zoom);
+ return ( $lat, $lon );
+}
+
+1;
diff --git a/perllib/FixMyStreet/SendReport.pm b/perllib/FixMyStreet/SendReport.pm
index f750ef479..f679d826e 100644
--- a/perllib/FixMyStreet/SendReport.pm
+++ b/perllib/FixMyStreet/SendReport.pm
@@ -39,8 +39,16 @@ sub add_council {
my $self = shift;
my $council = shift;
my $info = shift;
+ my $config = shift;
- $self->councils->{ $council } = $info;
+ $self->councils->{ $council } = { info => $info, config => $config };
+}
+
+sub delete_council {
+ my $self = shift;
+ my $council = shift;
+
+ delete $self->councils->{$council};
}
diff --git a/perllib/FixMyStreet/SendReport/Email.pm b/perllib/FixMyStreet/SendReport/Email.pm
index 654ed6b3a..f26116bc4 100644
--- a/perllib/FixMyStreet/SendReport/Email.pm
+++ b/perllib/FixMyStreet/SendReport/Email.pm
@@ -12,6 +12,7 @@ sub build_recipient_list {
my $all_confirmed = 1;
foreach my $council ( keys %{ $self->councils } ) {
+
my $contact = FixMyStreet::App->model("DB::Contact")->find( {
deleted => 0,
area_id => $council,
@@ -32,7 +33,13 @@ sub build_recipient_list {
$self->unconfirmed_notes->{$council_email}{$row->category} = $note;
}
- push @{ $self->to }, [ $council_email, $self->councils->{ $council }->{name} ];
+ # see something uses council areas but doesn't send to councils so just use a
+ # generic name here to minimise confusion
+ if ( $row->cobrand eq 'seesomething' ) {
+ push @{ $self->to }, [ $council_email, 'See Something, Say Something' ];
+ } else {
+ push @{ $self->to }, [ $council_email, $self->councils->{ $council }->{info}->{name} ];
+ }
$recips{$council_email} = 1;
}
@@ -45,7 +52,9 @@ sub get_template {
my $template = 'submit.txt';
$template = 'submit-brent.txt' if $row->council eq 2488 || $row->council eq 2237;
- my $template_path = FixMyStreet->path_to( "templates", "email", $row->cobrand, $template )->stringify;
+ my $template_path = FixMyStreet->path_to( "templates", "email", $row->cobrand, $row->lang, $template )->stringify;
+ $template_path = FixMyStreet->path_to( "templates", "email", $row->cobrand, $template )->stringify
+ unless -e $template_path;
$template_path = FixMyStreet->path_to( "templates", "email", "default", $template )->stringify
unless -e $template_path;
$template = Utils::read_file( $template_path );
diff --git a/perllib/FixMyStreet/SendReport/EmptyHomes.pm b/perllib/FixMyStreet/SendReport/EmptyHomes.pm
index e1b914523..4a6f058fe 100644
--- a/perllib/FixMyStreet/SendReport/EmptyHomes.pm
+++ b/perllib/FixMyStreet/SendReport/EmptyHomes.pm
@@ -28,7 +28,7 @@ sub build_recipient_list {
#$note{$council_email}{$row->category} = $note;
}
- push @{ $self->to }, [ $council_email, $self->councils->{ $council }->{name} ];
+ push @{ $self->to }, [ $council_email, $self->councils->{ $council }->{ info }->{name} ];
$recips{$council_email} = 1;
my $country = $self->councils->{$council}->{country};
diff --git a/perllib/FixMyStreet/SendReport/NI.pm b/perllib/FixMyStreet/SendReport/NI.pm
index 0783a385b..810ee60e2 100644
--- a/perllib/FixMyStreet/SendReport/NI.pm
+++ b/perllib/FixMyStreet/SendReport/NI.pm
@@ -23,7 +23,7 @@ sub build_recipient_list {
$email = 'N/A' unless $email;
}
- my $name = $self->councils->{$council}->{name};
+ my $name = $self->councils->{$council}->{info}->{name};
if ( $email =~ /^roads.([^@]*)\@drdni/ ) {
$name = "Roads Service (\u$1)";
$h->{councils_name} = $name;
diff --git a/perllib/FixMyStreet/SendReport/Open311.pm b/perllib/FixMyStreet/SendReport/Open311.pm
index 42c103b82..93b96ce00 100644
--- a/perllib/FixMyStreet/SendReport/Open311.pm
+++ b/perllib/FixMyStreet/SendReport/Open311.pm
@@ -9,6 +9,9 @@ use FixMyStreet::App;
use mySociety::Config;
use DateTime::Format::W3CDTF;
use Open311;
+use Readonly;
+
+Readonly::Scalar my $COUNCIL_ID_OXFORDSHIRE => 2237;
sub should_skip {
my $self = shift;
@@ -28,13 +31,13 @@ sub send {
my $result = -1;
foreach my $council ( keys %{ $self->councils } ) {
- my $conf = FixMyStreet::App->model("DB::Open311conf")->search( { area_id => $council, endpoint => { '!=', '' } } )->first;
+ my $conf = $self->councils->{$council}->{config};
my $always_send_latlong = 1;
my $send_notpinpointed = 0;
my $use_service_as_deviceid = 0;
- my $basic_desc = 0;
+ my $extended_desc = 1;
# Extra bromley fields
if ( $row->council =~ /2482/ ) {
@@ -64,7 +67,22 @@ sub send {
push @$extra, { name => 'last_name', value => $lastname };
}
- $basic_desc = 1;
+ $extended_desc = 0;
+ }
+
+ # extra Oxfordshire fields: send nearest street, postcode, northing and easting, and the FMS id
+ if ( $row->council =~ /$COUNCIL_ID_OXFORDSHIRE/ ) {
+
+ my $extra = $row->extra;
+ push @$extra, { name => 'external_id', value => $row->id };
+ push @$extra, { name => 'closest_address', value => $h->{closest_address} } if $h->{closest_address};
+ if ( $row->used_map || ( !$row->used_map && !$row->postcode ) ) {
+ push @$extra, { name => 'northing', value => $h->{northing} };
+ push @$extra, { name => 'easting', value => $h->{easting} };
+ }
+ $row->extra( $extra );
+
+ $extended_desc = 'oxfordshire';
}
# FIXME: we've already looked this up before
@@ -81,7 +99,7 @@ sub send {
always_send_latlong => $always_send_latlong,
send_notpinpointed => $send_notpinpointed,
use_service_as_deviceid => $use_service_as_deviceid,
- basic_description => $basic_desc,
+ extended_description => $extended_desc,
);
# non standard west berks end points
@@ -89,21 +107,44 @@ sub send {
$open311->endpoints( { services => 'Services', requests => 'Requests' } );
}
+ # non-standard Oxfordshire endpoint (because it's just a script, not a full Open311 service)
+ if ( $row->council =~ /$COUNCIL_ID_OXFORDSHIRE/ ) {
+ $open311->endpoints( { requests => 'open311_service_request.cgi' } );
+ }
+
# required to get round issues with CRM constraints
if ( $row->council =~ /2218/ ) {
$row->user->name( $row->user->id . ' ' . $row->user->name );
}
+ if ($row->cobrand eq 'fixmybarangay') {
+ # FixMyBarangay endpoints expect external_id as an attribute, as do Oxfordshire
+ $row->extra( [ { 'name' => 'external_id', 'value' => $row->id } ] );
+ }
+
my $resp = $open311->send_service_request( $row, $h, $contact->email );
# make sure we don't save user changes from above
- if ( $row->council =~ /2218/ || $row->council =~ /2482/ ) {
+ if ( $row->council =~ /(2218|2482|$COUNCIL_ID_OXFORDSHIRE)/ || $row->cobrand eq 'fixmybarangay') {
$row->discard_changes();
}
if ( $resp ) {
$row->external_id( $resp );
$row->send_method_used('Open311');
+ if ($row->cobrand eq 'fixmybarangay') {
+ # FixMyBarangay: currently the external bodies using Open311 are DPS, DEPW, DPWH
+ # for now identify the latter two by their name in the service_code ($contact->email)
+ # So: this works because we are anticipating the service codes for (e.g., potholes) look
+ # like this:
+ # POTDEPW or POTDPWH
+ # (TODO: this will change when we have 'body' logic in place, meanwhile: hardcoded)
+ if ($contact->email =~ /(DEPW|DPWH)$/i) {
+ $row->external_body(uc $1); # body is DEPW (city roads) or DPWH (national roads)
+ } else {
+ $row->external_body("DPS"); # only other open311 dept is DPS
+ }
+ }
$result *= 0;
$self->success( 1 );
} else {
diff --git a/perllib/FixMyStreet/TestMech.pm b/perllib/FixMyStreet/TestMech.pm
index 2a49cc2f8..7f81c0fc2 100644
--- a/perllib/FixMyStreet/TestMech.pm
+++ b/perllib/FixMyStreet/TestMech.pm
@@ -378,6 +378,49 @@ sub extract_update_metas {
return \@metas;
}
+=head2 extract_problem_list
+
+ $problems = $mech->extract_problem_list
+
+Returns an array ref of all problem titles on a page featuring standard issue lists
+
+=cut
+
+sub extract_problem_list {
+ my $mech = shift;
+
+ my $result = scraper {
+ process 'ul.issue-list-a li a h4', 'problems[]', 'TEXT';
+ }->scrape( $mech->response );
+
+ return $result->{ problems } || [];
+}
+
+=head2 extract_report_stats
+
+ $stats = $mech->extract_report_stats
+
+Returns a hash ref keyed by council name of all the council stats from the all reports
+page. Each value is an array ref with the first element being the council name and the
+rest being the stats in the order the appear in each row.
+
+=cut
+
+sub extract_report_stats {
+ my $mech = shift;
+
+ my $result = scraper {
+ process 'tr[align=center]', 'councils[]' => scraper {
+ process 'td.title a', 'council', 'TEXT',
+ process 'td', 'stats[]', 'TEXT'
+ }
+ }->scrape( $mech->response );
+
+ my %councils = map { $_->{council} => $_->{stats} } @{ $result->{councils} };
+
+ return \%councils;
+}
+
=head2 visible_form_values
$hashref = $mech->visible_form_values( );
@@ -417,6 +460,7 @@ sub visible_form_values {
grep { ref($_) ne 'HTML::Form::SubmitInput' }
grep { ref($_) ne 'HTML::Form::ImageInput' }
grep { ref($_) ne 'HTML::Form::TextInput' || $_->type ne 'hidden' }
+ grep { !$_->disabled }
$form->inputs;
my @visible_field_names = map { $_->name } @visible_fields;
@@ -475,4 +519,67 @@ sub get_ok_json {
return decode_json( $res->content );
}
+sub delete_problems_for_council {
+ my $mech = shift;
+ my $council = shift;
+
+ my $reports = FixMyStreet::App->model('DB::Problem')->search( { council => $council } );
+ if ( $reports ) {
+ for my $r ( $reports->all ) {
+ $r->comments->delete;
+ }
+ $reports->delete;
+ }
+}
+
+sub create_problems_for_council {
+ my ( $mech, $count, $council, $title, $params ) = @_;
+
+ my $dt = $params->{dt} || DateTime->now();
+
+ my $user = $params->{user} ||
+ FixMyStreet::App->model('DB::User')
+ ->find_or_create( { email => 'test@example.com', name => 'Test User' } );
+
+ delete $params->{user};
+ delete $params->{dt};
+
+ my @problems;
+
+ while ($count) {
+ my $default_params = {
+ postcode => 'SW1A 1AA',
+ council => $council,
+ areas => ',105255,11806,11828,2247,2504,',
+ category => 'Other',
+ title => "$title Test $count for $council",
+ detail => "$title Test $count for $council Detail",
+ used_map => 't',
+ name => 'Test User',
+ anonymous => 'f',
+ state => 'confirmed',
+ confirmed => $dt->ymd . ' ' . $dt->hms,
+ lang => 'en-gb',
+ service => '',
+ cobrand => 'default',
+ cobrand_data => '',
+ send_questionnaire => 't',
+ latitude => '51.5016605453401',
+ longitude => '-0.142497580865087',
+ user_id => $user->id,
+ photo => 1,
+ };
+
+ my %report_params = ( %$default_params, %$params );
+
+ my $problem =
+ FixMyStreet::App->model('DB::Problem')->create( \%report_params );
+
+ push @problems, $problem;
+ $count--;
+ }
+
+ return @problems;
+}
+
1;
diff --git a/perllib/Geo/Coordinates/CH1903.pm b/perllib/Geo/Coordinates/CH1903.pm
new file mode 100644
index 000000000..612182152
--- /dev/null
+++ b/perllib/Geo/Coordinates/CH1903.pm
@@ -0,0 +1,105 @@
+#!/usr/bin/perl
+#
+# Geo::Coordinates::CH1903
+# Conversion between WGS84 and Swiss CH1903.
+#
+# Copyright (c) 2012 UK Citizens Online Democracy. This module is free
+# software; you can redistribute it and/or modify it under the same terms as
+# Perl itself.
+#
+# WWW: http://www.mysociety.org/
+
+package Geo::Coordinates::CH1903;
+
+$Geo::Coordinates::CH1903::VERSION = '1.00';
+
+use strict;
+
+=head1 NAME
+
+Geo::Coordinates::CH1903
+
+=head1 VERSION
+
+1.00
+
+=head1 SYNOPSIS
+
+ use Geo::Coordinates::CH1903;
+
+ my ($lat, $lon) = ...;
+ my ($e, $n) = Geo::Coordinates::CH1903::from_latlon($lat, $lon);
+ my ($lat, $lon) = Geo::Coordinates::CH1903::to_latlon($e, $n);
+
+=head1 FUNCTIONS
+
+=over 4
+
+=cut
+
+sub from_latlon($$) {
+ my ($lat, $lon) = @_;
+
+ $lat *= 3600;
+ $lon *= 3600;
+
+ my $lat_aux = ($lat - 169028.66) / 10000;
+ my $lon_aux = ($lon - 26782.5) / 10000;
+
+ my $x = 600072.37
+ + (211455.93 * $lon_aux)
+ - (10938.51 * $lon_aux * $lat_aux)
+ - (0.36 * $lon_aux * $lat_aux**2)
+ - (44.54 * $lon_aux**3);
+
+ my $y = 200147.07
+ + (308807.95 * $lat_aux)
+ + (3745.25 * $lon_aux**2)
+ + (76.63 * $lat_aux**2)
+ - (194.56 * $lon_aux**2 * $lat_aux)
+ + (119.79 * $lat_aux**3);
+
+ return ($x, $y);
+}
+
+sub to_latlon($$) {
+ my ($x, $y) = @_;
+
+ my $x_aux = ($x - 600000) / 1000000;
+ my $y_aux = ($y - 200000) / 1000000;
+
+ my $lat = 16.9023892
+ + (3.238272 * $y_aux)
+ - (0.270978 * $x_aux**2)
+ - (0.002528 * $y_aux**2)
+ - (0.0447 * $x_aux**2 * $y_aux)
+ - (0.0140 * $y_aux**3);
+
+ my $lon = 2.6779094
+ + (4.728982 * $x_aux)
+ + (0.791484 * $x_aux * $y_aux)
+ + (0.1306 * $x_aux * $y_aux**2)
+ - (0.0436 * $x_aux**3);
+
+ $lat = $lat * 100 / 36;
+ $lon = $lon * 100 / 36;
+
+ return ($lat, $lon);
+}
+
+=head1 AUTHOR AND COPYRIGHT
+
+Maths courtesy of the Swiss Federal Office of Topography:
+http://www.swisstopo.admin.ch/internet/swisstopo/en/home/products/software/products/skripts.html
+
+Written by Matthew Somerville
+
+Copyright (c) UK Citizens Online Democracy.
+
+This module is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=cut
+
+1;
+
diff --git a/perllib/Open311.pm b/perllib/Open311.pm
index a34677a38..dee985fca 100644
--- a/perllib/Open311.pm
+++ b/perllib/Open311.pm
@@ -15,15 +15,16 @@ has test_mode => ( is => 'ro', isa => 'Bool' );
has test_uri_used => ( is => 'rw', 'isa' => 'Str' );
has test_req_used => ( is => 'rw' );
has test_get_returns => ( is => 'rw' );
-has endpoints => ( is => 'rw', default => sub { { services => 'services.xml', requests => 'requests.xml', service_request_updates => 'update.xml', update => 'update.xml' } } );
+has endpoints => ( is => 'rw', default => sub { { services => 'services.xml', requests => 'requests.xml', service_request_updates => 'servicerequestupdates.xml', update => 'servicerequestupdates.xml' } } );
has debug => ( is => 'ro', isa => 'Bool', default => 0 );
has debug_details => ( is => 'rw', 'isa' => 'Str', default => '' );
has success => ( is => 'rw', 'isa' => 'Bool', default => 0 );
has error => ( is => 'rw', 'isa' => 'Str', default => '' );
has always_send_latlong => ( is => 'ro', isa => 'Bool', default => 1 );
has send_notpinpointed => ( is => 'ro', isa => 'Bool', default => 0 );
-has basic_description => ( is => 'ro', isa => 'Bool', default => 0 );
+has extended_description => ( is => 'ro', isa => 'Str', default => 1 );
has use_service_as_deviceid => ( is => 'ro', isa => 'Bool', default => 0 );
+has use_extended_updates => ( is => 'ro', isa => 'Bool', default => 0 );
has extended_statuses => ( is => 'ro', isa => 'Bool', default => 0 );
before [
@@ -79,9 +80,13 @@ sub send_service_request {
}
}
- warn sprintf( "Failed to submit problem %s over Open311, response\n: %s\n%s", $problem->id, $response, $self->debug_details );
- return 0;
+ warn sprintf( "Failed to submit problem %s over Open311, response\n: %s\n%s", $problem->id, $response, $self->debug_details )
+ unless $problem->send_fail_count;
+ } else {
+ warn sprintf( "Failed to submit problem %s over Open311, details:\n%s", $problem->id, $self->error)
+ unless $problem->send_fail_count;
}
+ return 0;
}
sub _populate_service_request_params {
@@ -91,12 +96,12 @@ sub _populate_service_request_params {
my $service_code = shift;
my $description;
- if ( $self->basic_description ) {
- $description = $problem->detail;
- } else {
+ if ( $self->extended_description ) {
$description = $self->_generate_service_request_description(
$problem, $extra
);
+ } else {
+ $description = $problem->detail;
}
my ( $firstname, $lastname ) = ( $problem->user->name =~ /(\w+)\.?\s+(.+)/ );
@@ -164,8 +169,6 @@ sub _generate_service_request_description {
my $extra = shift;
my $description = <<EOT;
-title: @{[$problem->title()]}
-
detail: @{[$problem->detail()]}
url: $extra->{url}
@@ -173,6 +176,12 @@ url: $extra->{url}
Submitted via FixMyStreet
EOT
;
+ if ($self->extended_description ne 'oxfordshire') {
+ $description = <<EOT . $description;
+title: @{[$problem->title()]}
+
+EOT
+ }
return $description;
}
@@ -263,9 +272,13 @@ sub post_service_request_update {
}
}
- warn sprintf( "Failed to submit comment %s over Open311, response - %s\n%s\n", $comment->id, $response, $self->debug_details );
- return 0;
+ warn sprintf( "Failed to submit comment %s over Open311, response - %s\n%s\n", $comment->id, $response, $self->debug_details )
+ unless $comment->send_fail_count;
+ } else {
+ warn sprintf( "Failed to submit comment %s over Open311, details\n%s\n", $comment->id, $self->error)
+ unless $comment->send_fail_count;
}
+ return 0;
}
sub _populate_service_request_update_params {
@@ -303,18 +316,23 @@ sub _populate_service_request_update_params {
}
my $params = {
- update_id_ext => $comment->id,
updated_datetime => DateTime::Format::W3CDTF->format_datetime($comment->confirmed_local->set_nanosecond(0)),
service_request_id => $comment->problem->external_id,
- service_request_id_ext => $comment->problem->id,
status => $status,
email => $comment->user->email,
description => $comment->text,
- public_anonymity_required => $comment->anonymous ? 'TRUE' : 'FALSE',
last_name => $lastname,
first_name => $firstname,
};
+ if ( $self->use_extended_updates ) {
+ $params->{public_anonymity_required} = $comment->anonymous ? 'TRUE' : 'FALSE',
+ $params->{update_id_ext} = $comment->id;
+ $params->{service_request_id_ext} = $comment->problem->id;
+ } else {
+ $params->{update_id} = $comment->id;
+ }
+
if ( $comment->photo ) {
my $cobrand = FixMyStreet::Cobrand->get_class_for_moniker($comment->cobrand)->new();
my $email_base_url = $cobrand->base_url($comment->cobrand_data);
@@ -366,7 +384,11 @@ sub _get {
$self->success(1);
} else {
$self->success(0);
- $self->error( $res->status_line );
+ $self->error( sprintf(
+ "request failed: %s\n%s\n",
+ $res->status_line,
+ $uri->as_string
+ ) );
}
}
@@ -405,13 +427,12 @@ sub _post {
return $res->decoded_content;
} else {
$self->success(0);
- $self->error( sprintf(
+ $self->error( sprintf(
"request failed: %s\nerror: %s\n%s\n",
$res->status_line,
$self->_process_error( $res->decoded_content ),
$self->debug_details
) );
- warn $self->error;
return 0;
}
}
@@ -440,7 +461,7 @@ sub _get_xml_object {
my $obj;
eval {
- $obj = $simple ->XMLin( $xml );
+ $obj = $simple ->parse_string( $xml, ForceArray => [ qr/^key$/, qr/^name$/ ] );
};
return $obj;
diff --git a/perllib/Open311/GetServiceRequestUpdates.pm b/perllib/Open311/GetServiceRequestUpdates.pm
index 99e1d5758..e337c0f57 100644
--- a/perllib/Open311/GetServiceRequestUpdates.pm
+++ b/perllib/Open311/GetServiceRequestUpdates.pm
@@ -10,6 +10,7 @@ has system_user => ( is => 'rw' );
has start_date => ( is => 'ro', default => undef );
has end_date => ( is => 'ro', default => undef );
has suppress_alerts => ( is => 'rw', default => 0 );
+has verbose => ( is => 'ro', default => 0 );
sub fetch {
my $self = shift;
@@ -31,6 +32,13 @@ sub fetch {
jurisdiction => $council->jurisdiction,
);
+ if ( $council->area_id =~ /2482/ ) {
+ my $endpoints = $o->endpoints;
+ $endpoints->{update} = 'update.xml';
+ $endpoints->{service_request_updates} = 'update.xml';
+ $o->endpoints( $endpoints );
+ }
+
$self->suppress_alerts( $council->suppress_alerts );
$self->system_user( $council->comment_user );
$self->update_comments( $o, { areaid => $council->area_id }, );
@@ -47,12 +55,21 @@ sub update_comments {
push @args, $self->start_date;
push @args, $self->end_date;
+ # default to asking for last 2 hours worth if not Bromley
+ } elsif ( $council_details->{areaid} != 2482 ) {
+ my $end_dt = DateTime->now();
+ my $start_dt = $end_dt->clone;
+ $start_dt->add( hours => -2 );
+
+ push @args, DateTime::Format::W3CDTF->format_datetime( $start_dt );
+ push @args, DateTime::Format::W3CDTF->format_datetime( $end_dt );
}
my $requests = $open311->get_service_request_updates( @args );
unless ( $open311->success ) {
- warn "Failed to fetch ServiceRequest Updates: " . $open311->error;
+ warn "Failed to fetch ServiceRequest Updates for " . $council_details->{areaid} . ":\n" . $open311->error
+ if $self->verbose;
return 0;
}
diff --git a/perllib/Open311/PopulateServiceList.pm b/perllib/Open311/PopulateServiceList.pm
index 7b5f4c7fe..e8ae56833 100644
--- a/perllib/Open311/PopulateServiceList.pm
+++ b/perllib/Open311/PopulateServiceList.pm
@@ -21,6 +21,7 @@ sub process_councils {
while ( my $council = $self->council_list->next ) {
next unless $council->endpoint;
+ next unless lc($council->send_method) eq 'open311';
$self->_current_council( $council );
$self->process_council;
}
@@ -40,7 +41,9 @@ sub process_council {
my $list = $open311->get_service_list;
unless ( $list ) {
- warn "ERROR: no service list found for " . $self->_current_council->area_id . "\n";
+ my $id = $self->_current_council->area_id;
+ warn "Council $id - http://mapit.mysociety.org/area/$id.html - did not return a service list\n"
+ if $self->verbose >= 1;
return;
}
$self->process_services( $list );
@@ -82,7 +85,7 @@ sub process_service {
$self->_current_service->{description} :
$self->_current_service->{service_name};
- print $self->_current_service->{service_code} . ': ' . $category . "\n" if $self->verbose;
+ print $self->_current_service->{service_code} . ': ' . $category . "\n" if $self->verbose >= 2;
my $contacts = FixMyStreet::App->model( 'DB::Contact')->search(
{
area_id => $self->_current_council->area_id,
@@ -122,7 +125,7 @@ sub _handle_existing_contact {
my $service_name = $self->_normalize_service_name;
- print $self->_current_council->area_id . " already has a contact for service code " . $self->_current_service->{service_code} . "\n" if $self->verbose;
+ print $self->_current_council->area_id . " already has a contact for service code " . $self->_current_service->{service_code} . "\n" if $self->verbose >= 2;
if ( $contact->deleted || $service_name ne $contact->category || $self->_current_service->{service_code} ne $contact->email ) {
eval {
@@ -140,11 +143,18 @@ sub _handle_existing_contact {
};
if ( $@ ) {
- warn "Failed to update contact for service code " . $self->_current_service->{service_code} . " for council @{[$self->_current_council->area_id]}: $@\n";
+ warn "Failed to update contact for service code " . $self->_current_service->{service_code} . " for council @{[$self->_current_council->area_id]}: $@\n"
+ if $self->verbose >= 1;
return;
}
}
+ if ( $contact and lc( $self->_current_service->{metadata} ) eq 'true' ) {
+ $self->_add_meta_to_contact( $contact );
+ } elsif ( $contact and $contact->extra and lc( $self->_current_service->{metadata} ) eq 'false' ) {
+ $contact->update( { extra => undef } );
+ }
+
push @{ $self->found_contacts }, $self->_current_service->{service_code};
}
@@ -170,7 +180,8 @@ sub _create_contact {
};
if ( $@ ) {
- warn "Failed to create contact for service code " . $self->_current_service->{service_code} . " for council @{[$self->_current_council->area_id]}: $@\n";
+ warn "Failed to create contact for service code " . $self->_current_service->{service_code} . " for council @{[$self->_current_council->area_id]}: $@\n"
+ if $self->verbose >= 1;
return;
}
@@ -180,14 +191,14 @@ sub _create_contact {
if ( $contact ) {
push @{ $self->found_contacts }, $self->_current_service->{service_code};
- print "created contact for service code " . $self->_current_service->{service_code} . " for council @{[$self->_current_council->area_id]}\n" if $self->verbose;
+ print "created contact for service code " . $self->_current_service->{service_code} . " for council @{[$self->_current_council->area_id]}\n" if $self->verbose >= 2;
}
}
sub _add_meta_to_contact {
my ( $self, $contact ) = @_;
- print "Fetching meta data for $self->_current_service->{service_code}\n" if $self->verbose;
+ print "Fetching meta data for $self->_current_service->{service_code}\n" if $self->verbose >= 2;
my $meta_data = $self->_current_open311->get_service_meta_info( $self->_current_service->{service_code} );
if ( ref $meta_data->{ attributes }->{ attribute } eq 'HASH' ) {
@@ -196,6 +207,14 @@ sub _add_meta_to_contact {
];
}
+ if ( ! $meta_data->{attributes}->{attribute} ) {
+ warn sprintf( "Empty meta data for %s at %s",
+ $self->_current_service->{service_code},
+ $self->_current_council->endpoint )
+ if $self->verbose;
+ return;
+ }
+
# turn the data into something a bit more friendly to use
my @meta =
# remove trailing colon as we add this when we display so we don't want 2
diff --git a/perllib/PoChange.pm b/perllib/PoChange.pm
index deecd3b00..f26161889 100644
--- a/perllib/PoChange.pm
+++ b/perllib/PoChange.pm
@@ -3,6 +3,19 @@ use strict;
package PoChange;
+sub translate($$) {
+ my $file = shift;
+ my $s = shift;
+
+ if ( $file eq 'FixMyStreet-EmptyHomes' ) {
+ return fixmystreet_to_reportemptyhomes( $s );
+ } elsif ( $file eq 'FixMyBarangay' ) {
+ return fixmystreet_to_fixmybarangay( $s );
+ }
+
+ return $s;
+}
+
# Takes a msgid from the main FixMyStreet .po file and
# converts it to a msgid for the ReportEmptyHomes .po file
sub fixmystreet_to_reportemptyhomes($) {
@@ -28,11 +41,22 @@ sub fixmystreet_to_reportemptyhomes($) {
$s =~ s/We send it to the council on your behalf/The details will be sent directly to the right person in the local council for them to take action/;
$s =~ s/To find out what local alerts we have for you/To find out what local alerts we have in your area, council or ward/;
$s =~ s/Local alerts/Get local reports/;
- $s =~ s/All reports/Reports/;
$s =~ s/Report an empty property/Report a property/;
$s =~ s/Help/FAQs/;
return $s;
}
+sub fixmystreet_to_fixmybarangay($) {
+ my $s = shift;
+
+ $s =~ s/FixMyStreet/FixMyBarangay/g;
+ $s =~ s/\bcouncil\b/barangay/g;
+ $s =~ s/\bCouncil\b/Barangay/g;
+ $s =~ s/\bcouncils\b/barangays/g;
+ $s =~ s/\bCouncils\b/Barangays/g;
+
+ return $s;
+}
+
1;
diff --git a/perllib/Utils.pm b/perllib/Utils.pm
index 6a47fd17d..fa90620a0 100644
--- a/perllib/Utils.pm
+++ b/perllib/Utils.pm
@@ -12,31 +12,13 @@
package Utils;
use strict;
+use DateTime;
use Encode;
use File::Slurp qw();
-use POSIX qw(strftime);
use mySociety::DBHandle qw(dbh);
use mySociety::GeoUtil;
use mySociety::Locale;
-sub workaround_pg_bytea {
- my ( $st, $img_idx, @elements ) = @_;
- my $s = dbh()->prepare($st);
- for ( my $i = 1 ; $i <= @elements ; $i++ ) {
- if ( $i == $img_idx ) {
- $s->bind_param(
- $i,
- $elements[ $i - 1 ],
- { pg_type => DBD::Pg::PG_BYTEA }
- );
- }
- else {
- $s->bind_param( $i, $elements[ $i - 1 ] );
- }
- }
- $s->execute();
-}
-
=head2 convert_latlon_to_en
( $easting, $northing ) = Utils::convert_en_to_latlon( $latitude, $longitude );
@@ -144,22 +126,10 @@ sub barnet_categories {
# The values here are KBIDs from Barnet's system: see bin/send-reports for formatting
if (mySociety::Config::get('STAGING_SITE')) { # note staging site must use different KBIDs
return {
- 'Blocked drain' => 255, # Gullies-Blocked
- 'Dead animal' => 286, # Animals-Dead-Removal
- 'Dog fouling' => 288, # Dog Fouling-Clear
- 'Fly tipping' => 347, # Fly tipping-Clear
- 'Graffiti' => 292, # Graffiti-Removal
- 'Litter, accumulated' => 349, # Accumulated Litter
- 'Litter, overflowing bins' => 205, # Litter Bins-Overflowing
- 'Pavements' => 195, # Pavements-Damaged/Cracked
- 'Pothole' => 204, # Pothole
- 'Roads Signs' => 432, # Roads Signs - Maintenance
- 'Street Lighting' => 251, # Street Lighting
- 'Traffic Lights' => 103, # Traffic Lights
+ 'Street scene misc' => 14 # for test
}
} else {
return {
- 'Abandoned Vehicle' => 468,
'Accumulated Litter' => 349,
'Dog Bin' => 203,
'Dog Fouling' => 288,
@@ -252,25 +222,33 @@ sub cleanup_text {
}
sub prettify_epoch {
- my ( $s, $type ) = @_;
+ my ( $epoch, $type ) = @_;
+ $type ||= '';
$type = 'short' if $type eq '1';
- my @s = localtime($s);
+ my $dt = DateTime->from_epoch( epoch => $epoch, time_zone => 'local' );
+ $dt->set_time_zone( FixMyStreet->config('TIME_ZONE') )
+ if FixMyStreet->config('TIME_ZONE');
+
+ my $now = DateTime->now( time_zone => 'local' );
+ $now->set_time_zone( FixMyStreet->config('TIME_ZONE') )
+ if FixMyStreet->config('TIME_ZONE');
+
my $tt = '';
- $tt = strftime('%H:%M', @s) unless $type eq 'date';
- my @t = localtime();
- if (strftime('%Y%m%d', @s) eq strftime('%Y%m%d', @t)) {
+ $tt = $dt->strftime('%H:%M') unless $type eq 'date';
+
+ if ($dt->strftime('%Y%m%d') eq $now->strftime('%Y%m%d')) {
return "$tt " . _('today');
}
$tt .= ', ' unless $type eq 'date';
- if (strftime('%Y %U', @s) eq strftime('%Y %U', @t)) {
- $tt .= decode_utf8(strftime('%A', @s));
+ if ($dt->strftime('%Y %U') eq $now->strftime('%Y %U')) {
+ $tt .= decode_utf8($dt->strftime('%A'));
} elsif ($type eq 'short') {
- $tt .= decode_utf8(strftime('%e %b %Y', @s));
- } elsif (strftime('%Y', @s) eq strftime('%Y', @t)) {
- $tt .= decode_utf8(strftime('%A %e %B %Y', @s));
+ $tt .= decode_utf8($dt->strftime('%e %b %Y'));
+ } elsif ($dt->strftime('%Y') eq $now->strftime('%Y')) {
+ $tt .= decode_utf8($dt->strftime('%A %e %B %Y'));
} else {
- $tt .= decode_utf8(strftime('%a %e %B %Y', @s));
+ $tt .= decode_utf8($dt->strftime('%a %e %B %Y'));
}
return $tt;
}
@@ -289,17 +267,27 @@ sub prettify_duration {
return _('less than a minute') if $s == 0;
}
my @out = ();
- _part(\$s, 60*60*24*7, _('%d week'), _('%d weeks'), \@out);
- _part(\$s, 60*60*24, _('%d day'), _('%d days'), \@out);
- _part(\$s, 60*60, _('%d hour'), _('%d hours'), \@out);
- _part(\$s, 60, _('%d minute'), _('%d minutes'), \@out);
+ _part(\$s, 60*60*24*7, \@out);
+ _part(\$s, 60*60*24, \@out);
+ _part(\$s, 60*60, \@out);
+ _part(\$s, 60, \@out);
return join(', ', @out);
}
sub _part {
- my ($s, $m, $w1, $w2, $o) = @_;
+ my ($s, $m, $o) = @_;
if ($$s >= $m) {
my $i = int($$s / $m);
- push @$o, sprintf(mySociety::Locale::nget($w1, $w2, $i), $i);
+ my $str;
+ if ($m == 60*60*24*7) {
+ $str = mySociety::Locale::nget("%d week", "%d weeks", $i);
+ } elsif ($m == 60*60*24) {
+ $str = mySociety::Locale::nget("%d day", "%d days", $i);
+ } elsif ($m == 60*60) {
+ $str = mySociety::Locale::nget("%d hour", "%d hours", $i);
+ } elsif ($m == 60) {
+ $str = mySociety::Locale::nget("%d minute", "%d minutes", $i);
+ }
+ push @$o, sprintf($str, $i);
$$s -= $i * $m;
}
}
diff --git a/phonegap/Android/.classpath b/phonegap/Android/.classpath
index 075ed1757..e088a5d5b 100644
--- a/phonegap/Android/.classpath
+++ b/phonegap/Android/.classpath
@@ -4,6 +4,6 @@
<classpathentry kind="src" path="gen"/>
<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
- <classpathentry kind="lib" path="libs/cordova-1.8.0.jar"/>
+ <classpathentry kind="lib" path="libs/cordova-2.1.0.jar"/>
<classpathentry kind="output" path="bin/classes"/>
</classpath>
diff --git a/phonegap/Android/AndroidManifest.xml b/phonegap/Android/AndroidManifest.xml
index b9540ffbe..8e7f49994 100644
--- a/phonegap/Android/AndroidManifest.xml
+++ b/phonegap/Android/AndroidManifest.xml
@@ -4,7 +4,16 @@
android:versionCode="1"
android:versionName="1.0" >
- <uses-sdk android:minSdkVersion="10" />
+ <uses-sdk
+ android:minSdkVersion="7"
+ android:targetSdkVersion="15" />
+
+ <supports-screens
+ android:largeScreens="true"
+ android:normalScreens="true"
+ android:smallScreens="true"
+ android:resizeable="true"
+ android:anyDensity="true" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/>
@@ -15,10 +24,12 @@
<application
android:icon="@drawable/ic_launcher"
- android:label="@string/app_name">
+ android:label="@string/app_name"
+ android:theme="@style/AppTheme" >
<activity
android:name=".AndroidActivity"
- android:label="@string/app_name" >
+ android:label="@string/title_activity_main"
+ android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
diff --git a/phonegap/Android/gen/org/mysociety/FixMyStreet/R.java b/phonegap/Android/gen/org/mysociety/FixMyStreet/R.java
index adcacc076..9dd2e6d98 100644
--- a/phonegap/Android/gen/org/mysociety/FixMyStreet/R.java
+++ b/phonegap/Android/gen/org/mysociety/FixMyStreet/R.java
@@ -11,17 +11,28 @@ public final class R {
public static final class attr {
}
public static final class drawable {
- public static final int ic_launcher=0x7f020000;
+ public static final int ic_action_search=0x7f020000;
+ public static final int ic_launcher=0x7f020001;
+ }
+ public static final class id {
+ public static final int menu_settings=0x7f080000;
}
public static final class layout {
- public static final int main=0x7f030000;
+ public static final int activity_main=0x7f030000;
+ }
+ public static final class menu {
+ public static final int activity_main=0x7f070000;
}
public static final class string {
- public static final int app_name=0x7f050001;
- public static final int hello=0x7f050000;
+ public static final int app_name=0x7f050000;
+ public static final int hello=0x7f050001;
+ public static final int menu_settings=0x7f050002;
+ public static final int title_activity_main=0x7f050003;
+ }
+ public static final class style {
+ public static final int AppTheme=0x7f060000;
}
public static final class xml {
- public static final int cordova=0x7f040000;
- public static final int plugins=0x7f040001;
+ public static final int config=0x7f040000;
}
}
diff --git a/phonegap/Android/libs/cordova-1.8.0.jar b/phonegap/Android/libs/cordova-1.8.0.jar
deleted file mode 100755
index 326fa8392..000000000
--- a/phonegap/Android/libs/cordova-1.8.0.jar
+++ /dev/null
Binary files differ
diff --git a/phonegap/Android/libs/cordova-2.1.0.jar b/phonegap/Android/libs/cordova-2.1.0.jar
new file mode 100644
index 000000000..d3eecaaaf
--- /dev/null
+++ b/phonegap/Android/libs/cordova-2.1.0.jar
Binary files differ
diff --git a/phonegap/Android/proguard-project.txt b/phonegap/Android/proguard-project.txt
new file mode 100644
index 000000000..f2fe1559a
--- /dev/null
+++ b/phonegap/Android/proguard-project.txt
@@ -0,0 +1,20 @@
+# To enable ProGuard in your project, edit project.properties
+# to define the proguard.config property as described in that file.
+#
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in ${sdk.dir}/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the ProGuard
+# include property in project.properties.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
diff --git a/phonegap/Android/proguard.cfg b/phonegap/Android/proguard.cfg
deleted file mode 100644
index b1cdf17b5..000000000
--- a/phonegap/Android/proguard.cfg
+++ /dev/null
@@ -1,40 +0,0 @@
--optimizationpasses 5
--dontusemixedcaseclassnames
--dontskipnonpubliclibraryclasses
--dontpreverify
--verbose
--optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
-
--keep public class * extends android.app.Activity
--keep public class * extends android.app.Application
--keep public class * extends android.app.Service
--keep public class * extends android.content.BroadcastReceiver
--keep public class * extends android.content.ContentProvider
--keep public class * extends android.app.backup.BackupAgentHelper
--keep public class * extends android.preference.Preference
--keep public class com.android.vending.licensing.ILicensingService
-
--keepclasseswithmembernames class * {
- native <methods>;
-}
-
--keepclasseswithmembers class * {
- public <init>(android.content.Context, android.util.AttributeSet);
-}
-
--keepclasseswithmembers class * {
- public <init>(android.content.Context, android.util.AttributeSet, int);
-}
-
--keepclassmembers class * extends android.app.Activity {
- public void *(android.view.View);
-}
-
--keepclassmembers enum * {
- public static **[] values();
- public static ** valueOf(java.lang.String);
-}
-
--keep class * implements android.os.Parcelable {
- public static final android.os.Parcelable$Creator *;
-}
diff --git a/phonegap/Android/project.properties b/phonegap/Android/project.properties
index f049142c1..9b84a6b4b 100644
--- a/phonegap/Android/project.properties
+++ b/phonegap/Android/project.properties
@@ -3,9 +3,12 @@
#
# This file must be checked in Version Control Systems.
#
-# To customize properties used by the Ant build system use,
+# To customize properties used by the Ant build system edit
# "ant.properties", and override values to adapt the script to your
# project structure.
+#
+# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
+#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
# Project target.
-target=android-10
+target=android-16
diff --git a/phonegap/Android/res/drawable-hdpi/ic_action_search.png b/phonegap/Android/res/drawable-hdpi/ic_action_search.png
new file mode 100644
index 000000000..67de12dec
--- /dev/null
+++ b/phonegap/Android/res/drawable-hdpi/ic_action_search.png
Binary files differ
diff --git a/phonegap/Android/res/drawable-hdpi/ic_launcher.png b/phonegap/Android/res/drawable-hdpi/ic_launcher.png
index 8074c4c57..a301d5795 100644
--- a/phonegap/Android/res/drawable-hdpi/ic_launcher.png
+++ b/phonegap/Android/res/drawable-hdpi/ic_launcher.png
Binary files differ
diff --git a/phonegap/Android/res/drawable-ldpi/ic_launcher.png b/phonegap/Android/res/drawable-ldpi/ic_launcher.png
index 1095584ec..2c2a58b2f 100644
--- a/phonegap/Android/res/drawable-ldpi/ic_launcher.png
+++ b/phonegap/Android/res/drawable-ldpi/ic_launcher.png
Binary files differ
diff --git a/phonegap/Android/res/drawable-mdpi/ic_action_search.png b/phonegap/Android/res/drawable-mdpi/ic_action_search.png
new file mode 100644
index 000000000..134d5490b
--- /dev/null
+++ b/phonegap/Android/res/drawable-mdpi/ic_action_search.png
Binary files differ
diff --git a/phonegap/Android/res/drawable-mdpi/ic_launcher.png b/phonegap/Android/res/drawable-mdpi/ic_launcher.png
index a07c69fa5..f91f736fe 100644
--- a/phonegap/Android/res/drawable-mdpi/ic_launcher.png
+++ b/phonegap/Android/res/drawable-mdpi/ic_launcher.png
Binary files differ
diff --git a/phonegap/Android/res/drawable-xhdpi/ic_action_search.png b/phonegap/Android/res/drawable-xhdpi/ic_action_search.png
new file mode 100644
index 000000000..d699c6b37
--- /dev/null
+++ b/phonegap/Android/res/drawable-xhdpi/ic_action_search.png
Binary files differ
diff --git a/phonegap/Android/res/drawable-xhdpi/ic_launcher.png b/phonegap/Android/res/drawable-xhdpi/ic_launcher.png
new file mode 100644
index 000000000..96095ec84
--- /dev/null
+++ b/phonegap/Android/res/drawable-xhdpi/ic_launcher.png
Binary files differ
diff --git a/phonegap/Android/res/layout/activity_main.xml b/phonegap/Android/res/layout/activity_main.xml
new file mode 100644
index 000000000..0b4ffccc1
--- /dev/null
+++ b/phonegap/Android/res/layout/activity_main.xml
@@ -0,0 +1,14 @@
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" >
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_centerHorizontal="true"
+ android:layout_centerVertical="true"
+ android:text="@string/hello"
+ tools:context=".MainActivity" />
+
+</RelativeLayout>
diff --git a/phonegap/Android/res/layout/main.xml b/phonegap/Android/res/layout/main.xml
deleted file mode 100644
index bc12cd823..000000000
--- a/phonegap/Android/res/layout/main.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="vertical" >
-
- <TextView
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="@string/hello" />
-
-</LinearLayout> \ No newline at end of file
diff --git a/phonegap/Android/res/menu/activity_main.xml b/phonegap/Android/res/menu/activity_main.xml
new file mode 100644
index 000000000..cfc10fd52
--- /dev/null
+++ b/phonegap/Android/res/menu/activity_main.xml
@@ -0,0 +1,6 @@
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:id="@+id/menu_settings"
+ android:title="@string/menu_settings"
+ android:orderInCategory="100"
+ android:showAsAction="never" />
+</menu>
diff --git a/phonegap/Android/res/values-v11/styles.xml b/phonegap/Android/res/values-v11/styles.xml
new file mode 100644
index 000000000..d408cbc37
--- /dev/null
+++ b/phonegap/Android/res/values-v11/styles.xml
@@ -0,0 +1,5 @@
+<resources>
+
+ <style name="AppTheme" parent="android:Theme.Holo.Light" />
+
+</resources> \ No newline at end of file
diff --git a/phonegap/Android/res/values-v14/styles.xml b/phonegap/Android/res/values-v14/styles.xml
new file mode 100644
index 000000000..1c089a788
--- /dev/null
+++ b/phonegap/Android/res/values-v14/styles.xml
@@ -0,0 +1,5 @@
+<resources>
+
+ <style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar" />
+
+</resources> \ No newline at end of file
diff --git a/phonegap/Android/res/values/strings.xml b/phonegap/Android/res/values/strings.xml
index a4df04a14..6e091cf98 100644
--- a/phonegap/Android/res/values/strings.xml
+++ b/phonegap/Android/res/values/strings.xml
@@ -3,5 +3,7 @@
<string name="hello">Hello World, AndroidActivity!</string>
<string name="app_name">FixMyStreet</string>
+ <string name="menu_settings">Settings</string>
+ <string name="title_activity_main">AndroidActivity</string>
</resources> \ No newline at end of file
diff --git a/phonegap/Android/res/xml/plugins.xml b/phonegap/Android/res/xml/config.xml
index 76879a1ce..4a6fffccb 100644
--- a/phonegap/Android/res/xml/plugins.xml
+++ b/phonegap/Android/res/xml/config.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<!--
+<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
@@ -17,6 +17,21 @@
specific language governing permissions and limitations
under the License.
-->
+<cordova>
+ <!--
+ access elements control the Android whitelist.
+ Domains are assumed blocked unless set otherwise
+ -->
+
+ <access origin="http://127.0.0.1*"/> <!-- allow local pages -->
+
+ <!-- <access origin="https://example.com" /> allow any secure requests to example.com -->
+ <!-- <access origin="https://example.com" subdomains="true" /> such as above, but including subdomains, such as www -->
+ <access origin=".*"/>
+
+ <log level="DEBUG"/>
+ <preference name="useBrowserHistory" value="false" />
+ <preference name="exit-on-suspend" value="false" />
<plugins>
<plugin name="App" value="org.apache.cordova.App"/>
<plugin name="Geolocation" value="org.apache.cordova.GeoBroker"/>
@@ -35,4 +50,7 @@
<plugin name="Capture" value="org.apache.cordova.Capture"/>
<plugin name="Battery" value="org.apache.cordova.BatteryListener"/>
<plugin name="SplashScreen" value="org.apache.cordova.SplashScreen"/>
+ <plugin name="Echo" value="org.apache.cordova.Echo" />
</plugins>
+</cordova>
+
diff --git a/phonegap/Android/res/xml/cordova.xml b/phonegap/Android/res/xml/cordova.xml
deleted file mode 100644
index c7b500003..000000000
--- a/phonegap/Android/res/xml/cordova.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<cordova>
- <access origin="http://127.0.0.1*"/>
- <log level="DEBUG"/>
-</cordova>
diff --git a/phonegap/iPhone/Default-568h@2x.png b/phonegap/iPhone/Default-568h@2x.png
new file mode 100644
index 000000000..0891b7aab
--- /dev/null
+++ b/phonegap/iPhone/Default-568h@2x.png
Binary files differ
diff --git a/phonegap/iPhone/FixMyStreet.xcodeproj/project.pbxproj b/phonegap/iPhone/FixMyStreet.xcodeproj/project.pbxproj
index 9dea27891..9ab180b40 100644
--- a/phonegap/iPhone/FixMyStreet.xcodeproj/project.pbxproj
+++ b/phonegap/iPhone/FixMyStreet.xcodeproj/project.pbxproj
@@ -7,6 +7,9 @@
objects = {
/* Begin PBXBuildFile section */
+ 24065F8D162C7721004574A1 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 24065F8C162C7721004574A1 /* Default-568h@2x.png */; };
+ 249ED5EB162D82AD000076A1 /* cordova in Resources */ = {isa = PBXBuildFile; fileRef = 249ED5EA162D82AD000076A1 /* cordova */; };
+ 249ED5EC162D83BA000076A1 /* libCordova.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 240FE2F1162D6E4D00250E2D /* libCordova.a */; };
24D3BF4C1508D60F005923FE /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 24D3BF4B1508D60F005923FE /* Foundation.framework */; };
24D3BF4E1508D60F005923FE /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 24D3BF4D1508D60F005923FE /* UIKit.framework */; };
24D3BF501508D60F005923FE /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 24D3BF4F1508D60F005923FE /* CoreGraphics.framework */; };
@@ -22,7 +25,6 @@
24D3BF641508D60F005923FE /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 24D3BF631508D60F005923FE /* CoreMedia.framework */; };
24D3BF6A1508D60F005923FE /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 24D3BF681508D60F005923FE /* InfoPlist.strings */; };
24D3BF6C1508D60F005923FE /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 24D3BF6B1508D60F005923FE /* main.m */; };
- 24D3BF6F1508D60F005923FE /* Cordova.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 24D3BF6E1508D60F005923FE /* Cordova.framework */; };
24D3BF741508D60F005923FE /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 24D3BF721508D60F005923FE /* Localizable.strings */; };
24D3BF781508D60F005923FE /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 24D3BF761508D60F005923FE /* Localizable.strings */; };
24D3BF7C1508D60F005923FE /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 24D3BF7A1508D60F005923FE /* Localizable.strings */; };
@@ -37,11 +39,30 @@
24D3BF941508D60F005923FE /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 24D3BF931508D60F005923FE /* AppDelegate.m */; };
24D3BF971508D60F005923FE /* MainViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 24D3BF961508D60F005923FE /* MainViewController.m */; };
24D3BF991508D60F005923FE /* MainViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 24D3BF981508D60F005923FE /* MainViewController.xib */; };
- 24D3BF9D1508D60F005923FE /* verify.sh in Resources */ = {isa = PBXBuildFile; fileRef = 24D3BF9C1508D60F005923FE /* verify.sh */; };
24E16541150E0F9600F31308 /* www in Resources */ = {isa = PBXBuildFile; fileRef = 24E16540150E0F9600F31308 /* www */; };
/* End PBXBuildFile section */
+/* Begin PBXContainerItemProxy section */
+ 240FE2F0162D6E4D00250E2D /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 240FE2E9162D6E4D00250E2D /* CordovaLib.xcodeproj */;
+ proxyType = 2;
+ remoteGlobalIDString = 68A32D7114102E1C006B237C;
+ remoteInfo = CordovaLib;
+ };
+ 249ED5DC162D7057000076A1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 240FE2E9162D6E4D00250E2D /* CordovaLib.xcodeproj */;
+ proxyType = 1;
+ remoteGlobalIDString = D2AAC07D0554694100DB518D;
+ remoteInfo = CordovaLib;
+ };
+/* End PBXContainerItemProxy section */
+
/* Begin PBXFileReference section */
+ 24065F8C162C7721004574A1 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = "<group>"; };
+ 240FE2E9162D6E4D00250E2D /* CordovaLib.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = CordovaLib.xcodeproj; path = ../../../../../libs/cordova_2.1/lib/ios/CordovaLib/CordovaLib.xcodeproj; sourceTree = "<group>"; };
+ 249ED5EA162D82AD000076A1 /* cordova */ = {isa = PBXFileReference; lastKnownFileType = folder; path = cordova; sourceTree = "<group>"; };
24D3BF471508D60F005923FE /* FixMyStreet.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = FixMyStreet.app; sourceTree = BUILT_PRODUCTS_DIR; };
24D3BF4B1508D60F005923FE /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
24D3BF4D1508D60F005923FE /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
@@ -60,7 +81,6 @@
24D3BF691508D60F005923FE /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
24D3BF6B1508D60F005923FE /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
24D3BF6D1508D60F005923FE /* FixMyStreet-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "FixMyStreet-Prefix.pch"; sourceTree = "<group>"; };
- 24D3BF6E1508D60F005923FE /* Cordova.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cordova.framework; path = /Users/Shared/Cordova/Frameworks/Cordova.framework; sourceTree = "<absolute>"; };
24D3BF731508D60F005923FE /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = Resources/en.lproj/Localizable.strings; sourceTree = "<group>"; };
24D3BF771508D60F005923FE /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = Resources/es.lproj/Localizable.strings; sourceTree = "<group>"; };
24D3BF7B1508D60F005923FE /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = Resources/de.lproj/Localizable.strings; sourceTree = "<group>"; };
@@ -78,7 +98,6 @@
24D3BF961508D60F005923FE /* MainViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = MainViewController.m; path = Classes/MainViewController.m; sourceTree = "<group>"; };
24D3BF981508D60F005923FE /* MainViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = MainViewController.xib; path = Classes/MainViewController.xib; sourceTree = "<group>"; };
24D3BF9B1508D60F005923FE /* README */ = {isa = PBXFileReference; lastKnownFileType = text; name = README; path = Plugins/README; sourceTree = "<group>"; };
- 24D3BF9C1508D60F005923FE /* verify.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = verify.sh; sourceTree = "<group>"; };
24E16540150E0F9600F31308 /* www */ = {isa = PBXFileReference; lastKnownFileType = folder; name = www; path = ../www; sourceTree = "<group>"; };
/* End PBXFileReference section */
@@ -87,6 +106,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
+ 249ED5EC162D83BA000076A1 /* libCordova.a in Frameworks */,
24D3BF4C1508D60F005923FE /* Foundation.framework in Frameworks */,
24D3BF4E1508D60F005923FE /* UIKit.framework in Frameworks */,
24D3BF501508D60F005923FE /* CoreGraphics.framework in Frameworks */,
@@ -100,7 +120,6 @@
24D3BF601508D60F005923FE /* SystemConfiguration.framework in Frameworks */,
24D3BF621508D60F005923FE /* MobileCoreServices.framework in Frameworks */,
24D3BF641508D60F005923FE /* CoreMedia.framework in Frameworks */,
- 24D3BF6F1508D60F005923FE /* Cordova.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -114,13 +133,24 @@
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
+ 240FE2EA162D6E4D00250E2D /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 240FE2F1162D6E4D00250E2D /* libCordova.a */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
24D3BF391508D60E005923FE = {
isa = PBXGroup;
children = (
+ 249ED5EA162D82AD000076A1 /* cordova */,
+ 24065F8C162C7721004574A1 /* Default-568h@2x.png */,
24E16540150E0F9600F31308 /* www */,
24D3BF651508D60F005923FE /* FixMyStreet */,
24D3BF4A1508D60F005923FE /* Frameworks */,
24D3BF481508D60F005923FE /* Products */,
+ 240FE2E9162D6E4D00250E2D /* CordovaLib.xcodeproj */,
);
sourceTree = "<group>";
};
@@ -155,7 +185,6 @@
24D3BF651508D60F005923FE /* FixMyStreet */ = {
isa = PBXGroup;
children = (
- 24D3BF6E1508D60F005923FE /* Cordova.framework */,
24D3BF701508D60F005923FE /* Resources */,
24D3BF911508D60F005923FE /* Classes */,
24D3BF9A1508D60F005923FE /* Plugins */,
@@ -173,7 +202,6 @@
24D3BF6D1508D60F005923FE /* FixMyStreet-Prefix.pch */,
24D3BF8F1508D60F005923FE /* Cordova.plist */,
24D3BF981508D60F005923FE /* MainViewController.xib */,
- 24D3BF9C1508D60F005923FE /* verify.sh */,
);
name = "Supporting Files";
sourceTree = "<group>";
@@ -274,11 +302,11 @@
24D3BF421508D60F005923FE /* Resources */,
24D3BF431508D60F005923FE /* Sources */,
24D3BF441508D60F005923FE /* Frameworks */,
- 24D3BF451508D60F005923FE /* ShellScript */,
);
buildRules = (
);
dependencies = (
+ 249ED5DD162D7057000076A1 /* PBXTargetDependency */,
);
name = FixMyStreet;
productName = FixMyStreet;
@@ -291,7 +319,7 @@
24D3BF3B1508D60E005923FE /* Project object */ = {
isa = PBXProject;
attributes = {
- LastUpgradeCheck = 0420;
+ LastUpgradeCheck = 0450;
};
buildConfigurationList = 24D3BF3E1508D60E005923FE /* Build configuration list for PBXProject "FixMyStreet" */;
compatibilityVersion = "Xcode 3.2";
@@ -306,6 +334,12 @@
mainGroup = 24D3BF391508D60E005923FE;
productRefGroup = 24D3BF481508D60F005923FE /* Products */;
projectDirPath = "";
+ projectReferences = (
+ {
+ ProductGroup = 240FE2EA162D6E4D00250E2D /* Products */;
+ ProjectRef = 240FE2E9162D6E4D00250E2D /* CordovaLib.xcodeproj */;
+ },
+ );
projectRoot = "";
targets = (
24D3BF461508D60F005923FE /* FixMyStreet */,
@@ -313,6 +347,16 @@
};
/* End PBXProject section */
+/* Begin PBXReferenceProxy section */
+ 240FE2F1162D6E4D00250E2D /* libCordova.a */ = {
+ isa = PBXReferenceProxy;
+ fileType = archive.ar;
+ path = libCordova.a;
+ remoteRef = 240FE2F0162D6E4D00250E2D /* PBXContainerItemProxy */;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
+/* End PBXReferenceProxy section */
+
/* Begin PBXResourcesBuildPhase section */
24D3BF421508D60F005923FE /* Resources */ = {
isa = PBXResourcesBuildPhase;
@@ -331,29 +375,14 @@
24D3BF8E1508D60F005923FE /* Capture.bundle in Resources */,
24D3BF901508D60F005923FE /* Cordova.plist in Resources */,
24D3BF991508D60F005923FE /* MainViewController.xib in Resources */,
- 24D3BF9D1508D60F005923FE /* verify.sh in Resources */,
24E16541150E0F9600F31308 /* www in Resources */,
+ 24065F8D162C7721004574A1 /* Default-568h@2x.png in Resources */,
+ 249ED5EB162D82AD000076A1 /* cordova in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
-/* Begin PBXShellScriptBuildPhase section */
- 24D3BF451508D60F005923FE /* ShellScript */ = {
- isa = PBXShellScriptBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- inputPaths = (
- );
- outputPaths = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- shellPath = /bin/bash;
- shellScript = "\n\t\t\t\t\t\t\t\tchmod 755 $PROJECT_DIR/$PROJECT_NAME/verify.sh\n\t\t\t\t\t\t\t\t$PROJECT_DIR/$PROJECT_NAME/verify.sh\n\t\t\t\t\t";
- };
-/* End PBXShellScriptBuildPhase section */
-
/* Begin PBXSourcesBuildPhase section */
24D3BF401508D60F005923FE /* Sources */ = {
isa = PBXSourcesBuildPhase;
@@ -374,6 +403,14 @@
};
/* End PBXSourcesBuildPhase section */
+/* Begin PBXTargetDependency section */
+ 249ED5DD162D7057000076A1 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ name = CordovaLib;
+ targetProxy = 249ED5DC162D7057000076A1 /* PBXContainerItemProxy */;
+ };
+/* End PBXTargetDependency section */
+
/* Begin PBXVariantGroup section */
24D3BF681508D60F005923FE /* InfoPlist.strings */ = {
isa = PBXVariantGroup;
@@ -422,10 +459,7 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
- ARCHS = (
- armv6,
- "$(ARCHS_STANDARD_32_BIT)",
- );
+ ARCHS = "$(ARCHS_STANDARD_32_BIT)";
CLANG_ENABLE_OBJC_ARC = NO;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
@@ -437,11 +471,13 @@
"$(inherited)",
);
GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ GCC_THUMB_SUPPORT = NO;
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 3.0;
+ ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
};
name = Debug;
@@ -450,19 +486,18 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
- ARCHS = (
- armv6,
- "$(ARCHS_STANDARD_32_BIT)",
- );
+ ARCHS = "$(ARCHS_STANDARD_32_BIT)";
CLANG_ENABLE_OBJC_ARC = NO;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_THUMB_SUPPORT = NO;
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 3.0;
+ ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
VALIDATE_PRODUCT = YES;
};
@@ -477,11 +512,15 @@
GCC_DYNAMIC_NO_PIC = NO;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "FixMyStreet/FixMyStreet-Prefix.pch";
- GCC_PREPROCESSOR_DEFINITIONS = (
- "DEBUG=1,",
- "CORDOVA_FRAMEWORK=1",
+ GCC_PREPROCESSOR_DEFINITIONS = "DEBUG=1,";
+ GCC_THUMB_SUPPORT = NO;
+ "HEADER_SEARCH_PATHS[arch=*]" = (
+ "\"$(TARGET_BUILD_DIR)/usr/local/lib/include\"",
+ "\"$(OBJROOT)/UninstalledProducts/include\"",
+ "\"$(BUILT_PRODUCTS_DIR)\"",
);
INFOPLIST_FILE = "FixMyStreet/FixMyStreet-Info.plist";
+ IPHONEOS_DEPLOYMENT_TARGET = 4.3;
OTHER_LDFLAGS = (
"-weak_framework",
UIKit,
@@ -491,6 +530,10 @@
CoreMedia,
"-weak_library",
/usr/lib/libSystem.B.dylib,
+ "-Obj-C",
+ "-all_load",
+ "-weak_framework",
+ CoreFoundation,
);
PRODUCT_NAME = "$(TARGET_NAME)";
TARGETED_DEVICE_FAMILY = 1;
@@ -512,7 +555,14 @@
"NDEBUG=1,",
"CORDOVA_FRAMEWORK=1",
);
+ GCC_THUMB_SUPPORT = NO;
+ "HEADER_SEARCH_PATHS[arch=*]" = (
+ "\"$(TARGET_BUILD_DIR)/usr/local/lib/include\"",
+ "\"$(OBJROOT)/UninstalledProducts/include\"",
+ "\"$(BUILT_PRODUCTS_DIR)\"",
+ );
INFOPLIST_FILE = "FixMyStreet/FixMyStreet-Info.plist";
+ IPHONEOS_DEPLOYMENT_TARGET = 4.3;
OTHER_LDFLAGS = (
"-weak_framework",
UIKit,
@@ -522,6 +572,10 @@
CoreMedia,
"-weak_library",
/usr/lib/libSystem.B.dylib,
+ "-Obj-C",
+ "-all_load",
+ "-weak_framework",
+ CoreFoundation,
);
PRODUCT_NAME = "$(TARGET_NAME)";
TARGETED_DEVICE_FAMILY = 1;
diff --git a/phonegap/iPhone/FixMyStreet.xcodeproj/xcuserdata/struan.xcuserdatad/xcschemes/FixMyStreet.xcscheme b/phonegap/iPhone/FixMyStreet.xcodeproj/xcuserdata/struan.xcuserdatad/xcschemes/FixMyStreet.xcscheme
index 1bd90c562..4d631ea26 100644
--- a/phonegap/iPhone/FixMyStreet.xcodeproj/xcuserdata/struan.xcuserdatad/xcschemes/FixMyStreet.xcscheme
+++ b/phonegap/iPhone/FixMyStreet.xcodeproj/xcuserdata/struan.xcuserdatad/xcschemes/FixMyStreet.xcscheme
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
+ LastUpgradeVersion = "0450"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
@@ -22,7 +23,7 @@
</BuildActionEntries>
</BuildAction>
<TestAction
- selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.GDB"
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.GDB"
shouldUseLaunchSchemeArgsEnv = "YES"
buildConfiguration = "Debug">
@@ -39,11 +40,12 @@
</MacroExpansion>
</TestAction>
<LaunchAction
- selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.GDB"
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.GDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
buildConfiguration = "Debug"
+ ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
allowLocationSimulation = "YES">
<BuildableProductRunnable>
diff --git a/phonegap/iPhone/FixMyStreet/Classes/AppDelegate.h b/phonegap/iPhone/FixMyStreet/Classes/AppDelegate.h
index cee4240b1..5c258f148 100644
--- a/phonegap/iPhone/FixMyStreet/Classes/AppDelegate.h
+++ b/phonegap/iPhone/FixMyStreet/Classes/AppDelegate.h
@@ -19,32 +19,27 @@
//
// AppDelegate.h
-// cordova1.8.0
+// tmp_cordova
//
-// Created by Struan Donald on 08/06/2012.
-// Copyright __MyCompanyName__ 2012. All rights reserved.
+// Created by ___FULLUSERNAME___ on ___DATE___.
+// Copyright ___ORGANIZATIONNAME___ ___YEAR___. All rights reserved.
//
#import <UIKit/UIKit.h>
-#ifdef CORDOVA_FRAMEWORK
- #import <Cordova/CDVViewController.h>
-#else
- #import "CDVViewController.h"
-#endif
-
+#import <Cordova/CDVViewController.h>
@interface AppDelegate : NSObject < UIApplicationDelegate > {
}
// invoke string is passed to your app on launch, this is only valid if you
-// edit cordova1.8.0-Info.plist to add a protocol
+// edit tmp_cordova-Info.plist to add a protocol
// a simple tutorial can be found here :
// http://iphonedevelopertips.com/cocoa/launching-your-own-application-via-a-custom-url-scheme.html
-@property (nonatomic, retain) IBOutlet UIWindow* window;
-@property (nonatomic, retain) IBOutlet CDVViewController* viewController;
+@property (nonatomic, strong) IBOutlet UIWindow* window;
+@property (nonatomic, strong) IBOutlet CDVViewController* viewController;
@end
diff --git a/phonegap/iPhone/FixMyStreet/Classes/AppDelegate.m b/phonegap/iPhone/FixMyStreet/Classes/AppDelegate.m
index ad518dc80..b1c862eee 100644
--- a/phonegap/iPhone/FixMyStreet/Classes/AppDelegate.m
+++ b/phonegap/iPhone/FixMyStreet/Classes/AppDelegate.m
@@ -19,22 +19,16 @@
//
// AppDelegate.m
-// cordova1.8.0
+// tmp_cordova
//
-// Created by Struan Donald on 08/06/2012.
-// Copyright __MyCompanyName__ 2012. All rights reserved.
+// Created by ___FULLUSERNAME___ on ___DATE___.
+// Copyright ___ORGANIZATIONNAME___ ___YEAR___. All rights reserved.
//
#import "AppDelegate.h"
#import "MainViewController.h"
-#ifdef CORDOVA_FRAMEWORK
- #import <Cordova/CDVPlugin.h>
- #import <Cordova/CDVURLProtocol.h>
-#else
- #import "CDVPlugin.h"
- #import "CDVURLProtocol.h"
-#endif
+#import <Cordova/CDVPlugin.h>
@implementation AppDelegate
@@ -49,9 +43,8 @@
NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
[cookieStorage setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways];
- [CDVURLProtocol registerURLProtocol];
-
- return [super init];
+ self = [super init];
+ return self;
}
#pragma UIApplicationDelegate implementation
@@ -66,21 +59,20 @@
if (url && [url isKindOfClass:[NSURL class]]) {
invokeString = [url absoluteString];
- NSLog(@"cordova1.8.0 launchOptions = %@", url);
+ NSLog(@"tmp_cordova launchOptions = %@", url);
}
CGRect screenBounds = [[UIScreen mainScreen] bounds];
- self.window = [[[UIWindow alloc] initWithFrame:screenBounds] autorelease];
+ self.window = [[UIWindow alloc] initWithFrame:screenBounds];
self.window.autoresizesSubviews = YES;
- CGRect viewBounds = [[UIScreen mainScreen] applicationFrame];
-
- self.viewController = [[[MainViewController alloc] init] autorelease];
+ self.viewController = [[MainViewController alloc] init];
self.viewController.useSplashScreen = YES;
self.viewController.wwwFolderName = @"www";
self.viewController.startPage = @"index.html";
self.viewController.invokeString = invokeString;
- self.viewController.view.frame = viewBounds;
+
+ // NOTE: To control the view's frame size, override [self.viewController viewWillAppear:] in your view controller.
// check whether the current orientation is supported: if it is, keep it, rather than forcing a rotation
BOOL forceStartupRotation = YES;
@@ -92,30 +84,34 @@
}
if (UIDeviceOrientationIsValidInterfaceOrientation(curDevOrientation)) {
- for (NSNumber *orient in self.viewController.supportedOrientations) {
- if ([orient intValue] == curDevOrientation) {
- forceStartupRotation = NO;
- break;
- }
- }
+ if ([self.viewController supportsOrientation:curDevOrientation]) {
+ forceStartupRotation = NO;
+ }
}
if (forceStartupRotation) {
- NSLog(@"supportedOrientations: %@", self.viewController.supportedOrientations);
- // The first item in the supportedOrientations array is the start orientation (guaranteed to be at least Portrait)
- UIInterfaceOrientation newOrient = [[self.viewController.supportedOrientations objectAtIndex:0] intValue];
+ UIInterfaceOrientation newOrient;
+ if ([self.viewController supportsOrientation:UIInterfaceOrientationPortrait])
+ newOrient = UIInterfaceOrientationPortrait;
+ else if ([self.viewController supportsOrientation:UIInterfaceOrientationLandscapeLeft])
+ newOrient = UIInterfaceOrientationLandscapeLeft;
+ else if ([self.viewController supportsOrientation:UIInterfaceOrientationLandscapeRight])
+ newOrient = UIInterfaceOrientationLandscapeRight;
+ else
+ newOrient = UIInterfaceOrientationPortraitUpsideDown;
+
NSLog(@"AppDelegate forcing status bar to: %d from: %d", newOrient, curDevOrientation);
[[UIApplication sharedApplication] setStatusBarOrientation:newOrient];
}
- [self.window addSubview:self.viewController.view];
+ self.window.rootViewController = self.viewController;
[self.window makeKeyAndVisible];
return YES;
}
// this happens while we are running ( in the background, or from within our own app )
-// only valid if cordova1.8.0-Info.plist specifies a protocol to handle
+// only valid if tmp_cordova-Info.plist specifies a protocol to handle
- (BOOL) application:(UIApplication*)application handleOpenURL:(NSURL*)url
{
if (!url) {
@@ -132,9 +128,11 @@
return YES;
}
-- (void) dealloc
-{
- [super dealloc];
+- (NSUInteger) application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
+{
+ // IPhone doesn't support upside down by default, while the IPad does. Override to allow all orientations always, and let the root view controller decide whats allowed (the supported orientations mask gets intersected).
+ NSUInteger supportedInterfaceOrientations = (1 << UIInterfaceOrientationPortrait) | (1 << UIInterfaceOrientationLandscapeLeft) | (1 << UIInterfaceOrientationLandscapeRight) | (1 << UIInterfaceOrientationPortraitUpsideDown);
+ return supportedInterfaceOrientations;
}
@end
diff --git a/phonegap/iPhone/FixMyStreet/Classes/MainViewController.h b/phonegap/iPhone/FixMyStreet/Classes/MainViewController.h
index 3f48936da..c2b68deb8 100644
--- a/phonegap/iPhone/FixMyStreet/Classes/MainViewController.h
+++ b/phonegap/iPhone/FixMyStreet/Classes/MainViewController.h
@@ -25,11 +25,7 @@
// Copyright __MyCompanyName__ 2012. All rights reserved.
//
-#ifdef CORDOVA_FRAMEWORK
- #import <Cordova/CDVViewController.h>
-#else
- #import "CDVViewController.h"
-#endif
+#import <Cordova/CDVViewController.h>
@interface MainViewController : CDVViewController
diff --git a/phonegap/iPhone/FixMyStreet/Cordova.plist b/phonegap/iPhone/FixMyStreet/Cordova.plist
index 66c06689d..cc71225d2 100644
--- a/phonegap/iPhone/FixMyStreet/Cordova.plist
+++ b/phonegap/iPhone/FixMyStreet/Cordova.plist
@@ -26,10 +26,12 @@
<string>mapit.mysociety.org</string>
<string>*.tile.openstreetmap.org</string>
<string>*.virtualearth.net</string>
- <string>struan.fixmystreet.com</string>
+ <string>struan.fixmystreet.dev.mysociety.org</string>
</array>
<key>Plugins</key>
<dict>
+ <key>Device</key>
+ <string>CDVDevice</string>
<key>Compass</key>
<string>CDVLocation</string>
<key>Accelerometer</key>
diff --git a/phonegap/iPhone/FixMyStreet/verify.sh b/phonegap/iPhone/FixMyStreet/verify.sh
deleted file mode 100755
index 0f6f0373c..000000000
--- a/phonegap/iPhone/FixMyStreet/verify.sh
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/bin/sh
-
-
-if [ ! -d "$PROJECT_DIR/www" ] ; then
- cp -R /Users/Shared/Cordova/Frameworks/Cordova.framework/www "$PROJECT_DIR"
-fi
-# detect www folder reference in project, if missing, print warning
-grep "{isa = PBXFileReference; lastKnownFileType = folder; path = www; sourceTree = \"<group>\"; };" "$PROJECT_DIR/$PROJECT_NAME.xcodeproj/project.pbxproj"
-rc=$?
-if [ $rc != 0 ] ; then
-echo -e "warning: Missing - Add $PROJECT_DIR/www as a folder reference in your project. Just drag and drop the folder into your project, into the Project Navigator of Xcode 4. Make sure you select the second radio-button: 'Create folder references for any added folders' (which will create a blue folder)" 1>&2
-fi \ No newline at end of file
diff --git a/phonegap/iphone_cordova.js b/phonegap/iphone_cordova.js
deleted file mode 100644
index d9cced70f..000000000
--- a/phonegap/iphone_cordova.js
+++ /dev/null
@@ -1,5226 +0,0 @@
-// commit 109b8649b0e98597b147842a6f71999d2f7910f2
-
-// File generated at :: Tue Jun 05 2012 14:10:19 GMT-0700 (PDT)
-
-/*
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
-*/
-
-;(function() {
-
-// file: lib/scripts/require.js
-var require,
- define;
-
-(function () {
- var modules = {};
-
- function build(module) {
- var factory = module.factory;
- module.exports = {};
- delete module.factory;
- factory(require, module.exports, module);
- return module.exports;
- }
-
- require = function (id) {
- if (!modules[id]) {
- throw "module " + id + " not found";
- }
- return modules[id].factory ? build(modules[id]) : modules[id].exports;
- };
-
- define = function (id, factory) {
- if (modules[id]) {
- throw "module " + id + " already defined";
- }
-
- modules[id] = {
- id: id,
- factory: factory
- };
- };
-
- define.remove = function (id) {
- delete modules[id];
- };
-
-})();
-
-//Export for use in node
-if (typeof module === "object" && typeof require === "function") {
- module.exports.require = require;
- module.exports.define = define;
-}
-// file: lib/cordova.js
-define("cordova", function(require, exports, module) {
-var channel = require('cordova/channel');
-
-/**
- * Listen for DOMContentLoaded and notify our channel subscribers.
- */
-document.addEventListener('DOMContentLoaded', function() {
- channel.onDOMContentLoaded.fire();
-}, false);
-if (document.readyState == 'complete' || document.readyState == 'interactive') {
- channel.onDOMContentLoaded.fire();
-}
-
-/**
- * Intercept calls to addEventListener + removeEventListener and handle deviceready,
- * resume, and pause events.
- */
-var m_document_addEventListener = document.addEventListener;
-var m_document_removeEventListener = document.removeEventListener;
-var m_window_addEventListener = window.addEventListener;
-var m_window_removeEventListener = window.removeEventListener;
-
-/**
- * Houses custom event handlers to intercept on document + window event listeners.
- */
-var documentEventHandlers = {},
- windowEventHandlers = {};
-
-document.addEventListener = function(evt, handler, capture) {
- var e = evt.toLowerCase();
- if (typeof documentEventHandlers[e] != 'undefined') {
- if (evt === 'deviceready') {
- documentEventHandlers[e].subscribeOnce(handler);
- } else {
- documentEventHandlers[e].subscribe(handler);
- }
- } else {
- m_document_addEventListener.call(document, evt, handler, capture);
- }
-};
-
-window.addEventListener = function(evt, handler, capture) {
- var e = evt.toLowerCase();
- if (typeof windowEventHandlers[e] != 'undefined') {
- windowEventHandlers[e].subscribe(handler);
- } else {
- m_window_addEventListener.call(window, evt, handler, capture);
- }
-};
-
-document.removeEventListener = function(evt, handler, capture) {
- var e = evt.toLowerCase();
- // If unsubcribing from an event that is handled by a plugin
- if (typeof documentEventHandlers[e] != "undefined") {
- documentEventHandlers[e].unsubscribe(handler);
- } else {
- m_document_removeEventListener.call(document, evt, handler, capture);
- }
-};
-
-window.removeEventListener = function(evt, handler, capture) {
- var e = evt.toLowerCase();
- // If unsubcribing from an event that is handled by a plugin
- if (typeof windowEventHandlers[e] != "undefined") {
- windowEventHandlers[e].unsubscribe(handler);
- } else {
- m_window_removeEventListener.call(window, evt, handler, capture);
- }
-};
-
-function createEvent(type, data) {
- var event = document.createEvent('Events');
- event.initEvent(type, false, false);
- if (data) {
- for (var i in data) {
- if (data.hasOwnProperty(i)) {
- event[i] = data[i];
- }
- }
- }
- return event;
-}
-
-if(typeof window.console === "undefined") {
- window.console = {
- log:function(){}
- };
-}
-
-var cordova = {
- define:define,
- require:require,
- /**
- * Methods to add/remove your own addEventListener hijacking on document + window.
- */
- addWindowEventHandler:function(event, opts) {
- return (windowEventHandlers[event] = channel.create(event, opts));
- },
- addDocumentEventHandler:function(event, opts) {
- return (documentEventHandlers[event] = channel.create(event, opts));
- },
- removeWindowEventHandler:function(event) {
- delete windowEventHandlers[event];
- },
- removeDocumentEventHandler:function(event) {
- delete documentEventHandlers[event];
- },
- /**
- * Retreive original event handlers that were replaced by Cordova
- *
- * @return object
- */
- getOriginalHandlers: function() {
- return {'document': {'addEventListener': m_document_addEventListener, 'removeEventListener': m_document_removeEventListener},
- 'window': {'addEventListener': m_window_addEventListener, 'removeEventListener': m_window_removeEventListener}};
- },
- /**
- * Method to fire event from native code
- */
- fireDocumentEvent: function(type, data) {
- var evt = createEvent(type, data);
- if (typeof documentEventHandlers[type] != 'undefined') {
- documentEventHandlers[type].fire(evt);
- } else {
- document.dispatchEvent(evt);
- }
- },
- fireWindowEvent: function(type, data) {
- var evt = createEvent(type,data);
- if (typeof windowEventHandlers[type] != 'undefined') {
- windowEventHandlers[type].fire(evt);
- } else {
- window.dispatchEvent(evt);
- }
- },
- // TODO: this is Android only; think about how to do this better
- shuttingDown:false,
- UsePolling:false,
- // END TODO
-
- // TODO: iOS only
- // This queue holds the currently executing command and all pending
- // commands executed with cordova.exec().
- commandQueue:[],
- // Indicates if we're currently in the middle of flushing the command
- // queue on the native side.
- commandQueueFlushing:false,
- // END TODO
- /**
- * Plugin callback mechanism.
- */
- callbackId: 0,
- callbacks: {},
- callbackStatus: {
- NO_RESULT: 0,
- OK: 1,
- CLASS_NOT_FOUND_EXCEPTION: 2,
- ILLEGAL_ACCESS_EXCEPTION: 3,
- INSTANTIATION_EXCEPTION: 4,
- MALFORMED_URL_EXCEPTION: 5,
- IO_EXCEPTION: 6,
- INVALID_ACTION: 7,
- JSON_EXCEPTION: 8,
- ERROR: 9
- },
-
- /**
- * Called by native code when returning successful result from an action.
- *
- * @param callbackId
- * @param args
- */
- callbackSuccess: function(callbackId, args) {
- if (cordova.callbacks[callbackId]) {
-
- // If result is to be sent to callback
- if (args.status == cordova.callbackStatus.OK) {
- try {
- if (cordova.callbacks[callbackId].success) {
- cordova.callbacks[callbackId].success(args.message);
- }
- }
- catch (e) {
- console.log("Error in success callback: "+callbackId+" = "+e);
- }
- }
-
- // Clear callback if not expecting any more results
- if (!args.keepCallback) {
- delete cordova.callbacks[callbackId];
- }
- }
- },
-
- /**
- * Called by native code when returning error result from an action.
- *
- * @param callbackId
- * @param args
- */
- callbackError: function(callbackId, args) {
- if (cordova.callbacks[callbackId]) {
- try {
- if (cordova.callbacks[callbackId].fail) {
- cordova.callbacks[callbackId].fail(args.message);
- }
- }
- catch (e) {
- console.log("Error in error callback: "+callbackId+" = "+e);
- }
-
- // Clear callback if not expecting any more results
- if (!args.keepCallback) {
- delete cordova.callbacks[callbackId];
- }
- }
- },
- // TODO: remove in 2.0.
- addPlugin: function(name, obj) {
- console.log("[DEPRECATION NOTICE] window.addPlugin and window.plugins will be removed in version 2.0.");
- if (!window.plugins[name]) {
- window.plugins[name] = obj;
- }
- else {
- console.log("Error: Plugin "+name+" already exists.");
- }
- },
-
- addConstructor: function(func) {
- channel.onCordovaReady.subscribeOnce(function() {
- try {
- func();
- } catch(e) {
- console.log("Failed to run constructor: " + e);
- }
- });
- }
-};
-
-// Register pause, resume and deviceready channels as events on document.
-channel.onPause = cordova.addDocumentEventHandler('pause');
-channel.onResume = cordova.addDocumentEventHandler('resume');
-channel.onDeviceReady = cordova.addDocumentEventHandler('deviceready');
-
-// Adds deprecation warnings to functions of an object (but only logs a message once)
-function deprecateFunctions(obj, objLabel) {
- var newObj = {};
- var logHash = {};
- for (var i in obj) {
- if (obj.hasOwnProperty(i)) {
- if (typeof obj[i] == 'function') {
- newObj[i] = (function(prop){
- var oldFunk = obj[prop];
- var funkId = objLabel + '_' + prop;
- return function() {
- if (!logHash[funkId]) {
- console.log('[DEPRECATION NOTICE] The "' + objLabel + '" global will be removed in version 2.0, please use lowercase "cordova".');
- logHash[funkId] = true;
- }
- oldFunk.apply(obj, arguments);
- };
- })(i);
- } else {
- newObj[i] = (function(prop) { return obj[prop]; })(i);
- }
- }
- }
- return newObj;
-}
-
-/**
- * Legacy variable for plugin support
- * TODO: remove in 2.0.
- */
-if (!window.PhoneGap) {
- window.PhoneGap = deprecateFunctions(cordova, 'PhoneGap');
-}
-if (!window.Cordova) {
- window.Cordova = deprecateFunctions(cordova, 'Cordova');
-}
-
-/**
- * Plugins object
- * TODO: remove in 2.0.
- */
-if (!window.plugins) {
- window.plugins = {};
-}
-
-module.exports = cordova;
-
-});
-
-// file: lib/common/builder.js
-define("cordova/builder", function(require, exports, module) {
-var utils = require('cordova/utils');
-
-function each(objects, func, context) {
- for (var prop in objects) {
- if (objects.hasOwnProperty(prop)) {
- func.apply(context, [objects[prop], prop]);
- }
- }
-}
-
-function include(parent, objects, clobber, merge) {
- each(objects, function (obj, key) {
- try {
- var result = obj.path ? require(obj.path) : {};
-
- if (clobber) {
- // Clobber if it doesn't exist.
- if (typeof parent[key] === 'undefined') {
- parent[key] = result;
- } else if (typeof obj.path !== 'undefined') {
- // If merging, merge properties onto parent, otherwise, clobber.
- if (merge) {
- recursiveMerge(parent[key], result);
- } else {
- parent[key] = result;
- }
- }
- result = parent[key];
- } else {
- // Overwrite if not currently defined.
- if (typeof parent[key] == 'undefined') {
- parent[key] = result;
- } else if (merge && typeof obj.path !== 'undefined') {
- // If merging, merge parent onto result
- recursiveMerge(result, parent[key]);
- parent[key] = result;
- } else {
- // Set result to what already exists, so we can build children into it if they exist.
- result = parent[key];
- }
- }
-
- if (obj.children) {
- include(result, obj.children, clobber, merge);
- }
- } catch(e) {
- utils.alert('Exception building cordova JS globals: ' + e + ' for key "' + key + '"');
- }
- });
-}
-
-/**
- * Merge properties from one object onto another recursively. Properties from
- * the src object will overwrite existing target property.
- *
- * @param target Object to merge properties into.
- * @param src Object to merge properties from.
- */
-function recursiveMerge(target, src) {
- for (var prop in src) {
- if (src.hasOwnProperty(prop)) {
- if (typeof target.prototype !== 'undefined' && target.prototype.constructor === target) {
- // If the target object is a constructor override off prototype.
- target.prototype[prop] = src[prop];
- } else {
- target[prop] = typeof src[prop] === 'object' ? recursiveMerge(
- target[prop], src[prop]) : src[prop];
- }
- }
- }
- return target;
-}
-
-module.exports = {
- build: function (objects) {
- return {
- intoButDontClobber: function (target) {
- include(target, objects, false, false);
- },
- intoAndClobber: function(target) {
- include(target, objects, true, false);
- },
- intoAndMerge: function(target) {
- include(target, objects, true, true);
- }
- };
- }
-};
-
-});
-
-// file: lib/common/channel.js
-define("cordova/channel", function(require, exports, module) {
-var utils = require('cordova/utils');
-
-/**
- * Custom pub-sub "channel" that can have functions subscribed to it
- * This object is used to define and control firing of events for
- * cordova initialization.
- *
- * The order of events during page load and Cordova startup is as follows:
- *
- * onDOMContentLoaded Internal event that is received when the web page is loaded and parsed.
- * onNativeReady Internal event that indicates the Cordova native side is ready.
- * onCordovaReady Internal event fired when all Cordova JavaScript objects have been created.
- * onCordovaInfoReady Internal event fired when device properties are available.
- * onCordovaConnectionReady Internal event fired when the connection property has been set.
- * onDeviceReady User event fired to indicate that Cordova is ready
- * onResume User event fired to indicate a start/resume lifecycle event
- * onPause User event fired to indicate a pause lifecycle event
- * onDestroy Internal event fired when app is being destroyed (User should use window.onunload event, not this one).
- *
- * The only Cordova events that user code should register for are:
- * deviceready Cordova native code is initialized and Cordova APIs can be called from JavaScript
- * pause App has moved to background
- * resume App has returned to foreground
- *
- * Listeners can be registered as:
- * document.addEventListener("deviceready", myDeviceReadyListener, false);
- * document.addEventListener("resume", myResumeListener, false);
- * document.addEventListener("pause", myPauseListener, false);
- *
- * The DOM lifecycle events should be used for saving and restoring state
- * window.onload
- * window.onunload
- *
- */
-
-/**
- * Channel
- * @constructor
- * @param type String the channel name
- * @param opts Object options to pass into the channel, currently
- * supports:
- * onSubscribe: callback that fires when
- * something subscribes to the Channel. Sets
- * context to the Channel.
- * onUnsubscribe: callback that fires when
- * something unsubscribes to the Channel. Sets
- * context to the Channel.
- */
-var Channel = function(type, opts) {
- this.type = type;
- this.handlers = {};
- this.numHandlers = 0;
- this.guid = 1;
- this.fired = false;
- this.enabled = true;
- this.events = {
- onSubscribe:null,
- onUnsubscribe:null
- };
- if (opts) {
- if (opts.onSubscribe) this.events.onSubscribe = opts.onSubscribe;
- if (opts.onUnsubscribe) this.events.onUnsubscribe = opts.onUnsubscribe;
- }
-},
- channel = {
- /**
- * Calls the provided function only after all of the channels specified
- * have been fired.
- */
- join: function (h, c) {
- var i = c.length;
- var len = i;
- var f = function() {
- if (!(--i)) h();
- };
- for (var j=0; j<len; j++) {
- !c[j].fired?c[j].subscribeOnce(f):i--;
- }
- if (!i) h();
- },
- create: function (type, opts) {
- channel[type] = new Channel(type, opts);
- return channel[type];
- },
-
- /**
- * cordova Channels that must fire before "deviceready" is fired.
- */
- deviceReadyChannelsArray: [],
- deviceReadyChannelsMap: {},
-
- /**
- * Indicate that a feature needs to be initialized before it is ready to be used.
- * This holds up Cordova's "deviceready" event until the feature has been initialized
- * and Cordova.initComplete(feature) is called.
- *
- * @param feature {String} The unique feature name
- */
- waitForInitialization: function(feature) {
- if (feature) {
- var c = null;
- if (this[feature]) {
- c = this[feature];
- }
- else {
- c = this.create(feature);
- }
- this.deviceReadyChannelsMap[feature] = c;
- this.deviceReadyChannelsArray.push(c);
- }
- },
-
- /**
- * Indicate that initialization code has completed and the feature is ready to be used.
- *
- * @param feature {String} The unique feature name
- */
- initializationComplete: function(feature) {
- var c = this.deviceReadyChannelsMap[feature];
- if (c) {
- c.fire();
- }
- }
- };
-
-function forceFunction(f) {
- if (f === null || f === undefined || typeof f != 'function') throw "Function required as first argument!";
-}
-
-/**
- * Subscribes the given function to the channel. Any time that
- * Channel.fire is called so too will the function.
- * Optionally specify an execution context for the function
- * and a guid that can be used to stop subscribing to the channel.
- * Returns the guid.
- */
-Channel.prototype.subscribe = function(f, c, g) {
- // need a function to call
- forceFunction(f);
-
- var func = f;
- if (typeof c == "object") { func = utils.close(c, f); }
-
- g = g || func.observer_guid || f.observer_guid;
- if (!g) {
- // first time we've seen this subscriber
- g = this.guid++;
- }
- else {
- // subscriber already handled; dont set it twice
- return g;
- }
- func.observer_guid = g;
- f.observer_guid = g;
- this.handlers[g] = func;
- this.numHandlers++;
- if (this.events.onSubscribe) this.events.onSubscribe.call(this);
- if (this.fired) func.call(this);
- return g;
-};
-
-/**
- * Like subscribe but the function is only called once and then it
- * auto-unsubscribes itself.
- */
-Channel.prototype.subscribeOnce = function(f, c) {
- // need a function to call
- forceFunction(f);
-
- var g = null;
- var _this = this;
- var m = function() {
- f.apply(c || null, arguments);
- _this.unsubscribe(g);
- };
- if (this.fired) {
- if (typeof c == "object") { f = utils.close(c, f); }
- f.apply(this, this.fireArgs);
- } else {
- g = this.subscribe(m);
- }
- return g;
-};
-
-/**
- * Unsubscribes the function with the given guid from the channel.
- */
-Channel.prototype.unsubscribe = function(g) {
- // need a function to unsubscribe
- if (g === null || g === undefined) { throw "You must pass _something_ into Channel.unsubscribe"; }
-
- if (typeof g == 'function') { g = g.observer_guid; }
- var handler = this.handlers[g];
- if (handler) {
- if (handler.observer_guid) handler.observer_guid=null;
- this.handlers[g] = null;
- delete this.handlers[g];
- this.numHandlers--;
- if (this.events.onUnsubscribe) this.events.onUnsubscribe.call(this);
- }
-};
-
-/**
- * Calls all functions subscribed to this channel.
- */
-Channel.prototype.fire = function(e) {
- if (this.enabled) {
- var fail = false;
- this.fired = true;
- for (var item in this.handlers) {
- var handler = this.handlers[item];
- if (typeof handler == 'function') {
- var rv = (handler.apply(this, arguments)===false);
- fail = fail || rv;
- }
- }
- this.fireArgs = arguments;
- return !fail;
- }
- return true;
-};
-
-// defining them here so they are ready super fast!
-// DOM event that is received when the web page is loaded and parsed.
-channel.create('onDOMContentLoaded');
-
-// Event to indicate the Cordova native side is ready.
-channel.create('onNativeReady');
-
-// Event to indicate that all Cordova JavaScript objects have been created
-// and it's time to run plugin constructors.
-channel.create('onCordovaReady');
-
-// Event to indicate that device properties are available
-channel.create('onCordovaInfoReady');
-
-// Event to indicate that the connection property has been set.
-channel.create('onCordovaConnectionReady');
-
-// Event to indicate that Cordova is ready
-channel.create('onDeviceReady');
-
-// Event to indicate a resume lifecycle event
-channel.create('onResume');
-
-// Event to indicate a pause lifecycle event
-channel.create('onPause');
-
-// Event to indicate a destroy lifecycle event
-channel.create('onDestroy');
-
-// Channels that must fire before "deviceready" is fired.
-channel.waitForInitialization('onCordovaReady');
-channel.waitForInitialization('onCordovaInfoReady');
-channel.waitForInitialization('onCordovaConnectionReady');
-
-module.exports = channel;
-
-});
-
-// file: lib/common/common.js
-define("cordova/common", function(require, exports, module) {
-module.exports = {
- objects: {
- cordova: {
- path: 'cordova',
- children: {
- exec: {
- path: 'cordova/exec'
- },
- logger: {
- path: 'cordova/plugin/logger'
- }
- }
- },
- Cordova: {
- children: {
- exec: {
- path: 'cordova/exec'
- }
- }
- },
- PhoneGap:{
- children: {
- exec: {
- path: 'cordova/exec'
- }
- }
- },
- navigator: {
- children: {
- notification: {
- path: 'cordova/plugin/notification'
- },
- accelerometer: {
- path: 'cordova/plugin/accelerometer'
- },
- battery: {
- path: 'cordova/plugin/battery'
- },
- camera:{
- path: 'cordova/plugin/Camera'
- },
- compass:{
- path: 'cordova/plugin/compass'
- },
- contacts: {
- path: 'cordova/plugin/contacts'
- },
- device:{
- children:{
- capture: {
- path: 'cordova/plugin/capture'
- }
- }
- },
- geolocation: {
- path: 'cordova/plugin/geolocation'
- },
- network: {
- children: {
- connection: {
- path: 'cordova/plugin/network'
- }
- }
- },
- splashscreen: {
- path: 'cordova/plugin/splashscreen'
- }
- }
- },
- Acceleration: {
- path: 'cordova/plugin/Acceleration'
- },
- Camera:{
- path: 'cordova/plugin/CameraConstants'
- },
- CameraPopoverOptions: {
- path: 'cordova/plugin/CameraPopoverOptions'
- },
- CaptureError: {
- path: 'cordova/plugin/CaptureError'
- },
- CaptureAudioOptions:{
- path: 'cordova/plugin/CaptureAudioOptions'
- },
- CaptureImageOptions: {
- path: 'cordova/plugin/CaptureImageOptions'
- },
- CaptureVideoOptions: {
- path: 'cordova/plugin/CaptureVideoOptions'
- },
- CompassHeading:{
- path: 'cordova/plugin/CompassHeading'
- },
- CompassError:{
- path: 'cordova/plugin/CompassError'
- },
- ConfigurationData: {
- path: 'cordova/plugin/ConfigurationData'
- },
- Connection: {
- path: 'cordova/plugin/Connection'
- },
- Contact: {
- path: 'cordova/plugin/Contact'
- },
- ContactAddress: {
- path: 'cordova/plugin/ContactAddress'
- },
- ContactError: {
- path: 'cordova/plugin/ContactError'
- },
- ContactField: {
- path: 'cordova/plugin/ContactField'
- },
- ContactFindOptions: {
- path: 'cordova/plugin/ContactFindOptions'
- },
- ContactName: {
- path: 'cordova/plugin/ContactName'
- },
- ContactOrganization: {
- path: 'cordova/plugin/ContactOrganization'
- },
- Coordinates: {
- path: 'cordova/plugin/Coordinates'
- },
- DirectoryEntry: {
- path: 'cordova/plugin/DirectoryEntry'
- },
- DirectoryReader: {
- path: 'cordova/plugin/DirectoryReader'
- },
- Entry: {
- path: 'cordova/plugin/Entry'
- },
- File: {
- path: 'cordova/plugin/File'
- },
- FileEntry: {
- path: 'cordova/plugin/FileEntry'
- },
- FileError: {
- path: 'cordova/plugin/FileError'
- },
- FileReader: {
- path: 'cordova/plugin/FileReader'
- },
- FileSystem: {
- path: 'cordova/plugin/FileSystem'
- },
- FileTransfer: {
- path: 'cordova/plugin/FileTransfer'
- },
- FileTransferError: {
- path: 'cordova/plugin/FileTransferError'
- },
- FileUploadOptions: {
- path: 'cordova/plugin/FileUploadOptions'
- },
- FileUploadResult: {
- path: 'cordova/plugin/FileUploadResult'
- },
- FileWriter: {
- path: 'cordova/plugin/FileWriter'
- },
- Flags: {
- path: 'cordova/plugin/Flags'
- },
- LocalFileSystem: {
- path: 'cordova/plugin/LocalFileSystem'
- },
- Media: {
- path: 'cordova/plugin/Media'
- },
- MediaError: {
- path: 'cordova/plugin/MediaError'
- },
- MediaFile: {
- path: 'cordova/plugin/MediaFile'
- },
- MediaFileData:{
- path: 'cordova/plugin/MediaFileData'
- },
- Metadata:{
- path: 'cordova/plugin/Metadata'
- },
- Position: {
- path: 'cordova/plugin/Position'
- },
- PositionError: {
- path: 'cordova/plugin/PositionError'
- },
- ProgressEvent: {
- path: 'cordova/plugin/ProgressEvent'
- },
- requestFileSystem:{
- path: 'cordova/plugin/requestFileSystem'
- },
- resolveLocalFileSystemURI:{
- path: 'cordova/plugin/resolveLocalFileSystemURI'
- }
- }
-};
-
-});
-
-// file: lib/ios/exec.js
-define("cordova/exec", function(require, exports, module) {
- /**
- * Creates a gap bridge iframe used to notify the native code about queued
- * commands.
- *
- * @private
- */
-var cordova = require('cordova'),
- utils = require('cordova/utils'),
- gapBridge,
- createGapBridge = function() {
- gapBridge = document.createElement("iframe");
- gapBridge.setAttribute("style", "display:none;");
- gapBridge.setAttribute("height","0px");
- gapBridge.setAttribute("width","0px");
- gapBridge.setAttribute("frameborder","0");
- document.documentElement.appendChild(gapBridge);
- },
- channel = require('cordova/channel');
-
-module.exports = function() {
- if (!channel.onCordovaInfoReady.fired) {
- utils.alert("ERROR: Attempting to call cordova.exec()" +
- " before 'deviceready'. Ignoring.");
- return;
- }
-
- var successCallback, failCallback, service, action, actionArgs, splitCommand;
- var callbackId = null;
- if (typeof arguments[0] !== "string") {
- // FORMAT ONE
- successCallback = arguments[0];
- failCallback = arguments[1];
- service = arguments[2];
- action = arguments[3];
- actionArgs = arguments[4];
-
- // Since we need to maintain backwards compatibility, we have to pass
- // an invalid callbackId even if no callback was provided since plugins
- // will be expecting it. The Cordova.exec() implementation allocates
- // an invalid callbackId and passes it even if no callbacks were given.
- callbackId = 'INVALID';
- } else {
- // FORMAT TWO
- splitCommand = arguments[0].split(".");
- action = splitCommand.pop();
- service = splitCommand.join(".");
- actionArgs = Array.prototype.splice.call(arguments, 1);
- }
-
- // Start building the command object.
- var command = {
- className: service,
- methodName: action,
- "arguments": []
- };
-
- // Register the callbacks and add the callbackId to the positional
- // arguments if given.
- if (successCallback || failCallback) {
- callbackId = service + cordova.callbackId++;
- cordova.callbacks[callbackId] =
- {success:successCallback, fail:failCallback};
- }
- if (callbackId !== null) {
- command["arguments"].push(callbackId);
- }
-
- for (var i = 0; i < actionArgs.length; ++i) {
- var arg = actionArgs[i];
- if (arg === undefined || arg === null) { // nulls are pushed to the args now (becomes NSNull)
- command["arguments"].push(arg);
- } else if (typeof(arg) == 'object' && !(utils.isArray(arg))) {
- command.options = arg;
- } else {
- command["arguments"].push(arg);
- }
- }
-
- // Stringify and queue the command. We stringify to command now to
- // effectively clone the command arguments in case they are mutated before
- // the command is executed.
- cordova.commandQueue.push(JSON.stringify(command));
-
- // If the queue length is 1, then that means it was empty before we queued
- // the given command, so let the native side know that we have some
- // commands to execute, unless the queue is currently being flushed, in
- // which case the command will be picked up without notification.
- if (cordova.commandQueue.length == 1 && !cordova.commandQueueFlushing) {
- if (!gapBridge) {
- createGapBridge();
- }
- gapBridge.src = "gap://ready";
- }
-};
-
-});
-
-// file: lib/ios/platform.js
-define("cordova/platform", function(require, exports, module) {
-module.exports = {
- id: "ios",
- initialize:function() {
- // iOS doesn't allow reassigning / overriding navigator.geolocation object.
- // So clobber its methods here instead :)
- var geo = require('cordova/plugin/geolocation');
-
- navigator.geolocation.getCurrentPosition = geo.getCurrentPosition;
- navigator.geolocation.watchPosition = geo.watchPosition;
- navigator.geolocation.clearWatch = geo.clearWatch;
- },
- objects: {
- File: { // exists natively, override
- path: "cordova/plugin/File"
- },
- MediaError: { // exists natively, override
- path: "cordova/plugin/MediaError"
- },
- device: {
- path: 'cordova/plugin/ios/device'
- },
- console: {
- path: 'cordova/plugin/ios/console'
- }
- },
- merges:{
- Contact:{
- path: "cordova/plugin/ios/Contact"
- },
- Entry:{
- path: "cordova/plugin/ios/Entry"
- },
- FileReader:{
- path: "cordova/plugin/ios/FileReader"
- },
- navigator:{
- children:{
- notification:{
- path:"cordova/plugin/ios/notification"
- },
- contacts:{
- path:"cordova/plugin/ios/contacts"
- }
- }
- }
- }
-};
-
-// use the native logger
-var logger = require("cordova/plugin/logger");
-logger.useConsole(false);
-
-});
-
-// file: lib/common/plugin/Acceleration.js
-define("cordova/plugin/Acceleration", function(require, exports, module) {
-var Acceleration = function(x, y, z, timestamp) {
- this.x = x;
- this.y = y;
- this.z = z;
- this.timestamp = timestamp || (new Date()).getTime();
-};
-
-module.exports = Acceleration;
-
-});
-
-// file: lib/common/plugin/Camera.js
-define("cordova/plugin/Camera", function(require, exports, module) {
-var exec = require('cordova/exec'),
- Camera = require('cordova/plugin/CameraConstants');
-
-var cameraExport = {};
-
-// Tack on the Camera Constants to the base camera plugin.
-for (var key in Camera) {
- cameraExport[key] = Camera[key];
-}
-
-/**
- * Gets a picture from source defined by "options.sourceType", and returns the
- * image as defined by the "options.destinationType" option.
-
- * The defaults are sourceType=CAMERA and destinationType=FILE_URI.
- *
- * @param {Function} successCallback
- * @param {Function} errorCallback
- * @param {Object} options
- */
-cameraExport.getPicture = function(successCallback, errorCallback, options) {
- // successCallback required
- if (typeof successCallback != "function") {
- console.log("Camera Error: successCallback is not a function");
- return;
- }
-
- // errorCallback optional
- if (errorCallback && (typeof errorCallback != "function")) {
- console.log("Camera Error: errorCallback is not a function");
- return;
- }
-
- var quality = 50;
- if (options && typeof options.quality == "number") {
- quality = options.quality;
- } else if (options && typeof options.quality == "string") {
- var qlity = parseInt(options.quality, 10);
- if (isNaN(qlity) === false) {
- quality = qlity.valueOf();
- }
- }
-
- var destinationType = Camera.DestinationType.FILE_URI;
- if (typeof options.destinationType == "number") {
- destinationType = options.destinationType;
- }
-
- var sourceType = Camera.PictureSourceType.CAMERA;
- if (typeof options.sourceType == "number") {
- sourceType = options.sourceType;
- }
-
- var targetWidth = -1;
- if (typeof options.targetWidth == "number") {
- targetWidth = options.targetWidth;
- } else if (typeof options.targetWidth == "string") {
- var width = parseInt(options.targetWidth, 10);
- if (isNaN(width) === false) {
- targetWidth = width.valueOf();
- }
- }
-
- var targetHeight = -1;
- if (typeof options.targetHeight == "number") {
- targetHeight = options.targetHeight;
- } else if (typeof options.targetHeight == "string") {
- var height = parseInt(options.targetHeight, 10);
- if (isNaN(height) === false) {
- targetHeight = height.valueOf();
- }
- }
-
- var encodingType = Camera.EncodingType.JPEG;
- if (typeof options.encodingType == "number") {
- encodingType = options.encodingType;
- }
-
- var mediaType = Camera.MediaType.PICTURE;
- if (typeof options.mediaType == "number") {
- mediaType = options.mediaType;
- }
- var allowEdit = false;
- if (typeof options.allowEdit == "boolean") {
- allowEdit = options.allowEdit;
- } else if (typeof options.allowEdit == "number") {
- allowEdit = options.allowEdit <= 0 ? false : true;
- }
- var correctOrientation = false;
- if (typeof options.correctOrientation == "boolean") {
- correctOrientation = options.correctOrientation;
- } else if (typeof options.correctOrientation == "number") {
- correctOrientation = options.correctOrientation <=0 ? false : true;
- }
- var saveToPhotoAlbum = false;
- if (typeof options.saveToPhotoAlbum == "boolean") {
- saveToPhotoAlbum = options.saveToPhotoAlbum;
- } else if (typeof options.saveToPhotoAlbum == "number") {
- saveToPhotoAlbum = options.saveToPhotoAlbum <=0 ? false : true;
- }
- var popoverOptions = null;
- if (typeof options.popoverOptions == "object") {
- popoverOptions = options.popoverOptions;
- }
-
- exec(successCallback, errorCallback, "Camera", "takePicture", [quality, destinationType, sourceType, targetWidth, targetHeight, encodingType, mediaType, allowEdit, correctOrientation, saveToPhotoAlbum, popoverOptions]);
-};
-
-module.exports = cameraExport;
-});
-
-// file: lib/common/plugin/CameraConstants.js
-define("cordova/plugin/CameraConstants", function(require, exports, module) {
-module.exports = {
- DestinationType:{
- DATA_URL: 0, // Return base64 encoded string
- FILE_URI: 1 // Return file uri (content://media/external/images/media/2 for Android)
- },
- EncodingType:{
- JPEG: 0, // Return JPEG encoded image
- PNG: 1 // Return PNG encoded image
- },
- MediaType:{
- PICTURE: 0, // allow selection of still pictures only. DEFAULT. Will return format specified via DestinationType
- VIDEO: 1, // allow selection of video only, ONLY RETURNS URL
- ALLMEDIA : 2 // allow selection from all media types
- },
- PictureSourceType:{
- PHOTOLIBRARY : 0, // Choose image from picture library (same as SAVEDPHOTOALBUM for Android)
- CAMERA : 1, // Take picture from camera
- SAVEDPHOTOALBUM : 2 // Choose image from picture library (same as PHOTOLIBRARY for Android)
- },
- PopoverArrowDirection:{
- ARROW_UP : 1, // matches iOS UIPopoverArrowDirection constants to specify arrow location on popover
- ARROW_DOWN : 2,
- ARROW_LEFT : 4,
- ARROW_RIGHT : 8,
- ARROW_ANY : 15
- }
-};
-});
-
-// file: lib/common/plugin/CameraPopoverOptions.js
-define("cordova/plugin/CameraPopoverOptions", function(require, exports, module) {
-var Camera = require('cordova/plugin/CameraConstants');
-
-/**
- * Encapsulates options for iOS Popover image picker
- */
-var CameraPopoverOptions = function(x,y,width,height,arrowDir){
- // information of rectangle that popover should be anchored to
- this.x = x || 0;
- this.y = y || 32;
- this.width = width || 320;
- this.height = height || 480;
- // The direction of the popover arrow
- this.arrowDir = arrowDir || Camera.PopoverArrowDirection.ARROW_ANY;
-};
-
-module.exports = CameraPopoverOptions;
-});
-
-// file: lib/common/plugin/CaptureAudioOptions.js
-define("cordova/plugin/CaptureAudioOptions", function(require, exports, module) {
-/**
- * Encapsulates all audio capture operation configuration options.
- */
-var CaptureAudioOptions = function(){
- // Upper limit of sound clips user can record. Value must be equal or greater than 1.
- this.limit = 1;
- // Maximum duration of a single sound clip in seconds.
- this.duration = 0;
- // The selected audio mode. Must match with one of the elements in supportedAudioModes array.
- this.mode = null;
-};
-
-module.exports = CaptureAudioOptions;
-});
-
-// file: lib/common/plugin/CaptureError.js
-define("cordova/plugin/CaptureError", function(require, exports, module) {
-/**
- * The CaptureError interface encapsulates all errors in the Capture API.
- */
-var CaptureError = function(c) {
- this.code = c || null;
-};
-
-// Camera or microphone failed to capture image or sound.
-CaptureError.CAPTURE_INTERNAL_ERR = 0;
-// Camera application or audio capture application is currently serving other capture request.
-CaptureError.CAPTURE_APPLICATION_BUSY = 1;
-// Invalid use of the API (e.g. limit parameter has value less than one).
-CaptureError.CAPTURE_INVALID_ARGUMENT = 2;
-// User exited camera application or audio capture application before capturing anything.
-CaptureError.CAPTURE_NO_MEDIA_FILES = 3;
-// The requested capture operation is not supported.
-CaptureError.CAPTURE_NOT_SUPPORTED = 20;
-
-module.exports = CaptureError;
-});
-
-// file: lib/common/plugin/CaptureImageOptions.js
-define("cordova/plugin/CaptureImageOptions", function(require, exports, module) {
-/**
- * Encapsulates all image capture operation configuration options.
- */
-var CaptureImageOptions = function(){
- // Upper limit of images user can take. Value must be equal or greater than 1.
- this.limit = 1;
- // The selected image mode. Must match with one of the elements in supportedImageModes array.
- this.mode = null;
-};
-
-module.exports = CaptureImageOptions;
-});
-
-// file: lib/common/plugin/CaptureVideoOptions.js
-define("cordova/plugin/CaptureVideoOptions", function(require, exports, module) {
-/**
- * Encapsulates all video capture operation configuration options.
- */
-var CaptureVideoOptions = function(){
- // Upper limit of videos user can record. Value must be equal or greater than 1.
- this.limit = 1;
- // Maximum duration of a single video clip in seconds.
- this.duration = 0;
- // The selected video mode. Must match with one of the elements in supportedVideoModes array.
- this.mode = null;
-};
-
-module.exports = CaptureVideoOptions;
-});
-
-// file: lib/common/plugin/CompassError.js
-define("cordova/plugin/CompassError", function(require, exports, module) {
-/**
- * CompassError.
- * An error code assigned by an implementation when an error has occured
- * @constructor
- */
-var CompassError = function(err) {
- this.code = (err !== undefined ? err : null);
-};
-
-CompassError.COMPASS_INTERNAL_ERR = 0;
-CompassError.COMPASS_NOT_SUPPORTED = 20;
-
-module.exports = CompassError;
-});
-
-// file: lib/common/plugin/CompassHeading.js
-define("cordova/plugin/CompassHeading", function(require, exports, module) {
-var CompassHeading = function(magneticHeading, trueHeading, headingAccuracy, timestamp) {
- this.magneticHeading = (magneticHeading !== undefined ? magneticHeading : null);
- this.trueHeading = (trueHeading !== undefined ? trueHeading : null);
- this.headingAccuracy = (headingAccuracy !== undefined ? headingAccuracy : null);
- this.timestamp = (timestamp !== undefined ? timestamp : new Date().getTime());
-};
-
-module.exports = CompassHeading;
-});
-
-// file: lib/common/plugin/ConfigurationData.js
-define("cordova/plugin/ConfigurationData", function(require, exports, module) {
-/**
- * Encapsulates a set of parameters that the capture device supports.
- */
-function ConfigurationData() {
- // The ASCII-encoded string in lower case representing the media type.
- this.type = null;
- // The height attribute represents height of the image or video in pixels.
- // In the case of a sound clip this attribute has value 0.
- this.height = 0;
- // The width attribute represents width of the image or video in pixels.
- // In the case of a sound clip this attribute has value 0
- this.width = 0;
-}
-
-module.exports = ConfigurationData;
-});
-
-// file: lib/common/plugin/Connection.js
-define("cordova/plugin/Connection", function(require, exports, module) {
-/**
- * Network status
- */
-module.exports = {
- UNKNOWN: "unknown",
- ETHERNET: "ethernet",
- WIFI: "wifi",
- CELL_2G: "2g",
- CELL_3G: "3g",
- CELL_4G: "4g",
- NONE: "none"
-};
-});
-
-// file: lib/common/plugin/Contact.js
-define("cordova/plugin/Contact", function(require, exports, module) {
-var exec = require('cordova/exec'),
- ContactError = require('cordova/plugin/ContactError'),
- utils = require('cordova/utils');
-
-/**
-* Converts primitives into Complex Object
-* Currently only used for Date fields
-*/
-function convertIn(contact) {
- var value = contact.birthday;
- try {
- contact.birthday = new Date(parseFloat(value));
- } catch (exception){
- console.log("Cordova Contact convertIn error: exception creating date.");
- }
- return contact;
-}
-
-/**
-* Converts Complex objects into primitives
-* Only conversion at present is for Dates.
-**/
-
-function convertOut(contact) {
- var value = contact.birthday;
- if (value !== null) {
- // try to make it a Date object if it is not already
- if (!utils.isDate(value)){
- try {
- value = new Date(value);
- } catch(exception){
- value = null;
- }
- }
- if (utils.isDate(value)){
- value = value.valueOf(); // convert to milliseconds
- }
- contact.birthday = value;
- }
- return contact;
-}
-
-/**
-* Contains information about a single contact.
-* @constructor
-* @param {DOMString} id unique identifier
-* @param {DOMString} displayName
-* @param {ContactName} name
-* @param {DOMString} nickname
-* @param {Array.<ContactField>} phoneNumbers array of phone numbers
-* @param {Array.<ContactField>} emails array of email addresses
-* @param {Array.<ContactAddress>} addresses array of addresses
-* @param {Array.<ContactField>} ims instant messaging user ids
-* @param {Array.<ContactOrganization>} organizations
-* @param {DOMString} birthday contact's birthday
-* @param {DOMString} note user notes about contact
-* @param {Array.<ContactField>} photos
-* @param {Array.<ContactField>} categories
-* @param {Array.<ContactField>} urls contact's web sites
-*/
-var Contact = function (id, displayName, name, nickname, phoneNumbers, emails, addresses,
- ims, organizations, birthday, note, photos, categories, urls) {
- this.id = id || null;
- this.rawId = null;
- this.displayName = displayName || null;
- this.name = name || null; // ContactName
- this.nickname = nickname || null;
- this.phoneNumbers = phoneNumbers || null; // ContactField[]
- this.emails = emails || null; // ContactField[]
- this.addresses = addresses || null; // ContactAddress[]
- this.ims = ims || null; // ContactField[]
- this.organizations = organizations || null; // ContactOrganization[]
- this.birthday = birthday || null;
- this.note = note || null;
- this.photos = photos || null; // ContactField[]
- this.categories = categories || null; // ContactField[]
- this.urls = urls || null; // ContactField[]
-};
-
-/**
-* Removes contact from device storage.
-* @param successCB success callback
-* @param errorCB error callback
-*/
-Contact.prototype.remove = function(successCB, errorCB) {
- var fail = function(code) {
- errorCB(new ContactError(code));
- };
- if (this.id === null) {
- fail(ContactError.UNKNOWN_ERROR);
- }
- else {
- exec(successCB, fail, "Contacts", "remove", [this.id]);
- }
-};
-
-/**
-* Creates a deep copy of this Contact.
-* With the contact ID set to null.
-* @return copy of this Contact
-*/
-Contact.prototype.clone = function() {
- var clonedContact = utils.clone(this);
- var i;
- clonedContact.id = null;
- clonedContact.rawId = null;
- // Loop through and clear out any id's in phones, emails, etc.
- if (clonedContact.phoneNumbers) {
- for (i = 0; i < clonedContact.phoneNumbers.length; i++) {
- clonedContact.phoneNumbers[i].id = null;
- }
- }
- if (clonedContact.emails) {
- for (i = 0; i < clonedContact.emails.length; i++) {
- clonedContact.emails[i].id = null;
- }
- }
- if (clonedContact.addresses) {
- for (i = 0; i < clonedContact.addresses.length; i++) {
- clonedContact.addresses[i].id = null;
- }
- }
- if (clonedContact.ims) {
- for (i = 0; i < clonedContact.ims.length; i++) {
- clonedContact.ims[i].id = null;
- }
- }
- if (clonedContact.organizations) {
- for (i = 0; i < clonedContact.organizations.length; i++) {
- clonedContact.organizations[i].id = null;
- }
- }
- if (clonedContact.categories) {
- for (i = 0; i < clonedContact.categories.length; i++) {
- clonedContact.categories[i].id = null;
- }
- }
- if (clonedContact.photos) {
- for (i = 0; i < clonedContact.photos.length; i++) {
- clonedContact.photos[i].id = null;
- }
- }
- if (clonedContact.urls) {
- for (i = 0; i < clonedContact.urls.length; i++) {
- clonedContact.urls[i].id = null;
- }
- }
- return clonedContact;
-};
-
-/**
-* Persists contact to device storage.
-* @param successCB success callback
-* @param errorCB error callback
-*/
-Contact.prototype.save = function(successCB, errorCB) {
- var fail = function(code) {
- errorCB(new ContactError(code));
- };
- var success = function(result) {
- if (result) {
- if (typeof successCB === 'function') {
- var fullContact = require('cordova/plugin/contacts').create(result);
- successCB(convertIn(fullContact));
- }
- }
- else {
- // no Entry object returned
- fail(ContactError.UNKNOWN_ERROR);
- }
- };
- var dupContact = convertOut(utils.clone(this));
- exec(success, fail, "Contacts", "save", [dupContact]);
-};
-
-
-module.exports = Contact;
-
-});
-
-// file: lib/common/plugin/ContactAddress.js
-define("cordova/plugin/ContactAddress", function(require, exports, module) {
-/**
-* Contact address.
-* @constructor
-* @param {DOMString} id unique identifier, should only be set by native code
-* @param formatted // NOTE: not a W3C standard
-* @param streetAddress
-* @param locality
-* @param region
-* @param postalCode
-* @param country
-*/
-
-var ContactAddress = function(pref, type, formatted, streetAddress, locality, region, postalCode, country) {
- this.id = null;
- this.pref = (typeof pref != 'undefined' ? pref : false);
- this.type = type || null;
- this.formatted = formatted || null;
- this.streetAddress = streetAddress || null;
- this.locality = locality || null;
- this.region = region || null;
- this.postalCode = postalCode || null;
- this.country = country || null;
-};
-
-module.exports = ContactAddress;
-});
-
-// file: lib/common/plugin/ContactError.js
-define("cordova/plugin/ContactError", function(require, exports, module) {
-/**
- * ContactError.
- * An error code assigned by an implementation when an error has occured
- * @constructor
- */
-var ContactError = function(err) {
- this.code = (typeof err != 'undefined' ? err : null);
-};
-
-/**
- * Error codes
- */
-ContactError.UNKNOWN_ERROR = 0;
-ContactError.INVALID_ARGUMENT_ERROR = 1;
-ContactError.TIMEOUT_ERROR = 2;
-ContactError.PENDING_OPERATION_ERROR = 3;
-ContactError.IO_ERROR = 4;
-ContactError.NOT_SUPPORTED_ERROR = 5;
-ContactError.PERMISSION_DENIED_ERROR = 20;
-
-module.exports = ContactError;
-});
-
-// file: lib/common/plugin/ContactField.js
-define("cordova/plugin/ContactField", function(require, exports, module) {
-/**
-* Generic contact field.
-* @constructor
-* @param {DOMString} id unique identifier, should only be set by native code // NOTE: not a W3C standard
-* @param type
-* @param value
-* @param pref
-*/
-var ContactField = function(type, value, pref) {
- this.id = null;
- this.type = (type && type.toString()) || null;
- this.value = (value && value.toString()) || null;
- this.pref = (typeof pref != 'undefined' ? pref : false);
-};
-
-module.exports = ContactField;
-});
-
-// file: lib/common/plugin/ContactFindOptions.js
-define("cordova/plugin/ContactFindOptions", function(require, exports, module) {
-/**
- * ContactFindOptions.
- * @constructor
- * @param filter used to match contacts against
- * @param multiple boolean used to determine if more than one contact should be returned
- */
-
-var ContactFindOptions = function(filter, multiple) {
- this.filter = filter || '';
- this.multiple = (typeof multiple != 'undefined' ? multiple : false);
-};
-
-module.exports = ContactFindOptions;
-});
-
-// file: lib/common/plugin/ContactName.js
-define("cordova/plugin/ContactName", function(require, exports, module) {
-/**
-* Contact name.
-* @constructor
-* @param formatted // NOTE: not part of W3C standard
-* @param familyName
-* @param givenName
-* @param middle
-* @param prefix
-* @param suffix
-*/
-var ContactName = function(formatted, familyName, givenName, middle, prefix, suffix) {
- this.formatted = formatted || null;
- this.familyName = familyName || null;
- this.givenName = givenName || null;
- this.middleName = middle || null;
- this.honorificPrefix = prefix || null;
- this.honorificSuffix = suffix || null;
-};
-
-module.exports = ContactName;
-});
-
-// file: lib/common/plugin/ContactOrganization.js
-define("cordova/plugin/ContactOrganization", function(require, exports, module) {
-/**
-* Contact organization.
-* @constructor
-* @param {DOMString} id unique identifier, should only be set by native code // NOTE: not a W3C standard
-* @param name
-* @param dept
-* @param title
-* @param startDate
-* @param endDate
-* @param location
-* @param desc
-*/
-
-var ContactOrganization = function(pref, type, name, dept, title) {
- this.id = null;
- this.pref = (typeof pref != 'undefined' ? pref : false);
- this.type = type || null;
- this.name = name || null;
- this.department = dept || null;
- this.title = title || null;
-};
-
-module.exports = ContactOrganization;
-});
-
-// file: lib/common/plugin/Coordinates.js
-define("cordova/plugin/Coordinates", function(require, exports, module) {
-/**
- * This class contains position information.
- * @param {Object} lat
- * @param {Object} lng
- * @param {Object} alt
- * @param {Object} acc
- * @param {Object} head
- * @param {Object} vel
- * @param {Object} altacc
- * @constructor
- */
-var Coordinates = function(lat, lng, alt, acc, head, vel, altacc) {
- /**
- * The latitude of the position.
- */
- this.latitude = lat;
- /**
- * The longitude of the position,
- */
- this.longitude = lng;
- /**
- * The accuracy of the position.
- */
- this.accuracy = acc;
- /**
- * The altitude of the position.
- */
- this.altitude = (alt !== undefined ? alt : null);
- /**
- * The direction the device is moving at the position.
- */
- this.heading = (head !== undefined ? head : null);
- /**
- * The velocity with which the device is moving at the position.
- */
- this.speed = (vel !== undefined ? vel : null);
-
- if (this.speed === 0 || this.speed === null) {
- this.heading = NaN;
- }
-
- /**
- * The altitude accuracy of the position.
- */
- this.altitudeAccuracy = (altacc !== undefined) ? altacc : null;
-};
-
-module.exports = Coordinates;
-
-});
-
-// file: lib/common/plugin/DirectoryEntry.js
-define("cordova/plugin/DirectoryEntry", function(require, exports, module) {
-var utils = require('cordova/utils'),
- exec = require('cordova/exec'),
- Entry = require('cordova/plugin/Entry'),
- FileError = require('cordova/plugin/FileError'),
- DirectoryReader = require('cordova/plugin/DirectoryReader');
-
-/**
- * An interface representing a directory on the file system.
- *
- * {boolean} isFile always false (readonly)
- * {boolean} isDirectory always true (readonly)
- * {DOMString} name of the directory, excluding the path leading to it (readonly)
- * {DOMString} fullPath the absolute full path to the directory (readonly)
- * {FileSystem} filesystem on which the directory resides (readonly)
- */
-var DirectoryEntry = function(name, fullPath) {
- DirectoryEntry.__super__.constructor.apply(this, [false, true, name, fullPath]);
-};
-
-utils.extend(DirectoryEntry, Entry);
-
-/**
- * Creates a new DirectoryReader to read entries from this directory
- */
-DirectoryEntry.prototype.createReader = function() {
- return new DirectoryReader(this.fullPath);
-};
-
-/**
- * Creates or looks up a directory
- *
- * @param {DOMString} path either a relative or absolute path from this directory in which to look up or create a directory
- * @param {Flags} options to create or excluively create the directory
- * @param {Function} successCallback is called with the new entry
- * @param {Function} errorCallback is called with a FileError
- */
-DirectoryEntry.prototype.getDirectory = function(path, options, successCallback, errorCallback) {
- var win = typeof successCallback !== 'function' ? null : function(result) {
- var entry = new DirectoryEntry(result.name, result.fullPath);
- successCallback(entry);
- };
- var fail = typeof errorCallback !== 'function' ? null : function(code) {
- errorCallback(new FileError(code));
- };
- exec(win, fail, "File", "getDirectory", [this.fullPath, path, options]);
-};
-
-/**
- * Deletes a directory and all of it's contents
- *
- * @param {Function} successCallback is called with no parameters
- * @param {Function} errorCallback is called with a FileError
- */
-DirectoryEntry.prototype.removeRecursively = function(successCallback, errorCallback) {
- var fail = typeof errorCallback !== 'function' ? null : function(code) {
- errorCallback(new FileError(code));
- };
- exec(successCallback, fail, "File", "removeRecursively", [this.fullPath]);
-};
-
-/**
- * Creates or looks up a file
- *
- * @param {DOMString} path either a relative or absolute path from this directory in which to look up or create a file
- * @param {Flags} options to create or excluively create the file
- * @param {Function} successCallback is called with the new entry
- * @param {Function} errorCallback is called with a FileError
- */
-DirectoryEntry.prototype.getFile = function(path, options, successCallback, errorCallback) {
- var win = typeof successCallback !== 'function' ? null : function(result) {
- var FileEntry = require('cordova/plugin/FileEntry');
- var entry = new FileEntry(result.name, result.fullPath);
- successCallback(entry);
- };
- var fail = typeof errorCallback !== 'function' ? null : function(code) {
- errorCallback(new FileError(code));
- };
- exec(win, fail, "File", "getFile", [this.fullPath, path, options]);
-};
-
-module.exports = DirectoryEntry;
-
-});
-
-// file: lib/common/plugin/DirectoryReader.js
-define("cordova/plugin/DirectoryReader", function(require, exports, module) {
-var exec = require('cordova/exec'),
- FileError = require('cordova/plugin/FileError') ;
-
-/**
- * An interface that lists the files and directories in a directory.
- */
-function DirectoryReader(path) {
- this.path = path || null;
-}
-
-/**
- * Returns a list of entries from a directory.
- *
- * @param {Function} successCallback is called with a list of entries
- * @param {Function} errorCallback is called with a FileError
- */
-DirectoryReader.prototype.readEntries = function(successCallback, errorCallback) {
- var win = typeof successCallback !== 'function' ? null : function(result) {
- var retVal = [];
- for (var i=0; i<result.length; i++) {
- var entry = null;
- if (result[i].isDirectory) {
- entry = new (require('cordova/plugin/DirectoryEntry'))();
- }
- else if (result[i].isFile) {
- entry = new (require('cordova/plugin/FileEntry'))();
- }
- entry.isDirectory = result[i].isDirectory;
- entry.isFile = result[i].isFile;
- entry.name = result[i].name;
- entry.fullPath = result[i].fullPath;
- retVal.push(entry);
- }
- successCallback(retVal);
- };
- var fail = typeof errorCallback !== 'function' ? null : function(code) {
- errorCallback(new FileError(code));
- };
- exec(win, fail, "File", "readEntries", [this.path]);
-};
-
-module.exports = DirectoryReader;
-
-});
-
-// file: lib/common/plugin/Entry.js
-define("cordova/plugin/Entry", function(require, exports, module) {
-var exec = require('cordova/exec'),
- FileError = require('cordova/plugin/FileError'),
- Metadata = require('cordova/plugin/Metadata');
-
-/**
- * Represents a file or directory on the local file system.
- *
- * @param isFile
- * {boolean} true if Entry is a file (readonly)
- * @param isDirectory
- * {boolean} true if Entry is a directory (readonly)
- * @param name
- * {DOMString} name of the file or directory, excluding the path
- * leading to it (readonly)
- * @param fullPath
- * {DOMString} the absolute full path to the file or directory
- * (readonly)
- */
-function Entry(isFile, isDirectory, name, fullPath, fileSystem) {
- this.isFile = (typeof isFile != 'undefined'?isFile:false);
- this.isDirectory = (typeof isDirectory != 'undefined'?isDirectory:false);
- this.name = name || '';
- this.fullPath = fullPath || '';
- this.filesystem = fileSystem || null;
-}
-
-/**
- * Look up the metadata of the entry.
- *
- * @param successCallback
- * {Function} is called with a Metadata object
- * @param errorCallback
- * {Function} is called with a FileError
- */
-Entry.prototype.getMetadata = function(successCallback, errorCallback) {
- var success = typeof successCallback !== 'function' ? null : function(lastModified) {
- var metadata = new Metadata(lastModified);
- successCallback(metadata);
- };
- var fail = typeof errorCallback !== 'function' ? null : function(code) {
- errorCallback(new FileError(code));
- };
-
- exec(success, fail, "File", "getMetadata", [this.fullPath]);
-};
-
-/**
- * Set the metadata of the entry.
- *
- * @param successCallback
- * {Function} is called with a Metadata object
- * @param errorCallback
- * {Function} is called with a FileError
- * @param metadataObject
- * {Object} keys and values to set
- */
-Entry.prototype.setMetadata = function(successCallback, errorCallback, metadataObject) {
-
- exec(successCallback, errorCallback, "File", "setMetadata", [this.fullPath, metadataObject]);
-};
-
-/**
- * Move a file or directory to a new location.
- *
- * @param parent
- * {DirectoryEntry} the directory to which to move this entry
- * @param newName
- * {DOMString} new name of the entry, defaults to the current name
- * @param successCallback
- * {Function} called with the new DirectoryEntry object
- * @param errorCallback
- * {Function} called with a FileError
- */
-Entry.prototype.moveTo = function(parent, newName, successCallback, errorCallback) {
- var fail = function(code) {
- if (typeof errorCallback === 'function') {
- errorCallback(new FileError(code));
- }
- };
- // user must specify parent Entry
- if (!parent) {
- fail(FileError.NOT_FOUND_ERR);
- return;
- }
- // source path
- var srcPath = this.fullPath,
- // entry name
- name = newName || this.name,
- success = function(entry) {
- if (entry) {
- if (typeof successCallback === 'function') {
- // create appropriate Entry object
- var result = (entry.isDirectory) ? new (require('cordova/plugin/DirectoryEntry'))(entry.name, entry.fullPath) : new (require('cordova/plugin/FileEntry'))(entry.name, entry.fullPath);
- try {
- successCallback(result);
- }
- catch (e) {
- console.log('Error invoking callback: ' + e);
- }
- }
- }
- else {
- // no Entry object returned
- fail(FileError.NOT_FOUND_ERR);
- }
- };
-
- // copy
- exec(success, fail, "File", "moveTo", [srcPath, parent.fullPath, name]);
-};
-
-/**
- * Copy a directory to a different location.
- *
- * @param parent
- * {DirectoryEntry} the directory to which to copy the entry
- * @param newName
- * {DOMString} new name of the entry, defaults to the current name
- * @param successCallback
- * {Function} called with the new Entry object
- * @param errorCallback
- * {Function} called with a FileError
- */
-Entry.prototype.copyTo = function(parent, newName, successCallback, errorCallback) {
- var fail = function(code) {
- if (typeof errorCallback === 'function') {
- errorCallback(new FileError(code));
- }
- };
-
- // user must specify parent Entry
- if (!parent) {
- fail(FileError.NOT_FOUND_ERR);
- return;
- }
-
- // source path
- var srcPath = this.fullPath,
- // entry name
- name = newName || this.name,
- // success callback
- success = function(entry) {
- if (entry) {
- if (typeof successCallback === 'function') {
- // create appropriate Entry object
- var result = (entry.isDirectory) ? new (require('cordova/plugin/DirectoryEntry'))(entry.name, entry.fullPath) : new (require('cordova/plugin/FileEntry'))(entry.name, entry.fullPath);
- try {
- successCallback(result);
- }
- catch (e) {
- console.log('Error invoking callback: ' + e);
- }
- }
- }
- else {
- // no Entry object returned
- fail(FileError.NOT_FOUND_ERR);
- }
- };
-
- // copy
- exec(success, fail, "File", "copyTo", [srcPath, parent.fullPath, name]);
-};
-
-/**
- * Return a URL that can be used to identify this entry.
- */
-Entry.prototype.toURL = function() {
- // fullPath attribute contains the full URL
- return this.fullPath;
-};
-
-/**
- * Returns a URI that can be used to identify this entry.
- *
- * @param {DOMString} mimeType for a FileEntry, the mime type to be used to interpret the file, when loaded through this URI.
- * @return uri
- */
-Entry.prototype.toURI = function(mimeType) {
- console.log("DEPRECATED: Update your code to use 'toURL'");
- // fullPath attribute contains the full URI
- return this.toURL();
-};
-
-/**
- * Remove a file or directory. It is an error to attempt to delete a
- * directory that is not empty. It is an error to attempt to delete a
- * root directory of a file system.
- *
- * @param successCallback {Function} called with no parameters
- * @param errorCallback {Function} called with a FileError
- */
-Entry.prototype.remove = function(successCallback, errorCallback) {
- var fail = typeof errorCallback !== 'function' ? null : function(code) {
- errorCallback(new FileError(code));
- };
- exec(successCallback, fail, "File", "remove", [this.fullPath]);
-};
-
-/**
- * Look up the parent DirectoryEntry of this entry.
- *
- * @param successCallback {Function} called with the parent DirectoryEntry object
- * @param errorCallback {Function} called with a FileError
- */
-Entry.prototype.getParent = function(successCallback, errorCallback) {
- var win = typeof successCallback !== 'function' ? null : function(result) {
- var DirectoryEntry = require('cordova/plugin/DirectoryEntry');
- var entry = new DirectoryEntry(result.name, result.fullPath);
- successCallback(entry);
- };
- var fail = typeof errorCallback !== 'function' ? null : function(code) {
- errorCallback(new FileError(code));
- };
- exec(win, fail, "File", "getParent", [this.fullPath]);
-};
-
-module.exports = Entry;
-});
-
-// file: lib/common/plugin/File.js
-define("cordova/plugin/File", function(require, exports, module) {
-/**
- * Constructor.
- * name {DOMString} name of the file, without path information
- * fullPath {DOMString} the full path of the file, including the name
- * type {DOMString} mime type
- * lastModifiedDate {Date} last modified date
- * size {Number} size of the file in bytes
- */
-
-var File = function(name, fullPath, type, lastModifiedDate, size){
- this.name = name || '';
- this.fullPath = fullPath || null;
- this.type = type || null;
- this.lastModifiedDate = lastModifiedDate || null;
- this.size = size || 0;
-};
-
-module.exports = File;
-});
-
-// file: lib/common/plugin/FileEntry.js
-define("cordova/plugin/FileEntry", function(require, exports, module) {
-var utils = require('cordova/utils'),
- exec = require('cordova/exec'),
- Entry = require('cordova/plugin/Entry'),
- FileWriter = require('cordova/plugin/FileWriter'),
- File = require('cordova/plugin/File'),
- FileError = require('cordova/plugin/FileError');
-
-/**
- * An interface representing a file on the file system.
- *
- * {boolean} isFile always true (readonly)
- * {boolean} isDirectory always false (readonly)
- * {DOMString} name of the file, excluding the path leading to it (readonly)
- * {DOMString} fullPath the absolute full path to the file (readonly)
- * {FileSystem} filesystem on which the file resides (readonly)
- */
-var FileEntry = function(name, fullPath) {
- FileEntry.__super__.constructor.apply(this, [true, false, name, fullPath]);
-};
-
-utils.extend(FileEntry, Entry);
-
-/**
- * Creates a new FileWriter associated with the file that this FileEntry represents.
- *
- * @param {Function} successCallback is called with the new FileWriter
- * @param {Function} errorCallback is called with a FileError
- */
-FileEntry.prototype.createWriter = function(successCallback, errorCallback) {
- this.file(function(filePointer) {
- var writer = new FileWriter(filePointer);
-
- if (writer.fileName === null || writer.fileName === "") {
- if (typeof errorCallback === "function") {
- errorCallback(new FileError(FileError.INVALID_STATE_ERR));
- }
- } else {
- if (typeof successCallback === "function") {
- successCallback(writer);
- }
- }
- }, errorCallback);
-};
-
-/**
- * Returns a File that represents the current state of the file that this FileEntry represents.
- *
- * @param {Function} successCallback is called with the new File object
- * @param {Function} errorCallback is called with a FileError
- */
-FileEntry.prototype.file = function(successCallback, errorCallback) {
- var win = typeof successCallback !== 'function' ? null : function(f) {
- var file = new File(f.name, f.fullPath, f.type, f.lastModifiedDate, f.size);
- successCallback(file);
- };
- var fail = typeof errorCallback !== 'function' ? null : function(code) {
- errorCallback(new FileError(code));
- };
- exec(win, fail, "File", "getFileMetadata", [this.fullPath]);
-};
-
-
-module.exports = FileEntry;
-});
-
-// file: lib/common/plugin/FileError.js
-define("cordova/plugin/FileError", function(require, exports, module) {
-/**
- * FileError
- */
-function FileError(error) {
- this.code = error || null;
-}
-
-// File error codes
-// Found in DOMException
-FileError.NOT_FOUND_ERR = 1;
-FileError.SECURITY_ERR = 2;
-FileError.ABORT_ERR = 3;
-
-// Added by File API specification
-FileError.NOT_READABLE_ERR = 4;
-FileError.ENCODING_ERR = 5;
-FileError.NO_MODIFICATION_ALLOWED_ERR = 6;
-FileError.INVALID_STATE_ERR = 7;
-FileError.SYNTAX_ERR = 8;
-FileError.INVALID_MODIFICATION_ERR = 9;
-FileError.QUOTA_EXCEEDED_ERR = 10;
-FileError.TYPE_MISMATCH_ERR = 11;
-FileError.PATH_EXISTS_ERR = 12;
-
-module.exports = FileError;
-});
-
-// file: lib/common/plugin/FileReader.js
-define("cordova/plugin/FileReader", function(require, exports, module) {
-var exec = require('cordova/exec'),
- FileError = require('cordova/plugin/FileError'),
- ProgressEvent = require('cordova/plugin/ProgressEvent');
-
-/**
- * This class reads the mobile device file system.
- *
- * For Android:
- * The root directory is the root of the file system.
- * To read from the SD card, the file name is "sdcard/my_file.txt"
- * @constructor
- */
-var FileReader = function() {
- this.fileName = "";
-
- this.readyState = 0; // FileReader.EMPTY
-
- // File data
- this.result = null;
-
- // Error
- this.error = null;
-
- // Event handlers
- this.onloadstart = null; // When the read starts.
- this.onprogress = null; // While reading (and decoding) file or fileBlob data, and reporting partial file data (progess.loaded/progress.total)
- this.onload = null; // When the read has successfully completed.
- this.onerror = null; // When the read has failed (see errors).
- this.onloadend = null; // When the request has completed (either in success or failure).
- this.onabort = null; // When the read has been aborted. For instance, by invoking the abort() method.
-};
-
-// States
-FileReader.EMPTY = 0;
-FileReader.LOADING = 1;
-FileReader.DONE = 2;
-
-/**
- * Abort reading file.
- */
-FileReader.prototype.abort = function() {
- this.result = null;
-
- if (this.readyState == FileReader.DONE || this.readyState == FileReader.EMPTY) {
- return;
- }
-
- this.readyState = FileReader.DONE;
-
- // If abort callback
- if (typeof this.onabort === 'function') {
- this.onabort(new ProgressEvent('abort', {target:this}));
- }
- // If load end callback
- if (typeof this.onloadend === 'function') {
- this.onloadend(new ProgressEvent('loadend', {target:this}));
- }
-};
-
-/**
- * Read text file.
- *
- * @param file {File} File object containing file properties
- * @param encoding [Optional] (see http://www.iana.org/assignments/character-sets)
- */
-FileReader.prototype.readAsText = function(file, encoding) {
- // Figure out pathing
- this.fileName = '';
- if (typeof file.fullPath === 'undefined') {
- this.fileName = file;
- } else {
- this.fileName = file.fullPath;
- }
-
- // Already loading something
- if (this.readyState == FileReader.LOADING) {
- throw new FileError(FileError.INVALID_STATE_ERR);
- }
-
- // LOADING state
- this.readyState = FileReader.LOADING;
-
- // If loadstart callback
- if (typeof this.onloadstart === "function") {
- this.onloadstart(new ProgressEvent("loadstart", {target:this}));
- }
-
- // Default encoding is UTF-8
- var enc = encoding ? encoding : "UTF-8";
-
- var me = this;
-
- // Read file
- exec(
- // Success callback
- function(r) {
- // If DONE (cancelled), then don't do anything
- if (me.readyState === FileReader.DONE) {
- return;
- }
-
- // Save result
- me.result = r;
-
- // If onload callback
- if (typeof me.onload === "function") {
- me.onload(new ProgressEvent("load", {target:me}));
- }
-
- // DONE state
- me.readyState = FileReader.DONE;
-
- // If onloadend callback
- if (typeof me.onloadend === "function") {
- me.onloadend(new ProgressEvent("loadend", {target:me}));
- }
- },
- // Error callback
- function(e) {
- // If DONE (cancelled), then don't do anything
- if (me.readyState === FileReader.DONE) {
- return;
- }
-
- // DONE state
- me.readyState = FileReader.DONE;
-
- // null result
- me.result = null;
-
- // Save error
- me.error = new FileError(e);
-
- // If onerror callback
- if (typeof me.onerror === "function") {
- me.onerror(new ProgressEvent("error", {target:me}));
- }
-
- // If onloadend callback
- if (typeof me.onloadend === "function") {
- me.onloadend(new ProgressEvent("loadend", {target:me}));
- }
- }, "File", "readAsText", [this.fileName, enc]);
-};
-
-
-/**
- * Read file and return data as a base64 encoded data url.
- * A data url is of the form:
- * data:[<mediatype>][;base64],<data>
- *
- * @param file {File} File object containing file properties
- */
-FileReader.prototype.readAsDataURL = function(file) {
- this.fileName = "";
- if (typeof file.fullPath === "undefined") {
- this.fileName = file;
- } else {
- this.fileName = file.fullPath;
- }
-
- // Already loading something
- if (this.readyState == FileReader.LOADING) {
- throw new FileError(FileError.INVALID_STATE_ERR);
- }
-
- // LOADING state
- this.readyState = FileReader.LOADING;
-
- // If loadstart callback
- if (typeof this.onloadstart === "function") {
- this.onloadstart(new ProgressEvent("loadstart", {target:this}));
- }
-
- var me = this;
-
- // Read file
- exec(
- // Success callback
- function(r) {
- // If DONE (cancelled), then don't do anything
- if (me.readyState === FileReader.DONE) {
- return;
- }
-
- // DONE state
- me.readyState = FileReader.DONE;
-
- // Save result
- me.result = r;
-
- // If onload callback
- if (typeof me.onload === "function") {
- me.onload(new ProgressEvent("load", {target:me}));
- }
-
- // If onloadend callback
- if (typeof me.onloadend === "function") {
- me.onloadend(new ProgressEvent("loadend", {target:me}));
- }
- },
- // Error callback
- function(e) {
- // If DONE (cancelled), then don't do anything
- if (me.readyState === FileReader.DONE) {
- return;
- }
-
- // DONE state
- me.readyState = FileReader.DONE;
-
- me.result = null;
-
- // Save error
- me.error = new FileError(e);
-
- // If onerror callback
- if (typeof me.onerror === "function") {
- me.onerror(new ProgressEvent("error", {target:me}));
- }
-
- // If onloadend callback
- if (typeof me.onloadend === "function") {
- me.onloadend(new ProgressEvent("loadend", {target:me}));
- }
- }, "File", "readAsDataURL", [this.fileName]);
-};
-
-/**
- * Read file and return data as a binary data.
- *
- * @param file {File} File object containing file properties
- */
-FileReader.prototype.readAsBinaryString = function(file) {
- // TODO - Can't return binary data to browser.
- console.log('method "readAsBinaryString" is not supported at this time.');
-};
-
-/**
- * Read file and return data as a binary data.
- *
- * @param file {File} File object containing file properties
- */
-FileReader.prototype.readAsArrayBuffer = function(file) {
- // TODO - Can't return binary data to browser.
- console.log('This method is not supported at this time.');
-};
-
-module.exports = FileReader;
-});
-
-// file: lib/common/plugin/FileSystem.js
-define("cordova/plugin/FileSystem", function(require, exports, module) {
-var DirectoryEntry = require('cordova/plugin/DirectoryEntry');
-
-/**
- * An interface representing a file system
- *
- * @constructor
- * {DOMString} name the unique name of the file system (readonly)
- * {DirectoryEntry} root directory of the file system (readonly)
- */
-var FileSystem = function(name, root) {
- this.name = name || null;
- if (root) {
- this.root = new DirectoryEntry(root.name, root.fullPath);
- }
-};
-
-module.exports = FileSystem;
-});
-
-// file: lib/common/plugin/FileTransfer.js
-define("cordova/plugin/FileTransfer", function(require, exports, module) {
-var exec = require('cordova/exec');
-
-/**
- * FileTransfer uploads a file to a remote server.
- * @constructor
- */
-var FileTransfer = function() {};
-
-/**
-* Given an absolute file path, uploads a file on the device to a remote server
-* using a multipart HTTP request.
-* @param filePath {String} Full path of the file on the device
-* @param server {String} URL of the server to receive the file
-* @param successCallback (Function} Callback to be invoked when upload has completed
-* @param errorCallback {Function} Callback to be invoked upon error
-* @param options {FileUploadOptions} Optional parameters such as file name and mimetype
-* @param trustAllHosts {Boolean} Optional trust all hosts (e.g. for self-signed certs), defaults to false
-*/
-FileTransfer.prototype.upload = function(filePath, server, successCallback, errorCallback, options, trustAllHosts) {
- // check for options
- var fileKey = null;
- var fileName = null;
- var mimeType = null;
- var params = null;
- var chunkedMode = true;
- if (options) {
- fileKey = options.fileKey;
- fileName = options.fileName;
- mimeType = options.mimeType;
- if (options.chunkedMode !== null || typeof options.chunkedMode != "undefined") {
- chunkedMode = options.chunkedMode;
- }
- if (options.params) {
- params = options.params;
- }
- else {
- params = {};
- }
- }
-
- exec(successCallback, errorCallback, 'FileTransfer', 'upload', [filePath, server, fileKey, fileName, mimeType, params, trustAllHosts, chunkedMode]);
-};
-
-/**
- * Downloads a file form a given URL and saves it to the specified directory.
- * @param source {String} URL of the server to receive the file
- * @param target {String} Full path of the file on the device
- * @param successCallback (Function} Callback to be invoked when upload has completed
- * @param errorCallback {Function} Callback to be invoked upon error
- */
-FileTransfer.prototype.download = function(source, target, successCallback, errorCallback) {
- var win = function(result) {
- var entry = null;
- if (result.isDirectory) {
- entry = new (require('cordova/plugin/DirectoryEntry'))();
- }
- else if (result.isFile) {
- entry = new (require('cordova/plugin/FileEntry'))();
- }
- entry.isDirectory = result.isDirectory;
- entry.isFile = result.isFile;
- entry.name = result.name;
- entry.fullPath = result.fullPath;
- successCallback(entry);
- };
- exec(win, errorCallback, 'FileTransfer', 'download', [source, target]);
-};
-
-module.exports = FileTransfer;
-
-});
-
-// file: lib/common/plugin/FileTransferError.js
-define("cordova/plugin/FileTransferError", function(require, exports, module) {
-/**
- * FileTransferError
- * @constructor
- */
-var FileTransferError = function(code) {
- this.code = code || null;
-};
-
-FileTransferError.FILE_NOT_FOUND_ERR = 1;
-FileTransferError.INVALID_URL_ERR = 2;
-FileTransferError.CONNECTION_ERR = 3;
-
-module.exports = FileTransferError;
-});
-
-// file: lib/common/plugin/FileUploadOptions.js
-define("cordova/plugin/FileUploadOptions", function(require, exports, module) {
-/**
- * Options to customize the HTTP request used to upload files.
- * @constructor
- * @param fileKey {String} Name of file request parameter.
- * @param fileName {String} Filename to be used by the server. Defaults to image.jpg.
- * @param mimeType {String} Mimetype of the uploaded file. Defaults to image/jpeg.
- * @param params {Object} Object with key: value params to send to the server.
- */
-var FileUploadOptions = function(fileKey, fileName, mimeType, params) {
- this.fileKey = fileKey || null;
- this.fileName = fileName || null;
- this.mimeType = mimeType || null;
- this.params = params || null;
-};
-
-module.exports = FileUploadOptions;
-});
-
-// file: lib/common/plugin/FileUploadResult.js
-define("cordova/plugin/FileUploadResult", function(require, exports, module) {
-/**
- * FileUploadResult
- * @constructor
- */
-var FileUploadResult = function() {
- this.bytesSent = 0;
- this.responseCode = null;
- this.response = null;
-};
-
-module.exports = FileUploadResult;
-});
-
-// file: lib/common/plugin/FileWriter.js
-define("cordova/plugin/FileWriter", function(require, exports, module) {
-var exec = require('cordova/exec'),
- FileError = require('cordova/plugin/FileError'),
- ProgressEvent = require('cordova/plugin/ProgressEvent');
-
-/**
- * This class writes to the mobile device file system.
- *
- * For Android:
- * The root directory is the root of the file system.
- * To write to the SD card, the file name is "sdcard/my_file.txt"
- *
- * @constructor
- * @param file {File} File object containing file properties
- * @param append if true write to the end of the file, otherwise overwrite the file
- */
-var FileWriter = function(file) {
- this.fileName = "";
- this.length = 0;
- if (file) {
- this.fileName = file.fullPath || file;
- this.length = file.size || 0;
- }
- // default is to write at the beginning of the file
- this.position = 0;
-
- this.readyState = 0; // EMPTY
-
- this.result = null;
-
- // Error
- this.error = null;
-
- // Event handlers
- this.onwritestart = null; // When writing starts
- this.onprogress = null; // While writing the file, and reporting partial file data
- this.onwrite = null; // When the write has successfully completed.
- this.onwriteend = null; // When the request has completed (either in success or failure).
- this.onabort = null; // When the write has been aborted. For instance, by invoking the abort() method.
- this.onerror = null; // When the write has failed (see errors).
-};
-
-// States
-FileWriter.INIT = 0;
-FileWriter.WRITING = 1;
-FileWriter.DONE = 2;
-
-/**
- * Abort writing file.
- */
-FileWriter.prototype.abort = function() {
- // check for invalid state
- if (this.readyState === FileWriter.DONE || this.readyState === FileWriter.INIT) {
- throw new FileError(FileError.INVALID_STATE_ERR);
- }
-
- // set error
- this.error = new FileError(FileError.ABORT_ERR);
-
- this.readyState = FileWriter.DONE;
-
- // If abort callback
- if (typeof this.onabort === "function") {
- this.onabort(new ProgressEvent("abort", {"target":this}));
- }
-
- // If write end callback
- if (typeof this.onwriteend === "function") {
- this.onwriteend(new ProgressEvent("writeend", {"target":this}));
- }
-};
-
-/**
- * Writes data to the file
- *
- * @param text to be written
- */
-FileWriter.prototype.write = function(text) {
- // Throw an exception if we are already writing a file
- if (this.readyState === FileWriter.WRITING) {
- throw new FileError(FileError.INVALID_STATE_ERR);
- }
-
- // WRITING state
- this.readyState = FileWriter.WRITING;
-
- var me = this;
-
- // If onwritestart callback
- if (typeof me.onwritestart === "function") {
- me.onwritestart(new ProgressEvent("writestart", {"target":me}));
- }
-
- // Write file
- exec(
- // Success callback
- function(r) {
- // If DONE (cancelled), then don't do anything
- if (me.readyState === FileWriter.DONE) {
- return;
- }
-
- // position always increases by bytes written because file would be extended
- me.position += r;
- // The length of the file is now where we are done writing.
-
- me.length = me.position;
-
- // DONE state
- me.readyState = FileWriter.DONE;
-
- // If onwrite callback
- if (typeof me.onwrite === "function") {
- me.onwrite(new ProgressEvent("write", {"target":me}));
- }
-
- // If onwriteend callback
- if (typeof me.onwriteend === "function") {
- me.onwriteend(new ProgressEvent("writeend", {"target":me}));
- }
- },
- // Error callback
- function(e) {
- // If DONE (cancelled), then don't do anything
- if (me.readyState === FileWriter.DONE) {
- return;
- }
-
- // DONE state
- me.readyState = FileWriter.DONE;
-
- // Save error
- me.error = new FileError(e);
-
- // If onerror callback
- if (typeof me.onerror === "function") {
- me.onerror(new ProgressEvent("error", {"target":me}));
- }
-
- // If onwriteend callback
- if (typeof me.onwriteend === "function") {
- me.onwriteend(new ProgressEvent("writeend", {"target":me}));
- }
- }, "File", "write", [this.fileName, text, this.position]);
-};
-
-/**
- * Moves the file pointer to the location specified.
- *
- * If the offset is a negative number the position of the file
- * pointer is rewound. If the offset is greater than the file
- * size the position is set to the end of the file.
- *
- * @param offset is the location to move the file pointer to.
- */
-FileWriter.prototype.seek = function(offset) {
- // Throw an exception if we are already writing a file
- if (this.readyState === FileWriter.WRITING) {
- throw new FileError(FileError.INVALID_STATE_ERR);
- }
-
- if (!offset && offset !== 0) {
- return;
- }
-
- // See back from end of file.
- if (offset < 0) {
- this.position = Math.max(offset + this.length, 0);
- }
- // Offset is bigger then file size so set position
- // to the end of the file.
- else if (offset > this.length) {
- this.position = this.length;
- }
- // Offset is between 0 and file size so set the position
- // to start writing.
- else {
- this.position = offset;
- }
-};
-
-/**
- * Truncates the file to the size specified.
- *
- * @param size to chop the file at.
- */
-FileWriter.prototype.truncate = function(size) {
- // Throw an exception if we are already writing a file
- if (this.readyState === FileWriter.WRITING) {
- throw new FileError(FileError.INVALID_STATE_ERR);
- }
-
- // WRITING state
- this.readyState = FileWriter.WRITING;
-
- var me = this;
-
- // If onwritestart callback
- if (typeof me.onwritestart === "function") {
- me.onwritestart(new ProgressEvent("writestart", {"target":this}));
- }
-
- // Write file
- exec(
- // Success callback
- function(r) {
- // If DONE (cancelled), then don't do anything
- if (me.readyState === FileWriter.DONE) {
- return;
- }
-
- // DONE state
- me.readyState = FileWriter.DONE;
-
- // Update the length of the file
- me.length = r;
- me.position = Math.min(me.position, r);
-
- // If onwrite callback
- if (typeof me.onwrite === "function") {
- me.onwrite(new ProgressEvent("write", {"target":me}));
- }
-
- // If onwriteend callback
- if (typeof me.onwriteend === "function") {
- me.onwriteend(new ProgressEvent("writeend", {"target":me}));
- }
- },
- // Error callback
- function(e) {
- // If DONE (cancelled), then don't do anything
- if (me.readyState === FileWriter.DONE) {
- return;
- }
-
- // DONE state
- me.readyState = FileWriter.DONE;
-
- // Save error
- me.error = new FileError(e);
-
- // If onerror callback
- if (typeof me.onerror === "function") {
- me.onerror(new ProgressEvent("error", {"target":me}));
- }
-
- // If onwriteend callback
- if (typeof me.onwriteend === "function") {
- me.onwriteend(new ProgressEvent("writeend", {"target":me}));
- }
- }, "File", "truncate", [this.fileName, size]);
-};
-
-module.exports = FileWriter;
-
-});
-
-// file: lib/common/plugin/Flags.js
-define("cordova/plugin/Flags", function(require, exports, module) {
-/**
- * Supplies arguments to methods that lookup or create files and directories.
- *
- * @param create
- * {boolean} file or directory if it doesn't exist
- * @param exclusive
- * {boolean} used with create; if true the command will fail if
- * target path exists
- */
-function Flags(create, exclusive) {
- this.create = create || false;
- this.exclusive = exclusive || false;
-}
-
-module.exports = Flags;
-});
-
-// file: lib/common/plugin/LocalFileSystem.js
-define("cordova/plugin/LocalFileSystem", function(require, exports, module) {
-var exec = require('cordova/exec');
-
-/**
- * Represents a local file system.
- */
-var LocalFileSystem = function() {
-
-};
-
-LocalFileSystem.TEMPORARY = 0; //temporary, with no guarantee of persistence
-LocalFileSystem.PERSISTENT = 1; //persistent
-
-module.exports = LocalFileSystem;
-});
-
-// file: lib/common/plugin/Media.js
-define("cordova/plugin/Media", function(require, exports, module) {
-var utils = require('cordova/utils'),
- exec = require('cordova/exec');
-
-var mediaObjects = {};
-
-/**
- * This class provides access to the device media, interfaces to both sound and video
- *
- * @constructor
- * @param src The file name or url to play
- * @param successCallback The callback to be called when the file is done playing or recording.
- * successCallback()
- * @param errorCallback The callback to be called if there is an error.
- * errorCallback(int errorCode) - OPTIONAL
- * @param statusCallback The callback to be called when media status has changed.
- * statusCallback(int statusCode) - OPTIONAL
- */
-var Media = function(src, successCallback, errorCallback, statusCallback) {
-
- // successCallback optional
- if (successCallback && (typeof successCallback !== "function")) {
- console.log("Media Error: successCallback is not a function");
- return;
- }
-
- // errorCallback optional
- if (errorCallback && (typeof errorCallback !== "function")) {
- console.log("Media Error: errorCallback is not a function");
- return;
- }
-
- // statusCallback optional
- if (statusCallback && (typeof statusCallback !== "function")) {
- console.log("Media Error: statusCallback is not a function");
- return;
- }
-
- this.id = utils.createUUID();
- mediaObjects[this.id] = this;
- this.src = src;
- this.successCallback = successCallback;
- this.errorCallback = errorCallback;
- this.statusCallback = statusCallback;
- this._duration = -1;
- this._position = -1;
- exec(null, this.errorCallback, "Media", "create", [this.id, this.src]);
-};
-
-// Media messages
-Media.MEDIA_STATE = 1;
-Media.MEDIA_DURATION = 2;
-Media.MEDIA_POSITION = 3;
-Media.MEDIA_ERROR = 9;
-
-// Media states
-Media.MEDIA_NONE = 0;
-Media.MEDIA_STARTING = 1;
-Media.MEDIA_RUNNING = 2;
-Media.MEDIA_PAUSED = 3;
-Media.MEDIA_STOPPED = 4;
-Media.MEDIA_MSG = ["None", "Starting", "Running", "Paused", "Stopped"];
-
-// "static" function to return existing objs.
-Media.get = function(id) {
- return mediaObjects[id];
-};
-
-/**
- * Start or resume playing audio file.
- */
-Media.prototype.play = function(options) {
- exec(null, null, "Media", "startPlayingAudio", [this.id, this.src, options]);
-};
-
-/**
- * Stop playing audio file.
- */
-Media.prototype.stop = function() {
- var me = this;
- exec(function() {
- me._position = 0;
- me.successCallback();
- }, this.errorCallback, "Media", "stopPlayingAudio", [this.id]);
-};
-
-/**
- * Seek or jump to a new time in the track..
- */
-Media.prototype.seekTo = function(milliseconds) {
- var me = this;
- exec(function(p) {
- me._position = p;
- }, this.errorCallback, "Media", "seekToAudio", [this.id, milliseconds]);
-};
-
-/**
- * Pause playing audio file.
- */
-Media.prototype.pause = function() {
- exec(null, this.errorCallback, "Media", "pausePlayingAudio", [this.id]);
-};
-
-/**
- * Get duration of an audio file.
- * The duration is only set for audio that is playing, paused or stopped.
- *
- * @return duration or -1 if not known.
- */
-Media.prototype.getDuration = function() {
- return this._duration;
-};
-
-/**
- * Get position of audio.
- */
-Media.prototype.getCurrentPosition = function(success, fail) {
- var me = this;
- exec(function(p) {
- me._position = p;
- success(p);
- }, fail, "Media", "getCurrentPositionAudio", [this.id]);
-};
-
-/**
- * Start recording audio file.
- */
-Media.prototype.startRecord = function() {
- exec(this.successCallback, this.errorCallback, "Media", "startRecordingAudio", [this.id, this.src]);
-};
-
-/**
- * Stop recording audio file.
- */
-Media.prototype.stopRecord = function() {
- exec(this.successCallback, this.errorCallback, "Media", "stopRecordingAudio", [this.id]);
-};
-
-/**
- * Release the resources.
- */
-Media.prototype.release = function() {
- exec(null, this.errorCallback, "Media", "release", [this.id]);
-};
-
-/**
- * Adjust the volume.
- */
-Media.prototype.setVolume = function(volume) {
- exec(null, null, "Media", "setVolume", [this.id, volume]);
-};
-
-/**
- * Audio has status update.
- * PRIVATE
- *
- * @param id The media object id (string)
- * @param status The status code (int)
- * @param msg The status message (string)
- */
-Media.onStatus = function(id, msg, value) {
- var media = mediaObjects[id];
- // If state update
- if (msg === Media.MEDIA_STATE) {
- if (value === Media.MEDIA_STOPPED) {
- if (media.successCallback) {
- media.successCallback();
- }
- }
- if (media.statusCallback) {
- media.statusCallback(value);
- }
- }
- else if (msg === Media.MEDIA_DURATION) {
- media._duration = value;
- }
- else if (msg === Media.MEDIA_ERROR) {
- if (media.errorCallback) {
- // value should be a MediaError object when msg == MEDIA_ERROR
- media.errorCallback(value);
- }
- }
- else if (msg === Media.MEDIA_POSITION) {
- media._position = value;
- }
-};
-
-module.exports = Media;
-});
-
-// file: lib/common/plugin/MediaError.js
-define("cordova/plugin/MediaError", function(require, exports, module) {
-/**
- * This class contains information about any Media errors.
- * @constructor
- */
-var MediaError = function(code, msg) {
- this.code = (code !== undefined ? code : null);
- this.message = msg || "";
-};
-
-MediaError.MEDIA_ERR_NONE_ACTIVE = 0;
-MediaError.MEDIA_ERR_ABORTED = 1;
-MediaError.MEDIA_ERR_NETWORK = 2;
-MediaError.MEDIA_ERR_DECODE = 3;
-MediaError.MEDIA_ERR_NONE_SUPPORTED = 4;
-
-module.exports = MediaError;
-});
-
-// file: lib/common/plugin/MediaFile.js
-define("cordova/plugin/MediaFile", function(require, exports, module) {
-var utils = require('cordova/utils'),
- exec = require('cordova/exec'),
- File = require('cordova/plugin/File'),
- CaptureError = require('cordova/plugin/CaptureError');
-/**
- * Represents a single file.
- *
- * name {DOMString} name of the file, without path information
- * fullPath {DOMString} the full path of the file, including the name
- * type {DOMString} mime type
- * lastModifiedDate {Date} last modified date
- * size {Number} size of the file in bytes
- */
-var MediaFile = function(name, fullPath, type, lastModifiedDate, size){
- MediaFile.__super__.constructor.apply(this, arguments);
-};
-
-utils.extend(MediaFile, File);
-
-/**
- * Request capture format data for a specific file and type
- *
- * @param {Function} successCB
- * @param {Function} errorCB
- */
-MediaFile.prototype.getFormatData = function(successCallback, errorCallback) {
- if (typeof this.fullPath === "undefined" || this.fullPath === null) {
- errorCallback(new CaptureError(CaptureError.CAPTURE_INVALID_ARGUMENT));
- } else {
- exec(successCallback, errorCallback, "Capture", "getFormatData", [this.fullPath, this.type]);
- }
-};
-
-// TODO: can we axe this?
-/**
- * Casts a PluginResult message property (array of objects) to an array of MediaFile objects
- * (used in Objective-C and Android)
- *
- * @param {PluginResult} pluginResult
- */
-MediaFile.cast = function(pluginResult) {
- var mediaFiles = [];
- for (var i=0; i<pluginResult.message.length; i++) {
- var mediaFile = new MediaFile();
- mediaFile.name = pluginResult.message[i].name;
- mediaFile.fullPath = pluginResult.message[i].fullPath;
- mediaFile.type = pluginResult.message[i].type;
- mediaFile.lastModifiedDate = pluginResult.message[i].lastModifiedDate;
- mediaFile.size = pluginResult.message[i].size;
- mediaFiles.push(mediaFile);
- }
- pluginResult.message = mediaFiles;
- return pluginResult;
-};
-
-module.exports = MediaFile;
-
-});
-
-// file: lib/common/plugin/MediaFileData.js
-define("cordova/plugin/MediaFileData", function(require, exports, module) {
-/**
- * MediaFileData encapsulates format information of a media file.
- *
- * @param {DOMString} codecs
- * @param {long} bitrate
- * @param {long} height
- * @param {long} width
- * @param {float} duration
- */
-var MediaFileData = function(codecs, bitrate, height, width, duration){
- this.codecs = codecs || null;
- this.bitrate = bitrate || 0;
- this.height = height || 0;
- this.width = width || 0;
- this.duration = duration || 0;
-};
-
-module.exports = MediaFileData;
-});
-
-// file: lib/common/plugin/Metadata.js
-define("cordova/plugin/Metadata", function(require, exports, module) {
-/**
- * Information about the state of the file or directory
- *
- * {Date} modificationTime (readonly)
- */
-var Metadata = function(time) {
- this.modificationTime = (typeof time != 'undefined'?new Date(time):null);
-};
-
-module.exports = Metadata;
-});
-
-// file: lib/common/plugin/Position.js
-define("cordova/plugin/Position", function(require, exports, module) {
-var Coordinates = require('cordova/plugin/Coordinates');
-
-var Position = function(coords, timestamp) {
- if (coords) {
- this.coords = new Coordinates(coords.latitude, coords.longitude, coords.altitude, coords.accuracy, coords.heading, coords.velocity, coords.altitudeAccuracy);
- } else {
- this.coords = new Coordinates();
- }
- this.timestamp = (timestamp !== undefined) ? timestamp : new Date();
-};
-
-module.exports = Position;
-
-});
-
-// file: lib/common/plugin/PositionError.js
-define("cordova/plugin/PositionError", function(require, exports, module) {
-/**
- * Position error object
- *
- * @constructor
- * @param code
- * @param message
- */
-var PositionError = function(code, message) {
- this.code = code || null;
- this.message = message || '';
-};
-
-PositionError.PERMISSION_DENIED = 1;
-PositionError.POSITION_UNAVAILABLE = 2;
-PositionError.TIMEOUT = 3;
-
-module.exports = PositionError;
-});
-
-// file: lib/common/plugin/ProgressEvent.js
-define("cordova/plugin/ProgressEvent", function(require, exports, module) {
-// If ProgressEvent exists in global context, use it already, otherwise use our own polyfill
-// Feature test: See if we can instantiate a native ProgressEvent;
-// if so, use that approach,
-// otherwise fill-in with our own implementation.
-//
-// NOTE: right now we always fill in with our own. Down the road would be nice if we can use whatever is native in the webview.
-var ProgressEvent = (function() {
- /*
- var createEvent = function(data) {
- var event = document.createEvent('Events');
- event.initEvent('ProgressEvent', false, false);
- if (data) {
- for (var i in data) {
- if (data.hasOwnProperty(i)) {
- event[i] = data[i];
- }
- }
- if (data.target) {
- // TODO: cannot call <some_custom_object>.dispatchEvent
- // need to first figure out how to implement EventTarget
- }
- }
- return event;
- };
- try {
- var ev = createEvent({type:"abort",target:document});
- return function ProgressEvent(type, data) {
- data.type = type;
- return createEvent(data);
- };
- } catch(e){
- */
- return function ProgressEvent(type, dict) {
- this.type = type;
- this.bubbles = false;
- this.cancelBubble = false;
- this.cancelable = false;
- this.lengthComputable = false;
- this.loaded = dict && dict.loaded ? dict.loaded : 0;
- this.total = dict && dict.total ? dict.total : 0;
- this.target = dict && dict.target ? dict.target : null;
- };
- //}
-})();
-
-module.exports = ProgressEvent;
-});
-
-// file: lib/common/plugin/accelerometer.js
-define("cordova/plugin/accelerometer", function(require, exports, module) {
-/**
- * This class provides access to device accelerometer data.
- * @constructor
- */
-var utils = require("cordova/utils"),
- exec = require("cordova/exec"),
- Acceleration = require('cordova/plugin/Acceleration');
-
-// Is the accel sensor running?
-var running = false;
-
-// Keeps reference to watchAcceleration calls.
-var timers = {};
-
-// Array of listeners; used to keep track of when we should call start and stop.
-var listeners = [];
-
-// Last returned acceleration object from native
-var accel = null;
-
-// Tells native to start.
-function start() {
- exec(function(a) {
- var tempListeners = listeners.slice(0);
- accel = new Acceleration(a.x, a.y, a.z, a.timestamp);
- for (var i = 0, l = tempListeners.length; i < l; i++) {
- tempListeners[i].win(accel);
- }
- }, function(e) {
- var tempListeners = listeners.slice(0);
- for (var i = 0, l = tempListeners.length; i < l; i++) {
- tempListeners[i].fail(e);
- }
- }, "Accelerometer", "start", []);
- running = true;
-}
-
-// Tells native to stop.
-function stop() {
- exec(null, null, "Accelerometer", "stop", []);
- running = false;
-}
-
-// Adds a callback pair to the listeners array
-function createCallbackPair(win, fail) {
- return {win:win, fail:fail};
-}
-
-// Removes a win/fail listener pair from the listeners array
-function removeListeners(l) {
- var idx = listeners.indexOf(l);
- if (idx > -1) {
- listeners.splice(idx, 1);
- if (listeners.length === 0) {
- stop();
- }
- }
-}
-
-var accelerometer = {
- /**
- * Asynchronously aquires the current acceleration.
- *
- * @param {Function} successCallback The function to call when the acceleration data is available
- * @param {Function} errorCallback The function to call when there is an error getting the acceleration data. (OPTIONAL)
- * @param {AccelerationOptions} options The options for getting the accelerometer data such as timeout. (OPTIONAL)
- */
- getCurrentAcceleration: function(successCallback, errorCallback, options) {
- // successCallback required
- if (typeof successCallback !== "function") {
- throw "getCurrentAcceleration must be called with at least a success callback function as first parameter.";
- }
-
- var p;
- var win = function(a) {
- successCallback(a);
- removeListeners(p);
- };
- var fail = function(e) {
- errorCallback(e);
- removeListeners(p);
- };
-
- p = createCallbackPair(win, fail);
- listeners.push(p);
-
- if (!running) {
- start();
- }
- },
-
- /**
- * Asynchronously aquires the acceleration repeatedly at a given interval.
- *
- * @param {Function} successCallback The function to call each time the acceleration data is available
- * @param {Function} errorCallback The function to call when there is an error getting the acceleration data. (OPTIONAL)
- * @param {AccelerationOptions} options The options for getting the accelerometer data such as timeout. (OPTIONAL)
- * @return String The watch id that must be passed to #clearWatch to stop watching.
- */
- watchAcceleration: function(successCallback, errorCallback, options) {
- // Default interval (10 sec)
- var frequency = (options && options.frequency && typeof options.frequency == 'number') ? options.frequency : 10000;
-
- // successCallback required
- if (typeof successCallback !== "function") {
- throw "watchAcceleration must be called with at least a success callback function as first parameter.";
- }
-
- // Keep reference to watch id, and report accel readings as often as defined in frequency
- var id = utils.createUUID();
-
- var p = createCallbackPair(function(){}, function(e) {
- errorCallback(e);
- removeListeners(p);
- });
- listeners.push(p);
-
- timers[id] = {
- timer:window.setInterval(function() {
- if (accel) {
- successCallback(accel);
- }
- }, frequency),
- listeners:p
- };
-
- if (running) {
- // If we're already running then immediately invoke the success callback
- successCallback(accel);
- } else {
- start();
- }
-
- return id;
- },
-
- /**
- * Clears the specified accelerometer watch.
- *
- * @param {String} id The id of the watch returned from #watchAcceleration.
- */
- clearWatch: function(id) {
- // Stop javascript timer & remove from timer list
- if (id && timers[id]) {
- window.clearInterval(timers[id].timer);
- removeListeners(timers[id].listeners);
- delete timers[id];
- }
- }
-};
-
-module.exports = accelerometer;
-
-});
-
-// file: lib/common/plugin/battery.js
-define("cordova/plugin/battery", function(require, exports, module) {
-/**
- * This class contains information about the current battery status.
- * @constructor
- */
-var cordova = require('cordova'),
- exec = require('cordova/exec');
-
-function handlers() {
- return battery.channels.batterystatus.numHandlers +
- battery.channels.batterylow.numHandlers +
- battery.channels.batterycritical.numHandlers;
-}
-
-var Battery = function() {
- this._level = null;
- this._isPlugged = null;
- // Create new event handlers on the window (returns a channel instance)
- var subscriptionEvents = {
- onSubscribe:this.onSubscribe,
- onUnsubscribe:this.onUnsubscribe
- };
- this.channels = {
- batterystatus:cordova.addWindowEventHandler("batterystatus", subscriptionEvents),
- batterylow:cordova.addWindowEventHandler("batterylow", subscriptionEvents),
- batterycritical:cordova.addWindowEventHandler("batterycritical", subscriptionEvents)
- };
-};
-/**
- * Event handlers for when callbacks get registered for the battery.
- * Keep track of how many handlers we have so we can start and stop the native battery listener
- * appropriately (and hopefully save on battery life!).
- */
-Battery.prototype.onSubscribe = function() {
- var me = battery;
- // If we just registered the first handler, make sure native listener is started.
- if (handlers() === 1) {
- exec(me._status, me._error, "Battery", "start", []);
- }
-};
-
-Battery.prototype.onUnsubscribe = function() {
- var me = battery;
-
- // If we just unregistered the last handler, make sure native listener is stopped.
- if (handlers() === 0) {
- exec(null, null, "Battery", "stop", []);
- }
-};
-
-/**
- * Callback for battery status
- *
- * @param {Object} info keys: level, isPlugged
- */
-Battery.prototype._status = function(info) {
- if (info) {
- var me = battery;
- var level = info.level;
- if (me._level !== level || me._isPlugged !== info.isPlugged) {
- // Fire batterystatus event
- cordova.fireWindowEvent("batterystatus", info);
-
- // Fire low battery event
- if (level === 20 || level === 5) {
- if (level === 20) {
- cordova.fireWindowEvent("batterylow", info);
- }
- else {
- cordova.fireWindowEvent("batterycritical", info);
- }
- }
- }
- me._level = level;
- me._isPlugged = info.isPlugged;
- }
-};
-
-/**
- * Error callback for battery start
- */
-Battery.prototype._error = function(e) {
- console.log("Error initializing Battery: " + e);
-};
-
-var battery = new Battery();
-
-module.exports = battery;
-});
-
-// file: lib/common/plugin/capture.js
-define("cordova/plugin/capture", function(require, exports, module) {
-var exec = require('cordova/exec'),
- MediaFile = require('cordova/plugin/MediaFile');
-
-/**
- * Launches a capture of different types.
- *
- * @param (DOMString} type
- * @param {Function} successCB
- * @param {Function} errorCB
- * @param {CaptureVideoOptions} options
- */
-function _capture(type, successCallback, errorCallback, options) {
- var win = function(pluginResult) {
- var mediaFiles = [];
- var i;
- for (i = 0; i < pluginResult.length; i++) {
- var mediaFile = new MediaFile();
- mediaFile.name = pluginResult[i].name;
- mediaFile.fullPath = pluginResult[i].fullPath;
- mediaFile.type = pluginResult[i].type;
- mediaFile.lastModifiedDate = pluginResult[i].lastModifiedDate;
- mediaFile.size = pluginResult[i].size;
- mediaFiles.push(mediaFile);
- }
- successCallback(mediaFiles);
- };
- exec(win, errorCallback, "Capture", type, [options]);
-}
-/**
- * The Capture interface exposes an interface to the camera and microphone of the hosting device.
- */
-function Capture() {
- this.supportedAudioModes = [];
- this.supportedImageModes = [];
- this.supportedVideoModes = [];
-}
-
-/**
- * Launch audio recorder application for recording audio clip(s).
- *
- * @param {Function} successCB
- * @param {Function} errorCB
- * @param {CaptureAudioOptions} options
- */
-Capture.prototype.captureAudio = function(successCallback, errorCallback, options){
- _capture("captureAudio", successCallback, errorCallback, options);
-};
-
-/**
- * Launch camera application for taking image(s).
- *
- * @param {Function} successCB
- * @param {Function} errorCB
- * @param {CaptureImageOptions} options
- */
-Capture.prototype.captureImage = function(successCallback, errorCallback, options){
- _capture("captureImage", successCallback, errorCallback, options);
-};
-
-/**
- * Launch device camera application for recording video(s).
- *
- * @param {Function} successCB
- * @param {Function} errorCB
- * @param {CaptureVideoOptions} options
- */
-Capture.prototype.captureVideo = function(successCallback, errorCallback, options){
- _capture("captureVideo", successCallback, errorCallback, options);
-};
-
-
-module.exports = new Capture();
-
-});
-
-// file: lib/common/plugin/compass.js
-define("cordova/plugin/compass", function(require, exports, module) {
-var exec = require('cordova/exec'),
- utils = require('cordova/utils'),
- CompassHeading = require('cordova/plugin/CompassHeading'),
- CompassError = require('cordova/plugin/CompassError'),
- timers = {},
- compass = {
- /**
- * Asynchronously acquires the current heading.
- * @param {Function} successCallback The function to call when the heading
- * data is available
- * @param {Function} errorCallback The function to call when there is an error
- * getting the heading data.
- * @param {CompassOptions} options The options for getting the heading data (not used).
- */
- getCurrentHeading:function(successCallback, errorCallback, options) {
- // successCallback required
- if (typeof successCallback !== "function") {
- console.log("Compass Error: successCallback is not a function");
- return;
- }
-
- // errorCallback optional
- if (errorCallback && (typeof errorCallback !== "function")) {
- console.log("Compass Error: errorCallback is not a function");
- return;
- }
-
- var win = function(result) {
- var ch = new CompassHeading(result.magneticHeading, result.trueHeading, result.headingAccuracy, result.timestamp);
- successCallback(ch);
- };
- var fail = function(code) {
- var ce = new CompassError(code);
- errorCallback(ce);
- };
-
- // Get heading
- exec(win, fail, "Compass", "getHeading", [options]);
- },
-
- /**
- * Asynchronously acquires the heading repeatedly at a given interval.
- * @param {Function} successCallback The function to call each time the heading
- * data is available
- * @param {Function} errorCallback The function to call when there is an error
- * getting the heading data.
- * @param {HeadingOptions} options The options for getting the heading data
- * such as timeout and the frequency of the watch. For iOS, filter parameter
- * specifies to watch via a distance filter rather than time.
- */
- watchHeading:function(successCallback, errorCallback, options) {
- // Default interval (100 msec)
- var frequency = (options !== undefined && options.frequency !== undefined) ? options.frequency : 100;
- var filter = (options !== undefined && options.filter !== undefined) ? options.filter : 0;
-
- // successCallback required
- if (typeof successCallback !== "function") {
- console.log("Compass Error: successCallback is not a function");
- return;
- }
-
- // errorCallback optional
- if (errorCallback && (typeof errorCallback !== "function")) {
- console.log("Compass Error: errorCallback is not a function");
- return;
- }
-
- var id = utils.createUUID();
- if (filter > 0) {
- // is an iOS request for watch by filter, no timer needed
- timers[id] = "iOS";
- compass.getCurrentHeading(successCallback, errorCallback, options);
- } else {
- // Start watch timer to get headings
- timers[id] = window.setInterval(function() {
- compass.getCurrentHeading(successCallback, errorCallback);
- }, frequency);
- }
-
- return id;
- },
-
- /**
- * Clears the specified heading watch.
- * @param {String} watchId The ID of the watch returned from #watchHeading.
- */
- clearWatch:function(id) {
- // Stop javascript timer & remove from timer list
- if (id && timers[id]) {
- if (timers[id] != "iOS") {
- clearInterval(timers[id]);
- } else {
- // is iOS watch by filter so call into device to stop
- exec(null, null, "Compass", "stopHeading", []);
- }
- delete timers[id];
- }
- }
- };
-
-module.exports = compass;
-});
-
-// file: lib/common/plugin/console-via-logger.js
-define("cordova/plugin/console-via-logger", function(require, exports, module) {
-//------------------------------------------------------------------------------
-
-var logger = require("cordova/plugin/logger");
-var utils = require("cordova/utils");
-
-//------------------------------------------------------------------------------
-// object that we're exporting
-//------------------------------------------------------------------------------
-var console = module.exports;
-
-//------------------------------------------------------------------------------
-// copy of the original console object
-//------------------------------------------------------------------------------
-var WinConsole = window.console;
-
-//------------------------------------------------------------------------------
-// whether to use the logger
-//------------------------------------------------------------------------------
-var UseLogger = false;
-
-//------------------------------------------------------------------------------
-// Timers
-//------------------------------------------------------------------------------
-var Timers = {};
-
-//------------------------------------------------------------------------------
-// used for unimplemented methods
-//------------------------------------------------------------------------------
-function noop() {}
-
-//------------------------------------------------------------------------------
-// used for unimplemented methods
-//------------------------------------------------------------------------------
-console.useLogger = function (value) {
- if (arguments.length) UseLogger = !!value;
-
- if (UseLogger) {
- if (logger.useConsole()) {
- throw new Error("console and logger are too intertwingly");
- }
- }
-
- return UseLogger;
-};
-
-//------------------------------------------------------------------------------
-console.log = function() {
- if (logger.useConsole()) return;
- logger.log.apply(logger, [].slice.call(arguments));
-};
-
-//------------------------------------------------------------------------------
-console.error = function() {
- if (logger.useConsole()) return;
- logger.error.apply(logger, [].slice.call(arguments));
-};
-
-//------------------------------------------------------------------------------
-console.warn = function() {
- if (logger.useConsole()) return;
- logger.warn.apply(logger, [].slice.call(arguments));
-};
-
-//------------------------------------------------------------------------------
-console.info = function() {
- if (logger.useConsole()) return;
- logger.info.apply(logger, [].slice.call(arguments));
-};
-
-//------------------------------------------------------------------------------
-console.debug = function() {
- if (logger.useConsole()) return;
- logger.debug.apply(logger, [].slice.call(arguments));
-};
-
-//------------------------------------------------------------------------------
-console.assert = function(expression) {
- if (expression) return;
-
- var message = utils.vformat(arguments[1], [].slice.call(arguments, 2));
- console.log("ASSERT: " + message);
-};
-
-//------------------------------------------------------------------------------
-console.clear = function() {};
-
-//------------------------------------------------------------------------------
-console.dir = function(object) {
- console.log("%o", object);
-};
-
-//------------------------------------------------------------------------------
-console.dirxml = function(node) {
- console.log(node.innerHTML);
-};
-
-//------------------------------------------------------------------------------
-console.trace = noop;
-
-//------------------------------------------------------------------------------
-console.group = console.log;
-
-//------------------------------------------------------------------------------
-console.groupCollapsed = console.log;
-
-//------------------------------------------------------------------------------
-console.groupEnd = noop;
-
-//------------------------------------------------------------------------------
-console.time = function(name) {
- Timers[name] = new Date().valueOf();
-};
-
-//------------------------------------------------------------------------------
-console.timeEnd = function(name) {
- var timeStart = Timers[name];
- if (!timeStart) {
- console.warn("unknown timer: " + name);
- return;
- }
-
- var timeElapsed = new Date().valueOf() - timeStart;
- console.log(name + ": " + timeElapsed + "ms");
-};
-
-//------------------------------------------------------------------------------
-console.timeStamp = noop;
-
-//------------------------------------------------------------------------------
-console.profile = noop;
-
-//------------------------------------------------------------------------------
-console.profileEnd = noop;
-
-//------------------------------------------------------------------------------
-console.count = noop;
-
-//------------------------------------------------------------------------------
-console.exception = console.log;
-
-//------------------------------------------------------------------------------
-console.table = function(data, columns) {
- console.log("%o", data);
-};
-
-//------------------------------------------------------------------------------
-// return a new function that calls both functions passed as args
-//------------------------------------------------------------------------------
-function wrapperedOrigCall(orgFunc, newFunc) {
- return function() {
- var args = [].slice.call(arguments);
- try { orgFunc.apply(WinConsole, args); } catch (e) {}
- try { newFunc.apply(console, args); } catch (e) {}
- };
-}
-
-//------------------------------------------------------------------------------
-// For every function that exists in the original console object, that
-// also exists in the new console object, wrap the new console method
-// with one that calls both
-//------------------------------------------------------------------------------
-for (var key in console) {
- if (typeof WinConsole[key] == "function") {
- console[key] = wrapperedOrigCall(WinConsole[key], console[key]);
- }
-}
-
-});
-
-// file: lib/common/plugin/contacts.js
-define("cordova/plugin/contacts", function(require, exports, module) {
-var exec = require('cordova/exec'),
- ContactError = require('cordova/plugin/ContactError'),
- utils = require('cordova/utils'),
- Contact = require('cordova/plugin/Contact');
-
-/**
-* Represents a group of Contacts.
-* @constructor
-*/
-var contacts = {
- /**
- * Returns an array of Contacts matching the search criteria.
- * @param fields that should be searched
- * @param successCB success callback
- * @param errorCB error callback
- * @param {ContactFindOptions} options that can be applied to contact searching
- * @return array of Contacts matching search criteria
- */
- find:function(fields, successCB, errorCB, options) {
- if (!successCB) {
- throw new TypeError("You must specify a success callback for the find command.");
- }
- if (!fields || (utils.isArray(fields) && fields.length === 0)) {
- if (typeof errorCB === "function") {
- errorCB(new ContactError(ContactError.INVALID_ARGUMENT_ERROR));
- }
- } else {
- var win = function(result) {
- var cs = [];
- for (var i = 0, l = result.length; i < l; i++) {
- cs.push(contacts.create(result[i]));
- }
- successCB(cs);
- };
- exec(win, errorCB, "Contacts", "search", [fields, options]);
- }
- },
-
- /**
- * This function creates a new contact, but it does not persist the contact
- * to device storage. To persist the contact to device storage, invoke
- * contact.save().
- * @param properties an object who's properties will be examined to create a new Contact
- * @returns new Contact object
- */
- create:function(properties) {
- var i;
- var contact = new Contact();
- for (i in properties) {
- if (typeof contact[i] !== 'undefined' && properties.hasOwnProperty(i)) {
- contact[i] = properties[i];
- }
- }
- return contact;
- }
-};
-
-module.exports = contacts;
-
-});
-
-// file: lib/common/plugin/geolocation.js
-define("cordova/plugin/geolocation", function(require, exports, module) {
-var utils = require('cordova/utils'),
- exec = require('cordova/exec'),
- PositionError = require('cordova/plugin/PositionError'),
- Position = require('cordova/plugin/Position');
-
-var timers = {}; // list of timers in use
-
-// Returns default params, overrides if provided with values
-function parseParameters(options) {
- var opt = {
- maximumAge: 0,
- enableHighAccuracy: false,
- timeout: Infinity
- };
-
- if (options) {
- if (options.maximumAge !== undefined && !isNaN(options.maximumAge) && options.maximumAge > 0) {
- opt.maximumAge = options.maximumAge;
- }
- if (options.enableHighAccuracy !== undefined) {
- opt.enableHighAccuracy = options.enableHighAccuracy;
- }
- if (options.timeout !== undefined && !isNaN(options.timeout)) {
- if (options.timeout < 0) {
- opt.timeout = 0;
- } else {
- opt.timeout = options.timeout;
- }
- }
- }
-
- return opt;
-}
-
-// Returns a timeout failure, closed over a specified timeout value and error callback.
-function createTimeout(errorCallback, timeout) {
- var t = setTimeout(function() {
- clearTimeout(t);
- t = null;
- errorCallback({
- code:PositionError.TIMEOUT,
- message:"Position retrieval timed out."
- });
- }, timeout);
- return t;
-}
-
-var geolocation = {
- lastPosition:null, // reference to last known (cached) position returned
- /**
- * Asynchronously aquires the current position.
- *
- * @param {Function} successCallback The function to call when the position data is available
- * @param {Function} errorCallback The function to call when there is an error getting the heading position. (OPTIONAL)
- * @param {PositionOptions} options The options for getting the position data. (OPTIONAL)
- */
- getCurrentPosition:function(successCallback, errorCallback, options) {
- if (arguments.length === 0) {
- throw new Error("getCurrentPosition must be called with at least one argument.");
- }
- options = parseParameters(options);
-
- // Timer var that will fire an error callback if no position is retrieved from native
- // before the "timeout" param provided expires
- var timeoutTimer = null;
-
- var win = function(p) {
- clearTimeout(timeoutTimer);
- if (!timeoutTimer) {
- // Timeout already happened, or native fired error callback for
- // this geo request.
- // Don't continue with success callback.
- return;
- }
- var pos = new Position(
- {
- latitude:p.latitude,
- longitude:p.longitude,
- altitude:p.altitude,
- accuracy:p.accuracy,
- heading:p.heading,
- velocity:p.velocity,
- altitudeAccuracy:p.altitudeAccuracy
- },
- (p.timestamp === undefined ? new Date() : ((p.timestamp instanceof Date) ? p.timestamp : new Date(p.timestamp)))
- );
- geolocation.lastPosition = pos;
- successCallback(pos);
- };
- var fail = function(e) {
- clearTimeout(timeoutTimer);
- timeoutTimer = null;
- var err = new PositionError(e.code, e.message);
- if (errorCallback) {
- errorCallback(err);
- }
- };
-
- // Check our cached position, if its timestamp difference with current time is less than the maximumAge, then just
- // fire the success callback with the cached position.
- if (geolocation.lastPosition && options.maximumAge && (((new Date()).getTime() - geolocation.lastPosition.timestamp.getTime()) <= options.maximumAge)) {
- successCallback(geolocation.lastPosition);
- // If the cached position check failed and the timeout was set to 0, error out with a TIMEOUT error object.
- } else if (options.timeout === 0) {
- fail({
- code:PositionError.TIMEOUT,
- message:"timeout value in PositionOptions set to 0 and no cached Position object available, or cached Position object's age exceed's provided PositionOptions' maximumAge parameter."
- });
- // Otherwise we have to call into native to retrieve a position.
- } else {
- if (options.timeout !== Infinity) {
- // If the timeout value was not set to Infinity (default), then
- // set up a timeout function that will fire the error callback
- // if no successful position was retrieved before timeout expired.
- timeoutTimer = createTimeout(fail, options.timeout);
- } else {
- // This is here so the check in the win function doesn't mess stuff up
- // may seem weird but this guarantees timeoutTimer is
- // always truthy before we call into native
- timeoutTimer = true;
- }
- exec(win, fail, "Geolocation", "getLocation", [options.enableHighAccuracy, options.maximumAge]);
- }
- return timeoutTimer;
- },
- /**
- * Asynchronously watches the geolocation for changes to geolocation. When a change occurs,
- * the successCallback is called with the new location.
- *
- * @param {Function} successCallback The function to call each time the location data is available
- * @param {Function} errorCallback The function to call when there is an error getting the location data. (OPTIONAL)
- * @param {PositionOptions} options The options for getting the location data such as frequency. (OPTIONAL)
- * @return String The watch id that must be passed to #clearWatch to stop watching.
- */
- watchPosition:function(successCallback, errorCallback, options) {
- if (arguments.length === 0) {
- throw new Error("watchPosition must be called with at least one argument.");
- }
- options = parseParameters(options);
-
- var id = utils.createUUID();
-
- // Tell device to get a position ASAP, and also retrieve a reference to the timeout timer generated in getCurrentPosition
- timers[id] = geolocation.getCurrentPosition(successCallback, errorCallback, options);
-
- var fail = function(e) {
- clearTimeout(timers[id]);
- var err = new PositionError(e.code, e.message);
- if (errorCallback) {
- errorCallback(err);
- }
- };
-
- var win = function(p) {
- clearTimeout(timers[id]);
- if (options.timeout !== Infinity) {
- timers[id] = createTimeout(fail, options.timeout);
- }
- var pos = new Position(
- {
- latitude:p.latitude,
- longitude:p.longitude,
- altitude:p.altitude,
- accuracy:p.accuracy,
- heading:p.heading,
- velocity:p.velocity,
- altitudeAccuracy:p.altitudeAccuracy
- },
- (p.timestamp === undefined ? new Date() : ((p.timestamp instanceof Date) ? p.timestamp : new Date(p.timestamp)))
- );
- geolocation.lastPosition = pos;
- successCallback(pos);
- };
-
- exec(win, fail, "Geolocation", "addWatch", [id, options.enableHighAccuracy]);
-
- return id;
- },
- /**
- * Clears the specified heading watch.
- *
- * @param {String} id The ID of the watch returned from #watchPosition
- */
- clearWatch:function(id) {
- if (id && timers[id] !== undefined) {
- clearTimeout(timers[id]);
- delete timers[id];
- exec(null, null, "Geolocation", "clearWatch", [id]);
- }
- }
-};
-
-module.exports = geolocation;
-
-});
-
-// file: lib/ios/plugin/ios/Contact.js
-define("cordova/plugin/ios/Contact", function(require, exports, module) {
-var exec = require('cordova/exec'),
- ContactError = require('cordova/plugin/ContactError');
-
-/**
- * Provides iOS Contact.display API.
- */
-module.exports = {
- display : function(errorCB, options) {
- /*
- * Display a contact using the iOS Contact Picker UI
- * NOT part of W3C spec so no official documentation
- *
- * @param errorCB error callback
- * @param options object
- * allowsEditing: boolean AS STRING
- * "true" to allow editing the contact
- * "false" (default) display contact
- */
-
- if (this.id === null) {
- if (typeof errorCB === "function") {
- var errorObj = new ContactError(ContactError.UNKNOWN_ERROR);
- errorCB(errorObj);
- }
- }
- else {
- exec(null, errorCB, "Contacts","displayContact", [this.id, options]);
- }
- }
-};
-});
-
-// file: lib/ios/plugin/ios/Entry.js
-define("cordova/plugin/ios/Entry", function(require, exports, module) {
-module.exports = {
- toURL:function() {
- // TODO: refactor path in a cross-platform way so we can eliminate
- // these kinds of platform-specific hacks.
- return "file://localhost" + this.fullPath;
- },
- toURI: function() {
- console.log("DEPRECATED: Update your code to use 'toURL'");
- return "file://localhost" + this.fullPath;
- }
-};
-});
-
-// file: lib/ios/plugin/ios/FileReader.js
-define("cordova/plugin/ios/FileReader", function(require, exports, module) {
-var exec = require('cordova/exec'),
- FileError = require('cordova/plugin/FileError'),
- FileReader = require('cordova/plugin/FileReader'),
- ProgressEvent = require('cordova/plugin/ProgressEvent');
-
-module.exports = {
- readAsText:function(file, encoding) {
- // Figure out pathing
- this.fileName = '';
- if (typeof file.fullPath === 'undefined') {
- this.fileName = file;
- } else {
- this.fileName = file.fullPath;
- }
-
- // Already loading something
- if (this.readyState == FileReader.LOADING) {
- throw new FileError(FileError.INVALID_STATE_ERR);
- }
-
- // LOADING state
- this.readyState = FileReader.LOADING;
-
- // If loadstart callback
- if (typeof this.onloadstart === "function") {
- this.onloadstart(new ProgressEvent("loadstart", {target:this}));
- }
-
- // Default encoding is UTF-8
- var enc = encoding ? encoding : "UTF-8";
-
- var me = this;
-
- // Read file
- exec(
- // Success callback
- function(r) {
- // If DONE (cancelled), then don't do anything
- if (me.readyState === FileReader.DONE) {
- return;
- }
-
- // Save result
- me.result = decodeURIComponent(r);
-
- // If onload callback
- if (typeof me.onload === "function") {
- me.onload(new ProgressEvent("load", {target:me}));
- }
-
- // DONE state
- me.readyState = FileReader.DONE;
-
- // If onloadend callback
- if (typeof me.onloadend === "function") {
- me.onloadend(new ProgressEvent("loadend", {target:me}));
- }
- },
- // Error callback
- function(e) {
- // If DONE (cancelled), then don't do anything
- if (me.readyState === FileReader.DONE) {
- return;
- }
-
- // DONE state
- me.readyState = FileReader.DONE;
-
- // null result
- me.result = null;
-
- // Save error
- me.error = new FileError(e);
-
- // If onerror callback
- if (typeof me.onerror === "function") {
- me.onerror(new ProgressEvent("error", {target:me}));
- }
-
- // If onloadend callback
- if (typeof me.onloadend === "function") {
- me.onloadend(new ProgressEvent("loadend", {target:me}));
- }
- },
- "File", "readAsText", [this.fileName, enc]);
- }
-};
-});
-
-// file: lib/ios/plugin/ios/console.js
-define("cordova/plugin/ios/console", function(require, exports, module) {
-var exec = require('cordova/exec');
-
-/**
- * This class provides access to the debugging console.
- * @constructor
- */
-var DebugConsole = function() {
- this.winConsole = window.console;
- this.logLevel = DebugConsole.INFO_LEVEL;
-};
-
-// from most verbose, to least verbose
-DebugConsole.ALL_LEVEL = 1; // same as first level
-DebugConsole.INFO_LEVEL = 1;
-DebugConsole.WARN_LEVEL = 2;
-DebugConsole.ERROR_LEVEL = 4;
-DebugConsole.NONE_LEVEL = 8;
-
-DebugConsole.prototype.setLevel = function(level) {
- this.logLevel = level;
-};
-
-var stringify = function(message) {
- try {
- if (typeof message === "object" && JSON && JSON.stringify) {
- try {
- return JSON.stringify(message);
- }
- catch (e) {
- return "error JSON.stringify()ing argument: " + e;
- }
- } else {
- return message.toString();
- }
- } catch (e) {
- return e.toString();
- }
-};
-
-/**
- * Print a normal log message to the console
- * @param {Object|String} message Message or object to print to the console
- */
-DebugConsole.prototype.log = function(message) {
- if (this.logLevel <= DebugConsole.INFO_LEVEL) {
- exec(null, null, 'Debug Console', 'log', [ stringify(message), { logLevel: 'INFO' } ]);
- }
- else if (this.winConsole && this.winConsole.log) {
- this.winConsole.log(message);
- }
-};
-
-/**
- * Print a warning message to the console
- * @param {Object|String} message Message or object to print to the console
- */
-DebugConsole.prototype.warn = function(message) {
- if (this.logLevel <= DebugConsole.WARN_LEVEL) {
- exec(null, null, 'Debug Console', 'log', [ stringify(message), { logLevel: 'WARN' } ]);
- }
- else if (this.winConsole && this.winConsole.warn) {
- this.winConsole.warn(message);
- }
-};
-
-/**
- * Print an error message to the console
- * @param {Object|String} message Message or object to print to the console
- */
-DebugConsole.prototype.error = function(message) {
- if (this.logLevel <= DebugConsole.ERROR_LEVEL) {
- exec(null, null, 'Debug Console', 'log', [ stringify(message), { logLevel: 'ERROR' } ]);
- }
- else if (this.winConsole && this.winConsole.error){
- this.winConsole.error(message);
- }
-};
-
-module.exports = new DebugConsole();
-});
-
-// file: lib/ios/plugin/ios/contacts.js
-define("cordova/plugin/ios/contacts", function(require, exports, module) {
-var exec = require('cordova/exec');
-
-/**
- * Provides iOS enhanced contacts API.
- */
-module.exports = {
- newContactUI : function(successCallback) {
- /*
- * Create a contact using the iOS Contact Picker UI
- * NOT part of W3C spec so no official documentation
- *
- * returns: the id of the created contact as param to successCallback
- */
- exec(successCallback, null, "Contacts","newContact", []);
- },
- chooseContact : function(successCallback, options) {
- /*
- * Select a contact using the iOS Contact Picker UI
- * NOT part of W3C spec so no official documentation
- *
- * @param errorCB error callback
- * @param options object
- * allowsEditing: boolean AS STRING
- * "true" to allow editing the contact
- * "false" (default) display contact
- *
- * returns: the id of the selected contact as param to successCallback
- */
- exec(successCallback, null, "Contacts","chooseContact", [options]);
- }
-};
-});
-
-// file: lib/ios/plugin/ios/device.js
-define("cordova/plugin/ios/device", function(require, exports, module) {
-/**
- * this represents the mobile device, and provides properties for inspecting the model, version, UUID of the
- * phone, etc.
- * @constructor
- */
-var exec = require('cordova/exec'),
- utils = require('cordova/utils'),
- channel = require('cordova/channel');
-
-var Device = function() {
- this.platform = null;
- this.version = null;
- this.name = null;
- this.cordova = null;
- this.uuid = null;
-};
-
-Device.prototype.setInfo = function(info) {
- try {
- this.platform = info.platform;
- this.version = info.version;
- this.name = info.name;
- this.cordova = info.cordova;
- this.uuid = info.uuid;
- channel.onCordovaInfoReady.fire();
- } catch(e) {
- utils.alert('Error during device info setting in cordova/plugin/ios/device!');
- }
-};
-
-module.exports = new Device();
-
-});
-
-// file: lib/ios/plugin/ios/nativecomm.js
-define("cordova/plugin/ios/nativecomm", function(require, exports, module) {
-var cordova = require('cordova');
-
-/**
- * Called by native code to retrieve all queued commands and clear the queue.
- */
-module.exports = function() {
- var json = JSON.stringify(cordova.commandQueue);
- cordova.commandQueue = [];
- return json;
-};
-});
-
-// file: lib/ios/plugin/ios/notification.js
-define("cordova/plugin/ios/notification", function(require, exports, module) {
-var Media = require('cordova/plugin/Media');
-
-module.exports = {
- beep:function(count) {
- (new Media('beep.wav')).play();
- }
-};
-});
-
-// file: lib/common/plugin/logger.js
-define("cordova/plugin/logger", function(require, exports, module) {
-//------------------------------------------------------------------------------
-// The logger module exports the following properties/functions:
-//
-// LOG - constant for the level LOG
-// ERROR - constant for the level ERROR
-// WARN - constant for the level WARN
-// INFO - constant for the level INFO
-// DEBUG - constant for the level DEBUG
-// logLevel() - returns current log level
-// logLevel(value) - sets and returns a new log level
-// useConsole() - returns whether logger is using console
-// useConsole(value) - sets and returns whether logger is using console
-// log(message,...) - logs a message at level LOG
-// error(message,...) - logs a message at level ERROR
-// warn(message,...) - logs a message at level WARN
-// info(message,...) - logs a message at level INFO
-// debug(message,...) - logs a message at level DEBUG
-// logLevel(level,message,...) - logs a message specified level
-//
-//------------------------------------------------------------------------------
-
-var logger = exports;
-
-var exec = require('cordova/exec');
-var utils = require('cordova/utils');
-
-var UseConsole = true;
-var Queued = [];
-var DeviceReady = false;
-var CurrentLevel;
-
-/**
- * Logging levels
- */
-
-var Levels = [
- "LOG",
- "ERROR",
- "WARN",
- "INFO",
- "DEBUG"
-];
-
-/*
- * add the logging levels to the logger object and
- * to a separate levelsMap object for testing
- */
-
-var LevelsMap = {};
-for (var i=0; i<Levels.length; i++) {
- var level = Levels[i];
- LevelsMap[level] = i;
- logger[level] = level;
-}
-
-CurrentLevel = LevelsMap.WARN;
-
-/**
- * Getter/Setter for the logging level
- *
- * Returns the current logging level.
- *
- * When a value is passed, sets the logging level to that value.
- * The values should be one of the following constants:
- * logger.LOG
- * logger.ERROR
- * logger.WARN
- * logger.INFO
- * logger.DEBUG
- *
- * The value used determines which messages get printed. The logging
- * values above are in order, and only messages logged at the logging
- * level or above will actually be displayed to the user. Eg, the
- * default level is WARN, so only messages logged with LOG, ERROR, or
- * WARN will be displayed; INFO and DEBUG messages will be ignored.
- */
-logger.level = function (value) {
- if (arguments.length) {
- if (LevelsMap[value] === null) {
- throw new Error("invalid logging level: " + value);
- }
- CurrentLevel = LevelsMap[value];
- }
-
- return Levels[CurrentLevel];
-};
-
-/**
- * Getter/Setter for the useConsole functionality
- *
- * When useConsole is true, the logger will log via the
- * browser 'console' object. Otherwise, it will use the
- * native Logger plugin.
- */
-logger.useConsole = function (value) {
- if (arguments.length) UseConsole = !!value;
-
- if (UseConsole) {
- if (typeof console == "undefined") {
- throw new Error("global console object is not defined");
- }
-
- if (typeof console.log != "function") {
- throw new Error("global console object does not have a log function");
- }
-
- if (typeof console.useLogger == "function") {
- if (console.useLogger()) {
- throw new Error("console and logger are too intertwingly");
- }
- }
- }
-
- return UseConsole;
-};
-
-/**
- * Logs a message at the LOG level.
- *
- * Parameters passed after message are used applied to
- * the message with utils.format()
- */
-logger.log = function(message) { logWithArgs("LOG", arguments); };
-
-/**
- * Logs a message at the ERROR level.
- *
- * Parameters passed after message are used applied to
- * the message with utils.format()
- */
-logger.error = function(message) { logWithArgs("ERROR", arguments); };
-
-/**
- * Logs a message at the WARN level.
- *
- * Parameters passed after message are used applied to
- * the message with utils.format()
- */
-logger.warn = function(message) { logWithArgs("WARN", arguments); };
-
-/**
- * Logs a message at the INFO level.
- *
- * Parameters passed after message are used applied to
- * the message with utils.format()
- */
-logger.info = function(message) { logWithArgs("INFO", arguments); };
-
-/**
- * Logs a message at the DEBUG level.
- *
- * Parameters passed after message are used applied to
- * the message with utils.format()
- */
-logger.debug = function(message) { logWithArgs("DEBUG", arguments); };
-
-// log at the specified level with args
-function logWithArgs(level, args) {
- args = [level].concat([].slice.call(args));
- logger.logLevel.apply(logger, args);
-}
-
-/**
- * Logs a message at the specified level.
- *
- * Parameters passed after message are used applied to
- * the message with utils.format()
- */
-logger.logLevel = function(level, message /* , ... */) {
- // format the message with the parameters
- var formatArgs = [].slice.call(arguments, 2);
- message = utils.vformat(message, formatArgs);
-
- if (LevelsMap[level] === null) {
- throw new Error("invalid logging level: " + level);
- }
-
- if (LevelsMap[level] > CurrentLevel) return;
-
- // queue the message if not yet at deviceready
- if (!DeviceReady && !UseConsole) {
- Queued.push([level, message]);
- return;
- }
-
- // if not using the console, use the native logger
- if (!UseConsole) {
- exec(null, null, "Logger", "logLevel", [level, message]);
- return;
- }
-
- // make sure console is not using logger
- if (console.__usingCordovaLogger) {
- throw new Error("console and logger are too intertwingly");
- }
-
- // log to the console
- switch (level) {
- case logger.LOG: console.log(message); break;
- case logger.ERROR: console.log("ERROR: " + message); break;
- case logger.WARN: console.log("WARN: " + message); break;
- case logger.INFO: console.log("INFO: " + message); break;
- case logger.DEBUG: console.log("DEBUG: " + message); break;
- }
-};
-
-// when deviceready fires, log queued messages
-logger.__onDeviceReady = function() {
- if (DeviceReady) return;
-
- DeviceReady = true;
-
- for (var i=0; i<Queued.length; i++) {
- var messageArgs = Queued[i];
- logger.logLevel(messageArgs[0], messageArgs[1]);
- }
-
- Queued = null;
-};
-
-// add a deviceready event to log queued messages
-document.addEventListener("deviceready", logger.__onDeviceReady, false);
-
-});
-
-// file: lib/common/plugin/network.js
-define("cordova/plugin/network", function(require, exports, module) {
-var exec = require('cordova/exec'),
- cordova = require('cordova'),
- channel = require('cordova/channel');
-
-var NetworkConnection = function () {
- this.type = null;
- this._firstRun = true;
- this._timer = null;
- this.timeout = 500;
-
- var me = this;
-
- channel.onCordovaReady.subscribeOnce(function() {
- me.getInfo(function (info) {
- me.type = info;
- if (info === "none") {
- // set a timer if still offline at the end of timer send the offline event
- me._timer = setTimeout(function(){
- cordova.fireDocumentEvent("offline");
- me._timer = null;
- }, me.timeout);
- } else {
- // If there is a current offline event pending clear it
- if (me._timer !== null) {
- clearTimeout(me._timer);
- me._timer = null;
- }
- cordova.fireDocumentEvent("online");
- }
-
- // should only fire this once
- if (me._firstRun) {
- me._firstRun = false;
- channel.onCordovaConnectionReady.fire();
- }
- },
- function (e) {
- // If we can't get the network info we should still tell Cordova
- // to fire the deviceready event.
- if (me._firstRun) {
- me._firstRun = false;
- channel.onCordovaConnectionReady.fire();
- }
- console.log("Error initializing Network Connection: " + e);
- });
- });
-};
-
-/**
- * Get connection info
- *
- * @param {Function} successCallback The function to call when the Connection data is available
- * @param {Function} errorCallback The function to call when there is an error getting the Connection data. (OPTIONAL)
- */
-NetworkConnection.prototype.getInfo = function (successCallback, errorCallback) {
- // Get info
- exec(successCallback, errorCallback, "NetworkStatus", "getConnectionInfo", []);
-};
-
-module.exports = new NetworkConnection();
-});
-
-// file: lib/common/plugin/notification.js
-define("cordova/plugin/notification", function(require, exports, module) {
-var exec = require('cordova/exec');
-
-/**
- * Provides access to notifications on the device.
- */
-
-module.exports = {
-
- /**
- * Open a native alert dialog, with a customizable title and button text.
- *
- * @param {String} message Message to print in the body of the alert
- * @param {Function} completeCallback The callback that is called when user clicks on a button.
- * @param {String} title Title of the alert dialog (default: Alert)
- * @param {String} buttonLabel Label of the close button (default: OK)
- */
- alert: function(message, completeCallback, title, buttonLabel) {
- var _title = (title || "Alert");
- var _buttonLabel = (buttonLabel || "OK");
- exec(completeCallback, null, "Notification", "alert", [message, _title, _buttonLabel]);
- },
-
- /**
- * Open a native confirm dialog, with a customizable title and button text.
- * The result that the user selects is returned to the result callback.
- *
- * @param {String} message Message to print in the body of the alert
- * @param {Function} resultCallback The callback that is called when user clicks on a button.
- * @param {String} title Title of the alert dialog (default: Confirm)
- * @param {String} buttonLabels Comma separated list of the labels of the buttons (default: 'OK,Cancel')
- */
- confirm: function(message, resultCallback, title, buttonLabels) {
- var _title = (title || "Confirm");
- var _buttonLabels = (buttonLabels || "OK,Cancel");
- exec(resultCallback, null, "Notification", "confirm", [message, _title, _buttonLabels]);
- },
-
- /**
- * Causes the device to vibrate.
- *
- * @param {Integer} mills The number of milliseconds to vibrate for.
- */
- vibrate: function(mills) {
- exec(null, null, "Notification", "vibrate", [mills]);
- },
-
- /**
- * Causes the device to beep.
- * On Android, the default notification ringtone is played "count" times.
- *
- * @param {Integer} count The number of beeps.
- */
- beep: function(count) {
- exec(null, null, "Notification", "beep", [count]);
- }
-};
-});
-
-// file: lib/common/plugin/requestFileSystem.js
-define("cordova/plugin/requestFileSystem", function(require, exports, module) {
-var FileError = require('cordova/plugin/FileError'),
- FileSystem = require('cordova/plugin/FileSystem'),
- exec = require('cordova/exec');
-
-/**
- * Request a file system in which to store application data.
- * @param type local file system type
- * @param size indicates how much storage space, in bytes, the application expects to need
- * @param successCallback invoked with a FileSystem object
- * @param errorCallback invoked if error occurs retrieving file system
- */
-var requestFileSystem = function(type, size, successCallback, errorCallback) {
- var fail = function(code) {
- if (typeof errorCallback === 'function') {
- errorCallback(new FileError(code));
- }
- };
-
- if (type < 0 || type > 3) {
- fail(FileError.SYNTAX_ERR);
- } else {
- // if successful, return a FileSystem object
- var success = function(file_system) {
- if (file_system) {
- if (typeof successCallback === 'function') {
- // grab the name and root from the file system object
- var result = new FileSystem(file_system.name, file_system.root);
- successCallback(result);
- }
- }
- else {
- // no FileSystem object returned
- fail(FileError.NOT_FOUND_ERR);
- }
- };
- exec(success, fail, "File", "requestFileSystem", [type, size]);
- }
-};
-
-module.exports = requestFileSystem;
-});
-
-// file: lib/common/plugin/resolveLocalFileSystemURI.js
-define("cordova/plugin/resolveLocalFileSystemURI", function(require, exports, module) {
-var DirectoryEntry = require('cordova/plugin/DirectoryEntry'),
- FileEntry = require('cordova/plugin/FileEntry'),
- FileError = require('cordova/plugin/FileError'),
- exec = require('cordova/exec');
-
-/**
- * Look up file system Entry referred to by local URI.
- * @param {DOMString} uri URI referring to a local file or directory
- * @param successCallback invoked with Entry object corresponding to URI
- * @param errorCallback invoked if error occurs retrieving file system entry
- */
-module.exports = function(uri, successCallback, errorCallback) {
- // error callback
- var fail = function(error) {
- if (typeof errorCallback === 'function') {
- errorCallback(new FileError(error));
- }
- };
- // sanity check for 'not:valid:filename'
- if(!uri || uri.split(":").length > 2) {
- setTimeout( function() {
- fail(FileError.ENCODING_ERR);
- },0);
- return;
- }
- // if successful, return either a file or directory entry
- var success = function(entry) {
- var result;
- if (entry) {
- if (typeof successCallback === 'function') {
- // create appropriate Entry object
- result = (entry.isDirectory) ? new DirectoryEntry(entry.name, entry.fullPath) : new FileEntry(entry.name, entry.fullPath);
- try {
- successCallback(result);
- }
- catch (e) {
- console.log('Error invoking callback: ' + e);
- }
- }
- }
- else {
- // no Entry object returned
- fail(FileError.NOT_FOUND_ERR);
- }
- };
-
- exec(success, fail, "File", "resolveLocalFileSystemURI", [uri]);
-};
-
-});
-
-// file: lib/common/plugin/splashscreen.js
-define("cordova/plugin/splashscreen", function(require, exports, module) {
-var exec = require('cordova/exec');
-
-var splashscreen = {
- hide:function() {
- exec(null, null, "SplashScreen", "hide", []);
- }
-};
-
-module.exports = splashscreen;
-});
-
-// file: lib/common/utils.js
-define("cordova/utils", function(require, exports, module) {
-var utils = exports;
-
-/**
- * Returns an indication of whether the argument is an array or not
- */
-utils.isArray = function(a) {
- return Object.prototype.toString.call(a) == '[object Array]';
-};
-
-/**
- * Returns an indication of whether the argument is a Date or not
- */
-utils.isDate = function(d) {
- return Object.prototype.toString.call(d) == '[object Date]';
-};
-
-/**
- * Does a deep clone of the object.
- */
-utils.clone = function(obj) {
- if(!obj || typeof obj == 'function' || utils.isDate(obj) || typeof obj != 'object') {
- return obj;
- }
-
- var retVal, i;
-
- if(utils.isArray(obj)){
- retVal = [];
- for(i = 0; i < obj.length; ++i){
- retVal.push(utils.clone(obj[i]));
- }
- return retVal;
- }
-
- retVal = {};
- for(i in obj){
- if(!(i in retVal) || retVal[i] != obj[i]) {
- retVal[i] = utils.clone(obj[i]);
- }
- }
- return retVal;
-};
-
-/**
- * Returns a wrappered version of the function
- */
-utils.close = function(context, func, params) {
- if (typeof params == 'undefined') {
- return function() {
- return func.apply(context, arguments);
- };
- } else {
- return function() {
- return func.apply(context, params);
- };
- }
-};
-
-/**
- * Create a UUID
- */
-utils.createUUID = function() {
- return UUIDcreatePart(4) + '-' +
- UUIDcreatePart(2) + '-' +
- UUIDcreatePart(2) + '-' +
- UUIDcreatePart(2) + '-' +
- UUIDcreatePart(6);
-};
-
-/**
- * Extends a child object from a parent object using classical inheritance
- * pattern.
- */
-utils.extend = (function() {
- // proxy used to establish prototype chain
- var F = function() {};
- // extend Child from Parent
- return function(Child, Parent) {
- F.prototype = Parent.prototype;
- Child.prototype = new F();
- Child.__super__ = Parent.prototype;
- Child.prototype.constructor = Child;
- };
-}());
-
-/**
- * Alerts a message in any available way: alert or console.log.
- */
-utils.alert = function(msg) {
- if (alert) {
- alert(msg);
- } else if (console && console.log) {
- console.log(msg);
- }
-};
-
-/**
- * Formats a string and arguments following it ala sprintf()
- *
- * see utils.vformat() for more information
- */
-utils.format = function(formatString /* ,... */) {
- var args = [].slice.call(arguments, 1);
- return utils.vformat(formatString, args);
-};
-
-/**
- * Formats a string and arguments following it ala vsprintf()
- *
- * format chars:
- * %j - format arg as JSON
- * %o - format arg as JSON
- * %c - format arg as ''
- * %% - replace with '%'
- * any other char following % will format it's
- * arg via toString().
- *
- * for rationale, see FireBug's Console API:
- * http://getfirebug.com/wiki/index.php/Console_API
- */
-utils.vformat = function(formatString, args) {
- if (formatString === null || formatString === undefined) return "";
- if (arguments.length == 1) return formatString.toString();
- if (typeof formatString != "string") return formatString.toString();
-
- var pattern = /(.*?)%(.)(.*)/;
- var rest = formatString;
- var result = [];
-
- while (args.length) {
- var arg = args.shift();
- var match = pattern.exec(rest);
-
- if (!match) break;
-
- rest = match[3];
-
- result.push(match[1]);
-
- if (match[2] == '%') {
- result.push('%');
- args.unshift(arg);
- continue;
- }
-
- result.push(formatted(arg, match[2]));
- }
-
- result.push(rest);
-
- return result.join('');
-};
-
-//------------------------------------------------------------------------------
-function UUIDcreatePart(length) {
- var uuidpart = "";
- for (var i=0; i<length; i++) {
- var uuidchar = parseInt((Math.random() * 256), 10).toString(16);
- if (uuidchar.length == 1) {
- uuidchar = "0" + uuidchar;
- }
- uuidpart += uuidchar;
- }
- return uuidpart;
-}
-
-//------------------------------------------------------------------------------
-function formatted(object, formatChar) {
-
- try {
- switch(formatChar) {
- case 'j':
- case 'o': return JSON.stringify(object);
- case 'c': return '';
- }
- }
- catch (e) {
- return "error JSON.stringify()ing argument: " + e;
- }
-
- if ((object === null) || (object === undefined)) {
- return Object.prototype.toString.call(object);
- }
-
- return object.toString();
-}
-
-});
-
-
-window.cordova = require('cordova');
-
-// file: lib/scripts/bootstrap.js
-(function (context) {
- var channel = require("cordova/channel"),
- _self = {
- boot: function () {
- /**
- * Create all cordova objects once page has fully loaded and native side is ready.
- */
- channel.join(function() {
- var builder = require('cordova/builder'),
- base = require('cordova/common'),
- platform = require('cordova/platform');
-
- // Drop the common globals into the window object, but be nice and don't overwrite anything.
- builder.build(base.objects).intoButDontClobber(window);
-
- // Drop the platform-specific globals into the window object
- // and clobber any existing object.
- builder.build(platform.objects).intoAndClobber(window);
-
- // Merge the platform-specific overrides/enhancements into
- // the window object.
- if (typeof platform.merges !== 'undefined') {
- builder.build(platform.merges).intoAndMerge(window);
- }
-
- // Call the platform-specific initialization
- platform.initialize();
-
- // Fire event to notify that all objects are created
- channel.onCordovaReady.fire();
-
- // Fire onDeviceReady event once all constructors have run and
- // cordova info has been received from native side.
- channel.join(function() {
- require('cordova').fireDocumentEvent('deviceready');
- }, channel.deviceReadyChannelsArray);
-
- }, [ channel.onDOMContentLoaded, channel.onNativeReady ]);
- }
- };
-
- // boot up once native side is ready
- channel.onNativeReady.subscribeOnce(_self.boot);
-
- // _nativeReady is global variable that the native side can set
- // to signify that the native code is ready. It is a global since
- // it may be called before any cordova JS is ready.
- if (window._nativeReady) {
- channel.onNativeReady.fire();
- }
-
-}(window));
-
-
-})(); \ No newline at end of file
diff --git a/phonegap/www/about.html b/phonegap/www/about.html
index 03d2d389a..91e3c30b4 100644
--- a/phonegap/www/about.html
+++ b/phonegap/www/about.html
@@ -9,7 +9,7 @@
<link rel="stylesheet" href="css/base.css">
<link rel="stylesheet" href="css/mobile.css">
<script type="text/javascript" src="js/config.js"></script>
- <script type="text/javascript" charset="utf-8" src="cordova-1.8.0.js"></script>
+ <script type="text/javascript" charset="utf-8" src="cordova-independent.js"></script>
<script type="text/javascript" src="js/jquery-1.7.0.min.js"></script>
<script type="text/javascript" src="js/json2.js"></script>
<script type="text/javascript" src="js/mobile.js"></script>
@@ -135,7 +135,7 @@ rights reserved, Ministry of Justice 100037819&nbsp;2008),
Yahoo! for their BSD-licensed JavaScript libraries, the entire free software
community (this particular project was brought to you by Perl, PostgreSQL,
and the number 161.290) and <a
-href="http://www.m247.com/">M247</a> (who kindly host all
+href="http://www.bytemark.co.uk/">Bytemark</a> (who kindly host all
our servers).
Let us know if we&rsquo;ve missed anyone.</dd>
diff --git a/phonegap/www/sign_in.html b/phonegap/www/account.html
index 0a4658e5a..f483b7547 100644
--- a/phonegap/www/sign_in.html
+++ b/phonegap/www/account.html
@@ -11,16 +11,16 @@
<link rel="stylesheet" href="css/mobile.css">
<link rel="stylesheet" href="css/layout.css" media="(min-width:48em)">
- <script type="text/javascript" src="js/config.js"></script>
+ <script type="text/javascript" src="js/jquery-1.7.0.min.js"></script>
+ <script type="text/javascript" charset="utf-8" src="cordova-independent.js"></script>
- <script type="text/javascript" charset="utf-8" src="cordova-1.8.0.js"></script>
+ <script type="text/javascript" src="js/config.js"></script>
+ <script type="text/javascript" src="js/json2.js"></script>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
- <script type="text/javascript" src="js/jquery-1.7.0.min.js"></script>
<script src="js/jquery.validate.min.js" type="text/javascript" charset="utf-8"></script>
- <script type="text/javascript" src="js/json2.js"></script>
<script type="text/javascript" src="js/geo.min.js"></script>
<script type="text/javascript" src="js/fixmystreet.js"></script>
<script type="text/javascript" src="js/mobile.js"></script>
@@ -65,7 +65,7 @@
<div class="container">
<div class="content" role="main">
<form action="" method="post" name="signInForm" id="signInForm" enctype="multipart/form-data" class="validate">
- <div id="form_sign_in_only">
+ <div id="form_sign_in_only" class="nodisplay">
<div id="form_sign_in_yes" class="form-box">
<label for="form_email" id="email_label">Email</label>
<input type="email" value="" name="email" id="form_email" placeholder="Please enter your email address" required>
@@ -75,16 +75,20 @@
<input type="password" name="password_sign_in" id="password_sign_in" placeholder="Your password" value="">
<input class="green-btn" type="submit" id="submit_sign_in" name="submit_sign_in" value="Sign in">
</div>
+
</div>
</div>
</form>
+ <div id="forget_button" class="form-txt-submit-box nodisplay">
+ <input class="green-btn" type="button" id="forget" name="forget" value="Forget">
+ </div>
</div>
</div>
</div><!-- .table-cell -->
<div class="big-green-banner mobile-map-banner mobile-nav-banner">
<a href="index.html">home</a>
- Sign In
+ Account
</div>
</div> <!-- .wrapper -->
<div class="spinner" id="loadingSpinner">
diff --git a/phonegap/www/around.html b/phonegap/www/around.html
index f3a6bee06..00842e777 100644
--- a/phonegap/www/around.html
+++ b/phonegap/www/around.html
@@ -11,13 +11,13 @@
<link rel="stylesheet" href="css/layout.css" media="(min-width:48em)">
<link rel="stylesheet" href="css/mobile.css">
+ <script type="text/javascript" src="js/jquery-1.7.0.min.js"></script>
+ <script type="text/javascript" src="cordova-independent.js"></script>
+
<script type="text/javascript" src="js/config.js"></script>
<script type="text/javascript" src="js/json2.js"></script>
- <script type="text/javascript" charset="utf-8" src="cordova-1.8.0.js"></script>
-
<meta http-equiv="content-type" content="text/html; charset=utf-8">
- <script type="text/javascript" src="js/jquery-1.7.0.min.js"></script>
<script src="js/jquery.validate.min.js" type="text/javascript" charset="utf-8"></script>
diff --git a/phonegap/android_cordova.js b/phonegap/www/cordova-android-2.1.0.js
index 3e59432ed..9e7fa8ec2 100755
--- a/phonegap/android_cordova.js
+++ b/phonegap/www/cordova-android-2.1.0.js
@@ -1,6 +1,6 @@
-// commit ac0a3990438f4a89faa993316fb5614f61cf3be6
+// commit 143f5221a6251c9cbccdedc57005c61551b97f12
-// File generated at :: Tue Jun 05 2012 14:14:16 GMT-0700 (PDT)
+// File generated at :: Wed Sep 12 2012 12:51:58 GMT-0700 (PDT)
/*
Licensed to the Apache Software Foundation (ASF) under one
@@ -186,11 +186,19 @@ var cordova = {
},
/**
* Method to fire event from native code
+ * bNoDetach is required for events which cause an exception which needs to be caught in native code
*/
- fireDocumentEvent: function(type, data) {
+ fireDocumentEvent: function(type, data, bNoDetach) {
var evt = createEvent(type, data);
if (typeof documentEventHandlers[type] != 'undefined') {
- documentEventHandlers[type].fire(evt);
+ if( bNoDetach ) {
+ documentEventHandlers[type].fire(evt);
+ }
+ else {
+ setTimeout(function() {
+ documentEventHandlers[type].fire(evt);
+ }, 0);
+ }
} else {
document.dispatchEvent(evt);
}
@@ -198,15 +206,13 @@ var cordova = {
fireWindowEvent: function(type, data) {
var evt = createEvent(type,data);
if (typeof windowEventHandlers[type] != 'undefined') {
- windowEventHandlers[type].fire(evt);
+ setTimeout(function() {
+ windowEventHandlers[type].fire(evt);
+ }, 0);
} else {
window.dispatchEvent(evt);
}
},
- // TODO: this is Android only; think about how to do this better
- shuttingDown:false,
- UsePolling:false,
- // END TODO
// TODO: iOS only
// This queue holds the currently executing command and all pending
@@ -285,17 +291,6 @@ var cordova = {
}
}
},
- // TODO: remove in 2.0.
- addPlugin: function(name, obj) {
- console.log("[DEPRECATION NOTICE] window.addPlugin and window.plugins will be removed in version 2.0.");
- if (!window.plugins[name]) {
- window.plugins[name] = obj;
- }
- else {
- console.log("Error: Plugin "+name+" already exists.");
- }
- },
-
addConstructor: function(func) {
channel.onCordovaReady.subscribeOnce(function() {
try {
@@ -312,51 +307,6 @@ channel.onPause = cordova.addDocumentEventHandler('pause');
channel.onResume = cordova.addDocumentEventHandler('resume');
channel.onDeviceReady = cordova.addDocumentEventHandler('deviceready');
-// Adds deprecation warnings to functions of an object (but only logs a message once)
-function deprecateFunctions(obj, objLabel) {
- var newObj = {};
- var logHash = {};
- for (var i in obj) {
- if (obj.hasOwnProperty(i)) {
- if (typeof obj[i] == 'function') {
- newObj[i] = (function(prop){
- var oldFunk = obj[prop];
- var funkId = objLabel + '_' + prop;
- return function() {
- if (!logHash[funkId]) {
- console.log('[DEPRECATION NOTICE] The "' + objLabel + '" global will be removed in version 2.0, please use lowercase "cordova".');
- logHash[funkId] = true;
- }
- oldFunk.apply(obj, arguments);
- };
- })(i);
- } else {
- newObj[i] = (function(prop) { return obj[prop]; })(i);
- }
- }
- }
- return newObj;
-}
-
-/**
- * Legacy variable for plugin support
- * TODO: remove in 2.0.
- */
-if (!window.PhoneGap) {
- window.PhoneGap = deprecateFunctions(cordova, 'PhoneGap');
-}
-if (!window.Cordova) {
- window.Cordova = deprecateFunctions(cordova, 'Cordova');
-}
-
-/**
- * Plugins object
- * TODO: remove in 2.0.
- */
-if (!window.plugins) {
- window.plugins = {};
-}
-
module.exports = cordova;
});
@@ -456,7 +406,8 @@ module.exports = {
// file: lib/common/channel.js
define("cordova/channel", function(require, exports, module) {
-var utils = require('cordova/utils');
+var utils = require('cordova/utils'),
+ nextGuid = 1;
/**
* Custom pub-sub "channel" that can have functions subscribed to it
@@ -508,7 +459,6 @@ var Channel = function(type, opts) {
this.type = type;
this.handlers = {};
this.numHandlers = 0;
- this.guid = 1;
this.fired = false;
this.enabled = true;
this.events = {
@@ -601,19 +551,19 @@ Channel.prototype.subscribe = function(f, c, g) {
g = g || func.observer_guid || f.observer_guid;
if (!g) {
- // first time we've seen this subscriber
- g = this.guid++;
- }
- else {
- // subscriber already handled; dont set it twice
- return g;
+ // first time any channel has seen this subscriber
+ g = nextGuid++;
}
func.observer_guid = g;
f.observer_guid = g;
- this.handlers[g] = func;
- this.numHandlers++;
- if (this.events.onSubscribe) this.events.onSubscribe.call(this);
- if (this.fired) func.call(this);
+
+ // Don't add the same handler more than once.
+ if (!this.handlers[g]) {
+ this.handlers[g] = func;
+ this.numHandlers++;
+ if (this.events.onSubscribe) this.events.onSubscribe.call(this);
+ if (this.fired) func.apply(this, this.fireArgs);
+ }
return g;
};
@@ -627,15 +577,14 @@ Channel.prototype.subscribeOnce = function(f, c) {
var g = null;
var _this = this;
- var m = function() {
- f.apply(c || null, arguments);
- _this.unsubscribe(g);
- };
if (this.fired) {
- if (typeof c == "object") { f = utils.close(c, f); }
- f.apply(this, this.fireArgs);
+ f.apply(c || null, this.fireArgs);
} else {
- g = this.subscribe(m);
+ g = this.subscribe(function() {
+ _this.unsubscribe(g);
+ f.apply(c || null, arguments);
+ });
+ f.observer_guid = g;
}
return g;
};
@@ -651,7 +600,6 @@ Channel.prototype.unsubscribe = function(g) {
var handler = this.handlers[g];
if (handler) {
if (handler.observer_guid) handler.observer_guid=null;
- this.handlers[g] = null;
delete this.handlers[g];
this.numHandlers--;
if (this.events.onUnsubscribe) this.events.onUnsubscribe.call(this);
@@ -665,14 +613,17 @@ Channel.prototype.fire = function(e) {
if (this.enabled) {
var fail = false;
this.fired = true;
+ this.fireArgs = arguments;
+ // Copy the values first so that it is safe to modify it from within
+ // callbacks.
+ var toCall = [];
for (var item in this.handlers) {
- var handler = this.handlers[item];
- if (typeof handler == 'function') {
- var rv = (handler.apply(this, arguments)===false);
- fail = fail || rv;
- }
+ toCall.push(this.handlers[item]);
+ }
+ for (var i = 0; i < toCall.length; ++i) {
+ var rv = (toCall[i].apply(this, arguments)===false);
+ fail = fail || rv;
}
- this.fireArgs = arguments;
return !fail;
}
return true;
@@ -709,7 +660,6 @@ channel.create('onDestroy');
// Channels that must fire before "deviceready" is fired.
channel.waitForInitialization('onCordovaReady');
-channel.waitForInitialization('onCordovaInfoReady');
channel.waitForInitialization('onCordovaConnectionReady');
module.exports = channel;
@@ -738,13 +688,6 @@ module.exports = {
}
}
},
- PhoneGap:{
- children: {
- exec: {
- path: 'cordova/exec'
- }
- }
- },
navigator: {
children: {
notification: {
@@ -844,6 +787,9 @@ module.exports = {
Coordinates: {
path: 'cordova/plugin/Coordinates'
},
+ device: {
+ path: 'cordova/plugin/device'
+ },
DirectoryEntry: {
path: 'cordova/plugin/DirectoryEntry'
},
@@ -940,76 +886,170 @@ define("cordova/exec", function(require, exports, module) {
* @param {String} action Action to be run in cordova
* @param {String[]} [args] Zero or more arguments to pass to the method
*/
-var cordova = require('cordova');
+var cordova = require('cordova'),
+ callback = require('cordova/plugin/android/callback'),
+ polling = require('cordova/plugin/android/polling'),
+ jsToNativeBridgeMode,
+ nativeToJsBridgeMode,
+ jsToNativeModes = {
+ PROMPT: 0,
+ JS_OBJECT: 1,
+ // This mode is currently for benchmarking purposes only. It must be enabled
+ // on the native side through the ENABLE_LOCATION_CHANGE_EXEC_MODE
+ // constant within CordovaWebViewClient.java before it will work.
+ LOCATION_CHANGE: 2
+ },
+ nativeToJsModes = {
+ // Polls for messages using the prompt() bridge.
+ POLLING: 0,
+ // Does an XHR to a local server, which will send back messages. This is
+ // broken on ICS when a proxy server is configured.
+ HANGING_GET: 1,
+ // For LOAD_URL to be viable, it would need to have a work-around for
+ // the bug where the soft-keyboard gets dismissed when a message is sent.
+ LOAD_URL: 2,
+ // For the ONLINE_EVENT to be viable, it would need to intercept all event
+ // listeners (both through addEventListener and window.ononline) as well
+ // as set the navigator property itself.
+ ONLINE_EVENT: 3,
+ // Uses reflection to access private APIs of the WebView that can send JS
+ // to be executed.
+ // Requires Android 3.2.4 or above.
+ PRIVATE_API: 4
+ };
-module.exports = function(success, fail, service, action, args) {
- try {
- var callbackId = service + cordova.callbackId++;
- if (success || fail) {
- cordova.callbacks[callbackId] = {success:success, fail:fail};
+function androidExec(success, fail, service, action, args) {
+ // Set default bridge modes if they have not already been set.
+ if (jsToNativeBridgeMode === undefined) {
+ androidExec.setJsToNativeBridgeMode(jsToNativeModes.PROMPT);
+ }
+ if (nativeToJsBridgeMode === undefined) {
+ if (callback.isAvailable()) {
+ androidExec.setNativeToJsBridgeMode(nativeToJsModes.HANGING_GET);
+ } else {
+ androidExec.setNativeToJsBridgeMode(nativeToJsModes.POLLING);
+ }
}
+ try {
+ var callbackId = service + cordova.callbackId++,
+ argsJson = JSON.stringify(args),
+ result;
+ if (success || fail) {
+ cordova.callbacks[callbackId] = {success:success, fail:fail};
+ }
- var r = prompt(JSON.stringify(args), "gap:"+JSON.stringify([service, action, callbackId, true]));
+ if (jsToNativeBridgeMode == jsToNativeModes.LOCATION_CHANGE) {
+ window.location = 'http://cdv_exec/' + service + '#' + action + '#' + callbackId + '#' + argsJson;
+ } else if (jsToNativeBridgeMode == jsToNativeModes.JS_OBJECT) {
+ // Explicit cast to string is required on Android 2.1 to convert from
+ // a Java string to a JS string.
+ result = '' + _cordovaExec.exec(service, action, callbackId, argsJson);
+ } else {
+ result = prompt(argsJson, "gap:"+JSON.stringify([service, action, callbackId, true]));
+ }
- // If a result was returned
- if (r.length > 0) {
- var v;
- eval("v="+r+";");
+ // If a result was returned
+ if (result) {
+ var v = JSON.parse(result);
+
+ // If status is OK, then return value back to caller
+ if (v.status === cordova.callbackStatus.OK) {
+
+ // If there is a success callback, then call it now with
+ // returned value
+ if (success) {
+ try {
+ success(v.message);
+ } catch (e) {
+ console.log("Error in success callback: " + callbackId + " = " + e);
+ }
- // If status is OK, then return value back to caller
- if (v.status === cordova.callbackStatus.OK) {
+ // Clear callback if not expecting any more results
+ if (!v.keepCallback) {
+ delete cordova.callbacks[callbackId];
+ }
+ }
+ return v.message;
+ }
- // If there is a success callback, then call it now with
- // returned value
- if (success) {
- try {
- success(v.message);
- } catch (e) {
- console.log("Error in success callback: " + callbackId + " = " + e);
- }
+ // If no result
+ else if (v.status === cordova.callbackStatus.NO_RESULT) {
+ // Clear callback if not expecting any more results
+ if (!v.keepCallback) {
+ delete cordova.callbacks[callbackId];
+ }
+ }
- // Clear callback if not expecting any more results
- if (!v.keepCallback) {
- delete cordova.callbacks[callbackId];
- }
- }
- return v.message;
- }
+ // If error, then display error
+ else {
+ console.log("Error: Status="+v.status+" Message="+v.message);
- // If no result
- else if (v.status === cordova.callbackStatus.NO_RESULT) {
- // Clear callback if not expecting any more results
- if (!v.keepCallback) {
- delete cordova.callbacks[callbackId];
- }
- }
+ // If there is a fail callback, then call it now with returned value
+ if (fail) {
+ try {
+ fail(v.message);
+ }
+ catch (e1) {
+ console.log("Error in error callback: "+callbackId+" = "+e1);
+ }
- // If error, then display error
- else {
- console.log("Error: Status="+v.status+" Message="+v.message);
+ // Clear callback if not expecting any more results
+ if (!v.keepCallback) {
+ delete cordova.callbacks[callbackId];
+ }
+ }
+ return null;
+ }
+ }
+ } catch (e2) {
+ console.log("Error: "+e2);
+ }
+}
- // If there is a fail callback, then call it now with returned value
- if (fail) {
- try {
- fail(v.message);
- }
- catch (e1) {
- console.log("Error in error callback: "+callbackId+" = "+e1);
- }
+function onOnLineEvent(e) {
+ while (polling.pollOnce());
+}
- // Clear callback if not expecting any more results
- if (!v.keepCallback) {
- delete cordova.callbacks[callbackId];
- }
- }
- return null;
- }
+androidExec.jsToNativeModes = jsToNativeModes;
+androidExec.nativeToJsModes = nativeToJsModes;
+
+androidExec.setJsToNativeBridgeMode = function(mode) {
+ if (mode == jsToNativeModes.JS_OBJECT && !window._cordovaExec) {
+ console.log('Falling back on PROMPT mode since _cordovaExec is missing.');
+ mode = jsToNativeModes.PROMPT;
}
- } catch (e2) {
- console.log("Error: "+e2);
- }
+ jsToNativeBridgeMode = mode;
};
+androidExec.setNativeToJsBridgeMode = function(mode) {
+ if (mode == nativeToJsBridgeMode) {
+ return;
+ }
+ if (nativeToJsBridgeMode == nativeToJsModes.POLLING) {
+ polling.stop();
+ } else if (nativeToJsBridgeMode == nativeToJsModes.HANGING_GET) {
+ callback.stop();
+ } else if (nativeToJsBridgeMode == nativeToJsModes.ONLINE_EVENT) {
+ window.removeEventListener('online', onOnLineEvent, false);
+ window.removeEventListener('offline', onOnLineEvent, false);
+ }
+
+ nativeToJsBridgeMode = mode;
+ // Tell the native side to switch modes.
+ prompt(mode, "gap_bridge_mode:");
+
+ if (mode == nativeToJsModes.POLLING) {
+ polling.start();
+ } else if (mode == nativeToJsModes.HANGING_GET) {
+ callback.start();
+ } else if (mode == nativeToJsModes.ONLINE_EVENT) {
+ window.addEventListener('online', onOnLineEvent, false);
+ window.addEventListener('offline', onOnLineEvent, false);
+ }
+};
+
+module.exports = androidExec;
+
});
// file: lib/android/platform.js
@@ -1019,34 +1059,8 @@ module.exports = {
initialize:function() {
var channel = require("cordova/channel"),
cordova = require('cordova'),
- callback = require('cordova/plugin/android/callback'),
- polling = require('cordova/plugin/android/polling'),
exec = require('cordova/exec');
- channel.onDestroy.subscribe(function() {
- cordova.shuttingDown = true;
- });
-
- // Start listening for XHR callbacks
- // Figure out which bridge approach will work on this Android
- // device: polling or XHR-based callbacks
- setTimeout(function() {
- if (cordova.UsePolling) {
- polling();
- }
- else {
- var isPolling = prompt("usePolling", "gap_callbackServer:");
- cordova.UsePolling = isPolling;
- if (isPolling == "true") {
- cordova.UsePolling = true;
- polling();
- } else {
- cordova.UsePolling = false;
- callback();
- }
- }
- }, 1);
-
// Inject a listener for the backbutton on the document.
var backButtonChannel = cordova.addDocumentEventHandler('backbutton', {
onSubscribe:function() {
@@ -1111,7 +1125,7 @@ module.exports = {
// Let native code know we are all done on the JS side.
// Native code will then un-hide the WebView.
channel.join(function() {
- prompt("", "gap_init:");
+ exec(null, null, "App", "show", []);
}, [channel.onCordovaReady]);
},
objects: {
@@ -1132,9 +1146,6 @@ module.exports = {
}
}
},
- device:{
- path: "cordova/plugin/android/device"
- },
File: { // exists natively on Android WebView, override
path: "cordova/plugin/File"
},
@@ -1149,6 +1160,9 @@ module.exports = {
}
},
merges: {
+ device: {
+ path: 'cordova/plugin/android/device'
+ },
navigator: {
children: {
notification: {
@@ -1281,7 +1295,14 @@ cameraExport.getPicture = function(successCallback, errorCallback, options) {
popoverOptions = options.popoverOptions;
}
- exec(successCallback, errorCallback, "Camera", "takePicture", [quality, destinationType, sourceType, targetWidth, targetHeight, encodingType, mediaType, allowEdit, correctOrientation, saveToPhotoAlbum, popoverOptions]);
+ var args = [quality, destinationType, sourceType, targetWidth, targetHeight, encodingType,
+ mediaType, allowEdit, correctOrientation, saveToPhotoAlbum, popoverOptions];
+
+ exec(successCallback, errorCallback, "Camera", "takePicture", args);
+};
+
+cameraExport.cleanup = function(successCallback, errorCallback) {
+ exec(successCallback, errorCallback, "Camera", "cleanup", []);
};
module.exports = cameraExport;
@@ -1866,7 +1887,7 @@ var utils = require('cordova/utils'),
* {boolean} isDirectory always true (readonly)
* {DOMString} name of the directory, excluding the path leading to it (readonly)
* {DOMString} fullPath the absolute full path to the directory (readonly)
- * {FileSystem} filesystem on which the directory resides (readonly)
+ * TODO: implement this!!! {FileSystem} filesystem on which the directory resides (readonly)
*/
var DirectoryEntry = function(name, fullPath) {
DirectoryEntry.__super__.constructor.apply(this, [false, true, name, fullPath]);
@@ -2596,11 +2617,13 @@ var FileSystem = function(name, root) {
};
module.exports = FileSystem;
+
});
// file: lib/common/plugin/FileTransfer.js
define("cordova/plugin/FileTransfer", function(require, exports, module) {
-var exec = require('cordova/exec');
+var exec = require('cordova/exec'),
+ FileTransferError = require('cordova/plugin/FileTransferError');
/**
* FileTransfer uploads a file to a remote server.
@@ -2619,16 +2642,20 @@ var FileTransfer = function() {};
* @param trustAllHosts {Boolean} Optional trust all hosts (e.g. for self-signed certs), defaults to false
*/
FileTransfer.prototype.upload = function(filePath, server, successCallback, errorCallback, options, trustAllHosts) {
+ // sanity parameter checking
+ if (!filePath || !server) throw new Error("FileTransfer.upload requires filePath and server URL parameters at the minimum.");
// check for options
var fileKey = null;
var fileName = null;
var mimeType = null;
var params = null;
var chunkedMode = true;
+ var headers = null;
if (options) {
fileKey = options.fileKey;
fileName = options.fileName;
mimeType = options.mimeType;
+ headers = options.headers;
if (options.chunkedMode !== null || typeof options.chunkedMode != "undefined") {
chunkedMode = options.chunkedMode;
}
@@ -2640,7 +2667,12 @@ FileTransfer.prototype.upload = function(filePath, server, successCallback, erro
}
}
- exec(successCallback, errorCallback, 'FileTransfer', 'upload', [filePath, server, fileKey, fileName, mimeType, params, trustAllHosts, chunkedMode]);
+ var fail = function(e) {
+ var error = new FileTransferError(e.code, e.source, e.target, e.http_status);
+ errorCallback(error);
+ };
+
+ exec(successCallback, fail, 'FileTransfer', 'upload', [filePath, server, fileKey, fileName, mimeType, params, trustAllHosts, chunkedMode, headers]);
};
/**
@@ -2651,6 +2683,8 @@ FileTransfer.prototype.upload = function(filePath, server, successCallback, erro
* @param errorCallback {Function} Callback to be invoked upon error
*/
FileTransfer.prototype.download = function(source, target, successCallback, errorCallback) {
+ // sanity parameter checking
+ if (!source || !target) throw new Error("FileTransfer.download requires source URI and target URI parameters at the minimum.");
var win = function(result) {
var entry = null;
if (result.isDirectory) {
@@ -2665,6 +2699,12 @@ FileTransfer.prototype.download = function(source, target, successCallback, erro
entry.fullPath = result.fullPath;
successCallback(entry);
};
+
+ var fail = function(e) {
+ var error = new FileTransferError(e.code, e.source, e.target, e.http_status);
+ errorCallback(error);
+ };
+
exec(win, errorCallback, 'FileTransfer', 'download', [source, target]);
};
@@ -2678,8 +2718,11 @@ define("cordova/plugin/FileTransferError", function(require, exports, module) {
* FileTransferError
* @constructor
*/
-var FileTransferError = function(code) {
+var FileTransferError = function(code, source, target, status) {
this.code = code || null;
+ this.source = source || null;
+ this.target = target || null;
+ this.http_status = status || null;
};
FileTransferError.FILE_NOT_FOUND_ERR = 1;
@@ -2687,6 +2730,7 @@ FileTransferError.INVALID_URL_ERR = 2;
FileTransferError.CONNECTION_ERR = 3;
module.exports = FileTransferError;
+
});
// file: lib/common/plugin/FileUploadOptions.js
@@ -2698,15 +2742,19 @@ define("cordova/plugin/FileUploadOptions", function(require, exports, module) {
* @param fileName {String} Filename to be used by the server. Defaults to image.jpg.
* @param mimeType {String} Mimetype of the uploaded file. Defaults to image/jpeg.
* @param params {Object} Object with key: value params to send to the server.
+ * @param headers {Object} Keys are header names, values are header values. Multiple
+ * headers of the same name are not supported.
*/
-var FileUploadOptions = function(fileKey, fileName, mimeType, params) {
+var FileUploadOptions = function(fileKey, fileName, mimeType, params, headers) {
this.fileKey = fileKey || null;
this.fileName = fileName || null;
this.mimeType = mimeType || null;
this.params = params || null;
+ this.headers = headers || null;
};
module.exports = FileUploadOptions;
+
});
// file: lib/common/plugin/FileUploadResult.js
@@ -2894,7 +2942,7 @@ FileWriter.prototype.seek = function(offset) {
if (offset < 0) {
this.position = Math.max(offset + this.length, 0);
}
- // Offset is bigger then file size so set position
+ // Offset is bigger than file size so set position
// to the end of the file.
else if (offset > this.length) {
this.position = this.length;
@@ -3101,7 +3149,6 @@ Media.prototype.stop = function() {
var me = this;
exec(function() {
me._position = 0;
- me.successCallback();
}, this.errorCallback, "Media", "stopPlayingAudio", [this.id]);
};
@@ -3147,14 +3194,14 @@ Media.prototype.getCurrentPosition = function(success, fail) {
* Start recording audio file.
*/
Media.prototype.startRecord = function() {
- exec(this.successCallback, this.errorCallback, "Media", "startRecordingAudio", [this.id, this.src]);
+ exec(null, this.errorCallback, "Media", "startRecordingAudio", [this.id, this.src]);
};
/**
* Stop recording audio file.
*/
Media.prototype.stopRecord = function() {
- exec(this.successCallback, this.errorCallback, "Media", "stopRecordingAudio", [this.id]);
+ exec(null, this.errorCallback, "Media", "stopRecordingAudio", [this.id]);
};
/**
@@ -3176,34 +3223,39 @@ Media.prototype.setVolume = function(volume) {
* PRIVATE
*
* @param id The media object id (string)
- * @param status The status code (int)
- * @param msg The status message (string)
+ * @param msgType The 'type' of update this is
+ * @param value Use of value is determined by the msgType
*/
-Media.onStatus = function(id, msg, value) {
+Media.onStatus = function(id, msgType, value) {
+
var media = mediaObjects[id];
- // If state update
- if (msg === Media.MEDIA_STATE) {
- if (value === Media.MEDIA_STOPPED) {
- if (media.successCallback) {
- media.successCallback();
- }
- }
- if (media.statusCallback) {
- media.statusCallback(value);
- }
- }
- else if (msg === Media.MEDIA_DURATION) {
- media._duration = value;
- }
- else if (msg === Media.MEDIA_ERROR) {
- if (media.errorCallback) {
- // value should be a MediaError object when msg == MEDIA_ERROR
- media.errorCallback(value);
+
+ if(media) {
+ switch(msgType) {
+ case Media.MEDIA_STATE :
+ media.statusCallback && media.statusCallback(value);
+ if(value == Media.MEDIA_STOPPED) {
+ media.successCallback && media.successCallback();
+ }
+ break;
+ case Media.MEDIA_DURATION :
+ media._duration = value;
+ break;
+ case Media.MEDIA_ERROR :
+ media.errorCallback && media.errorCallback(value);
+ break;
+ case Media.MEDIA_POSITION :
+ media._position = Number(value);
+ break;
+ default :
+ console && console.error && console.error("Unhandled Media.onStatus :: " + msgType);
+ break;
}
}
- else if (msg === Media.MEDIA_POSITION) {
- media._position = value;
+ else {
+ console && console.error && console.error("Received Media.onStatus callback for unknown media :: " + id);
}
+
};
module.exports = Media;
@@ -3213,20 +3265,36 @@ module.exports = Media;
define("cordova/plugin/MediaError", function(require, exports, module) {
/**
* This class contains information about any Media errors.
- * @constructor
+*/
+/*
+ According to :: http://dev.w3.org/html5/spec-author-view/video.html#mediaerror
+ We should never be creating these objects, we should just implement the interface
+ which has 1 property for an instance, 'code'
+
+ instead of doing :
+ errorCallbackFunction( new MediaError(3,'msg') );
+we should simply use a literal :
+ errorCallbackFunction( {'code':3} );
*/
-var MediaError = function(code, msg) {
- this.code = (code !== undefined ? code : null);
- this.message = msg || "";
-};
-MediaError.MEDIA_ERR_NONE_ACTIVE = 0;
-MediaError.MEDIA_ERR_ABORTED = 1;
-MediaError.MEDIA_ERR_NETWORK = 2;
-MediaError.MEDIA_ERR_DECODE = 3;
-MediaError.MEDIA_ERR_NONE_SUPPORTED = 4;
+if(!MediaError) {
+ var MediaError = function(code, msg) {
+ this.code = (typeof code != 'undefined') ? code : null;
+ this.message = msg || ""; // message is NON-standard! do not use!
+ };
+}
+
+MediaError.MEDIA_ERR_NONE_ACTIVE = MediaError.MEDIA_ERR_NONE_ACTIVE || 0;
+MediaError.MEDIA_ERR_ABORTED = MediaError.MEDIA_ERR_ABORTED || 1;
+MediaError.MEDIA_ERR_NETWORK = MediaError.MEDIA_ERR_NETWORK || 2;
+MediaError.MEDIA_ERR_DECODE = MediaError.MEDIA_ERR_DECODE || 3;
+MediaError.MEDIA_ERR_NONE_SUPPORTED = MediaError.MEDIA_ERR_NONE_SUPPORTED || 4;
+// TODO: MediaError.MEDIA_ERR_NONE_SUPPORTED is legacy, the W3 spec now defines it as below.
+// as defined by http://dev.w3.org/html5/spec-author-view/video.html#error-codes
+MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED = MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED || 4;
module.exports = MediaError;
+
});
// file: lib/common/plugin/MediaFile.js
@@ -3264,28 +3332,6 @@ MediaFile.prototype.getFormatData = function(successCallback, errorCallback) {
}
};
-// TODO: can we axe this?
-/**
- * Casts a PluginResult message property (array of objects) to an array of MediaFile objects
- * (used in Objective-C and Android)
- *
- * @param {PluginResult} pluginResult
- */
-MediaFile.cast = function(pluginResult) {
- var mediaFiles = [];
- for (var i=0; i<pluginResult.message.length; i++) {
- var mediaFile = new MediaFile();
- mediaFile.name = pluginResult.message[i].name;
- mediaFile.fullPath = pluginResult.message[i].fullPath;
- mediaFile.type = pluginResult.message[i].type;
- mediaFile.lastModifiedDate = pluginResult.message[i].lastModifiedDate;
- mediaFile.size = pluginResult.message[i].size;
- mediaFiles.push(mediaFile);
- }
- pluginResult.message = mediaFiles;
- return pluginResult;
-};
-
module.exports = MediaFile;
});
@@ -3491,12 +3537,12 @@ var accelerometer = {
var p;
var win = function(a) {
- successCallback(a);
removeListeners(p);
+ successCallback(a);
};
var fail = function(e) {
- errorCallback(e);
removeListeners(p);
+ errorCallback(e);
};
p = createCallbackPair(win, fail);
@@ -3528,8 +3574,8 @@ var accelerometer = {
var id = utils.createUUID();
var p = createCallbackPair(function(){}, function(e) {
- errorCallback(e);
removeListeners(p);
+ errorCallback(e);
});
listeners.push(p);
@@ -3544,7 +3590,10 @@ var accelerometer = {
if (running) {
// If we're already running then immediately invoke the success callback
- successCallback(accel);
+ // but only if we have retrieved a value, sample code does not check for null ...
+ if(accel) {
+ successCallback(accel);
+ }
} else {
start();
}
@@ -3650,186 +3699,126 @@ module.exports = {
define("cordova/plugin/android/callback", function(require, exports, module) {
var port = null,
token = null,
- cordova = require('cordova'),
- polling = require('cordova/plugin/android/polling'),
- callback = function() {
- // Exit if shutting down app
- if (cordova.shuttingDown) {
- return;
- }
-
- // If polling flag was changed, start using polling from now on
- if (cordova.UsePolling) {
- polling();
- return;
- }
+ xmlhttp;
- var xmlhttp = new XMLHttpRequest();
+function startXhr() {
+ // cordova/exec depends on this module, so we can't require cordova/exec on the module level.
+ var exec = require('cordova/exec'),
+ xmlhttp = new XMLHttpRequest();
- // Callback function when XMLHttpRequest is ready
- xmlhttp.onreadystatechange=function(){
- if(xmlhttp.readyState === 4){
-
- // Exit if shutting down app
- if (cordova.shuttingDown) {
- return;
- }
+ // Callback function when XMLHttpRequest is ready
+ xmlhttp.onreadystatechange=function(){
+ if (!xmlhttp) {
+ return;
+ }
+ if (xmlhttp.readyState === 4){
+ // If callback has JavaScript statement to execute
+ if (xmlhttp.status === 200) {
- // If callback has JavaScript statement to execute
- if (xmlhttp.status === 200) {
-
- // Need to url decode the response
- var msg = decodeURIComponent(xmlhttp.responseText);
- setTimeout(function() {
- try {
- var t = eval(msg);
- }
- catch (e) {
- // If we're getting an error here, seeing the message will help in debugging
- console.log("JSCallback: Message from Server: " + msg);
- console.log("JSCallback Error: "+e);
- }
- }, 1);
- setTimeout(callback, 1);
- }
+ // Need to url decode the response
+ var msg = decodeURIComponent(xmlhttp.responseText);
+ setTimeout(function() {
+ try {
+ var t = eval(msg);
+ }
+ catch (e) {
+ // If we're getting an error here, seeing the message will help in debugging
+ console.log("JSCallback: Message from Server: " + msg);
+ console.log("JSCallback Error: "+e);
+ }
+ }, 1);
+ setTimeout(startXhr, 1);
+ }
- // If callback ping (used to keep XHR request from timing out)
- else if (xmlhttp.status === 404) {
- setTimeout(callback, 10);
- }
+ // If callback ping (used to keep XHR request from timing out)
+ else if (xmlhttp.status === 404) {
+ setTimeout(startXhr, 10);
+ }
- // If security error
- else if (xmlhttp.status === 403) {
- console.log("JSCallback Error: Invalid token. Stopping callbacks.");
- }
+ // 0 == Page is unloading.
+ // 400 == Bad request.
+ // 403 == invalid token.
+ // 503 == server stopped.
+ else {
+ console.log("JSCallback Error: Request failed with status " + xmlhttp.status);
+ exec.setNativeToJsBridgeMode(exec.nativeToJsModes.POLLING);
+ }
+ }
+ };
- // If server is stopping
- else if (xmlhttp.status === 503) {
- console.log("JSCallback Server Closed: Stopping callbacks.");
- }
+ if (port === null) {
+ port = prompt("getPort", "gap_callbackServer:");
+ }
+ if (token === null) {
+ token = prompt("getToken", "gap_callbackServer:");
+ }
+ xmlhttp.open("GET", "http://127.0.0.1:"+port+"/"+token , true);
+ xmlhttp.send();
+}
- // If request wasn't GET
- else if (xmlhttp.status === 400) {
- console.log("JSCallback Error: Bad request. Stopping callbacks.");
- }
+module.exports = {
+ start: function() {
+ startXhr();
+ },
- // If error, revert to polling
- else {
- console.log("JSCallback Error: Request failed.");
- cordova.UsePolling = true;
- polling();
- }
- }
- };
+ stop: function() {
+ if (xmlhttp) {
+ var tmp = xmlhttp;
+ xmlhttp = null;
+ tmp.abort();
+ }
+ },
- if (port === null) {
- port = prompt("getPort", "gap_callbackServer:");
- }
- if (token === null) {
- token = prompt("getToken", "gap_callbackServer:");
- }
- xmlhttp.open("GET", "http://127.0.0.1:"+port+"/"+token , true);
- xmlhttp.send();
+ isAvailable: function() {
+ return ("true" != prompt("usePolling", "gap_callbackServer:"));
+ }
};
-module.exports = callback;
+
});
// file: lib/android/plugin/android/device.js
define("cordova/plugin/android/device", function(require, exports, module) {
var channel = require('cordova/channel'),
utils = require('cordova/utils'),
- exec = require('cordova/exec');
-
-/**
- * This represents the mobile device, and provides properties for inspecting the model, version, UUID of the
- * phone, etc.
- * @constructor
- */
-function Device() {
- this.available = false;
- this.platform = null;
- this.version = null;
- this.name = null;
- this.uuid = null;
- this.cordova = null;
-
- var me = this;
-
- channel.onCordovaReady.subscribeOnce(function() {
- me.getInfo(function(info) {
- me.available = true;
- me.platform = info.platform;
- me.version = info.version;
- me.name = info.name;
- me.uuid = info.uuid;
- me.cordova = info.cordova;
- channel.onCordovaInfoReady.fire();
- },function(e) {
- me.available = false;
- utils.alert("[ERROR] Error initializing Cordova: " + e);
- });
- });
-}
+ exec = require('cordova/exec'),
+ app = require('cordova/plugin/android/app');
-/**
- * Get device info
- *
- * @param {Function} successCallback The function to call when the heading data is available
- * @param {Function} errorCallback The function to call when there is an error getting the heading data. (OPTIONAL)
- */
-Device.prototype.getInfo = function(successCallback, errorCallback) {
+module.exports = {
+ /*
+ * DEPRECATED
+ * This is only for Android.
+ *
+ * You must explicitly override the back button.
+ */
+ overrideBackButton:function() {
+ console.log("Device.overrideBackButton() is deprecated. Use App.overrideBackbutton(true).");
+ app.overrideBackbutton(true);
+ },
- // successCallback required
- if (typeof successCallback !== "function") {
- console.log("Device Error: successCallback is not a function");
- return;
- }
+ /*
+ * DEPRECATED
+ * This is only for Android.
+ *
+ * This resets the back button to the default behaviour
+ */
+ resetBackButton:function() {
+ console.log("Device.resetBackButton() is deprecated. Use App.overrideBackbutton(false).");
+ app.overrideBackbutton(false);
+ },
- // errorCallback optional
- if (errorCallback && (typeof errorCallback !== "function")) {
- console.log("Device Error: errorCallback is not a function");
- return;
+ /*
+ * DEPRECATED
+ * This is only for Android.
+ *
+ * This terminates the activity!
+ */
+ exitApp:function() {
+ console.log("Device.exitApp() is deprecated. Use App.exitApp().");
+ app.exitApp();
}
-
- // Get info
- exec(successCallback, errorCallback, "Device", "getDeviceInfo", []);
};
-/*
- * DEPRECATED
- * This is only for Android.
- *
- * You must explicitly override the back button.
- */
-Device.prototype.overrideBackButton = function() {
- console.log("Device.overrideBackButton() is deprecated. Use App.overrideBackbutton(true).");
- navigator.app.overrideBackbutton(true);
-};
-
-/*
- * DEPRECATED
- * This is only for Android.
- *
- * This resets the back button to the default behaviour
- */
-Device.prototype.resetBackButton = function() {
- console.log("Device.resetBackButton() is deprecated. Use App.overrideBackbutton(false).");
- navigator.app.overrideBackbutton(false);
-};
-
-/*
- * DEPRECATED
- * This is only for Android.
- *
- * This terminates the activity!
- */
-Device.prototype.exitApp = function() {
- console.log("Device.exitApp() is deprecated. Use App.exitApp().");
- navigator.app.exitApp();
-};
-
-module.exports = new Device();
});
// file: lib/android/plugin/android/notification.js
@@ -3892,38 +3881,47 @@ module.exports = {
// file: lib/android/plugin/android/polling.js
define("cordova/plugin/android/polling", function(require, exports, module) {
var cordova = require('cordova'),
- period = 50,
- polling = function() {
- // Exit if shutting down app
- if (cordova.shuttingDown) {
- return;
- }
+ POLL_INTERVAL = 50,
+ enabled = false;
- // If polling flag was changed, stop using polling from now on and switch to XHR server / callback
- if (!cordova.UsePolling) {
- require('cordova/plugin/android/callback')();
- return;
- }
+function pollOnce() {
+ var msg = prompt("", "gap_poll:");
+ if (msg) {
+ try {
+ eval(""+msg);
+ }
+ catch (e) {
+ console.log("JSCallbackPolling: Message from Server: " + msg);
+ console.log("JSCallbackPolling Error: "+e);
+ }
+ return true;
+ }
+ return false;
+}
- var msg = prompt("", "gap_poll:");
- if (msg) {
- setTimeout(function() {
- try {
- var t = eval(""+msg);
- }
- catch (e) {
- console.log("JSCallbackPolling: Message from Server: " + msg);
- console.log("JSCallbackPolling Error: "+e);
- }
- }, 1);
- setTimeout(polling, 1);
- }
- else {
- setTimeout(polling, period);
- }
+function doPoll() {
+ if (!enabled) {
+ return;
+ }
+ var nextDelay = POLL_INTERVAL;
+ if (pollOnce()) {
+ nextDelay = 0;
+ }
+ setTimeout(doPoll, nextDelay);
+}
+
+module.exports = {
+ start: function() {
+ enabled = true;
+ setTimeout(doPoll, 1);
+ },
+ stop: function() {
+ enabled = false;
+ },
+ pollOnce: pollOnce
};
-module.exports = polling;
+
});
// file: lib/android/plugin/android/storage.js
@@ -4796,7 +4794,7 @@ var contacts = {
* This function creates a new contact, but it does not persist the contact
* to device storage. To persist the contact to device storage, invoke
* contact.save().
- * @param properties an object who's properties will be examined to create a new Contact
+ * @param properties an object whose properties will be examined to create a new Contact
* @returns new Contact object
*/
create:function(properties) {
@@ -4815,6 +4813,93 @@ module.exports = contacts;
});
+// file: lib/common/plugin/device.js
+define("cordova/plugin/device", function(require, exports, module) {
+var channel = require('cordova/channel'),
+ utils = require('cordova/utils'),
+ exec = require('cordova/exec');
+
+// Tell cordova channel to wait on the CordovaInfoReady event
+channel.waitForInitialization('onCordovaInfoReady');
+
+/**
+ * This represents the mobile device, and provides properties for inspecting the model, version, UUID of the
+ * phone, etc.
+ * @constructor
+ */
+function Device() {
+ this.available = false;
+ this.platform = null;
+ this.version = null;
+ this.name = null;
+ this.uuid = null;
+ this.cordova = null;
+
+ var me = this;
+
+ channel.onCordovaReady.subscribeOnce(function() {
+ me.getInfo(function(info) {
+ me.available = true;
+ me.platform = info.platform;
+ me.version = info.version;
+ me.name = info.name;
+ me.uuid = info.uuid;
+ me.cordova = info.cordova;
+ channel.onCordovaInfoReady.fire();
+ },function(e) {
+ me.available = false;
+ utils.alert("[ERROR] Error initializing Cordova: " + e);
+ });
+ });
+}
+
+/**
+ * Get device info
+ *
+ * @param {Function} successCallback The function to call when the heading data is available
+ * @param {Function} errorCallback The function to call when there is an error getting the heading data. (OPTIONAL)
+ */
+Device.prototype.getInfo = function(successCallback, errorCallback) {
+
+ // successCallback required
+ if (typeof successCallback !== "function") {
+ console.log("Device Error: successCallback is not a function");
+ return;
+ }
+
+ // errorCallback optional
+ if (errorCallback && (typeof errorCallback !== "function")) {
+ console.log("Device Error: errorCallback is not a function");
+ return;
+ }
+
+ // Get info
+ exec(successCallback, errorCallback, "Device", "getDeviceInfo", []);
+};
+
+module.exports = new Device();
+
+});
+
+// file: lib/common/plugin/echo.js
+define("cordova/plugin/echo", function(require, exports, module) {
+var exec = require('cordova/exec');
+
+/**
+ * Sends the given message through exec() to the Echo plugink, which sends it back to the successCallback.
+ * @param successCallback invoked with a FileSystem object
+ * @param errorCallback invoked if error occurs retrieving file system
+ * @param message The string to be echoed.
+ * @param forceAsync Whether to force an async return value (for testing native->js bridge).
+ */
+module.exports = function(successCallback, errorCallback, message, forceAsync) {
+ var action = forceAsync ? 'echoAsync' : 'echo';
+ exec(successCallback, errorCallback, "Echo", action, [message]);
+};
+
+
+});
+
// file: lib/common/plugin/geolocation.js
define("cordova/plugin/geolocation", function(require, exports, module) {
var utils = require('cordova/utils'),
@@ -4923,7 +5008,7 @@ var geolocation = {
} else if (options.timeout === 0) {
fail({
code:PositionError.TIMEOUT,
- message:"timeout value in PositionOptions set to 0 and no cached Position object available, or cached Position object's age exceed's provided PositionOptions' maximumAge parameter."
+ message:"timeout value in PositionOptions set to 0 and no cached Position object available, or cached Position object's age exceeds provided PositionOptions' maximumAge parameter."
});
// Otherwise we have to call into native to retrieve a position.
} else {
@@ -5087,7 +5172,7 @@ CurrentLevel = LevelsMap.WARN;
*
* The value used determines which messages get printed. The logging
* values above are in order, and only messages logged at the logging
- * level or above will actually be displayed to the user. Eg, the
+ * level or above will actually be displayed to the user. E.g., the
* default level is WARN, so only messages logged with LOG, ERROR, or
* WARN will be displayed; INFO and DEBUG messages will be ignored.
*/
@@ -5466,6 +5551,9 @@ define("cordova/plugin/splashscreen", function(require, exports, module) {
var exec = require('cordova/exec');
var splashscreen = {
+ show:function() {
+ exec(null, null, "SplashScreen", "show", []);
+ },
hide:function() {
exec(null, null, "SplashScreen", "hide", []);
}
@@ -5723,4 +5811,4 @@ window.cordova = require('cordova');
}(window));
-})(); \ No newline at end of file
+})();var PhoneGap = cordova;
diff --git a/phonegap/www/cordova-independent.js b/phonegap/www/cordova-independent.js
new file mode 100644
index 000000000..f56a8f08f
--- /dev/null
+++ b/phonegap/www/cordova-independent.js
@@ -0,0 +1,12 @@
+(function () {
+ var scriptElement = document.createElement("script");
+ scriptElement.type = "text/javascript";
+ if (navigator.userAgent.match(/(iPhone|iPod|iPad)/)) {
+ scriptElement.src = 'cordova-ios-2.1.0.js';
+ } else if (navigator.userAgent.match(/Android/)) {
+ scriptElement.src = 'cordova-android-2.1.0.js';
+ } else {
+ alert("Unknown platform - userAgent is: " + navigator.userAgent);
+ }
+ $('head').prepend(scriptElement);
+})();
diff --git a/phonegap/www/cordova-1.8.0.js b/phonegap/www/cordova-ios-2.1.0.js
index d9cced70f..db81edf6c 100644..100755
--- a/phonegap/www/cordova-1.8.0.js
+++ b/phonegap/www/cordova-ios-2.1.0.js
@@ -1,6 +1,6 @@
-// commit 109b8649b0e98597b147842a6f71999d2f7910f2
+// commit 143f5221a6251c9cbccdedc57005c61551b97f12
-// File generated at :: Tue Jun 05 2012 14:10:19 GMT-0700 (PDT)
+// File generated at :: Wed Sep 12 2012 15:26:58 GMT-0700 (PDT)
/*
Licensed to the Apache Software Foundation (ASF) under one
@@ -186,11 +186,19 @@ var cordova = {
},
/**
* Method to fire event from native code
+ * bNoDetach is required for events which cause an exception which needs to be caught in native code
*/
- fireDocumentEvent: function(type, data) {
+ fireDocumentEvent: function(type, data, bNoDetach) {
var evt = createEvent(type, data);
if (typeof documentEventHandlers[type] != 'undefined') {
- documentEventHandlers[type].fire(evt);
+ if( bNoDetach ) {
+ documentEventHandlers[type].fire(evt);
+ }
+ else {
+ setTimeout(function() {
+ documentEventHandlers[type].fire(evt);
+ }, 0);
+ }
} else {
document.dispatchEvent(evt);
}
@@ -198,15 +206,13 @@ var cordova = {
fireWindowEvent: function(type, data) {
var evt = createEvent(type,data);
if (typeof windowEventHandlers[type] != 'undefined') {
- windowEventHandlers[type].fire(evt);
+ setTimeout(function() {
+ windowEventHandlers[type].fire(evt);
+ }, 0);
} else {
window.dispatchEvent(evt);
}
},
- // TODO: this is Android only; think about how to do this better
- shuttingDown:false,
- UsePolling:false,
- // END TODO
// TODO: iOS only
// This queue holds the currently executing command and all pending
@@ -285,17 +291,6 @@ var cordova = {
}
}
},
- // TODO: remove in 2.0.
- addPlugin: function(name, obj) {
- console.log("[DEPRECATION NOTICE] window.addPlugin and window.plugins will be removed in version 2.0.");
- if (!window.plugins[name]) {
- window.plugins[name] = obj;
- }
- else {
- console.log("Error: Plugin "+name+" already exists.");
- }
- },
-
addConstructor: function(func) {
channel.onCordovaReady.subscribeOnce(function() {
try {
@@ -312,51 +307,6 @@ channel.onPause = cordova.addDocumentEventHandler('pause');
channel.onResume = cordova.addDocumentEventHandler('resume');
channel.onDeviceReady = cordova.addDocumentEventHandler('deviceready');
-// Adds deprecation warnings to functions of an object (but only logs a message once)
-function deprecateFunctions(obj, objLabel) {
- var newObj = {};
- var logHash = {};
- for (var i in obj) {
- if (obj.hasOwnProperty(i)) {
- if (typeof obj[i] == 'function') {
- newObj[i] = (function(prop){
- var oldFunk = obj[prop];
- var funkId = objLabel + '_' + prop;
- return function() {
- if (!logHash[funkId]) {
- console.log('[DEPRECATION NOTICE] The "' + objLabel + '" global will be removed in version 2.0, please use lowercase "cordova".');
- logHash[funkId] = true;
- }
- oldFunk.apply(obj, arguments);
- };
- })(i);
- } else {
- newObj[i] = (function(prop) { return obj[prop]; })(i);
- }
- }
- }
- return newObj;
-}
-
-/**
- * Legacy variable for plugin support
- * TODO: remove in 2.0.
- */
-if (!window.PhoneGap) {
- window.PhoneGap = deprecateFunctions(cordova, 'PhoneGap');
-}
-if (!window.Cordova) {
- window.Cordova = deprecateFunctions(cordova, 'Cordova');
-}
-
-/**
- * Plugins object
- * TODO: remove in 2.0.
- */
-if (!window.plugins) {
- window.plugins = {};
-}
-
module.exports = cordova;
});
@@ -456,7 +406,8 @@ module.exports = {
// file: lib/common/channel.js
define("cordova/channel", function(require, exports, module) {
-var utils = require('cordova/utils');
+var utils = require('cordova/utils'),
+ nextGuid = 1;
/**
* Custom pub-sub "channel" that can have functions subscribed to it
@@ -508,7 +459,6 @@ var Channel = function(type, opts) {
this.type = type;
this.handlers = {};
this.numHandlers = 0;
- this.guid = 1;
this.fired = false;
this.enabled = true;
this.events = {
@@ -601,19 +551,19 @@ Channel.prototype.subscribe = function(f, c, g) {
g = g || func.observer_guid || f.observer_guid;
if (!g) {
- // first time we've seen this subscriber
- g = this.guid++;
- }
- else {
- // subscriber already handled; dont set it twice
- return g;
+ // first time any channel has seen this subscriber
+ g = nextGuid++;
}
func.observer_guid = g;
f.observer_guid = g;
- this.handlers[g] = func;
- this.numHandlers++;
- if (this.events.onSubscribe) this.events.onSubscribe.call(this);
- if (this.fired) func.call(this);
+
+ // Don't add the same handler more than once.
+ if (!this.handlers[g]) {
+ this.handlers[g] = func;
+ this.numHandlers++;
+ if (this.events.onSubscribe) this.events.onSubscribe.call(this);
+ if (this.fired) func.apply(this, this.fireArgs);
+ }
return g;
};
@@ -627,15 +577,14 @@ Channel.prototype.subscribeOnce = function(f, c) {
var g = null;
var _this = this;
- var m = function() {
- f.apply(c || null, arguments);
- _this.unsubscribe(g);
- };
if (this.fired) {
- if (typeof c == "object") { f = utils.close(c, f); }
- f.apply(this, this.fireArgs);
+ f.apply(c || null, this.fireArgs);
} else {
- g = this.subscribe(m);
+ g = this.subscribe(function() {
+ _this.unsubscribe(g);
+ f.apply(c || null, arguments);
+ });
+ f.observer_guid = g;
}
return g;
};
@@ -651,7 +600,6 @@ Channel.prototype.unsubscribe = function(g) {
var handler = this.handlers[g];
if (handler) {
if (handler.observer_guid) handler.observer_guid=null;
- this.handlers[g] = null;
delete this.handlers[g];
this.numHandlers--;
if (this.events.onUnsubscribe) this.events.onUnsubscribe.call(this);
@@ -665,14 +613,17 @@ Channel.prototype.fire = function(e) {
if (this.enabled) {
var fail = false;
this.fired = true;
+ this.fireArgs = arguments;
+ // Copy the values first so that it is safe to modify it from within
+ // callbacks.
+ var toCall = [];
for (var item in this.handlers) {
- var handler = this.handlers[item];
- if (typeof handler == 'function') {
- var rv = (handler.apply(this, arguments)===false);
- fail = fail || rv;
- }
+ toCall.push(this.handlers[item]);
+ }
+ for (var i = 0; i < toCall.length; ++i) {
+ var rv = (toCall[i].apply(this, arguments)===false);
+ fail = fail || rv;
}
- this.fireArgs = arguments;
return !fail;
}
return true;
@@ -709,7 +660,6 @@ channel.create('onDestroy');
// Channels that must fire before "deviceready" is fired.
channel.waitForInitialization('onCordovaReady');
-channel.waitForInitialization('onCordovaInfoReady');
channel.waitForInitialization('onCordovaConnectionReady');
module.exports = channel;
@@ -738,13 +688,6 @@ module.exports = {
}
}
},
- PhoneGap:{
- children: {
- exec: {
- path: 'cordova/exec'
- }
- }
- },
navigator: {
children: {
notification: {
@@ -844,6 +787,9 @@ module.exports = {
Coordinates: {
path: 'cordova/plugin/Coordinates'
},
+ device: {
+ path: 'cordova/plugin/device'
+ },
DirectoryEntry: {
path: 'cordova/plugin/DirectoryEntry'
},
@@ -933,20 +879,46 @@ define("cordova/exec", function(require, exports, module) {
* @private
*/
var cordova = require('cordova'),
+ channel = require('cordova/channel'),
+ nativecomm = require('cordova/plugin/ios/nativecomm'),
utils = require('cordova/utils'),
- gapBridge,
- createGapBridge = function() {
- gapBridge = document.createElement("iframe");
- gapBridge.setAttribute("style", "display:none;");
- gapBridge.setAttribute("height","0px");
- gapBridge.setAttribute("width","0px");
- gapBridge.setAttribute("frameborder","0");
- document.documentElement.appendChild(gapBridge);
+ jsToNativeModes = {
+ IFRAME_NAV: 0,
+ XHR_NO_PAYLOAD: 1,
+ XHR_WITH_PAYLOAD: 2,
+ XHR_OPTIONAL_PAYLOAD: 3
},
- channel = require('cordova/channel');
+ // XHR mode does not work on iOS 4.2, so default to IFRAME_NAV for such devices.
+ // XHR mode's main advantage is working around a bug in -webkit-scroll, which
+ // doesn't exist in 4.X devices anyways.
+ bridgeMode = navigator.userAgent.indexOf(' 4_') == -1 ? jsToNativeModes.XHR_NO_PAYLOAD : jsToNativeModes.IFRAME_NAV,
+ execIframe,
+ execXhr;
+
+function createExecIframe() {
+ var iframe = document.createElement("iframe");
+ iframe.style.display = 'none';
+ document.body.appendChild(iframe);
+ return iframe;
+}
-module.exports = function() {
- if (!channel.onCordovaInfoReady.fired) {
+function shouldBundleCommandJson() {
+ if (bridgeMode == 2) {
+ return true;
+ }
+ if (bridgeMode == 3) {
+ var payloadLength = 0;
+ for (var i = 0; i < cordova.commandQueue.length; ++i) {
+ payloadLength += cordova.commandQueue[i].length;
+ }
+ // The value here was determined using the benchmark within CordovaLibApp on an iPad 3.
+ return payloadLength < 4500;
+ }
+ return false;
+}
+
+function iOSExec() {
+ if (!channel.onCordovaReady.fired) {
utils.alert("ERROR: Attempting to call cordova.exec()" +
" before 'deviceready'. Ignoring.");
return;
@@ -975,13 +947,6 @@ module.exports = function() {
actionArgs = Array.prototype.splice.call(arguments, 1);
}
- // Start building the command object.
- var command = {
- className: service,
- methodName: action,
- "arguments": []
- };
-
// Register the callbacks and add the callbackId to the positional
// arguments if given.
if (successCallback || failCallback) {
@@ -989,20 +954,8 @@ module.exports = function() {
cordova.callbacks[callbackId] =
{success:successCallback, fail:failCallback};
}
- if (callbackId !== null) {
- command["arguments"].push(callbackId);
- }
- for (var i = 0; i < actionArgs.length; ++i) {
- var arg = actionArgs[i];
- if (arg === undefined || arg === null) { // nulls are pushed to the args now (becomes NSNull)
- command["arguments"].push(arg);
- } else if (typeof(arg) == 'object' && !(utils.isArray(arg))) {
- command.options = arg;
- } else {
- command["arguments"].push(arg);
- }
- }
+ var command = [callbackId, service, action, actionArgs];
// Stringify and queue the command. We stringify to command now to
// effectively clone the command arguments in case they are mutated before
@@ -1014,13 +967,38 @@ module.exports = function() {
// commands to execute, unless the queue is currently being flushed, in
// which case the command will be picked up without notification.
if (cordova.commandQueue.length == 1 && !cordova.commandQueueFlushing) {
- if (!gapBridge) {
- createGapBridge();
+ if (bridgeMode) {
+ execXhr = execXhr || new XMLHttpRequest();
+ // Changeing this to a GET will make the XHR reach the URIProtocol on 4.2.
+ // For some reason it still doesn't work though...
+ execXhr.open('HEAD', "file:///!gap_exec", true);
+ execXhr.setRequestHeader('vc', cordova.iOSVCAddr);
+ if (shouldBundleCommandJson()) {
+ execXhr.setRequestHeader('cmds', nativecomm());
+ }
+ execXhr.send(null);
+ } else {
+ execIframe = execIframe || createExecIframe();
+ execIframe.src = "gap://ready";
}
- gapBridge.src = "gap://ready";
}
+}
+
+iOSExec.jsToNativeModes = jsToNativeModes;
+
+iOSExec.setJsToNativeBridgeMode = function(mode) {
+ // Remove the iFrame since it may be no longer required, and its existence
+ // can trigger browser bugs.
+ // https://issues.apache.org/jira/browse/CB-593
+ if (execIframe) {
+ execIframe.parentNode.removeChild(execIframe);
+ execIframe = null;
+ }
+ bridgeMode = mode;
};
+module.exports = iOSExec;
+
});
// file: lib/ios/platform.js
@@ -1040,12 +1018,12 @@ module.exports = {
File: { // exists natively, override
path: "cordova/plugin/File"
},
+ FileReader: { // exists natively, override
+ path: "cordova/plugin/FileReader"
+ },
MediaError: { // exists natively, override
path: "cordova/plugin/MediaError"
},
- device: {
- path: 'cordova/plugin/ios/device'
- },
console: {
path: 'cordova/plugin/ios/console'
}
@@ -1199,7 +1177,14 @@ cameraExport.getPicture = function(successCallback, errorCallback, options) {
popoverOptions = options.popoverOptions;
}
- exec(successCallback, errorCallback, "Camera", "takePicture", [quality, destinationType, sourceType, targetWidth, targetHeight, encodingType, mediaType, allowEdit, correctOrientation, saveToPhotoAlbum, popoverOptions]);
+ var args = [quality, destinationType, sourceType, targetWidth, targetHeight, encodingType,
+ mediaType, allowEdit, correctOrientation, saveToPhotoAlbum, popoverOptions];
+
+ exec(successCallback, errorCallback, "Camera", "takePicture", args);
+};
+
+cameraExport.cleanup = function(successCallback, errorCallback) {
+ exec(successCallback, errorCallback, "Camera", "cleanup", []);
};
module.exports = cameraExport;
@@ -1784,7 +1769,7 @@ var utils = require('cordova/utils'),
* {boolean} isDirectory always true (readonly)
* {DOMString} name of the directory, excluding the path leading to it (readonly)
* {DOMString} fullPath the absolute full path to the directory (readonly)
- * {FileSystem} filesystem on which the directory resides (readonly)
+ * TODO: implement this!!! {FileSystem} filesystem on which the directory resides (readonly)
*/
var DirectoryEntry = function(name, fullPath) {
DirectoryEntry.__super__.constructor.apply(this, [false, true, name, fullPath]);
@@ -2514,11 +2499,13 @@ var FileSystem = function(name, root) {
};
module.exports = FileSystem;
+
});
// file: lib/common/plugin/FileTransfer.js
define("cordova/plugin/FileTransfer", function(require, exports, module) {
-var exec = require('cordova/exec');
+var exec = require('cordova/exec'),
+ FileTransferError = require('cordova/plugin/FileTransferError');
/**
* FileTransfer uploads a file to a remote server.
@@ -2537,16 +2524,20 @@ var FileTransfer = function() {};
* @param trustAllHosts {Boolean} Optional trust all hosts (e.g. for self-signed certs), defaults to false
*/
FileTransfer.prototype.upload = function(filePath, server, successCallback, errorCallback, options, trustAllHosts) {
+ // sanity parameter checking
+ if (!filePath || !server) throw new Error("FileTransfer.upload requires filePath and server URL parameters at the minimum.");
// check for options
var fileKey = null;
var fileName = null;
var mimeType = null;
var params = null;
var chunkedMode = true;
+ var headers = null;
if (options) {
fileKey = options.fileKey;
fileName = options.fileName;
mimeType = options.mimeType;
+ headers = options.headers;
if (options.chunkedMode !== null || typeof options.chunkedMode != "undefined") {
chunkedMode = options.chunkedMode;
}
@@ -2558,7 +2549,12 @@ FileTransfer.prototype.upload = function(filePath, server, successCallback, erro
}
}
- exec(successCallback, errorCallback, 'FileTransfer', 'upload', [filePath, server, fileKey, fileName, mimeType, params, trustAllHosts, chunkedMode]);
+ var fail = function(e) {
+ var error = new FileTransferError(e.code, e.source, e.target, e.http_status);
+ errorCallback(error);
+ };
+
+ exec(successCallback, fail, 'FileTransfer', 'upload', [filePath, server, fileKey, fileName, mimeType, params, trustAllHosts, chunkedMode, headers]);
};
/**
@@ -2569,6 +2565,8 @@ FileTransfer.prototype.upload = function(filePath, server, successCallback, erro
* @param errorCallback {Function} Callback to be invoked upon error
*/
FileTransfer.prototype.download = function(source, target, successCallback, errorCallback) {
+ // sanity parameter checking
+ if (!source || !target) throw new Error("FileTransfer.download requires source URI and target URI parameters at the minimum.");
var win = function(result) {
var entry = null;
if (result.isDirectory) {
@@ -2583,6 +2581,12 @@ FileTransfer.prototype.download = function(source, target, successCallback, erro
entry.fullPath = result.fullPath;
successCallback(entry);
};
+
+ var fail = function(e) {
+ var error = new FileTransferError(e.code, e.source, e.target, e.http_status);
+ errorCallback(error);
+ };
+
exec(win, errorCallback, 'FileTransfer', 'download', [source, target]);
};
@@ -2596,8 +2600,11 @@ define("cordova/plugin/FileTransferError", function(require, exports, module) {
* FileTransferError
* @constructor
*/
-var FileTransferError = function(code) {
+var FileTransferError = function(code, source, target, status) {
this.code = code || null;
+ this.source = source || null;
+ this.target = target || null;
+ this.http_status = status || null;
};
FileTransferError.FILE_NOT_FOUND_ERR = 1;
@@ -2605,6 +2612,7 @@ FileTransferError.INVALID_URL_ERR = 2;
FileTransferError.CONNECTION_ERR = 3;
module.exports = FileTransferError;
+
});
// file: lib/common/plugin/FileUploadOptions.js
@@ -2616,15 +2624,19 @@ define("cordova/plugin/FileUploadOptions", function(require, exports, module) {
* @param fileName {String} Filename to be used by the server. Defaults to image.jpg.
* @param mimeType {String} Mimetype of the uploaded file. Defaults to image/jpeg.
* @param params {Object} Object with key: value params to send to the server.
+ * @param headers {Object} Keys are header names, values are header values. Multiple
+ * headers of the same name are not supported.
*/
-var FileUploadOptions = function(fileKey, fileName, mimeType, params) {
+var FileUploadOptions = function(fileKey, fileName, mimeType, params, headers) {
this.fileKey = fileKey || null;
this.fileName = fileName || null;
this.mimeType = mimeType || null;
this.params = params || null;
+ this.headers = headers || null;
};
module.exports = FileUploadOptions;
+
});
// file: lib/common/plugin/FileUploadResult.js
@@ -2812,7 +2824,7 @@ FileWriter.prototype.seek = function(offset) {
if (offset < 0) {
this.position = Math.max(offset + this.length, 0);
}
- // Offset is bigger then file size so set position
+ // Offset is bigger than file size so set position
// to the end of the file.
else if (offset > this.length) {
this.position = this.length;
@@ -3019,7 +3031,6 @@ Media.prototype.stop = function() {
var me = this;
exec(function() {
me._position = 0;
- me.successCallback();
}, this.errorCallback, "Media", "stopPlayingAudio", [this.id]);
};
@@ -3065,14 +3076,14 @@ Media.prototype.getCurrentPosition = function(success, fail) {
* Start recording audio file.
*/
Media.prototype.startRecord = function() {
- exec(this.successCallback, this.errorCallback, "Media", "startRecordingAudio", [this.id, this.src]);
+ exec(null, this.errorCallback, "Media", "startRecordingAudio", [this.id, this.src]);
};
/**
* Stop recording audio file.
*/
Media.prototype.stopRecord = function() {
- exec(this.successCallback, this.errorCallback, "Media", "stopRecordingAudio", [this.id]);
+ exec(null, this.errorCallback, "Media", "stopRecordingAudio", [this.id]);
};
/**
@@ -3094,34 +3105,39 @@ Media.prototype.setVolume = function(volume) {
* PRIVATE
*
* @param id The media object id (string)
- * @param status The status code (int)
- * @param msg The status message (string)
+ * @param msgType The 'type' of update this is
+ * @param value Use of value is determined by the msgType
*/
-Media.onStatus = function(id, msg, value) {
+Media.onStatus = function(id, msgType, value) {
+
var media = mediaObjects[id];
- // If state update
- if (msg === Media.MEDIA_STATE) {
- if (value === Media.MEDIA_STOPPED) {
- if (media.successCallback) {
- media.successCallback();
- }
- }
- if (media.statusCallback) {
- media.statusCallback(value);
- }
- }
- else if (msg === Media.MEDIA_DURATION) {
- media._duration = value;
- }
- else if (msg === Media.MEDIA_ERROR) {
- if (media.errorCallback) {
- // value should be a MediaError object when msg == MEDIA_ERROR
- media.errorCallback(value);
+
+ if(media) {
+ switch(msgType) {
+ case Media.MEDIA_STATE :
+ media.statusCallback && media.statusCallback(value);
+ if(value == Media.MEDIA_STOPPED) {
+ media.successCallback && media.successCallback();
+ }
+ break;
+ case Media.MEDIA_DURATION :
+ media._duration = value;
+ break;
+ case Media.MEDIA_ERROR :
+ media.errorCallback && media.errorCallback(value);
+ break;
+ case Media.MEDIA_POSITION :
+ media._position = Number(value);
+ break;
+ default :
+ console && console.error && console.error("Unhandled Media.onStatus :: " + msgType);
+ break;
}
}
- else if (msg === Media.MEDIA_POSITION) {
- media._position = value;
+ else {
+ console && console.error && console.error("Received Media.onStatus callback for unknown media :: " + id);
}
+
};
module.exports = Media;
@@ -3131,20 +3147,36 @@ module.exports = Media;
define("cordova/plugin/MediaError", function(require, exports, module) {
/**
* This class contains information about any Media errors.
- * @constructor
+*/
+/*
+ According to :: http://dev.w3.org/html5/spec-author-view/video.html#mediaerror
+ We should never be creating these objects, we should just implement the interface
+ which has 1 property for an instance, 'code'
+
+ instead of doing :
+ errorCallbackFunction( new MediaError(3,'msg') );
+we should simply use a literal :
+ errorCallbackFunction( {'code':3} );
*/
-var MediaError = function(code, msg) {
- this.code = (code !== undefined ? code : null);
- this.message = msg || "";
-};
-MediaError.MEDIA_ERR_NONE_ACTIVE = 0;
-MediaError.MEDIA_ERR_ABORTED = 1;
-MediaError.MEDIA_ERR_NETWORK = 2;
-MediaError.MEDIA_ERR_DECODE = 3;
-MediaError.MEDIA_ERR_NONE_SUPPORTED = 4;
+if(!MediaError) {
+ var MediaError = function(code, msg) {
+ this.code = (typeof code != 'undefined') ? code : null;
+ this.message = msg || ""; // message is NON-standard! do not use!
+ };
+}
+
+MediaError.MEDIA_ERR_NONE_ACTIVE = MediaError.MEDIA_ERR_NONE_ACTIVE || 0;
+MediaError.MEDIA_ERR_ABORTED = MediaError.MEDIA_ERR_ABORTED || 1;
+MediaError.MEDIA_ERR_NETWORK = MediaError.MEDIA_ERR_NETWORK || 2;
+MediaError.MEDIA_ERR_DECODE = MediaError.MEDIA_ERR_DECODE || 3;
+MediaError.MEDIA_ERR_NONE_SUPPORTED = MediaError.MEDIA_ERR_NONE_SUPPORTED || 4;
+// TODO: MediaError.MEDIA_ERR_NONE_SUPPORTED is legacy, the W3 spec now defines it as below.
+// as defined by http://dev.w3.org/html5/spec-author-view/video.html#error-codes
+MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED = MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED || 4;
module.exports = MediaError;
+
});
// file: lib/common/plugin/MediaFile.js
@@ -3182,28 +3214,6 @@ MediaFile.prototype.getFormatData = function(successCallback, errorCallback) {
}
};
-// TODO: can we axe this?
-/**
- * Casts a PluginResult message property (array of objects) to an array of MediaFile objects
- * (used in Objective-C and Android)
- *
- * @param {PluginResult} pluginResult
- */
-MediaFile.cast = function(pluginResult) {
- var mediaFiles = [];
- for (var i=0; i<pluginResult.message.length; i++) {
- var mediaFile = new MediaFile();
- mediaFile.name = pluginResult.message[i].name;
- mediaFile.fullPath = pluginResult.message[i].fullPath;
- mediaFile.type = pluginResult.message[i].type;
- mediaFile.lastModifiedDate = pluginResult.message[i].lastModifiedDate;
- mediaFile.size = pluginResult.message[i].size;
- mediaFiles.push(mediaFile);
- }
- pluginResult.message = mediaFiles;
- return pluginResult;
-};
-
module.exports = MediaFile;
});
@@ -3409,12 +3419,12 @@ var accelerometer = {
var p;
var win = function(a) {
- successCallback(a);
removeListeners(p);
+ successCallback(a);
};
var fail = function(e) {
- errorCallback(e);
removeListeners(p);
+ errorCallback(e);
};
p = createCallbackPair(win, fail);
@@ -3446,8 +3456,8 @@ var accelerometer = {
var id = utils.createUUID();
var p = createCallbackPair(function(){}, function(e) {
- errorCallback(e);
removeListeners(p);
+ errorCallback(e);
});
listeners.push(p);
@@ -3462,7 +3472,10 @@ var accelerometer = {
if (running) {
// If we're already running then immediately invoke the success callback
- successCallback(accel);
+ // but only if we have retrieved a value, sample code does not check for null ...
+ if(accel) {
+ successCallback(accel);
+ }
} else {
start();
}
@@ -3977,7 +3990,7 @@ var contacts = {
* This function creates a new contact, but it does not persist the contact
* to device storage. To persist the contact to device storage, invoke
* contact.save().
- * @param properties an object who's properties will be examined to create a new Contact
+ * @param properties an object whose properties will be examined to create a new Contact
* @returns new Contact object
*/
create:function(properties) {
@@ -3996,6 +4009,93 @@ module.exports = contacts;
});
+// file: lib/common/plugin/device.js
+define("cordova/plugin/device", function(require, exports, module) {
+var channel = require('cordova/channel'),
+ utils = require('cordova/utils'),
+ exec = require('cordova/exec');
+
+// Tell cordova channel to wait on the CordovaInfoReady event
+channel.waitForInitialization('onCordovaInfoReady');
+
+/**
+ * This represents the mobile device, and provides properties for inspecting the model, version, UUID of the
+ * phone, etc.
+ * @constructor
+ */
+function Device() {
+ this.available = false;
+ this.platform = null;
+ this.version = null;
+ this.name = null;
+ this.uuid = null;
+ this.cordova = null;
+
+ var me = this;
+
+ channel.onCordovaReady.subscribeOnce(function() {
+ me.getInfo(function(info) {
+ me.available = true;
+ me.platform = info.platform;
+ me.version = info.version;
+ me.name = info.name;
+ me.uuid = info.uuid;
+ me.cordova = info.cordova;
+ channel.onCordovaInfoReady.fire();
+ },function(e) {
+ me.available = false;
+ utils.alert("[ERROR] Error initializing Cordova: " + e);
+ });
+ });
+}
+
+/**
+ * Get device info
+ *
+ * @param {Function} successCallback The function to call when the heading data is available
+ * @param {Function} errorCallback The function to call when there is an error getting the heading data. (OPTIONAL)
+ */
+Device.prototype.getInfo = function(successCallback, errorCallback) {
+
+ // successCallback required
+ if (typeof successCallback !== "function") {
+ console.log("Device Error: successCallback is not a function");
+ return;
+ }
+
+ // errorCallback optional
+ if (errorCallback && (typeof errorCallback !== "function")) {
+ console.log("Device Error: errorCallback is not a function");
+ return;
+ }
+
+ // Get info
+ exec(successCallback, errorCallback, "Device", "getDeviceInfo", []);
+};
+
+module.exports = new Device();
+
+});
+
+// file: lib/common/plugin/echo.js
+define("cordova/plugin/echo", function(require, exports, module) {
+var exec = require('cordova/exec');
+
+/**
+ * Sends the given message through exec() to the Echo plugink, which sends it back to the successCallback.
+ * @param successCallback invoked with a FileSystem object
+ * @param errorCallback invoked if error occurs retrieving file system
+ * @param message The string to be echoed.
+ * @param forceAsync Whether to force an async return value (for testing native->js bridge).
+ */
+module.exports = function(successCallback, errorCallback, message, forceAsync) {
+ var action = forceAsync ? 'echoAsync' : 'echo';
+ exec(successCallback, errorCallback, "Echo", action, [message]);
+};
+
+
+});
+
// file: lib/common/plugin/geolocation.js
define("cordova/plugin/geolocation", function(require, exports, module) {
var utils = require('cordova/utils'),
@@ -4104,7 +4204,7 @@ var geolocation = {
} else if (options.timeout === 0) {
fail({
code:PositionError.TIMEOUT,
- message:"timeout value in PositionOptions set to 0 and no cached Position object available, or cached Position object's age exceed's provided PositionOptions' maximumAge parameter."
+ message:"timeout value in PositionOptions set to 0 and no cached Position object available, or cached Position object's age exceeds provided PositionOptions' maximumAge parameter."
});
// Otherwise we have to call into native to retrieve a position.
} else {
@@ -4444,50 +4544,24 @@ module.exports = {
* allowsEditing: boolean AS STRING
* "true" to allow editing the contact
* "false" (default) display contact
+ * fields: array of fields to return in contact object (see ContactOptions.fields)
+ *
+ * @returns
+ * id of contact selected
+ * ContactObject
+ * if no fields provided contact contains just id information
+ * if fields provided contact object contains information for the specified fields
*
- * returns: the id of the selected contact as param to successCallback
*/
- exec(successCallback, null, "Contacts","chooseContact", [options]);
+ var win = function(result) {
+ var fullContact = require('cordova/plugin/contacts').create(result);
+ successCallback(fullContact.id, fullContact);
+ };
+ exec(win, null, "Contacts","chooseContact", [options]);
}
};
});
-// file: lib/ios/plugin/ios/device.js
-define("cordova/plugin/ios/device", function(require, exports, module) {
-/**
- * this represents the mobile device, and provides properties for inspecting the model, version, UUID of the
- * phone, etc.
- * @constructor
- */
-var exec = require('cordova/exec'),
- utils = require('cordova/utils'),
- channel = require('cordova/channel');
-
-var Device = function() {
- this.platform = null;
- this.version = null;
- this.name = null;
- this.cordova = null;
- this.uuid = null;
-};
-
-Device.prototype.setInfo = function(info) {
- try {
- this.platform = info.platform;
- this.version = info.version;
- this.name = info.name;
- this.cordova = info.cordova;
- this.uuid = info.uuid;
- channel.onCordovaInfoReady.fire();
- } catch(e) {
- utils.alert('Error during device info setting in cordova/plugin/ios/device!');
- }
-};
-
-module.exports = new Device();
-
-});
-
// file: lib/ios/plugin/ios/nativecomm.js
define("cordova/plugin/ios/nativecomm", function(require, exports, module) {
var cordova = require('cordova');
@@ -4496,10 +4570,12 @@ var cordova = require('cordova');
* Called by native code to retrieve all queued commands and clear the queue.
*/
module.exports = function() {
- var json = JSON.stringify(cordova.commandQueue);
- cordova.commandQueue = [];
+ // Each entry in commandQueue is a JSON string already.
+ var json = '[' + cordova.commandQueue.join(',') + ']';
+ cordova.commandQueue.length = 0;
return json;
};
+
});
// file: lib/ios/plugin/ios/notification.js
@@ -4587,7 +4663,7 @@ CurrentLevel = LevelsMap.WARN;
*
* The value used determines which messages get printed. The logging
* values above are in order, and only messages logged at the logging
- * level or above will actually be displayed to the user. Eg, the
+ * level or above will actually be displayed to the user. E.g., the
* default level is WARN, so only messages logged with LOG, ERROR, or
* WARN will be displayed; INFO and DEBUG messages will be ignored.
*/
@@ -4966,6 +5042,9 @@ define("cordova/plugin/splashscreen", function(require, exports, module) {
var exec = require('cordova/exec');
var splashscreen = {
+ show:function() {
+ exec(null, null, "SplashScreen", "show", []);
+ },
hide:function() {
exec(null, null, "SplashScreen", "hide", []);
}
@@ -5223,4 +5302,4 @@ window.cordova = require('cordova');
}(window));
-})(); \ No newline at end of file
+})();var PhoneGap = cordova;
diff --git a/phonegap/www/css/mobile.css b/phonegap/www/css/mobile.css
index f17f753fd..0cabbe5d5 100644
--- a/phonegap/www/css/mobile.css
+++ b/phonegap/www/css/mobile.css
@@ -8,13 +8,16 @@
padding-bottom: 0;
}
+.nodisplay {
+ display: none;
+}
+
.mobile-nav-banner {
position: fixed;
background: black;
}
.mobile-sign-in-banner {
- display: none;
background: none;
}
@@ -26,7 +29,6 @@
}
.mobile-info {
- position: fixed;
bottom: 0px;
width: 100%;
height: 20px;
diff --git a/phonegap/www/email_sent.html b/phonegap/www/email_sent.html
index 529ccb693..288b1f118 100644
--- a/phonegap/www/email_sent.html
+++ b/phonegap/www/email_sent.html
@@ -13,7 +13,7 @@
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<script type="text/javascript" src="js/json2.js"></script>
<script type="text/javascript" src="js/config.js"></script>
- <script type="text/javascript" src="cordova-1.8.0.js"></script>
+ <script type="text/javascript" src="cordova-independent.js"></script>
<script type="text/javascript" src="js/jquery-1.7.0.min.js"></script>
<script type="text/javascript" src="js/mobile.js"></script>
diff --git a/phonegap/www/index.html b/phonegap/www/index.html
index 77de47165..40787ac37 100644
--- a/phonegap/www/index.html
+++ b/phonegap/www/index.html
@@ -8,10 +8,12 @@
<link rel="stylesheet" href="css/base.css">
<link rel="stylesheet" href="css/mobile.css">
+
+ <script type="text/javascript" src="js/jquery-1.7.0.min.js"></script>
+ <script type="text/javascript" src="cordova-independent.js"></script>
+
<script type="text/javascript" src="js/json2.js"></script>
<script type="text/javascript" src="js/config.js"></script>
- <script type="text/javascript" charset="utf-8" src="cordova-1.8.0.js"></script>
- <script type="text/javascript" src="js/jquery-1.7.0.min.js"></script>
<script src="js/jquery.validate.min.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript" src="js/geo.min.js"></script>
@@ -87,7 +89,7 @@
</div>
<div class="big-green-banner mobile-map-banner mobile-sign-in-banner">
- <a id="sign_in" href="sign_in.html">Sign In</a><a id="sign_out" href="#" onclick="sign_out();">Sign Out</a>
+ <a id="account" href="account.html">Account</a>
</div>
</div> <!-- .wrapper -->
diff --git a/phonegap/www/js/mobile.js b/phonegap/www/js/mobile.js
index 07d973315..c44501d97 100644
--- a/phonegap/www/js/mobile.js
+++ b/phonegap/www/js/mobile.js
@@ -281,21 +281,29 @@ function postReport(e) {
service: 'iphone',
title: $('#form_title').val(),
detail: $('#form_detail').val(),
- name: $('#form_name').val(),
- may_show_name: $('#form_may_show_name').attr('checked') ? 1 : 0,
- email: $('#form_email').val(),
+ may_show_name: $('#form_may_show_name').attr('checked') ? 1 : 0,
category: $('#form_category').val(),
lat: $('#fixmystreet\\.latitude').val(),
lon: $('#fixmystreet\\.longitude').val(),
- password_sign_in: $('#password_sign_in').val(),
phone: $('#form_phone').val(),
pc: $('#pc').val()
};
- if ( submit_clicked.attr('id') == 'submit_sign_in' ) {
+ if ( localStorage.username && localStorage.password && localStorage.name ) {
+ params.name = localStorage.name;
+ params.email = localStorage.username;
+ params.password_sign_in = localStorage.password;
params.submit_sign_in = 1;
} else {
- params.submit_register = 1;
+ params.name = $('#form_name').val();
+ params.email = $('#form_email').val();
+ params.password_sign_in = $('#password_sign_in').val();
+
+ if ( submit_clicked.attr('id') == 'submit_sign_in' ) {
+ params.submit_sign_in = 1;
+ } else {
+ params.submit_register = 1;
+ }
}
showBusy( 'Sending Report', 'Please wait while your report is sent' );
@@ -330,6 +338,11 @@ function postReport(e) {
hideBusy();
window.location = 'email_sent.html';
}
+ if ( !localStorage.name && $('#password_sign_in').val() ) {
+ localStorage.name = $('#form_name').val();
+ localStorage.username = $('#form_email').val();
+ localStorage.password = $('#password_sign_in').val();
+ }
} else {
if ( data.check_name ) {
check_name( data.check_name, data.errors.name );
@@ -350,6 +363,8 @@ function postReport(e) {
function sign_in() {
showBusy( 'Signing In', 'Please wait while you are signed in' );
+ $('#form_email').blur();
+ $('#password_sign_in').blur();
jQuery.ajax( {
url: CONFIG.FMS_URL + "auth/ajax/sign_in",
type: 'POST',
@@ -362,10 +377,14 @@ function sign_in() {
console.log(data);
if ( data.name ) {
localStorage.name = data.name;
+ localStorage.username = $('#form_email').val();
+ localStorage.password = $('#password_sign_in').val();
hideBusy();
- window.location = 'signed_in.html';
- $('#sign_out').show();
- $('#sign_in').hide();
+ $('#user-meta').html('<p>You are signed in as ' + localStorage.username + '.</p>');
+ $('#form_sign_in_only').hide();
+ $('#forget_button').show();
+ $('#form_email').val('');
+ $('#password_sign_in').val('');
} else {
hideBusy();
$('#form_email').before('<div class="form-error">There was a problem with your email/password combination.</div>');
@@ -378,8 +397,17 @@ function sign_in() {
function display_signed_out_msg() {
if ( localStorage.signed_out == 1 ) {
$('#user-meta').html('<p>You&rsquo;ve been signed out.</p>');
+ $('#form_sign_in_only').show();
localStorage.signed_out = null;
}
+ if ( localStorage.name ) {
+ $('#user-meta').html('<p>You are signed in as ' + localStorage.username + '.</p>');
+ $('#form_sign_in_only').hide();
+ $('#forget_button').show();
+ } else {
+ $('#forget_button').hide();
+ $('#form_sign_in_only').show();
+ }
}
function sign_out() {
@@ -418,46 +446,12 @@ function sign_out_around() {
} );
}
-function check_auth() {
- if ( $('#user-meta').length && localStorage.signed_out != 1 ) {
- var sign_out_function = sign_out;
- if ( $('body').hasClass('mappage') ) {
- sign_out_function = sign_out_around;
- }
- jQuery.ajax( {
- url: CONFIG.FMS_URL + "auth/ajax/check_auth?" + new Date().getTime() ,
- type: 'GET',
- statusCode: {
- 200: function(data) {
- localStorage.name = data.name;
- $('#user-meta').html('<p>Hi ' + localStorage.name + '<a href="#" id="meta_sign_out">Sign out</a></p>');
- $('#meta_sign_out').on('click', sign_out_function );
- $('.mobile-sign-in-banner').show();
- $('#sign_in').hide();
- $('#sign_out').show();
- },
- 401: function() {
- $('#user-meta').html('');
- localStorage.name = '';
- $('.mobile-sign-in-banner').show();
- $('#sign_out').hide();
- $('#sign_in').show();
- $('#user-meta').html('');
- }
- }
- } );
- }
-}
-
-function signed_in() {
+function account() {
+ $('.mobile-sign-in-banner').show();
+ $('#account').show();
if ( localStorage.name ) {
if ( $('body').hasClass('signed-in-page') ) {
- var sign_out_function = sign_out;
- if ( $('body').hasClass('mappage') ) {
- sign_out_function = sign_out_around;
- }
- $('#user-meta').html('<p>Hi ' + localStorage.name + '<a href="#" id="meta_sign_out">Sign out</a></p>');
- $('#meta_sign_out').on('click', sign_out_function );
+ $('#user-meta').html('<p>Hi ' + localStorage.name + '</p>');
}
if ( $('#form_sign_in').length ) {
@@ -467,6 +461,14 @@ function signed_in() {
}
}
+function forget() {
+ delete localStorage.name;
+ delete localStorage.username;
+ delete localStorage.password;
+ localStorage.signed_out = 1;
+ display_signed_out_msg();
+}
+
function onDeviceReady() {
var location = document.location + '';
if ( location.indexOf('no_connection.html') < 0 && (
@@ -478,9 +480,9 @@ function onDeviceReady() {
$('#mapForm').submit(postReport);
$('#signInForm').submit(sign_in);
$('#ffo').click(getPosition);
+ $('#forget').click(forget);
$('#mapForm :input[type=submit]').on('click', function() { submit_clicked = $(this); });
- check_auth();
- signed_in();
+ account();
hideBusy();
}
diff --git a/phonegap/www/no_connection.html b/phonegap/www/no_connection.html
index 8a77d9c26..d81f5f83a 100644
--- a/phonegap/www/no_connection.html
+++ b/phonegap/www/no_connection.html
@@ -10,7 +10,7 @@
<link rel="stylesheet" href="css/mobile.css">
<script type="text/javascript" src="js/json2.js"></script>
<script type="text/javascript" src="js/config.js"></script>
- <script type="text/javascript" charset="utf-8" src="cordova-1.8.0.js"></script>
+ <script type="text/javascript" charset="utf-8" src="cordova-independent.js"></script>
<script type="text/javascript" src="js/jquery-1.7.0.min.js"></script>
<script src="js/jquery.validate.min.js" type="text/javascript" charset="utf-8"></script>
diff --git a/phonegap/www/report_created.html b/phonegap/www/report_created.html
index 6810ac60e..fe454259e 100644
--- a/phonegap/www/report_created.html
+++ b/phonegap/www/report_created.html
@@ -12,7 +12,7 @@
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<script type="text/javascript" src="js/config.js"></script>
- <script type="text/javascript" charset="utf-8" src="cordova-1.8.0.js"></script>
+ <script type="text/javascript" charset="utf-8" src="cordova-independent.js"></script>
<script type="text/javascript" src="js/jquery-1.7.0.min.js"></script>
<script type="text/javascript" src="js/mobile.js"></script>
diff --git a/phonegap/www/signed_in.html b/phonegap/www/signed_in.html
deleted file mode 100644
index 1ef6e284f..000000000
--- a/phonegap/www/signed_in.html
+++ /dev/null
@@ -1,83 +0,0 @@
-<!doctype html>
-<html class="no-js" lang="en-gb">
- <head>
- <meta name="viewport" content="initial-scale=1.0">
-
- <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
- <meta name="HandHeldFriendly" content="true">
- <meta name="mobileoptimized" content="0">
-
- <link rel="stylesheet" href="css/base.css">
- <link rel="stylesheet" href="css/mobile.css">
- <link rel="stylesheet" href="css/layout.css" media="(min-width:48em)">
-
- <script type="text/javascript" src="js/config.js"></script>
-
- <script type="text/javascript" charset="utf-8" src="cordova-1.8.0.js"></script>
-
- <meta http-equiv="content-type" content="text/html; charset=utf-8">
- <script type="text/javascript" src="js/jquery-1.7.0.min.js"></script>
-
- <script src="js/jquery.validate.min.js" type="text/javascript" charset="utf-8"></script>
-
- <script type="text/javascript" src="js/json2.js"></script>
- <script type="text/javascript" src="js/geo.min.js"></script>
- <script type="text/javascript" src="js/fixmystreet.js"></script>
- <script type="text/javascript" src="js/mobile.js"></script>
- <script type="text/javascript" src="js/OpenLayers.fixmystreet.js"></script>
- <script type="text/javascript" src="js/map-OpenLayers.js"></script>
- <script type="text/javascript" src="js/map-bing-ol.js"></script>
- <script type="text/javascript" src="js/jquery.ba-hashchange.min.js"></script>
-
- <script type="text/javascript">
- validation_strings = {
- update: 'Please enter a message',
- title: 'Please enter a subject',
- detail: 'Please enter some details',
- name: {
- required: 'Please enter your name',
- validName: 'Please enter your full name, councils need this information – if you do not wish your name to be shown on the site, untick the box below'
- },
- category: 'Please choose a category',
- rznvy: {
- required: 'Please enter your email',
- email: 'Please enter a valid email'
- },
- email: {
- required: 'Please enter your email',
- email: 'Please enter a valid email'
- }
- };
- </script>
- <title> Viewing a location :: FixMyStreet </title>
- </head>
-
- <body class="mobile-header signed-in-page" id="container">
-
- <div class="wrapper">
- <div class="table-cell">
- <header id="site-header" role="banner">
- <div class="container">
- <span id="site-logo"></span>
- </div>
- </header>
-
- <div id="user-meta">
-
- </div>
-
- <div class="container">
- <div class="content" role="main">
-
- </div><!-- .content role=main -->
- </div><!-- .container -->
- </div><!-- .table-cell -->
-
- <div class="big-green-banner mobile-map-banner mobile-nav-banner">
- <a href="index.html">home</a>
- Signed In
- </div>
-
- </div> <!-- .wrapper -->
-</body>
-</html>
diff --git a/t/app/controller/admin.t b/t/app/controller/admin.t
index 09d99cfdf..9ec15ec21 100644
--- a/t/app/controller/admin.t
+++ b/t/app/controller/admin.t
@@ -163,19 +163,32 @@ subtest 'check contact creation' => sub {
$mech->get_ok('/admin/council_contacts/2650');
$mech->submit_form_ok( { with_fields => {
- category => 'test category',
- email => 'test@example.com',
- note => 'test note',
+ category => 'test category',
+ email => 'test@example.com',
+ note => 'test note',
+ non_public => undef,
} } );
$mech->content_contains( 'test category' );
$mech->content_contains( '<td>test@example.com' );
$mech->content_contains( '<td>test note' );
+ $mech->content_contains( '<td>Public' );
+
+ $mech->submit_form_ok( { with_fields => {
+ category => 'private category',
+ email => 'test@example.com',
+ note => 'test note',
+ non_public => 'on',
+ } } );
+
+ $mech->content_contains( 'private category' );
+ $mech->content_contains( '<td>Non Public' );
$mech->submit_form_ok( { with_fields => {
category => 'test/category',
email => 'test@example.com',
note => 'test/note',
+ non_public => 'on',
} } );
$mech->get_ok('/admin/council_edit/2650/test/category');
@@ -187,11 +200,21 @@ subtest 'check contact editing' => sub {
$mech->submit_form_ok( { with_fields => {
email => 'test2@example.com',
note => 'test2 note',
+ non_public => undef,
} } );
$mech->content_contains( 'test category' );
$mech->content_contains( '<td>test2@example.com' );
$mech->content_contains( '<td>test2 note' );
+ $mech->content_contains( '<td>Public' );
+
+ $mech->submit_form_ok( { with_fields => {
+ email => 'test2@example.com',
+ note => 'test2 note',
+ non_public => 'on',
+ } } );
+
+ $mech->content_contains( '<td>Non Public' );
$mech->get_ok('/admin/council_edit/2650/test%20category');
$mech->content_contains( '<td><strong>test2@example.com' );
@@ -293,206 +316,229 @@ ok $report, "created test report - $report_id";
foreach my $test (
{
description => 'edit report title',
- fields => {
- title => 'Report to Edit',
- detail => 'Detail for Report to Edit',
- state => 'confirmed',
- name => 'Test User',
- email => $user->email,
- anonymous => 0,
- flagged => undef,
- },
- changes => {
- title => 'Edited Report',
+ fields => {
+ title => 'Report to Edit',
+ detail => 'Detail for Report to Edit',
+ state => 'confirmed',
+ name => 'Test User',
+ email => $user->email,
+ anonymous => 0,
+ flagged => undef,
+ non_public => undef,
},
- log_count => 1,
- log_entries => [ qw/edit/ ],
- resend => 0,
+ changes => { title => 'Edited Report', },
+ log_count => 1,
+ log_entries => [qw/edit/],
+ resend => 0,
},
{
description => 'edit report description',
- fields => {
- title => 'Edited Report',
- detail => 'Detail for Report to Edit',
- state => 'confirmed',
- name => 'Test User',
- email => $user->email,
- anonymous => 0,
- flagged => undef,
- },
- changes => {
- detail => 'Edited Detail',
+ fields => {
+ title => 'Edited Report',
+ detail => 'Detail for Report to Edit',
+ state => 'confirmed',
+ name => 'Test User',
+ email => $user->email,
+ anonymous => 0,
+ flagged => undef,
+ non_public => undef,
},
- log_count => 2,
- log_entries => [ qw/edit edit/ ],
- resend => 0,
+ changes => { detail => 'Edited Detail', },
+ log_count => 2,
+ log_entries => [qw/edit edit/],
+ resend => 0,
},
{
description => 'edit report user name',
- fields => {
- title => 'Edited Report',
- detail => 'Edited Detail',
- state => 'confirmed',
- name => 'Test User',
- email => $user->email,
- anonymous => 0,
- flagged => undef,
- },
- changes => {
- name => 'Edited User',
+ fields => {
+ title => 'Edited Report',
+ detail => 'Edited Detail',
+ state => 'confirmed',
+ name => 'Test User',
+ email => $user->email,
+ anonymous => 0,
+ flagged => undef,
+ non_public => undef,
},
- log_count => 3,
- log_entries => [ qw/edit edit edit/ ],
- resend => 0,
- user => $user,
+ changes => { name => 'Edited User', },
+ log_count => 3,
+ log_entries => [qw/edit edit edit/],
+ resend => 0,
+ user => $user,
},
{
description => 'edit report set flagged true',
- fields => {
- title => 'Edited Report',
- detail => 'Edited Detail',
- state => 'confirmed',
- name => 'Edited User',
- email => $user->email,
- anonymous => 0,
- flagged => undef,
+ fields => {
+ title => 'Edited Report',
+ detail => 'Edited Detail',
+ state => 'confirmed',
+ name => 'Edited User',
+ email => $user->email,
+ anonymous => 0,
+ flagged => undef,
+ non_public => undef,
},
changes => {
- flagged => 'on',
+ flagged => 'on',
},
- log_count => 4,
- log_entries => [ qw/edit edit edit edit/ ],
- resend => 0,
- user => $user,
+ log_count => 4,
+ log_entries => [qw/edit edit edit edit/],
+ resend => 0,
+ user => $user,
},
{
description => 'edit report user email',
- fields => {
- title => 'Edited Report',
- detail => 'Edited Detail',
- state => 'confirmed',
- name => 'Edited User',
- email => $user->email,
- anonymous => 0,
- flagged => 'on',
- },
- changes => {
- email => $user2->email,
+ fields => {
+ title => 'Edited Report',
+ detail => 'Edited Detail',
+ state => 'confirmed',
+ name => 'Edited User',
+ email => $user->email,
+ anonymous => 0,
+ flagged => 'on',
+ non_public => undef,
},
- log_count => 5,
- log_entries => [ qw/edit edit edit edit edit/ ],
- resend => 0,
- user => $user2,
+ changes => { email => $user2->email, },
+ log_count => 5,
+ log_entries => [qw/edit edit edit edit edit/],
+ resend => 0,
+ user => $user2,
},
{
description => 'change state to unconfirmed',
- fields => {
- title => 'Edited Report',
- detail => 'Edited Detail',
- state => 'confirmed',
- name => 'Edited User',
- email => $user2->email,
- anonymous => 0,
- flagged => 'on',
- },
- changes => {
- state => 'unconfirmed'
+ fields => {
+ title => 'Edited Report',
+ detail => 'Edited Detail',
+ state => 'confirmed',
+ name => 'Edited User',
+ email => $user2->email,
+ anonymous => 0,
+ flagged => 'on',
+ non_public => undef,
},
+ changes => { state => 'unconfirmed' },
log_count => 6,
- log_entries => [ qw/state_change edit edit edit edit edit/ ],
- resend => 0,
+ log_entries => [qw/state_change edit edit edit edit edit/],
+ resend => 0,
},
{
description => 'change state to confirmed',
- fields => {
- title => 'Edited Report',
- detail => 'Edited Detail',
- state => 'unconfirmed',
- name => 'Edited User',
- email => $user2->email,
- anonymous => 0,
- flagged => 'on',
- },
- changes => {
- state => 'confirmed'
+ fields => {
+ title => 'Edited Report',
+ detail => 'Edited Detail',
+ state => 'unconfirmed',
+ name => 'Edited User',
+ email => $user2->email,
+ anonymous => 0,
+ flagged => 'on',
+ non_public => undef,
},
+ changes => { state => 'confirmed' },
log_count => 7,
- log_entries => [ qw/state_change state_change edit edit edit edit edit/ ],
- resend => 0,
+ log_entries => [qw/state_change state_change edit edit edit edit edit/],
+ resend => 0,
},
{
description => 'change state to fixed',
- fields => {
- title => 'Edited Report',
- detail => 'Edited Detail',
- state => 'confirmed',
- name => 'Edited User',
- email => $user2->email,
- anonymous => 0,
- flagged => 'on',
- },
- changes => {
- state => 'fixed'
+ fields => {
+ title => 'Edited Report',
+ detail => 'Edited Detail',
+ state => 'confirmed',
+ name => 'Edited User',
+ email => $user2->email,
+ anonymous => 0,
+ flagged => 'on',
+ non_public => undef,
},
+ changes => { state => 'fixed' },
log_count => 8,
- log_entries => [ qw/state_change state_change state_change edit edit edit edit edit/ ],
+ log_entries =>
+ [qw/state_change state_change state_change edit edit edit edit edit/],
resend => 0,
},
{
description => 'change state to hidden',
- fields => {
- title => 'Edited Report',
- detail => 'Edited Detail',
- state => 'fixed',
- name => 'Edited User',
- email => $user2->email,
- anonymous => 0,
- flagged => 'on',
+ fields => {
+ title => 'Edited Report',
+ detail => 'Edited Detail',
+ state => 'fixed',
+ name => 'Edited User',
+ email => $user2->email,
+ anonymous => 0,
+ flagged => 'on',
+ non_public => undef,
},
- changes => {
- state => 'hidden'
- },
- log_count => 9,
- log_entries => [ qw/state_change state_change state_change state_change edit edit edit edit edit/ ],
+ changes => { state => 'hidden' },
+ log_count => 9,
+ log_entries => [
+ qw/state_change state_change state_change state_change edit edit edit edit edit/
+ ],
resend => 0,
},
{
description => 'edit and change state',
- fields => {
- title => 'Edited Report',
- detail => 'Edited Detail',
- state => 'hidden',
- name => 'Edited User',
- email => $user2->email,
- anonymous => 0,
- flagged => 'on',
+ fields => {
+ title => 'Edited Report',
+ detail => 'Edited Detail',
+ state => 'hidden',
+ name => 'Edited User',
+ email => $user2->email,
+ anonymous => 0,
+ flagged => 'on',
+ non_public => undef,
},
changes => {
- state => 'confirmed',
+ state => 'confirmed',
anonymous => 1,
},
- log_count => 11,
- log_entries => [ qw/edit state_change state_change state_change state_change state_change edit edit edit edit edit/ ],
+ log_count => 11,
+ log_entries => [
+ qw/edit state_change state_change state_change state_change state_change edit edit edit edit edit/
+ ],
resend => 0,
},
{
description => 'resend',
- fields => {
- title => 'Edited Report',
- detail => 'Edited Detail',
- state => 'confirmed',
- name => 'Edited User',
- email => $user2->email,
- anonymous => 1,
- flagged => 'on',
- },
- changes => {
+ fields => {
+ title => 'Edited Report',
+ detail => 'Edited Detail',
+ state => 'confirmed',
+ name => 'Edited User',
+ email => $user2->email,
+ anonymous => 1,
+ flagged => 'on',
+ non_public => undef,
},
- log_count => 12,
- log_entries => [ qw/resend edit state_change state_change state_change state_change state_change edit edit edit edit edit/ ],
+ changes => {},
+ log_count => 12,
+ log_entries => [
+ qw/resend edit state_change state_change state_change state_change state_change edit edit edit edit edit/
+ ],
resend => 1,
},
-) {
+ {
+ description => 'non public',
+ fields => {
+ title => 'Edited Report',
+ detail => 'Edited Detail',
+ state => 'confirmed',
+ name => 'Edited User',
+ email => $user2->email,
+ anonymous => 1,
+ flagged => 'on',
+ non_public => undef,
+ },
+ changes => {
+ non_public => 'on',
+ },
+ log_count => 13,
+ log_entries => [
+ qw/edit resend edit state_change state_change state_change state_change state_change edit edit edit edit edit/
+ ],
+ resend => 0,
+ },
+ )
+{
subtest $test->{description} => sub {
$log_entries->reset;
$mech->get_ok("/admin/report_edit/$report_id");
@@ -523,6 +569,8 @@ foreach my $test (
}
$test->{changes}->{flagged} = 1 if $test->{changes}->{flagged};
+ $test->{changes}->{non_public} = 1 if $test->{changes}->{non_public};
+
is $report->$_, $test->{changes}->{$_}, "$_ updated" for grep { $_ ne 'email' } keys %{ $test->{changes} };
if ( $test->{user} ) {
@@ -547,6 +595,7 @@ subtest 'change email to new user' => sub {
email => $report->user->email,
anonymous => 1,
flagged => 'on',
+ non_public => 'on',
};
is_deeply( $mech->visible_form_values(), $fields, 'initial form values' );
@@ -1017,9 +1066,8 @@ subtest 'report search' => sub {
};
subtest 'search abuse' => sub {
- $mech->get_ok( '/admin/search_abuse?search=example' );
-
- $mech->content_contains('test4@example.com');
+ $mech->get_ok( '/admin/search_users?search=example' );
+ $mech->content_like(qr/test4\@example.com.*\n.*\n.*Email in abuse table/);
};
subtest 'show flagged entries' => sub {
diff --git a/t/app/controller/alert.t b/t/app/controller/alert.t
index e1ebbecb6..3d95bef6d 100644
--- a/t/app/controller/alert.t
+++ b/t/app/controller/alert.t
@@ -40,7 +40,7 @@ $mech->get_ok('/alert/list?pc=High Street');
$mech->content_contains('We found more than one match for that location');
$mech->get_ok('/alert/list?pc=');
-$mech->content_contains('hat location does not appear to be covered by a council');
+$mech->content_contains('To find out what local alerts we have for you');
$mech->get_ok('/alert/list?pc=GL502PR');
$mech->content_contains('Problems within the boundary of');
diff --git a/t/app/controller/alert_new.t b/t/app/controller/alert_new.t
index d66590c57..c849b9485 100644
--- a/t/app/controller/alert_new.t
+++ b/t/app/controller/alert_new.t
@@ -330,7 +330,7 @@ subtest "Test two-tier council alerts" => sub {
feed => $alert->{feed},
}
} );
- is $mech->uri->path, $alert->{result};
+ is $mech->uri->path, $alert->{result}, 'Redirected to right RSS feed';
}
};
@@ -390,7 +390,7 @@ subtest "Test normal alert signups and that alerts are sent" => sub {
used_map => 1,
name => $user1->name,
anonymous => 0,
- state => 'confirmed',
+ state => 'fixed - user',
confirmed => $dt,
lastupdate => $dt,
whensent => $dt->clone->add( minutes => 5 ),
@@ -430,7 +430,7 @@ subtest "Test normal alert signups and that alerts are sent" => sub {
problem_id => $report_id,
user_id => $user2->id,
name => 'Anonymous User',
- mark_fixed => 'false',
+ mark_fixed => 'true',
text => 'This is some more update text',
state => 'confirmed',
confirmed => $dt->clone->add( hours => 8 ),
@@ -450,13 +450,23 @@ subtest "Test normal alert signups and that alerts are sent" => sub {
$count++ if $_->body =~ /The following nearby problems have been added:/;
$count++ if $_->body =~ /\s+-\s+Testing/;
}
- is $count, 5, 'Five emails with the right things in them';
+ is $count, 5, 'Three emails, with five matching lines in them';
my $email = $emails[0];
like $email->body, qr/Other User/, 'Update name given';
unlike $email->body, qr/Anonymous User/, 'Update name not given';
- my ( $url, $url_token ) = $emails[0]->body =~ m{http://\S+(/A/(\S+))};
+ # The update alert was to the problem reporter, so has a login update URL
+ $mech->get_ok( "/report/$report_id" );
+ $mech->content_lacks( 'has not been fixed' );
+ my ($url) = $email->body =~ m{(http://\S+/M/\S+)};
+ ok $url, "extracted update url '$url'";
+ $mech->get_ok( $url );
+ is $mech->uri->path, "/report/" . $report_id, "redirected to report page";
+ $mech->content_contains( 'has not been fixed' );
+ $mech->logged_in_ok;
+
+ ($url) = $emails[0]->body =~ m{http://\S+(/A/\S+)};
$mech->get_ok( $url );
$mech->content_contains('successfully deleted');
@@ -464,4 +474,194 @@ subtest "Test normal alert signups and that alerts are sent" => sub {
$mech->delete_user($user2);
};
+for my $test (
+ {
+ desc => 'check non public reports are not included in council problems alerts',
+ alert_params => {
+ alert_type => 'council_problems',
+ parameter => '2651',
+ parameter2 => '2651',
+ }
+ },
+ {
+ desc => 'check non public reports are not included in ward problems alerts',
+ alert_params => {
+ alert_type => 'ward_problems',
+ parameter => '2651',
+ parameter2 => '20728',
+ }
+ },
+ {
+ desc => 'check non public reports are not included in local problems alerts',
+ alert_params => {
+ alert_type => 'local_problems',
+ parameter => '-3.189944',
+ parameter2 => '55.951963',
+ }
+ },
+ {
+ desc => 'check non public reports are not included in area problems alerts',
+ alert_params => {
+ alert_type => 'area_problems',
+ parameter => '20728',
+ parameter2 => '20728',
+ }
+ },
+) {
+ subtest $test->{desc} => sub {
+ my $user1 = FixMyStreet::App->model('DB::User')
+ ->find_or_create( { email => 'reporter@example.com', name => 'Reporter User' } );
+ ok $user1, "created test user";
+ $user1->alerts->delete;
+
+ my $user2 = FixMyStreet::App->model('DB::User')
+ ->find_or_create( { email => 'alerts@example.com', name => 'Alert User' } );
+ ok $user2, "created test user";
+ $user2->alerts->delete;
+
+ my $dt = DateTime->now->add( minutes => -30 );
+ my $r_dt = $dt->clone->add( minutes => 20 );
+
+ my $alert_params = $test->{alert_params};
+ $alert_params->{user} = $user1;
+ $alert_params->{whensubscribed} = $dt;
+ $alert_params->{confirmed} = 1;
+
+ my $alert_user1 = FixMyStreet::App->model('DB::Alert')->create( $alert_params );
+ ok $alert_user1, "alert created";
+
+ my $report = FixMyStreet::App->model('DB::Problem')->find_or_create( {
+ postcode => 'EH1 1BB',
+ council => '2651',
+ areas => ',11808,135007,14419,134935,2651,20728,',
+ category => 'Street lighting',
+ title => 'Alert test for non public reports',
+ detail => 'Testing Detail',
+ used_map => 1,
+ name => $user2->name,
+ anonymous => 0,
+ state => 'confirmed',
+ confirmed => $r_dt,
+ lastupdate => $r_dt,
+ whensent => $r_dt->clone->add( minutes => 5 ),
+ lang => 'en-gb',
+ service => '',
+ cobrand => 'default',
+ cobrand_data => '',
+ send_questionnaire => 1,
+ latitude => '55.951963',
+ longitude => '-3.189944',
+ user_id => $user2->id,
+ non_public => 1,
+ } );
+
+ $mech->clear_emails_ok;
+ FixMyStreet::App->model('DB::AlertType')->email_alerts();
+ $mech->email_count_is(0);
+
+ $report->update( { non_public => 0 } );
+ FixMyStreet::App->model('DB::AlertType')->email_alerts();
+ $mech->email_count_is(1);
+ my $email = $mech->get_email;
+ like $email->body, qr/Alert\s+test\s+for\s+non\s+public\s+reports/, 'alert contains public report';
+
+ $mech->delete_user( $user1 );
+ $mech->delete_user( $user2 );
+ };
+}
+
+subtest 'check new updates alerts for non public reports only go to report owner' => sub {
+ my $user1 = FixMyStreet::App->model('DB::User')
+ ->find_or_create( { email => 'reporter@example.com', name => 'Reporter User' } );
+ ok $user1, "created test user";
+ $user1->alerts->delete;
+
+ my $user2 = FixMyStreet::App->model('DB::User')
+ ->find_or_create( { email => 'alerts@example.com', name => 'Alert User' } );
+ ok $user2, "created test user";
+ $user2->alerts->delete;
+
+ my $user3 = FixMyStreet::App->model('DB::User')
+ ->find_or_create( { email => 'updates@example.com', name => 'Update User' } );
+ ok $user3, "created test user";
+
+ my $dt = DateTime->now->add( minutes => -30 );
+ my $r_dt = $dt->clone->add( minutes => 20 );
+
+ my $report = FixMyStreet::App->model('DB::Problem')->find_or_create( {
+ postcode => 'EH1 1BB',
+ council => '2651',
+ areas => ',11808,135007,14419,134935,2651,20728,',
+ category => 'Street lighting',
+ title => 'Alert test for non public reports',
+ detail => 'Testing Detail',
+ used_map => 1,
+ name => $user2->name,
+ anonymous => 0,
+ state => 'confirmed',
+ confirmed => $r_dt,
+ lastupdate => $r_dt,
+ whensent => $r_dt->clone->add( minutes => 5 ),
+ lang => 'en-gb',
+ service => '',
+ cobrand => 'default',
+ cobrand_data => '',
+ send_questionnaire => 1,
+ latitude => '55.951963',
+ longitude => '-3.189944',
+ user_id => $user2->id,
+ non_public => 1,
+ } );
+
+ my $update = FixMyStreet::App->model('DB::Comment')->create( {
+ problem_id => $report->id,
+ user_id => $user3->id,
+ name => 'Anonymous User',
+ mark_fixed => 'false',
+ text => 'This is some more update text',
+ state => 'confirmed',
+ confirmed => $r_dt->clone->add( minutes => 8 ),
+ anonymous => 't',
+ } );
+
+ my $alert_user1 = FixMyStreet::App->model('DB::Alert')->create( {
+ user => $user1,
+ alert_type => 'new_updates',
+ parameter => $report->id,
+ confirmed => 1,
+ whensubscribed => $dt,
+ } );
+ ok $alert_user1, "alert created";
+
+
+ $mech->clear_emails_ok;
+ FixMyStreet::App->model('DB::AlertType')->email_alerts();
+ $mech->email_count_is(0);
+
+ my $alert_user2 = FixMyStreet::App->model('DB::Alert')->create( {
+ user => $user2,
+ alert_type => 'new_updates',
+ parameter => $report->id,
+ confirmed => 1,
+ whensubscribed => $dt,
+ } );
+ ok $alert_user2, "alert created";
+
+ FixMyStreet::App->model('DB::AlertType')->email_alerts();
+ $mech->email_count_is(1);
+ my $email = $mech->get_email;
+ like $email->body, qr/This is some more update text/, 'alert contains update text';
+
+ $mech->clear_emails_ok;
+ $report->update( { non_public => 0 } );
+ FixMyStreet::App->model('DB::AlertType')->email_alerts();
+ $mech->email_count_is(1);
+ $email = $mech->get_email;
+ like $email->body, qr/This is some more update text/, 'alert contains update text';
+
+ $mech->delete_user( $user1 );
+ $mech->delete_user( $user2 );
+ $mech->delete_user( $user3 );
+};
+
done_testing();
diff --git a/t/app/controller/around.t b/t/app/controller/around.t
index db03e00f4..d973543ce 100644
--- a/t/app/controller/around.t
+++ b/t/app/controller/around.t
@@ -66,6 +66,11 @@ foreach my $test (
latitude => '51.50101',
longitude => '-0.141587',
},
+ {
+ pc => 'TQ 388 773',
+ latitude => '51.478074',
+ longitude => '-0.001966',
+ },
)
{
subtest "check lat/lng for '$test->{pc}'" => sub {
@@ -78,4 +83,30 @@ foreach my $test (
};
}
+subtest 'check non public reports are not displayed on around page' => sub {
+ my $params = {
+ postcode => 'EH99 1SP',
+ latitude => 55.9519637512,
+ longitude => -3.17492254484,
+ };
+ my @edinburgh_problems =
+ $mech->create_problems_for_council( 5, 2651, 'Around page', $params );
+
+ $mech->get_ok('/');
+ $mech->submit_form_ok( { with_fields => { pc => 'EH99 1SP' } },
+ "good location" );
+ $mech->content_contains( 'Around page Test 3 for 2651',
+ 'problem to be marked non public visible' );
+
+ my $private = $edinburgh_problems[2];
+ ok $private->update( { non_public => 1 } ), 'problem marked non public';
+
+ $mech->get_ok('/');
+ $mech->submit_form_ok( { with_fields => { pc => 'EH99 1SP' } },
+ "good location" );
+ $mech->content_lacks( 'Around page Test 3 for 2651',
+ 'problem marked non public is not visible' );
+};
+
+
done_testing();
diff --git a/t/app/controller/index.t b/t/app/controller/index.t
index bf9124ee0..462b21064 100644
--- a/t/app/controller/index.t
+++ b/t/app/controller/index.t
@@ -55,4 +55,23 @@ subtest "does pc, (x,y), (e,n) or (lat,lon) go to /around" => sub {
}
};
+$mech->delete_problems_for_council( 2651 );
+
+my $problem_rs = FixMyStreet::App->model('DB::Problem');
+my $num = $problem_rs->count;
+
+my @edinburgh_problems = $mech->create_problems_for_council(5, 2651, 'Front page');
+is scalar @edinburgh_problems, 5, 'correct number of edinburgh problems created';
+
+$mech->get_ok('/report/' . $edinburgh_problems[2]->id);
+$mech->content_contains('Front page Test 3 for 2651', 'problem to be marked non public visible');
+is $problem_rs->count, $num+5;
+
+my $private = $edinburgh_problems[2];
+ok $private->update( { non_public => 1 } ), 'problem marked non public';
+
+ok $mech->get('/report/' . $edinburgh_problems[2]->id);
+is $mech->res->code, 403, 'page forbidden';
+is $problem_rs->count, $num+5;
+
done_testing();
diff --git a/t/app/controller/questionnaire.t b/t/app/controller/questionnaire.t
index 872a1733c..d8d1eb4f3 100644
--- a/t/app/controller/questionnaire.t
+++ b/t/app/controller/questionnaire.t
@@ -190,6 +190,25 @@ foreach my $test (
# update => 'Dummy', Error for not setting this tested below
},
},
+ {
+ desc => 'Closed report, said fixed, reported before, no update, no further questionnaire',
+ problem_state => 'closed',
+ fields => {
+ been_fixed => 'Yes',
+ reported => 'Yes',
+ another => 'No',
+ },
+ },
+ {
+ desc => 'Closed report, said not fixed, reported before, no update, no further questionnaire',
+ problem_state => 'closed',
+ fields => {
+ been_fixed => 'No',
+ reported => 'Yes',
+ another => 'No',
+ },
+ lastupdate_static => 1,
+ },
) {
subtest $test->{desc} => sub {
$report->state ( $test->{problem_state} );
@@ -224,7 +243,8 @@ foreach my $test (
$result = 'fixed'
if $test->{fields}{been_fixed} eq 'Yes'
&& $test->{problem_state} eq 'fixed';
- $result = 'confirmed' if $test->{fields}{been_fixed} eq 'No';
+ $result = 'confirmed' if $test->{fields}{been_fixed} eq 'No' && $test->{problem_state} ne 'closed';
+ $result = 'closed' if $test->{fields}{been_fixed} eq 'No' && $test->{problem_state} eq 'closed';
$result = 'unknown' if $test->{fields}{been_fixed} eq 'Unknown';
my $another = 0;
@@ -234,10 +254,12 @@ foreach my $test (
$mech->content_like( qr/<title>[^<]*Questionnaire/m );
$mech->content_contains( 'glad to hear it&rsquo;s been fixed' )
if $result =~ /fixed/;
+ $mech->content_lacks( 'glad to hear it&rsquo;s been fixed' )
+ if $result !~ /fixed/;
$mech->content_contains( 'get some more information about the status of your problem' )
if $result eq 'unknown';
$mech->content_contains( "sorry to hear that" )
- if $result eq 'confirmed';
+ if $result eq 'confirmed' || $result eq 'closed';
# Check the database has the right information
$report->discard_changes;
diff --git a/t/app/controller/report_display.t b/t/app/controller/report_display.t
index fde52860a..82c98dc5c 100644
--- a/t/app/controller/report_display.t
+++ b/t/app/controller/report_display.t
@@ -16,6 +16,11 @@ my $user =
->find_or_create( { email => 'test@example.com', name => 'Test User' } );
ok $user, "created test user";
+my $user2 =
+ FixMyStreet::App->model('DB::User')
+ ->find_or_create( { email => 'test2@example.com', name => 'Other User' } );
+ok $user2, "created test user";
+
my $dt = DateTime->new(
year => 2011,
month => 04,
@@ -98,6 +103,32 @@ subtest "change report to hidden and check for 410 status" => sub {
ok $report->update( { state => 'confirmed' } ), 'confirm report again';
};
+subtest "change report to non_public and check for 403 status" => sub {
+ ok $report->update( { non_public => 1 } ), 'make report non public';
+ ok $mech->get("/report/$report_id"), "get '/report/$report_id'";
+ is $mech->res->code, 403, "access denied";
+ is $mech->uri->path, "/report/$report_id", "at /report/$report_id";
+ $mech->content_contains('That report cannot be viewed on FixMyStreet.');
+ ok $report->update( { non_public => 0 } ), 'make report public';
+};
+
+subtest "check owner of report can view non public reports" => sub {
+ ok $report->update( { non_public => 1 } ), 'make report non public';
+ $mech->log_in_ok( $report->user->email );
+ ok $mech->get("/report/$report_id"), "get '/report/$report_id'";
+ is $mech->res->code, 200, "report can be viewed";
+ is $mech->uri->path, "/report/$report_id", "at /report/$report_id";
+ $mech->log_out_ok;
+
+ $mech->log_in_ok( $user2->email );
+ ok $mech->get("/report/$report_id"), "get '/report/$report_id'";
+ is $mech->res->code, 403, "access denied to user who is not report creator";
+ is $mech->uri->path, "/report/$report_id", "at /report/$report_id";
+ $mech->content_contains('That report cannot be viewed on FixMyStreet.');
+ $mech->log_out_ok;
+ ok $report->update( { non_public => 0 } ), 'make report public';
+};
+
subtest "test a good report" => sub {
$mech->get_ok("/report/$report_id");
is $mech->uri->path, "/report/$report_id", "at /report/$report_id";
diff --git a/t/app/controller/report_interest_count.t b/t/app/controller/report_interest_count.t
new file mode 100644
index 000000000..dd44a83d4
--- /dev/null
+++ b/t/app/controller/report_interest_count.t
@@ -0,0 +1,143 @@
+use strict;
+use warnings;
+use Test::More;
+
+use FixMyStreet::TestMech;
+use Web::Scraper;
+use Path::Class;
+use DateTime;
+
+my $mech = FixMyStreet::TestMech->new;
+
+# create a test user and report
+$mech->delete_user('test@example.com');
+my $user =
+ FixMyStreet::App->model('DB::User')
+ ->find_or_create( { email => 'test@example.com', name => 'Test User' } );
+ok $user, "created test user";
+
+my $user2 =
+ FixMyStreet::App->model('DB::User')
+ ->find_or_create( { email => 'test2@example.com', name => 'Other User' } );
+ok $user2, "created test user";
+
+my $dt = DateTime->new(
+ year => 2011,
+ month => 04,
+ day => 16,
+ hour => 15,
+ minute => 47,
+ second => 23
+);
+
+my $report = FixMyStreet::App->model('DB::Problem')->find_or_create(
+ {
+ postcode => 'SW1A 1AA',
+ council => '2504',
+ areas => ',105255,11806,11828,2247,2504,',
+ category => 'Other',
+ title => 'Test 2',
+ detail => 'Test 2 Detail',
+ used_map => 't',
+ name => 'Test User',
+ anonymous => 'f',
+ state => 'confirmed',
+ confirmed => $dt->ymd . ' ' . $dt->hms,
+ lang => 'en-gb',
+ service => '',
+ cobrand => 'default',
+ cobrand_data => '',
+ send_questionnaire => 't',
+ latitude => '51.5016605453401',
+ longitude => '-0.142497580865087',
+ user_id => $user->id,
+ }
+);
+my $report_id = $report->id;
+ok $report, "created test report - $report_id";
+
+SKIP: {
+ skip( "Need 'fixmybarangay' in ALLOWED_COBRANDS config", 29 )
+ unless FixMyStreet::Cobrand->exists('fixmybarangay');
+ for my $test (
+ {
+ desc => 'if not from council then no supporter button',
+ from_council => 0,
+ support_string => 'No supporters',
+ },
+ {
+ desc => 'from council user can increment supported count',
+ from_council => 2504,
+ support_string => 'No supporters',
+ updated_support => '1 supporter'
+ },
+ {
+ desc => 'correct grammar for more than one supporter',
+ from_council => 2504,
+ support_string => '1 supporter',
+ updated_support => '2 supporters'
+ },
+ ) {
+ subtest $test->{desc} => sub {
+ ok $mech->host('fixmybarangay.com'), 'changed to fixmybarangay';
+ $mech->log_in_ok( $user->email );
+ $user->from_council( $test->{from_council} );
+ $user->update;
+
+ $report->discard_changes;
+ $report->council( $test->{report_council} );
+ $report->update;
+
+ $mech->get_ok("/report/$report_id");
+ $mech->content_contains( $test->{support_string} );
+
+ if ( $test->{from_council} ) {
+ $mech->content_contains('Add support');
+ $mech->submit_form_ok( { form_number => 1 } );
+
+ is $mech->uri, "http://fixmybarangay.com/report/$report_id", 'add support redirects to report page';
+
+ $mech->content_contains($test->{updated_support});
+ } else {
+ $mech->content_lacks( 'Add support' );
+ }
+ };
+ }
+
+ subtest 'check non council user cannot increment support count' => sub {
+ ok $mech->host('fixmybarangay.com'), 'changed to fixmybarangay';
+ $report->discard_changes;
+ $report->interest_count(1);
+ ok $report->update(), 'updated interest count';
+
+ $report->discard_changes;
+ is $report->interest_count, 1, 'correct interest count';
+
+ $mech->get_ok("/report/$report_id");
+ $mech->content_contains( '1 supporter' );
+
+ $mech->post_ok("/report/support", { id => $report_id } );
+
+ is $mech->uri, "http://fixmybarangay.com/report/$report_id", 'add support redirects to report page';
+
+ $mech->content_contains( '1 supporter' );
+ };
+};
+
+subtest 'check support details not shown if not enabled in cobrand' => sub {
+ ok $mech->host('fixmystreet.com'), 'changed to fixmystreet';
+
+ $report->interest_count(1);
+ ok $report->update, 'updated interest count';
+
+ $mech->get_ok("/report/$report_id");
+ $mech->content_lacks( '1 supporter' );
+};
+
+$report->discard_changes;
+$report->council( 2504 );
+$report->update;
+
+# tidy up
+$mech->delete_user('test@example.com');
+done_testing();
diff --git a/t/app/controller/report_new.t b/t/app/controller/report_new.t
index 65bd71af2..6cfa67116 100644
--- a/t/app/controller/report_new.t
+++ b/t/app/controller/report_new.t
@@ -788,6 +788,74 @@ foreach my $test (
}
+subtest "test report creation for a category that is non public" => sub {
+ $mech->log_out_ok;
+ $mech->clear_emails_ok;
+
+ # check that the user does not exist
+ my $test_email = 'test-2@example.com';
+
+ my $user = FixMyStreet::App->model('DB::User')->find_or_create( { email => $test_email } );
+ ok $user, "test user does exist";
+
+ $contact1->update( { non_public => 1 } );
+
+ # submit initial pc form
+ $mech->get_ok('/around');
+ $mech->submit_form_ok( { with_fields => { pc => 'EH1 1BB', } },
+ "submit location" );
+
+ # click through to the report page
+ $mech->follow_link_ok( { text_regex => qr/skip this step/i, },
+ "follow 'skip this step' link" );
+
+ $mech->submit_form_ok(
+ {
+ button => 'submit_register',
+ with_fields => {
+ title => 'Test Report',
+ detail => 'Test report details.',
+ photo => '',
+ email => 'test-2@example.com',
+ name => 'Joe Bloggs',
+ category => 'Street lighting',
+ }
+ },
+ "submit good details"
+ );
+
+ # find the report
+ my $report = $user->problems->first;
+ ok $report, "Found the report";
+
+ # Check the report is not public
+ ok $report->non_public, 'report is not public';
+
+ my $email = $mech->get_email;
+ ok $email, "got an email";
+ like $email->body, qr/confirm the problem/i, "confirm the problem";
+
+ my ($url) = $email->body =~ m{(http://\S+)};
+ ok $url, "extracted confirm url '$url'";
+
+ # confirm token
+ $mech->get_ok($url);
+ $report->discard_changes;
+
+ is $report->state, 'confirmed', "Report is now confirmed";
+
+ $mech->logged_in_ok;
+ $mech->get_ok( '/report/' . $report->id, 'user can see own report' );
+
+ $mech->log_out_ok;
+ ok $mech->get("/report/" . $report->id), "fetched report";
+ is $mech->res->code, 403, "access denied to report";
+
+ # cleanup
+ $mech->delete_user($user);
+ $contact1->update( { non_public => 0 } );
+};
+
$contact2->category( "Pothol\xc3\xa9s" );
$contact2->update;
$mech->get_ok( '/report/new/ajax?latitude=' . $saved_lat . '&longitude=' . $saved_lon );
@@ -960,71 +1028,288 @@ for my $test (
};
}
+subtest 'user title not reset if no user title in submission' => sub {
+ $mech->log_out_ok;
+ $mech->host( 'http://fixmystreet.com' );
+
+ my $user = $mech->log_in_ok( 'userwithtitle@example.com' );
+
+ ok $user->update(
+ {
+ name => 'Has Title',
+ phone => '0789 654321',
+ title => 'MR',
+ }
+ ),
+ "set users details";
+
+
+ my $submission_fields = {
+ title => "Test Report",
+ detail => 'Test report details.',
+ photo => '',
+ name => 'Has Title',
+ may_show_name => '1',
+ phone => '07903 123 456',
+ category => 'Trees',
+ };
+
+ $mech->get_ok('/');
+ $mech->submit_form_ok( { with_fields => { pc => 'EH99 1SP', } },
+ "submit location" );
+ $mech->follow_link_ok(
+ { text_regex => qr/skip this step/i, },
+ "follow 'skip this step' link"
+ );
+
+ my $fields = $mech->visible_form_values('mapSkippedForm');
+ ok !exists( $fields->{fms_extra_title} ), 'user title field not displayed';
+
+ $mech->submit_form_ok( { with_fields => $submission_fields },
+ "submit good details" );
+
+ $user->discard_changes;
+ my $report = $user->problems->first;
+ ok $report, "Found report";
+ is $report->title, "Test Report", "Report title correct";
+ is $user->title, 'MR', 'User title unchanged';
+};
+
SKIP: {
skip( "Need 'lichfielddc' in ALLOWED_COBRANDS config", 100 )
unless FixMyStreet::Cobrand->exists('lichfielddc');
- my $test_email = 'test-22@example.com';
- $mech->host( 'http://lichfielddc.fixmystreet.com/' );
- $mech->clear_emails_ok;
- $mech->log_out_ok;
-
- $mech->get_ok('/around');
- $mech->content_contains( "Lichfield District Council FixMyStreet" );
- $mech->submit_form_ok( { with_fields => { pc => 'WS13 7RD' } }, "submit location" );
- $mech->follow_link_ok( { text_regex => qr/skip this step/i, }, "follow 'skip this step' link" );
- $mech->submit_form_ok(
+ for my $test (
{
- button => 'submit_register',
- with_fields => {
- title => 'Test Report',
- detail => 'Test report details.',
- photo => '',
- name => 'Joe Bloggs',
- may_show_name => '1',
- email => $test_email,
- phone => '07903 123 456',
- category => 'Street lighting',
- }
+ desc => 'confirm link for cobrand council in two tier cobrand links to cobrand site',
+ category => 'Trees',
+ council => 2434,
+ link_base => 'http://lichfielddc.localhost/',
+ national => 0,
+ button => 'submit_register',
},
- "submit good details"
- );
- is_deeply $mech->page_errors, [], "check there were no errors";
+ {
+ desc => 'confirm link for non cobrand council in two tier cobrand links to national site',
+ category => 'Street Lighting',
+ council => 2240,
+ link_base => 'http://localhost/',
+ national => 1,
+ button => 'submit_register',
+ },
+ {
+ desc => 'confirm redirect for cobrand council in two tier cobrand redirects to cobrand site',
+ category => 'Trees',
+ council => 2434,
+ link_base => 'lichfielddc.localhost',
+ national => 0,
+ redirect => 1,
+ },
+ {
+ desc => 'confirm redirect for non cobrand council in two tier cobrand redirect to national site',
+ category => 'Street Lighting',
+ council => 2240,
+ link_base => 'localhost',
+ national => 1,
+ redirect => 1,
+ },
+ ) {
+ subtest $test->{ desc } => sub {
+ my $test_email = 'test-22@example.com';
+ $mech->host( 'http://lichfielddc.fixmystreet.com/' );
+ $mech->clear_emails_ok;
+ $mech->log_out_ok;
+
+ my $user = $mech->log_in_ok($test_email) if $test->{redirect};
+
+ $mech->get_ok('/around');
+ $mech->content_contains( "Lichfield District Council FixMyStreet" );
+ $mech->submit_form_ok( { with_fields => { pc => 'WS13 7RD' } }, "submit location" );
+ $mech->follow_link_ok( { text_regex => qr/skip this step/i, }, "follow 'skip this step' link" );
+ my %optional_fields = $test->{redirect} ? () :
+ ( email => $test_email, phone => '07903 123 456' );
+
+ # we do this as otherwise test::www::mechanize::catalyst
+ # goes to the value set in ->host above irregardless and
+ # that is a 404. It works but it is not pleasant.
+ $mech->clear_host if $test->{redirect} && $test->{national};
+ $mech->submit_form_ok(
+ {
+ button => $test->{button},
+ with_fields => {
+ title => 'Test Report',
+ detail => 'Test report details.',
+ photo => '',
+ name => 'Joe Bloggs',
+ may_show_name => '1',
+ category => $test->{category},
+ %optional_fields
+ }
+ },
+ "submit good details"
+ );
+ is_deeply $mech->page_errors, [], "check there were no errors";
+
+ # check that the user has been created/ not changed
+ $user =
+ FixMyStreet::App->model('DB::User')->find( { email => $test_email } );
+ ok $user, "user found";
+
+ # find the report
+ my $report = $user->problems->first;
+ ok $report, "Found the report";
+
+ # Check the report has been assigned appropriately
+ is $report->council, $test->{council};
+
+ if ( $test->{redirect} ) {
+ is $mech->uri->path, "/report/" . $report->id, "redirected to report page";
+ is $mech->uri->host, $test->{link_base}, 'redirected to correct site';
+ } else {
+ # receive token
+ my $email = $mech->get_email;
+ ok $email, "got an email";
+ like $email->body, qr/confirm the problem/i, "confirm the problem";
+
+ my ($url) = $email->body =~ m{(http://\S+)};
+ ok $url, "extracted confirm url '$url'";
+
+ # confirm token
+ $mech->get_ok($url);
+
+ $mech->content_contains( $test->{link_base} . 'report/' .
+ $report->id, 'confirm page links to correct site' );
+
+ if ( $test->{national} ) {
+ # Shouldn't be found, as it was a county problem
+ is $mech->get( '/report/' . $report->id )->code, 404, "report not found";
+
+ # But should be on the main site
+ $mech->host( 'www.fixmystreet.com' );
+ }
+ $mech->get_ok( '/report/' . $report->id );
+ }
- # check that the user has been created/ not changed
- my $user =
- FixMyStreet::App->model('DB::User')->find( { email => $test_email } );
- ok $user, "user found";
+ $report->discard_changes;
+ is $report->state, 'confirmed', "Report is now confirmed";
- # find the report
- my $report = $user->problems->first;
- ok $report, "Found the report";
+ is $report->name, 'Joe Bloggs', 'name updated correctly';
- # Check the report has been assigned appropriately
- is $report->council, 2240;
+ $mech->delete_user($user);
+ };
+ }
+}
- # receive token
- my $email = $mech->get_email;
- ok $email, "got an email";
- like $email->body, qr/confirm the problem/i, "confirm the problem";
+SKIP: {
+ skip( "Need 'seesomething' in ALLOWED_COBRANDS config", 100 )
+ unless FixMyStreet::Cobrand->exists('seesomething');
- my ($url) = $email->body =~ m{(http://\S+)};
- ok $url, "extracted confirm url '$url'";
+ $mech->host('seesomething.fixmystreet.com');
+ $mech->clear_emails_ok;
+ $mech->log_out_ok;
- # confirm token
- $mech->get_ok($url);
- $report->discard_changes;
- is $report->state, 'confirmed', "Report is now confirmed";
+ my $cobrand = FixMyStreet::Cobrand::SeeSomething->new();
- # Shouldn't be found, as it was a county problem
- is $mech->get( '/report/' . $report->id )->code, 404, "report not found";
+ my $bus_contact = FixMyStreet::App->model('DB::Contact')->find_or_create( {
+ %contact_params,
+ area_id => 2535,
+ category => 'Bus',
+ email => 'bus@example.com',
+ non_public => 1,
+ } );
- # But should be on the main site
- $mech->host( 'www.fixmystreet.com' );
- $mech->get_ok( '/report/' . $report->id );
- is $report->name, 'Joe Bloggs', 'name updated correctly';
+ for my $test ( {
+ desc => 'report with no user details works',
+ pc => 'WS1 4NH',
+ fields => {
+ detail => 'Test report details',
+ category => 'Bus',
+ subcategory => 'Smoking',
+ },
+ email => $cobrand->anonymous_account->{email},
+ },
+ {
+ desc => 'report with user details works',
+ pc => 'WS1 4NH',
+ fields => {
+ detail => 'Test report details',
+ category => 'Bus',
+ subcategory => 'Smoking',
+ email => 'non_anon_user@example.com',
+ name => 'Non Anon',
+ },
+ email => 'non_anon_user@example.com',
+ },
+ {
+ desc => 'report with public category',
+ pc => 'WS1 4NH',
+ fields => {
+ detail => 'Test report details',
+ category => 'Bus',
+ subcategory => 'Smoking',
+ },
+ email => $cobrand->anonymous_account->{email},
+ public => 1,
+ }
+ ) {
+ subtest $test->{desc} => sub {
+ $mech->clear_emails_ok;
+ my $user =
+ FixMyStreet::App->model('DB::User')->find( { email => $test->{email} } );
+
+ if ( $user ) {
+ $user->alerts->delete;
+ $user->problems->delete;
+ $user->delete;
+ }
- $mech->delete_user($user);
+ if ( $test->{public} ) {
+ $bus_contact->non_public(0);
+ $bus_contact->update;
+ } else {
+ $bus_contact->non_public(1);
+ $bus_contact->update;
+ }
+
+ $mech->get_ok( '/around' );
+ $mech->submit_form_ok(
+ {
+ with_fields => {
+ pc => $test->{pc},
+ },
+ },
+ 'submit around form',
+ );
+ $mech->follow_link_ok( { text_regex => qr/skip this step/i, }, "follow 'skip this step' link" );
+
+ $mech->submit_form_ok(
+ {
+ with_fields => $test->{fields},
+ },
+ 'Submit form details with no user details',
+ );
+ is_deeply $mech->page_errors, [], "check there were no errors";
+
+ $user =
+ FixMyStreet::App->model('DB::User')->find( { email => $test->{email} } );
+ ok $user, "user found";
+
+ my $report = $user->problems->first;
+ ok $report, "Found the report";
+
+ $mech->email_count_is(0);
+
+ ok $report->confirmed, 'Report is confirmed automatically';
+
+ if ( $test->{public} ) {
+ is $mech->uri->path, '/report/' . $report->id, 'redirects to report page';
+ } else {
+ is $mech->uri->path, '/report/new', 'stays on report/new page';
+ $mech->content_contains( 'Your report has been sent', 'use report created template' );
+ }
+ };
+ }
+
+ $bus_contact->delete;
}
$contact1->delete;
diff --git a/t/app/controller/report_new_open311.t b/t/app/controller/report_new_open311.t
index 863571ad0..55c5a92e8 100644
--- a/t/app/controller/report_new_open311.t
+++ b/t/app/controller/report_new_open311.t
@@ -29,7 +29,7 @@ my $contact1 = FixMyStreet::App->model('DB::Contact')->find_or_create( {
email => '100',
extra => [ { description => 'Lamppost number', code => 'number', required => 'True' },
{ description => 'Lamppost type', code => 'type', required => 'False', values =>
- { value => { Yellow => { key => 'modern' }, 'Gas' => { key => 'old' } } }
+ { value => [ { name => ['Gas'], key => ['old'] }, { name => [ 'Yellow' ], key => [ 'modern' ] } ] }
}
],
} );
diff --git a/t/app/controller/report_updates.t b/t/app/controller/report_updates.t
index 6f139fc4e..2204a9d99 100644
--- a/t/app/controller/report_updates.t
+++ b/t/app/controller/report_updates.t
@@ -618,11 +618,52 @@ for my $test (
};
}
+subtest 'check meta correct for comments marked confirmed but not marked open' => sub {
+ $report->comments->delete;
+ my $comment = FixMyStreet::App->model('DB::Comment')->create(
+ {
+ user => $user,
+ problem_id => $report->id,
+ text => 'update text',
+ confirmed => DateTime->now,
+ problem_state => 'confirmed',
+ anonymous => 0,
+ mark_open => 0,
+ mark_fixed => 0,
+ state => 'confirmed',
+ }
+ );
+
+ $mech->get_ok( "/report/" . $report->id );
+ my $update_meta = $mech->extract_update_metas;
+ like $update_meta->[0], qr/reopened$/,
+ 'update meta does not say reopened';
+
+ $comment->update( { mark_open => 1, problem_state => undef } );
+ $mech->get_ok( "/report/" . $report->id );
+ $update_meta = $mech->extract_update_metas;
+
+ unlike $update_meta->[0], qr/marked as open$/,
+ 'update meta does not says marked as open';
+ like $update_meta->[0], qr/reopened$/, 'update meta does say reopened';
+
+ $comment->update( { mark_open => 0, problem_state => undef } );
+ $mech->get_ok( "/report/" . $report->id );
+ $update_meta = $mech->extract_update_metas;
+
+ unlike $update_meta->[0], qr/marked as open$/,
+ 'update meta does not says marked as open';
+ unlike $update_meta->[0], qr/reopened$/, 'update meta does not say reopened';
+ };
+
subtest "check comment with no status change has not status in meta" => sub {
$mech->log_in_ok( $user->email );
$user->from_council( 0 );
$user->update;
+ my $comment = $report->comments->first;
+ $comment->update( { mark_fixed => 1, problem_state => 'fixed - council' } );
+
$mech->get_ok("/report/$report_id");
$mech->submit_form_ok(
@@ -642,6 +683,8 @@ subtest "check comment with no status change has not status in meta" => sub {
my @updates = $report->comments->all;
is scalar @updates, 2, 'correct number of updates';
+ warn $updates[0]->problem_state;
+ warn $updates[1]->problem_state;
my $update = pop @updates;
is $report->state, 'fixed - council', 'correct report state';
diff --git a/t/app/controller/reports.t b/t/app/controller/reports.t
index 801dbeddb..a4dab6597 100644
--- a/t/app/controller/reports.t
+++ b/t/app/controller/reports.t
@@ -1,10 +1,21 @@
use strict;
use warnings;
use Test::More;
-use Test::WWW::Mechanize::Catalyst 'FixMyStreet::App';
+use FixMyStreet::TestMech;
use mySociety::MaPit;
+use FixMyStreet::App;
+use DateTime;
-ok( my $mech = Test::WWW::Mechanize::Catalyst->new, 'Created mech object' );
+ok( my $mech = FixMyStreet::TestMech->new, 'Created mech object' );
+
+$mech->delete_problems_for_council( 2504 );
+$mech->delete_problems_for_council( 2651 );
+
+my @edinburgh_problems = $mech->create_problems_for_council(3, 2651, 'All reports');
+my @westminster_problems = $mech->create_problems_for_council(5, 2504, 'All reports');
+
+is scalar @westminster_problems, 5, 'correct number of westminster problems created';
+is scalar @edinburgh_problems, 3, 'correct number of edinburgh problems created';
# Run the cron script that makes the data for /reports so we don't get an error.
system( "bin/cron-wrapper update-all-reports" );
@@ -13,8 +24,35 @@ system( "bin/cron-wrapper update-all-reports" );
$mech->get_ok('/reports');
$mech->title_like(qr{Summary reports});
$mech->content_contains('Birmingham');
+
+my $stats = $mech->extract_report_stats;
+
+is $stats->{'City of Edinburgh Council'}->[1], 3, 'correct number of reports for Edinburgh';
+is $stats->{'Westminster City Council'}->[1], 5, 'correct number of reports for Westminster';
+
$mech->follow_link_ok( { text_regex => qr/Birmingham/ } );
+$mech->get_ok('/reports/Westminster');
+$mech->title_like(qr/Westminster City Council/);
+$mech->content_contains('Westminster City Council');
+$mech->content_contains('All reports Test 3 for 2504', 'problem to be marked non public visible');
+
+my $problems = $mech->extract_problem_list;
+is scalar @$problems, 5, 'correct number of problems displayed';
+
+my $private = $westminster_problems[2];
+ok $private->update( { non_public => 1 } ), 'problem marked non public';
+
+$mech->get_ok('/reports/Westminster');
+$problems = $mech->extract_problem_list;
+is scalar @$problems, 4, 'only public problems are displayed';
+
+$mech->content_lacks('All reports Test 3 for 2504', 'non public problem is not visible');
+
+$mech->get_ok('/reports');
+$stats = $mech->extract_report_stats;
+is $stats->{'Westminster City Council'}->[1], 5, 'non public reports included in stats';
+
SKIP: {
skip( "Need 'emptyhomes' in ALLOWED_COBRANDS config", 8 )
unless FixMyStreet::Cobrand->exists('emptyhomes');
diff --git a/t/app/helpers/send_email.t b/t/app/helpers/send_email.t
index 8c043f701..3067d90f3 100644
--- a/t/app/helpers/send_email.t
+++ b/t/app/helpers/send_email.t
@@ -49,7 +49,7 @@ ok $email_as_string =~ s{\s+Message-ID:\s+\S.*?$}{}xms, "Found and stripped out
my $expected_email_content = file(__FILE__)->dir->file('send_email_sample.txt')->slurp;
my $name = FixMyStreet->config('CONTACT_NAME');
$name = "\"$name\"" if $name =~ / /;
-my $sender = $name . ' <' . FixMyStreet->config('CONTACT_EMAIL') . '>';
+my $sender = $name . ' <' . FixMyStreet->config('DO_NOT_REPLY_EMAIL') . '>';
$expected_email_content =~ s{CONTACT_EMAIL}{$sender};
is $email_as_string,
diff --git a/t/app/model/alert_type.t b/t/app/model/alert_type.t
index 7df4c44c0..c592e9d3f 100644
--- a/t/app/model/alert_type.t
+++ b/t/app/model/alert_type.t
@@ -22,6 +22,10 @@ my $user2 =
->find_or_create( { email => 'commenter@example.com', name => 'Commenter' } );
ok $user2, "created comment user";
+my $user3 =
+ FixMyStreet::App->model('DB::User')
+ ->find_or_create( { email => 'bystander@example.com', name => 'Bystander' } );
+ok $user3, "created bystander";
my $dt = DateTime->new(
year => 2011,
@@ -96,6 +100,16 @@ my $alert = FixMyStreet::App->model('DB::Alert')->find_or_create(
}
);
+my $alert3 = FixMyStreet::App->model('DB::Alert')->find_or_create(
+ {
+ user => $user3,
+ parameter => $report_id,
+ alert_type => 'new_updates',
+ whensubscribed => $dt->ymd . ' ' . $dt->hms,
+ confirmed => 1,
+ }
+);
+
for my $test (
{
state => 'closed',
@@ -115,7 +129,7 @@ for my $test (
my $sent = FixMyStreet::App->model('DB::AlertSent')->search(
{
- alert_id => $alert->id,
+ alert_id => [ $alert->id, $alert3->id ],
parameter => $comment->id,
}
)->delete;
@@ -125,18 +139,25 @@ for my $test (
FixMyStreet::App->model('DB::AlertType')->email_alerts();
- $mech->email_count_is( 1 );
- my $email = $mech->get_email;
+ $mech->email_count_is( 2 );
+ my @emails = $mech->get_email;
my $msg = $test->{msg};
- my $body = $email->body;
-
- like $body, qr/$msg/, 'email says problem is ' . $test->{state};
- like $body, qr{report/$report_id}, 'contains problem url';
- like $body, qr/This is some update text/, 'contains update text';
- unlike $body, qr/This is other update text/, 'does not contains other update text';
+ for my $email (@emails) {
+ my $body = $email->body;
+ my $to = $email->header('To');
+
+ like $body, qr/$msg/, 'email says problem is ' . $test->{state};
+ if ($to eq $user->email) {
+ like $body, qr{/M/}, 'contains problem login url';
+ } elsif ($to eq $user3->email) {
+ like $body, qr{/report/$report_id}, 'contains problem url';
+ }
+ like $body, qr/This is some update text/, 'contains update text';
+ unlike $body, qr/This is other update text/, 'does not contains other update text';
- my $comments = $body =~ s/(------)//gs;
- is $comments, 1, 'only 1 update';
+ my $comments = $body =~ s/(------)//gs;
+ is $comments, 1, 'only 1 update';
+ }
};
}
@@ -166,7 +187,6 @@ subtest "correct text for title after URL" => sub {
)->delete;
FixMyStreet::App->model('DB::AlertType')->email_alerts();
- $mech->email_count_is( 1 );
my $email = $mech->get_email;
(my $title = $report->title) =~ s/ /\\s+/;
my $body = $email->body;
@@ -300,7 +320,6 @@ foreach my $test (
FixMyStreet::App->model('DB::AlertType')->email_alerts();
- $mech->email_count_is( 1 );
my $email = $mech->get_email;
my $body = $email->body;
@@ -406,7 +425,6 @@ subtest "check alerts from cobrand send main site url for alerts for different c
FixMyStreet::App->model('DB::AlertType')->email_alerts();
- $mech->email_count_is( 1 );
my $email = $mech->get_email;
my $body = $email->body;
@@ -444,7 +462,6 @@ subtest "check local alerts from cobrand send main site url for alerts for diffe
FixMyStreet::App->model('DB::AlertType')->email_alerts();
- $mech->email_count_is( 1 );
my $email = $mech->get_email;
my $body = $email->body;
diff --git a/t/app/model/problem.t b/t/app/model/problem.t
index c3913b79e..040790184 100644
--- a/t/app/model/problem.t
+++ b/t/app/model/problem.t
@@ -511,6 +511,10 @@ foreach my $test ( {
},
) {
subtest $test->{ desc } => sub {
+ if ( $test->{cobrand} && $test->{cobrand} =~ /lichfielddc/ && !FixMyStreet::Cobrand->exists('lichfielddc') ) {
+ plan skip_all => 'Skipping Lichfield tests without Lichfield cobrand';
+ }
+
$mech->clear_emails_ok;
FixMyStreet::App->model('DB::Problem')->search(
@@ -519,10 +523,6 @@ foreach my $test ( {
}
)->update( { whensent => \'ms_current_timestamp()' } );
- if ( $test->{cobrand} && $test->{cobrand} =~ /lichfielddc/ && !FixMyStreet::Cobrand->exists('lichfielddc') ) {
- plan skip_all => 'Skipping Lichfield tests without Lichfield cobrand';
- }
-
$problem->discard_changes;
$problem->update( {
council => $test->{ council },
@@ -568,6 +568,53 @@ foreach my $test ( {
};
}
+subtest 'check can turn on report sent email alerts' => sub {
+ eval 'use Test::MockModule; 1' or
+ plan skip_all => 'Skipping tests that rely on Test::MockModule';
+
+ $mech->clear_emails_ok;
+
+ FixMyStreet::App->model('DB::Problem')->search(
+ {
+ whensent => undef
+ }
+ )->update( { whensent => \'ms_current_timestamp()' } );
+
+ $problem->discard_changes;
+ $problem->update( {
+ council => 2651,
+ state => 'confirmed',
+ confirmed => \'ms_current_timestamp()',
+ whensent => undef,
+ category => 'potholes',
+ name => 'Test User',
+ cobrand => 'fixmystreet',
+ } );
+
+ my $m = new Test::MockModule(
+ 'FixMyStreet::Cobrand::FixMyStreet' );
+ $m->mock( report_sent_confirmation_email => 1 );
+ FixMyStreet::App->model('DB::Problem')->send_reports();
+
+ $mech->email_count_is( 2 );
+ my @emails = $mech->get_email;
+ my $email = $emails[0];
+
+ like $email->header('To'),qr/City of Edinburgh Council/, 'to line looks correct';
+ is $email->header('From'), '"Test User" <system_user@example.com>', 'from line looks correct';
+ like $email->header('Subject'), qr/A Title/, 'subject line looks correct';
+ like $email->body, qr/A user of FixMyStreet/, 'email body looks a bit like a report';
+ like $email->body, qr/Subject: A Title/, 'more email body checking';
+ like $email->body, qr/Dear City of Edinburgh Council/, 'Salutation looks correct';
+
+ $problem->discard_changes;
+ ok defined( $problem->whensent ), 'whensent set';
+
+ $email = $emails[1];
+ like $email->header('Subject'), qr/Problem Report Sent/, 'report sent email title correct';
+ like $email->body, qr/Your report about/, 'report sent body correct';
+};
+
$problem->comments->delete;
$problem->delete;
$user->delete;
diff --git a/t/cobrand/councils.t b/t/cobrand/councils.t
new file mode 100644
index 000000000..8fb10cfbe
--- /dev/null
+++ b/t/cobrand/councils.t
@@ -0,0 +1,18 @@
+use strict;
+use warnings;
+use Test::More;
+
+use FixMyStreet::TestMech;
+my $mech = FixMyStreet::TestMech->new;
+
+foreach my $council (qw/southampton reading bromley/) {
+ SKIP: {
+ skip( "Need '$council' in ALLOWED_COBRANDS config", 3 )
+ unless FixMyStreet::Cobrand->exists($council);
+ ok $mech->host("$council.fixmystreet.com"), "change host to $council";
+ $mech->get_ok('/');
+ $mech->content_like( qr/$council/i );
+ }
+}
+
+done_testing();
diff --git a/t/cobrand/get_council_sender.t b/t/cobrand/get_council_sender.t
index 9004a47f5..e61f36370 100644
--- a/t/cobrand/get_council_sender.t
+++ b/t/cobrand/get_council_sender.t
@@ -13,8 +13,8 @@ mySociety::Locale::gettext_domain( 'FixMyStreet' );
my $c = FixMyStreet::Cobrand::FixMyStreet->new();
-is $c->get_council_sender( '1000', { type => 'DIS' } ), 'Email', 'defaults to email';
-is $c->get_council_sender( '1000', { type => 'LBO' } ), 'London', 'returns london report it if London borough';
+is_deeply $c->get_council_sender( '1000', { type => 'DIS' } ), { method => 'Email' }, 'defaults to email';
+is_deeply $c->get_council_sender( '1000', { type => 'LBO' } ), { method=> 'London' }, 'returns london report it if London borough';
my $conf = FixMyStreet::App->model('DB::Open311Conf')->find_or_create(
area_id => 1000,
@@ -22,8 +22,8 @@ my $conf = FixMyStreet::App->model('DB::Open311Conf')->find_or_create(
send_method => 'TestMethod'
);
-is $c->get_council_sender( '1000', { type => 'LBO' } ), 'TestMethod', 'uses send_method in preference to London';
-is $c->get_council_sender( '1000', { type => 'DIS' } ), 'TestMethod', 'uses send_method in preference to Email';
+is $c->get_council_sender( '1000', { type => 'LBO' } )->{ method }, 'TestMethod', 'uses send_method in preference to London';
+is $c->get_council_sender( '1000', { type => 'DIS' } )->{ method }, 'TestMethod', 'uses send_method in preference to Email';
$conf->delete;
diff --git a/t/i18n.t b/t/i18n.t
index 4179dd8d0..f1cc86985 100644
--- a/t/i18n.t
+++ b/t/i18n.t
@@ -7,6 +7,7 @@ use FixMyStreet;
use mySociety::Locale;
use Encode;
use Data::Dumper;
+use HTTP::Headers;
use Sort::Key qw(keysort);
use POSIX 'strcoll';
local $Data::Dumper::Sortkeys = 1;
@@ -18,6 +19,16 @@ die "You need to run 'commonlib/bin/gettext-makemo --quiet FixMyStreet' "
unless -e FixMyStreet->path_to(
'locale/cy_GB.UTF-8/LC_MESSAGES/FixMyStreet-EmptyHomes.mo');
+# Test the language negotiation works
+my $lang = mySociety::Locale::negotiate_language(
+ 'en-gb,English,en_GB|cy,Cymraeg,cy_GB|es,Spanish,es_ES',
+ undef,
+ HTTP::Headers->new(
+ Accept_Language => 'es,en-gb;q=0.6,en;q=0.4'
+ )
+);
+is $lang, 'es', 'Language negotiation works okay';
+
# Example strings
my $english = "Please enter a valid email";
my $welsh = "Cofnodwch gyfeiriad e-bost dilys";
diff --git a/t/open311.t b/t/open311.t
index f9315982d..4c451d55e 100644
--- a/t/open311.t
+++ b/t/open311.t
@@ -37,9 +37,10 @@ my $p = FixMyStreet::App->model('DB::Problem')->new( {
title => 'title',
detail => 'detail',
user => $u,
+ id => 1,
} );
-my $expected_error = qr{.*request failed: 500 Can.t connect to 192.168.50.1:80 \([^)]*\).*};
+my $expected_error = qr{Failed to submit problem 1 over Open311}ism;
warning_like {$o2->send_service_request( $p, { url => 'http://example.com/' }, 1 )} $expected_error, 'warning generated on failed call';
@@ -105,7 +106,7 @@ subtest 'posting service request with basic_description' => sub {
$extra,
$problem->category,
'<?xml version="1.0" encoding="utf-8"?><service_requests><request><service_request_id>248</service_request_id></request></service_requests>',
- { basic_description => 1 },
+ { extended_description => 0 },
);
is $results->{ res }, 248, 'got request id';
@@ -207,6 +208,26 @@ subtest 'basic request update post parameters' => sub {
is $c->param('description'), 'this is a comment', 'email correct';
is $c->param('email'), 'test@example.com', 'email correct';
is $c->param('status'), 'OPEN', 'status correct';
+ is $c->param('service_request_id'), 81, 'request id correct';
+ is $c->param('updated_datetime'), DateTime::Format::W3CDTF->format_datetime($dt), 'correct date';
+ is $c->param('title'), 'Mr', 'correct title';
+ is $c->param('last_name'), 'User', 'correct first name';
+ is $c->param('first_name'), 'Test', 'correct second name';
+ is $c->param('media_url'), undef, 'no media url';
+};
+
+subtest 'extended request update post parameters' => sub {
+ my $results = make_update_req( $comment, '<?xml version="1.0" encoding="utf-8"?><service_request_updates><request_update><update_id>248</update_id></request_update></service_request_updates>', { extended_updates => 1 } );
+
+ is $results->{ res }, 248, 'got update id';
+
+ my $req = $o->test_req_used;
+
+ my $c = CGI::Simple->new( $results->{ req }->content );
+
+ is $c->param('description'), 'this is a comment', 'email correct';
+ is $c->param('email'), 'test@example.com', 'email correct';
+ is $c->param('status'), 'OPEN', 'status correct';
is $c->param('service_request_id_ext'), 80, 'external request id correct';
is $c->param('service_request_id'), 81, 'request id correct';
is $c->param('public_anonymity_required'), 'FALSE', 'anon status correct';
@@ -237,21 +258,18 @@ foreach my $test (
{
desc => 'comment with fixed state sends status of CLOSED',
state => 'fixed',
- anon => 0,
status => 'CLOSED',
extended => 'FIXED',
},
{
desc => 'comment with fixed - user state sends status of CLOSED',
state => 'fixed - user',
- anon => 0,
status => 'CLOSED',
extended => 'FIXED',
},
{
desc => 'comment with fixed - council state sends status of CLOSED',
state => 'fixed - council',
- anon => 0,
status => 'CLOSED',
extended => 'FIXED',
},
@@ -279,20 +297,17 @@ foreach my $test (
{
desc => 'comment with closed state sends status of CLOSED',
state => 'closed',
- anon => 0,
status => 'CLOSED',
},
{
desc => 'comment with investigating state sends status of OPEN',
state => 'investigating',
- anon => 0,
status => 'OPEN',
extended => 'INVESTIGATING',
},
{
desc => 'comment with planned state sends status of OPEN',
state => 'planned',
- anon => 0,
status => 'OPEN',
extended => 'ACTION_SCHEDULED',
},
@@ -306,6 +321,27 @@ foreach my $test (
{
desc => 'comment with in progress state sends status of OPEN',
state => 'in progress',
+ status => 'OPEN',
+ },
+ {
+ state => 'confirmed',
+ status => 'OPEN',
+ },
+) {
+ subtest $test->{desc} => sub {
+ $comment->problem->state( $test->{state} );
+
+ my $results = make_update_req( $comment, '<?xml version="1.0" encoding="utf-8"?><service_request_updates><request_update><update_id>248</update_id></request_update></service_request_updates>' );
+
+ my $c = CGI::Simple->new( $results->{ req }->content );
+ is $c->param('status'), $test->{status}, 'correct status';
+ };
+}
+
+for my $test (
+ {
+ desc => 'public comment sets public_anonymity_required to false',
+ state => 'confirmed',
anon => 0,
status => 'OPEN',
extended => 'IN_PROGRESS',
@@ -322,10 +358,9 @@ foreach my $test (
$comment->problem->state( $test->{state} );
$comment->anonymous( $test->{anon} );
- my $results = make_update_req( $comment, '<?xml version="1.0" encoding="utf-8"?><service_request_updates><request_update><update_id>248</update_id></request_update></service_request_updates>' );
+ my $results = make_update_req( $comment, '<?xml version="1.0" encoding="utf-8"?><service_request_updates><request_update><update_id>248</update_id></request_update></service_request_updates>', { extended_updates => 1 } );
my $c = CGI::Simple->new( $results->{ req }->content );
- is $c->param('status'), $test->{status}, 'correct status';
is $c->param('public_anonymity_required'), $test->{anon} ? 'TRUE' : 'FALSE', 'correct anonymity';
if ( $test->{extended} ) {
@@ -597,19 +632,19 @@ for my $test (
done_testing();
sub make_update_req {
- my $comment = shift;
- my $xml = shift;
- my $open311_args = shift || {};
+ my $comment = shift;
+ my $xml = shift;
+ my $open311conf = shift || {};
+
+ my $params = {
+ object => $comment,
+ xml => $xml,
+ method => 'post_service_request_update',
+ path => 'servicerequestupdates.xml',
+ open311_conf => $open311_args,
+ };
- return make_req(
- {
- object => $comment,
- xml => $xml,
- method => 'post_service_request_update',
- path => 'update.xml',
- open311_conf => $open311_args,
- }
- );
+ return make_req( $params );
}
sub make_service_req {
diff --git a/t/open311/getservicerequestupdates.t b/t/open311/getservicerequestupdates.t
index 9852e53b6..3f9c35c32 100644
--- a/t/open311/getservicerequestupdates.t
+++ b/t/open311/getservicerequestupdates.t
@@ -26,7 +26,6 @@ my $requests_xml = qq{<?xml version="1.0" encoding="utf-8"?>
<request_update>
<update_id>638344</update_id>
<service_request_id>1</service_request_id>
-<service_request_id_ext>1</service_request_id_ext>
<status>open</status>
<description>This is a note</description>
UPDATED_DATETIME
@@ -42,25 +41,25 @@ for my $test (
{
desc => 'basic parsing - element missing',
updated_datetime => '',
- res => { update_id => 638344, service_request_id => 1, service_request_id_ext => 1,
+ res => { update_id => 638344, service_request_id => 1,
status => 'open', description => 'This is a note' },
},
{
desc => 'basic parsing - empty element',
updated_datetime => '<updated_datetime />',
- res => { update_id => 638344, service_request_id => 1, service_request_id_ext => 1,
+ res => { update_id => 638344, service_request_id => 1,
status => 'open', description => 'This is a note', updated_datetime => {} } ,
},
{
desc => 'basic parsing - element with no content',
updated_datetime => '<updated_datetime></updated_datetime>',
- res => { update_id => 638344, service_request_id => 1, service_request_id_ext => 1,
+ res => { update_id => 638344, service_request_id => 1,
status => 'open', description => 'This is a note', updated_datetime => {} } ,
},
{
desc => 'basic parsing - element with content',
updated_datetime => sprintf( '<updated_datetime>%s</updated_datetime>', $dt ),
- res => { update_id => 638344, service_request_id => 1, service_request_id_ext => 1,
+ res => { update_id => 638344, service_request_id => 1,
status => 'open', description => 'This is a note', updated_datetime => $dt } ,
},
) {
@@ -68,7 +67,7 @@ for my $test (
my $local_requests_xml = $requests_xml;
$local_requests_xml =~ s/UPDATED_DATETIME/$test->{updated_datetime}/;
- my $o = Open311->new( jurisdiction => 'mysociety', endpoint => 'http://example.com', test_mode => 1, test_get_returns => { 'update.xml' => $local_requests_xml } );
+ my $o = Open311->new( jurisdiction => 'mysociety', endpoint => 'http://example.com', test_mode => 1, test_get_returns => { 'servicerequestupdates.xml' => $local_requests_xml } );
my $res = $o->get_service_request_updates;
is_deeply $res->[0], $test->{ res }, 'result looks correct';
@@ -76,6 +75,33 @@ for my $test (
};
}
+subtest 'check extended request parsed correctly' => sub {
+ my $extended_requests_xml = qq{<?xml version="1.0" encoding="utf-8"?>
+ <service_requests_updates>
+ <request_update>
+ <update_id>638344</update_id>
+ <service_request_id_ext>120384</service_request_id_ext>
+ <service_request_id>1</service_request_id>
+ <status>open</status>
+ <description>This is a note</description>
+ UPDATED_DATETIME
+ </request_update>
+ </service_requests_updates>
+ };
+
+ my $updated_datetime = sprintf( '<updated_datetime>%s</updated_datetime>', $dt );
+ my $expected_res = { update_id => 638344, service_request_id => 1, service_request_id_ext => 120384,
+ status => 'open', description => 'This is a note', updated_datetime => $dt };
+
+ $extended_requests_xml =~ s/UPDATED_DATETIME/$updated_datetime/;
+
+ my $o = Open311->new( jurisdiction => 'mysociety', endpoint => 'http://example.com', test_mode => 1, test_get_returns => { 'servicerequestupdates.xml' => $extended_requests_xml } );
+
+ my $res = $o->get_service_request_updates;
+ is_deeply $res->[0], $expected_res, 'result looks correct';
+
+};
+
my $problem_rs = FixMyStreet::App->model('DB::Problem');
my $problem = $problem_rs->new(
{
@@ -305,7 +331,7 @@ for my $test (
$local_requests_xml =~ s#<service_request_id_ext>\d+</service_request_id_ext>#<service_request_id_ext>@{[$problem->id]}</service_request_id_ext>#;
$local_requests_xml =~ s#<status>\w+</status>#<status>$test->{comment_status}</status># if $test->{comment_status};
- my $o = Open311->new( jurisdiction => 'mysociety', endpoint => 'http://example.com', test_mode => 1, test_get_returns => { 'update.xml' => $local_requests_xml } );
+ my $o = Open311->new( jurisdiction => 'mysociety', endpoint => 'http://example.com', test_mode => 1, test_get_returns => { 'servicerequestupdates.xml' => $local_requests_xml } );
$problem->comments->delete;
$problem->lastupdate( DateTime->now()->subtract( days => 1 ) );
@@ -347,7 +373,7 @@ foreach my $test (
$local_requests_xml =~ s#<service_request_id>\d+</service_request_id>#<service_request_id>@{[$problem->external_id]}</service_request_id>#;
$local_requests_xml =~ s#<service_request_id_ext>\d+</service_request_id_ext>#<service_request_id_ext>@{[$problem->id]}</service_request_id_ext>#;
- my $o = Open311->new( jurisdiction => 'mysociety', endpoint => 'http://example.com', test_mode => 1, test_get_returns => { 'update.xml' => $local_requests_xml } );
+ my $o = Open311->new( jurisdiction => 'mysociety', endpoint => 'http://example.com', test_mode => 1, test_get_returns => { 'servicerequestupdates.xml' => $local_requests_xml } );
$problem->comments->delete;
@@ -417,7 +443,7 @@ for my $test (
$local_requests_xml =~ s#<service_request_id>\d+</service_request_id>#<service_request_id>$test->{request_id}</service_request_id>#;
$local_requests_xml =~ s#<service_request_id_ext>\d+</service_request_id_ext>#<service_request_id_ext>$test->{request_id_ext}</service_request_id_ext>#;
- my $o = Open311->new( jurisdiction => 'mysociety', endpoint => 'http://example.com', test_mode => 1, test_get_returns => { 'update.xml' => $local_requests_xml } );
+ my $o = Open311->new( jurisdiction => 'mysociety', endpoint => 'http://example.com', test_mode => 1, test_get_returns => { 'servicerequestupdates.xml' => $local_requests_xml } );
my $council_details = { areaid => $test->{area_id} };
@@ -431,7 +457,7 @@ for my $test (
subtest 'using start and end date' => sub {
my $local_requests_xml = $requests_xml;
- my $o = Open311->new( jurisdiction => 'mysociety', endpoint => 'http://example.com', test_mode => 1, test_get_returns => { 'update.xml' => $local_requests_xml } );
+ my $o = Open311->new( jurisdiction => 'mysociety', endpoint => 'http://example.com', test_mode => 1, test_get_returns => { 'servicerequestupdates.xml' => $local_requests_xml } );
my $start_dt = DateTime->now();
$start_dt->subtract( days => 1 );
@@ -479,7 +505,6 @@ subtest 'check that existing comments are not duplicated' => sub {
<request_update>
<update_id>638344</update_id>
<service_request_id>@{[ $problem->external_id ]}</service_request_id>
- <service_request_id_ext>@{[ $problem->id ]}</service_request_id_ext>
<status>open</status>
<description>This is a note</description>
<updated_datetime>UPDATED_DATETIME</updated_datetime>
@@ -487,7 +512,6 @@ subtest 'check that existing comments are not duplicated' => sub {
<request_update>
<update_id>638354</update_id>
<service_request_id>@{[ $problem->external_id ]}</service_request_id>
- <service_request_id_ext>@{[ $problem->id ]}</service_request_id_ext>
<status>open</status>
<description>This is a different note</description>
<updated_datetime>UPDATED_DATETIME2</updated_datetime>
@@ -516,7 +540,7 @@ subtest 'check that existing comments are not duplicated' => sub {
$requests_xml =~ s/UPDATED_DATETIME2/$dt/;
$requests_xml =~ s/UPDATED_DATETIME/@{[ $comment->confirmed ]}/;
- my $o = Open311->new( jurisdiction => 'mysociety', endpoint => 'http://example.com', test_mode => 1, test_get_returns => { 'update.xml' => $requests_xml } );
+ my $o = Open311->new( jurisdiction => 'mysociety', endpoint => 'http://example.com', test_mode => 1, test_get_returns => { 'servicerequestupdates.xml' => $requests_xml } );
my $update = Open311::GetServiceRequestUpdates->new(
system_user => $user,
@@ -555,7 +579,6 @@ foreach my $test ( {
<request_update>
<update_id>638344</update_id>
<service_request_id>@{[ $problem->external_id ]}</service_request_id>
- <service_request_id_ext>@{[ $problem->id ]}</service_request_id_ext>
<status>closed</status>
<description>This is a note</description>
<updated_datetime>UPDATED_DATETIME</updated_datetime>
@@ -563,7 +586,6 @@ foreach my $test ( {
<request_update>
<update_id>638354</update_id>
<service_request_id>@{[ $problem->external_id ]}</service_request_id>
- <service_request_id_ext>@{[ $problem->id ]}</service_request_id_ext>
<status>open</status>
<description>This is a different note</description>
<updated_datetime>UPDATED_DATETIME2</updated_datetime>
@@ -579,7 +601,7 @@ foreach my $test ( {
$requests_xml =~ s/UPDATED_DATETIME/$test->{dt1}/;
$requests_xml =~ s/UPDATED_DATETIME2/$test->{dt2}/;
- my $o = Open311->new( jurisdiction => 'mysociety', endpoint => 'http://example.com', test_mode => 1, test_get_returns => { 'update.xml' => $requests_xml } );
+ my $o = Open311->new( jurisdiction => 'mysociety', endpoint => 'http://example.com', test_mode => 1, test_get_returns => { 'servicerequestupdates.xml' => $requests_xml } );
my $update = Open311::GetServiceRequestUpdates->new(
system_user => $user,
@@ -609,7 +631,6 @@ foreach my $test ( {
<request_update>
<update_id>638344</update_id>
<service_request_id>@{[ $problem->external_id ]}</service_request_id>
- <service_request_id_ext>@{[ $problem->id ]}</service_request_id_ext>
<status>closed</status>
<description>This is a note</description>
<updated_datetime>UPDATED_DATETIME</updated_datetime>
@@ -631,7 +652,7 @@ foreach my $test ( {
$requests_xml =~ s/UPDATED_DATETIME/$dt/;
- my $o = Open311->new( jurisdiction => 'mysociety', endpoint => 'http://example.com', test_mode => 1, test_get_returns => { 'update.xml' => $requests_xml } );
+ my $o = Open311->new( jurisdiction => 'mysociety', endpoint => 'http://example.com', test_mode => 1, test_get_returns => { 'servicerequestupdates.xml' => $requests_xml } );
my $update = Open311::GetServiceRequestUpdates->new(
system_user => $user,
diff --git a/t/open311/populate-service-list.t b/t/open311/populate-service-list.t
index fbd729f3a..00026cd9f 100644
--- a/t/open311/populate-service-list.t
+++ b/t/open311/populate-service-list.t
@@ -269,6 +269,184 @@ subtest 'check meta data population' => sub {
is_deeply $contact->extra, $extra, 'meta data saved';
};
+for my $test (
+ {
+ desc => 'check meta data added to existing contact',
+ has_meta => 1,
+ orig_meta => undef,
+ end_meta => [ {
+ variable => 'true',
+ code => 'type',
+ datatype => 'string',
+ required => 'true',
+ datatype_description => 'Type of bin',
+ order => 1,
+ description => 'Type of bin'
+
+ } ],
+ meta_xml => '<?xml version="1.0" encoding="utf-8"?>
+ <service_definition>
+ <service_code>100</service_code>
+ <attributes>
+ <attribute>
+ <variable>true</variable>
+ <code>type</code>
+ <datatype>string</datatype>
+ <required>true</required>
+ <datatype_description>Type of bin</datatype_description>
+ <order>1</order>
+ <description>Type of bin</description>
+ </attribute>
+ </attributes>
+ </service_definition>
+ ',
+ },
+ {
+ desc => 'check meta data updated',
+ has_meta => 1,
+ orig_meta => [ {
+ variable => 'true',
+ code => 'type',
+ datatype => 'string',
+ required => 'true',
+ datatype_description => 'Type of bin',
+ order => 1,
+ description => 'Type of bin'
+
+ } ],
+ end_meta => [ {
+ variable => 'true',
+ code => 'type',
+ datatype => 'string',
+ required => 'true',
+ datatype_description => 'Colour of bin',
+ order => 1,
+ description => 'Colour of bin'
+
+ } ],
+ meta_xml => '<?xml version="1.0" encoding="utf-8"?>
+ <service_definition>
+ <service_code>100</service_code>
+ <attributes>
+ <attribute>
+ <variable>true</variable>
+ <code>type</code>
+ <datatype>string</datatype>
+ <required>true</required>
+ <datatype_description>Colour of bin</datatype_description>
+ <order>1</order>
+ <description>Colour of bin</description>
+ </attribute>
+ </attributes>
+ </service_definition>
+ ',
+ },
+ {
+ desc => 'check meta data removed',
+ has_meta => 0,
+ end_meta => undef,
+ orig_meta => [ {
+ variable => 'true',
+ code => 'type',
+ datatype => 'string',
+ required => 'true',
+ datatype_description => 'Type of bin',
+ order => 1,
+ description => 'Type of bin'
+
+ } ],
+ meta_xml => '<?xml version="1.0" encoding="utf-8"?>
+ <service_definition>
+ <service_code>100</service_code>
+ <attributes>
+ <attribute>
+ <variable>true</variable>
+ <code>type</code>
+ <datatype>string</datatype>
+ <required>true</required>
+ <datatype_description>Type of bin</datatype_description>
+ <order>1</order>
+ <description>Type of bin</description>
+ </attribute>
+ </attributes>
+ </service_definition>
+ ',
+ },
+ {
+ desc => 'check empty meta data handled',
+ has_meta => 1,
+ orig_meta => undef,
+ end_meta => undef,
+ meta_xml => '<?xml version="1.0" encoding="utf-8"?>
+ <service_definition>
+ <service_code>100</service_code>
+ <attributes>
+ </attributes>
+ </service_definition>
+ ',
+ },
+) {
+ subtest $test->{desc} => sub {
+ my $processor = Open311::PopulateServiceList->new( council_list => [] );
+
+ my $services_xml = '<?xml version="1.0" encoding="utf-8"?>
+ <services>
+ <service>
+ <service_code>100</service_code>
+ <service_name>Cans left out 24x7</service_name>
+ <description>Garbage or recycling cans that have been left out for more than 24 hours after collection. Violators will be cited.</description>
+ <metadata>false</metadata>
+ <type>realtime</type>
+ <keywords>lorem, ipsum, dolor</keywords>
+ <group>sanitation</group>
+ </service>
+ </services>
+ ';
+
+ if ( $test->{has_meta} ) {
+ $services_xml =~ s/metadata>false/metadata>true/ms;
+ }
+
+ my $contact = FixMyStreet::App->model('DB::Contact')->find_or_create(
+ {
+ area_id => 1,
+ email => '100',
+ category => 'Cans left out 24x7',
+ confirmed => 1,
+ deleted => 0,
+ editor => $0,
+ whenedited => \'ms_current_timestamp()',
+ note => 'test contact',
+ }
+ );
+
+ $contact->update( { extra => $test->{orig_meta} } );
+
+ my $o = Open311->new(
+ jurisdiction => 'mysociety',
+ endpoint => 'http://example.com',
+ test_mode => 1,
+ test_get_returns => { 'services.xml' => $services_xml, 'services/100.xml' => $test->{meta_xml} }
+ );
+
+ my $service_list = get_xml_simple_object( $services_xml );
+ $service_list = { service => [ $service_list->{ service } ] };
+
+ my $council = FixMyStreet::App->model('DB::Open311conf')->new( {
+ area_id => 1
+ } );
+
+ $processor->_current_open311( $o );
+ $processor->_current_council( $council );
+
+ $processor->process_services( $service_list );
+
+ $contact->discard_changes;
+
+ is_deeply $contact->extra, $test->{end_meta}, 'meta data saved';
+ };
+}
+
subtest 'check attribute ordering' => sub {
my $processor = Open311::PopulateServiceList->new( council_list => [] );
diff --git a/templates/email/default/confirm_report_sent.txt b/templates/email/default/confirm_report_sent.txt
new file mode 100644
index 000000000..42f200213
--- /dev/null
+++ b/templates/email/default/confirm_report_sent.txt
@@ -0,0 +1,9 @@
+Subject: Problem Report Sent: <?=$values['title']?>
+
+Hi,
+
+Your report about "<?=$values['title']?>" has been sent to <?=$values['councils_name']?>.
+
+Thanks
+
+<?=$values['signature']?>
diff --git a/templates/email/fixmybarangay/login.txt b/templates/email/fixmybarangay/login.txt
new file mode 100644
index 000000000..3ca8d1323
--- /dev/null
+++ b/templates/email/fixmybarangay/login.txt
@@ -0,0 +1,14 @@
+Subject: [% loc('Your FixMyBarangay.com account details') %]
+
+Please click on the link below to confirm your email address. Then you will be
+able to view your problem reports and manage them more easily.
+
+[% c.uri_for_action( 'auth/token', token ) %]
+
+Note that your can't create new reports on FixMyBarangay unless your account has
+been authorised as a staff account, which we can do after it has been created.
+Get in touch with the team if you think this applies to you, and we haven't yet
+authorised your account.
+
+[% INCLUDE 'signature.txt' %]
+
diff --git a/templates/email/fixmybarangay/signature.txt b/templates/email/fixmybarangay/signature.txt
new file mode 100644
index 000000000..eb5000f58
--- /dev/null
+++ b/templates/email/fixmybarangay/signature.txt
@@ -0,0 +1,2 @@
+Yours,
+The FixMyBarangay team
diff --git a/templates/email/fixmybarangay/site-name.txt b/templates/email/fixmybarangay/site-name.txt
new file mode 100644
index 000000000..075d881b5
--- /dev/null
+++ b/templates/email/fixmybarangay/site-name.txt
@@ -0,0 +1 @@
+FixMyBarangay
diff --git a/templates/email/seesomething/confirm_report_sent.txt b/templates/email/seesomething/confirm_report_sent.txt
new file mode 100644
index 000000000..d62a50c49
--- /dev/null
+++ b/templates/email/seesomething/confirm_report_sent.txt
@@ -0,0 +1,10 @@
+Subject: See Something, Say Something report sent
+
+Thank you for your report. It will help us to direct our policing activity to make public transport even safer. Find out more of what we are doing at:
+
+Safer Travel Partnership
+
+http://www.safertravel.info
+
+Follow us on Twitter: https://www.twitter.com/ST_Police
+or on Facebook: http://www.facebook.com/safertravelpolice
diff --git a/templates/email/seesomething/submit.txt b/templates/email/seesomething/submit.txt
new file mode 100644
index 000000000..0682425fe
--- /dev/null
+++ b/templates/email/seesomething/submit.txt
@@ -0,0 +1,25 @@
+Subject: Report on See Something, Say Something
+
+A user of
+See Something, Say Something has submitted the following report
+of a problem that they believe might require your attention.
+
+<?=$values['image_url']?>
+----------
+
+<?=$values['user_details']?>
+
+<?=$values['phone_line']?><?=$values['category_line']?><?=$values['subcategory_line']?>
+
+Details: <?=$values['detail']?>
+
+<?=$values['easting_northing']?>Latitude: <?=$values['latitude']?>
+
+Longitude: <?=$values['longitude']?>
+
+<?=$values['closest_address']?>----------
+
+Replies to this email will go to the user who submitted the problem
+unless it is an anonymous report in which case they will be discarded.
+
+<?=$values['signature']?>
diff --git a/templates/email/zurich/alert-moderation-overdue.txt b/templates/email/zurich/alert-moderation-overdue.txt
new file mode 100644
index 000000000..85906b9cb
--- /dev/null
+++ b/templates/email/zurich/alert-moderation-overdue.txt
@@ -0,0 +1,10 @@
+Subject: eskalierte Meldungen auf FixMyZ&uuml;rich
+
+
+
+Die folgenden Meldungen auf FixMyZ&uuml;rich sind &auml;lter als einen Tag und m&uuml;ssen dringend bearbeitet werden:
+<?=$values['data']?>
+
+Um diese Meldungen zu moderieren, klicken Sie auf folgende URL:
+
+<?=$values['admin_url']?> \ No newline at end of file
diff --git a/templates/email/zurich/alert-overdue.txt b/templates/email/zurich/alert-overdue.txt
new file mode 100644
index 000000000..90c8ee02f
--- /dev/null
+++ b/templates/email/zurich/alert-overdue.txt
@@ -0,0 +1,13 @@
+Subject: R&uuml;ckmeldung erforderlich auf FixMyZ&uuml;rich
+
+
+Die folgenden Meldungen wurden eskaliert, da sie nicht innerhalb von f&uuml;nf Tagen beantwortet worden sind:
+
+
+<?=$values['data']?>
+
+
+
+Um diese Meldungen zu bearbeiten, klicken Sie auf folgende URL:
+
+<?=$values['admin_url']?> \ No newline at end of file
diff --git a/templates/email/zurich/problem-confirm.txt b/templates/email/zurich/problem-confirm.txt
new file mode 100755
index 000000000..e770aa69e
--- /dev/null
+++ b/templates/email/zurich/problem-confirm.txt
@@ -0,0 +1,16 @@
+Subject: Fix My Z&uuml;rich: Meldung #[% ---report.ID--- | trim %]
+
+
+
+Guten Tag [% report.name %]
+
+Bitte klicken Sie auf den untenstehenden Link, um Ihre Meldung zu best&auml;tigen. Falls der Link nicht funktioniert, kopieren Sie ihn in Ihren Browser:
+
+[% token_url %]
+
+Ihre Meldung:
+
+[% ---report.details---- %]
+
+
+Dieses E-Mail wurde automatisch generiert. Bitte antworten Sie nicht auf dieses E-Mail. \ No newline at end of file
diff --git a/templates/email/zurich/reply-autoresponse.txt b/templates/email/zurich/reply-autoresponse.txt
new file mode 100755
index 000000000..ef5d69d41
--- /dev/null
+++ b/templates/email/zurich/reply-autoresponse.txt
@@ -0,0 +1,10 @@
+Subject: Automatische Antwort auf Ihr E-Mail
+
+Guten Tag
+
+Dies ist eine automatische Antwort auf Ihr E-Mail. Ihr E-Mail wurde nicht &uuml;bermittelt.
+
+Falls Sie eine Meldung erfassen m&ouml;chten, tun Sie das bitte &uuml;ber die Hauptseite:
+[% ---link to FMZ--- %]
+
+Falls Sie Fragen zu Fix My Z&uuml;rich haben, senden Sie ein E-Mail an gis-zentrum@zuerich.ch
diff --git a/templates/email/zurich/submit.txt b/templates/email/zurich/submit.txt
new file mode 100755
index 000000000..a95b02cde
--- /dev/null
+++ b/templates/email/zurich/submit.txt
@@ -0,0 +1,10 @@
+Subject: Fix My Z&uuml;rich: #<?=----$values['ID']----?>
+
+
+
+<?=$values['url']?>
+
+
+<?=$values['detail']?>
+
+
diff --git a/templates/web/bromley/around/intro.html b/templates/web/bromley/around/intro.html
new file mode 100644
index 000000000..ee4685b9c
--- /dev/null
+++ b/templates/web/bromley/around/intro.html
@@ -0,0 +1 @@
+ <h1 class="main mob-only">Reporting a problem in Bromley&rsquo;s streets or parks</h1>
diff --git a/templates/web/default/admin/council_contacts.html b/templates/web/default/admin/council_contacts.html
index ac6698510..56850a82b 100644
--- a/templates/web/default/admin/council_contacts.html
+++ b/templates/web/default/admin/council_contacts.html
@@ -1,5 +1,7 @@
[% INCLUDE 'admin/header.html' title=tprintf(loc('Council contacts for %s'), council_name) -%]
+[% conf = open311.next %]
+
[% IF updated %]
<p>
<em>[% updated %]</em>
@@ -36,8 +38,10 @@
<th>[% loc('Email') %]</th>
<th>[% loc('Confirmed') %]</th>
<th>[% loc('Deleted') %]</th>
+ <th>[% loc('Devolved') %]</th>
<th>[% loc('Last editor') %]</th>
<th>[% loc('Note') %]</th>
+ <th>[% loc('Public') %]</th>
<th>[% loc('When edited') %]</th>
<th>[% loc('Confirm') %]</th>
</tr>
@@ -47,8 +51,10 @@
<td>[% contact.email | html %]</td>
<td>[% IF contact.confirmed %][% loc('Yes') %][% ELSE %][% loc('No') %][% END %]</td>
<td>[% IF contact.deleted %][% loc('Yes') %][% ELSE %][% loc('No') %][% END %]</td>
+ <td>[% IF conf.can_be_devolved && contact.send_method %][% loc('Yes') %][% ELSE %][% loc('No') %][% END %]</td>
<td>[% contact.editor %]</td>
<td>[% contact.note | html %]</td>
+ <td>[% contact.non_public ? loc('Non Public') : loc('Public') %]</td>
<td>[% contact.whenedited.ymd _ ' ' _ contact.whenedited.hms %]</td>
<td><input type="checkbox" name="confirmed" value="[% contact.category %]"></td>
</tr>
@@ -79,10 +85,10 @@
<p>
<input type="checkbox" name="confirmed" value="1" id="confirmed">
- <label for="confirmed">[% loc('Confirmed') %]</label>
+ <label for="confirmed" class="inline">[% loc('Confirmed') %]</label>
- <input type="checkbox" name="deleted" value="1"id="deleted">
- <label for="deleted">[% loc('Deleted') %]</label>
+ <input type="checkbox" name="deleted" value="1" id="deleted">
+ <label for="deleted" class="inline">[% loc('Deleted') %]</label>
</p>
<p>
@@ -90,6 +96,11 @@
</p>
<p>
+ <input type="checkbox" name="non_public" value="1" id="non_public">
+ <label for="non_public" class="inline">[% loc('Private') %]</label>
+ </p>
+
+ <p>
<input type="hidden" name="area_id" value="[% area_id %]" >
<input type="hidden" name="posted" value="new" >
<input type="hidden" name="token" value="[% token %]" >
@@ -104,24 +115,23 @@
<h2>[% loc('Configure Open311 integration') %]</h2>
<form method="post" action="[% c.uri_for('council_contacts', area_id ) %]" enctype="application/x-www-form-urlencoded" accept-charset="utf-8">
- [% conf = open311.next %]
<p>
- <label for="endpoint">Endpoint</label>:
+ <label for="endpoint">Endpoint</label>
<input type="text" name="endpoint" id="endpoint" value="[% conf.endpoint %]" size="50">
</p>
<p>
- <label for="jurisdiction">Jurisdiction</label>:
+ <label for="jurisdiction">Jurisdiction</label>
<input type="text" name="jurisdiction" id="jurisdiction" value="[% conf.jurisdiction %]" size="50">
</p>
<p>
- <label for="api_key">Api Key</label>:
+ <label for="api_key">Api Key</label>
<input type="text" name="api_key" id="api_key" value="[% conf.api_key %]" size="25">
</p>
<p>
- <label for="send_method">Send Method</label>:
+ <label for="send_method">Send Method</label>
<select name="send_method">
<option value=""> -- Select a method -- </option>
[% FOR method IN send_methods %]
@@ -131,18 +141,23 @@
</p>
<p>
- <label for="send_comments">Use Open311 comment sending extension</label>:
<input type="checkbox" name="send_comments"[% ' checked' IF conf.send_comments %]>
+ <label for="send_comments" class="inline">Use Open311 comment sending extension</label>
</p>
<p>
- <label for"comment_user_id">User to attribute fetched comments to</label>:
+ <label for"comment_user_id">User to attribute fetched comments to</label>
<input type="text" name="comment_user_id" value="[% conf.comment_user_id %]">
</p>
<p>
- <label for="suppress_alerts">Do not send email alerts on fetched comments to problem creator</label>:
<input type="checkbox" name="suppress_alerts"[% ' checked' IF conf.suppress_alerts %]>
+ <label for="suppress_alerts" class="inline">Do not send email alerts on fetched comments to problem creator</label>
+ </p>
+
+ <p>
+ <input type="checkbox" name="devolved"[% ' checked' IF conf.can_be_devolved %]>
+ <label for="devolved" class="inline">Endpoint lookup can be devolved to contacts</label>
</p>
<p>
diff --git a/templates/web/default/admin/council_edit.html b/templates/web/default/admin/council_edit.html
index 0968d3570..408466b51 100644
--- a/templates/web/default/admin/council_edit.html
+++ b/templates/web/default/admin/council_edit.html
@@ -26,10 +26,38 @@
<strong>[% loc('Email:') %] </strong>
<input type="text" name="email" value="[% contact.email | html %]" size="30">
<input type="checkbox" name="confirmed" value="1" id="confirmed"[% ' checked' IF contact.confirmed %]> <label for="confirmed">[% loc('Confirmed' ) %]</label>
- <input type="checkbox" name="deleted" value="1" id="deleted"[% ' checked' IF contact.deleted %]> <label for="deleted">[% loc('Deleted') %]</label><br>
+ <input type="checkbox" name="deleted" value="1" id="deleted"[% ' checked' IF contact.deleted %]> <label for="deleted">[% loc('Deleted') %]</label>
+ <input type="checkbox" name="non_public" value="1" id="non_public"[% ' checked' IF contact.non_public %]> <label for="non_public">[% loc('Private') %]</label><br>
<strong>[% loc('Note:') %] </strong><textarea name="note" rows="3" cols="40">[% contact.note | html %]</textarea> <br>
+ <h2>[% loc('Configure Endpoint') %]</h2>
+ <form method="post" action="[% c.uri_for('council_contacts', area_id ) %]" enctype="application/x-www-form-urlencoded" accept-charset="utf-8">
+ <p>
+ <label for="endpoint">Endpoint</label>:
+ <input type="text" name="endpoint" id="endpoint" value="[% contact.endpoint %]" size="50">
+ </p>
+
+ <p>
+ <label for="jurisdiction">Jurisdiction</label>:
+ <input type="text" name="jurisdiction" id="jurisdiction" value="[% contact.jurisdiction %]" size="50">
+ </p>
+
+ <p>
+ <label for="api_key">Api Key</label>:
+ <input type="text" name="api_key" id="api_key" value="[% contact.api_key %]" size="25">
+ </p>
+
+ <p>
+ <label for="send_method">Send Method</label>:
+ <select name="send_method">
+ <option value=""> -- Select a method -- </option>
+ [% FOR method IN send_methods %]
+ <option value="[% method %]"[% ' selected' IF contact.send_method == method %]>[% method %]</option>
+ [% END %]
+ </select>
+ </p>
+
<input type="hidden" name="area_id" value="[% area_id %]">
<input type="hidden" name="posted" value="new">
<input type="submit" name="Save changes" value="[% loc('Save changes') %]">
diff --git a/templates/web/default/admin/footer.html b/templates/web/default/admin/footer.html
index 308b1d01b..4c891c4ff 100644
--- a/templates/web/default/admin/footer.html
+++ b/templates/web/default/admin/footer.html
@@ -1,2 +1 @@
-</body>
-</html>
+[% INCLUDE 'footer.html' %]
diff --git a/templates/web/default/admin/header.html b/templates/web/default/admin/header.html
index e0317cca0..93254f5e3 100644
--- a/templates/web/default/admin/header.html
+++ b/templates/web/default/admin/header.html
@@ -1,18 +1,16 @@
-<html>
-<head>
-<title>[% title %] - [% loc('FixMyStreet administration') %]</title>
+[% INCLUDE 'header.html' admin = 1, bodyclass = 'fullwidthpage' %]
<style type="text/css">
dt { clear: left; float: left; font-weight: bold; }
dd { margin-left: 8em; }
-.hidden { color: #666666; }
+.adminhidden { color: #666666; }
.error { color: red; }
+select { width: auto; }
</style>
-</head>
-<body>
- <strong>[% loc('FixMyStreet admin:') %]</strong>
+ <p><strong>[% loc('FixMyStreet admin:') %]</strong>
[%- FOREACH link IN allowed_links %]
<a href="[% c.uri_for( link ) %]">[% allowed_pages.$link.0 %]</a>
- [%- END %]
+ [% IF NOT loop.last %]|[% END %]
+ [% END %]</p>
<h1>[% title %]</h1>
diff --git a/templates/web/default/admin/index.html b/templates/web/default/admin/index.html
index b1eddaa3a..2c5ee55db 100644
--- a/templates/web/default/admin/index.html
+++ b/templates/web/default/admin/index.html
@@ -21,7 +21,7 @@
[% IF c.cobrand.admin_show_creation_graph -%]
<p>
- <a href="[% c.config.BASE_URL %]/bci-live-creation.png">[% loc('Graph of problem creation by status over time') %]</a>
+ <a href="[% c.config.BASE_URL %]/fms-live-creation.png">[% loc('Graph of problem creation by status over time') %]</a>
</p>
[% END -%]
diff --git a/templates/web/default/admin/list_updates.html b/templates/web/default/admin/list_updates.html
index 0a05ba4ac..d21919b16 100644
--- a/templates/web/default/admin/list_updates.html
+++ b/templates/web/default/admin/list_updates.html
@@ -15,7 +15,7 @@
<th>*</th>
</tr>
[% FOREACH update IN updates -%]
- <tr[% ' class="hidden"' IF update.state == 'hidden' || update.problem.state == 'hidden' %]>
+ <tr[% ' class="adminhidden"' IF update.state == 'hidden' || update.problem.state == 'hidden' %]>
<td>[%- IF update.state == 'confirmed' && update.problem.state != 'hidden' -%]
[%- cobrand_data = update.cobrand_data %]
[%- cobrand_data = c.data_for_generic_update IF !update.cobrand %]
diff --git a/templates/web/default/admin/problem_row.html b/templates/web/default/admin/problem_row.html
index 22825429a..5aa8bbfee 100644
--- a/templates/web/default/admin/problem_row.html
+++ b/templates/web/default/admin/problem_row.html
@@ -1,5 +1,5 @@
[%- FOR problem IN problems %]
- <tr[% ' class="hidden"' IF problem.state == 'hidden' %]>
+ <tr[% ' class="adminhidden"' IF problem.state == 'hidden' %]>
<td>[%- IF problem.is_visible -%]
[%- cobrand_data = problem.cobrand_data %]
[%- cobrand_data = c.data_for_generic_problem IF !problem.cobrand %]
diff --git a/templates/web/default/admin/report_edit.html b/templates/web/default/admin/report_edit.html
index 9ef7e8248..ea98a9be9 100644
--- a/templates/web/default/admin/report_edit.html
+++ b/templates/web/default/admin/report_edit.html
@@ -40,6 +40,7 @@
<li>[% loc('Extra data:') %] [% problem.extra ? 'Yes' : 'No' %]</li>
<li>[% loc('Going to send questionnaire?') %] [% IF problem.send_questionnaire %][% loc('Yes') %][% ELSE %][% loc('No') %][% END %]</li>
<li><label for="flagged">[% loc('Flagged:') %]</label> <input type="checkbox" name="flagged"[% ' checked' IF problem.flagged %]></li>
+<li><label for="non_public">[% loc('Private') %]:</label> <input type="checkbox" name="non_public"[% ' checked' IF problem.non_public %]></li>
[% IF problem.photo %]
[% photo = problem.get_photo_params %]
diff --git a/templates/web/default/admin/search_abuse.html b/templates/web/default/admin/search_abuse.html
deleted file mode 100644
index 0984e85cf..000000000
--- a/templates/web/default/admin/search_abuse.html
+++ /dev/null
@@ -1,21 +0,0 @@
-[% INCLUDE 'admin/header.html' title=loc('Search Abuse Table') %]
-
-<form method="get" action="[% c.uri_for('search_abuse') %]" enctype="application/x-www-form-urlencoded" accept-charset="utf-8">
- <label for="search">[% loc('Search:') %]</label> <input type="text" name="search" size="30" id="search">
-</form>
-
-
-[% IF emails.size > 0 %]
-<table cellspacing="0" cellpadding="2" border="1">
- <tr>
- <th>[% loc('Email') %]</th>
- </tr>
-[%- FOREACH foo IN emails %]
- <tr>
- <td>[%- foo.email | html -%]</td>
- </tr>
-[%- END -%]
-</table>
-[% END %]
-
-[% INCLUDE 'admin/footer.html' %]
diff --git a/templates/web/default/admin/search_users.html b/templates/web/default/admin/search_users.html
index 18c964dfe..0b4ba88e7 100644
--- a/templates/web/default/admin/search_users.html
+++ b/templates/web/default/admin/search_users.html
@@ -20,8 +20,8 @@
<td>[% PROCESS value_or_nbsp value=user.name %]</td>
<td><a href="[% c.uri_for( 'search_reports', search => user.email ) %]">[% PROCESS value_or_nbsp value=user.email %]</a></td>
<td>[% PROCESS value_or_nbsp value=user.from_council %]</td>
- <td>[% user.flagged ? loc('Yes') : '&nbsp;' %]</td>
- <td><a href="[% c.uri_for( 'user_edit', user.id ) %]">[% loc('Edit') %]</a></td>
+ <td>[% user.flagged == 2 ? loc('(Email in abuse table)') : user.flagged ? loc('Yes') : '&nbsp;' %]</td>
+ <td>[% IF user.id %]<a href="[% c.uri_for( 'user_edit', user.id ) %]">[% loc('Edit') %]</a>[% END %]</td>
</tr>
[%- END -%]
</table>
diff --git a/templates/web/default/admin/stats.html b/templates/web/default/admin/stats.html
index 3b9f4a264..234600837 100644
--- a/templates/web/default/admin/stats.html
+++ b/templates/web/default/admin/stats.html
@@ -2,7 +2,7 @@
[% IF show_count %]
<p>
-<strong>[% tprintf( loc( '%sreports between %s and %s' ), ( unconfirmed ? loc( 'All' ) _ ' ' : loc( 'Confirmed' ) _ ' ' ), start_date.ymd, end_date.ymd ) | html %]</strong>
+<strong>[% tprintf( unconfirmed ? loc( 'All reports between %s and %s' ) : loc( 'Confirmed reports between %s and %s' ), start_date.ymd, end_date.ymd ) | html %]</strong>
</p>
[% IF bymonth %]
<table>
@@ -73,11 +73,11 @@
</p>
<p>
- <input type="checkbox" name="unconfirmed" id="unconfirmed"[% unconfirmed ? ' checked' : '' %] /><label for="unconfirmed">[% loc('Include unconfirmed reports') %]</label>
+ <input type="checkbox" name="unconfirmed" id="unconfirmed"[% unconfirmed ? ' checked' : '' %] /><label class="inline" for="unconfirmed">[% loc('Include unconfirmed reports') %]</label>
</p>
<p>
- <input type="checkbox" name="bymonth" id="bymonth"[% bymonth ? ' checked' : '' %] /><label for="bymonth">[% loc('By Date') %]</label>
+ <input type="checkbox" name="bymonth" id="bymonth"[% bymonth ? ' checked' : '' %] /><label class="inline" for="bymonth">[% loc('By Date') %]</label>
</p>
<p>
diff --git a/templates/web/default/admin/update_edit.html b/templates/web/default/admin/update_edit.html
index e1783fd7c..1d5ee80b4 100644
--- a/templates/web/default/admin/update_edit.html
+++ b/templates/web/default/admin/update_edit.html
@@ -45,7 +45,7 @@
[% photo = update.get_photo_params %]
<li><img alt="" height="[% photo.height %]" width="[% photo.width %]" src="[% photo.url %]">
<input type="checkbox" id="remove_photo" name="remove_photo" value="1">
-<label for="remove_photo">[% loc("Remove photo (can't be undone!)") %]</label></li>
+<label for="remove_photo" class="inline">[% loc("Remove photo (can't be undone!)") %]</label></li>
[% END %]
</ul>
<input type="submit" name="Submit changes" value="[% loc('Submit changes') %]" ></form>
diff --git a/templates/web/default/around/_report_banner.html b/templates/web/default/around/_report_banner.html
new file mode 100755
index 000000000..024fe08d9
--- /dev/null
+++ b/templates/web/default/around/_report_banner.html
@@ -0,0 +1,10 @@
+<p id="text_map" class="banner">
+ [% loc( 'To <strong>report a problem</strong>, click on the map at the correct location.' ) %]
+ [%
+ tprintf(
+ loc("<small>If you cannot see the map, <a href='%s' rel='nofollow'>skip this step</a>.</small>"),
+ url_skip
+ )
+ %]
+ <span id="text_map_arrow"></span>
+</p>
diff --git a/templates/web/default/around/_updates.html b/templates/web/default/around/_updates.html
new file mode 100755
index 000000000..8110a6c7c
--- /dev/null
+++ b/templates/web/default/around/_updates.html
@@ -0,0 +1,12 @@
+<h1>[% loc('Problems in this area') %]</h1>
+
+<p id="alert_links_area">
+ <a id="email_alert" rel="nofollow" href="[% email_url | html %]">
+ [%- loc('Email me new local problems') -%]
+</a> |
+ <a href="[% rss_url | html %]" id="rss_alert">
+ <span>[% rss_alt %]</span>
+ <img src="/i/feed.png" width="16" height="16" title="[% rss_title %]" alt="[% rss_alt %]" border="0" style="vertical-align: top">
+ </a>
+</p>
+
diff --git a/templates/web/default/around/around_index.html b/templates/web/default/around/around_index.html
index f58d13d80..a143e90a2 100644
--- a/templates/web/default/around/around_index.html
+++ b/templates/web/default/around/around_index.html
@@ -1,34 +1,24 @@
-[% INCLUDE 'header.html', title => loc('Reporting a problem') %]
-
-[%
- # NOTE ON PARTIAL REPORTS:
- #
- # partial reports get a bit of extra text added, the form goes to
- # '/report/new' and the partial hidden field is added to the form.
-%]
-
-[% INCLUDE 'around/postcode_form.html' %]
-
-[% IF location_error %]
- <p class="error">[% location_error %]</p>
-[% END %]
-
-[% IF possible_location_matches %]
- <p>[% loc('We found more than one match for that location. We show up to ten matches, please try a different search if yours is not here.') %]</p>
- <ul class="pc_alternatives">
- [% FOREACH match IN possible_location_matches %]
- <li><a href="/around?latitude=[% match.latitude | uri %];longitude=[% match.longitude | uri %]">[% match.address | html %]</a></li>
- [% END %]
- </ul>
-[% END %]
-
-[% IF partial_token %]
- <p style="margin-top: 0; color: #cc0000;">
- <img align="right" src="/photo/[% report.id %].jpeg" hspace="5">
- [% loc("Thanks for uploading your photo. We now need to locate your problem, so please enter a nearby street name or postcode in the box below&nbsp;:") %]
- </p>
-[% END %]
-
-
+[% INCLUDE 'header.html', title => loc('Reporting a problem'), bodyclass = 'mappage' %]
+
+<form action="[% c.uri_for('/around') %]" method="get" name="mapForm" id="mapForm">
+ <div id="side-form">
+ <div id="report-a-problem-main">
+ [% INCLUDE 'around/postcode_form.html' %]
+
+ [% IF location_error %]
+ <p class="error">[% location_error %]</p>
+ [% END %]
+
+ [% IF possible_location_matches %]
+ <p>[% loc('We found more than one match for that location. We show up to ten matches, please try a different search if yours is not here.') %]</p>
+ <ul class="pc_alternatives">
+ [% FOREACH match IN possible_location_matches %]
+ <li><a href="/around?latitude=[% match.latitude | uri %];longitude=[% match.longitude | uri %]">[% match.address | html %]</a></li>
+ [% END %]
+ </ul>
+ [% END %]
+ </div>
+ </div>
+</form>
[% INCLUDE 'footer.html' %]
diff --git a/templates/web/default/around/display_location.html b/templates/web/default/around/display_location.html
index 88f8b89ae..d50009299 100755
--- a/templates/web/default/around/display_location.html
+++ b/templates/web/default/around/display_location.html
@@ -32,97 +32,72 @@
INCLUDE 'header.html',
title => loc('Viewing a location')
rss => [ loc('Recent local problems, FixMyStreet'), rss_url ],
+ bodyclass => 'mappage',
robots => 'noindex,nofollow';
+
+ allow_creation = !c.cobrand.only_authed_can_create || (c.user && c.user.from_council);
%]
+[% IF allow_creation %]
<form action="[% c.uri_for('/report/new') %]" method="post" name="mapForm" id="mapForm" enctype="multipart/form-data" class="validate">
-[% IF c.req.params.map_override %]
-<input type="hidden" name="map_override" value="[% c.req.params.map_override | html %]">
+ [% IF c.req.params.map_override %]
+ <input type="hidden" name="map_override" value="[% c.req.params.map_override | html %]">
+ [% END %]
+ <input type="hidden" name="pc" value="[% pc | html %]">
+
+ <input type="hidden" name="latitude" id="fixmystreet.latitude" value="[% short_latitude | html %]">
+ <input type="hidden" name="longitude" id="fixmystreet.longitude" value="[% short_longitude | html %]">
[% END %]
-<input type="hidden" name="pc" value="[% pc | html %]">
-<input type="hidden" name="latitude" id="fixmystreet.latitude" value="[% short_latitude | html %]">
-<input type="hidden" name="longitude" id="fixmystreet.longitude" value="[% short_longitude | html %]">
+ [% map_html %]
-[% map_html %]
+ <p id='sub_map_links'>
+ [% IF c.req.params.no_pins %]
+ <a id='hide_pins_link' rel='nofollow' href='[% c.uri_with( { no_pins => 0 } ) %]'>[% loc('Show pins') %]</a>
+ [% ELSE %]
+ <a id='hide_pins_link' rel='nofollow' href='[% c.uri_with( { no_pins => 1 } ) %]'>[% loc('Hide pins') %]</a>
+ [% END %]
+ [% IF c.cobrand.country == 'GB' || c.cobrand.country == 'NO' %]
+ <span class="hidden">|</span>
+ [% IF c.req.params.all_pins %]
+ <a id='all_pins_link' rel='nofollow' href='[% c.uri_with( { no_pins => undef, all_pins => undef } ) %]'>[% loc('Hide old') %]</a>
+ [% ELSE %]
+ <a id='all_pins_link' rel='nofollow' href='[% c.uri_with( { no_pins => undef, all_pins => 1 } ) %]'>[% loc('Show old') %]</a>
+ [% END %]
+ [% END %]
+ </p>
-<p id='sub_map_links'>
- [% IF c.req.params.no_pins %]
- <a id='hide_pins_link' rel='nofollow' href='[% c.uri_with( { no_pins => 0 } ) %]'>[% loc('Show pins') %]</a>
- [% ELSE %]
- <a id='hide_pins_link' rel='nofollow' href='[% c.uri_with( { no_pins => 1 } ) %]'>[% loc('Hide pins') %]</a>
- [% END %]
- [% IF c.cobrand.country == 'GB' || c.cobrand.country == 'NO' %]
- |
- [% IF c.req.params.all_pins %]
- <a id='all_pins_link' rel='nofollow' href='[% c.uri_with( { no_pins => undef, all_pins => undef } ) %]'>[% loc('Hide old') %]</a>
- [% ELSE %]
- <a id='all_pins_link' rel='nofollow' href='[% c.uri_with( { no_pins => undef, all_pins => 1 } ) %]'>[% loc('Show old') %]</a>
+ </div>
+
+
+
+
+ <div id="side">
+
+ [% IF allow_creation %]
+ [% INCLUDE 'around/_report_banner.html' %]
+ [% TRY %][% INCLUDE 'around/extra_text.html' %][% CATCH file %][% END %]
[% END %]
- [% END %]
-</p>
-
-</div>
-<div id="side">
-
-<p id="text_map" class="banner">
- [% loc( 'To <strong>report a problem</strong>, click on the map at the correct location.' ) %]
- [%
- tprintf(
- loc("<small>If you cannot see the map, <a href='%s' rel='nofollow'>skip this step</a>.</small>"),
- url_skip
- )
+
+ [% INCLUDE 'around/_updates.html' %]
+
+ <section class="full-width">
+ [% INCLUDE "around/tabbed_lists.html" %]
+ </section>
+ </div>
+
+ [% IF allow_creation %]
+ <div style="display:none" id="side-form">
+ [% INCLUDE "report/new/fill_in_details_form.html"
+ js = 1,
+ report.used_map = 1
+ report.name = c.user.name
%]
- <span id="text_map_arrow"></span>
-</p>
-
-[% TRY %][% INCLUDE 'around/extra_text.html' %][% CATCH file %][% END %]
-
-<h1>[% loc('Problems in this area') %]</h1>
-
-<p id="alert_links_area">
- <a id="email_alert" rel="nofollow" href="[% email_url | html %]">
- [%- loc('Email me new local problems') -%]
-</a> |
- <a href="[% rss_url | html %]" id="rss_alert">
- <span>[% rss_alt %]</span>
- <img src="/i/feed.png" width="16" height="16" title="[% rss_title %]" alt="[% rss_alt %]" border="0" style="vertical-align: top">
- </a>
-</p>
-
-<div id="nearby_lists">
-
- <h2>[% loc('Reports on and around the map') %]</h2>
-
- <ul id="current">
- [% INCLUDE "around/on_map_list_items.html" %]
- </ul>
-
-
- <h2>
- [%
- tprintf(
- loc( 'Closest nearby problems <small>(within&nbsp;%skm)</small>' ),
- distance
- )
- %]
- </h2>
-
- <ul id="current_near">
- [% INCLUDE "around/around_map_list_items.html" %]
- </ul>
-
-</div>
-
-</div>
-
-<div style="display:none" id="side-form">
-[% INCLUDE "report/new/fill_in_details_form.html"
- js = 1,
- report.used_map = 1
-%]
-</div>
+ </div>
+ [% END %]
+[% IF allow_creation %]
</form>
+[% END %]
[% INCLUDE 'footer.html' %]
diff --git a/templates/web/default/around/tabbed_lists.html b/templates/web/default/around/tabbed_lists.html
new file mode 100755
index 000000000..4ad7b35fc
--- /dev/null
+++ b/templates/web/default/around/tabbed_lists.html
@@ -0,0 +1,23 @@
+<div id="nearby_lists">
+
+ <h2>[% loc('Reports on and around the map') %]</h2>
+
+ <ul id="current">
+ [% INCLUDE "around/on_map_list_items.html" %]
+ </ul>
+
+ <h2>
+ [%
+ tprintf(
+ loc( 'Closest nearby problems <small>(within&nbsp;%skm)</small>' ),
+ distance
+ )
+ %]
+ </h2>
+
+ <ul id="current_near">
+ [% INCLUDE "around/around_map_list_items.html" %]
+ </ul>
+
+</div>
+
diff --git a/templates/web/default/common_header_tags.html b/templates/web/default/common_header_tags.html
index 9d32164f7..4839249ac 100644
--- a/templates/web/default/common_header_tags.html
+++ b/templates/web/default/common_header_tags.html
@@ -1,6 +1,7 @@
[% USE date %][% USE Math %]
<meta http-equiv="content-type" content="text/html; charset=utf-8">
+<script type="text/javascript" src="/js/validation_rules.js?[% Math.int( date.now / 3600 ) %]"></script>
<script type="text/javascript" src="/js/validation_strings.[% lang_code %].js?[% Math.int( date.now / 3600 ) %]"></script>
<script type="text/javascript" src="/jslib/jquery-1.7.2.min.js"></script>
diff --git a/templates/web/default/dashboard/index.html b/templates/web/default/dashboard/index.html
index e3695e5ec..f5a3cfba3 100644
--- a/templates/web/default/dashboard/index.html
+++ b/templates/web/default/dashboard/index.html
@@ -17,6 +17,7 @@
</hgroup>
<div class="filters">
+ [% IF c.cobrand.moniker != 'fixmybarangay' %]
<p>
<label for="ward">Ward:</label>
<select name="ward"><option value=''>All</option>
@@ -25,6 +26,7 @@
[% END %]
</select>
</p>
+ [% END %]
<p>
<label for="category">Report category:</label>
diff --git a/templates/web/default/faq/faq-en-gb.html b/templates/web/default/faq/faq-en-gb.html
index f0030dcb9..26f93afb8 100755
--- a/templates/web/default/faq/faq-en-gb.html
+++ b/templates/web/default/faq/faq-en-gb.html
@@ -190,7 +190,7 @@ rights reserved, Ministry of Justice 100037819&nbsp;2008),
Yahoo! for their BSD-licensed JavaScript libraries, the entire free software
community (this particular project was brought to you by Perl, PostgreSQL,
and the number 161.290) and <a
-href="http://www.m247.com/">M247</a> (who kindly host all
+href="http://www.bytemark.co.uk/">Bytemark</a> (who kindly host all
our servers).
Let us know if we&rsquo;ve missed anyone.</dd>
diff --git a/templates/web/default/index-steps.html b/templates/web/default/index-steps.html
new file mode 100644
index 000000000..8a83abf07
--- /dev/null
+++ b/templates/web/default/index-steps.html
@@ -0,0 +1,25 @@
+<h2>[% loc('How to report a problem') %]</h2>
+
+<ol class="big-numbers">
+[% IF c.cobrand.moniker == 'fixmybarangay' %]
+ <li>Text LUZ or BSN followed by your report to 12345</li>
+ <li>Visit the Barangay Center in person</li>
+ <li>Staff? <a href="/auth">Sign in</a> and click on the map!
+[% ELSE %]
+ <li>[% question %]</li>
+ <li>[% loc('Locate the problem on a map of the area') %]</li>
+ <li>[% loc('Enter details of the problem') %]</li>
+ [% IF c.cobrand.is_council %]
+ <li>Confirm the report and [% c.cobrand.council_name %] will investigate</li>
+ [% ELSIF c.cobrand.moniker == 'zurich' %]
+ [% ELSE %]
+ <li>[% loc('We send it to the council on your behalf') %]</li>
+ [% END %]
+[% END %]
+</ol>
+
+<section class="full-width">
+[% INCLUDE "front/stats.html" %]
+[% TRY %][% INCLUDE "front/tips.html" %][% CATCH file %][% END %]
+</section>
+
diff --git a/templates/web/default/index.html b/templates/web/default/index.html
index 159a595bc..375316000 100644
--- a/templates/web/default/index.html
+++ b/templates/web/default/index.html
@@ -1,4 +1,4 @@
-[% INCLUDE 'header.html', title => '' %]
+[% INCLUDE 'header.html', title = '' %]
[% IF error %]
<p class="error">[% error %]</p>
@@ -8,7 +8,7 @@
[%
subhead
= c.cobrand.moniker == 'southampton'
- ? '(like graffiti, fly tipping, or broken paving slabs)'
+ ? ''
: loc('(like graffiti, fly tipping, broken paving slabs, or street lighting)');
%]
@@ -24,19 +24,7 @@
[% PROCESS 'around/postcode_form.html' %]
<div id="front_intro">
-
- <h2>[% loc('How to report a problem') %]</h2>
-
- <ol>
- <li>[% question %]</li>
- <li>[% loc('Locate the problem on a map of the area') %]</li>
- <li>[% loc('Enter details of the problem') %]</li>
- <li>[% loc('We send it to the council on your behalf') %]</li>
- </ol>
-
- [% INCLUDE "front/stats.html" %]
- [% TRY %][% INCLUDE "front/tips.html" %][% CATCH file %][% END %]
-
+ [% INCLUDE 'index-steps.html' %]
</div>
[%
@@ -44,7 +32,6 @@
probs = c.cobrand.recent();
%]
-
[% IF probs.size || recent_photos.size %]
<div id="front_recent">
<h2>[% loc('Recently reported problems') %]</h2>
@@ -58,8 +45,6 @@
[% END %]
[% IF probs.size %]
-
-
<ul id="nearby_lists">
[% FOREACH p IN probs %]
<li>
diff --git a/templates/web/default/js/validation_rules.html b/templates/web/default/js/validation_rules.html
new file mode 100644
index 000000000..409d0971f
--- /dev/null
+++ b/templates/web/default/js/validation_rules.html
@@ -0,0 +1,7 @@
+ validation_rules = {
+ title: { required: true },
+ detail: { required: true },
+ email: { required: true },
+ update: { required: true },
+ rznvy: { required: true }
+ };
diff --git a/templates/web/default/js/validation_strings.html b/templates/web/default/js/validation_strings.html
index 3148d1993..c33bd2b81 100644
--- a/templates/web/default/js/validation_strings.html
+++ b/templates/web/default/js/validation_strings.html
@@ -17,5 +17,7 @@
},
fms_extra_title: '[% loc('Please enter your title') | replace("'", "\\'") %]',
first_name: '[% loc('Please enter your first name') | replace("'", "\\'") %]',
- last_name: '[% loc('Please enter your second name') | replace("'", "\\'") %]'
+ last_name: '[% loc('Please enter your second name') | replace("'", "\\'") %]',
+ geolocate: '[% loc('or locate me automatically') | replace("'", "\\'") %]',
+ report_problem_heading: '[% loc('Click map to report a problem') | replace("'", "\\'") %]'
};
diff --git a/templates/web/default/maps/openlayers.html b/templates/web/default/maps/openlayers.html
index e815642f1..b75e2bbd8 100644
--- a/templates/web/default/maps/openlayers.html
+++ b/templates/web/default/maps/openlayers.html
@@ -8,7 +8,7 @@
<script type="text/javascript">
var fixmystreet = {
'page': '[% page %]',
- 'area': '[% map.area %]',
+ 'area': [ [% map.area.join(',') %] ],
'all_pins': '[% all_pins %]',
'latitude': [% map.latitude %],
'longitude': [% map.longitude %],
diff --git a/templates/web/default/questionnaire/completed-open.html b/templates/web/default/questionnaire/completed-open.html
index 7c5469259..06e17cc0b 100644
--- a/templates/web/default/questionnaire/completed-open.html
+++ b/templates/web/default/questionnaire/completed-open.html
@@ -1,5 +1,11 @@
+[% IF c.cobrand.is_council %]
+<p style="font-size: 150%">
+Thank you very much for filling in our questionnaire.
+</p>
+[% ELSE %]
[% loc('<p style="font-size:150%">We&rsquo;re sorry to hear that. We have two
suggestions: why not try writing to your local representative or, if it&rsquo;s
a problem that could be fixed by local people working together, why not
<a href="http://www.pledgebank.com/new">make and publicise a pledge</a>?
</p>') %]
+[% END %]
diff --git a/templates/web/default/questionnaire/completed.html b/templates/web/default/questionnaire/completed.html
index a125d48bd..52c20652c 100644
--- a/templates/web/default/questionnaire/completed.html
+++ b/templates/web/default/questionnaire/completed.html
@@ -10,12 +10,12 @@
get some more information about the status of your problem, please come back to the
site and leave an update.</p>') %]
-[% ELSIF new_state == 'confirmed' OR (!new_state AND problem.is_open) %]
+[% ELSIF new_state == 'confirmed' OR (!new_state AND problem.is_open) OR (!new_state AND problem.is_closed) %]
[% INCLUDE 'questionnaire/completed-open.html' %]
[% advert_outcome = 0 %]
-[% ELSE %]
+[% ELSIF been_fixed == 'Yes' %]
[% loc('<p style="font-size:150%">Thank you very much for filling in our questionnaire; glad to hear it&rsquo;s been fixed.</p>') %]
diff --git a/templates/web/default/questionnaire/index.html b/templates/web/default/questionnaire/index.html
index 5b48f8915..6783bca57 100644
--- a/templates/web/default/questionnaire/index.html
+++ b/templates/web/default/questionnaire/index.html
@@ -80,9 +80,13 @@ href="http://www.emptyhomes.com/getinvolved/campaign.html">http://www.emptyhomes
</p>
[% END %]
+[% IF c.cobrand.moniker == 'southampton' %]
+<p>Add a public update (please note it will not be sent to the council)</p>
+[% ELSE %]
<p>[% loc('If you wish to leave a public update on the problem, please enter it here
(please note it will not be sent to the council). For example, what was
your experience of getting the problem fixed?') %]</p>
+[% END %]
<p><textarea name="update" style="max-width:90%" rows="7" cols="30">[% update | html %]</textarea></p>
diff --git a/templates/web/default/report/_main.html b/templates/web/default/report/_main.html
index 3a9e60e7b..b9779db69 100644
--- a/templates/web/default/report/_main.html
+++ b/templates/web/default/report/_main.html
@@ -1,20 +1,27 @@
-<h1>[% problem.title | html %]</h1>
+<div class="problem-header cf">
+ <h1>[% problem.title | html %]</h1>
-<p><em>[% problem.meta_line(c) | html %]
-[% IF problem.council %]
- [% IF problem.whensent || problem.can_display_external_id %]
- <small class="council_sent_info"><br>
- [% problem.processed_summary_string(c) %]
- </small>
- [% END %]
-[% ELSE %]
-<br><small>[% loc('Not reported to council') %]</small>
-[% END %]
-
-</em></p>
-
-[% add_links( problem.detail ) | html_para %]
-
-[% INCLUDE 'report/photo.html' object=problem center=1 %]
+ <p><em>
+ [% problem.meta_line(c) | html %]
+ [%- IF !problem.used_map %]; <strong>[% loc('there is no pin shown as the user did not use the map') %]</strong>[% END %]
+ [% IF problem.council %]
+ [% IF problem.whensent || problem.can_display_external_id %]
+ <small class="council_sent_info"><br>
+ [% problem.processed_summary_string(c) %]
+ </small>
+ [% END %]
+ [% ELSE %]
+ <br><small>[% loc('Not reported to council') %]</small>
+ [% END %]
+ </em></p>
+ [% INCLUDE 'report/_support.html' %]
+ [% IF c.cobrand.moniker == 'southampton' %]
+ [% add_links( problem.detail ) | html_para %]
+ [% INCLUDE 'report/photo.html' object=problem %]
+ [% ELSE %]
+ [% INCLUDE 'report/photo.html' object=problem %]
+ [% add_links( problem.detail ) | html_para %]
+ [% END %]
+</div>
diff --git a/templates/web/default/report/_support.html b/templates/web/default/report/_support.html
new file mode 100644
index 000000000..e8b958940
--- /dev/null
+++ b/templates/web/default/report/_support.html
@@ -0,0 +1,11 @@
+[% IF c.cobrand.can_support_problems %]
+<p id="supporter"><small>
+ [% IF !problem.interest_count %][% text=loc('No supporters') %][% ELSIF problem.interest_count == 1 %][% text = loc('1 supporter') %][% ELSE %][% text = tprintf( loc('%d supporters' ), problem.interest_count ) %][% END %]
+ [% IF c.user && c.user.from_council %]<form action="[% c.uri_for( '/report/support' ) %]">
+ [% text %] <input type="hidden" name="id" value="[% problem.id %]"><input type="submit" class="green-btn" value="Add support">
+ </form>
+ [% ELSE %]
+ [% text %]
+ [% END %]
+</small></p>
+[% END %]
diff --git a/templates/web/default/report/display.html b/templates/web/default/report/display.html
index 2ac58d9a9..18b4bf51a 100644
--- a/templates/web/default/report/display.html
+++ b/templates/web/default/report/display.html
@@ -44,175 +44,8 @@
</div>
[% INCLUDE 'report/updates.html' %]
-
-<div id="update_form">
-
- <h2>
- [% loc( 'Provide an update') %]
- </h2>
-
- [% IF c.cobrand.moniker != 'emptyhomes' %]
- <p>
- <small>[% loc( 'Please note that updates are not sent to the council. If you leave your name it will be public. Your information will only be used in accordance with our <a href="/faq#privacy">privacy policy</a>' ) %]</small>
- </p>
- [% END %]
-
- [% INCLUDE 'errors.html' %]
-
- <form method="post" action="[% c.uri_for( '/report/update' ) %]" name="updateForm" class="fieldset validate"[% IF c.cobrand.allow_photo_upload %] enctype="multipart/form-data"[% END %]>
-
- <input type="hidden" name="submit_update" value="1">
- <input type="hidden" name="id" value="[% problem.id | html %]">
-
- [% IF field_errors.update %]
- <div class='form-error'>[% field_errors.update %]</div>
- [% END %]
- <div class="form-field">
- <label for="form_update">[% loc( 'Update:' ) %]</label>
- <textarea name="update" id="form_update" rows="7" cols="30" required>[% update.text | html %]</textarea>
- </div>
-
- [% IF c.user && c.user.belongs_to_council( problem.council ) %]
- <div class="form-field">
- <label for="form_state">[% loc( 'State:' ) %]</label>
- <select name="state" id="form_state">
- [% FOREACH state IN [ ['confirmed', loc('Open')], ['investigating',
- loc('Investigating')], ['action scheduled', loc('Action Scheduled')],
- ['in progress', loc('In Progress')], ['duplicate', loc('Duplicate')],
- ['unable to fix', loc('Unable to fix')], ['not responsible', loc('Not Responsible')],
- ['fixed', loc('Fixed')] ] %]
- <option [% 'selected ' IF state.0 == problem.state %] value="[% state.0 %]">[% state.1 %]</option>
- [% END %]
- </select>
- </div>
- [% ELSE %]
- [% IF problem.is_fixed AND c.user_exists AND c.user.id == problem.user_id %]
- <div class="checkbox">
- <input type="checkbox" name="reopen" id="form_reopen" value="1"[% ' checked' IF update.mark_open %]>
- <label for="form_reopen">[% loc('This problem has not been fixed') %]</label>
- </div>
- [% ELSIF !problem.is_fixed %]
- <div class="checkbox">
- <input type="checkbox" name="fixed" id="form_fixed" value="1"[% ' checked' IF update.mark_fixed %]>
- <label for="form_fixed">[% loc('This problem has been fixed') %]</label>
- </div>
- [% END %]
- [% END %]
-
- [% IF c.cobrand.allow_photo_upload %]
- [% IF field_errors.photo %]
- <div class='form-error'>[% field_errors.photo %]</div>
- [% END %]
- <div id="fileupload_normalUI">
- [% IF upload_fileid %]
- <p>[% loc('You have already attached a photo to this update, attaching another one will replace it.') %]</p>
- <input type="hidden" name="upload_fileid" value="[% upload_fileid %]">
- [% END %]
- <label for="form_photo">[% loc('Photo:') %]</label>
- <input type="file" name="photo" id="form_photo" style="width:20em">
- </div>
- [% END %]
-
-[% IF c.user_exists %]
-
- [% INCLUDE name %]
-
- <div class="checkbox">
- <input type="submit" id="update_post" value="[% loc('Post') %]">
- </div>
-
-[% ELSE %]
-
- [% IF field_errors.email %]
- <div class='form-error'>[% field_errors.email %]</div>
- [% END %]
- <div class="form-field">
- <label for="form_rznvy">[% loc('Your email:' ) %]</label>
- <input type="email" name="rznvy" id="form_rznvy" value="[% update.user.email | html %]" size="30" required>
- </div>
-
-<div id="form_sign_in">
- <h3>[% loc("Now to submit your update&hellip; do you have a FixMyStreet password?") %]</h3>
-
- <div id="form_sign_in_yes">
-
- [% IF field_errors.password %]
- <div class='form-error'>[% field_errors.password %]</div>
- [% END %]
-
- <p>
- <label class="n" for="password_sign_in">[% loc('<strong>Yes</strong> I have a password') %]</label>
- <input type="password" name="password_sign_in" id="password_sign_in" value="" size="25">
- </p>
-
- <div class="fieldset">
-
- <p>
- <input type="checkbox" id="remember_me" name="remember_me" value='1'[% ' checked' IF remember_me %]>
- <label class="n" for="remember_me">
- [% loc('Keep me signed in on this computer') %]
- </label>
- </p>
-
- <p>
- <input type="submit" name="submit_sign_in" id="submit_sign_in" value="[% loc('Post') %]">
- </p>
-
- </div>
-
- </div>
- <div id="form_sign_in_no">
-
- <p>[% loc('<strong>No</strong>, let me confirm my update by email:') %]</p>
-
- <div class="fieldset">
-
- [% INCLUDE name %]
-
- <div class="form-field">
- <label for="password_register">[% loc('Enter a new password:') %]</label>
- <input type="password" name="password_register" id="password_register" value="" size="25">
- </div>
-
- <p style="clear:both"><small>[% loc('Providing a password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports.') %]</small></p>
-
- <p>
- <input type="submit" name="submit_register" id="submit_register" value="[% loc('Post') %]">
- </p>
-
- </div>
-
- </div>
-
-</div>
-
-[% END %]
-
- </form>
-</div>
+[% INCLUDE 'report/update-form.html' %]
</div>
[% INCLUDE 'footer.html' %]
-
-[% BLOCK name %]
- [% IF field_errors.name %]
- <div class='form-error'>[% field_errors.name %]</div>
- [% END %]
-
- <div>
- <label for="form_name">[% loc('Your name:') %]</label>
- <input type="text" name="name" id="form_name" value="[% update.name || c.user.name | html %]" size="25">
- </div>
-
- <div class="checkbox">
- <input type="checkbox" name="may_show_name" id="form_may_show_name" value="1"[% ' checked' UNLESS update.anonymous %]>
- <label for="form_may_show_name">[% loc('Show my name publicly') %]</label>
- <small>[% loc('(we never show your email)') %]</small>
- </div>
-
- <div class="checkbox">
- <input type="checkbox" name="add_alert" id="form_add_alert" value="1"[% ' checked' IF add_alert %]>
- <label for="form_add_alert">[% loc( 'Alert me to future updates' ) %]</label>
- </div>
-[% END %]
diff --git a/templates/web/default/report/new/category.html b/templates/web/default/report/new/category.html
index 8bff539c4..49be4d25d 100644
--- a/templates/web/default/report/new/category.html
+++ b/templates/web/default/report/new/category.html
@@ -3,7 +3,7 @@
[% IF category;
category = category | lower;
END; %]
- <label for='form_category'>[% category_label | html %]</label>
+ <label for='form_category' id="form_category_label">[% category_label | html %]</label>
<select name='category' id='form_category'[% ' onchange="form_category_onchange()"' IF category_extras.size %]>
[% FOREACH cat_op IN category_options %]
[% cat_op_lc = cat_op | lower %]
diff --git a/templates/web/default/report/new/category_extras.html b/templates/web/default/report/new/category_extras.html
index 7be69e30c..928b61041 100644
--- a/templates/web/default/report/new/category_extras.html
+++ b/templates/web/default/report/new/category_extras.html
@@ -13,8 +13,8 @@
<label for="form_[% meta_name %]">[% meta.description _ ':' %]</label>
[% IF meta.exists('values') %]
<select name="[% meta_name %]" id="form_[% meta_name %]"[% meta.required == 'true' ? ' required' : '' %]>
- [% FOR option IN meta.values.value.keys %]
- <option value="[% meta.values.value.$option.key %]">[% option %]</option>
+ [% FOR option IN meta.values.value.value %]
+ <option value="[% option.key.0 %]"[% IF option.key.0 == report_meta.$meta_name.value %] selected[% END %]>[% option.name.0 %]</option>
[% END %]
</select>
[% ELSE %]
diff --git a/templates/web/default/report/new/fill_in_details_form.html b/templates/web/default/report/new/fill_in_details_form.html
index 9c9451914..0befb344e 100644
--- a/templates/web/default/report/new/fill_in_details_form.html
+++ b/templates/web/default/report/new/fill_in_details_form.html
@@ -206,7 +206,7 @@
<div class="checkbox">
[%# if there is nothing in the name field then set check box as default on form %]
- <input type="checkbox" name="may_show_name" id="form_may_show_name" value="1"[% ' checked' IF !report.anonymous %]>
+ <input type="checkbox" name="may_show_name" id="form_may_show_name" value="1"[% ' checked' IF report.anonymous==0 OR (c.cobrand.default_show_name AND report.anonymous=='') %]>
<label for="form_may_show_name">[% loc('Show my name publicly') %]</label>
<br><small>[% loc('(we never show your email address or phone number)') %]</small>
</div>
diff --git a/templates/web/default/report/new/notes.html b/templates/web/default/report/new/notes.html
index be605ddaa..68408acc7 100644
--- a/templates/web/default/report/new/notes.html
+++ b/templates/web/default/report/new/notes.html
@@ -4,7 +4,7 @@
<li>[% loc("We will only use your personal information in accordance with our <a href=\"/faq#privacy\">privacy policy.</a>") %]</li>
<li>[% loc("Please be polite, concise and to the point.") %]</li>
- <li>[% loc("Please do not be abusive &mdash; abusing your council devalues the service for all users.") %]</li>
+ <li>[% loc("Please do not be abusive&nbsp;&mdash; abusing your council devalues the service for all users.") %]</li>
<li>[% loc("Writing your message entirely in block capitals makes it hard to read, as does a lack of punctuation.") %]</li>
<li>[% loc("Remember that FixMyStreet is primarily for reporting physical problems that can be fixed. If your problem is not appropriate for submission via this site remember that you can contact your council directly using their own website.") %]</li>
diff --git a/templates/web/default/report/photo.html b/templates/web/default/report/photo.html
index 451a0479c..02ab9228b 100644
--- a/templates/web/default/report/photo.html
+++ b/templates/web/default/report/photo.html
@@ -1,6 +1,8 @@
[% IF c.cobrand.allow_photo_display && object.photo %]
[% photo = object.get_photo_params %]
-<p[% ' align="center"' IF center %]>
- <img alt="" height="[% photo.height %]" width="[% photo.width %]" src="[% photo.url %]">
-</p>
+<div class="update-img">
+ [% IF photo.url_full %]<a href="[% photo.url_full %]" rel="fancy">[% END
+ %]<img alt="Photo of this report" [% IF photo.height %]height="[% photo.height %]" width="[% photo.width %]"[% END %] src="[% photo.url %]">
+ [%- IF photo.url_full %]<span>zoom</span></a>[% END %]
+</div>
[% END %]
diff --git a/templates/web/default/report/update-form.html b/templates/web/default/report/update-form.html
new file mode 100644
index 000000000..d993ce28f
--- /dev/null
+++ b/templates/web/default/report/update-form.html
@@ -0,0 +1,165 @@
+<div id="update_form">
+
+ <h2>[% loc( 'Provide an update') %]</h2>
+
+ [% IF c.cobrand.moniker != 'emptyhomes' %]
+ <p>
+ <small>[% loc( 'Please note that updates are not sent to the council. If you leave your name it will be public. Your information will only be used in accordance with our <a href="/faq#privacy">privacy policy</a>' ) %]</small>
+ </p>
+ [% END %]
+
+ [% INCLUDE 'errors.html' %]
+
+ <form method="post" action="[% c.uri_for( '/report/update' ) %]" name="updateForm" class="fieldset validate"[% IF c.cobrand.allow_photo_upload %] enctype="multipart/form-data"[% END %]>
+
+ <input type="hidden" name="submit_update" value="1">
+ <input type="hidden" name="id" value="[% problem.id | html %]">
+
+ [% IF field_errors.update %]
+ <div class='form-error'>[% field_errors.update %]</div>
+ [% END %]
+ <div class="form-field">
+ <label for="form_update">[% loc( 'Update:' ) %]</label>
+ <textarea name="update" id="form_update" rows="7" cols="30" required>[% update.text | html %]</textarea>
+ </div>
+
+ [% IF c.user && c.user.belongs_to_council( problem.council ) %]
+ <div class="form-field">
+ <label for="form_state">[% loc( 'State:' ) %]</label>
+ <select name="state" id="form_state">
+ [% FOREACH state IN [ ['confirmed', loc('Open')], ['investigating',
+ loc('Investigating')], ['action scheduled', loc('Action Scheduled')],
+ ['in progress', loc('In Progress')], ['duplicate', loc('Duplicate')],
+ ['unable to fix', loc('Unable to fix')], ['not responsible', loc('Not Responsible')],
+ ['fixed', loc('Fixed')] ] %]
+ <option [% 'selected ' IF state.0 == problem.state %] value="[% state.0 %]">[% state.1 %]</option>
+ [% END %]
+ </select>
+ </div>
+ [% ELSE %]
+ [% IF problem.is_fixed AND c.user_exists AND c.user.id == problem.user_id %]
+ <div class="checkbox">
+ <input type="checkbox" name="reopen" id="form_reopen" value="1"[% ' checked' IF update.mark_open %]>
+ <label class="inline" for="form_reopen">[% loc('This problem has not been fixed') %]</label>
+ </div>
+ [% ELSIF !problem.is_fixed %]
+ <div class="checkbox">
+ <input type="checkbox" name="fixed" id="form_fixed" value="1"[% ' checked' IF update.mark_fixed %]>
+ <label class="inline" for="form_fixed">[% loc('This problem has been fixed') %]</label>
+ </div>
+ [% END %]
+ [% END %]
+
+ [% IF c.cobrand.allow_photo_upload %]
+ [% IF field_errors.photo %]
+ <div class='form-error'>[% field_errors.photo %]</div>
+ [% END %]
+ <div id="fileupload_normalUI">
+ [% IF upload_fileid %]
+ <p>[% loc('You have already attached a photo to this update, attaching another one will replace it.') %]</p>
+ <input type="hidden" name="upload_fileid" value="[% upload_fileid %]">
+ [% END %]
+ <label for="form_photo">[% loc('Photo:') %]</label>
+ <input type="file" name="photo" id="form_photo" style="width:20em">
+ </div>
+ [% END %]
+
+[% IF c.user_exists %]
+
+ [% INCLUDE name %]
+
+ <div class="checkbox">
+ <input type="submit" id="update_post" value="[% loc('Post') %]">
+ </div>
+
+[% ELSE %]
+
+ [% IF field_errors.email %]
+ <div class='form-error'>[% field_errors.email %]</div>
+ [% END %]
+ <div class="form-field">
+ <label for="form_rznvy">[% loc('Your email:' ) %]</label>
+ <input type="email" name="rznvy" id="form_rznvy" value="[% update.user.email | html %]" size="30" required>
+ </div>
+
+<div id="form_sign_in">
+ <h3>[% loc("Now to submit your update&hellip; do you have a FixMyStreet password?") %]</h3>
+
+ <div id="form_sign_in_yes">
+
+ [% IF field_errors.password %]
+ <div class='form-error'>[% field_errors.password %]</div>
+ [% END %]
+
+ <p>
+ <label class="n" for="password_sign_in">[% loc('<strong>Yes</strong> I have a password') %]</label>
+ <input type="password" name="password_sign_in" id="password_sign_in" value="" size="25">
+ </p>
+
+ <div class="fieldset">
+
+ <p>
+ <input type="checkbox" id="remember_me" name="remember_me" value='1'[% ' checked' IF remember_me %]>
+ <label class="n" for="remember_me">
+ [% loc('Keep me signed in on this computer') %]
+ </label>
+ </p>
+
+ <p>
+ <input type="submit" name="submit_sign_in" id="submit_sign_in" value="[% loc('Post') %]">
+ </p>
+
+ </div>
+
+ </div>
+ <div id="form_sign_in_no">
+
+ <p>[% loc('<strong>No</strong>, let me confirm my update by email:') %]</p>
+
+ <div class="fieldset">
+
+ [% INCLUDE name %]
+
+ <div class="form-field">
+ <label for="password_register">[% loc('Enter a new password:') %]</label>
+ <input type="password" name="password_register" id="password_register" value="" size="25">
+ </div>
+
+ <p style="clear:both"><small>[% loc('Providing a password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports.') %]</small></p>
+
+ <p>
+ <input type="submit" name="submit_register" id="submit_register" value="[% loc('Post') %]">
+ </p>
+
+ </div>
+
+ </div>
+
+</div>
+
+[% END %]
+
+ </form>
+</div>
+
+[% BLOCK name %]
+ [% IF field_errors.name %]
+ <div class='form-error'>[% field_errors.name %]</div>
+ [% END %]
+
+ <div>
+ <label for="form_name">[% loc('Your name:') %]</label>
+ <input type="text" name="name" id="form_name" value="[% update.name || c.user.name | html %]" size="25">
+ </div>
+
+ <div class="checkbox">
+ <input type="checkbox" name="may_show_name" id="form_may_show_name" value="1"[% ' checked' IF update.anonymous==0 OR (c.cobrand.default_show_name AND update.anonymous=='') %]>
+ <label for="form_may_show_name">[% loc('Show my name publicly') %]</label>
+ <small>[% loc('(we never show your email)') %]</small>
+ </div>
+
+ <div class="checkbox">
+ <input type="checkbox" name="add_alert" id="form_add_alert" value="1"[% ' checked' IF add_alert %]>
+ <label class="inline" for="form_add_alert">[% loc( 'Alert me to future updates' ) %]</label>
+ </div>
+[% END %]
diff --git a/templates/web/default/report_created.html b/templates/web/default/report_created.html
new file mode 100644
index 000000000..81083654b
--- /dev/null
+++ b/templates/web/default/report_created.html
@@ -0,0 +1,9 @@
+[% INCLUDE 'header.html', title => loc('Report created') %]
+
+<h1>[% loc("Report created") %]</h1>
+
+<p>
+[% loc('Your report has been created and will shortly be sent.') %]
+</p>
+
+[% INCLUDE 'footer.html' %]
diff --git a/templates/web/default/reports/council.html b/templates/web/default/reports/body.html
index 134c9d4fc..134c9d4fc 100755
--- a/templates/web/default/reports/council.html
+++ b/templates/web/default/reports/body.html
diff --git a/templates/web/default/reports/index.html b/templates/web/default/reports/index.html
index 283df5285..76c2afcd2 100755
--- a/templates/web/default/reports/index.html
+++ b/templates/web/default/reports/index.html
@@ -34,6 +34,7 @@
<td class="data">[% fixed.${area.id}.new or 0 %]</td>
<td class="data">[% fixed.${area.id}.old or 0 %]</td>
</tr>
+[% TRY %][% PROCESS "reports/_extras.html" %][% CATCH file %][% END %]
[% END %]
</tbody>
</table>
diff --git a/templates/web/default/reports/ward.html b/templates/web/default/reports/ward.html
index 8b65ffb28..4b2ea29a5 100755
--- a/templates/web/default/reports/ward.html
+++ b/templates/web/default/reports/ward.html
@@ -1 +1 @@
-[% INCLUDE reports/council.html %]
+[% INCLUDE reports/body.html %]
diff --git a/templates/web/emptyhomes/faq/faq-cy.html b/templates/web/emptyhomes/faq/faq-cy.html
index 3bea990c8..c462b9719 100644
--- a/templates/web/emptyhomes/faq/faq-cy.html
+++ b/templates/web/emptyhomes/faq/faq-cy.html
@@ -54,7 +54,7 @@ Os taw’r llywodraeth neu un o’i hasiantaethau sy’n berchen ar yr eiddo gwa
, Y Weinyddiaeth Gyfiawnder 100037819&nbsp;2008),
Yahoo! am eu llyfrgelloedd JavaScript wedi’u trwyddedu gan BSD, y gymuned meddalwedd am ddim gyfan (daethpwyd â’r prosiect arbennig hwn i chi gan Perl, PostgreSQL,
a’r rhif 161.290) ac <a
- href="http://www.m247.com/">M247</a> (sydd mor garedig â gwesteia’n holl weinyddion).
+ href="http://www.bytemark.co.uk/">Bytemark</a> (sydd mor garedig â gwesteia’n holl weinyddion).
Rhowch wybod i ni os ydym wedi hepgor unrhyw un.</dd>
diff --git a/templates/web/emptyhomes/faq/faq-en-gb.html b/templates/web/emptyhomes/faq/faq-en-gb.html
index 9f66613a7..e010ddae0 100755
--- a/templates/web/emptyhomes/faq/faq-en-gb.html
+++ b/templates/web/emptyhomes/faq/faq-en-gb.html
@@ -98,7 +98,7 @@ rights reserved, Ministry of Justice 100037819&nbsp;2008),
Yahoo! for their BSD-licensed JavaScript libraries, the entire free software
community (this particular project was brought to you by Perl, PostgreSQL,
and the number 161.290) and <a
-href="http://www.m247.com/">M247</a> (who kindly host all
+href="http://www.bytemark.co.uk/">Bytemark</a> (who kindly host all
our servers).
Let us know if we&rsquo;ve missed anyone.</dd>
diff --git a/templates/web/emptyhomes/report/display.html b/templates/web/emptyhomes/report/display.html
index e9a101e3e..545a4ca44 100644
--- a/templates/web/emptyhomes/report/display.html
+++ b/templates/web/emptyhomes/report/display.html
@@ -9,7 +9,7 @@
[% IF problem.is_fixed %]
<p class="banner" id="fixed">
- [% loc('This problem has been fixed') . '.' %];
+ [% loc('This problem has been fixed') %].
</p>
[% END %]
diff --git a/templates/web/emptyhomes/reports/council.html b/templates/web/emptyhomes/reports/body.html
index 8ba9bf1ca..8ba9bf1ca 100755
--- a/templates/web/emptyhomes/reports/council.html
+++ b/templates/web/emptyhomes/reports/body.html
diff --git a/templates/web/fixmybarangay/_barangay_buttons.html b/templates/web/fixmybarangay/_barangay_buttons.html
new file mode 100644
index 000000000..2925a487d
--- /dev/null
+++ b/templates/web/fixmybarangay/_barangay_buttons.html
@@ -0,0 +1,4 @@
+<p id="barangay_buttons">
+ <a href="/around?latitude=10.322;longitude=123.907" class="yellow-btn">Bgy. Luz</a>
+ <a href="/around?latitude=10.288;longitude=123.870" class="yellow-btn">Bgy. Basak San Nicolas</a>
+</p>
diff --git a/templates/web/fixmybarangay/alert/_list.html b/templates/web/fixmybarangay/alert/_list.html
new file mode 100644
index 000000000..8491b4562
--- /dev/null
+++ b/templates/web/fixmybarangay/alert/_list.html
@@ -0,0 +1,45 @@
+ <input type="hidden" name="type" value="local">
+ <input type="hidden" name="pc" value="[% pc | html %]">
+
+
+ <p>
+ [% loc("Subscribe to an alert based upon what baranagay you&rsquo;re in:") %]
+ </p>
+
+ [% INCLUDE 'errors.html' %]
+
+ <div id="rss_list">
+ <p><strong>
+ [% loc('Problems within the boundary of:') %]
+ </strong></p>
+ <ul class="plain-list">
+
+ [% FOREACH option IN options %]
+ <li[% IF ! (loop.count % 2) %] class="a"[% END %]>
+ <input type="radio" name="feed" id="[% option.id %]" value="[% option.id %]"[% IF option.id == selected_feed %] checked[% END %]>
+ <label class="inline" for="[% option.id %]">[% option.text %]</label>
+ <a href="[% option.uri %]"><img src="/i/feed.png" width="16" height="16"
+title="[% option.rss_text %]" alt="RSS feed" border="0"></a>
+ </li>
+ [% END %]
+</ul>
+
+ <p>
+ <input type="submit" name="rss" value="[% loc('Give me an RSS feed') %]">
+ <p>
+
+ <p id="alert_or">
+ [% loc('or') %]
+ </p>
+
+ [% UNLESS c.user_exists %]
+ <p>
+ [% loc('Your email:') %] <input type="text" id="rznvy" name="rznvy" value="[% rznvy | html %]" size="30">
+ </p>
+ [% END %]
+
+ <p>
+ <input type="submit" name="alert" value="[% loc('Subscribe me to an email alert') %]">
+ </p>
+ </div> <!-- ???? -->
+
diff --git a/templates/web/fixmybarangay/alert/index.html b/templates/web/fixmybarangay/alert/index.html
new file mode 100644
index 000000000..d9bb74ee9
--- /dev/null
+++ b/templates/web/fixmybarangay/alert/index.html
@@ -0,0 +1,45 @@
+[% INCLUDE 'header.html', title = loc('Local RSS feeds and email alerts'), bodyclass = 'twothirdswidthpage' %]
+
+<h1>[% loc('Local RSS feeds and email alerts') %]</h1>
+
+<p>
+FixMyBarangay has a RSS feeds and email alerts for local problems.
+</p>
+
+[% IF location_error %]
+ <div class="error">[% location_error %]</div>
+[% ELSE %]
+ [% INCLUDE 'errors.html' %]
+[% END %]
+
+[% options = [ {
+ id => 'council:1:Luz',
+ text => 'Luz',
+ uri => '/rss/reports/Luz'
+ },
+ {
+ id => 'council:2:Basak_San_Nicolas',
+ text => 'Basak San Nicolas'
+ uri => '/rss/reports/Basak+San_Nicolas'
+ } ];
+%]
+
+<form id="alerts" name="alerts" method="post" action="/alert/subscribe">
+
+[% IF photos.size %]
+<div class="sticky-sidebar" id="alert_recent">
+ <aside>
+ <h2>[% loc('Some photos of recent reports') %]</h2>
+ [% FOREACH p IN photos %]
+ <a href="/report/[% p.id %]"><img border="0" height="100"
+ src="/photo/[% p.id %].tn.jpeg" alt="[% p.title | html %]" title="[% p.title | html %]"></a>
+ [% END %]
+ </aside>
+</div>
+[% END %]
+
+[% INCLUDE 'alert/_list.html' %]
+
+</form>
+
+[% INCLUDE 'footer.html' %]
diff --git a/templates/web/fixmybarangay/around/tabbed_lists.html b/templates/web/fixmybarangay/around/tabbed_lists.html
new file mode 100644
index 000000000..c9f1c2a38
--- /dev/null
+++ b/templates/web/fixmybarangay/around/tabbed_lists.html
@@ -0,0 +1,18 @@
+[% allow_creation = !c.cobrand.only_authed_can_create || (c.user && c.user.from_council);
+
+IF allow_creation %]
+<menu id="problems-nav" class="tab-nav">
+ <ul>
+ <li><a href="#current">Problems on the map</a></li>
+ <li><a href="#message_manager">Problems via text</a></li>
+ </ul>
+</menu>
+[% END %]
+
+<ul id="current" class="issue-list-a tab">
+ [% INCLUDE "around/on_map_list_items.html" %]
+</ul>
+
+[% IF allow_creation %]
+ [% INCLUDE 'report/_message_manager.html' %]
+[% END %]
diff --git a/templates/web/fixmybarangay/auth/sign_out.html b/templates/web/fixmybarangay/auth/sign_out.html
new file mode 100644
index 000000000..11888089a
--- /dev/null
+++ b/templates/web/fixmybarangay/auth/sign_out.html
@@ -0,0 +1,8 @@
+[% INCLUDE 'header.html', title = loc('Sign out'), bodyclass = 'fullwidthpage' %]
+
+<h1>[% loc('You have been signed out') %]</h1>
+
+<p>Please feel free to <a href="[% c.uri_for('/auth') %]">sign in again</a>, or
+go back to the <a href="/">FixMyBarangay front page</a>.</p>
+
+[% INCLUDE 'footer.html' %]
diff --git a/templates/web/fixmybarangay/faq/faq-en-gb.html b/templates/web/fixmybarangay/faq/faq-en-gb.html
new file mode 100644
index 000000000..320a7528e
--- /dev/null
+++ b/templates/web/fixmybarangay/faq/faq-en-gb.html
@@ -0,0 +1,135 @@
+[% INCLUDE 'header.html', title => loc('Frequently Asked Questions'), bodyclass => 'twothirdswidthpage' %]
+
+<div class="sticky-sidebar">
+ <aside>
+ <ul class="plain-list">
+ <li><a href="#faq">Frequently Asked Questions</a></li>
+ <li><a href="#practical">Staff Questions</a></li>
+ <li><a href="#organisation">Organisation Questions</a></li>
+ </ul>
+ </aside>
+</div>
+
+<h1><a name="faq"></a>Frequently Asked Questions</h1>
+ <dl>
+ <dt>What is FixMyBarangay?</dt>
+ <dd>FixMyBarangay is a site to help people report, view,
+or discuss local problems they&rsquo;ve found to the city departments.
+The pilot project lets you report the problems by SMS (or dropping
+into the barangay center).
+</dd>
+ <dt>What areas are covered?</dt>
+ <dd>
+ The pilot project is just running in two barangays in Cebu &ndash;
+ Luz and Basak San Nicolas.
+ </dd>
+ <dt>What sort of problems should I report with FixMyBarangay?</dt>
+ <dd>The FixMyBarangay pilot project is just for potholes (and similar
+ road surface problems) and broken streetlights.
+ </dd>
+
+ <dt>What isn&rsquo;t FixMyBarangay for?</dt>
+ <dd>FixMyStreet is not a way of getting in touch with Cebu City Hall for other problems
+ &ndash; please use FixMyBarangay only for potholes and streetlights while the pilot
+ project is running..
+ </dd>
+
+ <dt>Staff only: How do I use the site?</dt>
+ <dd>If you have a staff login, you can view problems already reported in that area,
+or report ones of your own simply by clicking on the map at the location of
+the problem.</dd>
+ <dt>How are the problems solved?</dt>
+ <dd>Problems sent by SMS are initially handled by the barangay staff &ndash; they'll
+ confirm the problem and report it to the relevant department automatically.
+ Once it's in the department's problem-tracking system, they'll get onto it as
+ soon as they can.</dd>
+ <dt>Is it free?</dt>
+ <dd>The site is free to use, yes. The pilot project has been funded by the World Bank.</dd>
+
+ </dl>
+
+ <h2><a name="practical"></a>Staff questions</h2>
+ <dl>
+ <dt>What's my login?</dt>
+ <dd>
+ You can use your email address and set a password right away, but your
+ account won't be enabled as a <em>staff account</em> until one of the
+ system administrators has checked it. TODO: contact details.
+ </dd>
+ <dt>I've forgotten my password, what do I do?</dt>
+ <dd>
+ No problem — when you log in, if you can't remember your password we'll
+ send you a confirmation link which lasts for one session, and you can
+ reset your password once you've clicked on that.
+ </dd>
+ <dt>How do I sign out?</dt>
+ <dd>
+ Either click on <a href="/auth/sign_out">sign out</a> on the page you're on,
+ or quit the browser (just closing the window without quitting the browser is not enough).
+ </dd>
+ <dt>Reporting</dt>
+ <dd>TODO</dd>
+ <dt>How do I see the SMS messages people have sent?</dt>
+ <dd>When you look at the barangay problems, click on "Problems via text"
+ (or, if you're viewing a specific report, click "Show messages") to see the
+ currently available messages. You'll need a username and password
+ for the Message Manager (your manager will have told you what these
+ are). Note that you can only see messages that have not yet been used to
+ create a report (and also their replies).
+ </dd>
+ <dt>Is my Message Manager username and password the same as the ones I use for FixMyBarangay?</dt>
+ <dd>
+ No, it's a separate account (some FMB users don't have any access to the SMS messages).
+ Your manager will tell you what your login for Message Manager system is, if you have one.
+ </dd>
+ <dt>I tried to work with a message but it said "lock not granted". What's up?</dt>
+ <dd>
+ This means another staff member is working on the message. To prevent you both creating
+ a report, or sending a reply, we use a first-come-first-serve locking mechanism.
+ Collisions like this are rare, but if they do happen, try again a few minutes later
+ because the lock may have expired by then.
+ </dd>
+ <dt>Can I delete a message?</dt>
+ <dd>
+ Yes. Click on the red cross when you hover over it (although really you're only hiding it).
+ You need an <em>administrator</em> account in the Message Manager to be able to see the
+ messages that have been hidden, so hiding them is as good as deleting them.
+ </dd>
+ <dt>It looks like an incoming message is wrongly shown as a reply. Can I fix it?</dt>
+ <dd>
+ FixMyBarangay tries to recognise SMS replies, and automatically matches them to the right thread. If it
+ gets this wrong, the reply may appear as a new "available" message, or a new message might be
+ mistaken for a reply. You need to ask an administrator to log into Message Manager to sort this out for you.
+ </dd>
+ <dt>How do the replies get back to the original sender?</dt>
+ <dd>
+ Although you're replying from within FixMyBarangay, the replies are sent by SMS.
+ There may be a delay of a few minutes between the moment you press <strong>reply</strong>
+ and the message's arrival.
+ </dd>
+
+ <h2><a name="organisation"></a>Organisation Questions</h2>
+ <dl>
+ <dt>Who built FixMyBarangay?</dt>
+ <dd>This site was built by <a href="http://www.mysociety.org/">mySociety</a>, in conjunction with the <a href="www.worldbank.org/">World Bank</a>.
+mySociety is the project of a registered charity which has grown out of the community of
+volunteers who built sites like <a href="http://www.theyworkforyou.com/">TheyWorkForYou.com</a> in the UK.
+mySociety&rsquo;s primary mission is to build Internet projects which give people simple, tangible
+benefits in the civic and community aspects of their lives.
+The charity is called UK Citizens Online Democracy and is charity number 1076346. mySociety
+can be contacted by email at <a href="mailto:hello&#64;mysociety.org">hello&#64;mysociety.org</a>,
+or by post at:<br>
+mySociety<br>
+483 Green Lanes<br>
+London<br>
+N13 4BS<br>
+UK</dd>
+ <dt>I&rsquo;d like a site like this for my own location/ where&rsquo;s the "source code" to this site?</dt>
+ <dd>
+The software behind this site is open source, and available
+to you mainly under the GNU Affero GPL software license.
+See <a href="http://code.fixmystreet.com/">code.fixmystreet.com</a> for more information about setting up
+and running sites like these.
+</dd>
+ </dl>
+[% INCLUDE 'footer.html' pagefooter = 'yes' %]
diff --git a/templates/web/fixmybarangay/footer.html b/templates/web/fixmybarangay/footer.html
new file mode 100644
index 000000000..88f18db4b
--- /dev/null
+++ b/templates/web/fixmybarangay/footer.html
@@ -0,0 +1,158 @@
+ </div><!-- .content role=main -->
+ </div><!-- .container -->
+ </div><!-- .table-cell -->
+
+ <div class="nav-wrapper">
+ <div class="nav-wrapper-2">
+ <div id="main-nav" role="navigation">
+ <ul id="mysoc-menu">
+ <li><a id="mysoc-logo" href="http://www.mysociety.org/">mySociety</a></li>[%
+ %]<!--<li><a href="http://mysociety.org/donate/">Donate</a></li>[%
+ %]<li><a href="http://www.mysociety.org/projects/">Our Sites</a></li>-->
+ </ul>
+
+ <ul id="main-menu">
+ <li><a href="/around?latitude=10.322;longitude=123.907" class="fmb-bgy-btn">Luz</a></li>
+ <li><a href="/around?latitude=10.288;longitude=123.870" class="fmb-bgy-btn">BSN</a></li>
+ <li><[% IF c.req.uri.path == '/' %]span[% ELSE %]a href="/"[% END %] class="report-a-problem-btn"
+ >View problems</[% c.req.uri.path == '/' ? 'span' : 'a' %]></li>[%
+ %]<li><[% IF c.req.uri.path == '/reports' %]span[% ELSE %]a href="/reports"[% END
+ %]>[% loc("All reports") %]</[% c.req.uri.path == '/reports' ? 'span' : 'a' %]></li>[%
+ %]<li><[% IF c.req.uri.path == '/alert' %]span[% ELSE %]a href="/alert[% pc ? '/list?pc=' : '' %][% pc | uri %]"[% END
+ %]>[% loc("Local alerts") %]</[% c.req.uri.path == '/alert' ? 'span' : 'a' %]></li>[%
+ %]<li><[% IF c.req.uri.path == '/faq' %]span[% ELSE %]a href="/faq"[% END
+ %]>[% loc("Help") %]</[% c.req.uri.path == '/faq' ? 'span' : 'a' %]></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+
+[% IF global.want_fmb_hidden_dialogs %]
+ <!-- fancybox hidden dialogues for message-manager reply/hide/help -->
+ <div style="display:none">
+ <div id="reply-form-container">
+ <form action="#" id="reply-form" onsubmit="event.returnValue = false; return false;" method="post" accept-charset="utf-8">
+ <div style="display:none;">
+ <input type="hidden" name="_method" value="POST"/>
+ </div>
+ <!-- populated by Ajax call -->
+ <div class="input" id="mm-boilerplate-replies-box">
+ <label for="boilerplate-replies">Use preloaded reply:</label>
+ <select name="boilerplate-replies" id="mm-boilerplate-replies"></select>
+ </div>
+ <div class="input text">
+ <label for="reply_text">Reply text</label>
+ <textarea name="reply_text" id="reply_text" cols="32" rows="3"></textarea>
+ </div>
+ <input type="hidden" name="message_id" id="reply_to_msg_id"/>
+ <div class="submit">
+ <input id="reply-submit" type="submit" value="Send Reply"/>
+ </div>
+ </form>
+ </div>
+ </div>
+ <div style="display:none">
+ <div id="hide-form-container">
+ <p style="color:#000">Hiding message: <span id="hide-form-message-text"></span></p>
+ <form action="#" id="hide-form" onsubmit="event.returnValue = false; return false;" method="post" accept-charset="utf-8">
+ <div style="display:none;">
+ <input type="hidden" name="_method" value="POST"/>
+ </div>
+ <!-- populated by Ajax call -->
+ <div class="input" id="mm-boilerplate-hide-reasons-box">
+ <label for="boilerplate-hide-reasons">Use preloaded reason:</label>
+ <select name="boilerplate-hide-reasons" id="mm-hide-reasons"></select>
+ </div>
+ <div class="input textarea">
+ <label for="reason_text">Reason for hiding message</label>
+ <textarea name="reason_text" id="reason_text" cols="32" rows="3"></textarea>
+ </div>
+ <input type="hidden" name="msg_id" id="hide_msg_id"/>
+ <div class="submit">
+ <input id="hide-submit" type="submit" value="Hide Message"/>
+ </div>
+ </form>
+ </div>
+ </div>
+ <div style="display:none">
+ <div id="mm-help" style="font-size:90%;">
+ <h2> Accessing Message Manager from FixMyBarangay (FMB)</h2>
+ <h3>
+ Logging into Message Manager
+ </h3>
+ <p>
+ You'll need a username and password (ask your manager if you haven't already got one). Your Message Manager password
+ might not be the same as your FMB password.
+ </p>
+ <p>
+ When you've logged in, you'll see the currently available messages (and any replies that have been sent to them).
+ You <em>only</em> see messages that are waiting to be used to make reports, and which are tagged with the keywords
+ your login allows you to see (these may mean you only see messages for your own barangay).
+ If you want to see any other messages, you'll need to have a manager or admin account on Message Manager: click on the
+ <a href="[% c.config.MESSAGE_MANAGER_URL %]">admin</a> link to get there.
+ </p>
+ <p>
+ [% IF global.is_fmb_creation_page %]
+ <h3>
+ Creating a new report from a message
+ </h3>
+ <p>
+ If you want to use a message to create a problem report, you'll need to select it first. Click on the radio button. When the message
+ is selected, it will go bright green. Now when you click on the map, the report will be used to create the report.
+ </p>
+ <p>
+ To stop two people replying to a message at the same time, if anyone else has just started working on it, you'll see a message
+ warning you, and you won't be able to select the radio button. Normally, if nobody works with a message, such a lock is released
+ after about 3 minutes.
+ </p>
+ [% ELSE %]
+ <p>
+ Click <strong>show messages for this report</strong> to see
+ the message (or messages) that contributed to this report. Often this will be a single message
+ if the problem was submitted by SMS. But it will also include any messages that have been
+ added as updates, as well as any replies that were sent back by barangay staff.
+ As well as letting you review the background to the report, this also lets you reply (for example,
+ to notify the original reporter that the problem has been fixed).
+ </p>
+ <h3>
+ Adding a message as an update to this report
+ </h3>
+ <p>
+ If you want to add this message's contents as an update to this report, you'll need to select it first. Click
+ on the radio button. When the message is selected, it will go bright green. Now when you click on the
+ <strong>COPY&nbsp;TO&nbsp;UPDATE</strong> button, the message text will be added to this report's update text.
+ You can edit the text before clicking <strong>POST</strong>.
+ </p>
+ [% END %]
+ <h3>
+ Replying to a message
+ </h3>
+ <p>
+ You can send an SMS back to the original sender: just hover over the message and click <span class="demo_reply_btn">reply</span>. It will usually
+ take a few minutes for the message to arrive.
+ </p>
+ <h3>
+ Getting message info
+ </h3>
+ <p>
+ Hover over a message and click on its <span class="demo_info_btn">i</span> button to see when it was sent.
+ You can also see the sender, although not their
+ actual number (instead the number is scrambled, but will be the <em>same scrambled number</em> on other messages they've sent).
+ </p>
+ <h3>
+ Hiding a message
+ </h3>
+ <p>
+ If a message can't be used to create a report, you can hide it by hovering over it and clicking its <span class="demo_hide_btn">X</span> button. If you're not
+ going to create a problem report with this message, you might like to reply first, to tell the person who sent the message why not.
+ When you click the X, give a reason why you're hiding it so other staff (managers in Message Manager) can see why the message was hidden.
+ </p>
+ </div>
+ </div>
+
+[% END %]
+
+<!-- [% INCLUDE 'debug_footer.html' %] -->
+ </div> <!-- .wrapper -->
+</body>
+</html>
diff --git a/templates/web/fixmybarangay/header.html b/templates/web/fixmybarangay/header.html
new file mode 100644
index 000000000..911a72022
--- /dev/null
+++ b/templates/web/fixmybarangay/header.html
@@ -0,0 +1,77 @@
+<!doctype html>
+<!--[if lt IE 7]><html class="no-js ie6 oldie" lang="[% lang_code %]"><![endif]-->
+<!--[if IE 7]> <html class="no-js ie7 oldie" lang="[% lang_code %]"><![endif]-->
+<!--[if IE 8]> <html class="no-js ie8 oldie" lang="[% lang_code %]"><![endif]-->
+<!--[if IE 9]> <html class="no-js ie9 oldie" lang="[% lang_code %]"><![endif]-->
+<!--[if gt IE 9]><!--><html class="no-js" lang="[% lang_code %]"><!--<![endif]-->
+ <head>
+ <meta name="viewport" content="initial-scale=1.0">
+
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
+ <meta name="HandHeldFriendly" content="true">
+ <meta name="mobileoptimized" content="0">
+
+ <link rel="stylesheet" href="[% version('/cobrands/fixmybarangay/base.css') %]">
+ <link rel="stylesheet" href="[% version('/cobrands/fixmybarangay/layout.css') %]" media="(min-width:48em)">
+ [% extra_css %]
+ <!--[if (lt IE 9) & (!IEMobile)]>
+ <link rel="stylesheet" href="[% version('/cobrands/fixmybarangay/layout.css') %]">
+ <![endif]-->
+
+ <script src="[% version('/js/modernizr.custom.js') %]" charset="utf-8"></script>
+ <script src="[% version('/cobrands/fixmybarangay/position_map.js') %]" charset="utf-8"></script>
+ [% INCLUDE 'common_header_tags.html', site_title = 'FixMyBarangay', js_override = '/cobrands/fixmystreet/fixmystreet.js' %]
+ [% extra_js %]
+
+ [% allow_creation = !c.cobrand.only_authed_can_create || (c.user && c.user.from_council); %]
+ [% IF allow_creation %]
+ <link rel="stylesheet" href="[% version('/js/fancybox/jquery.fancybox-1.3.4.css') %]">
+ <script src="[% version('/js/fancybox/jquery.fancybox-1.3.4.pack.js') %]" charset="utf-8"></script>
+ <script src="[% version('/cobrands/fixmybarangay/message_manager_client.js') %]" charset="utf-8"></script>
+ <script>
+ $(document).ready(function() {
+
+ $('#mm_sign_out').click(function(){
+ message_manager.sign_out();
+ });
+
+ [% IF c.req.params.external_source_id && problem && problem.external_source_id.match('^\d+$') %]
+ var mm_msg_id ="[% c.req.params.external_source_id %]";
+ var fms_id = "[% problem.id %]";
+ if (mm_msg_id && fms_id) {
+ message_manager.config({url_root: "[% c.config.MESSAGE_MANAGER_URL %]"});
+ message_manager.assign_fms_id(mm_msg_id, fms_id);
+ }
+ [% END %]
+ });
+ </script>
+ [% END %]
+ </head>
+ <body class="[% bodyclass | html IF bodyclass %]">
+
+ <div class="wrapper">
+ <div class="table-cell">
+ <header id="site-header" role="banner">
+ <div class="container">
+ <a href="/" id="site-logo">FixMyBarangay</a>
+ <a href="#main-nav" id="nav-link">Main Navigation</a>
+ </div>
+ </header>
+
+ <div id="user-meta">
+ [% IF c.user_exists %]
+ <p>
+ [% tprintf(loc('Hi %s'), c.user.name || c.user.email) %]
+ <a href="/auth/sign_out" id="mm_sign_out">[% loc('sign out') %]</a>
+ </p>
+ [% ELSE %]
+ <!-- <a href="/auth">[% loc('Sign in') %]</a> -->
+ [% END %]
+ </div>
+
+ [% pre_container_extra %]
+
+ <div class="container">
+ <div class="content[% " $mainclass" | html IF mainclass %]" role="main">
+
+ <!-- [% INCLUDE 'debug_header.html' %] -->
diff --git a/templates/web/fixmybarangay/report/_message_manager.html b/templates/web/fixmybarangay/report/_message_manager.html
new file mode 100644
index 000000000..5f6b515e5
--- /dev/null
+++ b/templates/web/fixmybarangay/report/_message_manager.html
@@ -0,0 +1,293 @@
+[% IF c.user && c.user.from_council %]
+
+[% IF problem.external_source_id && problem.external_source == c.config.MESSAGE_MANAGER_URL %]
+ <p class="mm-submitted-by-sms">
+ [%# OK to link to Message Manager here because (currently) we're only showing this to staff users %]
+ <a href="[%= problem.external_source %]messages/view/[%= problem.external_source_id %]"
+ title="view in Message Manager admin"><img
+ src="/cobrands/fixmybarangay/images/mobile-22x40.png" alt="SMS"></a>
+ This report was submitted via SMS.
+ </p>
+[% END %]
+
+[% IF problem.id %]
+ <div id="mm-container-for-report-btns">
+ <input type="button" class="green-btn" value="Show Messages" id="show_messages">
+ </div>
+[% END %]
+
+<ul id="message_manager" class="issue-list-a tab" style="display: none">
+ <li id="mm-admin-buttons">
+ [% IF problem.id %]
+ <a style="float:left" id="mm-link-to-toggle-archive" href="#" title="show the message(s) associated with this report">show message for <b>this</b> report</a>
+ [% END %]
+ <a id="mm-link-to-refresh" href="#" title="update list of messages">refresh</a>
+ <a id="mm-link-to-admin" href="[% c.config.MESSAGE_MANAGER_URL %]" title="jump to Message Manager admin">admin</a>
+ <a id="mm-link-to-help" href="#mm-help" title="show help information">help</a>
+ </li>
+ <li id="message-control">
+ <div id="mm-username-container">username:&nbsp;<span id="mm-received-username"></span></div>
+ <div id="mm-status-message-container">
+ <img id="mm-spinner" src="/cobrands/fixmybarangay/images/fmb-spinner-16x16.gif" alt=""/>
+ <p id="mm-status-message"></p>
+ </div>
+ <div id="mm-login-container">
+ <div>
+ <label for="mm-htauth-username">Username:</label>
+ <input name="mm-htauth-username" id="mm-htauth-username" type="text"/>
+ </div>
+ <div>
+ <label for="mm-htauth-password">Password:</label>
+ <input name="mm-htauth-password" id="mm-htauth-password" type="password"/>
+ </div>
+ <div class="submit">
+ <input id="available-submit" type="submit" value="Get available messages" class="green-btn"/>
+ </div>
+ </div>
+ </li>
+ <li>
+ <div id="mm-message-list" style="min-height:1em;"></div>
+ </li>
+</ul>
+
+<script type="text/javascript">
+
+$(document).ready(function() {
+ var $mm_message_list = $('#mm-message-list');
+ var mm_url = "[% c.config.MESSAGE_MANAGER_URL %]"; // from config
+
+ [%# note that the presence of a problem id implies that this is a report view page, not a problem creation page %]
+ var problem_id = "[% problem.id %]";
+
+ var dummy_busy = false;
+ var fms_username = "[% c.user.email | replace('\@.*', '') %]";
+ var timeout_id = 0;
+ var can_refresh = true; // disable refresh
+ var refresh_period = 60000 * 3; // refresh messages every three minutes
+ var has_archive_message = false;
+
+ function sanitise_id(css_id) {
+ return css_id.replace(/\D/g, "");
+ }
+
+ // call this to push the auto-refresh timeout off so it's only triggered
+ // if there's no activity for a while
+ function reset_timeout() {
+ if (refresh_period && can_refresh) {
+ if (timeout_id) {
+ clearTimeout(timeout_id);
+ }
+ timeout_id = setTimeout(mm_refresh_messages, refresh_period);
+ }
+ }
+
+ var mm_refresh_messages = function() {
+ $('#mm-link-to-refresh').fadeOut();
+ $('#available-submit').click();
+ }
+
+ var mm_populate_list = function(data) {
+ $('#mm-status-message-container').find('p').text("Accessed Message Manager as " + data['username']);
+ $('input[name=mm_text]').prop('checked', false); // uncheck all
+ $('#mm-link-to-refresh').delay(2000).fadeIn();
+ reset_timeout();
+ }
+
+ var mm_selected_message = function(data) {
+ var msg_text = "";
+ var service_id = "";
+ $('li.msg-is-active', $mm_message_list).removeClass('msg-is-active');
+ if (data['success']) {
+ // msg_text = $('#form_detail').val( $('input[name=mm_text]:checked').val() ); # == message data
+ msg_text = data['data']['Message']['message'];
+ service_id = data['data']['Message']['id'];
+ $('#msg-' + service_id).addClass('msg-is-active');
+ } else {
+ $('input[name=mm_text]').prop('checked', false); // uncheck all
+ }
+ $('#form_detail').val(msg_text);
+ $('#external_source_id').val(service_id);
+ }
+
+ var dummy_reply_cleanup = function(data) {
+ reset_timeout();
+ $('#reply_text').val('');
+ dummy_busy = false;
+ mm_refresh_messages();
+ }
+
+ var dummy_hide_cleanup = function(data) {
+ reset_timeout();
+ $('#reason_text').val('');
+ dummy_busy = false;
+ }
+
+ var custom_tooltips;
+ if (problem_id) { // this page is viewing, not creating
+ custom_tooltips = {tt_radio: "Select before clicking 'Copy to Update' to add this message as an update"};
+ }
+ message_manager.config({
+ url_root: mm_url,
+ tooltips: custom_tooltips,
+ want_nice_msgs: true
+ });
+ message_manager.setup_click_listener({callback:mm_selected_message});
+
+ // problem form hidden input "external_source_id": pass the MM id into FMS, if used
+ var $problem_form = $('#problem_form').size()? $('#problem_form') : $('#form_update_form');
+ $('<input type="hidden"/>').attr({
+ 'id': 'external_source_id',
+ 'name': 'external_source_id',
+ }).appendTo($problem_form);
+
+ $('#available-submit').click(function(e){
+ e.preventDefault();
+ reset_timeout();
+ message_manager.get_available_messages({
+ callback: mm_populate_list,
+ suggest_username: fms_username,
+ fms_id: problem_id,
+ anim_duration: 500
+ });
+ });
+ $('#available-submit').click();
+
+ $mm_message_list.on('mouseover', 'li.mm-msg', function(e){
+ e.stopPropagation(); // because replies are nested
+ $('.mm-msg-action', $mm_message_list).stop().fadeOut(200);
+ $(this).find('> .mm-msg-action').stop().show();
+ });
+
+ $('#mm-message-list').on('click', '.mm-info', function(e){
+ reset_timeout();
+ message_manager.show_info(sanitise_id($(this).parent().attr('id')));
+ });
+
+ $('#mm-hide-reasons').change(function(e){
+ $('#reason_text').val($(this).val()); // load reason_text with boilerplate reason
+ });
+ $('#mm-boilerplate-replies').change(function(e){
+ $('#reply_text').val($(this).val()); // load reason_text with boilerplate reason
+ });
+
+ $('#reply-submit').click(function(e) {
+ e.preventDefault();
+ // TODO: pending fancybox callbacks working, force dummy_busy here
+ // this is possibly overly cautious anyway
+ dummy_busy = false;
+ if (! dummy_busy) {
+ dummy_busy = true;
+ message_manager.reply(
+ $('#reply_to_msg_id').val(),
+ $('#reply_text').val(),
+ {callback:dummy_reply_cleanup});
+ }
+ });
+
+ $('#hide-submit').click(function(e) {
+ e.preventDefault();
+ reset_timeout();
+ // TODO: pending fancybox callbacks working, force dummy_busy here
+ // this is possibly overly cautious anyway
+ dummy_busy = false;
+ if (! dummy_busy) {
+ dummy_busy = true;
+ message_manager.hide(
+ $('#hide_msg_id').val(),
+ $('#reason_text').val(),
+ {callback:dummy_hide_cleanup});
+ }
+ });
+ $("a#reply").fancybox({onClosed: function(){dummy_busy=false;}});
+
+ // only show on problem display page
+ if (problem_id) {
+ $('<input type="button" value="Copy to update"/>').attr({
+ 'id': 'copy_to_update',
+ 'name': 'copy_to_update',
+ 'class': 'green-btn',
+ 'title': "add the selected message's text as an update to this report"
+ }).appendTo($('#mm-container-for-report-btns'));
+ }
+
+ $('#copy_to_update').click(function(e){
+ reset_timeout();
+ e.preventDefault();
+ $('#mm-message-list input:checked').each( function(index) {
+ var id = $(this).attr('id');
+ id = id.replace('mm_text_','');
+ $('#external_source_id').val(id);
+ $('#form_update').val( $(this).val() );
+ $('#form_update_form').on('submit', function(e) {
+ message_manager.assign_fms_id( $('#external_source_id').val(), problem_id, { 'is_async': false } );
+ });
+ });
+ });
+
+ $('#show_messages').on('click', function(e) {
+ $('#message_manager').slideToggle(1000);
+ if ($('#show_messages').val() == 'Show Messages') {
+ $('#show_messages').val('Hide Messages');
+ $('#copy_to_update').stop(true,true).fadeIn();
+ } else {
+ $('#show_messages').val('Show Messages');
+ $('#copy_to_update').stop(true,true).fadeOut();
+ }
+
+ });
+
+ $('#mm-link-to-refresh').on('click', function(e) {
+ e.preventDefault();
+ mm_refresh_messages();
+ });
+
+ // suppress fading control while archive messages are displayed, for now
+ $('#mm-link-to-toggle-archive').on('click', function(e) {
+ e.preventDefault();
+ $('#mm-link-to-toggle-archive').fadeOut();
+ if ($('.mm-current', $mm_message_list).is(':visible')) {
+ $('#copy_to_update').stop(true,true).fadeOut();
+ $('#mm-link-to-refresh').stop(true,true).fadeOut();
+ $('.mm-empty', $mm_message_list).stop(true,true).fadeOut();
+ $('.mm-current', $mm_message_list).stop(true,true).slideUp(1000, function(){
+ if($('.mm-archive', $mm_message_list).find('li').length == 0) {
+ message_manager.say_status("No messages found for this report,");
+ } else {
+ message_manager.say_status("Messages for this report:");
+ };
+ $('.mm-archive', $mm_message_list).stop(true,true).slideDown(1000, function(){
+ $('#mm-link-to-toggle-archive').html('show all available messages')
+ .attr('title', 'show all available messages (for adding updates)');
+ $('#mm-link-to-toggle-archive').fadeIn();
+ can_refresh = false;
+ })
+ });
+ } else {
+ $('.mm-archive', $mm_message_list).stop(true,true).slideUp(1000, function(){
+ message_manager.say_status("Available messages:");
+ $('.mm-current', $mm_message_list).stop(true,true).slideDown(1000, function(){
+ $('#mm-link-to-toggle-archive').html("show message for <b>this</b> report")
+ .attr('title', 'show the original message(s) for this report');
+ $('#copy_to_update').stop(true,true).fadeIn();
+ $('#mm-link-to-toggle-archive').stop(true,true).fadeIn();
+ $('#mm-link-to-refresh').stop(true,true).fadeIn();
+ $('.mm-empty', $mm_message_list).stop(true,true).fadeIn();
+ can_refresh = true;
+ reset_timeout();
+ })
+ });
+ }
+ });
+
+ $("a#mm-link-to-help").fancybox();
+
+ message_manager.populate_boilerplate_strings('hide-reason');
+ message_manager.populate_boilerplate_strings('reply');
+});
+
+</script>
+
+[% global.want_fmb_hidden_dialogs = 1 %]
+[% global.is_fmb_creation_page = problem.id? 0 : 1 %]
+
+[% END %]
diff --git a/templates/web/fixmybarangay/report/new/councils_text.html b/templates/web/fixmybarangay/report/new/councils_text.html
new file mode 100644
index 000000000..24c54ea50
--- /dev/null
+++ b/templates/web/fixmybarangay/report/new/councils_text.html
@@ -0,0 +1,5 @@
+<p>
+The information provided here will be displayed publicly on the site as well as being sent to the
+relevant authority (DPWH, DEPW, or DPS). If you select the Fix Locally category then the
+information will not be sent anywhere.
+</p>
diff --git a/templates/web/fixmybarangay/report/new/fill_in_details_text.html b/templates/web/fixmybarangay/report/new/fill_in_details_text.html
new file mode 100644
index 000000000..51dc1e3f1
--- /dev/null
+++ b/templates/web/fixmybarangay/report/new/fill_in_details_text.html
@@ -0,0 +1,12 @@
+[%
+ IF area_ids_to_list.size != 0;
+ loc('Please fill in details of the problem below. Leave as much detail as you can,
+and if possible describe the exact location of
+the problem (e.g. if there is a streetlight number or road name).');
+ IF category_extras;
+ ' ' _ loc('Some categories may require additional information.');
+ END;
+ ELSE;
+ loc('Please fill in details of the problem below.');
+ END;
+%]
diff --git a/templates/web/fixmybarangay/report/new/notes.html b/templates/web/fixmybarangay/report/new/notes.html
new file mode 100644
index 000000000..8195051db
--- /dev/null
+++ b/templates/web/fixmybarangay/report/new/notes.html
@@ -0,0 +1,11 @@
+<p style="clear:both">[% loc("Please note:") %]</p>
+
+<ul>
+<!--
+ <li>[% loc("We will only use your personal information in accordance with our <a href=\"/faq#privacy\">privacy policy.</a>") %]</li>
+-->
+ <li>[% loc("Be sure to choose the right category, because we use that to determine to whom the report is sent.") %]</li>
+ <li>[% loc("Writing your message entirely in block capitals makes it hard to read, as does a lack of punctuation.") %]</li>
+ <li>[% loc("Remember that, for the pilot project, FixMyBarangay is only for reporting potholes and streetlights in bgy. Luz or Basak San Nicolas.") %]</li>
+
+</ul>
diff --git a/templates/web/fixmybarangay/reports/index.html b/templates/web/fixmybarangay/reports/index.html
new file mode 100755
index 000000000..2d8da17c6
--- /dev/null
+++ b/templates/web/fixmybarangay/reports/index.html
@@ -0,0 +1,59 @@
+[% INCLUDE 'header.html', title = loc('Summary reports'), bodyclass => 'fullwidthpage' %]
+
+<h1>[% loc('All Reports') %]</h1>
+
+<div class="intro">
+<p>
+[% loc('This is a summary of all reports on this site; select a particular barangay to see the reports sent there.') %]
+
+</p>
+</div>
+
+<table cellpadding="3" cellspacing="1" border="0" class="nicetable">
+<thead>
+<tr>
+<th class="title">[% loc('Name') %]</th>
+<th class="data">[% loc('New <br>problems') %]</th>
+<th class="data">[% loc('Older <br>problems') %]</th>
+<th class="data">[% loc('Old / unknown <br>problems') %]</th>
+<th class="data">[% loc('Recently <br>fixed') %]</th>
+<th class="data">[% loc('Older <br>fixed') %]</th>
+</tr>
+</thead>
+
+<tbody>
+[% FOREACH area IN areas_info_sorted %]
+<tr align="center"
+[%- IF area.generation_high == 10 %] class="gone"
+[%- ELSIF ! (loop.count % 2) %] class="a"
+[%- END %]>
+<td class="title"><a href="[% area.url %]">[% area.name %]</a></td>
+<td class="data">[% open.${area.id}.new or 0 %]</td>
+<td class="data">[% open.${area.id}.older or 0 %]</td>
+<td class="data">[% open.${area.id}.unknown or 0 %]</td>
+<td class="data">[% fixed.${area.id}.new or 0 %]</td>
+<td class="data">[% fixed.${area.id}.old or 0 %]</td>
+</tr>
+[% TRY %][% PROCESS "reports/_extras.html" %][% CATCH file %][% END %]
+[% END %]
+</tbody>
+</table>
+
+
+<p>
+[%# (this will change when we have 'body' logic in place, meanwhile: hardcoded) %]
+See also the maps of reports submitted to these departments:
+</p>
+<ul>
+<li>
+<a href="/reports/depw" title="Department of Engineering and Public Works">DEPW</a> &mdash; city road maintenance
+</li>
+<li>
+<a href="/reports/dps" title="Department of Public Services">DPS</a> &mdash; streetlight maintenance
+</li>
+<li>
+<a href="/reports/dpwh" title="Department of Public Works and Highways">DPWH</a> &mdash; national road maintenance
+</li>
+</ul>
+</p>
+[% INCLUDE 'footer.html', pagefooter = 'yes' %]
diff --git a/templates/web/fixmystreet/around/_report_banner.html b/templates/web/fixmystreet/around/_report_banner.html
new file mode 100755
index 000000000..9edf6e171
--- /dev/null
+++ b/templates/web/fixmystreet/around/_report_banner.html
@@ -0,0 +1,14 @@
+<h1 class="big-green-banner">
+ [% loc( 'Click map to report a problem' ) %]
+ [% IF c.cobrand.moniker == 'bromley' %]
+ <span>Yellow pins show existing reports</span>
+ [% END %]
+</h1>
+<p id="skip-this-step">
+ [%
+ tprintf(
+ loc("Can't see the map? <a href='%s' rel='nofollow'>Skip this step</a>"),
+ url_skip
+ )
+ %]
+</p>
diff --git a/templates/web/fixmystreet/around/_updates.html b/templates/web/fixmystreet/around/_updates.html
new file mode 100755
index 000000000..75327c935
--- /dev/null
+++ b/templates/web/fixmystreet/around/_updates.html
@@ -0,0 +1,5 @@
+<div class="shadow-wrap">
+ <ul id="key-tools" class="singleton">
+ <li><a class="feed" id="key-tool-around-updates" href="[% email_url | html %]">Get updates</a></li>
+ </ul>
+</div>
diff --git a/templates/web/fixmystreet/around/display_location.html b/templates/web/fixmystreet/around/display_location.html
deleted file mode 100755
index a7240688f..000000000
--- a/templates/web/fixmystreet/around/display_location.html
+++ /dev/null
@@ -1,121 +0,0 @@
-[%
-
- rss_alt = loc('RSS feed');
- rss_title = loc('RSS feed of recent local problems');
-
- rss_url
- = pc
- ? c.uri_for( "/rss/pc", pc )
- : c.uri_for( "/rss/l/$short_latitude,$short_longitude" );
-
- email_url = c.uri_for(
- '/alert/list',
- {
- lat => short_latitude,
- lon => short_longitude,
- feed => "local:$short_latitude:$short_longitude",
- }
- );
-
- url_skip = c.uri_for(
- '/report/new',
- {
- pc => pc
- latitude => short_latitude,
- longitude => short_longitude,
- skipped => 1,
- }
- );
-
- PROCESS "maps/${map.type}.html";
-
- INCLUDE 'header.html',
- title => loc('Viewing a location')
- rss => [ loc('Recent local problems, FixMyStreet'), rss_url ],
- bodyclass => 'mappage',
- robots => 'noindex,nofollow';
-%]
-
-<form action="[% c.uri_for('/report/new') %]" method="post" name="mapForm" id="mapForm" enctype="multipart/form-data" class="validate">
- [% IF c.req.params.map_override %]
- <input type="hidden" name="map_override" value="[% c.req.params.map_override | html %]">
- [% END %]
- <input type="hidden" name="pc" value="[% pc | html %]">
-
- <input type="hidden" name="latitude" id="fixmystreet.latitude" value="[% short_latitude | html %]">
- <input type="hidden" name="longitude" id="fixmystreet.longitude" value="[% short_longitude | html %]">
-
- [% map_html %]
-
- <p id='sub_map_links'>
- [% IF c.req.params.no_pins %]
- <a id='hide_pins_link' rel='nofollow' href='[% c.uri_with( { no_pins => 0 } ) %]'>[% loc('Show pins') %]</a>
- [% ELSE %]
- <a id='hide_pins_link' rel='nofollow' href='[% c.uri_with( { no_pins => 1 } ) %]'>[% loc('Hide pins') %]</a>
- [% END %]
- [% IF c.cobrand.country == 'GB' || c.cobrand.country == 'NO' %]
- [% IF c.req.params.all_pins %]
- <a id='all_pins_link' rel='nofollow' href='[% c.uri_with( { no_pins => undef, all_pins => undef } ) %]'>[% loc('Hide old') %]</a>
- [% ELSE %]
- <a id='all_pins_link' rel='nofollow' href='[% c.uri_with( { no_pins => undef, all_pins => 1 } ) %]'>[% loc('Show old') %]</a>
- [% END %]
- [% END %]
- </p>
-
- </div>
-
-
-
-
- <div id="side">
-
- <h1 class="big-green-banner">[%
- loc( 'Click map to report a problem' );
- IF c.cobrand.moniker == 'bromley';
- '<span>Yellow pins show existing reports</span>';
- END
- %]</h1>
-
- <p id="skip-this-step">
- [%
- tprintf(
- loc("Can't see the map? <a href='%s' rel='nofollow'>Skip this step</a>"),
- url_skip
- )
- %]
- </p>
-
- <div class="shadow-wrap">
- <ul id="key-tools" class="singleton">
- <li><a class="feed" id="key-tool-around-updates" href="[% email_url | html %]">Get updates</a></li>
- </ul>
- </div>
-
- <section class="full-width">
- <menu id="problems-nav" class="tab-nav">
- <ul>
- <li><a href="#current">[% loc('Problems on the map') %]</a></li>
- <li><a href="#current_near">[% loc( 'Problems nearby' ) %]</a></li>
- </ul>
- </menu>
-
- <ul id="current" class="issue-list-a tab">
- [% INCLUDE "around/on_map_list_items.html" %]
- </ul>
-
- <ul id="current_near" class="issue-list-a tab">
- [% INCLUDE "around/around_map_list_items.html" %]
- </ul>
- </section>
- </div>
-
- <div style="display:none" id="side-form">
- [% INCLUDE "report/new/fill_in_details_form.html"
- js = 1,
- report.used_map = 1
- report.name = c.user.name
- %]
- </div>
-</form>
-
-[% INCLUDE 'footer.html' %]
diff --git a/templates/web/fixmystreet/around/intro.html b/templates/web/fixmystreet/around/intro.html
new file mode 100644
index 000000000..d71dad1d5
--- /dev/null
+++ b/templates/web/fixmystreet/around/intro.html
@@ -0,0 +1,2 @@
+ <h1>[% loc('Report, view, or discuss local problems') %]</h1>
+ <h2>[% loc('(like graffiti, fly tipping, broken paving slabs, or street lighting)') %]</h2>
diff --git a/templates/web/fixmystreet/around/postcode_form.html b/templates/web/fixmystreet/around/postcode_form.html
index a98959d3a..d48a53183 100644
--- a/templates/web/fixmystreet/around/postcode_form.html
+++ b/templates/web/fixmystreet/around/postcode_form.html
@@ -1,16 +1,19 @@
<div id="front-main">
<div id="front-main-container">
- [% IF c.cobrand.moniker == 'bromley' %]
- <h1 class="main mob-only">Reporting a problem in Bromley&rsquo;s streets or parks</h1>
+ [% IF c.cobrand.moniker == 'fixmybarangay' %]
+ <h1>View local problems</h1>
+ <h2>(potholes or street lighting)</h2>
[% ELSE %]
- <h1>[% loc('Report, view, or discuss local problems') %]</h1>
- <h2>[% loc('(like graffiti, fly tipping, broken paving slabs, or street lighting)') %]</h2>
+ [% INCLUDE 'around/intro.html' %]
[% END %]
[%
question = c.cobrand.enter_postcode_text || loc('Enter a nearby street name and area');
%]
+ [% IF c.cobrand.moniker == 'fixmybarangay' %]
+ [% INCLUDE '_barangay_buttons.html' %]
+ [% ELSE %]
<form action="[% c.uri_for('/around') %]" method="get" name="postcodeForm" id="postcodeForm">
<label for="pc">[% question %]:</label>
<div>
@@ -18,10 +21,11 @@
<input type="submit" value="[% loc('Go') %]" id="submit">
</div>
- [% IF partial_token %]
- <input type="hidden" name="partial" value="[% partial_token.token %]">
- [% END %]
+ [% IF partial_token %]
+ <input type="hidden" name="partial" value="[% partial_token.token %]">
+ [% END %]
</form>
+ [% END %]
</div>
</div>
diff --git a/templates/web/fixmystreet/around/tabbed_lists.html b/templates/web/fixmystreet/around/tabbed_lists.html
new file mode 100644
index 000000000..77c5a521b
--- /dev/null
+++ b/templates/web/fixmystreet/around/tabbed_lists.html
@@ -0,0 +1,14 @@
+<menu id="problems-nav" class="tab-nav">
+ <ul>
+ <li><a href="#current">[% loc('Problems on the map') %]</a></li>
+ <li><a href="#current_near">[% loc( 'Problems nearby' ) %]</a></li>
+ </ul>
+</menu>
+
+<ul id="current" class="issue-list-a tab">
+ [% INCLUDE "around/on_map_list_items.html" %]
+</ul>
+
+<ul id="current_near" class="issue-list-a tab">
+ [% INCLUDE "around/around_map_list_items.html" %]
+</ul>
diff --git a/templates/web/fixmystreet/auth/general.html b/templates/web/fixmystreet/auth/general.html
index 6ecbcadc5..7fa2b57fe 100644
--- a/templates/web/fixmystreet/auth/general.html
+++ b/templates/web/fixmystreet/auth/general.html
@@ -26,7 +26,11 @@
<input type="email" class="required email" id="email" name="email" value="[% email | html %]" placeholder="[% loc('Your email address') %]">
<div id="form_sign_in">
+ [% IF c.cobrand.moniker == 'fixmybarangay' %]
+ <h3>[% loc("Do you have a FixMyBarangay password?") %]</h3>
+ [% ELSE %]
<h3>[% loc("Do you have a FixMyStreet password?") %]</h3>
+ [% END %]
<div id="form_sign_in_yes" class="form-box">
<h5>[% loc('<strong>Yes</strong> I have a password') %]</h5>
diff --git a/templates/web/fixmystreet/faq/faq-en-gb.html b/templates/web/fixmystreet/faq/faq-en-gb.html
index bd94ecd38..8628085e5 100755
--- a/templates/web/fixmystreet/faq/faq-en-gb.html
+++ b/templates/web/fixmystreet/faq/faq-en-gb.html
@@ -7,6 +7,7 @@
<li><a href="#practical">Practical Questions</a></li>
<li><a href="#organisation">Organisation Questions</a></li>
<li><a href="/privacy">Privacy and cookies</a></li>
+ <li><a href="/contact">Contact FixMyStreet</a></li>
</ul>
</aside>
</div>
@@ -18,6 +19,8 @@
or discuss local problems they&rsquo;ve found to their local council by
simply locating them on a map. It launched in early February
2007.</dd>
+ <dt>How do I get in touch with FixMyStreet?</dt>
+ <dd>Here&rsquo;s our <a href="/contact">contact page</a>.</dd>
<dt>What sort of problems should I report with FixMyStreet?</dt>
<dd>FixMyStreet is primarily for reporting things which are
<strong>broken or dirty or damaged or dumped, and need fixing, cleaning
@@ -184,7 +187,7 @@ rights reserved, Ministry of Justice 100037819&nbsp;2008),
Yahoo! for their BSD-licensed JavaScript libraries, the entire free software
community (this particular project was brought to you by Perl, PostgreSQL,
and the number 161.290) and <a
-href="http://www.m247.com/">M247</a> (who kindly host all
+href="http://www.bytemark.co.uk/">Bytemark</a> (who kindly host all
our servers).
Let us know if we&rsquo;ve missed anyone.</dd>
diff --git a/templates/web/fixmystreet/header.html b/templates/web/fixmystreet/header.html
index 8d10d4c04..85ed2c0e1 100644
--- a/templates/web/fixmystreet/header.html
+++ b/templates/web/fixmystreet/header.html
@@ -11,16 +11,18 @@
<meta name="HandHeldFriendly" content="true">
<meta name="mobileoptimized" content="0">
- <link rel="stylesheet" href="[% version('/cobrands/' _ c.cobrand.moniker _ '/base.css') %]">
- <link rel="stylesheet" href="[% version('/cobrands/' _ c.cobrand.moniker _ '/layout.css') %]" media="(min-width:48em)">
+[% SET start = c.config.ADMIN_BASE_URL IF admin %]
+
+ <link rel="stylesheet" href="[% start %][% version('/cobrands/' _ c.cobrand.moniker _ '/base.css') %]">
+ <link rel="stylesheet" href="[% start %][% version('/cobrands/' _ c.cobrand.moniker _ '/layout.css') %]" media="(min-width:48em)">
[% extra_css %]
<!--[if (lt IE 9) & (!IEMobile)]>
- <link rel="stylesheet" href="[% version('/cobrands/' _ c.cobrand.moniker _ '/layout.css') %]">
+ <link rel="stylesheet" href="[% start %][% version('/cobrands/' _ c.cobrand.moniker _ '/layout.css') %]">
<![endif]-->
- <script src="[% version('/js/modernizr.custom.js') %]" charset="utf-8"></script>
- <script src="[% version('/cobrands/fixmystreet/position_map.js') %]" charset="utf-8"></script>
- [% INCLUDE 'common_header_tags.html', js_override = '/cobrands/fixmystreet/fixmystreet.js', site_title = 'FixMyStreet' %]
+ <script src="[% start %][% version('/js/modernizr.custom.js') %]" charset="utf-8"></script>
+ <script src="[% start %][% version('/cobrands/fixmystreet/position_map.js') %]" charset="utf-8"></script>
+ [% INCLUDE 'common_header_tags.html', js_override = '/cobrands/fixmystreet/fixmystreet.js', site_title = c.cobrand.site_title %]
[% extra_js %]
[% IF c.req.uri.host == 'osm.fixmystreet.com' %]
@@ -30,13 +32,14 @@
[% INCLUDE 'tracking_code.html' %]
</head>
+ [% TRY %][% PROCESS 'set_body_class.html' %][% CATCH file %][% END %]
<body class="[% bodyclass | html IF bodyclass %]">
<div class="wrapper">
<div class="table-cell">
<header id="site-header" role="banner">
<div class="container">
- <a href="/" id="site-logo">FixMyStreet</a>
+ <a href="/" id="site-logo">[% c.cobrand.site_title | html %]</a>
<a href="#main-nav" id="nav-link">Main Navigation</a>
</div>
</header>
diff --git a/templates/web/fixmystreet/index.html b/templates/web/fixmystreet/index.html
index 492adbbe5..5d7d31baa 100644
--- a/templates/web/fixmystreet/index.html
+++ b/templates/web/fixmystreet/index.html
@@ -33,26 +33,9 @@ kinds of problems like missed bins use our
<div class="tablewrapper">
<div id="front-howto">
- <h2>[% loc('How to report a problem') %]</h2>
-
- <ol class="big-numbers">
- <li>[% question %]</li>
- <li>[% loc('Locate the problem on a map of the area') %]</li>
- <li>[% loc('Enter details of the problem') %]</li>
- [% IF c.cobrand.is_council %]
- <li>Confirm the report and [% c.cobrand.council_name %] will investigate</li>
- [% ELSE %]
- <li>[% loc('We send it to the council on your behalf') %]</li>
- [% END %]
- </ol>
-
- <section class="full-width">
- [% INCLUDE "front/stats.html" %]
- [% TRY %][% INCLUDE "front/tips.html" %][% CATCH file %][% END %]
- </section>
+ [% INCLUDE 'index-steps.html' %]
</div>
-
[%
recent_photos = c.cobrand.recent_photos('front', 5);
%]
diff --git a/templates/web/fixmystreet/my/my.html b/templates/web/fixmystreet/my/my.html
index e170202de..258f147c6 100644
--- a/templates/web/fixmystreet/my/my.html
+++ b/templates/web/fixmystreet/my/my.html
@@ -13,6 +13,10 @@
<h1>[% loc('Your Reports') %]</h1>
+[% IF c.cobrand.moniker == 'fixmybarangay' %]
+ [% INCLUDE '_barangay_buttons.html' %]
+[% END %]
+
[% INCLUDE 'pagination.html',
pager = problems_pager,
param = 'p'
diff --git a/templates/web/fixmystreet/questionnaire/completed-open.html b/templates/web/fixmystreet/questionnaire/completed-open.html
index 2bb3bad1f..f39083cce 100644
--- a/templates/web/fixmystreet/questionnaire/completed-open.html
+++ b/templates/web/fixmystreet/questionnaire/completed-open.html
@@ -1,6 +1,12 @@
+[% IF c.cobrand.is_council %]
+<p style="font-size: 150%">
+Thank you very much for filling in our questionnaire.
+</p>
+[% ELSE %]
[% loc('<p style="font-size:150%">We&rsquo;re sorry to hear that. We have two
suggestions: why not try <a href="http://www.writetothem.com/">writing direct
to your councillor(s)</a> or, if it&rsquo;s a problem that could be fixed by
local people working together, why not
<a href="http://www.pledgebank.com/new">make and publicise a pledge</a>?
</p>' ) %]
+[% END %]
diff --git a/templates/web/fixmystreet/report/_main.html b/templates/web/fixmystreet/report/_main.html
deleted file mode 100644
index 7ceb1f6a5..000000000
--- a/templates/web/fixmystreet/report/_main.html
+++ /dev/null
@@ -1,21 +0,0 @@
-<div class="problem-header cf">
- <h1>[% problem.title | html %]</h1>
-
- <p><em>
- [% problem.meta_line(c) | html %]
- [% IF problem.council %]
- [% IF problem.whensent || problem.can_display_external_id %]
- <small class="council_sent_info"><br>
- [% problem.processed_summary_string(c) %]
- </small>
- [% END %]
- [% ELSE %]
- <br><small>[% loc('Not reported to council') %]</small>
- [% END %]
- </em></p>
-
- [% INCLUDE 'report/photo.html' object=problem center=1 %]
-
- [% add_links( problem.detail ) | html_para %]
-
-</div>
diff --git a/templates/web/fixmystreet/report/display.html b/templates/web/fixmystreet/report/display.html
index e9c8ee21d..26e6fe992 100644
--- a/templates/web/fixmystreet/report/display.html
+++ b/templates/web/fixmystreet/report/display.html
@@ -7,7 +7,7 @@
title = problem_title
rss = [ loc('Updates to this problem, FixMyStreet'), "/rss/$problem.id" ]
robots = 'index, nofollow'
- bodyclass = 'mappage'
+ bodyclass = 'mappage';
%]
[% map_html %]
@@ -15,20 +15,39 @@
</div>
[% INCLUDE 'report/banner.html' %]
+
[% INCLUDE 'report/_main.html' %]
+[% TRY %][% INCLUDE 'report/_message_manager.html' %][% CATCH file %][% END %]
<div class="shadow-wrap">
<ul id="key-tools">
+ [% IF c.user_exists AND c.cobrand.users_can_hide AND c.user.belongs_to_council( c.cobrand.council_id ) %]
+ <li><form method="post" action="/report/delete/[% problem.id %]">
+ <input type="submit" id="key-tool-report-abuse" class="abuse" value="Remove from site">
+ </form></li>
+ [% ELSE %]
<li><a rel="nofollow" id="key-tool-report-abuse" class="abuse" href="[% c.uri_for( '/contact', { id => problem.id } ) %]">[% loc('Report abuse' ) %]</a></li>
+ [% END %]
<li><a rel="nofollow" id="key-tool-report-updates" class="feed" href="[% c.uri_for( '/alert/subscribe', { id => problem.id } ) %]">[% loc('Get updates' ) %]</a></li>
+ [% IF c.cobrand.moniker == 'fixmystreet' %]
+ <li><a rel="nofollow" id="key-tool-report-share" class="share" href="#report-share">[% loc('Share') %]</a></li>
+ [% END %]
<li><a class="chevron" id="key-tool-problems-nearby" href="[% c.uri_for( '/around', { lat => short_latitude, lon => short_longitude } ) %]">[% loc( 'Problems nearby' ) %]</a></li>
</ul>
+[% IF c.cobrand.moniker == 'fixmystreet' %]
+ <div id="report-share" class="hidden-js" align="center">
+ <a href="https://twitter.com/share" class="twitter-share-button" data-text="I just reported &lsquo;[% problem.title | html %]&rsquo;" data-via="fixmystreet" data-related="mysociety" data-count="none" data-dnt="true">Tweet</a>
+<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="//platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script>
+ <iframe src="//www.facebook.com/plugins/like.php?href=[% c.req.uri | uri %]&amp;send=false&amp;layout=button_count&amp;width=90&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font&amp;height=21" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:90px; height:21px;" allowTransparency="true"></iframe>
+ </div>
+[% END %]
+
<div id="report-updates-data" class="hidden-js">
<form action="[% c.uri_for( '/alert/subscribe' ) %]" method="post">
- <p><a href="[% c.uri_for( '/rss', problem.id ) %]">
- <img src="/i/feed.png" width="16" height="16" title="[% loc('RSS feed') %]" alt="[% loc('RSS feed of updates to this problem' ) %]" border="0" style="float: right">
- </a></p>
+ <a href="[% c.uri_for( '/rss', problem.id ) %]">
+ <img src="/i/feed.png" width="16" height="16" title="[% loc('RSS feed') %]" alt="[% loc('RSS feed of updates to this problem' ) %]" border="0">
+ </a>
<p>[% loc('Receive email when updates are left on this problem.' ) %]</p>
<fieldset>
<label class="hidden n" for="alert_rznvy">[% loc('Your email') %]</label>
@@ -45,149 +64,5 @@
</div>
[% INCLUDE 'report/updates.html' %]
-
-<div id="update_form">
- <h2>[% loc( 'Provide an update') %]</h2>
-
- [% IF c.cobrand.moniker != 'emptyhomes' %]
- <div class="general-sidebar-notes">
- [% INCLUDE 'report/updates-sidebar-notes.html' %]
- </div>
- [% END %]
-
- [% INCLUDE 'errors.html' %]
-
- <form method="post" action="[% c.uri_for( '/report/update' ) %]" name="updateForm" class="validate"[% IF c.cobrand.allow_photo_upload %] enctype="multipart/form-data"[% END %]>
- <fieldset>
- <input type="hidden" name="submit_update" value="1">
- <input type="hidden" name="id" value="[% problem.id | html %]">
-
- <label for="form_update">[% loc( 'Update' ) %]</label>
- [% IF field_errors.update %]
- <div class='form-error'>[% field_errors.update %]</div>
- [% END %]
- <textarea rows="7" cols="30" name="update" id="form_update" placeholder="[% loc('Please write your update here') %]" required>[% update.text | html %]</textarea>
-
- [% IF c.user && c.user.belongs_to_council( problem.council ) %]
- <label for="form_state">[% loc( 'State' ) %]</label>
- <select name="state" id="form_state">
- [% FOREACH state IN [ ['confirmed', loc('Open')], ['investigating',
- loc('Investigating')], ['action scheduled', loc('Action Scheduled')],
- ['in progress', loc('In Progress')], ['duplicate', loc('Duplicate')],
- ['unable to fix', loc('Unable to fix')], ['not responsible', loc('Not Responsible')],
- ['fixed', loc('Fixed')] ] %]
- <option [% 'selected ' IF state.0 == problem.state %] value="[% state.0 %]">[% state.1 %]</option>
- [% END %]
- </select>
- [% ELSE %]
- [% IF problem.is_fixed AND c.user_exists AND c.user.id == problem.user_id %]
-
- <input type="checkbox" name="reopen" id="form_reopen" value="1"[% ' checked' IF update.mark_open %]>
- <label class="inline" for="form_reopen">[% loc('This problem has not been fixed') %]</label>
-
- [% ELSIF !problem.is_fixed %]
-
- <div class="checkbox-group">
- <input type="checkbox" name="fixed" id="form_fixed" value="1"[% ' checked' IF update.mark_fixed %]>
- <label class="inline" for="form_fixed">[% loc('This problem has been fixed') %]</label>
- </div>
-
- [% END %]
- [% END %]
-
- [% IF c.cobrand.allow_photo_upload %]
- <div id="fileupload_normalUI">
- [% IF upload_fileid %]
- <img align="right" src="/photo/[% upload_fileid %].temp.jpeg" alt="">
- <p>[% loc('You have already attached a photo to this update, attaching another one will replace it.') %]</p>
- <input type="hidden" name="upload_fileid" value="[% upload_fileid %]">
- [% END %]
- <label for="form_photo">[% loc('Photo') %]</label>
- [% IF field_errors.photo %]
- <p class='form-error'>[% field_errors.photo %]</p>
- [% END %]
- <input type="file" name="photo" id="form_photo">
- </div>
- [% END %]
-
- [% IF c.user_exists %]
-
- [% INCLUDE name %]
-
- <input class="final-submit green-btn" type="submit" id="update_post" value="[% loc('Post') %]">
-
-
- [% ELSE %]
-
- <label for="form_rznvy">[% loc('Email' ) %]</label>
- [% IF field_errors.email %]
- <p class='form-error'>[% field_errors.email %]</p>
- [% END %]
- <input type="email" name="rznvy" id="form_rznvy" value="[% update.user.email | html %]" placeholder="[% loc('Your email address' ) %]" required>
-
- <div id="form_sign_in">
- <h3>[% loc("Now to submit your update&hellip;") %]</h3>
- <h2>[% loc("Do you have a FixMyStreet password?") %]</h2>
-
- <div id="form_sign_in_yes" class="form-box">
- <h5>[% loc('<strong>Yes</strong> I have a password') %]</h5>
-
- <label class="hidden-js n" for="password_sign_in">[% loc('Yes I have a password') %]</label>
- [% IF field_errors.password %]
- <p class='form-error'>[% field_errors.password %]</p>
- [% END %]
- <div class="form-txt-submit-box">
- <input type="password" name="password_sign_in" id="password_sign_in" value="" placeholder="[% loc('Your password') %]">
- <input class="green-btn" type="submit" name="submit_sign_in" id="submit_sign_in" value="[% loc('Post') %]">
- </div>
-
- <div class="checkbox-group">
- <input type="checkbox" id="remember_me" name="remember_me" value='1'[% ' checked' IF remember_me %]>
- <label class="inline n" for="remember_me">[% loc('Keep me signed in on this computer') %]</label>
- </div>
- </div>
- <div id="form_sign_in_no" class="form-box">
- <h5>[% loc('<strong>No</strong> Let me confirm my update by email') %]</h5>
-
- [% INCLUDE name %]
-
- <div class="general-sidebar-notes">
- <p class="dark">[% loc('We never show your email') %]</p>
- <p>[% loc('Providing a password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports.') %]</p>
- </div>
-
- <label for="password_register">[% loc('Password (optional)') %]</label>
-
- <div class="form-txt-submit-box">
- <input type="password" name="password_register" id="password_register" value="" placeholder="[% loc('Enter a password') %]">
- <input class="green-btn" type="submit" name="submit_register" id="submit_register" value="[% loc('Post') %]">
- </div>
- </div>
- </div>
-
- [% END %]
- </fieldset>
- </form>
-</div>
-
-
-
+[% INCLUDE 'report/update-form.html' %]
[% INCLUDE 'footer.html' %]
-
-[% BLOCK name %]
- [% INCLUDE 'report/new/extra_name.html' %]
- <label for="form_name">[% loc('Name') %]</label>
- [% IF field_errors.name %]
- <p class='form-error'>[% field_errors.name %]</p>
- [% END %]
- <input type="text" [% IF problem.council == '2482' %]class="validName" [% END %]name="name" id="form_name" value="[% update.name || c.user.name | html %]" placeholder="[% loc('Your name') %]">
-
- <div class="checkbox-group">
- <input type="checkbox" name="may_show_name" id="form_may_show_name" value="1"[% ' checked' UNLESS update.anonymous %]>
- <label class="inline" for="form_may_show_name">[% loc('Show my name publicly') %]</label>
- </div>
- <div class="checkbox-group">
- <input type="checkbox" name="add_alert" id="form_add_alert" value="1"[% ' checked' IF add_alert %]>
- <label class="inline" for="form_add_alert">[% loc( 'Alert me to future updates' ) %]</label>
- </div>
-[% END %]
diff --git a/templates/web/fixmystreet/report/new/category_extras.html b/templates/web/fixmystreet/report/new/category_extras.html
index c2a213225..ae1214c35 100644
--- a/templates/web/fixmystreet/report/new/category_extras.html
+++ b/templates/web/fixmystreet/report/new/category_extras.html
@@ -11,14 +11,14 @@
[% END -%]
[% IF meta.exists('values') %]
<select name="[% meta_name %]" id="form_[% meta_name %]"[% meta.required == 'true' ? ' required' : '' %]>
- [% FOR option IN meta.values.value.keys %]
- <option value="[% meta.values.value.$option.key %]">[% option %]</option>
+ [% FOR option IN meta.values.value %]
+ <option value="[% option.key.0 %]"[% IF option.key.0 == report_meta.$meta_name.value %] selected[% END %]>[% option.name.0 %]</option>
[% END %]
</select>
[% ELSE %]
- <input type="text" value="[% report_meta.$meta_name | html %]" name="[% meta_name %]" id="form_[% meta_name %]"[% meta.required == 'true' ? ' required' : '' %]>
+ <input type="text" value="[% report_meta.$meta_name.value | html %]" name="[% meta_name %]" id="form_[% meta_name %]"[% meta.required == 'true' ? ' required' : '' %]>
[% END %]
[%- END %]
[%- END %]
-</div> \ No newline at end of file
+</div>
diff --git a/templates/web/fixmystreet/report/new/fill_in_details_form.html b/templates/web/fixmystreet/report/new/fill_in_details_form.html
index 237533657..fb342d487 100644
--- a/templates/web/fixmystreet/report/new/fill_in_details_form.html
+++ b/templates/web/fixmystreet/report/new/fill_in_details_form.html
@@ -15,6 +15,7 @@
[% PROCESS 'report/new/councils_text.html' %]
[% END %]
+ [% IF c.cobrand.moniker != 'fixmybarangay' || ( c.user && c.user.from_council ) %]
<div id="report-a-problem-sidebar">
<!--
The text for this section needs checking, but I can't work out which bit comes from where
@@ -35,12 +36,13 @@
[% END %]
</p>
</div>
-
+
<div class="sidebar-notes">
[% INCLUDE 'report/new/notes.html' %]
</div>
</div>
+ [% END %]
[% INCLUDE 'errors.html' %]
<fieldset>
@@ -87,11 +89,7 @@
[%- END %]
[% IF c.cobrand.allow_photo_upload %]
- [% IF field_errors.photo %]
- <p class='form-error'>[% field_errors.photo %]</p>
- [% END %]
-
-
+ <label for="form_photo">[% loc('Photo') %]</label>
[% IF upload_fileid || report.photo %]
[% IF upload_fileid %]
<img align="right" src="/photo/[% upload_fileid %].temp.jpeg" alt="">
@@ -104,14 +102,19 @@
<img align="right" src="/photo/[% report.id %].jpeg">
[% END %]
[% END %]
-
- <label for="form_photo">[% loc('Photo') %]</label>
+
+ [% IF field_errors.photo %]
+ <p class='form-error'>[% field_errors.photo %]</p>
+ [% END %]
<input type="file" name="photo" id="form_photo">
[% END %]
[% IF c.user_exists %]
<div class="form-box">
+ <label for="form_email">[% loc('Your email') %]</label>
+ <input disabled type="text" value="[% c.user.email | html %]">
+
[% INCLUDE 'report/new/extra_name.html' %]
<label for="form_name">[% loc('Name') %]</label>
@@ -122,13 +125,15 @@
[%# if there is nothing in the name field then set check box as default on form %]
<div class="checkbox-group">
- <input type="checkbox" name="may_show_name" id="form_may_show_name" value="1"[% ' checked' IF !report.anonymous %]>
- <label class="inline" for="form_may_show_name">[% loc('Show my name publicly') %]</label>
+ <input type="checkbox" name="may_show_name" id="form_may_show_name" value="1"[% ' checked' IF report.anonymous==0 OR (c.cobrand.default_show_name AND report.anonymous=='') %]>
+ <label class="inline" for="form_may_show_name">[% loc('Show my name publicly') %] </label>
</div>
+ [% IF c.cobrand.moniker != 'fixmybarangay' || c.user.from_council %]
<div class="general-sidebar-notes">
<p>[% loc('We never show your email address or phone number.') %]</p>
</div>
+ [% END %]
<label for="form_phone">[% loc('Phone number (optional)') %]</label>
<input class="" type="text" value="[% report.user.phone | html %]" name="phone" id="form_phone" placeholder="[% loc('Your phone number') %]">
@@ -166,6 +171,12 @@
<input type="checkbox" id="remember_me" name="remember_me" value='1'[% ' checked' IF remember_me %]>
<label class="n inline" for="remember_me">[% loc('Keep me signed in on this computer') %]</label>
</div>
+
+ <div class="general-sidebar-notes" id="forgotten-pw">
+ <p class="dark">[% loc('Forgotten your password?') %]</p>
+ <p>[% loc('Confirm by email below, providing a new password at that point. When you confirm, your password will be updated.') %]</p>
+ </div>
+
</div>
<div id="form_sign_in_no" class="form-box">
@@ -182,7 +193,7 @@
[%# if there is nothing in the name field then set check box as default on form %]
<div class="checkbox-group">
- <input type="checkbox" name="may_show_name" id="form_may_show_name" value="1"[% ' checked' IF !report.anonymous %]>
+ <input type="checkbox" name="may_show_name" id="form_may_show_name" value="1"[% ' checked' IF report.anonymous==0 OR (c.cobrand.default_show_name AND report.anonymous=='') %]>
<label class="inline" for="form_may_show_name">[% loc('Show my name publicly') %]</label>
</div>
diff --git a/templates/web/fixmystreet/report/new/fill_in_details_text.html b/templates/web/fixmystreet/report/new/fill_in_details_text.html
index 8b5e3a2ad..05527bb24 100644
--- a/templates/web/fixmystreet/report/new/fill_in_details_text.html
+++ b/templates/web/fixmystreet/report/new/fill_in_details_text.html
@@ -1,9 +1,6 @@
[%
IF area_ids_to_list.size != 0;
- loc('The council won&rsquo;t be able to help unless you leave as much
-detail as you can. Please describe the exact location of the problem (e.g. on a
-wall), what it is, how long it has been there, a description (and a photo of
-the problem if you have one), etc.');
+ loc('The council won&rsquo;t be able to help unless you leave as much detail as you can. Please describe the exact location of the problem (e.g. on a wall), what it is, how long it has been there, a description (and a photo of the problem if you have one), etc.');
IF category_extras;
' ' _ loc('Some categories may require additional information.');
END;
diff --git a/templates/web/fixmystreet/report/new/notes.html b/templates/web/fixmystreet/report/new/notes.html
index aa73f0694..d508b1929 100644
--- a/templates/web/fixmystreet/report/new/notes.html
+++ b/templates/web/fixmystreet/report/new/notes.html
@@ -3,7 +3,7 @@
<ul class="plain-list">
<li>[% loc("We will only use your personal information in accordance with our <a href=\"/privacy\">privacy policy.</a>") %]</li>
<li>[% loc("Please be polite, concise and to the point.") %]</li>
- <li>[% loc("Please do not be abusive &mdash; abusing your council devalues the service for all users.") %]</li>
+ <li>[% loc("Please do not be abusive&nbsp;&mdash; abusing your council devalues the service for all users.") %]</li>
<li>[% loc("Writing your message entirely in block capitals makes it hard to read, as does a lack of punctuation.") %]</li>
<li>[% loc("Remember that FixMyStreet is primarily for reporting physical problems that can be fixed. If your problem is not appropriate for submission via this site remember that you can contact your council directly using their own website.") %]</li>
</ul>
diff --git a/templates/web/fixmystreet/report/photo.html b/templates/web/fixmystreet/report/photo.html
deleted file mode 100644
index 02ab9228b..000000000
--- a/templates/web/fixmystreet/report/photo.html
+++ /dev/null
@@ -1,8 +0,0 @@
-[% IF c.cobrand.allow_photo_display && object.photo %]
-[% photo = object.get_photo_params %]
-<div class="update-img">
- [% IF photo.url_full %]<a href="[% photo.url_full %]" rel="fancy">[% END
- %]<img alt="Photo of this report" [% IF photo.height %]height="[% photo.height %]" width="[% photo.width %]"[% END %] src="[% photo.url %]">
- [%- IF photo.url_full %]<span>zoom</span></a>[% END %]
-</div>
-[% END %]
diff --git a/templates/web/fixmystreet/report/update-form.html b/templates/web/fixmystreet/report/update-form.html
new file mode 100644
index 000000000..a632cfc4a
--- /dev/null
+++ b/templates/web/fixmystreet/report/update-form.html
@@ -0,0 +1,150 @@
+[% allow_creation = !c.cobrand.only_authed_can_create || (c.user && c.user.from_council) %]
+[% IF allow_creation %]
+<div id="update_form">
+ <h2>[% loc( 'Provide an update') %]</h2>
+
+ [% IF c.cobrand.moniker != 'emptyhomes' AND c.cobrand.moniker != 'stevenage' %]
+ <div class="general-sidebar-notes">
+ [% INCLUDE 'report/updates-sidebar-notes.html' %]
+ </div>
+ [% END %]
+
+ [% INCLUDE 'errors.html' %]
+
+ <form method="post" action="[% c.uri_for( '/report/update' ) %]" id="form_update_form" name="updateForm" class="validate"[% IF c.cobrand.allow_photo_upload %] enctype="multipart/form-data"[% END %]>
+ <fieldset>
+ <input type="hidden" name="submit_update" value="1">
+ <input type="hidden" name="id" value="[% problem.id | html %]">
+
+ <label for="form_update">[% loc( 'Update' ) %]</label>
+ [% IF field_errors.update %]
+ <div class='form-error'>[% field_errors.update %]</div>
+ [% END %]
+ <textarea rows="7" cols="30" name="update" id="form_update" placeholder="[% loc('Please write your update here') %]" required>[% update.text | html %]</textarea>
+
+ [% IF c.user && c.user.belongs_to_council( problem.council ) %]
+ <label for="form_state">[% loc( 'State' ) %]</label>
+ <select name="state" id="form_state">
+ [% FOREACH state IN [ ['confirmed', loc('Open')], ['investigating',
+ loc('Investigating')], ['action scheduled', loc('Action Scheduled')],
+ ['in progress', loc('In Progress')], ['duplicate', loc('Duplicate')],
+ ['unable to fix', loc('Unable to fix')], ['not responsible', loc('Not Responsible')],
+ ['fixed', loc('Fixed')] ] %]
+ <option [% 'selected ' IF state.0 == problem.state %] value="[% state.0 %]">[% state.1 %]</option>
+ [% END %]
+ </select>
+ [% ELSE %]
+ [% IF problem.is_fixed AND c.user_exists AND c.user.id == problem.user_id %]
+
+ <input type="checkbox" name="reopen" id="form_reopen" value="1"[% ' checked' IF update.mark_open %]>
+ <label class="inline" for="form_reopen">[% loc('This problem has not been fixed') %]</label>
+
+ [% ELSIF !problem.is_fixed %]
+
+ <div class="checkbox-group">
+ <input type="checkbox" name="fixed" id="form_fixed" value="1"[% ' checked' IF update.mark_fixed %]>
+ <label class="inline" for="form_fixed">[% loc('This problem has been fixed') %]</label>
+ </div>
+
+ [% END %]
+ [% END %]
+
+ [% IF c.cobrand.allow_photo_upload %]
+ <div id="fileupload_normalUI">
+ [% IF upload_fileid %]
+ <img align="right" src="/photo/[% upload_fileid %].temp.jpeg" alt="">
+ <p>[% loc('You have already attached a photo to this update, attaching another one will replace it.') %]</p>
+ <input type="hidden" name="upload_fileid" value="[% upload_fileid %]">
+ [% END %]
+ <label for="form_photo">[% loc('Photo') %]</label>
+ [% IF field_errors.photo %]
+ <p class='form-error'>[% field_errors.photo %]</p>
+ [% END %]
+ <input type="file" name="photo" id="form_photo">
+ </div>
+ [% END %]
+
+ [% IF c.user_exists %]
+
+ [% INCLUDE name %]
+
+ <input class="final-submit green-btn" type="submit" id="update_post" value="[% loc('Post') %]">
+
+
+ [% ELSE %]
+
+ <label for="form_rznvy">[% loc('Email' ) %]</label>
+ [% IF field_errors.email %]
+ <p class='form-error'>[% field_errors.email %]</p>
+ [% END %]
+ <input type="email" name="rznvy" id="form_rznvy" value="[% update.user.email | html %]" placeholder="[% loc('Your email address' ) %]" required>
+
+ <div id="form_sign_in">
+ <h3>[% loc("Now to submit your update&hellip;") %]</h3>
+ <h2>[% loc("Do you have a FixMyStreet password?") %]</h2>
+
+ <div id="form_sign_in_yes" class="form-box">
+ <h5>[% loc('<strong>Yes</strong> I have a password') %]</h5>
+
+ <label class="hidden-js n" for="password_sign_in">[% loc('Yes I have a password') %]</label>
+ [% IF field_errors.password %]
+ <p class='form-error'>[% field_errors.password %]</p>
+ [% END %]
+ <div class="form-txt-submit-box">
+ <input type="password" name="password_sign_in" id="password_sign_in" value="" placeholder="[% loc('Your password') %]">
+ <input class="green-btn" type="submit" name="submit_sign_in" id="submit_sign_in" value="[% loc('Post') %]">
+ </div>
+
+ <div class="checkbox-group">
+ <input type="checkbox" id="remember_me" name="remember_me" value='1'[% ' checked' IF remember_me %]>
+ <label class="inline n" for="remember_me">[% loc('Keep me signed in on this computer') %]</label>
+ </div>
+
+ <div class="general-sidebar-notes" id="forgotten-pw">
+ <p class="dark">[% loc('Forgotten your password?') %]</p>
+ <p>[% loc('Confirm by email below, providing a new password at that point. When you confirm, your password will be updated.') %]</p>
+ </div>
+
+ </div>
+ <div id="form_sign_in_no" class="form-box">
+ <h5>[% loc('<strong>No</strong> Let me confirm my update by email') %]</h5>
+
+ [% INCLUDE name %]
+
+ <div class="general-sidebar-notes">
+ <p class="dark">[% loc('We never show your email') %]</p>
+ <p>[% loc('Providing a password is optional, but doing so will allow you to more easily report problems, leave updates and manage your reports.') %]</p>
+ </div>
+
+ <label for="password_register">[% loc('Password (optional)') %]</label>
+
+ <div class="form-txt-submit-box">
+ <input type="password" name="password_register" id="password_register" value="" placeholder="[% loc('Enter a password') %]">
+ <input class="green-btn" type="submit" name="submit_register" id="submit_register" value="[% loc('Post') %]">
+ </div>
+ </div>
+ </div>
+
+ [% END %]
+ </fieldset>
+ </form>
+</div>
+[% END %]
+
+[% BLOCK name %]
+ [% INCLUDE 'report/new/extra_name.html' %]
+ <label for="form_name">[% loc('Name') %]</label>
+ [% IF field_errors.name %]
+ <p class='form-error'>[% field_errors.name %]</p>
+ [% END %]
+ <input type="text" [% IF problem.council == '2482' %]class="validName" [% END %]name="name" id="form_name" value="[% update.name || c.user.name | html %]" placeholder="[% loc('Your name') %]">
+
+ <div class="checkbox-group">
+ <input type="checkbox" name="may_show_name" id="form_may_show_name" value="1"[% ' checked' IF update.anonymous==0 OR (c.cobrand.default_show_name AND update.anonymous=='') %]>
+ <label class="inline" for="form_may_show_name">[% loc('Show my name publicly') %]</label>
+ </div>
+ <div class="checkbox-group">
+ <input type="checkbox" name="add_alert" id="form_add_alert" value="1"[% ' checked' IF add_alert %]>
+ <label class="inline" for="form_add_alert">[% loc( 'Alert me to future updates' ) %]</label>
+ </div>
+[% END %]
diff --git a/templates/web/fixmystreet/report/updates-sidebar-notes.html b/templates/web/fixmystreet/report/updates-sidebar-notes.html
index 1bd07b765..e59d61fec 100644
--- a/templates/web/fixmystreet/report/updates-sidebar-notes.html
+++ b/templates/web/fixmystreet/report/updates-sidebar-notes.html
@@ -1,5 +1,5 @@
<p>
- [% IF problem.council != '2482' OR problem.send_method_used != 'Open311' %]
+ [% IF ( problem.council != '2482' AND !problem.council.match('2347') ) OR problem.send_method_used != 'Open311' %]
[% loc( 'Please note that updates are not sent to the council.' ) %]
[% END %]
[% loc( 'Your information will only be used in accordance with our <a href="/privacy">privacy policy</a>' ) %]</p>
diff --git a/templates/web/fixmystreet/reports/_extras.html b/templates/web/fixmystreet/reports/_extras.html
new file mode 100755
index 000000000..e210b9c07
--- /dev/null
+++ b/templates/web/fixmystreet/reports/_extras.html
@@ -0,0 +1,24 @@
+[%
+ fms_councils = {
+ 'Bromley Council' = 'fix.bromley.gov.uk'
+ 'Barnet Borough Council' = 'barnet.fixmystreet.com'
+ 'Lichfield District Council' = 'lichfielddc.fixmystreet.com'
+ 'Reading Borough Council' = 'reading.fixmystreet.com'
+ 'Southampton City Council' = 'southampton.fixmystreet.com'
+ }
+ secure = {
+ 'fix.bromley.gov.uk' = 's'
+ }
+ site = fms_councils.${area.name}
+%]
+[% IF site %]
+<tr align="center"
+[%- IF ! (loop.count % 2) %] class="a"
+[%- END %]>
+<td class="title" colspan="6" style="padding-top:0">
+ <small title="This council's online reporting is powered by FixMyStreet">(includes reports from
+ <a href="http[% secure.$site %]://[% site %]">[% site %]</a> using
+ <a href="http://www.mysociety.org/for-councils/fixmystreet/">FixMyStreet for Councils</a>)</small>
+</td>
+</tr>
+[% END %]
diff --git a/templates/web/oxfordshire/around/intro.html b/templates/web/oxfordshire/around/intro.html
new file mode 100644
index 000000000..81b2569f6
--- /dev/null
+++ b/templates/web/oxfordshire/around/intro.html
@@ -0,0 +1 @@
+ <h1 class="main">Reporting a problem in Oxfordshire</h1>
diff --git a/templates/web/oxfordshire/faq/faq-en-gb.html b/templates/web/oxfordshire/faq/faq-en-gb.html
new file mode 100755
index 000000000..02dd23cd9
--- /dev/null
+++ b/templates/web/oxfordshire/faq/faq-en-gb.html
@@ -0,0 +1,206 @@
+[% INCLUDE 'header.html', title => loc('Frequently Asked Questions'), bodyclass => 'twothirdswidthpage' %]
+
+<div class="sticky-sidebar">
+ <aside>
+ <ul class="plain-list">
+ <li><a href="#faq">Frequently Asked Questions</a></li>
+ <li><a href="#practical">Practical Questions</a></li>
+ <li><a href="#organisation">Organisation Questions</a></li>
+ <li><a href="/privacy">Privacy and cookies</a></li>
+ <li><a href="/contact">Contact FixMyStreet</a></li>
+ </ul>
+ </aside>
+</div>
+
+<h1><a name="faq"></a>Frequently Asked Questions</h1>
+ <dl>
+ <dt>What is FixMyStreet?</dt>
+ <dd>FixMyStreet is a site to help people report, view,
+or discuss local problems they&rsquo;ve found to their local council by
+simply locating them on a map. It launched in early February
+2007.</dd>
+
+ <dt>What sort of problems should I report with FixMyStreet?</dt>
+ <dd>FixMyStreet is primarily for reporting things which are
+<strong>broken or dirty or damaged or dumped, and need fixing, cleaning
+or clearing</strong>, such as:
+
+ <ul><li>Abandoned vehicles
+ <li>Dog Fouling
+ <li>Flyposting or graffiti
+ <li>Flytipping or litter
+ <li>Streetcleaning, such as broken glass in a cycle lane
+ <li>Unlit lamposts
+ <li>Potholes
+ </ul>
+ </dd>
+
+ <dt>What isn&rsquo;t FixMyStreet for?</dt>
+ <dd>FixMyStreet is not a way of getting in touch with the council for all
+ issues &ndash; please use FixMyStreet only for problems such as the above. We
+ often route problem reports via cleansing services or highways and so using
+ FixMyStreet for other matters may result in a delay in your report getting
+ to the right department. <strong>You will need to contact the council
+ directly for problems such as</strong>:
+
+ <ul><li>Anti-social behaviour
+ <li>Any urgent or emergency problems
+ <li>Noise pollution or barking dogs
+ <li>Fires and smoke/smell pollution
+ <li>Missing wheelie bins or recycling boxes or missed rubbish collections
+ <li>Proposals for speed bumps/ CCTV/ pedestrian crossings/ new road layouts/ etc.
+ <li>Complaining about your neighbours
+ <li>Complaining about the council
+ <li>Joy riding, drug taking, animal cruelty, or other criminal activity
+ </ul>
+ <p>Councils often have direct hotlines for these sorts of issues.</p>
+ </dd>
+
+ <dt><a name="pothole"></a>Should I report a pothole on this site, or call?</dt>
+<dd>
+<p>Please use the following chart to determine the size of any pot holes being
+reported and whether to submit a report online or by telephone.</p>
+
+<ul>
+<li>Depth of a milk bottle, <em>or</em> size of a dustbin lid? <strong>Call</strong>.
+<li>Depth of a golf/ping pong ball? <strong>Report online</strong>
+<li>Depth of a tennis ball, size of a dinner plate, <em>and</em> on a busy carriageway? <strong>Call</strong>
+<li>Depth of a tennis ball, otherwise? <strong>Report online</strong>
+<li>Depth of a coke can, on a pathway or busy carriageway? <strong>Call</strong>
+<li>Depth of a coke can, size of a dinner plate, on a quiet carriageway? <strong>Call</strong>
+<li>Depth of a coke can, otherwise? <strong>Report online</strong>
+</ul>
+
+</dd>
+
+ <dt>How do I use the site?</dt>
+ <dd>After entering a postcode or location, you are presented
+with a map of that area. You can view problems already reported in that area,
+or report ones of your own simply by clicking on the map at the location of
+the problem.</dd>
+
+ <dt>How are the problems solved?</dt>
+ <dd>They are reported to the council by email. The
+council can then resolve the problem the way they normally would.
+Alternatively, you can discuss the problem on the website with others, and
+then together lobby the council to fix it, or fix it directly yourselves.</dd>
+
+ <dt>Is it free?</dt>
+ <dd>The site is free to use, yes. FixMyStreet is run
+by a registered charity, though, so if you want to make a contribution, <a
+href="https://secure.mysociety.org/donate/">please do</a>.</dd>
+
+ <dt>Can I use FixMyStreet on my mobile?</dt>
+ <dd>
+ <p>The FixMyStreet website should work on your mobile phone, adapting to
+ the size of your screen automatically. We plan to release updated native
+ apps in the near future.
+ <ul>
+ <li><em>iPhone:</em> Our basic app from 2008 is available for download
+ on the App Store:
+ <a href="http://itunes.apple.com/gb/app/fixmystreet/id297456545">FixMyStreet</a>,
+ <li><em>Android:</em> A volunteer, Anna Powell-Smith, has written an app
+ available from the
+ <a href="https://market.android.com/details?id=com.android.fixmystreet">Android Market</a>.
+ <li><em>Nokia:</em> A volunteer, Thomas Forth, has written an app available from the
+ <a href="http://store.ovi.com/content/107557">Ovi Store</a>.
+ </ul>
+ </dd>
+
+ </dl>
+
+ <h2><a name="practical"></a>Practical Questions</h2>
+ <dl>
+ <dt>Do you remove silly or illegal content?</dt>
+ <dd>FixMyStreet is not responsible for the content and accuracy
+of material submitted by its users. We reserve the right to edit or remove any
+problems or updates which we consider to be inappropriate upon being informed
+by a user of the site.</dd>
+
+ <dt>Why does the site use kilometres for measurements?</dt>
+ <dd>Thanks for asking politely &ndash; we never quite understand why some of the rudest
+ emails we receive are on this topic. The British national
+ grid reference system, devised by Ordnance Survey (the British national
+ mapping agency) around the time of the second world war, uses eastings and
+ northings measured in metres and kilometres; the maps we use are from
+ Ordnance Survey and so this is what we use to display distances.
+ There you have it: not everything British is in miles!</dd>
+
+ <dt>Why can&rsquo;t I zoom out more on the reporting map?</dt>
+ <dd>We want to keep FixMyStreet locally focused, so restrict the ability to
+ move radically between areas. The map on Your Reports will let you see all
+ the reports you&rsquo;ve made, wherever they are. If you&rsquo;re from the
+ council then the emailed version of the problem report also contains the
+ closest road and postcode to the pin on the map.</dd>
+
+ <dt>This site is great – why aren&rsquo;t you better publicised?</dt>
+ <dd>As a tiny charity we simply don&rsquo;t have a publicity budget, and we
+ rely on word of mouth to advertise the site. We have a whole <a
+ href="posters/">array of posters, flyers and badges</a> if you&rsquo;d like
+ to publicise us on the web or in your local area, and why not write to your
+ local paper to let them know about us?</dd> </dl>
+
+ <h2><a name="organisation"></a>Organisation Questions</h2>
+ <dl>
+ <dt>Who built FixMyStreet?</dt>
+ <dd>This site was built by <a href="http://www.mysociety.org/">mySociety</a>,
+ in conjunction with the <a href="http://www.youngfoundation.org.uk/">Young Foundation</a>.
+mySociety is the project of a registered charity which has grown out of the community of
+volunteers who built sites like <a href="http://www.theyworkforyou.com/">TheyWorkForYou.com</a>.
+mySociety&rsquo;s primary mission is to build Internet projects which give people simple, tangible
+benefits in the civic and community aspects of their lives. Our first project
+was <a href="http://www.writetothem.com/">WriteToThem</a>, where you can write to any of your
+elected representatives, for free. The charity is called UK Citizens Online Democracy and is charity number 1076346. mySociety
+can be contacted by email at <a href="mailto:hello&#64;mysociety.org">hello&#64;mysociety.org</a>,
+or by post at mySociety, 483 Green Lanes, London, N13 4BS, UK.</dd>
+ <dt><img src="/i/moj.png" align="right" alt="Ministry of Justice" hspace="10">Who pays for it?</dt>
+ <dd>FixMyStreet was originally paid for via the Department for
+ Constitutional Affairs Innovations Fund. It is now funded by a variety of means, from commercial
+ work to <a href="http://www.mysociety.org/donate/">donations</a>.</dd>
+ <dt><a name="nfi"></a>Wasn&rsquo;t this site called Neighbourhood Fix-It?</dt>
+ <dd>Yes, we changed the name mid June 2007. We decided
+Neighbourhood Fix-It was a bit of a mouthful, hard to spell, and hard to publicise (does the URL have a dash in it or not?). The domain FixMyStreet became available, and everyone liked the name.</dd>
+ <dt>Do you need any help with the project?</dt>
+ <dd>Yes, we can use help in all sorts of ways, technical or
+non-technical. Please see our <a
+href="http://www.mysociety.org/helpus/">Get Involved page</a>.</dd>
+ <dt>I&rsquo;d like a site like this for my own location/ where&rsquo;s the "source code" to this site?</dt>
+ <dd>
+The software behind this site is open source, and available
+to you mainly under the GNU Affero GPL software license. You can <a
+href="http://github.com/mysociety/fixmystreet">download the
+source code</a> and help us develop it.
+You&rsquo;re welcome to use it in your own projects, although you must also
+make available the source code to any such projects.
+<a href="http://www.fiksgatami.no/">Fiksgatami</a> is an example of our code
+being used in a Norwegian version of this site.
+</dd>
+<dt>I&rsquo;d prefer code in a different language?</dt>
+<dd>
+VisibleGovernment.ca wrote their own code for
+<a href="http://www.fixmystreet.ca/">http://www.fixmystreet.ca/</a>, which is
+written in GeoDjango and available under an MIT licence at <a
+href="http://github.com/visiblegovernment/django-fixmystreet/tree/master">github</a>.
+Or <a href="http://www.fixmystreet.org.nz/">FixMyStreet.org.nz</a> is written in
+Drupal.
+</p>
+</dd>
+ <dt>People build things, not organisations. Who <em>actually</em> built it?</dt>
+ <dd>Matthew Somerville and Francis Irving wrote the site,
+Chris Lightfoot wrote the tileserver and map cutter, Richard Pope created
+our pins, Deborah Kerr keeps things up-to-date and does user support,
+Ayesha Garrett designed our posters, and Tom Steinberg managed it all.
+
+Thanks also to
+<a href="http://www.ordnancesurvey.co.uk">Ordnance Survey</a> (for the maps,
+UK postcodes, and UK addresses &ndash; data &copy; Crown copyright, all
+rights reserved, Ministry of Justice 100037819&nbsp;2008),
+Yahoo! for their BSD-licensed JavaScript libraries, the entire free software
+community (this particular project was brought to you by Perl, PostgreSQL,
+and the number 161.290) and <a
+href="http://www.bytemark.co.uk/">Bytemark</a> (who kindly host all
+our servers).
+
+Let us know if we&rsquo;ve missed anyone.</dd>
+ </dl>
+[% INCLUDE 'footer.html' pagefooter = 'yes' %]
diff --git a/templates/web/oxfordshire/footer.html b/templates/web/oxfordshire/footer.html
new file mode 100644
index 000000000..cfca706c8
--- /dev/null
+++ b/templates/web/oxfordshire/footer.html
@@ -0,0 +1,51 @@
+ [% IF pagefooter %]
+ <footer role="content-info">
+ <p><a href="/privacy">Privacy and cookies</a></p>
+ </footer>
+ [% END %]
+ </div><!-- .content role=main -->
+ </div><!-- .container -->
+ </div><!-- .table-cell -->
+
+ <div class="nav-wrapper">
+ <div class="nav-wrapper-2">
+ <div id="main-nav" role="navigation">
+ <ul id="mysoc-menu">
+ <li><a id="mysoc-logo" href="http://www.fixmystreet.com/">Powered by <img src="/cobrands/oxfordshire/images/fms-logo-105x20.png" alt="FixMyStreet"></a></li>
+ </ul>
+
+ <ul id="main-menu">
+ <li><[% IF c.req.uri.path == '/' %]span[% ELSE %]a href="/"[% END %] class="report-a-problem-btn"
+ >[% loc("Report a problem") %]</[% c.req.uri.path == '/' ? 'span' : 'a' %]></li>[%
+ %]<li><[% IF c.req.uri.path == '/my' %]span[% ELSE %]a href="/my"[% END
+ %]>[% loc("Your reports") %]</[% c.req.uri.path == '/my' ? 'span' : 'a' %]></li>[%
+ %]<li><[% IF c.req.uri.path == '/reports' %]span[% ELSE %]a href="/reports"[% END
+ %]>[% loc("All reports") %]</[% c.req.uri.path == '/reports' ? 'span' : 'a' %]></li>[%
+ %]<li><[% IF c.req.uri.path == '/alert' %]span[% ELSE %]a href="/alert[% pc ? '/list?pc=' : '' %][% pc | uri %]"[% END
+ %]>[% loc("Local alerts") %]</[% c.req.uri.path == '/alert' ? 'span' : 'a' %]></li>[%
+ %]<li><[% IF c.req.uri.path == '/faq' %]span[% ELSE %]a href="/faq"[% END
+ %]>[% loc("Help") %]</[% c.req.uri.path == '/faq' ? 'span' : 'a' %]></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+
+<!-- [% INCLUDE 'debug_footer.html' %] -->
+ </div> <!-- .wrapper -->
+ <div id="oxford-footer" class="desk-only">
+ <address>
+ <strong>Oxfordshire County Council</strong><br>
+ <a href="http://www.oxfordshire.gov.uk/cms/public-site/contact-oxfordshire-county-council" title="Contac the council">Contact the council</a>
+ </address>
+ <ul><!-- use | between items -->
+ <li>
+ <a href="/contact" title="Contact the FixMyStreet team">Contact</a> |
+ </li>
+ <li class="powered-by-fms">
+ <a href="http://www.fixmystreet.com/">Powered&nbsp;by&nbsp;<img src="/cobrands/oxfordshire/images/fms-logo-inverse.png" alt="FixMyStreet"></a>
+ </li>
+ </ul>
+ </div>
+</div> <!-- oxford-wrapper -->
+</body>
+</html>
diff --git a/templates/web/oxfordshire/header.html b/templates/web/oxfordshire/header.html
new file mode 100644
index 000000000..6c338452a
--- /dev/null
+++ b/templates/web/oxfordshire/header.html
@@ -0,0 +1,94 @@
+<!doctype html>
+<!--[if lt IE 7]><html class="no-js ie6 oldie" lang="[% lang_code %]"><![endif]-->
+<!--[if IE 7]> <html class="no-js ie7 oldie" lang="[% lang_code %]"><![endif]-->
+<!--[if IE 8]> <html class="no-js ie8 oldie" lang="[% lang_code %]"><![endif]-->
+<!--[if IE 9]> <html class="no-js ie9 oldie" lang="[% lang_code %]"><![endif]-->
+<!--[if gt IE 9]><!--><html class="no-js" lang="[% lang_code %]"><!--<![endif]-->
+ <head>
+ <meta name="viewport" content="initial-scale=1.0">
+
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
+ <meta name="HandHeldFriendly" content="true">
+ <meta name="mobileoptimized" content="0">
+
+[% SET start = c.config.ADMIN_BASE_URL IF admin %]
+
+ <link rel="stylesheet" href="[% start %][% version('/cobrands/' _ c.cobrand.moniker _ '/base.css') %]">
+ <link rel="stylesheet" href="[% start %][% version('/cobrands/' _ c.cobrand.moniker _ '/layout.css') %]" media="(min-width:48em)">
+ [% extra_css %]
+ <!--[if (lt IE 9) & (!IEMobile)]>
+ <link rel="stylesheet" href="[% start %][% version('/cobrands/' _ c.cobrand.moniker _ '/layout.css') %]">
+ <![endif]-->
+
+ <script src="[% start %][% version('/js/modernizr.custom.js') %]" charset="utf-8"></script>
+ <script src="[% start %][% version('/cobrands/oxfordshire/position_map.js') %]" charset="utf-8"></script>
+ [% INCLUDE 'common_header_tags.html', js_override = '/cobrands/fixmystreet/fixmystreet.js', site_title = 'FixMyStreet' %]
+ [% extra_js %]
+
+ [% IF c.req.uri.host == 'osm.fixmystreet.com' %]
+ <link rel="canonical" href="http://www.fixmystreet.com[% c.req.uri.path_query %]">
+ [% END %]
+
+ [% INCLUDE 'tracking_code.html' %]
+
+ </head>
+ <body class="[% bodyclass | html IF bodyclass %]">
+<div id="oxford-wrapper">
+ <div id="oxford-header" class="desk-only">
+ <a href="http://www.oxfordshire.gov.uk/" title="Home" class="logo">Oxfordshire County Council<span></span></a>
+ <span id="oxford-links">
+ <a href="http://www.oxfordshire.gov.uk/" title="">Oxfordshire County Council home</a>|<a href="/" title="">FixMyStreet</a>
+ </span>
+ <div style="clear:both"></div>
+ <span class="header"><a href="/">FixMyStreet</a></span>
+ <div class="oxford-user">
+ <p>
+ [% IF c.user_exists %]
+ [% tprintf(loc('Hi %s'), c.user.name || c.user.email) %]
+ <a href="/auth/sign_out">[% loc('sign out') %]</a>
+ [% END %]
+ </p>
+ </div>
+ </div> <!-- end of oxford header -->
+ <div id="oxford-main-menu" class="desk-only">
+ <ul class="tabs">
+ <li class="home first"><[% IF c.req.uri.path == '/' %]span[% ELSE %]a href="/"[% END %] class="report-a-problem-btn"
+ >[% "Report" %]</[% c.req.uri.path == '/' ? 'span' : 'a' %]></li>[%
+ %]<li><[% IF c.req.uri.path == '/my' OR ( c.req.uri.path == '/auth' AND c.req.params.r == 'my' ) %]span[% ELSE %]a href="/my"[% END
+ %]>[% loc("Your reports") %]</[% ( c.req.uri.path == '/my' OR ( c.req.uri.path == '/auth' AND c.req.params.r == 'my' ) ) ? 'span' : 'a' %]></li>[%
+ %]<li><[% IF c.req.uri.path == '/reports/Oxfordshire' %]span[% ELSE %]a href="/reports/Oxfordshire"[% END
+ %]>[% loc("All reports") %]</[% c.req.uri.path == '/reports' ? 'span' : 'a' %]></li>[%
+ %]<li><[% IF c.req.uri.path == '/alert' %]span[% ELSE %]a href="/alert[% pc ? '/list?pc=' : '' %][% pc | uri %]"[% END
+ %]>[% loc("Local alerts") %]</[% c.req.uri.path == '/alert' ? 'span' : 'a' %]></li>[%
+ %]<li class="last"><[% IF c.req.uri.path == '/faq' %]span[% ELSE %]a href="/faq"[% END
+ %]>[% loc("Help") %]</[% c.req.uri.path == '/faq' ? 'span' : 'a' %]></li>
+ </ul>
+ </div>
+
+ <div class="wrapper">
+
+ <div class="table-cell">
+ <header id="site-header" role="banner">
+ <div class="container">
+ <a href="/" id="site-logo">Oxfordshire FixMyStreet</a>
+ <a href="#main-nav" id="nav-link">Main Navigation</a>
+ </div>
+ </header>
+
+ <div id="user-meta">
+ [% IF c.user_exists %]
+ <p>
+ [% tprintf(loc('Hi %s'), c.user.name || c.user.email) %]
+ <a href="/auth/sign_out">[% loc('sign out') %]</a>
+ </p>
+ [% ELSE %]
+ <!-- <a href="/auth">[% loc('Sign in') %]</a> -->
+ [% END %]
+ </div>
+
+ [% pre_container_extra %]
+
+ <div class="container">
+ <div class="content[% " $mainclass" | html IF mainclass %]" role="main">
+
+ <!-- [% INCLUDE 'debug_header.html' %] -->
diff --git a/templates/web/oxfordshire/report/new/councils_text_all.html b/templates/web/oxfordshire/report/new/councils_text_all.html
new file mode 100644
index 000000000..e71a400ac
--- /dev/null
+++ b/templates/web/oxfordshire/report/new/councils_text_all.html
@@ -0,0 +1,18 @@
+<p>You can use this form to report a problem or to make an enquiry about roads
+and pavements in your area. All the information you provide here will be sent
+to <strong>[% all_council_names.join( '</strong> or <strong>' ) %]</strong>.
+The subject and details of the problem will be public, plus your name if you
+give us permission. If you report a fault on a road that is not owned by
+Oxfordshire County Council we will pass the report on to the relevant body.
+
+<p>Our opening hours are 8.30 to 5, Monday to Thursday and 8.30 to 4 on
+Fridays. Please <strong>do not</strong> use this form for reporting
+<strong>emergencies and urgent</strong> problems. You should report these by
+contacting 0845 310 11 11. If your enquiry is related to Highways and is
+outside of our opening hours and cannot wait, please contact Thames Valley
+Police on 101.</p>
+
+<p>Please use <a href="/faq#pothole" target="_blank">our chart</a> to determine
+the size of any pot holes being reported and whether to submit a report using
+this online form or by telephone.</p>
+
diff --git a/templates/web/oxfordshire/report/new/fill_in_details_text.html b/templates/web/oxfordshire/report/new/fill_in_details_text.html
new file mode 100644
index 000000000..065005956
--- /dev/null
+++ b/templates/web/oxfordshire/report/new/fill_in_details_text.html
@@ -0,0 +1,6 @@
+Oxfordshire County Council won’t be able to help unless you leave as much
+detail as you can. Please describe the exact location of the problem (e.g. in
+the carriageway), what it is, how long it has been there, a description and a
+photo of the problem if you have one. Please be aware that you can only attach
+one picture so ensure that you provide a picture that clearly shows the
+location not just the fault.
diff --git a/templates/web/oxfordshire/report/new/notes.html b/templates/web/oxfordshire/report/new/notes.html
new file mode 100644
index 000000000..e03fd8644
--- /dev/null
+++ b/templates/web/oxfordshire/report/new/notes.html
@@ -0,0 +1,10 @@
+<p>[% loc("Please note:") %]</p>
+
+<ul class="plain-list">
+ <li>[% loc("We will only use your personal information in accordance with our <a href=\"/privacy\">privacy policy.</a>") %]</li>
+ <li>[% loc("Please be polite, concise and to the point.") %]</li>
+ <li>[% loc("Please do not be abusive &mdash; abusing your council devalues the service for all users.") %]</li>
+ <li>[% loc("Writing your message entirely in block capitals makes it hard to read, as does a lack of punctuation.") %]</li>
+ <li>Remember that FixMyStreet is primarily for reporting physical problems that can be fixed. Remember that you can contact Oxfordshire County Council for additional issues that are not covered on this reporting facility.</li>
+</ul>
+
diff --git a/templates/web/seesomething/admin/footer.html b/templates/web/seesomething/admin/footer.html
new file mode 100644
index 000000000..bdd42e2e4
--- /dev/null
+++ b/templates/web/seesomething/admin/footer.html
@@ -0,0 +1,7 @@
+ </div><!-- .content role=main -->
+ </div><!-- .container -->
+ </div><!-- .table-cell -->
+<!-- [% INCLUDE 'debug_footer.html' %] -->
+ </div> <!-- .wrapper -->
+</body>
+</html>
diff --git a/templates/web/seesomething/admin/header.html b/templates/web/seesomething/admin/header.html
new file mode 100644
index 000000000..40bea25bf
--- /dev/null
+++ b/templates/web/seesomething/admin/header.html
@@ -0,0 +1,2 @@
+[% INCLUDE 'header.html' admin = 1, bodyclass = 'admin fullwidthpage' %]
+ <h1>[% title %]</h1>
diff --git a/templates/web/seesomething/admin/stats.html b/templates/web/seesomething/admin/stats.html
new file mode 100644
index 000000000..713c3fb6d
--- /dev/null
+++ b/templates/web/seesomething/admin/stats.html
@@ -0,0 +1,63 @@
+[% INCLUDE 'admin/header.html' title=loc('Reports') %]
+[% PROCESS 'admin/report_blocks.html' %]
+
+[% BLOCK options %]
+ [% FOR option IN option_list %]
+ <option value="[% option %]"[% ' selected' IF selected == option %]>[% option %]</opytion>
+ [% END %]
+[% END %]
+
+<form method="post" action="[% c.uri_for('stats') %]" enctype="application/x-www-form-urlencoded" accept-charset="utf-8" id="filter-form">
+ <label for="form_category">Transport Type: </label>
+ <select name="category" id="form_category">
+ <option value="">Select</option>
+ [% PROCESS options, option_list = [ 'Bus', 'Metro', 'Train' ], selected = category %]
+ </select>
+
+ <label for="form_subcategory">Incident Type: </label>
+ <select name="subcategory" id="form_subcategory">
+ <option value="">Select</option>
+ [% PROCESS options, option_list = ['Smoking', 'Drugs', 'Anti-social Behaviour', 'Loud Music', 'Damage', 'Feet on Seats', 'Other'], selected = subcategory %]
+ </select>
+
+ <label for="form_service">Device: </label>
+ <select name="service" id="form_service">
+ <option value="">Select</option>
+ [% PROCESS options, option_list = [ 'Android', 'iPhone' ], selected = service %]
+ </select>
+
+ <input type="submit" name="getcounts" size="30" id="getcounts" value="Look Up" />
+</form>
+
+[% IF pager.total_entries == 0 %]
+<p align="center">
+No Results found
+</p>
+[% ELSE %]
+<table class="admin-report">
+ <thead>
+ <tr>
+ <th>Device</th>
+ <th>Transport Category</th>
+ <th>Incident Category</th>
+ <th>Area</th>
+ <th>Submitted</th>
+ </tr>
+ </thead>
+ <tbody>
+ [%- WHILE (report = reports.next) %]
+ <tr>
+ <td>[% report.service || 'Other' %]</td>
+ <td>[% report.category %]</td>
+ <td class="nowrap">[% report.subcategory %]</td>
+ <td class="nowrap">[% council_details.${report.council}.name %]</td>
+ <td class="nowrap">[% PROCESS format_time time=report.confirmed %]</td>
+ </tr>
+ [%- END %]
+ </tbody>
+</table>
+[% END %]
+
+[% INCLUDE 'pagination.html', param = 'p' %]
+
+[% INCLUDE 'admin/footer.html' %]
diff --git a/templates/web/seesomething/around/around_index.html b/templates/web/seesomething/around/around_index.html
new file mode 100644
index 000000000..a143e90a2
--- /dev/null
+++ b/templates/web/seesomething/around/around_index.html
@@ -0,0 +1,24 @@
+[% INCLUDE 'header.html', title => loc('Reporting a problem'), bodyclass = 'mappage' %]
+
+<form action="[% c.uri_for('/around') %]" method="get" name="mapForm" id="mapForm">
+ <div id="side-form">
+ <div id="report-a-problem-main">
+ [% INCLUDE 'around/postcode_form.html' %]
+
+ [% IF location_error %]
+ <p class="error">[% location_error %]</p>
+ [% END %]
+
+ [% IF possible_location_matches %]
+ <p>[% loc('We found more than one match for that location. We show up to ten matches, please try a different search if yours is not here.') %]</p>
+ <ul class="pc_alternatives">
+ [% FOREACH match IN possible_location_matches %]
+ <li><a href="/around?latitude=[% match.latitude | uri %];longitude=[% match.longitude | uri %]">[% match.address | html %]</a></li>
+ [% END %]
+ </ul>
+ [% END %]
+ </div>
+ </div>
+</form>
+
+[% INCLUDE 'footer.html' %]
diff --git a/templates/web/seesomething/around/display_location.html b/templates/web/seesomething/around/display_location.html
new file mode 100644
index 000000000..e90d1aa0e
--- /dev/null
+++ b/templates/web/seesomething/around/display_location.html
@@ -0,0 +1,49 @@
+[%
+
+ url_skip = c.uri_for(
+ '/report/new',
+ {
+ pc => pc
+ latitude => short_latitude,
+ longitude => short_longitude,
+ skipped => 1,
+ }
+ );
+
+ PROCESS "maps/${map.type}.html";
+
+ INCLUDE 'header.html',
+ title => loc('Viewing a location')
+ bodyclass => 'mappage',
+ robots => 'noindex,nofollow';
+
+%]
+
+<form action="[% c.uri_for('/report/new') %]" method="post" name="mapForm" id="mapForm" enctype="multipart/form-data" class="validate">
+ [% IF c.req.params.map_override %]
+ <input type="hidden" name="map_override" value="[% c.req.params.map_override | html %]">
+ [% END %]
+ <input type="hidden" name="pc" value="[% pc | html %]">
+
+ <input type="hidden" name="latitude" id="fixmystreet.latitude" value="[% short_latitude | html %]">
+ <input type="hidden" name="longitude" id="fixmystreet.longitude" value="[% short_longitude | html %]">
+
+ [% map_html %]
+
+ </div>
+
+ <div id="side">
+ [% INCLUDE 'around/_report_banner.html' %]
+ </div>
+
+ <div style="display:none" id="side-form">
+ [% INCLUDE "report/new/fill_in_details_form.html"
+ js = 1,
+ report.used_map = 1
+ report.name = c.user.name
+ %]
+ </div>
+
+</form>
+
+[% INCLUDE 'footer.html' %]
diff --git a/templates/web/seesomething/around/postcode_form.html b/templates/web/seesomething/around/postcode_form.html
new file mode 100644
index 000000000..56fcdca97
--- /dev/null
+++ b/templates/web/seesomething/around/postcode_form.html
@@ -0,0 +1,17 @@
+<div id="front-main">
+ <div id="front-main-container">
+ [%
+ question = c.cobrand.enter_postcode_text || loc('Enter a nearby street name and area');
+ %]
+
+ <label for="pc">[% question %]:</label>
+ <div>
+ <input type="text" name="pc" value="[% pc | html %]" id="pc" size="10" maxlength="200" placeholder="[% tprintf(loc('e.g. ‘%s’ or ‘%s’'), c.cobrand.example_places) %]">
+ <input type="submit" value="[% loc('Go') %]" id="submit">
+ </div>
+
+ [% IF partial_token %]
+ <input type="hidden" name="partial" value="[% partial_token.token %]">
+ [% END %]
+ </div>
+</div>
diff --git a/templates/web/seesomething/auth/general.html b/templates/web/seesomething/auth/general.html
new file mode 100644
index 000000000..4fe2829d3
--- /dev/null
+++ b/templates/web/seesomething/auth/general.html
@@ -0,0 +1,46 @@
+[% INCLUDE 'header.html', title = loc('Sign in or create an account') %]
+
+<h1>[% loc('Sign in') %]</h1>
+
+<form action="[% c.uri_for() %]" method="post" name="general_auth" class="validate">
+ <fieldset>
+ <input type="hidden" name="r" value="[% c.req.params.r | html %]">
+
+ [% IF email_error;
+
+ # other keys include fqdn, mxcheck if you'd like to write a custom error message
+
+ errors = {
+ missing => loc('Please enter your email'),
+ other => loc('Please check your email address is correct')
+ };
+
+ loc_email_error = errors.$email_error || errors.other;
+ END %]
+ <label class="n" for="email">[% loc('Email') %]</label>
+ [% IF loc_email_error %]
+ <div class="form-error">[% loc_email_error %]</div>
+ [% ELSIF sign_in_error %]
+ <div class="form-error">[% loc('There was a problem with your email/password combination. If you cannot remember your password, or do not have one, please fill in the &lsquo;sign in by email&rsquo; section of the form.') %]</div>
+ [% END %]
+ <input type="email" class="required email" id="email" name="email" value="[% email | html %]" placeholder="[% loc('Your email address') %]">
+
+ <div class="form-txt-submit-box">
+ <label class="n" for="password_sign_in">Password</label>
+ <input type="password" name="password_sign_in" id="password_sign_in" value="" placeholder="[% loc('Your password') %]">
+ </div>
+
+ <div class="form-txt-submit-box">
+ <input type="checkbox" id="remember_me" name="remember_me" value='1'[% ' checked' IF remember_me %]>
+ <label class="inline n" for="remember_me">[% loc('Keep me signed in on this computer') %]</label>
+ </div>
+
+ <div class="form-txt-submit-box">
+ <input class="green-btn" type="submit" name="sign_in" value="[% loc('Sign in') %]">
+ </div>
+
+ </fieldset>
+</form>
+
+
+[% INCLUDE 'footer.html' %]
diff --git a/templates/web/seesomething/auth/sign_out.html b/templates/web/seesomething/auth/sign_out.html
new file mode 100644
index 000000000..ef1d11b58
--- /dev/null
+++ b/templates/web/seesomething/auth/sign_out.html
@@ -0,0 +1,7 @@
+[% INCLUDE 'header.html', title = loc('Sign out'), bodyclass = 'fullwidthpage' %]
+
+<h1>[% loc('You have been signed out') %]</h1>
+
+<p>Please feel free to <a href="[% c.uri_for('/auth', { r => 'admin/stats' } ) %]">sign in again</a></p>
+
+[% INCLUDE 'footer.html' %]
diff --git a/templates/web/seesomething/footer.html b/templates/web/seesomething/footer.html
new file mode 100644
index 000000000..95297f33d
--- /dev/null
+++ b/templates/web/seesomething/footer.html
@@ -0,0 +1,22 @@
+ </div><!-- .content role=main -->
+ </div><!-- .container -->
+ </div><!-- .table-cell -->
+
+ <div class="nav-wrapper">
+ <div class="nav-wrapper-2">
+ <div id="main-nav" role="navigation">
+
+ <ul id="main-menu">
+ <li><[% IF c.req.uri.path == '/' %]span[% ELSE %]a href="/"[% END %] class="report-a-problem-btn"
+ >[% loc("Report a problem") %]</[% c.req.uri.path == '/' ? 'span' : 'a' %]></li>[%
+ %]<li><[% IF c.req.uri.path == '/faq' %]span[% ELSE %]a href="/faq"[% END
+ %]>[% loc("Help") %]</[% c.req.uri.path == '/faq' ? 'span' : 'a' %]></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+
+<!-- [% INCLUDE 'debug_footer.html' %] -->
+ </div> <!-- .wrapper -->
+</body>
+</html>
diff --git a/templates/web/seesomething/front/stats.html b/templates/web/seesomething/front/stats.html
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/templates/web/seesomething/front/stats.html
diff --git a/templates/web/seesomething/front/tips.html b/templates/web/seesomething/front/tips.html
new file mode 100644
index 000000000..34712656d
--- /dev/null
+++ b/templates/web/seesomething/front/tips.html
@@ -0,0 +1,3 @@
+ <p>
+ If you are unsure about where the incident took place as you where on a moving train or bus then use the location of the start of your journey and mention which bus or train you where on in your report.
+ </p>
diff --git a/templates/web/seesomething/index.html b/templates/web/seesomething/index.html
new file mode 100644
index 000000000..cccd15709
--- /dev/null
+++ b/templates/web/seesomething/index.html
@@ -0,0 +1,43 @@
+[%# Assumes fixmystreet cobrand is using FMS map template - for bonus points preload all the right map elements. %]
+
+[% PROCESS "maps/fms.html" %]
+[% INCLUDE 'header.html', title = '', bodyclass = 'mappage' %]
+
+<form action="[% c.uri_for('/around') %]" method="get" name="mapForm" id="mapForm">
+<script type="text/javascript">
+var fixmystreet = {
+ 'page': '',
+ 'latitude': 52.505241,
+ 'longitude': -1.815285,
+ 'zoom': 3,
+ 'numZoomLevels': 5,
+ 'zoomOffset': 13,
+ 'map_type': ""
+
+}
+</script>
+<div id="map_box">
+ <div id="map"></div>
+ </div>
+
+ <div id="side-form">
+ <div id="report-a-problem-main">
+ [% form = PROCESS 'around/postcode_form.html' %]
+ [% form %]
+
+ [% IF error %]
+ <p class="form-error">[% error %]</p>
+ [% END %]
+
+ <div class="tablewrapper">
+ <div id="front-howto">
+ [% INCLUDE 'index-steps.html' %]
+ </div>
+
+ </div>
+
+ </div>
+ </div>
+</form>
+
+[% INCLUDE 'footer.html' pagefooter = 'yes' %]
diff --git a/templates/web/seesomething/js/validation_rules.html b/templates/web/seesomething/js/validation_rules.html
new file mode 100644
index 000000000..cef5fce7e
--- /dev/null
+++ b/templates/web/seesomething/js/validation_rules.html
@@ -0,0 +1,13 @@
+ validation_rules = {
+ detail: { required: true },
+ category: { required: true },
+ subcategory: { required: true }
+ };
+
+ $(function(){
+ $('#submit_noname').click( function(e) {
+ $('#form_category').addClass('required validCategory').removeClass('valid');
+ $('#form_subcategory').addClass('required validCategory').removeClass('valid');
+ });
+ });
+
diff --git a/templates/web/seesomething/js/validation_strings.html b/templates/web/seesomething/js/validation_strings.html
new file mode 100644
index 000000000..64251c163
--- /dev/null
+++ b/templates/web/seesomething/js/validation_strings.html
@@ -0,0 +1,15 @@
+ validation_strings = {
+ detail: '[% loc('Please enter some details') | replace("'", "\\'") %]',
+ name: {
+ validName: '[% loc('Please enter your full name, councils need this information – if you do not wish your name to be shown on the site, untick the box below') | replace("'", "\\'") %]'
+ },
+ category: '[% loc('Please choose a transport category') | replace("'", "\\'") %]',
+ subcategory: '[% loc('Please choose an incident category') | replace("'", "\\'") %]',
+ rznvy: {
+ required: '[% loc('Please enter your email') | replace("'", "\\'") %]',
+ email: '[% loc('Please enter a valid email') | replace("'", "\\'") %]'
+ },
+ email: {
+ email: '[% loc('Please enter a valid email') | replace("'", "\\'") %]'
+ },
+ };
diff --git a/templates/web/seesomething/report/display.html b/templates/web/seesomething/report/display.html
new file mode 100644
index 000000000..93b0048a2
--- /dev/null
+++ b/templates/web/seesomething/report/display.html
@@ -0,0 +1,9 @@
+[%
+ INCLUDE 'header.html'
+ robots = 'index, nofollow',
+ bobyclass = 'mappage';
+%]
+
+Reports to this site are private
+
+[% INCLUDE 'footer.html' %]
diff --git a/templates/web/seesomething/report/new/category.html b/templates/web/seesomething/report/new/category.html
new file mode 100644
index 000000000..26d750b52
--- /dev/null
+++ b/templates/web/seesomething/report/new/category.html
@@ -0,0 +1,14 @@
+[% FILTER collapse %]
+[% IF category_options.size %]
+ [% IF category;
+ category = category | lower;
+ END; %]
+ <label for='form_category' class="select">[% category_label | html %]</label>
+ <select name='category' data-theme="c" id='form_category'[% ' onchange="form_category_onchange()"' IF category_extras.size %]>
+ [% FOREACH cat_op IN category_options %]
+ [% cat_op_lc = cat_op | lower %]
+ <option value='[% cat_op | html %]'[% ' selected' IF report.category == cat_op || category == cat_op_lc %]>[% cat_op | html %]</option>
+ [% END %]
+ </select>
+[% END %]
+[% END -%]
diff --git a/templates/web/seesomething/report/new/fill_in_details_form.html b/templates/web/seesomething/report/new/fill_in_details_form.html
new file mode 100644
index 000000000..659fadd04
--- /dev/null
+++ b/templates/web/seesomething/report/new/fill_in_details_form.html
@@ -0,0 +1,104 @@
+<div id="report-a-problem-main">
+ <p>Click and drag on the map to reposition the pin.</p>
+ <h1>[% loc('Reporting a problem') %]</h1>
+
+
+ [% INCLUDE 'errors.html' %]
+ <fieldset>
+ <div id="problem_form">
+
+ [% INCLUDE 'report/new/form_heading.html' %]
+
+ [% IF field_errors.council %]
+ <p class='form-error'>[% field_errors.council %]</p>
+ [% END %]
+
+ <label for="form_detail">[% loc('Details') %]</label>
+ [% IF field_errors.detail %]
+ <p class='form-error'>[% field_errors.detail %]</p>
+ [% END %]
+ <textarea rows="7" cols="26" name="detail" id="form_detail" placeholder="[% loc('Please fill in details of the problem.') %]" required>[% report.detail | html %]</textarea>
+
+ [% IF js %]
+ <div id="form_category_row">
+ <label for="form_category">[% loc('Transport Category') %]</label>
+ <select name="category" id="form_category" required><option>[% loc('Loading...') %]</option></select>
+ </div>
+ [% ELSE %]
+ [% IF category_options.size %]
+ [% IF field_errors.category %]
+ <p class='form-error'>[% field_errors.category %]</p>
+ [% END %]
+
+ [% PROCESS "report/new/category.html" %]
+ [% END %]
+ [% END %]
+
+ <div id="form_subcategory_row">
+ <label for="form_subcategory">[% loc('Incident Category') %]</label>
+ <select name="subcategory" id="form_subcategory" required>
+ <option value="">-- Pick a category --</option>
+ <option value="Smoking/other drugs">Smoking/other drugs</option>
+ <option value="Drugs">Drugs</option>
+ <option value="Anti-social behaviour">Anti-social behaviour</option>
+ <option value="Loud music">Loud music</option>
+ <option value="Damage">Damage</option>
+ <option value="Feet on seats">Feet on seats</option>
+ <option value="Other">Other</option>
+ </select>
+ </div>
+
+ [% IF c.cobrand.allow_photo_upload %]
+ <label for="form_photo">[% loc('Photo') %]</label>
+ [% IF upload_fileid || report.photo %]
+ [% IF upload_fileid %]
+ <img align="right" src="/photo/[% upload_fileid %].temp.jpeg" alt="">
+ <input type="hidden" name="upload_fileid" value="[% upload_fileid %]">
+ [% END %]
+
+ <p>[% loc('You have already attached a photo to this report, attaching another one will replace it.') %]</p>
+
+ [% IF report.photo %]
+ <img align="right" src="/photo/[% report.id %].jpeg">
+ [% END %]
+ [% END %]
+
+ [% IF field_errors.photo %]
+ <p class='form-error'>[% field_errors.photo %]</p>
+ [% END %]
+ <input type="file" name="photo" id="form_photo">
+ [% END %]
+
+ <h2>Personal Details:</h2>
+
+ <label for="form_name">[% loc('Name (optional)') %]</label>
+ [% IF field_errors.name %]
+ <p class='form-error'>[% field_errors.name %]</p>
+ [% END %]
+
+ <input type="text" class="form-focus-trigger validName" value="[% report.name | html %]" name="name" id="form_name" placeholder="[% loc('Your name') %]">
+
+ <label for="form_email">[% loc('Your email (optional)') %]</label>
+ [% IF field_errors.email %]
+ <p class='form-error'>[% field_errors.email %]</p>
+ [% END %]
+ <input type="email" value="[% report.user.email | html %]" name="email" id="form_email" placeholder="[% loc('Please enter your email address') %]">
+
+
+
+ <label class="" for="form_phone">[% loc('Phone number (optional)') %]</label>
+ <input class="" type="text" value="[% report.user.phone | html %]" name="phone" id="form_phone" placeholder="[% loc('Your phone number') %]">
+
+ <div class="form-txt-submit-box ">
+ <input class="green-btn" type="submit" id="submit_noname" name="submit_noname" value="[% loc('Submit') %]">
+ </div>
+
+ </div>
+ </fieldset>
+
+ [% IF partial_token %]
+ <input type="hidden" name="partial" value="[% partial_token.token %]">
+ [% END %]
+
+ <input type="hidden" name="submit_problem" value="1">
+</div>
diff --git a/templates/web/seesomething/report_created.html b/templates/web/seesomething/report_created.html
new file mode 100644
index 000000000..4a11d14b4
--- /dev/null
+++ b/templates/web/seesomething/report_created.html
@@ -0,0 +1,29 @@
+[%
+
+ IF report.used_map;
+ PROCESS "maps/${map.type}.html";
+ END;
+
+ INCLUDE 'header.html',
+ title => loc('Report created')
+ bodyclass => 'mappage',
+ robots => 'noindex,nofollow';
+%]
+
+
+ [% IF report.used_map %]
+ [% map_html %]
+
+ </div>
+ [% END %]
+
+ <div id="side">
+<div id="report-a-problem-main">
+ <h1>Complete</h1>
+ <p>Your report has been sent. If you included contact details we may be in touch to follow up or request more details.</p>
+ <p>Thank you for saying something and making our transport safer.</p>
+ <p><img src="../cobrands/seesomething/images/btp-wmp-logos.png" alt="British Transport Police and the West Midlands Police" width="271" height="116"></p>
+</div>
+ </div>
+
+[% INCLUDE 'footer.html' %]
diff --git a/templates/web/seesomething/set_body_class.html b/templates/web/seesomething/set_body_class.html
new file mode 100644
index 000000000..b613706f2
--- /dev/null
+++ b/templates/web/seesomething/set_body_class.html
@@ -0,0 +1 @@
+[% bodyclass = ( bodyclass ? bodyclass : 'mappage' ) %]
diff --git a/templates/web/southampton/front/news.html b/templates/web/southampton/front/news.html
new file mode 100644
index 000000000..79d51542c
--- /dev/null
+++ b/templates/web/southampton/front/news.html
@@ -0,0 +1,9 @@
+<div class="news">
+<p>Fix My Street is for reporting non-urgent, local problems like graffiti, fly
+tipping, or broken paving slabs; reports will be reviewed within 48 working
+hours.</p>
+
+<p>If you are reporting an urgent or dangerous matter, for example a fallen
+tree or a very deep pot hole that may cause damage, please contact us
+directly on 023 8083 3008</p>
+</div>
diff --git a/templates/web/southampton/header.html b/templates/web/southampton/header.html
index 43553468c..e02083a99 100644
--- a/templates/web/southampton/header.html
+++ b/templates/web/southampton/header.html
@@ -51,7 +51,6 @@
</form>
</div>
- <a class="mctv" href="http://www.southampton.mycounciltv.org"><img src="/cobrands/southampton/mctv.png" alt="Link to MyCouncilTV videos" /></a>
<ul id="topNav">
<li><a href="http://www.southampton.gov.uk/online/">Do it online</a></li>
<li><a href="http://www.southampton.gov.uk/customer-service/">Customer Services</a></li>
diff --git a/templates/web/southampton/report/photo.html b/templates/web/southampton/report/photo.html
deleted file mode 100644
index 07b6a8558..000000000
--- a/templates/web/southampton/report/photo.html
+++ /dev/null
@@ -1,6 +0,0 @@
-[% IF c.cobrand.allow_photo_display && object.photo %]
-[% photo = object.get_photo_params %]
-<p>
- <img alt="" height="[% photo.height %]" width="[% photo.width %]" src="[% photo.url %]">
-</p>
-[% END %]
diff --git a/templates/web/southampton/tokens/confirm_problem.html b/templates/web/southampton/tokens/confirm_problem.html
new file mode 100644
index 000000000..f6bc2bc6c
--- /dev/null
+++ b/templates/web/southampton/tokens/confirm_problem.html
@@ -0,0 +1,14 @@
+[% INCLUDE 'header.html', title = loc('Confirmation') %]
+
+<h1>[% loc('Confirmation') %]</h1>
+
+<p class="confirmed">
+Thank you for your report which will be updated as soon as possible.
+You can <a href="[% c.cobrand.base_url_for_report( problem ) %][% problem.url %]">view the problem on this site</a>.
+</p>
+
+<p>Your reference for this problem is [% problem.id %], please quote it in any enquiries.
+
+[% display_crosssell_advert( problem.user.email, problem.name ) %]
+
+[% INCLUDE 'footer.html' %]
diff --git a/templates/web/stevenage/around/intro.html b/templates/web/stevenage/around/intro.html
new file mode 100644
index 000000000..488b587da
--- /dev/null
+++ b/templates/web/stevenage/around/intro.html
@@ -0,0 +1,2 @@
+ <h1>[% loc('Report, view, or discuss local problems') %]</h1>
+ <h2>(like Graffiti, Fly Tipping and Abandoned Vehicles)</h2>
diff --git a/templates/web/stevenage/footer.html b/templates/web/stevenage/footer.html
new file mode 100644
index 000000000..92449916f
--- /dev/null
+++ b/templates/web/stevenage/footer.html
@@ -0,0 +1,56 @@
+ [% IF pagefooter %]
+ <footer role="content-info">
+ <div class="tablewrapper bordered">
+ <div id="footer-mobileapps">
+ <h4>Mobile apps</h4>
+
+ <ul>
+ <li><a class="m-app-iphone" href="http://itunes.apple.com/gb/app/fixmystreet/id297456545">iPhone</a></li>
+ <li><a class="m-app-droid" href="https://market.android.com/details?id=com.android.fixmystreet">Android</a></li>
+ <li><a class="m-app-nokia" href="http://store.ovi.com/content/107557">Nokia</a></li>
+ </ul>
+ </div>
+
+ <div id="footer-help">
+ <ul>
+ <li>
+ <h4>[% loc('Are you a developer?') %]</h4>
+ <p>[% loc('Would you like to contribute to FixMyStreet? Our code is open source and <a href="http://github.com/mysociety/fixmystreet">available on GitHub</a>.') %]</p>
+ </li>
+ <li>
+ <h4>[% loc('Are you from a council?') %]</h4>
+ <p>[% loc('Would you like better integration with FixMyStreet? <a href="http://www.mysociety.org/for-councils/fixmystreet/">Find out about FixMyStreet for councils</a>.') %]</p>
+ </li>
+ </ul>
+ </div>
+ </div>
+ <p><a href="/privacy">Privacy and cookies</a></p>
+ </footer>
+ [% END %]
+ </div><!-- .content role=main -->
+ </div><!-- .container -->
+ </div><!-- .table-cell -->
+
+ <div class="nav-wrapper">
+ <div class="nav-wrapper-2">
+ <div id="main-nav" role="navigation">
+ <ul id="main-menu">
+ <li><[% IF c.req.uri.path == '/' %]span[% ELSE %]a href="/"[% END %] class="report-a-problem-btn"
+ >[% loc("Report a problem") %]</[% c.req.uri.path == '/' ? 'span' : 'a' %]></li>[%
+ %]<li><[% IF c.req.uri.path == '/my' %]span[% ELSE %]a href="/my"[% END
+ %]>[% loc("Your reports") %]</[% c.req.uri.path == '/my' ? 'span' : 'a' %]></li>[%
+ %]<li><[% IF c.req.uri.path == '/reports/Stevenage' %]span[% ELSE %]a href="/reports/Stevenage"[% END
+ %]>[% loc("All reports") %]</[% c.req.uri.path == '/reports' ? 'span' : 'a' %]></li>[%
+ %]<li><[% IF c.req.uri.path == '/alert' %]span[% ELSE %]a href="/alert[% pc ? '/list?pc=' : '' %][% pc | uri %]"[% END
+ %]>[% loc("Local alerts") %]</[% c.req.uri.path == '/alert' ? 'span' : 'a' %]></li>[%
+ %]<li><[% IF c.req.uri.path == '/faq' %]span[% ELSE %]a href="/faq"[% END
+ %]>[% loc("Help") %]</[% c.req.uri.path == '/faq' ? 'span' : 'a' %]></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+
+<!-- [% INCLUDE 'debug_footer.html' %] -->
+ </div> <!-- .wrapper -->
+</body>
+</html>
diff --git a/templates/web/stevenage/header.html b/templates/web/stevenage/header.html
new file mode 100644
index 000000000..e04ea77bb
--- /dev/null
+++ b/templates/web/stevenage/header.html
@@ -0,0 +1,110 @@
+<!doctype html>
+<!--[if lt IE 7]><html class="no-js ie6 oldie" lang="[% lang_code %]"><![endif]-->
+<!--[if IE 7]> <html class="no-js ie7 oldie" lang="[% lang_code %]"><![endif]-->
+<!--[if IE 8]> <html class="no-js ie8 oldie" lang="[% lang_code %]"><![endif]-->
+<!--[if IE 9]> <html class="no-js ie9 oldie" lang="[% lang_code %]"><![endif]-->
+<!--[if gt IE 9]><!--><html class="no-js" lang="[% lang_code %]"><!--<![endif]-->
+ <head>
+ <meta name="viewport" content="initial-scale=1.0">
+
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
+ <meta name="HandHeldFriendly" content="true">
+ <meta name="mobileoptimized" content="0">
+
+ <link rel="stylesheet" href="[% version('/cobrands/stevenage/base.css') %]">
+ <link rel="stylesheet" href="[% version('/cobrands/stevenage/layout.css') %]" media="(min-width:48em)">
+ [% extra_css %]
+ <!--[if (lt IE 9) & (!IEMobile)]>
+ <link rel="stylesheet" href="[% version('/cobrands/' _ c.cobrand.moniker _ '/layout.css') %]">
+ <![endif]-->
+
+ <script src="[% version('/js/modernizr.custom.js') %]" charset="utf-8"></script>
+ <script src="[% version('/cobrands/fixmystreet/position_map.js') %]" charset="utf-8"></script>
+ [% INCLUDE 'common_header_tags.html', js_override = '/cobrands/fixmystreet/fixmystreet.js', site_title = 'Stevenage: FixMyStreet' %]
+ [% extra_js %]
+
+ [% IF c.req.uri.host == 'osm.fixmystreet.com' %]
+ <link rel="canonical" href="http://www.fixmystreet.com[% c.req.uri.path_query %]">
+ [% END %]
+
+ [% INCLUDE 'tracking_code.html' %]
+
+ </head>
+ <body class="[% bodyclass | html IF bodyclass %]">
+
+ <div class="wrapper">
+ <div class="table-cell">
+ <header id="stevenage_cc_header" role="banner">
+ <div id="stv-headerWrapper">
+ <div id="stv-header">
+ <div class="stv-inner">
+
+ <div id="stv-logo">
+ <h1><a href="/"><img src="http://www.stevenage.gov.uk/Images/logo.gif" alt="Stevenage Borough Council"></a></h1>
+ </div>
+
+ <div class="stv-mapLogo">
+ <img src="http://www.stevenage.gov.uk/Images/mapLogo.gif" alt="">
+ </div>
+
+ <div id="stv-pageTools" class="stv-floatHolder">
+ <div id="stv-searchStatic">
+ <label for="search">Search</label> <input type="hidden" name="view" value="Search results"> <input name="search" type="text" value="" placeholder="Search for..." id="stv-search" class="stv-searchInput"> <input type="submit" value="GO">
+ </div>
+ </div>
+
+ <div class="stv-parf stv-floatHolder">
+ <a href="http://www.stevenage.gov.uk/pay/"><span class="stv-title">Pay</span> your Council Tax bill and more</a> <a href="http://www.stevenage.gov.uk/apply/"><span class="stv-title">Apply</span> for planning permission and more</a> <a href="http://www.stevenage.gov.uk/report/"><span class="stv-title">Report</span> a missed bin and more</a> <a href="http://www.stevenage.gov.uk/find/" class="stv-find"><span class="stv-title">Find</span> your local councillor and more</a>
+ </div>
+
+ </div>
+ </div>
+ <div id="stv-menu">
+ <div id="stv-primaryNavigation">
+ <ul id="stv-ctl00_ctl00_PrimaryNavigationLinks" class="stv-floatHolder">
+ <li>
+ <a href="http://www.stevenage.gov.uk/council-services/">Council Services</a>
+ </li>
+ <li>
+ <a href="http://www.stevenage.gov.uk/about-the-council/">About the Council</a>
+ </li>
+ <li>
+ <a href="http://www.stevenage.gov.uk/about-stevenage/">About Stevenage</a>
+ </li>
+ <li>
+ <a href="http://www.stevenage.gov.uk/news-and-events/">News and Events</a>
+ </li>
+ <li>
+ <a href="http://www.stevenage.gov.uk/links/">Popular Links</a>
+ </li>
+ <li>
+ <a href="http://www.stevenage.gov.uk/have-your-say/">Have Your Say</a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ </header>
+ <header id="site-header">
+ <div class="container">
+ <a href="#main-nav" id="nav-link">Main Navigation</a>
+ </div>
+ </header>
+
+ <div id="user-meta">
+ [% IF c.user_exists %]
+ <p>
+ [% tprintf(loc('Hi %s'), c.user.name || c.user.email) %]
+ <a href="/auth/sign_out">[% loc('sign out') %]</a>
+ </p>
+ [% ELSE %]
+ <!-- <a href="/auth">[% loc('Sign in') %]</a> -->
+ [% END %]
+ </div>
+
+ [% pre_container_extra %]
+
+ <div class="container">
+ <div class="content[% " $mainclass" | html IF mainclass %]" role="main">
+
+ <!-- [% INCLUDE 'debug_header.html' %] -->
diff --git a/templates/web/zurich/around/intro.html b/templates/web/zurich/around/intro.html
new file mode 100644
index 000000000..c113afca7
--- /dev/null
+++ b/templates/web/zurich/around/intro.html
@@ -0,0 +1 @@
+ <h1>[% loc('Report, view, or discuss local problems') %]</h1>
diff --git a/templates/web/zurich/faq/faq-de.html b/templates/web/zurich/faq/faq-de.html
index bd94ecd38..a739f1b74 100755
--- a/templates/web/zurich/faq/faq-de.html
+++ b/templates/web/zurich/faq/faq-de.html
@@ -184,7 +184,7 @@ rights reserved, Ministry of Justice 100037819&nbsp;2008),
Yahoo! for their BSD-licensed JavaScript libraries, the entire free software
community (this particular project was brought to you by Perl, PostgreSQL,
and the number 161.290) and <a
-href="http://www.m247.com/">M247</a> (who kindly host all
+href="http://www.bytemark.co.uk/">Bytemark</a> (who kindly host all
our servers).
Let us know if we&rsquo;ve missed anyone.</dd>
diff --git a/templates/web/zurich/footer.html b/templates/web/zurich/footer.html
new file mode 100644
index 000000000..2e4717360
--- /dev/null
+++ b/templates/web/zurich/footer.html
@@ -0,0 +1,31 @@
+ </div><!-- .content role=main -->
+ </div><!-- .container -->
+ </div><!-- .table-cell -->
+
+ <div class="nav-wrapper">
+ <div class="nav-wrapper-2">
+ <div id="main-nav" role="navigation">
+ <ul id="main-menu">
+ <li><[% IF c.req.uri.path == '/' %]span[% ELSE %]a href="/"[% END %]
+ >[% loc("Report a problem") %]</[% c.req.uri.path == '/' ? 'span' : 'a' %]></li>[%
+ %]<li><[% IF c.req.uri.path == '/reports' %]span[% ELSE %]a href="/reports"[% END
+ %]>[% loc("All reports") %]</[% c.req.uri.path == '/reports' ? 'span' : 'a' %]></li>[%
+ %]<li><[% IF c.req.uri.path == '/faq' %]span[% ELSE %]a href="/faq"[% END
+ %]>[% loc("Help") %]</[% c.req.uri.path == '/faq' ? 'span' : 'a' %]></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+
+<!-- [% INCLUDE 'debug_footer.html' %] -->
+ </div> <!-- .wrapper -->
+
+ <div id="zurich-footer" class="desk-only">
+ &copy; 2012 Stadt Z&uuml;rich
+ <span class="hidden">|</span> <a href="http://www.stadt-zuerich.ch/content/portal/de/index/footer/rechtliche_hinweise.html">Rechtliche Hinweise</a>
+ <span class="hidden">|</span> <a href="http://www.stadt-zuerich.ch/content/portal/de/index/footer/impressum.html">Impressum</a>
+ <span class="hidden">|</span> <a href="http://www.stadt-zuerich.ch/content/portal/de/index/footer/barrierefreiheit.html">Barrierefreiheit</a>
+ </div>
+
+</body>
+</html>
diff --git a/templates/web/zurich/maps/zurich.html b/templates/web/zurich/maps/zurich.html
new file mode 100644
index 000000000..492ccc556
--- /dev/null
+++ b/templates/web/zurich/maps/zurich.html
@@ -0,0 +1,14 @@
+[% map_js = BLOCK %]
+<script type="text/javascript" src="[% version('/js/OpenLayers.2.11.zurich.js') %]"></script>
+<script type="text/javascript" src="[% version('/js/OpenLayers.Projection.CH1903.js') %]"></script>
+<script type="text/javascript" src="[% version('/js/map-OpenLayers.js') %]"></script>
+<script type="text/javascript" src="[% version('/js/map-wmts-zurich.js') %]"></script>
+<script type="text/javascript" src="[% version('/js/jquery.ba-hashchange.min.js') %]"></script>
+<!--[if lte IE 6]>
+ <link rel="stylesheet" href="/jslib/OpenLayers-2.10/theme/default/ie6-style.css" type="text/css" />
+<![endif]-->
+[% END %]
+
+[% map_html = BLOCK %]
+[% INCLUDE maps/openlayers.html %]
+[% END %]
diff --git a/templates/web/zurich/report/new/fill_in_details_form.html b/templates/web/zurich/report/new/fill_in_details_form.html
new file mode 100644
index 000000000..a4029c527
--- /dev/null
+++ b/templates/web/zurich/report/new/fill_in_details_form.html
@@ -0,0 +1,136 @@
+<div id="report-a-problem-main">
+ <h1>[% loc('Reporting a problem') %]</h1>
+
+ [% IF js %]
+ <p id="councils_text">
+ [%
+ tprintf(
+ loc('All the information you provide here will be sent to <strong>%s</strong>.'),
+ loc('the local council')
+ );
+ %]
+ [% loc('The subject and details of the problem will be public, plus your name if you give us permission.') %]
+ </p>
+ [% ELSE %]
+ [% PROCESS 'report/new/councils_text.html' %]
+ [% END %]
+
+ <div id="report-a-problem-sidebar">
+ <!--
+ The text for this section needs checking, but I can't work out which bit comes from where
+ -->
+ <div class="sidebar-tips">
+ [% IF report.used_map %]
+ [% IF partial_token %]
+ <p id="unknown">[% loc('Please note your report has <strong>not yet been sent</strong>. Choose a category and add further information below, then submit.') %]</p>
+ [% END %]
+ <p>[% loc('You have located the problem at the point marked with a green pin on the map. If this is not the correct location, simply click on the map again. ') %]</p>
+ [% END %]
+
+ <p>
+ [% IF report.used_map %]
+ [% INCLUDE 'report/new/fill_in_details_text.html' %]
+ [% ELSE %]
+ [% loc('Please fill in the form below with details of the problem, and describe the location as precisely as possible in the details box.') %]
+ [% END %]
+ </p>
+ </div>
+
+ <div class="sidebar-notes">
+ [% INCLUDE 'report/new/notes.html' %]
+ </div>
+
+ </div>
+
+ [% INCLUDE 'errors.html' %]
+ <fieldset>
+ <div id="problem_form">
+
+ [% INCLUDE 'report/new/form_heading.html' %]
+
+
+ [% IF field_errors.council %]
+ <p class='form-error'>[% field_errors.council %]</p>
+ [% END %]
+
+ <label for="form_detail">[% loc('Details') %]</label>
+ [% IF field_errors.detail %]
+ <p class='form-error'>[% field_errors.detail %]</p>
+ [% END %]
+ <textarea rows="7" cols="26" name="detail" id="form_detail" placeholder="[% loc('Please fill in details of the problem.') %]" required>[% report.detail | html %]</textarea>
+
+ [% IF js %]
+ <div id="form_category_row">
+ <label for="form_category">[% loc('Category') %]</label>
+ <select name="category" id="form_category" required><option>[% loc('Loading...') %]</option></select>
+ </div>
+ [% ELSE %]
+ [% IF category_options.size %]
+ [% IF field_errors.category %]
+ <p class='form-error'>[% field_errors.category %]</p>
+ [% END %]
+
+ [% PROCESS "report/new/category.html" %]
+ [% END %]
+ [% END %]
+
+ [%- IF category_extras %]
+ [% PROCESS "report/new/category_extras.html" %]
+ [%- END %]
+
+ [% IF c.cobrand.allow_photo_upload %]
+ <label for="form_photo">[% loc('Photo') %]</label>
+ [% IF upload_fileid || report.photo %]
+ [% IF upload_fileid %]
+ <img align="right" src="/photo/[% upload_fileid %].temp.jpeg" alt="">
+ <input type="hidden" name="upload_fileid" value="[% upload_fileid %]">
+ [% END %]
+
+ <p>[% loc('You have already attached a photo to this report, attaching another one will replace it.') %]</p>
+
+ [% IF report.photo %]
+ <img align="right" src="/photo/[% report.id %].jpeg">
+ [% END %]
+ [% END %]
+
+ [% IF field_errors.photo %]
+ <p class='form-error'>[% field_errors.photo %]</p>
+ [% END %]
+ <input type="file" name="photo" id="form_photo">
+ [% END %]
+
+ <label for="form_email">[% loc('Your email') %]</label>
+ [% IF field_errors.email %]
+ <p class='form-error'>[% field_errors.email %]</p>
+ [% END %]
+ <input type="email" value="[% report.user.email | html %]" name="email" id="form_email" placeholder="[% loc('Please enter your email address') %]" required>
+
+ <!--
+ <div class="general-sidebar-notes">
+ <p class="dark">[% loc('We never show your email address or phone number.') %]</p>
+ </div>
+ -->
+
+ <label for="form_name">[% loc('Name') %] [% loc('(optional)') %]</label>
+ [% IF field_errors.name %]
+ <p class='form-error'>[% field_errors.name %]</p>
+ [% END %]
+ <input type="text" value="[% report.name | html %]" name="name" id="form_name" placeholder="[% loc('Your name') %]">
+
+ <label for="form_phone">[% loc('Phone number (optional)') %]</label>
+ <input type="text" value="[% report.user.phone | html %]" name="phone" id="form_phone" placeholder="[% loc('Your phone number') %]">
+
+ <div class="form-txt-submit-box">
+ [%# ID of submit_sign_in so name can be option, name of submit_register so it doesn't try and sign us in %]
+ <p><input class="green-btn" type="submit" id="submit_sign_in" name="submit_register" value="[% loc('Submit') %]">
+ </div>
+
+ </div>
+ </fieldset>
+
+ [% IF partial_token %]
+ <input type="hidden" name="partial" value="[% partial_token.token %]">
+ [% END %]
+
+ <input type="hidden" name="submit_problem" value="1">
+</div>
diff --git a/templates/web/zurich/report/update-form.html b/templates/web/zurich/report/update-form.html
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/templates/web/zurich/report/update-form.html
diff --git a/web/.gitignore b/web/.gitignore
index 124be032a..d6e2f1a1a 100644
--- a/web/.gitignore
+++ b/web/.gitignore
@@ -1,4 +1,4 @@
/down.html
/_Inline
-/bci-live-creation.png
-/bci-live-line.png
+/fms-live-creation.png
+/fms-live-line.png
diff --git a/web/cobrands/barnet/_colours.scss b/web/cobrands/barnet/_colours.scss
index 2f5ccc42b..793a8dcdd 100644
--- a/web/cobrands/barnet/_colours.scss
+++ b/web/cobrands/barnet/_colours.scss
@@ -4,6 +4,8 @@ $primary: #E9E9EA;
$primary_b: #000000;
$primary_text: #3E3D44;
-$contrast1: #E1E3E4;
-$contrast1_dark: darken(#E1E3E4, 10%);
-$contrast2: #AA8D11;
+$col_click_map: #E1E3E4;
+$col_click_map_dark: darken(#E1E3E4, 10%);
+
+$col_fixed_label: #00BD08;
+$col_fixed_label_dark: #4B8304;
diff --git a/web/cobrands/barnet/layout.scss b/web/cobrands/barnet/layout.scss
index 97b27cfff..3ea439dea 100644
--- a/web/cobrands/barnet/layout.scss
+++ b/web/cobrands/barnet/layout.scss
@@ -21,15 +21,11 @@
}
#front-main {
- background: $primary;
@include border-radius(1em 1em 0 0);
margin-bottom: 1em;
padding-top: 0;
width: 678px;
// layout sets this because base has it slightly lighter
- h2 {
- color: $primary_text;
- }
#front-main-container {
padding: 1em;
}
@@ -231,7 +227,7 @@ body.frontpage {
.general-sidebar-notes {
- left: 25em;
+ left: 25.5em;
width: 14em;
font-size: 1.2em;
p {
@@ -250,7 +246,6 @@ ol.big-numbers > li::before {
}
p#fixed {
padding-top: 4em;
- background: #00BD08;
}
}
diff --git a/web/cobrands/bromley/_colours.scss b/web/cobrands/bromley/_colours.scss
index e178c9db2..208154370 100644
--- a/web/cobrands/bromley/_colours.scss
+++ b/web/cobrands/bromley/_colours.scss
@@ -1,9 +1,12 @@
/* COLOURS */
-$primary: rgb(91,120,147);
+$bromley_blue: rgb(91,120,147);
+
+$primary: $bromley_blue;
$primary_b: #000000;
$primary_text: #ffffff;
-$contrast1: rgb(91,120,147);
-$contrast1_dark: darken(rgb(91,120,147), 10%);
-$contrast2: #AA8D11;
+$col_click_map: $bromley_blue;
+$col_click_map_dark: darken($bromley_blue, 10%);
+$col_fixed_label: $bromley_blue;
+$col_fixed_label_dark: darken($bromley_blue, 10%);
diff --git a/web/cobrands/bromley/layout.scss b/web/cobrands/bromley/layout.scss
index eef0ee679..6fa4c1c7c 100644
--- a/web/cobrands/bromley/layout.scss
+++ b/web/cobrands/bromley/layout.scss
@@ -44,17 +44,9 @@ body.twothirdswidthpage .content {
}
#front-main {
- background: $primary;
@include border-radius(1em 1em 0 0);
margin: 2em 1em 0;
padding-top: 0;
- // layout sets this because base has it slightly lighter
- h2 {
- color: $primary_text;
- }
- a#geolocate_link {
- color: $primary_text;
- }
}
// Don't want gap that normal site has
diff --git a/web/cobrands/default/_colours.scss b/web/cobrands/default/_colours.scss
index 2c044a6e7..147fb70f2 100644
--- a/web/cobrands/default/_colours.scss
+++ b/web/cobrands/default/_colours.scss
@@ -1,9 +1,14 @@
/* COLOURS */
-$primary: #ff9900;
+$orange: #ff9900;
+$bluey: #6688ff;
+
+$primary: $orange;
$primary_b: #000000;
$primary_text: #222222;
-$contrast1: #6688ff;
-$contrast1_dark: darken(#6688ff, 10%);
-$contrast2: #AA8D11;
+$col_click_map: $bluey;
+$col_click_map_dark: darken($bluey, 10%);
+
+$col_fixed_label: #00BD08;
+$col_fixed_label_dark: #4B8304;
diff --git a/web/cobrands/default/layout.scss b/web/cobrands/default/layout.scss
index 93a3f7120..7e33d3f1f 100644
--- a/web/cobrands/default/layout.scss
+++ b/web/cobrands/default/layout.scss
@@ -9,31 +9,13 @@ and similar.
*/
body {
- background: #6688ff;
+ background: $bluey;
}
-#front-main {
- color: $primary_text;
- background: $primary;
- // layout sets this because base has it slightly lighter
- h2 {
- color: $primary_text;
- }
- a#geolocate_link {
- color: $primary_text;
- }
-}
-
-.nav-wrapper {
- .nav-wrapper-2 {
- border-top: 4px solid $primary;
- @include border-image(none);
- }
-}
body.mappage {
.nav-wrapper {
.nav-wrapper-2 {
- background: $contrast1;
+ background: $bluey;
}
}
}
@@ -52,9 +34,6 @@ body.mappage {
}
}
}
- &#mysoc-menu {
- background: $primary;
- }
}
}
diff --git a/web/cobrands/fixmybarangay/_colours.scss b/web/cobrands/fixmybarangay/_colours.scss
new file mode 100644
index 000000000..2e9b1affa
--- /dev/null
+++ b/web/cobrands/fixmybarangay/_colours.scss
@@ -0,0 +1,10 @@
+/* COLOURS */
+
+$primary: #fff; //E6DBD6
+$primary_b: #000000;
+$primary_text: #222222;
+
+$col_click_map: #00BD08;
+$col_click_map_dark: #4B8304;
+$col_fixed_label: #00BD08;
+$col_fixed_label_dark: #4B8304;
diff --git a/web/cobrands/fixmybarangay/base.scss b/web/cobrands/fixmybarangay/base.scss
new file mode 100644
index 000000000..7257f63cd
--- /dev/null
+++ b/web/cobrands/fixmybarangay/base.scss
@@ -0,0 +1,40 @@
+@import "../fixmystreet/_h5bp";
+@import "./_colours";
+@import "../fixmystreet/_mixins";
+@import "compass";
+
+$image-sprite: 'images/sprite.png';
+
+@import "../fixmystreet/_base";
+
+#site-logo{
+ width: 225px !important;
+ background: url($image-sprite) -3px -3px no-repeat;
+}
+
+#barangay_buttons {
+ padding: 1em;
+}
+
+.yellow-btn,
+a.yellow-btn,
+button.yellow-btn,
+input.yellow-btn{
+ @include button-reset(#FFD000, #cc9000, #aa7000, #300, #FFD000, #cc9000, #aa7000, #300);
+ &:visited, &:hover {
+ color:#300;
+ }
+}
+
+body.mappage .nav-wrapper div.nav-wrapper-2 {
+ background: url('images/city6.png') 30% 0% repeat-x;
+ border-bottom: 2px solid #333;
+}
+#main-nav ul#main-menu li a.report-a-problem-btn:hover {
+ background: #fff;
+}
+
+.ie6 #site-logo {
+ background-image: url('images/ie_logo.png');
+}
+
diff --git a/web/cobrands/fixmybarangay/config.rb b/web/cobrands/fixmybarangay/config.rb
new file mode 100644
index 000000000..cab97b18f
--- /dev/null
+++ b/web/cobrands/fixmybarangay/config.rb
@@ -0,0 +1,25 @@
+# Require any additional compass plugins here.
+
+# Set this to the root of your project when deployed:
+http_path = "/"
+css_dir = ""
+sass_dir = ""
+images_dir = ""
+javascripts_dir = ""
+
+# You can select your preferred output style here (can be overridden via the command line):
+# output_style = :expanded or :nested or :compact or :compressed
+
+# To enable relative paths to assets via compass helper functions. Uncomment:
+# relative_assets = true
+
+# To disable debugging comments that display the original location of your selectors. Uncomment:
+# line_comments = false
+
+# If you prefer the indented syntax, you might want to regenerate this
+# project again passing --syntax sass, or you can uncomment this:
+# preferred_syntax = :sass
+# and then run:
+# sass-convert -R --from scss --to sass sass scss && rm -rf sass && mv scss sass
+
+line_comments = false # by Compass.app
diff --git a/web/cobrands/fixmybarangay/images/city6.png b/web/cobrands/fixmybarangay/images/city6.png
new file mode 100644
index 000000000..63d7e674c
--- /dev/null
+++ b/web/cobrands/fixmybarangay/images/city6.png
Binary files differ
diff --git a/web/cobrands/fixmybarangay/images/city7.png b/web/cobrands/fixmybarangay/images/city7.png
new file mode 100644
index 000000000..cea65cb82
--- /dev/null
+++ b/web/cobrands/fixmybarangay/images/city7.png
Binary files differ
diff --git a/web/cobrands/fixmybarangay/images/fmb-spinner-16x16.gif b/web/cobrands/fixmybarangay/images/fmb-spinner-16x16.gif
new file mode 100644
index 000000000..da5ea679a
--- /dev/null
+++ b/web/cobrands/fixmybarangay/images/fmb-spinner-16x16.gif
Binary files differ
diff --git a/web/cobrands/fixmybarangay/images/ie_front_logo.gif b/web/cobrands/fixmybarangay/images/ie_front_logo.gif
new file mode 100644
index 000000000..2eeda87ef
--- /dev/null
+++ b/web/cobrands/fixmybarangay/images/ie_front_logo.gif
Binary files differ
diff --git a/web/cobrands/fixmybarangay/images/ie_logo.png b/web/cobrands/fixmybarangay/images/ie_logo.png
new file mode 100644
index 000000000..454297104
--- /dev/null
+++ b/web/cobrands/fixmybarangay/images/ie_logo.png
Binary files differ
diff --git a/web/cobrands/fixmybarangay/images/mobile-22x40.png b/web/cobrands/fixmybarangay/images/mobile-22x40.png
new file mode 100644
index 000000000..6a85ab097
--- /dev/null
+++ b/web/cobrands/fixmybarangay/images/mobile-22x40.png
Binary files differ
diff --git a/web/cobrands/fixmybarangay/images/pat3.png b/web/cobrands/fixmybarangay/images/pat3.png
new file mode 100644
index 000000000..a0f755de9
--- /dev/null
+++ b/web/cobrands/fixmybarangay/images/pat3.png
Binary files differ
diff --git a/web/cobrands/fixmybarangay/images/sprite.png b/web/cobrands/fixmybarangay/images/sprite.png
new file mode 100644
index 000000000..cbde4ac7f
--- /dev/null
+++ b/web/cobrands/fixmybarangay/images/sprite.png
Binary files differ
diff --git a/web/cobrands/fixmybarangay/layout.scss b/web/cobrands/fixmybarangay/layout.scss
new file mode 100644
index 000000000..4676f8486
--- /dev/null
+++ b/web/cobrands/fixmybarangay/layout.scss
@@ -0,0 +1,136 @@
+@import "_colours";
+
+$image-sprite: 'images/sprite.png';
+
+@import "../fixmystreet/_layout";
+
+@mixin box_round($radius) {
+ -webkit-border-radius: $radius; /* Safari 3-4, iOS 1-3.2, Android ≤1.6 */
+ border-radius: $radius; /* Opera 10.5, IE9+, Safari 5, Chrome, Firefox 4+, iOS 4, Android 2.1+ */
+
+ /* useful if you don't want a bg color from leaking outside the border: */
+ -moz-background-clip: padding; -webkit-background-clip: padding-box; background-clip: padding-box;
+}
+
+body {
+ background: #C7B299;
+ background-image: url(images/pat3.png);
+ color: $primary_text;
+
+ .wrapper{
+ background: url('images/city7.png') 30% 0% repeat-x;
+ }
+}
+
+
+body.frontpage {
+ #site-logo {
+ width: 370px !important;
+ height: 70px;
+ background: url('images/sprite.png') -3px -106px no-repeat;
+ }
+
+ .wrapper {
+ background: url('images/city7.png') 30% 0% repeat-x;
+ }
+}
+
+.ie6 body.frontpage #site-logo {
+ background-image: url(images/ie_front_logo.gif);
+}
+
+#main-nav ul#mysoc-menu li a#mysoc-logo {
+ background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIkAAAAyCAMAAABf9whNAAAA0lBMVEUAAABAQEBAQEBAQEBNTU1NTU1AQEBNTU1AQEBAQEBAQEBAQEBAQEBAQEBAQEBNTU1NTU1AQEBNTU1AQEBNTU1AQEBAQEBNTU2Mxj9NTU33kx5NTU1NTU1NTU3tHCRmLZEpq+JNTU2TJ4/tHCSTJ4/87iEpq+L3kx5NTU387iH87iHtHCSTJ4/3kx51K5CTJ49mLZGMxj/tHCSx0zVmLZH6wSBmLZFmLZFDdb/zYCFbuZGMxj/3kx5AQEBNTU0pq+LtHCSMxj/3kx787iFmLZGTJ49ns3BGAAAAPXRSTlMAQL+AQIAQECBwMGBQj98gn5/Pr+/vzzC/r79wYI9wv69QcK+vcICfv68QQBAwj0AwMBBggIBQr3BwgEBgSmaQCwAAAflJREFUeF7t1Ndy2zAQhtGfAAX2IpFUseSSOLGd3nt27bT3f6UsQHusRFcKmVxkcGa4wvCG34AQ8V/wPM/zPM8zSaOaxGBHtFpF+IfikqwYO0LmELfiHH/XlLokSBrsiurtPdGkMJJFWFWTSQUZC0RhWMFNRQWuvTw9RS/VOolNEBgAudYpkE5pHqRpEACIZQ4x4RkztxMWd6KWa2DDvFDUBeg9urr6cPAZMIqEDogCmDmJKdwtlbjXOCc1sIRnhyxj0vIMNbeQMUNun5DBOTo6/3oASMhUF6krka3IM1lkikqdGaICMVE2sKSNICkR1sxYyMag5TWQd7bFPH4G8eT8zcOUKIGwJUYuSE7hzoldlZAwM7Dkwg4GQjtmXMtvBZHNiZJ7P+5C3P/2oH9SXyKXo1yJq0sbmmLMkg23h7xCryR1W5L8WqKsmz1BSbqjfNSSiMUGMEB/Bp8ePwdeLF/ZAn1TEssFR1MJIZmyGLUENXNrI8pCK6IMx99fn50tvyyBcuvEKuqKXDcuocgAQ/I7conMGgA5BfD23fvLy4/LT0Ba/v4vphRxR9dnlmIMU4ULO0IgsgPr/rya3H7F4JycoCf3sq0vW5ICiLXO3YtsMC4JqbG3uCFKMSb3nYuwNyLKMK6Q6wj7a7oMY4vwJwwG8TzP8zzP834CEcRJKkEhVogAAAAASUVORK5CYII=");
+}
+#front-main {
+ background: rgba(255,255,255,0.1);
+ margin-top: 70px;
+
+ #postcodeForm {
+ margin-left: 0;
+ margin-right: 0;
+ }
+
+ a {
+ text-decoration:none;
+ }
+
+ p {
+ padding-bottom:4px;
+ }
+}
+
+#main-nav {
+ ul {
+ &#mysoc-menu {
+ padding: 1px 0.5em;
+ }
+ &#main-menu{
+ padding: 3px 0;
+ li{
+ a{
+ //@extend .report-a-problem-btn;
+ color: #fff;
+ padding: 0.7em;
+ background-color: rgba(0,0,0,0);
+ background-image: none;
+ &:hover{
+ background-color: rgba(0,0,0,0.8);
+ }
+ }
+ }
+ }
+
+ }
+}
+body.mappage #main-nav ul#main-menu li a,
+body.mappage #main-nav ul#main-menu li span,
+body #main-nav ul#main-menu li a,
+body #main-nav ul#main-menu li span
+{
+ color: #fff;
+ padding: 0.7em;
+ background-color: rgba(0,0,0,0);
+ background-image: none;
+ @include box_round(0.35em);
+ margin-left: 3px;
+
+ &.report-a-problem-btn{
+ color: #fff;
+ padding: 0.7em;
+ background-color: rgba(0,0,0,0);
+ background-image: none;
+ margin: 0;
+ }
+
+ &.fmb-bgy-btn {
+ color: #fcc921;
+ }
+
+
+ &:hover{
+ background-color: rgba(0,0,0,0.75);
+ background-image: none;
+ }
+
+}
+
+
+#user-meta {
+ max-width: 96%;
+}
+
+
+
+#front-howto {
+ #front_stats {
+ border-top: 0.25em solid #000;
+ div {
+ big {
+ color: #000;
+ }
+ }
+ }
+}
+
+@import "message_manager";
diff --git a/web/cobrands/fixmybarangay/message_manager.scss b/web/cobrands/fixmybarangay/message_manager.scss
new file mode 100644
index 000000000..120bea4ba
--- /dev/null
+++ b/web/cobrands/fixmybarangay/message_manager.scss
@@ -0,0 +1,241 @@
+@import "_colours";
+
+$mm_status_message_color: #a66;
+$mm_border_color: #eee;
+
+$color_reply_bg: #cccccc;
+$color_bg_reply_0: #E8E8E8;
+$color_bg_reply_1: #DEDEDE;
+$color_bg_reply_2: #D6D6D6;
+$color_bg_reply_3: #D1D1D1;
+$color_bg_reply_4: #C9C9C9;
+$color_bg_reply_5: #BFBFBF;
+$color_bg_reply_6: #B8B8B8;
+$color_bg_mm_list: #F6F6F6;
+
+$color_bg_btn_hide: #ff0000;
+$color_bg_btn_reply: #008000;
+$color_bg_btn_info: #0000ff;
+
+
+$weak_text_color: #666;
+
+
+
+p.mm-submitted-by-sms {
+ color: $weak_text_color;
+ font-style: italic;
+ font-size: 0.8125em;
+ img {
+ border: none;
+ margin-right: 0.5em;
+ width: 22px;
+ height: 40px;
+ vertical-align:middle;
+ display: inline;
+ }
+}
+
+#message_manager {
+ margin-top: 0;
+ li#mm-admin-buttons {
+ margin: -0.5em 0 0 0;
+ text-align: right;
+ font-size:80%;
+ padding:4px 8px 4px 0;
+ a {
+ padding: 0.25em 0.5em;
+ border:1px solid $mm_border_color;
+ margin: 0 0.5em;
+ display: inline-block;
+ }
+ background-color: #fff;
+ &:hover {
+ background-color: #fff;
+ }
+ }
+ #message-control {
+ #mm-username-container {
+ display: none; // hidden during dev
+ padding: 8px;
+ text-align: right;
+ color: $mm_status_message_color;
+ font-style: italic;
+ span {
+ color: #000;
+ font-style: normal;
+ }
+ }
+ #mm-status-message-container {
+ position: relative;
+ min-height: 1.4em;
+ margin: 0 0 8px 0.5em;
+ padding: 8px 4px 8px 24px;
+ color: $mm_status_message_color;
+ font-style: italic;
+ p {
+ margin:0;
+ padding:0;
+ }
+ #mm-spinner {
+ position: absolute;
+ left: 4px;
+ top: 10px;
+ display: none;
+ }
+ }
+ #mm-login-container {
+ display: none; // only shown on/after a 403
+ border: 1px solid $mm_border_color;
+ padding: 0 1em;
+ margin: 1em;
+ input {
+ margin-bottom: 1em;
+ }
+ }
+ }
+
+ #mm-message-list {
+ ul {
+ list-style-type: none;
+ padding: 0;
+ margin: 0;
+ li, ul.mm-reply-thread li {
+ position: relative;
+ clear: both;
+ margin: 4px 0 0 0;
+ padding: 0;
+ background-color: $color_bg_mm_list;
+ p {
+ background-color: inherit;
+ margin: 0.25em 0 0 0;
+ padding: 0.5em 1em;
+ &:hover { background-color: #efe;}
+ .msg-info-box {
+ font-style: italic;
+ font-size: 90%;
+ color: #666;
+ border-top: 1px dashed #666;
+ padding:4px 0 0 0;
+ margin: 4px 0 0 0;
+ display: none;
+ }
+ }
+ ul.mm-reply-thread {
+ li {
+ margin:0;
+ }
+ .mm-reply {
+ background-color: #ccc;
+ &:hover {background-color: #eef;}
+ }
+ .mm-reply-0 { margin-left: 0em; background-color: $color_bg_reply_0;}
+ .mm-reply-1 { margin-left: 1em; background-color: $color_bg_reply_1;}
+ .mm-reply-2 { margin-left: 2em; background-color: $color_bg_reply_2;}
+ .mm-reply-3 { margin-left: 3em; background-color: $color_bg_reply_3;}
+ .mm-reply-4 { margin-left: 4em; background-color: $color_bg_reply_4;}
+ .mm-reply-5 { margin-left: 5em; background-color: $color_bg_reply_5;}
+ .mm-reply-6 { margin-left: 6em; background-color: $color_bg_reply_6;}
+ }
+ &:hover { background-color: #efe;}
+ &.msg-is-locked { background-color: #fdd;}
+ &.msg-is-busy { background-color: #ffd;}
+ &.msg-is-owned { background-color: #dfd;}
+ &.msg-is-active {
+ background-color: $col_click_map; color:#fff;
+ p:hover { background-color: $col_click_map; color:#fff; } // fix for mouseover on p
+ p.mm-reply:hover {background-color: #eef; color:#000;} // fix for mouseover on p
+ }
+ span.msg-tag {
+ width: 3em;
+ float:left;
+ }
+ .mm-radio-filler,
+ input[type=radio] {
+ display: block;
+ float: left;
+ }
+ label, span.msg-text {
+ display: block;
+ font-weight: normal;
+ margin: 0.1em 0 0.1em 4.5em;
+ }
+ .mm-radio-filler {
+ margin:0;
+ padding:0;
+ }
+ .mm-msg-action {
+ display: none;
+ padding: 0.2em 0.4em;
+ color: white;
+ text-align: center;
+ position: absolute;
+ top: 4px;
+ &:hover { background-color: black;}
+ }
+ .mm-hide {
+ right:0px;
+ background-color: $color_bg_btn_hide;
+ cursor: pointer;
+ }
+ .mm-info {
+ right:1.5em;
+ background-color: $color_bg_btn_info;
+ cursor: pointer;
+ }
+ .mm-rep {
+ right:2.6em;
+ background-color: $color_bg_btn_reply;
+ cursor: pointer;
+ }
+ }
+ &.mm-archive {
+ display: none; // archive only shown on interaction
+ li label {
+ cursor: default;
+ }
+ }
+ }
+ }
+ p.mm-empty {
+ margin: 1em;
+ }
+}
+#show_messages, #copy_to_update, #reply-submit {
+ margin: 1em;
+}
+#copy_to_update {
+ display: none; // show on demand, not before
+}
+#show_messages {
+ width: 11em; // hack to stop adjacent button hopping when button message changes
+}
+
+#reply-form-container,
+#hide-form-container {
+ p {
+ color: #000;
+ }
+ #hide-form,
+ #reply-form{
+ margin-top: 2em;
+ textarea {
+ min-height: 3em;
+ margin-bottom: 0.5em;
+ }
+ }
+ #mm-boilerplate-replies-box, #mm-boilerplate-hide-reasons-box {
+ overflow: hidden;
+ display: none;
+ }
+}
+#mm-help {
+ .demo_hide_btn, .demo_reply_btn, .demo_info_btn {
+ color: #fff;
+ font-weight: bold;
+ padding: 0.2em 0.4em;
+ }
+ .demo_hide_btn { background-color: $color_bg_btn_hide; }
+ .demo_reply_btn { background-color: $color_bg_btn_reply; }
+ .demo_info_btn { background-color: $color_bg_btn_info; }
+}
diff --git a/web/cobrands/fixmybarangay/message_manager_client.js b/web/cobrands/fixmybarangay/message_manager_client.js
new file mode 100644
index 000000000..11f9c1264
--- /dev/null
+++ b/web/cobrands/fixmybarangay/message_manager_client.js
@@ -0,0 +1,777 @@
+/*
+ * creates a message_manage object that uses the Message Manager API:
+ * include this file, then initialise the object when the page is loaded with
+ * message_manager.config(settings)
+ *
+ * i.e., you *must* do something like:
+ *
+ * $(document).ready(function() {
+ * message_manager.config({url_root:'http://yourdomain.com/messages'})
+ * }
+ *
+ * You'll need to set the url_root, but you can leave everything else to default
+ * provided your HTML ids and classes are the same as ours (which they might be:
+ * see the Message Manager's dummy client (at /client) to see the HTML we use).
+ *
+ * The (optional) single parameter for .config() is a hash of name-value pairs:
+ *
+ * url_root accepts the root URL to the message manager.
+ *
+ * want_unique_locks normally MM clients should relinquish all other locks
+ * when claiming a new one so want_unique_locks defaults
+ * to true; but you can set it explicitly here.
+ *
+ * mm_name name of Message Manager (used in error messages shown
+ * to user, e.g., "please log in to Message Manager")
+ *
+ * msg_prefix all message <li> items have this as their ID prefix
+ *
+ * want_nice_msgs don't use language like "lock granted"
+ *
+ * tooltips hash of tooltips: override the items you want, keys are:
+ * tt_hide, tt_info, tt_reply, tt_radio
+ *
+ * want_radio_btns normally MM clients show a radio button, but for archive
+ * messages this might be unneccessary: default is true, but
+ * pass in false to suppress this.
+ *
+ * *_selector these are the jQuery selects that will be used to find
+ * the respective elements:
+ *
+ * message_list_selector: list of messages
+ * status_selector: status message display
+ * login_selector: login form
+ *
+ *
+ * Summary of all methods:
+ * message_manager.config([options])
+ * message_manager.setup_click_listener([options])
+ * message_manager.get_available_messages([options])
+ * message_manager.request_lock(msg_id, [options]) (default use: client code doesn't need to call this explicitly)
+ * message_manager.assign_fms_id(msg_id, fms_id, [options])
+ * message_manager.hide(msg_id, reason_text, [options])
+ * message_manager.reply(msg_id, reply_text, [options])
+ * message_manager.show_info(msg_id)
+ * message_manager.sign_out()
+ *
+ * Note: options are {name:value, ...} hashes and often include "callback" which is a function that is executed on success
+ * but see the docs (request_lock executes callback if the call is successful even if the lock was denied, for example).
+ * Some methods take 'callback' as the only option, but you still need to pass it as a named option.
+*/
+
+var message_manager = (function() {
+
+ // default/config values: to be overridden using "config({name:value, ...})"
+
+ var _url_root = 'http://www.example.com/message_manager/';
+ var _want_unique_locks = true;
+ var _msg_prefix = "msg-";
+ var _username;
+ var _mm_name = "Message Manager";
+ var _use_fancybox = true; // note: currently *must* have fancybox!
+ var _want_nice_msgs = false;
+ var _want_radio_btns = true;
+
+ var _tooltips = {
+ tt_hide : "Hide message",
+ tt_info : "Get info",
+ tt_reply : "Send SMS reply",
+ tt_radio : "Select message before clicking on map to create report"
+ };
+
+ // cached jQuery elements, populated by the (mandatory) call to config()
+ var $message_list_element;
+ var $status_element;
+ var $login_element;
+ var $htauth_username;
+ var $htauth_password;
+ var $hide_reasons;
+ var $boilerplate_replies;
+
+ var msg_no_config_err = "Config error: no Message Manager URL has been specified";
+
+ // set _want_nice_msgs to avoid using the term "lock"
+ var msg_trying_for_lock = ["Trying for lock...", "Checking message..." ];
+ var msg_checking_lock = ["Checking lock...", "Checking message..." ];
+ var msg_claiming_lock = ["Claiming lock...", "Checking message..." ];
+ var msg_lock_granted_ok = ["Lock granted OK", "Checking message... OK"];
+ var msg_lock_denied = ["", "Someone is working with that message right now!"];
+
+ function get_msg(msg) {
+ return msg[_want_nice_msgs? 1 : 0];
+ }
+
+ var config = function(settings) {
+ var selectors = {
+ message_list_selector: '#mm-message-list',
+ status_selector: '#mm-status-message-container',
+ login_selector: '#mm-login-container',
+ username_selector: '#mm-received-username',
+ htauth_username_selector: '#mm-htauth-username',
+ htauth_password_selector: '#mm-htauth-password',
+ boilerplate_hide_reasons: '#mm-boilerplate-hide-reasons-box',
+ boilerplate_replies: '#mm-boilerplate-replies-box'
+ };
+ if (settings) {
+ if (typeof settings.url_root === 'string') {
+ _url_root = settings.url_root;
+ if (_url_root.length > 0 && _url_root.charAt(_url_root.length-1) !== "/") {
+ _url_root+="/";
+ }
+ }
+ if (typeof settings.want_unique_locks !== 'undefined') {
+ _want_unique_locks = settings.want_unique_locks;
+ }
+ if (typeof settings.msg_prefix === 'string') {
+ _msg_prefix = settings.msg_prefix;
+ }
+ for (var sel in selectors) {
+ if (typeof settings[sel] === 'string') {
+ selectors[sel] = settings[sel];
+ }
+ }
+ if (typeof settings.mm_name === 'string') {
+ _mm_name = settings.mm_name;
+ }
+ if (typeof settings.want_nice_msgs !== 'undefined') {
+ _want_nice_msgs = settings.want_nice_msgs;
+ }
+ if (typeof settings.want_radio_btns !== 'undefined') {
+ _want_radio_btns = settings.want_radio_btns;
+ }
+ if (settings.tooltips) {
+ for (var key in settings.tooltips) {
+ if (settings.tooltips.hasOwnProperty(key)) {
+ _tooltips[key]=settings.tooltips[key];
+ }
+ }
+ }
+ }
+ $message_list_element = $(selectors.message_list_selector);
+ $status_element = $(selectors.status_selector);
+ $login_element = $(selectors.login_selector);
+ $htauth_username = $(selectors.htauth_username_selector);
+ $htauth_password = $(selectors.htauth_password_selector);
+ $hide_reasons = $(selectors.boilerplate_hide_reasons);
+ $boilerplate_replies = $(selectors.boilerplate_replies);
+ if (typeof settings.url_root === 'string' && _url_root.length===0) {
+ say_status(msg_no_config_err);
+ }
+ };
+
+ var make_base_auth = function(user, password) {
+ var tok = user + ':' + password;
+ var hash = encodeBase64(tok); // window.btoa(tok) doesn't work on all browers
+ return "Basic " + hash;
+ };
+
+ function encodeBase64(input) {
+ var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',
+ INVALID_CHARACTER_ERR = (function () {
+ // fabricate a suitable error object
+ try {
+ document.createElement('$');
+ } catch (error) {
+ return error;
+ }
+ }()),
+ block, charCode, idx, map, output;
+ // encoder (with wee change by mhl Mark to satisfy jslint)
+ // [https://gist.github.com/999166] by [https://github.com/nignag]
+ for (idx = 0, map = chars, output = '';
+ input.charAt(idx | 0) || ((map = '=') && (idx % 1));
+ output += map.charAt(63 & block >> 8 - idx % 1 * 8)) {
+ charCode = input.charCodeAt(idx += 3/4);
+ if (charCode > 0xFF) {
+ throw INVALID_CHARACTER_ERR;
+ }
+ block = block << 8 | charCode;
+ }
+ return output;
+ }
+
+ var get_current_auth_credentials = function() {
+ var base_auth = "";
+ var htauth_un = "";
+ var htauth_pw = "";
+ if ($htauth_username.size()) {
+ htauth_un = $htauth_username.val();
+ htauth_pw = $htauth_password.val();
+ }
+ if (htauth_un.length === 0 && Modernizr.sessionstorage && sessionStorage.getItem('mm_auth')) {
+ base_auth = sessionStorage.getItem('mm_auth');
+ } else {
+ base_auth = make_base_auth(htauth_un, htauth_pw);
+ if (Modernizr.sessionstorage) {
+ sessionStorage.mm_auth = base_auth;
+ }
+ }
+ return base_auth;
+ };
+
+ var sign_out = function() { // clear_current_auth_credentials
+ if (Modernizr.sessionstorage) {
+ sessionStorage.removeItem('mm_auth');
+ }
+ if ($htauth_password) {
+ $htauth_password.val('');
+ }
+ };
+
+ var show_login_form = function(suggest_username) {
+ $('.mm-msg', $message_list_element).remove(); // remove (old) messages
+ if ($htauth_username.size() && ! $htauth_username.val()) {
+ $htauth_username.val(suggest_username);
+ }
+ $login_element.stop(true,true).slideDown();
+ };
+
+ var say_status = function (msg, show_spinner) {
+ if ($status_element) {
+ if (show_spinner) {
+ // slow fade in so that spinner only appears if there's a long delay
+ $status_element.find('#mm-spinner').stop(true,true).fadeIn(1200);
+ } else {
+ $status_element.find('#mm-spinner').stop(true,true).hide();
+ }
+ $status_element.stop(true,true).show().find('p').text(msg);
+ }
+ };
+
+ var extract_replies = function(replies, depth, is_archive) {
+ var $ul = "";
+ if (replies && replies.length > 0) {
+ $ul = $('<ul class="mm-reply-thread"/>');
+ for (var i=0; i<replies.length; i++) {
+ $ul.append(get_message_li(replies[i], depth, is_archive));
+ }
+ }
+ return $ul;
+ };
+
+ var get_message_li = function(message_root, depth, is_archive) {
+ var msg = message_root.Message; // or use label value
+ var lockkeeper = message_root.Lockkeeper.username;
+ var escaped_text = $('<div/>').text(msg.message).html();
+ var $p = $('<p/>');
+ var $hide_button = $('<a class="mm-msg-action mm-hide" id="mm-hide-' + msg.id + '" href="#hide-form-container" title="' + _tooltips.tt_hide + '">X</a>');
+ var $info_button = $('<span class="mm-msg-action mm-info" id="mm-info-' + msg.id + '" title="' + _tooltips.tt_info + '">i</span>');
+ var $reply_button = $('<a class="mm-msg-action mm-rep" id="mm-rep-' + msg.id + '" href="#reply-form-container" title="' + _tooltips.tt_reply + '">reply</a>');
+ var is_radio_btn = _want_radio_btns && depth === 0 && ! is_archive;
+ if (_use_fancybox) {
+ $reply_button.fancybox();
+ $hide_button.fancybox();
+ }
+ if (depth === 0) {
+ var tag = (!msg.tag || msg.tag === 'null')? '&nbsp;' : msg.tag;
+ tag = $('<span class="msg-tag"/>').html(tag);
+ var radio = null;
+ if (is_radio_btn) {
+ radio = $('<input type="radio"/>').attr({
+ 'id': 'mm_text_' + msg.id,
+ 'name': 'mm_text',
+ 'value': escaped_text,
+ 'title': is_radio_btn? _tooltips.tt_radio : ""
+ }).wrap('<p/>').parent().html();
+ } else {
+ radio = $("<p>&ndash;</p>").addClass('mm-radio-filler');
+ }
+ var label = $('<label />').attr({
+ 'class': 'msg-text',
+ 'for': 'mm_text_' + msg.id,
+ 'title': is_radio_btn? _tooltips.tt_radio : ""
+ }).text(escaped_text).wrap('<p/>').parent().html();
+ $p.append(tag).append(radio).append(label);
+ } else {
+ $p.text(escaped_text).addClass('mm-reply mm-reply-' + depth);
+ }
+ var $litem = $('<li id="' + _msg_prefix + msg.id + '" class="mm-msg">').append($p).append($hide_button).append($info_button);
+ if (msg.is_outbound != 1) {
+ $litem.append($reply_button);
+ }
+ if (lockkeeper) {
+ $litem.addClass(lockkeeper == _username? 'msg-is-owned' : 'msg-is-locked');
+ }
+ var info_text = "";
+ if (msg.is_outbound == 1) {
+ info_text = 'sent on ' + msg.created + ' by ' + msg.sender_token;
+ } else {
+ info_text = 'received on ' + msg.created + ' from ' + '<abbr title="'+ msg.sender_token + '">user</abbr>';
+ }
+ $p.append('<div class="msg-info-box" id="msg-info-box-' + msg.id + '">' + info_text + '</div>');
+ if (message_root.children) {
+ $litem.append(extract_replies(message_root.children, depth+1, is_archive));
+ }
+ return $litem;
+ };
+
+ var show_available_messages = function(data, anim_duration) {
+ var messages = data.messages;
+ _username = data.username;
+ var $output = $message_list_element;
+ if (anim_duration > 0) {
+ $output.stop(true,true).fadeOut(anim_duration, function(){
+ render_available_messages(data, anim_duration);
+ });
+ } else {
+ render_available_messages(data, anim_duration);
+ }
+ };
+
+ // render allows animation (if required) to hide messages before repainting and then revealing them
+ var render_available_messages = function(data, anim_duration) {
+ var $output = $message_list_element;
+ $output.empty();
+ var archive = data.messages_for_this_report;
+ var $archive = "";
+ var i, litem;
+ if (archive instanceof Array) {
+ var $arch_ul = $('<ul class="mm-root mm-archive"/>');
+ for(i=0; i< archive.length; i++) {
+ litem = get_message_li(archive[i], 0, true);
+ $arch_ul.append(litem);
+ }
+ $output.append($arch_ul);
+ }
+ var messages = data.messages;
+ _username = data.username;
+ if (messages instanceof Array) {
+ var $ul = $('<ul class="mm-root mm-current"/>');
+ if (messages.length === 0) {
+ $output.append('<p class="mm-empty">No messages available.</p>');
+ } else {
+ for(i=0; i< messages.length; i++) {
+ litem = get_message_li(messages[i], 0, false);
+ $ul.append(litem);
+ }
+ }
+ $output.append($ul);
+ } else {
+ $output.html('<p>No messages (server did not send a list).</p>');
+ }
+ if (anim_duration > 0) {
+ $output.slideDown(anim_duration);
+ }
+ };
+
+ // accept an element (e.g., message_list) and add the click event to the *radio button* within it
+ // A bit specific to expect li's perhaps.
+ // options are passed through to the lock
+ var setup_click_listener = function(options) {
+ $message_list_element.on('click', 'input[type=radio]', function(event) {
+ var $li = $(this).closest('li');
+ var id = $li.attr('id').replace(_msg_prefix, '');
+ if ($li.hasClass('msg-is-locked')) {
+ say_status(get_msg(msg_trying_for_lock), true);
+ } else if ($li.hasClass('msg-is-owned')) {
+ say_status(get_msg(msg_checking_lock), true);
+ } else {
+ say_status(get_msg(msg_claiming_lock), true);
+ }
+ request_lock(id, options);
+ });
+ // clicking the reply button loads the id into the (modal/fancybox) reply form
+ $message_list_element.on('click', '.mm-rep', function(event) {
+ $('#reply_to_msg_id').val($(this).closest('li').attr('id').replace(_msg_prefix, ''));
+ });
+ // clicking the hide button loads the id into the (modal/fancybox) hide form
+ $message_list_element.on('click', '.mm-hide', function(event) {
+ $('#hide_msg_id').val($(this).closest('li').attr('id').replace(_msg_prefix, ''));
+ // $('#hide-form-message-text').val(TODO);
+ });
+ };
+
+ // gets messages or else requests login
+ // options: suggest_username, if provided, is preloaded into the login form if provided
+ // anim_duration: duration of fade/reveal (0, by defaut, does no animation)
+ // fms_id: if provided, display an archive of messages for this username
+ var get_available_messages = function(options) {
+ var base_auth = get_current_auth_credentials();
+ var suggest_username = "";
+ var anim_duration = 0;
+ var callback = null;
+ var fms_id = null;
+ if (options) {
+ if (typeof(options.callback) === 'function') {
+ callback = options.callback;
+ }
+ if (typeof options.suggest_username === 'string') {
+ suggest_username = options.suggest_username;
+ }
+ if (typeof options.anim_duration === 'string' || typeof options.anim_duration === 'number') {
+ anim_duration = parseInt(options.anim_duration, 10);
+ if (isNaN(anim_duration)) {
+ anim_duration = 0;
+ }
+ }
+ if (typeof options.fms_id === 'string' || typeof options.fms_id === 'number') {
+ fms_id = parseInt(options.fms_id, 10);
+ if (isNaN(fms_id)) {
+ fms_id = 0;
+ }
+ }
+ }
+ if (base_auth === "") {
+ show_login_form(suggest_username);
+ return;
+ }
+ $login_element.stop(true,true).hide();
+ if (_url_root.length === 0) {
+ say_status(msg_no_config_err);
+ } else {
+ var ajax_url = _url_root +"messages/available.json";
+ if (fms_id) {
+ ajax_url += "?fms_id=" + fms_id;
+ }
+ say_status("Fetching messages...", true);
+ $.ajax({
+ dataType: "json",
+ type: "get",
+ url: ajax_url,
+ beforeSend: function (xhr){
+ xhr.setRequestHeader('Authorization', get_current_auth_credentials());
+ xhr.withCredentials = true;
+ },
+ success: function(data, textStatus) {
+ show_available_messages(data, anim_duration);
+ say_status("Fetching messages... done, OK", false); // loaded OK
+ if (typeof(callback) === "function") {
+ callback.call($(this), data); // execute callback
+ }
+ },
+ error: function(jqXHR, textStatus, errorThrown) {
+ var st = jqXHR.status;
+ if (st == 401 || st == 403) {
+ var msg = (st == 401 ? "Invalid username or password for" : "Access denied: please log in to") + " " + _mm_name;
+ say_status(msg);
+ show_login_form(suggest_username);
+ } else {
+ var err_msg = "Unable to load messages: ";
+ if (st === 0 && textStatus === 'error') { // x-domain hard to detect, sometimes intermittent?
+ err_msg += "maybe try refreshing page?";
+ } else {
+ err_msg += textStatus + " (" + st + ")";
+ }
+ say_status(err_msg);
+ }
+ }
+ });
+ }
+ };
+
+ var request_lock = function(msg_id, options) {
+ var $li = $('#' + _msg_prefix + msg_id);
+ var lock_unique = _want_unique_locks;
+ var callback = null;
+ if (options) {
+ if (typeof(options.callback) === 'function') {
+ callback = options.callback;
+ }
+ if (typeof(options.lock_unique) !== undefined && options.lock_unique !== undefined) {
+ lock_unique = options.lock_unique;
+ }
+ }
+ $li.addClass('msg-is-busy');
+ $.ajax({
+ dataType:"json",
+ type:"post",
+ url: _url_root +"messages/" +
+ (lock_unique? "lock_unique" : "lock") +
+ "/" + msg_id + ".json",
+ beforeSend: function (xhr){
+ xhr.setRequestHeader('Authorization', get_current_auth_credentials());
+ xhr.withCredentials = true;
+ },
+ success:function(data, textStatus) {
+ if (data.success) {
+ if (lock_unique) {
+ $('.msg-is-owned', $message_list_element).removeClass('msg-is-owned');
+ }
+ $li.removeClass('msg-is-busy msg-is-locked').addClass('msg-is-owned');
+ say_status(get_msg(msg_lock_granted_ok)); // to data['data']['Lockkeeper']['username']?
+ } else {
+ $li.removeClass('msg-is-busy').addClass('msg-is-locked');
+ say_status(get_msg(msg_lock_denied) || ("lock failed: " + data.error));
+ }
+ if (typeof(callback) === "function") { // note callbacks must check data['success']
+ callback.call($(this), data); // returned data['data'] is 'Message', 'Source', 'Lockkeeper' for success
+ }
+ },
+ error: function(jqXHR, textStatus, errorThrown) {
+ $li.removeClass('msg-is-busy');
+ say_status("error: " + textStatus + ": " + errorThrown);
+ }
+ });
+ };
+
+ var assign_fms_id = function(msg_id, fms_id, options) {
+ var check_li_exists = false;
+ var is_async = true;
+ var callback = null;
+ if (options) {
+ if (typeof(options.callback) === 'function') {
+ callback = options.callback;
+ }
+ if (typeof(options.check_li_exists) !== undefined && options.check_li_exists !== undefined) {
+ check_li_exists = true; // MM dummy
+ }
+ if (typeof(options.is_async) !== undefined && options.is_async !== undefined) {
+ is_async = options.is_async;
+ }
+ }
+ var $li = $('#' + _msg_prefix + msg_id);
+ if (check_li_exists) {
+ if ($li.size() === 0) {
+ say_status("Couldn't find message with ID " + msg_id);
+ return;
+ }
+ }
+ if (isNaN(parseInt(fms_id,10))) {
+ say_status("missing FMS id");
+ return;
+ }
+ $li.addClass('msg-is-busy');
+ $.ajax({
+ async:is_async,
+ dataType:"json",
+ type:"post",
+ data: {fms_id: fms_id},
+ url: _url_root +"messages/assign_fms_id/" + msg_id + ".json",
+ beforeSend: function (xhr){
+ xhr.setRequestHeader('Authorization', get_current_auth_credentials());
+ xhr.withCredentials = true;
+ },
+ success:function(data, textStatus) {
+ if (data.success) {
+ $li.removeClass('msg-is-busy msg-is-locked').addClass('msg-is-owned').fadeOut('slow'); // no longer available
+ say_status("OK: report ID was assigned to message.");
+ if (typeof(callback) === "function") {
+ callback.call($(this), data.data); // returned data['data'] is 'Message', 'Source', 'Lockkeeper' for success
+ }
+ } else {
+ $li.removeClass('msg-is-busy').addClass('msg-is-locked');
+ say_status("failed: " + data.error);
+ }
+ },
+ error: function(jqXHR, textStatus, errorThrown) {
+ say_status("error: " + textStatus + ": " + errorThrown);
+ $li.removeClass('msg-is-busy');
+ }
+ });
+ };
+
+ var reply = function(msg_id, reply_text, options) {
+ if (_use_fancybox){
+ $.fancybox.close();
+ }
+ var callback = null;
+ var check_li_exists = false;
+ if (options) {
+ if (typeof(options.callback) === 'function') {
+ callback = options.callback;
+ }
+ if (typeof(options.check_li_exists) !== undefined && options.check_li_exists !== undefined) {
+ check_li_exists = true; // MM dummy
+ }
+ }
+ var $li = $('#' + _msg_prefix + msg_id);
+ if (check_li_exists) {
+ if ($li.size() === 0) {
+ say_status("Couldn't find message with ID " + msg_id);
+ return;
+ }
+ }
+ reply_text = $.trim(reply_text);
+ if (reply_text === '') {
+ say_status("No reply sent: message was empty!");
+ return;
+ }
+ $li.addClass('msg-is-busy');
+ $.ajax({
+ dataType:"json",
+ type:"post",
+ data: {reply_text: reply_text},
+ url: _url_root +"messages/reply/" + msg_id + ".json",
+ beforeSend: function (xhr){
+ xhr.setRequestHeader('Authorization', get_current_auth_credentials());
+ xhr.withCredentials = true;
+ },
+ success:function(data, textStatus) {
+ if (data.success) {
+ $li.removeClass('msg-is-busy msg-is-locked').addClass('msg-is-owned'); // no longer available
+ say_status("Reply sent OK");
+ if (typeof(callback) === "function") {
+ callback.call($(this), data.data); // returned data['data'] is null but may change in future
+ }
+ } else {
+ $li.removeClass('msg-is-busy').addClass('msg-is-locked');
+ say_status("Reply failed: " + data.error);
+ }
+ },
+ error: function(jqXHR, textStatus, errorThrown) {
+ say_status("Reply error: " + textStatus + ": " + errorThrown);
+ $li.removeClass('msg-is-busy');
+ }
+ });
+ };
+
+ var hide = function(msg_id, reason_text, options) {
+ if (_use_fancybox){
+ $.fancybox.close();
+ }
+ var callback = null;
+ var check_li_exists = false;
+ if (options) {
+ if (typeof(options.callback) === 'function') {
+ callback = options.callback;
+ }
+ if (typeof(options.check_li_exists) !== undefined && options.check_li_exists !== undefined) {
+ check_li_exists = true; // MM dummy
+ }
+ }
+ var $li = $('#' + _msg_prefix + msg_id);
+ if (check_li_exists) {
+ if ($li.size() === 0) {
+ say_status("Couldn't find message with ID " + msg_id);
+ return;
+ }
+ }
+ reason_text = $.trim(reason_text);
+ $li.addClass('msg-is-busy');
+ $.ajax({
+ dataType:"json",
+ type:"post",
+ data: {reason_text: reason_text},
+ url: _url_root +"messages/hide/" + msg_id + ".json",
+ beforeSend: function (xhr){
+ xhr.setRequestHeader('Authorization', get_current_auth_credentials());
+ xhr.withCredentials = true;
+ },
+ success:function(data, textStatus) {
+ if (data.success) {
+ $li.removeClass('msg-is-busy msg-is-locked').addClass('msg-is-owned').fadeOut('slow'); // no longer available
+ say_status("Message hidden");
+ if (typeof(callback) === "function") {
+ callback.call($(this), data.data);
+ }
+ } else {
+ $li.removeClass('msg-is-busy').addClass('msg-is-locked');
+ say_status("Hide failed: " + data.error);
+ }
+ },
+ error: function(jqXHR, textStatus, errorThrown) {
+ say_status("Hide error: " + textStatus + ": " + errorThrown);
+ $li.removeClass('msg-is-busy');
+ }
+ });
+ };
+
+ var show_info = function(msg_id) {
+ var $info = $("#msg-info-box-" + msg_id);
+ if ($info.size()==1) {
+ if ($info.is(':hidden')) {
+ $info.slideDown();
+ } else {
+ $info.slideUp();
+ }
+ }
+ };
+
+ // if boilerplate is not already in local storage, make ajax call and load them
+ // otherwise, populate the boilerplate select lists: these are currently the
+ // reasons for hiding a message, and pre-loaded replies.message-manager.dev.mysociety.org
+ // NB no auth required on this call
+ var populate_boilerplate_strings = function(boilerplate_type, options) {
+ if (Modernizr.sessionstorage && sessionStorage.getItem('boilerplate_' + boilerplate_type)) {
+ populate_boilerplate(boilerplate_type, sessionStorage.getItem('boilerplate_' + boilerplate_type));
+ return;
+ }
+ var callback = null;
+ if (options) {
+ if (typeof(options.callback) === 'function') {
+ callback = options.callback;
+ }
+ }
+ $.ajax({
+ dataType:"json",
+ type:"get",
+ url: _url_root +"boilerplate_strings/index/" + boilerplate_type + ".json",
+ success:function(data, textStatus) {
+ if (data.success) {
+ var raw_data = data.data;
+ var select_html = get_select_tag_html(data.data, boilerplate_type);
+ if (Modernizr.sessionstorage) {
+ sessionStorage.setItem('boilerplate_' + boilerplate_type, select_html);
+ }
+ populate_boilerplate(boilerplate_type, select_html);
+ if (typeof(callback) === "function") {
+ callback.call($(this), data.data);
+ }
+ } else {
+ // console.log("failed to load boilerplate");
+ }
+ },
+ error: function(jqXHR, textStatus, errorThrown) {
+ // console.log("boilerplate error: " + textStatus + ": " + errorThrown);
+ }
+ });
+ };
+
+ // TODO flatten all HTML in boilerplate text
+ var get_select_tag_html = function(boilerplate_data, boilerplate_type) {
+ var html = "<option value=''>--none--</option>\n";
+ var qty_langs = 0;
+ var qty_strings = 0;
+ if (boilerplate_data.langs) {
+ for (var i=0; i< boilerplate_data.langs.length; i++) {
+ var lang = boilerplate_data.langs[i];
+ var options = "";
+ for (var j in boilerplate_data[lang]) {
+ if (boilerplate_data[lang].hasOwnProperty(j)) {
+ options += "<option>" + boilerplate_data[lang][j] + "</option>\n";
+ qty_strings++;
+ }
+ }
+ if (boilerplate_data.langs.length > 1) { // really need pretty name for language
+ options = '<optgroup label="' + lang + '">\n' + options + '</optgroup>\n';
+ }
+ html += options;
+ }
+ }
+ if (qty_strings === 0) {
+ html = '';
+ }
+ return html;
+ };
+
+ // actually load the select tag
+ var populate_boilerplate = function(boilerplate_type, html) {
+ var $target = null;
+ switch(boilerplate_type) {
+ case 'hide-reason': $target = $hide_reasons; break;
+ case 'reply': $target = $boilerplate_replies; break;
+ }
+ if ($target) {
+ if (html) {
+ $target.show().find('select').html(html);
+ } else {
+ $target.hide();
+ }
+ }
+ };
+
+ // revealed public methods:
+ return {
+ config: config,
+ setup_click_listener: setup_click_listener,
+ get_available_messages: get_available_messages,
+ request_lock: request_lock,
+ assign_fms_id: assign_fms_id,
+ reply: reply,
+ hide: hide,
+ show_info: show_info,
+ sign_out: sign_out,
+ populate_boilerplate_strings: populate_boilerplate_strings,
+ say_status: say_status
+ };
+})();
diff --git a/web/cobrands/fixmybarangay/messages.js b/web/cobrands/fixmybarangay/messages.js
new file mode 100644
index 000000000..aebf35156
--- /dev/null
+++ b/web/cobrands/fixmybarangay/messages.js
@@ -0,0 +1,26 @@
+$(function(){
+
+ var mm = $('#message_manager');
+
+ $.getJSON('/cobrands/fixmybarangay/test-texts.json', function(data) {
+ var items = [];
+ $.each(data, function(k, v) {
+ var item = $('<input type="radio"/>').attr({
+ 'id': 'mm_text_' + v.id,
+ 'name': 'mm_text',
+ 'value': v.text
+ }).wrap('<p/>').parent().html();
+ var label = $('<label/>', {
+ 'class': 'inline',
+ 'for': 'mm_text_' + v.id
+ }).text(v.text).wrap('<p/>').parent().html();
+ item = '<li><p>' + item + ' ' + label + '</p></li>';
+ items.push(item);
+ });
+ mm.html(items.join(''));
+ mm.find('input').click(function(){
+ $('#form_detail').val( $('input[name=mm_text]:checked').val() );
+ });
+ });
+
+});
diff --git a/web/cobrands/fixmybarangay/position_map.js b/web/cobrands/fixmybarangay/position_map.js
new file mode 100644
index 000000000..753b5f854
--- /dev/null
+++ b/web/cobrands/fixmybarangay/position_map.js
@@ -0,0 +1,22 @@
+function position_map_box() {
+ var $html = $('html');
+ if ($html.hasClass('ie6')) {
+ $('#map_box').prependTo('.wrapper').css({
+ zIndex: 0, position: 'absolute',
+ top: 0, left: 0, right: 0, bottom: 0,
+ width: '100%', height: $(window).height(),
+ margin: 0
+ });
+ } else {
+ $('#map_box').prependTo('.wrapper').css({
+ zIndex: 0, position: 'fixed',
+ top: 0, left: 0, right: 0, bottom: 0,
+ width: '100%', height: '100%',
+ margin: 0
+ });
+ }
+}
+
+function map_fix() {}
+var slide_wards_down = 0;
+
diff --git a/web/cobrands/fixmybarangay/test-texts.json b/web/cobrands/fixmybarangay/test-texts.json
new file mode 100644
index 000000000..7acde1e32
--- /dev/null
+++ b/web/cobrands/fixmybarangay/test-texts.json
@@ -0,0 +1,17 @@
+[
+ {
+ "id" : 1,
+ "number" : "032-9999999",
+ "text" : "Pothole on corner of G. De Vera and T. Padilla"
+ },
+ {
+ "id" : 2,
+ "number" : "032-1234567",
+ "text" : "Broken street light on Rahmann Street"
+ },
+ {
+ "id" : 3,
+ "number" : "+63 917 0000000",
+ "text" : "F. Manalo giant pothole"
+ }
+]
diff --git a/web/cobrands/fixmystreet/_base.scss b/web/cobrands/fixmystreet/_base.scss
index 5d71c33e6..9f6a2fe90 100644
--- a/web/cobrands/fixmystreet/_base.scss
+++ b/web/cobrands/fixmystreet/_base.scss
@@ -1,7 +1,12 @@
/* HEADINGS and TYPOGRAPHY */
+$body-font: MuseoSans, Helmet, Freesans, sans-serif !default;
+$meta-font: Helmet, Freesans, sans-serif !default;
+$heading-font: 'Museo300-display', MuseoSans, Helmet, Freesans, sans-serif !default;
+$image-sprite: '/cobrands/fixmystreet/images/sprite.png' !default;
+
body {
- font-family: MuseoSans, Helmet, Freesans, sans-serif;
+ font-family: $body-font;
margin:0;
font-size:1em;
line-height:1.5;
@@ -17,14 +22,14 @@ p {
}
small{
- font-family: Helmet, Freesans, sans-serif;
+ font-family: $meta-font;
font-style: italic;
font-size: 0.8125em;
line-height: 1.2307em;
}
h1 {
- font-family: 'Museo300-display', MuseoSans, Helmet, Freesans, sans-serif;
+ font-family: $heading-font;
font-size: 2em;
line-height: 1em;
font-weight: normal;
@@ -40,7 +45,7 @@ h1#reports_heading a {
}
h2 {
- font-family:'Museo300-display', MuseoSans, Helmet, Freesans, sans-serif;
+ font-family: $heading-font;
font-size: 1.5em; /*24px*/
line-height: 1.3333em; /*32px*/
font-weight: normal;
@@ -102,7 +107,7 @@ ol.big-numbers {
color:#ccc;
line-height:1;
font: {
- family: Helmet, Freesans, sans-serif;
+ family: $meta-font;
weight:bold;
size:2.5em;
}
@@ -188,14 +193,14 @@ a:visited {
margin-bottom: 0px;
}
.meta-2{
- font-family: Helmet, Freesans, sans-serif;
+ font-family: $meta-font;
color:#666666;
font-style: italic;
font-size: 0.75em;
}
h4.static{
- font-family: Helmet, Freesans, sans-serif;
+ font-family: $meta-font;
text-transform: uppercase;
font-size: 0.875em;
line-height: 1.71428em;
@@ -284,7 +289,7 @@ textarea {
display: block;
font-size: 1em;
line-height: 1.5em;
- font-family: Helmet, Freesans, sans-serif;
+ font-family: $meta-font;
min-height:8em;
}
@@ -451,7 +456,7 @@ p.label-valid {
background: url('/cobrands/fixmystreet/images/ie_logo.gif') 0 -5px no-repeat;
}
.ie7 #site-logo {
- background: url('/cobrands/fixmystreet/images/sprite.png') -3px -3px no-repeat;
+ background: url($image-sprite) -3px -3px no-repeat;
}
// this is a skip to nav for mobile users only
@@ -510,7 +515,7 @@ p.label-valid {
background: url('/cobrands/fixmystreet/images/ie_mysoc_logo.gif') center no-repeat;
}
.ie7 #main-nav ul#mysoc-menu li a#mysoc-logo {
- background: url('/cobrands/fixmystreet/images/sprite.png') -240px -38px no-repeat;
+ background: url($image-sprite) -240px -38px no-repeat;
}
//defines where the table caption is (login stuff on mob, nav menu on desktop)
@@ -570,7 +575,7 @@ p.label-valid {
text-transform:uppercase;
font: {
size:0.6875em;
- family: Helmet, Freesans, sans-serif;
+ family: $meta-font;
}
&:hover, &.hover {
text-decoration:none;
@@ -578,19 +583,23 @@ p.label-valid {
color:#fff;
}
&.abuse {
- background-image:url('/cobrands/fixmystreet/images/sprite.png');
+ background-image:url($image-sprite);
background-position:center -2424px;
}
&.feed {
- background-image:url('/cobrands/fixmystreet/images/sprite.png');
+ background-image:url($image-sprite);
background-position:center -2563px;
}
+ &.share {
+ background-image: url('/cobrands/fixmystreet/images/share.png');
+ background-position: center 25%;
+ }
&.chevron {
- background-image:url('/cobrands/fixmystreet/images/sprite.png');
+ background-image:url($image-sprite);
background-position:center -2716px;
}
&.hover {
- background-image:url('/cobrands/fixmystreet/images/sprite.png');
+ background-image:url($image-sprite);
background-position:center -2064px;
}
}
@@ -631,8 +640,19 @@ p.label-valid {
}
}
+#report-updates-data img {
+ float: right;
+}
+
+#report-share iframe {
+ vertical-align: top;
+}
//footer blocks
+footer {
+ margin-top: 1em;
+}
+
#footer-mobileapps {
@extend .full-width;
padding:1em;
@@ -725,7 +745,7 @@ a.button-right,
:hover.button-right,
a:hover.button-right {
padding:1em 3em 1em 1em;
- background-image: url('/cobrands/fixmystreet/images/sprite.png');
+ background-image: url($image-sprite);
background-repeat:no-repeat;
background-position:right -686px;
}
@@ -735,7 +755,7 @@ a.button-left,
:hover.button-left,
a:hover.button-left {
padding:1em 1em 1em 3em;
- background-image: url('/cobrands/fixmystreet/images/sprite.png');
+ background-image: url($image-sprite);
background-repeat:no-repeat;
background-position:-18px -802px;
}
@@ -744,7 +764,7 @@ a:hover.button-left {
position: relative;
z-index:1000;
top:-1.75em;
- background: $contrast1;
+ background: $col_click_map;
color: #fff;
padding:1em;
text: {
@@ -760,7 +780,7 @@ a:hover.button-left {
width: 0;
height: 0;
border-left: 0.5em solid transparent;
- border-bottom: 0.5em solid $contrast1_dark;
+ border-bottom: 0.5em solid $col_click_map_dark;
}
}
@@ -794,9 +814,9 @@ a:hover.button-left {
}
&#fixed {
color:#fff;
- background: $contrast1;
+ background: $col_fixed_label;
&:before {
- border-bottom: 0.5em solid $contrast1_dark;
+ border-bottom: 0.5em solid $col_fixed_label_dark;
}
}
}
@@ -956,7 +976,7 @@ a:hover.button-left {
width:20px;
height:20px;
opacity: 0.5;
- background:#fff url(/cobrands/fixmystreet/images/sprite.png) -16px -1098px no-repeat;
+ background:#fff url($image-sprite) -16px -1098px no-repeat;
//hide text - http://nicolasgallagher.com/another-css-image-replacement-technique/
font: 0/0 a;
color: transparent;
@@ -1020,7 +1040,7 @@ a:hover.button-left {
height:36px !important;
text-indent:-999999px;
opacity:0.85;
- background:url('/cobrands/fixmystreet/images/sprite.png') no-repeat;
+ background:url($image-sprite) no-repeat;
&:hover {
opacity:1;
}
@@ -1088,19 +1108,19 @@ a:hover.button-left {
padding:0.6em 3em 0.5em 1em;
background-repeat:no-repeat;
&#hide_pins_link {
- background-image:url('/cobrands/fixmystreet/images/sprite.png');
+ background-image:url($image-sprite);
background-position: right -3976px;
}
&#all_pins_link {
- background-image:url('/cobrands/fixmystreet/images/sprite.png');
+ background-image:url($image-sprite);
background-position: right -4022px;
}
&#map_permalink {
- background-image:url('/cobrands/fixmystreet/images/sprite.png');
+ background-image:url($image-sprite);
background-position: right -4070px;
}
&.feed {
- background-image:url('/cobrands/fixmystreet/images/sprite.png');
+ background-image:url($image-sprite);
background-position: right -3936px;
}
&:hover {
@@ -1146,25 +1166,29 @@ a:hover.button-left {
}
}
&.map_complete {
- background:none;
- display:block;
- border-bottom:4px solid #fff;
+ height: 100%;
+ background: none;
+ display: block;
+ border-bottom: 4px solid #fff;
a#try_again {
- display:block;
- margin:0 auto 6em auto;
- background:rgba(0, 0, 0, 0.8);
+ position: absolute;
+ display: block;
+ left: 25%;
+ bottom: 0;
+ margin-bottom: 6em;
+ background: rgba(0, 0, 0, 0.8);
@include border-radius(0.5em);
}
a#mob_ok {
- position:absolute;
- right:1em;
- bottom:0;
- height:20px;
- padding-top:30px;
- display:block;
- width:4em;
- background:#fff url('/cobrands/fixmystreet/images/sprite.png') 12px -4140px no-repeat;
- color:#000;
+ position: absolute;
+ display: block;
+ right: 1em;
+ bottom: 0;
+ height: 20px;
+ padding-top: 30px;
+ width: 4em;
+ background: #fff url($image-sprite) 12px -4140px no-repeat;
+ color: #000;
}
}
}
@@ -1306,9 +1330,6 @@ table.nicetable {
&.a {
background:#f6f6f6;
}
- &:nth-child(even) {
- background:#f6f6f6;
- }
&.gone {
color: #666666;
background-color: #cccccc;
@@ -1350,10 +1371,10 @@ table.nicetable {
width:16px;
height:16px;
text-indent:-999999px;
- background:url(/cobrands/fixmystreet/images/sprite.png) -341px -263px no-repeat;
+ background:url($image-sprite) -341px -263px no-repeat;
@include border-radius(4px);
&:hover {
- background:#222 url(/cobrands/fixmystreet/images/sprite.png) -341px -223px no-repeat;
+ background:#222 url($image-sprite) -341px -223px no-repeat;
}
}
}
@@ -1422,7 +1443,7 @@ table.nicetable {
h2 {
font: {
style:italic;
- family: Helmet, Freesans, sans-serif;
+ family: $meta-font;
size:1.1875em;
}
color:#4d4d4d;
@@ -1435,7 +1456,7 @@ table.nicetable {
padding:1em;
color: $primary_text;
background: $primary;
- font-family: Helmet, Freesans, sans-serif;
+ font-family: $meta-font;
label {
margin:0;
}
@@ -1477,7 +1498,7 @@ table.nicetable {
color:#C8C8C8;
padding:0.5em;
font: {
- family: Helmet, Freesans, sans-serif;
+ family: $meta-font;
size:0.8125em;
}
@include border-radius(0 0 0.25em 0.25em);
@@ -1494,7 +1515,7 @@ table.nicetable {
width:100%;
color: $primary_text;
background: $primary;
- font-family: Helmet, Freesans, sans-serif;
+ font-family: $meta-font;
div {
display:table-cell;
text-align:center;
diff --git a/web/cobrands/fixmystreet/_colours.scss b/web/cobrands/fixmystreet/_colours.scss
index 1a62d0282..7dcd9ab9b 100644
--- a/web/cobrands/fixmystreet/_colours.scss
+++ b/web/cobrands/fixmystreet/_colours.scss
@@ -1,9 +1,13 @@
/* COLOURS */
$primary: #FFD000;
-$primary_b: #F3B11E;
+$primary_b: #F3B11E; // For the box around the front page postcode form only
$primary_text: #222;
-$contrast1: #00BD08;
-$contrast1_dark: #4B8304;
-$contrast2: #AA8D11;
+// The "Click map" box on /around
+$col_click_map: #00BD08;
+$col_click_map_dark: #4B8304;
+
+// The "fixed" message on a report page
+$col_fixed_label: #00BD08;
+$col_fixed_label_dark: #4B8304;
diff --git a/web/cobrands/fixmystreet/_layout.scss b/web/cobrands/fixmystreet/_layout.scss
index 43c0d53ee..28c1b6cb8 100644
--- a/web/cobrands/fixmystreet/_layout.scss
+++ b/web/cobrands/fixmystreet/_layout.scss
@@ -1,6 +1,8 @@
@import "compass";
@import "_mixins";
+$image-sprite: '/cobrands/fixmystreet/images/sprite.png' !default;
+
//hacks for desk/mob only stuff
.desk-only {
display: block;
@@ -10,7 +12,8 @@
}
body {
- background: #1A1A1A url(/cobrands/fixmystreet/images/tile.jpg) 0 0 repeat;
+ background: #1A1A1A;
+ color: #fff;
}
h1 {
@@ -54,17 +57,16 @@ h1 {
}
}
-.nav-wrapper{
+.nav-wrapper {
display: table-caption;
- .nav-wrapper-2{
+ .nav-wrapper-2 {
width: 100%;
min-height: 4em;
position: absolute;
- border-top:4px solid #1a1a1a;
- @include border-image(url(/cobrands/fixmystreet/images/tile-y-border.jpg) 4 0 0 0);
- border-left:0;
- border-right:0;
- z-index:2;
+ border-top: 4px solid $primary;
+ border-left: 0;
+ border-right: 0;
+ z-index: 2;
}
}
@@ -151,7 +153,6 @@ h1 {
background: $primary;
padding:0.25em;
margin:0.5em;
- color:#333;
@include border-radius(0.25em);
&:hover {
background:$primary/1.1;
@@ -165,12 +166,12 @@ h1 {
&#mysoc-menu{
padding: 0em 0.5em;
margin-left: 0.25em;
- background:$primary url(/cobrands/fixmystreet/images/tile-y.jpg);
+ background: $primary;
@include border-radius(0 0 0.375em 0.375em);
li{
a{
background:none;
- color:#000;
+ color: $primary_text;
text-transform: uppercase;
font-size: 0.6875em;
padding: 1.3em 0.7em 1em 0.7em;
@@ -205,6 +206,7 @@ h1 {
margin-left: 0.5em;
padding: 1em 1em 3em;
background: #fff;
+ color: #222;
@include box-shadow(0px 0px 6px 1px #000);
}
.ie6, .ie7, .ie8 {
@@ -223,6 +225,7 @@ body.mappage {
}
.content {
float:left;
+ padding: 1em 1em 10em;
}
#main-nav ul#main-menu li a,
#main-nav ul#main-menu li span {
@@ -374,7 +377,7 @@ body.twothirdswidthpage {
//footer blocks
#footer-mobileapps {
- border-right:1em solid #fff;
+ border-right:1em solid transparent;
background:none;
padding:0;
@include box-shadow(inset rgba(0, 0, 0, 0) 0 0 0);
@@ -395,7 +398,7 @@ body.twothirdswidthpage {
height: 32px;
margin:0 auto;
text-indent: -999999px;
- background: url(/cobrands/fixmystreet/images/sprite.png) -12px -3610px no-repeat;
+ background: url($image-sprite) -12px -3610px no-repeat;
opacity: 0.8;
&:hover {
opacity: 1;
@@ -432,14 +435,14 @@ body.twothirdswidthpage {
}
#footer-help {
- border-left:1em solid #fff;
+ border-left:1em solid transparent;
ul {
display:table;
li {
display:table-cell;
border-bottom:none;
&:last-child {
- border-left:1.25em solid #fff;
+ border-left:1.25em solid transparent;
}
}
}
@@ -502,7 +505,7 @@ body.twothirdswidthpage {
left:-1em;
width:1em;
height:100%;
- background:#000 url(/cobrands/fixmystreet/images/sprite.png) right -4119px no-repeat;
+ background:#000 url($image-sprite) right -4119px no-repeat;
@include border-radius(0.25em 0 0 0.25em);
&:hover {
left:-1.5em;
@@ -582,19 +585,24 @@ body.twothirdswidthpage {
padding: 0.5em 1.5em 0.5em 0;
text-transform:none;
&.abuse {
- background-image:url(/cobrands/fixmystreet/images/sprite.png);
+ background-image:url($image-sprite);
background-position:right -2935px;
}
&.feed {
- background-image:url(/cobrands/fixmystreet/images/sprite.png);
+ background-image:url($image-sprite);
background-position:right -3074px;
}
+ &.share {
+ min-width: 5em;
+ background-image: url(/cobrands/fixmystreet/images/share.png);
+ background-position: 90% 50%;
+ }
&.chevron {
- background-image:url(/cobrands/fixmystreet/images/sprite.png);
+ background-image:url($image-sprite);
background-position:right -3225px;
}
&.hover {
- background-image:url(/cobrands/fixmystreet/images/sprite.png);
+ background-image:url($image-sprite);
background-position:right -1876px;
}
}
@@ -618,6 +626,15 @@ body.twothirdswidthpage {
padding-top: 0;
}
+// If JS is disabled, these are still CSS positioned, so don't want behind shining through.
+#report-share, #report-updates-data {
+ background-color: #fff;
+}
+// Prevent gap in non-JS, and looks better with JS, due to some padding/margin effect.
+#report-updates-data fieldset {
+ margin-bottom: 0;
+}
+
// pokes over the RHS with a little triangle
.big-green-banner {
top:auto;
@@ -625,14 +642,14 @@ body.twothirdswidthpage {
margin-left:-2em;
font-size:1.375em;
padding:1em 3em 1em 1em;
- background: $contrast1 url(/cobrands/fixmystreet/images/sprite.png) right -2188px no-repeat;
+ background: $col_click_map url($image-sprite) right -2188px no-repeat;
&:before {
right:0;
left:auto;
top:-0.5em;
position: absolute;
border-top: 0.5em solid transparent;
- border-left: 0.5em solid $contrast1_dark;
+ border-left: 0.5em solid $col_click_map_dark;
border-bottom:none;
}
span {
@@ -642,7 +659,7 @@ body.twothirdswidthpage {
}
}
.ie6 .big-green-banner {
- background: $contrast1 url(/cobrands/fixmystreet/images/ie_green_chevron.gif) right center no-repeat;
+ background: $col_click_map url(/cobrands/fixmystreet/images/ie_green_chevron.gif) right center no-repeat;
}
.banner {
@@ -657,11 +674,11 @@ body.twothirdswidthpage {
}
&#fixed {
padding-top:5em;
- background-image:url(/cobrands/fixmystreet/images/sprite.png);
+ background-image:url($image-sprite);
background-position:-324px -326px;
background-repeat:no-repeat;
&:before {
- border-bottom: 0.75em solid $contrast1_dark;
+ border-bottom: 0.75em solid $col_fixed_label_dark;
}
}
&#closed {
@@ -741,7 +758,7 @@ textarea.form-error {
.no-js #report-a-problem-sidebar {
position: static;
width: auto;
- @include box-shadow(rgba(0, 0, 0, 0), 0, 0, 0);
+ @include box-shadow(rgba(0, 0, 0, 0) 0 0 0);
.sidebar-tips,
.sidebar-notes {
font-size:1em;
@@ -767,6 +784,14 @@ textarea.form-error {
}
}
+/* Adjust the above so text flow can be different from display */
+#forgotten-pw {
+ position: relative;
+ left: 27em;
+ top: -7em;
+ margin-bottom: -7em; // So no gap in main flow
+}
+
// Frontpage
body.frontpage {
@@ -785,7 +810,7 @@ body.frontpage {
top:3em;
width: 300px;
height: 60px;
- background: url('/cobrands/fixmystreet/images/sprite.png') -2px -108px no-repeat;
+ background: url($image-sprite) -2px -108px no-repeat;
}
#user-meta {
z-index:10;
@@ -835,7 +860,7 @@ body.frontpage {
// big yellow bit full screen width
#front-main {
color: $primary_text;
- background: $primary url(/cobrands/fixmystreet/images/tile-y.jpg);
+ background: $primary;
margin: 0;
padding: 1em;
#front-main-container {
@@ -845,9 +870,10 @@ body.frontpage {
h2 {
font-style:normal;
margin:0;
- color:#222;
+ color: inherit;
}
#postcodeForm {
+ color: inherit;
background:none;
overflow:hidden;
padding-bottom: 0;
@@ -877,15 +903,15 @@ body.frontpage {
}
}
a {
- color: $primary_text;
+ color: inherit;
text-decoration: underline;
&:hover {
text-decoration: none;
}
}
a#geolocate_link {
+ color: inherit;
background:none;
- color:#222;
text-decoration: none;
padding-bottom: 0;
&:hover {
@@ -906,7 +932,7 @@ body.frontpage {
}
#front-howto {
- border-right:1em solid #fff;
+ border-right:1em solid transparent;
#front_stats {
background:none;
color: #222;
@@ -930,7 +956,7 @@ body.frontpage {
}
#front-recently {
- border-left:1em solid #fff;
+ border-left:1em solid transparent;
}
#front-howto h2,
@@ -1021,7 +1047,7 @@ body.frontpage {
.general-sidebar-notes {
position: static;
width: auto;
- @include box-shadow(rgba(0, 0, 0, 0), 0, 0, 0);
+ @include box-shadow(rgba(0, 0, 0, 0) 0 0 0);
.sidebar-tips,
.sidebar-notes {
font-size:1em;
diff --git a/web/cobrands/fixmystreet/fixmystreet.js b/web/cobrands/fixmystreet/fixmystreet.js
index c8ed8ae51..ab20520d0 100644
--- a/web/cobrands/fixmystreet/fixmystreet.js
+++ b/web/cobrands/fixmystreet/fixmystreet.js
@@ -54,8 +54,13 @@ $(function(){
var $html = $('html');
var cobrand;
+ var is_small_map = false;
if (window.location.href.indexOf('bromley') != -1) {
cobrand = 'bromley';
+ is_small_map = true;
+ } else if (window.location.href.indexOf('oxfordshire') != -1) {
+ cobrand = 'oxfordshire';
+ is_small_map = true;
}
// Deal with switching between mobile and desktop versions on resize
@@ -92,8 +97,7 @@ $(function(){
$('.big-green-banner')
.addClass('mobile-map-banner')
.appendTo('#map_box')
- .text('Place pin on map')
- .prepend('<a href="/">home</a>');
+ .html('<a href="/">Home</a> Place pin on map');
}
$('span.report-a-problem-btn').on('click.reportBtn', function(){
$('html, body').animate({scrollTop:0}, 500);
@@ -105,7 +109,7 @@ $(function(){
$html.removeClass('mobile');
position_map_box();
if (typeof fixmystreet !== 'undefined') {
- if (cobrand == 'bromley') {
+ if (is_small_map) {
//$('#bromley-footer').hide();
} else {
fixmystreet.state_map = 'full';
@@ -113,12 +117,13 @@ $(function(){
}
if (typeof fixmystreet !== 'undefined' && fixmystreet.page == 'around') {
// Remove full-screen-ness
- var banner_text;
+ var banner_text = 'Click map to report a problem';
if (cobrand == 'bromley') {
- banner_text = 'Click map to report a problem<span>Yellow pins show existing reports</span>';
- } else {
+ banner_text += '<span>Yellow pins show existing reports</span>';
+ }
+ if (! is_small_map) {
$('#site-header').show();
- banner_text = 'Click map to report a problem';
+ banner_text = validation_strings.report_problem_heading;
}
$('#fms_pan_zoom').css({ top: '4.75em !important' });
$('.big-green-banner')
@@ -247,23 +252,34 @@ $(function(){
// A sliding drawer from the bottom of the page, small version
// that doesn't change the main content at all.
-$.fn.small_drawer = function(id) {
- this.toggle(function(){
- var $this = $(this), d = $('#' + id);
- if (!$this.addClass('hover').data('setup')) {
- d.hide().removeClass('hidden-js').css({
+(function($){
+
+ var opened;
+
+ $.fn.small_drawer = function(id) {
+ this.toggle(function(){
+ if (opened) {
+ opened.click();
+ }
+ var $this = $(this), d = $('#' + id);
+ if (!$this.addClass('hover').data('setup')) {
+ d.hide().removeClass('hidden-js').css({
padding: '1em',
background: '#fff'
- });
- $this.data('setup', true);
- }
- d.slideDown();
- }, function(e){
- var $this = $(this), d = $('#' + id);
- $this.removeClass('hover');
- d.slideUp();
- });
-};
+ });
+ $this.data('setup', true);
+ }
+ d.slideDown();
+ opened = $this;
+ }, function(e){
+ var $this = $(this), d = $('#' + id);
+ $this.removeClass('hover');
+ d.slideUp();
+ opened = null;
+ });
+ };
+
+})(jQuery);
// A sliding drawer from the bottom of the page, large version
$.fn.drawer = function(id, ajax) {
@@ -338,6 +354,7 @@ $.fn.drawer = function(id, ajax) {
$('#key-tool-around-updates').drawer('updates_ajax', true);
}
$('#key-tool-report-updates').small_drawer('report-updates-data');
+ $('#key-tool-report-share').small_drawer('report-share');
// Go directly to RSS feed if RSS button clicked on alert page
// (due to not wanting around form to submit, though good thing anyway)
@@ -422,7 +439,7 @@ $.fn.drawer = function(id, ajax) {
*/
if (!$('html.mobile').length) {
if (!($('body').hasClass('frontpage'))){
- var offset = -176;
+ var offset = -18 * 16;
if (cobrand == 'bromley') {
offset = -110;
}
diff --git a/web/cobrands/fixmystreet/images/share.png b/web/cobrands/fixmystreet/images/share.png
new file mode 100644
index 000000000..6eb1b6cdb
--- /dev/null
+++ b/web/cobrands/fixmystreet/images/share.png
Binary files differ
diff --git a/web/cobrands/fixmystreet/layout.scss b/web/cobrands/fixmystreet/layout.scss
index ff7080c11..a20a4b889 100644
--- a/web/cobrands/fixmystreet/layout.scss
+++ b/web/cobrands/fixmystreet/layout.scss
@@ -66,3 +66,24 @@ h3, h4 {
@import "_colours";
@import "_layout";
+// Tiled main body background
+body {
+ background: #1A1A1A url(/cobrands/fixmystreet/images/tile.jpg) 0 0 repeat;
+ color: #fff;
+}
+
+// Tiled background stripe, not plain colour
+#front-main {
+ background: $primary url(/cobrands/fixmystreet/images/tile-y.jpg);
+}
+#main-nav {
+ ul#mysoc-menu {
+ background: $primary url(/cobrands/fixmystreet/images/tile-y.jpg);
+ }
+}
+.nav-wrapper {
+ .nav-wrapper-2 {
+ @include border-image(url(/cobrands/fixmystreet/images/tile-y-border.jpg) 4 0 0 0);
+ }
+}
+
diff --git a/web/cobrands/oxfordshire/_colours.scss b/web/cobrands/oxfordshire/_colours.scss
new file mode 100644
index 000000000..0179bdbe4
--- /dev/null
+++ b/web/cobrands/oxfordshire/_colours.scss
@@ -0,0 +1,16 @@
+/* COLOURS */
+
+$oxfordshire_dk_green: #114500;
+$oxfordshire_lt_green: #339E00;
+
+$primary: $oxfordshire_lt_green;
+$primary_b: $oxfordshire_dk_green;
+$primary_text: #fff;
+
+$col_click_map: $oxfordshire_lt_green;
+$col_click_map_dark: $primary_text;
+
+$col_fixed_label: $oxfordshire_lt_green;
+$col_fixed_label_dark: $primary_text;
+
+
diff --git a/web/cobrands/oxfordshire/base.scss b/web/cobrands/oxfordshire/base.scss
new file mode 100644
index 000000000..10e5c5711
--- /dev/null
+++ b/web/cobrands/oxfordshire/base.scss
@@ -0,0 +1,40 @@
+@import "../fixmystreet/_h5bp";
+@import "./_colours";
+@import "../fixmystreet/_mixins";
+@import "compass";
+
+@import "../fixmystreet/_base";
+
+
+// Colour tab to match colour scheme
+#nav-link {
+ width: 50px;
+ height: 48px;
+ background: url('/cobrands/oxfordshire/images/tab-green.png') 0 0 no-repeat;
+}
+
+#site-header {
+ background: none;
+ background-color: $oxfordshire_dk_green;
+ height: 60px;
+}
+
+#site-logo {
+ margin-top:4px;
+ background-image: url('/cobrands/oxfordshire/images/logo.jpg');
+ background-repeat: no-repeat;
+ background-position: 0px 0px;
+ border: 4px solid $oxfordshire_dk_green;
+ width: 173px;
+ height: 38px;
+}
+
+#main-nav ul#mysoc-menu li a#mysoc-logo {
+ background-image: none;
+ text-indent: 0;
+ img {
+ display: inline;
+ height: 20px;
+ width: 105px;
+ }
+} \ No newline at end of file
diff --git a/web/cobrands/oxfordshire/config.rb b/web/cobrands/oxfordshire/config.rb
new file mode 100644
index 000000000..471b4b008
--- /dev/null
+++ b/web/cobrands/oxfordshire/config.rb
@@ -0,0 +1,25 @@
+# Require any additional compass plugins here.
+
+# Set this to the root of your project when deployed:
+http_path = "/"
+css_dir = ""
+sass_dir = ""
+images_dir = ""
+javascripts_dir = ""
+
+# You can select your preferred output style here (can be overridden via the command line):
+# output_style = :expanded or :nested or :compact or :compressed
+
+# To enable relative paths to assets via compass helper functions. Uncomment:
+# relative_assets = true
+
+# To disable debugging comments that display the original location of your selectors. Uncomment:
+# line_comments = false
+
+# If you prefer the indented syntax, you might want to regenerate this
+# project again passing --syntax sass, or you can uncomment this:
+# preferred_syntax = :sass
+# and then run:
+# sass-convert -R --from scss --to sass sass scss && rm -rf sass && mv scss sass
+
+line_comments = false # by Compass.app \ No newline at end of file
diff --git a/web/cobrands/oxfordshire/images/bg-y.jpg b/web/cobrands/oxfordshire/images/bg-y.jpg
new file mode 100755
index 000000000..b623bc784
--- /dev/null
+++ b/web/cobrands/oxfordshire/images/bg-y.jpg
Binary files differ
diff --git a/web/cobrands/oxfordshire/images/bg.jpg b/web/cobrands/oxfordshire/images/bg.jpg
new file mode 100755
index 000000000..e670c0f7d
--- /dev/null
+++ b/web/cobrands/oxfordshire/images/bg.jpg
Binary files differ
diff --git a/web/cobrands/oxfordshire/images/divider1x32.png b/web/cobrands/oxfordshire/images/divider1x32.png
new file mode 100644
index 000000000..fffea7e24
--- /dev/null
+++ b/web/cobrands/oxfordshire/images/divider1x32.png
Binary files differ
diff --git a/web/cobrands/oxfordshire/images/dot6x6.jpg b/web/cobrands/oxfordshire/images/dot6x6.jpg
new file mode 100755
index 000000000..73a9c72f4
--- /dev/null
+++ b/web/cobrands/oxfordshire/images/dot6x6.jpg
Binary files differ
diff --git a/web/cobrands/oxfordshire/images/fms-logo-105x20.png b/web/cobrands/oxfordshire/images/fms-logo-105x20.png
new file mode 100644
index 000000000..286f22ded
--- /dev/null
+++ b/web/cobrands/oxfordshire/images/fms-logo-105x20.png
Binary files differ
diff --git a/web/cobrands/oxfordshire/images/fms-logo-inverse.png b/web/cobrands/oxfordshire/images/fms-logo-inverse.png
new file mode 100644
index 000000000..77417c3e9
--- /dev/null
+++ b/web/cobrands/oxfordshire/images/fms-logo-inverse.png
Binary files differ
diff --git a/web/cobrands/oxfordshire/images/footer.jpg b/web/cobrands/oxfordshire/images/footer.jpg
new file mode 100755
index 000000000..8bd0758eb
--- /dev/null
+++ b/web/cobrands/oxfordshire/images/footer.jpg
Binary files differ
diff --git a/web/cobrands/oxfordshire/images/header.jpg b/web/cobrands/oxfordshire/images/header.jpg
new file mode 100755
index 000000000..f642adfc4
--- /dev/null
+++ b/web/cobrands/oxfordshire/images/header.jpg
Binary files differ
diff --git a/web/cobrands/oxfordshire/images/logo.jpg b/web/cobrands/oxfordshire/images/logo.jpg
new file mode 100755
index 000000000..9ab24d2c4
--- /dev/null
+++ b/web/cobrands/oxfordshire/images/logo.jpg
Binary files differ
diff --git a/web/cobrands/oxfordshire/images/tab-green.png b/web/cobrands/oxfordshire/images/tab-green.png
new file mode 100644
index 000000000..7837fed00
--- /dev/null
+++ b/web/cobrands/oxfordshire/images/tab-green.png
Binary files differ
diff --git a/web/cobrands/oxfordshire/images/tabs-featured-on.png b/web/cobrands/oxfordshire/images/tabs-featured-on.png
new file mode 100644
index 000000000..94fe089c6
--- /dev/null
+++ b/web/cobrands/oxfordshire/images/tabs-featured-on.png
Binary files differ
diff --git a/web/cobrands/oxfordshire/images/tabs-featured.png b/web/cobrands/oxfordshire/images/tabs-featured.png
new file mode 100644
index 000000000..99b823faf
--- /dev/null
+++ b/web/cobrands/oxfordshire/images/tabs-featured.png
Binary files differ
diff --git a/web/cobrands/oxfordshire/layout.scss b/web/cobrands/oxfordshire/layout.scss
new file mode 100644
index 000000000..8d5710158
--- /dev/null
+++ b/web/cobrands/oxfordshire/layout.scss
@@ -0,0 +1,154 @@
+@import "_colours";
+@import "../fixmystreet/_layout";
+
+body {
+ background-color: #fff;
+ background-image: none;
+}
+
+#front-main {
+ background-color: $primary;
+ background-image: none;
+ @include border-radius(1em 1em 0 0);
+ margin: 2em 1em 0;
+ padding-top: 1em;
+ h1 {
+ margin: 0 auto 0 auto;
+ }
+ h2 {
+ color: $primary_text;
+ }
+ a#geolocate_link {
+ color: $primary_text;
+ }
+}
+
+// Currently hide the nav-wrapper, because it's in going into Oxfordshire's own nav
+// likewise with user-meta
+.nav-wrapper, #user-meta {
+ display: none;
+}
+
+// hide the site-header, currently has council logo at top of page
+#site-header {
+ display: none;
+}
+
+// White background, so no shadow or margin needed.
+.content {
+ margin: 0;
+ @include box-shadow(none);
+}
+.ie6, .ie7, .ie8 {
+ .content {
+ margin: 0;
+ border: none;
+ }
+}
+
+// Fix location of aside sidebar
+body.twothirdswidthpage {
+ .content {
+ aside {
+ @include box-shadow(none);
+ }
+ .sticky-sidebar {
+ aside {
+ position: fixed;
+ top: 10em;
+ li { // from occ website
+ padding-left: 19px;
+ font: 0.813em "Trebuchet MS";
+ background: url("/cobrands/oxfordshire/images/dot6x6.jpg") no-repeat 0 5px;
+ }
+ }
+ }
+ }
+}
+
+//-------------------------------------------------
+// following declarations concern the map display:
+//-------------------------------------------------
+// So that map appears underneath the header
+.wrapper {
+ position: relative;
+ .table-cell {
+ padding-left: 13px; // added 13px to match Oxfordshire's normal look
+ padding-right: 13px;
+ }
+}
+.ie6, .ie7 {
+ .wrapper {
+ padding-top: 1em;
+ }
+}
+
+// show the sidebar tips and notices in the document flow, i.e., in the
+// left-hand column, rather than in smaller text above the map
+.general-sidebar-notes,
+#report-a-problem-sidebar {
+ position: static;
+ width: auto;
+ @include box-shadow(rgba(0, 0, 0, 0), 0, 0, 0);
+ .sidebar-tips,
+ .sidebar-notes {
+ font-size:1em;
+ }
+}
+
+// To prevent font size larger interfering with the fixed Oxfordshire layout
+.container { width: auto; }
+.full-width { width: 464px; }
+.shadow-wrap { width: 464px; }
+
+#map_box { width: 464px; }
+.content { width: 432px; }
+
+body.fullwidthpage .content { width: auto; }
+body.twothirdswidthpage .content {
+ width: 640px;
+ aside {
+ left: 672px;
+ width: 208px;
+ padding: 16px;
+ }
+ .sticky-sidebar {
+ left: 672px;
+ aside {
+ top:10em;
+ }
+ }
+}
+.ie6, .ie7 {
+ body.mappage .container {
+ width: 464px;
+ margin-left: 0;
+ }
+}
+
+// As map can scroll and isn't at the top, give it an edge
+#map_box {
+ border: solid 1px #999;
+ top: 1em;
+ right: 0em;
+ margin: 0;
+}
+
+// Perhaps fix map location (should be in central?)
+.ie6 #map_box, .ie7 #map_box {
+ right: -480px;
+}
+
+// So as not to interfere with the Oxfordshire footer, make the fixed nav ("get updates" etc) static.
+.shadow-wrap {
+ position: static;
+ padding-top: 0;
+ margin-bottom: 1em;
+ ul#key-tools {
+ border-top: none;
+ border-bottom: 1px solid $primary;
+ }
+}
+
+
+@import "oxfordshire";
diff --git a/web/cobrands/oxfordshire/oxfordshire.scss b/web/cobrands/oxfordshire/oxfordshire.scss
new file mode 100644
index 000000000..0429a622b
--- /dev/null
+++ b/web/cobrands/oxfordshire/oxfordshire.scss
@@ -0,0 +1,184 @@
+/* Parts of oxfordshire's main CSS needed for its header/footer and adjusted (see
+ * bottom) to not be affected by main FixMyStreet CSS. Not very sustainable;
+ * perhaps we should wrap all council CSS within a SCSS #council ID? Hmm.
+ */
+
+ @import "_colours";
+
+
+body {
+ font-family:"Trebuchet MS",Arial, Helvetica, sans-serif;
+ line-height:18px;
+ a {text-decoration:none; outline:0; font-family:Arial, Helvetica, sans-serif; font-size:0.75em; color:#0c62ba}
+ a { font-size: 1em; } // mySociety
+ a:hover {text-decoration:underline}
+ margin:0;
+ background:#E0E0E0 url("/cobrands/oxfordshire/images/bg.jpg") repeat-y top center;
+
+ #oxford-wrapper {
+ background: url("/cobrands/oxfordshire/images/bg-y.jpg") repeat-y scroll 0 0 #FFFFFF;
+ clear: both;
+ display: block;
+ margin: 0 auto;
+ padding: 0 8px;
+ width: 990px;
+ }
+
+}
+
+#oxford-header
+ {
+ padding:0 16px 7px 16px;
+ clear:both;
+ overflow:hidden;
+ position:relative;
+ width:958px;
+ height:84px;
+ height:auto !important;
+ min-height:84px;
+ background: $oxfordshire_lt_green url("/cobrands/oxfordshire/images/header.jpg") no-repeat 0 0;
+
+ a.logo:hover {cursor:pointer;cursor:hand}
+ a.logo {float:left; display:inline; margin:3px 0 6px 10px; position:relative; overflow:hidden}
+ a.logo span {display:block; position:absolute; top:0; left:0; z-index:10}
+ a.logo, a.logo span {width:173px; height:38px; background: url("/cobrands/oxfordshire/images/logo.jpg") no-repeat 0 0;}
+
+ h1 {float:left; padding:8px 0 0 10px; margin:0; font-size:1.25em; line-height:normal; font-weight:bold; color:#ffffff; white-space:nowrap;font-family:"Trebuchet MS",Tahoma,Arial,sans-serif;}
+ span.header {float:left; padding:8px 0 0 10px; margin:0; font-size:1.25em; line-height:normal; font-weight:bold; color:#ffffff; white-space:nowrap}
+ a {color:#ffffff;}
+
+ #oxford-links {
+ padding: 10px 3px 0px 0px; float:right;color:#ffffff;
+ a{
+ font-size:0.75em; // mySociety putting this back (switched off in body)
+ margin: 0px 5px 0px 5px
+ }
+
+ }
+ .oxford-user {
+ float: right;
+ p {
+ padding: 0.25em;
+ margin: 0.5em 0;
+ a {
+ margin: 0 0.5em;
+ }
+ }
+ }
+}
+
+
+
+#oxford-main-menu {
+ clear: both;
+ margin: 0;
+ padding: 0;
+ font-size: 1em;
+ position: relative;
+ ul {
+ margin: 0 0 0 330px;
+ position: relative;
+ li {
+ margin: 0;
+ list-style-type: none;
+ float:left;
+ width:126px;
+ text-align:center;
+ background: #e0e0e0;
+ padding: 8px 0;
+ margin: 0 0 0 2px;
+ }
+ }
+ // from occ.css (client site): #main .view-features-for-homepage ul.tabs
+ ul.tabs {
+ float:left;
+ position:relative;
+ padding:0;
+ margin:0.5em 0 0 0;
+ z-index:10;
+ width: 990px;
+ //width:635px;
+ min-height:32px;
+ overflow:hidden;
+ clear:both;
+ background: #939393 url("/cobrands/oxfordshire/images/tabs-featured.png") repeat 0 0;
+ li {
+ float:left;
+ padding:0 0 0px 1px;
+ margin:0;
+ font:0.813em/27px "Trebuchet MS";
+ color:#ffffff;
+ height:32px;
+ background: #666 url("/cobrands/oxfordshire/images/divider1x32.png") no-repeat 0 0;
+ }
+ li.first {padding:0; background:none}
+ span, // mySociety
+ a {
+ display:block;
+ position:relative;
+ padding:8px 0 0 0;
+ font:bold 1em "Trebuchet MS";
+ height:24px;
+ color:#ffffff;
+ text-align:center;
+ background: #939393 url("/cobrands/oxfordshire/images/tabs-featured.png") repeat-x 0 0;
+ white-space:nowrap;
+ }
+ a:hover,
+ a:focus {
+ background: none #EA6C18;
+ background:-moz-linear-gradient(100% 100% 90deg, #ff4401, #EA6C18);
+ background:-webkit-gradient(linear, 0% 0%, 0% 100%, from(#EA6C18), to(#ff4401));
+ color: #ffffff;
+ }
+ li span, // mySociety
+ li.active a {
+ text-decoration:none;
+ background: #4c4c4c url("/cobrands/oxfordshire/images/tabs-featured-on.png") repeat-x 0 0;
+ }
+ li.active a:hover,
+ li.active a:focus {color: #ffffff;}
+ li.first a {}
+ li.last a {border-right:1px solid #666;}
+ a {padding:8px 0 0 0;}
+ }
+
+}
+
+
+#oxford-footer {
+ float:left;
+ display:inline;
+ margin:0 -8px 0 -8px;
+ padding:10px 25px 30px 21px;
+ clear:both;
+ overflow:hidden;
+ width:960px;
+ background:#000000 url(/cobrands/oxfordshire/images/footer.jpg) no-repeat bottom left;
+ address {float:left; padding:11px 0 0 0; margin:0; color:#989898; font:0.813em arial}
+ a {font:1em arial; color:#ffffff; margin:0px 5px 0px 5px}
+ address a {font:1em arial; color:#ffffff; margin:0px 0px 0px 0px}
+ ul {float:right; padding:5px 0 0 55px; margin:0}
+ ul li {float:left; padding:0; font:0.813em/27px arial; color:#ffffff; overflow:hidden}
+ /* contact-the-team */
+ li {
+ margin-left: 0.5em;
+ padding: 6px;
+ &.powered-by-fms {
+ // @include border-radius(6px);
+ min-width: 200px;
+ img {
+ display: inline;
+ height:20px;
+ width: 105px;
+ }
+ &:hover {
+ background-color:#2c2c2c;
+ }
+ a:hover {
+ text-decoration: none;
+ }
+ }
+ }
+}
+
diff --git a/web/cobrands/oxfordshire/position_map.js b/web/cobrands/oxfordshire/position_map.js
new file mode 100644
index 000000000..9c88d0980
--- /dev/null
+++ b/web/cobrands/oxfordshire/position_map.js
@@ -0,0 +1,19 @@
+function position_map_box() {
+ var $html = $('html');
+ var oxfordshire_right;
+ if ($html.hasClass('ie6') || $html.hasClass('ie7')) {
+ oxfordshire_right = '-480px';
+ } else {
+ oxfordshire_right = '0em';
+ }
+ // Do the same as CSS (in case resized from mobile).
+ $('#map_box').prependTo('.content').css({
+ zIndex: 1, position: 'absolute',
+ top: '1em', left: '', right: oxfordshire_right, bottom: '',
+ width: '464px', height: '464px',
+ margin: 0
+ });
+}
+
+function map_fix() {}
+var slide_wards_down = 1;
diff --git a/web/cobrands/southampton/css.scss b/web/cobrands/southampton/css.scss
index 3bc2f1b54..2fc569190 100644
--- a/web/cobrands/southampton/css.scss
+++ b/web/cobrands/southampton/css.scss
@@ -64,4 +64,12 @@ $darker: #768EB5;
#update_form {
clear: right;
}
+
+ .update-img {
+ text-align: left;
+ }
+
+ .news {
+ padding: 1em 1em 0em 1em;
+ }
}
diff --git a/web/cobrands/stevenage/_colours.scss b/web/cobrands/stevenage/_colours.scss
new file mode 100644
index 000000000..219f1066a
--- /dev/null
+++ b/web/cobrands/stevenage/_colours.scss
@@ -0,0 +1,11 @@
+/* COLOURS */
+
+
+$primary: #066539;
+$primary_b: $primary;
+$primary_text: #fff;
+
+$col_click_map: #00BD08;
+$col_click_map_dark: #4B8304;
+$col_fixed_label: #00BD08;
+$col_fixed_label_dark: #4B8304;
diff --git a/web/cobrands/stevenage/_council_header.scss b/web/cobrands/stevenage/_council_header.scss
new file mode 100644
index 000000000..a33d07dd4
--- /dev/null
+++ b/web/cobrands/stevenage/_council_header.scss
@@ -0,0 +1,762 @@
+
+ /*--------------------------------------------------*/
+
+ /* 1.stv- =FontFace Declarations
+ --------------------------------------------------*/
+ @font-face { font-family: 'PTSansNarrowRegular'; src: url('http://www.stevenage.gov.uk/Fonts/PT-Sans-fontfacekit/PTN57F-webfont.eot'); src: url('http://www.stevenage.gov.uk/Fonts/PT-Sans-fontfacekit/PTN57F-webfont.eot?iefix') format('eot'), url('http://www.stevenage.gov.uk/Fonts/PT-Sans-fontfacekit/PTN57F-webfont.woff') format('woff'), url('http://www.stevenage.gov.uk/Fonts/PT-Sans-fontfacekit/PTN57F-webfont.ttf') format('truetype'), url('http://www.stevenage.gov.uk/Fonts/PT-Sans-fontfacekit/PTN57F-webfont.svg#stv-webfontpTBqgUZV') format('svg'); font-weight: normal; font-style: normal; }
+ @font-face { font-family: 'PTSansCaptionBold'; src: url('http://www.stevenage.gov.uk/Fonts/PT-Sans-fontfacekit/PTC75F-webfont.eot'); src: url('http://www.stevenage.gov.uk/Fonts/PT-Sans-fontfacekit/PTC75F-webfont.eot?iefix') format('eot'), url('http://www.stevenage.gov.uk/Fonts/PT-Sans-fontfacekit/PTC75F-webfont.woff') format('woff'), url('http://www.stevenage.gov.uk/Fonts/PT-Sans-fontfacekit/PTC75F-webfont.ttf') format('truetype'), url('http://www.stevenage.gov.uk/Fonts/PT-Sans-fontfacekit/PTC75F-webfont.svg#stv-webfont8zHvniZB') format('svg'); font-weight: normal; font-style: normal; }
+ @font-face { font-family: 'PTSansCaptionRegular'; src: url('http://www.stevenage.gov.uk/Fonts/PT-Sans-fontfacekit/PTC55F-webfont.eot'); src: url('http://www.stevenage.gov.uk/Fonts/PT-Sans-fontfacekit/PTC55F-webfont.eot?iefix') format('eot'), url('http://www.stevenage.gov.uk/Fonts/PT-Sans-fontfacekit/PTC55F-webfont.woff') format('woff'), url('http://www.stevenage.gov.uk/Fonts/PT-Sans-fontfacekit/PTC55F-webfont.ttf') format('truetype'), url('http://www.stevenage.gov.uk/Fonts/PT-Sans-fontfacekit/PTC55F-webfont.svg#stv-webfont7qk7wodx') format('svg'); font-weight: normal; font-style: normal; }
+ @font-face { font-family: 'PTSansBoldItalic'; src: url('http://www.stevenage.gov.uk/Fonts/PT-Sans-fontfacekit/PTS76F-webfont.eot'); src: url('http://www.stevenage.gov.uk/Fonts/PT-Sans-fontfacekit/PTS76F-webfont.eot?iefix') format('eot'), url('http://www.stevenage.gov.uk/Fonts/PT-Sans-fontfacekit/PTS76F-webfont.woff') format('woff'), url('http://www.stevenage.gov.uk/Fonts/PT-Sans-fontfacekit/PTS76F-webfont.ttf') format('truetype'), url('http://www.stevenage.gov.uk/Fonts/PT-Sans-fontfacekit/PTS76F-webfont.svg#stv-webfont2oPncueb') format('svg'); font-weight: normal; font-style: normal; }
+ @font-face { font-family: 'PTSansBold'; src: url('http://www.stevenage.gov.uk/Fonts/PT-Sans-fontfacekit/PTS75F-webfont.eot'); src: url('http://www.stevenage.gov.uk/Fonts/PT-Sans-fontfacekit/PTS75F-webfont.eot?iefix') format('eot'), url('http://www.stevenage.gov.uk/Fonts/PT-Sans-fontfacekit/PTS75F-webfont.woff') format('woff'), url('http://www.stevenage.gov.uk/Fonts/PT-Sans-fontfacekit/PTS75F-webfont.ttf') format('truetype'), url('http://www.stevenage.gov.uk/Fonts/PT-Sans-fontfacekit/PTS75F-webfont.svg#stv-webfontaW07W6NV') format('svg'); font-weight: normal; font-style: normal; }
+ @font-face { font-family: 'PTSansItalic'; src: url('http://www.stevenage.gov.uk/Fonts/PT-Sans-fontfacekit/PTS56F-webfont.eot'); src: url('http://www.stevenage.gov.uk/Fonts/PT-Sans-fontfacekit/PTS56F-webfont.eot?iefix') format('eot'), url('http://www.stevenage.gov.uk/Fonts/PT-Sans-fontfacekit/PTS56F-webfont.woff') format('woff'), url('http://www.stevenage.gov.uk/Fonts/PT-Sans-fontfacekit/PTS56F-webfont.ttf') format('truetype'), url('http://www.stevenage.gov.uk/Fonts/PT-Sans-fontfacekit/PTS56F-webfont.svg#stv-webfontV5YcF68V') format('svg'); font-weight: normal; font-style: normal; }
+ @font-face { font-family: 'PTSansRegular'; src: url('http://www.stevenage.gov.uk/Fonts/PT-Sans-fontfacekit/PTS55F-webfont.eot'); src: url('http://www.stevenage.gov.uk/Fonts/PT-Sans-fontfacekit/PTS55F-webfont.eot?iefix') format('eot'), url('http://www.stevenage.gov.uk/Fonts/PT-Sans-fontfacekit/PTS55F-webfont.woff') format('woff'), url('http://www.stevenage.gov.uk/Fonts/PT-Sans-fontfacekit/PTS55F-webfont.ttf') format('truetype'), url('http://www.stevenage.gov.uk/Fonts/PT-Sans-fontfacekit/PTS55F-webfont.svg#stv-webfontakBUUg6U') format('svg'); font-weight: normal; font-style: normal; }
+ @font-face { font-family: 'PTSansNarrowBold'; src: url('http://www.stevenage.gov.uk/Fonts/PT-Sans-fontfacekit/PTN77F-webfont.eot'); src: url('http://www.stevenage.gov.uk/Fonts/PT-Sans-fontfacekit/PTN77F-webfont.eot?iefix') format('eot'), url('http://www.stevenage.gov.uk/Fonts/PT-Sans-fontfacekit/PTN77F-webfont.woff') format('woff'), url('http://www.stevenage.gov.uk/Fonts/PT-Sans-fontfacekit/PTN77F-webfont.ttf') format('truetype'), url('http://www.stevenage.gov.uk/Fonts/PT-Sans-fontfacekit/PTN77F-webfont.svg#stv-webfontSTdD4QCq') format('svg'); font-weight: normal; font-style: normal; }
+
+ /* 2.stv- =BasicSetup and general styles
+ --------------------------------------------------*/
+#stevenage_cc_header {
+ display: block;
+ z-index: 2;
+ margin: 0;
+ padding: 0;
+ font-size:62.5%;
+ max-width: 100%;
+ width: 100%;
+ background-color: #fff;
+
+ #stv-everything {
+ /*font-size: 125%;*/
+ min-width: 984px;
+ overflow: hidden;
+ width: 100%;
+ }
+
+ .stv-inner {
+ width: 984px;
+ margin: 0 auto;
+ position: relative;
+ }
+
+ .stv-hidden {
+ position: absolute;
+ left: -99999em;
+ }
+
+ /* 2.stv-1.stv- =Text Elements
+ --------------------------------------------------*/
+ h1, h2, h3, h4, h5, h6, legend {
+ font-family: 'PTSansCaptionRegular', PT Sans Caption, Verdana, Arial, Sans-Serif;
+ color: #656867;
+ font-weight: normal;
+ margin-top: 0;
+ }
+
+ h1 { color: #666666; font-size: 2.4em }
+ h2 { font-size: 2.4em }
+ h3 { font-size: 1.7em }
+ h4 { font-size: 1.7em }
+ h5 { font-size: 1.5em }
+ h6 { font-size: 1.5em }
+
+ p, a, li, td, th, dd, dt, span, cite {
+ font-family: 'PTSansRegular', PT Sans, Verdana, Arial, Sans-Serif;
+ font-weight: normal;
+ font-size: 1.5em;
+ color: #656867;
+ }
+ cite {
+ text-align: right;
+ display: block;
+ }
+
+ #stv-main.stv-content .stv-aside {
+ font-size: 0.87em;
+ }
+
+
+ #stv-main.stv-content dl dt {
+ width: 16%;
+ margin-right: 3%;
+ display: inline-block;
+ vertical-align: top;
+ }
+ #stv-main.stv-content dl dd {
+ width: 70%;
+ margin-left: 0;
+ display: inline-block;
+ vertical-align: top;
+ }
+
+ p {
+ margin: 0 0 0.8em 0;
+ }
+
+ input, label, select, option {
+ font-family: 'PTSansRegular', PT Sans, Verdana, Arial, Sans-Serif;
+ font-weight: normal;
+ font-size: 1.3em;
+ color: #656867;
+ }
+ legend {
+ font-size: 1.5em;
+ }
+
+ strong a, p strong, li strong, td strong, th strong, dd strong, dt strong {
+ font-family: 'PTSansCaptionBold', PT Sans, Verdana, Arial, Sans-Serif;
+ font-weight: bold;
+ }
+
+ p p, p a, p li, p td, p th, p dd, p dt, p input, p label, p span,
+ a p, a a, a li, a td, a th, a dd, a dt, a input, a label, a span,
+ h1 a, h2 a, h3 a, h4 a, h5 a, h6 a,
+ li p, li a, li li, li td, li th, li dd, li dt, li input, li label, li span,
+ td p, td a, td li, td td, td th, td dd, td dt, td input, td label, td span,
+ th p, th a, th li, th td, th th, th dd, th dt, th input, th label, th span,
+ dd p, dd a, dd li, dd td, dd th, dd dd, dd dt, dd input, dd label, dd span,
+ dt p, dt a, dt li, dt td, dt th, dt dd, dt dt, dt input, dt label, dt span,
+ input p, input a, input li, input td, input th, input dd, input dt, input input, input label, input span,
+ label p, label a, label li, label td, label th, label dd, label dt, label input, label label, label span,
+ span p, span a, span li, span td, span th, span dd, span dt, span input, span label, span span,
+ h1 span, h2 span, h3 span, h4 span, h5 span, h6 span,
+ legend span, select option {
+ font-size: 1em;
+ }
+
+ p h1, p h2, li h1, li h2, td h1, td h2, th h1, th h2 {
+ font-size: 1.6em;
+ }
+
+ p h3, p h4, li h3, li h4, td h3, td h4, th h3, th h4 {
+ font-size: 1.13em;
+ }
+
+ p h5, p h6, li h5, li h6, td h5, td h6, th h5, th h6 {
+ font-size: 1em;
+ }
+
+ a, a:link {
+ color: #005e38;
+ text-decoration: none;
+ }
+
+ a:hover, a:active {
+ text-decoration: underline;
+ }
+
+ a img {
+ border: none;
+ }
+
+ a.stv-more {
+ background: url("http://www.stevenage.gov.uk/Images/arrGrRgt.gif") no-repeat scroll right 7px transparent;
+ padding-right: 9px;
+ font-family: 'PTSansCaptionBold', PT Sans, Verdana, Arial, Sans-Serif;
+ font-weight: bold;
+ }
+
+ .stv-content .stv-article a {
+ font-family: 'PTSansCaptionBold', PT Sans, Verdana, Arial, Sans-Serif;
+ font-weight: bold;
+ }
+
+ .stv-content .stv-article .stv-subNav a {
+ font-family: 'PTSansRegular',PT Sans,Verdana,Arial,Sans-Serif;
+ font-weight: normal;
+ }
+
+
+ .stv-error {
+ color: #FF0000;
+ font-family: 'PTSansCaptionBold', PT Sans, Verdana, Arial, Sans-Serif;
+ font-size: 1.5em;
+ font-weight: bold;
+ }
+
+ .stv-error li {
+ font-size: 1em;
+ color: #FF0000;
+ }
+
+ /* 2.stv-2.stv- =Table
+ --------------------------------------------------*/
+ table {
+ border: 1px solid #c0c0be;
+ border-collapse: collapse;
+ margin: 1em 0;
+ }
+
+ th {
+ background-color: #656867;
+ border: 1px solid #C0C0BE;
+ color: #FFFFFF;
+ padding: 3px 5px;
+ }
+
+ td {
+ border: 1px solid #c0c0be;
+ padding: 5px 8px;
+ vertical-align: top;
+ }
+
+ /* 2.stv-3.stv- =Form Elements
+ --------------------------------------------------*/
+ label {
+ display: inline-block;
+ }
+ input[type=text], input[type=password], textarea, select, fieldset {
+ border-width: 1px;
+ border-color: #c0c0be;
+ border-style: solid;
+ }
+ fieldset {
+ margin: 0;
+ padding: 0.3em 0.625em 0.75em;
+ }
+ fieldset fieldset {
+ border: medium none;
+ margin: 0.5em 0;
+ padding-left: 0;
+ padding-right: 0;
+ }
+ fieldset .stv-group {
+ margin: 1em 0;
+ }
+ fieldset fieldset legend {
+ font-family: 'PTSansRegular', PT Sans, Verdana, Arial, Sans-Serif;
+ font-weight: normal;
+ font-size: 1.3em;
+ padding: 0;
+ }
+ input[type=submit], input[type=button] {
+ border: 0;
+ color: #ffffff;
+ margin: 0;
+ background-image: url('http://www.stevenage.gov.uk/Images/submitBG.gif');
+ background-position: left top;
+ background-repeat: repeat-x;
+ background-color: #005e38;
+ padding: 1px;
+ font-family: 'PTSansCaptionRegular', PT Sans Caption, Verdana, Arial, Sans-Serif;
+ font-weight: normal;
+ cursor: pointer;
+ font-size: 1.5em;
+ }
+ input[type=checkbox], input[type=radio] {
+ margin-left: 25%;
+ }
+ textarea, select {
+ vertical-align: top;
+ }
+ fieldset label {
+ width: 25%;
+ word-wrap: break-word;
+ }
+ fieldset .stv-checkboxGroup label,
+ fieldset .stv-radioGroup label {
+ width: 65%;
+ }
+
+ fieldset .stv-double {
+ text-align: center;
+ margin: 3em 0;
+ }
+
+ fieldset .stv-double .stv-item {
+ position: relative;
+ width: 40%;
+ margin-left: 5%;
+ margin-right: 5%;
+ float: left;
+ }
+
+ fieldset .stv-double label {
+ width: 100%;
+ }
+
+ fieldset .stv-double .stv-separator {
+ position: absolute;
+ left: 45%;
+ width: 10%;
+ margin-top: 1em;
+ }
+
+ fieldset .stv-right {
+ text-align: right;
+ }
+
+ /* 2.stv-3.stv-1 =Form Builder
+ --------------------------------------------------*/
+ .stv-ValidationSummaryWithoutBullets ul {
+ list-style-type: none;
+ margin-top: 0em;
+ }
+
+ .stv-FormBuilderSubmitItem input[type="submit"], .stv-FormBuilderSubmitItem input[type="button"] {
+ margin-top: 5px;
+ margin-left: 25%;
+ }
+
+ .stv-FormBuilderDateField {
+ display: inline;
+ font-family: 'PTSansRegular', PT Sans, Verdana, Arial, Sans-Serif;
+ font-weight: normal;
+ font-size: 1.1em;
+ color: #656867;
+ }
+
+ .stv-FormBuilderCheckBoxListField,
+ .stv-FormBuilderRadioButtonListField {
+ display: inline-block;
+ font-size: 1.3em;
+ position: relative;
+ vertical-align: top;
+ }
+
+ .stv-FormBuilderCheckBoxListField label,
+ .stv-FormBuilderRadioButtonListField label {
+ width: auto;
+ }
+
+ .stv-FormBuilderCheckBoxListField input[type=checkbox],
+ .stv-FormBuilderCheckBoxListField input[type=radio],
+ .stv-FormBuilderRadioButtonListField input[type=checkbox],
+ .stv-FormBuilderRadioButtonListField input[type=radio] {
+ margin-left: 0;
+ }
+
+ /* 2.stv-4.stv- =Grid sizing
+ --------------------------------------------------*/
+ .stv-grid1,
+ .stv-grid2,
+ .stv-grid3,
+ .stv-grid4,
+ .stv-grid5,
+ .stv-grid6,
+ .stv-grid7,
+ .stv-grid8,
+ .stv-grid9,
+ .stv-grid10,
+ .stv-grid11,
+ .stv-grid12 {
+ margin-left: 6px;
+ margin-right: 6px;
+ }
+
+ .stv-alpha {
+ margin-left: 0;
+ }
+ .stv-omega {
+ margin-right: 0;
+ }
+ .stv-grid1 {
+ width:70px;
+ }
+ .stv-grid2 {
+ width:152px;
+ }
+ .stv-grid3 {
+ width:234px;
+ }
+ .stv-grid4 {
+ width:316px;
+ }
+ .stv-grid5 {
+ width:398px;
+ }
+ .stv-grid6 {
+ width:480px;
+ }
+ .stv-grid7 {
+ width:562px;
+ }
+ .stv-grid8 {
+ width:644px;
+ }
+ .stv-grid9 {
+ width:726px;
+ }
+ .stv-grid10 {
+ width:808px;
+ }
+ .stv-grid11 {
+ width:890px;
+ }
+ .stv-grid12 {
+ width:972px;
+ }
+
+ /* 3.stv- =Header
+ --------------------------------------------------*/
+ #stv-headerWrapper {
+ position: relative;
+ z-index: 22;
+ }
+
+ #stv-header {
+ background-image: url('http://www.stevenage.gov.uk/Images/headerBG.jpg');
+ background-repeat: repeat-x;
+ background-position: left bottom;
+ background-color: transparent;
+ }
+
+ /* 3.stv-1 =Site Logos
+ --------------------------------------------------*/
+ #stv-header #stv-logo {
+ bottom: 13px;
+ height: 89px;
+ left: 4px;
+ position: absolute;
+ width: 164px;
+ z-index: 11;
+ }
+
+ #stv-header #stv-logo a,
+ #stv-header #stv-logo img {
+ display: block;
+ }
+
+ #stv-header .stv-mapLogo {
+ bottom: 0;
+ left: 247px;
+ position: absolute;
+ width: 165px;
+ }
+
+ #stv-header .stv-mapLogo img {
+ display: block;
+ }
+
+ /* 3.stv-2 =Page Tools
+ --------------------------------------------------*/
+ #stv-header #stv-pageTools {
+ padding-left: 496px;
+ padding-top: 20px;
+ text-align: right;
+ width: 480px;
+ }
+
+ /* 3.stv-2.stv-1 =Site Search
+ --------------------------------------------------*/
+ #stv-header #stv-pageTools #stv-search,
+ #stv-header #stv-pageTools #stv-searchStatic {
+ float: right;
+ display: inline;
+ display: inline-block;
+ }
+
+ #stv-header #stv-pageTools #stv-searchStatic #stv-search {
+ float: none;
+ }
+
+ #stv-header #stv-pageTools #stv-search label,
+ #stv-header #stv-pageTools #stv-searchStatic label {
+ position: absolute;
+ left: -999999em;
+ }
+
+ #stv-header #stv-pageTools #stv-search #stv-searchBox,
+ #stv-header #stv-pageTools #stv-search input.stv-searchInput,
+ #stv-header #stv-pageTools #stv-searchStatic #stv-searchBox,
+ #stv-header #stv-pageTools #stv-searchStatic input.stv-searchInput {
+ border-right: medium none;
+ margin-right: -3px;
+ padding: 2px 4px;
+ position: relative;
+ top: -1px;
+ width: 126px;
+ }
+
+ /* 3.stv-2.stv-2 =Top Menu
+ --------------------------------------------------*/
+ #stv-header #stv-pageTools #stv-topMenu {
+ float: right;
+ }
+
+ #stv-header #stv-pageTools #stv-topMenu ul {
+ list-style-type: none;
+ margin: 0;
+ padding: 0 19px;
+ }
+
+ #stv-header #stv-pageTools #stv-topMenu li {
+ color: #005E38;
+ display: inline;
+ font-size: 1.3em;
+ line-height: 1.7em;
+ }
+
+ #stv-header #stv-pageTools #stv-topMenu li a {
+ word-spacing: 3px;
+ }
+
+ /* 3.stv-3 =Pay, Apply, Report, Find links
+ --------------------------------------------------*/
+ #stv-header .stv-parf {
+ padding-left: 496px;
+ padding-right: 2px;
+ width: 478px;
+ background-image: url('http://www.stevenage.gov.uk/Images/parfEnd.jpg');
+ background-position: right bottom;
+ background-repeat: no-repeat;
+ }
+
+ #stv-header .stv-parf a {
+ background-color: transparent;
+ background-image: url("http://www.stevenage.gov.uk/Images/parfBG.jpg");
+ background-position: left bottom;
+ background-repeat: no-repeat;
+ color: #232122;
+ display: block;
+ float: left;
+ font-size: 1.1em;
+ line-height: 1em;
+ padding: 18px 16px 6px 14px;
+ width: 90px;
+ min-height: 60px;
+ height: auto !important;
+ height: 60px;
+ }
+
+ #stv-header .stv-parf a:hover {
+ background-image: url("http://www.stevenage.gov.uk/Images/parfHoverBG.jpg");
+ }
+
+ #stv-header .stv-parf a.stv-find {
+ padding-right: 14px;
+ }
+
+ #stv-header .stv-parf a span.stv-title {
+ display: block;
+ font-size: 2.4em;
+ line-height: 1em;
+ }
+
+ #stv-header .stv-parf a:hover,
+ #stv-header .stv-parf a:active,
+ #stv-header .stv-parf a:hover span.stv-title,
+ #stv-header .stv-parf a:active span.stv-title {
+ color: #005E38;
+ text-decoration: none;
+ }
+
+ /* 4.stv- =Navigation
+ --------------------------------------------------*/
+ #stv-menu {
+ background-color: #363636;
+ background-image: url("http://www.stevenage.gov.uk/Images/navBG.jpg");
+ background-position: left bottom;
+ background-repeat: repeat-x;
+
+ }
+
+ #stv-menu #stv-primaryNavigation {
+ width: 984px;
+ margin: 0 auto;
+ position: relative;
+ left: -7px;
+ }
+
+ #stv-menu #stv-primaryNavigation ul {
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+ }
+
+ #stv-menu #stv-primaryNavigation li {
+ display: block;
+ float: left;
+ margin: 0;
+ font-size: 1.5em;
+ height: 2em;
+ overflow: visible;
+ padding-bottom: 1px;
+ }
+
+ #stv-menu #stv-primaryNavigation li:hover,
+ #stv-menu #stv-primaryNavigation li.stv-panelHover {
+ background-color: #12723b;
+ background-image: url('http://www.stevenage.gov.uk/Images/navHover.jpg');
+ background-position: left bottom;
+ background-repeat: repeat-x;
+ }
+
+ #stv-menu #stv-primaryNavigation a {
+ color: #FFFFFF;
+ display: block;
+ font-family: 'PTSansCaptionRegular',PT Sans Caption,Verdana,Arial,Sans-Serif;
+ font-weight: normal;
+ padding: 6px 14px 11px 12px;
+ width: 138px;
+ }
+
+ #stv-menu #stv-primaryNavigation a:hover {
+ text-decoration: none;
+ }
+ #stv-menu #stv-primaryNavigation li.stv-panelHover a {
+ text-decoration: none;
+ background-image: url('http://www.stevenage.gov.uk/Images/arrGrDwn.gif');
+ background-repeat: no-repeat;
+ background-position: 12px bottom;
+ background-color: transparent;
+ }
+
+ #stv-menu #stv-primaryNavigation a:active {
+ text-decoration: none;
+ }
+
+ #stv-menu #stv-primaryNavigation li.stv-selected {
+ background-color: #ffffff;
+ }
+
+ #stv-menu #stv-primaryNavigation li.stv-selected a {
+ color: #005e38;
+ }
+
+ #stv-menu #stv-primaryNavigation li.stv-selected a:hover,
+ #stv-menu #stv-primaryNavigation li.stv-panelHover a {
+ color: #FFFFFF;
+ }
+
+ /* 5.stv- =Main Area
+ --------------------------------------------------*/
+ #stv-main {
+ background-image: url('http://www.stevenage.gov.uk/Images/mainDropShad.png');
+ background-position: top left;
+ background-repeat: repeat-x;
+ }
+
+ /* 5.stv-1 =Information Panel
+ --------------------------------------------------*/
+ #stv-main.stv-home .stv-infoPanel,
+ #stv-main.stv-landing .stv-infoPanel,
+ .stv-js-on #stv-main.stv-home .stv-infoPanel .stv-fadeIn {
+ min-height: 370px;
+ height: auto !important;
+ height: 370px;
+ background-image: url('http://www.stevenage.gov.uk/Images/infoBG.png');
+ background-position: top left;
+ background-repeat: repeat-x;
+ background-color: #e0e0dd;
+ }
+
+ #stv-main.stv-home .stv-infoPanel h2,
+ #stv-main.stv-landing .stv-infoPanel h2 {
+ line-height: 1em;
+ margin-bottom: 0.3em;
+ margin-top: 0.3em;
+ }
+
+ #stv-main.stv-home .stv-infoPanel .stv-inner,
+ #stv-main.stv-landing .stv-infoPanel .stv-inner {
+ position: relative;
+ }
+
+ #stv-main.stv-home .stv-infoPanel .stv-inner .stv-landingA,
+ #stv-main.stv-home .stv-infoPanel .stv-inner .stv-landingB,
+ #stv-main.stv-home .stv-infoPanel .stv-inner .stv-landingC,
+ #stv-main.stv-home .stv-infoPanel .stv-inner .stv-landingD,
+ #stv-main.stv-home .stv-infoPanel .stv-inner .stv-landingE,
+ #stv-main.stv-home .stv-infoPanel .stv-inner .stv-landingF,
+ #stv-main.stv-landing .stv-infoPanel .stv-inner > div {
+ height: 348px;
+ overflow: hidden;
+ background-image: url("http://www.stevenage.gov.uk/Images/infoBG.gif");
+ background-position: left 17px;
+ background-repeat: no-repeat;
+ padding-top: 17px;
+ }
+
+ .stv-js-on #stv-main.stv-home .stv-infoPanel .stv-inner .stv-landingA,
+ .stv-js-on #stv-main.stv-home .stv-infoPanel .stv-inner .stv-landingB,
+ .stv-js-on #stv-main.stv-home .stv-infoPanel .stv-inner .stv-landingC,
+ .stv-js-on #stv-main.stv-home .stv-infoPanel .stv-inner .stv-landingD,
+ .stv-js-on #stv-main.stv-home .stv-infoPanel .stv-inner .stv-landingE,
+ .stv-js-on #stv-main.stv-home .stv-infoPanel .stv-inner .stv-landingF {
+ position: absolute;
+ top: 0;
+ left: 0;
+ }
+
+
+ .stv-js-on #stv-main.stv-home .stv-infoPanel .stv-fadeIn {
+ z-index: 20;
+ position: absolute;
+ width: 100%;
+ }
+
+ #stv-main.stv-home .stv-infoPanel .stv-inner .stv-hidden {
+ display: none;
+ }
+
+ #stv-main.stv-home .stv-infoPanel .stv-inner .stv-selected {
+ display: block;
+ }
+
+ #stv-main.stv-home .stv-infoPanel .stv-inner .stv-fade,
+ #stv-main.stv-landing .stv-infoPanel .stv-inner .stv-fade {
+ background-image: none;
+ background-position: left top;
+ background-repeat: repeat-x;
+ bottom: 0;
+ height: 24px;
+ position: absolute;
+ width: 100%;
+ z-index: 12;
+ }
+
+ #stv-main.stv-home .stv-infoPanel .stv-articleCont .stv-article.stv-attached .stv-fade,
+ #stv-main.stv-landing .stv-infoPanel .stv-articleCont .stv-article.stv-attached .stv-fade {
+ background-image: url("http://www.stevenage.gov.uk/Images/infoBGfadeWh.png");
+ height: 12px;
+ }
+
+
+ /* 9.stv- =Layout Fixes
+ FloatHolder can be used on any div which
+ has floated item within as oppposed to
+ floating the wrapper div aswell.stv-
+ --------------------------------------------------*/
+ .stv-floatHolder {
+ position: relative;
+ z-index: 10;
+ height: auto !important;
+ height: 1%;
+ }
+ .stv-floatHolder:after {
+ content:".";
+ clear:both;
+ height:0;
+ visibility:hidden;
+ display:block;
+ }
+
+}
+.ie8{
+ #stv-header #stv-pageTools #stv-searchStatic{
+ width: 50%;
+ }
+}
+
+/*
+// Small council Header
+body.mappage{
+ #stevenage_cc_header{
+ #stv-header .stv-parf {
+ display: none;
+ }
+ #stv-header #stv-logo{
+ position: static;
+ float: left;
+ height: auto;
+ img{
+ height:50px;
+ width: auto;
+ }
+ }
+ #stv-pageTools.stv-floatHolder{
+ position: static;
+ z-index: auto;
+ }
+ }
+}
+*/ \ No newline at end of file
diff --git a/web/cobrands/stevenage/base.scss b/web/cobrands/stevenage/base.scss
new file mode 100644
index 000000000..3c3ec4b6d
--- /dev/null
+++ b/web/cobrands/stevenage/base.scss
@@ -0,0 +1,13 @@
+@import "../fixmystreet/h5bp";
+@import "colours";
+@import "../fixmystreet/mixins";
+@import "compass";
+
+$body-font: 'PTSansRegular', "PT Sans", Verdana, Arial, sans-serif;
+$meta-font: $body-font;
+$heading-font: 'PTSansCaptionRegular', "PT Sans Caption", Verdana, Arial, sans-serif;
+
+@import "../fixmystreet/base";
+
+@import "council_header";
+
diff --git a/web/cobrands/stevenage/config.rb b/web/cobrands/stevenage/config.rb
new file mode 100644
index 000000000..cab97b18f
--- /dev/null
+++ b/web/cobrands/stevenage/config.rb
@@ -0,0 +1,25 @@
+# Require any additional compass plugins here.
+
+# Set this to the root of your project when deployed:
+http_path = "/"
+css_dir = ""
+sass_dir = ""
+images_dir = ""
+javascripts_dir = ""
+
+# You can select your preferred output style here (can be overridden via the command line):
+# output_style = :expanded or :nested or :compact or :compressed
+
+# To enable relative paths to assets via compass helper functions. Uncomment:
+# relative_assets = true
+
+# To disable debugging comments that display the original location of your selectors. Uncomment:
+# line_comments = false
+
+# If you prefer the indented syntax, you might want to regenerate this
+# project again passing --syntax sass, or you can uncomment this:
+# preferred_syntax = :sass
+# and then run:
+# sass-convert -R --from scss --to sass sass scss && rm -rf sass && mv scss sass
+
+line_comments = false # by Compass.app
diff --git a/web/cobrands/stevenage/layout.scss b/web/cobrands/stevenage/layout.scss
new file mode 100644
index 000000000..a94dc2a24
--- /dev/null
+++ b/web/cobrands/stevenage/layout.scss
@@ -0,0 +1,252 @@
+@import "colours";
+@import "../fixmystreet/layout";
+
+// d523b431 - "Stevenage Home page styles"
+// 2a23e09f - Moved menu on map page and reverted to full header.
+
+body {
+ color: #222;
+ background: #dddddb;
+}
+
+// d523b431
+.nav-wrapper{
+ .nav-wrapper-2{
+ min-height: auto;
+ // e7c122a4 / 0b0a619b / - "Removed mySociety menu and positioned menu"
+ top: 9.5em;
+ border-top: none;
+ padding-top: 0.75em;
+ padding-bottom: 0.25em;
+ background-color: #6b6969;
+ @include background(linear-gradient(#6b6969, #555454));
+ }
+}
+
+.ie6, .ie7 {
+ // 452ce6a0 - Added IE6/7 position change to front page header too
+ #stevenage_cc_header {
+ position:absolute;
+ top:0;
+ }
+ // 39ec0005 - Removed position static from nav in IE6/7
+ .nav-wrapper {
+ .nav-wrapper-2 {
+ position: absolute;
+ }
+ }
+}
+
+// d523b431
+#main-nav {
+ ul {
+ float: none;
+ li {
+ a, span {
+ margin: 0;
+ margin-right: 2px;
+ font-family: 'PTSansRegular', "PT Sans", Verdana, Arial, sans-serif;
+ }
+ }
+ &#main-menu {
+ li {
+ a, span {
+ padding: 0.5em 0.75em;
+ font-size: 0.8em;
+ margin: 0;
+ @include border-radius(0.25em);
+ }
+ a:hover {
+ background: #444;
+ }
+ a.report-a-problem-btn {
+ padding:0.5em 0.75em;
+ margin:0;
+ margin-left: 0.25em;
+ color:#fff;
+ }
+ span {
+ color: #fff;
+ background-color: #066539;
+ }
+ }
+ }
+ }
+}
+
+// 452ce6a0 - "Added IE6/7 position change to front page header too" -
+// turned off border for ie6-8 .content - why, as box-shadow still on?
+.ie6, .ie7, .ie8 {
+ .content {
+ border: none;
+ }
+}
+
+body.mappage {
+ // 15591af7 - Stevenage Map page changes
+ #stevenage_cc_header {
+ position: fixed;
+ }
+ // 2a23e09f - Moved menu on map page and reverted to full header.
+ .content {
+ margin-top: 9em;
+ }
+ // 15591af7 - Stevenage Map page changes
+ #main-nav ul#main-menu li a, #main-nav ul#main-menu li span {
+ padding: 0.5em 0.75em;
+ }
+ #main-nav ul#main-menu li a.report-a-problem-btn {
+ padding: 0.5em 0.75em;
+ margin: 0 0 0 0.25em;
+ }
+ // 2a23e09f - Moved menu on map page and reverted to full header.
+ .nav-wrapper {
+ .nav-wrapper-2 {
+ position: absolute;
+ top: 11em;
+ bottom: auto;
+ left: 0.5em;
+ width: 29em;
+ padding-top: 0.15em;
+ z-index: 0;
+ background-color: #6b6969;
+ @include background(linear-gradient(#6b6969, #555454));
+ }
+ }
+}
+
+.ie6, .ie7 {
+ // 82d34958 - IE6/7 Positioning Tweaks on Council header
+ body.mappage {
+ // a7a564af - Stevenage IE8 position tweak
+ #stevenage_cc_header {
+ position:absolute;
+ top:0;
+ }
+ // ab958bc5 - IE6/7 Tweaks
+ .content {
+ margin-top:6em;
+ }
+ .nav-wrapper {
+ .nav-wrapper-2 {
+ position: absolute;
+ }
+ }
+ }
+}
+// a7a564a - Stevenage IE8 position tweak
+// 15591af7 - Stevenage Map page changes
+.ie8 {
+ body.mappage {
+ #stevenage_cc_header{
+ position:absolute;
+ top:0;
+ }
+ .nav-wrapper {
+ .nav-wrapper-2 {
+ position: absolute;
+ }
+ }
+ }
+}
+
+// d523b431
+body.fullwidthpage {
+ .content {
+ @include box-shadow(none);
+ background: none;
+ }
+}
+
+// 4d5998fb - Missed a sticky-sidebar
+body.twothirdswidthpage {
+ .content {
+ .sticky-sidebar {
+ aside {
+ top: 19em;
+ }
+ }
+ }
+}
+
+// 15591af7 - Stevenage Map page changes
+#map_box {
+ top: 140px;
+}
+#fms_pan_zoom {
+ top: 190px !important;
+}
+
+// 2a23e09f - Moved menu on map page and reverted to full header.
+#report-a-problem-sidebar {
+ top: 9em;
+}
+
+// d523b431
+body.frontpage {
+ .nav-wrapper-2 {
+ height: auto;
+ }
+ #site-header {
+ height: auto;
+ }
+ // 1162d5c8 - Changed the colour of the user text when you're logged in to be more readable
+ #user-meta {
+ p {
+ color: #fff;
+ }
+ }
+}
+
+// d523b431
+#front-main {
+ background: #fff;
+ color: #222;
+ margin: 0 auto;
+ margin-top: 1.5em;
+ max-width: 60em;
+}
+
+// Front page button colour
+#front-main {
+ #postcodeForm {
+ div {
+ input#submit {
+ color: #fff;
+ background: $primary;
+ &:hover {
+ background: lighten($primary, 10%);
+ }
+ }
+ }
+ }
+}
+
+// 0c5d50bc - Added margin to front page report box to push below nav in IE6/7
+.ie6, .ie7 {
+ #front-main {
+ margin-top: 5.5em;
+ }
+}
+
+@media only screen and (min-width: 48em) and (max-width: 61em) {
+ // d523b431
+ #main-nav {
+ float: left;
+ }
+ .nav-wrapper {
+ .nav-wrapper-2 {
+ @include background(linear-gradient(#222, #555 30%, #555 60%, #222));
+ }
+ }
+ // f432a72d - moved sticky sidebars down a bit to account for the larger header
+ body.twothirdswidthpage {
+ .content {
+ .sticky-sidebar {
+ aside {
+ top: 19em;
+ }
+ }
+ }
+ }
+}
diff --git a/web/cobrands/zurich/Zurich-WMTSCapabilities.xml b/web/cobrands/zurich/Zurich-WMTSCapabilities.xml
new file mode 100644
index 000000000..c8b863c22
--- /dev/null
+++ b/web/cobrands/zurich/Zurich-WMTSCapabilities.xml
@@ -0,0 +1,178 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Capabilities xmlns="http://www.opengis.net/wmts/1.0"
+xmlns:ows="http://www.opengis.net/ows/1.1"
+xmlns:xlink="http://www.w3.org/1999/xlink"
+xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xmlns:gml="http://www.opengis.net/gml"
+xsi:schemaLocation="http://www.opengis.net/wmts/1.0 http://schemas.opengis.net/wmts/1.0/wmtsGetCapabilities_response.xsd"
+version="1.0.0">
+<!-- Service Identification --> <ows:ServiceIdentification>
+<ows:Title>Luftbild</ows:Title>
+<ows:ServiceType>OGC WMTS</ows:ServiceType>
+<ows:ServiceTypeVersion>1.0.0</ows:ServiceTypeVersion>
+</ows:ServiceIdentification> <!-- Operations Metadata --> <ows:OperationsMetadata>
+<ows:Operation name="GetCapabilities">
+<ows:DCP>
+<ows:HTTP>
+<ows:Get xlink:href="http://www.wmts.stadt-zuerich.ch/arcgis/rest/services/Luftbild/MapServer/WMTS/1.0.0/WMTSCapabilities.xml">
+<ows:Constraint name="GetEncoding">
+<ows:AllowedValues>
+<ows:Value>RESTful</ows:Value>
+</ows:AllowedValues>
+</ows:Constraint>
+</ows:Get>
+<!-- add KVP binding in 10.1 -->
+<ows:Get xlink:href="http://www.wmts.stadt-zuerich.ch/arcgis/rest/services/Luftbild/MapServer/WMTS?">
+<ows:Constraint name="GetEncoding">
+<ows:AllowedValues>
+<ows:Value>KVP</ows:Value>
+</ows:AllowedValues>
+</ows:Constraint>
+</ows:Get>
+</ows:HTTP>
+</ows:DCP>
+</ows:Operation>
+<ows:Operation name="GetTile">
+<ows:DCP>
+<ows:HTTP>
+<ows:Get xlink:href="http://www.wmts.stadt-zuerich.ch/arcgis/rest/services/Luftbild/MapServer/WMTS/tile/1.0.0/">
+<ows:Constraint name="GetEncoding">
+<ows:AllowedValues>
+<ows:Value>RESTful</ows:Value>
+</ows:AllowedValues>
+</ows:Constraint>
+</ows:Get>
+<ows:Get xlink:href="http://www.wmts.stadt-zuerich.ch/arcgis/rest/services/Luftbild/MapServer/WMTS?">
+<ows:Constraint name="GetEncoding">
+<ows:AllowedValues>
+<ows:Value>KVP</ows:Value>
+</ows:AllowedValues>
+</ows:Constraint>
+</ows:Get>
+</ows:HTTP>
+</ows:DCP>
+</ows:Operation>
+</ows:OperationsMetadata> <Contents>
+<!--Layer--> <Layer>
+<ows:Title>Luftbild</ows:Title> <ows:Identifier>Luftbild</ows:Identifier>
+<ows:BoundingBox crs="urn:ogc:def:crs:EPSG::21781">
+<ows:LowerCorner>676000.0 241000.0</ows:LowerCorner>
+<ows:UpperCorner>690000.0 255000.0</ows:UpperCorner>
+</ows:BoundingBox> <ows:WGS84BoundingBox crs="urn:ogc:def:crs:OGC:2:84">
+<ows:LowerCorner>8.444933818976226 47.31509040172551</ows:LowerCorner>
+<ows:UpperCorner>8.632922236617937 47.442777990747416</ows:UpperCorner>
+</ows:WGS84BoundingBox>
+<Style isDefault="true">
+<ows:Title>Default Style</ows:Title>
+<ows:Identifier>default</ows:Identifier>
+</Style>
+<Format>image/jpgpng</Format>
+<TileMatrixSetLink>
+<TileMatrixSet>default028mm</TileMatrixSet>
+</TileMatrixSetLink>
+<TileMatrixSetLink>
+<TileMatrixSet>nativeTileMatrixSet</TileMatrixSet> </TileMatrixSetLink> <ResourceURL format="image/jpgpng" resourceType="tile" template="http://www.wmts.stadt-zuerich.ch/arcgis/rest/services/Luftbild/MapServer/WMTS/tile/1.0.0/Luftbild/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}" />
+</Layer> <!--TileMatrixSet-->
+<TileMatrixSet>
+<ows:Title>Default TileMatrix using 0.28mm</ows:Title>
+<ows:Abstract>The tile matrix set that has scale values calculated based on the dpi defined by OGC specification (dpi assumes 0.28mm as the physical distance of a pixel).</ows:Abstract> <ows:Identifier>default028mm</ows:Identifier>
+<ows:SupportedCRS>urn:ogc:def:crs:EPSG::21781</ows:SupportedCRS>
+<TileMatrix>
+<ows:Identifier>0</ows:Identifier> <ScaleDenominator>118117.55952380951</ScaleDenominator>
+<TopLeftCorner>-2.93864E7 3.08145E7</TopLeftCorner> <TileWidth>256</TileWidth> <TileHeight>256</TileHeight>
+<MatrixWidth>3</MatrixWidth> <MatrixHeight>3</MatrixHeight>
+</TileMatrix>
+<TileMatrix>
+<ows:Identifier>1</ows:Identifier> <ScaleDenominator>60476.19047619047</ScaleDenominator>
+<TopLeftCorner>-2.93864E7 3.08145E7</TopLeftCorner> <TileWidth>256</TileWidth> <TileHeight>256</TileHeight>
+<MatrixWidth>5</MatrixWidth> <MatrixHeight>4</MatrixHeight>
+</TileMatrix>
+<TileMatrix>
+<ows:Identifier>2</ows:Identifier> <ScaleDenominator>30238.095238095237</ScaleDenominator>
+<TopLeftCorner>-2.93864E7 3.08145E7</TopLeftCorner> <TileWidth>256</TileWidth> <TileHeight>256</TileHeight>
+<MatrixWidth>8</MatrixWidth> <MatrixHeight>7</MatrixHeight>
+</TileMatrix>
+<TileMatrix>
+<ows:Identifier>3</ows:Identifier> <ScaleDenominator>15119.047619047618</ScaleDenominator>
+<TopLeftCorner>-2.93864E7 3.08145E7</TopLeftCorner> <TileWidth>256</TileWidth> <TileHeight>256</TileHeight>
+<MatrixWidth>14</MatrixWidth> <MatrixHeight>14</MatrixHeight>
+</TileMatrix>
+<TileMatrix>
+<ows:Identifier>4</ows:Identifier> <ScaleDenominator>7559.523809523809</ScaleDenominator>
+<TopLeftCorner>-2.93864E7 3.08145E7</TopLeftCorner> <TileWidth>256</TileWidth> <TileHeight>256</TileHeight>
+<MatrixWidth>27</MatrixWidth> <MatrixHeight>27</MatrixHeight>
+</TileMatrix>
+<TileMatrix>
+<ows:Identifier>5</ows:Identifier> <ScaleDenominator>3779.7619047619046</ScaleDenominator>
+<TopLeftCorner>-2.93864E7 3.08145E7</TopLeftCorner> <TileWidth>256</TileWidth> <TileHeight>256</TileHeight>
+<MatrixWidth>53</MatrixWidth> <MatrixHeight>52</MatrixHeight>
+</TileMatrix>
+<TileMatrix>
+<ows:Identifier>6</ows:Identifier> <ScaleDenominator>1889.8809523809523</ScaleDenominator>
+<TopLeftCorner>-2.93864E7 3.08145E7</TopLeftCorner> <TileWidth>256</TileWidth> <TileHeight>256</TileHeight>
+<MatrixWidth>105</MatrixWidth> <MatrixHeight>104</MatrixHeight>
+</TileMatrix>
+<TileMatrix>
+<ows:Identifier>7</ows:Identifier> <ScaleDenominator>944.9404761904761</ScaleDenominator>
+<TopLeftCorner>-2.93864E7 3.08145E7</TopLeftCorner> <TileWidth>256</TileWidth> <TileHeight>256</TileHeight>
+<MatrixWidth>208</MatrixWidth> <MatrixHeight>208</MatrixHeight>
+</TileMatrix>
+<TileMatrix>
+<ows:Identifier>8</ows:Identifier> <ScaleDenominator>472.4702380952381</ScaleDenominator>
+<TopLeftCorner>-2.93864E7 3.08145E7</TopLeftCorner> <TileWidth>256</TileWidth> <TileHeight>256</TileHeight>
+<MatrixWidth>414</MatrixWidth> <MatrixHeight>415</MatrixHeight>
+</TileMatrix>
+</TileMatrixSet>
+<TileMatrixSet>
+<ows:Title>Native TiledMapService TileMatrixSet</ows:Title>
+<ows:Abstract>the tile matrix set that has scale values calculated based on the dpi defined by ArcGIS Server tiled map service. The current tile dpi is 96</ows:Abstract>
+<ows:Identifier>nativeTileMatrixSet</ows:Identifier>
+<ows:SupportedCRS>urn:ogc:def:crs:EPSG::21781</ows:SupportedCRS>
+<TileMatrix>
+<ows:Identifier>0</ows:Identifier> <ScaleDenominator>125000.0</ScaleDenominator>
+<TopLeftCorner>-2.93864E7 3.08145E7</TopLeftCorner> <TileWidth>256</TileWidth> <TileHeight>256</TileHeight>
+<MatrixWidth>3</MatrixWidth> <MatrixHeight>3</MatrixHeight>
+</TileMatrix>
+<TileMatrix>
+<ows:Identifier>1</ows:Identifier> <ScaleDenominator>64000.0</ScaleDenominator>
+<TopLeftCorner>-2.93864E7 3.08145E7</TopLeftCorner> <TileWidth>256</TileWidth> <TileHeight>256</TileHeight>
+<MatrixWidth>5</MatrixWidth> <MatrixHeight>4</MatrixHeight>
+</TileMatrix>
+<TileMatrix>
+<ows:Identifier>2</ows:Identifier> <ScaleDenominator>32000.0</ScaleDenominator>
+<TopLeftCorner>-2.93864E7 3.08145E7</TopLeftCorner> <TileWidth>256</TileWidth> <TileHeight>256</TileHeight>
+<MatrixWidth>8</MatrixWidth> <MatrixHeight>7</MatrixHeight>
+</TileMatrix>
+<TileMatrix>
+<ows:Identifier>3</ows:Identifier> <ScaleDenominator>16000.0</ScaleDenominator>
+<TopLeftCorner>-2.93864E7 3.08145E7</TopLeftCorner> <TileWidth>256</TileWidth> <TileHeight>256</TileHeight>
+<MatrixWidth>14</MatrixWidth> <MatrixHeight>14</MatrixHeight>
+</TileMatrix>
+<TileMatrix>
+<ows:Identifier>4</ows:Identifier> <ScaleDenominator>8000.0</ScaleDenominator>
+<TopLeftCorner>-2.93864E7 3.08145E7</TopLeftCorner> <TileWidth>256</TileWidth> <TileHeight>256</TileHeight>
+<MatrixWidth>27</MatrixWidth> <MatrixHeight>27</MatrixHeight>
+</TileMatrix>
+<TileMatrix>
+<ows:Identifier>5</ows:Identifier> <ScaleDenominator>4000.0</ScaleDenominator>
+<TopLeftCorner>-2.93864E7 3.08145E7</TopLeftCorner> <TileWidth>256</TileWidth> <TileHeight>256</TileHeight>
+<MatrixWidth>53</MatrixWidth> <MatrixHeight>52</MatrixHeight>
+</TileMatrix>
+<TileMatrix>
+<ows:Identifier>6</ows:Identifier> <ScaleDenominator>2000.0</ScaleDenominator>
+<TopLeftCorner>-2.93864E7 3.08145E7</TopLeftCorner> <TileWidth>256</TileWidth> <TileHeight>256</TileHeight>
+<MatrixWidth>105</MatrixWidth> <MatrixHeight>104</MatrixHeight>
+</TileMatrix>
+<TileMatrix>
+<ows:Identifier>7</ows:Identifier> <ScaleDenominator>1000.0</ScaleDenominator>
+<TopLeftCorner>-2.93864E7 3.08145E7</TopLeftCorner> <TileWidth>256</TileWidth> <TileHeight>256</TileHeight>
+<MatrixWidth>208</MatrixWidth> <MatrixHeight>208</MatrixHeight>
+</TileMatrix>
+<TileMatrix>
+<ows:Identifier>8</ows:Identifier> <ScaleDenominator>500.0</ScaleDenominator>
+<TopLeftCorner>-2.93864E7 3.08145E7</TopLeftCorner> <TileWidth>256</TileWidth> <TileHeight>256</TileHeight>
+<MatrixWidth>414</MatrixWidth> <MatrixHeight>415</MatrixHeight>
+</TileMatrix>
+</TileMatrixSet>
+</Contents>
+<ServiceMetadataURL xlink:href="http://www.wmts.stadt-zuerich.ch/arcgis/rest/services/Luftbild/MapServer/WMTS/1.0.0/WMTSCapabilities.xml" /> </Capabilities>
diff --git a/web/cobrands/zurich/_colours.scss b/web/cobrands/zurich/_colours.scss
index 1a62d0282..8e8f4c9cd 100644
--- a/web/cobrands/zurich/_colours.scss
+++ b/web/cobrands/zurich/_colours.scss
@@ -1,9 +1,15 @@
/* COLOURS */
-$primary: #FFD000;
-$primary_b: #F3B11E;
-$primary_text: #222;
+$dark_blue: rgb(50, 80, 165);
+$lighter_blue: rgb(57, 94, 147);
+
+$primary: $lighter_blue;
+$primary_b: $dark_blue;
+$primary_text: #fff;
+
+$col_click_map: $lighter_blue;
+$col_click_map_dark: darken($lighter_blue, 20%);
+
+$col_fixed_label: #00BD08;
+$col_fixed_label_dark: #4B8304;
-$contrast1: #00BD08;
-$contrast1_dark: #4B8304;
-$contrast2: #AA8D11;
diff --git a/web/cobrands/zurich/_zurich.scss b/web/cobrands/zurich/_zurich.scss
new file mode 100644
index 000000000..b71670a92
--- /dev/null
+++ b/web/cobrands/zurich/_zurich.scss
@@ -0,0 +1,32 @@
+// Some things from the Zurich stylesheet
+
+a {
+ color: #126094;
+ text-decoration: none;
+}
+a:hover {
+ text-decoration: underline;
+}
+
+#zurich-footer {
+ margin-top: 2em; // mySociety
+ margin-left: 12px; // mySociety
+ font-size: 67.5%;
+ line-height: 1.5em;
+ clear: both;
+ background-image: url(bg_mainnav_portal.png);
+ background-repeat: repeat-x;
+ border: 1px solid #d8d8d8;
+ width: 953px;
+ padding: 3px 10px;
+ margin-bottom: 24px;
+ height: 1.5em
+}
+
+#zurich-footer a {
+ padding-left: 20px;
+}
+
+#zurich-footer a:hover {
+ color: #3c3c3c;
+}
diff --git a/web/cobrands/zurich/bg_mainnav_portal.png b/web/cobrands/zurich/bg_mainnav_portal.png
new file mode 100644
index 000000000..093ef6304
--- /dev/null
+++ b/web/cobrands/zurich/bg_mainnav_portal.png
Binary files differ
diff --git a/web/cobrands/zurich/layout.scss b/web/cobrands/zurich/layout.scss
index abaa25224..82ae2be75 100644
--- a/web/cobrands/zurich/layout.scss
+++ b/web/cobrands/zurich/layout.scss
@@ -1,3 +1,80 @@
-@import "_colours";
-@import "../fixmystreet/_layout";
+@import "colours";
+@import "../fixmystreet/layout";
+@import "zurich";
+
+body {
+ color: #3c3c3c;
+ background-color: #fff;
+}
+
+// White background, so no shadow or margin needed.
+.content {
+ color: #3c3c3c;
+ @include box-shadow(none);
+}
+.ie6, .ie7, .ie8 {
+ .content {
+ border: none;
+ }
+}
+
+#site-header .container {
+ height: 83px;
+ background: url(logo_portal.x.jpg) top left repeat-x;
+}
+
+body.frontpage #site-logo, #site-logo {
+ width: 415px;
+ height: 83px;
+ background: url(logo_portal.jpg) top left no-repeat;
+ top: 0;
+}
+
+.nav-wrapper {
+ .nav-wrapper-2 {
+ border-top: solid 18px white;
+ }
+}
+
+body.mappage {
+ .nav-wrapper {
+ .nav-wrapper-2 {
+ border-top: none;
+ padding-top: 18px;
+ background: url(logo_portal.x.jpg) top left repeat-x;
+ height: 83px;
+ }
+ }
+}
+
+#main-nav {
+ ul#main-menu {
+ li {
+ a:hover {
+ background: $primary/1.1;
+ }
+ span {
+ color: $primary_text;
+ }
+ }
+ }
+}
+
+body.mappage {
+ #main-nav ul#main-menu li a,
+ #main-nav ul#main-menu li span {
+ padding: 0.75em;
+ }
+ #zurich-footer {
+ display: none;
+ }
+}
+
+body.twothirdswidthpage {
+ .content {
+ aside {
+ @include box-shadow(none);
+ }
+ }
+}
diff --git a/web/cobrands/zurich/logo_portal.jpg b/web/cobrands/zurich/logo_portal.jpg
new file mode 100644
index 000000000..5677285e7
--- /dev/null
+++ b/web/cobrands/zurich/logo_portal.jpg
Binary files differ
diff --git a/web/cobrands/zurich/logo_portal.x.jpg b/web/cobrands/zurich/logo_portal.x.jpg
new file mode 100644
index 000000000..c0cfef240
--- /dev/null
+++ b/web/cobrands/zurich/logo_portal.x.jpg
Binary files differ
diff --git a/web/css/core.scss b/web/css/core.scss
index 72e483dfa..c7fac1717 100644
--- a/web/css/core.scss
+++ b/web/css/core.scss
@@ -431,6 +431,16 @@ $map_width: 500px;
font-size: smaller;
}
+ .update-img {
+ text-align: center;
+ }
+ .update-img span {
+ display: none;
+ }
+ #updates .update-img {
+ text-align: left;
+ }
+
// RSS feed XSL
#rss_items {
diff --git a/web/js/OpenLayers.2.11.zurich.js b/web/js/OpenLayers.2.11.zurich.js
new file mode 100644
index 000000000..671984fb4
--- /dev/null
+++ b/web/js/OpenLayers.2.11.zurich.js
@@ -0,0 +1,1384 @@
+/*
+
+ OpenLayers.js -- OpenLayers Map Viewer Library
+
+ Copyright 2005-2011 OpenLayers Contributors, released under the FreeBSD
+ license. Please see http://svn.openlayers.org/trunk/openlayers/license.txt
+ for the full text of the license.
+
+ Includes compressed code under the following licenses:
+
+ (For uncompressed versions of the code used please see the
+ OpenLayers SVN repository: <http://openlayers.org/>)
+
+*/
+
+/* Contains portions of Prototype.js:
+ *
+ * Prototype JavaScript framework, version 1.4.0
+ * (c) 2005 Sam Stephenson <sam@conio.net>
+ *
+ * Prototype is freely distributable under the terms of an MIT-style license.
+ * For details, see the Prototype web site: http://prototype.conio.net/
+ *
+ *--------------------------------------------------------------------------*/
+
+/**
+*
+* Contains portions of Rico <http://openrico.org/>
+*
+* Copyright 2005 Sabre Airline Solutions
+*
+* Licensed under the Apache License, Version 2.0 (the "License"); you
+* may not use this file except in compliance with the License. You
+* may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+* implied. See the License for the specific language governing
+* permissions and limitations under the License.
+*
+**/
+
+/**
+ * Contains XMLHttpRequest.js <http://code.google.com/p/xmlhttprequest/>
+ * Copyright 2007 Sergey Ilinsky (http://www.ilinsky.com)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+/**
+ * Contains portions of Gears <http://code.google.com/apis/gears/>
+ *
+ * Copyright 2007, Google Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of Google Inc. nor the names of its contributors may be
+ * used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+ * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Sets up google.gears.*, which is *the only* supported way to access Gears.
+ *
+ * Circumvent this file at your own risk!
+ *
+ * In the future, Gears may automatically define google.gears.* without this
+ * file. Gears may use these objects to transparently fix bugs and compatibility
+ * issues. Applications that use the code below will continue to work seamlessly
+ * when that happens.
+ */
+
+/**
+ * OpenLayers.Util.pagePosition is based on Yahoo's getXY method, which is
+ * Copyright (c) 2006, Yahoo! Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use of this software in source and binary forms, with or
+ * without modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * * Neither the name of Yahoo! Inc. nor the names of its contributors may be
+ * used to endorse or promote products derived from this software without
+ * specific prior written permission of Yahoo! Inc.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */var OpenLayers={VERSION_NUMBER:"Release 2.11",singleFile:true,_getScriptLocation:function(){ return "/jslib/OpenLayers-2.10/";
+}};OpenLayers.Class=function(){var len=arguments.length;var P=arguments[0];var F=arguments[len-1];var C=typeof F.initialize=="function"?F.initialize:function(){P.prototype.initialize.apply(this,arguments);};if(len>1){var newArgs=[C,P].concat(Array.prototype.slice.call(arguments).slice(1,len-1),F);OpenLayers.inherit.apply(null,newArgs);}else{C.prototype=F;}
+return C;};OpenLayers.Class.isPrototype=function(){};OpenLayers.Class.create=function(){return function(){if(arguments&&arguments[0]!=OpenLayers.Class.isPrototype){this.initialize.apply(this,arguments);}};};OpenLayers.Class.inherit=function(P){var C=function(){P.call(this);};var newArgs=[C].concat(Array.prototype.slice.call(arguments));OpenLayers.inherit.apply(null,newArgs);return C.prototype;};OpenLayers.inherit=function(C,P){var F=function(){};F.prototype=P.prototype;C.prototype=new F;var i,l,o;for(i=2,l=arguments.length;i<l;i++){o=arguments[i];if(typeof o==="function"){o=o.prototype;}
+OpenLayers.Util.extend(C.prototype,o);}};OpenLayers.Util=OpenLayers.Util||{};OpenLayers.Util.extend=function(destination,source){destination=destination||{};if(source){for(var property in source){var value=source[property];if(value!==undefined){destination[property]=value;}}
+var sourceIsEvt=typeof window.Event=="function"&&source instanceof window.Event;if(!sourceIsEvt&&source.hasOwnProperty&&source.hasOwnProperty("toString")){destination.toString=source.toString;}}
+return destination;};OpenLayers.Console={log:function(){},debug:function(){},info:function(){},warn:function(){},error:function(){},userError:function(error){alert(error);},assert:function(){},dir:function(){},dirxml:function(){},trace:function(){},group:function(){},groupEnd:function(){},time:function(){},timeEnd:function(){},profile:function(){},profileEnd:function(){},count:function(){},CLASS_NAME:"OpenLayers.Console"};(function(){var scripts=document.getElementsByTagName("script");for(var i=0,len=scripts.length;i<len;++i){if(scripts[i].src.indexOf("firebug.js")!=-1){if(console){OpenLayers.Util.extend(OpenLayers.Console,console);break;}}}})();OpenLayers.Control=OpenLayers.Class({id:null,map:null,div:null,type:null,allowSelection:false,displayClass:"",title:"",autoActivate:false,active:null,handler:null,eventListeners:null,events:null,EVENT_TYPES:["activate","deactivate"],initialize:function(options){this.displayClass=this.CLASS_NAME.replace("OpenLayers.","ol").replace(/\./g,"");OpenLayers.Util.extend(this,options);this.events=new OpenLayers.Events(this,null,this.EVENT_TYPES);if(this.eventListeners instanceof Object){this.events.on(this.eventListeners);}
+if(this.id==null){this.id=OpenLayers.Util.createUniqueID(this.CLASS_NAME+"_");}},destroy:function(){if(this.events){if(this.eventListeners){this.events.un(this.eventListeners);}
+this.events.destroy();this.events=null;}
+this.eventListeners=null;if(this.handler){this.handler.destroy();this.handler=null;}
+if(this.handlers){for(var key in this.handlers){if(this.handlers.hasOwnProperty(key)&&typeof this.handlers[key].destroy=="function"){this.handlers[key].destroy();}}
+this.handlers=null;}
+if(this.map){this.map.removeControl(this);this.map=null;}
+this.div=null;},setMap:function(map){this.map=map;if(this.handler){this.handler.setMap(map);}},draw:function(px){if(this.div==null){this.div=OpenLayers.Util.createDiv(this.id);this.div.className=this.displayClass;if(!this.allowSelection){this.div.className+=" olControlNoSelect";this.div.setAttribute("unselectable","on",0);this.div.onselectstart=OpenLayers.Function.False;}
+if(this.title!=""){this.div.title=this.title;}}
+if(px!=null){this.position=px.clone();}
+this.moveTo(this.position);return this.div;},moveTo:function(px){if((px!=null)&&(this.div!=null)){this.div.style.left=px.x+"px";this.div.style.top=px.y+"px";}},activate:function(){if(this.active){return false;}
+if(this.handler){this.handler.activate();}
+this.active=true;if(this.map){OpenLayers.Element.addClass(this.map.viewPortDiv,this.displayClass.replace(/ /g,"")+"Active");}
+this.events.triggerEvent("activate");return true;},deactivate:function(){if(this.active){if(this.handler){this.handler.deactivate();}
+this.active=false;if(this.map){OpenLayers.Element.removeClass(this.map.viewPortDiv,this.displayClass.replace(/ /g,"")+"Active");}
+this.events.triggerEvent("deactivate");return true;}
+return false;},CLASS_NAME:"OpenLayers.Control"});OpenLayers.Control.TYPE_BUTTON=1;OpenLayers.Control.TYPE_TOGGLE=2;OpenLayers.Control.TYPE_TOOL=3;OpenLayers.Lang={code:null,defaultCode:"en",getCode:function(){if(!OpenLayers.Lang.code){OpenLayers.Lang.setCode();}
+return OpenLayers.Lang.code;},setCode:function(code){var lang;if(!code){code=(OpenLayers.BROWSER_NAME=="msie")?navigator.userLanguage:navigator.language;}
+var parts=code.split('-');parts[0]=parts[0].toLowerCase();if(typeof OpenLayers.Lang[parts[0]]=="object"){lang=parts[0];}
+if(parts[1]){var testLang=parts[0]+'-'+parts[1].toUpperCase();if(typeof OpenLayers.Lang[testLang]=="object"){lang=testLang;}}
+if(!lang){OpenLayers.Console.warn('Failed to find OpenLayers.Lang.'+parts.join("-")+' dictionary, falling back to default language');lang=OpenLayers.Lang.defaultCode;}
+OpenLayers.Lang.code=lang;},translate:function(key,context){var dictionary=OpenLayers.Lang[OpenLayers.Lang.getCode()];var message=dictionary&&dictionary[key];if(!message){message=key;}
+if(context){message=OpenLayers.String.format(message,context);}
+return message;}};OpenLayers.i18n=OpenLayers.Lang.translate;OpenLayers.String={startsWith:function(str,sub){return(str.indexOf(sub)==0);},contains:function(str,sub){return(str.indexOf(sub)!=-1);},trim:function(str){return str.replace(/^\s\s*/,'').replace(/\s\s*$/,'');},camelize:function(str){var oStringList=str.split('-');var camelizedString=oStringList[0];for(var i=1,len=oStringList.length;i<len;i++){var s=oStringList[i];camelizedString+=s.charAt(0).toUpperCase()+s.substring(1);}
+return camelizedString;},format:function(template,context,args){if(!context){context=window;}
+var replacer=function(str,match){var replacement;var subs=match.split(/\.+/);for(var i=0;i<subs.length;i++){if(i==0){replacement=context;}
+replacement=replacement[subs[i]];}
+if(typeof replacement=="function"){replacement=args?replacement.apply(null,args):replacement();}
+if(typeof replacement=='undefined'){return'undefined';}else{return replacement;}};return template.replace(OpenLayers.String.tokenRegEx,replacer);},tokenRegEx:/\$\{([\w.]+?)\}/g,numberRegEx:/^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/,isNumeric:function(value){return OpenLayers.String.numberRegEx.test(value);},numericIf:function(value){return OpenLayers.String.isNumeric(value)?parseFloat(value):value;}};if(!String.prototype.startsWith){String.prototype.startsWith=function(sStart){OpenLayers.Console.warn(OpenLayers.i18n("methodDeprecated",{'newMethod':'OpenLayers.String.startsWith'}));return OpenLayers.String.startsWith(this,sStart);};}
+if(!String.prototype.contains){String.prototype.contains=function(str){OpenLayers.Console.warn(OpenLayers.i18n("methodDeprecated",{'newMethod':'OpenLayers.String.contains'}));return OpenLayers.String.contains(this,str);};}
+if(!String.prototype.trim){String.prototype.trim=function(){OpenLayers.Console.warn(OpenLayers.i18n("methodDeprecated",{'newMethod':'OpenLayers.String.trim'}));return OpenLayers.String.trim(this);};}
+if(!String.prototype.camelize){String.prototype.camelize=function(){OpenLayers.Console.warn(OpenLayers.i18n("methodDeprecated",{'newMethod':'OpenLayers.String.camelize'}));return OpenLayers.String.camelize(this);};}
+OpenLayers.Number={decimalSeparator:".",thousandsSeparator:",",limitSigDigs:function(num,sig){var fig=0;if(sig>0){fig=parseFloat(num.toPrecision(sig));}
+return fig;},format:function(num,dec,tsep,dsep){dec=(typeof dec!="undefined")?dec:0;tsep=(typeof tsep!="undefined")?tsep:OpenLayers.Number.thousandsSeparator;dsep=(typeof dsep!="undefined")?dsep:OpenLayers.Number.decimalSeparator;if(dec!=null){num=parseFloat(num.toFixed(dec));}
+var parts=num.toString().split(".");if(parts.length==1&&dec==null){dec=0;}
+var integer=parts[0];if(tsep){var thousands=/(-?[0-9]+)([0-9]{3})/;while(thousands.test(integer)){integer=integer.replace(thousands,"$1"+tsep+"$2");}}
+var str;if(dec==0){str=integer;}else{var rem=parts.length>1?parts[1]:"0";if(dec!=null){rem=rem+new Array(dec-rem.length+1).join("0");}
+str=integer+dsep+rem;}
+return str;}};if(!Number.prototype.limitSigDigs){Number.prototype.limitSigDigs=function(sig){OpenLayers.Console.warn(OpenLayers.i18n("methodDeprecated",{'newMethod':'OpenLayers.Number.limitSigDigs'}));return OpenLayers.Number.limitSigDigs(this,sig);};}
+OpenLayers.Function={bind:function(func,object){var args=Array.prototype.slice.apply(arguments,[2]);return function(){var newArgs=args.concat(Array.prototype.slice.apply(arguments,[0]));return func.apply(object,newArgs);};},bindAsEventListener:function(func,object){return function(event){return func.call(object,event||window.event);};},False:function(){return false;},True:function(){return true;},Void:function(){}};if(!Function.prototype.bind){Function.prototype.bind=function(){OpenLayers.Console.warn(OpenLayers.i18n("methodDeprecated",{'newMethod':'OpenLayers.Function.bind'}));Array.prototype.unshift.apply(arguments,[this]);return OpenLayers.Function.bind.apply(null,arguments);};}
+if(!Function.prototype.bindAsEventListener){Function.prototype.bindAsEventListener=function(object){OpenLayers.Console.warn(OpenLayers.i18n("methodDeprecated",{'newMethod':'OpenLayers.Function.bindAsEventListener'}));return OpenLayers.Function.bindAsEventListener(this,object);};}
+OpenLayers.Array={filter:function(array,callback,caller){var selected=[];if(Array.prototype.filter){selected=array.filter(callback,caller);}else{var len=array.length;if(typeof callback!="function"){throw new TypeError();}
+for(var i=0;i<len;i++){if(i in array){var val=array[i];if(callback.call(caller,val,i,array)){selected.push(val);}}}}
+return selected;}};OpenLayers.Bounds=OpenLayers.Class({left:null,bottom:null,right:null,top:null,centerLonLat:null,initialize:function(left,bottom,right,top){if(left!=null){this.left=OpenLayers.Util.toFloat(left);}
+if(bottom!=null){this.bottom=OpenLayers.Util.toFloat(bottom);}
+if(right!=null){this.right=OpenLayers.Util.toFloat(right);}
+if(top!=null){this.top=OpenLayers.Util.toFloat(top);}},clone:function(){return new OpenLayers.Bounds(this.left,this.bottom,this.right,this.top);},equals:function(bounds){var equals=false;if(bounds!=null){equals=((this.left==bounds.left)&&(this.right==bounds.right)&&(this.top==bounds.top)&&(this.bottom==bounds.bottom));}
+return equals;},toString:function(){return[this.left,this.bottom,this.right,this.top].join(",");},toArray:function(reverseAxisOrder){if(reverseAxisOrder===true){return[this.bottom,this.left,this.top,this.right];}else{return[this.left,this.bottom,this.right,this.top];}},toBBOX:function(decimal,reverseAxisOrder){if(decimal==null){decimal=6;}
+var mult=Math.pow(10,decimal);var xmin=Math.round(this.left*mult)/mult;var ymin=Math.round(this.bottom*mult)/mult;var xmax=Math.round(this.right*mult)/mult;var ymax=Math.round(this.top*mult)/mult;if(reverseAxisOrder===true){return ymin+","+xmin+","+ymax+","+xmax;}else{return xmin+","+ymin+","+xmax+","+ymax;}},toGeometry:function(){return new OpenLayers.Geometry.Polygon([new OpenLayers.Geometry.LinearRing([new OpenLayers.Geometry.Point(this.left,this.bottom),new OpenLayers.Geometry.Point(this.right,this.bottom),new OpenLayers.Geometry.Point(this.right,this.top),new OpenLayers.Geometry.Point(this.left,this.top)])]);},getWidth:function(){return(this.right-this.left);},getHeight:function(){return(this.top-this.bottom);},getSize:function(){return new OpenLayers.Size(this.getWidth(),this.getHeight());},getCenterPixel:function(){return new OpenLayers.Pixel((this.left+this.right)/2,(this.bottom+this.top)/2);},getCenterLonLat:function(){if(!this.centerLonLat){this.centerLonLat=new OpenLayers.LonLat((this.left+this.right)/2,(this.bottom+this.top)/2);}
+return this.centerLonLat;},scale:function(ratio,origin){if(origin==null){origin=this.getCenterLonLat();}
+var origx,origy;if(origin.CLASS_NAME=="OpenLayers.LonLat"){origx=origin.lon;origy=origin.lat;}else{origx=origin.x;origy=origin.y;}
+var left=(this.left-origx)*ratio+origx;var bottom=(this.bottom-origy)*ratio+origy;var right=(this.right-origx)*ratio+origx;var top=(this.top-origy)*ratio+origy;return new OpenLayers.Bounds(left,bottom,right,top);},add:function(x,y){if((x==null)||(y==null)){var msg=OpenLayers.i18n("boundsAddError");OpenLayers.Console.error(msg);return null;}
+return new OpenLayers.Bounds(this.left+x,this.bottom+y,this.right+x,this.top+y);},extend:function(object){var bounds=null;if(object){switch(object.CLASS_NAME){case"OpenLayers.LonLat":bounds=new OpenLayers.Bounds(object.lon,object.lat,object.lon,object.lat);break;case"OpenLayers.Geometry.Point":bounds=new OpenLayers.Bounds(object.x,object.y,object.x,object.y);break;case"OpenLayers.Bounds":bounds=object;break;}
+if(bounds){this.centerLonLat=null;if((this.left==null)||(bounds.left<this.left)){this.left=bounds.left;}
+if((this.bottom==null)||(bounds.bottom<this.bottom)){this.bottom=bounds.bottom;}
+if((this.right==null)||(bounds.right>this.right)){this.right=bounds.right;}
+if((this.top==null)||(bounds.top>this.top)){this.top=bounds.top;}}}},containsLonLat:function(ll,inclusive){return this.contains(ll.lon,ll.lat,inclusive);},containsPixel:function(px,inclusive){return this.contains(px.x,px.y,inclusive);},contains:function(x,y,inclusive){if(inclusive==null){inclusive=true;}
+if(x==null||y==null){return false;}
+x=OpenLayers.Util.toFloat(x);y=OpenLayers.Util.toFloat(y);var contains=false;if(inclusive){contains=((x>=this.left)&&(x<=this.right)&&(y>=this.bottom)&&(y<=this.top));}else{contains=((x>this.left)&&(x<this.right)&&(y>this.bottom)&&(y<this.top));}
+return contains;},intersectsBounds:function(bounds,inclusive){if(inclusive==null){inclusive=true;}
+var intersects=false;var mightTouch=(this.left==bounds.right||this.right==bounds.left||this.top==bounds.bottom||this.bottom==bounds.top);if(inclusive||!mightTouch){var inBottom=(((bounds.bottom>=this.bottom)&&(bounds.bottom<=this.top))||((this.bottom>=bounds.bottom)&&(this.bottom<=bounds.top)));var inTop=(((bounds.top>=this.bottom)&&(bounds.top<=this.top))||((this.top>bounds.bottom)&&(this.top<bounds.top)));var inLeft=(((bounds.left>=this.left)&&(bounds.left<=this.right))||((this.left>=bounds.left)&&(this.left<=bounds.right)));var inRight=(((bounds.right>=this.left)&&(bounds.right<=this.right))||((this.right>=bounds.left)&&(this.right<=bounds.right)));intersects=((inBottom||inTop)&&(inLeft||inRight));}
+return intersects;},containsBounds:function(bounds,partial,inclusive){if(partial==null){partial=false;}
+if(inclusive==null){inclusive=true;}
+var bottomLeft=this.contains(bounds.left,bounds.bottom,inclusive);var bottomRight=this.contains(bounds.right,bounds.bottom,inclusive);var topLeft=this.contains(bounds.left,bounds.top,inclusive);var topRight=this.contains(bounds.right,bounds.top,inclusive);return(partial)?(bottomLeft||bottomRight||topLeft||topRight):(bottomLeft&&bottomRight&&topLeft&&topRight);},determineQuadrant:function(lonlat){var quadrant="";var center=this.getCenterLonLat();quadrant+=(lonlat.lat<center.lat)?"b":"t";quadrant+=(lonlat.lon<center.lon)?"l":"r";return quadrant;},transform:function(source,dest){this.centerLonLat=null;var ll=OpenLayers.Projection.transform({'x':this.left,'y':this.bottom},source,dest);var lr=OpenLayers.Projection.transform({'x':this.right,'y':this.bottom},source,dest);var ul=OpenLayers.Projection.transform({'x':this.left,'y':this.top},source,dest);var ur=OpenLayers.Projection.transform({'x':this.right,'y':this.top},source,dest);this.left=Math.min(ll.x,ul.x);this.bottom=Math.min(ll.y,lr.y);this.right=Math.max(lr.x,ur.x);this.top=Math.max(ul.y,ur.y);return this;},wrapDateLine:function(maxExtent,options){options=options||{};var leftTolerance=options.leftTolerance||0;var rightTolerance=options.rightTolerance||0;var newBounds=this.clone();if(maxExtent){while(newBounds.left<maxExtent.left&&(newBounds.right-rightTolerance)<=maxExtent.left){newBounds=newBounds.add(maxExtent.getWidth(),0);}
+while((newBounds.left+leftTolerance)>=maxExtent.right&&newBounds.right>maxExtent.right){newBounds=newBounds.add(-maxExtent.getWidth(),0);}}
+return newBounds;},CLASS_NAME:"OpenLayers.Bounds"});OpenLayers.Bounds.fromString=function(str,reverseAxisOrder){var bounds=str.split(",");return OpenLayers.Bounds.fromArray(bounds,reverseAxisOrder);};OpenLayers.Bounds.fromArray=function(bbox,reverseAxisOrder){return reverseAxisOrder===true?new OpenLayers.Bounds(parseFloat(bbox[1]),parseFloat(bbox[0]),parseFloat(bbox[3]),parseFloat(bbox[2])):new OpenLayers.Bounds(parseFloat(bbox[0]),parseFloat(bbox[1]),parseFloat(bbox[2]),parseFloat(bbox[3]));};OpenLayers.Bounds.fromSize=function(size){return new OpenLayers.Bounds(0,size.h,size.w,0);};OpenLayers.Bounds.oppositeQuadrant=function(quadrant){var opp="";opp+=(quadrant.charAt(0)=='t')?'b':'t';opp+=(quadrant.charAt(1)=='l')?'r':'l';return opp;};OpenLayers.Element={visible:function(element){return OpenLayers.Util.getElement(element).style.display!='none';},toggle:function(){for(var i=0,len=arguments.length;i<len;i++){var element=OpenLayers.Util.getElement(arguments[i]);var display=OpenLayers.Element.visible(element)?'hide':'show';OpenLayers.Element[display](element);}},hide:function(){OpenLayers.Console.warn(OpenLayers.i18n("methodDeprecated",{newMethod:"element.style.display = 'none';"}));for(var i=0,len=arguments.length;i<len;i++){var element=OpenLayers.Util.getElement(arguments[i]);if(element){element.style.display='none';}}},show:function(){OpenLayers.Console.warn(OpenLayers.i18n("methodDeprecated",{newMethod:"element.style.display = '';"}));for(var i=0,len=arguments.length;i<len;i++){var element=OpenLayers.Util.getElement(arguments[i]);if(element){element.style.display='';}}},remove:function(element){element=OpenLayers.Util.getElement(element);element.parentNode.removeChild(element);},getHeight:function(element){element=OpenLayers.Util.getElement(element);return element.offsetHeight;},getDimensions:function(element){element=OpenLayers.Util.getElement(element);if(OpenLayers.Element.getStyle(element,'display')!='none'){return{width:element.offsetWidth,height:element.offsetHeight};}
+var els=element.style;var originalVisibility=els.visibility;var originalPosition=els.position;var originalDisplay=els.display;els.visibility='hidden';els.position='absolute';els.display='';var originalWidth=element.clientWidth;var originalHeight=element.clientHeight;els.display=originalDisplay;els.position=originalPosition;els.visibility=originalVisibility;return{width:originalWidth,height:originalHeight};},hasClass:function(element,name){var names=element.className;return(!!names&&new RegExp("(^|\\s)"+name+"(\\s|$)").test(names));},addClass:function(element,name){if(!OpenLayers.Element.hasClass(element,name)){element.className+=(element.className?" ":"")+name;}
+return element;},removeClass:function(element,name){var names=element.className;if(names){element.className=OpenLayers.String.trim(names.replace(new RegExp("(^|\\s+)"+name+"(\\s+|$)")," "));}
+return element;},toggleClass:function(element,name){if(OpenLayers.Element.hasClass(element,name)){OpenLayers.Element.removeClass(element,name);}else{OpenLayers.Element.addClass(element,name);}
+return element;},getStyle:function(element,style){element=OpenLayers.Util.getElement(element);var value=null;if(element&&element.style){value=element.style[OpenLayers.String.camelize(style)];if(!value){if(document.defaultView&&document.defaultView.getComputedStyle){var css=document.defaultView.getComputedStyle(element,null);value=css?css.getPropertyValue(style):null;}else if(element.currentStyle){value=element.currentStyle[OpenLayers.String.camelize(style)];}}
+var positions=['left','top','right','bottom'];if(window.opera&&(OpenLayers.Util.indexOf(positions,style)!=-1)&&(OpenLayers.Element.getStyle(element,'position')=='static')){value='auto';}}
+return value=='auto'?null:value;}};OpenLayers.LonLat=OpenLayers.Class({lon:0.0,lat:0.0,initialize:function(lon,lat){this.lon=OpenLayers.Util.toFloat(lon);this.lat=OpenLayers.Util.toFloat(lat);},toString:function(){return("lon="+this.lon+",lat="+this.lat);},toShortString:function(){return(this.lon+", "+this.lat);},clone:function(){return new OpenLayers.LonLat(this.lon,this.lat);},add:function(lon,lat){if((lon==null)||(lat==null)){var msg=OpenLayers.i18n("lonlatAddError");OpenLayers.Console.error(msg);return null;}
+return new OpenLayers.LonLat(this.lon+OpenLayers.Util.toFloat(lon),this.lat+OpenLayers.Util.toFloat(lat));},equals:function(ll){var equals=false;if(ll!=null){equals=((this.lon==ll.lon&&this.lat==ll.lat)||(isNaN(this.lon)&&isNaN(this.lat)&&isNaN(ll.lon)&&isNaN(ll.lat)));}
+return equals;},transform:function(source,dest){var point=OpenLayers.Projection.transform({'x':this.lon,'y':this.lat},source,dest);this.lon=point.x;this.lat=point.y;return this;},wrapDateLine:function(maxExtent){var newLonLat=this.clone();if(maxExtent){while(newLonLat.lon<maxExtent.left){newLonLat.lon+=maxExtent.getWidth();}
+while(newLonLat.lon>maxExtent.right){newLonLat.lon-=maxExtent.getWidth();}}
+return newLonLat;},CLASS_NAME:"OpenLayers.LonLat"});OpenLayers.LonLat.fromString=function(str){var pair=str.split(",");return new OpenLayers.LonLat(pair[0],pair[1]);};OpenLayers.LonLat.fromArray=function(arr){var gotArr=OpenLayers.Util.isArray(arr),lon=gotArr&&arr[0],lat=gotArr&&arr[1];return new OpenLayers.LonLat(lon,lat);};OpenLayers.Pixel=OpenLayers.Class({x:0.0,y:0.0,initialize:function(x,y){this.x=parseFloat(x);this.y=parseFloat(y);},toString:function(){return("x="+this.x+",y="+this.y);},clone:function(){return new OpenLayers.Pixel(this.x,this.y);},equals:function(px){var equals=false;if(px!=null){equals=((this.x==px.x&&this.y==px.y)||(isNaN(this.x)&&isNaN(this.y)&&isNaN(px.x)&&isNaN(px.y)));}
+return equals;},distanceTo:function(px){return Math.sqrt(Math.pow(this.x-px.x,2)+
+Math.pow(this.y-px.y,2));},add:function(x,y){if((x==null)||(y==null)){var msg=OpenLayers.i18n("pixelAddError");OpenLayers.Console.error(msg);return null;}
+return new OpenLayers.Pixel(this.x+x,this.y+y);},offset:function(px){var newPx=this.clone();if(px){newPx=this.add(px.x,px.y);}
+return newPx;},CLASS_NAME:"OpenLayers.Pixel"});OpenLayers.Size=OpenLayers.Class({w:0.0,h:0.0,initialize:function(w,h){this.w=parseFloat(w);this.h=parseFloat(h);},toString:function(){return("w="+this.w+",h="+this.h);},clone:function(){return new OpenLayers.Size(this.w,this.h);},equals:function(sz){var equals=false;if(sz!=null){equals=((this.w==sz.w&&this.h==sz.h)||(isNaN(this.w)&&isNaN(this.h)&&isNaN(sz.w)&&isNaN(sz.h)));}
+return equals;},CLASS_NAME:"OpenLayers.Size"});OpenLayers.Util=OpenLayers.Util||{};OpenLayers.Util.getElement=function(){var elements=[];for(var i=0,len=arguments.length;i<len;i++){var element=arguments[i];if(typeof element=='string'){element=document.getElementById(element);}
+if(arguments.length==1){return element;}
+elements.push(element);}
+return elements;};OpenLayers.Util.isElement=function(o){return!!(o&&o.nodeType===1);};OpenLayers.Util.isArray=function(a){return(Object.prototype.toString.call(a)==='[object Array]');};if(typeof window.$==="undefined"){window.$=OpenLayers.Util.getElement;}
+OpenLayers.Util.removeItem=function(array,item){for(var i=array.length-1;i>=0;i--){if(array[i]==item){array.splice(i,1);}}
+return array;};OpenLayers.Util.clearArray=function(array){OpenLayers.Console.warn(OpenLayers.i18n("methodDeprecated",{'newMethod':'array = []'}));array.length=0;};OpenLayers.Util.indexOf=function(array,obj){if(typeof array.indexOf=="function"){return array.indexOf(obj);}else{for(var i=0,len=array.length;i<len;i++){if(array[i]==obj){return i;}}
+return-1;}};OpenLayers.Util.modifyDOMElement=function(element,id,px,sz,position,border,overflow,opacity){if(id){element.id=id;}
+if(px){element.style.left=px.x+"px";element.style.top=px.y+"px";}
+if(sz){element.style.width=sz.w+"px";element.style.height=sz.h+"px";}
+if(position){element.style.position=position;}
+if(border){element.style.border=border;}
+if(overflow){element.style.overflow=overflow;}
+if(parseFloat(opacity)>=0.0&&parseFloat(opacity)<1.0){element.style.filter='alpha(opacity='+(opacity*100)+')';element.style.opacity=opacity;}else if(parseFloat(opacity)==1.0){element.style.filter='';element.style.opacity='';}};OpenLayers.Util.createDiv=function(id,px,sz,imgURL,position,border,overflow,opacity){var dom=document.createElement('div');if(imgURL){dom.style.backgroundImage='url('+imgURL+')';}
+if(!id){id=OpenLayers.Util.createUniqueID("OpenLayersDiv");}
+if(!position){position="absolute";}
+OpenLayers.Util.modifyDOMElement(dom,id,px,sz,position,border,overflow,opacity);return dom;};OpenLayers.Util.createImage=function(id,px,sz,imgURL,position,border,opacity,delayDisplay){var image=document.createElement("img");if(!id){id=OpenLayers.Util.createUniqueID("OpenLayersDiv");}
+if(!position){position="relative";}
+OpenLayers.Util.modifyDOMElement(image,id,px,sz,position,border,null,opacity);if(delayDisplay){image.style.display="none";OpenLayers.Event.observe(image,"load",OpenLayers.Function.bind(OpenLayers.Util.onImageLoad,image));OpenLayers.Event.observe(image,"error",OpenLayers.Function.bind(OpenLayers.Util.onImageLoadError,image));}
+image.style.alt=id;image.galleryImg="no";if(imgURL){image.src=imgURL;}
+return image;};OpenLayers.Util.setOpacity=function(element,opacity){OpenLayers.Util.modifyDOMElement(element,null,null,null,null,null,null,opacity);};OpenLayers.Util.onImageLoad=function(){if(!this.viewRequestID||(this.map&&this.viewRequestID==this.map.viewRequestID)){this.style.display="";}
+OpenLayers.Element.removeClass(this,"olImageLoadError");};OpenLayers.IMAGE_RELOAD_ATTEMPTS=0;OpenLayers.Util.onImageLoadError=function(){this._attempts=(this._attempts)?(this._attempts+1):1;if(this._attempts<=OpenLayers.IMAGE_RELOAD_ATTEMPTS){var urls=this.urls;if(urls&&OpenLayers.Util.isArray(urls)&&urls.length>1){var src=this.src.toString();var current_url,k;for(k=0;current_url=urls[k];k++){if(src.indexOf(current_url)!=-1){break;}}
+var guess=Math.floor(urls.length*Math.random());var new_url=urls[guess];k=0;while(new_url==current_url&&k++<4){guess=Math.floor(urls.length*Math.random());new_url=urls[guess];}
+this.src=src.replace(current_url,new_url);}else{this.src=this.src;}}else{OpenLayers.Element.addClass(this,"olImageLoadError");}
+this.style.display="";};OpenLayers.Util.alphaHackNeeded=null;OpenLayers.Util.alphaHack=function(){if(OpenLayers.Util.alphaHackNeeded==null){var arVersion=navigator.appVersion.split("MSIE");var version=parseFloat(arVersion[1]);var filter=false;try{filter=!!(document.body.filters);}catch(e){}
+OpenLayers.Util.alphaHackNeeded=(filter&&(version>=5.5)&&(version<7));}
+return OpenLayers.Util.alphaHackNeeded;};OpenLayers.Util.modifyAlphaImageDiv=function(div,id,px,sz,imgURL,position,border,sizing,opacity){OpenLayers.Util.modifyDOMElement(div,id,px,sz,position,null,null,opacity);var img=div.childNodes[0];if(imgURL){img.src=imgURL;}
+OpenLayers.Util.modifyDOMElement(img,div.id+"_innerImage",null,sz,"relative",border);if(OpenLayers.Util.alphaHack()){if(div.style.display!="none"){div.style.display="inline-block";}
+if(sizing==null){sizing="scale";}
+div.style.filter="progid:DXImageTransform.Microsoft"+".AlphaImageLoader(src='"+img.src+"', "+"sizingMethod='"+sizing+"')";if(parseFloat(div.style.opacity)>=0.0&&parseFloat(div.style.opacity)<1.0){div.style.filter+=" alpha(opacity="+div.style.opacity*100+")";}
+img.style.filter="alpha(opacity=0)";}};OpenLayers.Util.createAlphaImageDiv=function(id,px,sz,imgURL,position,border,sizing,opacity,delayDisplay){var div=OpenLayers.Util.createDiv();var img=OpenLayers.Util.createImage(null,null,null,null,null,null,null,false);div.appendChild(img);if(delayDisplay){img.style.display="none";OpenLayers.Event.observe(img,"load",OpenLayers.Function.bind(OpenLayers.Util.onImageLoad,div));OpenLayers.Event.observe(img,"error",OpenLayers.Function.bind(OpenLayers.Util.onImageLoadError,div));}
+OpenLayers.Util.modifyAlphaImageDiv(div,id,px,sz,imgURL,position,border,sizing,opacity);return div;};OpenLayers.Util.upperCaseObject=function(object){var uObject={};for(var key in object){uObject[key.toUpperCase()]=object[key];}
+return uObject;};OpenLayers.Util.applyDefaults=function(to,from){to=to||{};var fromIsEvt=typeof window.Event=="function"&&from instanceof window.Event;for(var key in from){if(to[key]===undefined||(!fromIsEvt&&from.hasOwnProperty&&from.hasOwnProperty(key)&&!to.hasOwnProperty(key))){to[key]=from[key];}}
+if(!fromIsEvt&&from&&from.hasOwnProperty&&from.hasOwnProperty('toString')&&!to.hasOwnProperty('toString')){to.toString=from.toString;}
+return to;};OpenLayers.Util.getParameterString=function(params){var paramsArray=[];for(var key in params){var value=params[key];if((value!=null)&&(typeof value!='function')){var encodedValue;if(typeof value=='object'&&value.constructor==Array){var encodedItemArray=[];var item;for(var itemIndex=0,len=value.length;itemIndex<len;itemIndex++){item=value[itemIndex];encodedItemArray.push(encodeURIComponent((item===null||item===undefined)?"":item));}
+encodedValue=encodedItemArray.join(",");}
+else{encodedValue=encodeURIComponent(value);}
+paramsArray.push(encodeURIComponent(key)+"="+encodedValue);}}
+return paramsArray.join("&");};OpenLayers.Util.urlAppend=function(url,paramStr){var newUrl=url;if(paramStr){var parts=(url+" ").split(/[?&]/);newUrl+=(parts.pop()===" "?paramStr:parts.length?"&"+paramStr:"?"+paramStr);}
+return newUrl;};OpenLayers.ImgPath='';OpenLayers.Util.getImagesLocation=function(){return OpenLayers.ImgPath||(OpenLayers._getScriptLocation()+"img/");};OpenLayers.Util.Try=function(){var returnValue=null;for(var i=0,len=arguments.length;i<len;i++){var lambda=arguments[i];try{returnValue=lambda();break;}catch(e){}}
+return returnValue;};OpenLayers.Util.getXmlNodeValue=function(node){var val=null;OpenLayers.Util.Try(function(){val=node.text;if(!val){val=node.textContent;}
+if(!val){val=node.firstChild.nodeValue;}},function(){val=node.textContent;});return val;};OpenLayers.Util.mouseLeft=function(evt,div){var target=(evt.relatedTarget)?evt.relatedTarget:evt.toElement;while(target!=div&&target!=null){target=target.parentNode;}
+return(target!=div);};OpenLayers.Util.DEFAULT_PRECISION=14;OpenLayers.Util.toFloat=function(number,precision){if(precision==null){precision=OpenLayers.Util.DEFAULT_PRECISION;}
+if(typeof number!=="number"){number=parseFloat(number);}
+return precision===0?number:parseFloat(number.toPrecision(precision));};OpenLayers.Util.rad=function(x){return x*Math.PI/180;};OpenLayers.Util.deg=function(x){return x*180/Math.PI;};OpenLayers.Util.VincentyConstants={a:6378137,b:6356752.3142,f:1/298.257223563};OpenLayers.Util.distVincenty=function(p1,p2){var ct=OpenLayers.Util.VincentyConstants;var a=ct.a,b=ct.b,f=ct.f;var L=OpenLayers.Util.rad(p2.lon-p1.lon);var U1=Math.atan((1-f)*Math.tan(OpenLayers.Util.rad(p1.lat)));var U2=Math.atan((1-f)*Math.tan(OpenLayers.Util.rad(p2.lat)));var sinU1=Math.sin(U1),cosU1=Math.cos(U1);var sinU2=Math.sin(U2),cosU2=Math.cos(U2);var lambda=L,lambdaP=2*Math.PI;var iterLimit=20;while(Math.abs(lambda-lambdaP)>1e-12&&--iterLimit>0){var sinLambda=Math.sin(lambda),cosLambda=Math.cos(lambda);var sinSigma=Math.sqrt((cosU2*sinLambda)*(cosU2*sinLambda)+
+(cosU1*sinU2-sinU1*cosU2*cosLambda)*(cosU1*sinU2-sinU1*cosU2*cosLambda));if(sinSigma==0){return 0;}
+var cosSigma=sinU1*sinU2+cosU1*cosU2*cosLambda;var sigma=Math.atan2(sinSigma,cosSigma);var alpha=Math.asin(cosU1*cosU2*sinLambda/sinSigma);var cosSqAlpha=Math.cos(alpha)*Math.cos(alpha);var cos2SigmaM=cosSigma-2*sinU1*sinU2/cosSqAlpha;var C=f/16*cosSqAlpha*(4+f*(4-3*cosSqAlpha));lambdaP=lambda;lambda=L+(1-C)*f*Math.sin(alpha)*(sigma+C*sinSigma*(cos2SigmaM+C*cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)));}
+if(iterLimit==0){return NaN;}
+var uSq=cosSqAlpha*(a*a-b*b)/(b*b);var A=1+uSq/16384*(4096+uSq*(-768+uSq*(320-175*uSq)));var B=uSq/1024*(256+uSq*(-128+uSq*(74-47*uSq)));var deltaSigma=B*sinSigma*(cos2SigmaM+B/4*(cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)-
+B/6*cos2SigmaM*(-3+4*sinSigma*sinSigma)*(-3+4*cos2SigmaM*cos2SigmaM)));var s=b*A*(sigma-deltaSigma);var d=s.toFixed(3)/1000;return d;};OpenLayers.Util.destinationVincenty=function(lonlat,brng,dist){var u=OpenLayers.Util;var ct=u.VincentyConstants;var a=ct.a,b=ct.b,f=ct.f;var lon1=lonlat.lon;var lat1=lonlat.lat;var s=dist;var alpha1=u.rad(brng);var sinAlpha1=Math.sin(alpha1);var cosAlpha1=Math.cos(alpha1);var tanU1=(1-f)*Math.tan(u.rad(lat1));var cosU1=1/Math.sqrt((1+tanU1*tanU1)),sinU1=tanU1*cosU1;var sigma1=Math.atan2(tanU1,cosAlpha1);var sinAlpha=cosU1*sinAlpha1;var cosSqAlpha=1-sinAlpha*sinAlpha;var uSq=cosSqAlpha*(a*a-b*b)/(b*b);var A=1+uSq/16384*(4096+uSq*(-768+uSq*(320-175*uSq)));var B=uSq/1024*(256+uSq*(-128+uSq*(74-47*uSq)));var sigma=s/(b*A),sigmaP=2*Math.PI;while(Math.abs(sigma-sigmaP)>1e-12){var cos2SigmaM=Math.cos(2*sigma1+sigma);var sinSigma=Math.sin(sigma);var cosSigma=Math.cos(sigma);var deltaSigma=B*sinSigma*(cos2SigmaM+B/4*(cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)-
+B/6*cos2SigmaM*(-3+4*sinSigma*sinSigma)*(-3+4*cos2SigmaM*cos2SigmaM)));sigmaP=sigma;sigma=s/(b*A)+deltaSigma;}
+var tmp=sinU1*sinSigma-cosU1*cosSigma*cosAlpha1;var lat2=Math.atan2(sinU1*cosSigma+cosU1*sinSigma*cosAlpha1,(1-f)*Math.sqrt(sinAlpha*sinAlpha+tmp*tmp));var lambda=Math.atan2(sinSigma*sinAlpha1,cosU1*cosSigma-sinU1*sinSigma*cosAlpha1);var C=f/16*cosSqAlpha*(4+f*(4-3*cosSqAlpha));var L=lambda-(1-C)*f*sinAlpha*(sigma+C*sinSigma*(cos2SigmaM+C*cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)));var revAz=Math.atan2(sinAlpha,-tmp);return new OpenLayers.LonLat(lon1+u.deg(L),u.deg(lat2));};OpenLayers.Util.getParameters=function(url){url=(url===null||url===undefined)?window.location.href:url;var paramsString="";if(OpenLayers.String.contains(url,'?')){var start=url.indexOf('?')+1;var end=OpenLayers.String.contains(url,"#")?url.indexOf('#'):url.length;paramsString=url.substring(start,end);}
+var parameters={};var pairs=paramsString.split(/[&;]/);for(var i=0,len=pairs.length;i<len;++i){var keyValue=pairs[i].split('=');if(keyValue[0]){var key=keyValue[0];try{key=decodeURIComponent(key);}catch(err){key=unescape(key);}
+var value=(keyValue[1]||'').replace(/\+/g," ");try{value=decodeURIComponent(value);}catch(err){value=unescape(value);}
+value=value.split(",");if(value.length==1){value=value[0];}
+parameters[key]=value;}}
+return parameters;};OpenLayers.Util.getArgs=function(url){OpenLayers.Console.warn(OpenLayers.i18n("methodDeprecated",{'newMethod':'OpenLayers.Util.getParameters'}));return OpenLayers.Util.getParameters(url);};OpenLayers.Util.lastSeqID=0;OpenLayers.Util.createUniqueID=function(prefix){if(prefix==null){prefix="id_";}
+OpenLayers.Util.lastSeqID+=1;return prefix+OpenLayers.Util.lastSeqID;};OpenLayers.INCHES_PER_UNIT={'inches':1.0,'ft':12.0,'mi':63360.0,'m':39.3701,'km':39370.1,'dd':4374754,'yd':36};OpenLayers.INCHES_PER_UNIT["in"]=OpenLayers.INCHES_PER_UNIT.inches;OpenLayers.INCHES_PER_UNIT["degrees"]=OpenLayers.INCHES_PER_UNIT.dd;OpenLayers.INCHES_PER_UNIT["nmi"]=1852*OpenLayers.INCHES_PER_UNIT.m;OpenLayers.METERS_PER_INCH=0.02540005080010160020;OpenLayers.Util.extend(OpenLayers.INCHES_PER_UNIT,{"Inch":OpenLayers.INCHES_PER_UNIT.inches,"Meter":1.0/OpenLayers.METERS_PER_INCH,"Foot":0.30480060960121920243/OpenLayers.METERS_PER_INCH,"IFoot":0.30480000000000000000/OpenLayers.METERS_PER_INCH,"ClarkeFoot":0.3047972651151/OpenLayers.METERS_PER_INCH,"SearsFoot":0.30479947153867624624/OpenLayers.METERS_PER_INCH,"GoldCoastFoot":0.30479971018150881758/OpenLayers.METERS_PER_INCH,"IInch":0.02540000000000000000/OpenLayers.METERS_PER_INCH,"MicroInch":0.00002540000000000000/OpenLayers.METERS_PER_INCH,"Mil":0.00000002540000000000/OpenLayers.METERS_PER_INCH,"Centimeter":0.01000000000000000000/OpenLayers.METERS_PER_INCH,"Kilometer":1000.00000000000000000000/OpenLayers.METERS_PER_INCH,"Yard":0.91440182880365760731/OpenLayers.METERS_PER_INCH,"SearsYard":0.914398414616029/OpenLayers.METERS_PER_INCH,"IndianYard":0.91439853074444079983/OpenLayers.METERS_PER_INCH,"IndianYd37":0.91439523/OpenLayers.METERS_PER_INCH,"IndianYd62":0.9143988/OpenLayers.METERS_PER_INCH,"IndianYd75":0.9143985/OpenLayers.METERS_PER_INCH,"IndianFoot":0.30479951/OpenLayers.METERS_PER_INCH,"IndianFt37":0.30479841/OpenLayers.METERS_PER_INCH,"IndianFt62":0.3047996/OpenLayers.METERS_PER_INCH,"IndianFt75":0.3047995/OpenLayers.METERS_PER_INCH,"Mile":1609.34721869443738887477/OpenLayers.METERS_PER_INCH,"IYard":0.91440000000000000000/OpenLayers.METERS_PER_INCH,"IMile":1609.34400000000000000000/OpenLayers.METERS_PER_INCH,"NautM":1852.00000000000000000000/OpenLayers.METERS_PER_INCH,"Lat-66":110943.316488932731/OpenLayers.METERS_PER_INCH,"Lat-83":110946.25736872234125/OpenLayers.METERS_PER_INCH,"Decimeter":0.10000000000000000000/OpenLayers.METERS_PER_INCH,"Millimeter":0.00100000000000000000/OpenLayers.METERS_PER_INCH,"Dekameter":10.00000000000000000000/OpenLayers.METERS_PER_INCH,"Decameter":10.00000000000000000000/OpenLayers.METERS_PER_INCH,"Hectometer":100.00000000000000000000/OpenLayers.METERS_PER_INCH,"GermanMeter":1.0000135965/OpenLayers.METERS_PER_INCH,"CaGrid":0.999738/OpenLayers.METERS_PER_INCH,"ClarkeChain":20.1166194976/OpenLayers.METERS_PER_INCH,"GunterChain":20.11684023368047/OpenLayers.METERS_PER_INCH,"BenoitChain":20.116782494375872/OpenLayers.METERS_PER_INCH,"SearsChain":20.11676512155/OpenLayers.METERS_PER_INCH,"ClarkeLink":0.201166194976/OpenLayers.METERS_PER_INCH,"GunterLink":0.2011684023368047/OpenLayers.METERS_PER_INCH,"BenoitLink":0.20116782494375872/OpenLayers.METERS_PER_INCH,"SearsLink":0.2011676512155/OpenLayers.METERS_PER_INCH,"Rod":5.02921005842012/OpenLayers.METERS_PER_INCH,"IntnlChain":20.1168/OpenLayers.METERS_PER_INCH,"IntnlLink":0.201168/OpenLayers.METERS_PER_INCH,"Perch":5.02921005842012/OpenLayers.METERS_PER_INCH,"Pole":5.02921005842012/OpenLayers.METERS_PER_INCH,"Furlong":201.1684023368046/OpenLayers.METERS_PER_INCH,"Rood":3.778266898/OpenLayers.METERS_PER_INCH,"CapeFoot":0.3047972615/OpenLayers.METERS_PER_INCH,"Brealey":375.00000000000000000000/OpenLayers.METERS_PER_INCH,"ModAmFt":0.304812252984505969011938/OpenLayers.METERS_PER_INCH,"Fathom":1.8288/OpenLayers.METERS_PER_INCH,"NautM-UK":1853.184/OpenLayers.METERS_PER_INCH,"50kilometers":50000.0/OpenLayers.METERS_PER_INCH,"150kilometers":150000.0/OpenLayers.METERS_PER_INCH});OpenLayers.Util.extend(OpenLayers.INCHES_PER_UNIT,{"mm":OpenLayers.INCHES_PER_UNIT["Meter"]/1000.0,"cm":OpenLayers.INCHES_PER_UNIT["Meter"]/100.0,"dm":OpenLayers.INCHES_PER_UNIT["Meter"]*100.0,"km":OpenLayers.INCHES_PER_UNIT["Meter"]*1000.0,"kmi":OpenLayers.INCHES_PER_UNIT["nmi"],"fath":OpenLayers.INCHES_PER_UNIT["Fathom"],"ch":OpenLayers.INCHES_PER_UNIT["IntnlChain"],"link":OpenLayers.INCHES_PER_UNIT["IntnlLink"],"us-in":OpenLayers.INCHES_PER_UNIT["inches"],"us-ft":OpenLayers.INCHES_PER_UNIT["Foot"],"us-yd":OpenLayers.INCHES_PER_UNIT["Yard"],"us-ch":OpenLayers.INCHES_PER_UNIT["GunterChain"],"us-mi":OpenLayers.INCHES_PER_UNIT["Mile"],"ind-yd":OpenLayers.INCHES_PER_UNIT["IndianYd37"],"ind-ft":OpenLayers.INCHES_PER_UNIT["IndianFt37"],"ind-ch":20.11669506/OpenLayers.METERS_PER_INCH});OpenLayers.DOTS_PER_INCH=72;OpenLayers.Util.normalizeScale=function(scale){var normScale=(scale>1.0)?(1.0/scale):scale;return normScale;};OpenLayers.Util.getResolutionFromScale=function(scale,units){var resolution;if(scale){if(units==null){units="degrees";}
+var normScale=OpenLayers.Util.normalizeScale(scale);resolution=1/(normScale*OpenLayers.INCHES_PER_UNIT[units]*OpenLayers.DOTS_PER_INCH);}
+return resolution;};OpenLayers.Util.getScaleFromResolution=function(resolution,units){if(units==null){units="degrees";}
+var scale=resolution*OpenLayers.INCHES_PER_UNIT[units]*OpenLayers.DOTS_PER_INCH;return scale;};OpenLayers.Util.safeStopPropagation=function(evt){OpenLayers.Event.stop(evt,true);};OpenLayers.Util.pagePosition=function(forElement){var pos=[0,0];var viewportElement=OpenLayers.Util.getViewportElement();if(!forElement||forElement==window||forElement==viewportElement){return pos;}
+var BUGGY_GECKO_BOX_OBJECT=OpenLayers.IS_GECKO&&document.getBoxObjectFor&&OpenLayers.Element.getStyle(forElement,'position')=='absolute'&&(forElement.style.top==''||forElement.style.left=='');var parent=null;var box;if(forElement.getBoundingClientRect){box=forElement.getBoundingClientRect();var scrollTop=viewportElement.scrollTop;var scrollLeft=viewportElement.scrollLeft;pos[0]=box.left+scrollLeft;pos[1]=box.top+scrollTop;}else if(document.getBoxObjectFor&&!BUGGY_GECKO_BOX_OBJECT){box=document.getBoxObjectFor(forElement);var vpBox=document.getBoxObjectFor(viewportElement);pos[0]=box.screenX-vpBox.screenX;pos[1]=box.screenY-vpBox.screenY;}else{pos[0]=forElement.offsetLeft;pos[1]=forElement.offsetTop;parent=forElement.offsetParent;if(parent!=forElement){while(parent){pos[0]+=parent.offsetLeft;pos[1]+=parent.offsetTop;parent=parent.offsetParent;}}
+var browser=OpenLayers.BROWSER_NAME;if(browser=="opera"||(browser=="safari"&&OpenLayers.Element.getStyle(forElement,'position')=='absolute')){pos[1]-=document.body.offsetTop;}
+parent=forElement.offsetParent;while(parent&&parent!=document.body){pos[0]-=parent.scrollLeft;if(browser!="opera"||parent.tagName!='TR'){pos[1]-=parent.scrollTop;}
+parent=parent.offsetParent;}}
+return pos;};OpenLayers.Util.getViewportElement=function(){var viewportElement=arguments.callee.viewportElement;if(viewportElement==undefined){viewportElement=(OpenLayers.BROWSER_NAME=="msie"&&document.compatMode!='CSS1Compat')?document.body:document.documentElement;arguments.callee.viewportElement=viewportElement;}
+return viewportElement;};OpenLayers.Util.isEquivalentUrl=function(url1,url2,options){options=options||{};OpenLayers.Util.applyDefaults(options,{ignoreCase:true,ignorePort80:true,ignoreHash:true});var urlObj1=OpenLayers.Util.createUrlObject(url1,options);var urlObj2=OpenLayers.Util.createUrlObject(url2,options);for(var key in urlObj1){if(key!=="args"){if(urlObj1[key]!=urlObj2[key]){return false;}}}
+for(var key in urlObj1.args){if(urlObj1.args[key]!=urlObj2.args[key]){return false;}
+delete urlObj2.args[key];}
+for(var key in urlObj2.args){return false;}
+return true;};OpenLayers.Util.createUrlObject=function(url,options){options=options||{};if(!(/^\w+:\/\//).test(url)){var loc=window.location;var port=loc.port?":"+loc.port:"";var fullUrl=loc.protocol+"//"+loc.host.split(":").shift()+port;if(url.indexOf("/")===0){url=fullUrl+url;}else{var parts=loc.pathname.split("/");parts.pop();url=fullUrl+parts.join("/")+"/"+url;}}
+if(options.ignoreCase){url=url.toLowerCase();}
+var a=document.createElement('a');a.href=url;var urlObject={};urlObject.host=a.host.split(":").shift();urlObject.protocol=a.protocol;if(options.ignorePort80){urlObject.port=(a.port=="80"||a.port=="0")?"":a.port;}else{urlObject.port=(a.port==""||a.port=="0")?"80":a.port;}
+urlObject.hash=(options.ignoreHash||a.hash==="#")?"":a.hash;var queryString=a.search;if(!queryString){var qMark=url.indexOf("?");queryString=(qMark!=-1)?url.substr(qMark):"";}
+urlObject.args=OpenLayers.Util.getParameters(queryString);urlObject.pathname=(a.pathname.charAt(0)=="/")?a.pathname:"/"+a.pathname;return urlObject;};OpenLayers.Util.removeTail=function(url){var head=null;var qMark=url.indexOf("?");var hashMark=url.indexOf("#");if(qMark==-1){head=(hashMark!=-1)?url.substr(0,hashMark):url;}else{head=(hashMark!=-1)?url.substr(0,Math.min(qMark,hashMark)):url.substr(0,qMark);}
+return head;};OpenLayers.IS_GECKO=(function(){var ua=navigator.userAgent.toLowerCase();return ua.indexOf("webkit")==-1&&ua.indexOf("gecko")!=-1;})();OpenLayers.BROWSER_NAME=(function(){var name="";var ua=navigator.userAgent.toLowerCase();if(ua.indexOf("opera")!=-1){name="opera";}else if(ua.indexOf("msie")!=-1){name="msie";}else if(ua.indexOf("safari")!=-1){name="safari";}else if(ua.indexOf("mozilla")!=-1){if(ua.indexOf("firefox")!=-1){name="firefox";}else{name="mozilla";}}
+return name;})();OpenLayers.Util.getBrowserName=function(){return OpenLayers.BROWSER_NAME;};OpenLayers.Util.getRenderedDimensions=function(contentHTML,size,options){var w,h;var container=document.createElement("div");container.style.visibility="hidden";var containerElement=(options&&options.containerElement)?options.containerElement:document.body;if(size){if(size.w){w=size.w;container.style.width=w+"px";}else if(size.h){h=size.h;container.style.height=h+"px";}}
+if(options&&options.displayClass){container.className=options.displayClass;}
+var content=document.createElement("div");content.innerHTML=contentHTML;content.style.overflow="visible";if(content.childNodes){for(var i=0,l=content.childNodes.length;i<l;i++){if(!content.childNodes[i].style)continue;content.childNodes[i].style.overflow="visible";}}
+container.appendChild(content);containerElement.appendChild(container);var parentHasPositionAbsolute=false;var parent=container.parentNode;while(parent&&parent.tagName.toLowerCase()!="body"){var parentPosition=OpenLayers.Element.getStyle(parent,"position");if(parentPosition=="absolute"){parentHasPositionAbsolute=true;break;}else if(parentPosition&&parentPosition!="static"){break;}
+parent=parent.parentNode;}
+if(!parentHasPositionAbsolute){container.style.position="absolute";}
+if(!w){w=parseInt(content.scrollWidth);container.style.width=w+"px";}
+if(!h){h=parseInt(content.scrollHeight);}
+container.removeChild(content);containerElement.removeChild(container);return new OpenLayers.Size(w,h);};OpenLayers.Util.getScrollbarWidth=function(){var scrollbarWidth=OpenLayers.Util._scrollbarWidth;if(scrollbarWidth==null){var scr=null;var inn=null;var wNoScroll=0;var wScroll=0;scr=document.createElement('div');scr.style.position='absolute';scr.style.top='-1000px';scr.style.left='-1000px';scr.style.width='100px';scr.style.height='50px';scr.style.overflow='hidden';inn=document.createElement('div');inn.style.width='100%';inn.style.height='200px';scr.appendChild(inn);document.body.appendChild(scr);wNoScroll=inn.offsetWidth;scr.style.overflow='scroll';wScroll=inn.offsetWidth;document.body.removeChild(document.body.lastChild);OpenLayers.Util._scrollbarWidth=(wNoScroll-wScroll);scrollbarWidth=OpenLayers.Util._scrollbarWidth;}
+return scrollbarWidth;};OpenLayers.Util.getFormattedLonLat=function(coordinate,axis,dmsOption){if(!dmsOption){dmsOption='dms';}
+coordinate=(coordinate+540)%360-180;var abscoordinate=Math.abs(coordinate);var coordinatedegrees=Math.floor(abscoordinate);var coordinateminutes=(abscoordinate-coordinatedegrees)/(1/60);var tempcoordinateminutes=coordinateminutes;coordinateminutes=Math.floor(coordinateminutes);var coordinateseconds=(tempcoordinateminutes-coordinateminutes)/(1/60);coordinateseconds=Math.round(coordinateseconds*10);coordinateseconds/=10;if(coordinateseconds>=60){coordinateseconds-=60;coordinateminutes+=1;if(coordinateminutes>=60){coordinateminutes-=60;coordinatedegrees+=1;}}
+if(coordinatedegrees<10){coordinatedegrees="0"+coordinatedegrees;}
+var str=coordinatedegrees+"\u00B0";if(dmsOption.indexOf('dm')>=0){if(coordinateminutes<10){coordinateminutes="0"+coordinateminutes;}
+str+=coordinateminutes+"'";if(dmsOption.indexOf('dms')>=0){if(coordinateseconds<10){coordinateseconds="0"+coordinateseconds;}
+str+=coordinateseconds+'"';}}
+if(axis=="lon"){str+=coordinate<0?OpenLayers.i18n("W"):OpenLayers.i18n("E");}else{str+=coordinate<0?OpenLayers.i18n("S"):OpenLayers.i18n("N");}
+return str;};OpenLayers.Format=OpenLayers.Class({options:null,externalProjection:null,internalProjection:null,data:null,keepData:false,initialize:function(options){OpenLayers.Util.extend(this,options);this.options=options;},destroy:function(){},read:function(data){OpenLayers.Console.userError(OpenLayers.i18n("readNotImplemented"));},write:function(object){OpenLayers.Console.userError(OpenLayers.i18n("writeNotImplemented"));},CLASS_NAME:"OpenLayers.Format"});OpenLayers.Feature=OpenLayers.Class({layer:null,id:null,lonlat:null,data:null,marker:null,popupClass:null,popup:null,initialize:function(layer,lonlat,data){this.layer=layer;this.lonlat=lonlat;this.data=(data!=null)?data:{};this.id=OpenLayers.Util.createUniqueID(this.CLASS_NAME+"_");},destroy:function(){if((this.layer!=null)&&(this.layer.map!=null)){if(this.popup!=null){this.layer.map.removePopup(this.popup);}}
+if(this.layer!=null&&this.marker!=null){this.layer.removeMarker(this.marker);}
+this.layer=null;this.id=null;this.lonlat=null;this.data=null;if(this.marker!=null){this.destroyMarker(this.marker);this.marker=null;}
+if(this.popup!=null){this.destroyPopup(this.popup);this.popup=null;}},onScreen:function(){var onScreen=false;if((this.layer!=null)&&(this.layer.map!=null)){var screenBounds=this.layer.map.getExtent();onScreen=screenBounds.containsLonLat(this.lonlat);}
+return onScreen;},createMarker:function(){if(this.lonlat!=null){this.marker=new OpenLayers.Marker(this.lonlat,this.data.icon);}
+return this.marker;},destroyMarker:function(){this.marker.destroy();},createPopup:function(closeBox){if(this.lonlat!=null){if(!this.popup){var anchor=(this.marker)?this.marker.icon:null;var popupClass=this.popupClass?this.popupClass:OpenLayers.Popup.AnchoredBubble;this.popup=new popupClass(this.id+"_popup",this.lonlat,this.data.popupSize,this.data.popupContentHTML,anchor,closeBox);}
+if(this.data.overflow!=null){this.popup.contentDiv.style.overflow=this.data.overflow;}
+this.popup.feature=this;}
+return this.popup;},destroyPopup:function(){if(this.popup){this.popup.feature=null;this.popup.destroy();this.popup=null;}},CLASS_NAME:"OpenLayers.Feature"});OpenLayers.State={UNKNOWN:'Unknown',INSERT:'Insert',UPDATE:'Update',DELETE:'Delete'};OpenLayers.Feature.Vector=OpenLayers.Class(OpenLayers.Feature,{fid:null,geometry:null,attributes:null,bounds:null,state:null,style:null,url:null,renderIntent:"default",modified:null,initialize:function(geometry,attributes,style){OpenLayers.Feature.prototype.initialize.apply(this,[null,null,attributes]);this.lonlat=null;this.geometry=geometry?geometry:null;this.state=null;this.attributes={};if(attributes){this.attributes=OpenLayers.Util.extend(this.attributes,attributes);}
+this.style=style?style:null;},destroy:function(){if(this.layer){this.layer.removeFeatures(this);this.layer=null;}
+this.geometry=null;this.modified=null;OpenLayers.Feature.prototype.destroy.apply(this,arguments);},clone:function(){return new OpenLayers.Feature.Vector(this.geometry?this.geometry.clone():null,this.attributes,this.style);},onScreen:function(boundsOnly){var onScreen=false;if(this.layer&&this.layer.map){var screenBounds=this.layer.map.getExtent();if(boundsOnly){var featureBounds=this.geometry.getBounds();onScreen=screenBounds.intersectsBounds(featureBounds);}else{var screenPoly=screenBounds.toGeometry();onScreen=screenPoly.intersects(this.geometry);}}
+return onScreen;},getVisibility:function(){return!(this.style&&this.style.display=='none'||!this.layer||this.layer&&this.layer.styleMap&&this.layer.styleMap.createSymbolizer(this,this.renderIntent).display=='none'||this.layer&&!this.layer.getVisibility());},createMarker:function(){return null;},destroyMarker:function(){},createPopup:function(){return null;},atPoint:function(lonlat,toleranceLon,toleranceLat){var atPoint=false;if(this.geometry){atPoint=this.geometry.atPoint(lonlat,toleranceLon,toleranceLat);}
+return atPoint;},destroyPopup:function(){},move:function(location){if(!this.layer||!this.geometry.move){return undefined;}
+var pixel;if(location.CLASS_NAME=="OpenLayers.LonLat"){pixel=this.layer.getViewPortPxFromLonLat(location);}else{pixel=location;}
+var lastPixel=this.layer.getViewPortPxFromLonLat(this.geometry.getBounds().getCenterLonLat());var res=this.layer.map.getResolution();this.geometry.move(res*(pixel.x-lastPixel.x),res*(lastPixel.y-pixel.y));this.layer.drawFeature(this);return lastPixel;},toState:function(state){if(state==OpenLayers.State.UPDATE){switch(this.state){case OpenLayers.State.UNKNOWN:case OpenLayers.State.DELETE:this.state=state;break;case OpenLayers.State.UPDATE:case OpenLayers.State.INSERT:break;}}else if(state==OpenLayers.State.INSERT){switch(this.state){case OpenLayers.State.UNKNOWN:break;default:this.state=state;break;}}else if(state==OpenLayers.State.DELETE){switch(this.state){case OpenLayers.State.INSERT:break;case OpenLayers.State.DELETE:break;case OpenLayers.State.UNKNOWN:case OpenLayers.State.UPDATE:this.state=state;break;}}else if(state==OpenLayers.State.UNKNOWN){this.state=state;}},CLASS_NAME:"OpenLayers.Feature.Vector"});OpenLayers.Feature.Vector.style={'default':{fillColor:"#ee9900",fillOpacity:0.4,hoverFillColor:"white",hoverFillOpacity:0.8,strokeColor:"#ee9900",strokeOpacity:1,strokeWidth:1,strokeLinecap:"round",strokeDashstyle:"solid",hoverStrokeColor:"red",hoverStrokeOpacity:1,hoverStrokeWidth:0.2,pointRadius:6,hoverPointRadius:1,hoverPointUnit:"%",pointerEvents:"visiblePainted",cursor:"inherit"},'select':{fillColor:"blue",fillOpacity:0.4,hoverFillColor:"white",hoverFillOpacity:0.8,strokeColor:"blue",strokeOpacity:1,strokeWidth:2,strokeLinecap:"round",strokeDashstyle:"solid",hoverStrokeColor:"red",hoverStrokeOpacity:1,hoverStrokeWidth:0.2,pointRadius:6,hoverPointRadius:1,hoverPointUnit:"%",pointerEvents:"visiblePainted",cursor:"pointer"},'temporary':{fillColor:"#66cccc",fillOpacity:0.2,hoverFillColor:"white",hoverFillOpacity:0.8,strokeColor:"#66cccc",strokeOpacity:1,strokeLinecap:"round",strokeWidth:2,strokeDashstyle:"solid",hoverStrokeColor:"red",hoverStrokeOpacity:1,hoverStrokeWidth:0.2,pointRadius:6,hoverPointRadius:1,hoverPointUnit:"%",pointerEvents:"visiblePainted",cursor:"inherit"},'delete':{display:"none"}};OpenLayers.Format.WKT=OpenLayers.Class(OpenLayers.Format,{initialize:function(options){this.regExes={'typeStr':/^\s*(\w+)\s*\(\s*(.*)\s*\)\s*$/,'spaces':/\s+/,'parenComma':/\)\s*,\s*\(/,'doubleParenComma':/\)\s*\)\s*,\s*\(\s*\(/,'trimParens':/^\s*\(?(.*?)\)?\s*$/};OpenLayers.Format.prototype.initialize.apply(this,[options]);},read:function(wkt){var features,type,str;wkt=wkt.replace(/[\n\r]/g," ");var matches=this.regExes.typeStr.exec(wkt);if(matches){type=matches[1].toLowerCase();str=matches[2];if(this.parse[type]){features=this.parse[type].apply(this,[str]);}
+if(this.internalProjection&&this.externalProjection){if(features&&features.CLASS_NAME=="OpenLayers.Feature.Vector"){features.geometry.transform(this.externalProjection,this.internalProjection);}else if(features&&type!="geometrycollection"&&typeof features=="object"){for(var i=0,len=features.length;i<len;i++){var component=features[i];component.geometry.transform(this.externalProjection,this.internalProjection);}}}}
+return features;},write:function(features){var collection,geometry,type,data,isCollection;if(features.constructor==Array){collection=features;isCollection=true;}else{collection=[features];isCollection=false;}
+var pieces=[];if(isCollection){pieces.push('GEOMETRYCOLLECTION(');}
+for(var i=0,len=collection.length;i<len;++i){if(isCollection&&i>0){pieces.push(',');}
+geometry=collection[i].geometry;pieces.push(this.extractGeometry(geometry));}
+if(isCollection){pieces.push(')');}
+return pieces.join('');},extractGeometry:function(geometry){var type=geometry.CLASS_NAME.split('.')[2].toLowerCase();if(!this.extract[type]){return null;}
+if(this.internalProjection&&this.externalProjection){geometry=geometry.clone();geometry.transform(this.internalProjection,this.externalProjection);}
+var wktType=type=='collection'?'GEOMETRYCOLLECTION':type.toUpperCase();var data=wktType+'('+this.extract[type].apply(this,[geometry])+')';return data;},extract:{'point':function(point){return point.x+' '+point.y;},'multipoint':function(multipoint){var array=[];for(var i=0,len=multipoint.components.length;i<len;++i){array.push('('+
+this.extract.point.apply(this,[multipoint.components[i]])+')');}
+return array.join(',');},'linestring':function(linestring){var array=[];for(var i=0,len=linestring.components.length;i<len;++i){array.push(this.extract.point.apply(this,[linestring.components[i]]));}
+return array.join(',');},'multilinestring':function(multilinestring){var array=[];for(var i=0,len=multilinestring.components.length;i<len;++i){array.push('('+
+this.extract.linestring.apply(this,[multilinestring.components[i]])+')');}
+return array.join(',');},'polygon':function(polygon){var array=[];for(var i=0,len=polygon.components.length;i<len;++i){array.push('('+
+this.extract.linestring.apply(this,[polygon.components[i]])+')');}
+return array.join(',');},'multipolygon':function(multipolygon){var array=[];for(var i=0,len=multipolygon.components.length;i<len;++i){array.push('('+
+this.extract.polygon.apply(this,[multipolygon.components[i]])+')');}
+return array.join(',');},'collection':function(collection){var array=[];for(var i=0,len=collection.components.length;i<len;++i){array.push(this.extractGeometry.apply(this,[collection.components[i]]));}
+return array.join(',');}},parse:{'point':function(str){var coords=OpenLayers.String.trim(str).split(this.regExes.spaces);return new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(coords[0],coords[1]));},'multipoint':function(str){var point;var points=OpenLayers.String.trim(str).split(',');var components=[];for(var i=0,len=points.length;i<len;++i){point=points[i].replace(this.regExes.trimParens,'$1');components.push(this.parse.point.apply(this,[point]).geometry);}
+return new OpenLayers.Feature.Vector(new OpenLayers.Geometry.MultiPoint(components));},'linestring':function(str){var points=OpenLayers.String.trim(str).split(',');var components=[];for(var i=0,len=points.length;i<len;++i){components.push(this.parse.point.apply(this,[points[i]]).geometry);}
+return new OpenLayers.Feature.Vector(new OpenLayers.Geometry.LineString(components));},'multilinestring':function(str){var line;var lines=OpenLayers.String.trim(str).split(this.regExes.parenComma);var components=[];for(var i=0,len=lines.length;i<len;++i){line=lines[i].replace(this.regExes.trimParens,'$1');components.push(this.parse.linestring.apply(this,[line]).geometry);}
+return new OpenLayers.Feature.Vector(new OpenLayers.Geometry.MultiLineString(components));},'polygon':function(str){var ring,linestring,linearring;var rings=OpenLayers.String.trim(str).split(this.regExes.parenComma);var components=[];for(var i=0,len=rings.length;i<len;++i){ring=rings[i].replace(this.regExes.trimParens,'$1');linestring=this.parse.linestring.apply(this,[ring]).geometry;linearring=new OpenLayers.Geometry.LinearRing(linestring.components);components.push(linearring);}
+return new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Polygon(components));},'multipolygon':function(str){var polygon;var polygons=OpenLayers.String.trim(str).split(this.regExes.doubleParenComma);var components=[];for(var i=0,len=polygons.length;i<len;++i){polygon=polygons[i].replace(this.regExes.trimParens,'$1');components.push(this.parse.polygon.apply(this,[polygon]).geometry);}
+return new OpenLayers.Feature.Vector(new OpenLayers.Geometry.MultiPolygon(components));},'geometrycollection':function(str){str=str.replace(/,\s*([A-Za-z])/g,'|$1');var wktArray=OpenLayers.String.trim(str).split('|');var components=[];for(var i=0,len=wktArray.length;i<len;++i){components.push(OpenLayers.Format.WKT.prototype.read.apply(this,[wktArray[i]]));}
+return components;}},CLASS_NAME:"OpenLayers.Format.WKT"});OpenLayers.Geometry=OpenLayers.Class({id:null,parent:null,bounds:null,initialize:function(){this.id=OpenLayers.Util.createUniqueID(this.CLASS_NAME+"_");},destroy:function(){this.id=null;this.bounds=null;},clone:function(){return new OpenLayers.Geometry();},setBounds:function(bounds){if(bounds){this.bounds=bounds.clone();}},clearBounds:function(){this.bounds=null;if(this.parent){this.parent.clearBounds();}},extendBounds:function(newBounds){var bounds=this.getBounds();if(!bounds){this.setBounds(newBounds);}else{this.bounds.extend(newBounds);}},getBounds:function(){if(this.bounds==null){this.calculateBounds();}
+return this.bounds;},calculateBounds:function(){},distanceTo:function(geometry,options){},getVertices:function(nodes){},atPoint:function(lonlat,toleranceLon,toleranceLat){var atPoint=false;var bounds=this.getBounds();if((bounds!=null)&&(lonlat!=null)){var dX=(toleranceLon!=null)?toleranceLon:0;var dY=(toleranceLat!=null)?toleranceLat:0;var toleranceBounds=new OpenLayers.Bounds(this.bounds.left-dX,this.bounds.bottom-dY,this.bounds.right+dX,this.bounds.top+dY);atPoint=toleranceBounds.containsLonLat(lonlat);}
+return atPoint;},getLength:function(){return 0.0;},getArea:function(){return 0.0;},getCentroid:function(){return null;},toString:function(){return OpenLayers.Format.WKT.prototype.write(new OpenLayers.Feature.Vector(this));},CLASS_NAME:"OpenLayers.Geometry"});OpenLayers.Geometry.fromWKT=function(wkt){var format=arguments.callee.format;if(!format){format=new OpenLayers.Format.WKT();arguments.callee.format=format;}
+var geom;var result=format.read(wkt);if(result instanceof OpenLayers.Feature.Vector){geom=result.geometry;}else if(OpenLayers.Util.isArray(result)){var len=result.length;var components=new Array(len);for(var i=0;i<len;++i){components[i]=result[i].geometry;}
+geom=new OpenLayers.Geometry.Collection(components);}
+return geom;};OpenLayers.Geometry.segmentsIntersect=function(seg1,seg2,options){var point=options&&options.point;var tolerance=options&&options.tolerance;var intersection=false;var x11_21=seg1.x1-seg2.x1;var y11_21=seg1.y1-seg2.y1;var x12_11=seg1.x2-seg1.x1;var y12_11=seg1.y2-seg1.y1;var y22_21=seg2.y2-seg2.y1;var x22_21=seg2.x2-seg2.x1;var d=(y22_21*x12_11)-(x22_21*y12_11);var n1=(x22_21*y11_21)-(y22_21*x11_21);var n2=(x12_11*y11_21)-(y12_11*x11_21);if(d==0){if(n1==0&&n2==0){intersection=true;}}else{var along1=n1/d;var along2=n2/d;if(along1>=0&&along1<=1&&along2>=0&&along2<=1){if(!point){intersection=true;}else{var x=seg1.x1+(along1*x12_11);var y=seg1.y1+(along1*y12_11);intersection=new OpenLayers.Geometry.Point(x,y);}}}
+if(tolerance){var dist;if(intersection){if(point){var segs=[seg1,seg2];var seg,x,y;outer:for(var i=0;i<2;++i){seg=segs[i];for(var j=1;j<3;++j){x=seg["x"+j];y=seg["y"+j];dist=Math.sqrt(Math.pow(x-intersection.x,2)+
+Math.pow(y-intersection.y,2));if(dist<tolerance){intersection.x=x;intersection.y=y;break outer;}}}}}else{var segs=[seg1,seg2];var source,target,x,y,p,result;outer:for(var i=0;i<2;++i){source=segs[i];target=segs[(i+1)%2];for(var j=1;j<3;++j){p={x:source["x"+j],y:source["y"+j]};result=OpenLayers.Geometry.distanceToSegment(p,target);if(result.distance<tolerance){if(point){intersection=new OpenLayers.Geometry.Point(p.x,p.y);}else{intersection=true;}
+break outer;}}}}}
+return intersection;};OpenLayers.Geometry.distanceToSegment=function(point,segment){var x0=point.x;var y0=point.y;var x1=segment.x1;var y1=segment.y1;var x2=segment.x2;var y2=segment.y2;var dx=x2-x1;var dy=y2-y1;var along=((dx*(x0-x1))+(dy*(y0-y1)))/(Math.pow(dx,2)+Math.pow(dy,2));var x,y;if(along<=0.0){x=x1;y=y1;}else if(along>=1.0){x=x2;y=y2;}else{x=x1+along*dx;y=y1+along*dy;}
+return{distance:Math.sqrt(Math.pow(x-x0,2)+Math.pow(y-y0,2)),x:x,y:y};};OpenLayers.Geometry.Collection=OpenLayers.Class(OpenLayers.Geometry,{components:null,componentTypes:null,initialize:function(components){OpenLayers.Geometry.prototype.initialize.apply(this,arguments);this.components=[];if(components!=null){this.addComponents(components);}},destroy:function(){this.components.length=0;this.components=null;OpenLayers.Geometry.prototype.destroy.apply(this,arguments);},clone:function(){var geometry=eval("new "+this.CLASS_NAME+"()");for(var i=0,len=this.components.length;i<len;i++){geometry.addComponent(this.components[i].clone());}
+OpenLayers.Util.applyDefaults(geometry,this);return geometry;},getComponentsString:function(){var strings=[];for(var i=0,len=this.components.length;i<len;i++){strings.push(this.components[i].toShortString());}
+return strings.join(",");},calculateBounds:function(){this.bounds=null;var bounds=new OpenLayers.Bounds();var components=this.components;if(components){for(var i=0,len=components.length;i<len;i++){bounds.extend(components[i].getBounds());}}
+if(bounds.left!=null&&bounds.bottom!=null&&bounds.right!=null&&bounds.top!=null){this.setBounds(bounds);}},addComponents:function(components){if(!(OpenLayers.Util.isArray(components))){components=[components];}
+for(var i=0,len=components.length;i<len;i++){this.addComponent(components[i]);}},addComponent:function(component,index){var added=false;if(component){if(this.componentTypes==null||(OpenLayers.Util.indexOf(this.componentTypes,component.CLASS_NAME)>-1)){if(index!=null&&(index<this.components.length)){var components1=this.components.slice(0,index);var components2=this.components.slice(index,this.components.length);components1.push(component);this.components=components1.concat(components2);}else{this.components.push(component);}
+component.parent=this;this.clearBounds();added=true;}}
+return added;},removeComponents:function(components){var removed=false;if(!(OpenLayers.Util.isArray(components))){components=[components];}
+for(var i=components.length-1;i>=0;--i){removed=this.removeComponent(components[i])||removed;}
+return removed;},removeComponent:function(component){OpenLayers.Util.removeItem(this.components,component);this.clearBounds();return true;},getLength:function(){var length=0.0;for(var i=0,len=this.components.length;i<len;i++){length+=this.components[i].getLength();}
+return length;},getArea:function(){var area=0.0;for(var i=0,len=this.components.length;i<len;i++){area+=this.components[i].getArea();}
+return area;},getGeodesicArea:function(projection){var area=0.0;for(var i=0,len=this.components.length;i<len;i++){area+=this.components[i].getGeodesicArea(projection);}
+return area;},getCentroid:function(weighted){if(!weighted){return this.components.length&&this.components[0].getCentroid();}
+var len=this.components.length;if(!len){return false;}
+var areas=[];var centroids=[];var areaSum=0;var minArea=Number.MAX_VALUE;var component;for(var i=0;i<len;++i){component=this.components[i];var area=component.getArea();var centroid=component.getCentroid(true);if(isNaN(area)||isNaN(centroid.x)||isNaN(centroid.y)){continue;}
+areas.push(area);areaSum+=area;minArea=(area<minArea&&area>0)?area:minArea;centroids.push(centroid);}
+len=areas.length;if(areaSum===0){for(var i=0;i<len;++i){areas[i]=1;}
+areaSum=areas.length;}else{for(var i=0;i<len;++i){areas[i]/=minArea;}
+areaSum/=minArea;}
+var xSum=0,ySum=0,centroid,area;for(var i=0;i<len;++i){centroid=centroids[i];area=areas[i];xSum+=centroid.x*area;ySum+=centroid.y*area;}
+return new OpenLayers.Geometry.Point(xSum/areaSum,ySum/areaSum);},getGeodesicLength:function(projection){var length=0.0;for(var i=0,len=this.components.length;i<len;i++){length+=this.components[i].getGeodesicLength(projection);}
+return length;},move:function(x,y){for(var i=0,len=this.components.length;i<len;i++){this.components[i].move(x,y);}},rotate:function(angle,origin){for(var i=0,len=this.components.length;i<len;++i){this.components[i].rotate(angle,origin);}},resize:function(scale,origin,ratio){for(var i=0;i<this.components.length;++i){this.components[i].resize(scale,origin,ratio);}
+return this;},distanceTo:function(geometry,options){var edge=!(options&&options.edge===false);var details=edge&&options&&options.details;var result,best,distance;var min=Number.POSITIVE_INFINITY;for(var i=0,len=this.components.length;i<len;++i){result=this.components[i].distanceTo(geometry,options);distance=details?result.distance:result;if(distance<min){min=distance;best=result;if(min==0){break;}}}
+return best;},equals:function(geometry){var equivalent=true;if(!geometry||!geometry.CLASS_NAME||(this.CLASS_NAME!=geometry.CLASS_NAME)){equivalent=false;}else if(!(OpenLayers.Util.isArray(geometry.components))||(geometry.components.length!=this.components.length)){equivalent=false;}else{for(var i=0,len=this.components.length;i<len;++i){if(!this.components[i].equals(geometry.components[i])){equivalent=false;break;}}}
+return equivalent;},transform:function(source,dest){if(source&&dest){for(var i=0,len=this.components.length;i<len;i++){var component=this.components[i];component.transform(source,dest);}
+this.bounds=null;}
+return this;},intersects:function(geometry){var intersect=false;for(var i=0,len=this.components.length;i<len;++i){intersect=geometry.intersects(this.components[i]);if(intersect){break;}}
+return intersect;},getVertices:function(nodes){var vertices=[];for(var i=0,len=this.components.length;i<len;++i){Array.prototype.push.apply(vertices,this.components[i].getVertices(nodes));}
+return vertices;},CLASS_NAME:"OpenLayers.Geometry.Collection"});OpenLayers.Geometry.Point=OpenLayers.Class(OpenLayers.Geometry,{x:null,y:null,initialize:function(x,y){OpenLayers.Geometry.prototype.initialize.apply(this,arguments);this.x=parseFloat(x);this.y=parseFloat(y);},clone:function(obj){if(obj==null){obj=new OpenLayers.Geometry.Point(this.x,this.y);}
+OpenLayers.Util.applyDefaults(obj,this);return obj;},calculateBounds:function(){this.bounds=new OpenLayers.Bounds(this.x,this.y,this.x,this.y);},distanceTo:function(geometry,options){var edge=!(options&&options.edge===false);var details=edge&&options&&options.details;var distance,x0,y0,x1,y1,result;if(geometry instanceof OpenLayers.Geometry.Point){x0=this.x;y0=this.y;x1=geometry.x;y1=geometry.y;distance=Math.sqrt(Math.pow(x0-x1,2)+Math.pow(y0-y1,2));result=!details?distance:{x0:x0,y0:y0,x1:x1,y1:y1,distance:distance};}else{result=geometry.distanceTo(this,options);if(details){result={x0:result.x1,y0:result.y1,x1:result.x0,y1:result.y0,distance:result.distance};}}
+return result;},equals:function(geom){var equals=false;if(geom!=null){equals=((this.x==geom.x&&this.y==geom.y)||(isNaN(this.x)&&isNaN(this.y)&&isNaN(geom.x)&&isNaN(geom.y)));}
+return equals;},toShortString:function(){return(this.x+", "+this.y);},move:function(x,y){this.x=this.x+x;this.y=this.y+y;this.clearBounds();},rotate:function(angle,origin){angle*=Math.PI/180;var radius=this.distanceTo(origin);var theta=angle+Math.atan2(this.y-origin.y,this.x-origin.x);this.x=origin.x+(radius*Math.cos(theta));this.y=origin.y+(radius*Math.sin(theta));this.clearBounds();},getCentroid:function(){return new OpenLayers.Geometry.Point(this.x,this.y);},resize:function(scale,origin,ratio){ratio=(ratio==undefined)?1:ratio;this.x=origin.x+(scale*ratio*(this.x-origin.x));this.y=origin.y+(scale*(this.y-origin.y));this.clearBounds();return this;},intersects:function(geometry){var intersect=false;if(geometry.CLASS_NAME=="OpenLayers.Geometry.Point"){intersect=this.equals(geometry);}else{intersect=geometry.intersects(this);}
+return intersect;},transform:function(source,dest){if((source&&dest)){OpenLayers.Projection.transform(this,source,dest);this.bounds=null;}
+return this;},getVertices:function(nodes){return[this];},CLASS_NAME:"OpenLayers.Geometry.Point"});OpenLayers.Geometry.MultiPoint=OpenLayers.Class(OpenLayers.Geometry.Collection,{componentTypes:["OpenLayers.Geometry.Point"],initialize:function(components){OpenLayers.Geometry.Collection.prototype.initialize.apply(this,arguments);},addPoint:function(point,index){this.addComponent(point,index);},removePoint:function(point){this.removeComponent(point);},CLASS_NAME:"OpenLayers.Geometry.MultiPoint"});OpenLayers.Geometry.Curve=OpenLayers.Class(OpenLayers.Geometry.MultiPoint,{componentTypes:["OpenLayers.Geometry.Point"],initialize:function(points){OpenLayers.Geometry.MultiPoint.prototype.initialize.apply(this,arguments);},getLength:function(){var length=0.0;if(this.components&&(this.components.length>1)){for(var i=1,len=this.components.length;i<len;i++){length+=this.components[i-1].distanceTo(this.components[i]);}}
+return length;},getGeodesicLength:function(projection){var geom=this;if(projection){var gg=new OpenLayers.Projection("EPSG:4326");if(!gg.equals(projection)){geom=this.clone().transform(projection,gg);}}
+var length=0.0;if(geom.components&&(geom.components.length>1)){var p1,p2;for(var i=1,len=geom.components.length;i<len;i++){p1=geom.components[i-1];p2=geom.components[i];length+=OpenLayers.Util.distVincenty({lon:p1.x,lat:p1.y},{lon:p2.x,lat:p2.y});}}
+return length*1000;},CLASS_NAME:"OpenLayers.Geometry.Curve"});OpenLayers.Geometry.LineString=OpenLayers.Class(OpenLayers.Geometry.Curve,{initialize:function(points){OpenLayers.Geometry.Curve.prototype.initialize.apply(this,arguments);},removeComponent:function(point){var removed=this.components&&(this.components.length>2);if(removed){OpenLayers.Geometry.Collection.prototype.removeComponent.apply(this,arguments);}
+return removed;},intersects:function(geometry){var intersect=false;var type=geometry.CLASS_NAME;if(type=="OpenLayers.Geometry.LineString"||type=="OpenLayers.Geometry.LinearRing"||type=="OpenLayers.Geometry.Point"){var segs1=this.getSortedSegments();var segs2;if(type=="OpenLayers.Geometry.Point"){segs2=[{x1:geometry.x,y1:geometry.y,x2:geometry.x,y2:geometry.y}];}else{segs2=geometry.getSortedSegments();}
+var seg1,seg1x1,seg1x2,seg1y1,seg1y2,seg2,seg2y1,seg2y2;outer:for(var i=0,len=segs1.length;i<len;++i){seg1=segs1[i];seg1x1=seg1.x1;seg1x2=seg1.x2;seg1y1=seg1.y1;seg1y2=seg1.y2;inner:for(var j=0,jlen=segs2.length;j<jlen;++j){seg2=segs2[j];if(seg2.x1>seg1x2){break;}
+if(seg2.x2<seg1x1){continue;}
+seg2y1=seg2.y1;seg2y2=seg2.y2;if(Math.min(seg2y1,seg2y2)>Math.max(seg1y1,seg1y2)){continue;}
+if(Math.max(seg2y1,seg2y2)<Math.min(seg1y1,seg1y2)){continue;}
+if(OpenLayers.Geometry.segmentsIntersect(seg1,seg2)){intersect=true;break outer;}}}}else{intersect=geometry.intersects(this);}
+return intersect;},getSortedSegments:function(){var numSeg=this.components.length-1;var segments=new Array(numSeg),point1,point2;for(var i=0;i<numSeg;++i){point1=this.components[i];point2=this.components[i+1];if(point1.x<point2.x){segments[i]={x1:point1.x,y1:point1.y,x2:point2.x,y2:point2.y};}else{segments[i]={x1:point2.x,y1:point2.y,x2:point1.x,y2:point1.y};}}
+function byX1(seg1,seg2){return seg1.x1-seg2.x1;}
+return segments.sort(byX1);},splitWithSegment:function(seg,options){var edge=!(options&&options.edge===false);var tolerance=options&&options.tolerance;var lines=[];var verts=this.getVertices();var points=[];var intersections=[];var split=false;var vert1,vert2,point;var node,vertex,target;var interOptions={point:true,tolerance:tolerance};var result=null;for(var i=0,stop=verts.length-2;i<=stop;++i){vert1=verts[i];points.push(vert1.clone());vert2=verts[i+1];target={x1:vert1.x,y1:vert1.y,x2:vert2.x,y2:vert2.y};point=OpenLayers.Geometry.segmentsIntersect(seg,target,interOptions);if(point instanceof OpenLayers.Geometry.Point){if((point.x===seg.x1&&point.y===seg.y1)||(point.x===seg.x2&&point.y===seg.y2)||point.equals(vert1)||point.equals(vert2)){vertex=true;}else{vertex=false;}
+if(vertex||edge){if(!point.equals(intersections[intersections.length-1])){intersections.push(point.clone());}
+if(i===0){if(point.equals(vert1)){continue;}}
+if(point.equals(vert2)){continue;}
+split=true;if(!point.equals(vert1)){points.push(point);}
+lines.push(new OpenLayers.Geometry.LineString(points));points=[point.clone()];}}}
+if(split){points.push(vert2.clone());lines.push(new OpenLayers.Geometry.LineString(points));}
+if(intersections.length>0){var xDir=seg.x1<seg.x2?1:-1;var yDir=seg.y1<seg.y2?1:-1;result={lines:lines,points:intersections.sort(function(p1,p2){return(xDir*p1.x-xDir*p2.x)||(yDir*p1.y-yDir*p2.y);})};}
+return result;},split:function(target,options){var results=null;var mutual=options&&options.mutual;var sourceSplit,targetSplit,sourceParts,targetParts;if(target instanceof OpenLayers.Geometry.LineString){var verts=this.getVertices();var vert1,vert2,seg,splits,lines,point;var points=[];sourceParts=[];for(var i=0,stop=verts.length-2;i<=stop;++i){vert1=verts[i];vert2=verts[i+1];seg={x1:vert1.x,y1:vert1.y,x2:vert2.x,y2:vert2.y};targetParts=targetParts||[target];if(mutual){points.push(vert1.clone());}
+for(var j=0;j<targetParts.length;++j){splits=targetParts[j].splitWithSegment(seg,options);if(splits){lines=splits.lines;if(lines.length>0){lines.unshift(j,1);Array.prototype.splice.apply(targetParts,lines);j+=lines.length-2;}
+if(mutual){for(var k=0,len=splits.points.length;k<len;++k){point=splits.points[k];if(!point.equals(vert1)){points.push(point);sourceParts.push(new OpenLayers.Geometry.LineString(points));if(point.equals(vert2)){points=[];}else{points=[point.clone()];}}}}}}}
+if(mutual&&sourceParts.length>0&&points.length>0){points.push(vert2.clone());sourceParts.push(new OpenLayers.Geometry.LineString(points));}}else{results=target.splitWith(this,options);}
+if(targetParts&&targetParts.length>1){targetSplit=true;}else{targetParts=[];}
+if(sourceParts&&sourceParts.length>1){sourceSplit=true;}else{sourceParts=[];}
+if(targetSplit||sourceSplit){if(mutual){results=[sourceParts,targetParts];}else{results=targetParts;}}
+return results;},splitWith:function(geometry,options){return geometry.split(this,options);},getVertices:function(nodes){var vertices;if(nodes===true){vertices=[this.components[0],this.components[this.components.length-1]];}else if(nodes===false){vertices=this.components.slice(1,this.components.length-1);}else{vertices=this.components.slice();}
+return vertices;},distanceTo:function(geometry,options){var edge=!(options&&options.edge===false);var details=edge&&options&&options.details;var result,best={};var min=Number.POSITIVE_INFINITY;if(geometry instanceof OpenLayers.Geometry.Point){var segs=this.getSortedSegments();var x=geometry.x;var y=geometry.y;var seg;for(var i=0,len=segs.length;i<len;++i){seg=segs[i];result=OpenLayers.Geometry.distanceToSegment(geometry,seg);if(result.distance<min){min=result.distance;best=result;if(min===0){break;}}else{if(seg.x2>x&&((y>seg.y1&&y<seg.y2)||(y<seg.y1&&y>seg.y2))){break;}}}
+if(details){best={distance:best.distance,x0:best.x,y0:best.y,x1:x,y1:y};}else{best=best.distance;}}else if(geometry instanceof OpenLayers.Geometry.LineString){var segs0=this.getSortedSegments();var segs1=geometry.getSortedSegments();var seg0,seg1,intersection,x0,y0;var len1=segs1.length;var interOptions={point:true};outer:for(var i=0,len=segs0.length;i<len;++i){seg0=segs0[i];x0=seg0.x1;y0=seg0.y1;for(var j=0;j<len1;++j){seg1=segs1[j];intersection=OpenLayers.Geometry.segmentsIntersect(seg0,seg1,interOptions);if(intersection){min=0;best={distance:0,x0:intersection.x,y0:intersection.y,x1:intersection.x,y1:intersection.y};break outer;}else{result=OpenLayers.Geometry.distanceToSegment({x:x0,y:y0},seg1);if(result.distance<min){min=result.distance;best={distance:min,x0:x0,y0:y0,x1:result.x,y1:result.y};}}}}
+if(!details){best=best.distance;}
+if(min!==0){if(seg0){result=geometry.distanceTo(new OpenLayers.Geometry.Point(seg0.x2,seg0.y2),options);var dist=details?result.distance:result;if(dist<min){if(details){best={distance:min,x0:result.x1,y0:result.y1,x1:result.x0,y1:result.y0};}else{best=dist;}}}}}else{best=geometry.distanceTo(this,options);if(details){best={distance:best.distance,x0:best.x1,y0:best.y1,x1:best.x0,y1:best.y0};}}
+return best;},simplify:function(tolerance){if(this&&this!==null){var points=this.getVertices();if(points.length<3){return this;}
+var compareNumbers=function(a,b){return(a-b);};var douglasPeuckerReduction=function(points,firstPoint,lastPoint,tolerance){var maxDistance=0;var indexFarthest=0;for(var index=firstPoint,distance;index<lastPoint;index++){distance=perpendicularDistance(points[firstPoint],points[lastPoint],points[index]);if(distance>maxDistance){maxDistance=distance;indexFarthest=index;}}
+if(maxDistance>tolerance&&indexFarthest!=firstPoint){pointIndexsToKeep.push(indexFarthest);douglasPeuckerReduction(points,firstPoint,indexFarthest,tolerance);douglasPeuckerReduction(points,indexFarthest,lastPoint,tolerance);}};var perpendicularDistance=function(point1,point2,point){var area=Math.abs(0.5*(point1.x*point2.y+point2.x*point.y+point.x*point1.y-point2.x*point1.y-point.x*point2.y-point1.x*point.y));var bottom=Math.sqrt(Math.pow(point1.x-point2.x,2)+Math.pow(point1.y-point2.y,2));var height=area/bottom*2;return height;};var firstPoint=0;var lastPoint=points.length-1;var pointIndexsToKeep=[];pointIndexsToKeep.push(firstPoint);pointIndexsToKeep.push(lastPoint);while(points[firstPoint].equals(points[lastPoint])){lastPoint--;pointIndexsToKeep.push(lastPoint);}
+douglasPeuckerReduction(points,firstPoint,lastPoint,tolerance);var returnPoints=[];pointIndexsToKeep.sort(compareNumbers);for(var index=0;index<pointIndexsToKeep.length;index++){returnPoints.push(points[pointIndexsToKeep[index]]);}
+return new OpenLayers.Geometry.LineString(returnPoints);}
+else{return this;}},CLASS_NAME:"OpenLayers.Geometry.LineString"});OpenLayers.Geometry.LinearRing=OpenLayers.Class(OpenLayers.Geometry.LineString,{componentTypes:["OpenLayers.Geometry.Point"],initialize:function(points){OpenLayers.Geometry.LineString.prototype.initialize.apply(this,arguments);},addComponent:function(point,index){var added=false;var lastPoint=this.components.pop();if(index!=null||!point.equals(lastPoint)){added=OpenLayers.Geometry.Collection.prototype.addComponent.apply(this,arguments);}
+var firstPoint=this.components[0];OpenLayers.Geometry.Collection.prototype.addComponent.apply(this,[firstPoint]);return added;},removeComponent:function(point){var removed=this.components&&(this.components.length>3);if(removed){this.components.pop();OpenLayers.Geometry.Collection.prototype.removeComponent.apply(this,arguments);var firstPoint=this.components[0];OpenLayers.Geometry.Collection.prototype.addComponent.apply(this,[firstPoint]);}
+return removed;},move:function(x,y){for(var i=0,len=this.components.length;i<len-1;i++){this.components[i].move(x,y);}},rotate:function(angle,origin){for(var i=0,len=this.components.length;i<len-1;++i){this.components[i].rotate(angle,origin);}},resize:function(scale,origin,ratio){for(var i=0,len=this.components.length;i<len-1;++i){this.components[i].resize(scale,origin,ratio);}
+return this;},transform:function(source,dest){if(source&&dest){for(var i=0,len=this.components.length;i<len-1;i++){var component=this.components[i];component.transform(source,dest);}
+this.bounds=null;}
+return this;},getCentroid:function(){if(this.components&&(this.components.length>2)){var sumX=0.0;var sumY=0.0;for(var i=0;i<this.components.length-1;i++){var b=this.components[i];var c=this.components[i+1];sumX+=(b.x+c.x)*(b.x*c.y-c.x*b.y);sumY+=(b.y+c.y)*(b.x*c.y-c.x*b.y);}
+var area=-1*this.getArea();var x=sumX/(6*area);var y=sumY/(6*area);return new OpenLayers.Geometry.Point(x,y);}else{return null;}},getArea:function(){var area=0.0;if(this.components&&(this.components.length>2)){var sum=0.0;for(var i=0,len=this.components.length;i<len-1;i++){var b=this.components[i];var c=this.components[i+1];sum+=(b.x+c.x)*(c.y-b.y);}
+area=-sum/2.0;}
+return area;},getGeodesicArea:function(projection){var ring=this;if(projection){var gg=new OpenLayers.Projection("EPSG:4326");if(!gg.equals(projection)){ring=this.clone().transform(projection,gg);}}
+var area=0.0;var len=ring.components&&ring.components.length;if(len>2){var p1,p2;for(var i=0;i<len-1;i++){p1=ring.components[i];p2=ring.components[i+1];area+=OpenLayers.Util.rad(p2.x-p1.x)*(2+Math.sin(OpenLayers.Util.rad(p1.y))+
+Math.sin(OpenLayers.Util.rad(p2.y)));}
+area=area*6378137.0*6378137.0/2.0;}
+return area;},containsPoint:function(point){var approx=OpenLayers.Number.limitSigDigs;var digs=14;var px=approx(point.x,digs);var py=approx(point.y,digs);function getX(y,x1,y1,x2,y2){return(((x1-x2)*y)+((x2*y1)-(x1*y2)))/(y1-y2);}
+var numSeg=this.components.length-1;var start,end,x1,y1,x2,y2,cx,cy;var crosses=0;for(var i=0;i<numSeg;++i){start=this.components[i];x1=approx(start.x,digs);y1=approx(start.y,digs);end=this.components[i+1];x2=approx(end.x,digs);y2=approx(end.y,digs);if(y1==y2){if(py==y1){if(x1<=x2&&(px>=x1&&px<=x2)||x1>=x2&&(px<=x1&&px>=x2)){crosses=-1;break;}}
+continue;}
+cx=approx(getX(py,x1,y1,x2,y2),digs);if(cx==px){if(y1<y2&&(py>=y1&&py<=y2)||y1>y2&&(py<=y1&&py>=y2)){crosses=-1;break;}}
+if(cx<=px){continue;}
+if(x1!=x2&&(cx<Math.min(x1,x2)||cx>Math.max(x1,x2))){continue;}
+if(y1<y2&&(py>=y1&&py<y2)||y1>y2&&(py<y1&&py>=y2)){++crosses;}}
+var contained=(crosses==-1)?1:!!(crosses&1);return contained;},intersects:function(geometry){var intersect=false;if(geometry.CLASS_NAME=="OpenLayers.Geometry.Point"){intersect=this.containsPoint(geometry);}else if(geometry.CLASS_NAME=="OpenLayers.Geometry.LineString"){intersect=geometry.intersects(this);}else if(geometry.CLASS_NAME=="OpenLayers.Geometry.LinearRing"){intersect=OpenLayers.Geometry.LineString.prototype.intersects.apply(this,[geometry]);}else{for(var i=0,len=geometry.components.length;i<len;++i){intersect=geometry.components[i].intersects(this);if(intersect){break;}}}
+return intersect;},getVertices:function(nodes){return(nodes===true)?[]:this.components.slice(0,this.components.length-1);},CLASS_NAME:"OpenLayers.Geometry.LinearRing"});OpenLayers.Renderer=OpenLayers.Class({container:null,root:null,extent:null,locked:false,size:null,resolution:null,map:null,initialize:function(containerID,options){this.container=OpenLayers.Util.getElement(containerID);OpenLayers.Util.extend(this,options);},destroy:function(){this.container=null;this.extent=null;this.size=null;this.resolution=null;this.map=null;},supported:function(){return false;},setExtent:function(extent,resolutionChanged){this.extent=extent.clone();if(resolutionChanged){this.resolution=null;}},setSize:function(size){this.size=size.clone();this.resolution=null;},getResolution:function(){this.resolution=this.resolution||this.map.getResolution();return this.resolution;},drawFeature:function(feature,style){if(style==null){style=feature.style;}
+if(feature.geometry){var bounds=feature.geometry.getBounds();if(bounds){if(!bounds.intersectsBounds(this.extent)){style={display:"none"};}
+var rendered=this.drawGeometry(feature.geometry,style,feature.id);if(style.display!="none"&&style.label&&rendered!==false){var location=feature.geometry.getCentroid();if(style.labelXOffset||style.labelYOffset){var xOffset=isNaN(style.labelXOffset)?0:style.labelXOffset;var yOffset=isNaN(style.labelYOffset)?0:style.labelYOffset;var res=this.getResolution();location.move(xOffset*res,yOffset*res);}
+this.drawText(feature.id,style,location);}else{this.removeText(feature.id);}
+return rendered;}}},drawGeometry:function(geometry,style,featureId){},drawText:function(featureId,style,location){},removeText:function(featureId){},clear:function(){},getFeatureIdFromEvent:function(evt){},eraseFeatures:function(features){if(!(OpenLayers.Util.isArray(features))){features=[features];}
+for(var i=0,len=features.length;i<len;++i){var feature=features[i];this.eraseGeometry(feature.geometry,feature.id);this.removeText(feature.id);}},eraseGeometry:function(geometry,featureId){},moveRoot:function(renderer){},getRenderLayerId:function(){return this.container.id;},applyDefaultSymbolizer:function(symbolizer){var result=OpenLayers.Util.extend({},OpenLayers.Renderer.defaultSymbolizer);if(symbolizer.stroke===false){delete result.strokeWidth;delete result.strokeColor;}
+if(symbolizer.fill===false){delete result.fillColor;}
+OpenLayers.Util.extend(result,symbolizer);return result;},CLASS_NAME:"OpenLayers.Renderer"});OpenLayers.Renderer.defaultSymbolizer={fillColor:"#000000",strokeColor:"#000000",strokeWidth:2,fillOpacity:1,strokeOpacity:1,pointRadius:0};OpenLayers.Renderer.Canvas=OpenLayers.Class(OpenLayers.Renderer,{hitDetection:true,hitOverflow:0,canvas:null,features:null,pendingRedraw:false,initialize:function(containerID,options){OpenLayers.Renderer.prototype.initialize.apply(this,arguments);this.root=document.createElement("canvas");this.container.appendChild(this.root);this.canvas=this.root.getContext("2d");this.features={};if(this.hitDetection){this.hitCanvas=document.createElement("canvas");this.hitContext=this.hitCanvas.getContext("2d");}},eraseGeometry:function(geometry,featureId){this.eraseFeatures(this.features[featureId][0]);},supported:function(){var canvas=document.createElement("canvas");return!!canvas.getContext;},setSize:function(size){this.size=size.clone();var root=this.root;root.style.width=size.w+"px";root.style.height=size.h+"px";root.width=size.w;root.height=size.h;this.resolution=null;if(this.hitDetection){var hitCanvas=this.hitCanvas;hitCanvas.style.width=size.w+"px";hitCanvas.style.height=size.h+"px";hitCanvas.width=size.w;hitCanvas.height=size.h;}},drawFeature:function(feature,style){var rendered;if(feature.geometry){style=this.applyDefaultSymbolizer(style||feature.style);var bounds=feature.geometry.getBounds();rendered=(style.display!=="none")&&!!bounds&&bounds.intersectsBounds(this.extent);if(rendered){this.features[feature.id]=[feature,style];}
+else{delete(this.features[feature.id]);}
+this.pendingRedraw=true;}
+if(this.pendingRedraw&&!this.locked){this.redraw();this.pendingRedraw=false;}
+return rendered;},drawGeometry:function(geometry,style,featureId){var className=geometry.CLASS_NAME;if((className=="OpenLayers.Geometry.Collection")||(className=="OpenLayers.Geometry.MultiPoint")||(className=="OpenLayers.Geometry.MultiLineString")||(className=="OpenLayers.Geometry.MultiPolygon")){for(var i=0;i<geometry.components.length;i++){this.drawGeometry(geometry.components[i],style,featureId);}
+return;}
+switch(geometry.CLASS_NAME){case"OpenLayers.Geometry.Point":this.drawPoint(geometry,style,featureId);break;case"OpenLayers.Geometry.LineString":this.drawLineString(geometry,style,featureId);break;case"OpenLayers.Geometry.LinearRing":this.drawLinearRing(geometry,style,featureId);break;case"OpenLayers.Geometry.Polygon":this.drawPolygon(geometry,style,featureId);break;default:break;}},drawExternalGraphic:function(geometry,style,featureId){var img=new Image();if(style.graphicTitle){img.title=style.graphicTitle;}
+var width=style.graphicWidth||style.graphicHeight;var height=style.graphicHeight||style.graphicWidth;width=width?width:style.pointRadius*2;height=height?height:style.pointRadius*2;var xOffset=(style.graphicXOffset!=undefined)?style.graphicXOffset:-(0.5*width);var yOffset=(style.graphicYOffset!=undefined)?style.graphicYOffset:-(0.5*height);var opacity=style.graphicOpacity||style.fillOpacity;var onLoad=function(){if(!this.features[featureId]){return;}
+var pt=this.getLocalXY(geometry);var p0=pt[0];var p1=pt[1];if(!isNaN(p0)&&!isNaN(p1)){var x=(p0+xOffset)|0;var y=(p1+yOffset)|0;var canvas=this.canvas;canvas.globalAlpha=opacity;var factor=OpenLayers.Renderer.Canvas.drawImageScaleFactor||(OpenLayers.Renderer.Canvas.drawImageScaleFactor=/android 2.1/.test(navigator.userAgent.toLowerCase())?320/window.screen.width:1);canvas.drawImage(img,x*factor,y*factor,width*factor,height*factor);if(this.hitDetection){this.setHitContextStyle("fill",featureId);this.hitContext.fillRect(x,y,width,height);}}};img.onload=OpenLayers.Function.bind(onLoad,this);img.src=style.externalGraphic;},setCanvasStyle:function(type,style){if(type==="fill"){this.canvas.globalAlpha=style['fillOpacity'];this.canvas.fillStyle=style['fillColor'];}else if(type==="stroke"){this.canvas.globalAlpha=style['strokeOpacity'];this.canvas.strokeStyle=style['strokeColor'];this.canvas.lineWidth=style['strokeWidth'];}else{this.canvas.globalAlpha=0;this.canvas.lineWidth=1;}},featureIdToHex:function(featureId){var id=Number(featureId.split("_").pop())+1;if(id>=16777216){this.hitOverflow=id-16777215;id=id%16777216+1;}
+var hex="000000"+id.toString(16);var len=hex.length;hex="#"+hex.substring(len-6,len);return hex;},setHitContextStyle:function(type,featureId,symbolizer){var hex=this.featureIdToHex(featureId);if(type=="fill"){this.hitContext.globalAlpha=1.0;this.hitContext.fillStyle=hex;}else if(type=="stroke"){this.hitContext.globalAlpha=1.0;this.hitContext.strokeStyle=hex;this.hitContext.lineWidth=symbolizer.strokeWidth+2;}else{this.hitContext.globalAlpha=0;this.hitContext.lineWidth=1;}},drawPoint:function(geometry,style,featureId){if(style.graphic!==false){if(style.externalGraphic){this.drawExternalGraphic(geometry,style,featureId);}else{var pt=this.getLocalXY(geometry);var p0=pt[0];var p1=pt[1];if(!isNaN(p0)&&!isNaN(p1)){var twoPi=Math.PI*2;var radius=style.pointRadius;if(style.fill!==false){this.setCanvasStyle("fill",style);this.canvas.beginPath();this.canvas.arc(p0,p1,radius,0,twoPi,true);this.canvas.fill();if(this.hitDetection){this.setHitContextStyle("fill",featureId,style);this.hitContext.beginPath();this.hitContext.arc(p0,p1,radius,0,twoPi,true);this.hitContext.fill();}}
+if(style.stroke!==false){this.setCanvasStyle("stroke",style);this.canvas.beginPath();this.canvas.arc(p0,p1,radius,0,twoPi,true);this.canvas.stroke();if(this.hitDetection){this.setHitContextStyle("stroke",featureId,style);this.hitContext.beginPath();this.hitContext.arc(p0,p1,radius,0,twoPi,true);this.hitContext.stroke();}
+this.setCanvasStyle("reset");}}}}},drawLineString:function(geometry,style,featureId){style=OpenLayers.Util.applyDefaults({fill:false},style);this.drawLinearRing(geometry,style,featureId);},drawLinearRing:function(geometry,style,featureId){if(style.fill!==false){this.setCanvasStyle("fill",style);this.renderPath(this.canvas,geometry,style,featureId,"fill");if(this.hitDetection){this.setHitContextStyle("fill",featureId,style);this.renderPath(this.hitContext,geometry,style,featureId,"fill");}}
+if(style.stroke!==false){this.setCanvasStyle("stroke",style);this.renderPath(this.canvas,geometry,style,featureId,"stroke");if(this.hitDetection){this.setHitContextStyle("stroke",featureId,style);this.renderPath(this.hitContext,geometry,style,featureId,"stroke");}}
+this.setCanvasStyle("reset");},renderPath:function(context,geometry,style,featureId,type){var components=geometry.components;var len=components.length;context.beginPath();var start=this.getLocalXY(components[0]);var x=start[0];var y=start[1];if(!isNaN(x)&&!isNaN(y)){context.moveTo(start[0],start[1]);for(var i=1;i<len;++i){var pt=this.getLocalXY(components[i]);context.lineTo(pt[0],pt[1]);}
+if(type==="fill"){context.fill();}else{context.stroke();}}},drawPolygon:function(geometry,style,featureId){var components=geometry.components;var len=components.length;this.drawLinearRing(components[0],style,featureId);for(var i=1;i<len;++i){this.canvas.globalCompositeOperation="destination-out";if(this.hitDetection){this.hitContext.globalCompositeOperation="destination-out";}
+this.drawLinearRing(components[i],OpenLayers.Util.applyDefaults({stroke:false,fillOpacity:1.0},style),featureId);this.canvas.globalCompositeOperation="source-over";if(this.hitDetection){this.hitContext.globalCompositeOperation="source-over";}
+this.drawLinearRing(components[i],OpenLayers.Util.applyDefaults({fill:false},style),featureId);}},drawText:function(location,style){style=OpenLayers.Util.extend({fontColor:"#000000",labelAlign:"cm"},style);var pt=this.getLocalXY(location);this.setCanvasStyle("reset");this.canvas.fillStyle=style.fontColor;this.canvas.globalAlpha=style.fontOpacity||1.0;var fontStyle=[style.fontStyle?style.fontStyle:"normal","normal",style.fontWeight?style.fontWeight:"normal",style.fontSize?style.fontSize:"1em",style.fontFamily?style.fontFamily:"sans-serif"].join(" ");var labelRows=style.label.split('\n');var numRows=labelRows.length;if(this.canvas.fillText){this.canvas.font=fontStyle;this.canvas.textAlign=OpenLayers.Renderer.Canvas.LABEL_ALIGN[style.labelAlign[0]]||"center";this.canvas.textBaseline=OpenLayers.Renderer.Canvas.LABEL_ALIGN[style.labelAlign[1]]||"middle";var vfactor=OpenLayers.Renderer.Canvas.LABEL_FACTOR[style.labelAlign[1]];if(vfactor==null){vfactor=-.5;}
+var lineHeight=this.canvas.measureText('Mg').height||this.canvas.measureText('xx').width;pt[1]+=lineHeight*vfactor*(numRows-1);for(var i=0;i<numRows;i++){this.canvas.fillText(labelRows[i],pt[0],pt[1]+(lineHeight*i));}}else if(this.canvas.mozDrawText){this.canvas.mozTextStyle=fontStyle;var hfactor=OpenLayers.Renderer.Canvas.LABEL_FACTOR[style.labelAlign[0]];if(hfactor==null){hfactor=-.5;}
+var vfactor=OpenLayers.Renderer.Canvas.LABEL_FACTOR[style.labelAlign[1]];if(vfactor==null){vfactor=-.5;}
+var lineHeight=this.canvas.mozMeasureText('xx');pt[1]+=lineHeight*(1+(vfactor*numRows));for(var i=0;i<numRows;i++){var x=pt[0]+(hfactor*this.canvas.mozMeasureText(labelRows[i]));var y=pt[1]+(i*lineHeight);this.canvas.translate(x,y);this.canvas.mozDrawText(labelRows[i]);this.canvas.translate(-x,-y);}}
+this.setCanvasStyle("reset");},getLocalXY:function(point){var resolution=this.getResolution();var extent=this.extent;var x=(point.x/resolution+(-extent.left/resolution));var y=((extent.top/resolution)-point.y/resolution);return[x,y];},clear:function(){var height=this.root.height;var width=this.root.width;this.canvas.clearRect(0,0,width,height);this.features={};if(this.hitDetection){this.hitContext.clearRect(0,0,width,height);}},getFeatureIdFromEvent:function(evt){var feature=null;if(this.hitDetection){if(!this.map.dragging){var xy=evt.xy;var x=xy.x|0;var y=xy.y|0;var data=this.hitContext.getImageData(x,y,1,1).data;if(data[3]===255){var id=data[2]+(256*(data[1]+(256*data[0])));if(id){feature=this.features["OpenLayers.Feature.Vector_"+(id-1+this.hitOverflow)][0];}}}}
+return feature;},eraseFeatures:function(features){if(!(OpenLayers.Util.isArray(features))){features=[features];}
+for(var i=0;i<features.length;++i){delete this.features[features[i].id];}
+this.redraw();},redraw:function(){if(!this.locked){var height=this.root.height;var width=this.root.width;this.canvas.clearRect(0,0,width,height);if(this.hitDetection){this.hitContext.clearRect(0,0,width,height);}
+var labelMap=[];var feature,style;for(var id in this.features){if(!this.features.hasOwnProperty(id)){continue;}
+feature=this.features[id][0];style=this.features[id][1];this.drawGeometry(feature.geometry,style,feature.id);if(style.label){labelMap.push([feature,style]);}}
+var item;for(var i=0,len=labelMap.length;i<len;++i){item=labelMap[i];this.drawText(item[0].geometry.getCentroid(),item[1]);}}},CLASS_NAME:"OpenLayers.Renderer.Canvas"});OpenLayers.Renderer.Canvas.LABEL_ALIGN={"l":"left","r":"right","t":"top","b":"bottom"};OpenLayers.Renderer.Canvas.LABEL_FACTOR={"l":0,"r":-1,"t":0,"b":-1};OpenLayers.Renderer.Canvas.drawImageScaleFactor=null;OpenLayers.Event={observers:false,KEY_BACKSPACE:8,KEY_TAB:9,KEY_RETURN:13,KEY_ESC:27,KEY_LEFT:37,KEY_UP:38,KEY_RIGHT:39,KEY_DOWN:40,KEY_DELETE:46,element:function(event){return event.target||event.srcElement;},isSingleTouch:function(event){return event.touches&&event.touches.length==1;},isMultiTouch:function(event){return event.touches&&event.touches.length>1;},isLeftClick:function(event){return(((event.which)&&(event.which==1))||((event.button)&&(event.button==1)));},isRightClick:function(event){return(((event.which)&&(event.which==3))||((event.button)&&(event.button==2)));},stop:function(event,allowDefault){if(!allowDefault){if(event.preventDefault){event.preventDefault();}else{event.returnValue=false;}}
+if(event.stopPropagation){event.stopPropagation();}else{event.cancelBubble=true;}},findElement:function(event,tagName){var element=OpenLayers.Event.element(event);while(element.parentNode&&(!element.tagName||(element.tagName.toUpperCase()!=tagName.toUpperCase()))){element=element.parentNode;}
+return element;},observe:function(elementParam,name,observer,useCapture){var element=OpenLayers.Util.getElement(elementParam);useCapture=useCapture||false;if(name=='keypress'&&(navigator.appVersion.match(/Konqueror|Safari|KHTML/)||element.attachEvent)){name='keydown';}
+if(!this.observers){this.observers={};}
+if(!element._eventCacheID){var idPrefix="eventCacheID_";if(element.id){idPrefix=element.id+"_"+idPrefix;}
+element._eventCacheID=OpenLayers.Util.createUniqueID(idPrefix);}
+var cacheID=element._eventCacheID;if(!this.observers[cacheID]){this.observers[cacheID]=[];}
+this.observers[cacheID].push({'element':element,'name':name,'observer':observer,'useCapture':useCapture});if(element.addEventListener){element.addEventListener(name,observer,useCapture);}else if(element.attachEvent){element.attachEvent('on'+name,observer);}},stopObservingElement:function(elementParam){var element=OpenLayers.Util.getElement(elementParam);var cacheID=element._eventCacheID;this._removeElementObservers(OpenLayers.Event.observers[cacheID]);},_removeElementObservers:function(elementObservers){if(elementObservers){for(var i=elementObservers.length-1;i>=0;i--){var entry=elementObservers[i];var args=new Array(entry.element,entry.name,entry.observer,entry.useCapture);var removed=OpenLayers.Event.stopObserving.apply(this,args);}}},stopObserving:function(elementParam,name,observer,useCapture){useCapture=useCapture||false;var element=OpenLayers.Util.getElement(elementParam);var cacheID=element._eventCacheID;if(name=='keypress'){if(navigator.appVersion.match(/Konqueror|Safari|KHTML/)||element.detachEvent){name='keydown';}}
+var foundEntry=false;var elementObservers=OpenLayers.Event.observers[cacheID];if(elementObservers){var i=0;while(!foundEntry&&i<elementObservers.length){var cacheEntry=elementObservers[i];if((cacheEntry.name==name)&&(cacheEntry.observer==observer)&&(cacheEntry.useCapture==useCapture)){elementObservers.splice(i,1);if(elementObservers.length==0){delete OpenLayers.Event.observers[cacheID];}
+foundEntry=true;break;}
+i++;}}
+if(foundEntry){if(element.removeEventListener){element.removeEventListener(name,observer,useCapture);}else if(element&&element.detachEvent){element.detachEvent('on'+name,observer);}}
+return foundEntry;},unloadCache:function(){if(OpenLayers.Event&&OpenLayers.Event.observers){for(var cacheID in OpenLayers.Event.observers){var elementObservers=OpenLayers.Event.observers[cacheID];OpenLayers.Event._removeElementObservers.apply(this,[elementObservers]);}
+OpenLayers.Event.observers=false;}},CLASS_NAME:"OpenLayers.Event"};OpenLayers.Event.observe(window,'unload',OpenLayers.Event.unloadCache,false);if(window.Event){OpenLayers.Util.applyDefaults(window.Event,OpenLayers.Event);}else{var Event=OpenLayers.Event;}
+OpenLayers.Events=OpenLayers.Class({BROWSER_EVENTS:["mouseover","mouseout","mousedown","mouseup","mousemove","click","dblclick","rightclick","dblrightclick","resize","focus","blur","touchstart","touchmove","touchend"],listeners:null,object:null,element:null,eventTypes:null,eventHandler:null,fallThrough:null,includeXY:false,clearMouseListener:null,initialize:function(object,element,eventTypes,fallThrough,options){OpenLayers.Util.extend(this,options);this.object=object;this.fallThrough=fallThrough;this.listeners={};this.eventHandler=OpenLayers.Function.bindAsEventListener(this.handleBrowserEvent,this);this.clearMouseListener=OpenLayers.Function.bind(this.clearMouseCache,this);this.eventTypes=[];if(eventTypes!=null){for(var i=0,len=eventTypes.length;i<len;i++){this.addEventType(eventTypes[i]);}}
+if(element!=null){this.attachToElement(element);}},destroy:function(){if(this.element){OpenLayers.Event.stopObservingElement(this.element);if(this.element.hasScrollEvent){OpenLayers.Event.stopObserving(window,"scroll",this.clearMouseListener);}}
+this.element=null;this.listeners=null;this.object=null;this.eventTypes=null;this.fallThrough=null;this.eventHandler=null;},addEventType:function(eventName){if(!this.listeners[eventName]){this.eventTypes.push(eventName);this.listeners[eventName]=[];}},attachToElement:function(element){if(this.element){OpenLayers.Event.stopObservingElement(this.element);}
+this.element=element;for(var i=0,len=this.BROWSER_EVENTS.length;i<len;i++){var eventType=this.BROWSER_EVENTS[i];this.addEventType(eventType);OpenLayers.Event.observe(element,eventType,this.eventHandler);}
+OpenLayers.Event.observe(element,"dragstart",OpenLayers.Event.stop);},on:function(object){for(var type in object){if(type!="scope"){this.register(type,object.scope,object[type]);}}},register:function(type,obj,func){if((func!=null)&&(OpenLayers.Util.indexOf(this.eventTypes,type)!=-1)){if(obj==null){obj=this.object;}
+var listeners=this.listeners[type];listeners.push({obj:obj,func:func});}},registerPriority:function(type,obj,func){if(func!=null){if(obj==null){obj=this.object;}
+var listeners=this.listeners[type];if(listeners!=null){listeners.unshift({obj:obj,func:func});}}},un:function(object){for(var type in object){if(type!="scope"){this.unregister(type,object.scope,object[type]);}}},unregister:function(type,obj,func){if(obj==null){obj=this.object;}
+var listeners=this.listeners[type];if(listeners!=null){for(var i=0,len=listeners.length;i<len;i++){if(listeners[i].obj==obj&&listeners[i].func==func){listeners.splice(i,1);break;}}}},remove:function(type){if(this.listeners[type]!=null){this.listeners[type]=[];}},triggerEvent:function(type,evt){var listeners=this.listeners[type];if(!listeners||listeners.length==0){return undefined;}
+if(evt==null){evt={};}
+evt.object=this.object;evt.element=this.element;if(!evt.type){evt.type=type;}
+listeners=listeners.slice();var continueChain;for(var i=0,len=listeners.length;i<len;i++){var callback=listeners[i];continueChain=callback.func.apply(callback.obj,[evt]);if((continueChain!=undefined)&&(continueChain==false)){break;}}
+if(!this.fallThrough){OpenLayers.Event.stop(evt,true);}
+return continueChain;},handleBrowserEvent:function(evt){var type=evt.type,listeners=this.listeners[type];if(!listeners||listeners.length==0){return;}
+var touches=evt.touches;if(touches&&touches[0]){var x=0;var y=0;var num=touches.length;var touch;for(var i=0;i<num;++i){touch=touches[i];x+=touch.clientX;y+=touch.clientY;}
+evt.clientX=x/num;evt.clientY=y/num;}
+if(this.includeXY){evt.xy=this.getMousePosition(evt);}
+this.triggerEvent(type,evt);},clearMouseCache:function(){this.element.scrolls=null;this.element.lefttop=null;var body=document.body;if(body&&!((body.scrollTop!=0||body.scrollLeft!=0)&&navigator.userAgent.match(/iPhone/i))){this.element.offsets=null;}},getMousePosition:function(evt){if(!this.includeXY){this.clearMouseCache();}else if(!this.element.hasScrollEvent){OpenLayers.Event.observe(window,"scroll",this.clearMouseListener);this.element.hasScrollEvent=true;}
+if(!this.element.scrolls){var viewportElement=OpenLayers.Util.getViewportElement();this.element.scrolls=[viewportElement.scrollLeft,viewportElement.scrollTop];}
+if(!this.element.lefttop){this.element.lefttop=[(document.documentElement.clientLeft||0),(document.documentElement.clientTop||0)];}
+if(!this.element.offsets){this.element.offsets=OpenLayers.Util.pagePosition(this.element);}
+return new OpenLayers.Pixel((evt.clientX+this.element.scrolls[0])-this.element.offsets[0]
+-this.element.lefttop[0],(evt.clientY+this.element.scrolls[1])-this.element.offsets[1]
+-this.element.lefttop[1]);},CLASS_NAME:"OpenLayers.Events"});OpenLayers.Handler=OpenLayers.Class({id:null,control:null,map:null,keyMask:null,active:false,evt:null,initialize:function(control,callbacks,options){OpenLayers.Util.extend(this,options);this.control=control;this.callbacks=callbacks;var map=this.map||control.map;if(map){this.setMap(map);}
+this.id=OpenLayers.Util.createUniqueID(this.CLASS_NAME+"_");},setMap:function(map){this.map=map;},checkModifiers:function(evt){if(this.keyMask==null){return true;}
+var keyModifiers=(evt.shiftKey?OpenLayers.Handler.MOD_SHIFT:0)|(evt.ctrlKey?OpenLayers.Handler.MOD_CTRL:0)|(evt.altKey?OpenLayers.Handler.MOD_ALT:0);return(keyModifiers==this.keyMask);},activate:function(){if(this.active){return false;}
+var events=OpenLayers.Events.prototype.BROWSER_EVENTS;for(var i=0,len=events.length;i<len;i++){if(this[events[i]]){this.register(events[i],this[events[i]]);}}
+this.active=true;return true;},deactivate:function(){if(!this.active){return false;}
+var events=OpenLayers.Events.prototype.BROWSER_EVENTS;for(var i=0,len=events.length;i<len;i++){if(this[events[i]]){this.unregister(events[i],this[events[i]]);}}
+this.active=false;return true;},callback:function(name,args){if(name&&this.callbacks[name]){this.callbacks[name].apply(this.control,args);}},register:function(name,method){this.map.events.registerPriority(name,this,method);this.map.events.registerPriority(name,this,this.setEvent);},unregister:function(name,method){this.map.events.unregister(name,this,method);this.map.events.unregister(name,this,this.setEvent);},setEvent:function(evt){this.evt=evt;return true;},destroy:function(){this.deactivate();this.control=this.map=null;},CLASS_NAME:"OpenLayers.Handler"});OpenLayers.Handler.MOD_NONE=0;OpenLayers.Handler.MOD_SHIFT=1;OpenLayers.Handler.MOD_CTRL=2;OpenLayers.Handler.MOD_ALT=4;OpenLayers.Handler.MouseWheel=OpenLayers.Class(OpenLayers.Handler,{wheelListener:null,mousePosition:null,interval:0,delta:0,cumulative:true,initialize:function(control,callbacks,options){OpenLayers.Handler.prototype.initialize.apply(this,arguments);this.wheelListener=OpenLayers.Function.bindAsEventListener(this.onWheelEvent,this);},destroy:function(){OpenLayers.Handler.prototype.destroy.apply(this,arguments);this.wheelListener=null;},onWheelEvent:function(e){if(!this.map||!this.checkModifiers(e)){return;}
+var overScrollableDiv=false;var overLayerDiv=false;var overMapDiv=false;var elem=OpenLayers.Event.element(e);while((elem!=null)&&!overMapDiv&&!overScrollableDiv){if(!overScrollableDiv){try{if(elem.currentStyle){overflow=elem.currentStyle["overflow"];}else{var style=document.defaultView.getComputedStyle(elem,null);var overflow=style.getPropertyValue("overflow");}
+overScrollableDiv=(overflow&&(overflow=="auto")||(overflow=="scroll"));}catch(err){}}
+if(!overLayerDiv){for(var i=0,len=this.map.layers.length;i<len;i++){if(elem==this.map.layers[i].div||elem==this.map.layers[i].pane){overLayerDiv=true;break;}}}
+overMapDiv=(elem==this.map.div);elem=elem.parentNode;}
+if(!overScrollableDiv&&overMapDiv){if(overLayerDiv){var delta=0;if(!e){e=window.event;}
+if(e.wheelDelta){delta=e.wheelDelta/120;if(window.opera&&window.opera.version()<9.2){delta=-delta;}}else if(e.detail){delta=-e.detail/3;}
+this.delta=this.delta+delta;if(this.interval){window.clearTimeout(this._timeoutId);this._timeoutId=window.setTimeout(OpenLayers.Function.bind(function(){this.wheelZoom(e);},this),this.interval);}else{this.wheelZoom(e);}}
+OpenLayers.Event.stop(e);}},wheelZoom:function(e){var delta=this.delta;this.delta=0;if(delta){if(this.mousePosition){e.xy=this.mousePosition;}
+if(!e.xy){e.xy=this.map.getPixelFromLonLat(this.map.getCenter());}
+if(delta<0){this.callback("down",[e,this.cumulative?delta:-1]);}else{this.callback("up",[e,this.cumulative?delta:1]);}}},mousemove:function(evt){this.mousePosition=evt.xy;},activate:function(evt){if(OpenLayers.Handler.prototype.activate.apply(this,arguments)){var wheelListener=this.wheelListener;OpenLayers.Event.observe(window,"DOMMouseScroll",wheelListener);OpenLayers.Event.observe(window,"mousewheel",wheelListener);OpenLayers.Event.observe(document,"mousewheel",wheelListener);return true;}else{return false;}},deactivate:function(evt){if(OpenLayers.Handler.prototype.deactivate.apply(this,arguments)){var wheelListener=this.wheelListener;OpenLayers.Event.stopObserving(window,"DOMMouseScroll",wheelListener);OpenLayers.Event.stopObserving(window,"mousewheel",wheelListener);OpenLayers.Event.stopObserving(document,"mousewheel",wheelListener);return true;}else{return false;}},CLASS_NAME:"OpenLayers.Handler.MouseWheel"});OpenLayers.Symbolizer=OpenLayers.Class({zIndex:0,initialize:function(config){OpenLayers.Util.extend(this,config);},clone:function(){var Type=eval(this.CLASS_NAME);return new Type(OpenLayers.Util.extend({},this));},CLASS_NAME:"OpenLayers.Symbolizer"});OpenLayers.Symbolizer.Raster=OpenLayers.Class(OpenLayers.Symbolizer,{initialize:function(config){OpenLayers.Symbolizer.prototype.initialize.apply(this,arguments);},CLASS_NAME:"OpenLayers.Symbolizer.Raster"});OpenLayers.Tile=OpenLayers.Class({EVENT_TYPES:["loadstart","loadend","reload","unload"],events:null,id:null,layer:null,url:null,bounds:null,size:null,position:null,isLoading:false,initialize:function(layer,position,bounds,url,size,options){this.layer=layer;this.position=position.clone();this.bounds=bounds.clone();this.url=url;if(size){this.size=size.clone();}
+this.id=OpenLayers.Util.createUniqueID("Tile_");this.events=new OpenLayers.Events(this,null,this.EVENT_TYPES);OpenLayers.Util.extend(this,options);},unload:function(){if(this.isLoading){this.isLoading=false;this.events.triggerEvent("unload");}},destroy:function(){this.layer=null;this.bounds=null;this.size=null;this.position=null;this.events.destroy();this.events=null;},clone:function(obj){if(obj==null){obj=new OpenLayers.Tile(this.layer,this.position,this.bounds,this.url,this.size);}
+OpenLayers.Util.applyDefaults(obj,this);return obj;},draw:function(){var maxExtent=this.layer.maxExtent;var withinMaxExtent=(maxExtent&&this.bounds.intersectsBounds(maxExtent,false));this.shouldDraw=(withinMaxExtent||this.layer.displayOutsideMaxExtent);this.clear();return this.shouldDraw;},moveTo:function(bounds,position,redraw){if(redraw==null){redraw=true;}
+this.bounds=bounds.clone();this.position=position.clone();if(redraw){this.draw();}},clear:function(){},getBoundsFromBaseLayer:function(position){var msg=OpenLayers.i18n('reprojectDeprecated',{'layerName':this.layer.name});OpenLayers.Console.warn(msg);var topLeft=this.layer.map.getLonLatFromLayerPx(position);var bottomRightPx=position.clone();bottomRightPx.x+=this.size.w;bottomRightPx.y+=this.size.h;var bottomRight=this.layer.map.getLonLatFromLayerPx(bottomRightPx);if(topLeft.lon>bottomRight.lon){if(topLeft.lon<0){topLeft.lon=-180-(topLeft.lon+180);}else{bottomRight.lon=180+bottomRight.lon+180;}}
+var bounds=new OpenLayers.Bounds(topLeft.lon,bottomRight.lat,bottomRight.lon,topLeft.lat);return bounds;},showTile:function(){if(this.shouldDraw){this.show();}},show:function(){},hide:function(){},CLASS_NAME:"OpenLayers.Tile"});OpenLayers.Tile.Image=OpenLayers.Class(OpenLayers.Tile,{url:null,imgDiv:null,frame:null,layerAlphaHack:null,isBackBuffer:false,isFirstDraw:true,backBufferTile:null,maxGetUrlLength:null,initialize:function(layer,position,bounds,url,size,options){OpenLayers.Tile.prototype.initialize.apply(this,arguments);if(this.maxGetUrlLength!=null){OpenLayers.Util.extend(this,OpenLayers.Tile.Image.IFrame);}
+this.url=url;this.frame=document.createElement('div');this.frame.style.overflow='hidden';this.frame.style.position='absolute';this.layerAlphaHack=this.layer.alpha&&OpenLayers.Util.alphaHack();},destroy:function(){if(this.imgDiv!=null){this.removeImgDiv();}
+this.imgDiv=null;if((this.frame!=null)&&(this.frame.parentNode==this.layer.div)){this.layer.div.removeChild(this.frame);}
+this.frame=null;if(this.backBufferTile){this.backBufferTile.destroy();this.backBufferTile=null;}
+this.layer.events.unregister("loadend",this,this.resetBackBuffer);OpenLayers.Tile.prototype.destroy.apply(this,arguments);},clone:function(obj){if(obj==null){obj=new OpenLayers.Tile.Image(this.layer,this.position,this.bounds,this.url,this.size);}
+obj=OpenLayers.Tile.prototype.clone.apply(this,[obj]);obj.imgDiv=null;return obj;},draw:function(){if(this.layer!=this.layer.map.baseLayer&&this.layer.reproject){this.bounds=this.getBoundsFromBaseLayer(this.position);}
+var drawTile=OpenLayers.Tile.prototype.draw.apply(this,arguments);if((OpenLayers.Util.indexOf(this.layer.SUPPORTED_TRANSITIONS,this.layer.transitionEffect)!=-1)||this.layer.singleTile){if(drawTile){if(!this.backBufferTile){this.backBufferTile=this.clone();this.backBufferTile.hide();this.backBufferTile.isBackBuffer=true;this.events.register('loadend',this,this.resetBackBuffer);this.layer.events.register("loadend",this,this.resetBackBuffer);}
+this.startTransition();}else{if(this.backBufferTile){this.backBufferTile.clear();}}}else{if(drawTile&&this.isFirstDraw){this.events.register('loadend',this,this.showTile);this.isFirstDraw=false;}}
+if(!drawTile){return false;}
+if(this.isLoading){this.events.triggerEvent("reload");}else{this.isLoading=true;this.events.triggerEvent("loadstart");}
+return this.renderTile();},resetBackBuffer:function(){this.showTile();if(this.backBufferTile&&(this.isFirstDraw||!this.layer.numLoadingTiles)){this.isFirstDraw=false;var maxExtent=this.layer.maxExtent;var withinMaxExtent=(maxExtent&&this.bounds.intersectsBounds(maxExtent,false));if(withinMaxExtent){this.backBufferTile.position=this.position;this.backBufferTile.bounds=this.bounds;this.backBufferTile.size=this.size;this.backBufferTile.imageSize=this.layer.getImageSize(this.bounds)||this.size;this.backBufferTile.imageOffset=this.layer.imageOffset;this.backBufferTile.resolution=this.layer.getResolution();this.backBufferTile.renderTile();}
+this.backBufferTile.hide();}},renderTile:function(){if(this.layer.async){this.initImgDiv();this.layer.getURLasync(this.bounds,this,"url",this.positionImage);}else{this.url=this.layer.getURL(this.bounds);this.initImgDiv();this.positionImage();}
+return true;},positionImage:function(){if(this.layer===null){return;}
+OpenLayers.Util.modifyDOMElement(this.frame,null,this.position,this.size);var imageSize=this.layer.getImageSize(this.bounds);if(this.layerAlphaHack){OpenLayers.Util.modifyAlphaImageDiv(this.imgDiv,null,null,imageSize,this.url);}else{OpenLayers.Util.modifyDOMElement(this.imgDiv,null,null,imageSize);this.imgDiv.src=this.url;}},clear:function(){if(this.imgDiv){this.hide();if(OpenLayers.Tile.Image.useBlankTile){this.imgDiv.src=OpenLayers.Util.getImagesLocation()+"blank.gif";}}},initImgDiv:function(){if(this.imgDiv==null){var offset=this.layer.imageOffset;var size=this.layer.getImageSize(this.bounds);if(this.layerAlphaHack){this.imgDiv=OpenLayers.Util.createAlphaImageDiv(null,offset,size,null,"relative",null,null,null,true);}else{this.imgDiv=OpenLayers.Util.createImage(null,offset,size,null,"relative",null,null,true);}
+if(OpenLayers.Util.isArray(this.layer.url)){this.imgDiv.urls=this.layer.url.slice();}
+this.imgDiv.className='olTileImage';this.frame.style.zIndex=this.isBackBuffer?0:1;this.frame.appendChild(this.imgDiv);this.layer.div.appendChild(this.frame);if(this.layer.opacity!=null){OpenLayers.Util.modifyDOMElement(this.imgDiv,null,null,null,null,null,null,this.layer.opacity);}
+this.imgDiv.map=this.layer.map;var onload=function(){if(this.isLoading){this.isLoading=false;this.events.triggerEvent("loadend");}};if(this.layerAlphaHack){OpenLayers.Event.observe(this.imgDiv.childNodes[0],'load',OpenLayers.Function.bind(onload,this));}else{OpenLayers.Event.observe(this.imgDiv,'load',OpenLayers.Function.bind(onload,this));}
+var onerror=function(){if(this.imgDiv._attempts>OpenLayers.IMAGE_RELOAD_ATTEMPTS){onload.call(this);}};OpenLayers.Event.observe(this.imgDiv,"error",OpenLayers.Function.bind(onerror,this));}
+this.imgDiv.viewRequestID=this.layer.map.viewRequestID;},removeImgDiv:function(){OpenLayers.Event.stopObservingElement(this.imgDiv);if(this.imgDiv.parentNode==this.frame){this.frame.removeChild(this.imgDiv);this.imgDiv.map=null;}
+this.imgDiv.urls=null;var child=this.imgDiv.firstChild;if(child){OpenLayers.Event.stopObservingElement(child);this.imgDiv.removeChild(child);delete child;}else{this.imgDiv.src=OpenLayers.Util.getImagesLocation()+"blank.gif";}},checkImgURL:function(){if(this.layer){var loaded=this.layerAlphaHack?this.imgDiv.firstChild.src:this.imgDiv.src;if(!OpenLayers.Util.isEquivalentUrl(loaded,this.url)){this.hide();}}},startTransition:function(){if(!this.backBufferTile||!this.backBufferTile.imgDiv){return;}
+var ratio=1;if(this.backBufferTile.resolution){ratio=this.backBufferTile.resolution/this.layer.getResolution();}
+if(ratio!=1){if(this.layer.transitionEffect=='resize'){var upperLeft=new OpenLayers.LonLat(this.backBufferTile.bounds.left,this.backBufferTile.bounds.top);var size=new OpenLayers.Size(this.backBufferTile.size.w*ratio,this.backBufferTile.size.h*ratio);var px=this.layer.map.getLayerPxFromLonLat(upperLeft);OpenLayers.Util.modifyDOMElement(this.backBufferTile.frame,null,px,size);var imageSize=this.backBufferTile.imageSize;imageSize=new OpenLayers.Size(imageSize.w*ratio,imageSize.h*ratio);var imageOffset=this.backBufferTile.imageOffset;if(imageOffset){imageOffset=new OpenLayers.Pixel(imageOffset.x*ratio,imageOffset.y*ratio);}
+OpenLayers.Util.modifyDOMElement(this.backBufferTile.imgDiv,null,imageOffset,imageSize);this.backBufferTile.show();}}else{if(this.layer.singleTile){this.backBufferTile.show();}else{this.backBufferTile.hide();}}},show:function(){this.frame.style.display='';if(OpenLayers.Util.indexOf(this.layer.SUPPORTED_TRANSITIONS,this.layer.transitionEffect)!=-1){if(OpenLayers.IS_GECKO===true){this.frame.scrollLeft=this.frame.scrollLeft;}}},hide:function(){this.frame.style.display='none';},CLASS_NAME:"OpenLayers.Tile.Image"});OpenLayers.Tile.Image.useBlankTile=(OpenLayers.BROWSER_NAME=="safari"||OpenLayers.BROWSER_NAME=="opera");OpenLayers.ElementsIndexer=OpenLayers.Class({maxZIndex:null,order:null,indices:null,compare:null,initialize:function(yOrdering){this.compare=yOrdering?OpenLayers.ElementsIndexer.IndexingMethods.Z_ORDER_Y_ORDER:OpenLayers.ElementsIndexer.IndexingMethods.Z_ORDER_DRAWING_ORDER;this.clear();},insert:function(newNode){if(this.exists(newNode)){this.remove(newNode);}
+var nodeId=newNode.id;this.determineZIndex(newNode);var leftIndex=-1;var rightIndex=this.order.length;var middle;while(rightIndex-leftIndex>1){middle=parseInt((leftIndex+rightIndex)/2);var placement=this.compare(this,newNode,OpenLayers.Util.getElement(this.order[middle]));if(placement>0){leftIndex=middle;}else{rightIndex=middle;}}
+this.order.splice(rightIndex,0,nodeId);this.indices[nodeId]=this.getZIndex(newNode);return this.getNextElement(rightIndex);},remove:function(node){var nodeId=node.id;var arrayIndex=OpenLayers.Util.indexOf(this.order,nodeId);if(arrayIndex>=0){this.order.splice(arrayIndex,1);delete this.indices[nodeId];if(this.order.length>0){var lastId=this.order[this.order.length-1];this.maxZIndex=this.indices[lastId];}else{this.maxZIndex=0;}}},clear:function(){this.order=[];this.indices={};this.maxZIndex=0;},exists:function(node){return(this.indices[node.id]!=null);},getZIndex:function(node){return node._style.graphicZIndex;},determineZIndex:function(node){var zIndex=node._style.graphicZIndex;if(zIndex==null){zIndex=this.maxZIndex;node._style.graphicZIndex=zIndex;}else if(zIndex>this.maxZIndex){this.maxZIndex=zIndex;}},getNextElement:function(index){var nextIndex=index+1;if(nextIndex<this.order.length){var nextElement=OpenLayers.Util.getElement(this.order[nextIndex]);if(nextElement==undefined){nextElement=this.getNextElement(nextIndex);}
+return nextElement;}else{return null;}},CLASS_NAME:"OpenLayers.ElementsIndexer"});OpenLayers.ElementsIndexer.IndexingMethods={Z_ORDER:function(indexer,newNode,nextNode){var newZIndex=indexer.getZIndex(newNode);var returnVal=0;if(nextNode){var nextZIndex=indexer.getZIndex(nextNode);returnVal=newZIndex-nextZIndex;}
+return returnVal;},Z_ORDER_DRAWING_ORDER:function(indexer,newNode,nextNode){var returnVal=OpenLayers.ElementsIndexer.IndexingMethods.Z_ORDER(indexer,newNode,nextNode);if(nextNode&&returnVal==0){returnVal=1;}
+return returnVal;},Z_ORDER_Y_ORDER:function(indexer,newNode,nextNode){var returnVal=OpenLayers.ElementsIndexer.IndexingMethods.Z_ORDER(indexer,newNode,nextNode);if(nextNode&&returnVal===0){var result=nextNode._boundsBottom-newNode._boundsBottom;returnVal=(result===0)?1:result;}
+return returnVal;}};OpenLayers.Renderer.Elements=OpenLayers.Class(OpenLayers.Renderer,{rendererRoot:null,root:null,vectorRoot:null,textRoot:null,xmlns:null,indexer:null,BACKGROUND_ID_SUFFIX:"_background",LABEL_ID_SUFFIX:"_label",initialize:function(containerID,options){OpenLayers.Renderer.prototype.initialize.apply(this,arguments);this.rendererRoot=this.createRenderRoot();this.root=this.createRoot("_root");this.vectorRoot=this.createRoot("_vroot");this.textRoot=this.createRoot("_troot");this.root.appendChild(this.vectorRoot);this.root.appendChild(this.textRoot);this.rendererRoot.appendChild(this.root);this.container.appendChild(this.rendererRoot);if(options&&(options.zIndexing||options.yOrdering)){this.indexer=new OpenLayers.ElementsIndexer(options.yOrdering);}},destroy:function(){this.clear();this.rendererRoot=null;this.root=null;this.xmlns=null;OpenLayers.Renderer.prototype.destroy.apply(this,arguments);},clear:function(){var child;var root=this.vectorRoot;if(root){while(child=root.firstChild){root.removeChild(child);}}
+root=this.textRoot;if(root){while(child=root.firstChild){root.removeChild(child);}}
+if(this.indexer){this.indexer.clear();}},getNodeType:function(geometry,style){},drawGeometry:function(geometry,style,featureId){var className=geometry.CLASS_NAME;var rendered=true;if((className=="OpenLayers.Geometry.Collection")||(className=="OpenLayers.Geometry.MultiPoint")||(className=="OpenLayers.Geometry.MultiLineString")||(className=="OpenLayers.Geometry.MultiPolygon")){for(var i=0,len=geometry.components.length;i<len;i++){rendered=this.drawGeometry(geometry.components[i],style,featureId)&&rendered;}
+return rendered;};rendered=false;var removeBackground=false;if(style.display!="none"){if(style.backgroundGraphic){this.redrawBackgroundNode(geometry.id,geometry,style,featureId);}else{removeBackground=true;}
+rendered=this.redrawNode(geometry.id,geometry,style,featureId);}
+if(rendered==false){var node=document.getElementById(geometry.id);if(node){if(node._style.backgroundGraphic){removeBackground=true;}
+node.parentNode.removeChild(node);}}
+if(removeBackground){var node=document.getElementById(geometry.id+this.BACKGROUND_ID_SUFFIX);if(node){node.parentNode.removeChild(node);}}
+return rendered;},redrawNode:function(id,geometry,style,featureId){style=this.applyDefaultSymbolizer(style);var node=this.nodeFactory(id,this.getNodeType(geometry,style));node._featureId=featureId;node._boundsBottom=geometry.getBounds().bottom;node._geometryClass=geometry.CLASS_NAME;node._style=style;var drawResult=this.drawGeometryNode(node,geometry,style);if(drawResult===false){return false;}
+node=drawResult.node;if(this.indexer){var insert=this.indexer.insert(node);if(insert){this.vectorRoot.insertBefore(node,insert);}else{this.vectorRoot.appendChild(node);}}else{if(node.parentNode!==this.vectorRoot){this.vectorRoot.appendChild(node);}}
+this.postDraw(node);return drawResult.complete;},redrawBackgroundNode:function(id,geometry,style,featureId){var backgroundStyle=OpenLayers.Util.extend({},style);backgroundStyle.externalGraphic=backgroundStyle.backgroundGraphic;backgroundStyle.graphicXOffset=backgroundStyle.backgroundXOffset;backgroundStyle.graphicYOffset=backgroundStyle.backgroundYOffset;backgroundStyle.graphicZIndex=backgroundStyle.backgroundGraphicZIndex;backgroundStyle.graphicWidth=backgroundStyle.backgroundWidth||backgroundStyle.graphicWidth;backgroundStyle.graphicHeight=backgroundStyle.backgroundHeight||backgroundStyle.graphicHeight;backgroundStyle.backgroundGraphic=null;backgroundStyle.backgroundXOffset=null;backgroundStyle.backgroundYOffset=null;backgroundStyle.backgroundGraphicZIndex=null;return this.redrawNode(id+this.BACKGROUND_ID_SUFFIX,geometry,backgroundStyle,null);},drawGeometryNode:function(node,geometry,style){style=style||node._style;var options={'isFilled':style.fill===undefined?true:style.fill,'isStroked':style.stroke===undefined?!!style.strokeWidth:style.stroke};var drawn;switch(geometry.CLASS_NAME){case"OpenLayers.Geometry.Point":if(style.graphic===false){options.isFilled=false;options.isStroked=false;}
+drawn=this.drawPoint(node,geometry);break;case"OpenLayers.Geometry.LineString":options.isFilled=false;drawn=this.drawLineString(node,geometry);break;case"OpenLayers.Geometry.LinearRing":drawn=this.drawLinearRing(node,geometry);break;case"OpenLayers.Geometry.Polygon":drawn=this.drawPolygon(node,geometry);break;case"OpenLayers.Geometry.Surface":drawn=this.drawSurface(node,geometry);break;case"OpenLayers.Geometry.Rectangle":drawn=this.drawRectangle(node,geometry);break;default:break;}
+node._options=options;if(drawn!=false){return{node:this.setStyle(node,style,options,geometry),complete:drawn};}else{return false;}},postDraw:function(node){},drawPoint:function(node,geometry){},drawLineString:function(node,geometry){},drawLinearRing:function(node,geometry){},drawPolygon:function(node,geometry){},drawRectangle:function(node,geometry){},drawCircle:function(node,geometry){},drawSurface:function(node,geometry){},removeText:function(featureId){var label=document.getElementById(featureId+this.LABEL_ID_SUFFIX);if(label){this.textRoot.removeChild(label);}},getFeatureIdFromEvent:function(evt){var target=evt.target;var useElement=target&&target.correspondingUseElement;var node=useElement?useElement:(target||evt.srcElement);var featureId=node._featureId;return featureId;},eraseGeometry:function(geometry,featureId){if((geometry.CLASS_NAME=="OpenLayers.Geometry.MultiPoint")||(geometry.CLASS_NAME=="OpenLayers.Geometry.MultiLineString")||(geometry.CLASS_NAME=="OpenLayers.Geometry.MultiPolygon")||(geometry.CLASS_NAME=="OpenLayers.Geometry.Collection")){for(var i=0,len=geometry.components.length;i<len;i++){this.eraseGeometry(geometry.components[i],featureId);}}else{var element=OpenLayers.Util.getElement(geometry.id);if(element&&element.parentNode){if(element.geometry){element.geometry.destroy();element.geometry=null;}
+element.parentNode.removeChild(element);if(this.indexer){this.indexer.remove(element);}
+if(element._style.backgroundGraphic){var backgroundId=geometry.id+this.BACKGROUND_ID_SUFFIX;var bElem=OpenLayers.Util.getElement(backgroundId);if(bElem&&bElem.parentNode){bElem.parentNode.removeChild(bElem);}}}}},nodeFactory:function(id,type){var node=OpenLayers.Util.getElement(id);if(node){if(!this.nodeTypeCompare(node,type)){node.parentNode.removeChild(node);node=this.nodeFactory(id,type);}}else{node=this.createNode(type,id);}
+return node;},nodeTypeCompare:function(node,type){},createNode:function(type,id){},moveRoot:function(renderer){var root=this.root;if(renderer.root.parentNode==this.rendererRoot){root=renderer.root;}
+root.parentNode.removeChild(root);renderer.rendererRoot.appendChild(root);},getRenderLayerId:function(){return this.root.parentNode.parentNode.id;},isComplexSymbol:function(graphicName){return(graphicName!="circle")&&!!graphicName;},CLASS_NAME:"OpenLayers.Renderer.Elements"});OpenLayers.Renderer.symbol={"star":[350,75,379,161,469,161,397,215,423,301,350,250,277,301,303,215,231,161,321,161,350,75],"cross":[4,0,6,0,6,4,10,4,10,6,6,6,6,10,4,10,4,6,0,6,0,4,4,4,4,0],"x":[0,0,25,0,50,35,75,0,100,0,65,50,100,100,75,100,50,65,25,100,0,100,35,50,0,0],"square":[0,0,0,1,1,1,1,0,0,0],"triangle":[0,10,10,10,5,0,0,10]};OpenLayers.Control.ArgParser=OpenLayers.Class(OpenLayers.Control,{center:null,zoom:null,layers:null,displayProjection:null,getParameters:function(url){url=url||window.location.href;var parameters=OpenLayers.Util.getParameters(url);var index=url.indexOf('#');if(index>0){url='?'+url.substring(index+1,url.length);OpenLayers.Util.extend(parameters,OpenLayers.Util.getParameters(url));}
+return parameters;},setMap:function(map){OpenLayers.Control.prototype.setMap.apply(this,arguments);for(var i=0,len=this.map.controls.length;i<len;i++){var control=this.map.controls[i];if((control!=this)&&(control.CLASS_NAME=="OpenLayers.Control.ArgParser")){if(control.displayProjection!=this.displayProjection){this.displayProjection=control.displayProjection;}
+break;}}
+if(i==this.map.controls.length){var args=this.getParameters();if(args.layers){this.layers=args.layers;this.map.events.register('addlayer',this,this.configureLayers);this.configureLayers();}
+if(args.lat&&args.lon){this.center=new OpenLayers.LonLat(parseFloat(args.lon),parseFloat(args.lat));if(args.zoom){this.zoom=parseInt(args.zoom);}
+this.map.events.register('changebaselayer',this,this.setCenter);this.setCenter();}}},setCenter:function(){if(this.map.baseLayer){this.map.events.unregister('changebaselayer',this,this.setCenter);if(this.displayProjection){this.center.transform(this.displayProjection,this.map.getProjectionObject());}
+this.map.setCenter(this.center,this.zoom);}},configureLayers:function(){if(this.layers.length==this.map.layers.length){this.map.events.unregister('addlayer',this,this.configureLayers);for(var i=0,len=this.layers.length;i<len;i++){var layer=this.map.layers[i];var c=this.layers.charAt(i);if(c=="B"){this.map.setBaseLayer(layer);}else if((c=="T")||(c=="F")){layer.setVisibility(c=="T");}}}},CLASS_NAME:"OpenLayers.Control.ArgParser"});OpenLayers.Control.Permalink=OpenLayers.Class(OpenLayers.Control,{argParserClass:OpenLayers.Control.ArgParser,element:null,anchor:false,base:'',displayProjection:null,initialize:function(element,base,options){if(element!==null&&typeof element=='object'&&!OpenLayers.Util.isElement(element)){options=element;this.base=document.location.href;OpenLayers.Control.prototype.initialize.apply(this,[options]);if(this.element!=null){this.element=OpenLayers.Util.getElement(this.element);}}
+else{OpenLayers.Control.prototype.initialize.apply(this,[options]);this.element=OpenLayers.Util.getElement(element);this.base=base||document.location.href;}},destroy:function(){if(this.element.parentNode==this.div){this.div.removeChild(this.element);}
+this.element=null;this.map.events.unregister('moveend',this,this.updateLink);OpenLayers.Control.prototype.destroy.apply(this,arguments);},setMap:function(map){OpenLayers.Control.prototype.setMap.apply(this,arguments);for(var i=0,len=this.map.controls.length;i<len;i++){var control=this.map.controls[i];if(control.CLASS_NAME==this.argParserClass.CLASS_NAME){if(control.displayProjection!=this.displayProjection){this.displayProjection=control.displayProjection;}
+break;}}
+if(i==this.map.controls.length){this.map.addControl(new this.argParserClass({'displayProjection':this.displayProjection}));}},draw:function(){OpenLayers.Control.prototype.draw.apply(this,arguments);if(!this.element&&!this.anchor){this.element=document.createElement("a");this.element.innerHTML=OpenLayers.i18n("Permalink");this.element.href="";this.div.appendChild(this.element);}
+this.map.events.on({'moveend':this.updateLink,'changelayer':this.updateLink,'changebaselayer':this.updateLink,scope:this});this.updateLink();return this.div;},updateLink:function(){var separator=this.anchor?'#':'?';var href=this.base;if(href.indexOf(separator)!=-1){href=href.substring(0,href.indexOf(separator));}
+href+=separator+OpenLayers.Util.getParameterString(this.createParams());if(this.anchor&&!this.element){window.location.href=href;}
+else{this.element.href=href;}},createParams:function(center,zoom,layers){center=center||this.map.getCenter();var params=OpenLayers.Util.getParameters(this.base);if(center){params.zoom=zoom||this.map.getZoom();var lat=center.lat;var lon=center.lon;if(this.displayProjection){var mapPosition=OpenLayers.Projection.transform({x:lon,y:lat},this.map.getProjectionObject(),this.displayProjection);lon=mapPosition.x;lat=mapPosition.y;}
+params.lat=Math.round(lat*100000)/100000;params.lon=Math.round(lon*100000)/100000;layers=layers||this.map.layers;params.layers='';for(var i=0,len=layers.length;i<len;i++){var layer=layers[i];if(layer.isBaseLayer){params.layers+=(layer==this.map.baseLayer)?"B":"0";}else{params.layers+=(layer.getVisibility())?"T":"F";}}}
+return params;},CLASS_NAME:"OpenLayers.Control.Permalink"});OpenLayers.Strategy=OpenLayers.Class({layer:null,options:null,active:null,autoActivate:true,autoDestroy:true,initialize:function(options){OpenLayers.Util.extend(this,options);this.options=options;this.active=false;},destroy:function(){this.deactivate();this.layer=null;this.options=null;},setLayer:function(layer){this.layer=layer;},activate:function(){if(!this.active){this.active=true;return true;}
+return false;},deactivate:function(){if(this.active){this.active=false;return true;}
+return false;},CLASS_NAME:"OpenLayers.Strategy"});OpenLayers.Strategy.Fixed=OpenLayers.Class(OpenLayers.Strategy,{preload:false,activate:function(){if(OpenLayers.Strategy.prototype.activate.apply(this,arguments)){this.layer.events.on({"refresh":this.load,scope:this});if(this.layer.visibility==true||this.preload){this.load();}else{this.layer.events.on({"visibilitychanged":this.load,scope:this});}
+return true;}
+return false;},deactivate:function(){var deactivated=OpenLayers.Strategy.prototype.deactivate.call(this);if(deactivated){this.layer.events.un({"refresh":this.load,"visibilitychanged":this.load,scope:this});}
+return deactivated;},load:function(options){var layer=this.layer;layer.events.triggerEvent("loadstart");layer.protocol.read(OpenLayers.Util.applyDefaults({callback:OpenLayers.Function.bind(this.merge,this,layer.map.getProjectionObject()),filter:layer.filter},options));layer.events.un({"visibilitychanged":this.load,scope:this});},merge:function(mapProjection,resp){var layer=this.layer;layer.destroyFeatures();var features=resp.features;if(features&&features.length>0){if(!mapProjection.equals(layer.projection)){var geom;for(var i=0,len=features.length;i<len;++i){geom=features[i].geometry;if(geom){geom.transform(layer.projection,mapProjection);}}}
+layer.addFeatures(features);}
+layer.events.triggerEvent("loadend");},CLASS_NAME:"OpenLayers.Strategy.Fixed"});OpenLayers.Date={toISOString:(function(){if("toISOString"in Date.prototype){return function(date){return date.toISOString();};}else{function pad(num,len){var str=num+"";while(str.length<len){str="0"+str;}
+return str;}
+return function(date){var str;if(isNaN(date.getTime())){str="Invalid Date";}else{str=date.getUTCFullYear()+"-"+
+pad(date.getUTCMonth()+1,2)+"-"+
+pad(date.getUTCDate(),2)+"T"+
+pad(date.getUTCHours(),2)+":"+
+pad(date.getUTCMinutes(),2)+":"+
+pad(date.getUTCSeconds(),2)+"."+
+pad(date.getUTCMilliseconds(),3)+"Z";}
+return str;};}})(),parse:function(str){var date;var match=str.match(/^(?:(\d{4})(?:-(\d{2})(?:-(\d{2}))?)?)?(?:T(\d{1,2}):(\d{2}):(\d{2}(?:\.\d+)?)(Z|(?:[+-]\d{1,2}(?::(\d{2}))?)))?$/);if(match&&(match[1]||match[7])){var year=parseInt(match[1],10)||0;var month=(parseInt(match[2],10)-1)||0;var day=parseInt(match[3],10)||1;date=new Date(Date.UTC(year,month,day));var type=match[7];if(type){var hours=parseInt(match[4],10);var minutes=parseInt(match[5],10);var secFrac=parseFloat(match[6]);var seconds=secFrac|0;var milliseconds=Math.round(1000*(secFrac-seconds));date.setUTCHours(hours,minutes,seconds,milliseconds);if(type!=="Z"){var hoursOffset=parseInt(type,10);var minutesOffset=parseInt(match[8],10)||0;var offset=-1000*(60*(hoursOffset*60)+minutesOffset*60);date=new Date(date.getTime()+offset);}}}else{date=new Date("invalid");}
+return date;}};OpenLayers.Format.XML=OpenLayers.Class(OpenLayers.Format,{namespaces:null,namespaceAlias:null,defaultPrefix:null,readers:{},writers:{},xmldom:null,initialize:function(options){if(window.ActiveXObject){this.xmldom=new ActiveXObject("Microsoft.XMLDOM");}
+OpenLayers.Format.prototype.initialize.apply(this,[options]);this.namespaces=OpenLayers.Util.extend({},this.namespaces);this.namespaceAlias={};for(var alias in this.namespaces){this.namespaceAlias[this.namespaces[alias]]=alias;}},destroy:function(){this.xmldom=null;OpenLayers.Format.prototype.destroy.apply(this,arguments);},setNamespace:function(alias,uri){this.namespaces[alias]=uri;this.namespaceAlias[uri]=alias;},read:function(text){var index=text.indexOf('<');if(index>0){text=text.substring(index);}
+var node=OpenLayers.Util.Try(OpenLayers.Function.bind((function(){var xmldom;if(window.ActiveXObject&&!this.xmldom){xmldom=new ActiveXObject("Microsoft.XMLDOM");}else{xmldom=this.xmldom;}
+xmldom.loadXML(text);return xmldom;}),this),function(){return new DOMParser().parseFromString(text,'text/xml');},function(){var req=new XMLHttpRequest();req.open("GET","data:"+"text/xml"+";charset=utf-8,"+encodeURIComponent(text),false);if(req.overrideMimeType){req.overrideMimeType("text/xml");}
+req.send(null);return req.responseXML;});if(this.keepData){this.data=node;}
+return node;},write:function(node){var data;if(this.xmldom){data=node.xml;}else{var serializer=new XMLSerializer();if(node.nodeType==1){var doc=document.implementation.createDocument("","",null);if(doc.importNode){node=doc.importNode(node,true);}
+doc.appendChild(node);data=serializer.serializeToString(doc);}else{data=serializer.serializeToString(node);}}
+return data;},createElementNS:function(uri,name){var element;if(this.xmldom){if(typeof uri=="string"){element=this.xmldom.createNode(1,name,uri);}else{element=this.xmldom.createNode(1,name,"");}}else{element=document.createElementNS(uri,name);}
+return element;},createTextNode:function(text){var node;if(typeof text!=="string"){text=String(text);}
+if(this.xmldom){node=this.xmldom.createTextNode(text);}else{node=document.createTextNode(text);}
+return node;},getElementsByTagNameNS:function(node,uri,name){var elements=[];if(node.getElementsByTagNameNS){elements=node.getElementsByTagNameNS(uri,name);}else{var allNodes=node.getElementsByTagName("*");var potentialNode,fullName;for(var i=0,len=allNodes.length;i<len;++i){potentialNode=allNodes[i];fullName=(potentialNode.prefix)?(potentialNode.prefix+":"+name):name;if((name=="*")||(fullName==potentialNode.nodeName)){if((uri=="*")||(uri==potentialNode.namespaceURI)){elements.push(potentialNode);}}}}
+return elements;},getAttributeNodeNS:function(node,uri,name){var attributeNode=null;if(node.getAttributeNodeNS){attributeNode=node.getAttributeNodeNS(uri,name);}else{var attributes=node.attributes;var potentialNode,fullName;for(var i=0,len=attributes.length;i<len;++i){potentialNode=attributes[i];if(potentialNode.namespaceURI==uri){fullName=(potentialNode.prefix)?(potentialNode.prefix+":"+name):name;if(fullName==potentialNode.nodeName){attributeNode=potentialNode;break;}}}}
+return attributeNode;},getAttributeNS:function(node,uri,name){var attributeValue="";if(node.getAttributeNS){attributeValue=node.getAttributeNS(uri,name)||"";}else{var attributeNode=this.getAttributeNodeNS(node,uri,name);if(attributeNode){attributeValue=attributeNode.nodeValue;}}
+return attributeValue;},getChildValue:function(node,def){var value=def||"";if(node){for(var child=node.firstChild;child;child=child.nextSibling){switch(child.nodeType){case 3:case 4:value+=child.nodeValue;}}}
+return value;},concatChildValues:function(node,def){var value="";var child=node.firstChild;var childValue;while(child){childValue=child.nodeValue;if(childValue){value+=childValue;}
+child=child.nextSibling;}
+if(value==""&&def!=undefined){value=def;}
+return value;},isSimpleContent:function(node){var simple=true;for(var child=node.firstChild;child;child=child.nextSibling){if(child.nodeType===1){simple=false;break;}}
+return simple;},contentType:function(node){var simple=false,complex=false;var type=OpenLayers.Format.XML.CONTENT_TYPE.EMPTY;for(var child=node.firstChild;child;child=child.nextSibling){switch(child.nodeType){case 1:complex=true;break;case 8:break;default:simple=true;}
+if(complex&&simple){break;}}
+if(complex&&simple){type=OpenLayers.Format.XML.CONTENT_TYPE.MIXED;}else if(complex){return OpenLayers.Format.XML.CONTENT_TYPE.COMPLEX;}else if(simple){return OpenLayers.Format.XML.CONTENT_TYPE.SIMPLE;}
+return type;},hasAttributeNS:function(node,uri,name){var found=false;if(node.hasAttributeNS){found=node.hasAttributeNS(uri,name);}else{found=!!this.getAttributeNodeNS(node,uri,name);}
+return found;},setAttributeNS:function(node,uri,name,value){if(node.setAttributeNS){node.setAttributeNS(uri,name,value);}else{if(this.xmldom){if(uri){var attribute=node.ownerDocument.createNode(2,name,uri);attribute.nodeValue=value;node.setAttributeNode(attribute);}else{node.setAttribute(name,value);}}else{throw"setAttributeNS not implemented";}}},createElementNSPlus:function(name,options){options=options||{};var uri=options.uri||this.namespaces[options.prefix];if(!uri){var loc=name.indexOf(":");uri=this.namespaces[name.substring(0,loc)];}
+if(!uri){uri=this.namespaces[this.defaultPrefix];}
+var node=this.createElementNS(uri,name);if(options.attributes){this.setAttributes(node,options.attributes);}
+var value=options.value;if(value!=null){node.appendChild(this.createTextNode(value));}
+return node;},setAttributes:function(node,obj){var value,uri;for(var name in obj){if(obj[name]!=null&&obj[name].toString){value=obj[name].toString();uri=this.namespaces[name.substring(0,name.indexOf(":"))]||null;this.setAttributeNS(node,uri,name,value);}}},readNode:function(node,obj){if(!obj){obj={};}
+var group=this.readers[node.namespaceURI?this.namespaceAlias[node.namespaceURI]:this.defaultPrefix];if(group){var local=node.localName||node.nodeName.split(":").pop();var reader=group[local]||group["*"];if(reader){reader.apply(this,[node,obj]);}}
+return obj;},readChildNodes:function(node,obj){if(!obj){obj={};}
+var children=node.childNodes;var child;for(var i=0,len=children.length;i<len;++i){child=children[i];if(child.nodeType==1){this.readNode(child,obj);}}
+return obj;},writeNode:function(name,obj,parent){var prefix,local;var split=name.indexOf(":");if(split>0){prefix=name.substring(0,split);local=name.substring(split+1);}else{if(parent){prefix=this.namespaceAlias[parent.namespaceURI];}else{prefix=this.defaultPrefix;}
+local=name;}
+var child=this.writers[prefix][local].apply(this,[obj]);if(parent){parent.appendChild(child);}
+return child;},getChildEl:function(node,name,uri){return node&&this.getThisOrNextEl(node.firstChild,name,uri);},getNextEl:function(node,name,uri){return node&&this.getThisOrNextEl(node.nextSibling,name,uri);},getThisOrNextEl:function(node,name,uri){outer:for(var sibling=node;sibling;sibling=sibling.nextSibling){switch(sibling.nodeType){case 1:if((!name||name===(sibling.localName||sibling.nodeName.split(":").pop()))&&(!uri||uri===sibling.namespaceURI)){break outer;}
+sibling=null;break outer;case 3:if(/^\s*$/.test(sibling.nodeValue)){break;}
+case 4:case 6:case 12:case 10:case 11:sibling=null;break outer;}}
+return sibling||null;},lookupNamespaceURI:function(node,prefix){var uri=null;if(node){if(node.lookupNamespaceURI){uri=node.lookupNamespaceURI(prefix);}else{outer:switch(node.nodeType){case 1:if(node.namespaceURI!==null&&node.prefix===prefix){uri=node.namespaceURI;break outer;}
+var len=node.attributes.length;if(len){var attr;for(var i=0;i<len;++i){attr=node.attributes[i];if(attr.prefix==="xmlns"&&attr.name==="xmlns:"+prefix){uri=attr.value||null;break outer;}else if(attr.name==="xmlns"&&prefix===null){uri=attr.value||null;break outer;}}}
+uri=this.lookupNamespaceURI(node.parentNode,prefix);break outer;case 2:uri=this.lookupNamespaceURI(node.ownerElement,prefix);break outer;case 9:uri=this.lookupNamespaceURI(node.documentElement,prefix);break outer;case 6:case 12:case 10:case 11:break outer;default:uri=this.lookupNamespaceURI(node.parentNode,prefix);break outer;}}}
+return uri;},getXMLDoc:function(){if(!OpenLayers.Format.XML.document&&!this.xmldom){if(document.implementation&&document.implementation.createDocument){OpenLayers.Format.XML.document=document.implementation.createDocument("","",null);}else if(!this.xmldom&&window.ActiveXObject){this.xmldom=new ActiveXObject("Microsoft.XMLDOM");}}
+return OpenLayers.Format.XML.document||this.xmldom;},CLASS_NAME:"OpenLayers.Format.XML"});OpenLayers.Format.XML.CONTENT_TYPE={EMPTY:0,SIMPLE:1,COMPLEX:2,MIXED:3};OpenLayers.Format.XML.lookupNamespaceURI=OpenLayers.Function.bind(OpenLayers.Format.XML.prototype.lookupNamespaceURI,OpenLayers.Format.XML.prototype);OpenLayers.Format.XML.document=null;OpenLayers.Geometry.Polygon=OpenLayers.Class(OpenLayers.Geometry.Collection,{componentTypes:["OpenLayers.Geometry.LinearRing"],initialize:function(components){OpenLayers.Geometry.Collection.prototype.initialize.apply(this,arguments);},getArea:function(){var area=0.0;if(this.components&&(this.components.length>0)){area+=Math.abs(this.components[0].getArea());for(var i=1,len=this.components.length;i<len;i++){area-=Math.abs(this.components[i].getArea());}}
+return area;},getGeodesicArea:function(projection){var area=0.0;if(this.components&&(this.components.length>0)){area+=Math.abs(this.components[0].getGeodesicArea(projection));for(var i=1,len=this.components.length;i<len;i++){area-=Math.abs(this.components[i].getGeodesicArea(projection));}}
+return area;},containsPoint:function(point){var numRings=this.components.length;var contained=false;if(numRings>0){contained=this.components[0].containsPoint(point);if(contained!==1){if(contained&&numRings>1){var hole;for(var i=1;i<numRings;++i){hole=this.components[i].containsPoint(point);if(hole){if(hole===1){contained=1;}else{contained=false;}
+break;}}}}}
+return contained;},intersects:function(geometry){var intersect=false;var i,len;if(geometry.CLASS_NAME=="OpenLayers.Geometry.Point"){intersect=this.containsPoint(geometry);}else if(geometry.CLASS_NAME=="OpenLayers.Geometry.LineString"||geometry.CLASS_NAME=="OpenLayers.Geometry.LinearRing"){for(i=0,len=this.components.length;i<len;++i){intersect=geometry.intersects(this.components[i]);if(intersect){break;}}
+if(!intersect){for(i=0,len=geometry.components.length;i<len;++i){intersect=this.containsPoint(geometry.components[i]);if(intersect){break;}}}}else{for(i=0,len=geometry.components.length;i<len;++i){intersect=this.intersects(geometry.components[i]);if(intersect){break;}}}
+if(!intersect&&geometry.CLASS_NAME=="OpenLayers.Geometry.Polygon"){var ring=this.components[0];for(i=0,len=ring.components.length;i<len;++i){intersect=geometry.containsPoint(ring.components[i]);if(intersect){break;}}}
+return intersect;},distanceTo:function(geometry,options){var edge=!(options&&options.edge===false);var result;if(!edge&&this.intersects(geometry)){result=0;}else{result=OpenLayers.Geometry.Collection.prototype.distanceTo.apply(this,[geometry,options]);}
+return result;},CLASS_NAME:"OpenLayers.Geometry.Polygon"});OpenLayers.Geometry.Polygon.createRegularPolygon=function(origin,radius,sides,rotation){var angle=Math.PI*((1/sides)-(1/2));if(rotation){angle+=(rotation/180)*Math.PI;}
+var rotatedAngle,x,y;var points=[];for(var i=0;i<sides;++i){rotatedAngle=angle+(i*2*Math.PI/sides);x=origin.x+(radius*Math.cos(rotatedAngle));y=origin.y+(radius*Math.sin(rotatedAngle));points.push(new OpenLayers.Geometry.Point(x,y));}
+var ring=new OpenLayers.Geometry.LinearRing(points);return new OpenLayers.Geometry.Polygon([ring]);};OpenLayers.Request={DEFAULT_CONFIG:{method:"GET",url:window.location.href,async:true,user:undefined,password:undefined,params:null,proxy:OpenLayers.ProxyHost,headers:{},data:null,callback:function(){},success:null,failure:null,scope:null},URL_SPLIT_REGEX:/([^:]*:)\/\/([^:]*:?[^@]*@)?([^:\/\?]*):?([^\/\?]*)/,events:new OpenLayers.Events(this,null,["complete","success","failure"]),issue:function(config){var defaultConfig=OpenLayers.Util.extend(this.DEFAULT_CONFIG,{proxy:OpenLayers.ProxyHost});config=OpenLayers.Util.applyDefaults(config,defaultConfig);var request=new OpenLayers.Request.XMLHttpRequest();var url=OpenLayers.Util.urlAppend(config.url,OpenLayers.Util.getParameterString(config.params||{}));var sameOrigin=!(url.indexOf("http")==0);var urlParts=!sameOrigin&&url.match(this.URL_SPLIT_REGEX);if(urlParts){var location=window.location;sameOrigin=urlParts[1]==location.protocol&&urlParts[3]==location.hostname;var uPort=urlParts[4],lPort=location.port;if(uPort!=80&&uPort!=""||lPort!="80"&&lPort!=""){sameOrigin=sameOrigin&&uPort==lPort;}}
+if(!sameOrigin){if(config.proxy){if(typeof config.proxy=="function"){url=config.proxy(url);}else{url=config.proxy+encodeURIComponent(url);}}else{OpenLayers.Console.warn(OpenLayers.i18n("proxyNeeded"),{url:url});}}
+request.open(config.method,url,config.async,config.user,config.password);for(var header in config.headers){request.setRequestHeader(header,config.headers[header]);}
+var events=this.events;var self=this;request.onreadystatechange=function(){if(request.readyState==OpenLayers.Request.XMLHttpRequest.DONE){var proceed=events.triggerEvent("complete",{request:request,config:config,requestUrl:url});if(proceed!==false){self.runCallbacks({request:request,config:config,requestUrl:url});}}};if(config.async===false){request.send(config.data);}else{window.setTimeout(function(){if(request.readyState!==0){request.send(config.data);}},0);}
+return request;},runCallbacks:function(options){var request=options.request;var config=options.config;var complete=(config.scope)?OpenLayers.Function.bind(config.callback,config.scope):config.callback;var success;if(config.success){success=(config.scope)?OpenLayers.Function.bind(config.success,config.scope):config.success;}
+var failure;if(config.failure){failure=(config.scope)?OpenLayers.Function.bind(config.failure,config.scope):config.failure;}
+if(OpenLayers.Util.createUrlObject(config.url).protocol=="file:"&&request.responseText){request.status=200;}
+complete(request);if(!request.status||(request.status>=200&&request.status<300)){this.events.triggerEvent("success",options);if(success){success(request);}}
+if(request.status&&(request.status<200||request.status>=300)){this.events.triggerEvent("failure",options);if(failure){failure(request);}}},GET:function(config){config=OpenLayers.Util.extend(config,{method:"GET"});return OpenLayers.Request.issue(config);},POST:function(config){config=OpenLayers.Util.extend(config,{method:"POST"});config.headers=config.headers?config.headers:{};if(!("CONTENT-TYPE"in OpenLayers.Util.upperCaseObject(config.headers))){config.headers["Content-Type"]="application/xml";}
+return OpenLayers.Request.issue(config);},PUT:function(config){config=OpenLayers.Util.extend(config,{method:"PUT"});config.headers=config.headers?config.headers:{};if(!("CONTENT-TYPE"in OpenLayers.Util.upperCaseObject(config.headers))){config.headers["Content-Type"]="application/xml";}
+return OpenLayers.Request.issue(config);},DELETE:function(config){config=OpenLayers.Util.extend(config,{method:"DELETE"});return OpenLayers.Request.issue(config);},HEAD:function(config){config=OpenLayers.Util.extend(config,{method:"HEAD"});return OpenLayers.Request.issue(config);},OPTIONS:function(config){config=OpenLayers.Util.extend(config,{method:"OPTIONS"});return OpenLayers.Request.issue(config);}};(function(){var oXMLHttpRequest=window.XMLHttpRequest;var bGecko=!!window.controllers,bIE=window.document.all&&!window.opera,bIE7=bIE&&window.navigator.userAgent.match(/MSIE 7.0/);function fXMLHttpRequest(){this._object=oXMLHttpRequest&&!bIE7?new oXMLHttpRequest:new window.ActiveXObject("Microsoft.XMLHTTP");this._listeners=[];};function cXMLHttpRequest(){return new fXMLHttpRequest;};cXMLHttpRequest.prototype=fXMLHttpRequest.prototype;if(bGecko&&oXMLHttpRequest.wrapped)
+cXMLHttpRequest.wrapped=oXMLHttpRequest.wrapped;cXMLHttpRequest.UNSENT=0;cXMLHttpRequest.OPENED=1;cXMLHttpRequest.HEADERS_RECEIVED=2;cXMLHttpRequest.LOADING=3;cXMLHttpRequest.DONE=4;cXMLHttpRequest.prototype.readyState=cXMLHttpRequest.UNSENT;cXMLHttpRequest.prototype.responseText='';cXMLHttpRequest.prototype.responseXML=null;cXMLHttpRequest.prototype.status=0;cXMLHttpRequest.prototype.statusText='';cXMLHttpRequest.prototype.priority="NORMAL";cXMLHttpRequest.prototype.onreadystatechange=null;cXMLHttpRequest.onreadystatechange=null;cXMLHttpRequest.onopen=null;cXMLHttpRequest.onsend=null;cXMLHttpRequest.onabort=null;cXMLHttpRequest.prototype.open=function(sMethod,sUrl,bAsync,sUser,sPassword){delete this._headers;if(arguments.length<3)
+bAsync=true;this._async=bAsync;var oRequest=this,nState=this.readyState,fOnUnload;if(bIE&&bAsync){fOnUnload=function(){if(nState!=cXMLHttpRequest.DONE){fCleanTransport(oRequest);oRequest.abort();}};window.attachEvent("onunload",fOnUnload);}
+if(cXMLHttpRequest.onopen)
+cXMLHttpRequest.onopen.apply(this,arguments);if(arguments.length>4)
+this._object.open(sMethod,sUrl,bAsync,sUser,sPassword);else
+if(arguments.length>3)
+this._object.open(sMethod,sUrl,bAsync,sUser);else
+this._object.open(sMethod,sUrl,bAsync);this.readyState=cXMLHttpRequest.OPENED;fReadyStateChange(this);this._object.onreadystatechange=function(){if(bGecko&&!bAsync)
+return;oRequest.readyState=oRequest._object.readyState;fSynchronizeValues(oRequest);if(oRequest._aborted){oRequest.readyState=cXMLHttpRequest.UNSENT;return;}
+if(oRequest.readyState==cXMLHttpRequest.DONE){delete oRequest._data;fCleanTransport(oRequest);if(bIE&&bAsync)
+window.detachEvent("onunload",fOnUnload);}
+if(nState!=oRequest.readyState)
+fReadyStateChange(oRequest);nState=oRequest.readyState;}};function fXMLHttpRequest_send(oRequest){oRequest._object.send(oRequest._data);if(bGecko&&!oRequest._async){oRequest.readyState=cXMLHttpRequest.OPENED;fSynchronizeValues(oRequest);while(oRequest.readyState<cXMLHttpRequest.DONE){oRequest.readyState++;fReadyStateChange(oRequest);if(oRequest._aborted)
+return;}}};cXMLHttpRequest.prototype.send=function(vData){if(cXMLHttpRequest.onsend)
+cXMLHttpRequest.onsend.apply(this,arguments);if(!arguments.length)
+vData=null;if(vData&&vData.nodeType){vData=window.XMLSerializer?new window.XMLSerializer().serializeToString(vData):vData.xml;if(!oRequest._headers["Content-Type"])
+oRequest._object.setRequestHeader("Content-Type","application/xml");}
+this._data=vData;fXMLHttpRequest_send(this);};cXMLHttpRequest.prototype.abort=function(){if(cXMLHttpRequest.onabort)
+cXMLHttpRequest.onabort.apply(this,arguments);if(this.readyState>cXMLHttpRequest.UNSENT)
+this._aborted=true;this._object.abort();fCleanTransport(this);this.readyState=cXMLHttpRequest.UNSENT;delete this._data;};cXMLHttpRequest.prototype.getAllResponseHeaders=function(){return this._object.getAllResponseHeaders();};cXMLHttpRequest.prototype.getResponseHeader=function(sName){return this._object.getResponseHeader(sName);};cXMLHttpRequest.prototype.setRequestHeader=function(sName,sValue){if(!this._headers)
+this._headers={};this._headers[sName]=sValue;return this._object.setRequestHeader(sName,sValue);};cXMLHttpRequest.prototype.addEventListener=function(sName,fHandler,bUseCapture){for(var nIndex=0,oListener;oListener=this._listeners[nIndex];nIndex++)
+if(oListener[0]==sName&&oListener[1]==fHandler&&oListener[2]==bUseCapture)
+return;this._listeners.push([sName,fHandler,bUseCapture]);};cXMLHttpRequest.prototype.removeEventListener=function(sName,fHandler,bUseCapture){for(var nIndex=0,oListener;oListener=this._listeners[nIndex];nIndex++)
+if(oListener[0]==sName&&oListener[1]==fHandler&&oListener[2]==bUseCapture)
+break;if(oListener)
+this._listeners.splice(nIndex,1);};cXMLHttpRequest.prototype.dispatchEvent=function(oEvent){var oEventPseudo={'type':oEvent.type,'target':this,'currentTarget':this,'eventPhase':2,'bubbles':oEvent.bubbles,'cancelable':oEvent.cancelable,'timeStamp':oEvent.timeStamp,'stopPropagation':function(){},'preventDefault':function(){},'initEvent':function(){}};if(oEventPseudo.type=="readystatechange"&&this.onreadystatechange)
+(this.onreadystatechange.handleEvent||this.onreadystatechange).apply(this,[oEventPseudo]);for(var nIndex=0,oListener;oListener=this._listeners[nIndex];nIndex++)
+if(oListener[0]==oEventPseudo.type&&!oListener[2])
+(oListener[1].handleEvent||oListener[1]).apply(this,[oEventPseudo]);};cXMLHttpRequest.prototype.toString=function(){return'['+"object"+' '+"XMLHttpRequest"+']';};cXMLHttpRequest.toString=function(){return'['+"XMLHttpRequest"+']';};function fReadyStateChange(oRequest){if(cXMLHttpRequest.onreadystatechange)
+cXMLHttpRequest.onreadystatechange.apply(oRequest);oRequest.dispatchEvent({'type':"readystatechange",'bubbles':false,'cancelable':false,'timeStamp':new Date+0});};function fGetDocument(oRequest){var oDocument=oRequest.responseXML,sResponse=oRequest.responseText;if(bIE&&sResponse&&oDocument&&!oDocument.documentElement&&oRequest.getResponseHeader("Content-Type").match(/[^\/]+\/[^\+]+\+xml/)){oDocument=new window.ActiveXObject("Microsoft.XMLDOM");oDocument.async=false;oDocument.validateOnParse=false;oDocument.loadXML(sResponse);}
+if(oDocument)
+if((bIE&&oDocument.parseError!=0)||!oDocument.documentElement||(oDocument.documentElement&&oDocument.documentElement.tagName=="parsererror"))
+return null;return oDocument;};function fSynchronizeValues(oRequest){try{oRequest.responseText=oRequest._object.responseText;}catch(e){}
+try{oRequest.responseXML=fGetDocument(oRequest._object);}catch(e){}
+try{oRequest.status=oRequest._object.status;}catch(e){}
+try{oRequest.statusText=oRequest._object.statusText;}catch(e){}};function fCleanTransport(oRequest){oRequest._object.onreadystatechange=new window.Function;};if(!window.Function.prototype.apply){window.Function.prototype.apply=function(oRequest,oArguments){if(!oArguments)
+oArguments=[];oRequest.__func=this;oRequest.__func(oArguments[0],oArguments[1],oArguments[2],oArguments[3],oArguments[4]);delete oRequest.__func;};};OpenLayers.Request.XMLHttpRequest=cXMLHttpRequest;})();OpenLayers.Projection=OpenLayers.Class({proj:null,projCode:null,titleRegEx:/\+title=[^\+]*/,initialize:function(projCode,options){OpenLayers.Util.extend(this,options);this.projCode=projCode;if(window.Proj4js){this.proj=new Proj4js.Proj(projCode);}},getCode:function(){return this.proj?this.proj.srsCode:this.projCode;},getUnits:function(){return this.proj?this.proj.units:null;},toString:function(){return this.getCode();},equals:function(projection){var p=projection,equals=false;if(p){if(window.Proj4js&&this.proj.defData&&p.proj.defData){equals=this.proj.defData.replace(this.titleRegEx,"")==p.proj.defData.replace(this.titleRegEx,"");}else if(p.getCode){var source=this.getCode(),target=p.getCode();equals=source==target||!!OpenLayers.Projection.transforms[source]&&OpenLayers.Projection.transforms[source][target]===OpenLayers.Projection.nullTransform;}}
+return equals;},destroy:function(){delete this.proj;delete this.projCode;},CLASS_NAME:"OpenLayers.Projection"});OpenLayers.Projection.transforms={};OpenLayers.Projection.addTransform=function(from,to,method){if(!OpenLayers.Projection.transforms[from]){OpenLayers.Projection.transforms[from]={};}
+OpenLayers.Projection.transforms[from][to]=method;};OpenLayers.Projection.transform=function(point,source,dest){if(source.proj&&dest.proj){point=Proj4js.transform(source.proj,dest.proj,point);}else if(source&&dest&&OpenLayers.Projection.transforms[source.getCode()]&&OpenLayers.Projection.transforms[source.getCode()][dest.getCode()]){OpenLayers.Projection.transforms[source.getCode()][dest.getCode()](point);}
+return point;};OpenLayers.Projection.nullTransform=function(point){return point;};OpenLayers.Format.KML=OpenLayers.Class(OpenLayers.Format.XML,{namespaces:{kml:"http://www.opengis.net/kml/2.2",gx:"http://www.google.com/kml/ext/2.2"},kmlns:"http://earth.google.com/kml/2.0",placemarksDesc:"No description available",foldersName:"OpenLayers export",foldersDesc:"Exported on "+new Date(),extractAttributes:true,extractStyles:false,extractTracks:false,trackAttributes:null,internalns:null,features:null,styles:null,styleBaseUrl:"",fetched:null,maxDepth:0,initialize:function(options){this.regExes={trimSpace:(/^\s*|\s*$/g),removeSpace:(/\s*/g),splitSpace:(/\s+/),trimComma:(/\s*,\s*/g),kmlColor:(/(\w{2})(\w{2})(\w{2})(\w{2})/),kmlIconPalette:(/root:\/\/icons\/palette-(\d+)(\.\w+)/),straightBracket:(/\$\[(.*?)\]/g)};this.externalProjection=new OpenLayers.Projection("EPSG:4326");OpenLayers.Format.XML.prototype.initialize.apply(this,[options]);},read:function(data){this.features=[];this.styles={};this.fetched={};var options={depth:0,styleBaseUrl:this.styleBaseUrl};return this.parseData(data,options);},parseData:function(data,options){if(typeof data=="string"){data=OpenLayers.Format.XML.prototype.read.apply(this,[data]);}
+var types=["Link","NetworkLink","Style","StyleMap","Placemark"];for(var i=0,len=types.length;i<len;++i){var type=types[i];var nodes=this.getElementsByTagNameNS(data,"*",type);if(nodes.length==0){continue;}
+switch(type.toLowerCase()){case"link":case"networklink":this.parseLinks(nodes,options);break;case"style":if(this.extractStyles){this.parseStyles(nodes,options);}
+break;case"stylemap":if(this.extractStyles){this.parseStyleMaps(nodes,options);}
+break;case"placemark":this.parseFeatures(nodes,options);break;}}
+return this.features;},parseLinks:function(nodes,options){if(options.depth>=this.maxDepth){return false;}
+var newOptions=OpenLayers.Util.extend({},options);newOptions.depth++;for(var i=0,len=nodes.length;i<len;i++){var href=this.parseProperty(nodes[i],"*","href");if(href&&!this.fetched[href]){this.fetched[href]=true;var data=this.fetchLink(href);if(data){this.parseData(data,newOptions);}}}},fetchLink:function(href){var request=OpenLayers.Request.GET({url:href,async:false});if(request){return request.responseText;}},parseStyles:function(nodes,options){for(var i=0,len=nodes.length;i<len;i++){var style=this.parseStyle(nodes[i]);if(style){var styleName=(options.styleBaseUrl||"")+"#"+style.id;this.styles[styleName]=style;}}},parseKmlColor:function(kmlColor){var color=null;if(kmlColor){var matches=kmlColor.match(this.regExes.kmlColor);if(matches){color={color:'#'+matches[4]+matches[3]+matches[2],opacity:parseInt(matches[1],16)/255};}}
+return color;},parseStyle:function(node){var style={};var types=["LineStyle","PolyStyle","IconStyle","BalloonStyle","LabelStyle"];var type,styleTypeNode,nodeList,geometry,parser;for(var i=0,len=types.length;i<len;++i){type=types[i];styleTypeNode=this.getElementsByTagNameNS(node,"*",type)[0];if(!styleTypeNode){continue;}
+switch(type.toLowerCase()){case"linestyle":var kmlColor=this.parseProperty(styleTypeNode,"*","color");var color=this.parseKmlColor(kmlColor);if(color){style["strokeColor"]=color.color;style["strokeOpacity"]=color.opacity;}
+var width=this.parseProperty(styleTypeNode,"*","width");if(width){style["strokeWidth"]=width;}
+break;case"polystyle":var kmlColor=this.parseProperty(styleTypeNode,"*","color");var color=this.parseKmlColor(kmlColor);if(color){style["fillOpacity"]=color.opacity;style["fillColor"]=color.color;}
+var fill=this.parseProperty(styleTypeNode,"*","fill");if(fill=="0"){style["fillColor"]="none";}
+var outline=this.parseProperty(styleTypeNode,"*","outline");if(outline=="0"){style["strokeWidth"]="0";}
+break;case"iconstyle":var scale=parseFloat(this.parseProperty(styleTypeNode,"*","scale")||1);var width=32*scale;var height=32*scale;var iconNode=this.getElementsByTagNameNS(styleTypeNode,"*","Icon")[0];if(iconNode){var href=this.parseProperty(iconNode,"*","href");if(href){var w=this.parseProperty(iconNode,"*","w");var h=this.parseProperty(iconNode,"*","h");var google="http://maps.google.com/mapfiles/kml";if(OpenLayers.String.startsWith(href,google)&&!w&&!h){w=64;h=64;scale=scale/2;}
+w=w||h;h=h||w;if(w){width=parseInt(w)*scale;}
+if(h){height=parseInt(h)*scale;}
+var matches=href.match(this.regExes.kmlIconPalette);if(matches){var palette=matches[1];var file_extension=matches[2];var x=this.parseProperty(iconNode,"*","x");var y=this.parseProperty(iconNode,"*","y");var posX=x?x/32:0;var posY=y?(7-y/32):7;var pos=posY*8+posX;href="http://maps.google.com/mapfiles/kml/pal"
++palette+"/icon"+pos+file_extension;}
+style["graphicOpacity"]=1;style["externalGraphic"]=href;}}
+var hotSpotNode=this.getElementsByTagNameNS(styleTypeNode,"*","hotSpot")[0];if(hotSpotNode){var x=parseFloat(hotSpotNode.getAttribute("x"));var y=parseFloat(hotSpotNode.getAttribute("y"));var xUnits=hotSpotNode.getAttribute("xunits");if(xUnits=="pixels"){style["graphicXOffset"]=-x*scale;}
+else if(xUnits=="insetPixels"){style["graphicXOffset"]=-width+(x*scale);}
+else if(xUnits=="fraction"){style["graphicXOffset"]=-width*x;}
+var yUnits=hotSpotNode.getAttribute("yunits");if(yUnits=="pixels"){style["graphicYOffset"]=-height+(y*scale)+1;}
+else if(yUnits=="insetPixels"){style["graphicYOffset"]=-(y*scale)+1;}
+else if(yUnits=="fraction"){style["graphicYOffset"]=-height*(1-y)+1;}}
+style["graphicWidth"]=width;style["graphicHeight"]=height;break;case"balloonstyle":var balloonStyle=OpenLayers.Util.getXmlNodeValue(styleTypeNode);if(balloonStyle){style["balloonStyle"]=balloonStyle.replace(this.regExes.straightBracket,"${$1}");}
+break;case"labelstyle":var kmlColor=this.parseProperty(styleTypeNode,"*","color");var color=this.parseKmlColor(kmlColor);if(color){style["fontColor"]=color.color;style["fontOpacity"]=color.opacity;}
+break;default:}}
+if(!style["strokeColor"]&&style["fillColor"]){style["strokeColor"]=style["fillColor"];}
+var id=node.getAttribute("id");if(id&&style){style.id=id;}
+return style;},parseStyleMaps:function(nodes,options){for(var i=0,len=nodes.length;i<len;i++){var node=nodes[i];var pairs=this.getElementsByTagNameNS(node,"*","Pair");var id=node.getAttribute("id");for(var j=0,jlen=pairs.length;j<jlen;j++){var pair=pairs[j];var key=this.parseProperty(pair,"*","key");var styleUrl=this.parseProperty(pair,"*","styleUrl");if(styleUrl&&key=="normal"){this.styles[(options.styleBaseUrl||"")+"#"+id]=this.styles[(options.styleBaseUrl||"")+styleUrl];}
+if(styleUrl&&key=="highlight"){}}}},parseFeatures:function(nodes,options){var features=[];for(var i=0,len=nodes.length;i<len;i++){var featureNode=nodes[i];var feature=this.parseFeature.apply(this,[featureNode]);if(feature){if(this.extractStyles&&feature.attributes&&feature.attributes.styleUrl){feature.style=this.getStyle(feature.attributes.styleUrl,options);}
+if(this.extractStyles){var inlineStyleNode=this.getElementsByTagNameNS(featureNode,"*","Style")[0];if(inlineStyleNode){var inlineStyle=this.parseStyle(inlineStyleNode);if(inlineStyle){feature.style=OpenLayers.Util.extend(feature.style,inlineStyle);}}}
+if(this.extractTracks){var tracks=this.getElementsByTagNameNS(featureNode,this.namespaces.gx,"Track");if(tracks&&tracks.length>0){var track=tracks[0];var container={features:[],feature:feature};this.readNode(track,container);if(container.features.length>0){features.push.apply(features,container.features);}}}else{features.push(feature);}}else{throw"Bad Placemark: "+i;}}
+this.features=this.features.concat(features);},readers:{"kml":{"when":function(node,container){container.whens.push(OpenLayers.Date.parse(this.getChildValue(node)));},"_trackPointAttribute":function(node,container){var name=node.nodeName.split(":").pop();container.attributes[name].push(this.getChildValue(node));}},"gx":{"Track":function(node,container){var obj={whens:[],points:[],angles:[]};if(this.trackAttributes){var name;obj.attributes={};for(var i=0,ii=this.trackAttributes.length;i<ii;++i){name=this.trackAttributes[i];obj.attributes[name]=[];if(!(name in this.readers.kml)){this.readers.kml[name]=this.readers.kml._trackPointAttribute;}}}
+this.readChildNodes(node,obj);if(obj.whens.length!==obj.points.length){throw new Error("gx:Track with unequal number of when ("+obj.whens.length+") and gx:coord ("+obj.points.length+") elements.");}
+var hasAngles=obj.angles.length>0;if(hasAngles&&obj.whens.length!==obj.angles.length){throw new Error("gx:Track with unequal number of when ("+obj.whens.length+") and gx:angles ("+obj.angles.length+") elements.");}
+var feature,point,angles;for(var i=0,ii=obj.whens.length;i<ii;++i){feature=container.feature.clone();feature.fid=container.feature.fid||container.feature.id;point=obj.points[i];feature.geometry=point;if("z"in point){feature.attributes.altitude=point.z;}
+if(this.internalProjection&&this.externalProjection){feature.geometry.transform(this.externalProjection,this.internalProjection);}
+if(this.trackAttributes){for(var j=0,jj=this.trackAttributes.length;j<jj;++j){feature.attributes[name]=obj.attributes[this.trackAttributes[j]][i];}}
+feature.attributes.when=obj.whens[i];feature.attributes.trackId=container.feature.id;if(hasAngles){angles=obj.angles[i];feature.attributes.heading=parseFloat(angles[0]);feature.attributes.tilt=parseFloat(angles[1]);feature.attributes.roll=parseFloat(angles[2]);}
+container.features.push(feature);}},"coord":function(node,container){var str=this.getChildValue(node);var coords=str.replace(this.regExes.trimSpace,"").split(/\s+/);var point=new OpenLayers.Geometry.Point(coords[0],coords[1]);if(coords.length>2){point.z=parseFloat(coords[2]);}
+container.points.push(point);},"angles":function(node,container){var str=this.getChildValue(node);var parts=str.replace(this.regExes.trimSpace,"").split(/\s+/);container.angles.push(parts);}}},parseFeature:function(node){var order=["MultiGeometry","Polygon","LineString","Point"];var type,nodeList,geometry,parser;for(var i=0,len=order.length;i<len;++i){type=order[i];this.internalns=node.namespaceURI?node.namespaceURI:this.kmlns;nodeList=this.getElementsByTagNameNS(node,this.internalns,type);if(nodeList.length>0){var parser=this.parseGeometry[type.toLowerCase()];if(parser){geometry=parser.apply(this,[nodeList[0]]);if(this.internalProjection&&this.externalProjection){geometry.transform(this.externalProjection,this.internalProjection);}}else{OpenLayers.Console.error(OpenLayers.i18n("unsupportedGeometryType",{'geomType':type}));}
+break;}}
+var attributes;if(this.extractAttributes){attributes=this.parseAttributes(node);}
+var feature=new OpenLayers.Feature.Vector(geometry,attributes);var fid=node.getAttribute("id")||node.getAttribute("name");if(fid!=null){feature.fid=fid;}
+return feature;},getStyle:function(styleUrl,options){var styleBaseUrl=OpenLayers.Util.removeTail(styleUrl);var newOptions=OpenLayers.Util.extend({},options);newOptions.depth++;newOptions.styleBaseUrl=styleBaseUrl;if(!this.styles[styleUrl]&&!OpenLayers.String.startsWith(styleUrl,"#")&&newOptions.depth<=this.maxDepth&&!this.fetched[styleBaseUrl]){var data=this.fetchLink(styleBaseUrl);if(data){this.parseData(data,newOptions);}}
+var style=OpenLayers.Util.extend({},this.styles[styleUrl]);return style;},parseGeometry:{point:function(node){var nodeList=this.getElementsByTagNameNS(node,this.internalns,"coordinates");var coords=[];if(nodeList.length>0){var coordString=nodeList[0].firstChild.nodeValue;coordString=coordString.replace(this.regExes.removeSpace,"");coords=coordString.split(",");}
+var point=null;if(coords.length>1){if(coords.length==2){coords[2]=null;}
+point=new OpenLayers.Geometry.Point(coords[0],coords[1],coords[2]);}else{throw"Bad coordinate string: "+coordString;}
+return point;},linestring:function(node,ring){var nodeList=this.getElementsByTagNameNS(node,this.internalns,"coordinates");var line=null;if(nodeList.length>0){var coordString=this.getChildValue(nodeList[0]);coordString=coordString.replace(this.regExes.trimSpace,"");coordString=coordString.replace(this.regExes.trimComma,",");var pointList=coordString.split(this.regExes.splitSpace);var numPoints=pointList.length;var points=new Array(numPoints);var coords,numCoords;for(var i=0;i<numPoints;++i){coords=pointList[i].split(",");numCoords=coords.length;if(numCoords>1){if(coords.length==2){coords[2]=null;}
+points[i]=new OpenLayers.Geometry.Point(coords[0],coords[1],coords[2]);}else{throw"Bad LineString point coordinates: "+
+pointList[i];}}
+if(numPoints){if(ring){line=new OpenLayers.Geometry.LinearRing(points);}else{line=new OpenLayers.Geometry.LineString(points);}}else{throw"Bad LineString coordinates: "+coordString;}}
+return line;},polygon:function(node){var nodeList=this.getElementsByTagNameNS(node,this.internalns,"LinearRing");var numRings=nodeList.length;var components=new Array(numRings);if(numRings>0){var ring;for(var i=0,len=nodeList.length;i<len;++i){ring=this.parseGeometry.linestring.apply(this,[nodeList[i],true]);if(ring){components[i]=ring;}else{throw"Bad LinearRing geometry: "+i;}}}
+return new OpenLayers.Geometry.Polygon(components);},multigeometry:function(node){var child,parser;var parts=[];var children=node.childNodes;for(var i=0,len=children.length;i<len;++i){child=children[i];if(child.nodeType==1){var type=(child.prefix)?child.nodeName.split(":")[1]:child.nodeName;var parser=this.parseGeometry[type.toLowerCase()];if(parser){parts.push(parser.apply(this,[child]));}}}
+return new OpenLayers.Geometry.Collection(parts);}},parseAttributes:function(node){var attributes={};var edNodes=node.getElementsByTagName("ExtendedData");if(edNodes.length){attributes=this.parseExtendedData(edNodes[0]);}
+var child,grandchildren,grandchild;var children=node.childNodes;for(var i=0,len=children.length;i<len;++i){child=children[i];if(child.nodeType==1){grandchildren=child.childNodes;if(grandchildren.length>=1&&grandchildren.length<=3){var grandchild;switch(grandchildren.length){case 1:grandchild=grandchildren[0];break;case 2:var c1=grandchildren[0];var c2=grandchildren[1];grandchild=(c1.nodeType==3||c1.nodeType==4)?c1:c2;break;case 3:default:grandchild=grandchildren[1];break;}
+if(grandchild.nodeType==3||grandchild.nodeType==4){var name=(child.prefix)?child.nodeName.split(":")[1]:child.nodeName;var value=OpenLayers.Util.getXmlNodeValue(grandchild);if(value){value=value.replace(this.regExes.trimSpace,"");attributes[name]=value;}}}}}
+return attributes;},parseExtendedData:function(node){var attributes={};var i,len,data,key;var dataNodes=node.getElementsByTagName("Data");for(i=0,len=dataNodes.length;i<len;i++){data=dataNodes[i];key=data.getAttribute("name");var ed={};var valueNode=data.getElementsByTagName("value");if(valueNode.length){ed['value']=this.getChildValue(valueNode[0]);}
+var nameNode=data.getElementsByTagName("displayName");if(nameNode.length){ed['displayName']=this.getChildValue(nameNode[0]);}
+attributes[key]=ed;}
+var simpleDataNodes=node.getElementsByTagName("SimpleData");for(i=0,len=simpleDataNodes.length;i<len;i++){var ed={};data=simpleDataNodes[i];key=data.getAttribute("name");ed['value']=this.getChildValue(data);ed['displayName']=key;attributes[key]=ed;}
+return attributes;},parseProperty:function(xmlNode,namespace,tagName){var value;var nodeList=this.getElementsByTagNameNS(xmlNode,namespace,tagName);try{value=OpenLayers.Util.getXmlNodeValue(nodeList[0]);}catch(e){value=null;}
+return value;},write:function(features){if(!(OpenLayers.Util.isArray(features))){features=[features];}
+var kml=this.createElementNS(this.kmlns,"kml");var folder=this.createFolderXML();for(var i=0,len=features.length;i<len;++i){folder.appendChild(this.createPlacemarkXML(features[i]));}
+kml.appendChild(folder);return OpenLayers.Format.XML.prototype.write.apply(this,[kml]);},createFolderXML:function(){var folder=this.createElementNS(this.kmlns,"Folder");if(this.foldersName){var folderName=this.createElementNS(this.kmlns,"name");var folderNameText=this.createTextNode(this.foldersName);folderName.appendChild(folderNameText);folder.appendChild(folderName);}
+if(this.foldersDesc){var folderDesc=this.createElementNS(this.kmlns,"description");var folderDescText=this.createTextNode(this.foldersDesc);folderDesc.appendChild(folderDescText);folder.appendChild(folderDesc);}
+return folder;},createPlacemarkXML:function(feature){var placemarkName=this.createElementNS(this.kmlns,"name");var name=feature.style&&feature.style.label?feature.style.label:feature.attributes.name||feature.id;placemarkName.appendChild(this.createTextNode(name));var placemarkDesc=this.createElementNS(this.kmlns,"description");var desc=feature.attributes.description||this.placemarksDesc;placemarkDesc.appendChild(this.createTextNode(desc));var placemarkNode=this.createElementNS(this.kmlns,"Placemark");if(feature.fid!=null){placemarkNode.setAttribute("id",feature.fid);}
+placemarkNode.appendChild(placemarkName);placemarkNode.appendChild(placemarkDesc);var geometryNode=this.buildGeometryNode(feature.geometry);placemarkNode.appendChild(geometryNode);return placemarkNode;},buildGeometryNode:function(geometry){var className=geometry.CLASS_NAME;var type=className.substring(className.lastIndexOf(".")+1);var builder=this.buildGeometry[type.toLowerCase()];var node=null;if(builder){node=builder.apply(this,[geometry]);}
+return node;},buildGeometry:{point:function(geometry){var kml=this.createElementNS(this.kmlns,"Point");kml.appendChild(this.buildCoordinatesNode(geometry));return kml;},multipoint:function(geometry){return this.buildGeometry.collection.apply(this,[geometry]);},linestring:function(geometry){var kml=this.createElementNS(this.kmlns,"LineString");kml.appendChild(this.buildCoordinatesNode(geometry));return kml;},multilinestring:function(geometry){return this.buildGeometry.collection.apply(this,[geometry]);},linearring:function(geometry){var kml=this.createElementNS(this.kmlns,"LinearRing");kml.appendChild(this.buildCoordinatesNode(geometry));return kml;},polygon:function(geometry){var kml=this.createElementNS(this.kmlns,"Polygon");var rings=geometry.components;var ringMember,ringGeom,type;for(var i=0,len=rings.length;i<len;++i){type=(i==0)?"outerBoundaryIs":"innerBoundaryIs";ringMember=this.createElementNS(this.kmlns,type);ringGeom=this.buildGeometry.linearring.apply(this,[rings[i]]);ringMember.appendChild(ringGeom);kml.appendChild(ringMember);}
+return kml;},multipolygon:function(geometry){return this.buildGeometry.collection.apply(this,[geometry]);},collection:function(geometry){var kml=this.createElementNS(this.kmlns,"MultiGeometry");var child;for(var i=0,len=geometry.components.length;i<len;++i){child=this.buildGeometryNode.apply(this,[geometry.components[i]]);if(child){kml.appendChild(child);}}
+return kml;}},buildCoordinatesNode:function(geometry){var coordinatesNode=this.createElementNS(this.kmlns,"coordinates");var path;var points=geometry.components;if(points){var point;var numPoints=points.length;var parts=new Array(numPoints);for(var i=0;i<numPoints;++i){point=points[i];parts[i]=this.buildCoordinates(point);}
+path=parts.join(" ");}else{path=this.buildCoordinates(geometry);}
+var txtNode=this.createTextNode(path);coordinatesNode.appendChild(txtNode);return coordinatesNode;},buildCoordinates:function(point){if(this.internalProjection&&this.externalProjection){point=point.clone();point.transform(this.internalProjection,this.externalProjection);}
+return point.x+","+point.y;},CLASS_NAME:"OpenLayers.Format.KML"});OpenLayers.Style=OpenLayers.Class({id:null,name:null,title:null,description:null,layerName:null,isDefault:false,rules:null,context:null,defaultStyle:null,defaultsPerSymbolizer:false,propertyStyles:null,initialize:function(style,options){OpenLayers.Util.extend(this,options);this.rules=[];if(options&&options.rules){this.addRules(options.rules);}
+this.setDefaultStyle(style||OpenLayers.Feature.Vector.style["default"]);this.id=OpenLayers.Util.createUniqueID(this.CLASS_NAME+"_");},destroy:function(){for(var i=0,len=this.rules.length;i<len;i++){this.rules[i].destroy();this.rules[i]=null;}
+this.rules=null;this.defaultStyle=null;},createSymbolizer:function(feature){var style=this.defaultsPerSymbolizer?{}:this.createLiterals(OpenLayers.Util.extend({},this.defaultStyle),feature);var rules=this.rules;var rule,context;var elseRules=[];var appliedRules=false;for(var i=0,len=rules.length;i<len;i++){rule=rules[i];var applies=rule.evaluate(feature);if(applies){if(rule instanceof OpenLayers.Rule&&rule.elseFilter){elseRules.push(rule);}else{appliedRules=true;this.applySymbolizer(rule,style,feature);}}}
+if(appliedRules==false&&elseRules.length>0){appliedRules=true;for(var i=0,len=elseRules.length;i<len;i++){this.applySymbolizer(elseRules[i],style,feature);}}
+if(rules.length>0&&appliedRules==false){style.display="none";}
+if(style.label&&typeof style.label!=="string"){style.label=String(style.label);}
+return style;},applySymbolizer:function(rule,style,feature){var symbolizerPrefix=feature.geometry?this.getSymbolizerPrefix(feature.geometry):OpenLayers.Style.SYMBOLIZER_PREFIXES[0];var symbolizer=rule.symbolizer[symbolizerPrefix]||rule.symbolizer;if(this.defaultsPerSymbolizer===true){var defaults=this.defaultStyle;OpenLayers.Util.applyDefaults(symbolizer,{pointRadius:defaults.pointRadius});if(symbolizer.stroke===true||symbolizer.graphic===true){OpenLayers.Util.applyDefaults(symbolizer,{strokeWidth:defaults.strokeWidth,strokeColor:defaults.strokeColor,strokeOpacity:defaults.strokeOpacity,strokeDashstyle:defaults.strokeDashstyle,strokeLinecap:defaults.strokeLinecap});}
+if(symbolizer.fill===true||symbolizer.graphic===true){OpenLayers.Util.applyDefaults(symbolizer,{fillColor:defaults.fillColor,fillOpacity:defaults.fillOpacity});}
+if(symbolizer.graphic===true){OpenLayers.Util.applyDefaults(symbolizer,{pointRadius:this.defaultStyle.pointRadius,externalGraphic:this.defaultStyle.externalGraphic,graphicName:this.defaultStyle.graphicName,graphicOpacity:this.defaultStyle.graphicOpacity,graphicWidth:this.defaultStyle.graphicWidth,graphicHeight:this.defaultStyle.graphicHeight,graphicXOffset:this.defaultStyle.graphicXOffset,graphicYOffset:this.defaultStyle.graphicYOffset});}}
+return this.createLiterals(OpenLayers.Util.extend(style,symbolizer),feature);},createLiterals:function(style,feature){var context=OpenLayers.Util.extend({},feature.attributes||feature.data);OpenLayers.Util.extend(context,this.context);for(var i in this.propertyStyles){style[i]=OpenLayers.Style.createLiteral(style[i],context,feature,i);}
+return style;},findPropertyStyles:function(){var propertyStyles={};var style=this.defaultStyle;this.addPropertyStyles(propertyStyles,style);var rules=this.rules;var symbolizer,value;for(var i=0,len=rules.length;i<len;i++){symbolizer=rules[i].symbolizer;for(var key in symbolizer){value=symbolizer[key];if(typeof value=="object"){this.addPropertyStyles(propertyStyles,value);}else{this.addPropertyStyles(propertyStyles,symbolizer);break;}}}
+return propertyStyles;},addPropertyStyles:function(propertyStyles,symbolizer){var property;for(var key in symbolizer){property=symbolizer[key];if(typeof property=="string"&&property.match(/\$\{\w+\}/)){propertyStyles[key]=true;}}
+return propertyStyles;},addRules:function(rules){Array.prototype.push.apply(this.rules,rules);this.propertyStyles=this.findPropertyStyles();},setDefaultStyle:function(style){this.defaultStyle=style;this.propertyStyles=this.findPropertyStyles();},getSymbolizerPrefix:function(geometry){var prefixes=OpenLayers.Style.SYMBOLIZER_PREFIXES;for(var i=0,len=prefixes.length;i<len;i++){if(geometry.CLASS_NAME.indexOf(prefixes[i])!=-1){return prefixes[i];}}},clone:function(){var options=OpenLayers.Util.extend({},this);if(this.rules){options.rules=[];for(var i=0,len=this.rules.length;i<len;++i){options.rules.push(this.rules[i].clone());}}
+options.context=this.context&&OpenLayers.Util.extend({},this.context);var defaultStyle=OpenLayers.Util.extend({},this.defaultStyle);return new OpenLayers.Style(defaultStyle,options);},CLASS_NAME:"OpenLayers.Style"});OpenLayers.Style.createLiteral=function(value,context,feature,property){if(typeof value=="string"&&value.indexOf("${")!=-1){value=OpenLayers.String.format(value,context,[feature,property]);value=(isNaN(value)||!value)?value:parseFloat(value);}
+return value;};OpenLayers.Style.SYMBOLIZER_PREFIXES=['Point','Line','Polygon','Text','Raster'];OpenLayers.Filter=OpenLayers.Class({initialize:function(options){OpenLayers.Util.extend(this,options);},destroy:function(){},evaluate:function(context){return true;},clone:function(){return null;},CLASS_NAME:"OpenLayers.Filter"});OpenLayers.Filter.Spatial=OpenLayers.Class(OpenLayers.Filter,{type:null,property:null,value:null,distance:null,distanceUnits:null,initialize:function(options){OpenLayers.Filter.prototype.initialize.apply(this,[options]);},evaluate:function(feature){var intersect=false;switch(this.type){case OpenLayers.Filter.Spatial.BBOX:case OpenLayers.Filter.Spatial.INTERSECTS:if(feature.geometry){var geom=this.value;if(this.value.CLASS_NAME=="OpenLayers.Bounds"){geom=this.value.toGeometry();}
+if(feature.geometry.intersects(geom)){intersect=true;}}
+break;default:OpenLayers.Console.error(OpenLayers.i18n("filterEvaluateNotImplemented"));break;}
+return intersect;},clone:function(){var options=OpenLayers.Util.applyDefaults({value:this.value&&this.value.clone&&this.value.clone()},this);return new OpenLayers.Filter.Spatial(options);},CLASS_NAME:"OpenLayers.Filter.Spatial"});OpenLayers.Filter.Spatial.BBOX="BBOX";OpenLayers.Filter.Spatial.INTERSECTS="INTERSECTS";OpenLayers.Filter.Spatial.DWITHIN="DWITHIN";OpenLayers.Filter.Spatial.WITHIN="WITHIN";OpenLayers.Filter.Spatial.CONTAINS="CONTAINS";OpenLayers.Strategy.BBOX=OpenLayers.Class(OpenLayers.Strategy,{bounds:null,resolution:null,ratio:2,resFactor:null,response:null,activate:function(){var activated=OpenLayers.Strategy.prototype.activate.call(this);if(activated){this.layer.events.on({"moveend":this.update,scope:this});this.layer.events.on({"refresh":this.update,scope:this});if(this.layer.visibility===true&&this.layer.inRange===true){this.update();}else{this.layer.events.on({"visibilitychanged":this.update,scope:this});}}
+return activated;},deactivate:function(){var deactivated=OpenLayers.Strategy.prototype.deactivate.call(this);if(deactivated){this.layer.events.un({"moveend":this.update,"refresh":this.update,"visibilitychanged":this.update,scope:this});}
+return deactivated;},update:function(options){var mapBounds=this.getMapBounds();if(mapBounds!==null&&((options&&options.force)||this.invalidBounds(mapBounds))){this.calculateBounds(mapBounds);this.resolution=this.layer.map.getResolution();this.triggerRead(options);}},getMapBounds:function(){if(this.layer.map===null){return null;}
+var bounds=this.layer.map.getExtent();if(bounds&&!this.layer.projection.equals(this.layer.map.getProjectionObject())){bounds=bounds.clone().transform(this.layer.map.getProjectionObject(),this.layer.projection);}
+return bounds;},invalidBounds:function(mapBounds){if(!mapBounds){mapBounds=this.getMapBounds();}
+var invalid=!this.bounds||!this.bounds.containsBounds(mapBounds);if(!invalid&&this.resFactor){var ratio=this.resolution/this.layer.map.getResolution();invalid=(ratio>=this.resFactor||ratio<=(1/this.resFactor));}
+return invalid;},calculateBounds:function(mapBounds){if(!mapBounds){mapBounds=this.getMapBounds();}
+var center=mapBounds.getCenterLonLat();var dataWidth=mapBounds.getWidth()*this.ratio;var dataHeight=mapBounds.getHeight()*this.ratio;this.bounds=new OpenLayers.Bounds(center.lon-(dataWidth/2),center.lat-(dataHeight/2),center.lon+(dataWidth/2),center.lat+(dataHeight/2));},triggerRead:function(options){if(this.response){this.layer.protocol.abort(this.response);this.layer.events.triggerEvent("loadend");}
+this.layer.events.triggerEvent("loadstart");this.response=this.layer.protocol.read(OpenLayers.Util.applyDefaults({filter:this.createFilter(),callback:this.merge,scope:this},options));},createFilter:function(){var filter=new OpenLayers.Filter.Spatial({type:OpenLayers.Filter.Spatial.BBOX,value:this.bounds,projection:this.layer.projection});if(this.layer.filter){filter=new OpenLayers.Filter.Logical({type:OpenLayers.Filter.Logical.AND,filters:[this.layer.filter,filter]});}
+return filter;},merge:function(resp){this.layer.destroyFeatures();var features=resp.features;if(features&&features.length>0){var remote=this.layer.projection;var local=this.layer.map.getProjectionObject();if(!local.equals(remote)){var geom;for(var i=0,len=features.length;i<len;++i){geom=features[i].geometry;if(geom){geom.transform(remote,local);}}}
+this.layer.addFeatures(features);}
+this.response=null;this.layer.events.triggerEvent("loadend");},CLASS_NAME:"OpenLayers.Strategy.BBOX"});OpenLayers.Handler.Feature=OpenLayers.Class(OpenLayers.Handler,{EVENTMAP:{'click':{'in':'click','out':'clickout'},'mousemove':{'in':'over','out':'out'},'dblclick':{'in':'dblclick','out':null},'mousedown':{'in':null,'out':null},'mouseup':{'in':null,'out':null},'touchstart':{'in':'click','out':'clickout'}},feature:null,lastFeature:null,down:null,up:null,touch:false,clickTolerance:4,geometryTypes:null,stopClick:true,stopDown:true,stopUp:false,initialize:function(control,layer,callbacks,options){OpenLayers.Handler.prototype.initialize.apply(this,[control,callbacks,options]);this.layer=layer;},touchstart:function(evt){if(!this.touch){this.touch=true;this.map.events.un({mousedown:this.mousedown,mouseup:this.mouseup,mousemove:this.mousemove,click:this.click,dblclick:this.dblclick,scope:this});}
+return OpenLayers.Event.isMultiTouch(evt)?true:this.mousedown(evt);},touchmove:function(evt){OpenLayers.Event.stop(evt);},mousedown:function(evt){this.down=evt.xy;return this.handle(evt)?!this.stopDown:true;},mouseup:function(evt){this.up=evt.xy;return this.handle(evt)?!this.stopUp:true;},click:function(evt){return this.handle(evt)?!this.stopClick:true;},mousemove:function(evt){if(!this.callbacks['over']&&!this.callbacks['out']){return true;}
+this.handle(evt);return true;},dblclick:function(evt){return!this.handle(evt);},geometryTypeMatches:function(feature){return this.geometryTypes==null||OpenLayers.Util.indexOf(this.geometryTypes,feature.geometry.CLASS_NAME)>-1;},handle:function(evt){if(this.feature&&!this.feature.layer){this.feature=null;}
+var type=evt.type;var handled=false;var previouslyIn=!!(this.feature);var click=(type=="click"||type=="dblclick"||type=="touchstart");this.feature=this.layer.getFeatureFromEvent(evt);if(this.feature&&!this.feature.layer){this.feature=null;}
+if(this.lastFeature&&!this.lastFeature.layer){this.lastFeature=null;}
+if(this.feature){if(type==="touchstart"){OpenLayers.Event.stop(evt);}
+var inNew=(this.feature!=this.lastFeature);if(this.geometryTypeMatches(this.feature)){if(previouslyIn&&inNew){if(this.lastFeature){this.triggerCallback(type,'out',[this.lastFeature]);}
+this.triggerCallback(type,'in',[this.feature]);}else if(!previouslyIn||click){this.triggerCallback(type,'in',[this.feature]);}
+this.lastFeature=this.feature;handled=true;}else{if(this.lastFeature&&(previouslyIn&&inNew||click)){this.triggerCallback(type,'out',[this.lastFeature]);}
+this.feature=null;}}else{if(this.lastFeature&&(previouslyIn||click)){this.triggerCallback(type,'out',[this.lastFeature]);}}
+return handled;},triggerCallback:function(type,mode,args){var key=this.EVENTMAP[type][mode];if(key){if(type=='click'&&this.up&&this.down){var dpx=Math.sqrt(Math.pow(this.up.x-this.down.x,2)+
+Math.pow(this.up.y-this.down.y,2));if(dpx<=this.clickTolerance){this.callback(key,args);}}else{this.callback(key,args);}}},activate:function(){var activated=false;if(OpenLayers.Handler.prototype.activate.apply(this,arguments)){this.moveLayerToTop();this.map.events.on({"removelayer":this.handleMapEvents,"changelayer":this.handleMapEvents,scope:this});activated=true;}
+return activated;},deactivate:function(){var deactivated=false;if(OpenLayers.Handler.prototype.deactivate.apply(this,arguments)){this.moveLayerBack();this.feature=null;this.lastFeature=null;this.down=null;this.up=null;this.touch=false;this.map.events.un({"removelayer":this.handleMapEvents,"changelayer":this.handleMapEvents,scope:this});deactivated=true;}
+return deactivated;},handleMapEvents:function(evt){if(evt.type=="removelayer"||evt.property=="order"){this.moveLayerToTop();}},moveLayerToTop:function(){var index=Math.max(this.map.Z_INDEX_BASE['Feature']-1,this.layer.getZIndex())+1;this.layer.setZIndex(index);},moveLayerBack:function(){var index=this.layer.getZIndex()-1;if(index>=this.map.Z_INDEX_BASE['Feature']){this.layer.setZIndex(index);}else{this.map.setLayerZIndex(this.layer,this.map.getLayerIndex(this.layer));}},CLASS_NAME:"OpenLayers.Handler.Feature"});OpenLayers.Tween=OpenLayers.Class({INTERVAL:10,easing:null,begin:null,finish:null,duration:null,callbacks:null,time:null,interval:null,playing:false,initialize:function(easing){this.easing=(easing)?easing:OpenLayers.Easing.Expo.easeOut;},start:function(begin,finish,duration,options){this.playing=true;this.begin=begin;this.finish=finish;this.duration=duration;this.callbacks=options.callbacks;this.time=0;if(this.interval){window.clearInterval(this.interval);this.interval=null;}
+if(this.callbacks&&this.callbacks.start){this.callbacks.start.call(this,this.begin);}
+this.interval=window.setInterval(OpenLayers.Function.bind(this.play,this),this.INTERVAL);},stop:function(){if(!this.playing){return;}
+if(this.callbacks&&this.callbacks.done){this.callbacks.done.call(this,this.finish);}
+window.clearInterval(this.interval);this.interval=null;this.playing=false;},play:function(){var value={};for(var i in this.begin){var b=this.begin[i];var f=this.finish[i];if(b==null||f==null||isNaN(b)||isNaN(f)){OpenLayers.Console.error('invalid value for Tween');}
+var c=f-b;value[i]=this.easing.apply(this,[this.time,b,c,this.duration]);}
+this.time++;if(this.callbacks&&this.callbacks.eachStep){this.callbacks.eachStep.call(this,value);}
+if(this.time>this.duration){this.stop();}},CLASS_NAME:"OpenLayers.Tween"});OpenLayers.Easing={CLASS_NAME:"OpenLayers.Easing"};OpenLayers.Easing.Linear={easeIn:function(t,b,c,d){return c*t/d+b;},easeOut:function(t,b,c,d){return c*t/d+b;},easeInOut:function(t,b,c,d){return c*t/d+b;},CLASS_NAME:"OpenLayers.Easing.Linear"};OpenLayers.Easing.Expo={easeIn:function(t,b,c,d){return(t==0)?b:c*Math.pow(2,10*(t/d-1))+b;},easeOut:function(t,b,c,d){return(t==d)?b+c:c*(-Math.pow(2,-10*t/d)+1)+b;},easeInOut:function(t,b,c,d){if(t==0)return b;if(t==d)return b+c;if((t/=d/2)<1)return c/2*Math.pow(2,10*(t-1))+b;return c/2*(-Math.pow(2,-10*--t)+2)+b;},CLASS_NAME:"OpenLayers.Easing.Expo"};OpenLayers.Easing.Quad={easeIn:function(t,b,c,d){return c*(t/=d)*t+b;},easeOut:function(t,b,c,d){return-c*(t/=d)*(t-2)+b;},easeInOut:function(t,b,c,d){if((t/=d/2)<1)return c/2*t*t+b;return-c/2*((--t)*(t-2)-1)+b;},CLASS_NAME:"OpenLayers.Easing.Quad"};OpenLayers.Map=OpenLayers.Class({Z_INDEX_BASE:{BaseLayer:100,Overlay:325,Feature:725,Popup:750,Control:1000},EVENT_TYPES:["preaddlayer","addlayer","preremovelayer","removelayer","changelayer","movestart","move","moveend","zoomend","popupopen","popupclose","addmarker","removemarker","clearmarkers","mouseover","mouseout","mousemove","dragstart","drag","dragend","changebaselayer"],id:null,fractionalZoom:false,events:null,allOverlays:false,div:null,dragging:false,size:null,viewPortDiv:null,layerContainerOrigin:null,layerContainerDiv:null,layers:null,controls:null,popups:null,baseLayer:null,center:null,resolution:null,zoom:0,panRatio:1.5,viewRequestID:0,tileSize:null,projection:"EPSG:4326",units:'degrees',resolutions:null,maxResolution:1.40625,minResolution:null,maxScale:null,minScale:null,maxExtent:null,minExtent:null,restrictedExtent:null,numZoomLevels:16,theme:null,displayProjection:null,fallThrough:true,panTween:null,eventListeners:null,panMethod:OpenLayers.Easing.Expo.easeOut,panDuration:50,paddingForPopups:null,minPx:null,maxPx:null,initialize:function(div,options){if(arguments.length===1&&typeof div==="object"){options=div;div=options&&options.div;}
+this.tileSize=new OpenLayers.Size(OpenLayers.Map.TILE_WIDTH,OpenLayers.Map.TILE_HEIGHT);this.maxExtent=new OpenLayers.Bounds(-180,-90,180,90);this.paddingForPopups=new OpenLayers.Bounds(15,15,15,15);this.theme=OpenLayers._getScriptLocation()+'theme/default/style.css';OpenLayers.Util.extend(this,options);this.layers=[];this.id=OpenLayers.Util.createUniqueID("OpenLayers.Map_");this.div=OpenLayers.Util.getElement(div);if(!this.div){this.div=document.createElement("div");this.div.style.height="1px";this.div.style.width="1px";}
+OpenLayers.Element.addClass(this.div,'olMap');var id=this.id+"_OpenLayers_ViewPort";this.viewPortDiv=OpenLayers.Util.createDiv(id,null,null,null,"relative",null,"hidden");this.viewPortDiv.style.width="100%";this.viewPortDiv.style.height="100%";this.viewPortDiv.className="olMapViewport";this.div.appendChild(this.viewPortDiv);var eventsDiv=document.createElement("div");eventsDiv.id=this.id+"_events";eventsDiv.style.position="absolute";eventsDiv.style.width="100%";eventsDiv.style.height="100%";eventsDiv.style.zIndex=this.Z_INDEX_BASE.Control-1;this.viewPortDiv.appendChild(eventsDiv);this.eventsDiv=eventsDiv;this.events=new OpenLayers.Events(this,this.eventsDiv,this.EVENT_TYPES,this.fallThrough,{includeXY:true});id=this.id+"_OpenLayers_Container";this.layerContainerDiv=OpenLayers.Util.createDiv(id);this.layerContainerDiv.style.zIndex=this.Z_INDEX_BASE['Popup']-1;this.eventsDiv.appendChild(this.layerContainerDiv);this.updateSize();if(this.eventListeners instanceof Object){this.events.on(this.eventListeners);}
+this.events.register("movestart",this,this.updateSize);if(OpenLayers.String.contains(navigator.appName,"Microsoft")){this.events.register("resize",this,this.updateSize);}else{this.updateSizeDestroy=OpenLayers.Function.bind(this.updateSize,this);OpenLayers.Event.observe(window,'resize',this.updateSizeDestroy);}
+if(this.theme){var addNode=true;var nodes=document.getElementsByTagName('link');for(var i=0,len=nodes.length;i<len;++i){if(OpenLayers.Util.isEquivalentUrl(nodes.item(i).href,this.theme)){addNode=false;break;}}
+if(addNode){var cssNode=document.createElement('link');cssNode.setAttribute('rel','stylesheet');cssNode.setAttribute('type','text/css');cssNode.setAttribute('href',this.theme);document.getElementsByTagName('head')[0].appendChild(cssNode);}}
+if(this.controls==null){if(OpenLayers.Control!=null){this.controls=[new OpenLayers.Control.Navigation(),new OpenLayers.Control.PanZoom(),new OpenLayers.Control.ArgParser(),new OpenLayers.Control.Attribution()];}else{this.controls=[];}}
+for(var i=0,len=this.controls.length;i<len;i++){this.addControlToMap(this.controls[i]);}
+this.popups=[];this.unloadDestroy=OpenLayers.Function.bind(this.destroy,this);OpenLayers.Event.observe(window,'unload',this.unloadDestroy);if(options&&options.layers){delete this.center;this.addLayers(options.layers);if(options.center){this.setCenter(options.center,options.zoom);}}},render:function(div){this.div=OpenLayers.Util.getElement(div);OpenLayers.Element.addClass(this.div,'olMap');this.viewPortDiv.parentNode.removeChild(this.viewPortDiv);this.div.appendChild(this.viewPortDiv);this.updateSize();},unloadDestroy:null,updateSizeDestroy:null,destroy:function(){if(!this.unloadDestroy){return false;}
+if(this.panTween){this.panTween.stop();this.panTween=null;}
+OpenLayers.Event.stopObserving(window,'unload',this.unloadDestroy);this.unloadDestroy=null;if(this.updateSizeDestroy){OpenLayers.Event.stopObserving(window,'resize',this.updateSizeDestroy);}else{this.events.unregister("resize",this,this.updateSize);}
+this.paddingForPopups=null;if(this.controls!=null){for(var i=this.controls.length-1;i>=0;--i){this.controls[i].destroy();}
+this.controls=null;}
+if(this.layers!=null){for(var i=this.layers.length-1;i>=0;--i){this.layers[i].destroy(false);}
+this.layers=null;}
+if(this.viewPortDiv){this.div.removeChild(this.viewPortDiv);}
+this.viewPortDiv=null;if(this.eventListeners){this.events.un(this.eventListeners);this.eventListeners=null;}
+this.events.destroy();this.events=null;},setOptions:function(options){var updatePxExtent=this.minPx&&options.restrictedExtent!=this.restrictedExtent;OpenLayers.Util.extend(this,options);updatePxExtent&&this.moveTo(this.getCachedCenter(),this.zoom,{forceZoomChange:true});},getTileSize:function(){return this.tileSize;},getBy:function(array,property,match){var test=(typeof match.test=="function");var found=OpenLayers.Array.filter(this[array],function(item){return item[property]==match||(test&&match.test(item[property]));});return found;},getLayersBy:function(property,match){return this.getBy("layers",property,match);},getLayersByName:function(match){return this.getLayersBy("name",match);},getLayersByClass:function(match){return this.getLayersBy("CLASS_NAME",match);},getControlsBy:function(property,match){return this.getBy("controls",property,match);},getControlsByClass:function(match){return this.getControlsBy("CLASS_NAME",match);},getLayer:function(id){var foundLayer=null;for(var i=0,len=this.layers.length;i<len;i++){var layer=this.layers[i];if(layer.id==id){foundLayer=layer;break;}}
+return foundLayer;},setLayerZIndex:function(layer,zIdx){layer.setZIndex(this.Z_INDEX_BASE[layer.isBaseLayer?'BaseLayer':'Overlay']
++zIdx*5);},resetLayersZIndex:function(){for(var i=0,len=this.layers.length;i<len;i++){var layer=this.layers[i];this.setLayerZIndex(layer,i);}},addLayer:function(layer){for(var i=0,len=this.layers.length;i<len;i++){if(this.layers[i]==layer){var msg=OpenLayers.i18n('layerAlreadyAdded',{'layerName':layer.name});OpenLayers.Console.warn(msg);return false;}}
+if(this.events.triggerEvent("preaddlayer",{layer:layer})===false){return;}
+if(this.allOverlays){layer.isBaseLayer=false;}
+layer.div.className="olLayerDiv";layer.div.style.overflow="";this.setLayerZIndex(layer,this.layers.length);if(layer.isFixed){this.viewPortDiv.appendChild(layer.div);}else{this.layerContainerDiv.appendChild(layer.div);}
+this.layers.push(layer);layer.setMap(this);if(layer.isBaseLayer||(this.allOverlays&&!this.baseLayer)){if(this.baseLayer==null){this.setBaseLayer(layer);}else{layer.setVisibility(false);}}else{layer.redraw();}
+this.events.triggerEvent("addlayer",{layer:layer});layer.events.triggerEvent("added",{map:this,layer:layer});layer.afterAdd();},addLayers:function(layers){for(var i=0,len=layers.length;i<len;i++){this.addLayer(layers[i]);}},removeLayer:function(layer,setNewBaseLayer){if(this.events.triggerEvent("preremovelayer",{layer:layer})===false){return;}
+if(setNewBaseLayer==null){setNewBaseLayer=true;}
+if(layer.isFixed){this.viewPortDiv.removeChild(layer.div);}else{this.layerContainerDiv.removeChild(layer.div);}
+OpenLayers.Util.removeItem(this.layers,layer);layer.removeMap(this);layer.map=null;if(this.baseLayer==layer){this.baseLayer=null;if(setNewBaseLayer){for(var i=0,len=this.layers.length;i<len;i++){var iLayer=this.layers[i];if(iLayer.isBaseLayer||this.allOverlays){this.setBaseLayer(iLayer);break;}}}}
+this.resetLayersZIndex();this.events.triggerEvent("removelayer",{layer:layer});layer.events.triggerEvent("removed",{map:this,layer:layer});},getNumLayers:function(){return this.layers.length;},getLayerIndex:function(layer){return OpenLayers.Util.indexOf(this.layers,layer);},setLayerIndex:function(layer,idx){var base=this.getLayerIndex(layer);if(idx<0){idx=0;}else if(idx>this.layers.length){idx=this.layers.length;}
+if(base!=idx){this.layers.splice(base,1);this.layers.splice(idx,0,layer);for(var i=0,len=this.layers.length;i<len;i++){this.setLayerZIndex(this.layers[i],i);}
+this.events.triggerEvent("changelayer",{layer:layer,property:"order"});if(this.allOverlays){if(idx===0){this.setBaseLayer(layer);}else if(this.baseLayer!==this.layers[0]){this.setBaseLayer(this.layers[0]);}}}},raiseLayer:function(layer,delta){var idx=this.getLayerIndex(layer)+delta;this.setLayerIndex(layer,idx);},setBaseLayer:function(newBaseLayer){if(newBaseLayer!=this.baseLayer){if(OpenLayers.Util.indexOf(this.layers,newBaseLayer)!=-1){var center=this.getCachedCenter();var newResolution=OpenLayers.Util.getResolutionFromScale(this.getScale(),newBaseLayer.units);if(this.baseLayer!=null&&!this.allOverlays){this.baseLayer.setVisibility(false);}
+this.baseLayer=newBaseLayer;this.viewRequestID++;if(!this.allOverlays||this.baseLayer.visibility){this.baseLayer.setVisibility(true);}
+if(center!=null){var newZoom=this.getZoomForResolution(newResolution||this.resolution,true);this.setCenter(center,newZoom,false,true);}
+this.events.triggerEvent("changebaselayer",{layer:this.baseLayer});}}},addControl:function(control,px){this.controls.push(control);this.addControlToMap(control,px);},addControls:function(controls,pixels){var pxs=(arguments.length===1)?[]:pixels;for(var i=0,len=controls.length;i<len;i++){var ctrl=controls[i];var px=(pxs[i])?pxs[i]:null;this.addControl(ctrl,px);}},addControlToMap:function(control,px){control.outsideViewport=(control.div!=null);if(this.displayProjection&&!control.displayProjection){control.displayProjection=this.displayProjection;}
+control.setMap(this);var div=control.draw(px);if(div){if(!control.outsideViewport){div.style.zIndex=this.Z_INDEX_BASE['Control']+
+this.controls.length;this.viewPortDiv.appendChild(div);}}
+if(control.autoActivate){control.activate();}},getControl:function(id){var returnControl=null;for(var i=0,len=this.controls.length;i<len;i++){var control=this.controls[i];if(control.id==id){returnControl=control;break;}}
+return returnControl;},removeControl:function(control){if((control)&&(control==this.getControl(control.id))){if(control.div&&(control.div.parentNode==this.viewPortDiv)){this.viewPortDiv.removeChild(control.div);}
+OpenLayers.Util.removeItem(this.controls,control);}},addPopup:function(popup,exclusive){if(exclusive){for(var i=this.popups.length-1;i>=0;--i){this.removePopup(this.popups[i]);}}
+popup.map=this;this.popups.push(popup);var popupDiv=popup.draw();if(popupDiv){popupDiv.style.zIndex=this.Z_INDEX_BASE['Popup']+
+this.popups.length;this.layerContainerDiv.appendChild(popupDiv);}},removePopup:function(popup){OpenLayers.Util.removeItem(this.popups,popup);if(popup.div){try{this.layerContainerDiv.removeChild(popup.div);}
+catch(e){}}
+popup.map=null;},getSize:function(){var size=null;if(this.size!=null){size=this.size.clone();}
+return size;},updateSize:function(){var newSize=this.getCurrentSize();if(newSize&&!isNaN(newSize.h)&&!isNaN(newSize.w)){this.events.clearMouseCache();var oldSize=this.getSize();if(oldSize==null){this.size=oldSize=newSize;}
+if(!newSize.equals(oldSize)){this.size=newSize;for(var i=0,len=this.layers.length;i<len;i++){this.layers[i].onMapResize();}
+var center=this.getCachedCenter();if(this.baseLayer!=null&&center!=null){var zoom=this.getZoom();this.zoom=null;this.setCenter(center,zoom);}}}},getCurrentSize:function(){var size=new OpenLayers.Size(this.div.clientWidth,this.div.clientHeight);if(size.w==0&&size.h==0||isNaN(size.w)&&isNaN(size.h)){size.w=this.div.offsetWidth;size.h=this.div.offsetHeight;}
+if(size.w==0&&size.h==0||isNaN(size.w)&&isNaN(size.h)){size.w=parseInt(this.div.style.width);size.h=parseInt(this.div.style.height);}
+return size;},calculateBounds:function(center,resolution){var extent=null;if(center==null){center=this.getCachedCenter();}
+if(resolution==null){resolution=this.getResolution();}
+if((center!=null)&&(resolution!=null)){var size=this.getSize();var w_deg=size.w*resolution;var h_deg=size.h*resolution;extent=new OpenLayers.Bounds(center.lon-w_deg/2,center.lat-h_deg/2,center.lon+w_deg/2,center.lat+h_deg/2);}
+return extent;},getCenter:function(){var center=null;var cachedCenter=this.getCachedCenter();if(cachedCenter){center=cachedCenter.clone();}
+return center;},getCachedCenter:function(){if(!this.center&&this.size){this.center=this.getLonLatFromViewPortPx(new OpenLayers.Pixel(this.size.w/2,this.size.h/2));}
+return this.center;},getZoom:function(){return this.zoom;},pan:function(dx,dy,options){options=OpenLayers.Util.applyDefaults(options,{animate:true,dragging:false});if(options.dragging){if(dx!=0||dy!=0){this.moveByPx(dx,dy);}}else{var centerPx=this.getViewPortPxFromLonLat(this.getCachedCenter());var newCenterPx=centerPx.add(dx,dy);if(this.dragging||!newCenterPx.equals(centerPx)){var newCenterLonLat=this.getLonLatFromViewPortPx(newCenterPx);if(options.animate){this.panTo(newCenterLonLat);}else{this.moveTo(newCenterLonLat);this.dragging=false;this.events.triggerEvent("moveend");}}}},panTo:function(lonlat){if(this.panMethod&&this.getExtent().scale(this.panRatio).containsLonLat(lonlat)){if(!this.panTween){this.panTween=new OpenLayers.Tween(this.panMethod);}
+var center=this.getCachedCenter();if(lonlat.equals(center)){return;}
+var from=this.getPixelFromLonLat(center);var to=this.getPixelFromLonLat(lonlat);var vector={x:to.x-from.x,y:to.y-from.y};var last={x:0,y:0};this.panTween.start({x:0,y:0},vector,this.panDuration,{callbacks:{eachStep:OpenLayers.Function.bind(function(px){var x=px.x-last.x,y=px.y-last.y;this.moveByPx(x,y);last.x=Math.round(px.x);last.y=Math.round(px.y);},this),done:OpenLayers.Function.bind(function(px){this.moveTo(lonlat);this.dragging=false;this.events.triggerEvent("moveend");},this)}});}else{this.setCenter(lonlat);}},setCenter:function(lonlat,zoom,dragging,forceZoomChange){this.panTween&&this.panTween.stop();this.moveTo(lonlat,zoom,{'dragging':dragging,'forceZoomChange':forceZoomChange});},moveByPx:function(dx,dy){var hw=this.size.w/2;var hh=this.size.h/2;var x=hw+dx;var y=hh+dy;var wrapDateLine=this.baseLayer.wrapDateLine;var xRestriction=0;var yRestriction=0;if(this.restrictedExtent){xRestriction=hw;yRestriction=hh;wrapDateLine=false;}
+dx=wrapDateLine||x<=this.maxPx.x-xRestriction&&x>=this.minPx.x+xRestriction?Math.round(dx):0;dy=y<=this.maxPx.y-yRestriction&&y>=this.minPx.y+yRestriction?Math.round(dy):0;var minX=this.minPx.x,maxX=this.maxPx.x;if(dx||dy){if(!this.dragging){this.dragging=true;this.events.triggerEvent("movestart");}
+this.center=null;if(dx){this.layerContainerDiv.style.left=parseInt(this.layerContainerDiv.style.left)-dx+"px";this.minPx.x-=dx;this.maxPx.x-=dx;if(wrapDateLine){if(this.maxPx.x>maxX){this.maxPx.x-=(maxX-minX);}
+if(this.minPx.x<minX){this.minPx.x+=(maxX-minX);}}}
+if(dy){this.layerContainerDiv.style.top=parseInt(this.layerContainerDiv.style.top)-dy+"px";this.minPx.y-=dy;this.maxPx.y-=dy;}
+var layer,i,len;for(i=0,len=this.layers.length;i<len;++i){layer=this.layers[i];if(layer.visibility&&(layer===this.baseLayer||layer.inRange)){layer.moveByPx(dx,dy);layer.events.triggerEvent("move");}}
+this.events.triggerEvent("move");}},moveTo:function(lonlat,zoom,options){if(!options){options={};}
+if(zoom!=null){zoom=parseFloat(zoom);if(!this.fractionalZoom){zoom=Math.round(zoom);}}
+var dragging=options.dragging||this.dragging;var forceZoomChange=options.forceZoomChange;if(!this.getCachedCenter()&&!this.isValidLonLat(lonlat)){lonlat=this.maxExtent.getCenterLonLat();this.center=lonlat.clone();}
+if(this.restrictedExtent!=null){if(lonlat==null){lonlat=this.center;}
+if(zoom==null){zoom=this.getZoom();}
+var resolution=this.getResolutionForZoom(zoom);var extent=this.calculateBounds(lonlat,resolution);if(!this.restrictedExtent.containsBounds(extent)){var maxCenter=this.restrictedExtent.getCenterLonLat();if(extent.getWidth()>this.restrictedExtent.getWidth()){lonlat=new OpenLayers.LonLat(maxCenter.lon,lonlat.lat);}else if(extent.left<this.restrictedExtent.left){lonlat=lonlat.add(this.restrictedExtent.left-
+extent.left,0);}else if(extent.right>this.restrictedExtent.right){lonlat=lonlat.add(this.restrictedExtent.right-
+extent.right,0);}
+if(extent.getHeight()>this.restrictedExtent.getHeight()){lonlat=new OpenLayers.LonLat(lonlat.lon,maxCenter.lat);}else if(extent.bottom<this.restrictedExtent.bottom){lonlat=lonlat.add(0,this.restrictedExtent.bottom-
+extent.bottom);}
+else if(extent.top>this.restrictedExtent.top){lonlat=lonlat.add(0,this.restrictedExtent.top-
+extent.top);}}}
+var zoomChanged=forceZoomChange||((this.isValidZoomLevel(zoom))&&(zoom!=this.getZoom()));var centerChanged=(this.isValidLonLat(lonlat))&&(!lonlat.equals(this.center));if(zoomChanged||centerChanged||dragging){dragging||this.events.triggerEvent("movestart");if(centerChanged){if(!zoomChanged&&this.center){this.centerLayerContainer(lonlat);}
+this.center=lonlat.clone();}
+var res=zoomChanged?this.getResolutionForZoom(zoom):this.getResolution();if(zoomChanged||this.layerContainerOrigin==null){this.layerContainerOrigin=this.getCachedCenter();this.layerContainerDiv.style.left="0px";this.layerContainerDiv.style.top="0px";var maxExtent=this.getMaxExtent({restricted:true});var maxExtentCenter=maxExtent.getCenterLonLat();var lonDelta=this.center.lon-maxExtentCenter.lon;var latDelta=maxExtentCenter.lat-this.center.lat;var extentWidth=Math.round(maxExtent.getWidth()/res);var extentHeight=Math.round(maxExtent.getHeight()/res);var left=(this.size.w-extentWidth)/2-lonDelta/res;var top=(this.size.h-extentHeight)/2-latDelta/res;this.minPx=new OpenLayers.Pixel(left,top);this.maxPx=new OpenLayers.Pixel(left+extentWidth,top+extentHeight);}
+if(zoomChanged){this.zoom=zoom;this.resolution=res;this.viewRequestID++;}
+var bounds=this.getExtent();if(this.baseLayer.visibility){this.baseLayer.moveTo(bounds,zoomChanged,options.dragging);options.dragging||this.baseLayer.events.triggerEvent("moveend",{zoomChanged:zoomChanged});}
+bounds=this.baseLayer.getExtent();for(var i=this.layers.length-1;i>=0;--i){var layer=this.layers[i];if(layer!==this.baseLayer&&!layer.isBaseLayer){var inRange=layer.calculateInRange();if(layer.inRange!=inRange){layer.inRange=inRange;if(!inRange){layer.display(false);}
+this.events.triggerEvent("changelayer",{layer:layer,property:"visibility"});}
+if(inRange&&layer.visibility){layer.moveTo(bounds,zoomChanged,options.dragging);options.dragging||layer.events.triggerEvent("moveend",{zoomChanged:zoomChanged});}}}
+this.events.triggerEvent("move");dragging||this.events.triggerEvent("moveend");if(zoomChanged){for(var i=0,len=this.popups.length;i<len;i++){this.popups[i].updatePosition();}
+this.events.triggerEvent("zoomend");}}},centerLayerContainer:function(lonlat){var originPx=this.getViewPortPxFromLonLat(this.layerContainerOrigin);var newPx=this.getViewPortPxFromLonLat(lonlat);if((originPx!=null)&&(newPx!=null)){var oldLeft=parseInt(this.layerContainerDiv.style.left);var oldTop=parseInt(this.layerContainerDiv.style.top);var newLeft=Math.round(originPx.x-newPx.x);var newTop=Math.round(originPx.y-newPx.y);this.layerContainerDiv.style.left=newLeft+"px";this.layerContainerDiv.style.top=newTop+"px";var dx=oldLeft-newLeft;var dy=oldTop-newTop;this.minPx.x-=dx;this.maxPx.x-=dx;this.minPx.y-=dy;this.maxPx.y-=dy;}},isValidZoomLevel:function(zoomLevel){return((zoomLevel!=null)&&(zoomLevel>=0)&&(zoomLevel<this.getNumZoomLevels()));},isValidLonLat:function(lonlat){var valid=false;if(lonlat!=null){var maxExtent=this.getMaxExtent();valid=maxExtent.containsLonLat(lonlat);}
+return valid;},getProjection:function(){var projection=this.getProjectionObject();return projection?projection.getCode():null;},getProjectionObject:function(){var projection=null;if(this.baseLayer!=null){projection=this.baseLayer.projection;}
+return projection;},getMaxResolution:function(){var maxResolution=null;if(this.baseLayer!=null){maxResolution=this.baseLayer.maxResolution;}
+return maxResolution;},getMaxExtent:function(options){var maxExtent=null;if(options&&options.restricted&&this.restrictedExtent){maxExtent=this.restrictedExtent;}else if(this.baseLayer!=null){maxExtent=this.baseLayer.maxExtent;}
+return maxExtent;},getNumZoomLevels:function(){var numZoomLevels=null;if(this.baseLayer!=null){numZoomLevels=this.baseLayer.numZoomLevels;}
+return numZoomLevels;},getExtent:function(){var extent=null;if(this.baseLayer!=null){extent=this.baseLayer.getExtent();}
+return extent;},getResolution:function(){var resolution=null;if(this.baseLayer!=null){resolution=this.baseLayer.getResolution();}else if(this.allOverlays===true&&this.layers.length>0){resolution=this.layers[0].getResolution();}
+return resolution;},getUnits:function(){var units=null;if(this.baseLayer!=null){units=this.baseLayer.units;}
+return units;},getScale:function(){var scale=null;if(this.baseLayer!=null){var res=this.getResolution();var units=this.baseLayer.units;scale=OpenLayers.Util.getScaleFromResolution(res,units);}
+return scale;},getZoomForExtent:function(bounds,closest){var zoom=null;if(this.baseLayer!=null){zoom=this.baseLayer.getZoomForExtent(bounds,closest);}
+return zoom;},getResolutionForZoom:function(zoom){var resolution=null;if(this.baseLayer){resolution=this.baseLayer.getResolutionForZoom(zoom);}
+return resolution;},getZoomForResolution:function(resolution,closest){var zoom=null;if(this.baseLayer!=null){zoom=this.baseLayer.getZoomForResolution(resolution,closest);}
+return zoom;},zoomTo:function(zoom){if(this.isValidZoomLevel(zoom)){this.setCenter(null,zoom);}},zoomIn:function(){this.zoomTo(this.getZoom()+1);},zoomOut:function(){this.zoomTo(this.getZoom()-1);},zoomToExtent:function(bounds,closest){var center=bounds.getCenterLonLat();if(this.baseLayer.wrapDateLine){var maxExtent=this.getMaxExtent();bounds=bounds.clone();while(bounds.right<bounds.left){bounds.right+=maxExtent.getWidth();}
+center=bounds.getCenterLonLat().wrapDateLine(maxExtent);}
+this.setCenter(center,this.getZoomForExtent(bounds,closest));},zoomToMaxExtent:function(options){var restricted=(options)?options.restricted:true;var maxExtent=this.getMaxExtent({'restricted':restricted});this.zoomToExtent(maxExtent);},zoomToScale:function(scale,closest){var res=OpenLayers.Util.getResolutionFromScale(scale,this.baseLayer.units);var size=this.getSize();var w_deg=size.w*res;var h_deg=size.h*res;var center=this.getCachedCenter();var extent=new OpenLayers.Bounds(center.lon-w_deg/2,center.lat-h_deg/2,center.lon+w_deg/2,center.lat+h_deg/2);this.zoomToExtent(extent,closest);},getLonLatFromViewPortPx:function(viewPortPx){var lonlat=null;if(this.baseLayer!=null){lonlat=this.baseLayer.getLonLatFromViewPortPx(viewPortPx);}
+return lonlat;},getViewPortPxFromLonLat:function(lonlat){var px=null;if(this.baseLayer!=null){px=this.baseLayer.getViewPortPxFromLonLat(lonlat);}
+return px;},getLonLatFromPixel:function(px){return this.getLonLatFromViewPortPx(px);},getPixelFromLonLat:function(lonlat){var px=this.getViewPortPxFromLonLat(lonlat);px.x=Math.round(px.x);px.y=Math.round(px.y);return px;},getGeodesicPixelSize:function(px){var lonlat=px?this.getLonLatFromPixel(px):(this.getCachedCenter()||new OpenLayers.LonLat(0,0));var res=this.getResolution();var left=lonlat.add(-res/2,0);var right=lonlat.add(res/2,0);var bottom=lonlat.add(0,-res/2);var top=lonlat.add(0,res/2);var dest=new OpenLayers.Projection("EPSG:4326");var source=this.getProjectionObject()||dest;if(!source.equals(dest)){left.transform(source,dest);right.transform(source,dest);bottom.transform(source,dest);top.transform(source,dest);}
+return new OpenLayers.Size(OpenLayers.Util.distVincenty(left,right),OpenLayers.Util.distVincenty(bottom,top));},getViewPortPxFromLayerPx:function(layerPx){var viewPortPx=null;if(layerPx!=null){var dX=parseInt(this.layerContainerDiv.style.left);var dY=parseInt(this.layerContainerDiv.style.top);viewPortPx=layerPx.add(dX,dY);}
+return viewPortPx;},getLayerPxFromViewPortPx:function(viewPortPx){var layerPx=null;if(viewPortPx!=null){var dX=-parseInt(this.layerContainerDiv.style.left);var dY=-parseInt(this.layerContainerDiv.style.top);layerPx=viewPortPx.add(dX,dY);if(isNaN(layerPx.x)||isNaN(layerPx.y)){layerPx=null;}}
+return layerPx;},getLonLatFromLayerPx:function(px){px=this.getViewPortPxFromLayerPx(px);return this.getLonLatFromViewPortPx(px);},getLayerPxFromLonLat:function(lonlat){var px=this.getPixelFromLonLat(lonlat);return this.getLayerPxFromViewPortPx(px);},CLASS_NAME:"OpenLayers.Map"});OpenLayers.Map.TILE_WIDTH=256;OpenLayers.Map.TILE_HEIGHT=256;OpenLayers.Layer=OpenLayers.Class({id:null,name:null,div:null,opacity:null,alwaysInRange:null,EVENT_TYPES:["loadstart","loadend","loadcancel","visibilitychanged","move","moveend","added","removed"],RESOLUTION_PROPERTIES:['scales','resolutions','maxScale','minScale','maxResolution','minResolution','numZoomLevels','maxZoomLevel'],events:null,map:null,isBaseLayer:false,alpha:false,displayInLayerSwitcher:true,visibility:true,attribution:null,inRange:false,imageSize:null,imageOffset:null,options:null,eventListeners:null,gutter:0,projection:null,units:null,scales:null,resolutions:null,maxExtent:null,minExtent:null,maxResolution:null,minResolution:null,numZoomLevels:null,minScale:null,maxScale:null,displayOutsideMaxExtent:false,wrapDateLine:false,transitionEffect:null,SUPPORTED_TRANSITIONS:['resize'],metadata:{},initialize:function(name,options){this.addOptions(options);this.name=name;if(this.id==null){this.id=OpenLayers.Util.createUniqueID(this.CLASS_NAME+"_");this.div=OpenLayers.Util.createDiv(this.id);this.div.style.width="100%";this.div.style.height="100%";this.div.dir="ltr";this.events=new OpenLayers.Events(this,this.div,this.EVENT_TYPES);if(this.eventListeners instanceof Object){this.events.on(this.eventListeners);}}
+if(this.wrapDateLine){this.displayOutsideMaxExtent=true;}},destroy:function(setNewBaseLayer){if(setNewBaseLayer==null){setNewBaseLayer=true;}
+if(this.map!=null){this.map.removeLayer(this,setNewBaseLayer);}
+this.projection=null;this.map=null;this.name=null;this.div=null;this.options=null;if(this.events){if(this.eventListeners){this.events.un(this.eventListeners);}
+this.events.destroy();}
+this.eventListeners=null;this.events=null;},clone:function(obj){if(obj==null){obj=new OpenLayers.Layer(this.name,this.getOptions());}
+OpenLayers.Util.applyDefaults(obj,this);obj.map=null;return obj;},getOptions:function(){var options={};for(var o in this.options){options[o]=this[o];}
+return options;},setName:function(newName){if(newName!=this.name){this.name=newName;if(this.map!=null){this.map.events.triggerEvent("changelayer",{layer:this,property:"name"});}}},addOptions:function(newOptions,reinitialize){if(this.options==null){this.options={};}
+OpenLayers.Util.extend(this.options,newOptions);OpenLayers.Util.extend(this,newOptions);if(typeof this.projection=="string"){this.projection=new OpenLayers.Projection(this.projection);}
+if(this.projection&&this.projection.getUnits()){this.units=this.projection.getUnits();}
+if(this.map){var resolution=this.map.getResolution();var properties=this.RESOLUTION_PROPERTIES.concat(["projection","units","minExtent","maxExtent"]);for(var o in newOptions){if(newOptions.hasOwnProperty(o)&&OpenLayers.Util.indexOf(properties,o)>=0){this.initResolutions();if(reinitialize&&this.map.baseLayer===this){this.map.setCenter(this.map.getCenter(),this.map.getZoomForResolution(resolution),false,true);this.map.events.triggerEvent("changebaselayer",{layer:this});}
+break;}}}},onMapResize:function(){},redraw:function(){var redrawn=false;if(this.map){this.inRange=this.calculateInRange();var extent=this.getExtent();if(extent&&this.inRange&&this.visibility){var zoomChanged=true;this.moveTo(extent,zoomChanged,false);this.events.triggerEvent("moveend",{"zoomChanged":zoomChanged});redrawn=true;}}
+return redrawn;},moveTo:function(bounds,zoomChanged,dragging){var display=this.visibility;if(!this.isBaseLayer){display=display&&this.inRange;}
+this.display(display);},moveByPx:function(dx,dy){},setMap:function(map){if(this.map==null){this.map=map;this.maxExtent=this.maxExtent||this.map.maxExtent;this.minExtent=this.minExtent||this.map.minExtent;this.projection=this.projection||this.map.projection;if(typeof this.projection=="string"){this.projection=new OpenLayers.Projection(this.projection);}
+this.units=this.projection.getUnits()||this.units||this.map.units;this.initResolutions();if(!this.isBaseLayer){this.inRange=this.calculateInRange();var show=((this.visibility)&&(this.inRange));this.div.style.display=show?"":"none";}
+this.setTileSize();}},afterAdd:function(){},removeMap:function(map){},getImageSize:function(bounds){return(this.imageSize||this.tileSize);},setTileSize:function(size){var tileSize=(size)?size:((this.tileSize)?this.tileSize:this.map.getTileSize());this.tileSize=tileSize;if(this.gutter){this.imageOffset=new OpenLayers.Pixel(-this.gutter,-this.gutter);this.imageSize=new OpenLayers.Size(tileSize.w+(2*this.gutter),tileSize.h+(2*this.gutter));}},getVisibility:function(){return this.visibility;},setVisibility:function(visibility){if(visibility!=this.visibility){this.visibility=visibility;this.display(visibility);this.redraw();if(this.map!=null){this.map.events.triggerEvent("changelayer",{layer:this,property:"visibility"});}
+this.events.triggerEvent("visibilitychanged");}},display:function(display){if(display!=(this.div.style.display!="none")){this.div.style.display=(display&&this.calculateInRange())?"block":"none";}},calculateInRange:function(){var inRange=false;if(this.alwaysInRange){inRange=true;}else{if(this.map){var resolution=this.map.getResolution();inRange=((resolution>=this.minResolution)&&(resolution<=this.maxResolution));}}
+return inRange;},setIsBaseLayer:function(isBaseLayer){if(isBaseLayer!=this.isBaseLayer){this.isBaseLayer=isBaseLayer;if(this.map!=null){this.map.events.triggerEvent("changebaselayer",{layer:this});}}},initResolutions:function(){var i,len,p;var props={},alwaysInRange=true;for(i=0,len=this.RESOLUTION_PROPERTIES.length;i<len;i++){p=this.RESOLUTION_PROPERTIES[i];props[p]=this.options[p];if(alwaysInRange&&this.options[p]){alwaysInRange=false;}}
+if(this.alwaysInRange==null){this.alwaysInRange=alwaysInRange;}
+if(props.resolutions==null){props.resolutions=this.resolutionsFromScales(props.scales);}
+if(props.resolutions==null){props.resolutions=this.calculateResolutions(props);}
+if(props.resolutions==null){for(i=0,len=this.RESOLUTION_PROPERTIES.length;i<len;i++){p=this.RESOLUTION_PROPERTIES[i];props[p]=this.options[p]!=null?this.options[p]:this.map[p];}
+if(props.resolutions==null){props.resolutions=this.resolutionsFromScales(props.scales);}
+if(props.resolutions==null){props.resolutions=this.calculateResolutions(props);}}
+var maxResolution;if(this.options.maxResolution&&this.options.maxResolution!=="auto"){maxResolution=this.options.maxResolution;}
+if(this.options.minScale){maxResolution=OpenLayers.Util.getResolutionFromScale(this.options.minScale,this.units);}
+var minResolution;if(this.options.minResolution&&this.options.minResolution!=="auto"){minResolution=this.options.minResolution;}
+if(this.options.maxScale){minResolution=OpenLayers.Util.getResolutionFromScale(this.options.maxScale,this.units);}
+if(props.resolutions){props.resolutions.sort(function(a,b){return(b-a);});if(!maxResolution){maxResolution=props.resolutions[0];}
+if(!minResolution){var lastIdx=props.resolutions.length-1;minResolution=props.resolutions[lastIdx];}}
+this.resolutions=props.resolutions;if(this.resolutions){len=this.resolutions.length;this.scales=new Array(len);for(i=0;i<len;i++){this.scales[i]=OpenLayers.Util.getScaleFromResolution(this.resolutions[i],this.units);}
+this.numZoomLevels=len;}
+this.minResolution=minResolution;if(minResolution){this.maxScale=OpenLayers.Util.getScaleFromResolution(minResolution,this.units);}
+this.maxResolution=maxResolution;if(maxResolution){this.minScale=OpenLayers.Util.getScaleFromResolution(maxResolution,this.units);}},resolutionsFromScales:function(scales){if(scales==null){return;}
+var resolutions,i,len;len=scales.length;resolutions=new Array(len);for(i=0;i<len;i++){resolutions[i]=OpenLayers.Util.getResolutionFromScale(scales[i],this.units);}
+return resolutions;},calculateResolutions:function(props){var viewSize,wRes,hRes;var maxResolution=props.maxResolution;if(props.minScale!=null){maxResolution=OpenLayers.Util.getResolutionFromScale(props.minScale,this.units);}else if(maxResolution=="auto"&&this.maxExtent!=null){viewSize=this.map.getSize();wRes=this.maxExtent.getWidth()/viewSize.w;hRes=this.maxExtent.getHeight()/viewSize.h;maxResolution=Math.max(wRes,hRes);}
+var minResolution=props.minResolution;if(props.maxScale!=null){minResolution=OpenLayers.Util.getResolutionFromScale(props.maxScale,this.units);}else if(props.minResolution=="auto"&&this.minExtent!=null){viewSize=this.map.getSize();wRes=this.minExtent.getWidth()/viewSize.w;hRes=this.minExtent.getHeight()/viewSize.h;minResolution=Math.max(wRes,hRes);}
+var maxZoomLevel=props.maxZoomLevel;var numZoomLevels=props.numZoomLevels;if(typeof minResolution==="number"&&typeof maxResolution==="number"&&numZoomLevels===undefined){var ratio=maxResolution/minResolution;numZoomLevels=Math.floor(Math.log(ratio)/Math.log(2))+1;}else if(numZoomLevels===undefined&&maxZoomLevel!=null){numZoomLevels=maxZoomLevel+1;}
+if(typeof numZoomLevels!=="number"||numZoomLevels<=0||(typeof maxResolution!=="number"&&typeof minResolution!=="number")){return;}
+var resolutions=new Array(numZoomLevels);var base=2;if(typeof minResolution=="number"&&typeof maxResolution=="number"){base=Math.pow((maxResolution/minResolution),(1/(numZoomLevels-1)));}
+var i;if(typeof maxResolution==="number"){for(i=0;i<numZoomLevels;i++){resolutions[i]=maxResolution/Math.pow(base,i);}}else{for(i=0;i<numZoomLevels;i++){resolutions[numZoomLevels-1-i]=minResolution*Math.pow(base,i);}}
+return resolutions;},getResolution:function(){var zoom=this.map.getZoom();return this.getResolutionForZoom(zoom);},getExtent:function(){return this.map.calculateBounds();},getZoomForExtent:function(extent,closest){var viewSize=this.map.getSize();var idealResolution=Math.max(extent.getWidth()/viewSize.w,extent.getHeight()/viewSize.h);return this.getZoomForResolution(idealResolution,closest);},getDataExtent:function(){},getResolutionForZoom:function(zoom){zoom=Math.max(0,Math.min(zoom,this.resolutions.length-1));var resolution;if(this.map.fractionalZoom){var low=Math.floor(zoom);var high=Math.ceil(zoom);resolution=this.resolutions[low]-
+((zoom-low)*(this.resolutions[low]-this.resolutions[high]));}else{resolution=this.resolutions[Math.round(zoom)];}
+return resolution;},getZoomForResolution:function(resolution,closest){var zoom,i,len;if(this.map.fractionalZoom){var lowZoom=0;var highZoom=this.resolutions.length-1;var highRes=this.resolutions[lowZoom];var lowRes=this.resolutions[highZoom];var res;for(i=0,len=this.resolutions.length;i<len;++i){res=this.resolutions[i];if(res>=resolution){highRes=res;lowZoom=i;}
+if(res<=resolution){lowRes=res;highZoom=i;break;}}
+var dRes=highRes-lowRes;if(dRes>0){zoom=lowZoom+((highRes-resolution)/dRes);}else{zoom=lowZoom;}}else{var diff;var minDiff=Number.POSITIVE_INFINITY;for(i=0,len=this.resolutions.length;i<len;i++){if(closest){diff=Math.abs(this.resolutions[i]-resolution);if(diff>minDiff){break;}
+minDiff=diff;}else{if(this.resolutions[i]<resolution){break;}}}
+zoom=Math.max(0,i-1);}
+return zoom;},getLonLatFromViewPortPx:function(viewPortPx){var lonlat=null;var map=this.map;if(viewPortPx!=null&&map.minPx){var res=map.getResolution();var maxExtent=map.getMaxExtent({restricted:true});var lon=(viewPortPx.x-map.minPx.x)*res+maxExtent.left;var lat=(map.minPx.y-viewPortPx.y)*res+maxExtent.top;lonlat=new OpenLayers.LonLat(lon,lat);if(this.wrapDateLine){lonlat=lonlat.wrapDateLine(this.maxExtent);}}
+return lonlat;},getViewPortPxFromLonLat:function(lonlat){var px=null;if(lonlat!=null){var resolution=this.map.getResolution();var extent=this.map.getExtent();px=new OpenLayers.Pixel((1/resolution*(lonlat.lon-extent.left)),(1/resolution*(extent.top-lonlat.lat)));}
+return px;},setOpacity:function(opacity){if(opacity!=this.opacity){this.opacity=opacity;for(var i=0,len=this.div.childNodes.length;i<len;++i){var element=this.div.childNodes[i].firstChild;OpenLayers.Util.modifyDOMElement(element,null,null,null,null,null,null,opacity);}
+if(this.map!=null){this.map.events.triggerEvent("changelayer",{layer:this,property:"opacity"});}}},getZIndex:function(){return this.div.style.zIndex;},setZIndex:function(zIndex){this.div.style.zIndex=zIndex;},adjustBounds:function(bounds){if(this.gutter){var mapGutter=this.gutter*this.map.getResolution();bounds=new OpenLayers.Bounds(bounds.left-mapGutter,bounds.bottom-mapGutter,bounds.right+mapGutter,bounds.top+mapGutter);}
+if(this.wrapDateLine){var wrappingOptions={'rightTolerance':this.getResolution(),'leftTolerance':this.getResolution()};bounds=bounds.wrapDateLine(this.maxExtent,wrappingOptions);}
+return bounds;},CLASS_NAME:"OpenLayers.Layer"});OpenLayers.StyleMap=OpenLayers.Class({styles:null,extendDefault:true,initialize:function(style,options){this.styles={"default":new OpenLayers.Style(OpenLayers.Feature.Vector.style["default"]),"select":new OpenLayers.Style(OpenLayers.Feature.Vector.style["select"]),"temporary":new OpenLayers.Style(OpenLayers.Feature.Vector.style["temporary"]),"delete":new OpenLayers.Style(OpenLayers.Feature.Vector.style["delete"])};if(style instanceof OpenLayers.Style){this.styles["default"]=style;this.styles["select"]=style;this.styles["temporary"]=style;this.styles["delete"]=style;}else if(typeof style=="object"){for(var key in style){if(style[key]instanceof OpenLayers.Style){this.styles[key]=style[key];}else if(typeof style[key]=="object"){this.styles[key]=new OpenLayers.Style(style[key]);}else{this.styles["default"]=new OpenLayers.Style(style);this.styles["select"]=new OpenLayers.Style(style);this.styles["temporary"]=new OpenLayers.Style(style);this.styles["delete"]=new OpenLayers.Style(style);break;}}}
+OpenLayers.Util.extend(this,options);},destroy:function(){for(var key in this.styles){this.styles[key].destroy();}
+this.styles=null;},createSymbolizer:function(feature,intent){if(!feature){feature=new OpenLayers.Feature.Vector();}
+if(!this.styles[intent]){intent="default";}
+feature.renderIntent=intent;var defaultSymbolizer={};if(this.extendDefault&&intent!="default"){defaultSymbolizer=this.styles["default"].createSymbolizer(feature);}
+return OpenLayers.Util.extend(defaultSymbolizer,this.styles[intent].createSymbolizer(feature));},addUniqueValueRules:function(renderIntent,property,symbolizers,context){var rules=[];for(var value in symbolizers){rules.push(new OpenLayers.Rule({symbolizer:symbolizers[value],context:context,filter:new OpenLayers.Filter.Comparison({type:OpenLayers.Filter.Comparison.EQUAL_TO,property:property,value:value})}));}
+this.styles[renderIntent].addRules(rules);},CLASS_NAME:"OpenLayers.StyleMap"});OpenLayers.Layer.Vector=OpenLayers.Class(OpenLayers.Layer,{EVENT_TYPES:["beforefeatureadded","beforefeaturesadded","featureadded","featuresadded","beforefeatureremoved","beforefeaturesremoved","featureremoved","featuresremoved","beforefeatureselected","featureselected","featureunselected","beforefeaturemodified","featuremodified","afterfeaturemodified","vertexmodified","vertexremoved","sketchstarted","sketchmodified","sketchcomplete","refresh"],isBaseLayer:false,isFixed:false,features:null,filter:null,selectedFeatures:null,unrenderedFeatures:null,reportError:true,style:null,styleMap:null,strategies:null,protocol:null,renderers:['SVG','VML','Canvas'],renderer:null,rendererOptions:null,geometryType:null,drawn:false,initialize:function(name,options){this.EVENT_TYPES=OpenLayers.Layer.Vector.prototype.EVENT_TYPES.concat(OpenLayers.Layer.prototype.EVENT_TYPES);OpenLayers.Layer.prototype.initialize.apply(this,arguments);if(!this.renderer||!this.renderer.supported()){this.assignRenderer();}
+if(!this.renderer||!this.renderer.supported()){this.renderer=null;this.displayError();}
+if(!this.styleMap){this.styleMap=new OpenLayers.StyleMap();}
+this.features=[];this.selectedFeatures=[];this.unrenderedFeatures={};if(this.strategies){for(var i=0,len=this.strategies.length;i<len;i++){this.strategies[i].setLayer(this);}}},destroy:function(){if(this.strategies){var strategy,i,len;for(i=0,len=this.strategies.length;i<len;i++){strategy=this.strategies[i];if(strategy.autoDestroy){strategy.destroy();}}
+this.strategies=null;}
+if(this.protocol){if(this.protocol.autoDestroy){this.protocol.destroy();}
+this.protocol=null;}
+this.destroyFeatures();this.features=null;this.selectedFeatures=null;this.unrenderedFeatures=null;if(this.renderer){this.renderer.destroy();}
+this.renderer=null;this.geometryType=null;this.drawn=null;OpenLayers.Layer.prototype.destroy.apply(this,arguments);},clone:function(obj){if(obj==null){obj=new OpenLayers.Layer.Vector(this.name,this.getOptions());}
+obj=OpenLayers.Layer.prototype.clone.apply(this,[obj]);var features=this.features;var len=features.length;var clonedFeatures=new Array(len);for(var i=0;i<len;++i){clonedFeatures[i]=features[i].clone();}
+obj.features=clonedFeatures;return obj;},refresh:function(obj){if(this.calculateInRange()&&this.visibility){this.events.triggerEvent("refresh",obj);}},assignRenderer:function(){for(var i=0,len=this.renderers.length;i<len;i++){var rendererClass=this.renderers[i];var renderer=(typeof rendererClass=="function")?rendererClass:OpenLayers.Renderer[rendererClass];if(renderer&&renderer.prototype.supported()){this.renderer=new renderer(this.div,this.rendererOptions);break;}}},displayError:function(){if(this.reportError){OpenLayers.Console.userError(OpenLayers.i18n("browserNotSupported",{'renderers':this.renderers.join("\n")}));}},setMap:function(map){OpenLayers.Layer.prototype.setMap.apply(this,arguments);if(!this.renderer){this.map.removeLayer(this);}else{this.renderer.map=this.map;this.renderer.setSize(this.map.getSize());}},afterAdd:function(){if(this.strategies){var strategy,i,len;for(i=0,len=this.strategies.length;i<len;i++){strategy=this.strategies[i];if(strategy.autoActivate){strategy.activate();}}}},removeMap:function(map){this.drawn=false;if(this.strategies){var strategy,i,len;for(i=0,len=this.strategies.length;i<len;i++){strategy=this.strategies[i];if(strategy.autoActivate){strategy.deactivate();}}}},onMapResize:function(){OpenLayers.Layer.prototype.onMapResize.apply(this,arguments);this.renderer.setSize(this.map.getSize());},moveTo:function(bounds,zoomChanged,dragging){OpenLayers.Layer.prototype.moveTo.apply(this,arguments);var ng=(OpenLayers.Renderer.NG&&this.renderer instanceof OpenLayers.Renderer.NG);if(ng){dragging||this.renderer.updateDimensions(zoomChanged);}else{var coordSysUnchanged=true;if(!dragging){this.renderer.root.style.visibility="hidden";this.div.style.left=-parseInt(this.map.layerContainerDiv.style.left)+"px";this.div.style.top=-parseInt(this.map.layerContainerDiv.style.top)+"px";var extent=this.map.getExtent();coordSysUnchanged=this.renderer.setExtent(extent,zoomChanged);this.renderer.root.style.visibility="visible";if(OpenLayers.IS_GECKO===true){this.div.scrollLeft=this.div.scrollLeft;}
+if(!zoomChanged&&coordSysUnchanged){for(var i in this.unrenderedFeatures){var feature=this.unrenderedFeatures[i];this.drawFeature(feature);}}}}
+if(!this.drawn||(!ng&&(zoomChanged||!coordSysUnchanged))){this.drawn=true;var feature;for(var i=0,len=this.features.length;i<len;i++){this.renderer.locked=(i!==(len-1));feature=this.features[i];this.drawFeature(feature);}}},redraw:function(){if(OpenLayers.Renderer.NG&&this.renderer instanceof OpenLayers.Renderer.NG){this.drawn=false;}
+return OpenLayers.Layer.prototype.redraw.apply(this,arguments);},display:function(display){OpenLayers.Layer.prototype.display.apply(this,arguments);var currentDisplay=this.div.style.display;if(currentDisplay!=this.renderer.root.style.display){this.renderer.root.style.display=currentDisplay;}},addFeatures:function(features,options){if(!(OpenLayers.Util.isArray(features))){features=[features];}
+var notify=!options||!options.silent;if(notify){var event={features:features};var ret=this.events.triggerEvent("beforefeaturesadded",event);if(ret===false){return;}
+features=event.features;}
+var featuresAdded=[];for(var i=0,len=features.length;i<len;i++){if(i!=(features.length-1)){this.renderer.locked=true;}else{this.renderer.locked=false;}
+var feature=features[i];if(this.geometryType&&!(feature.geometry instanceof this.geometryType)){var throwStr=OpenLayers.i18n('componentShouldBe',{'geomType':this.geometryType.prototype.CLASS_NAME});throw throwStr;}
+feature.layer=this;if(!feature.style&&this.style){feature.style=OpenLayers.Util.extend({},this.style);}
+if(notify){if(this.events.triggerEvent("beforefeatureadded",{feature:feature})===false){continue;}
+this.preFeatureInsert(feature);}
+featuresAdded.push(feature);this.features.push(feature);this.drawFeature(feature);if(notify){this.events.triggerEvent("featureadded",{feature:feature});this.onFeatureInsert(feature);}}
+if(notify){this.events.triggerEvent("featuresadded",{features:featuresAdded});}},removeFeatures:function(features,options){if(!features||features.length===0){return;}
+if(features===this.features){return this.removeAllFeatures(options);}
+if(!(OpenLayers.Util.isArray(features))){features=[features];}
+if(features===this.selectedFeatures){features=features.slice();}
+var notify=!options||!options.silent;if(notify){this.events.triggerEvent("beforefeaturesremoved",{features:features});}
+for(var i=features.length-1;i>=0;i--){if(i!=0&&features[i-1].geometry){this.renderer.locked=true;}else{this.renderer.locked=false;}
+var feature=features[i];delete this.unrenderedFeatures[feature.id];if(notify){this.events.triggerEvent("beforefeatureremoved",{feature:feature});}
+this.features=OpenLayers.Util.removeItem(this.features,feature);feature.layer=null;if(feature.geometry){this.renderer.eraseFeatures(feature);}
+if(OpenLayers.Util.indexOf(this.selectedFeatures,feature)!=-1){OpenLayers.Util.removeItem(this.selectedFeatures,feature);}
+if(notify){this.events.triggerEvent("featureremoved",{feature:feature});}}
+if(notify){this.events.triggerEvent("featuresremoved",{features:features});}},removeAllFeatures:function(options){var notify=!options||!options.silent;var features=this.features;if(notify){this.events.triggerEvent("beforefeaturesremoved",{features:features});}
+var feature;for(var i=features.length-1;i>=0;i--){feature=features[i];if(notify){this.events.triggerEvent("beforefeatureremoved",{feature:feature});}
+feature.layer=null;if(notify){this.events.triggerEvent("featureremoved",{feature:feature});}}
+this.renderer.clear();this.features=[];this.unrenderedFeatures={};this.selectedFeatures=[];if(notify){this.events.triggerEvent("featuresremoved",{features:features});}},destroyFeatures:function(features,options){var all=(features==undefined);if(all){features=this.features;}
+if(features){this.removeFeatures(features,options);for(var i=features.length-1;i>=0;i--){features[i].destroy();}}},drawFeature:function(feature,style){if(!this.drawn){return;}
+if(typeof style!="object"){if(!style&&feature.state===OpenLayers.State.DELETE){style="delete";}
+var renderIntent=style||feature.renderIntent;style=feature.style||this.style;if(!style){style=this.styleMap.createSymbolizer(feature,renderIntent);}}
+var drawn=this.renderer.drawFeature(feature,style);if(drawn===false||drawn===null){this.unrenderedFeatures[feature.id]=feature;}else{delete this.unrenderedFeatures[feature.id];}},eraseFeatures:function(features){this.renderer.eraseFeatures(features);},getFeatureFromEvent:function(evt){if(!this.renderer){OpenLayers.Console.error(OpenLayers.i18n("getFeatureError"));return null;}
+var feature=null;var featureId=this.renderer.getFeatureIdFromEvent(evt);if(featureId){if(typeof featureId==="string"){feature=this.getFeatureById(featureId);}else{feature=featureId;}}
+return feature;},getFeatureBy:function(property,value){var feature=null;for(var i=0,len=this.features.length;i<len;++i){if(this.features[i][property]==value){feature=this.features[i];break;}}
+return feature;},getFeatureById:function(featureId){return this.getFeatureBy('id',featureId);},getFeatureByFid:function(featureFid){return this.getFeatureBy('fid',featureFid);},getFeaturesByAttribute:function(attrName,attrValue){var i,feature,len=this.features.length,foundFeatures=[];for(i=0;i<len;i++){feature=this.features[i];if(feature&&feature.attributes){if(feature.attributes[attrName]===attrValue){foundFeatures.push(feature);}}}
+return foundFeatures;},onFeatureInsert:function(feature){},preFeatureInsert:function(feature){},getDataExtent:function(){var maxExtent=null;var features=this.features;if(features&&(features.length>0)){var geometry=null;for(var i=0,len=features.length;i<len;i++){geometry=features[i].geometry;if(geometry){if(maxExtent===null){maxExtent=new OpenLayers.Bounds();}
+maxExtent.extend(geometry.getBounds());}}}
+return maxExtent;},CLASS_NAME:"OpenLayers.Layer.Vector"});OpenLayers.Layer.Vector.RootContainer=OpenLayers.Class(OpenLayers.Layer.Vector,{displayInLayerSwitcher:false,layers:null,initialize:function(name,options){OpenLayers.Layer.Vector.prototype.initialize.apply(this,arguments);},display:function(){},getFeatureFromEvent:function(evt){var layers=this.layers;var feature;for(var i=0;i<layers.length;i++){feature=layers[i].getFeatureFromEvent(evt);if(feature){return feature;}}},setMap:function(map){OpenLayers.Layer.Vector.prototype.setMap.apply(this,arguments);this.collectRoots();map.events.register("changelayer",this,this.handleChangeLayer);},removeMap:function(map){map.events.unregister("changelayer",this,this.handleChangeLayer);this.resetRoots();OpenLayers.Layer.Vector.prototype.removeMap.apply(this,arguments);},collectRoots:function(){var layer;for(var i=0;i<this.map.layers.length;++i){layer=this.map.layers[i];if(OpenLayers.Util.indexOf(this.layers,layer)!=-1){layer.renderer.moveRoot(this.renderer);}}},resetRoots:function(){var layer;for(var i=0;i<this.layers.length;++i){layer=this.layers[i];if(this.renderer&&layer.renderer.getRenderLayerId()==this.id){this.renderer.moveRoot(layer.renderer);}}},handleChangeLayer:function(evt){var layer=evt.layer;if(evt.property=="order"&&OpenLayers.Util.indexOf(this.layers,layer)!=-1){this.resetRoots();this.collectRoots();}},CLASS_NAME:"OpenLayers.Layer.Vector.RootContainer"});OpenLayers.Control.SelectFeature=OpenLayers.Class(OpenLayers.Control,{EVENT_TYPES:["beforefeaturehighlighted","featurehighlighted","featureunhighlighted"],multipleKey:null,toggleKey:null,multiple:false,clickout:true,toggle:false,hover:false,highlightOnly:false,box:false,onBeforeSelect:function(){},onSelect:function(){},onUnselect:function(){},scope:null,geometryTypes:null,layer:null,layers:null,callbacks:null,selectStyle:null,renderIntent:"select",handlers:null,initialize:function(layers,options){this.EVENT_TYPES=OpenLayers.Control.SelectFeature.prototype.EVENT_TYPES.concat(OpenLayers.Control.prototype.EVENT_TYPES);OpenLayers.Control.prototype.initialize.apply(this,[options]);if(this.scope===null){this.scope=this;}
+this.initLayer(layers);var callbacks={click:this.clickFeature,clickout:this.clickoutFeature};if(this.hover){callbacks.over=this.overFeature;callbacks.out=this.outFeature;}
+this.callbacks=OpenLayers.Util.extend(callbacks,this.callbacks);this.handlers={feature:new OpenLayers.Handler.Feature(this,this.layer,this.callbacks,{geometryTypes:this.geometryTypes})};if(this.box){this.handlers.box=new OpenLayers.Handler.Box(this,{done:this.selectBox},{boxDivClassName:"olHandlerBoxSelectFeature"});}},initLayer:function(layers){if(OpenLayers.Util.isArray(layers)){this.layers=layers;this.layer=new OpenLayers.Layer.Vector.RootContainer(this.id+"_container",{layers:layers});}else{this.layer=layers;}},destroy:function(){if(this.active&&this.layers){this.map.removeLayer(this.layer);}
+OpenLayers.Control.prototype.destroy.apply(this,arguments);if(this.layers){this.layer.destroy();}},activate:function(){if(!this.active){if(this.layers){this.map.addLayer(this.layer);}
+this.handlers.feature.activate();if(this.box&&this.handlers.box){this.handlers.box.activate();}}
+return OpenLayers.Control.prototype.activate.apply(this,arguments);},deactivate:function(){if(this.active){this.handlers.feature.deactivate();if(this.handlers.box){this.handlers.box.deactivate();}
+if(this.layers){this.map.removeLayer(this.layer);}}
+return OpenLayers.Control.prototype.deactivate.apply(this,arguments);},unselectAll:function(options){var layers=this.layers||[this.layer];var layer,feature;for(var l=0;l<layers.length;++l){layer=layers[l];for(var i=layer.selectedFeatures.length-1;i>=0;--i){feature=layer.selectedFeatures[i];if(!options||options.except!=feature){this.unselect(feature);}}}},clickFeature:function(feature){if(!this.hover){var selected=(OpenLayers.Util.indexOf(feature.layer.selectedFeatures,feature)>-1);if(selected){if(this.toggleSelect()){this.unselect(feature);}else if(!this.multipleSelect()){this.unselectAll({except:feature});}}else{if(!this.multipleSelect()){this.unselectAll({except:feature});}
+this.select(feature);}}},multipleSelect:function(){return this.multiple||(this.handlers.feature.evt&&this.handlers.feature.evt[this.multipleKey]);},toggleSelect:function(){return this.toggle||(this.handlers.feature.evt&&this.handlers.feature.evt[this.toggleKey]);},clickoutFeature:function(feature){if(!this.hover&&this.clickout){this.unselectAll();}},overFeature:function(feature){var layer=feature.layer;if(this.hover){if(this.highlightOnly){this.highlight(feature);}else if(OpenLayers.Util.indexOf(layer.selectedFeatures,feature)==-1){this.select(feature);}}},outFeature:function(feature){if(this.hover){if(this.highlightOnly){if(feature._lastHighlighter==this.id){if(feature._prevHighlighter&&feature._prevHighlighter!=this.id){delete feature._lastHighlighter;var control=this.map.getControl(feature._prevHighlighter);if(control){control.highlight(feature);}}else{this.unhighlight(feature);}}}else{this.unselect(feature);}}},highlight:function(feature){var layer=feature.layer;var cont=this.events.triggerEvent("beforefeaturehighlighted",{feature:feature});if(cont!==false){feature._prevHighlighter=feature._lastHighlighter;feature._lastHighlighter=this.id;var style=this.selectStyle||this.renderIntent;layer.drawFeature(feature,style);this.events.triggerEvent("featurehighlighted",{feature:feature});}},unhighlight:function(feature){var layer=feature.layer;if(feature._prevHighlighter==undefined){delete feature._lastHighlighter;}else if(feature._prevHighlighter==this.id){delete feature._prevHighlighter;}else{feature._lastHighlighter=feature._prevHighlighter;delete feature._prevHighlighter;}
+layer.drawFeature(feature,feature.style||feature.layer.style||"default");this.events.triggerEvent("featureunhighlighted",{feature:feature});},select:function(feature){var cont=this.onBeforeSelect.call(this.scope,feature);var layer=feature.layer;if(cont!==false){cont=layer.events.triggerEvent("beforefeatureselected",{feature:feature});if(cont!==false){layer.selectedFeatures.push(feature);this.highlight(feature);if(!this.handlers.feature.lastFeature){this.handlers.feature.lastFeature=layer.selectedFeatures[0];}
+layer.events.triggerEvent("featureselected",{feature:feature});this.onSelect.call(this.scope,feature);}}},unselect:function(feature){var layer=feature.layer;this.unhighlight(feature);OpenLayers.Util.removeItem(layer.selectedFeatures,feature);layer.events.triggerEvent("featureunselected",{feature:feature});this.onUnselect.call(this.scope,feature);},selectBox:function(position){if(position instanceof OpenLayers.Bounds){var minXY=this.map.getLonLatFromPixel(new OpenLayers.Pixel(position.left,position.bottom));var maxXY=this.map.getLonLatFromPixel(new OpenLayers.Pixel(position.right,position.top));var bounds=new OpenLayers.Bounds(minXY.lon,minXY.lat,maxXY.lon,maxXY.lat);if(!this.multipleSelect()){this.unselectAll();}
+var prevMultiple=this.multiple;this.multiple=true;var layers=this.layers||[this.layer];var layer;for(var l=0;l<layers.length;++l){layer=layers[l];for(var i=0,len=layer.features.length;i<len;++i){var feature=layer.features[i];if(!feature.getVisibility()){continue;}
+if(this.geometryTypes==null||OpenLayers.Util.indexOf(this.geometryTypes,feature.geometry.CLASS_NAME)>-1){if(bounds.toGeometry().intersects(feature.geometry)){if(OpenLayers.Util.indexOf(layer.selectedFeatures,feature)==-1){this.select(feature);}}}}}
+this.multiple=prevMultiple;}},setMap:function(map){this.handlers.feature.setMap(map);if(this.box){this.handlers.box.setMap(map);}
+OpenLayers.Control.prototype.setMap.apply(this,arguments);},setLayer:function(layers){var isActive=this.active;this.unselectAll();this.deactivate();if(this.layers){this.layer.destroy();this.layers=null;}
+this.initLayer(layers);this.handlers.feature.layer=this.layer;if(isActive){this.activate();}},CLASS_NAME:"OpenLayers.Control.SelectFeature"});OpenLayers.Format.OGCExceptionReport=OpenLayers.Class(OpenLayers.Format.XML,{namespaces:{ogc:"http://www.opengis.net/ogc"},regExes:{trimSpace:(/^\s*|\s*$/g),removeSpace:(/\s*/g),splitSpace:(/\s+/),trimComma:(/\s*,\s*/g)},defaultPrefix:"ogc",read:function(data){var result;if(typeof data=="string"){data=OpenLayers.Format.XML.prototype.read.apply(this,[data]);}
+var root=data.documentElement;var exceptionInfo={exceptionReport:null};if(root){this.readChildNodes(data,exceptionInfo);if(exceptionInfo.exceptionReport===null){exceptionInfo=new OpenLayers.Format.OWSCommon().read(data);}}
+return exceptionInfo;},readers:{"ogc":{"ServiceExceptionReport":function(node,obj){obj.exceptionReport={exceptions:[]};this.readChildNodes(node,obj.exceptionReport);},"ServiceException":function(node,exceptionReport){var exception={code:node.getAttribute("code"),locator:node.getAttribute("locator"),text:this.getChildValue(node)};exceptionReport.exceptions.push(exception);}}},CLASS_NAME:"OpenLayers.Format.OGCExceptionReport"});OpenLayers.Format.XML.VersionedOGC=OpenLayers.Class(OpenLayers.Format.XML,{defaultVersion:null,version:null,profile:null,errorProperty:null,name:null,stringifyOutput:false,parser:null,initialize:function(options){OpenLayers.Format.XML.prototype.initialize.apply(this,[options]);var className=this.CLASS_NAME;this.name=className.substring(className.lastIndexOf(".")+1);},getVersion:function(root,options){var version;if(root){version=this.version;if(!version){version=root.getAttribute("version");if(!version){version=this.defaultVersion;}}}else{version=(options&&options.version)||this.version||this.defaultVersion;}
+return version;},getParser:function(version){version=version||this.defaultVersion;var profile=this.profile?"_"+this.profile:"";if(!this.parser||this.parser.VERSION!=version){var format=OpenLayers.Format[this.name]["v"+version.replace(/\./g,"_")+profile];if(!format){throw"Can't find a "+this.name+" parser for version "+
+version+profile;}
+this.parser=new format(this.options);}
+return this.parser;},write:function(obj,options){var version=this.getVersion(null,options);this.parser=this.getParser(version);var root=this.parser.write(obj,options);if(this.stringifyOutput===false){return root;}else{return OpenLayers.Format.XML.prototype.write.apply(this,[root]);}},read:function(data,options){if(typeof data=="string"){data=OpenLayers.Format.XML.prototype.read.apply(this,[data]);}
+var root=data.documentElement;var version=this.getVersion(root);this.parser=this.getParser(version);var obj=this.parser.read(data,options);if(this.errorProperty!==null&&obj[this.errorProperty]===undefined){var format=new OpenLayers.Format.OGCExceptionReport();obj.error=format.read(data);}
+obj.version=version;return obj;},CLASS_NAME:"OpenLayers.Format.XML.VersionedOGC"});OpenLayers.Format.OWSCommon=OpenLayers.Class(OpenLayers.Format.XML.VersionedOGC,{defaultVersion:"1.0.0",getVersion:function(root,options){var version=this.version;if(!version){var uri=root.getAttribute("xmlns:ows");if(uri&&uri.substring(uri.lastIndexOf("/")+1)==="1.1"){version="1.1.0";}
+if(!version){version=this.defaultVersion;}}
+return version;},CLASS_NAME:"OpenLayers.Format.OWSCommon"});OpenLayers.Format.OWSCommon.v1=OpenLayers.Class(OpenLayers.Format.XML,{regExes:{trimSpace:(/^\s*|\s*$/g),removeSpace:(/\s*/g),splitSpace:(/\s+/),trimComma:(/\s*,\s*/g)},read:function(data,options){options=OpenLayers.Util.applyDefaults(options,this.options);var ows={};this.readChildNodes(data,ows);return ows;},readers:{"ows":{"Exception":function(node,exceptionReport){var exception={code:node.getAttribute('exceptionCode'),locator:node.getAttribute('locator'),texts:[]};exceptionReport.exceptions.push(exception);this.readChildNodes(node,exception);},"ExceptionText":function(node,exception){var text=this.getChildValue(node);exception.texts.push(text);},"ServiceIdentification":function(node,obj){obj.serviceIdentification={};this.readChildNodes(node,obj.serviceIdentification);},"Title":function(node,obj){obj.title=this.getChildValue(node);},"Abstract":function(node,serviceIdentification){serviceIdentification["abstract"]=this.getChildValue(node);},"Keywords":function(node,serviceIdentification){serviceIdentification.keywords={};this.readChildNodes(node,serviceIdentification.keywords);},"Keyword":function(node,keywords){keywords[this.getChildValue(node)]=true;},"ServiceType":function(node,serviceIdentification){serviceIdentification.serviceType={codeSpace:node.getAttribute('codeSpace'),value:this.getChildValue(node)};},"ServiceTypeVersion":function(node,serviceIdentification){serviceIdentification.serviceTypeVersion=this.getChildValue(node);},"Fees":function(node,serviceIdentification){serviceIdentification.fees=this.getChildValue(node);},"AccessConstraints":function(node,serviceIdentification){serviceIdentification.accessConstraints=this.getChildValue(node);},"ServiceProvider":function(node,obj){obj.serviceProvider={};this.readChildNodes(node,obj.serviceProvider);},"ProviderName":function(node,serviceProvider){serviceProvider.providerName=this.getChildValue(node);},"ProviderSite":function(node,serviceProvider){serviceProvider.providerSite=this.getAttributeNS(node,this.namespaces.xlink,"href");},"ServiceContact":function(node,serviceProvider){serviceProvider.serviceContact={};this.readChildNodes(node,serviceProvider.serviceContact);},"IndividualName":function(node,serviceContact){serviceContact.individualName=this.getChildValue(node);},"PositionName":function(node,serviceContact){serviceContact.positionName=this.getChildValue(node);},"ContactInfo":function(node,serviceContact){serviceContact.contactInfo={};this.readChildNodes(node,serviceContact.contactInfo);},"Phone":function(node,contactInfo){contactInfo.phone={};this.readChildNodes(node,contactInfo.phone);},"Voice":function(node,phone){phone.voice=this.getChildValue(node);},"Address":function(node,contactInfo){contactInfo.address={};this.readChildNodes(node,contactInfo.address);},"DeliveryPoint":function(node,address){address.deliveryPoint=this.getChildValue(node);},"City":function(node,address){address.city=this.getChildValue(node);},"AdministrativeArea":function(node,address){address.administrativeArea=this.getChildValue(node);},"PostalCode":function(node,address){address.postalCode=this.getChildValue(node);},"Country":function(node,address){address.country=this.getChildValue(node);},"ElectronicMailAddress":function(node,address){address.electronicMailAddress=this.getChildValue(node);},"Role":function(node,serviceContact){serviceContact.role=this.getChildValue(node);},"OperationsMetadata":function(node,obj){obj.operationsMetadata={};this.readChildNodes(node,obj.operationsMetadata);},"Operation":function(node,operationsMetadata){var name=node.getAttribute("name");operationsMetadata[name]={};this.readChildNodes(node,operationsMetadata[name]);},"DCP":function(node,operation){operation.dcp={};this.readChildNodes(node,operation.dcp);},"HTTP":function(node,dcp){dcp.http={};this.readChildNodes(node,dcp.http);},"Get":function(node,http){http.get=this.getAttributeNS(node,this.namespaces.xlink,"href");},"Post":function(node,http){http.post=this.getAttributeNS(node,this.namespaces.xlink,"href");},"Parameter":function(node,operation){if(!operation.parameters){operation.parameters={};}
+var name=node.getAttribute("name");operation.parameters[name]={};this.readChildNodes(node,operation.parameters[name]);},"Value":function(node,allowedValues){allowedValues[this.getChildValue(node)]=true;},"OutputFormat":function(node,obj){obj.formats.push({value:this.getChildValue(node)});this.readChildNodes(node,obj);},"WGS84BoundingBox":function(node,obj){var boundingBox={};boundingBox.crs=node.getAttribute("crs");if(obj.BoundingBox){obj.BoundingBox.push(boundingBox);}else{obj.projection=boundingBox.crs;boundingBox=obj;}
+this.readChildNodes(node,boundingBox);},"BoundingBox":function(node,obj){this.readers['ows']['WGS84BoundingBox'].apply(this,[node,obj]);},"LowerCorner":function(node,obj){var str=this.getChildValue(node).replace(this.regExes.trimSpace,"");str=str.replace(this.regExes.trimComma,",");var pointList=str.split(this.regExes.splitSpace);obj.left=pointList[0];obj.bottom=pointList[1];},"UpperCorner":function(node,obj){var str=this.getChildValue(node).replace(this.regExes.trimSpace,"");str=str.replace(this.regExes.trimComma,",");var pointList=str.split(this.regExes.splitSpace);obj.right=pointList[0];obj.top=pointList[1];obj.bounds=new OpenLayers.Bounds(obj.left,obj.bottom,obj.right,obj.top);delete obj.left;delete obj.bottom;delete obj.right;delete obj.top;},"Language":function(node,obj){obj.language=this.getChildValue(node);}}},writers:{"ows":{"BoundingBox":function(options){var node=this.createElementNSPlus("ows:BoundingBox",{attributes:{crs:options.projection}});this.writeNode("ows:LowerCorner",options,node);this.writeNode("ows:UpperCorner",options,node);return node;},"LowerCorner":function(options){var node=this.createElementNSPlus("ows:LowerCorner",{value:options.bounds.left+" "+options.bounds.bottom});return node;},"UpperCorner":function(options){var node=this.createElementNSPlus("ows:UpperCorner",{value:options.bounds.right+" "+options.bounds.top});return node;},"Identifier":function(identifier){var node=this.createElementNSPlus("ows:Identifier",{value:identifier});return node;},"Title":function(title){var node=this.createElementNSPlus("ows:Title",{value:title});return node;},"Abstract":function(abstractValue){var node=this.createElementNSPlus("ows:Abstract",{value:abstractValue});return node;},"OutputFormat":function(format){var node=this.createElementNSPlus("ows:OutputFormat",{value:format});return node;}}},CLASS_NAME:"OpenLayers.Format.OWSCommon.v1"});OpenLayers.Format.OWSCommon.v1_1_0=OpenLayers.Class(OpenLayers.Format.OWSCommon.v1,{namespaces:{ows:"http://www.opengis.net/ows/1.1",xlink:"http://www.w3.org/1999/xlink"},readers:{"ows":OpenLayers.Util.applyDefaults({"ExceptionReport":function(node,obj){obj.exceptionReport={version:node.getAttribute('version'),language:node.getAttribute('xml:lang'),exceptions:[]};this.readChildNodes(node,obj.exceptionReport);},"AllowedValues":function(node,parameter){parameter.allowedValues={};this.readChildNodes(node,parameter.allowedValues);},"AnyValue":function(node,parameter){parameter.anyValue=true;},"DataType":function(node,parameter){parameter.dataType=this.getChildValue(node);},"Range":function(node,allowedValues){allowedValues.range={};this.readChildNodes(node,allowedValues.range);},"MinimumValue":function(node,range){range.minValue=this.getChildValue(node);},"MaximumValue":function(node,range){range.maxValue=this.getChildValue(node);},"Identifier":function(node,obj){obj.identifier=this.getChildValue(node);},"SupportedCRS":function(node,obj){obj.supportedCRS=this.getChildValue(node);}},OpenLayers.Format.OWSCommon.v1.prototype.readers["ows"])},writers:{"ows":OpenLayers.Util.applyDefaults({"Range":function(range){var node=this.createElementNSPlus("ows:Range",{attributes:{'ows:rangeClosure':range.closure}});this.writeNode("ows:MinimumValue",range.minValue,node);this.writeNode("ows:MaximumValue",range.maxValue,node);return node;},"MinimumValue":function(minValue){var node=this.createElementNSPlus("ows:MinimumValue",{value:minValue});return node;},"MaximumValue":function(maxValue){var node=this.createElementNSPlus("ows:MaximumValue",{value:maxValue});return node;},"Value":function(value){var node=this.createElementNSPlus("ows:Value",{value:value});return node;}},OpenLayers.Format.OWSCommon.v1.prototype.writers["ows"])},CLASS_NAME:"OpenLayers.Format.OWSCommon.v1_1_0"});OpenLayers.Control.Attribution=OpenLayers.Class(OpenLayers.Control,{separator:", ",destroy:function(){this.map.events.un({"removelayer":this.updateAttribution,"addlayer":this.updateAttribution,"changelayer":this.updateAttribution,"changebaselayer":this.updateAttribution,scope:this});OpenLayers.Control.prototype.destroy.apply(this,arguments);},draw:function(){OpenLayers.Control.prototype.draw.apply(this,arguments);this.map.events.on({'changebaselayer':this.updateAttribution,'changelayer':this.updateAttribution,'addlayer':this.updateAttribution,'removelayer':this.updateAttribution,scope:this});this.updateAttribution();return this.div;},updateAttribution:function(){var attributions=[];if(this.map&&this.map.layers){for(var i=0,len=this.map.layers.length;i<len;i++){var layer=this.map.layers[i];if(layer.attribution&&layer.getVisibility()){if(OpenLayers.Util.indexOf(attributions,layer.attribution)===-1){attributions.push(layer.attribution);}}}
+this.div.innerHTML=attributions.join(this.separator);}},CLASS_NAME:"OpenLayers.Control.Attribution"});OpenLayers.Popup=OpenLayers.Class({events:null,id:"",lonlat:null,div:null,contentSize:null,size:null,contentHTML:null,backgroundColor:"",opacity:"",border:"",contentDiv:null,groupDiv:null,closeDiv:null,autoSize:false,minSize:null,maxSize:null,displayClass:"olPopup",contentDisplayClass:"olPopupContent",padding:0,disableFirefoxOverflowHack:false,fixPadding:function(){if(typeof this.padding=="number"){this.padding=new OpenLayers.Bounds(this.padding,this.padding,this.padding,this.padding);}},panMapIfOutOfView:false,keepInMap:false,closeOnMove:false,map:null,initialize:function(id,lonlat,contentSize,contentHTML,closeBox,closeBoxCallback){if(id==null){id=OpenLayers.Util.createUniqueID(this.CLASS_NAME+"_");}
+this.id=id;this.lonlat=lonlat;this.contentSize=(contentSize!=null)?contentSize:new OpenLayers.Size(OpenLayers.Popup.WIDTH,OpenLayers.Popup.HEIGHT);if(contentHTML!=null){this.contentHTML=contentHTML;}
+this.backgroundColor=OpenLayers.Popup.COLOR;this.opacity=OpenLayers.Popup.OPACITY;this.border=OpenLayers.Popup.BORDER;this.div=OpenLayers.Util.createDiv(this.id,null,null,null,null,null,"hidden");this.div.className=this.displayClass;var groupDivId=this.id+"_GroupDiv";this.groupDiv=OpenLayers.Util.createDiv(groupDivId,null,null,null,"relative",null,"hidden");var id=this.div.id+"_contentDiv";this.contentDiv=OpenLayers.Util.createDiv(id,null,this.contentSize.clone(),null,"relative");this.contentDiv.className=this.contentDisplayClass;this.groupDiv.appendChild(this.contentDiv);this.div.appendChild(this.groupDiv);if(closeBox){this.addCloseBox(closeBoxCallback);}
+this.registerEvents();},destroy:function(){this.id=null;this.lonlat=null;this.size=null;this.contentHTML=null;this.backgroundColor=null;this.opacity=null;this.border=null;if(this.closeOnMove&&this.map){this.map.events.unregister("movestart",this,this.hide);}
+this.events.destroy();this.events=null;if(this.closeDiv){OpenLayers.Event.stopObservingElement(this.closeDiv);this.groupDiv.removeChild(this.closeDiv);}
+this.closeDiv=null;this.div.removeChild(this.groupDiv);this.groupDiv=null;if(this.map!=null){this.map.removePopup(this);}
+this.map=null;this.div=null;this.autoSize=null;this.minSize=null;this.maxSize=null;this.padding=null;this.panMapIfOutOfView=null;},draw:function(px){if(px==null){if((this.lonlat!=null)&&(this.map!=null)){px=this.map.getLayerPxFromLonLat(this.lonlat);}}
+if(this.closeOnMove){this.map.events.register("movestart",this,this.hide);}
+if(!this.disableFirefoxOverflowHack&&OpenLayers.BROWSER_NAME=='firefox'){this.map.events.register("movestart",this,function(){var style=document.defaultView.getComputedStyle(this.contentDiv,null);var currentOverflow=style.getPropertyValue("overflow");if(currentOverflow!="hidden"){this.contentDiv._oldOverflow=currentOverflow;this.contentDiv.style.overflow="hidden";}});this.map.events.register("moveend",this,function(){var oldOverflow=this.contentDiv._oldOverflow;if(oldOverflow){this.contentDiv.style.overflow=oldOverflow;this.contentDiv._oldOverflow=null;}});}
+this.moveTo(px);if(!this.autoSize&&!this.size){this.setSize(this.contentSize);}
+this.setBackgroundColor();this.setOpacity();this.setBorder();this.setContentHTML();if(this.panMapIfOutOfView){this.panIntoView();}
+return this.div;},updatePosition:function(){if((this.lonlat)&&(this.map)){var px=this.map.getLayerPxFromLonLat(this.lonlat);if(px){this.moveTo(px);}}},moveTo:function(px){if((px!=null)&&(this.div!=null)){this.div.style.left=px.x+"px";this.div.style.top=px.y+"px";}},visible:function(){return OpenLayers.Element.visible(this.div);},toggle:function(){if(this.visible()){this.hide();}else{this.show();}},show:function(){this.div.style.display='';if(this.panMapIfOutOfView){this.panIntoView();}},hide:function(){this.div.style.display='none';},setSize:function(contentSize){this.size=contentSize.clone();var contentDivPadding=this.getContentDivPadding();var wPadding=contentDivPadding.left+contentDivPadding.right;var hPadding=contentDivPadding.top+contentDivPadding.bottom;this.fixPadding();wPadding+=this.padding.left+this.padding.right;hPadding+=this.padding.top+this.padding.bottom;if(this.closeDiv){var closeDivWidth=parseInt(this.closeDiv.style.width);wPadding+=closeDivWidth+contentDivPadding.right;}
+this.size.w+=wPadding;this.size.h+=hPadding;if(OpenLayers.BROWSER_NAME=="msie"){this.contentSize.w+=contentDivPadding.left+contentDivPadding.right;this.contentSize.h+=contentDivPadding.bottom+contentDivPadding.top;}
+if(this.div!=null){this.div.style.width=this.size.w+"px";this.div.style.height=this.size.h+"px";}
+if(this.contentDiv!=null){this.contentDiv.style.width=contentSize.w+"px";this.contentDiv.style.height=contentSize.h+"px";}},updateSize:function(){var preparedHTML="<div class='"+this.contentDisplayClass+"'>"+
+this.contentDiv.innerHTML+"</div>";var containerElement=(this.map)?this.map.layerContainerDiv:document.body;var realSize=OpenLayers.Util.getRenderedDimensions(preparedHTML,null,{displayClass:this.displayClass,containerElement:containerElement});var safeSize=this.getSafeContentSize(realSize);var newSize=null;if(safeSize.equals(realSize)){newSize=realSize;}else{var fixedSize=new OpenLayers.Size();fixedSize.w=(safeSize.w<realSize.w)?safeSize.w:null;fixedSize.h=(safeSize.h<realSize.h)?safeSize.h:null;if(fixedSize.w&&fixedSize.h){newSize=safeSize;}else{var clippedSize=OpenLayers.Util.getRenderedDimensions(preparedHTML,fixedSize,{displayClass:this.contentDisplayClass,containerElement:containerElement});var currentOverflow=OpenLayers.Element.getStyle(this.contentDiv,"overflow");if((currentOverflow!="hidden")&&(clippedSize.equals(safeSize))){var scrollBar=OpenLayers.Util.getScrollbarWidth();if(fixedSize.w){clippedSize.h+=scrollBar;}else{clippedSize.w+=scrollBar;}}
+newSize=this.getSafeContentSize(clippedSize);}}
+this.setSize(newSize);},setBackgroundColor:function(color){if(color!=undefined){this.backgroundColor=color;}
+if(this.div!=null){this.div.style.backgroundColor=this.backgroundColor;}},setOpacity:function(opacity){if(opacity!=undefined){this.opacity=opacity;}
+if(this.div!=null){this.div.style.opacity=this.opacity;this.div.style.filter='alpha(opacity='+this.opacity*100+')';}},setBorder:function(border){if(border!=undefined){this.border=border;}
+if(this.div!=null){this.div.style.border=this.border;}},setContentHTML:function(contentHTML){if(contentHTML!=null){this.contentHTML=contentHTML;}
+if((this.contentDiv!=null)&&(this.contentHTML!=null)&&(this.contentHTML!=this.contentDiv.innerHTML)){this.contentDiv.innerHTML=this.contentHTML;if(this.autoSize){this.registerImageListeners();this.updateSize();}}},registerImageListeners:function(){var onImgLoad=function(){this.popup.updateSize();if(this.popup.visible()&&this.popup.panMapIfOutOfView){this.popup.panIntoView();}
+OpenLayers.Event.stopObserving(this.img,"load",this.img._onImageLoad);};var images=this.contentDiv.getElementsByTagName("img");for(var i=0,len=images.length;i<len;i++){var img=images[i];if(img.width==0||img.height==0){var context={'popup':this,'img':img};img._onImgLoad=OpenLayers.Function.bind(onImgLoad,context);OpenLayers.Event.observe(img,'load',img._onImgLoad);}}},getSafeContentSize:function(size){var safeContentSize=size.clone();var contentDivPadding=this.getContentDivPadding();var wPadding=contentDivPadding.left+contentDivPadding.right;var hPadding=contentDivPadding.top+contentDivPadding.bottom;this.fixPadding();wPadding+=this.padding.left+this.padding.right;hPadding+=this.padding.top+this.padding.bottom;if(this.closeDiv){var closeDivWidth=parseInt(this.closeDiv.style.width);wPadding+=closeDivWidth+contentDivPadding.right;}
+if(this.minSize){safeContentSize.w=Math.max(safeContentSize.w,(this.minSize.w-wPadding));safeContentSize.h=Math.max(safeContentSize.h,(this.minSize.h-hPadding));}
+if(this.maxSize){safeContentSize.w=Math.min(safeContentSize.w,(this.maxSize.w-wPadding));safeContentSize.h=Math.min(safeContentSize.h,(this.maxSize.h-hPadding));}
+if(this.map&&this.map.size){var extraX=0,extraY=0;if(this.keepInMap&&!this.panMapIfOutOfView){var px=this.map.getPixelFromLonLat(this.lonlat);switch(this.relativePosition){case"tr":extraX=px.x;extraY=this.map.size.h-px.y;break;case"tl":extraX=this.map.size.w-px.x;extraY=this.map.size.h-px.y;break;case"bl":extraX=this.map.size.w-px.x;extraY=px.y;break;case"br":extraX=px.x;extraY=px.y;break;default:extraX=px.x;extraY=this.map.size.h-px.y;break;}}
+var maxY=this.map.size.h-
+this.map.paddingForPopups.top-
+this.map.paddingForPopups.bottom-
+hPadding-extraY;var maxX=this.map.size.w-
+this.map.paddingForPopups.left-
+this.map.paddingForPopups.right-
+wPadding-extraX;safeContentSize.w=Math.min(safeContentSize.w,maxX);safeContentSize.h=Math.min(safeContentSize.h,maxY);}
+return safeContentSize;},getContentDivPadding:function(){var contentDivPadding=this._contentDivPadding;if(!contentDivPadding){if(this.div.parentNode==null){this.div.style.display="none";document.body.appendChild(this.div);}
+contentDivPadding=new OpenLayers.Bounds(OpenLayers.Element.getStyle(this.contentDiv,"padding-left"),OpenLayers.Element.getStyle(this.contentDiv,"padding-bottom"),OpenLayers.Element.getStyle(this.contentDiv,"padding-right"),OpenLayers.Element.getStyle(this.contentDiv,"padding-top"));this._contentDivPadding=contentDivPadding;if(this.div.parentNode==document.body){document.body.removeChild(this.div);this.div.style.display="";}}
+return contentDivPadding;},addCloseBox:function(callback){this.closeDiv=OpenLayers.Util.createDiv(this.id+"_close",null,new OpenLayers.Size(17,17));this.closeDiv.className="olPopupCloseBox";var contentDivPadding=this.getContentDivPadding();this.closeDiv.style.right=contentDivPadding.right+"px";this.closeDiv.style.top=contentDivPadding.top+"px";this.groupDiv.appendChild(this.closeDiv);var closePopup=callback||function(e){this.hide();OpenLayers.Event.stop(e);};OpenLayers.Event.observe(this.closeDiv,"touchend",OpenLayers.Function.bindAsEventListener(closePopup,this));OpenLayers.Event.observe(this.closeDiv,"click",OpenLayers.Function.bindAsEventListener(closePopup,this));},panIntoView:function(){var mapSize=this.map.getSize();var origTL=this.map.getViewPortPxFromLayerPx(new OpenLayers.Pixel(parseInt(this.div.style.left),parseInt(this.div.style.top)));var newTL=origTL.clone();if(origTL.x<this.map.paddingForPopups.left){newTL.x=this.map.paddingForPopups.left;}else
+if((origTL.x+this.size.w)>(mapSize.w-this.map.paddingForPopups.right)){newTL.x=mapSize.w-this.map.paddingForPopups.right-this.size.w;}
+if(origTL.y<this.map.paddingForPopups.top){newTL.y=this.map.paddingForPopups.top;}else
+if((origTL.y+this.size.h)>(mapSize.h-this.map.paddingForPopups.bottom)){newTL.y=mapSize.h-this.map.paddingForPopups.bottom-this.size.h;}
+var dx=origTL.x-newTL.x;var dy=origTL.y-newTL.y;this.map.pan(dx,dy);},registerEvents:function(){this.events=new OpenLayers.Events(this,this.div,null,true);function onTouchstart(evt){OpenLayers.Event.stop(evt,true);}
+this.events.on({"mousedown":this.onmousedown,"mousemove":this.onmousemove,"mouseup":this.onmouseup,"click":this.onclick,"mouseout":this.onmouseout,"dblclick":this.ondblclick,"touchstart":onTouchstart,scope:this});},onmousedown:function(evt){this.mousedown=true;OpenLayers.Event.stop(evt,true);},onmousemove:function(evt){if(this.mousedown){OpenLayers.Event.stop(evt,true);}},onmouseup:function(evt){if(this.mousedown){this.mousedown=false;OpenLayers.Event.stop(evt,true);}},onclick:function(evt){OpenLayers.Event.stop(evt,true);},onmouseout:function(evt){this.mousedown=false;},ondblclick:function(evt){OpenLayers.Event.stop(evt,true);},CLASS_NAME:"OpenLayers.Popup"});OpenLayers.Popup.WIDTH=200;OpenLayers.Popup.HEIGHT=200;OpenLayers.Popup.COLOR="white";OpenLayers.Popup.OPACITY=1;OpenLayers.Popup.BORDER="0px";OpenLayers.Popup.Anchored=OpenLayers.Class(OpenLayers.Popup,{relativePosition:null,keepInMap:true,anchor:null,initialize:function(id,lonlat,contentSize,contentHTML,anchor,closeBox,closeBoxCallback){var newArguments=[id,lonlat,contentSize,contentHTML,closeBox,closeBoxCallback];OpenLayers.Popup.prototype.initialize.apply(this,newArguments);this.anchor=(anchor!=null)?anchor:{size:new OpenLayers.Size(0,0),offset:new OpenLayers.Pixel(0,0)};},destroy:function(){this.anchor=null;this.relativePosition=null;OpenLayers.Popup.prototype.destroy.apply(this,arguments);},show:function(){this.updatePosition();OpenLayers.Popup.prototype.show.apply(this,arguments);},moveTo:function(px){var oldRelativePosition=this.relativePosition;this.relativePosition=this.calculateRelativePosition(px);var newPx=this.calculateNewPx(px);var newArguments=new Array(newPx);OpenLayers.Popup.prototype.moveTo.apply(this,newArguments);if(this.relativePosition!=oldRelativePosition){this.updateRelativePosition();}},setSize:function(contentSize){OpenLayers.Popup.prototype.setSize.apply(this,arguments);if((this.lonlat)&&(this.map)){var px=this.map.getLayerPxFromLonLat(this.lonlat);this.moveTo(px);}},calculateRelativePosition:function(px){var lonlat=this.map.getLonLatFromLayerPx(px);var extent=this.map.getExtent();var quadrant=extent.determineQuadrant(lonlat);return OpenLayers.Bounds.oppositeQuadrant(quadrant);},updateRelativePosition:function(){},calculateNewPx:function(px){var newPx=px.offset(this.anchor.offset);var size=this.size||this.contentSize;var top=(this.relativePosition.charAt(0)=='t');newPx.y+=(top)?-size.h:this.anchor.size.h;var left=(this.relativePosition.charAt(1)=='l');newPx.x+=(left)?-size.w:this.anchor.size.w;return newPx;},CLASS_NAME:"OpenLayers.Popup.Anchored"});OpenLayers.Popup.Framed=OpenLayers.Class(OpenLayers.Popup.Anchored,{imageSrc:null,imageSize:null,isAlphaImage:false,positionBlocks:null,blocks:null,fixedRelativePosition:false,initialize:function(id,lonlat,contentSize,contentHTML,anchor,closeBox,closeBoxCallback){OpenLayers.Popup.Anchored.prototype.initialize.apply(this,arguments);if(this.fixedRelativePosition){this.updateRelativePosition();this.calculateRelativePosition=function(px){return this.relativePosition;};}
+this.contentDiv.style.position="absolute";this.contentDiv.style.zIndex=1;if(closeBox){this.closeDiv.style.zIndex=1;}
+this.groupDiv.style.position="absolute";this.groupDiv.style.top="0px";this.groupDiv.style.left="0px";this.groupDiv.style.height="100%";this.groupDiv.style.width="100%";},destroy:function(){this.imageSrc=null;this.imageSize=null;this.isAlphaImage=null;this.fixedRelativePosition=false;this.positionBlocks=null;for(var i=0;i<this.blocks.length;i++){var block=this.blocks[i];if(block.image){block.div.removeChild(block.image);}
+block.image=null;if(block.div){this.groupDiv.removeChild(block.div);}
+block.div=null;}
+this.blocks=null;OpenLayers.Popup.Anchored.prototype.destroy.apply(this,arguments);},setBackgroundColor:function(color){},setBorder:function(){},setOpacity:function(opacity){},setSize:function(contentSize){OpenLayers.Popup.Anchored.prototype.setSize.apply(this,arguments);this.updateBlocks();},updateRelativePosition:function(){this.padding=this.positionBlocks[this.relativePosition].padding;if(this.closeDiv){var contentDivPadding=this.getContentDivPadding();this.closeDiv.style.right=contentDivPadding.right+
+this.padding.right+"px";this.closeDiv.style.top=contentDivPadding.top+
+this.padding.top+"px";}
+this.updateBlocks();},calculateNewPx:function(px){var newPx=OpenLayers.Popup.Anchored.prototype.calculateNewPx.apply(this,arguments);newPx=newPx.offset(this.positionBlocks[this.relativePosition].offset);return newPx;},createBlocks:function(){this.blocks=[];var firstPosition=null;for(var key in this.positionBlocks){firstPosition=key;break;}
+var position=this.positionBlocks[firstPosition];for(var i=0;i<position.blocks.length;i++){var block={};this.blocks.push(block);var divId=this.id+'_FrameDecorationDiv_'+i;block.div=OpenLayers.Util.createDiv(divId,null,null,null,"absolute",null,"hidden",null);var imgId=this.id+'_FrameDecorationImg_'+i;var imageCreator=(this.isAlphaImage)?OpenLayers.Util.createAlphaImageDiv:OpenLayers.Util.createImage;block.image=imageCreator(imgId,null,this.imageSize,this.imageSrc,"absolute",null,null,null);block.div.appendChild(block.image);this.groupDiv.appendChild(block.div);}},updateBlocks:function(){if(!this.blocks){this.createBlocks();}
+if(this.size&&this.relativePosition){var position=this.positionBlocks[this.relativePosition];for(var i=0;i<position.blocks.length;i++){var positionBlock=position.blocks[i];var block=this.blocks[i];var l=positionBlock.anchor.left;var b=positionBlock.anchor.bottom;var r=positionBlock.anchor.right;var t=positionBlock.anchor.top;var w=(isNaN(positionBlock.size.w))?this.size.w-(r+l):positionBlock.size.w;var h=(isNaN(positionBlock.size.h))?this.size.h-(b+t):positionBlock.size.h;block.div.style.width=(w<0?0:w)+'px';block.div.style.height=(h<0?0:h)+'px';block.div.style.left=(l!=null)?l+'px':'';block.div.style.bottom=(b!=null)?b+'px':'';block.div.style.right=(r!=null)?r+'px':'';block.div.style.top=(t!=null)?t+'px':'';block.image.style.left=positionBlock.position.x+'px';block.image.style.top=positionBlock.position.y+'px';}
+this.contentDiv.style.left=this.padding.left+"px";this.contentDiv.style.top=this.padding.top+"px";}},CLASS_NAME:"OpenLayers.Popup.Framed"});OpenLayers.Filter.Logical=OpenLayers.Class(OpenLayers.Filter,{filters:null,type:null,initialize:function(options){this.filters=[];OpenLayers.Filter.prototype.initialize.apply(this,[options]);},destroy:function(){this.filters=null;OpenLayers.Filter.prototype.destroy.apply(this);},evaluate:function(context){var i,len;switch(this.type){case OpenLayers.Filter.Logical.AND:for(i=0,len=this.filters.length;i<len;i++){if(this.filters[i].evaluate(context)==false){return false;}}
+return true;case OpenLayers.Filter.Logical.OR:for(i=0,len=this.filters.length;i<len;i++){if(this.filters[i].evaluate(context)==true){return true;}}
+return false;case OpenLayers.Filter.Logical.NOT:return(!this.filters[0].evaluate(context));}
+return undefined;},clone:function(){var filters=[];for(var i=0,len=this.filters.length;i<len;++i){filters.push(this.filters[i].clone());}
+return new OpenLayers.Filter.Logical({type:this.type,filters:filters});},CLASS_NAME:"OpenLayers.Filter.Logical"});OpenLayers.Filter.Logical.AND="&&";OpenLayers.Filter.Logical.OR="||";OpenLayers.Filter.Logical.NOT="!";OpenLayers.Handler.Drag=OpenLayers.Class(OpenLayers.Handler,{started:false,stopDown:true,dragging:false,touch:false,last:null,start:null,lastMoveEvt:null,oldOnselectstart:null,interval:0,timeoutId:null,documentDrag:false,documentEvents:null,initialize:function(control,callbacks,options){OpenLayers.Handler.prototype.initialize.apply(this,arguments);if(this.documentDrag===true){var me=this;this._docMove=function(evt){me.mousemove({xy:{x:evt.clientX,y:evt.clientY},element:document});};this._docUp=function(evt){me.mouseup({xy:{x:evt.clientX,y:evt.clientY}});};}},dragstart:function(evt){var propagate=true;this.dragging=false;if(this.checkModifiers(evt)&&(OpenLayers.Event.isLeftClick(evt)||OpenLayers.Event.isSingleTouch(evt))){this.started=true;this.start=evt.xy;this.last=evt.xy;OpenLayers.Element.addClass(this.map.viewPortDiv,"olDragDown");this.down(evt);this.callback("down",[evt.xy]);OpenLayers.Event.stop(evt);if(!this.oldOnselectstart){this.oldOnselectstart=document.onselectstart?document.onselectstart:OpenLayers.Function.True;}
+document.onselectstart=OpenLayers.Function.False;propagate=!this.stopDown;}else{this.started=false;this.start=null;this.last=null;}
+return propagate;},dragmove:function(evt){this.lastMoveEvt=evt;if(this.started&&!this.timeoutId&&(evt.xy.x!=this.last.x||evt.xy.y!=this.last.y)){if(this.documentDrag===true&&this.documentEvents){if(evt.element===document){this.adjustXY(evt);this.setEvent(evt);}else{this.removeDocumentEvents();}}
+if(this.interval>0){this.timeoutId=setTimeout(OpenLayers.Function.bind(this.removeTimeout,this),this.interval);}
+this.dragging=true;this.move(evt);this.callback("move",[evt.xy]);if(!this.oldOnselectstart){this.oldOnselectstart=document.onselectstart;document.onselectstart=OpenLayers.Function.False;}
+this.last=evt.xy;}
+return true;},dragend:function(evt){if(this.started){if(this.documentDrag===true&&this.documentEvents){this.adjustXY(evt);this.removeDocumentEvents();}
+var dragged=(this.start!=this.last);this.started=false;this.dragging=false;OpenLayers.Element.removeClass(this.map.viewPortDiv,"olDragDown");this.up(evt);this.callback("up",[evt.xy]);if(dragged){this.callback("done",[evt.xy]);}
+document.onselectstart=this.oldOnselectstart;}
+return true;},down:function(evt){},move:function(evt){},up:function(evt){},out:function(evt){},mousedown:function(evt){return this.dragstart(evt);},touchstart:function(evt){if(!this.touch){this.touch=true;this.map.events.un({mousedown:this.mousedown,mouseup:this.mouseup,mousemove:this.mousemove,click:this.click,scope:this});}
+return this.dragstart(evt);},mousemove:function(evt){return this.dragmove(evt);},touchmove:function(evt){return this.dragmove(evt);},removeTimeout:function(){this.timeoutId=null;if(this.dragging){this.mousemove(this.lastMoveEvt);}},mouseup:function(evt){return this.dragend(evt);},touchend:function(evt){evt.xy=this.last;return this.dragend(evt);},mouseout:function(evt){if(this.started&&OpenLayers.Util.mouseLeft(evt,this.map.eventsDiv)){if(this.documentDrag===true){this.addDocumentEvents();}else{var dragged=(this.start!=this.last);this.started=false;this.dragging=false;OpenLayers.Element.removeClass(this.map.viewPortDiv,"olDragDown");this.out(evt);this.callback("out",[]);if(dragged){this.callback("done",[evt.xy]);}
+if(document.onselectstart){document.onselectstart=this.oldOnselectstart;}}}
+return true;},click:function(evt){return(this.start==this.last);},activate:function(){var activated=false;if(OpenLayers.Handler.prototype.activate.apply(this,arguments)){this.dragging=false;activated=true;}
+return activated;},deactivate:function(){var deactivated=false;if(OpenLayers.Handler.prototype.deactivate.apply(this,arguments)){this.touch=false;this.started=false;this.dragging=false;this.start=null;this.last=null;deactivated=true;OpenLayers.Element.removeClass(this.map.viewPortDiv,"olDragDown");}
+return deactivated;},adjustXY:function(evt){var pos=OpenLayers.Util.pagePosition(this.map.viewPortDiv);evt.xy.x-=pos[0];evt.xy.y-=pos[1];},addDocumentEvents:function(){OpenLayers.Element.addClass(document.body,"olDragDown");this.documentEvents=true;OpenLayers.Event.observe(document,"mousemove",this._docMove);OpenLayers.Event.observe(document,"mouseup",this._docUp);},removeDocumentEvents:function(){OpenLayers.Element.removeClass(document.body,"olDragDown");this.documentEvents=false;OpenLayers.Event.stopObserving(document,"mousemove",this._docMove);OpenLayers.Event.stopObserving(document,"mouseup",this._docUp);},CLASS_NAME:"OpenLayers.Handler.Drag"});OpenLayers.Handler.Box=OpenLayers.Class(OpenLayers.Handler,{dragHandler:null,boxDivClassName:'olHandlerBoxZoomBox',boxOffsets:null,initialize:function(control,callbacks,options){OpenLayers.Handler.prototype.initialize.apply(this,arguments);this.dragHandler=new OpenLayers.Handler.Drag(this,{down:this.startBox,move:this.moveBox,out:this.removeBox,up:this.endBox},{keyMask:this.keyMask});},destroy:function(){OpenLayers.Handler.prototype.destroy.apply(this,arguments);if(this.dragHandler){this.dragHandler.destroy();this.dragHandler=null;}},setMap:function(map){OpenLayers.Handler.prototype.setMap.apply(this,arguments);if(this.dragHandler){this.dragHandler.setMap(map);}},startBox:function(xy){this.callback("start",[]);this.zoomBox=OpenLayers.Util.createDiv('zoomBox',new OpenLayers.Pixel(-9999,-9999));this.zoomBox.className=this.boxDivClassName;this.zoomBox.style.zIndex=this.map.Z_INDEX_BASE["Popup"]-1;this.map.eventsDiv.appendChild(this.zoomBox);OpenLayers.Element.addClass(this.map.eventsDiv,"olDrawBox");},moveBox:function(xy){var startX=this.dragHandler.start.x;var startY=this.dragHandler.start.y;var deltaX=Math.abs(startX-xy.x);var deltaY=Math.abs(startY-xy.y);var offset=this.getBoxOffsets();this.zoomBox.style.width=(deltaX+offset.width+1)+"px";this.zoomBox.style.height=(deltaY+offset.height+1)+"px";this.zoomBox.style.left=(xy.x<startX?startX-deltaX-offset.left:startX-offset.left)+"px";this.zoomBox.style.top=(xy.y<startY?startY-deltaY-offset.top:startY-offset.top)+"px";},endBox:function(end){var result;if(Math.abs(this.dragHandler.start.x-end.x)>5||Math.abs(this.dragHandler.start.y-end.y)>5){var start=this.dragHandler.start;var top=Math.min(start.y,end.y);var bottom=Math.max(start.y,end.y);var left=Math.min(start.x,end.x);var right=Math.max(start.x,end.x);result=new OpenLayers.Bounds(left,bottom,right,top);}else{result=this.dragHandler.start.clone();}
+this.removeBox();this.callback("done",[result]);},removeBox:function(){this.map.eventsDiv.removeChild(this.zoomBox);this.zoomBox=null;this.boxOffsets=null;OpenLayers.Element.removeClass(this.map.eventsDiv,"olDrawBox");},activate:function(){if(OpenLayers.Handler.prototype.activate.apply(this,arguments)){this.dragHandler.activate();return true;}else{return false;}},deactivate:function(){if(OpenLayers.Handler.prototype.deactivate.apply(this,arguments)){if(this.dragHandler.deactivate()){if(this.zoomBox){this.removeBox();}}
+return true;}else{return false;}},getBoxOffsets:function(){if(!this.boxOffsets){var testDiv=document.createElement("div");testDiv.style.position="absolute";testDiv.style.border="1px solid black";testDiv.style.width="3px";document.body.appendChild(testDiv);var w3cBoxModel=testDiv.clientWidth==3;document.body.removeChild(testDiv);var left=parseInt(OpenLayers.Element.getStyle(this.zoomBox,"border-left-width"));var right=parseInt(OpenLayers.Element.getStyle(this.zoomBox,"border-right-width"));var top=parseInt(OpenLayers.Element.getStyle(this.zoomBox,"border-top-width"));var bottom=parseInt(OpenLayers.Element.getStyle(this.zoomBox,"border-bottom-width"));this.boxOffsets={left:left,right:right,top:top,bottom:bottom,width:w3cBoxModel===false?left+right:0,height:w3cBoxModel===false?top+bottom:0};}
+return this.boxOffsets;},CLASS_NAME:"OpenLayers.Handler.Box"});OpenLayers.Control.ZoomBox=OpenLayers.Class(OpenLayers.Control,{type:OpenLayers.Control.TYPE_TOOL,out:false,alwaysZoom:false,draw:function(){this.handler=new OpenLayers.Handler.Box(this,{done:this.zoomBox},{keyMask:this.keyMask});},zoomBox:function(position){if(position instanceof OpenLayers.Bounds){var bounds;if(!this.out){var minXY=this.map.getLonLatFromPixel(new OpenLayers.Pixel(position.left,position.bottom));var maxXY=this.map.getLonLatFromPixel(new OpenLayers.Pixel(position.right,position.top));bounds=new OpenLayers.Bounds(minXY.lon,minXY.lat,maxXY.lon,maxXY.lat);}else{var pixWidth=Math.abs(position.right-position.left);var pixHeight=Math.abs(position.top-position.bottom);var zoomFactor=Math.min((this.map.size.h/pixHeight),(this.map.size.w/pixWidth));var extent=this.map.getExtent();var center=this.map.getLonLatFromPixel(position.getCenterPixel());var xmin=center.lon-(extent.getWidth()/2)*zoomFactor;var xmax=center.lon+(extent.getWidth()/2)*zoomFactor;var ymin=center.lat-(extent.getHeight()/2)*zoomFactor;var ymax=center.lat+(extent.getHeight()/2)*zoomFactor;bounds=new OpenLayers.Bounds(xmin,ymin,xmax,ymax);}
+var lastZoom=this.map.getZoom();this.map.zoomToExtent(bounds);if(lastZoom==this.map.getZoom()&&this.alwaysZoom==true){this.map.zoomTo(lastZoom+(this.out?-1:1));}}else{if(!this.out){this.map.setCenter(this.map.getLonLatFromPixel(position),this.map.getZoom()+1);}else{this.map.setCenter(this.map.getLonLatFromPixel(position),this.map.getZoom()-1);}}},CLASS_NAME:"OpenLayers.Control.ZoomBox"});OpenLayers.Control.DragPan=OpenLayers.Class(OpenLayers.Control,{type:OpenLayers.Control.TYPE_TOOL,panned:false,interval:1,documentDrag:false,kinetic:null,enableKinetic:false,kineticInterval:10,draw:function(){if(this.enableKinetic){var config={interval:this.kineticInterval};if(typeof this.enableKinetic==="object"){config=OpenLayers.Util.extend(config,this.enableKinetic);}
+this.kinetic=new OpenLayers.Kinetic(config);}
+this.handler=new OpenLayers.Handler.Drag(this,{"move":this.panMap,"done":this.panMapDone,"down":this.panMapStart},{interval:this.interval,documentDrag:this.documentDrag});},panMapStart:function(){if(this.kinetic){this.kinetic.begin();}},panMap:function(xy){if(this.kinetic){this.kinetic.update(xy);}
+this.panned=true;this.map.pan(this.handler.last.x-xy.x,this.handler.last.y-xy.y,{dragging:true,animate:false});},panMapDone:function(xy){if(this.panned){var res=null;if(this.kinetic){res=this.kinetic.end(xy);}
+this.map.pan(this.handler.last.x-xy.x,this.handler.last.y-xy.y,{dragging:!!res,animate:false});if(res){var self=this;this.kinetic.move(res,function(x,y,end){self.map.pan(x,y,{dragging:!end,animate:false});});}
+this.panned=false;}},CLASS_NAME:"OpenLayers.Control.DragPan"});OpenLayers.Handler.Click=OpenLayers.Class(OpenLayers.Handler,{delay:300,single:true,'double':false,pixelTolerance:0,dblclickTolerance:13,stopSingle:false,stopDouble:false,timerId:null,touch:false,down:null,last:null,first:null,rightclickTimerId:null,initialize:function(control,callbacks,options){OpenLayers.Handler.prototype.initialize.apply(this,arguments);},touchstart:function(evt){if(!this.touch){this.unregisterMouseListeners();this.touch=true;}
+this.down=this.getEventInfo(evt);this.last=this.getEventInfo(evt);return true;},touchmove:function(evt){this.last=this.getEventInfo(evt);return true;},touchend:function(evt){if(this.down){evt.xy=this.last.xy;evt.lastTouches=this.last.touches;this.handleSingle(evt);this.down=null;}
+return true;},unregisterMouseListeners:function(){this.map.events.un({mousedown:this.mousedown,mouseup:this.mouseup,click:this.click,dblclick:this.dblclick,scope:this});},mousedown:function(evt){this.down=this.getEventInfo(evt);this.last=this.getEventInfo(evt);return true;},mouseup:function(evt){var propagate=true;if(this.checkModifiers(evt)&&this.control.handleRightClicks&&OpenLayers.Event.isRightClick(evt)){propagate=this.rightclick(evt);}
+return propagate;},rightclick:function(evt){if(this.passesTolerance(evt)){if(this.rightclickTimerId!=null){this.clearTimer();this.callback('dblrightclick',[evt]);return!this.stopDouble;}else{var clickEvent=this['double']?OpenLayers.Util.extend({},evt):this.callback('rightclick',[evt]);var delayedRightCall=OpenLayers.Function.bind(this.delayedRightCall,this,clickEvent);this.rightclickTimerId=window.setTimeout(delayedRightCall,this.delay);}}
+return!this.stopSingle;},delayedRightCall:function(evt){this.rightclickTimerId=null;if(evt){this.callback('rightclick',[evt]);}},click:function(evt){if(!this.last){this.last=this.getEventInfo(evt);}
+this.handleSingle(evt);return!this.stopSingle;},dblclick:function(evt){this.handleDouble(evt);return!this.stopDouble;},handleDouble:function(evt){if(this["double"]&&this.passesDblclickTolerance(evt)){this.callback("dblclick",[evt]);}},handleSingle:function(evt){if(this.passesTolerance(evt)){if(this.timerId!=null){if(this.last.touches&&this.last.touches.length===1){if(this["double"]){OpenLayers.Event.stop(evt);}
+this.handleDouble(evt);}
+if(!this.last.touches||this.last.touches.length!==2){this.clearTimer();}}else{this.first=this.getEventInfo(evt);var clickEvent=this.single?OpenLayers.Util.extend({},evt):null;this.queuePotentialClick(clickEvent);}}},queuePotentialClick:function(evt){this.timerId=window.setTimeout(OpenLayers.Function.bind(this.delayedCall,this,evt),this.delay);},passesTolerance:function(evt){var passes=true;if(this.pixelTolerance!=null&&this.down&&this.down.xy){passes=this.pixelTolerance>=this.down.xy.distanceTo(evt.xy);if(passes&&this.touch&&this.down.touches.length===this.last.touches.length){for(var i=0,ii=this.down.touches.length;i<ii;++i){if(this.getTouchDistance(this.down.touches[i],this.last.touches[i])>this.pixelTolerance){passes=false;break;}}}}
+return passes;},getTouchDistance:function(from,to){return Math.sqrt(Math.pow(from.clientX-to.clientX,2)+
+Math.pow(from.clientY-to.clientY,2));},passesDblclickTolerance:function(evt){var passes=true;if(this.down&&this.first){passes=this.down.xy.distanceTo(this.first.xy)<=this.dblclickTolerance;}
+return passes;},clearTimer:function(){if(this.timerId!=null){window.clearTimeout(this.timerId);this.timerId=null;}
+if(this.rightclickTimerId!=null){window.clearTimeout(this.rightclickTimerId);this.rightclickTimerId=null;}},delayedCall:function(evt){this.timerId=null;if(evt){this.callback("click",[evt]);}},getEventInfo:function(evt){var touches;if(evt.touches){var len=evt.touches.length;touches=new Array(len);var touch;for(var i=0;i<len;i++){touch=evt.touches[i];touches[i]={clientX:touch.clientX,clientY:touch.clientY};}}
+return{xy:evt.xy,touches:touches};},deactivate:function(){var deactivated=false;if(OpenLayers.Handler.prototype.deactivate.apply(this,arguments)){this.clearTimer();this.down=null;this.first=null;this.last=null;this.touch=false;deactivated=true;}
+return deactivated;},CLASS_NAME:"OpenLayers.Handler.Click"});OpenLayers.Control.Navigation=OpenLayers.Class(OpenLayers.Control,{dragPan:null,dragPanOptions:null,pinchZoom:null,pinchZoomOptions:null,documentDrag:false,zoomBox:null,zoomBoxEnabled:true,zoomWheelEnabled:true,mouseWheelOptions:null,handleRightClicks:false,zoomBoxKeyMask:OpenLayers.Handler.MOD_SHIFT,autoActivate:true,initialize:function(options){this.handlers={};OpenLayers.Control.prototype.initialize.apply(this,arguments);},destroy:function(){this.deactivate();if(this.dragPan){this.dragPan.destroy();}
+this.dragPan=null;if(this.zoomBox){this.zoomBox.destroy();}
+this.zoomBox=null;if(this.pinchZoom){this.pinchZoom.destroy();}
+this.pinchZoom=null;OpenLayers.Control.prototype.destroy.apply(this,arguments);},activate:function(){this.dragPan.activate();if(this.zoomWheelEnabled){this.handlers.wheel.activate();}
+this.handlers.click.activate();if(this.zoomBoxEnabled){this.zoomBox.activate();}
+if(this.pinchZoom){this.pinchZoom.activate();}
+return OpenLayers.Control.prototype.activate.apply(this,arguments);},deactivate:function(){if(this.pinchZoom){this.pinchZoom.deactivate();}
+this.zoomBox.deactivate();this.dragPan.deactivate();this.handlers.click.deactivate();this.handlers.wheel.deactivate();return OpenLayers.Control.prototype.deactivate.apply(this,arguments);},draw:function(){if(this.handleRightClicks){this.map.viewPortDiv.oncontextmenu=OpenLayers.Function.False;}
+var clickCallbacks={'click':this.defaultClick,'dblclick':this.defaultDblClick,'dblrightclick':this.defaultDblRightClick};var clickOptions={'double':true,'stopDouble':true};this.handlers.click=new OpenLayers.Handler.Click(this,clickCallbacks,clickOptions);this.dragPan=new OpenLayers.Control.DragPan(OpenLayers.Util.extend({map:this.map,documentDrag:this.documentDrag},this.dragPanOptions));this.zoomBox=new OpenLayers.Control.ZoomBox({map:this.map,keyMask:this.zoomBoxKeyMask});this.dragPan.draw();this.zoomBox.draw();this.handlers.wheel=new OpenLayers.Handler.MouseWheel(this,{"up":this.wheelUp,"down":this.wheelDown},this.mouseWheelOptions);if(OpenLayers.Control.PinchZoom){this.pinchZoom=new OpenLayers.Control.PinchZoom(OpenLayers.Util.extend({map:this.map},this.pinchZoomOptions));}},defaultClick:function(evt){if(evt.lastTouches&&evt.lastTouches.length==2){this.map.zoomOut();}},defaultDblClick:function(evt){var newCenter=this.map.getLonLatFromViewPortPx(evt.xy);this.map.setCenter(newCenter,this.map.zoom+1);},defaultDblRightClick:function(evt){var newCenter=this.map.getLonLatFromViewPortPx(evt.xy);this.map.setCenter(newCenter,this.map.zoom-1);},wheelChange:function(evt,deltaZ){var currentZoom=this.map.getZoom();var newZoom=this.map.getZoom()+Math.round(deltaZ);newZoom=Math.max(newZoom,0);newZoom=Math.min(newZoom,this.map.getNumZoomLevels());if(newZoom===currentZoom){return;}
+var size=this.map.getSize();var deltaX=size.w/2-evt.xy.x;var deltaY=evt.xy.y-size.h/2;var newRes=this.map.baseLayer.getResolutionForZoom(newZoom);var zoomPoint=this.map.getLonLatFromPixel(evt.xy);var newCenter=new OpenLayers.LonLat(zoomPoint.lon+deltaX*newRes,zoomPoint.lat+deltaY*newRes);this.map.setCenter(newCenter,newZoom);},wheelUp:function(evt,delta){this.wheelChange(evt,delta||1);},wheelDown:function(evt,delta){this.wheelChange(evt,delta||-1);},disableZoomBox:function(){this.zoomBoxEnabled=false;this.zoomBox.deactivate();},enableZoomBox:function(){this.zoomBoxEnabled=true;if(this.active){this.zoomBox.activate();}},disableZoomWheel:function(){this.zoomWheelEnabled=false;this.handlers.wheel.deactivate();},enableZoomWheel:function(){this.zoomWheelEnabled=true;if(this.active){this.handlers.wheel.activate();}},CLASS_NAME:"OpenLayers.Control.Navigation"});OpenLayers.Layer.HTTPRequest=OpenLayers.Class(OpenLayers.Layer,{URL_HASH_FACTOR:(Math.sqrt(5)-1)/2,url:null,params:null,reproject:false,initialize:function(name,url,params,options){OpenLayers.Layer.prototype.initialize.apply(this,[name,options]);this.url=url;this.params=OpenLayers.Util.extend({},params);},destroy:function(){this.url=null;this.params=null;OpenLayers.Layer.prototype.destroy.apply(this,arguments);},clone:function(obj){if(obj==null){obj=new OpenLayers.Layer.HTTPRequest(this.name,this.url,this.params,this.getOptions());}
+obj=OpenLayers.Layer.prototype.clone.apply(this,[obj]);return obj;},setUrl:function(newUrl){this.url=newUrl;},mergeNewParams:function(newParams){this.params=OpenLayers.Util.extend(this.params,newParams);var ret=this.redraw();if(this.map!=null){this.map.events.triggerEvent("changelayer",{layer:this,property:"params"});}
+return ret;},redraw:function(force){if(force){return this.mergeNewParams({"_olSalt":Math.random()});}else{return OpenLayers.Layer.prototype.redraw.apply(this,[]);}},selectUrl:function(paramString,urls){var product=1;for(var i=0,len=paramString.length;i<len;i++){product*=paramString.charCodeAt(i)*this.URL_HASH_FACTOR;product-=Math.floor(product);}
+return urls[Math.floor(product*urls.length)];},getFullRequestString:function(newParams,altUrl){var url=altUrl||this.url;var allParams=OpenLayers.Util.extend({},this.params);allParams=OpenLayers.Util.extend(allParams,newParams);var paramsString=OpenLayers.Util.getParameterString(allParams);if(OpenLayers.Util.isArray(url)){url=this.selectUrl(paramsString,url);}
+var urlParams=OpenLayers.Util.upperCaseObject(OpenLayers.Util.getParameters(url));for(var key in allParams){if(key.toUpperCase()in urlParams){delete allParams[key];}}
+paramsString=OpenLayers.Util.getParameterString(allParams);return OpenLayers.Util.urlAppend(url,paramsString);},CLASS_NAME:"OpenLayers.Layer.HTTPRequest"});OpenLayers.Layer.Grid=OpenLayers.Class(OpenLayers.Layer.HTTPRequest,{tileSize:null,tileOriginCorner:"bl",tileOrigin:null,tileOptions:null,grid:null,singleTile:false,ratio:1.5,buffer:0,numLoadingTiles:0,tileLoadingDelay:100,timerId:null,initialize:function(name,url,params,options){OpenLayers.Layer.HTTPRequest.prototype.initialize.apply(this,arguments);this.events.addEventType("tileloaded");this.grid=[];this._moveGriddedTiles=OpenLayers.Function.bind(this.moveGriddedTiles,this);},removeMap:function(map){if(this.timerId!=null){window.clearTimeout(this.timerId);this.timerId=null;}},destroy:function(){this.clearGrid();this.grid=null;this.tileSize=null;OpenLayers.Layer.HTTPRequest.prototype.destroy.apply(this,arguments);},clearGrid:function(){if(this.grid){for(var iRow=0,len=this.grid.length;iRow<len;iRow++){var row=this.grid[iRow];for(var iCol=0,clen=row.length;iCol<clen;iCol++){var tile=row[iCol];this.removeTileMonitoringHooks(tile);tile.destroy();}}
+this.grid=[];}},clone:function(obj){if(obj==null){obj=new OpenLayers.Layer.Grid(this.name,this.url,this.params,this.getOptions());}
+obj=OpenLayers.Layer.HTTPRequest.prototype.clone.apply(this,[obj]);if(this.tileSize!=null){obj.tileSize=this.tileSize.clone();}
+obj.grid=[];return obj;},moveTo:function(bounds,zoomChanged,dragging){OpenLayers.Layer.HTTPRequest.prototype.moveTo.apply(this,arguments);bounds=bounds||this.map.getExtent();if(bounds!=null){var forceReTile=!this.grid.length||zoomChanged;var tilesBounds=this.getTilesBounds();if(this.singleTile){if(forceReTile||(!dragging&&!tilesBounds.containsBounds(bounds))){this.initSingleTile(bounds);}}else{if(forceReTile||!tilesBounds.containsBounds(bounds,true)){this.initGriddedTiles(bounds);}else{this.scheduleMoveGriddedTiles();}}}},moveByPx:function(dx,dy){if(!this.singleTile){this.scheduleMoveGriddedTiles();}},scheduleMoveGriddedTiles:function(){if(this.timerId!=null){window.clearTimeout(this.timerId);}
+this.timerId=window.setTimeout(this._moveGriddedTiles,this.tileLoadingDelay);},setTileSize:function(size){if(this.singleTile){size=this.map.getSize();size.h=parseInt(size.h*this.ratio);size.w=parseInt(size.w*this.ratio);}
+OpenLayers.Layer.HTTPRequest.prototype.setTileSize.apply(this,[size]);},getGridBounds:function(){var msg="The getGridBounds() function is deprecated. It will be "+"removed in 3.0. Please use getTilesBounds() instead.";OpenLayers.Console.warn(msg);return this.getTilesBounds();},getTilesBounds:function(){var bounds=null;if(this.grid.length){var bottom=this.grid.length-1;var bottomLeftTile=this.grid[bottom][0];var right=this.grid[0].length-1;var topRightTile=this.grid[0][right];bounds=new OpenLayers.Bounds(bottomLeftTile.bounds.left,bottomLeftTile.bounds.bottom,topRightTile.bounds.right,topRightTile.bounds.top);}
+return bounds;},initSingleTile:function(bounds){var center=bounds.getCenterLonLat();var tileWidth=bounds.getWidth()*this.ratio;var tileHeight=bounds.getHeight()*this.ratio;var tileBounds=new OpenLayers.Bounds(center.lon-(tileWidth/2),center.lat-(tileHeight/2),center.lon+(tileWidth/2),center.lat+(tileHeight/2));var ul=new OpenLayers.LonLat(tileBounds.left,tileBounds.top);var px=this.map.getLayerPxFromLonLat(ul);if(!this.grid.length){this.grid[0]=[];}
+var tile=this.grid[0][0];if(!tile){tile=this.addTile(tileBounds,px);this.addTileMonitoringHooks(tile);tile.draw();this.grid[0][0]=tile;}else{tile.moveTo(tileBounds,px);}
+this.removeExcessTiles(1,1);},calculateGridLayout:function(bounds,origin,resolution){var tilelon=resolution*this.tileSize.w;var tilelat=resolution*this.tileSize.h;var offsetlon=bounds.left-origin.lon;var tilecol=Math.floor(offsetlon/tilelon)-this.buffer;var tilecolremain=offsetlon/tilelon-tilecol;var tileoffsetx=-tilecolremain*this.tileSize.w;var tileoffsetlon=origin.lon+tilecol*tilelon;var offsetlat=bounds.top-(origin.lat+tilelat);var tilerow=Math.ceil(offsetlat/tilelat)+this.buffer;var tilerowremain=tilerow-offsetlat/tilelat;var tileoffsety=-tilerowremain*this.tileSize.h;var tileoffsetlat=origin.lat+tilerow*tilelat;return{tilelon:tilelon,tilelat:tilelat,tileoffsetlon:tileoffsetlon,tileoffsetlat:tileoffsetlat,tileoffsetx:tileoffsetx,tileoffsety:tileoffsety};},getTileOrigin:function(){var origin=this.tileOrigin;if(!origin){var extent=this.getMaxExtent();var edges=({"tl":["left","top"],"tr":["right","top"],"bl":["left","bottom"],"br":["right","bottom"]})[this.tileOriginCorner];origin=new OpenLayers.LonLat(extent[edges[0]],extent[edges[1]]);}
+return origin;},initGriddedTiles:function(bounds){var viewSize=this.map.getSize();var minRows=Math.ceil(viewSize.h/this.tileSize.h)+
+Math.max(1,2*this.buffer);var minCols=Math.ceil(viewSize.w/this.tileSize.w)+
+Math.max(1,2*this.buffer);var origin=this.getTileOrigin();var resolution=this.map.getResolution();var tileLayout=this.calculateGridLayout(bounds,origin,resolution);var tileoffsetx=Math.round(tileLayout.tileoffsetx);var tileoffsety=Math.round(tileLayout.tileoffsety);var tileoffsetlon=tileLayout.tileoffsetlon;var tileoffsetlat=tileLayout.tileoffsetlat;var tilelon=tileLayout.tilelon;var tilelat=tileLayout.tilelat;this.origin=new OpenLayers.Pixel(tileoffsetx,tileoffsety);var startX=tileoffsetx;var startLon=tileoffsetlon;var rowidx=0;var layerContainerDivLeft=parseInt(this.map.layerContainerDiv.style.left);var layerContainerDivTop=parseInt(this.map.layerContainerDiv.style.top);do{var row=this.grid[rowidx++];if(!row){row=[];this.grid.push(row);}
+tileoffsetlon=startLon;tileoffsetx=startX;var colidx=0;do{var tileBounds=new OpenLayers.Bounds(tileoffsetlon,tileoffsetlat,tileoffsetlon+tilelon,tileoffsetlat+tilelat);var x=tileoffsetx;x-=layerContainerDivLeft;var y=tileoffsety;y-=layerContainerDivTop;var px=new OpenLayers.Pixel(x,y);var tile=row[colidx++];if(!tile){tile=this.addTile(tileBounds,px);this.addTileMonitoringHooks(tile);row.push(tile);}else{tile.moveTo(tileBounds,px,false);}
+tileoffsetlon+=tilelon;tileoffsetx+=this.tileSize.w;}while((tileoffsetlon<=bounds.right+tilelon*this.buffer)||colidx<minCols);tileoffsetlat-=tilelat;tileoffsety+=this.tileSize.h;}while((tileoffsetlat>=bounds.bottom-tilelat*this.buffer)||rowidx<minRows);this.removeExcessTiles(rowidx,colidx);this.spiralTileLoad();},getMaxExtent:function(){return this.maxExtent;},spiralTileLoad:function(){var tileQueue=[];var directions=["right","down","left","up"];var iRow=0;var iCell=-1;var direction=OpenLayers.Util.indexOf(directions,"right");var directionsTried=0;while(directionsTried<directions.length){var testRow=iRow;var testCell=iCell;switch(directions[direction]){case"right":testCell++;break;case"down":testRow++;break;case"left":testCell--;break;case"up":testRow--;break;}
+var tile=null;if((testRow<this.grid.length)&&(testRow>=0)&&(testCell<this.grid[0].length)&&(testCell>=0)){tile=this.grid[testRow][testCell];}
+if((tile!=null)&&(!tile.queued)){tileQueue.unshift(tile);tile.queued=true;directionsTried=0;iRow=testRow;iCell=testCell;}else{direction=(direction+1)%4;directionsTried++;}}
+for(var i=0,len=tileQueue.length;i<len;i++){var tile=tileQueue[i];tile.draw();tile.queued=false;}},addTile:function(bounds,position){return new OpenLayers.Tile.Image(this,position,bounds,null,this.tileSize,this.tileOptions);},addTileMonitoringHooks:function(tile){tile.onLoadStart=function(){if(this.numLoadingTiles==0){this.events.triggerEvent("loadstart");}
+this.numLoadingTiles++;};tile.events.register("loadstart",this,tile.onLoadStart);tile.onLoadEnd=function(){this.numLoadingTiles--;this.events.triggerEvent("tileloaded");if(this.numLoadingTiles==0){this.events.triggerEvent("loadend");}};tile.events.register("loadend",this,tile.onLoadEnd);tile.events.register("unload",this,tile.onLoadEnd);},removeTileMonitoringHooks:function(tile){tile.unload();tile.events.un({"loadstart":tile.onLoadStart,"loadend":tile.onLoadEnd,"unload":tile.onLoadEnd,scope:this});},moveGriddedTiles:function(){var shifted=true;var buffer=this.buffer||1;var tlLayer=this.grid[0][0].position;var offsetX=parseInt(this.map.layerContainerDiv.style.left);var offsetY=parseInt(this.map.layerContainerDiv.style.top);var tlViewPort=tlLayer.add(offsetX,offsetY);if(tlViewPort.x>-this.tileSize.w*(buffer-1)){this.shiftColumn(true);}else if(tlViewPort.x<-this.tileSize.w*buffer){this.shiftColumn(false);}else if(tlViewPort.y>-this.tileSize.h*(buffer-1)){this.shiftRow(true);}else if(tlViewPort.y<-this.tileSize.h*buffer){this.shiftRow(false);}else{shifted=false;}
+if(shifted){this.timerId=window.setTimeout(this._moveGriddedTiles,0);}},shiftRow:function(prepend){var modelRowIndex=(prepend)?0:(this.grid.length-1);var grid=this.grid;var modelRow=grid[modelRowIndex];var resolution=this.map.getResolution();var deltaY=(prepend)?-this.tileSize.h:this.tileSize.h;var deltaLat=resolution*-deltaY;var row=(prepend)?grid.pop():grid.shift();for(var i=0,len=modelRow.length;i<len;i++){var modelTile=modelRow[i];var bounds=modelTile.bounds.clone();var position=modelTile.position.clone();bounds.bottom=bounds.bottom+deltaLat;bounds.top=bounds.top+deltaLat;position.y=position.y+deltaY;row[i].moveTo(bounds,position);}
+if(prepend){grid.unshift(row);}else{grid.push(row);}},shiftColumn:function(prepend){var deltaX=(prepend)?-this.tileSize.w:this.tileSize.w;var resolution=this.map.getResolution();var deltaLon=resolution*deltaX;for(var i=0,len=this.grid.length;i<len;i++){var row=this.grid[i];var modelTileIndex=(prepend)?0:(row.length-1);var modelTile=row[modelTileIndex];var bounds=modelTile.bounds.clone();var position=modelTile.position.clone();bounds.left=bounds.left+deltaLon;bounds.right=bounds.right+deltaLon;position.x=position.x+deltaX;var tile=prepend?this.grid[i].pop():this.grid[i].shift();tile.moveTo(bounds,position);if(prepend){row.unshift(tile);}else{row.push(tile);}}},removeExcessTiles:function(rows,columns){while(this.grid.length>rows){var row=this.grid.pop();for(var i=0,l=row.length;i<l;i++){var tile=row[i];this.removeTileMonitoringHooks(tile);tile.destroy();}}
+while(this.grid[0].length>columns){for(var i=0,l=this.grid.length;i<l;i++){var row=this.grid[i];var tile=row.pop();this.removeTileMonitoringHooks(tile);tile.destroy();}}},onMapResize:function(){if(this.singleTile){this.clearGrid();this.setTileSize();}},getTileBounds:function(viewPortPx){var maxExtent=this.maxExtent;var resolution=this.getResolution();var tileMapWidth=resolution*this.tileSize.w;var tileMapHeight=resolution*this.tileSize.h;var mapPoint=this.getLonLatFromViewPortPx(viewPortPx);var tileLeft=maxExtent.left+(tileMapWidth*Math.floor((mapPoint.lon-
+maxExtent.left)/tileMapWidth));var tileBottom=maxExtent.bottom+(tileMapHeight*Math.floor((mapPoint.lat-
+maxExtent.bottom)/tileMapHeight));return new OpenLayers.Bounds(tileLeft,tileBottom,tileLeft+tileMapWidth,tileBottom+tileMapHeight);},CLASS_NAME:"OpenLayers.Layer.Grid"});OpenLayers.Layer.XYZ=OpenLayers.Class(OpenLayers.Layer.Grid,{isBaseLayer:true,sphericalMercator:false,zoomOffset:0,serverResolutions:null,initialize:function(name,url,options){if(options&&options.sphericalMercator||this.sphericalMercator){options=OpenLayers.Util.extend({maxExtent:new OpenLayers.Bounds(-128*156543.03390625,-128*156543.03390625,128*156543.03390625,128*156543.03390625),maxResolution:156543.03390625,numZoomLevels:19,units:"m",projection:"EPSG:900913"},options);}
+url=url||this.url;name=name||this.name;var newArguments=[name,url,{},options];OpenLayers.Layer.Grid.prototype.initialize.apply(this,newArguments);},clone:function(obj){if(obj==null){obj=new OpenLayers.Layer.XYZ(this.name,this.url,this.getOptions());}
+obj=OpenLayers.Layer.Grid.prototype.clone.apply(this,[obj]);return obj;},getURL:function(bounds){var xyz=this.getXYZ(bounds);var url=this.url;if(OpenLayers.Util.isArray(url)){var s=''+xyz.x+xyz.y+xyz.z;url=this.selectUrl(s,url);}
+return OpenLayers.String.format(url,xyz);},getXYZ:function(bounds){var res=this.map.getResolution();var x=Math.round((bounds.left-this.maxExtent.left)/(res*this.tileSize.w));var y=Math.round((this.maxExtent.top-bounds.top)/(res*this.tileSize.h));var z=this.serverResolutions!=null?OpenLayers.Util.indexOf(this.serverResolutions,res):this.map.getZoom()+this.zoomOffset;var limit=Math.pow(2,z);if(this.wrapDateLine)
+{x=((x%limit)+limit)%limit;}
+return{'x':x,'y':y,'z':z};},setMap:function(map){OpenLayers.Layer.Grid.prototype.setMap.apply(this,arguments);if(!this.tileOrigin){this.tileOrigin=new OpenLayers.LonLat(this.maxExtent.left,this.maxExtent.bottom);}},CLASS_NAME:"OpenLayers.Layer.XYZ"});OpenLayers.Layer.OSM=OpenLayers.Class(OpenLayers.Layer.XYZ,{name:"OpenStreetMap",attribution:"Data CC-By-SA by <a href='http://openstreetmap.org/'>OpenStreetMap</a>",sphericalMercator:true,url:'http://tile.openstreetmap.org/${z}/${x}/${y}.png',clone:function(obj){if(obj==null){obj=new OpenLayers.Layer.OSM(this.name,this.url,this.getOptions());}
+obj=OpenLayers.Layer.XYZ.prototype.clone.apply(this,[obj]);return obj;},wrapDateLine:true,CLASS_NAME:"OpenLayers.Layer.OSM"});OpenLayers.Renderer.SVG=OpenLayers.Class(OpenLayers.Renderer.Elements,{xmlns:"http://www.w3.org/2000/svg",xlinkns:"http://www.w3.org/1999/xlink",MAX_PIXEL:15000,translationParameters:null,symbolMetrics:null,initialize:function(containerID){if(!this.supported()){return;}
+OpenLayers.Renderer.Elements.prototype.initialize.apply(this,arguments);this.translationParameters={x:0,y:0};this.symbolMetrics={};},supported:function(){var svgFeature="http://www.w3.org/TR/SVG11/feature#";return(document.implementation&&(document.implementation.hasFeature("org.w3c.svg","1.0")||document.implementation.hasFeature(svgFeature+"SVG","1.1")||document.implementation.hasFeature(svgFeature+"BasicStructure","1.1")));},inValidRange:function(x,y,xyOnly){var left=x+(xyOnly?0:this.translationParameters.x);var top=y+(xyOnly?0:this.translationParameters.y);return(left>=-this.MAX_PIXEL&&left<=this.MAX_PIXEL&&top>=-this.MAX_PIXEL&&top<=this.MAX_PIXEL);},setExtent:function(extent,resolutionChanged){OpenLayers.Renderer.Elements.prototype.setExtent.apply(this,arguments);var resolution=this.getResolution();var left=-extent.left/resolution;var top=extent.top/resolution;if(resolutionChanged){this.left=left;this.top=top;var extentString="0 0 "+this.size.w+" "+this.size.h;this.rendererRoot.setAttributeNS(null,"viewBox",extentString);this.translate(0,0);return true;}else{var inRange=this.translate(left-this.left,top-this.top);if(!inRange){this.setExtent(extent,true);}
+return inRange;}},translate:function(x,y){if(!this.inValidRange(x,y,true)){return false;}else{var transformString="";if(x||y){transformString="translate("+x+","+y+")";}
+this.root.setAttributeNS(null,"transform",transformString);this.translationParameters={x:x,y:y};return true;}},setSize:function(size){OpenLayers.Renderer.prototype.setSize.apply(this,arguments);this.rendererRoot.setAttributeNS(null,"width",this.size.w);this.rendererRoot.setAttributeNS(null,"height",this.size.h);},getNodeType:function(geometry,style){var nodeType=null;switch(geometry.CLASS_NAME){case"OpenLayers.Geometry.Point":if(style.externalGraphic){nodeType="image";}else if(this.isComplexSymbol(style.graphicName)){nodeType="svg";}else{nodeType="circle";}
+break;case"OpenLayers.Geometry.Rectangle":nodeType="rect";break;case"OpenLayers.Geometry.LineString":nodeType="polyline";break;case"OpenLayers.Geometry.LinearRing":nodeType="polygon";break;case"OpenLayers.Geometry.Polygon":case"OpenLayers.Geometry.Curve":case"OpenLayers.Geometry.Surface":nodeType="path";break;default:break;}
+return nodeType;},setStyle:function(node,style,options){style=style||node._style;options=options||node._options;var r=parseFloat(node.getAttributeNS(null,"r"));var widthFactor=1;var pos;if(node._geometryClass=="OpenLayers.Geometry.Point"&&r){node.style.visibility="";if(style.graphic===false){node.style.visibility="hidden";}else if(style.externalGraphic){pos=this.getPosition(node);if(style.graphicTitle){node.setAttributeNS(null,"title",style.graphicTitle);var label=this.nodeFactory(null,"title");label.textContent=style.graphicTitle;node.appendChild(label);}
+if(style.graphicWidth&&style.graphicHeight){node.setAttributeNS(null,"preserveAspectRatio","none");}
+var width=style.graphicWidth||style.graphicHeight;var height=style.graphicHeight||style.graphicWidth;width=width?width:style.pointRadius*2;height=height?height:style.pointRadius*2;var xOffset=(style.graphicXOffset!=undefined)?style.graphicXOffset:-(0.5*width);var yOffset=(style.graphicYOffset!=undefined)?style.graphicYOffset:-(0.5*height);var opacity=style.graphicOpacity||style.fillOpacity;node.setAttributeNS(null,"x",(pos.x+xOffset).toFixed());node.setAttributeNS(null,"y",(pos.y+yOffset).toFixed());node.setAttributeNS(null,"width",width);node.setAttributeNS(null,"height",height);node.setAttributeNS(this.xlinkns,"href",style.externalGraphic);node.setAttributeNS(null,"style","opacity: "+opacity);node.onclick=OpenLayers.Renderer.SVG.preventDefault;}else if(this.isComplexSymbol(style.graphicName)){var offset=style.pointRadius*3;var size=offset*2;var src=this.importSymbol(style.graphicName);pos=this.getPosition(node);widthFactor=this.symbolMetrics[src.id][0]*3/size;var parent=node.parentNode;var nextSibling=node.nextSibling;if(parent){parent.removeChild(node);}
+node.firstChild&&node.removeChild(node.firstChild);node.appendChild(src.firstChild.cloneNode(true));node.setAttributeNS(null,"viewBox",src.getAttributeNS(null,"viewBox"));node.setAttributeNS(null,"width",size);node.setAttributeNS(null,"height",size);node.setAttributeNS(null,"x",pos.x-offset);node.setAttributeNS(null,"y",pos.y-offset);if(nextSibling){parent.insertBefore(node,nextSibling);}else if(parent){parent.appendChild(node);}}else{node.setAttributeNS(null,"r",style.pointRadius);}
+var rotation=style.rotation;if((rotation!==undefined||node._rotation!==undefined)&&pos){node._rotation=rotation;rotation|=0;if(node.nodeName!=="svg"){node.setAttributeNS(null,"transform","rotate("+rotation+" "+pos.x+" "+
+pos.y+")");}else{var metrics=this.symbolMetrics[src.id];node.firstChild.setAttributeNS(null,"transform","rotate("
++rotation+" "
++metrics[1]+" "
++metrics[2]+")");}}}
+if(options.isFilled){node.setAttributeNS(null,"fill",style.fillColor);node.setAttributeNS(null,"fill-opacity",style.fillOpacity);}else{node.setAttributeNS(null,"fill","none");}
+if(options.isStroked){node.setAttributeNS(null,"stroke",style.strokeColor);node.setAttributeNS(null,"stroke-opacity",style.strokeOpacity);node.setAttributeNS(null,"stroke-width",style.strokeWidth*widthFactor);node.setAttributeNS(null,"stroke-linecap",style.strokeLinecap||"round");node.setAttributeNS(null,"stroke-linejoin","round");style.strokeDashstyle&&node.setAttributeNS(null,"stroke-dasharray",this.dashStyle(style,widthFactor));}else{node.setAttributeNS(null,"stroke","none");}
+if(style.pointerEvents){node.setAttributeNS(null,"pointer-events",style.pointerEvents);}
+if(style.cursor!=null){node.setAttributeNS(null,"cursor",style.cursor);}
+return node;},dashStyle:function(style,widthFactor){var w=style.strokeWidth*widthFactor;var str=style.strokeDashstyle;switch(str){case'solid':return'none';case'dot':return[1,4*w].join();case'dash':return[4*w,4*w].join();case'dashdot':return[4*w,4*w,1,4*w].join();case'longdash':return[8*w,4*w].join();case'longdashdot':return[8*w,4*w,1,4*w].join();default:return OpenLayers.String.trim(str).replace(/\s+/g,",");}},createNode:function(type,id){var node=document.createElementNS(this.xmlns,type);if(id){node.setAttributeNS(null,"id",id);}
+return node;},nodeTypeCompare:function(node,type){return(type==node.nodeName);},createRenderRoot:function(){return this.nodeFactory(this.container.id+"_svgRoot","svg");},createRoot:function(suffix){return this.nodeFactory(this.container.id+suffix,"g");},createDefs:function(){var defs=this.nodeFactory(this.container.id+"_defs","defs");this.rendererRoot.appendChild(defs);return defs;},drawPoint:function(node,geometry){return this.drawCircle(node,geometry,1);},drawCircle:function(node,geometry,radius){var resolution=this.getResolution();var x=(geometry.x/resolution+this.left);var y=(this.top-geometry.y/resolution);if(this.inValidRange(x,y)){node.setAttributeNS(null,"cx",x);node.setAttributeNS(null,"cy",y);node.setAttributeNS(null,"r",radius);return node;}else{return false;}},drawLineString:function(node,geometry){var componentsResult=this.getComponentsString(geometry.components);if(componentsResult.path){node.setAttributeNS(null,"points",componentsResult.path);return(componentsResult.complete?node:null);}else{return false;}},drawLinearRing:function(node,geometry){var componentsResult=this.getComponentsString(geometry.components);if(componentsResult.path){node.setAttributeNS(null,"points",componentsResult.path);return(componentsResult.complete?node:null);}else{return false;}},drawPolygon:function(node,geometry){var d="";var draw=true;var complete=true;var linearRingResult,path;for(var j=0,len=geometry.components.length;j<len;j++){d+=" M";linearRingResult=this.getComponentsString(geometry.components[j].components," ");path=linearRingResult.path;if(path){d+=" "+path;complete=linearRingResult.complete&&complete;}else{draw=false;}}
+d+=" z";if(draw){node.setAttributeNS(null,"d",d);node.setAttributeNS(null,"fill-rule","evenodd");return complete?node:null;}else{return false;}},drawRectangle:function(node,geometry){var resolution=this.getResolution();var x=(geometry.x/resolution+this.left);var y=(this.top-geometry.y/resolution);if(this.inValidRange(x,y)){node.setAttributeNS(null,"x",x);node.setAttributeNS(null,"y",y);node.setAttributeNS(null,"width",geometry.width/resolution);node.setAttributeNS(null,"height",geometry.height/resolution);return node;}else{return false;}},drawSurface:function(node,geometry){var d=null;var draw=true;for(var i=0,len=geometry.components.length;i<len;i++){if((i%3)==0&&(i/3)==0){var component=this.getShortString(geometry.components[i]);if(!component){draw=false;}
+d="M "+component;}else if((i%3)==1){var component=this.getShortString(geometry.components[i]);if(!component){draw=false;}
+d+=" C "+component;}else{var component=this.getShortString(geometry.components[i]);if(!component){draw=false;}
+d+=" "+component;}}
+d+=" Z";if(draw){node.setAttributeNS(null,"d",d);return node;}else{return false;}},drawText:function(featureId,style,location){var resolution=this.getResolution();var x=(location.x/resolution+this.left);var y=(location.y/resolution-this.top);var label=this.nodeFactory(featureId+this.LABEL_ID_SUFFIX,"text");label.setAttributeNS(null,"x",x);label.setAttributeNS(null,"y",-y);if(style.fontColor){label.setAttributeNS(null,"fill",style.fontColor);}
+if(style.fontOpacity){label.setAttributeNS(null,"opacity",style.fontOpacity);}
+if(style.fontFamily){label.setAttributeNS(null,"font-family",style.fontFamily);}
+if(style.fontSize){label.setAttributeNS(null,"font-size",style.fontSize);}
+if(style.fontWeight){label.setAttributeNS(null,"font-weight",style.fontWeight);}
+if(style.fontStyle){label.setAttributeNS(null,"font-style",style.fontStyle);}
+if(style.labelSelect===true){label.setAttributeNS(null,"pointer-events","visible");label._featureId=featureId;}else{label.setAttributeNS(null,"pointer-events","none");}
+var align=style.labelAlign||"cm";label.setAttributeNS(null,"text-anchor",OpenLayers.Renderer.SVG.LABEL_ALIGN[align[0]]||"middle");if(OpenLayers.IS_GECKO===true){label.setAttributeNS(null,"dominant-baseline",OpenLayers.Renderer.SVG.LABEL_ALIGN[align[1]]||"central");}
+var labelRows=style.label.split('\n');var numRows=labelRows.length;while(label.childNodes.length>numRows){label.removeChild(label.lastChild);}
+for(var i=0;i<numRows;i++){var tspan=this.nodeFactory(featureId+this.LABEL_ID_SUFFIX+"_tspan_"+i,"tspan");if(style.labelSelect===true){tspan._featureId=featureId;tspan._geometry=location;tspan._geometryClass=location.CLASS_NAME;}
+if(OpenLayers.IS_GECKO===false){tspan.setAttributeNS(null,"baseline-shift",OpenLayers.Renderer.SVG.LABEL_VSHIFT[align[1]]||"-35%");}
+tspan.setAttribute("x",x);if(i==0){var vfactor=OpenLayers.Renderer.SVG.LABEL_VFACTOR[align[1]];if(vfactor==null){vfactor=-.5;}
+tspan.setAttribute("dy",(vfactor*(numRows-1))+"em");}else{tspan.setAttribute("dy","1em");}
+tspan.textContent=(labelRows[i]==='')?' ':labelRows[i];if(!tspan.parentNode){label.appendChild(tspan);}}
+if(!label.parentNode){this.textRoot.appendChild(label);}},getComponentsString:function(components,separator){var renderCmp=[];var complete=true;var len=components.length;var strings=[];var str,component;for(var i=0;i<len;i++){component=components[i];renderCmp.push(component);str=this.getShortString(component);if(str){strings.push(str);}else{if(i>0){if(this.getShortString(components[i-1])){strings.push(this.clipLine(components[i],components[i-1]));}}
+if(i<len-1){if(this.getShortString(components[i+1])){strings.push(this.clipLine(components[i],components[i+1]));}}
+complete=false;}}
+return{path:strings.join(separator||","),complete:complete};},clipLine:function(badComponent,goodComponent){if(goodComponent.equals(badComponent)){return"";}
+var resolution=this.getResolution();var maxX=this.MAX_PIXEL-this.translationParameters.x;var maxY=this.MAX_PIXEL-this.translationParameters.y;var x1=goodComponent.x/resolution+this.left;var y1=this.top-goodComponent.y/resolution;var x2=badComponent.x/resolution+this.left;var y2=this.top-badComponent.y/resolution;var k;if(x2<-maxX||x2>maxX){k=(y2-y1)/(x2-x1);x2=x2<0?-maxX:maxX;y2=y1+(x2-x1)*k;}
+if(y2<-maxY||y2>maxY){k=(x2-x1)/(y2-y1);y2=y2<0?-maxY:maxY;x2=x1+(y2-y1)*k;}
+return x2+","+y2;},getShortString:function(point){var resolution=this.getResolution();var x=(point.x/resolution+this.left);var y=(this.top-point.y/resolution);if(this.inValidRange(x,y)){return x+","+y;}else{return false;}},getPosition:function(node){return({x:parseFloat(node.getAttributeNS(null,"cx")),y:parseFloat(node.getAttributeNS(null,"cy"))});},importSymbol:function(graphicName){if(!this.defs){this.defs=this.createDefs();}
+var id=this.container.id+"-"+graphicName;var existing=document.getElementById(id)
+if(existing!=null){return existing;}
+var symbol=OpenLayers.Renderer.symbol[graphicName];if(!symbol){throw new Error(graphicName+' is not a valid symbol name');}
+var symbolNode=this.nodeFactory(id,"symbol");var node=this.nodeFactory(null,"polygon");symbolNode.appendChild(node);var symbolExtent=new OpenLayers.Bounds(Number.MAX_VALUE,Number.MAX_VALUE,0,0);var points=[];var x,y;for(var i=0;i<symbol.length;i=i+2){x=symbol[i];y=symbol[i+1];symbolExtent.left=Math.min(symbolExtent.left,x);symbolExtent.bottom=Math.min(symbolExtent.bottom,y);symbolExtent.right=Math.max(symbolExtent.right,x);symbolExtent.top=Math.max(symbolExtent.top,y);points.push(x,",",y);}
+node.setAttributeNS(null,"points",points.join(" "));var width=symbolExtent.getWidth();var height=symbolExtent.getHeight();var viewBox=[symbolExtent.left-width,symbolExtent.bottom-height,width*3,height*3];symbolNode.setAttributeNS(null,"viewBox",viewBox.join(" "));this.symbolMetrics[id]=[Math.max(width,height),symbolExtent.getCenterLonLat().lon,symbolExtent.getCenterLonLat().lat];this.defs.appendChild(symbolNode);return symbolNode;},getFeatureIdFromEvent:function(evt){var featureId=OpenLayers.Renderer.Elements.prototype.getFeatureIdFromEvent.apply(this,arguments);if(!featureId){var target=evt.target;featureId=target.parentNode&&target!=this.rendererRoot&&target.parentNode._featureId;}
+return featureId;},CLASS_NAME:"OpenLayers.Renderer.SVG"});OpenLayers.Renderer.SVG.LABEL_ALIGN={"l":"start","r":"end","b":"bottom","t":"hanging"};OpenLayers.Renderer.SVG.LABEL_VSHIFT={"t":"-70%","b":"0"};OpenLayers.Renderer.SVG.LABEL_VFACTOR={"t":0,"b":-1};OpenLayers.Renderer.SVG.preventDefault=function(e){e.preventDefault&&e.preventDefault();};OpenLayers.Control.PanZoom=OpenLayers.Class(OpenLayers.Control,{slideFactor:50,slideRatio:null,buttons:null,position:null,initialize:function(options){this.position=new OpenLayers.Pixel(OpenLayers.Control.PanZoom.X,OpenLayers.Control.PanZoom.Y);OpenLayers.Control.prototype.initialize.apply(this,arguments);},destroy:function(){this.removeButtons();this.buttons=null;this.position=null;OpenLayers.Control.prototype.destroy.apply(this,arguments);},draw:function(px){OpenLayers.Control.prototype.draw.apply(this,arguments);px=this.position;this.buttons=[];var sz=new OpenLayers.Size(18,18);var centered=new OpenLayers.Pixel(px.x+sz.w/2,px.y);this._addButton("panup","north-mini.png",centered,sz);px.y=centered.y+sz.h;this._addButton("panleft","west-mini.png",px,sz);this._addButton("panright","east-mini.png",px.add(sz.w,0),sz);this._addButton("pandown","south-mini.png",centered.add(0,sz.h*2),sz);this._addButton("zoomin","zoom-plus-mini.png",centered.add(0,sz.h*3+5),sz);this._addButton("zoomworld","zoom-world-mini.png",centered.add(0,sz.h*4+5),sz);this._addButton("zoomout","zoom-minus-mini.png",centered.add(0,sz.h*5+5),sz);return this.div;},_addButton:function(id,img,xy,sz){var imgLocation=OpenLayers.Util.getImagesLocation()+img;var btn=OpenLayers.Util.createAlphaImageDiv(this.id+"_"+id,xy,sz,imgLocation,"absolute");btn.style.cursor="pointer";this.div.appendChild(btn);OpenLayers.Event.observe(btn,"mousedown",OpenLayers.Function.bindAsEventListener(this.buttonDown,btn));OpenLayers.Event.observe(btn,"dblclick",OpenLayers.Function.bindAsEventListener(this.doubleClick,btn));OpenLayers.Event.observe(btn,"click",OpenLayers.Function.bindAsEventListener(this.doubleClick,btn));btn.action=id;btn.map=this.map;if(!this.slideRatio){var slideFactorPixels=this.slideFactor;var getSlideFactor=function(){return slideFactorPixels;};}else{var slideRatio=this.slideRatio;var getSlideFactor=function(dim){return this.map.getSize()[dim]*slideRatio;};}
+btn.getSlideFactor=getSlideFactor;this.buttons.push(btn);return btn;},_removeButton:function(btn){OpenLayers.Event.stopObservingElement(btn);btn.map=null;btn.getSlideFactor=null;this.div.removeChild(btn);OpenLayers.Util.removeItem(this.buttons,btn);},removeButtons:function(){for(var i=this.buttons.length-1;i>=0;--i){this._removeButton(this.buttons[i]);}},doubleClick:function(evt){OpenLayers.Event.stop(evt);return false;},buttonDown:function(evt){if(!OpenLayers.Event.isLeftClick(evt)){return;}
+switch(this.action){case"panup":this.map.pan(0,-this.getSlideFactor("h"));break;case"pandown":this.map.pan(0,this.getSlideFactor("h"));break;case"panleft":this.map.pan(-this.getSlideFactor("w"),0);break;case"panright":this.map.pan(this.getSlideFactor("w"),0);break;case"zoomin":this.map.zoomIn();break;case"zoomout":this.map.zoomOut();break;case"zoomworld":this.map.zoomToMaxExtent();break;}
+OpenLayers.Event.stop(evt);},CLASS_NAME:"OpenLayers.Control.PanZoom"});OpenLayers.Control.PanZoom.X=4;OpenLayers.Control.PanZoom.Y=4;OpenLayers.Format.WMTSCapabilities=OpenLayers.Class(OpenLayers.Format.XML.VersionedOGC,{defaultVersion:"1.0.0",yx:{"urn:ogc:def:crs:EPSG::4326":true},createLayer:function(capabilities,config){var layer;var required={layer:true,matrixSet:true};for(var prop in required){if(!(prop in config)){throw new Error("Missing property '"+prop+"' in layer configuration.");}}
+var contents=capabilities.contents;var matrixSet=contents.tileMatrixSets[config.matrixSet];var layers=contents.layers;var layerDef;for(var i=0,ii=contents.layers.length;i<ii;++i){if(contents.layers[i].identifier===config.layer){layerDef=contents.layers[i];break;}}
+if(layerDef&&matrixSet){var style;for(var i=0,ii=layerDef.styles.length;i<ii;++i){style=layerDef.styles[i];if(style.isDefault){break;}}
+layer=new OpenLayers.Layer.WMTS(OpenLayers.Util.applyDefaults(config,{url:capabilities.operationsMetadata.GetTile.dcp.http.get,name:layerDef.title,style:style.identifier,matrixIds:matrixSet.matrixIds}));}
+return layer;},CLASS_NAME:"OpenLayers.Format.WMTSCapabilities"});OpenLayers.Layer.SphericalMercator={getExtent:function(){var extent=null;if(this.sphericalMercator){extent=this.map.calculateBounds();}else{extent=OpenLayers.Layer.FixedZoomLevels.prototype.getExtent.apply(this);}
+return extent;},getLonLatFromViewPortPx:function(viewPortPx){return OpenLayers.Layer.prototype.getLonLatFromViewPortPx.apply(this,arguments);},getViewPortPxFromLonLat:function(lonlat){return OpenLayers.Layer.prototype.getViewPortPxFromLonLat.apply(this,arguments);},initMercatorParameters:function(){this.RESOLUTIONS=[];var maxResolution=156543.03390625;for(var zoom=0;zoom<=this.MAX_ZOOM_LEVEL;++zoom){this.RESOLUTIONS[zoom]=maxResolution/Math.pow(2,zoom);}
+this.units="m";this.projection=this.projection||"EPSG:900913";},forwardMercator:function(lon,lat){var x=lon*20037508.34/180;var y=Math.log(Math.tan((90+lat)*Math.PI/360))/(Math.PI/180);y=y*20037508.34/180;return new OpenLayers.LonLat(x,y);},inverseMercator:function(x,y){var lon=(x/20037508.34)*180;var lat=(y/20037508.34)*180;lat=180/Math.PI*(2*Math.atan(Math.exp(lat*Math.PI/180))-Math.PI/2);return new OpenLayers.LonLat(lon,lat);},projectForward:function(point){var lonlat=OpenLayers.Layer.SphericalMercator.forwardMercator(point.x,point.y);point.x=lonlat.lon;point.y=lonlat.lat;return point;},projectInverse:function(point){var lonlat=OpenLayers.Layer.SphericalMercator.inverseMercator(point.x,point.y);point.x=lonlat.lon;point.y=lonlat.lat;return point;}};(function(){var codes=["EPSG:900913","EPSG:3857","EPSG:102113","EPSG:102100"];var add=OpenLayers.Projection.addTransform;var merc=OpenLayers.Layer.SphericalMercator;var same=OpenLayers.Projection.nullTransform;var i,len,code,other,j;for(i=0,len=codes.length;i<len;++i){code=codes[i];add("EPSG:4326",code,merc.projectForward);add(code,"EPSG:4326",merc.projectInverse);for(j=i+1;j<len;++j){other=codes[j];add(code,other,same);add(other,code,same);}}})();OpenLayers.Format.WMTSCapabilities.v1_0_0=OpenLayers.Class(OpenLayers.Format.OWSCommon.v1_1_0,{version:"1.0.0",namespaces:{ows:"http://www.opengis.net/ows/1.1",wmts:"http://www.opengis.net/wmts/1.0",xlink:"http://www.w3.org/1999/xlink"},yx:null,defaultPrefix:"wmts",initialize:function(options){OpenLayers.Format.XML.prototype.initialize.apply(this,[options]);this.options=options;var yx=OpenLayers.Util.extend({},OpenLayers.Format.WMTSCapabilities.prototype.yx);this.yx=OpenLayers.Util.extend(yx,this.yx);},read:function(data){if(typeof data=="string"){data=OpenLayers.Format.XML.prototype.read.apply(this,[data]);}
+if(data&&data.nodeType==9){data=data.documentElement;}
+var capabilities={};this.readNode(data,capabilities);capabilities.version=this.version;return capabilities;},readers:{"wmts":{"Capabilities":function(node,obj){this.readChildNodes(node,obj);},"Contents":function(node,obj){obj.contents={};obj.contents.layers=[];obj.contents.tileMatrixSets={};this.readChildNodes(node,obj.contents);},"Layer":function(node,obj){var layer={styles:[],formats:[],tileMatrixSetLinks:[]};layer.layers=[];this.readChildNodes(node,layer);obj.layers.push(layer);},"Style":function(node,obj){var style={};style.isDefault=(node.getAttribute("isDefault")==="true");this.readChildNodes(node,style);obj.styles.push(style);},"Format":function(node,obj){obj.formats.push(this.getChildValue(node));},"TileMatrixSetLink":function(node,obj){var tileMatrixSetLink={};this.readChildNodes(node,tileMatrixSetLink);obj.tileMatrixSetLinks.push(tileMatrixSetLink);},"TileMatrixSet":function(node,obj){if(obj.layers){var tileMatrixSet={matrixIds:[]};this.readChildNodes(node,tileMatrixSet);obj.tileMatrixSets[tileMatrixSet.identifier]=tileMatrixSet;}else{obj.tileMatrixSet=this.getChildValue(node);}},"TileMatrix":function(node,obj){var tileMatrix={supportedCRS:obj.supportedCRS};this.readChildNodes(node,tileMatrix);obj.matrixIds.push(tileMatrix);},"ScaleDenominator":function(node,obj){obj.scaleDenominator=parseFloat(this.getChildValue(node));},"TopLeftCorner":function(node,obj){var topLeftCorner=this.getChildValue(node);var coords=topLeftCorner.split(" ");var yx;if(obj.supportedCRS){var crs=obj.supportedCRS.replace(/urn:ogc:def:crs:(\w+):.+:(\w+)$/,"urn:ogc:def:crs:$1::$2");yx=!!this.yx[crs];}
+if(yx){obj.topLeftCorner=new OpenLayers.LonLat(coords[1],coords[0]);}else{obj.topLeftCorner=new OpenLayers.LonLat(coords[0],coords[1]);}},"TileWidth":function(node,obj){obj.tileWidth=parseInt(this.getChildValue(node));},"TileHeight":function(node,obj){obj.tileHeight=parseInt(this.getChildValue(node));},"MatrixWidth":function(node,obj){obj.matrixWidth=parseInt(this.getChildValue(node));},"MatrixHeight":function(node,obj){obj.matrixHeight=parseInt(this.getChildValue(node));},"ResourceURL":function(node,obj){obj.resourceUrl=obj.resourceUrl||{};obj.resourceUrl[node.getAttribute("resourceType")]={format:node.getAttribute("format"),template:node.getAttribute("template")};},"WSDL":function(node,obj){obj.wsdl={};obj.wsdl.href=node.getAttribute("xlink:href");},"ServiceMetadataURL":function(node,obj){obj.serviceMetadataUrl={};obj.serviceMetadataUrl.href=node.getAttribute("xlink:href");}},"ows":OpenLayers.Format.OWSCommon.v1_1_0.prototype.readers["ows"]},CLASS_NAME:"OpenLayers.Format.WMTSCapabilities.v1_0_0"});OpenLayers.Popup.FramedCloud=OpenLayers.Class(OpenLayers.Popup.Framed,{contentDisplayClass:"olFramedCloudPopupContent",autoSize:true,panMapIfOutOfView:true,imageSize:new OpenLayers.Size(1276,736),isAlphaImage:false,fixedRelativePosition:false,positionBlocks:{"tl":{'offset':new OpenLayers.Pixel(44,0),'padding':new OpenLayers.Bounds(8,40,8,9),'blocks':[{size:new OpenLayers.Size('auto','auto'),anchor:new OpenLayers.Bounds(0,51,22,0),position:new OpenLayers.Pixel(0,0)},{size:new OpenLayers.Size(22,'auto'),anchor:new OpenLayers.Bounds(null,50,0,0),position:new OpenLayers.Pixel(-1238,0)},{size:new OpenLayers.Size('auto',19),anchor:new OpenLayers.Bounds(0,32,22,null),position:new OpenLayers.Pixel(0,-631)},{size:new OpenLayers.Size(22,18),anchor:new OpenLayers.Bounds(null,32,0,null),position:new OpenLayers.Pixel(-1238,-632)},{size:new OpenLayers.Size(81,35),anchor:new OpenLayers.Bounds(null,0,0,null),position:new OpenLayers.Pixel(0,-688)}]},"tr":{'offset':new OpenLayers.Pixel(-45,0),'padding':new OpenLayers.Bounds(8,40,8,9),'blocks':[{size:new OpenLayers.Size('auto','auto'),anchor:new OpenLayers.Bounds(0,51,22,0),position:new OpenLayers.Pixel(0,0)},{size:new OpenLayers.Size(22,'auto'),anchor:new OpenLayers.Bounds(null,50,0,0),position:new OpenLayers.Pixel(-1238,0)},{size:new OpenLayers.Size('auto',19),anchor:new OpenLayers.Bounds(0,32,22,null),position:new OpenLayers.Pixel(0,-631)},{size:new OpenLayers.Size(22,19),anchor:new OpenLayers.Bounds(null,32,0,null),position:new OpenLayers.Pixel(-1238,-631)},{size:new OpenLayers.Size(81,35),anchor:new OpenLayers.Bounds(0,0,null,null),position:new OpenLayers.Pixel(-215,-687)}]},"bl":{'offset':new OpenLayers.Pixel(45,0),'padding':new OpenLayers.Bounds(8,9,8,40),'blocks':[{size:new OpenLayers.Size('auto','auto'),anchor:new OpenLayers.Bounds(0,21,22,32),position:new OpenLayers.Pixel(0,0)},{size:new OpenLayers.Size(22,'auto'),anchor:new OpenLayers.Bounds(null,21,0,32),position:new OpenLayers.Pixel(-1238,0)},{size:new OpenLayers.Size('auto',21),anchor:new OpenLayers.Bounds(0,0,22,null),position:new OpenLayers.Pixel(0,-629)},{size:new OpenLayers.Size(22,21),anchor:new OpenLayers.Bounds(null,0,0,null),position:new OpenLayers.Pixel(-1238,-629)},{size:new OpenLayers.Size(81,33),anchor:new OpenLayers.Bounds(null,null,0,0),position:new OpenLayers.Pixel(-101,-674)}]},"br":{'offset':new OpenLayers.Pixel(-44,0),'padding':new OpenLayers.Bounds(8,9,8,40),'blocks':[{size:new OpenLayers.Size('auto','auto'),anchor:new OpenLayers.Bounds(0,21,22,32),position:new OpenLayers.Pixel(0,0)},{size:new OpenLayers.Size(22,'auto'),anchor:new OpenLayers.Bounds(null,21,0,32),position:new OpenLayers.Pixel(-1238,0)},{size:new OpenLayers.Size('auto',21),anchor:new OpenLayers.Bounds(0,0,22,null),position:new OpenLayers.Pixel(0,-629)},{size:new OpenLayers.Size(22,21),anchor:new OpenLayers.Bounds(null,0,0,null),position:new OpenLayers.Pixel(-1238,-629)},{size:new OpenLayers.Size(81,33),anchor:new OpenLayers.Bounds(0,null,null,0),position:new OpenLayers.Pixel(-311,-674)}]}},minSize:new OpenLayers.Size(105,10),maxSize:new OpenLayers.Size(1200,660),initialize:function(id,lonlat,contentSize,contentHTML,anchor,closeBox,closeBoxCallback){this.imageSrc=OpenLayers.Util.getImagesLocation()+'cloud-popup-relative.png';OpenLayers.Popup.Framed.prototype.initialize.apply(this,arguments);this.contentDiv.className=this.contentDisplayClass;},destroy:function(){OpenLayers.Popup.Framed.prototype.destroy.apply(this,arguments);},CLASS_NAME:"OpenLayers.Popup.FramedCloud"});OpenLayers.Symbolizer.Point=OpenLayers.Class(OpenLayers.Symbolizer,{initialize:function(config){OpenLayers.Symbolizer.prototype.initialize.apply(this,arguments);},CLASS_NAME:"OpenLayers.Symbolizer.Point"});OpenLayers.Symbolizer.Line=OpenLayers.Class(OpenLayers.Symbolizer,{initialize:function(config){OpenLayers.Symbolizer.prototype.initialize.apply(this,arguments);},CLASS_NAME:"OpenLayers.Symbolizer.Line"});OpenLayers.Symbolizer.Polygon=OpenLayers.Class(OpenLayers.Symbolizer,{initialize:function(config){OpenLayers.Symbolizer.prototype.initialize.apply(this,arguments);},CLASS_NAME:"OpenLayers.Symbolizer.Polygon"});OpenLayers.Symbolizer.Text=OpenLayers.Class(OpenLayers.Symbolizer,{initialize:function(config){OpenLayers.Symbolizer.prototype.initialize.apply(this,arguments);},CLASS_NAME:"OpenLayers.Symbolizer.Text"});OpenLayers.Rule=OpenLayers.Class({id:null,name:null,title:null,description:null,context:null,filter:null,elseFilter:false,symbolizer:null,symbolizers:null,minScaleDenominator:null,maxScaleDenominator:null,initialize:function(options){this.symbolizer={};OpenLayers.Util.extend(this,options);if(this.symbolizers){delete this.symbolizer;}
+this.id=OpenLayers.Util.createUniqueID(this.CLASS_NAME+"_");},destroy:function(){for(var i in this.symbolizer){this.symbolizer[i]=null;}
+this.symbolizer=null;delete this.symbolizers;},evaluate:function(feature){var context=this.getContext(feature);var applies=true;if(this.minScaleDenominator||this.maxScaleDenominator){var scale=feature.layer.map.getScale();}
+if(this.minScaleDenominator){applies=scale>=OpenLayers.Style.createLiteral(this.minScaleDenominator,context);}
+if(applies&&this.maxScaleDenominator){applies=scale<OpenLayers.Style.createLiteral(this.maxScaleDenominator,context);}
+if(applies&&this.filter){if(this.filter.CLASS_NAME=="OpenLayers.Filter.FeatureId"){applies=this.filter.evaluate(feature);}else{applies=this.filter.evaluate(context);}}
+return applies;},getContext:function(feature){var context=this.context;if(!context){context=feature.attributes||feature.data;}
+if(typeof this.context=="function"){context=this.context(feature);}
+return context;},clone:function(){var options=OpenLayers.Util.extend({},this);if(this.symbolizers){var len=this.symbolizers.length;options.symbolizers=new Array(len);for(var i=0;i<len;++i){options.symbolizers[i]=this.symbolizers[i].clone();}}else{options.symbolizer={};var value,type;for(var key in this.symbolizer){value=this.symbolizer[key];type=typeof value;if(type==="object"){options.symbolizer[key]=OpenLayers.Util.extend({},value);}else if(type==="string"){options.symbolizer[key]=value;}}}
+options.filter=this.filter&&this.filter.clone();options.context=this.context&&OpenLayers.Util.extend({},this.context);return new OpenLayers.Rule(options);},CLASS_NAME:"OpenLayers.Rule"});OpenLayers.Handler.Pinch=OpenLayers.Class(OpenLayers.Handler,{started:false,stopDown:false,pinching:false,last:null,start:null,initialize:function(control,callbacks,options){OpenLayers.Handler.prototype.initialize.apply(this,arguments);},touchstart:function(evt){var propagate=true;this.pinching=false;if(OpenLayers.Event.isMultiTouch(evt)){this.started=true;this.last=this.start={distance:this.getDistance(evt.touches),delta:0,scale:1};this.callback("start",[evt,this.start]);propagate=!this.stopDown;}else{this.started=false;this.start=null;this.last=null;}
+OpenLayers.Event.stop(evt);return propagate;},touchmove:function(evt){if(this.started&&OpenLayers.Event.isMultiTouch(evt)){this.pinching=true;var current=this.getPinchData(evt);this.callback("move",[evt,current]);this.last=current;OpenLayers.Event.stop(evt);}
+return true;},touchend:function(evt){if(this.started){this.started=false;this.pinching=false;this.callback("done",[evt,this.start,this.last]);this.start=null;this.last=null;}
+return true;},activate:function(){var activated=false;if(OpenLayers.Handler.prototype.activate.apply(this,arguments)){this.pinching=false;activated=true;}
+return activated;},deactivate:function(){var deactivated=false;if(OpenLayers.Handler.prototype.deactivate.apply(this,arguments)){this.started=false;this.pinching=false;this.start=null;this.last=null;deactivated=true;}
+return deactivated;},getDistance:function(touches){var t0=touches[0];var t1=touches[1];return Math.sqrt(Math.pow(t0.clientX-t1.clientX,2)+
+Math.pow(t0.clientY-t1.clientY,2));},getPinchData:function(evt){var distance=this.getDistance(evt.touches);var scale=distance/this.start.distance;return{distance:distance,delta:this.last.distance-distance,scale:scale};},CLASS_NAME:"OpenLayers.Handler.Pinch"});OpenLayers.Filter.Comparison=OpenLayers.Class(OpenLayers.Filter,{type:null,property:null,value:null,matchCase:true,lowerBoundary:null,upperBoundary:null,initialize:function(options){OpenLayers.Filter.prototype.initialize.apply(this,[options]);if(this.type===OpenLayers.Filter.Comparison.LIKE&&options.matchCase===undefined){this.matchCase=null;}},evaluate:function(context){if(context instanceof OpenLayers.Feature.Vector){context=context.attributes;}
+var result=false;var got=context[this.property];var exp;switch(this.type){case OpenLayers.Filter.Comparison.EQUAL_TO:exp=this.value;if(!this.matchCase&&typeof got=="string"&&typeof exp=="string"){result=(got.toUpperCase()==exp.toUpperCase());}else{result=(got==exp);}
+break;case OpenLayers.Filter.Comparison.NOT_EQUAL_TO:exp=this.value;if(!this.matchCase&&typeof got=="string"&&typeof exp=="string"){result=(got.toUpperCase()!=exp.toUpperCase());}else{result=(got!=exp);}
+break;case OpenLayers.Filter.Comparison.LESS_THAN:result=got<this.value;break;case OpenLayers.Filter.Comparison.GREATER_THAN:result=got>this.value;break;case OpenLayers.Filter.Comparison.LESS_THAN_OR_EQUAL_TO:result=got<=this.value;break;case OpenLayers.Filter.Comparison.GREATER_THAN_OR_EQUAL_TO:result=got>=this.value;break;case OpenLayers.Filter.Comparison.BETWEEN:result=(got>=this.lowerBoundary)&&(got<=this.upperBoundary);break;case OpenLayers.Filter.Comparison.LIKE:var regexp=new RegExp(this.value,"gi");result=regexp.test(got);break;}
+return result;},value2regex:function(wildCard,singleChar,escapeChar){if(wildCard=="."){var msg="'.' is an unsupported wildCard character for "+"OpenLayers.Filter.Comparison";OpenLayers.Console.error(msg);return null;}
+wildCard=wildCard?wildCard:"*";singleChar=singleChar?singleChar:".";escapeChar=escapeChar?escapeChar:"!";this.value=this.value.replace(new RegExp("\\"+escapeChar+"(.|$)","g"),"\\$1");this.value=this.value.replace(new RegExp("\\"+singleChar,"g"),".");this.value=this.value.replace(new RegExp("\\"+wildCard,"g"),".*");this.value=this.value.replace(new RegExp("\\\\.\\*","g"),"\\"+wildCard);this.value=this.value.replace(new RegExp("\\\\\\.","g"),"\\"+singleChar);return this.value;},regex2value:function(){var value=this.value;value=value.replace(/!/g,"!!");value=value.replace(/(\\)?\\\./g,function($0,$1){return $1?$0:"!.";});value=value.replace(/(\\)?\\\*/g,function($0,$1){return $1?$0:"!*";});value=value.replace(/\\\\/g,"\\");value=value.replace(/\.\*/g,"*");return value;},clone:function(){return OpenLayers.Util.extend(new OpenLayers.Filter.Comparison(),this);},CLASS_NAME:"OpenLayers.Filter.Comparison"});OpenLayers.Filter.Comparison.EQUAL_TO="==";OpenLayers.Filter.Comparison.NOT_EQUAL_TO="!=";OpenLayers.Filter.Comparison.LESS_THAN="<";OpenLayers.Filter.Comparison.GREATER_THAN=">";OpenLayers.Filter.Comparison.LESS_THAN_OR_EQUAL_TO="<=";OpenLayers.Filter.Comparison.GREATER_THAN_OR_EQUAL_TO=">=";OpenLayers.Filter.Comparison.BETWEEN="..";OpenLayers.Filter.Comparison.LIKE="~";OpenLayers.Format.QueryStringFilter=(function(){var cmpToStr={};cmpToStr[OpenLayers.Filter.Comparison.EQUAL_TO]="eq";cmpToStr[OpenLayers.Filter.Comparison.NOT_EQUAL_TO]="ne";cmpToStr[OpenLayers.Filter.Comparison.LESS_THAN]="lt";cmpToStr[OpenLayers.Filter.Comparison.LESS_THAN_OR_EQUAL_TO]="lte";cmpToStr[OpenLayers.Filter.Comparison.GREATER_THAN]="gt";cmpToStr[OpenLayers.Filter.Comparison.GREATER_THAN_OR_EQUAL_TO]="gte";cmpToStr[OpenLayers.Filter.Comparison.LIKE]="ilike";function regex2value(value){value=value.replace(/%/g,"\\%");value=value.replace(/\\\\\.(\*)?/g,function($0,$1){return $1?$0:"\\\\_";});value=value.replace(/\\\\\.\*/g,"\\\\%");value=value.replace(/(\\)?\.(\*)?/g,function($0,$1,$2){return $1||$2?$0:"_";});value=value.replace(/(\\)?\.\*/g,function($0,$1){return $1?$0:"%";});value=value.replace(/\\\./g,".");value=value.replace(/(\\)?\\\*/g,function($0,$1){return $1?$0:"*";});return value;}
+return OpenLayers.Class(OpenLayers.Format,{wildcarded:false,srsInBBOX:false,write:function(filter,params){params=params||{};var className=filter.CLASS_NAME;var filterType=className.substring(className.lastIndexOf(".")+1);switch(filterType){case"Spatial":switch(filter.type){case OpenLayers.Filter.Spatial.BBOX:params.bbox=filter.value.toArray();if(this.srsInBBOX&&filter.projection){params.bbox.push(filter.projection.getCode());}
+break;case OpenLayers.Filter.Spatial.DWITHIN:params.tolerance=filter.distance;case OpenLayers.Filter.Spatial.WITHIN:params.lon=filter.value.x;params.lat=filter.value.y;break;default:OpenLayers.Console.warn("Unknown spatial filter type "+filter.type);}
+break;case"Comparison":var op=cmpToStr[filter.type];if(op!==undefined){var value=filter.value;if(filter.type==OpenLayers.Filter.Comparison.LIKE){value=regex2value(value);if(this.wildcarded){value="%"+value+"%";}}
+params[filter.property+"__"+op]=value;params.queryable=params.queryable||[];params.queryable.push(filter.property);}else{OpenLayers.Console.warn("Unknown comparison filter type "+filter.type);}
+break;case"Logical":if(filter.type===OpenLayers.Filter.Logical.AND){for(var i=0,len=filter.filters.length;i<len;i++){params=this.write(filter.filters[i],params);}}else{OpenLayers.Console.warn("Unsupported logical filter type "+filter.type);}
+break;default:OpenLayers.Console.warn("Unknown filter type "+filterType);}
+return params;},CLASS_NAME:"OpenLayers.Format.QueryStringFilter"});})();OpenLayers.Layer.WMTS=OpenLayers.Class(OpenLayers.Layer.Grid,{isBaseLayer:true,version:"1.0.0",requestEncoding:"KVP",url:null,layer:null,matrixSet:null,style:null,format:"image/jpeg",tileOrigin:null,tileFullExtent:null,formatSuffix:null,matrixIds:null,dimensions:null,params:null,zoomOffset:0,formatSuffixMap:{"image/png":"png","image/png8":"png","image/png24":"png","image/png32":"png","png":"png","image/jpeg":"jpg","image/jpg":"jpg","jpeg":"jpg","jpg":"jpg"},matrix:null,initialize:function(config){var required={url:true,layer:true,style:true,matrixSet:true};for(var prop in required){if(!(prop in config)){throw new Error("Missing property '"+prop+"' in layer configuration.");}}
+config.params=OpenLayers.Util.upperCaseObject(config.params);var args=[config.name,config.url,config.params,config];OpenLayers.Layer.Grid.prototype.initialize.apply(this,args);if(!this.formatSuffix){this.formatSuffix=this.formatSuffixMap[this.format]||this.format.split("/").pop();}
+if(this.matrixIds){var len=this.matrixIds.length;if(len&&typeof this.matrixIds[0]==="string"){var ids=this.matrixIds;this.matrixIds=new Array(len);for(var i=0;i<len;++i){this.matrixIds[i]={identifier:ids[i]};}}}},setMap:function(){OpenLayers.Layer.Grid.prototype.setMap.apply(this,arguments);this.updateMatrixProperties();},updateMatrixProperties:function(){this.matrix=this.getMatrix();if(this.matrix){if(this.matrix.topLeftCorner){this.tileOrigin=this.matrix.topLeftCorner;}
+if(this.matrix.tileWidth&&this.matrix.tileHeight){this.tileSize=new OpenLayers.Size(this.matrix.tileWidth,this.matrix.tileHeight);}
+if(!this.tileOrigin){this.tileOrigin=new OpenLayers.LonLat(this.maxExtent.left,this.maxExtent.top);}
+if(!this.tileFullExtent){this.tileFullExtent=this.maxExtent;}}},moveTo:function(bounds,zoomChanged,dragging){if(zoomChanged||!this.matrix){this.updateMatrixProperties();}
+return OpenLayers.Layer.Grid.prototype.moveTo.apply(this,arguments);},clone:function(obj){if(obj==null){obj=new OpenLayers.Layer.WMTS(this.options);}
+obj=OpenLayers.Layer.Grid.prototype.clone.apply(this,[obj]);return obj;},getMatrix:function(){var matrix;if(!this.matrixIds||this.matrixIds.length===0){matrix={identifier:this.map.getZoom()+this.zoomOffset};}else{if("scaleDenominator"in this.matrixIds[0]){var denom=OpenLayers.METERS_PER_INCH*OpenLayers.INCHES_PER_UNIT[this.units]*this.map.getResolution()/0.28E-3;var diff=Number.POSITIVE_INFINITY;var delta;for(var i=0,ii=this.matrixIds.length;i<ii;++i){delta=Math.abs(1-(this.matrixIds[i].scaleDenominator/denom));if(delta<diff){diff=delta;matrix=this.matrixIds[i];}}}else{matrix=this.matrixIds[this.map.getZoom()+this.zoomOffset];}}
+return matrix;},getTileInfo:function(loc){var res=this.map.getResolution();var fx=(loc.lon-this.tileOrigin.lon)/(res*this.tileSize.w);var fy=(this.tileOrigin.lat-loc.lat)/(res*this.tileSize.h);var col=Math.floor(fx);var row=Math.floor(fy);return{col:col,row:row,i:Math.floor((fx-col)*this.tileSize.w),j:Math.floor((fy-row)*this.tileSize.h)};},getURL:function(bounds){bounds=this.adjustBounds(bounds);var url="";if(!this.tileFullExtent||this.tileFullExtent.intersectsBounds(bounds)){var center=bounds.getCenterLonLat();var info=this.getTileInfo(center);var matrixId=this.matrix.identifier;if(this.requestEncoding.toUpperCase()==="REST"){var path=this.version+"/"+this.layer+"/"+this.style+"/";if(this.dimensions){for(var i=0;i<this.dimensions.length;i++){if(this.params[this.dimensions[i]]){path=path+this.params[this.dimensions[i]]+"/";}}}
+path=path+this.matrixSet+"/"+this.matrix.identifier+"/"+info.row+"/"+info.col+"."+this.formatSuffix;if(OpenLayers.Util.isArray(this.url)){url=this.selectUrl(path,this.url);}else{url=this.url;}
+if(!url.match(/\/$/)){url=url+"/";}
+url=url+path;}else if(this.requestEncoding.toUpperCase()==="KVP"){var params={SERVICE:"WMTS",REQUEST:"GetTile",VERSION:this.version,LAYER:this.layer,STYLE:this.style,TILEMATRIXSET:this.matrixSet,TILEMATRIX:this.matrix.identifier,TILEROW:info.row,TILECOL:info.col,FORMAT:this.format};url=OpenLayers.Layer.Grid.prototype.getFullRequestString.apply(this,[params]);}}
+return url;},mergeNewParams:function(newParams){if(this.requestEncoding.toUpperCase()==="KVP"){return OpenLayers.Layer.Grid.prototype.mergeNewParams.apply(this,[OpenLayers.Util.upperCaseObject(newParams)]);}},CLASS_NAME:"OpenLayers.Layer.WMTS"});OpenLayers.Renderer.VML=OpenLayers.Class(OpenLayers.Renderer.Elements,{xmlns:"urn:schemas-microsoft-com:vml",symbolCache:{},offset:null,initialize:function(containerID){if(!this.supported()){return;}
+if(!document.namespaces.olv){document.namespaces.add("olv",this.xmlns);var style=document.createStyleSheet();var shapes=['shape','rect','oval','fill','stroke','imagedata','group','textbox'];for(var i=0,len=shapes.length;i<len;i++){style.addRule('olv\\:'+shapes[i],"behavior: url(#default#VML); "+"position: absolute; display: inline-block;");}}
+OpenLayers.Renderer.Elements.prototype.initialize.apply(this,arguments);},supported:function(){return!!(document.namespaces);},setExtent:function(extent,resolutionChanged){OpenLayers.Renderer.Elements.prototype.setExtent.apply(this,arguments);var resolution=this.getResolution();var left=(extent.left/resolution)|0;var top=(extent.top/resolution-this.size.h)|0;if(resolutionChanged||!this.offset){this.offset={x:left,y:top};left=0;top=0;}else{left=left-this.offset.x;top=top-this.offset.y;}
+var org=left+" "+top;this.root.coordorigin=org;var roots=[this.root,this.vectorRoot,this.textRoot];var root;for(var i=0,len=roots.length;i<len;++i){root=roots[i];var size=this.size.w+" "+this.size.h;root.coordsize=size;}
+this.root.style.flip="y";return true;},setSize:function(size){OpenLayers.Renderer.prototype.setSize.apply(this,arguments);var roots=[this.rendererRoot,this.root,this.vectorRoot,this.textRoot];var w=this.size.w+"px";var h=this.size.h+"px";var root;for(var i=0,len=roots.length;i<len;++i){root=roots[i];root.style.width=w;root.style.height=h;}},getNodeType:function(geometry,style){var nodeType=null;switch(geometry.CLASS_NAME){case"OpenLayers.Geometry.Point":if(style.externalGraphic){nodeType="olv:rect";}else if(this.isComplexSymbol(style.graphicName)){nodeType="olv:shape";}else{nodeType="olv:oval";}
+break;case"OpenLayers.Geometry.Rectangle":nodeType="olv:rect";break;case"OpenLayers.Geometry.LineString":case"OpenLayers.Geometry.LinearRing":case"OpenLayers.Geometry.Polygon":case"OpenLayers.Geometry.Curve":case"OpenLayers.Geometry.Surface":nodeType="olv:shape";break;default:break;}
+return nodeType;},setStyle:function(node,style,options,geometry){style=style||node._style;options=options||node._options;var fillColor=style.fillColor;if(node._geometryClass==="OpenLayers.Geometry.Point"){if(style.externalGraphic){options.isFilled=true;if(style.graphicTitle){node.title=style.graphicTitle;}
+var width=style.graphicWidth||style.graphicHeight;var height=style.graphicHeight||style.graphicWidth;width=width?width:style.pointRadius*2;height=height?height:style.pointRadius*2;var resolution=this.getResolution();var xOffset=(style.graphicXOffset!=undefined)?style.graphicXOffset:-(0.5*width);var yOffset=(style.graphicYOffset!=undefined)?style.graphicYOffset:-(0.5*height);node.style.left=(((geometry.x/resolution-this.offset.x)+xOffset)|0)+"px";node.style.top=(((geometry.y/resolution-this.offset.y)-(yOffset+height))|0)+"px";node.style.width=width+"px";node.style.height=height+"px";node.style.flip="y";fillColor="none";options.isStroked=false;}else if(this.isComplexSymbol(style.graphicName)){var cache=this.importSymbol(style.graphicName);node.path=cache.path;node.coordorigin=cache.left+","+cache.bottom;var size=cache.size;node.coordsize=size+","+size;this.drawCircle(node,geometry,style.pointRadius);node.style.flip="y";}else{this.drawCircle(node,geometry,style.pointRadius);}}
+if(options.isFilled){node.fillcolor=fillColor;}else{node.filled="false";}
+var fills=node.getElementsByTagName("fill");var fill=(fills.length==0)?null:fills[0];if(!options.isFilled){if(fill){node.removeChild(fill);}}else{if(!fill){fill=this.createNode('olv:fill',node.id+"_fill");}
+fill.opacity=style.fillOpacity;if(node._geometryClass==="OpenLayers.Geometry.Point"&&style.externalGraphic){if(style.graphicOpacity){fill.opacity=style.graphicOpacity;}
+fill.src=style.externalGraphic;fill.type="frame";if(!(style.graphicWidth&&style.graphicHeight)){fill.aspect="atmost";}}
+if(fill.parentNode!=node){node.appendChild(fill);}}
+var rotation=style.rotation;if((rotation!==undefined||node._rotation!==undefined)){node._rotation=rotation;if(style.externalGraphic){this.graphicRotate(node,xOffset,yOffset,style);fill.opacity=0;}else if(node._geometryClass==="OpenLayers.Geometry.Point"){node.style.rotation=rotation||0;}}
+var strokes=node.getElementsByTagName("stroke");var stroke=(strokes.length==0)?null:strokes[0];if(!options.isStroked){node.stroked=false;if(stroke){stroke.on=false;}}else{if(!stroke){stroke=this.createNode('olv:stroke',node.id+"_stroke");node.appendChild(stroke);}
+stroke.on=true;stroke.color=style.strokeColor;stroke.weight=style.strokeWidth+"px";stroke.opacity=style.strokeOpacity;stroke.endcap=style.strokeLinecap=='butt'?'flat':(style.strokeLinecap||'round');if(style.strokeDashstyle){stroke.dashstyle=this.dashStyle(style);}}
+if(style.cursor!="inherit"&&style.cursor!=null){node.style.cursor=style.cursor;}
+return node;},graphicRotate:function(node,xOffset,yOffset,style){var style=style||node._style;var rotation=style.rotation||0;var aspectRatio,size;if(!(style.graphicWidth&&style.graphicHeight)){var img=new Image();img.onreadystatechange=OpenLayers.Function.bind(function(){if(img.readyState=="complete"||img.readyState=="interactive"){aspectRatio=img.width/img.height;size=Math.max(style.pointRadius*2,style.graphicWidth||0,style.graphicHeight||0);xOffset=xOffset*aspectRatio;style.graphicWidth=size*aspectRatio;style.graphicHeight=size;this.graphicRotate(node,xOffset,yOffset,style);}},this);img.src=style.externalGraphic;return;}else{size=Math.max(style.graphicWidth,style.graphicHeight);aspectRatio=style.graphicWidth/style.graphicHeight;}
+var width=Math.round(style.graphicWidth||size*aspectRatio);var height=Math.round(style.graphicHeight||size);node.style.width=width+"px";node.style.height=height+"px";var image=document.getElementById(node.id+"_image");if(!image){image=this.createNode("olv:imagedata",node.id+"_image");node.appendChild(image);}
+image.style.width=width+"px";image.style.height=height+"px";image.src=style.externalGraphic;image.style.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader("+"src='', sizingMethod='scale')";var rot=rotation*Math.PI/180;var sintheta=Math.sin(rot);var costheta=Math.cos(rot);var filter="progid:DXImageTransform.Microsoft.Matrix(M11="+costheta+",M12="+(-sintheta)+",M21="+sintheta+",M22="+costheta+",SizingMethod='auto expand')\n";var opacity=style.graphicOpacity||style.fillOpacity;if(opacity&&opacity!=1){filter+="progid:DXImageTransform.Microsoft.BasicImage(opacity="+
+opacity+")\n";}
+node.style.filter=filter;var centerPoint=new OpenLayers.Geometry.Point(-xOffset,-yOffset);var imgBox=new OpenLayers.Bounds(0,0,width,height).toGeometry();imgBox.rotate(style.rotation,centerPoint);var imgBounds=imgBox.getBounds();node.style.left=Math.round(parseInt(node.style.left)+imgBounds.left)+"px";node.style.top=Math.round(parseInt(node.style.top)-imgBounds.bottom)+"px";},postDraw:function(node){node.style.visibility="visible";var fillColor=node._style.fillColor;var strokeColor=node._style.strokeColor;if(fillColor=="none"&&node.fillcolor!=fillColor){node.fillcolor=fillColor;}
+if(strokeColor=="none"&&node.strokecolor!=strokeColor){node.strokecolor=strokeColor;}},setNodeDimension:function(node,geometry){var bbox=geometry.getBounds();if(bbox){var resolution=this.getResolution();var scaledBox=new OpenLayers.Bounds((bbox.left/resolution-this.offset.x)|0,(bbox.bottom/resolution-this.offset.y)|0,(bbox.right/resolution-this.offset.x)|0,(bbox.top/resolution-this.offset.y)|0);node.style.left=scaledBox.left+"px";node.style.top=scaledBox.top+"px";node.style.width=scaledBox.getWidth()+"px";node.style.height=scaledBox.getHeight()+"px";node.coordorigin=scaledBox.left+" "+scaledBox.top;node.coordsize=scaledBox.getWidth()+" "+scaledBox.getHeight();}},dashStyle:function(style){var dash=style.strokeDashstyle;switch(dash){case'solid':case'dot':case'dash':case'dashdot':case'longdash':case'longdashdot':return dash;default:var parts=dash.split(/[ ,]/);if(parts.length==2){if(1*parts[0]>=2*parts[1]){return"longdash";}
+return(parts[0]==1||parts[1]==1)?"dot":"dash";}else if(parts.length==4){return(1*parts[0]>=2*parts[1])?"longdashdot":"dashdot";}
+return"solid";}},createNode:function(type,id){var node=document.createElement(type);if(id){node.id=id;}
+node.unselectable='on';node.onselectstart=OpenLayers.Function.False;return node;},nodeTypeCompare:function(node,type){var subType=type;var splitIndex=subType.indexOf(":");if(splitIndex!=-1){subType=subType.substr(splitIndex+1);}
+var nodeName=node.nodeName;splitIndex=nodeName.indexOf(":");if(splitIndex!=-1){nodeName=nodeName.substr(splitIndex+1);}
+return(subType==nodeName);},createRenderRoot:function(){return this.nodeFactory(this.container.id+"_vmlRoot","div");},createRoot:function(suffix){return this.nodeFactory(this.container.id+suffix,"olv:group");},drawPoint:function(node,geometry){return this.drawCircle(node,geometry,1);},drawCircle:function(node,geometry,radius){if(!isNaN(geometry.x)&&!isNaN(geometry.y)){var resolution=this.getResolution();node.style.left=(((geometry.x/resolution-this.offset.x)|0)-radius)+"px";node.style.top=(((geometry.y/resolution-this.offset.y)|0)-radius)+"px";var diameter=radius*2;node.style.width=diameter+"px";node.style.height=diameter+"px";return node;}
+return false;},drawLineString:function(node,geometry){return this.drawLine(node,geometry,false);},drawLinearRing:function(node,geometry){return this.drawLine(node,geometry,true);},drawLine:function(node,geometry,closeLine){this.setNodeDimension(node,geometry);var resolution=this.getResolution();var numComponents=geometry.components.length;var parts=new Array(numComponents);var comp,x,y;for(var i=0;i<numComponents;i++){comp=geometry.components[i];x=(comp.x/resolution-this.offset.x)|0;y=(comp.y/resolution-this.offset.y)|0;parts[i]=" "+x+","+y+" l ";}
+var end=(closeLine)?" x e":" e";node.path="m"+parts.join("")+end;return node;},drawPolygon:function(node,geometry){this.setNodeDimension(node,geometry);var resolution=this.getResolution();var path=[];var j,jj,points,area,first,second,i,ii,comp,pathComp,x,y;for(j=0,jj=geometry.components.length;j<jj;j++){path.push("m");points=geometry.components[j].components;area=(j===0);first=null;second=null;for(i=0,ii=points.length;i<ii;i++){comp=points[i];x=(comp.x/resolution-this.offset.x)|0;y=(comp.y/resolution-this.offset.y)|0;pathComp=" "+x+","+y;path.push(pathComp);if(i==0){path.push(" l");}
+if(!area){if(!first){first=pathComp;}else if(first!=pathComp){if(!second){second=pathComp;}else if(second!=pathComp){area=true;}}}}
+path.push(area?" x ":" ");}
+path.push("e");node.path=path.join("");return node;},drawRectangle:function(node,geometry){var resolution=this.getResolution();node.style.left=((geometry.x/resolution-this.offset.x)|0)+"px";node.style.top=((geometry.y/resolution-this.offset.y)|0)+"px";node.style.width=((geometry.width/resolution)|0)+"px";node.style.height=((geometry.height/resolution)|0)+"px";return node;},drawText:function(featureId,style,location){var label=this.nodeFactory(featureId+this.LABEL_ID_SUFFIX,"olv:rect");var textbox=this.nodeFactory(featureId+this.LABEL_ID_SUFFIX+"_textbox","olv:textbox");var resolution=this.getResolution();label.style.left=((location.x/resolution-this.offset.x)|0)+"px";label.style.top=((location.y/resolution-this.offset.y)|0)+"px";label.style.flip="y";textbox.innerText=style.label;if(style.cursor!="inherit"&&style.cursor!=null){textbox.style.cursor=style.cursor;}
+if(style.fontColor){textbox.style.color=style.fontColor;}
+if(style.fontOpacity){textbox.style.filter='alpha(opacity='+(style.fontOpacity*100)+')';}
+if(style.fontFamily){textbox.style.fontFamily=style.fontFamily;}
+if(style.fontSize){textbox.style.fontSize=style.fontSize;}
+if(style.fontWeight){textbox.style.fontWeight=style.fontWeight;}
+if(style.fontStyle){textbox.style.fontStyle=style.fontStyle;}
+if(style.labelSelect===true){label._featureId=featureId;textbox._featureId=featureId;textbox._geometry=location;textbox._geometryClass=location.CLASS_NAME;}
+textbox.style.whiteSpace="nowrap";textbox.inset="1px,0px,0px,0px";if(!label.parentNode){label.appendChild(textbox);this.textRoot.appendChild(label);}
+var align=style.labelAlign||"cm";if(align.length==1){align+="m";}
+var xshift=textbox.clientWidth*(OpenLayers.Renderer.VML.LABEL_SHIFT[align.substr(0,1)]);var yshift=textbox.clientHeight*(OpenLayers.Renderer.VML.LABEL_SHIFT[align.substr(1,1)]);label.style.left=parseInt(label.style.left)-xshift-1+"px";label.style.top=parseInt(label.style.top)+yshift+"px";},drawSurface:function(node,geometry){this.setNodeDimension(node,geometry);var resolution=this.getResolution();var path=[];var comp,x,y;for(var i=0,len=geometry.components.length;i<len;i++){comp=geometry.components[i];x=(comp.x/resolution-this.offset.x)|0;y=(comp.y/resolution-this.offset.y)|0;if((i%3)==0&&(i/3)==0){path.push("m");}else if((i%3)==1){path.push(" c");}
+path.push(" "+x+","+y);}
+path.push(" x e");node.path=path.join("");return node;},moveRoot:function(renderer){var layer=this.map.getLayer(renderer.container.id);if(layer instanceof OpenLayers.Layer.Vector.RootContainer){layer=this.map.getLayer(this.container.id);}
+layer&&layer.renderer.clear();OpenLayers.Renderer.Elements.prototype.moveRoot.apply(this,arguments);layer&&layer.redraw();},importSymbol:function(graphicName){var id=this.container.id+"-"+graphicName;var cache=this.symbolCache[id];if(cache){return cache;}
+var symbol=OpenLayers.Renderer.symbol[graphicName];if(!symbol){throw new Error(graphicName+' is not a valid symbol name');}
+var symbolExtent=new OpenLayers.Bounds(Number.MAX_VALUE,Number.MAX_VALUE,0,0);var pathitems=["m"];for(var i=0;i<symbol.length;i=i+2){var x=symbol[i];var y=symbol[i+1];symbolExtent.left=Math.min(symbolExtent.left,x);symbolExtent.bottom=Math.min(symbolExtent.bottom,y);symbolExtent.right=Math.max(symbolExtent.right,x);symbolExtent.top=Math.max(symbolExtent.top,y);pathitems.push(x);pathitems.push(y);if(i==0){pathitems.push("l");}}
+pathitems.push("x e");var path=pathitems.join(" ");var diff=(symbolExtent.getWidth()-symbolExtent.getHeight())/2;if(diff>0){symbolExtent.bottom=symbolExtent.bottom-diff;symbolExtent.top=symbolExtent.top+diff;}else{symbolExtent.left=symbolExtent.left+diff;symbolExtent.right=symbolExtent.right-diff;}
+cache={path:path,size:symbolExtent.getWidth(),left:symbolExtent.left,bottom:symbolExtent.bottom};this.symbolCache[id]=cache;return cache;},CLASS_NAME:"OpenLayers.Renderer.VML"});OpenLayers.Renderer.VML.LABEL_SHIFT={"l":0,"c":.5,"r":1,"t":0,"m":.5,"b":1};OpenLayers.Protocol=OpenLayers.Class({format:null,options:null,autoDestroy:true,defaultFilter:null,initialize:function(options){options=options||{};OpenLayers.Util.extend(this,options);this.options=options;},mergeWithDefaultFilter:function(filter){var merged;if(filter&&this.defaultFilter){merged=new OpenLayers.Filter.Logical({type:OpenLayers.Filter.Logical.AND,filters:[this.defaultFilter,filter]});}else{merged=filter||this.defaultFilter||undefined;}
+return merged;},destroy:function(){this.options=null;this.format=null;},read:function(options){options=options||{};options.filter=this.mergeWithDefaultFilter(options.filter);},create:function(){},update:function(){},"delete":function(){},commit:function(){},abort:function(response){},createCallback:function(method,response,options){return OpenLayers.Function.bind(function(){method.apply(this,[response,options]);},this);},CLASS_NAME:"OpenLayers.Protocol"});OpenLayers.Protocol.Response=OpenLayers.Class({code:null,requestType:null,last:true,features:null,reqFeatures:null,priv:null,error:null,initialize:function(options){OpenLayers.Util.extend(this,options);},success:function(){return this.code>0;},CLASS_NAME:"OpenLayers.Protocol.Response"});OpenLayers.Protocol.Response.SUCCESS=1;OpenLayers.Protocol.Response.FAILURE=0;OpenLayers.Protocol.HTTP=OpenLayers.Class(OpenLayers.Protocol,{url:null,headers:null,params:null,callback:null,scope:null,readWithPOST:false,wildcarded:false,srsInBBOX:false,initialize:function(options){options=options||{};this.params={};this.headers={};OpenLayers.Protocol.prototype.initialize.apply(this,arguments);if(!this.filterToParams&&OpenLayers.Format.QueryStringFilter){var format=new OpenLayers.Format.QueryStringFilter({wildcarded:this.wildcarded,srsInBBOX:this.srsInBBOX});this.filterToParams=function(filter,params){return format.write(filter,params);}}},destroy:function(){this.params=null;this.headers=null;OpenLayers.Protocol.prototype.destroy.apply(this);},read:function(options){OpenLayers.Protocol.prototype.read.apply(this,arguments);options=options||{};options.params=OpenLayers.Util.applyDefaults(options.params,this.options.params);options=OpenLayers.Util.applyDefaults(options,this.options);if(options.filter&&this.filterToParams){options.params=this.filterToParams(options.filter,options.params);}
+var readWithPOST=(options.readWithPOST!==undefined)?options.readWithPOST:this.readWithPOST;var resp=new OpenLayers.Protocol.Response({requestType:"read"});if(readWithPOST){resp.priv=OpenLayers.Request.POST({url:options.url,callback:this.createCallback(this.handleRead,resp,options),data:OpenLayers.Util.getParameterString(options.params),headers:{"Content-Type":"application/x-www-form-urlencoded"}});}else{resp.priv=OpenLayers.Request.GET({url:options.url,callback:this.createCallback(this.handleRead,resp,options),params:options.params,headers:options.headers});}
+return resp;},handleRead:function(resp,options){this.handleResponse(resp,options);},create:function(features,options){options=OpenLayers.Util.applyDefaults(options,this.options);var resp=new OpenLayers.Protocol.Response({reqFeatures:features,requestType:"create"});resp.priv=OpenLayers.Request.POST({url:options.url,callback:this.createCallback(this.handleCreate,resp,options),headers:options.headers,data:this.format.write(features)});return resp;},handleCreate:function(resp,options){this.handleResponse(resp,options);},update:function(feature,options){options=options||{};var url=options.url||feature.url||this.options.url+"/"+feature.fid;options=OpenLayers.Util.applyDefaults(options,this.options);var resp=new OpenLayers.Protocol.Response({reqFeatures:feature,requestType:"update"});resp.priv=OpenLayers.Request.PUT({url:url,callback:this.createCallback(this.handleUpdate,resp,options),headers:options.headers,data:this.format.write(feature)});return resp;},handleUpdate:function(resp,options){this.handleResponse(resp,options);},"delete":function(feature,options){options=options||{};var url=options.url||feature.url||this.options.url+"/"+feature.fid;options=OpenLayers.Util.applyDefaults(options,this.options);var resp=new OpenLayers.Protocol.Response({reqFeatures:feature,requestType:"delete"});resp.priv=OpenLayers.Request.DELETE({url:url,callback:this.createCallback(this.handleDelete,resp,options),headers:options.headers});return resp;},handleDelete:function(resp,options){this.handleResponse(resp,options);},handleResponse:function(resp,options){var request=resp.priv;if(options.callback){if(request.status>=200&&request.status<300){if(resp.requestType!="delete"){resp.features=this.parseFeatures(request);}
+resp.code=OpenLayers.Protocol.Response.SUCCESS;}else{resp.code=OpenLayers.Protocol.Response.FAILURE;}
+options.callback.call(options.scope,resp);}},parseFeatures:function(request){var doc=request.responseXML;if(!doc||!doc.documentElement){doc=request.responseText;}
+if(!doc||doc.length<=0){return null;}
+return this.format.read(doc);},commit:function(features,options){options=OpenLayers.Util.applyDefaults(options,this.options);var resp=[],nResponses=0;var types={};types[OpenLayers.State.INSERT]=[];types[OpenLayers.State.UPDATE]=[];types[OpenLayers.State.DELETE]=[];var feature,list,requestFeatures=[];for(var i=0,len=features.length;i<len;++i){feature=features[i];list=types[feature.state];if(list){list.push(feature);requestFeatures.push(feature);}}
+var nRequests=(types[OpenLayers.State.INSERT].length>0?1:0)+
+types[OpenLayers.State.UPDATE].length+
+types[OpenLayers.State.DELETE].length;var success=true;var finalResponse=new OpenLayers.Protocol.Response({reqFeatures:requestFeatures});function insertCallback(response){var len=response.features?response.features.length:0;var fids=new Array(len);for(var i=0;i<len;++i){fids[i]=response.features[i].fid;}
+finalResponse.insertIds=fids;callback.apply(this,[response]);}
+function callback(response){this.callUserCallback(response,options);success=success&&response.success();nResponses++;if(nResponses>=nRequests){if(options.callback){finalResponse.code=success?OpenLayers.Protocol.Response.SUCCESS:OpenLayers.Protocol.Response.FAILURE;options.callback.apply(options.scope,[finalResponse]);}}}
+var queue=types[OpenLayers.State.INSERT];if(queue.length>0){resp.push(this.create(queue,OpenLayers.Util.applyDefaults({callback:insertCallback,scope:this},options.create)));}
+queue=types[OpenLayers.State.UPDATE];for(var i=queue.length-1;i>=0;--i){resp.push(this.update(queue[i],OpenLayers.Util.applyDefaults({callback:callback,scope:this},options.update)));}
+queue=types[OpenLayers.State.DELETE];for(var i=queue.length-1;i>=0;--i){resp.push(this["delete"](queue[i],OpenLayers.Util.applyDefaults({callback:callback,scope:this},options["delete"])));}
+return resp;},abort:function(response){if(response){response.priv.abort();}},callUserCallback:function(resp,options){var opt=options[resp.requestType];if(opt&&opt.callback){opt.callback.call(opt.scope,resp);}},CLASS_NAME:"OpenLayers.Protocol.HTTP"});OpenLayers.Format.JSON=OpenLayers.Class(OpenLayers.Format,{indent:" ",space:" ",newline:"\n",level:0,pretty:false,nativeJSON:(function(){return!!(window.JSON&&typeof JSON.parse=="function"&&typeof JSON.stringify=="function");})(),read:function(json,filter){var object;if(this.nativeJSON){object=JSON.parse(json,filter);}else try{if(/^[\],:{}\s]*$/.test(json.replace(/\\["\\\/bfnrtu]/g,'@').replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,']').replace(/(?:^|:|,)(?:\s*\[)+/g,''))){object=eval('('+json+')');if(typeof filter==='function'){function walk(k,v){if(v&&typeof v==='object'){for(var i in v){if(v.hasOwnProperty(i)){v[i]=walk(i,v[i]);}}}
+return filter(k,v);}
+object=walk('',object);}}}catch(e){}
+if(this.keepData){this.data=object;}
+return object;},write:function(value,pretty){this.pretty=!!pretty;var json=null;var type=typeof value;if(this.serialize[type]){try{json=(!this.pretty&&this.nativeJSON)?JSON.stringify(value):this.serialize[type].apply(this,[value]);}catch(err){OpenLayers.Console.error("Trouble serializing: "+err);}}
+return json;},writeIndent:function(){var pieces=[];if(this.pretty){for(var i=0;i<this.level;++i){pieces.push(this.indent);}}
+return pieces.join('');},writeNewline:function(){return(this.pretty)?this.newline:'';},writeSpace:function(){return(this.pretty)?this.space:'';},serialize:{'object':function(object){if(object==null){return"null";}
+if(object.constructor==Date){return this.serialize.date.apply(this,[object]);}
+if(object.constructor==Array){return this.serialize.array.apply(this,[object]);}
+var pieces=['{'];this.level+=1;var key,keyJSON,valueJSON;var addComma=false;for(key in object){if(object.hasOwnProperty(key)){keyJSON=OpenLayers.Format.JSON.prototype.write.apply(this,[key,this.pretty]);valueJSON=OpenLayers.Format.JSON.prototype.write.apply(this,[object[key],this.pretty]);if(keyJSON!=null&&valueJSON!=null){if(addComma){pieces.push(',');}
+pieces.push(this.writeNewline(),this.writeIndent(),keyJSON,':',this.writeSpace(),valueJSON);addComma=true;}}}
+this.level-=1;pieces.push(this.writeNewline(),this.writeIndent(),'}');return pieces.join('');},'array':function(array){var json;var pieces=['['];this.level+=1;for(var i=0,len=array.length;i<len;++i){json=OpenLayers.Format.JSON.prototype.write.apply(this,[array[i],this.pretty]);if(json!=null){if(i>0){pieces.push(',');}
+pieces.push(this.writeNewline(),this.writeIndent(),json);}}
+this.level-=1;pieces.push(this.writeNewline(),this.writeIndent(),']');return pieces.join('');},'string':function(string){var m={'\b':'\\b','\t':'\\t','\n':'\\n','\f':'\\f','\r':'\\r','"':'\\"','\\':'\\\\'};if(/["\\\x00-\x1f]/.test(string)){return'"'+string.replace(/([\x00-\x1f\\"])/g,function(a,b){var c=m[b];if(c){return c;}
+c=b.charCodeAt();return'\\u00'+
+Math.floor(c/16).toString(16)+
+(c%16).toString(16);})+'"';}
+return'"'+string+'"';},'number':function(number){return isFinite(number)?String(number):"null";},'boolean':function(bool){return String(bool);},'date':function(date){function format(number){return(number<10)?'0'+number:number;}
+return'"'+date.getFullYear()+'-'+
+format(date.getMonth()+1)+'-'+
+format(date.getDate())+'T'+
+format(date.getHours())+':'+
+format(date.getMinutes())+':'+
+format(date.getSeconds())+'"';}},CLASS_NAME:"OpenLayers.Format.JSON"});OpenLayers.Control.DragFeature=OpenLayers.Class(OpenLayers.Control,{geometryTypes:null,onStart:function(feature,pixel){},onDrag:function(feature,pixel){},onComplete:function(feature,pixel){},onEnter:function(feature){},onLeave:function(feature){},documentDrag:false,layer:null,feature:null,dragCallbacks:{},featureCallbacks:{},lastPixel:null,initialize:function(layer,options){OpenLayers.Control.prototype.initialize.apply(this,[options]);this.layer=layer;this.handlers={drag:new OpenLayers.Handler.Drag(this,OpenLayers.Util.extend({down:this.downFeature,move:this.moveFeature,up:this.upFeature,out:this.cancel,done:this.doneDragging},this.dragCallbacks),{documentDrag:this.documentDrag}),feature:new OpenLayers.Handler.Feature(this,this.layer,OpenLayers.Util.extend({click:this.clickFeature,clickout:this.clickoutFeature,over:this.overFeature,out:this.outFeature},this.featureCallbacks),{geometryTypes:this.geometryTypes})};},clickFeature:function(feature){if(this.handlers.feature.touch&&!this.over&&this.overFeature(feature)){this.handlers.drag.dragstart(this.handlers.feature.evt);this.handlers.drag.stopDown=false;}},clickoutFeature:function(feature){if(this.handlers.feature.touch&&this.over){this.outFeature(feature);this.handlers.drag.stopDown=true;}},destroy:function(){this.layer=null;OpenLayers.Control.prototype.destroy.apply(this,[]);},activate:function(){return(this.handlers.feature.activate()&&OpenLayers.Control.prototype.activate.apply(this,arguments));},deactivate:function(){this.handlers.drag.deactivate();this.handlers.feature.deactivate();this.feature=null;this.dragging=false;this.lastPixel=null;OpenLayers.Element.removeClass(this.map.viewPortDiv,this.displayClass+"Over");return OpenLayers.Control.prototype.deactivate.apply(this,arguments);},overFeature:function(feature){var activated=false;if(!this.handlers.drag.dragging){this.feature=feature;this.handlers.drag.activate();activated=true;this.over=true;OpenLayers.Element.addClass(this.map.viewPortDiv,this.displayClass+"Over");this.onEnter(feature);}else{if(this.feature.id==feature.id){this.over=true;}else{this.over=false;}}
+return activated;},downFeature:function(pixel){this.lastPixel=pixel;this.onStart(this.feature,pixel);},moveFeature:function(pixel){var res=this.map.getResolution();this.feature.geometry.move(res*(pixel.x-this.lastPixel.x),res*(this.lastPixel.y-pixel.y));this.layer.drawFeature(this.feature);this.lastPixel=pixel;this.onDrag(this.feature,pixel);},upFeature:function(pixel){if(!this.over){this.handlers.drag.deactivate();}},doneDragging:function(pixel){this.onComplete(this.feature,pixel);},outFeature:function(feature){if(!this.handlers.drag.dragging){this.over=false;this.handlers.drag.deactivate();OpenLayers.Element.removeClass(this.map.viewPortDiv,this.displayClass+"Over");this.onLeave(feature);this.feature=null;}else{if(this.feature.id==feature.id){this.over=false;}}},cancel:function(){this.handlers.drag.deactivate();this.over=false;},setMap:function(map){this.handlers.drag.setMap(map);this.handlers.feature.setMap(map);OpenLayers.Control.prototype.setMap.apply(this,arguments);},CLASS_NAME:"OpenLayers.Control.DragFeature"});OpenLayers.Control.PinchZoom=OpenLayers.Class(OpenLayers.Control,{type:OpenLayers.Control.TYPE_TOOL,containerOrigin:null,pinchOrigin:null,currentCenter:null,autoActivate:true,initialize:function(options){OpenLayers.Control.prototype.initialize.apply(this,arguments);this.handler=new OpenLayers.Handler.Pinch(this,{start:this.pinchStart,move:this.pinchMove,done:this.pinchDone},this.handlerOptions);},activate:function(){var activated=OpenLayers.Control.prototype.activate.apply(this,arguments);if(activated){this.map.events.on({moveend:this.updateContainerOrigin,scope:this});this.updateContainerOrigin();}
+return activated;},deactivate:function(){var deactivated=OpenLayers.Control.prototype.deactivate.apply(this,arguments);if(this.map&&this.map.events){this.map.events.un({moveend:this.updateContainerOrigin,scope:this});}
+return deactivated;},updateContainerOrigin:function(){var container=this.map.layerContainerDiv;this.containerOrigin={x:parseInt(container.style.left,10),y:parseInt(container.style.top,10)};},pinchStart:function(evt,pinchData){this.pinchOrigin=evt.xy;this.currentCenter=evt.xy;},pinchMove:function(evt,pinchData){var scale=pinchData.scale;var containerOrigin=this.containerOrigin;var pinchOrigin=this.pinchOrigin;var current=evt.xy;var dx=Math.round((current.x-pinchOrigin.x)+(scale-1)*(containerOrigin.x-pinchOrigin.x));var dy=Math.round((current.y-pinchOrigin.y)+(scale-1)*(containerOrigin.y-pinchOrigin.y));this.applyTransform("translate("+dx+"px, "+dy+"px) scale("+scale+")");this.currentCenter=current;},applyTransform:function(transform){var style=this.map.layerContainerDiv.style;style['-webkit-transform']=transform;style['-moz-transform']=transform;},pinchDone:function(evt,start,last){this.applyTransform("");var zoom=this.map.getZoomForResolution(this.map.getResolution()/last.scale,true);if(zoom!==this.map.getZoom()||!this.currentCenter.equals(this.pinchOrigin)){var resolution=this.map.getResolutionForZoom(zoom);var location=this.map.getLonLatFromPixel(this.pinchOrigin);var zoomPixel=this.currentCenter;var size=this.map.getSize();location.lon+=resolution*((size.w/2)-zoomPixel.x);location.lat-=resolution*((size.h/2)-zoomPixel.y);this.map.setCenter(location,zoom);}},CLASS_NAME:"OpenLayers.Control.PinchZoom"}); \ No newline at end of file
diff --git a/web/js/OpenLayers.Projection.CH1903.js b/web/js/OpenLayers.Projection.CH1903.js
new file mode 100644
index 000000000..34a0500fa
--- /dev/null
+++ b/web/js/OpenLayers.Projection.CH1903.js
@@ -0,0 +1,128 @@
+/**
+ * OpenLayers Swiss (CH1903) grid projection transformations
+ *
+ * Provides transform functions for WGS84<->CH1903 projections.
+ *
+ * Maths courtesy of the Swiss Federal Office of Topography:
+ * http://www.swisstopo.admin.ch/internet/swisstopo/en/home/products/software/products/skripts.html
+ * Simplifed a bit, and with x/y swapped the normal way round.
+ */
+
+OpenLayers.Projection.CH1903 = {
+
+ // Convert WGS lat/long (° dec) to CH x
+ WGStoCHx: function(lat, lng) {
+
+ // Converts degrees dec to seconds
+ lat = lat * 3600;
+ lng = lng * 3600;
+
+ // Auxiliary values (% Bern)
+ var lat_aux = (lat - 169028.66) / 10000;
+ var lng_aux = (lng - 26782.5) / 10000;
+
+ // Process X
+ var x = 600072.37;
+ x = x + (211455.93 * lng_aux);
+ x = x - (10938.51 * lng_aux * lat_aux);
+ x = x - (0.36 * lng_aux * Math.pow(lat_aux, 2));
+ x = x - (44.54 * Math.pow(lng_aux, 3));
+
+ return x;
+ },
+
+ // Convert WGS lat/long (° dec) to CH y
+ WGStoCHy: function(lat, lng) {
+
+ // Converts degrees dec to seconds
+ lat = lat * 3600;
+ lng = lng * 3600;
+
+ // Auxiliary values (% Bern)
+ var lat_aux = (lat - 169028.66)/10000;
+ var lng_aux = (lng - 26782.5)/10000;
+
+ // Process Y
+ var y = 200147.07;
+ y = y + (308807.95 * lat_aux);
+ y = y + (3745.25 * Math.pow(lng_aux, 2));
+ y = y + (76.63 * Math.pow(lat_aux, 2));
+ y = y - (194.56 * Math.pow(lng_aux, 2) * lat_aux);
+ y = y + (119.79 * Math.pow(lat_aux, 3));
+
+ return y;
+
+ },
+
+ // Convert CH x/y to WGS lat
+ chToWGSlat: function(x, y) {
+
+ // Converts militar to civil and to unit = 1000km
+ // Axiliary values (% Bern)
+ var x_aux = (x - 600000) / 1000000;
+ var y_aux = (y - 200000) / 1000000;
+
+ // Process lat
+ var lat = 16.9023892;
+ lat = lat + (3.238272 * y_aux);
+ lat = lat - (0.270978 * Math.pow(x_aux, 2));
+ lat = lat - (0.002528 * Math.pow(y_aux, 2));
+ lat = lat - (0.0447 * Math.pow(x_aux, 2) * y_aux);
+ lat = lat - (0.0140 * Math.pow(y_aux, 3));
+
+ // Unit 10000" to 1 " and converts seconds to degrees (dec)
+ lat = lat * 100 / 36;
+
+ return lat;
+
+ },
+
+ // Convert CH x/y to WGS long
+ chToWGSlng: function(x, y) {
+
+ // Converts militar to civil and to unit = 1000km
+ // Axiliary values (% Bern)
+ var x_aux = (x - 600000) / 1000000;
+ var y_aux = (y - 200000) / 1000000;
+
+ // Process long
+ var lng = 2.6779094;
+ lng = lng + (4.728982 * x_aux);
+ lng = lng + (0.791484 * x_aux * y_aux);
+ lng = lng + (0.1306 * x_aux * Math.pow(y_aux, 2));
+ lng = lng - (0.0436 * Math.pow(x_aux, 3));
+
+ // Unit 10000" to 1 " and converts seconds to degrees (dec)
+ lng = lng * 100 / 36;
+
+ return lng;
+
+ },
+
+ // Function to convert a WGS84 coordinate to a Swiss coordinate.
+ projectForwardSwiss: function(point) {
+ var x = OpenLayers.Projection.CH1903.WGStoCHx(point.y, point.x),
+ y = OpenLayers.Projection.CH1903.WGStoCHy(point.y, point.x);
+ point.x = x;
+ point.y = y;
+ return point;
+ },
+
+ // Function to convert a Swiss coordinate to a WGS84 coordinate.
+ projectInverseSwiss: function(point) {
+ var lon = OpenLayers.Projection.CH1903.chToWGSlng(point.x, point.y);
+ var lat = OpenLayers.Projection.CH1903.chToWGSlat(point.x, point.y);
+ point.x = lon;
+ point.y = lat;
+ return point;
+ }
+};
+
+/**
+ * Note: One transform declared
+ * Transforms from EPSG:4326 to EPSG:21781
+ */
+ OpenLayers.Projection.addTransform("EPSG:4326", "EPSG:21781",
+ OpenLayers.Projection.CH1903.projectForwardSwiss);
+ OpenLayers.Projection.addTransform("EPSG:21781", "EPSG:4326",
+ OpenLayers.Projection.CH1903.projectInverseSwiss);
diff --git a/web/js/fixmystreet.js b/web/js/fixmystreet.js
index b689d501c..1d5ef6b97 100644
--- a/web/js/fixmystreet.js
+++ b/web/js/fixmystreet.js
@@ -53,13 +53,7 @@ $(function(){
var submitted = false;
$("form.validate").validate({
- rules: {
- title: { required: true },
- detail: { required: true },
- email: { required: true },
- update: { required: true },
- rznvy: { required: true }
- },
+ rules: validation_rules,
messages: validation_strings,
onkeyup: false,
onfocusout: false,
@@ -134,10 +128,12 @@ $(function(){
// Geolocation
if (geo_position_js.init()) {
+ var link = '<a href="#LINK" id="geolocate_link">&hellip; ' + validation_strings.geolocate + '</a>';
+ $('form[action="/alert/list"]').append(link.replace('LINK','alert/list'));
if ($('body.frontpage').length) {
- $('#postcodeForm').after('<a href="#" id="geolocate_link">&hellip; or locate me automatically</a>');
+ $('#postcodeForm').after(link.replace('LINK','around'));
} else{
- $('#postcodeForm').append('<a href="#" id="geolocate_link">&hellip; or locate me automatically</a>');
+ $('#postcodeForm').append(link.replace('LINK','around'));
}
$('#geolocate_link').click(function(e) {
var $link = $(this);
@@ -152,7 +148,8 @@ $(function(){
$link.find('img').remove();
var latitude = pos.coords.latitude;
var longitude = pos.coords.longitude;
- location.href = '/around?latitude=' + latitude + ';longitude=' + longitude;
+ var page = $link.attr('href').substr(1);
+ location.href = '/' + page + '?latitude=' + latitude + ';longitude=' + longitude;
}, function(err) {
$link.find('img').remove();
if (err.code == 1) { // User said no
diff --git a/web/js/map-OpenLayers.js b/web/js/map-OpenLayers.js
index d98994d84..85ab09889 100644
--- a/web/js/map-OpenLayers.js
+++ b/web/js/map-OpenLayers.js
@@ -70,26 +70,30 @@ function fms_markers_list(pins, transform) {
}
function fixmystreet_onload() {
- if ( fixmystreet.area ) {
- var area = new OpenLayers.Layer.Vector("KML", {
- strategies: [ new OpenLayers.Strategy.Fixed() ],
- protocol: new OpenLayers.Protocol.HTTP({
- url: "/mapit/area/" + fixmystreet.area + ".kml?simplify_tolerance=0.0001",
- format: new OpenLayers.Format.KML()
- })
- });
- fixmystreet.map.addLayer(area);
- area.events.register('loadend', null, function(a,b,c) {
- var bounds = area.getDataExtent();
- if (bounds) {
- var center = bounds.getCenterLonLat();
- var z = fixmystreet.map.getZoomForExtent(bounds);
- if ( z < 13 && $('html').hasClass('mobile') ) {
- z = 13;
- }
- fixmystreet.map.setCenter(center, z, false, true);
+ if ( fixmystreet.area.length ) {
+ for (var i=0; i<fixmystreet.area.length; i++) {
+ var area = new OpenLayers.Layer.Vector("KML", {
+ strategies: [ new OpenLayers.Strategy.Fixed() ],
+ protocol: new OpenLayers.Protocol.HTTP({
+ url: "/mapit/area/" + fixmystreet.area[i] + ".kml?simplify_tolerance=0.0001",
+ format: new OpenLayers.Format.KML()
+ })
+ });
+ fixmystreet.map.addLayer(area);
+ if ( fixmystreet.area.length == 1 ) {
+ area.events.register('loadend', null, function(a,b,c) {
+ var bounds = area.getDataExtent();
+ if (bounds) {
+ var center = bounds.getCenterLonLat();
+ var z = fixmystreet.map.getZoomForExtent(bounds);
+ if ( z < 13 && $('html').hasClass('mobile') ) {
+ z = 13;
+ }
+ fixmystreet.map.setCenter(center, z, false, true);
+ }
+ });
}
- });
+ }
}
var pin_layer_style_map = new OpenLayers.StyleMap({
@@ -133,7 +137,7 @@ function fixmystreet_onload() {
styleMap: pin_layer_style_map
};
if (fixmystreet.page == 'around') {
- fixmystreet.bbox_strategy = new OpenLayers.Strategy.BBOX({ ratio: 1 });
+ fixmystreet.bbox_strategy = fixmystreet.bbox_strategy || new OpenLayers.Strategy.BBOX({ ratio: 1 });
pin_layer_options.strategies = [ fixmystreet.bbox_strategy ];
pin_layer_options.protocol = new OpenLayers.Protocol.HTTP({
url: '/ajax',
@@ -246,23 +250,35 @@ function fixmystreet_onload() {
$(function(){
- set_map_config();
+ // Set specific map config - some other JS included in the
+ // template should define this
+ set_map_config();
- fixmystreet.map = new OpenLayers.Map("map", {
- controls: fixmystreet.controls,
- displayProjection: new OpenLayers.Projection("EPSG:4326")
- });
+ // Create the basics of the map
+ fixmystreet.map = new OpenLayers.Map(
+ "map", OpenLayers.Util.extend({
+ controls: fixmystreet.controls,
+ displayProjection: new OpenLayers.Projection("EPSG:4326")
+ }, fixmystreet.map_options)
+ );
if ($('html').hasClass('mobile') && fixmystreet.page == 'around') {
$('#fms_pan_zoom').css({ top: '2.75em !important' });
}
+ // Set it up our way
fixmystreet.layer_options = OpenLayers.Util.extend({
zoomOffset: fixmystreet.zoomOffset,
transitionEffect: 'resize',
numZoomLevels: fixmystreet.numZoomLevels
}, fixmystreet.layer_options);
- var layer = new fixmystreet.map_type("", fixmystreet.layer_options);
+
+ var layer;
+ if (fixmystreet.layer_options.matrixIds) {
+ layer = new fixmystreet.map_type(fixmystreet.layer_options);
+ } else {
+ layer = new fixmystreet.map_type("", fixmystreet.layer_options);
+ }
fixmystreet.map.addLayer(layer);
if (!fixmystreet.map.getCenter()) {
@@ -333,7 +349,7 @@ $(function(){
$('#sub_map_links').show();
//only on mobile
$('#mob_sub_map_links').remove();
- $('.mobile-map-banner').text('Place pin on map');
+ $('.mobile-map-banner').html('<a href="/">Home</a> Place pin on map');
fixmystreet.page = 'around';
});
@@ -528,7 +544,7 @@ OpenLayers.Control.Click = OpenLayers.Class(OpenLayers.Control, {
).css({ position: 'relative', width: width, height: height, marginBottom: '1em' });
// Making it relative here makes it much easier to do the scrolling later
- $('.mobile-map-banner').text('Right place?');
+ $('.mobile-map-banner').html('<a href="/">Home</a> Right place?');
// mobile user clicks 'ok' on map
$('#mob_ok').toggle(function(){
diff --git a/web/js/map-wmts-zurich.js b/web/js/map-wmts-zurich.js
new file mode 100644
index 000000000..8ecca50a1
--- /dev/null
+++ b/web/js/map-wmts-zurich.js
@@ -0,0 +1,83 @@
+/*
+ * Maps for FMZ using Zurich council's WMTS tile server
+ */
+
+/*
+ * set_map_config() is called on dom ready in map-OpenLayers.js
+ * to setup the way the map should operate.
+ */
+ function set_map_config(perm) {
+ // This stuff is copied from js/map-bing-ol.js
+ var permalink_id;
+ if ($('#map_permalink').length) {
+ permalink_id = 'map_permalink';
+ }
+
+ var nav_opts = { zoomWheelEnabled: false };
+ if (fixmystreet.page == 'around' && $('html').hasClass('mobile')) {
+ nav_opts = {};
+ }
+ fixmystreet.nav_control = new OpenLayers.Control.Navigation(nav_opts);
+
+ fixmystreet.controls = [
+ new OpenLayers.Control.Attribution(),
+ new OpenLayers.Control.ArgParser(),
+ fixmystreet.nav_control,
+ new OpenLayers.Control.Permalink(permalink_id),
+ new OpenLayers.Control.PanZoomFMS({id: 'fms_pan_zoom' })
+ ];
+
+ fixmystreet.map_type = OpenLayers.Layer.WMTS;
+
+ // Set DPI - default is 72
+ OpenLayers.DOTS_PER_INCH = 96;
+
+ fixmystreet.map_options = {
+ projection: new OpenLayers.Projection("EPSG:21781"),
+ maxExtent: new OpenLayers.Bounds(676000, 241000, 690000, 255000),
+ units: 'm',
+ scales: [ '250000', '125000', '64000', '32000', '16000', '8000', '4000', '2000', '1000', '500']
+ };
+
+ fixmystreet.layer_options = {
+ name: "Luftbild",
+ layer: "Luftbild",
+ matrixSet: "nativeTileMatrixSet",
+ requestEncoding: "REST",
+ url: "http://www.wmts.stadt-zuerich.ch/Luftbild/MapServer/WMTS/tile/",
+ style: "default",
+ matrixIds: [
+ { identifier: "0", matrixHeight: 2, matrixWidth: 2, scaleDenominator: 250000, supportedCRS: "urn:ogc:def:crs:EPSG::21781", tileHeight: 256, tileWidth: 256, topLeftCorner: { lat: 30814423, lon: -29386322 } },
+ { identifier: "1", matrixHeight: 3, matrixWidth: 3, scaleDenominator: 125000, supportedCRS: "urn:ogc:def:crs:EPSG::21781", tileHeight: 256, tileWidth: 256, topLeftCorner: { lat: 30814423, lon: -29386322 } },
+ { identifier: "2", matrixHeight: 4, matrixWidth: 5, scaleDenominator: 64000, supportedCRS: "urn:ogc:def:crs:EPSG::21781", tileHeight: 256, tileWidth: 256, topLeftCorner: { lat: 30814423, lon: -29386322 } },
+ { identifier: "3", matrixHeight: 7, matrixWidth: 8, scaleDenominator: 32000, supportedCRS: "urn:ogc:def:crs:EPSG::21781", tileHeight: 256, tileWidth: 256, topLeftCorner: { lat: 30814423, lon: -29386322 } },
+ { identifier: "4", matrixHeight: 14, matrixWidth: 14, scaleDenominator: 16000, supportedCRS: "urn:ogc:def:crs:EPSG::21781", tileHeight: 256, tileWidth: 256, topLeftCorner: { lat: 30814423, lon: -29386322 } },
+ { identifier: "5", matrixHeight: 27, matrixWidth: 27, scaleDenominator: 8000, supportedCRS: "urn:ogc:def:crs:EPSG::21781", tileHeight: 256, tileWidth: 256, topLeftCorner: { lat: 30814423, lon: -29386322 } },
+ { identifier: "6", matrixHeight: 52, matrixWidth: 53, scaleDenominator: 4000, supportedCRS: "urn:ogc:def:crs:EPSG::21781", tileHeight: 256, tileWidth: 256, topLeftCorner: { lat: 30814423, lon: -29386322 } },
+ { identifier: "7", matrixHeight: 104, matrixWidth: 105, scaleDenominator: 2000, supportedCRS: "urn:ogc:def:crs:EPSG::21781", tileHeight: 256, tileWidth: 256, topLeftCorner: { lat: 30814423, lon: -29386322 } },
+ { identifier: "8", matrixHeight: 208, matrixWidth: 208, scaleDenominator: 1000, supportedCRS: "urn:ogc:def:crs:EPSG::21781", tileHeight: 256, tileWidth: 256, topLeftCorner: { lat: 30814423, lon: -29386322 } },
+ { identifier: "9", matrixHeight: 415, matrixWidth: 414, scaleDenominator: 500, supportedCRS: "urn:ogc:def:crs:EPSG::21781", tileHeight: 256, tileWidth: 256, topLeftCorner: { lat: 30814423, lon: -29386322 } }
+ ]
+ };
+
+ // Give main code a new bbox_strategy that translates between
+ // lat/lon and our swiss coordinates
+ fixmystreet.bbox_strategy = new OpenLayers.Strategy.ZurichBBOX({ratio: 1});
+}
+
+OpenLayers.Strategy.ZurichBBOX = OpenLayers.Class(OpenLayers.Strategy.BBOX, {
+ getMapBounds: function() {
+ // Get the map bounds but return them in lat/lon, not
+ // Swiss coordinates
+ if (this.layer.map === null) {
+ return null;
+ }
+
+ var swissBounds = this.layer.map.getExtent();
+ // Transform bound corners into WGS84
+ swissBounds.transform( new OpenLayers.Projection("EPSG:21781"), new OpenLayers.Projection("EPSG:4326") );
+ return swissBounds;
+ },
+
+ CLASS_NAME: "OpenLayers.Strategy.ZurichBBOX"
+});
diff --git a/web/js/modernizr.custom.js b/web/js/modernizr.custom.js
index c4d6ffdfc..026c0efad 100644
--- a/web/js/modernizr.custom.js
+++ b/web/js/modernizr.custom.js
@@ -1,4 +1,4 @@
-/* Modernizr 2.5.3 (Custom Build) | MIT & BSD
- * Build: http://www.modernizr.com/download/#-shiv-load
+/* Modernizr 2.6.1 (Custom Build) | MIT & BSD
+ * Build: http://modernizr.com/download/#-sessionstorage-shiv-load
*/
-;window.Modernizr=function(a,b,c){function t(a){i.cssText=a}function u(a,b){return t(prefixes.join(a+";")+(b||""))}function v(a,b){return typeof a===b}function w(a,b){return!!~(""+a).indexOf(b)}function x(a,b,d){for(var e in a){var f=b[a[e]];if(f!==c)return d===!1?a[e]:v(f,"function")?f.bind(d||b):f}return!1}var d="2.5.3",e={},f=b.documentElement,g="modernizr",h=b.createElement(g),i=h.style,j,k={}.toString,l={},m={},n={},o=[],p=o.slice,q,r={}.hasOwnProperty,s;!v(r,"undefined")&&!v(r.call,"undefined")?s=function(a,b){return r.call(a,b)}:s=function(a,b){return b in a&&v(a.constructor.prototype[b],"undefined")},Function.prototype.bind||(Function.prototype.bind=function(b){var c=this;if(typeof c!="function")throw new TypeError;var d=p.call(arguments,1),e=function(){if(this instanceof e){var a=function(){};a.prototype=c.prototype;var f=new a,g=c.apply(f,d.concat(p.call(arguments)));return Object(g)===g?g:f}return c.apply(b,d.concat(p.call(arguments)))};return e});for(var y in l)s(l,y)&&(q=y.toLowerCase(),e[q]=l[y](),o.push((e[q]?"":"no-")+q));return t(""),h=j=null,function(a,b){function g(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x<style>"+b+"</style>",d.insertBefore(c.lastChild,d.firstChild)}function h(){var a=k.elements;return typeof a=="string"?a.split(" "):a}function i(a){var b={},c=a.createElement,e=a.createDocumentFragment,f=e();a.createElement=function(a){var e=(b[a]||(b[a]=c(a))).cloneNode();return k.shivMethods&&e.canHaveChildren&&!d.test(a)?f.appendChild(e):e},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+h().join().replace(/\w+/g,function(a){return b[a]=c(a),f.createElement(a),'c("'+a+'")'})+");return n}")(k,f)}function j(a){var b;return a.documentShived?a:(k.shivCSS&&!e&&(b=!!g(a,"article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio{display:none}canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden]{display:none}audio[controls]{display:inline-block;*display:inline;*zoom:1}mark{background:#FF0;color:#000}")),f||(b=!i(a)),b&&(a.documentShived=b),a)}var c=a.html5||{},d=/^<|^(?:button|form|map|select|textarea)$/i,e,f;(function(){var a=b.createElement("a");a.innerHTML="<xyz></xyz>",e="hidden"in a,f=a.childNodes.length==1||function(){try{b.createElement("a")}catch(a){return!0}var c=b.createDocumentFragment();return typeof c.cloneNode=="undefined"||typeof c.createDocumentFragment=="undefined"||typeof c.createElement=="undefined"}()})();var k={elements:c.elements||"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video",shivCSS:c.shivCSS!==!1,shivMethods:c.shivMethods!==!1,type:"default",shivDocument:j};a.html5=k,j(b)}(this,b),e._version=d,e}(this,this.document),function(a,b,c){function d(a){return o.call(a)=="[object Function]"}function e(a){return typeof a=="string"}function f(){}function g(a){return!a||a=="loaded"||a=="complete"||a=="uninitialized"}function h(){var a=p.shift();q=1,a?a.t?m(function(){(a.t=="c"?B.injectCss:B.injectJs)(a.s,0,a.a,a.x,a.e,1)},0):(a(),h()):q=0}function i(a,c,d,e,f,i,j){function k(b){if(!o&&g(l.readyState)&&(u.r=o=1,!q&&h(),l.onload=l.onreadystatechange=null,b)){a!="img"&&m(function(){t.removeChild(l)},50);for(var d in y[c])y[c].hasOwnProperty(d)&&y[c][d].onload()}}var j=j||B.errorTimeout,l={},o=0,r=0,u={t:d,s:c,e:f,a:i,x:j};y[c]===1&&(r=1,y[c]=[],l=b.createElement(a)),a=="object"?l.data=c:(l.src=c,l.type=a),l.width=l.height="0",l.onerror=l.onload=l.onreadystatechange=function(){k.call(this,r)},p.splice(e,0,u),a!="img"&&(r||y[c]===2?(t.insertBefore(l,s?null:n),m(k,j)):y[c].push(l))}function j(a,b,c,d,f){return q=0,b=b||"j",e(a)?i(b=="c"?v:u,a,b,this.i++,c,d,f):(p.splice(this.i++,0,a),p.length==1&&h()),this}function k(){var a=B;return a.loader={load:j,i:0},a}var l=b.documentElement,m=a.setTimeout,n=b.getElementsByTagName("script")[0],o={}.toString,p=[],q=0,r="MozAppearance"in l.style,s=r&&!!b.createRange().compareNode,t=s?l:n.parentNode,l=a.opera&&o.call(a.opera)=="[object Opera]",l=!!b.attachEvent&&!l,u=r?"object":l?"script":"img",v=l?"script":u,w=Array.isArray||function(a){return o.call(a)=="[object Array]"},x=[],y={},z={timeout:function(a,b){return b.length&&(a.timeout=b[0]),a}},A,B;B=function(a){function b(a){var a=a.split("!"),b=x.length,c=a.pop(),d=a.length,c={url:c,origUrl:c,prefixes:a},e,f,g;for(f=0;f<d;f++)g=a[f].split("="),(e=z[g.shift()])&&(c=e(c,g));for(f=0;f<b;f++)c=x[f](c);return c}function g(a,e,f,g,i){var j=b(a),l=j.autoCallback;j.url.split(".").pop().split("?").shift(),j.bypass||(e&&(e=d(e)?e:e[a]||e[g]||e[a.split("/").pop().split("?")[0]]||h),j.instead?j.instead(a,e,f,g,i):(y[j.url]?j.noexec=!0:y[j.url]=1,f.load(j.url,j.forceCSS||!j.forceJS&&"css"==j.url.split(".").pop().split("?").shift()?"c":c,j.noexec,j.attrs,j.timeout),(d(e)||d(l))&&f.load(function(){k(),e&&e(j.origUrl,i,g),l&&l(j.origUrl,i,g),y[j.url]=2})))}function i(a,b){function c(a,c){if(a){if(e(a))c||(j=function(){var a=[].slice.call(arguments);k.apply(this,a),l()}),g(a,j,b,0,h);else if(Object(a)===a)for(n in m=function(){var b=0,c;for(c in a)a.hasOwnProperty(c)&&b++;return b}(),a)a.hasOwnProperty(n)&&(!c&&!--m&&(d(j)?j=function(){var a=[].slice.call(arguments);k.apply(this,a),l()}:j[n]=function(a){return function(){var b=[].slice.call(arguments);a&&a.apply(this,b),l()}}(k[n])),g(a[n],j,b,n,h))}else!c&&l()}var h=!!a.test,i=a.load||a.both,j=a.callback||f,k=j,l=a.complete||f,m,n;c(h?a.yep:a.nope,!!i),i&&c(i)}var j,l,m=this.yepnope.loader;if(e(a))g(a,0,m,0);else if(w(a))for(j=0;j<a.length;j++)l=a[j],e(l)?g(l,0,m,0):w(l)?B(l):Object(l)===l&&i(l,m);else Object(a)===a&&i(a,m)},B.addPrefix=function(a,b){z[a]=b},B.addFilter=function(a){x.push(a)},B.errorTimeout=1e4,b.readyState==null&&b.addEventListener&&(b.readyState="loading",b.addEventListener("DOMContentLoaded",A=function(){b.removeEventListener("DOMContentLoaded",A,0),b.readyState="complete"},0)),a.yepnope=k(),a.yepnope.executeStack=h,a.yepnope.injectJs=function(a,c,d,e,i,j){var k=b.createElement("script"),l,o,e=e||B.errorTimeout;k.src=a;for(o in d)k.setAttribute(o,d[o]);c=j?h:c||f,k.onreadystatechange=k.onload=function(){!l&&g(k.readyState)&&(l=1,c(),k.onload=k.onreadystatechange=null)},m(function(){l||(l=1,c(1))},e),i?k.onload():n.parentNode.insertBefore(k,n)},a.yepnope.injectCss=function(a,c,d,e,g,i){var e=b.createElement("link"),j,c=i?h:c||f;e.href=a,e.rel="stylesheet",e.type="text/css";for(j in d)e.setAttribute(j,d[j]);g||(n.parentNode.insertBefore(e,n),m(c,0))}}(this,document),Modernizr.load=function(){yepnope.apply(window,[].slice.call(arguments,0))}; \ No newline at end of file
+;window.Modernizr=function(a,b,c){function t(a){i.cssText=a}function u(a,b){return t(prefixes.join(a+";")+(b||""))}function v(a,b){return typeof a===b}function w(a,b){return!!~(""+a).indexOf(b)}function x(a,b,d){for(var e in a){var f=b[a[e]];if(f!==c)return d===!1?a[e]:v(f,"function")?f.bind(d||b):f}return!1}var d="2.6.1",e={},f=b.documentElement,g="modernizr",h=b.createElement(g),i=h.style,j,k={}.toString,l={},m={},n={},o=[],p=o.slice,q,r={}.hasOwnProperty,s;!v(r,"undefined")&&!v(r.call,"undefined")?s=function(a,b){return r.call(a,b)}:s=function(a,b){return b in a&&v(a.constructor.prototype[b],"undefined")},Function.prototype.bind||(Function.prototype.bind=function(b){var c=this;if(typeof c!="function")throw new TypeError;var d=p.call(arguments,1),e=function(){if(this instanceof e){var a=function(){};a.prototype=c.prototype;var f=new a,g=c.apply(f,d.concat(p.call(arguments)));return Object(g)===g?g:f}return c.apply(b,d.concat(p.call(arguments)))};return e}),l.sessionstorage=function(){try{return sessionStorage.setItem(g,g),sessionStorage.removeItem(g),!0}catch(a){return!1}};for(var y in l)s(l,y)&&(q=y.toLowerCase(),e[q]=l[y](),o.push((e[q]?"":"no-")+q));return e.addTest=function(a,b){if(typeof a=="object")for(var d in a)s(a,d)&&e.addTest(d,a[d]);else{a=a.toLowerCase();if(e[a]!==c)return e;b=typeof b=="function"?b():b,enableClasses&&(f.className+=" "+(b?"":"no-")+a),e[a]=b}return e},t(""),h=j=null,function(a,b){function k(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x<style>"+b+"</style>",d.insertBefore(c.lastChild,d.firstChild)}function l(){var a=r.elements;return typeof a=="string"?a.split(" "):a}function m(a){var b=i[a[g]];return b||(b={},h++,a[g]=h,i[h]=b),b}function n(a,c,f){c||(c=b);if(j)return c.createElement(a);f||(f=m(c));var g;return f.cache[a]?g=f.cache[a].cloneNode():e.test(a)?g=(f.cache[a]=f.createElem(a)).cloneNode():g=f.createElem(a),g.canHaveChildren&&!d.test(a)?f.frag.appendChild(g):g}function o(a,c){a||(a=b);if(j)return a.createDocumentFragment();c=c||m(a);var d=c.frag.cloneNode(),e=0,f=l(),g=f.length;for(;e<g;e++)d.createElement(f[e]);return d}function p(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return r.shivMethods?n(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+l().join().replace(/\w+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(r,b.frag)}function q(a){a||(a=b);var c=m(a);return r.shivCSS&&!f&&!c.hasCSS&&(c.hasCSS=!!k(a,"article,aside,figcaption,figure,footer,header,hgroup,nav,section{display:block}mark{background:#FF0;color:#000}")),j||p(a,c),a}var c=a.html5||{},d=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,e=/^<|^(?:a|b|button|code|div|fieldset|form|h1|h2|h3|h4|h5|h6|i|iframe|img|input|label|li|link|ol|option|p|param|q|script|select|span|strong|style|table|tbody|td|textarea|tfoot|th|thead|tr|ul)$/i,f,g="_html5shiv",h=0,i={},j;(function(){try{var a=b.createElement("a");a.innerHTML="<xyz></xyz>",f="hidden"in a,j=a.childNodes.length==1||function(){b.createElement("a");var a=b.createDocumentFragment();return typeof a.cloneNode=="undefined"||typeof a.createDocumentFragment=="undefined"||typeof a.createElement=="undefined"}()}catch(c){f=!0,j=!0}})();var r={elements:c.elements||"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video",shivCSS:c.shivCSS!==!1,supportsUnknownElements:j,shivMethods:c.shivMethods!==!1,type:"default",shivDocument:q,createElement:n,createDocumentFragment:o};a.html5=r,q(b)}(this,b),e._version=d,e}(this,this.document),function(a,b,c){function d(a){return"[object Function]"==o.call(a)}function e(a){return"string"==typeof a}function f(){}function g(a){return!a||"loaded"==a||"complete"==a||"uninitialized"==a}function h(){var a=p.shift();q=1,a?a.t?m(function(){("c"==a.t?B.injectCss:B.injectJs)(a.s,0,a.a,a.x,a.e,1)},0):(a(),h()):q=0}function i(a,c,d,e,f,i,j){function k(b){if(!o&&g(l.readyState)&&(u.r=o=1,!q&&h(),l.onload=l.onreadystatechange=null,b)){"img"!=a&&m(function(){t.removeChild(l)},50);for(var d in y[c])y[c].hasOwnProperty(d)&&y[c][d].onload()}}var j=j||B.errorTimeout,l=b.createElement(a),o=0,r=0,u={t:d,s:c,e:f,a:i,x:j};1===y[c]&&(r=1,y[c]=[]),"object"==a?l.data=c:(l.src=c,l.type=a),l.width=l.height="0",l.onerror=l.onload=l.onreadystatechange=function(){k.call(this,r)},p.splice(e,0,u),"img"!=a&&(r||2===y[c]?(t.insertBefore(l,s?null:n),m(k,j)):y[c].push(l))}function j(a,b,c,d,f){return q=0,b=b||"j",e(a)?i("c"==b?v:u,a,b,this.i++,c,d,f):(p.splice(this.i++,0,a),1==p.length&&h()),this}function k(){var a=B;return a.loader={load:j,i:0},a}var l=b.documentElement,m=a.setTimeout,n=b.getElementsByTagName("script")[0],o={}.toString,p=[],q=0,r="MozAppearance"in l.style,s=r&&!!b.createRange().compareNode,t=s?l:n.parentNode,l=a.opera&&"[object Opera]"==o.call(a.opera),l=!!b.attachEvent&&!l,u=r?"object":l?"script":"img",v=l?"script":u,w=Array.isArray||function(a){return"[object Array]"==o.call(a)},x=[],y={},z={timeout:function(a,b){return b.length&&(a.timeout=b[0]),a}},A,B;B=function(a){function b(a){var a=a.split("!"),b=x.length,c=a.pop(),d=a.length,c={url:c,origUrl:c,prefixes:a},e,f,g;for(f=0;f<d;f++)g=a[f].split("="),(e=z[g.shift()])&&(c=e(c,g));for(f=0;f<b;f++)c=x[f](c);return c}function g(a,e,f,g,h){var i=b(a),j=i.autoCallback;i.url.split(".").pop().split("?").shift(),i.bypass||(e&&(e=d(e)?e:e[a]||e[g]||e[a.split("/").pop().split("?")[0]]),i.instead?i.instead(a,e,f,g,h):(y[i.url]?i.noexec=!0:y[i.url]=1,f.load(i.url,i.forceCSS||!i.forceJS&&"css"==i.url.split(".").pop().split("?").shift()?"c":c,i.noexec,i.attrs,i.timeout),(d(e)||d(j))&&f.load(function(){k(),e&&e(i.origUrl,h,g),j&&j(i.origUrl,h,g),y[i.url]=2})))}function h(a,b){function c(a,c){if(a){if(e(a))c||(j=function(){var a=[].slice.call(arguments);k.apply(this,a),l()}),g(a,j,b,0,h);else if(Object(a)===a)for(n in m=function(){var b=0,c;for(c in a)a.hasOwnProperty(c)&&b++;return b}(),a)a.hasOwnProperty(n)&&(!c&&!--m&&(d(j)?j=function(){var a=[].slice.call(arguments);k.apply(this,a),l()}:j[n]=function(a){return function(){var b=[].slice.call(arguments);a&&a.apply(this,b),l()}}(k[n])),g(a[n],j,b,n,h))}else!c&&l()}var h=!!a.test,i=a.load||a.both,j=a.callback||f,k=j,l=a.complete||f,m,n;c(h?a.yep:a.nope,!!i),i&&c(i)}var i,j,l=this.yepnope.loader;if(e(a))g(a,0,l,0);else if(w(a))for(i=0;i<a.length;i++)j=a[i],e(j)?g(j,0,l,0):w(j)?B(j):Object(j)===j&&h(j,l);else Object(a)===a&&h(a,l)},B.addPrefix=function(a,b){z[a]=b},B.addFilter=function(a){x.push(a)},B.errorTimeout=1e4,null==b.readyState&&b.addEventListener&&(b.readyState="loading",b.addEventListener("DOMContentLoaded",A=function(){b.removeEventListener("DOMContentLoaded",A,0),b.readyState="complete"},0)),a.yepnope=k(),a.yepnope.executeStack=h,a.yepnope.injectJs=function(a,c,d,e,i,j){var k=b.createElement("script"),l,o,e=e||B.errorTimeout;k.src=a;for(o in d)k.setAttribute(o,d[o]);c=j?h:c||f,k.onreadystatechange=k.onload=function(){!l&&g(k.readyState)&&(l=1,c(),k.onload=k.onreadystatechange=null)},m(function(){l||(l=1,c(1))},e),i?k.onload():n.parentNode.insertBefore(k,n)},a.yepnope.injectCss=function(a,c,d,e,g,i){var e=b.createElement("link"),j,c=i?h:c||f;e.href=a,e.rel="stylesheet",e.type="text/css";for(j in d)e.setAttribute(j,d[j]);g||(n.parentNode.insertBefore(e,n),m(c,0))}}(this,document),Modernizr.load=function(){yepnope.apply(window,[].slice.call(arguments,0))}; \ No newline at end of file