diff options
96 files changed, 6106 insertions, 210 deletions
diff --git a/bin/populate_bing_cache b/bin/populate_bing_cache new file mode 100755 index 000000000..a3bef6759 --- /dev/null +++ b/bin/populate_bing_cache @@ -0,0 +1,58 @@ +#!/usr/bin/perl + +use strict; +use warnings; +require 5.8.0; + +use Data::Dumper; + +use FixMyStreet::App; +use FixMyStreet::Geocode::Bing; + +my $reports = FixMyStreet::App->model('DB::Problem')->search( + { + geocode => undef, + confirmed => { '!=', undef }, + latitude => { '!=', 0 }, + longitude => { '!=', 0 }, + }, + { + select => [qw/id geocode confirmed latitude longitude/], + order_by => { -desc => 'confirmed' } + } +); + +my $num_reports = $reports->count(); +print "Found $num_reports lacking geocode information\n"; + +my $time_to_do = ( $num_reports * 10 ) / 60 / 60; +if ( $time_to_do > 24 ) { + my $days = $time_to_do / 24; + my $hours = $time_to_do % 24; + printf( "Should take %d days and %d hours to finish\n", $days, $hours ); +} +elsif ( $time_to_do < 1 ) { + printf( "Should take %d minutes to finish\n", $time_to_do * 60 ); +} +else { + my $mins = ( $num_reports * 10 ) / 60 % 60; + printf( "Should take %d hours and %d minutes to finish\n", + $time_to_do, $mins ); +} + +while ( my $report = $reports->next ) { + $num_reports--; + next unless $report->latitude && $report->longitude; + next if $report->geocode; + + my $j = FixMyStreet::Geocode::Bing::reverse( $report->latitude, + $report->longitude ); + + $report->geocode($j); + $report->update; + + print "$num_reports left to populate\n" unless $num_reports % 100; + sleep 10; +} + +print "done\n"; diff --git a/bin/send-reports b/bin/send-reports index 648e83192..427d02ec8 100755 --- a/bin/send-reports +++ b/bin/send-reports @@ -92,7 +92,7 @@ while (my $row = $unsent->next) { } if ( $row->used_map ) { - $h{closest_address} = $cobrand->find_closest( $h{latitude}, $h{longitude} ); + $h{closest_address} = $cobrand->find_closest( $h{latitude}, $h{longitude}, $row ); } my (@to, @recips, $template, $areas_info, @open311_councils); @@ -273,8 +273,18 @@ while (my $row = $unsent->next) { $open311->endpoints( { services => 'Services', requests => 'Requests' } ); } + # required to get round issues with CRM constraints + if ( $row->council =~ /2218/ ) { + $row->user->name( $row->user->id . ' ' . $row->user->name ); + } + 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->discard_changes(); + } + if ( $resp ) { $row->external_id( $resp ); $result *= 0; diff --git a/commonlib b/commonlib -Subproject f2532c104a1268b536f79b13c52bdc0d7fb4d7a +Subproject 7486b07a4a865f977df04c3c34de759126c014e diff --git a/data/openlayers.fixmystreet.cfg b/data/openlayers.fixmystreet.cfg index c2c06a9ed..faeb3ed50 100644 --- a/data/openlayers.fixmystreet.cfg +++ b/data/openlayers.fixmystreet.cfg @@ -16,6 +16,7 @@ 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 diff --git a/db/schema.sql b/db/schema.sql index fcd137919..395d1c07b 100644 --- a/db/schema.sql +++ b/db/schema.sql @@ -188,7 +188,8 @@ create table problem ( whensent timestamp, send_questionnaire boolean not null default 't', extra text, -- extra fields required for open311 - flagged boolean not null default 'f' + flagged boolean not null default 'f', + geocode bytea ); create index problem_state_latitude_longitude_idx on problem(state, latitude, longitude); create index problem_user_id_idx on problem ( user_id ); diff --git a/db/schema_0012-add_gecode_column_to_problem.sql b/db/schema_0012-add_gecode_column_to_problem.sql new file mode 100644 index 000000000..730212ead --- /dev/null +++ b/db/schema_0012-add_gecode_column_to_problem.sql @@ -0,0 +1,7 @@ + +begin; + +ALTER table problem + ADD column geocode BYTEA; + +commit; diff --git a/locale/nb_NO.UTF-8/LC_MESSAGES/FixMyStreet.po b/locale/nb_NO.UTF-8/LC_MESSAGES/FixMyStreet.po index 946f052aa..ee61ebdae 100644 --- a/locale/nb_NO.UTF-8/LC_MESSAGES/FixMyStreet.po +++ b/locale/nb_NO.UTF-8/LC_MESSAGES/FixMyStreet.po @@ -441,7 +441,7 @@ msgstr "" #: templates/web/default/admin/stats.html:80 msgid "By Date" -msgstr "" +msgstr "På dato" #: templates/web/default/admin/council_contacts.html:26 #: templates/web/default/admin/index.html:36 @@ -478,21 +478,19 @@ msgstr "Bytt passord" #: templates/web/default/report/display.html:85 #: templates/web/default/report/display.html:87 msgid "Closed" -msgstr "" +msgstr "Lukket" #: perllib/FixMyStreet/DB/Result/Problem.pm:627 -#, fuzzy msgid "Closed by council" msgstr "(ikke rapportert til administrasjonen)" #: templates/web/default/my/my.html:32 -#, fuzzy msgid "Closed reports" msgstr "Fiksede rapporter" #: templates/web/default/admin/problem_row.html:25 msgid "Closed:" -msgstr "" +msgstr "Lukket:" #: templates/web/default/around/display_location.html:102 #: templates/web/default/around/display_location.html:104 @@ -507,34 +505,33 @@ msgstr "Koordinater:" #: templates/web/default/admin/list_updates.html:13 #: templates/web/default/admin/search_reports.html:19 msgid "Cobrand" -msgstr "" +msgstr "Merkevaresamarbeid" #: templates/web/default/admin/report_edit.html:39 #: templates/web/default/admin/update_edit.html:41 msgid "Cobrand data:" -msgstr "" +msgstr "Merkevaresamarbeidsdata:" #: templates/web/default/admin/report_edit.html:38 #: templates/web/default/admin/update_edit.html:40 msgid "Cobrand:" -msgstr "" +msgstr "Merkevaresamarbeid:" #: perllib/FixMyStreet/App/Controller/Admin.pm:349 -#, fuzzy msgid "Configuration updated" -msgstr "Bekreftelse" +msgstr "Oppsett oppdatert" #: perllib/FixMyStreet/App/Controller/Admin.pm:359 msgid "Configuration updated - contacts will be generated automatically later" -msgstr "" +msgstr "Oppsett oppdatert - kontakter vil bli generert automatisk senere" #: templates/web/default/admin/council_contacts.html:119 msgid "Configure Open311" -msgstr "" +msgstr "Sett opp Open311" #: templates/web/default/admin/council_contacts.html:96 msgid "Configure Open311 integration" -msgstr "" +msgstr "Sett opp Open311-integrasjon" #: templates/web/default/admin/council_contacts.html:33 msgid "Confirm" @@ -610,9 +607,8 @@ msgstr "Administrasjonskontakter for %s" #: templates/web/default/admin/stats.html:84 #: templates/web/default/admin/user_edit.html:12 -#, fuzzy msgid "Council:" -msgstr "Administrasjon" +msgstr "Administrasjon:" #: templates/web/default/admin/council_list.html:36 msgid "Councils" @@ -662,10 +658,9 @@ msgstr "Slettet" msgid "Details:" msgstr "Detaljer:" -# Trenger kontekst / Needs context #: templates/web/default/admin/council_list.html:23 msgid "Diligency prize league table" -msgstr "" +msgstr "Arbeidshester" #: templates/web/default/auth/general.html:32 msgid "Do you have a FixMyStreet password?" @@ -690,9 +685,8 @@ msgid "Editing update %d" msgstr "Redigerer oppdatering %d" #: templates/web/default/admin/user_edit.html:1 -#, fuzzy msgid "Editing user %d" -msgstr "Redigerer oppdatering %d" +msgstr "Redigerer bruker %d" #: templates/web/default/admin/council_edit.html:45 msgid "Editor" @@ -880,15 +874,13 @@ msgstr "Løst" #: templates/web/default/admin/report_edit.html:22 #: templates/web/default/admin/report_edit.html:25 -#, fuzzy msgid "Fixed - Council" -msgstr "Administrasjon" +msgstr "Løst - Administrasjon" #: templates/web/default/admin/report_edit.html:22 #: templates/web/default/admin/report_edit.html:25 -#, fuzzy msgid "Fixed - User" -msgstr "Fiksede rapporter" +msgstr "Løst - Bruker" #: templates/web/default/my/my.html:27 msgid "Fixed reports" @@ -903,7 +895,6 @@ msgid "Flag user" msgstr "Flag bruker" #: templates/web/default/admin/search_users.html:15 -#, fuzzy msgid "Flagged" msgstr "Flagget:" @@ -1089,7 +1080,7 @@ msgstr "Ugyldig valg av feed" #: templates/web/default/report/display.html:85 #: templates/web/default/report/display.html:87 msgid "In Progress" -msgstr "" +msgstr "Under arbeid" #: templates/web/default/open311/index.html:21 msgid "" @@ -1135,9 +1126,8 @@ msgstr "Ugyldig startdato" #: templates/web/default/admin/report_edit.html:23 #: templates/web/default/report/display.html:85 #: templates/web/default/report/display.html:86 -#, fuzzy msgid "Investigating" -msgstr "Navigasjon" +msgstr "Undersøkes" #: templates/web/emptyhomes/tokens/confirm_problem.html:12 #: templates/web/emptyhomes/tokens/confirm_problem.html:14 @@ -1229,9 +1219,8 @@ msgid "Missing jurisdiction_id" msgstr "Mangler jurisdiction_id" #: templates/web/default/admin/stats.html:11 -#, fuzzy msgid "Month" -msgstr "Antall" +msgstr "Måned" #: templates/web/default/report/display.html:31 msgid "More problems nearby" @@ -1377,9 +1366,8 @@ msgstr "Nei" #: templates/web/default/admin/stats.html:85 #: templates/web/default/admin/user_edit.html:13 -#, fuzzy msgid "No council" -msgstr "administrasjon" +msgstr "Ingen administrasjon" #: perllib/FixMyStreet/DB/Result/Problem.pm:297 msgid "No council selected" @@ -1549,9 +1537,8 @@ msgstr "" "fixmystreet\">tilgjengelig på GitHub</a>." #: templates/web/default/admin/list_updates.html:11 -#, fuzzy msgid "Owner" -msgstr "Annet" +msgstr "Eier" #: templates/web/default/errors/page_error_404_not_found.html:1 #: templates/web/default/errors/page_error_404_not_found.html:3 @@ -1587,7 +1574,7 @@ msgstr "Bilder av nye problemer i nærheten" #: templates/web/default/report/display.html:85 #: templates/web/default/report/display.html:86 msgid "Planned" -msgstr "" +msgstr "Planlagt" #: templates/web/default/report/new/notes.html:6 msgid "Please be polite, concise and to the point." @@ -1812,9 +1799,8 @@ msgid "Posted anonymously at %s" msgstr "Publisert anonymt %s" #: templates/web/default/report/updates.html:11 -#, fuzzy msgid "Posted by %s (<strong>%s</strong>) at %s" -msgstr "Note: <strong>%d</strong>" +msgstr "Lagt inn av %s (<strong>%s</strong>) %s" #: templates/web/default/report/updates.html:13 msgid "Posted by %s at %s" @@ -2141,9 +2127,8 @@ msgstr "Søk i rapporter" #: perllib/FixMyStreet/App/Controller/Admin.pm:981 #: templates/web/default/admin/search_users.html:1 -#, fuzzy msgid "Search Users" -msgstr "Søk i rapporter" +msgstr "Søk i brukere" #: templates/web/default/admin/search_abuse.html:4 #: templates/web/default/admin/search_reports.html:5 @@ -2233,7 +2218,7 @@ msgstr "Logget inn som %s" #: templates/web/default/report/new/fill_in_details_text.html:1 msgid "Some categories may require additional information." -msgstr "" +msgstr "Noen kategorier krever kanskje mer informasjon" #: templates/web/default/alert/index.html:31 msgid "Some photos of recent reports" @@ -2665,10 +2650,9 @@ msgstr "" "igjen." #: perllib/FixMyStreet/App/Controller/Report/Update.pm:214 -#, fuzzy msgid "There was a problem with your update. Please try again." msgstr "" -"Det var problemer med din epost/passord-kombinasjon. Vær så snill å forsøk " +"Det var problemer med din oppdatering. Vær så snill å forsøk " "igjen." #: perllib/FixMyStreet/App/Controller/Contact.pm:117 @@ -2713,7 +2697,7 @@ msgstr "" #: perllib/FixMyStreet/App/Controller/Report/New.pm:761 msgid "This information is required" -msgstr "" +msgstr "Denne informasjonen er påkrevd" #: templates/web/default/debug_header.html:3 msgid "" @@ -2742,9 +2726,8 @@ msgstr "" "administrasjon for å se problemer som er sendt dit." #: perllib/FixMyStreet/Cobrand/Default.pm:926 -#, fuzzy msgid "This problem has been closed" -msgstr "Dette problemet er løst" +msgstr "Dette problemet er lukket" #: perllib/FixMyStreet/Cobrand/Default.pm:922 #: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:117 @@ -2757,18 +2740,16 @@ msgid "This problem has not been fixed" msgstr "Dette problemet har ikke blitt løst" #: perllib/FixMyStreet/Cobrand/Default.pm:931 -#, fuzzy msgid "This problem is in progress" -msgstr "Dette problemet er løst" +msgstr "Dette problemet er under arbeid" #: perllib/FixMyStreet/Cobrand/Default.pm:918 msgid "This problem is old and of unknown status." msgstr "Dette problemet er gammel og med ukjent status." #: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:79 -#, fuzzy msgid "This report is currently marked as closed." -msgstr "Denne rapporten er for tiden markert som åpen." +msgstr "Denne rapporten er for tiden markert som lukket." #: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:77 msgid "This report is currently marked as fixed." @@ -2858,19 +2839,16 @@ msgid "Update by {{name}}" msgstr "Oppdatert av {{name}}" #: templates/web/default/admin/update_edit.html:33 -#, fuzzy msgid "Update changed problem state to %s" -msgstr "Oppdatering %s opprettet for problem %d, av %s" +msgstr "En oppdatering endret problemets status til %s" #: templates/web/default/admin/update_edit.html:35 -#, fuzzy msgid "Update marked problem as fixed" msgstr "En oppdatering markerte dette problemet som fikset." #: templates/web/default/admin/update_edit.html:37 -#, fuzzy msgid "Update reopened problem" -msgstr "Oppdatering %s opprettet for problem %d, av %s" +msgstr "En oppdatering gjennåpnet problemet" #: templates/web/default/admin/council_contacts.html:53 msgid "Update statuses" @@ -3051,9 +3029,8 @@ msgstr "" "lese. Det samme gjelder manglende tegnsetting." #: templates/web/default/admin/stats.html:10 -#, fuzzy msgid "Year" -msgstr "Sluttår:" +msgstr "År" #: templates/web/default/admin/council_contacts.html:39 #: templates/web/default/admin/council_contacts.html:40 @@ -3258,9 +3235,8 @@ msgid "less than a minute" msgstr "mindre enn et minutt" #: templates/web/default/report/updates.html:18 -#, fuzzy msgid "marked as %s" -msgstr "markert som fikset" +msgstr "markert som %s" #: templates/web/default/report/updates.html:16 msgid "marked as fixed" @@ -3311,12 +3287,11 @@ msgstr "brukte kart" #: templates/web/default/admin/update_edit.html:26 msgid "user is from same council as problem - %d" -msgstr "" +msgstr "bruker er fra samme administrasjon som problemet - %d" #: templates/web/default/admin/update_edit.html:29 -#, fuzzy msgid "user is problem owner" -msgstr "Flere problemer i nærheten" +msgstr "bruker er eier av problemet" #: templates/web/default/reports/council.html:0 #: templates/web/default/reports/council.html:3 diff --git a/locale/nn_NO.UTF-8/LC_MESSAGES/.gitignore b/locale/nn_NO.UTF-8/LC_MESSAGES/.gitignore new file mode 100644 index 000000000..214d1b7ed --- /dev/null +++ b/locale/nn_NO.UTF-8/LC_MESSAGES/.gitignore @@ -0,0 +1 @@ +/FixMyStreet.mo diff --git a/locale/nn_NO.UTF-8/LC_MESSAGES/FixMyStreet.po b/locale/nn_NO.UTF-8/LC_MESSAGES/FixMyStreet.po new file mode 100644 index 000000000..b4ec194a8 --- /dev/null +++ b/locale/nn_NO.UTF-8/LC_MESSAGES/FixMyStreet.po @@ -0,0 +1,3226 @@ +# translation of FixMyStreet.po to Norwegian Bokmål +# FixMyStreet original .po file, autogenerated by gettext-extract. +# Copyright (C) 2008 UK Citizens Online Democracy +# This file is distributed under the same license as the main FixMyStreet code. +# +# Matthew Somerville <matthew@mysociety.org>, 2008-04-15. +# Petter Reinholdtsen <pere@hungry.com>, 2011. +# Anders Einar Hilden <hildenae@gmail.com>, 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: 1.0\n" +"Report-Msgid-Bugs-To: matthew@mysociety.org\n" +"POT-Creation-Date: 2011-10-21 15:56+0100\n" +"PO-Revision-Date: 2011-12-08 10:56+0100\n" +"Language-Team: Norwegian Nynorsk <i18n-nn@lister.ping.uio.no>\n" +"Last-Translator: Anders Einar Hilden <hildenae@gmail.com>\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" + +#: bin/send-reports:183 perllib/FixMyStreet/DB/Result/Problem.pm:535 +msgid " and " +msgstr " og " + +#: templates/web/default/tokens/confirm_problem.html:10 +#: templates/web/default/tokens/confirm_problem.html:6 +msgid " and <strong>we will now send it to the council</strong>" +msgstr " og <strong>vi sender det no til administrasjonen</strong>" + +#: templates/web/default/report/new/councils_text_all.html:10 +#: templates/web/default/report/new/councils_text_all.html:3 +#: templates/web/default/report/new/councils_text_none.html:14 +#: templates/web/default/report/new/councils_text_none.html:17 +#: templates/web/default/report/new/councils_text_some.html:20 +#: templates/web/default/report/new/councils_text_some.html:23 +#: templates/web/default/report/new/councils_text_some.html:5 +#: templates/web/emptyhomes/report/new/all_councils_text.html:2 +msgid " or " +msgstr " eller " + +#: templates/web/default/admin/council_list.html:17 +msgid "%d addresses" +msgstr "%d adresser" + +#: templates/web/default/admin/index.html:17 +msgid "%d confirmed alerts, %d unconfirmed" +msgstr "%d stadfesta varsel, %d ikkje stadfesta" + +#: templates/web/default/admin/index.html:19 +msgid "%d council contacts – %d confirmed, %d unconfirmed" +msgstr "%d administrasjonskontaktar – %d stadfesta, %d ikkje stadfesta" + +#: perllib/Utils.pm:252 +msgid "%d day" +msgstr "%d dag" + +#: perllib/Utils.pm:252 +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:253 +msgid "%d hour" +msgstr "%d time" + +#: perllib/Utils.pm:253 +msgid "%d hours" +msgstr "%d timar" + +#: templates/web/default/admin/index.html:16 +msgid "%d live updates" +msgstr "%d aktive oppdateringar" + +#: perllib/Utils.pm:254 +msgid "%d minute" +msgstr "%d minutt" + +#: perllib/Utils.pm:254 +msgid "%d minutes" +msgstr "%d minutt" + +#: templates/web/default/admin/index.html:18 +msgid "%d questionnaires sent – %d answered (%s%%)" +msgstr "%d spørjeskjema sendt – %d svart (%s%%)" + +#: perllib/Utils.pm:251 +msgid "%d week" +msgstr "%d veke" + +#: perllib/Utils.pm:251 +msgid "%d weeks" +msgstr "%d veker" + +#: templates/web/default/reports/council.html +#: templates/web/default/reports/council.html:14 +msgid "%s - Summary reports" +msgstr "%s – oppsummeringsrapportar" + +#: perllib/FixMyStreet/Cobrand/Default.pm:844 +#: perllib/FixMyStreet/Cobrand/Default.pm:858 +msgid "%s ward, %s" +msgstr "%s bydel, %s" + +#: perllib/FixMyStreet/DB/Result/Problem.pm:466 +msgid "%s, reported anonymously at %s" +msgstr "%s, rapportert anonymt %s" + +#: perllib/FixMyStreet/DB/Result/Problem.pm:468 +msgid "%s, reported by %s at %s" +msgstr "%s, rapportert av %s %s" + +#: perllib/FixMyStreet/Cobrand/Default.pm:875 +#: perllib/FixMyStreet/Cobrand/Default.pm:889 +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 — %s)" +msgstr "(Ingen grunn til å uroa seg — %s)" + +#: templates/web/default/admin/report_blocks.html:11 +msgid "(Email in abuse table)" +msgstr "(Epost i misbruktabellen)" + +#: templates/web/default/alert/list.html:53 +msgid "(a default distance which covers roughly 200,000 people)" +msgstr "(ein standardavstand som dekkjer ein folkesetnad på omtrent 200 000)" + +#: templates/web/default/alert/list.html:58 +msgid "(alternatively the RSS feed can be customised, within" +msgstr "(alternativt kan RSS-straumen tilpassast, innanfor" + +#: templates/web/default/around/around_map_list_items.html:10 +#: templates/web/default/around/on_map_list_items.html:7 +msgid "(fixed)" +msgstr "(løyst)" + +#: templates/web/default/index.html:12 templates/web/default/index.html:8 +msgid "(like graffiti, fly tipping, broken paving slabs, or street lighting)" +msgstr "(som tagging, søppel, hol i vegen, eller øydelagte gatelys)" + +#: templates/web/default/reports/council.html:133 +msgid "(not sent to council)" +msgstr "(ikkje rapportert til administrasjonen)" + +#: templates/web/default/report/new/fill_in_details_form.html:217 +msgid "(optional)" +msgstr "(valfritt)" + +#: templates/web/default/reports/council.html:131 +msgid "(sent to both)" +msgstr "(sendt til begge)" + +#: templates/web/default/report/new/fill_in_details_form.html:211 +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:217 +msgid "(we never show your email)" +msgstr "(vi viser aldri e-postadressa di)" + +#: perllib/FixMyStreet/App/Controller/Admin.pm:279 +msgid "*unknown*" +msgstr "*ukjent*" + +#: perllib/FixMyStreet/App/Controller/Report/New.pm:534 +#: perllib/FixMyStreet/App/Controller/Report/New.pm:566 +#: perllib/FixMyStreet/DB/Result/Problem.pm:314 +msgid "-- Pick a category --" +msgstr "-- Vel ein kategori --" + +#: perllib/FixMyStreet/App/Controller/Report/New.pm:520 +#: perllib/FixMyStreet/DB/Result/Problem.pm:320 +msgid "-- Pick a property type --" +msgstr "-- Vel ein eigedomstype --" + +#: templates/web/default/tokens/confirm_problem.html:14 +#: templates/web/default/tokens/confirm_problem.html:6 +msgid ". You can <a href=\"%s\">view the problem on this site</a>." +msgstr ". Du kan <a href=\"%s\">lesa om problemet på portalen</a>." + +#: templates/web/default/footer.html:13 templates/web/reading/footer.html:16 +msgid "" +"<a href=\"http://www.mysociety.org/\"><img id=\"logo\" width=\"133\" " +"height=\"26\" src=\"/i/mysociety-dark.png\" alt=\"View mySociety.org\"><span " +"id=\"logoie\"></span></a>" +msgstr "<div id=\"logo\" align=\"center\"><a href=\"http://www.nuug.no/\">Foreininga NUUG</a></div>" + +#: templates/web/default/questionnaire/completed.html:25 +msgid "" +"<p style=\"font-size:150%\">Thank you very much for filling in our " +"questionnaire; glad to hear it’s been fixed.</p>" +msgstr "<p style=\"font-size:150%\">Tusen takk for at du fylte ut spørjeskjemaet vårt. Vi er glade for å høyra at problemet ditt er løyst.</p>" + +#: templates/web/default/questionnaire/completed.html:15 +msgid "" +"<p style=\"font-size:150%%\">We’re sorry to hear that. We have two " +"suggestions: why not try\n" +"<a href=\"%s\">writing direct to your councillor(s)</a>\n" +"or, if it’s a problem that could be fixed by local people working " +"together,\n" +"why not <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øyra dette. Vi har to forslag: kva med å freista\n" +"<a href=\"%s\">å skriva direkte til representantane dine</a>, eller viss det er eit problem som kan fiksast\n" +"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/index.html:37 +msgid "" +"<p>Getting empty homes back into use can be difficult, but by now a good " +"council\n" +"will have made a lot of progress and reported what they have done on the\n" +"website. Even so properties can remain empty for many months if the owner " +"is\n" +"unwilling or the property is in very poor repair. If nothing has happened " +"or\n" +"you are not satisfied with the progress the council is making, now is the " +"right\n" +"time to say so. We think it’s a good idea to contact some other people " +"who\n" +"may be able to help or put pressure on the council For advice on how to do\n" +"this and other useful information please go to <a\n" +"href=\"http://www.emptyhomes.com/getinvolved/campaign.html\">http://www." +"emptyhomes.com/getinvolved/campaign.html</a>.</p>\n" +msgstr "" + +#: templates/web/default/questionnaire/index.html:28 +msgid "" +"<p>Getting empty homes back into use can be difficult. You shouldn’t " +"expect\n" +"the property to be back into use yet. But a good council will have started " +"work\n" +"and should have reported what they have done on the website. If you are not\n" +"satisfied with progress or information from the council, now is the right " +"time\n" +"to say. You may also want to try contacting some other people who may be " +"able\n" +"to help. For advice on how to do this and other useful information please\n" +"go to <a href=\"http://www.emptyhomes.com/getinvolved/campaign.html\">http://" +"www.emptyhomes.com/getinvolved/campaign.html</a>.</p>\n" +msgstr "" + +#: templates/web/default/questionnaire/completed.html:9 +msgid "" +"<p>Thank you very much for filling in our questionnaire; if you\n" +"get some more information about the status of your problem, please come back " +"to the\n" +"site and leave an update.</p>" +msgstr "" +"<p>Tusen takk for at du fylte ut spørjeskjemaet vårt. Viss du får meir\n" +"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:71 +#: templates/web/default/around/display_location.html:73 +msgid "" +"<small>If you cannot see the map, <a href='%s' rel='nofollow'>skip this " +"step</a>.</small>" +msgstr "<small>Viss du ikkje kan sjå kartet, <a href='%s' rel='nofollow'>hopp over dette steget</a>.</small>" + +#: templates/web/default/admin/index.html:14 +msgid "<strong>%d</strong> live problems" +msgstr "<strong>%d</strong> aktive problem" + +#: templates/web/default/auth/general.html:55 +msgid "<strong>No</strong>, I do not, let me sign in by email:" +msgstr "<strong>Nei</strong>, det gjer eg ikkje. La meg logga inn med e-post:" + +#: templates/web/default/report/new/fill_in_details_form.html:162 +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:170 +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:148 +#: templates/web/default/report/new/fill_in_details_form.html:140 +msgid "<strong>Yes</strong>, I have a password:" +msgstr "<strong>Ja</strong>, eg har eit passord:" + +#: templates/web/default/static/about.html:1 +#: templates/web/default/static/about.html:3 +#: templates/web/emptyhomes/header.html:31 +#: templates/web/emptyhomes/static/about.html:1 +#: templates/web/emptyhomes/static/about.html:3 +msgid "About us" +msgstr "Om oss" + +#: templates/web/default/admin/council_contacts.html:57 +msgid "Add new category" +msgstr "Legg til ny kategori" + +#: templates/web/default/my/my.html:56 +msgid "Added %s" +msgstr "La til %s" + +#: templates/web/default/auth/change_password.html:29 +msgid "Again:" +msgstr "Gjenta:" + +#: templates/web/default/admin/timeline.html:37 +msgid "Alert %d created for %s, type %s, parameters %s / %s" +msgstr "Varsel %d oppretta for %s, type %s, parameter %s / %s" + +#: templates/web/default/admin/timeline.html:39 +msgid "Alert %d disabled (created %s)" +msgstr "Varsel %d kobla ut (oppretta %s)" + +#: templates/web/default/report/display.html:222 +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/admin/council_list.html:44 +msgid "All confirmed" +msgstr "Alle stadfesta" + +#: templates/web/default/footer.html:8 templates/web/emptyhomes/header.html:28 +#: templates/web/fiksgatami/footer.html:7 templates/web/reading/footer.html:8 +msgid "All reports" +msgstr "Alle rapportar" + +#: 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" + +# TfL? skal ikkje det omsetjast? --KBU +#: templates/web/default/report/new/councils_text_all.html:3 +#: templates/web/default/report/new/councils_text_all.html:5 +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 "" +"All informasjonen du gjev oss her vil sendast til <strong>%s</strong> eller " +"ein relevant lokal etat som <strong>TfL</strong>, via systemet London Report-" +"It." + +#: templates/web/default/report/new/councils_text_all.html:10 +#: templates/web/default/report/new/councils_text_all.html:12 +#: templates/web/default/report/new/fill_in_details_form.html:11 +#: templates/web/default/report/new/fill_in_details_form.html:13 +msgid "" +"All the information you provide here will be sent to <strong>%s</strong>." +msgstr "" +"All informasjonen du har lagt inn her vil sendast til <strong>%s</strong>." + +#: templates/web/emptyhomes/report/new/all_councils_text.html:2 +#: templates/web/emptyhomes/report/new/all_councils_text.html:4 +msgid "" +"All the information you provide here will be sent to <strong>%s</strong>. On " +"the site, we will show the subject and details of the problem, plus your " +"name if you give us permission." +msgstr "" +"All informasjonen du legg inn her vil sendast til <strong>%s</strong>.\n" +"På dette nettestedet vil vi visa emne og detaljar om problemet,\n" +"inkludert namnet ditt dersom du gjev oss lov." + +#: templates/web/default/questionnaire/index.html:62 +msgid "An update marked this problem as fixed." +msgstr "Ei oppdatering markerte dette problemet som løyst." + +#: templates/web/default/admin/list_flagged.html:15 +#: templates/web/default/admin/list_updates.html:10 +#: templates/web/default/admin/search_reports.html:18 +msgid "Anonymous" +msgstr "Anonym" + +#: templates/web/default/admin/report_edit.html:17 +#: templates/web/default/admin/update_edit.html:14 +msgid "Anonymous:" +msgstr "Anonym:" + +#: templates/web/default/footer.html:29 +msgid "Are you a developer? Would you like to contribute to FixMyStreet?" +msgstr "Er du ein utviklar? Kunne du tenkja deg å bidra til FiksGataMi?" + +#: templates/web/default/footer.html:26 +msgid "" +"Are you from a council? Would you like better integration with FixMyStreet?" +msgstr "Er du frå det offentlege? Kunne du tenkja deg betre integrasjon med FiksGataMi?" + +#: templates/web/default/open311/index.html:17 +msgid "" +"At most %d requests are returned in each query. The returned requests are " +"ordered by requested_datetime, so to get all requests, do several searches " +"with rolling start_date and end_date." +msgstr "På det meste vert %d førespurnader returnert i kvar spørring. Dei returnerte førespurnadene vert sorterte på requested_datetime, så ein må gjera fleire søk med rullerande start_date og end_date for å få tak i alle førespurnadene." + +#: templates/web/default/open311/index.html:9 +msgid "At the moment only searching for and looking at reports work." +msgstr "For augneblunken går det berre an å søkja etter og å sjå på rapportar." + +#: templates/web/default/admin/report_blocks.html:11 +msgid "Ban email address" +msgstr "Bannlys e-postadresse" + +#: templates/web/default/footer.html:16 templates/web/reading/footer.html:14 +msgid "Built by <a href=\"http://www.mysociety.org/\">mySociety</a>" +msgstr "Bygd av <a href=\"http://www.mysociety.org/\">mySociety</a>" + +#: templates/web/fiksgatami/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 "Bygd av <a href=\"http://www.mysociety.org/\">mySociety</a> og vedlikeheldt av <a href=\"http://www.nuug.no/\">NUUG</a>" + +#: templates/web/default/admin/stats.html:80 +msgid "By Date" +msgstr "På dato" + +#: templates/web/default/admin/council_contacts.html:26 +#: templates/web/default/admin/index.html:36 +#: templates/web/default/admin/list_flagged.html:14 +#: templates/web/default/admin/search_reports.html:17 +msgid "Category" +msgstr "Kategori" + +#: templates/web/default/admin/index.html:34 +msgid "Category fix rate for problems > 4 weeks old" +msgstr "Løysingsrate fordelt på kategori for problem > 4 veker gamle" + +#: perllib/FixMyStreet/App/Controller/Report/New.pm:537 +#: perllib/FixMyStreet/App/Controller/Report/New.pm:567 +#: templates/web/default/admin/council_contacts.html:63 +#: templates/web/default/admin/council_edit.html:23 +#: templates/web/default/admin/report_edit.html:29 +#: templates/web/default/report/new/fill_in_details_form.html:67 +msgid "Category:" +msgstr "Kategori:" + +#: bin/send-reports:180 +msgid "Category: %s" +msgstr "Kategori: %s" + +#: templates/web/default/auth/change_password.html:1 +#: templates/web/default/auth/change_password.html:3 +#: templates/web/default/auth/change_password.html:33 +msgid "Change Password" +msgstr "Byt passord" + +#: templates/web/default/admin/report_edit.html:22 +#: templates/web/default/admin/report_edit.html:24 +#: templates/web/default/report/display.html:85 +#: templates/web/default/report/display.html:87 +msgid "Closed" +msgstr "Lukka" + +# skal det vera forskjellig tyding frå engelsken her? --KBU +#: perllib/FixMyStreet/DB/Result/Problem.pm:627 +msgid "Closed by council" +msgstr "(ikkje rapportert til administrasjonen)" + +#: templates/web/default/my/my.html:32 +msgid "Closed reports" +msgstr "Lukka rapportar" + +#: templates/web/default/admin/problem_row.html:25 +msgid "Closed:" +msgstr "Lukka:" + +#: templates/web/default/around/display_location.html:102 +#: templates/web/default/around/display_location.html:104 +msgid "Closest nearby problems <small>(within %skm)</small>" +msgstr "Dei næraste problema <small>(innanfor %skm)</small>" + +#: templates/web/default/admin/report_edit.html:15 +msgid "Co-ordinates:" +msgstr "Koordinatar:" + +#: templates/web/default/admin/list_flagged.html:16 +#: templates/web/default/admin/list_updates.html:13 +#: templates/web/default/admin/search_reports.html:19 +msgid "Cobrand" +msgstr "Merkevaresamarbeid" + +#: templates/web/default/admin/report_edit.html:39 +#: templates/web/default/admin/update_edit.html:41 +msgid "Cobrand data:" +msgstr "Data om merkevaresamarbeid:" + +#: templates/web/default/admin/report_edit.html:38 +#: templates/web/default/admin/update_edit.html:40 +msgid "Cobrand:" +msgstr "Merkevaresamarbeid:" + +#: perllib/FixMyStreet/App/Controller/Admin.pm:349 +msgid "Configuration updated" +msgstr "Oppsett oppdatert" + +#: perllib/FixMyStreet/App/Controller/Admin.pm:359 +msgid "Configuration updated - contacts will be generated automatically later" +msgstr "Oppsett oppdatert - kontaktar vil genererast automatisk seinare" + +#: templates/web/default/admin/council_contacts.html:119 +msgid "Configure Open311" +msgstr "Sett opp Open311" + +#: templates/web/default/admin/council_contacts.html:96 +msgid "Configure Open311 integration" +msgstr "Sett opp Open311-integrasjon" + +#: templates/web/default/admin/council_contacts.html:33 +msgid "Confirm" +msgstr "Stadfest" + +#: templates/web/default/auth/token.html:1 +msgid "Confirm account" +msgstr "Stadfest konto" + +#: 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 +msgid "Confirmation" +msgstr "Stadfesting" + +#: templates/web/default/admin/council_contacts.html:28 +#: templates/web/default/admin/council_contacts.html:73 +#: templates/web/default/admin/council_edit.html:28 +#: templates/web/default/admin/council_edit.html:43 +#: templates/web/default/admin/stats.html:5 +msgid "Confirmed" +msgstr "Stadfesta" + +#: templates/web/default/admin/problem_row.html:23 +#: templates/web/default/admin/report_edit.html:34 +msgid "Confirmed:" +msgstr "Stadfesta:" + +#: templates/web/fiksgatami/footer.html:10 +msgid "Contact" +msgstr "Kontakt" + +#: templates/web/default/footer.html:17 templates/web/reading/footer.html:15 +msgid "Contact FixMyStreet" +msgstr "Kontakt FiksGataMi" + +#: templates/web/default/contact/index.html:1 +#: templates/web/default/contact/index.html:2 +#: templates/web/default/contact/submit.html:1 +msgid "Contact Us" +msgstr "Kontakt oss" + +#: templates/web/default/contact/index.html:6 +#: templates/web/default/contact/submit.html:3 +msgid "Contact the team" +msgstr "Kontakt prosjektgruppa" + +#: perllib/FixMyStreet/App/Controller/Admin.pm:1105 +#: perllib/FixMyStreet/App/Controller/Admin.pm:1133 +msgid "Could not find user" +msgstr "Kunne ikkje finna brukaren" + +#: templates/web/default/admin/list_flagged.html:13 +#: templates/web/default/admin/list_updates.html:12 +#: templates/web/default/admin/search_reports.html:16 +#: templates/web/default/admin/search_users.html:14 +msgid "Council" +msgstr "Administrasjon" + +#: perllib/FixMyStreet/App/Controller/Admin.pm:977 +#: templates/web/default/admin/council_list.html:1 +msgid "Council contacts" +msgstr "Administrasjonskontaktar" + +#: templates/web/default/admin/council_contacts.html:1 +#: templates/web/default/admin/council_edit.html:1 +msgid "Council contacts for %s" +msgstr "Administrasjonskontaktar for %s" + +#: templates/web/default/admin/stats.html:84 +#: templates/web/default/admin/user_edit.html:12 +msgid "Council:" +msgstr "Administrasjon:" + +#: templates/web/default/admin/council_list.html:36 +msgid "Councils" +msgstr "Administrasjonar" + +#: templates/web/default/admin/stats.html:12 +#: templates/web/default/admin/stats.html:32 +msgid "Count" +msgstr "Mengd" + +#: templates/web/default/email_sent.html:1 +msgid "Create a report" +msgstr "Lag ein rapport" + +#: templates/web/default/admin/council_contacts.html:87 +msgid "Create category" +msgstr "Lag kategori" + +#: templates/web/default/admin/list_flagged.html:17 +#: templates/web/default/admin/list_updates.html:9 +#: templates/web/default/admin/search_reports.html:20 +msgid "Created" +msgstr "Oppretta" + +#: templates/web/default/admin/report_edit.html:33 +#: templates/web/default/admin/update_edit.html:42 +msgid "Created:" +msgstr "Oppretta:" + +#: templates/web/default/admin/stats.html:31 +msgid "Current state" +msgstr "Gjeldande tilstand" + +#: templates/web/default/admin/council_list.html:40 +msgid "Currently has 1+ deleted" +msgstr "For tida har 1+ sletta" + +#: templates/web/default/admin/council_contacts.html:29 +#: templates/web/default/admin/council_contacts.html:76 +#: templates/web/default/admin/council_edit.html:29 +#: templates/web/default/admin/council_edit.html:44 +msgid "Deleted" +msgstr "Sletta" + +#: templates/web/default/admin/report_edit.html:14 +#: templates/web/default/report/new/fill_in_details_form.html:61 +msgid "Details:" +msgstr "Detaljar:" + +#: templates/web/default/admin/council_list.html:23 +msgid "Diligency prize league table" +msgstr "Arbeidshestar" + +#: templates/web/default/auth/general.html:32 +msgid "Do you have a FixMyStreet password?" +msgstr "Har du eit FiksGataMi-passord?" + +#: templates/web/default/questionnaire/index.html:72 +msgid "Don’t know" +msgstr "Veit ikkje" + +#: templates/web/default/admin/list_updates.html:35 +#: templates/web/default/admin/problem_row.html:29 +#: templates/web/default/admin/search_users.html:24 +msgid "Edit" +msgstr "Rediger" + +#: templates/web/default/admin/report_edit.html:1 +msgid "Editing problem %d" +msgstr "Rediger problem %d" + +#: templates/web/default/admin/update_edit.html:1 +msgid "Editing update %d" +msgstr "Redigerer oppdatering %d" + +#: templates/web/default/admin/user_edit.html:1 +msgid "Editing user %d" +msgstr "Redigerer brukar %d" + +#: templates/web/default/admin/council_edit.html:45 +msgid "Editor" +msgstr "Oppdatert av" + +#: templates/web/default/admin/council_contacts.html:27 +#: 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 +msgid "Email" +msgstr "E-post" + +#: perllib/FixMyStreet/App/Controller/Admin.pm:1081 +msgid "Email added to abuse list" +msgstr "E-post lagd til misbrukliste" + +#: perllib/FixMyStreet/App/Controller/Admin.pm:1078 +msgid "Email already in abuse list" +msgstr "E-post allereie i misbruklista" + +#: templates/web/default/around/display_location.html:84 +msgid "Email me new local problems" +msgstr "Send meg e-post om lokale problem" + +#: templates/web/default/report/display.html:35 +msgid "Email me updates" +msgstr "Send meg oppdateringar" + +#: templates/web/default/admin/council_contacts.html:68 +#: 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:39 +msgid "Email:" +msgstr "E-post:" + +#: perllib/FixMyStreet/App/Controller/Report/New.pm:522 +msgid "Empty flat or maisonette" +msgstr "Tom leilegheit" + +#: perllib/FixMyStreet/App/Controller/Report/New.pm:521 +msgid "Empty house or bungalow" +msgstr "Tomt hus eller bungalow" + +#: perllib/FixMyStreet/App/Controller/Report/New.pm:524 +msgid "Empty office or other commercial" +msgstr "Tomt kontor eller forretningsbygg" + +#: templates/web/emptyhomes/report/new/form_heading.html:1 +msgid "Empty property details form" +msgstr "Tom eigedom detaljskjema" + +#: perllib/FixMyStreet/App/Controller/Report/New.pm:525 +msgid "Empty pub or bar" +msgstr "Tom pub eller bar" + +#: perllib/FixMyStreet/App/Controller/Report/New.pm:526 +msgid "Empty public building - school, hospital, etc." +msgstr "Tom offentleg bygning – skule, sjukehus, osb." + +#: templates/web/default/admin/stats.html:70 +msgid "End Year:" +msgstr "Sluttår:" + +#: templates/web/default/admin/stats.html:72 +msgid "End day:" +msgstr "Sluttdag:" + +#: templates/web/default/admin/stats.html:71 +msgid "End month:" +msgstr "Sluttmånad:" + +# GB – Great Britain? --KBU +#: templates/web/default/around/around_index.html:10 +#: templates/web/default/around/around_index.html:13 +#: templates/web/default/index.html:24 templates/web/default/index.html:27 +msgid "Enter a nearby GB postcode, or street name and area" +msgstr "Skriv inn GB-postnummer i nærleiken, eller vegnamn og stad" + +#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:32 +msgid "Enter a nearby postcode, or 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:177 +#: templates/web/default/report/new/fill_in_details_form.html:169 +msgid "Enter a new password:" +msgstr "Skriv inn eit nytt passord:" + +#: templates/web/default/index.html:45 +msgid "Enter details of the problem" +msgstr "Legg inn detaljar om problemet" + +#: templates/web/default/auth/token.html:5 +#: templates/web/default/errors/generic.html:1 +#: templates/web/default/errors/generic.html:3 +#: templates/web/default/tokens/abuse.html:1 +#: templates/web/default/tokens/abuse.html:3 +#: templates/web/default/tokens/error.html:1 +#: templates/web/default/tokens/error.html:3 +msgid "Error" +msgstr "Feil" + +#: templates/web/default/admin/council_contacts.html:9 +#: templates/web/default/admin/council_edit.html:18 +msgid "Example postcode %s" +msgstr "Postnummerdøme %s" + +#: templates/web/default/open311/index.html:27 +msgid "Examples:" +msgstr "Døme:" + +#: templates/web/default/contact/submit.html:15 +msgid "" +"Failed to send message. Please try again, or <a href=\"mailto:%s\">email " +"us</a>." +msgstr "Klarte ikkje å senda meldinga. Ver venleg og prøv igjen seinare eller <a href=\"mailto:%s\">send oss ein e-post</a>." + +#: templates/web/default/footer.html:27 +msgid "Find out about FixMyStreet for councils" +msgstr "Finn ut om FiksGataMi for det offentlege" + +#: templates/web/default/questionnaire/index.html:81 +msgid "First time" +msgstr "Første gong" + +#: templates/web/default/header.html:29 +#: templates/web/fiksgatami/header.html:16 templates/web/reading/header.html:31 +msgid "Fix<span id=\"my\">My</span>Street" +msgstr "Fiks<span id=\"my\">Gata</span>Mi" + +#: templates/web/default/admin/header.html:13 +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:6 +msgid "" +"FixMyStreet has a variety of RSS feeds and email alerts for local problems, " +"including\n" +"alerts for all problems within a particular ward or council, or all " +"problems\n" +"within a certain distance of a particular location." +msgstr "" +"Fiksgatami har ulike RSS-straumar og e-postlister om lokale problem, dette inkluderer problem meldt innanfor ein viss bydel eller administrasjon, eller eit område med problem\n" +"innan ein gitt distanse frå ein viss posisjon." + +# var bokmålen tilstrekkeleg her? --KBU +#: templates/web/default/alert/list.html:100 +msgid "" +"FixMyStreet sends different categories of problem\n" +"to the appropriate council, so problems within the boundary of a particular " +"council\n" +"might not match the problems sent to that council. For example, a graffiti " +"report\n" +"will be sent to the district council, so will appear in both of the " +"district\n" +"council’s alerts, but will only appear in the \"Within the boundary\" " +"alert\n" +"for the county council." +msgstr "" +"FiksGataMi sender ulike kategoriar problem til ulike administrasjonar, " +"problem som gjeld fleire administrasjonar vert send til alle dei det gjeld." + +#: templates/web/default/admin/index.html:36 +#: templates/web/default/admin/report_edit.html:22 +#: templates/web/default/admin/report_edit.html:24 +#: templates/web/default/report/display.html:85 +#: templates/web/default/report/display.html:87 +msgid "Fixed" +msgstr "Løyst" + +#: templates/web/default/admin/report_edit.html:22 +#: templates/web/default/admin/report_edit.html:25 +msgid "Fixed - Council" +msgstr "Løyst – Administrasjon" + +#: templates/web/default/admin/report_edit.html:22 +#: templates/web/default/admin/report_edit.html:25 +msgid "Fixed - User" +msgstr "Løyst – Brukar" + +#: templates/web/default/my/my.html:27 +msgid "Fixed reports" +msgstr "Løyste rapportar" + +#: templates/web/default/admin/problem_row.html:24 +msgid "Fixed:" +msgstr "Løyst:" + +#: templates/web/default/admin/report_blocks.html:16 +msgid "Flag user" +msgstr "Flagg brukar" + +#: templates/web/default/admin/search_users.html:15 +msgid "Flagged" +msgstr "Flagga:" + +#: templates/web/default/admin/report_edit.html:41 +#: templates/web/default/admin/user_edit.html:18 +msgid "Flagged:" +msgstr "Flagga:" + +#: templates/web/default/reports/council.html:23 +msgid "Follow a ward link to view only reports within that ward." +msgstr "Følg ei bydellenkje for å berre sjå rapportar innanfor den bydelen." + +#: templates/web/default/admin/report_edit.html:16 +msgid "For council(s):" +msgstr "For administrasjon(ane):" + +#: 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 +msgid "Frequently Asked Questions" +msgstr "Ofte spurde spurnader" + +#: templates/web/emptyhomes/static/about.html:34 +msgid "Further information about our work on empty homes." +msgstr "Meir informasjon om arbeidet vårt med tomme heimar." + +#: templates/web/default/open311/index.html:69 +msgid "GeoRSS on Google Maps" +msgstr "GeoRSS på Google Maps" + +#: templates/web/default/alert/list.html:112 +msgid "Give me an RSS feed" +msgstr "Gje meg ein RSS-straum" + +#: templates/web/default/alert/index.html:24 +#: templates/web/default/around/around_index.html:17 +#: templates/web/default/index.html:33 +msgid "Go" +msgstr "Hald fram" + +#: templates/web/default/admin/report_edit.html:40 +msgid "Going to send questionnaire?" +msgstr "Skal spørjeskjemaet sendast?" + +#: templates/web/default/admin/index.html:24 +msgid "Graph of problem creation by status over time" +msgstr "Graf over problemoppretting fordelt på status over tid" + +#: templates/web/default/reports/index.html:5 +#: templates/web/emptyhomes/reports/index.html:5 +msgid "Greyed-out lines are councils that no longer exist." +msgstr "" +"Linjer med grå bakgrunn er administrasjonar som ikkje lenger eksisterer." + +#: templates/web/default/questionnaire/index.html:63 +msgid "Has this problem been fixed?" +msgstr "Har dette problemet vorte løyst?" + +#: templates/web/default/questionnaire/index.html:76 +msgid "" +"Have you ever reported a problem to a council before, or is this your first " +"time?" +msgstr "" +"Har du rapportert eit problem til ein administrasjon før, eller er dette " +"første gongen?" + +#: templates/web/default/footer.html:10 +#: templates/web/emptyhomes/header.html:30 +#: templates/web/fiksgatami/footer.html:9 templates/web/reading/footer.html:10 +msgid "Help" +msgstr "Hjelp" + +#: templates/web/default/alert/list.html:39 +msgid "Here are the types of local problem alerts for ‘%s’." +msgstr "Her er dei ulike typane lokale problemvarsel for «%s»." + +#: templates/web/default/admin/report_edit.html:22 +#: templates/web/default/admin/report_edit.html:25 +#: templates/web/default/admin/update_edit.html:19 +msgid "Hidden" +msgstr "Skjult" + +#: templates/web/default/around/display_location.html:54 +msgid "Hide pins" +msgstr "Skjul nåler" + +#: templates/web/default/around/display_location.html:59 +msgid "Hide stale reports" +msgstr "Skjul utdaterte rapportar" + +#: templates/web/default/admin/council_edit.html:38 +msgid "History" +msgstr "Historie" + +#: templates/web/default/index.html:40 +msgid "How to report a problem" +msgstr "Korleis rapportera eit problem" + +#: perllib/FixMyStreet/App/Controller/Admin.pm:587 +msgid "I am afraid you cannot confirm unconfirmed reports." +msgstr "Eg er redd du ikkje kan stadfesta ustadfesta rapportar." + +#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:89 +msgid "I'm afraid we couldn't locate your problem in the database.\n" +msgstr "Eg er redd vi ikkje klarte å finna problemet ditt i databasen.\n" + +#: perllib/FixMyStreet/App/Controller/Tokens.pm:43 +msgid "" +"I'm afraid we couldn't validate that token, as the report was made too long " +"ago." +msgstr "" +"Eg er redd vi ikkje kunne verifisera den referansen, då det er for lenge " +"sidan rapporten vart laga." + +#: perllib/FixMyStreet/App/Controller/Tokens.pm:233 +msgid "" +"I'm afraid we couldn't validate that token. If you've copied the URL from an " +"email, please check that you copied it exactly.\n" +msgstr "Eg er redd vi ikkje kunne verifisera den referansen. Viss du kopierte nettadressa frå ein e-post, sjekk at du har kopiert ho korrekt.\n" + +#: templates/web/default/admin/list_flagged.html:9 +#: templates/web/default/admin/list_updates.html:5 +#: templates/web/default/admin/search_reports.html:12 +msgid "ID" +msgstr "ID" + +#: templates/web/default/report/new/councils_text_none.html:11 +#: templates/web/default/report/new/councils_text_none.html:12 +msgid "" +"If you submit a problem here the subject and details of the problem will be " +"public, but the problem will <strong>not</strong> be reported to the council." +msgstr "Viss du sender inn eit problem hit, så vil emnet og detaljar for problemet vera offentlege, men problemet vil <strong>ikkje</strong> rapporterast til administrasjonen." + +#: templates/web/emptyhomes/report/new/no_councils_text.html:9 +msgid "" +"If you submit a report here it will be left on the site, but not reported to " +"the council – please still leave your report, so that we can show to " +"the council the activity in their area." +msgstr "Viss du sender inn ein rapport her så vil han verta tilgjengeleg her, men ikkje rapporterast til administrasjonen. — det er fint om du likevel sender inn rapporten din, slik at vi kan visa administrasjonen aktiviteten i området ditt." + +#: templates/web/default/auth/token.html:23 +#: templates/web/default/email_sent.html:24 +msgid "" +"If you use web-based email or have 'junk mail' filters, you may wish to " +"check your bulk/spam mail folders: sometimes, our messages are marked that " +"way." +msgstr "Viss du brukar vevbasert e-post eller har filter for søppel-e-post på e-postkontoen din, kan du i visse tilfelle måtta sjå etter meldingane våre der." + +#: templates/web/default/questionnaire/index.html:85 +msgid "" +"If you wish to leave a public update on the problem, please enter it here\n" +"(please note it will not be sent to the council). For example, what was\n" +"your experience of getting the problem fixed?" +msgstr "" +"Viss du ynskjer å leggja til ein offentleg kommentar på problemet, legg han til her\n" +"(denne vert ikkje send til administrasjonen). Du kan til dømes\n" +"dela røynsla di med korleis problemet ditt vart løyst." + +#: perllib/FixMyStreet/App/Controller/Contact.pm:111 +msgid "Illegal ID" +msgstr "Ugyldig ID" + +#: perllib/FixMyStreet/App/Controller/Alert.pm:102 +msgid "Illegal feed selection" +msgstr "Ugyldig val av straum" + +#: templates/web/default/admin/report_edit.html:22 +#: templates/web/default/admin/report_edit.html:24 +#: templates/web/default/report/display.html:85 +#: templates/web/default/report/display.html:87 +msgid "In Progress" +msgstr "Under arbeid" + +#: templates/web/default/open311/index.html:21 +msgid "" +"In addition, the following attributes that are not part of the Open311 v2 " +"specification are returned: agency_sent_datetime, title (also returned as " +"part of description), interface_used, comment_count, requestor_name (only " +"present if requestor allowed the name to be shown on this site)." +msgstr "I tillegg er følgjande attributt som ikkje er del av Open311 v2-spesifikasjonen returnert: agency_sent_datetime, title (òg returnert som del av description), interface_used, comment_count, requestor_name (berre tilstades viss innsendar tillét at namnet kunne visast på denne nettstaden)." + +#: templates/web/default/around/display_location.html:61 +msgid "Include stale reports" +msgstr "Inkluder utdaterte problem" + +#: templates/web/default/admin/stats.html:76 +msgid "Include unconfirmed reports" +msgstr "Inkluder ikkje-stadfesta problem" + +#: perllib/FixMyStreet/App/Controller/Open311.pm:358 +msgid "Incorrect has_photo value \"%s\"" +msgstr "Feil has_photo-verdi «%s»" + +#: perllib/FixMyStreet/App/Controller/Open311.pm:343 +msgid "Invalid agency_responsible value %s" +msgstr "Ugyldig agency_responsible-verdi %s" + +#: perllib/FixMyStreet/App/Controller/Admin.pm:897 +msgid "Invalid end date" +msgstr "Ugyldig slutt-dato" + +#: perllib/FixMyStreet/App/Controller/Open311.pm:426 +msgid "Invalid format %s specified." +msgstr "Ugyldig format %s oppgjeve." + +#: perllib/FixMyStreet/App/Controller/Admin.pm:887 +msgid "Invalid start date" +msgstr "Ugyldig startdato" + +#: templates/web/default/admin/report_edit.html:22 +#: templates/web/default/admin/report_edit.html:23 +#: templates/web/default/report/display.html:85 +#: templates/web/default/report/display.html:86 +msgid "Investigating" +msgstr "Undersøkjer" + +#: templates/web/emptyhomes/tokens/confirm_problem.html:12 +#: templates/web/emptyhomes/tokens/confirm_problem.html:14 +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’t mean the council " +"isn’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/default/auth/general.html:44 +#: templates/web/default/report/display.html:157 +#: templates/web/default/report/new/fill_in_details_form.html:149 +msgid "Keep me signed in on this computer" +msgstr "Hugs mi innlogging på denne datamaskina" + +#: templates/web/default/admin/council_contacts.html:30 +msgid "Last editor" +msgstr "Sist redigert av" + +#: templates/web/default/admin/report_edit.html:36 +msgid "Last update:" +msgstr "Siste oppdatering:" + +#: templates/web/default/admin/problem_row.html:26 +msgid "Last update:" +msgstr "Siste oppdatering:" + +#: perllib/FixMyStreet/App/Controller/Admin.pm:983 +msgid "List Flagged" +msgstr "Vis flagga" + +#: templates/web/default/admin/council_contacts.html:11 +msgid "List all reported problems" +msgstr "Vis alle rapporterte problem" + +#: templates/web/default/report/new/fill_in_details_form.html:68 +msgid "Loading..." +msgstr "Lastar …" + +#: 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 +msgid "Local RSS feeds and email alerts" +msgstr "Lokal RSS-straum og e-postvarsel" + +#: templates/web/default/alert/list.html:1 +#: templates/web/default/alert/list.html:12 +#: templates/web/default/alert/list.html:14 +#: templates/web/default/alert/list.html:3 +msgid "Local RSS feeds and email alerts for ‘%s’" +msgstr "Lokal RSS-straum og e-postvarsel for «%s»" + +#: templates/web/default/footer.html:9 templates/web/emptyhomes/header.html:29 +#: templates/web/fiksgatami/footer.html:8 templates/web/reading/footer.html:9 +msgid "Local alerts" +msgstr "Lokale varsel" + +#: templates/web/default/index.html:44 +msgid "Locate the problem on a map of the area" +msgstr "Lokaliser problemet på kartet over området" + +#: perllib/FixMyStreet/Map/OSM.pm:43 +msgid "" +"Map © <a id=\"osm_link\" href=\"http://www.openstreetmap.org/" +"\">OpenStreetMap</a> and contributors, <a href=\"http://creativecommons.org/" +"licenses/by-sa/2.0/\">CC-BY-SA</a>" +msgstr "" +"Kart © <a id=\"osm_link\" href=\"http://www.openstreetmap.org/" +"\">OpenStreetMap</a> og bidragsytarar, <a href=\"http://creativecommons.org/" +"licenses/by-sa/2.0/\">CC-BY-SA</a>" + +#: templates/web/default/contact/index.html:90 +msgid "Message:" +msgstr "Melding:" + +#: perllib/FixMyStreet/App/Controller/Open311.pm:434 +msgid "Missing jurisdiction_id" +msgstr "Manglar jurisdiction_id" + +#: templates/web/default/admin/stats.html:11 +msgid "Month" +msgstr "Månad" + +#: templates/web/default/report/display.html:31 +msgid "More problems nearby" +msgstr "Fleire problem i nærleiken" + +#: 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:10 +#: templates/web/emptyhomes/reports/index.html:10 +#: templates/web/fiksgatami/reports/index.html:9 +msgid "Name" +msgstr "Namn" + +#: templates/web/default/admin/report_edit.html:30 +#: templates/web/default/admin/update_edit.html:23 +#: templates/web/default/admin/user_edit.html:10 +msgid "Name:" +msgstr "Namn:" + +#: templates/web/default/footer.html:4 templates/web/fiksgatami/footer.html:3 +#: templates/web/reading/footer.html:4 +msgid "Navigation" +msgstr "Navigasjon" + +#: perllib/FixMyStreet/Geocode/OSM.pm:100 +msgid "" +"Nearest named road to the pin placed on the map (automatically generated " +"using OpenStreetMap): %s%s" +msgstr "Næraste namngjevne veg til nålen plassert på kartet (automatisk generert ved hjelp av OpenStreetMap): %s%s" + +#: perllib/FixMyStreet/Cobrand/Default.pm:564 +msgid "" +"Nearest postcode to the pin placed on the map (automatically generated): %s (" +"%sm away)" +msgstr "Næraste postnummer til nålen plassert på kartet (automatisk generert): %s (%sm unna)" + +#: perllib/FixMyStreet/Cobrand/Default.pm:553 +#: perllib/FixMyStreet/Cobrand/Default.pm:588 +msgid "" +"Nearest road to the pin placed on the map (automatically generated by Bing " +"Maps): %s" +msgstr "Næraste veg til nålen plassert på karta (automatisk generert ved hjelp av Bing Maps): %s" + +#: templates/web/default/email_sent.html:20 +msgid "Nearly Done! Now check your email..." +msgstr "Nesten ferdig! No må du sjekka e-posten din …" + +#: perllib/FixMyStreet/App/Controller/Admin.pm:309 +msgid "New category contact added" +msgstr "Ny kategorikontakt lagt til" + +#: db/alert_types.pl:18 db/alert_types.pl:22 +msgid "New local problems on FixMyStreet" +msgstr "Nye lokale problem på FiksGataMi" + +#: db/alert_types_eha.pl:12 +msgid "New local reports on reportemptyhomes.com" +msgstr "Nye lokale rapportar på reportemptyhomes.com" + +#: templates/web/default/reports/council.html:92 +#: templates/web/default/reports/council.html:93 +#: templates/web/default/reports/index.html:11 +#: templates/web/emptyhomes/reports/index.html:11 +#: templates/web/fiksgatami/reports/index.html:10 +msgid "New problems" +msgstr "Nye problem" + +#: db/alert_types.pl:38 +msgid "New problems for {{COUNCIL}} within {{WARD}} ward on FixMyStreet" +msgstr "Nye problem for {{COUNCIL}} innanfor {{WARD}} bydel på FiksGataMi" + +#: db/alert_types.pl:26 db/alert_types.pl:30 +msgid "New problems near {{POSTCODE}} on FixMyStreet" +msgstr "Nye problem nær postnummer {{POSTCODE}} på FiksGataMi" + +#: db/alert_types.pl:10 +msgid "New problems on FixMyStreet" +msgstr "Nye problem på Fiksgatami" + +#: db/alert_types.pl:34 +msgid "New problems to {{COUNCIL}} on FixMyStreet" +msgstr "Nye problem i {{COUNCIL}} på FiksGataMi" + +#: db/alert_types.pl:42 +msgid "New problems within {{NAME}}'s boundary on FixMyStreet" +msgstr "Nye rapportar innanfor grensa til {{NAME}} på FiksGataMi" + +#: db/alert_types_eha.pl:23 +msgid "" +"New reports for {{COUNCIL}} within {{WARD}} ward on reportemptyhomes.com" +msgstr "" +"Nye rapportar for {{COUNCIL}} innanfor {{WARD}} bydel på reportemptyhomes.com" + +#: db/alert_types_eha.pl:5 +msgid "New reports on reportemptyhomes.com" +msgstr "Nye rapportar på reportemptyhomes.com" + +#: db/alert_types_eha.pl:16 +msgid "New reports on reportemptyhomes.com near {{POSTCODE}}" +msgstr "Nye rapportar på reportemptyhomes.com nær postnummer {{POSTCODE}}" + +#: db/alert_types_eha.pl:19 +msgid "New reports to {{COUNCIL}} on reportemptyhomes.com" +msgstr "Nye rapportar til {{COUNCIL}} på reportemptyhomes.com" + +#: db/alert_types_eha.pl:27 +msgid "New reports within {{NAME}}'s boundary on reportemptyhomes.com" +msgstr "Nye rapportar innanfor grensa til {{NAME}} på reportemptyhomes.com" + +#: templates/web/default/admin/questionnaire.html:24 +msgid "New state" +msgstr "Ny tilstand" + +#: templates/web/default/front/news.html:8 +#: templates/web/fiksgatami/front/news.html:9 +msgid "New!" +msgstr "Ny!" + +#: templates/web/default/admin/council_contacts.html:39 +#: templates/web/default/admin/council_contacts.html:40 +#: 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:19 +#: templates/web/default/admin/report_edit.html:40 +#: templates/web/default/admin/update_edit.html:16 +#: templates/web/default/questionnaire/creator_fixed.html:16 +#: templates/web/default/questionnaire/index.html:109 +#: templates/web/default/questionnaire/index.html:70 +msgid "No" +msgstr "Nei" + +#: templates/web/default/admin/stats.html:85 +#: templates/web/default/admin/user_edit.html:13 +msgid "No council" +msgstr "Ingen administrasjon" + +#: perllib/FixMyStreet/DB/Result/Problem.pm:297 +msgid "No council selected" +msgstr "Ingen administrasjon er vald" + +#: templates/web/default/admin/council_list.html:32 +msgid "No edits have yet been made." +msgstr "Ingen endringar er gjort." + +#: templates/web/default/admin/list_flagged.html:26 +msgid "No flagged problems found" +msgstr "Fann ingen flagga problem" + +#: templates/web/default/admin/list_flagged.html:47 +msgid "No flagged users found" +msgstr "Fann ingen flagga brukarar" + +#: templates/web/default/admin/council_list.html:38 +msgid "No info at all" +msgstr "Heilt utan informasjon" + +#: templates/web/default/around/around_map_list_items.html:15 +msgid "No problems found." +msgstr "Fann ingen problem." + +#: templates/web/default/around/on_map_list_items.html:12 +msgid "No problems have been reported yet." +msgstr "Ingen problem er rapporterte" + +#: templates/web/default/admin/council_list.html:5 +#: templates/web/default/admin/report_edit.html:16 +msgid "None" +msgstr "Ingen" + +#: templates/web/default/admin/questionnaire.html:6 +msgid "Not reported before" +msgstr "Ikkje rapportert tidlegare" + +#: templates/web/default/report/_main.html:9 +msgid "Not reported to council" +msgstr "Ikkje rapportert til administrasjonen" + +#: templates/web/default/admin/council_contacts.html:31 +#: templates/web/default/admin/council_edit.html:46 +msgid "Note" +msgstr "Merk" + +#: templates/web/default/admin/stats.html:51 +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 "Merk at når vi tek med ustadfesta rapportar, så brukar vi datoen rapporten 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:80 +#: templates/web/default/admin/council_edit.html:31 +msgid "Note:" +msgstr "Merk:" + +#: templates/web/default/open311/index.html:6 +msgid "Note: <strong>%s</strong>" +msgstr "Merk: <strong>%s</strong>" + +#: templates/web/default/report/new/fill_in_details_form.html:131 +msgid "Now to submit your report… do you have a FixMyStreet password?" +msgstr "På tide å senda rapporten din, har du eit FiksGataMi-passord?" + +#: templates/web/default/report/display.html:139 +msgid "Now to submit your update… do you have a FixMyStreet password?" +msgstr "På tide å registrera oppdateringa di, har du eit FiksGataMi-passord?" + +#: templates/web/default/report/display.html:26 +#: templates/web/default/report/updates.html:23 +msgid "Offensive? Unsuitable? Tell us" +msgstr "Støytande? Upassende? Sei frå" + +#: templates/web/default/reports/council.html:115 +#: templates/web/default/reports/council.html:116 +msgid "Old fixed" +msgstr "Eldre problem som er løyste" + +#: templates/web/default/reports/council.html:109 +#: templates/web/default/reports/council.html:110 +msgid "Old problems, state unknown" +msgstr "Eldre problem med ukjend status" + +#: templates/web/default/reports/index.html:13 +#: templates/web/fiksgatami/reports/index.html:12 +msgid "Old problems,<br>state unknown" +msgstr "Eldre problem, med<br>ukjend status" + +#: templates/web/default/admin/questionnaire.html:24 +msgid "Old state" +msgstr "Gammal tilstand" + +#: templates/web/default/reports/index.html:15 +#: templates/web/emptyhomes/reports/index.html:14 +#: templates/web/fiksgatami/reports/index.html:14 +msgid "Older fixed" +msgstr "Eldre løyste" + +#: templates/web/default/reports/council.html:101 +#: templates/web/default/reports/council.html:105 +#: templates/web/default/reports/council.html:106 +#: templates/web/default/reports/council.html:99 +#: templates/web/default/reports/index.html:12 +#: templates/web/emptyhomes/reports/index.html:12 +#: templates/web/fiksgatami/reports/index.html:11 +msgid "Older problems" +msgstr "Eldre problem" + +#: templates/web/default/admin/report_edit.html:22 +#: templates/web/default/admin/update_edit.html:19 +#: templates/web/default/report/display.html:85 +msgid "Open" +msgstr "Opne" + +#: templates/web/default/my/my.html:22 +msgid "Open reports" +msgstr "Opne rapportar" + +#: templates/web/default/open311/index.html:3 +msgid "Open311 API for the mySociety FixMyStreet server" +msgstr "Open311-API for mySocietys FiksGataMi-tenar" + +#: templates/web/default/open311/index.html:13 +msgid "Open311 initiative web page" +msgstr "Nettsida til Open311-initiativet" + +#: templates/web/default/open311/index.html:14 +msgid "Open311 specification" +msgstr "Open311-spesifikasjon" + +#: templates/web/default/alert/list.html:87 +msgid "Or problems reported to:" +msgstr "Eller problem meldt til:" + +#: templates/web/default/alert/list.html:63 +msgid "" +"Or you can subscribe to an alert based upon what ward or council you’" +"re in:" +msgstr "Eller du kan abonnera på varsel basert på bydel eller administrasjon du høyrer til under:" + +#: bin/send-reports:175 bin/send-reports:184 +#: perllib/FixMyStreet/App/Controller/Report/New.pm:553 +#: perllib/FixMyStreet/App/Controller/Report/New.pm:566 +#: perllib/FixMyStreet/App/Controller/Report/New.pm:969 +#: perllib/FixMyStreet/DB/Result/Problem.pm:475 +#: perllib/FixMyStreet/DB/Result/Problem.pm:485 +#: perllib/FixMyStreet/DB/Result/Problem.pm:495 +#: perllib/FixMyStreet/DB/Result/Problem.pm:507 +msgid "Other" +msgstr "Anna" + +#: templates/web/default/footer.html:30 +msgid "" +"Our code is open source and <a href=\"http://github.com/mysociety/" +"fixmystreet\">available on GitHub</a>." +msgstr "" +"Kjeldekoda vår er fri programvare og <a href=\"http://github.com/mysociety/" +"fixmystreet\">tilgjengeleg på GitHub</a>." + +#: templates/web/default/admin/list_updates.html:11 +msgid "Owner" +msgstr "Eigar" + +#: templates/web/default/errors/page_error_404_not_found.html:1 +#: templates/web/default/errors/page_error_404_not_found.html:3 +msgid "Page Not Found" +msgstr "Fann ikkje sida" + +#: templates/web/default/admin/report_edit.html:22 +#: templates/web/default/admin/report_edit.html:25 +msgid "Partial" +msgstr "Delvis" + +#: templates/web/default/auth/change_password.html:25 +msgid "Password:" +msgstr "Passord:" + +#: bin/send-reports:69 templates/web/default/admin/report_edit.html:32 +#: templates/web/default/report/new/fill_in_details_form.html:215 +msgid "Phone:" +msgstr "Telefon:" + +#: templates/web/default/questionnaire/index.html:97 +#: templates/web/default/report/display.html:115 +#: templates/web/default/report/new/fill_in_details_form.html:102 +msgid "Photo:" +msgstr "Bilete:" + +#: templates/web/default/alert/list.html:29 +msgid "Photos of recent nearby reports" +msgstr "Bilete av nye problem i nærleiken" + +#: templates/web/default/admin/report_edit.html:22 +#: templates/web/default/admin/report_edit.html:23 +#: templates/web/default/report/display.html:85 +#: templates/web/default/report/display.html:86 +msgid "Planned" +msgstr "Planlagt" + +#: templates/web/default/report/new/notes.html:6 +msgid "Please be polite, concise and to the point." +msgstr "Ver høfleg, poengtert og kortfatta." + +#: templates/web/default/auth/change_password.html:12 +#: templates/web/default/auth/change_password.html:17 +msgid "Please check the passwords and try again" +msgstr "Ver venleg og sjekk passorda og prøv igjen" + +#: templates/web/default/auth/token.html:17 +msgid "Please check your email" +msgstr "Ver venleg og sjekk e-posten du oppgav" + +#: templates/web/default/auth/general.html:14 +#: templates/web/default/auth/general.html:8 +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:722 +#: perllib/FixMyStreet/App/Controller/Report/New.pm:741 +#: perllib/FixMyStreet/App/Controller/Report/New.pm:778 +#: perllib/FixMyStreet/DB/Result/Problem.pm:316 +msgid "Please choose a category" +msgstr "Vel ein kategori" + +#: perllib/FixMyStreet/DB/Result/Problem.pm:322 +msgid "Please choose a property type" +msgstr "Vel ein type eigenskap" + +#: templates/web/default/contact/blurb.html:2 +msgid "" +"Please do <strong>not</strong> report problems through this form; messages " +"go to\n" +"the team behind FixMyStreet, not a council. To report a problem,\n" +"please <a href=\"/\">go to the front page</a> and follow the instructions." +msgstr "Ver venleg og <strong>ikkje</strong> rapporter feil gjennom denne sida; meldingane går til gruppa som står bak FiksGataMi, og ikkje til ein administrasjon. For å rapportera eit problem, ver venleg og <a href=\"/\">gå til forsida</a> og følg instruksjonane." + +#: templates/web/default/report/new/notes.html:7 +msgid "" +"Please do not be abusive — abusing your council devalues the service " +"for all users." +msgstr "Ikkje ver ufin — å kjefta på administrasjonen din skader verdet av tenesta for alle brukarane." + +#: perllib/FixMyStreet/DB/Result/Comment.pm:113 +msgid "Please enter a message" +msgstr "Ver venleg og skriv ei melding" + +#: templates/web/default/auth/change_password.html:12 +#: templates/web/default/auth/change_password.html:15 +msgid "Please enter a password" +msgstr "Skriv inn eit passord" + +#: perllib/FixMyStreet/App/Controller/Contact.pm:97 +#: perllib/FixMyStreet/DB/Result/Problem.pm:291 +msgid "Please enter a subject" +msgstr "Ver venleg og legg inn eit emne" + +#: perllib/FixMyStreet/DB/Result/User.pm:96 +msgid "Please enter a valid email" +msgstr "Ver venleg og legg til ein gyldig e-post" + +#: perllib/FixMyStreet/App/Controller/Alert.pm:345 +#: perllib/FixMyStreet/App/Controller/Contact.pm:107 +msgid "Please enter a valid email address" +msgstr "Ver venleg og legg inn e-postadressa di" + +#: perllib/FixMyStreet/DB/Result/Problem.pm:294 +msgid "Please enter some details" +msgstr "Ver venleg og legg inn opplysningar om problemet" + +#: perllib/FixMyStreet/App/Controller/Contact.pm:96 +#: perllib/FixMyStreet/DB/Result/User.pm:93 +#: templates/web/default/auth/general.html:13 +#: templates/web/default/auth/general.html:8 +msgid "Please enter your email" +msgstr "Ver venleg og legg inn e-posten din" + +#: perllib/FixMyStreet/DB/Result/Problem.pm:309 +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" +msgstr "Skriv inn det fulle namnet ditt. Administrasjonar som mottek problemet ditt treng dette. Fjern haka under viss du ikkje ynskjer at namnet ditt skal visast." + +#: perllib/FixMyStreet/App/Controller/Contact.pm:95 +#: perllib/FixMyStreet/DB/Result/Comment.pm:110 +#: perllib/FixMyStreet/DB/Result/Problem.pm:302 +#: perllib/FixMyStreet/DB/Result/User.pm:89 +msgid "Please enter your name" +msgstr "Ver venleg og legg inn namnet ditt" + +#: templates/web/emptyhomes/report/new/fill_in_details_text.html:1 +msgid "" +"Please fill in details of the empty property below, saying what type of\n" +"property it is e.g. an empty home, block of flats, office etc. Tell us\n" +"something about its condition and any other information you feel is relevant." +"\n" +"There is no need for you to give the exact address. Please be polite, " +"concise\n" +"and to the point; writing your message entirely in block capitals makes it " +"hard\n" +"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 +msgid "Please fill in details of the problem below." +msgstr "Ver venleg og fyll ut detaljar om problemet under." + +#: 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" +"to help unless you leave as much detail as you can, so please describe the " +"exact location of\n" +"the problem (e.g. on a wall), what it is, how long it has been there, a " +"description (and a\n" +"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" +"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_form.html:27 +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 "" +"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:244 +msgid "Please indicate whether you'd like to receive another questionnaire" +msgstr "Ver venleg og indiker om du ynskjer å motta eit nytt spørjeskjema" + +#: templates/web/default/report/display.html:62 +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 "" +"Merk at oppdateringar ikkje vert sende til administrasjonen. Viss du\n" +"legg igjen namnet ditt så vil det vera offentleg tilgjengeleg.\n" +"Informasjonen din vil berre brukast i samsvar med <a href=\"/faq#privacy\">personvernpolicyen vår</a>" + +#: templates/web/default/report/new/fill_in_details_form.html:5 +msgid "" +"Please note your report has <strong>not yet been sent</strong>. Choose a " +"category and add further information below, then submit." +msgstr "Merk at rapporten din <strong>enno ikkje er send</strong. Vel ein kategori og legg til meir informasjon under før du sender inn." + +#: templates/web/default/report/new/notes.html:1 +msgid "Please note:" +msgstr "Merk:" + +#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:247 +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:254 +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:115 +#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:240 +msgid "" +"Please say whether you've ever reported a problem to your council before" +msgstr "Ver venleg og opplys om du har rapportert eit problem til administrasjonen din tidlegare" + +#: perllib/FixMyStreet/App/Controller/Alert.pm:82 +msgid "Please select the feed you want" +msgstr "Vel den kjelda du ynskjer" + +#: perllib/FixMyStreet/App/Controller/Alert.pm:120 +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:236 +msgid "Please state whether or not the problem has been fixed" +msgstr "Ver venleg og oppgje om dette problemet har vorte fiksa eller ikkje" + +#: templates/web/default/questionnaire/index.html:52 +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/Report/New.pm:830 +msgid "Please upload a JPEG image only" +msgstr "Ver venleg og berre last opp JPEG-bilete" + +#: perllib/FixMyStreet/App/Controller/Contact.pm:98 +msgid "Please write a message" +msgstr "Skriv inn ei melding" + +#: templates/web/default/contact/index.html:93 +#: templates/web/default/report/display.html:125 +#: templates/web/default/report/display.html:162 +#: templates/web/default/report/display.html:184 +msgid "Post" +msgstr "Send inn" + +#: templates/web/default/report/updates.html:8 +msgid "Posted anonymously at %s" +msgstr "Publisert anonymt %s" + +#: templates/web/default/report/updates.html:11 +msgid "Posted by %s (<strong>%s</strong>) at %s" +msgstr "Lagt inn av %s (<strong>%s</strong>) %s" + +#: templates/web/default/report/updates.html:13 +msgid "Posted by %s at %s" +msgstr "Sendt inn av %s %s" + +#: templates/web/default/maps/openlayers.html:89 +msgid "Problem" +msgstr "Problem" + +#: templates/web/default/admin/timeline.html:24 +msgid "Problem %d created" +msgstr "Problem %d oppretta" + +#: templates/web/default/admin/timeline.html:26 +msgid "Problem %s confirmed" +msgstr "Problem %s stadfesta" + +#: templates/web/default/admin/timeline.html:28 +msgid "Problem %s sent to council %s" +msgstr "Problem %s sendt til administrasjon %s" + +#: templates/web/default/admin/index.html:28 +msgid "Problem breakdown by state" +msgstr "Tilstandsfordeling av problem" + +#: perllib/FixMyStreet/App/Controller/Admin.pm:774 +msgid "Problem marked as open." +msgstr "Problem markert som ope." + +#: templates/web/default/admin/questionnaire.html:21 +msgid "Problem state change based on survey results" +msgstr "Endring av problemtilstand basert på spørjeundersøkingsresultat" + +#: templates/web/default/admin/list_flagged.html:5 +msgid "Problems" +msgstr "Problem" + +#: templates/web/default/around/display_location.html:80 +msgid "Problems in this area" +msgstr "Problem i dette området" + +#: db/alert_types.pl:14 +msgid "Problems recently reported fixed on FixMyStreet" +msgstr "Problem nyleg rapportert fiksa på FiksGataMi" + +#: templates/web/default/alert/list.html:52 +msgid "Problems within %.1fkm of this location" +msgstr "Problem innanfor %.1fkm av denne posisjonen" + +#: perllib/FixMyStreet/Cobrand/Default.pm:800 +#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:162 +#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:177 +msgid "Problems within %s" +msgstr "Problem innanfor %s" + +#: perllib/FixMyStreet/Cobrand/Default.pm:809 +#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:170 +msgid "Problems within %s ward" +msgstr "Problem innanfor %s bydel" + +#: templates/web/default/reports/council.html +#: templates/web/default/reports/council.html:16 +msgid "Problems within %s, FixMyStreet" +msgstr "Problem innanfor %s, FiksGataMi" + +#: templates/web/default/alert/list.html:69 +msgid "Problems within the boundary of:" +msgstr "Problem innanfor grensene av:" + +#: db/alert_types_eha.pl:8 +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:528 +msgid "Property type:" +msgstr "Type eigenskap:" + +#: templates/web/default/report/display.html:57 +msgid "Provide an update" +msgstr "Bidra med ei oppdatering" + +#: templates/web/default/report/display.html:181 +#: templates/web/default/report/new/fill_in_details_form.html:173 +msgid "" +"Providing a password is optional, but doing so will allow you to more easily " +"report problems, leave updates and manage your reports." +msgstr "" +"Det er valfritt å oppgje eit passord, men om du gjer det vil det verta " +"enklare for deg å rapportera problem, leggja inn oppdateringar og halda " +"oversyn over rapportane dine" + +#: templates/web/default/questionnaire/completed.html:1 +#: templates/web/default/questionnaire/completed.html:2 +#: templates/web/default/questionnaire/index.html +#: templates/web/default/questionnaire/index.html:14 +#: templates/web/default/questionnaire/index.html:4 +msgid "Questionnaire" +msgstr "Spørjeskjema" + +#: templates/web/default/admin/timeline.html:32 +msgid "Questionnaire %d answered for problem %d, %s to %s" +msgstr "Spørjeskjema %d fylt inn for problem %d, %s til %s" + +#: templates/web/default/admin/timeline.html:30 +msgid "Questionnaire %d sent for problem %d" +msgstr "Spørjeskjema %d sendt for problem %d" + +#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:190 +msgid "Questionnaire filled in by problem reporter" +msgstr "Spørjeskjema fylt inn av feilrapportøren" + +#: templates/web/default/alert/list.html:54 +#: templates/web/default/around/display_location.html:1 +#: templates/web/default/around/display_location.html:3 +#: templates/web/default/report/display.html:48 +#: templates/web/default/reports/council.html:61 +msgid "RSS feed" +msgstr "RSS-straum" + +#: perllib/FixMyStreet/Cobrand/Default.pm:838 +#: perllib/FixMyStreet/Cobrand/Default.pm:852 +msgid "RSS feed for %s" +msgstr "RSS-straum for %s" + +#: perllib/FixMyStreet/Cobrand/Default.pm:845 +#: perllib/FixMyStreet/Cobrand/Default.pm:859 +msgid "RSS feed for %s ward, %s" +msgstr "RSS-straum for %s bydel, %s" + +#: perllib/FixMyStreet/Cobrand/Default.pm:868 +#: perllib/FixMyStreet/Cobrand/Default.pm:882 +#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:193 +#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:201 +#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:211 +#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:219 +msgid "RSS feed of %s" +msgstr "RSS-straum frå %s" + +#: perllib/FixMyStreet/Cobrand/Default.pm:874 +#: perllib/FixMyStreet/Cobrand/Default.pm:888 +msgid "RSS feed of %s, within %s ward" +msgstr "RSS-straum av %s, innanfor %s bydel" + +#: templates/web/default/alert/list.html:54 +msgid "RSS feed of nearby problems" +msgstr "RSS-straum med problem i nærleiken" + +#: templates/web/default/reports/council.html:61 +msgid "RSS feed of problems in this %s" +msgstr "RSS-straum for problem i denne %s-en" + +#: perllib/FixMyStreet/Cobrand/Default.pm:801 +#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:163 +#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:176 +msgid "RSS feed of problems within %s" +msgstr "RSS-straum for problem innanfor %s" + +#: perllib/FixMyStreet/Cobrand/Default.pm:808 +#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:169 +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 +msgid "RSS feed of recent local problems" +msgstr "RSS-straum med nye lokale problem" + +#: templates/web/default/report/display.html:48 +msgid "RSS feed of updates to this problem" +msgstr "RSS-straum med oppdateringar for dette problemet" + +#: templates/web/default/alert/updates.html:9 +#: templates/web/default/report/display.html:38 +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 +#: templates/web/default/around/display_location.html:34 +msgid "Recent local problems, FixMyStreet" +msgstr "Nye lokale problem, FiksGataMi." + +#: templates/web/default/reports/council.html:87 +#: templates/web/default/reports/council.html:88 +#: templates/web/default/reports/index.html:14 +#: templates/web/emptyhomes/reports/index.html:13 +#: templates/web/fiksgatami/reports/index.html:13 +msgid "Recently fixed" +msgstr "Nyleg løyste problem" + +#: templates/web/default/index.html:62 +msgid "Recently reported problems" +msgstr "Nyleg melde problem" + +#: templates/web/default/report/new/notes.html:9 +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 "Hugs at FiksGataMi primert er laga for å rapportera fysiske problem som kan fiksast. Viss problemet ditt ikkje er eigna for å senda inn via denne tenesta, hugs at du kan kontakta administrasjonen direkte via deira eiga nettside." + +#: templates/web/default/admin/report_blocks.html:16 +msgid "Remove flag" +msgstr "Fjern flagg" + +#: templates/web/default/admin/report_edit.html:47 +#: templates/web/default/admin/update_edit.html:48 +msgid "Remove photo (can't be undone!)" +msgstr "Fjern bilete (kan ikkje gjerast om!)" + +#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:77 +msgid "Report Empty Homes" +msgstr "Rapporter tomme heimar" + +#: templates/web/default/footer.html:6 templates/web/emptyhomes/header.html:27 +#: templates/web/fiksgatami/footer.html:5 templates/web/reading/footer.html:6 +msgid "Report a problem" +msgstr "Rapporter eit problem" + +#: perllib/FixMyStreet/App/Controller/Rss.pm:274 +msgid "Report on %s" +msgstr "Rapport på %s" + +#: templates/web/default/index.html:15 +msgid "Report, view, or discuss local problems" +msgstr "Rapporter, finn eller diskuter lokale problem" + +#: templates/web/default/my/my.html:74 +msgid "Reported %s" +msgstr "Rapportert %s" + +#: templates/web/default/my/my.html:72 +msgid "Reported %s, to %s" +msgstr "Rapportert %s, til %s" + +#: perllib/FixMyStreet/DB/Result/Problem.pm:490 +#: templates/web/default/contact/index.html:45 +msgid "Reported anonymously at %s" +msgstr "Rapportert anonymt %s" + +#: templates/web/default/admin/questionnaire.html:5 +#: templates/web/default/questionnaire/index.html:79 +msgid "Reported before" +msgstr "Rapportert tidlegare" + +#: perllib/FixMyStreet/DB/Result/Problem.pm:482 +msgid "Reported by %s anonymously at %s" +msgstr "Publisert av %s anonymt %s" + +#: perllib/FixMyStreet/DB/Result/Problem.pm:513 +#: templates/web/default/contact/index.html:47 +msgid "Reported by %s at %s" +msgstr "Publisert av %s %s" + +#: perllib/FixMyStreet/DB/Result/Problem.pm:504 +msgid "Reported by %s by %s at %s" +msgstr "Rapportert av %s av %s %s" + +#: perllib/FixMyStreet/DB/Result/Problem.pm:478 +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:498 +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:486 +msgid "Reported in the %s category anonymously at %s" +msgstr "Rapportert i kategorien %s anonymt %s" + +#: perllib/FixMyStreet/DB/Result/Problem.pm:508 +msgid "Reported in the %s category by %s at %s" +msgstr "Rapportert i kategorien %s av %s %s" + +#: templates/web/default/around/around_index.html:1 +#: templates/web/default/report/new/fill_in_details.html +#: templates/web/default/report/new/fill_in_details.html:3 +#: templates/web/default/report/new/fill_in_details_form.html:1 +msgid "Reporting a problem" +msgstr "Legger til eit problem" + +#: templates/web/default/around/display_location.html:94 +msgid "Reports on and around the map" +msgstr "Problem i og rundt kartet" + +#: templates/web/default/admin/report_edit.html:35 +msgid "Resend report" +msgstr "Send rapport på nytt" + +#: perllib/FixMyStreet/Geocode/OSM.pm:107 +msgid "" +"Road operator for this named road (derived from road reference number and " +"type): %s" +msgstr "Vegoperatør for denne namngjevne vegen (utleia frå vegreferansenummer og type): %s" + +#: perllib/FixMyStreet/Geocode/OSM.pm:104 +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 +msgid "Save changes" +msgstr "Lagra endringar" + +#: perllib/FixMyStreet/App/Controller/Admin.pm:982 +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:978 +#: 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:981 +#: 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:" +msgstr "Søk:" + +#: templates/web/default/alert/list.html:41 +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 "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:555 +msgid "Sent to %s %s later" +msgstr "Sendt til %s %s seinare" + +#: templates/web/default/admin/report_edit.html:35 +msgid "Sent:" +msgstr "Sendt:" + +#: templates/web/default/admin/report_edit.html:37 +msgid "Service:" +msgstr "Teneste:" + +#: templates/web/emptyhomes/static/about.html:21 +msgid "Shelter Cymru" +msgstr "Shelter Cymru" + +#: templates/web/emptyhomes/static/about.html:23 +msgid "" +"Shelter Cymru is Wales’ people and homes charity and wants\n" +" everyone in Wales to have a decent home. We believe a home is a " +"fundamental\n" +" right and essential to the health and well-being of people and " +"communities.\n" +" We work for people in housing need. We have offices all over Wales and\n" +" prevent people from losing their homes by offering free, confidential " +"and\n" +" independent advice. When necessary we constructively challenge on behalf " +"of\n" +" people to ensure they are properly assisted and to improve practice and\n" +" learning. We believe that bringing empty homes back into use can make a\n" +" significant contribution to the supply of affordable homes in Wales." +msgstr "" + +#: templates/web/default/report/display.html:216 +#: templates/web/default/report/new/fill_in_details_form.html:210 +msgid "Show my name publicly" +msgstr "Vis namnet mitt offentleg" + +#: templates/web/default/around/display_location.html:52 +msgid "Show pins" +msgstr "Vis nåler" + +#: templates/web/default/auth/general.html:3 +#: templates/web/default/auth/general.html:49 +msgid "Sign in" +msgstr "Logg inn" + +#: templates/web/default/auth/general.html:74 +msgid "Sign in by email" +msgstr "Logg inn via epost" + +#: templates/web/default/auth/general.html:1 +msgid "Sign in or create an account" +msgstr "Logg inn eller opprett ein konto" + +#: templates/web/default/auth/sign_out.html:1 +#: templates/web/default/header.html:35 +#: templates/web/emptyhomes/header.html:43 +#: templates/web/fiksgatami/header.html:22 +#: templates/web/lichfielddc/header.html:177 +#: templates/web/reading/header.html:37 +msgid "Sign out" +msgstr "Logg ut" + +#: templates/web/default/header.html:34 +#: templates/web/emptyhomes/header.html:42 +#: templates/web/fiksgatami/header.html:21 +#: templates/web/lichfielddc/header.html:177 +#: templates/web/reading/header.html:36 +msgid "Signed in as %s" +msgstr "Logga inn som %s" + +#: templates/web/default/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:31 +msgid "Some photos of recent reports" +msgstr "Nokre bilete av nyleg melde problem" + +#: perllib/FixMyStreet/App/View/Email.pm:32 +#: perllib/FixMyStreet/App/View/Web.pm:44 +msgid "Some text to localize" +msgstr "Noko tekst å omsetja" + +#: templates/web/default/admin/council_list.html:42 +msgid "Some unconfirmeds" +msgstr "Nokre ustadfesta" + +#: perllib/FixMyStreet/Cobrand/Default.pm:517 +msgid "" +"Sorry, that appears to be a Crown dependency postcode, which we don't cover." +msgstr "Orsak, det ser ut til å vera eit «Crown dependency»-postnummer, som vi ikkje dekkjer." + +#: templates/web/default/tokens/abuse.html:5 +msgid "Sorry, there has been an error confirming your problem." +msgstr "Orsak, men det oppstod eit problem når vi freista å stadfesta problemrapporten din" + +#: perllib/FixMyStreet/Geocode.pm:27 perllib/FixMyStreet/Geocode/Bing.pm:52 +#: perllib/FixMyStreet/Geocode/Google.pm:68 +msgid "Sorry, we could not find that location." +msgstr "Orsak, vi kunne ikkje finna den staden." + +#: perllib/FixMyStreet/Geocode/Bing.pm:45 +#: perllib/FixMyStreet/Geocode/Google.pm:60 +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." + +#: templates/web/fiksgatami/footer.html:16 +msgid "Source code" +msgstr "Kjeldekode" + +#: templates/web/default/admin/stats.html:64 +msgid "Start Year:" +msgstr "Startår:" + +#: templates/web/default/admin/stats.html:66 +msgid "Start day:" +msgstr "Startdag:" + +#: templates/web/default/admin/stats.html:65 +msgid "Start month:" +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 +msgid "State" +msgstr "Tilstand" + +#: templates/web/default/admin/report_edit.html:21 +#: templates/web/default/admin/update_edit.html:18 +#: templates/web/default/report/display.html:83 +msgid "State:" +msgstr "Tilstand:" + +#: perllib/FixMyStreet/App/Controller/Admin.pm:984 +#: templates/web/default/admin/stats.html:1 +msgid "Stats" +msgstr "Statistikk" + +#: templates/web/default/admin/report_edit.html:13 +#: templates/web/default/contact/index.html:83 +#: templates/web/default/report/new/fill_in_details_form.html:52 +msgid "Subject:" +msgstr "Emne:" + +#: 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 +msgid "Submit" +msgstr "Send inn" + +#: templates/web/default/admin/report_edit.html:50 +#: templates/web/default/admin/update_edit.html:51 +#: templates/web/default/admin/user_edit.html:20 +msgid "Submit changes" +msgstr "Send inn endringar" + +#: templates/web/default/questionnaire/index.html:114 +msgid "Submit questionnaire" +msgstr "Send inn spørjeskjema" + +#: templates/web/default/alert/updates.html:17 +#: templates/web/default/report/display.html:43 +msgid "Subscribe" +msgstr "Abonner" + +#: templates/web/default/alert/list.html:128 +msgid "Subscribe me to an email alert" +msgstr "Eg ynskjer å abonnera på e-postvarsel" + +#: perllib/FixMyStreet/App/Controller/Admin.pm:976 +#: templates/web/default/admin/index.html:1 +msgid "Summary" +msgstr "Oppsummering" + +#: templates/web/default/reports/index.html:1 +#: templates/web/emptyhomes/reports/index.html:1 +#: templates/web/fiksgatami/reports/index.html:1 +msgid "Summary reports" +msgstr "Oppsummeringsrapportar" + +#: perllib/FixMyStreet/App/Controller/Admin.pm:980 +#: templates/web/default/admin/questionnaire.html:1 +msgid "Survey Results" +msgstr "Resultat frå spørjeundersøkinga" + +#: templates/web/default/admin/list_updates.html:14 +msgid "Text" +msgstr "Tekst" + +#: templates/web/default/admin/council_contacts.html:12 +msgid "Text only version" +msgstr "Tekst-utgåve" + +#: templates/web/default/admin/update_edit.html:13 +msgid "Text:" +msgstr "Tekst:" + +#: templates/web/default/tokens/confirm_update.html:7 +#: templates/web/default/tokens/confirm_update.html:8 +msgid "" +"Thank you — you can <a href=\"%s\">view your updated problem</a> on " +"the site." +msgstr "" +"Tusen takk — du kan <a href=\"%s\">sjå på det oppdaterte problemet " +"ditt</a> her hos oss." + +#: templates/web/emptyhomes/tokens/confirm_problem.html:6 +#: templates/web/emptyhomes/tokens/confirm_problem.html:8 +msgid "" +"Thank you for reporting an empty property on ReportEmptyHomes.com. We have " +"emailed the lead officer for empty homes in the council responsible with " +"details, and asked them to do whatever they can to get the empty property " +"back into use as soon as possible." +msgstr "" + +#: templates/web/emptyhomes/tokens/confirm_problem.html:30 +#: templates/web/emptyhomes/tokens/confirm_problem.html:31 +msgid "" +"Thank you for reporting this empty property on ReportEmptyHomes.com.\n" +"At present the report cannot be sent through to the council for this area. " +"We\n" +"are working with councils to link them into the system so that as many " +"areas\n" +"as possible will be covered." +msgstr "" + +#: templates/web/default/tokens/error.html:7 +msgid "" +"Thank you for trying to confirm your update or problem. We seem to have an " +"error ourselves though, so <a href=\"%s\">please let us know what went on</" +"a> and we'll look into it." +msgstr "" +"Takk for at du freistar å stadfesta oppdateringa di eller problemet\n" +"ditt. Det ser ut til at vi har ein feil hos oss, så <a href=\"%s\">ver\n" +"så snill og fortel oss kva som skjedde</a>, så skal vi sjå på saka." + +#: templates/web/emptyhomes/tokens/confirm_problem.html:24 +#: templates/web/emptyhomes/tokens/confirm_problem.html:26 +msgid "" +"Thank you for using ReportEmptyHomes.com. Your action is already helping to " +"resolve the UK’s empty homes crisis." +msgstr "" +"Takk for at du brukar ReportEmptyHomes.com. Handlinga di bidreg\n" +"allereie til å løyse Storbritannias krise med tomme heimar." + +#: templates/web/default/around/around_index.html:44 +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 below :" +msgstr "" +"Takk for at du lasta opp biletet ditt. No treng vi å plassera\n" +"problemet ditt, så ver venleg og skriv inn namn på ein veg i\n" +"nærleiken, eller eit postnummer, i boksen under :" + +#: templates/web/default/contact/submit.html:8 +msgid "Thanks for your feedback. We'll get back to you as soon as we can!" +msgstr "Takk for innspillet ditt. Vi gjev deg ei tilbakemelding så snart vi kan." + +#: templates/web/default/questionnaire/creator_fixed.html:9 +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 "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/Report/New.pm:839 +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." + +#: templates/web/default/alert/index.html:12 +msgid "" +"That location does not appear to be covered by a council, perhaps it is " +"offshore - please try somewhere more specific." +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 +msgid "That location does not appear to be in Britain; please try again." +msgstr "Den staden synest ikkje å vera i Storbritannia. Ver venleg og prøv igjen." + +#: perllib/FixMyStreet/Cobrand/Default.pm:510 +#: perllib/FixMyStreet/Cobrand/FiksGataMi.pm:78 +msgid "That postcode was not recognised, sorry." +msgstr "Det postnummeret vart ikkje gjenkjent, orsak." + +#: perllib/FixMyStreet/App/Controller/Admin.pm:558 +msgid "That problem will now be resent." +msgstr "Det problemet vil no sendast på nytt." + +#: perllib/FixMyStreet/App/Controller/Report.pm:75 +msgid "That report has been removed from FixMyStreet." +msgstr "Den rapporten har vorte fjerna frå FiksGataMi." + +#: templates/web/default/around/around_index.html:27 +msgid "" +"That spot does not appear to be covered by a council. If you have tried to " +"report an issue past the shoreline, for example, please specify the closest " +"point on land." +msgstr "" +"Punktet ser ikkje ut til å vera dekt av ein administrasjon. Viss du til " +"dømes har freista å rapportera eit problem utanfor kysten, marker næraste " +"punkt på land." + +#: templates/web/emptyhomes/static/about.html:7 +msgid "The Empty Homes Agency" +msgstr "" + +#: templates/web/emptyhomes/static/about.html:9 +msgid "" +"The Empty Homes agency is an independent campaigning charity. We\n" +" are not part of government, and have no formal links with local " +"councils\n" +" although we work in cooperation with both. We exist to highlight the " +"waste\n" +" of empty property and work with others to devise and promote " +"sustainable\n" +" solutions to bring empty property back into use. We are based in London " +"but\n" +" work across England. We also work in partnership with other charities " +"across\n" +" the UK." +msgstr "" + +#: templates/web/default/open311/index.html:23 +msgid "" +"The Open311 v2 attribute agency_responsible is used to list the " +"administrations that received the problem report, which is not quite the way " +"the attribute is defined in the Open311 v2 specification." +msgstr "Open311 v2-attributten agency_responsible vert brukt for å lista opp administrasjonane som mottok problemrapporten, noko som ikkje heilt passar med korleis attributten er definert i Open311 v2-spesifikasjonen." + +#: templates/web/default/auth/token.html:21 +#: templates/web/default/email_sent.html:22 +msgid "" +"The confirmation email <strong>may</strong> take a few minutes to arrive " +"— <em>please</em> be patient." +msgstr "Stadfestingse-posten <strong>kan</strong> bruka nokre minutt før han kjem fram — så ver tålmodig." + +#: templates/web/default/questionnaire/index.html:51 +msgid "" +"The details of your problem are available on the right hand side of this " +"page." +msgstr "Detaljane om problemet ditt er tilgjengelege på høgre kant av denne sida." + +#: perllib/FixMyStreet/App/Controller/Reports.pm:46 +#: perllib/FixMyStreet/App/Controller/Reports.pm:73 +msgid "The error was: %s" +msgstr "Feilen var: %s" + +#: templates/web/default/open311/index.html:19 +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 "Dei følgjande Open311 v2-attributtene vert returnerte for kvar førespurnad: service_request_id, description, lat, long, media_url, status, requested_datetime, updated_datetime, service_code og service_name." + +#: perllib/FixMyStreet/Geocode/OSM.pm:99 +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 "" +"Følgjande informasjon om næraste veg kan vera unøyaktig eller irrelevant, " +"viss problemet er nær fleire vegar eller nær ein veg utan namn registrert i " +"OpenStreetmap." + +#: db/alert_types.pl:19 db/alert_types.pl:23 db/alert_types.pl:27 +#: db/alert_types.pl:31 +msgid "The latest local problems reported by users" +msgstr "Dei siste lokale problema rapportert av brukarar" + +#: db/alert_types_eha.pl:13 +msgid "The latest local reports reported by users" +msgstr "Dei siste lokale rapportane rapportert av brukarar" + +#: db/alert_types.pl:35 +msgid "The latest problems for {{COUNCIL}} reported by users" +msgstr "Dei siste problema for {{COUNCIL}} rapportert av brukarar" + +#: db/alert_types.pl:39 +msgid "" +"The latest problems for {{COUNCIL}} within {{WARD}} ward reported by users" +msgstr "" +"Dei siste problema for {{COUNCIL}} innanfor {{WARD}} bydel rapportert av " +"brukarar" + +#: db/alert_types.pl:11 +msgid "The latest problems reported by users" +msgstr "Dei siste problema rapportert av brukarar" + +#: db/alert_types.pl:15 +msgid "The latest problems reported fixed by users" +msgstr "Dei siste problema rapportert fiksa av brukarar" + +#: db/alert_types.pl:43 +msgid "The latest problems within {{NAME}}'s boundary reported by users" +msgstr "Dei siste problema innanfor grensa til {{NAME}} rapportert av brukarar" + +#: db/alert_types_eha.pl:9 +msgid "The latest properties reported back to use by users" +msgstr "Dei siste eigedomane rapportert tilbake i bruk av brukarar" + +#: db/alert_types_eha.pl:20 +msgid "The latest reports for {{COUNCIL}} reported by users" +msgstr "Dei siste rapportane for {{COUNCIL}} rapportert av brukarar" + +#: db/alert_types_eha.pl:24 +msgid "" +"The latest reports for {{COUNCIL}} within {{WARD}} ward reported by users" +msgstr "Dei siste rapportane for {{COUNCIL}} innanfor {{WARD}} bydel rapportert av brukarar" + +#: db/alert_types_eha.pl:28 +msgid "The latest reports within {{NAME}}'s boundary reported by users" +msgstr "" +"Dei siste rapportane innanfor grensa til {{NAME}} rapportert av brukarar" + +#: templates/web/default/auth/change_password.html:12 +#: templates/web/default/auth/change_password.html:16 +msgid "The passwords do not match" +msgstr "Passorda er ikkje like" + +#: templates/web/default/errors/page_error_404_not_found.html:10 +#: templates/web/default/errors/page_error_404_not_found.html:12 +msgid "The requested URL '%s' was not found on this server" +msgstr "Fann ikkje URL-en «%s» på denne tenaren" + +#: perllib/FixMyStreet/App/Controller/Admin.pm:1034 +#: perllib/FixMyStreet/App/Controller/Admin.pm:1179 +#: perllib/FixMyStreet/App/Controller/Admin.pm:538 +#: perllib/FixMyStreet/App/Controller/Admin.pm:701 +msgid "The requested URL was not found on this server." +msgstr "Fann ikkje URL-ein du spurde etter på denne tenaren" + +#: templates/web/default/alert/list.html:47 +msgid "The simplest alert is our geographic one:" +msgstr "Den enklaste meldinga er den geografiske:" + +#: templates/web/default/report/new/councils_text_all.html:18 +#: 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 +msgid "" +"The subject and details of the problem will be public, plus your name if you " +"give us permission." +msgstr "" +"Tittelen og detaljane for problemet vil verta offentlege, pluss namnet ditt\n" +"viss du gjev oss lov til det." + +#: bin/send-reports:78 +msgid "" +"The user could not locate the problem on a map, but to see the area around " +"the location they entered" +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 +msgid "" +"There was a problem showing the All Reports page. Please try again later." +msgstr "Det oppstod problem med å visa «Alle rapportar»-sida. Ver venleg og prøv igjen seinare." + +#: perllib/FixMyStreet/App/Controller/Report/New.pm:641 +#: perllib/FixMyStreet/App/Controller/Report/Update.pm:125 +#: templates/web/default/auth/general.html:23 +msgid "" +"There was a problem with your email/password combination. Passwords and user " +"accounts are a brand <strong>new</strong> service, so you probably do not " +"have one yet – please fill in the right hand side of this form to get " +"one." +msgstr "Det var problem med e-post/passord-kombinasjonen din. Passord og brukarkontoar er ei heilt <strong>ny</strong> teneste, så du har sannsynlegvis ikkje ein konto enno. – ver venleg og fyll inn høgresida av dette skjemaet for å skaffa deg ein." + +#: perllib/FixMyStreet/App/Controller/Alert.pm:354 +msgid "" +"There was a problem with your email/password combination. Please try again." +msgstr "Det var problem med e-post/passord-kombinasjonen din. Ver venleg og prøv igjen." + +#: perllib/FixMyStreet/App/Controller/Report/Update.pm:214 +msgid "There was a problem with your update. Please try again." +msgstr "Det var problem med oppdateringa di. Ver venleg og prøv igjen." + +#: perllib/FixMyStreet/App/Controller/Contact.pm:117 +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:241 +msgid "There were problems with your update. Please see below." +msgstr "Det var problem med oppdateringa di. Ver venleg og sjå under." + +#: templates/web/default/open311/index.html:10 +msgid "" +"This API implementation is work in progress and not yet stabilized. It will " +"change without warnings in the future." +msgstr "Denne API-implementasjonen er under arbeid og ikkje enno stabil. Han vil endra seg utan åtvaring i framtida." + +#: bin/send-reports:185 +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 "Denne e-posten er sendt til begge administrasjonane som dekkjer staden for problemet, sidan brukaren ikkje kategoriserte det. Ver venleg og ignorer e-posten viss de ikkje er korrekt administrasjon for å handtera denne saka, eller gjev oss melding om kva for ein kategori av problem dette er så vi kan leggja det til i systemet vårt." + +#: bin/send-reports:188 +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 "Denne e-posten er sendt til fleire administrasjonar som dekkjer staden for problemet, sidan den valde kategorien er tilgjengeleg for desse. Ver venleg og ignorer e-posten viss de ikkje er korrekt administrasjon for å handtera denne saka." + +#: perllib/FixMyStreet/App/Controller/Report/New.pm:761 +msgid "This information is required" +msgstr "Denne informasjonen er påkravd" + +#: templates/web/default/debug_header.html:3 +msgid "" +"This is a developer site; things might break at any time, and the database " +"will be periodically deleted." +msgstr "Dette er ein utviklarnettstad. Ting kan knekka når som helst og databasen vil verta periodisk sletta." + +#: templates/web/default/reports/council.html:65 +msgid "This is a summary of all reports for one %s." +msgstr "Dette er ei oppsummering av alle rapportar for ein %s." + +#: templates/web/default/reports/council.html:67 +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/default/reports/index.html:4 +#: templates/web/emptyhomes/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 "Dette er ei opplisting av alle problema i denne tenesta; vel ein viss administrasjon for å sjå problem som er sende dit." + +#: perllib/FixMyStreet/Cobrand/Default.pm:926 +msgid "This problem has been closed" +msgstr "Dette problemet er lukka" + +#: perllib/FixMyStreet/Cobrand/Default.pm:922 +#: perllib/FixMyStreet/Cobrand/EmptyHomes.pm:117 +#: templates/web/default/report/display.html:101 +msgid "This problem has been fixed" +msgstr "Dette problemet er løyst" + +#: templates/web/default/report/display.html:96 +msgid "This problem has not been fixed" +msgstr "Dette problemet har ikkje vorte løyst" + +#: perllib/FixMyStreet/Cobrand/Default.pm:931 +msgid "This problem is in progress" +msgstr "Dette problemet er under arbeid" + +#: perllib/FixMyStreet/Cobrand/Default.pm:918 +msgid "This problem is old and of unknown status." +msgstr "Dette problemet er gammalt og med ukjend status." + +#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:79 +msgid "This report is currently marked as closed." +msgstr "Denne rapporten er for tida markert som lukka." + +#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:77 +msgid "This report is currently marked as fixed." +msgstr "Denne rapporten er for tida markert som fiksa." + +#: perllib/FixMyStreet/DB/ResultSet/AlertType.pm:81 +msgid "This report is currently marked as open." +msgstr "Denne rapporten er for tida markert som open." + +#: bin/send-reports:71 +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:979 +#: templates/web/default/admin/timeline.html:1 +msgid "Timeline" +msgstr "Tidslinje" + +#: templates/web/default/admin/list_flagged.html:10 +#: templates/web/default/admin/search_reports.html:13 +msgid "Title" +msgstr "Tittel" + +#: templates/web/default/around/display_location.html:70 +msgid "" +"To <strong>report a problem</strong>, simply click on the map at the correct " +"location." +msgstr "" +"For å <strong>rapportera eit problem</strong>, klikk på kartet på riktig " +"stad." + +#: templates/web/default/alert/index.html:21 +msgid "" +"To find out what local alerts we have for you, please enter your GB\n" +"postcode or street name and area:" +msgstr "Du finn lokale problem ved å søkja på postnummeret ditt, vegnamn eller stad:" + +#: bin/send-reports:77 +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" + +#: templates/web/default/admin/index.html:36 +#: templates/web/default/admin/questionnaire.html:24 +#: templates/web/default/admin/stats.html:24 +#: templates/web/default/admin/stats.html:43 +msgid "Total" +msgstr "Totalt" + +#: perllib/FixMyStreet/App/Controller/Reports.pm:45 +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." + +#: templates/web/default/admin/report_edit.html:22 +#: templates/web/default/admin/report_edit.html:25 +#: templates/web/default/admin/update_edit.html:19 +msgid "Unconfirmed" +msgstr "Ikkje stadfesta" + +#: perllib/FixMyStreet/App/Controller/Rss.pm:163 +msgid "Unknown alert type" +msgstr "Ukjend varsel-type" + +#: perllib/FixMyStreet/App/Controller/Report.pm:70 +msgid "Unknown problem ID" +msgstr "Ukjend problem-ID" + +#: templates/web/default/admin/timeline.html:35 +msgid "Update %s created for problem %d; by %s" +msgstr "Oppdatering %s oppretta for problem %d, av %s" + +#: templates/web/default/contact/index.html:21 +msgid "Update below added anonymously at %s" +msgstr "Oppdateringa under vart lagt inn anonymt %s" + +#: templates/web/default/contact/index.html:23 +msgid "Update below added by %s at %s" +msgstr "Oppdateringa under vart lagt til av %s %s" + +#: templates/web/default/admin/index.html:30 +msgid "Update breakdown by state" +msgstr "Tilstandsfordeling for oppdateringar" + +#: db/alert_types.pl:7 +msgid "Update by {{name}}" +msgstr "Oppdatert av {{name}}" + +#: templates/web/default/admin/update_edit.html:33 +msgid "Update changed problem state to %s" +msgstr "Ei oppdatering endra problemstatusen til %s" + +#: templates/web/default/admin/update_edit.html:35 +msgid "Update marked problem as fixed" +msgstr "Ei oppdatering markerte dette problemet som fiksa." + +#: templates/web/default/admin/update_edit.html:37 +msgid "Update reopened problem" +msgstr "Ei oppdatering gjenopna problemet" + +#: templates/web/default/admin/council_contacts.html:53 +msgid "Update statuses" +msgstr "Oppdater tilstanden" + +#: templates/web/default/report/display.html:77 +msgid "Update:" +msgstr "Oppdatering:" + +#: perllib/FixMyStreet/App/Controller/Admin.pm:647 +#: perllib/FixMyStreet/App/Controller/Admin.pm:764 +#: perllib/FixMyStreet/App/Controller/Admin.pm:844 +msgid "Updated!" +msgstr "Oppdatert!" + +#: templates/web/default/admin/list_updates.html:1 +#: templates/web/default/report/updates.html:4 +msgid "Updates" +msgstr "Oppdateringar" + +#: db/alert_types.pl:5 db/alert_types.pl:6 +msgid "Updates on {{title}}" +msgstr "Oppdateringar av {{title}}" + +#: templates/web/default/report/display.html +#: templates/web/default/report/display.html:7 +msgid "Updates to this problem, FixMyStreet" +msgstr "Oppdateringar til dette problemet, FiksGataMi" + +#: perllib/FixMyStreet/App/Controller/Admin.pm:1137 +msgid "User flag removed" +msgstr "Brukarflagg fjerna" + +#: perllib/FixMyStreet/App/Controller/Admin.pm:1109 +msgid "User flagged" +msgstr "Brukar flagga" + +#: templates/web/default/admin/list_flagged.html:30 +msgid "Users" +msgstr "Brukarar" + +#: perllib/FixMyStreet/App/Controller/Admin.pm:304 +#: perllib/FixMyStreet/App/Controller/Admin.pm:334 +msgid "Values updated" +msgstr "Verdi oppdatert" + +#: templates/web/default/admin/report_edit.html:12 +#: templates/web/default/admin/update_edit.html:12 +msgid "View report on site" +msgstr "Sjå rapport på nettstaden" + +#: templates/web/emptyhomes/tokens/confirm_problem.html:39 +msgid "View your report" +msgstr "Vis rapporten din" + +#: templates/web/default/around/display_location.html +#: templates/web/default/around/display_location.html:33 +msgid "Viewing a location" +msgstr "Ser på ein stad" + +#: templates/web/default/report/display.html +msgid "Viewing a problem" +msgstr "Ser på eit problem" + +#: templates/web/default/reports/council.html:22 +msgid "Wards of this council" +msgstr "Bydelar innanfor denne administrasjonen" + +#: perllib/FixMyStreet/Cobrand/Default.pm:521 +#: perllib/FixMyStreet/Geocode/Bing.pm:47 +#: perllib/FixMyStreet/Geocode/Google.pm:63 +msgid "We do not currently cover Northern Ireland, I'm afraid." +msgstr "Vi dekkjer diverre ikkje Nord-Irland." + +#: templates/web/default/alert/choose.html:6 +#: templates/web/default/around/around_index.html:33 +msgid "" +"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." +msgstr "Vi fann meir ein eitt treff for den staden. Vi viser opp til ti treff, så prøv eit anna søk viss staden din ikkje er her." + +#: templates/web/default/auth/token.html:19 +msgid "We have sent you an email containing a link to confirm your account." +msgstr "Vi har sendt deg ein epost som inneheld ei lenkje for å stadfesta kontoen din." + +#: templates/web/emptyhomes/tokens/confirm_problem.html:18 +#: templates/web/emptyhomes/tokens/confirm_problem.html:20 +msgid "" +"We may contact you periodically to ask if anything has changed with the " +"property you reported." +msgstr "" +"Det kan hende vi periodisk tek kontakt med deg for å spørja om noko har " +"endra seg med eiedommen du rapporterte." + +#: bin/send-reports:195 +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 "" +"Vi innser at %s kan vera ansvarleg for dette problemet, men vi manglar for " +"tida kontaktinformasjon for dei. Viss du veit om ei eigna kontaktadresse, ta " +"kontakt med oss." + +#: templates/web/default/index.html:46 +msgid "We send it to the council on your behalf" +msgstr "Vi sender til administrasjon på dine vegner" + +#: templates/web/default/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 "Vi vil berre bruka personleg informasjon om deg i samsvar med <a href=\"/faq#privacy\">personvernpolicyen</a> vår." + +#: templates/web/emptyhomes/contact/blurb.html:2 +msgid "" +"We’d love to hear what you think about this website. Just fill in the " +"form. Please don’t contact us about individual empty homes; use the " +"box accessed from <a href=\"/\">the front page</a>." +msgstr "Vi vil gjerne høyra kva du tenkjer om denne nettstaden. Det er berre å fylla inn skjemaet. Ver venleg og ikkje kontakt oss om individuelle tomme heimar. For det bør du i staden bruka boksen som er på <a href=\"/\">forsida</a>." + +#: templates/web/default/contact/blurb.html:8 +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 "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:32 +#: templates/web/default/admin/council_edit.html:41 +msgid "When edited" +msgstr "Når redigert" + +#: templates/web/default/admin/list_flagged.html:19 +#: templates/web/default/admin/search_reports.html:22 +msgid "When sent" +msgstr "Når sendt" + +#: perllib/FixMyStreet/App/Controller/Report/New.pm:523 +msgid "Whole block of empty flats" +msgstr "Heil blokk med tomme leilegheiter" + +#: templates/web/default/open311/index.html:25 +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 "Når du søkjer etter førespurnader, så er det òg mogleg å søkja etter agency_responsible for å avgrensa det til førespurnader som er sendt til ein einskild adminstrasjon. Søkjetermen er administrasjonssida som du får frå <a href=\"%s\">MaPit</a>." + +#: templates/web/default/questionnaire/index.html:104 +msgid "" +"Would you like to receive another questionnaire in 4 weeks, reminding you to " +"check the status?" +msgstr "Kunne du tenkja deg å motta ein ny førespurnad om 4 veker, som minner deg om å sjekka status?" + +#: templates/web/default/report/new/notes.html:8 +msgid "" +"Writing your message entirely in block capitals makes it hard to read, as " +"does a lack of punctuation." +msgstr "Når du skriv meldinga di med berre store bokstavar vert ho vanskeleg å lesa. Det same gjeld manglande tegnsetting." + +#: templates/web/default/admin/stats.html:10 +msgid "Year" +msgstr "År" + +#: templates/web/default/admin/council_contacts.html:39 +#: templates/web/default/admin/council_contacts.html:40 +#: 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:18 +#: templates/web/default/admin/report_edit.html:40 +#: 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:107 +#: templates/web/default/questionnaire/index.html:68 +msgid "Yes" +msgstr "Ja" + +#: templates/web/default/contact/index.html:37 +msgid "" +"You are reporting the following problem report for being abusive, containing " +"personal information, or similar:" +msgstr "" +"Du rapporterer at følgjande problem er støytande, inneheld personleg " +"informasjon eller liknande:" + +#: templates/web/default/contact/index.html:15 +msgid "" +"You are reporting the following update for being abusive, containing " +"personal information, or similar:" +msgstr "" +"Du rapporterer at følgjande oppdatering er støytande, inneheld personleg " +"informasjon, eller liknande:" + +#: templates/web/default/reports/council.html:71 +msgid "" +"You can <a href=\"%s\">view all reports for the council</a> or <a href=\"/" +"reports\">show all councils</a>." +msgstr "" +"Du kan <a href=\"%s\">sjå alle rapportar for administrasjonen</a> eller <a " +"href=\"/reports\">sjå alle administrasjonane</a>." + +#: templates/web/default/reports/council.html:73 +msgid "You can <a href=\"/reports\">show all councils</a>." +msgstr "Du kan <a href=\"/reports/\">sjå alle administrasjonar</a>." + +#: templates/web/default/report/new/councils_text_none.html:14 +#: templates/web/default/report/new/councils_text_none.html:16 +#: templates/web/default/report/new/councils_text_some.html:20 +#: templates/web/default/report/new/councils_text_some.html:22 +msgid "" +"You can help us by finding a contact email address for local problems for %s " +"and emailing it to us at <a href='mailto:%s'>%s</a>." +msgstr "" +"Du kan hjelpa oss ved å finna ein kontakt-e-post for lokale problem i %s, og " +"senda han via e-post til oss på <a href='mailto:%s'>%s</a>." + +#: perllib/FixMyStreet/App/Controller/Questionnaire.pm:38 +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 "Du har allereie svart på dette spørjeskjemaet. Viss du har spurnader, ver venleg og <a href='%s'>ta kontakt</a>, eller <a href='%s'>sjå på problemet ditt</a>.\n" + +#: templates/web/default/questionnaire/index.html:94 +#: templates/web/default/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 "" +"Du har allereie lagt ved eit bilete til dette problemet. Å leggja ved eit " +"anna vil byta ut dette." + +#: templates/web/default/report/display.html:112 +msgid "" +"You have already attached a photo to this update, attaching another one will " +"replace it." +msgstr "" +"Du har allereie lagt ved eit bilete til denne oppdateringa. Å leggja ved eit " +"anna vil byta ut dette." + +#: templates/web/default/auth/sign_out.html:3 +msgid "You have been signed out" +msgstr "Du er allereie logga ut" + +#: templates/web/default/report/new/fill_in_details_form.html:7 +msgid "" +"You have located the problem at the point marked with a purple pin on the " +"map. If this is not the correct location, simply click on the map again. " +msgstr "Du har plassert problemet ved punktet i kartet som er markert med ein lilla nål. Viss dette ikkje er korrekt plassering, kan du klikka i kartet på nytt." + +#: templates/web/default/tokens/confirm_alert.html:7 +msgid "You have successfully confirmed your alert." +msgstr "Du har no stadfesta varselet ditt." + +#: templates/web/default/tokens/confirm_problem.html:6 +#: templates/web/default/tokens/confirm_problem.html:7 +msgid "You have successfully confirmed your problem" +msgstr "Du har no stadfesta problemet ditt" + +#: templates/web/default/tokens/confirm_update.html:11 +#: templates/web/default/tokens/confirm_update.html:12 +msgid "" +"You have successfully confirmed your update and you can now <a href=\"" +"%s\">view it on the site</a>." +msgstr "Du har no stadfesta oppdateringa di <a href=\"%s\">og kan sjå ho på denne nettstaden</a>." + +#: templates/web/default/tokens/confirm_alert.html:11 +msgid "You have successfully created your alert." +msgstr "Du har oppretta varselet ditt." + +#: templates/web/default/tokens/confirm_alert.html:9 +msgid "You have successfully deleted your alert." +msgstr "Sletting av varselet ditt var vellukka." + +#: perllib/FixMyStreet/App/Controller/Report/New.pm:647 +#: perllib/FixMyStreet/App/Controller/Report/Update.pm:131 +msgid "" +"You have successfully signed in; please check and confirm your details are " +"accurate:" +msgstr "Du har no logga inn. Ver venleg og sjekk og stadfest at detaljane dine er korrekte:" + +#: templates/web/default/email_sent.html:26 +msgid "" +"You must now click the link in the email we've just sent you — if you " +"do not, %s." +msgstr "" +"Du må no opna lenkja i e-posten vi akkurat sende deg — dersom du ikkje " +"gjer det, %s" + +#: templates/web/default/admin/report_edit.html:35 +msgid "You really want to resend?" +msgstr "Ynskjer du verkeleg å senda på nytt?" + +#: templates/web/default/my/my.html templates/web/default/my/my.html:14 +#: templates/web/default/my/my.html:3 +msgid "Your Reports" +msgstr "Rapportane dine" + +#: templates/web/default/auth/general.html:27 +msgid "Your email address:" +msgstr "e-postadressa di:" + +#: templates/web/default/alert/list.html:122 +#: templates/web/default/report/display.html:134 +#: templates/web/default/report/new/fill_in_details_form.html:124 +msgid "Your email:" +msgstr "E-posten din" + +#: templates/web/default/auth/general.html:59 +#: templates/web/default/contact/index.html:68 +#: templates/web/default/report/display.html:210 +#: templates/web/default/report/new/fill_in_details_form.html:203 +msgid "Your name:" +msgstr "Namnet ditt:" + +#: templates/web/default/auth/change_password.html:6 +msgid "Your password has been changed" +msgstr "Passordet ditt har vorte endra" + +#: templates/web/default/footer.html:7 templates/web/fiksgatami/footer.html:6 +#: templates/web/reading/footer.html:7 +msgid "Your reports" +msgstr "Oppdateringane dine" + +#: templates/web/default/my/my.html:45 +msgid "Your updates" +msgstr "Oppdateringane dine" + +#: templates/web/default/contact/index.html:76 +msgid "Your email:" +msgstr "E-posten din:" + +#: templates/web/default/admin/timeline.html:6 +msgid "by %s" +msgstr "av %s" + +#: templates/web/default/reports/council.html:6 +#: templates/web/default/reports/council.html:7 +msgid "council" +msgstr "administrasjon" + +#: templates/web/default/admin/report_edit.html:15 +msgid "didn't use map" +msgstr "brukte ikkje kart" + +#: templates/web/default/admin/index.html:15 +msgid "from %d different users" +msgstr "frå %d ulike brukarar" + +#: perllib/Utils.pm:248 +msgid "less than a minute" +msgstr "mindre enn eitt minutt" + +#: templates/web/default/report/updates.html:18 +msgid "marked as %s" +msgstr "markert som %s" + +#: templates/web/default/report/updates.html:16 +msgid "marked as fixed" +msgstr "markert som løyst" + +#: perllib/FixMyStreet/App/Controller/Admin.pm:109 +#: 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:116 +msgid "or" +msgstr "eller" + +#: templates/web/default/admin/report_edit.html:15 +msgid "originally entered" +msgstr "søkte etter" + +#: templates/web/default/admin/report_edit.html:16 +msgid "other areas:" +msgstr "andre område:" + +#: templates/web/default/report/updates.html:17 +msgid "reopened" +msgstr "opna på nytt" + +#: templates/web/default/report/new/fill_in_details_form.html:11 +#: templates/web/default/report/new/fill_in_details_form.html:14 +msgid "the local council" +msgstr "den lokale administrasjonen" + +#: perllib/FixMyStreet/DB/Result/Problem.pm:520 +msgid "the map was not used so pin location may be inaccurate" +msgstr "karta vart ikkje brukt, så nåleposisjon kan vera unøyaktig" + +#: bin/send-reports:176 +msgid "this type of local problem" +msgstr "denne typen lokalt problem" + +#: perllib/Utils.pm:222 +msgid "today" +msgstr "i dag" + +#: templates/web/default/admin/report_edit.html:15 +msgid "used map" +msgstr "brukte kart" + +#: templates/web/default/admin/update_edit.html:26 +msgid "user is from same council as problem - %d" +msgstr "brukaren er frå same administrasjon som problemet – %d" + +#: templates/web/default/admin/update_edit.html:29 +msgid "user is problem owner" +msgstr "brukaren er eigaren av problemet" + +#: templates/web/default/reports/council.html +#: templates/web/default/reports/council.html:3 +msgid "ward" +msgstr "bydel" + +#: templates/web/default/email_sent.html:15 +#: templates/web/default/email_sent.html:3 +msgid "we'll hang on to your alert while you're checking your email." +msgstr "vi tek vare på varselet ditt medan du sjekkar e-posten din." + +#: templates/web/default/email_sent.html:3 +#: templates/web/default/email_sent.html:7 +msgid "we'll hang on to your problem report while you're checking your email." +msgstr "vi tek vare på rapporten din medan du sjekkar e-posten din." + +#: templates/web/default/email_sent.html:11 +#: templates/web/default/email_sent.html:3 +msgid "we'll hang on to your update while you're checking your email." +msgstr "vi tek vare på oppdateringa di medan du sjekkar e-posten din." + +#: templates/web/default/email_sent.html:14 +#: templates/web/default/email_sent.html:3 +msgid "your alert will not be activated" +msgstr "varselet ditt vil ikkje aktiverast" + +#: templates/web/default/email_sent.html:3 +#: templates/web/default/email_sent.html:6 +msgid "your problem will not be posted" +msgstr "vil problemet ditt ikkje publiserast" + +#: templates/web/default/email_sent.html:10 +#: templates/web/default/email_sent.html:3 +msgid "your update will not be posted" +msgstr "oppdateringa di vil ikkje publiserast" + +#: templates/web/default/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" + +#: templates/web/default/report/new/councils_text_none.html:5 +#, perl-format +msgid "We do not yet have details for the council that covers this location." +msgid_plural "" +"We do not yet have details for the councils that cover this location." +msgstr[0] "Vi har enno ikkje detaljar for administrasjonen som dekkjer denne staden." +msgstr[1] "Vi har enno ikkje detaljar for administrasjonane som dekkjer denne staden." + +#: templates/web/default/front/stats.html:12 +#, perl-format +msgid "<big>%s</big> report in past week" +msgid_plural "<big>%s</big> reports in past week" +msgstr[0] "<big>%s</big> rapport siste veke" +msgstr[1] "<big>%s</big> rapportar siste veke" + +#: templates/web/default/front/stats.html:23 +#, perl-format +msgid "<big>%s</big> fixed in past month" +msgid_plural "<big>%s</big> fixed in past month" +msgstr[0] "<big>%s</big> løyst siste månad" +msgstr[1] "<big>%s</big> løyst siste månad" + +#: 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/default/report/new/councils_text_some.html:14 +#, perl-format +msgid "" +"We do <strong>not</strong> yet have details for the other council that " +"covers this location." +msgid_plural "" +"We do <strong>not</strong> yet have details for the other councils that " +"cover this location." +msgstr[0] "Vi har enno <strong>ikkje</strong> detaljane for den andre administrasjonen som dekkjer denne staden." +msgstr[1] "Vi har enno <strong>ikkje</strong> detaljane for dei andre administrasjonane som dekkjer denne staden." diff --git a/notes/INSTALL b/notes/INSTALL index 261865700..56be765db 100644 --- a/notes/INSTALL +++ b/notes/INSTALL @@ -14,9 +14,9 @@ conf/packages is a list of Debian packages that are needed, so install them if you're on Debian/Ubuntu. You'll also probably need to install lots of CPAN modules, see the section on that below. -FixMyStreet expects a PostgreSQL database, so set one of them up - the schema -is available in db/schema.sql. You will also need to load in db/alert_types.sql -to populate the alert types table. +FixMyStreet expects a PostgreSQL database with the postGIS extension, so set one +of them up - the schema is available in db/schema.sql. You will also need to load +in db/alert_types.sql to populate the alert types table. Copy conf/general-example to conf/general and set it up appropriately: * provide the relevant database connection details diff --git a/perl-external/files.txt b/perl-external/files.txt index f594e80af..781a2564e 100644 --- a/perl-external/files.txt +++ b/perl-external/files.txt @@ -126,6 +126,7 @@ /authors/id/G/GA/GAAS/Digest-HMAC-1.02.tar.gz /authors/id/G/GA/GAAS/Encode-Locale-1.01.tar.gz /authors/id/G/GA/GAAS/File-Listing-6.00.tar.gz +/authors/id/G/GA/GAAS/HTML-Form-6.00.tar.gz /authors/id/G/GA/GAAS/HTML-Parser-3.68.tar.gz /authors/id/G/GA/GAAS/HTTP-Cookies-6.00.tar.gz /authors/id/G/GA/GAAS/HTTP-Daemon-6.00.tar.gz @@ -144,6 +145,7 @@ /authors/id/G/GE/GETTY/HTTP-Body-1.11.tar.gz /authors/id/G/GR/GRODITI/MooseX-Types-Common-0.001002.tar.gz /authors/id/G/GR/GROMMEL/Math-Round-0.06.tar.gz +/authors/id/G/GW/GWILLIAMS/DateTime-Format-W3CDTF-0.06.tar.gz /authors/id/I/IL/ILMARI/Class-Unload-0.07.tar.gz /authors/id/I/IN/INGY/Spiffy-0.30.tar.gz /authors/id/I/IN/INGY/Test-Base-0.59.tar.gz diff --git a/perl-external/minicpan/modules/02packages.details.txt.gz b/perl-external/minicpan/modules/02packages.details.txt.gz Binary files differindex d78040bab..dda827b07 100644 --- a/perl-external/minicpan/modules/02packages.details.txt.gz +++ b/perl-external/minicpan/modules/02packages.details.txt.gz diff --git a/perl-external/modules.txt b/perl-external/modules.txt index 4568fc706..f2e6a92ad 100644 --- a/perl-external/modules.txt +++ b/perl-external/modules.txt @@ -27,6 +27,7 @@ DBIx::Class::Storage::DBI DateTime::Format::HTTP DateTime::Format::ISO8601 DateTime::Format::Pg +DateTime::Format::W3CDTF Email::Address Email::MIME Email::Send @@ -34,6 +35,7 @@ Email::Simple Email::Valid File::Path HTML::Entities +HTML::Form HTTP::Server::Simple HTTP::Server::Simple::CGI IO::String diff --git a/perllib/FixMyStreet/App/Controller/Admin.pm b/perllib/FixMyStreet/App/Controller/Admin.pm index a34737844..c988b23c1 100644 --- a/perllib/FixMyStreet/App/Controller/Admin.pm +++ b/perllib/FixMyStreet/App/Controller/Admin.pm @@ -572,6 +572,9 @@ sub report_edit : Path('report_edit') : Args(1) { elsif ( $c->req->param('banuser') ) { $c->forward('ban_user'); } + elsif ( $c->req->param('rotate_photo') ) { + $c->forward('rotate_photo'); + } elsif ( $c->req->param('submit') ) { $c->forward('check_token'); @@ -1161,6 +1164,31 @@ sub check_email_for_abuse : Private { return 1; } +=head2 rotate_photo + +Rotate a photo 90 degrees left or right + +=cut + +sub rotate_photo : Private { + my ( $self, $c ) =@_; + + my $direction = $c->req->param('rotate_photo'); + + return unless $direction =~ /Left/ or $direction =~ /Right/; + + my $photo = _rotate_image( $c->stash->{problem}->photo, $direction =~ /Left/ ? -90 : 90 ); + + if ( $photo ) { + $c->stash->{rotated} = 1; + $c->stash->{problem}->photo( $photo ); + $c->stash->{problem}->update(); + } + + return 1; +} + + =head2 check_page_allowed Checks if the current catalyst action is in the list of allowed pages and @@ -1207,6 +1235,19 @@ sub trim { return $e; } +sub _rotate_image { + my ($photo, $direction) = @_; + use Image::Magick; + my $image = Image::Magick->new; + $image->BlobToImage($photo); + my $err = $image->Rotate($direction); + return 0 if $err; + my @blobs = $image->ImageToBlob(); + undef $image; + return $blobs[0]; +} + + =head1 AUTHOR Struan Donald diff --git a/perllib/FixMyStreet/App/Controller/Report/New.pm b/perllib/FixMyStreet/App/Controller/Report/New.pm index c6ede88f7..e982d6a4c 100644 --- a/perllib/FixMyStreet/App/Controller/Report/New.pm +++ b/perllib/FixMyStreet/App/Controller/Report/New.pm @@ -911,6 +911,13 @@ sub check_for_errors : Private { %{ $c->stash->{report}->check_for_errors }, ); + # if they're got the login details wrong when signing in then + # we don't care about the name field even though it's validated + # by the user object + if ( $c->req->param('submit_sign_in') and $field_errors{password} ) { + delete $field_errors{name}; + } + # add the photo error if there is one. if ( my $photo_error = delete $c->stash->{photo_error} ) { $field_errors{photo} = $photo_error; diff --git a/perllib/FixMyStreet/App/Controller/Reports.pm b/perllib/FixMyStreet/App/Controller/Reports.pm index 0a4ae4609..0587a627a 100644 --- a/perllib/FixMyStreet/App/Controller/Reports.pm +++ b/perllib/FixMyStreet/App/Controller/Reports.pm @@ -110,6 +110,8 @@ sub ward : Path : Args(2) { $c->stash->{council_url} = '/reports/' . $council_short; + $c->stash->{stats} = $c->cobrand->get_report_stats(); + my $pins = $c->stash->{pins}; $c->stash->{page} = 'reports'; # So the map knows to make clickable pins @@ -349,17 +351,12 @@ sub load_and_group_problems : Private { $c->stash->{pager} = $problems->pager; $problems = $problems->cursor; # Raw DB cursor for speed - my ( %fixed, %open, @pins, $total, $cobrand_total ); + my ( %fixed, %open, @pins ); my $re_councils = join('|', keys %{$c->stash->{areas_info}}); my @cols = ( 'id', 'council', 'state', 'areas', 'latitude', 'longitude', 'title', 'cobrand', 'duration', 'age' ); while ( my @problem = $problems->next ) { my %problem = zip @cols, @problem; $c->log->debug( $problem{'cobrand'} . ', cobrand is ' . $c->cobrand->moniker ); - if ( $problem{'cobrand'} && $problem{'cobrand'} eq $c->cobrand->moniker ) { - $cobrand_total++; - } else { - $total++; - } if ( !$problem{council} ) { # Problem was not sent to any council, add to possible councils $problem{councils} = 0; @@ -382,8 +379,6 @@ sub load_and_group_problems : Private { fixed => \%fixed, open => \%open, pins => \@pins, - cobrand_count => $cobrand_total || 0, - total_count => $total || 0, ); return 1; diff --git a/perllib/FixMyStreet/App/Controller/Rss.pm b/perllib/FixMyStreet/App/Controller/Rss.pm index 7fddbed97..822780b81 100755 --- a/perllib/FixMyStreet/App/Controller/Rss.pm +++ b/perllib/FixMyStreet/App/Controller/Rss.pm @@ -251,6 +251,12 @@ sub add_row : Private { (my $link = $alert_type->item_link) =~ s/{{(.*?)}}/$row->{$1}/g; (my $desc = _($alert_type->item_description)) =~ s/{{(.*?)}}/$row->{$1}/g; my $url = $c->uri_for( $link ); + + if ( $row->{postcode} ) { + my $pc = $c->cobrand->format_postcode( $row->{postcode} ); + $title .= ", $pc"; + } + my %item = ( title => ent($title), link => $url, @@ -266,8 +272,8 @@ sub add_row : Private { } if ( $row->{used_map} ) { - #my $address = $c->cobrand->find_closest_address_for_rss( $row->{latitude}, $row->{longitude} ); - #$item{description} .= ent("\n<br>$address"); + my $address = $c->cobrand->find_closest_address_for_rss( $row->{latitude}, $row->{longitude}, $row ); + $item{description} .= ent("\n<br>$address") if $address; } my $recipient_name = $c->cobrand->contact_name; diff --git a/perllib/FixMyStreet/Cobrand/Default.pm b/perllib/FixMyStreet/Cobrand/Default.pm index 1e87468ac..b5a1cd8d3 100644 --- a/perllib/FixMyStreet/Cobrand/Default.pm +++ b/perllib/FixMyStreet/Cobrand/Default.pm @@ -545,10 +545,15 @@ Used by send-reports to attach nearest things to the bottom of the report =cut sub find_closest { - my ( $self, $latitude, $longitude ) = @_; + my ( $self, $latitude, $longitude, $problem ) = @_; my $str = ''; if ( my $j = FixMyStreet::Geocode::Bing::reverse( $latitude, $longitude ) ) { + # cache the bing results for use in alerts + if ( $problem ) { + $problem->geocode( $j ); + $problem->update; + } if ($j->{resourceSets}[0]{resources}[0]{name}) { $str .= sprintf(_("Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s"), $j->{resourceSets}[0]{resources}[0]{name}) . "\n\n"; @@ -576,23 +581,55 @@ Used by rss feeds to provide a bit more context =cut sub find_closest_address_for_rss { - my ( $self, $latitude, $longitude ) = @_; + my ( $self, $latitude, $longitude, $problem ) = @_; my $str = ''; - if ( my $j = FixMyStreet::Geocode::Bing::reverse( $latitude, $longitude, 1 ) ) { - if ($j->{resourceSets}[0]{resources}[0]{name}) { - my $address = $j->{resourceSets}[0]{resources}[0]{address}; - my @address; - push @address, $address->{addressLine} if $address->{addressLine} ne 'Street'; - push @address, $address->{locality}; - $str .= sprintf(_("Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s"), - join( ', ', @address ) ); - } + my $j; + if ( $problem && ref($problem) =~ /FixMyStreet/ && $problem->can( 'geocode' ) ) { + $j = $problem->geocode; + } else { + $problem = FixMyStreet::App->model('DB::Problem')->find( { id => $problem->{id} } ); + $j = $problem->geocode; + } + + # if we've not cached it then we don't want to look it up in order to avoid + # hammering the bing api + # if ( !$j ) { + # $j = FixMyStreet::Geocode::Bing::reverse( $latitude, $longitude, 1 ); + + # $problem->geocode( $j ); + # $problem->update; + # } + + if ($j && $j->{resourceSets}[0]{resources}[0]{name}) { + my $address = $j->{resourceSets}[0]{resources}[0]{address}; + my @address; + push @address, $address->{addressLine} if $address->{addressLine} and $address->{addressLine} !~ /^Street$/i; + push @address, $address->{locality} if $address->{locality}; + $str .= sprintf(_("Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s"), + join( ', ', @address ) ) if @address; } return $str; } +=head2 format_postcode + +Takes a postcode string and if it looks like a valid postcode then transforms it +into the canonical postcode. + +=cut + +sub format_postcode { + my ( $self, $postcode ) = @_; + + if ( $postcode ) { + $postcode = mySociety::PostcodeUtil::canonicalise_postcode($postcode) + if $postcode && mySociety::PostcodeUtil::is_valid_postcode($postcode); + } + + return $postcode; +} =head2 council_check Paramters are COUNCILS, QUERY, CONTEXT. Return a boolean indicating whether @@ -960,5 +997,13 @@ to be resized then return 0; sub default_photo_resize { return 0; } +=head2 get_report_stats + +Get stats to display on the council reports page + +=cut + +sub get_report_stats { return 0; } + 1; diff --git a/perllib/FixMyStreet/Cobrand/Reading.pm b/perllib/FixMyStreet/Cobrand/Reading.pm index f4fd0dc7a..8e98931fd 100644 --- a/perllib/FixMyStreet/Cobrand/Reading.pm +++ b/perllib/FixMyStreet/Cobrand/Reading.pm @@ -77,5 +77,32 @@ sub recent_photos { return $self->problems->recent_photos( $num, $lat, $lon, $dist ); } -1; +sub get_report_stats { + my $self = shift; + + my ( $cobrand, $main_site ) = ( 0, 0 ); + + $self->{c}->log->debug( 'X' x 60 ); + my $stats = $self->{c}->model('DB::Problem')->search( + { confirmed => { '>=', '2011-11-01' } }, + { + select => [ { count => 'id', -as => 'cobrand_count' }, 'cobrand' ], + group_by => [qw/cobrand/] + } + ); + + while ( my $stat = $stats->next ) { + if ( $stat->cobrand eq $self->moniker ) { + $cobrand += $stat->get_column( 'cobrand_count' ); + } else { + $main_site += $stat->get_column( 'cobrand_count' ); + } + } + return { + cobrand => $cobrand, + main_site => $main_site, + }; +} + +1; diff --git a/perllib/FixMyStreet/Cobrand/Southampton.pm b/perllib/FixMyStreet/Cobrand/Southampton.pm index bd461f5e2..213dd533b 100644 --- a/perllib/FixMyStreet/Cobrand/Southampton.pm +++ b/perllib/FixMyStreet/Cobrand/Southampton.pm @@ -64,6 +64,7 @@ sub all_councils_report { sub disambiguate_location { return { + town => 'Southampton', centre => '50.913822,-1.400493', span => '0.084628,0.15701', bounds => [ '50.871508,-1.478998', '50.956136,-1.321988' ], diff --git a/perllib/FixMyStreet/DB/Result/Problem.pm b/perllib/FixMyStreet/DB/Result/Problem.pm index 9ff19efb6..7ceabf1da 100644 --- a/perllib/FixMyStreet/DB/Result/Problem.pm +++ b/perllib/FixMyStreet/DB/Result/Problem.pm @@ -82,6 +82,8 @@ __PACKAGE__->add_columns( { data_type => "text", is_nullable => 1 }, "flagged", { data_type => "boolean", default_value => \"false", is_nullable => 0 }, + "geocode", + { data_type => "bytea", is_nullable => 1 }, ); __PACKAGE__->set_primary_key("id"); __PACKAGE__->has_many( @@ -104,8 +106,8 @@ __PACKAGE__->has_many( ); -# Created by DBIx::Class::Schema::Loader v0.07010 @ 2011-07-29 16:26:23 -# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:ifvx9FOlbui66hPyzNIAPA +# Created by DBIx::Class::Schema::Loader v0.07010 @ 2011-09-19 14:38:43 +# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:nq8Ufn/SEoDGSrrGlHIxag # Add fake relationship to stored procedure table __PACKAGE__->has_one( @@ -134,6 +136,27 @@ __PACKAGE__->filter_column( }, } ); + +__PACKAGE__->filter_column( + geocode => { + filter_from_storage => sub { + my $self = shift; + my $ser = shift; + return undef unless defined $ser; + my $h = new IO::String($ser); + return RABX::wire_rd($h); + }, + filter_to_storage => sub { + my $self = shift; + my $data = shift; + my $ser = ''; + my $h = new IO::String($ser); + RABX::wire_wr( $data, $h ); + return $ser; + }, + } +); + use DateTime::TimeZone; use Image::Size; use Moose; diff --git a/perllib/FixMyStreet/DB/ResultSet/AlertType.pm b/perllib/FixMyStreet/DB/ResultSet/AlertType.pm index c1a5d65c9..32654e534 100644 --- a/perllib/FixMyStreet/DB/ResultSet/AlertType.pm +++ b/perllib/FixMyStreet/DB/ResultSet/AlertType.pm @@ -9,6 +9,8 @@ use mySociety::EmailUtil; use mySociety::Gaze; use mySociety::Locale; use mySociety::MaPit; +use IO::String; +use RABX; # Child must have confirmed, id, email, state(!) columns # If parent/child, child table must also have name and text @@ -82,12 +84,21 @@ sub email_alerts ($) { } my $url = $cobrand->base_url_for_emails( $row->{alert_cobrand_data} ); + # this is currently only for new_updates if ($row->{item_text}) { $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 } else { - $data{data} .= $url . "/report/" . $row->{id} . " - $row->{title}\n\n"; + my $postcode = $cobrand->format_postcode( $row->{postcode} ); + $postcode = ", $postcode" if $postcode; + $data{data} .= $url . "/report/" . $row->{id} . " - $row->{title}$postcode\n\n"; + if ( exists $row->{geocode} && $row->{geocode} && $ref =~ /ward|council/ ) { + my $nearest_st = _get_address_from_gecode( $row->{geocode} ); + $data{data} .= $nearest_st if $nearest_st; + } + $data{data} .= "\n\n------\n\n"; } if (!$data{alert_user_id}) { %data = (%data, %$row); @@ -134,7 +145,7 @@ sub email_alerts ($) { }; my $states = "'" . join( "', '", FixMyStreet::DB::Result::Problem::visible_states() ) . "'"; my %data = ( template => $template, data => '', alert_id => $alert->id, alert_email => $alert->user->email, lang => $alert->lang, cobrand => $alert->cobrand, cobrand_data => $alert->cobrand_data ); - my $q = "select problem.id, problem.title from problem_find_nearby(?, ?, ?) as nearby, problem, users + my $q = "select problem.id, problem.postcode, problem.geocode, problem.title from problem_find_nearby(?, ?, ?) as nearby, problem, users where nearby.problem_id = problem.id and problem.user_id = users.id and problem.state in ($states) @@ -150,7 +161,14 @@ sub email_alerts ($) { alert_id => $alert->id, parameter => $row->{id}, } ); - $data{data} .= $url . "/report/" . $row->{id} . " - $row->{title}\n\n"; + my $postcode = $cobrand->format_postcode( $row->{postcode} ); + $postcode = ", $postcode" if $postcode; + $data{data} .= $url . "/report/" . $row->{id} . " - $row->{title}$postcode\n\n"; + if ( exists $row->{geocode} && $row->{geocode} ) { + my $nearest_st = _get_address_from_gecode( $row->{geocode} ); + $data{data} .= $nearest_st if $nearest_st; + } + $data{data} .= "\n\n------\n\n"; } _send_aggregated_alert_email(%data) if $data{data}; } @@ -210,4 +228,23 @@ sub _send_aggregated_alert_email(%) { } } +sub _get_address_from_gecode { + my $geocode = shift; + + return '' unless defined $geocode; + my $h = new IO::String($geocode); + my $data = RABX::wire_rd($h); + + my $str = ''; + + my $address = $data->{resourceSets}[0]{resources}[0]{address}; + my @address; + push @address, $address->{addressLine} if $address->{addressLine} && $address->{addressLine} ne 'Street'; + push @address, $address->{locality} if $address->{locality}; + $str .= sprintf(_("Nearest road to the pin placed on the map (automatically generated by Bing Maps): %s\n\n"), + join( ', ', @address ) ) if @address; + + return $str; +} + 1; diff --git a/perllib/FixMyStreet/Map/FMS.pm b/perllib/FixMyStreet/Map/FMS.pm index d5edac763..24842c861 100644 --- a/perllib/FixMyStreet/Map/FMS.pm +++ b/perllib/FixMyStreet/Map/FMS.pm @@ -47,11 +47,13 @@ sub map_tiles { "http://tilma.mysociety.org/sv/$z/$x/$y.png", ]; } else { + my $url = "g=701"; + $url .= "&productSet=mmOS" if $z > 10; return [ - "http://ecn.t0.tiles.virtualearth.net/tiles/r" . get_quadkey($x-1, $y-1, $z) . ".png?g=701&productSet=mmOS", - "http://ecn.t1.tiles.virtualearth.net/tiles/r" . get_quadkey($x, $y-1, $z) . ".png?g=701&productSet=mmOS", - "http://ecn.t2.tiles.virtualearth.net/tiles/r" . get_quadkey($x-1, $y, $z) . ".png?g=701&productSet=mmOS", - "http://ecn.t3.tiles.virtualearth.net/tiles/r" . get_quadkey($x, $y, $z) . ".png?g=701&productSet=mmOS", + "http://ecn.t0.tiles.virtualearth.net/tiles/r" . get_quadkey($x-1, $y-1, $z) . ".png?$url", + "http://ecn.t1.tiles.virtualearth.net/tiles/r" . get_quadkey($x, $y-1, $z) . ".png?$url", + "http://ecn.t2.tiles.virtualearth.net/tiles/r" . get_quadkey($x-1, $y, $z) . ".png?$url", + "http://ecn.t3.tiles.virtualearth.net/tiles/r" . get_quadkey($x, $y, $z) . ".png?$url", ]; } } diff --git a/perllib/Open311.pm b/perllib/Open311.pm index f3f642895..e26e3e4c6 100644 --- a/perllib/Open311.pm +++ b/perllib/Open311.pm @@ -14,6 +14,8 @@ has test_mode => ( is => 'ro', isa => 'Bool' ); has test_uri_used => ( is => 'rw', 'isa' => 'Str' ); has test_get_returns => ( is => 'rw' ); has endpoints => ( is => 'rw', default => sub { { services => 'services.xml', requests => 'requests.xml' } } ); +has debug => ( is => 'ro', isa => 'Bool', default => 0 ); +has debug_details => ( is => 'rw', 'isa' => 'Str', default => '' ); sub get_service_list { my $self = shift; @@ -48,12 +50,16 @@ Submitted via FixMyStreet EOT ; + my ( $firstname, $lastname ) = ( $problem->user->name =~ /(\w+)\s+(.+)/ ); + my $params = { lat => $problem->latitude, long => $problem->longitude, email => $problem->user->email, description => $description, service_code => $service_code, + first_name => $firstname, + last_name => $lastname || '', }; if ( $problem->user->phone ) { @@ -89,7 +95,7 @@ EOT } } - warn sprintf( "Failed to submit problem %s over Open311, response\n: %s", $problem->id, $response ); + warn sprintf( "Failed to submit problem %s over Open311, response\n: %s\n%s", $problem->id, $response, $self->debug_details ); return 0; } } @@ -134,6 +140,8 @@ sub _get { $uri->path( $uri->path . $path ); $uri->query_form( $params ); + $self->debug_details( $self->debug_details . "\nrequest:" . $uri->as_string ); + my $content; if ( $self->test_mode ) { $content = $self->test_get_returns->{ $path }; @@ -160,14 +168,20 @@ sub _post { %{ $params } ]; + $self->debug_details( $self->debug_details . "\nrequest:" . $req->as_string ); + my $ua = LWP::UserAgent->new(); my $res = $ua->request( $req ); if ( $res->is_success ) { return $res->decoded_content; } else { - warn "request failed: " . $res->status_line; - warn $self->_process_error( $res->decoded_content ); + warn sprintf( + "request failed: %s\nerror: %s\n%s", + $res->status_line, + $self->_process_error( $res->decoded_content ), + $self->debug_details + ); return 0; } } diff --git a/t/app/controller/alert_new.t b/t/app/controller/alert_new.t index 580a5ad9a..950666d2d 100644 --- a/t/app/controller/alert_new.t +++ b/t/app/controller/alert_new.t @@ -452,8 +452,9 @@ subtest "Test normal alert signups and that alerts are sent" => sub { $count++ if $_->body =~ /The following updates have been left on this problem:/; $count++ if $_->body =~ /The following new problems have been reported to City of\s*Edinburgh Council:/; $count++ if $_->body =~ /The following nearby problems have been added:/; + $count++ if $_->body =~ / - Testing, EH1 1BB/; } - is $count, 3, 'Three emails with the right things in them'; + is $count, 5, 'Five emails with the right things in them'; my $email = $emails[0]; like $email->body, qr/Other User/, 'Update name given'; diff --git a/t/app/controller/auth.t b/t/app/controller/auth.t index fef45ac90..efc5e60e6 100644 --- a/t/app/controller/auth.t +++ b/t/app/controller/auth.t @@ -24,16 +24,16 @@ $mech->not_logged_in_ok; $mech->get_ok('/auth'); for my $test ( - [ '' => 'enter your email' ], - [ 'not an email' => 'check your email address is correct' ], - [ 'bob@foo' => 'check your email address is correct' ], - [ 'bob@foonaoedudnueu.co.uk' => 'check your email address is correct' ], + [ '' => 'Please enter your email' ], + [ 'not an email' => 'Please check your email address is correct' ], + [ 'bob@foo' => 'Please check your email address is correct' ], + [ 'bob@foonaoedudnueu.co.uk' => 'Please check your email address is correct' ], ) { my ( $email, $error_message ) = @$test; pass "--- testing bad email '$email' gives error '$error_message'"; $mech->get_ok('/auth'); - $mech->content_lacks($error_message); + is_deeply $mech->form_errors, [], 'no errors initially'; $mech->submit_form_ok( { form_name => 'general_auth', @@ -43,7 +43,7 @@ for my $test ( "try to create an account with email '$email'" ); is $mech->uri->path, '/auth', "still on auth page"; - $mech->content_contains($error_message); + is_deeply $mech->form_errors, [ $error_message ], 'no errors initially'; } # create a new account diff --git a/t/app/controller/report_new.t b/t/app/controller/report_new.t index 9ec8fa4a8..15237e041 100644 --- a/t/app/controller/report_new.t +++ b/t/app/controller/report_new.t @@ -1,4 +1,5 @@ use strict; +use utf8; # sign in error message has – in it use warnings; use Test::More; use utf8; @@ -428,6 +429,55 @@ foreach my $test ( }; } +# this test to make sure that we don't see spurious error messages about +# the name being blank when there is a sign in error +subtest "test password errors for a user who is signing in as they report" => 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"; + + # setup the user. + ok $user->update( { + name => 'Joe Bloggs', + phone => '01234 567 890', + password => 'secret2', + } ), "set user details"; + + # 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 => 'skip this step', }, + "follow 'skip this step' link" ); + + $mech->submit_form_ok( + { + button => 'submit_sign_in', + with_fields => { + title => 'Test Report', + detail => 'Test report details.', + photo => '', + email => 'test-2@example.com', + password_sign_in => 'secret1', + category => 'Street lighting', + } + }, + "submit with wrong password" + ); + + # check that we got the errors expected + is_deeply $mech->form_errors, [ + 'There was a problem with your email/password combination. Passwords and user accounts are a brand new service, so you probably do not have one yet – please fill in the right hand side of this form to get one.' + ], "check there were errors"; +}; + subtest "test report creation for a user who is signing in as they report" => sub { $mech->log_out_ok; $mech->clear_emails_ok; diff --git a/t/app/controller/rss.t b/t/app/controller/rss.t new file mode 100644 index 000000000..c6ab20574 --- /dev/null +++ b/t/app/controller/rss.t @@ -0,0 +1,125 @@ +use strict; +use warnings; +use Test::More; + +use FixMyStreet::TestMech; + +my $mech = FixMyStreet::TestMech->new; + +my $dt = DateTime->new( + year => 2011, + month => 10, + day => 10 +); + +my $user1 = FixMyStreet::App->model('DB::User') + ->find_or_create( { email => 'reporter@example.com', name => 'Reporter User' } ); + +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 => 'Testing', + detail => 'Testing Detail', + used_map => 1, + name => $user1->name, + anonymous => 0, + state => 'confirmed', + confirmed => $dt, + lastupdate => $dt, + whensent => $dt->clone->add( minutes => 5 ), + lang => 'en-gb', + service => '', + cobrand => 'default', + cobrand_data => '', + send_questionnaire => 1, + latitude => '55.951963', + longitude => '-3.189944', + user_id => $user1->id, +} ); + + +$mech->get_ok("/rss/pc/EH11BB/2"); +$mech->content_contains( "Testing, 10th October, EH1 1BB" ); +$mech->content_lacks( 'Nearest road to the pin' ); + +$report->geocode( +{ + 'traceId' => 'ae7c4880b70b423ebc8ab4d80961b3e9|LTSM001158|02.00.71.1600|LTSMSNVM002010, LTSMSNVM001477', + 'statusDescription' => 'OK', + 'brandLogoUri' => 'http://dev.virtualearth.net/Branding/logo_powered_by.png', + 'resourceSets' => [ + { + 'resources' => [ + { + 'geocodePoints' => [ + { + 'calculationMethod' => 'Interpolation', + 'coordinates' => [ + '55.9532357007265', + '-3.18906001746655' + ], + 'usageTypes' => [ + 'Display', + 'Route' + ], + 'type' => 'Point' + } + ], + 'entityType' => 'Address', + 'name' => '18 N Bridge, Edinburgh EH1 1', + 'point' => { + 'coordinates' => [ + '55.9532357007265', + '-3.18906001746655' + ], + 'type' => 'Point' + }, + 'bbox' => [ + '55.9493729831558', + '-3.19825819222605', + '55.9570984182972', + '-3.17986184270704' + ], + 'matchCodes' => [ + 'Good' + ], + 'address' => { + 'countryRegion' => 'United Kingdom', + 'adminDistrict2' => 'Edinburgh City', + 'adminDistrict' => 'Scotland', + 'addressLine' => '18 North Bridge', + 'formattedAddress' => '18 N Bridge, Edinburgh EH1 1', + 'postalCode' => 'EH1 1', + 'locality' => 'Edinburgh' + }, + 'confidence' => 'Medium', + '__type' => 'Location:http://schemas.microsoft.com/search/local/ws/rest/v1' + } + ], + 'estimatedTotal' => 1 + } + ], + 'copyright' => "Copyright \x{a9} 2011 Microsoft and its suppliers. All rights reserved. This API cannot be accessed and the content and any results may not be used, reproduced or transmitted in any manner without express written permission from Microsoft Corporation.", + 'statusCode' => 200, + 'authenticationResultCode' => 'ValidCredentials' + } +); +$report->postcode('eh11bb'); +$report->update(); + +$mech->get_ok("/rss/pc/EH11BB/2"); +$mech->content_contains( "Testing, 10th October, EH1 1BB" ); +$mech->content_contains( '18 North Bridge, Edinburgh' ); + +$report->postcode('Princes St, Edinburgh'); +$report->update(); + +$mech->get_ok("/rss/pc/EH11BB/2"); +$mech->content_contains( "Testing, 10th October, Princes St, Edinburgh" ); + +$report->delete(); +$user1->delete(); + +done_testing(); diff --git a/t/app/model/alert_type.t b/t/app/model/alert_type.t index c7bfe171c..1adc584d7 100644 --- a/t/app/model/alert_type.t +++ b/t/app/model/alert_type.t @@ -140,5 +140,214 @@ for my $test ( }; } +my $now = DateTime->now(); +$report->confirmed( $now->ymd . ' ' . $now->hms ); +$report->update(); + +my $council_alert = FixMyStreet::App->model('DB::Alert')->find_or_create( + { + user => $user2, + parameter => 2504, + parameter2 => 2504, + alert_type => 'council_problems', + whensubscribed => $dt->ymd . ' ' . $dt->hms, + confirmed => 1, + } +); + +for my $test ( + { + postcode => 'SW1A 1AA', + expected_postcode => 'SW1A 1AA', + }, + { + postcode => 'sw1a 1AA', + expected_postcode => 'SW1A 1AA', + }, + { + postcode => 'SW1A 1aa', + expected_postcode => 'SW1A 1AA', + }, + { + postcode => 'SW1A1AA', + expected_postcode => 'SW1A 1AA', + }, + { + postcode => 'Buckingham Gate', + expected_postcode => 'Buckingham Gate', + }, + { + postcode => 'Buckingham gate', + expected_postcode => 'Buckingham gate', + }, +) { + subtest "correct text for postcode $test->{postcode}" => sub { + $mech->clear_emails_ok; + + my $sent = FixMyStreet::App->model('DB::AlertSent')->search( + { + alert_id => $council_alert->id, + parameter => $report->id, + } + )->delete; + + $report->postcode( $test->{postcode} ); + $report->update; + + FixMyStreet::App->model('DB::AlertType')->email_alerts(); + + $mech->email_count_is( 1 ); + my $email = $mech->get_email; + my $pc = $test->{expected_postcode}; + my $title = $report->title; + my $body = $email->body; + + like $body, qr#report/$report_id - $title, $pc#, 'email contains expected postcode'; + }; +} + +$report->postcode( 'SW1A 1AA' ); +$report->update; + +$report->geocode( +{ + 'traceId' => 'ae7c4880b70b423ebc8ab4d80961b3e9|LTSM001158|02.00.71.1600|LTSMSNVM002010, LTSMSNVM001477', + 'statusDescription' => 'OK', + 'brandLogoUri' => 'http://dev.virtualearth.net/Branding/logo_powered_by.png', + 'resourceSets' => [ + { + 'resources' => [ + { + 'geocodePoints' => [ + { + 'calculationMethod' => 'Interpolation', + 'coordinates' => [ + '55.9532357007265', + '-3.18906001746655' + ], + 'usageTypes' => [ + 'Display', + 'Route' + ], + 'type' => 'Point' + } + ], + 'entityType' => 'Address', + 'name' => '18 N Bridge, Edinburgh EH1 1', + 'point' => { + 'coordinates' => [ + '55.9532357007265', + '-3.18906001746655' + ], + 'type' => 'Point' + }, + 'bbox' => [ + '55.9493729831558', + '-3.19825819222605', + '55.9570984182972', + '-3.17986184270704' + ], + 'matchCodes' => [ + 'Good' + ], + 'address' => { + 'countryRegion' => 'United Kingdom', + 'adminDistrict2' => 'Edinburgh City', + 'adminDistrict' => 'Scotland', + 'addressLine' => '18 North Bridge', + 'formattedAddress' => '18 N Bridge, Edinburgh EH1 1', + 'postalCode' => 'EH1 1', + 'locality' => 'Edinburgh' + }, + 'confidence' => 'Medium', + '__type' => 'Location:http://schemas.microsoft.com/search/local/ws/rest/v1' + } + ], + 'estimatedTotal' => 1 + } + ], + 'copyright' => "Copyright \x{a9} 2011 Microsoft and its suppliers. All rights reserved. This API cannot be accessed and the content and any results may not be used, reproduced or transmitted in any manner without express written permission from Microsoft Corporation.", + 'statusCode' => 200, + 'authenticationResultCode' => 'ValidCredentials' + } +); +$report->update(); + +foreach my $test ( + { + desc => 'all fields', + addressLine => '18 North Bridge', + locality => 'Edinburgh', + nearest => qr/18 North Bridge, Edinburgh/, + }, + { + desc => 'address with Street only', + addressLine => 'Street', + locality => 'Edinburgh', + nearest => qr/: Edinburgh/, + }, + { + desc => 'locality only', + addressLine => undef, + locality => 'Edinburgh', + nearest => qr/: Edinburgh/, + }, + { + desc => 'address only', + addressLine => '18 North Bridge', + locality => undef, + nearest => qr/: 18 North Bridge\n/, + }, + { + desc => 'no fields', + addressLine => undef, + locality => undef, + nearest => '', + }, + { + desc => 'no address', + no_address => 1, + nearest => '', + }, +) { + subtest "correct Nearest Road text with $test->{desc}" => sub { + $mech->clear_emails_ok; + + my $sent = FixMyStreet::App->model('DB::AlertSent')->search( + { + alert_id => $council_alert->id, + parameter => $report->id, + } + )->delete; + + my $g = $report->geocode; + if ( $test->{no_address} ) { + $g->{resourceSets}[0]{resources}[0]{address} = undef; + } else { + $g->{resourceSets}[0]{resources}[0]{address}->{addressLine} = $test->{addressLine}; + $g->{resourceSets}[0]{resources}[0]{address}->{locality} = $test->{locality}; + } + + # if we don't do this then it ignores the change + $report->geocode( undef ); + $report->geocode( $g ); + $report->update(); + + FixMyStreet::App->model('DB::AlertType')->email_alerts(); + + $mech->email_count_is( 1 ); + my $email = $mech->get_email; + my $body = $email->body; + + if ( $test->{nearest} ) { + like $body, $test->{nearest}, 'correct nearest line'; + } else { + unlike $body, qr/Nearest Road/, 'no nearest line'; + } + }; +} + +$report->comments->delete(); +$report->delete(); done_testing(); diff --git a/t/cobrand/closest.t b/t/cobrand/closest.t new file mode 100644 index 000000000..c7ba10cc4 --- /dev/null +++ b/t/cobrand/closest.t @@ -0,0 +1,78 @@ +use strict; +use warnings; + +use Test::More; + +use mySociety::Locale; +use FixMyStreet::App; + +use_ok 'FixMyStreet::Cobrand'; + +mySociety::Locale::gettext_domain( 'FixMyStreet' ); + +my $c = FixMyStreet::Cobrand::Default->new(); + +my $user = + FixMyStreet::App->model('DB::User') + ->find_or_create( { email => 'test@example.com', name => 'Test User' } ); +ok $user, "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 => 'closed', + 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"; + +$report->geocode( undef ); + +ok !$report->geocode, 'no gecode entry for report'; + +my $near = $c->find_closest( $report->latitude, $report->longitude, $report ); + +ok $report->geocode, 'geocode entry added to report'; +ok $report->geocode->{resourceSets}, 'geocode entry looks like right sort of thing'; + +like $near, qr/Constitution Hill/i, 'nearest street looks right'; +like $near, qr/Nearest postcode .*: SW1A 1AA/i, 'nearest postcode looks right'; + +$near = $c->find_closest_address_for_rss( $report->latitude, $report->longitude, $report ); + +like $near, qr/Constitution Hill/i, 'nearest street for RSS looks right'; +unlike $near, qr/Nearest postcode/i, 'no nearest postcode in RSS text'; + +$report->geocode( undef ); +$near = $c->find_closest_address_for_rss( $report->latitude, $report->longitude, $report ); + +ok !$near, 'no closest address for RSS if not cached'; + +# all done +done_testing(); diff --git a/t/open311.t b/t/open311.t index f7a8cd815..30de330b6 100644 --- a/t/open311.t +++ b/t/open311.t @@ -2,7 +2,9 @@ use strict; use warnings; -use Test::More tests => 4; +use Test::More; +use Test::Warn; +use FixMyStreet::App; use FindBin; use lib "$FindBin::Bin/../perllib"; @@ -21,4 +23,20 @@ EOT is $o->_process_error( $err_text ), "400: Service Code cannot be null -- can't proceed with the request.\n", 'error text parsing'; is $o->_process_error( '503 - service unavailable' ), 'unknown error', 'error text parsing of bad error'; +my $o2 = Open311->new( endpoint => 'http://192.168.50.1/open311/', jurisdiction => 'example.org' ); +my $u = FixMyStreet::App->model('DB::User')->new( { email => 'test@example.org', name => 'A User' } ); + +my $p = FixMyStreet::App->model('DB::Problem')->new( { + latitude => 1, + longitude => 1, + title => 'title', + detail => 'detail', + user => $u, +} ); + +my $expected_error = qr{.*request failed: 500 Can.t connect to 192.168.50.1:80 \([^)]*\).*}; + +warning_like {$o2->send_service_request( $p, { url => 'http://example.com/' }, 1 )} $expected_error, 'warning generated on failed call'; + +done_testing(); diff --git a/templates/email/fiksgatami/alert-confirm.txt b/templates/email/fiksgatami/alert-confirm.txt index 7498df2e1..02cbfc773 100644 --- a/templates/email/fiksgatami/alert-confirm.txt +++ b/templates/email/fiksgatami/alert-confirm.txt @@ -1,14 +1,14 @@ -Subject: Bekreft din sak på FiksGataMI.no +Subject: Bekreft ditt varsel fra FiksGataMi.no Hei, Vennligst klikk på lenken under for å bekrefte varslet du -har bedt om å abonnere på FiksGataMi: +har bedt om å abonnere på hos FiksGataMi: [% token_url %] -Hvis du ikke kan klikke på lenken, kan du kopiere den i -addressefeltet på dine nettleser. +Hvis du ikke kan klikke på lenken, kan du kopiere den til +addressefeltet i din nettleser. -Vennlig Hilsen, +Vennlig hilsen, FiksGataMi-gruppen diff --git a/templates/email/fiksgatami/alert-problem-area.txt b/templates/email/fiksgatami/alert-problem-area.txt index 93819d6f2..8a081e026 100644 --- a/templates/email/fiksgatami/alert-problem-area.txt +++ b/templates/email/fiksgatami/alert-problem-area.txt @@ -1,4 +1,4 @@ -Subject: Nye saker i <?=$values['area_name']?> sendt via FiksGataMi.no +Subject: Nye saker i <?=$values['area_name']?> hos FiksGataMi.no Følgende saker er sendt til <?=$values['area_name']?>: @@ -8,6 +8,6 @@ Følgende saker er sendt til Vennlig hilsen, FiksGataMi-gruppen -Hvis du ikke ønsker å motta epost om saker som er sendt til -<?=$values['area_name']?> i fremtiden, klikk på følgende link: +Hvis du ikke ønsker å motta e-post om saker som er sendt til +<?=$values['area_name']?> i fremtiden, klikk på følgende lenke: <?=$values['unsubscribe_url']?> diff --git a/templates/email/fiksgatami/alert-problem-council.txt b/templates/email/fiksgatami/alert-problem-council.txt index 54a51c7b2..581651560 100644 --- a/templates/email/fiksgatami/alert-problem-council.txt +++ b/templates/email/fiksgatami/alert-problem-council.txt @@ -7,6 +7,6 @@ Følgende saker er sendt til <?=$values['area_name']?>: Vennlig hilsen, FiksGataMi-gruppen -Hvis du ikke ønsker å motta epost om saker som er sendt til -<?=$values['area_name']?> i fremtiden, klikk på følgende link: +Hvis du ikke ønsker å motta e-post om saker som er sendt til +<?=$values['area_name']?> i fremtiden, klikk på følgende lenke: <?=$values['unsubscribe_url']?> diff --git a/templates/email/fiksgatami/alert-problem-nearby.txt b/templates/email/fiksgatami/alert-problem-nearby.txt index b470de203..170cb6da8 100644 --- a/templates/email/fiksgatami/alert-problem-nearby.txt +++ b/templates/email/fiksgatami/alert-problem-nearby.txt @@ -1,11 +1,11 @@ Subject: Nye saker i nærheten på FiksGataMi.no -Følgende saker i nærheten er sendt via FiksGataMi.no: +Følgende saker i nærheten er lagt inn på FiksGataMi.no: <?=$values['data']?> Vennlig hilsen, FiksGataMi-gruppen -Hvis du ikke ønsker å abonnere på epost om problemer i nærheten, -klikk på følgende link: <?=$values['unsubscribe_url']?> +Hvis du ikke ønsker å motta e-post om ny problemer i nærheten, +klikk på følgende lenke: <?=$values['unsubscribe_url']?> diff --git a/templates/email/fiksgatami/alert-problem-ward.txt b/templates/email/fiksgatami/alert-problem-ward.txt index 2fbf0b068..dd8bf0656 100644 --- a/templates/email/fiksgatami/alert-problem-ward.txt +++ b/templates/email/fiksgatami/alert-problem-ward.txt @@ -8,6 +8,6 @@ innenfor <?=$values['ward_name']?>: Vennlig hilsen, FiksGataMi-gruppen -Hvis du ikke ønsker å abonnere via epost på saker som er sendt til +Hvis du ikke ønsker å motta e-post om saker som er sendt til <?=$values['area_name']?> innenfor <?=$values['ward_name']?>, klikk på denne linken: <?=$values['unsubscribe_url']?> diff --git a/templates/email/fiksgatami/alert-problem.txt b/templates/email/fiksgatami/alert-problem.txt index a62745bef..f95103396 100644 --- a/templates/email/fiksgatami/alert-problem.txt +++ b/templates/email/fiksgatami/alert-problem.txt @@ -1,11 +1,11 @@ -Subject: Ny saker på FiksGataMi.no +Subject: Nye saker på FiksGataMi.no -Følgende ny saker er lagt til: +Følgende nye saker er lagt til: <?=$values['data']?> Vennlig hilsen, FiksGataMi-gruppen -Hvis du ikke ønsker å stå på denne epostlisten, -klikk på linken: <?=$values['unsubscribe_url']?> +Hvis du ikke ønsker å motta e-post om nye saker, +klikk på følgende lenke: <?=$values['unsubscribe_url']?> diff --git a/templates/email/fiksgatami/alert-update.txt b/templates/email/fiksgatami/alert-update.txt index 80bc8dbf8..93920357d 100644 --- a/templates/email/fiksgatami/alert-update.txt +++ b/templates/email/fiksgatami/alert-update.txt @@ -6,13 +6,13 @@ Følgende oppdateringer har blitt lagt inn for dette problemet: <?=$values['state_message']?> -For å se på eller svare på disse oppdateringene, besøk denne URLen: +For å se på eller svare på disse oppdateringene, besøk denne lenken: <?=$values['problem_url']?> -Du kan ikke kontakte noen ved å svare på denne eposten. +Du kan ikke kontakte noen ved å svare på denne e-posten. -Vennlig hilsen, -Fiksgata-laget +Vennlig hilsen, +Fiksgata-gruppen -For å slutte å motta epost når det er nye oppdateringer om dettte +For å slutte å motta e-post ved nye oppdateringer om dette problemet, følg denne lenken: <?=$values['unsubscribe_url']?> diff --git a/templates/email/fiksgatami/login.txt b/templates/email/fiksgatami/login.txt new file mode 100644 index 000000000..170350590 --- /dev/null +++ b/templates/email/fiksgatami/login.txt @@ -0,0 +1,9 @@ +Subject: [% loc('Your FixMyStreet.com account details') %] + +Vennligst klikk på linken under for å bekrefte din e-post. Når dette +er gjort vil du lett kunne holde oversikt over dine problemrapporter. +[% c.uri_for_action( 'auth/token', token ) %] + +Vennlig hilsen, +FiksGataMi-gruppen + diff --git a/templates/email/fiksgatami/nn/alert-confirm.txt b/templates/email/fiksgatami/nn/alert-confirm.txt new file mode 100644 index 000000000..496a2089a --- /dev/null +++ b/templates/email/fiksgatami/nn/alert-confirm.txt @@ -0,0 +1,14 @@ +Subject: Stadfest varselet ditt frå FiksGataMi.no + +Hei, + +Ver venleg og klikk på lenkja under for å stadfesta varselet du +har bede om å abonnera på hos FiksGataMi: + + [% token_url %] + +Viss du ikkje kan klikka på lenkja, kan du kopiera ho til +addressefeltet i nettlesaren din. + +Venleg helsing, +FiksGataMi-gruppa diff --git a/templates/email/fiksgatami/nn/alert-problem-area.txt b/templates/email/fiksgatami/nn/alert-problem-area.txt new file mode 100644 index 000000000..2c132749d --- /dev/null +++ b/templates/email/fiksgatami/nn/alert-problem-area.txt @@ -0,0 +1,13 @@ +Subject: Nye saker i <?=$values['area_name']?> hos FiksGataMi.no + +Følgjande saker er sendt til +<?=$values['area_name']?>: + +<?=$values['data']?> + +Venleg helsing, +FiksGataMi-gruppa + +Viss du ikkje ynskjer å motta e-post om saker som er sendt til +<?=$values['area_name']?> i framtida, klikk på følgjande lenkje: +<?=$values['unsubscribe_url']?> diff --git a/templates/email/fiksgatami/nn/alert-problem-council.txt b/templates/email/fiksgatami/nn/alert-problem-council.txt new file mode 100644 index 000000000..e562f1e9e --- /dev/null +++ b/templates/email/fiksgatami/nn/alert-problem-council.txt @@ -0,0 +1,12 @@ +Subject: Nye saker sendt til <?=$values['area_name']?> via FiksGataMi.no + +Følgjande saker er sendt til <?=$values['area_name']?>: + +<?=$values['data']?> + +Venleg helsing, +FiksGataMi-gruppa + +Viss du ikkje ynskjer å motta e-post om saker som er sendt til +<?=$values['area_name']?> i framtida, klikk på følgjande lenkje: +<?=$values['unsubscribe_url']?> diff --git a/templates/email/fiksgatami/nn/alert-problem-nearby.txt b/templates/email/fiksgatami/nn/alert-problem-nearby.txt new file mode 100644 index 000000000..e20e0c914 --- /dev/null +++ b/templates/email/fiksgatami/nn/alert-problem-nearby.txt @@ -0,0 +1,11 @@ +Subject: Nye saker i nærleiken på FiksGataMi.no + +Følgjande saker i nærleiken er lagd inn på FiksGataMi.no: + +<?=$values['data']?> + +Venleg helsing, +FiksGataMi-gruppa + +Viss du ikkje ynskjer å motta e-post om nye problem i nærleiken, +klikk på følgjande lenkje: <?=$values['unsubscribe_url']?> diff --git a/templates/email/fiksgatami/nn/alert-problem-ward.txt b/templates/email/fiksgatami/nn/alert-problem-ward.txt new file mode 100644 index 000000000..32b3e4c50 --- /dev/null +++ b/templates/email/fiksgatami/nn/alert-problem-ward.txt @@ -0,0 +1,13 @@ +Subject: Nye saker sendt til <?=$values['area_name']?> innanfor <?=$values['ward_name']?> via FiksGataMi.no + +Følgjande saker er sendt til <?=$values['area_name']?> +innanfor <?=$values['ward_name']?>: + +<?=$values['data']?> + +Venleg helsing, +FiksGataMi-gruppa + +Viss du ikkje ynskjer å motta e-post om saker som er sendt til +<?=$values['area_name']?> innanfor <?=$values['ward_name']?>, +klikk på følgjande lenkje: <?=$values['unsubscribe_url']?> diff --git a/templates/email/fiksgatami/nn/alert-problem.txt b/templates/email/fiksgatami/nn/alert-problem.txt new file mode 100644 index 000000000..f1eb88a6f --- /dev/null +++ b/templates/email/fiksgatami/nn/alert-problem.txt @@ -0,0 +1,11 @@ +Subject: Nye saker på FiksGataMi.no + +Følgjande nye saker er lagt til: + +<?=$values['data']?> + +Venleg helsing, +FiksGataMi-gruppa + +Viss du ikkje ynskjer å motta e-post om nye saker, +klikk på følgjande lenkje: <?=$values['unsubscribe_url']?> diff --git a/templates/email/fiksgatami/nn/alert-update.txt b/templates/email/fiksgatami/nn/alert-update.txt new file mode 100644 index 000000000..03575e68c --- /dev/null +++ b/templates/email/fiksgatami/nn/alert-update.txt @@ -0,0 +1,18 @@ +Subject: Nye oppdateringar for problem – '<?=$values['title']?>' + +Følgjande oppdateringar har vorte lagt inn for dette problemet: + +<?=$values['data']?> + +<?=$values['state_message']?> + +For å sjå på eller svara på desse oppdateringane, besøk denne lenkja: + <?=$values['problem_url']?> + +Du kan ikkje kontakta nokon ved å svara på denne e-posten. + +Venleg helsing, +Fiksgata-gruppa + +For å slutta å motta e-post ved nye oppdateringar om dette +problemet, følg denne lenkja: <?=$values['unsubscribe_url']?> diff --git a/templates/email/fiksgatami/nn/contact.txt b/templates/email/fiksgatami/nn/contact.txt new file mode 100644 index 000000000..8933c801f --- /dev/null +++ b/templates/email/fiksgatami/nn/contact.txt @@ -0,0 +1,5 @@ +Subject: FiksGataMi-melding: [% subject %] + +[% message %] + +[ Sendt av contact.cgi på [% host %]. IP-addresse [% ip %] ] diff --git a/templates/email/fiksgatami/nn/login.txt b/templates/email/fiksgatami/nn/login.txt new file mode 100644 index 000000000..57fd48db5 --- /dev/null +++ b/templates/email/fiksgatami/nn/login.txt @@ -0,0 +1,9 @@ +Subject: [% loc('Your FixMyStreet.com account details') %] + +Ver venleg og klikk på lenkja under for å stadfesta e-posten din. Når +dette er gjort vil du lett kunna halda oversyn over problemrapportane +dine. [% c.uri_for_action( 'auth/token', token ) %] + +Venleg helsing, +FiksGataMi-gruppa + diff --git a/templates/email/fiksgatami/nn/partial.txt b/templates/email/fiksgatami/nn/partial.txt new file mode 100644 index 000000000..c7028ab66 --- /dev/null +++ b/templates/email/fiksgatami/nn/partial.txt @@ -0,0 +1,12 @@ +Subject: Stadfest rapporten din på FiksGataMi.no + +Hei [% report.name || report.email %], + +For å stadfesta rapporten du har lasta opp til FiksGataMi via +[% report.service %], og for å sjekka eller leggja til detaljar, +besøk følgjande lenkje: + +[% token_url %] + +Venleg helsing, +FiksGataMi-gruppa diff --git a/templates/email/fiksgatami/nn/problem-confirm.txt b/templates/email/fiksgatami/nn/problem-confirm.txt new file mode 100644 index 000000000..71afc5b6e --- /dev/null +++ b/templates/email/fiksgatami/nn/problem-confirm.txt @@ -0,0 +1,20 @@ +Subject: Stadfesting om ny sak lagt til på FiksGataMi.no + +Hei [% report.name %], + +Ver venleg og klikk på lenkja under for å stadfesta saka du har lagt +til på FiksGataMi: + +[% token_url %] + +Viss e-post-programmet ditt ikkje lèt deg klikka på lenkja, kan du +kopiera lenkja inn i nettlesaren din. + +Saka di hadde følgjande tittel: +[% report.title %] + +Med følgjande informasjon: +[% report.detail %] + +Venleg helsing, +FiksGataMi-gruppa diff --git a/templates/email/fiksgatami/nn/questionnaire.txt b/templates/email/fiksgatami/nn/questionnaire.txt new file mode 100644 index 000000000..1bfa1e38b --- /dev/null +++ b/templates/email/fiksgatami/nn/questionnaire.txt @@ -0,0 +1,24 @@ +Subject: Spørjeskjema for saka di på FiksGataMi + +Hei <?=$values['name']?>, + +for <?=$values['created']?> sidan, la du til ei sak på FiksGataMi.no +med detaljane som vist i denne e-posten. For å halda nettsida vår +oppdatert og relevant, vil vi setja pris på om du kunne fylla ut +følgjande skjema for å oppdatera saka: + + <?=$values['url']?> + +Ver venleg og ikkje svar på denne e-posten; det er mogleg å kommentera +i skjemaet. + +Venleg helsing, +FiksGataMi-gruppa + +Saka du la til var som følgjer: + +<?=$values['title']?> + +<?=$values['detail']?> + + diff --git a/templates/email/fiksgatami/nn/submit.txt b/templates/email/fiksgatami/nn/submit.txt new file mode 100644 index 000000000..82849b0d5 --- /dev/null +++ b/templates/email/fiksgatami/nn/submit.txt @@ -0,0 +1,41 @@ +Subject: Problemrapport: <?=$values['title']?> + +Til <?=$values['councils_name']?>, + +<?=$values['missing']?><?=$values['multiple']?>Ein brukar av +FiksGataMi har sendt inn følgjande rapport om eit lokalt problem som +vi trur treng merksemda deira. + +<?=$values['fuzzy']?>, eller for å bidra med ei oppdatering om +problemet, ver venleg og besøk følgjande lenkje: + + <?=$values['url']?> + +<?=$values['has_photo']?>---------- + +Namn: <?=$values['name']?> + +E-post: <?=$values['email']?> + +<?=$values['phone_line']?><?=$values['category_line']?>Tema: <?=$values['title']?> + +Detaljer: <?=$values['detail']?> + +<?=$values['easting_northing']?>Breiddegrad: <?=$values['latitude']?> + +Lengdegrad: <?=$values['longitude']?> + +<?=$values['closest_address']?>---------- + +Svar på denne e-posten går til brukaren som sende inn problemet. + +Venleg helsing, +FiksGataMi-gruppa + +[ Denne meldinga vart send inn via FiksGataMi, eit prosjekt hos foreininga NUUG. +Viss det er ei meir passande e-postadresse for meldingar om +<?=$values['category_footer']?>, ver så snill å gje oss melding ved å vitja +<http://www.fiksgatami.no/contact>. +Dette vil bidra til å forbetra tenesta for lokalbefolkinga. Vi +tek òg gjerne imot andre tilbakemeldingar. ] + diff --git a/templates/email/fiksgatami/nn/update-confirm.txt b/templates/email/fiksgatami/nn/update-confirm.txt new file mode 100644 index 000000000..0ecfc84bf --- /dev/null +++ b/templates/email/fiksgatami/nn/update-confirm.txt @@ -0,0 +1,18 @@ +Subject: Stadfest oppdateringa di på FiksGataMi.no + +Hei [% update.name %], + +Ver venleg og klikk på lenkja under for å stadfesta oppdateringa du nettopp +skreiv: + +[% token_url %] + +Viss du ikkje kan klikka på lenkja, kan du kopiera ho til +addressefeltet i nettlesaren din. + +Oppdateringa di inneheld: + +[% update.text %] + +Venleg hilsen, +FiksGataMi-gruppa diff --git a/templates/email/fiksgatami/partial.txt b/templates/email/fiksgatami/partial.txt index 70359e265..6c64eff7f 100644 --- a/templates/email/fiksgatami/partial.txt +++ b/templates/email/fiksgatami/partial.txt @@ -1,14 +1,12 @@ -Subject: Bekreft din rapport på FiksGataMi +Subject: Bekreft din rapport på FiksGataMi.no Hei [% report.name || report.email %], -For å bekrefte rapporten du har lastet opp til FiksGatami via -[% report.service %], og for å sjekke eller legge til litt detaljer, -besøk følgende URL: +For å bekrefte rapporten du har lastet opp til FiksGataMi via +[% report.service %], og for å sjekke eller legge til detaljer, +besøk følgende lenke: [% token_url %] -Takk! - -Vennlig hilsen, +Vennlig hilsen, FiksGataMi-gruppen diff --git a/templates/email/fiksgatami/problem-confirm.txt b/templates/email/fiksgatami/problem-confirm.txt index a48fbef44..f05f7ba20 100644 --- a/templates/email/fiksgatami/problem-confirm.txt +++ b/templates/email/fiksgatami/problem-confirm.txt @@ -7,13 +7,13 @@ på FiksGataMi: [% token_url %] -Hvis ditt epost-program ikke gir deg mulighet til å klikke på linken, -kopier linken inn i nettleseren. +Hvis ditt e-post-program ikke gir deg mulighet til å klikke på lenken, +kan du kopiere lenken inn i nettleseren din. Din sak hadde følgende tittel: [% report.title %] -Med følgende verdier: +Med følgende informasjon: [% report.detail %] Vennlig hilsen, diff --git a/templates/email/fiksgatami/questionnaire.txt b/templates/email/fiksgatami/questionnaire.txt index fd16c42b1..27b80cc16 100644 --- a/templates/email/fiksgatami/questionnaire.txt +++ b/templates/email/fiksgatami/questionnaire.txt @@ -1,15 +1,15 @@ -Subject: Skjema for din sak på FiksGataMi +Subject: Spørreskjema for din sak på FiksGataMi Hei <?=$values['name']?>, -for <?=$values['created']?> siden, la du til en sak på FiksGataMi -med detaljene som vist i denne eposten. For å holde vår nettside oppdatert +for <?=$values['created']?> siden, la du til en sak på FiksGataMi.no +med detaljene som vist i denne e-posten. For å holde vår nettside oppdatert og relevant, vil vi sette pris på om du kunne fylle ut følgende skjema for å oppdatere saken: <?=$values['url']?> -Vennligst ikke svar på denne eposten; det er muligheter for å kommentere i skjema. +Vennligst ikke svar på denne e-posten; det er muligheter for å kommentere i skjemaet. Vennlig hilsen, FiksGataMi-gruppen diff --git a/templates/email/fiksgatami/submit.txt b/templates/email/fiksgatami/submit.txt index 12c801bbb..8005f5c82 100644 --- a/templates/email/fiksgatami/submit.txt +++ b/templates/email/fiksgatami/submit.txt @@ -15,7 +15,7 @@ vennligst besøk følgende lenke: Navn: <?=$values['name']?> -Epost: <?=$values['email']?> +E-post: <?=$values['email']?> <?=$values['phone_line']?><?=$values['category_line']?>Tema: <?=$values['title']?> @@ -27,15 +27,15 @@ Lengegrad: <?=$values['longitude']?> <?=$values['closest_address']?>---------- -Svar på denne eposten går til brukeren som sendte inn problemet. +Svar på denne e-posten går til brukeren som sendte inn problemet. Vennlig hilsen, FiksGataMi-gruppen [ Denne meldingen ble sendt inn via FiksGataMi, et prosjekt hos foreningen NUUG. -Hvis det er en mer passende epostadresse for meldinger om +Hvis det er en mer passende e-postadresse for meldinger om <?=$values['category_footer']?>, vær så snill å gi oss beskjed ved å besøke <http://www.fiksgatami.no/contact>. Dette vil bidra til å forbedre tjenesten for lokalbefolkningen. Vi -tar også gjerne imot andre tilbakemeldinger om du har noen. ] +tar også gjerne imot andre tilbakemeldinger. ] diff --git a/templates/email/fiksgatami/update-confirm.txt b/templates/email/fiksgatami/update-confirm.txt index ba13f34b2..2f4f7a7ec 100644 --- a/templates/email/fiksgatami/update-confirm.txt +++ b/templates/email/fiksgatami/update-confirm.txt @@ -1,14 +1,14 @@ -Subject: Bekreft din oppdatering på FiksGataMi +Subject: Bekreft din oppdatering på FiksGataMi.no Hei [% update.name %], -Vennligst klikk på lenken under for å bekrefte oppdateringen du skrev -nettopp: +Vennligst klikk på lenken under for å bekrefte oppdateringen du nettop +skrev: [% token_url %] -Hvis du ikke kan klikke på lenken, kopier og lim den inn -i adressefeltet på din nettleser.. +Hvis du ikke kan klikke på lenken, kan du kopiere den til +addressefeltet i din nettleser. Din oppdatering inneholder: diff --git a/templates/web/default/admin/list_updates.html b/templates/web/default/admin/list_updates.html index 4f27b9595..0a05ba4ac 100644 --- a/templates/web/default/admin/list_updates.html +++ b/templates/web/default/admin/list_updates.html @@ -15,8 +15,8 @@ <th>*</th> </tr> [% FOREACH update IN updates -%] - <tr[% ' class="hidden"' IF update.state == 'hidden' || ( problem.state && problem.state == 'hidden' ) %]> - <td>[%- IF update.state == 'confirmed' -%] + <tr[% ' class="hidden"' 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 %] <a href="[% c.uri_for_email( '/report', update.problem.id, cobrand_data ) %]#update_[% update.id %]">[% update.id %]</a> diff --git a/templates/web/default/admin/report_edit.html b/templates/web/default/admin/report_edit.html index 470ad311a..79207192d 100644 --- a/templates/web/default/admin/report_edit.html +++ b/templates/web/default/admin/report_edit.html @@ -43,6 +43,11 @@ [% IF problem.photo %] [% photo = problem.get_photo_params %] <li><img alt="" height="[% photo.height %]" width="[% photo.width %]" src="[% c.cobrand.base_url %][% photo.url %]"> +<br> +[% IF rotated %]Photo may be cached. View image directly to check<br>[% END %] +<input type="submit" name="rotate_photo" value="Rotate Left" /> +<input type="submit" name="rotate_photo" value="Rotate Right" /> +<br> <input type="checkbox" id="remove_photo" name="remove_photo" value="1"> <label for="remove_photo">[% loc("Remove photo (can't be undone!)") %]</label></li> [% END %] diff --git a/templates/web/default/around/display_location.html b/templates/web/default/around/display_location.html index f091de0f2..3d9c82187 100755 --- a/templates/web/default/around/display_location.html +++ b/templates/web/default/around/display_location.html @@ -35,7 +35,7 @@ robots => 'noindex,nofollow'; %] -<form action="[% c.uri_for('/report/new') %]" method="post" name="mapForm" id="mapForm" enctype="multipart/form-data"> +<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 %] diff --git a/templates/web/default/auth/general.html b/templates/web/default/auth/general.html index 6c9d4497a..5407e56e1 100644 --- a/templates/web/default/auth/general.html +++ b/templates/web/default/auth/general.html @@ -2,7 +2,7 @@ <h1>[% loc('Sign in') %]</h1> -<form action="[% c.uri_for() %]" method="post" name="general_auth"> +<form action="[% c.uri_for() %]" method="post" name="general_auth" class="validate"> <input type="hidden" name="r" value="[% c.req.params.r | html %]"> [% IF email_error; @@ -25,7 +25,7 @@ <div class="form-field"> <label class="n" for="email">[% loc('Your email address:') %]</label> - <input type="email" size="30" id="email" name="email" value="[% email | html %]"> + <input type="email" class="required email" size="30" id="email" name="email" value="[% email | html %]"> </div> <div id="form_sign_in"> diff --git a/templates/web/default/common_header_tags.html b/templates/web/default/common_header_tags.html index e6278847d..95b59d9dd 100644 --- a/templates/web/default/common_header_tags.html +++ b/templates/web/default/common_header_tags.html @@ -1,5 +1,10 @@ +[% INCLUDE 'js_validation_msgs.html' %] + <meta http-equiv="content-type" content="text/html; charset=utf-8"> -<script type="text/javascript" src="/jslib/jquery-1.6.2.min.js"></script> +<script type="text/javascript" src="/jslib/jquery-1.7.0.min.js"></script> + +<script src="[% version('/js/jquery.validate.min.js') %]" type="text/javascript" charset="utf-8"></script> + <script type="text/javascript" src="[% version('/js/geo.min.js') %]"></script> <script type="text/javascript" src="[% version('/js/fixmystreet.js') %]"></script> diff --git a/templates/web/default/contact/index.html b/templates/web/default/contact/index.html index dc64dd554..2c0c2ff02 100644 --- a/templates/web/default/contact/index.html +++ b/templates/web/default/contact/index.html @@ -5,7 +5,7 @@ <h1>[% loc('Contact the team') %]</h1> -<form method="post" action="/contact/submit"> +<form method="post" action="/contact/submit" class="validate"> [% INCLUDE 'errors.html' %] @@ -66,7 +66,7 @@ [% END %] <div class="form-field"> <label for="form_name">[% loc('Your name:') %]</label> -<input type="text" name="name" id="form_name" value="[% form_name | html %]" size="30"></div> +<input type="text" class="required" name="name" id="form_name" value="[% form_name | html %]" size="30"></div> [% IF field_errors.em %] @@ -74,14 +74,14 @@ [% END %] <div class="form-field"> <label for="form_email">[% loc('Your email:') %]</label> -<input type="text" name="em" id="form_email" value="[% em | html %]" size="30"></div> +<input type="text" class="required email" name="em" id="form_email" value="[% em | html %]" size="30"></div> [% IF field_errors.subject %] <div class="form-error">[% field_errors.subject %]</div> [% END %] <div class="form-field"> <label for="form_subject">[% loc('Subject:') %]</label> -<input type="text" name="subject" id="form_subject" value="[% subject | html %]" size="30"></div> +<input type="text" class="required" name="subject" id="form_subject" value="[% subject | html %]" size="30"></div> [% IF field_errors.message %] <div class="form-error">[% field_errors.message %]</div> @@ -89,7 +89,7 @@ <div class="form-field"> <label for="form_message">[% loc('Message:') %]</label> -<textarea name="message" id="form_message" rows="7" cols="50">[% message | html %]</textarea></div> +<textarea class="required" name="message" id="form_message" rows="7" cols="50">[% message | html %]</textarea></div> <div class="checkbox"><input type="submit" value="[% loc('Post') %]"></div> [% c.cobrand.form_elements('contactForm') %] diff --git a/templates/web/default/header.html b/templates/web/default/header.html index f54793fe4..e3c364363 100644 --- a/templates/web/default/header.html +++ b/templates/web/default/header.html @@ -22,6 +22,7 @@ [% END %] [% INCLUDE 'tracking_code.html' %] + </head> <body> diff --git a/templates/web/default/js_validation_msgs.html b/templates/web/default/js_validation_msgs.html new file mode 100644 index 000000000..2466ce175 --- /dev/null +++ b/templates/web/default/js_validation_msgs.html @@ -0,0 +1,20 @@ +<script type="text/javascript"> + validation_strings = { + update: '[% loc('Please enter a message') %]', + title: '[% loc('Please enter a subject') %]', + detail: '[% loc('Please enter some details') %]', + name: { + required: '[% loc('Please enter your 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') %]', + }, + category: '[% loc('Please choose a category') %]', + rznvy: { + required: '[% loc('Please enter your email') %]', + email: '[% loc('Please enter a valid email') %]', + }, + email: { + required: '[% loc('Please enter your email') %]', + email: '[% loc('Please enter a valid email') %]', + } + }; +</script> diff --git a/templates/web/default/report/display.html b/templates/web/default/report/display.html index aeff140fe..1e320e1b4 100644 --- a/templates/web/default/report/display.html +++ b/templates/web/default/report/display.html @@ -65,7 +65,7 @@ [% INCLUDE 'errors.html' %] - <form method="post" action="[% c.uri_for( '/report/update' ) %]" name="updateForm" class="fieldset"[% IF c.cobrand.allow_photo_upload %] enctype="multipart/form-data"[% END %]> + <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 %]"> @@ -75,7 +75,7 @@ [% END %] <div class="form-field"> <label for="form_update">[% loc( 'Update:' ) %]</label> - <textarea name="update" id="form_update" rows="7" cols="30">[% update.text | html %]</textarea> + <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 ) %] @@ -132,7 +132,7 @@ [% 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"> + <input type="email" name="rznvy" id="form_rznvy" value="[% update.user.email | html %]" size="30" required> </div> <div id="form_sign_in"> @@ -159,7 +159,7 @@ </p> <p> - <input type="submit" name="submit_sign_in" value="[% loc('Post') %]"> + <input type="submit" name="submit_sign_in" id="submit_sign_in" value="[% loc('Post') %]"> </p> </div> @@ -181,7 +181,7 @@ <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" value="[% loc('Post') %]"> + <input type="submit" name="submit_register" id="submit_register" value="[% loc('Post') %]"> </p> </div> diff --git a/templates/web/default/report/new/category.html b/templates/web/default/report/new/category.html index 6ec0eb19f..095cd7c2e 100644 --- a/templates/web/default/report/new/category.html +++ b/templates/web/default/report/new/category.html @@ -1,7 +1,7 @@ [% FILTER collapse %] [% IF category_options.size %] <label for='form_category'>[% category_label | html %]</label> - <select name='category' id='form_category'> + <select name='category' id='form_category'[% ' onchange="form_category_onchange()"' IF category_extras.size %]> [% FOREACH cat_op IN category_options %] <option value='[% cat_op | html %]'[% ' selected' IF report.category == cat_op %]>[% cat_op | html %]</option> [% END %] diff --git a/templates/web/default/report/new/category_extras.html b/templates/web/default/report/new/category_extras.html index 479b9f46c..7be69e30c 100644 --- a/templates/web/default/report/new/category_extras.html +++ b/templates/web/default/report/new/category_extras.html @@ -12,13 +12,13 @@ <div class="form-field"> <label for="form_[% meta_name %]">[% meta.description _ ':' %]</label> [% IF meta.exists('values') %] - <select name="[% meta_name %]" id="form_[% meta_name %]"> + <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> [% END %] </select> [% ELSE %] - <input type="text" value="[% report_meta.$meta_name | html %]" name="[% meta_name %]" id="form_[% meta_name %]"> + <input type="text" value="[% report_meta.$meta_name | html %]" name="[% meta_name %]" id="form_[% meta_name %]"[% meta.required == 'true' ? ' required' : '' %]> [% END %] </div> [%- END %] diff --git a/templates/web/default/report/new/fill_in_details.html b/templates/web/default/report/new/fill_in_details.html index a9a113283..701a9bafa 100644 --- a/templates/web/default/report/new/fill_in_details.html +++ b/templates/web/default/report/new/fill_in_details.html @@ -4,14 +4,14 @@ %] [% IF report.used_map %] -<form action="[% c.uri_for('/report/new') %]" method="post" name="mapForm" id="mapForm"[% IF c.cobrand.allow_photo_upload %] enctype="multipart/form-data"[% END %]> +<form action="[% c.uri_for('/report/new') %]" method="post" name="mapForm" id="mapForm"[% IF c.cobrand.allow_photo_upload %] enctype="multipart/form-data"[% END %] 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 %]"> [% c.cobrand.form_elements('mapForm') %] [% ELSE %] -<form action="[% c.uri_for('/report/new') %]" method="post" name="mapSkippedForm"[% IF c.cobrand.allow_photo_upload %] enctype="multipart/form-data"[% END %]> +<form action="[% c.uri_for('/report/new') %]" method="post" name="mapSkippedForm"[% IF c.cobrand.allow_photo_upload %] enctype="multipart/form-data"[% END %] class="validate"> <input type="hidden" name="pc" value="[% pc | html %]"> <input type="hidden" name="skipped" value="1"> [% c.cobrand.form_elements('mapSkippedForm') %] 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 e2d8cb3ec..b6b77c75a 100644 --- a/templates/web/default/report/new/fill_in_details_form.html +++ b/templates/web/default/report/new/fill_in_details_form.html @@ -50,7 +50,7 @@ <div class="form-field"> <label for="form_title">[% loc('Subject:') %]</label> - <input type="text" value="[% report.title | html %]" name="title" id="form_title" size="25"> + <input type="text" value="[% report.title | html %]" name="title" id="form_title" size="25" required> </div> [% IF field_errors.detail %] @@ -59,13 +59,13 @@ <div class="form-field"> <label for="form_detail">[% loc('Details:') %]</label> - <textarea name="detail" id="form_detail" rows="7" cols="26">[% report.detail | html %]</textarea> + <textarea name="detail" id="form_detail" rows="7" cols="26" required>[% report.detail | html %]</textarea> </div> [% IF js %] <div class="form-field" id="form_category_row"> <label for="form_category">[% loc('Category:') %]</label> - <select name="category" id="form_category"><option>[% loc('Loading...') %]</option></select> + <select name="category" id="form_category" required><option>[% loc('Loading...') %]</option></select> </div> [% ELSE %] [% IF category_options.size %] @@ -122,7 +122,7 @@ <div class="form-field"> <label for="form_email">[% loc('Your email:') %]</label> - <input type="email" value="[% report.user.email | html %]" name="email" id="form_email" size="25"> + <input type="email" value="[% report.user.email | html %]" name="email" id="form_email" size="25" required> </div> [% INCLUDE 'report/new/notes.html' %] @@ -136,10 +136,10 @@ <div class='form-error'>[% field_errors.password %]</div> [% END %] - <p> + <div class="form-field"> <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> <div class="fieldset"> @@ -151,7 +151,7 @@ </p> <p> - <input type="submit" name="submit_sign_in" value="[% loc('Submit') %]"> + <input type="submit" id="submit_sign_in" name="submit_sign_in" value="[% loc('Submit') %]"> </p> </div> @@ -173,7 +173,7 @@ <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" value="[% loc('Submit') %]"> + <input type="submit" id="submit_register" name="submit_register" value="[% loc('Submit') %]"> </p> </div> @@ -201,7 +201,7 @@ <div class="form-field"> <label for="form_name">[% loc('Your name:') %]</label> - <input type="text" value="[% report.name | html %]" name="name" id="form_name" size="25"> + <input type="text" class="validName" value="[% report.name | html %]" name="name" id="form_name" size="25"> </div> <div class="checkbox"> diff --git a/templates/web/default/report/updates.html b/templates/web/default/report/updates.html index 803ed197e..4fd3c75d4 100644 --- a/templates/web/default/report/updates.html +++ b/templates/web/default/report/updates.html @@ -18,18 +18,18 @@ [%- ", " _ tprintf(loc( 'marked as %s' ), update.meta_problem_state) IF update.problem_state %] </em></p> - [% IF c.cobrand.allow_update_reporting %] - <p> - <a rel="nofollow" class="unsuitable-problem" href="[% c.uri_for( '/contact?id=' _ update.problem_id _ ';update_id' _ update.id ) %]">[% loc('Offensive? Unsuitable? Tell us') %]</a> - </p> - [% END %] - </div> <div class="update-text"> [% add_links( update.text ) | html_para %] [% INCLUDE 'report/photo.html' object=update %] + + [% IF c.cobrand.allow_update_reporting %] + <p align="right"> + <small><a rel="nofollow" class="unsuitable-problem" href="[% c.uri_for( '/contact', { id => update.problem_id, update_id => update.id } ) %]">[% loc('Offensive? Unsuitable? Tell us') %]</a></small> + </p> + [% END %] </div> </div> [% '</div>' IF loop.last %] diff --git a/templates/web/emptyhomes/header.html b/templates/web/emptyhomes/header.html index 7f4106f85..d7fbcb6af 100644 --- a/templates/web/emptyhomes/header.html +++ b/templates/web/emptyhomes/header.html @@ -6,7 +6,7 @@ <head> <link rel="stylesheet" type="text/css" href="[% version('/css/core.css') %]"> - <link rel="stylesheet" type="text/css" href="/cobrands/emptyhomes/css.css"> + <link rel="stylesheet" type="text/css" href="[% version('/cobrands/emptyhomes/css.css') %]"> [% INCLUDE 'common_header_tags.html' %] </head> diff --git a/templates/web/emptyhomes/index.html b/templates/web/emptyhomes/index.html index 34cb0a1c0..7c4d6881b 100644 --- a/templates/web/emptyhomes/index.html +++ b/templates/web/emptyhomes/index.html @@ -1,5 +1,27 @@ [% INCLUDE 'header.html', title => '' %] +[% IF c.req.uri.host == 'reportemptyhomes.com' or c.req.uri.host == 'emptyhomes.matthew.fixmystreet.com' %] + +<h2>Channel 4: The Great British Property Scandal</h2> + +<div class="video"><object id="flashObj" width="480" height="270" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,47,0"><param name="movie" value="http://c.brightcove.com/services/viewer/federated_f9?isVid=1&isUI=1" /><param name="bgcolor" value="#FFFFFF" /><param name="flashVars" value="@videoPlayer=1293919404001&playerID=1242807532001&playerKey=AQ~~,AAABIWs5YNk~,K8Yb_Dc0PlMA8gCUiCBbnEcXR1bU7HRm&domain=embed&dynamicStreaming=true" /><param name="base" value="http://admin.brightcove.com" /><param name="seamlesstabbing" value="false" /><param name="allowFullScreen" value="true" /><param name="swLiveConnect" value="true" /><param name="allowScriptAccess" value="always" /><embed src="http://c.brightcove.com/services/viewer/federated_f9?isVid=1&isUI=1" bgcolor="#FFFFFF" flashVars="@videoPlayer=1293919404001&playerID=1242807532001&playerKey=AQ~~,AAABIWs5YNk~,K8Yb_Dc0PlMA8gCUiCBbnEcXR1bU7HRm&domain=embed&dynamicStreaming=true" base="http://admin.brightcove.com" name="flashObj" width="480" height="270" seamlesstabbing="false" type="application/x-shockwave-flash" allowFullScreen="true" allowScriptAccess="always" swLiveConnect="true" pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"></embed></object></div> + +<p>We’re really excited to be offical advisors to the forthcoming new +empty homes TV series<br><strong>The Great British Property Scandal</strong>!</p> +<p>The series will highlight the nearly two million British families who don’t +have adequate housing, and the million-odd homes lying empty across the UK.</p> + +<ul class="channel4"> + +<li><a href="http://www.channel4.com/programmes/the-great-british-property-scandal/articles/report-an-empty">Report an empty property</a></li> +<li><a href="http://cy.reportemptyhomes.com/">Rhoi gwybod am eiddo gwag</a></li> + +<li><a href="http://itunes.apple.com/gb/app/empty-homes-spotter/id482550587?mt=8"><img src="/i/appstore.png" hspace="5" alt="" align="right">Download the iPhone app</a> from the App Store.</li> + +</ul> + +[% ELSE %] + [% IF error %] <p class="error">[% error %]</p> [% END %] @@ -37,4 +59,6 @@ </div> +[% END %] + [% INCLUDE 'footer.html' %] diff --git a/templates/web/fiksgatami/faq/faq-nb.html b/templates/web/fiksgatami/faq/faq-nb.html index 7b9214cfa..da35cb03c 100644 --- a/templates/web/fiksgatami/faq/faq-nb.html +++ b/templates/web/fiksgatami/faq/faq-nb.html @@ -79,7 +79,7 @@ <dd>Tjenesten bruker navnesøk hos Google Maps for å lokalisere steder. Hvis Google Maps har mangler i sin stedsnavndatabase, vil stedet ikke bli funnet eller sende deg til feil plass. - Tilsvarende søk på Google Maps (etter f.eks. "Slogvær, Norway") + Tilsvarende søk på Google Maps (etter f.eks. «Slogvær, Norway») vil også feile. For å fikse det må en ta kontakt med Google.</dd> <dt>Jeg finner ikke gata mi på kartet, hvorfor bruker dere ikke @@ -109,7 +109,7 @@ <dd>Vi har skrevet en side med <a href="http://wiki.nuug.no/grupper/fiksgatami/tips">tips til offentlige virksomheter som mottar meldinger fra FiksGataMi</a> - for svarer på vanlige spørsmål vi får fra det offentlige, og litt + for svar på vanlige spørsmål vi får fra det offentlige, og litt om hva vi anbefaler.</dd> </dl> @@ -130,8 +130,8 @@ relevante myndighet som er ansvarlig for området der saken er geografisk lokalisert. Meldingen sendes til offentlig myndighet som følger offentlighetsloven og vil gi enhver innsyn i meldingen - og epostadressen etter de gjeldene lover og regler. Vi i - FiksGataMi vi ikke under noen omstendighet gi eller selge + og epostadressen etter de gjeldene lover og regler. Vi i + FiksGataMi vil ikke under noen omstendighet gi eller selge e-postadressen din til noen andre.</dd> <dt>Hvem står bak FiksGataMi?</dt> @@ -151,7 +151,7 @@ tilgjengelig i hovedsak under GNU Affero GPL programvarelisensen. Du kan laste ned kildekoden og hjelpe oss å utvikle det. Du må gjerne bruke den i egne prosjekter, men du må - også gjøre tilgjengelig i kildekoden til slike prosjekter.</p> + også gjøre tilgjengelig kildekoden til slike prosjekter.</p> <p>NUUG låner Varnish-tjenesten til <a href="http://www.vg.no/">VG Nett</a> for økt ytelse, og er svært takknemlige for at VG Nett diff --git a/templates/web/fiksgatami/nn/contact/address.html b/templates/web/fiksgatami/nn/contact/address.html new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/templates/web/fiksgatami/nn/contact/address.html diff --git a/templates/web/fiksgatami/nn/faq/faq-nn.html b/templates/web/fiksgatami/nn/faq/faq-nn.html new file mode 100644 index 000000000..058ce5355 --- /dev/null +++ b/templates/web/fiksgatami/nn/faq/faq-nn.html @@ -0,0 +1,163 @@ +[% INCLUDE 'header.html', title => loc('Frequently Asked Questions') %] + +<h1>Ofte stilte spurnader</h1> +<dl> + <dt>Kva er FiksGataMi?</dt> + + <dd>FiksGataMi er ein nettstad for å hjelpa folk til å rapportera + problem, visa, eller diskutera lokale problem dei har funne i + området sitt ved ganske enkelt å finna dei på eit kart. Du kan melda + problem utan å tenkja på kva for ei offentleg styresmakt som er + ansvarleg for å løysa det, det finn FiksGataMi ut for deg.</dd> + + <dt>Kva slags problem kan eg rapportera med FiksGataMi?</dt> + + <dd>FiksGataMi er primært for rapportering av ting som + er <strong>øydelagd, skadd, dumpa eller treng å verta reparert, + reingjort eller rydda</strong>. Dette kan til dømes vera: + + <ul> + <li>Forlatne køyretøy</li> + <li>Gatelys som ikkje verkar</li> + <li>Plakatar eller graffiti</li> + <li>Søppel</li> + <li>Manglande reingjering</li> + <li>Manglande brøyting</li> + <li>Glatt veg eller gangsti</li> + </ul> + </dd> + + <dt>Kva er FiksGataMi ikkje?</dt> + <dd>FiksGataMi er ikkje ein måte å koma i kontakt med offentlege + styresmakter for alle spurnader – ver venleg og bruk FiksGataMi + berre for problem som dei nemnt over. + + <strong>Du må kontakta offentlege styresmakter direkte for + problem som til dømes</strong>: + + <ul> + <li>Saker som hastar eller akutte problem</li> + <li>Støyforureining eller bjeffande hundar</li> + <li>Brann og røyk / luktforureining</li> + <li>Endringsforslag til kommune, fylke eller stat</li> + <li>Klager over naboane</li> + <li>Kriminell aktivitet</li> + </ul> + </dd> + + <dt>Korleis brukar eg nettstaden?</dt> + <dd>Når du har skrive inn postnummer eller stad, får du presentert + eit kart over det området. Du kan sjå problem allereie + rapportert i dette området, eller rapporten sjølv på eiga hand ved + å klikka på kartet for plasseringa av problemet.</dd> + + <dt>Korleis vert saka løyst?</dt> + <dd>Saka vert meldt til offentlege styresmakter via e-post. Saka + vert så handsama på normal måte. Alternativt kan du diskutera + problemet på nettstaden med andre, og då saman påverka offentlege + styresmakter til å fiksa det, eller fiksa det direkte sjølv.</dd> + + <dt>Er det gratis å bruka fiksgatami.no?</dt> + <dd>Ja, nettsida er gratis å bruka. FiksGataMi vert driven av NUUG, + skjønt, viss du ynskjer å gje eit bidrag, kan du gjera det.</dd> + + <dt>Kan eg bruka FiksGataMi frå mobilen min?</dt> + <dd>Viss mobilen har nettlesar kan du fint bruka tenesta frå + mobiltelefon. Det vert jobba med å skaffa finansiering til å tilpassa + iPhone- og Android-apps til norske tilhøve for å gjera det endå + enklare å rapportera frå smart-telefonar.</dd> + + <dt>Praktisk informasjon</dt> + <dd>FiksGataMi er ikkje ansvarleg for innhaldet i materialet som + brukarane sender inn, eller for at det feilfritt. Vi tek atterhald + om retten til å redigera eller fjerna eventuelle problem eller + oppdateringar som vi ser på som upassande, fyrst og fremst etter at + ein brukar på nettstaden har informert oss.</dd> + + <dt>Kvifor finn eg ikkje stadnamnet mitt?</dt> + + <dd>Tenesta brukar namnesøk hos Google Maps for å lokalisera stadar. + Viss Google Maps har manglar i stadnamndatabasen sin, vil me ikkje + finna staden, eller senda deg til feil plass. Tilsvarande søk på + Google Maps (etter t.d. «Slogvær, Norway») vil òg feila. For å + fiksa det må ein ta kontakt med Google.</dd> + + <dt>Eg finn ikkje gata mi på kartet, kvifor brukar de ikkje + Google Maps? / Det er noko gale med kartet, kor rapporterer eg + det? / Kvifor brukar de ikkje Google Maps? / Kor rapporterer + eg feil eller manglar i kartet?</dt> + + <dd>Kartane i FiksGataMi kjem frå OpenStreetMap (OSM). OSM er fritt + og laga og styrt av brukarane, veldig likt Wikipedia. Føremonene + med OSM er mange, t.d. du enkelt vera med på å utbetra karta, og + leggja til detaljar og informasjon som ikkje er tilgjengeleg på + andre kart. Men sidan kartet er laga av brukarane er det ikkje + sikkert alle gatene er teikna inn der du bur. Vi oppfordrar alle + til å involvera seg i OSM direkte, men dersom dette ikkje er + aktuelt for deg kan du rapportera feil og manglar på + <a href="http://www.mapdust.com/">Mapdust</a>, og dersom du vel + kategorien «Missing street», kan du be om at bidragsytarane legg + til ein veg.</a> + + <dt>Kor finn eg FiksGataMi på sosiale media?</dt> + <dd>FiksGataMi er tilgjengeleg på + <a href="http://www.facebook.com/pages/FiksGataMi/146616932068569">Facebook</a> + og <a href="http://twitter.com/fiksgatami">Twitter</a>.</dd> + + <dt>Korleis rår FiksGataMi-gruppa det offentlege til å handtera + problemrapportar?</dt> + <dd>Vi har skrive ei side med + <a href="http://wiki.nuug.no/grupper/fiksgatami/tips">tips til + offentlege verksemder som mottek meldingar frå FiksGataMi</a> + for svar på vanlege spurnader vi får frå det offentlege, og litt + om kva vi rår til.</dd> + +</dl> + +<h2><a name="privacy"></a>Spurnader om personvern</h2> + +<dl> + + <dt>Vil eg motta reklame eller anna uønska epost?</dt> + <dd>Det vil ikkje skje. Vi sender deg ein epost viss det skjer ei + oppdatering på dei problema du har meldt inn, men vi vil aldri + senda deg e-post i høve med noko anna ein dei problema du + abonnerer på eller har meldt inn.</dd> + + <dt>Kven får å sjå e-postadressa mi?</dt> + <dd>Viss du melder inn ei sak, lagrar vi detaljar om saka, vi sender + samstundes ei melding til kontakten eller kontaktane hos den + relevante styresmakta som er ansvarleg for området der saka er + geografisk lokalisert. Meldinga vert sendt til offentlege + styresmakter som følgjer offentleglova og vil gje kvar og ein + innsyn i meldinga og e-postadressa etter dei gjeldene lovane og + reglane. Vi i FiksGataMi vil ikkje under noko omstende gje eller + selja e-postadressa di til nokon andre.</dd> + + <dt>Kven står bak FiksGataMi?</dt> + <dd><p>Foreininga Norwegian Unix User Group (NUUG) står bak og + driv FiksGataMi. <a href="http://www.friprog.no/">Nasjonalt + kompetansesenter for fri programvare</a> og + <a href="http://www.dss.dep.no/">Servicesentret til + Departementa</a> bidreg med finansiering av prosjektet.</p> + + <p>Organisasjonen mySociety i England har drive og utvikla + nettstaden FixMyStreet sidan 2007. Programvara for FiksGataMi + vert idag driven basert på den same programvara, og utviklinga + føregår som eit samarbeid mellom NUUG i Noreg og mySociety i + England. FiksGataMi er i så måte eit internasjonalt + prosjekt.</p> + + <p>Programvara bak denne nettstaden er fri programvare, og er + tilgjengeleg i hovudsak under programvarelisensen GNU Affero + GPL. Du kan lasta ned kjeldekoda og hjelpa oss å utvikla det. Du + må gjerne bruka han i eigne prosjekt, men du må òg gjera + tilgjengeleg kjeldekoda til slike prosjekt.</p> + + <p>NUUG låner Varnish-tenesta til <a href="http://www.vg.no/">VG + Nett</a> for auka yting, og er svært takknemlege for at VG Nett + bidreg med dette.</p></dd> + + </dl> + +[% *INCLUDE 'footer.html' %] diff --git a/templates/web/fiksgatami/nn/footer.html b/templates/web/fiksgatami/nn/footer.html new file mode 100644 index 000000000..b61cab9ff --- /dev/null +++ b/templates/web/fiksgatami/nn/footer.html @@ -0,0 +1,22 @@ +</div></div> + +<h2 class="v">[% loc('Navigation') %]</h2> +<ul id="navigation"> +<li><a href="/">[% loc("Report a problem") %]</a></li> +<li id="nav_new"><a href="/my">[% loc("Your reports") %]</a></li> +<li><a href="/reports">[% loc("All reports") %]</a></li> +<li><a href="[% c.uri_for('/alert', {pc => pc}) | html %]">[% loc("Local alerts") %]</a></li> +<li><a href="/faq">[% loc("Help") %]</a></li> +<li><a href="/contact">[% loc("Contact") %]</a></li> +</ul> + +<div id="logo" align="center"><a href="http://www.nuug.no/">Foreininga NUUG</a></div> + +<p id="footer"> + [% loc('Built by <a href="http://www.mysociety.org/">mySociety</a> and maintained by <a href="http://www.nuug.no/">NUUG</a>') %] | <a href="http://github.com/mysociety/fixmystreet">[% loc('Source code') %]</a> +</p> + +[% INCLUDE 'debug_footer.html' %] + +</body> +</html> diff --git a/templates/web/fiksgatami/nn/front/news.html b/templates/web/fiksgatami/nn/front/news.html new file mode 100644 index 000000000..e7f3184a9 --- /dev/null +++ b/templates/web/fiksgatami/nn/front/news.html @@ -0,0 +1,12 @@ +[% + news = [ + { date = '2011-04-26', text = '<a href="' _ c.config.ANDROID_URL _ '">Last ned FiksGataMi-app til Android-telefonen din.</a>' }, + { date = '2011-04-23', text = 'Last ned FiksGataMi-app til Android-telefonen din. FiksGataMi sender no vegsaker òg til vegvesenet slik at kommunar ikkje treng senda saker vidare.' }, + ] +%] +[% FOREACH item IN news %] + <p align="center" style="margin-bottom:0"> + <img width="23" height="12" alt="[% loc('New!') %]" src="/i/new.png" border="0">[% item.date %] [% item.text %]</p> + </p> +[% END %] + diff --git a/templates/web/fiksgatami/nn/front/tips.html b/templates/web/fiksgatami/nn/front/tips.html new file mode 100644 index 000000000..6cdefe157 --- /dev/null +++ b/templates/web/fiksgatami/nn/front/tips.html @@ -0,0 +1 @@ +<p><a href="http://wiki.nuug.no/grupper/fiksgatami/tips">Tips til deg som har motteke ei sak frå FiksGataMi.</a></p> diff --git a/templates/web/fiksgatami/nn/header.html b/templates/web/fiksgatami/nn/header.html new file mode 100644 index 000000000..5449eff81 --- /dev/null +++ b/templates/web/fiksgatami/nn/header.html @@ -0,0 +1,30 @@ +<!doctype html> +<!--[if lt IE 7]><html class="ie6 oldie" lang="[% lang_code %]"><![endif]--> +<!--[if IE 7]> <html class="ie7 oldie" lang="[% lang_code %]"><![endif]--> +<!--[if IE 8]> <html class="ie8 oldie" lang="[% lang_code %]"><![endif]--> +<!--[if gt IE 8]><!--><html lang="[% lang_code %]"><!--<![endif]--> + <head> + + <link rel="stylesheet" type="text/css" href="[% version('/css/core.css') %]"> + <link rel="stylesheet" type="text/css" href="[% version('/cobrands/fiksgatami/css.css') %]"> + + [% INCLUDE 'common_header_tags.html' %] + </head> + <body> + + [% IF NOT title AND NOT c.req.path %]<h1 id="header">[% ELSE %]<div id="header"><a href="/">[% END %] + [%- loc('Fix<span id="my">My</span>Street') %] + [%- IF NOT title AND NOT c.req.path %]</h1>[% ELSE %]</a></div>[% END %] + + <ul id="meta"> + [% IF c.user_exists %] + <li>[% tprintf(loc('Signed in as %s'), c.user.name || c.user.email) %] + <li><a href="/auth/sign_out">[% loc('Sign out') %]</a></li> + [% ELSE %] + <li> </li> + [% END %] + </ul> + + <div id="wrapper"><div id="mysociety"> + + [% INCLUDE 'debug_header.html' %] diff --git a/templates/web/fiksgatami/nn/reports/index.html b/templates/web/fiksgatami/nn/reports/index.html new file mode 100755 index 000000000..3cbb2bf8d --- /dev/null +++ b/templates/web/fiksgatami/nn/reports/index.html @@ -0,0 +1,34 @@ +[% INCLUDE 'header.html', title = loc('Summary reports') %] + +<p> +[% loc('This is a summary of all reports on this site; select a particular council to see the reports sent there.') %] +</p> + +<table cellpadding="3" cellspacing="1" border="0"> +<tr> +<th>[% loc('Name') %]</th> +<th>[% loc('New problems') %]</th> +<th>[% loc('Older problems') %]</th> +<th>[% loc('Old problems,<br>state unknown') %]</th> +<th>[% loc('Recently fixed') %]</th> +<th>[% loc('Older fixed') %]</th> +</tr> + +[% FOREACH area IN areas_info_sorted %] +[% NEXT IF area.id == 301 %] +<tr align="center" +[%- IF loop.count % 2 %] class="a" +[%- END -%] +> +<td align="left"><a href="[% area.url %]">[% area.name %]</a></td> +<td>[% open.${area.id}.new or 0 %]</td> +<td>[% open.${area.id}.older or 0 %]</td> +<td>[% open.${area.id}.unknown or 0 %]</td> +<td>[% fixed.${area.id}.new or 0 %]</td> +<td>[% fixed.${area.id}.old or 0 %]</td> +</tr> +[% END %] +</table> + +[% INCLUDE 'footer.html' %] + diff --git a/templates/web/reading/footer.html b/templates/web/reading/footer.html index 2d58eb0c7..ec523aa97 100644 --- a/templates/web/reading/footer.html +++ b/templates/web/reading/footer.html @@ -28,5 +28,20 @@ <div class="clear"></div> </div> </div> + +<!-- START OF eVisitAnalyst CODE --> +<script language="JavaScript" type="text/javascript"> +var ID_section_15243615 = "";//Place section here. +var ID_tt_15243615 = "t"; +var ID_uid_15243615 = "23137"; +</script> +<script src="http://extra.evisitanalyst.com/eva.js" type="text/javascript"></script> +<script src="http://extra.evisitanalyst.com/tag/evatrackclick.js" type="text/javascript"></script> +<noscript> + <img src="http://extra.evisitanalyst.com/eva51/collect/?userid=23137&tt=t" + border="0" alt="eVisit" width="1" height="1"> +</noscript> +<!-- END OF eVisitAnalyst CODE --> + </body> </html> diff --git a/templates/web/reading/reports/cobrand_stats.html b/templates/web/reading/reports/cobrand_stats.html index becb724cf..80976c3a6 100644 --- a/templates/web/reading/reports/cobrand_stats.html +++ b/templates/web/reading/reports/cobrand_stats.html @@ -1,4 +1,5 @@ <ul> - <li>Reports submitted via <a href="[% uri_for('/') %]">reading.fixmystreet.com</a>: [% cobrand_count %]</li> - <li>Reports submitted via <a href="http://www.fixmystreet.com/">www.fixmystreet.com</a>: [% total_count %]</li> + <li>Reports submitted via <a href="[% uri_for('/') %]">reading.fixmystreet.com</a>: [% stats.cobrand %]</li> + <li>Reports submitted via <a href="http://www.fixmystreet.com/">www.fixmystreet.com</a>: [% stats.main_site %]<br /><br /> + Statistics date from launch of Reading FixMyStreet.</li> </ul> diff --git a/templates/web/southampton/report/photo.html b/templates/web/southampton/report/photo.html new file mode 100644 index 000000000..07b6a8558 --- /dev/null +++ b/templates/web/southampton/report/photo.html @@ -0,0 +1,6 @@ +[% 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/web/cobrands/emptyhomes/css.css b/web/cobrands/emptyhomes/css.css index e59497880..ba761814a 100644 --- a/web/cobrands/emptyhomes/css.css +++ b/web/cobrands/emptyhomes/css.css @@ -223,3 +223,14 @@ a:hover, a:active { margin-bottom: 1em; } +.video { + float: right; + margin-left: 35px; +} + +.channel4 { + font-size: 125%; +} +.channel4 > li:first-child + li { + margin-bottom: 1em; +} diff --git a/web/cobrands/southampton/css.scss b/web/cobrands/southampton/css.scss index 0760c982c..3bc2f1b54 100644 --- a/web/cobrands/southampton/css.scss +++ b/web/cobrands/southampton/css.scss @@ -8,6 +8,7 @@ $darker: #768EB5; #map_box { width: $map_width + 2px; + margin-bottom: 10px; } #map, #drag { width: $map_width; @@ -60,4 +61,7 @@ $darker: #768EB5; padding: 0.5em; } + #update_form { + clear: right; + } } diff --git a/web/css/_main.scss b/web/css/_main.scss index 8d3b00418..305a9e43e 100644 --- a/web/css/_main.scss +++ b/web/css/_main.scss @@ -98,7 +98,7 @@ select, input, textarea { #meta { list-style-type: none; - margin: 0.25em 0 0 1em; + margin: 30px 0 0.5em 1em; /* (was 0.25em 0 0 1em) forced to drop below promo (fix before the freeze) image */ padding: 0; font-size: 0.875em; li { diff --git a/web/css/core.scss b/web/css/core.scss index c1856a2c5..675471b40 100644 --- a/web/css/core.scss +++ b/web/css/core.scss @@ -45,11 +45,22 @@ $map_width: 500px; color: #cc0000; margin: 5px 1em 5px 1em; padding: 2px 5px 2px 5px; - float: left; - background-color: #ffeeee; text-align: left; } + div.label-valid { + background-color: white; + } + + div.label-valid-hidden { + display: none; + visibility: hidden; + height: 0px; + width: 0px; + margin: 0px; + padding: 0px; + } + div.form-field { clear: both; } diff --git a/web/i/appstore.png b/web/i/appstore.png Binary files differnew file mode 100644 index 000000000..3e97c3688 --- /dev/null +++ b/web/i/appstore.png diff --git a/web/js/OpenLayers.fixmystreet.js b/web/js/OpenLayers.fixmystreet.js index 9616df8b6..eab691def 100644 --- a/web/js/OpenLayers.fixmystreet.js +++ b/web/js/OpenLayers.fixmystreet.js @@ -1100,7 +1100,15 @@ 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;} +layer.events.triggerEvent("loadend");},CLASS_NAME:"OpenLayers.Strategy.Fixed"});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.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"});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)+"-"+ diff --git a/web/js/fixmystreet.js b/web/js/fixmystreet.js index 97d2892af..524bcdafa 100644 --- a/web/js/fixmystreet.js +++ b/web/js/fixmystreet.js @@ -4,11 +4,20 @@ */ function form_category_onchange() { - $.getJSON('/report/new/category_extras', { - latitude: fixmystreet.latitude, - longitude: fixmystreet.longitude, - category: this.options[ this.selectedIndex ].text, - }, function(data) { + var cat = $('#form_category'); + var args = { + category: cat.val() + }; + + if ( typeof fixmystreet !== 'undefined' ) { + args['latitude'] = fixmystreet.latitude; + args['longitude'] = fixmystreet.longitude; + } else { + args['latitude'] = $('input[name="latitude"]').val(); + args['longitude'] = $('input[name="longitude"]').val(); + } + + $.getJSON('/report/new/category_extras', args, function(data) { if ( data.category_extra ) { if ( $('#category_meta').size() ) { $('#category_meta').html( data.category_extra); @@ -28,12 +37,14 @@ $(function(){ $('#pc').focus(); $('input[type=submit]').removeAttr('disabled'); + /* $('#mapForm').submit(function() { if (this.submit_problem) { $('input[type=submit]', this).prop("disabled", true); } return true; }); + */ if (!$('#been_fixed_no').prop('checked') && !$('#been_fixed_unknown').prop('checked')) { $('#another_qn').hide(); @@ -53,6 +64,81 @@ $(function(){ $('#email_alert_box').hide('fast'); } + // FIXME - needs to use translated string + jQuery.validator.addMethod('validCategory', function(value, element) { + return this.optional(element) || value != '-- Pick a category --'; }, validation_strings['category'] ); + + jQuery.validator.addMethod('validName', function(value, element) { + var validNamePat = /\ba\s*n+on+((y|o)mo?u?s)?(ly)?\b/i; + return this.optional(element) || value.length > 5 && value.match( /\S/ ) && !value.match( validNamePat ) }, validation_strings['category'] ); + + var form_submitted = 0; + + $("form.validate").validate({ + rules: { + title: { required: true }, + detail: { required: true }, + email: { required: true }, + update: { required: true }, + rznvy: { required: true } + }, + messages: validation_strings, + onkeyup: false, + errorElement: 'div', + errorClass: 'form-error', + // we do this to stop things jumping around on blur + success: function (err) { if ( form_submitted ) { err.addClass('label-valid').html( ' ' ); } else { err.addClass('label-valid-hidden'); } }, + errorPlacement: function( error, element ) { + /* And all because the .before thing doesn't seem to work in + mobile safari on iOS 5. However outerHTML is not cross + browser so we have to have two solutions :( */ + if ( element[0].outerHTML ) { + var html = element.parent('div').html(); + element.parent('div').html( error[0].outerHTML + html ); + } else { + element.parent('div').before( error ); + } + }, + submitHandler: function(form) { + if (form.submit_problem) { + $('input[type=submit]', form).prop("disabled", true); + } + + form.submit(); + }, + // make sure we can see the error message when we focus on invalid elements + showErrors: function( errorMap, errorList ) { + submitted && errorList.length && $(window).scrollTop( $(errorList[0].element).offset().top - 40 ); + this.defaultShowErrors(); + submitted = false; + }, + invalidHandler: function(form, validator) { submitted = true; } + }); + + $('input[type=submit]').click( function(e) { form_submitted = 1; } ); + + /* set correct required status depending on what we submit + * NB: need to add things to form_category as the JS updating + * of this we do after a map click removes them */ + $('#submit_sign_in').click( function(e) { + $('#form_category').addClass('required validCategory').removeClass('valid'); + $('#form_name').removeClass(); + } ); + + $('#submit_register').click( function(e) { + $('#form_category').addClass('required validCategory').removeClass('valid'); + $('#form_name').addClass('required validName'); + } ); + + $('#problem_submit > input[type="submit"]').click( function(e) { + $('#form_category').addClass('required validCategory').removeClass('valid'); + $('#form_name').addClass('required validName'); + } ); + + $('#update_post').click( function(e) { + $('#form_name').addClass('required').removeClass('valid'); + } ); + $('#email_alert').click(function(e) { if (!$('#email_alert_box').length) return true; diff --git a/web/js/jquery.validate.js b/web/js/jquery.validate.js new file mode 100644 index 000000000..b7ed45b4a --- /dev/null +++ b/web/js/jquery.validate.js @@ -0,0 +1,1188 @@ +/** + * jQuery Validation Plugin 1.9.0 + * + * http://bassistance.de/jquery-plugins/jquery-plugin-validation/ + * http://docs.jquery.com/Plugins/Validation + * + * Copyright (c) 2006 - 2011 Jörn Zaefferer + * + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + */ + +(function($) { + +$.extend($.fn, { + // http://docs.jquery.com/Plugins/Validation/validate + validate: function( options ) { + + // if nothing is selected, return nothing; can't chain anyway + if (!this.length) { + options && options.debug && window.console && console.warn( "nothing selected, can't validate, returning nothing" ); + return; + } + + // check if a validator for this form was already created + var validator = $.data(this[0], 'validator'); + if ( validator ) { + return validator; + } + + // Add novalidate tag if HTML5. + this.attr('novalidate', 'novalidate'); + + validator = new $.validator( options, this[0] ); + $.data(this[0], 'validator', validator); + + if ( validator.settings.onsubmit ) { + + var inputsAndButtons = this.find("input, button"); + + // allow suppresing validation by adding a cancel class to the submit button + inputsAndButtons.filter(".cancel").click(function () { + validator.cancelSubmit = true; + }); + + // when a submitHandler is used, capture the submitting button + if (validator.settings.submitHandler) { + inputsAndButtons.filter(":submit").click(function () { + validator.submitButton = this; + }); + } + + // validate the form on submit + this.submit( function( event ) { + if ( validator.settings.debug ) + // prevent form submit to be able to see console output + event.preventDefault(); + + function handle() { + if ( validator.settings.submitHandler ) { + if (validator.submitButton) { + // insert a hidden input as a replacement for the missing submit button + var hidden = $("<input type='hidden'/>").attr("name", validator.submitButton.name).val(validator.submitButton.value).appendTo(validator.currentForm); + } + validator.settings.submitHandler.call( validator, validator.currentForm ); + if (validator.submitButton) { + // and clean up afterwards; thanks to no-block-scope, hidden can be referenced + hidden.remove(); + } + return false; + } + return true; + } + + // prevent submit for invalid forms or custom submit handlers + if ( validator.cancelSubmit ) { + validator.cancelSubmit = false; + return handle(); + } + if ( validator.form() ) { + if ( validator.pendingRequest ) { + validator.formSubmitted = true; + return false; + } + return handle(); + } else { + validator.focusInvalid(); + return false; + } + }); + } + + return validator; + }, + // http://docs.jquery.com/Plugins/Validation/valid + valid: function() { + if ( $(this[0]).is('form')) { + return this.validate().form(); + } else { + var valid = true; + var validator = $(this[0].form).validate(); + this.each(function() { + valid &= validator.element(this); + }); + return valid; + } + }, + // attributes: space seperated list of attributes to retrieve and remove + removeAttrs: function(attributes) { + var result = {}, + $element = this; + $.each(attributes.split(/\s/), function(index, value) { + result[value] = $element.attr(value); + $element.removeAttr(value); + }); + return result; + }, + // http://docs.jquery.com/Plugins/Validation/rules + rules: function(command, argument) { + var element = this[0]; + + if (command) { + var settings = $.data(element.form, 'validator').settings; + var staticRules = settings.rules; + var existingRules = $.validator.staticRules(element); + switch(command) { + case "add": + $.extend(existingRules, $.validator.normalizeRule(argument)); + staticRules[element.name] = existingRules; + if (argument.messages) + settings.messages[element.name] = $.extend( settings.messages[element.name], argument.messages ); + break; + case "remove": + if (!argument) { + delete staticRules[element.name]; + return existingRules; + } + var filtered = {}; + $.each(argument.split(/\s/), function(index, method) { + filtered[method] = existingRules[method]; + delete existingRules[method]; + }); + return filtered; + } + } + + var data = $.validator.normalizeRules( + $.extend( + {}, + $.validator.metadataRules(element), + $.validator.classRules(element), + $.validator.attributeRules(element), + $.validator.staticRules(element) + ), element); + + // make sure required is at front + if (data.required) { + var param = data.required; + delete data.required; + data = $.extend({required: param}, data); + } + + return data; + } +}); + +// Custom selectors +$.extend($.expr[":"], { + // http://docs.jquery.com/Plugins/Validation/blank + blank: function(a) {return !$.trim("" + a.value);}, + // http://docs.jquery.com/Plugins/Validation/filled + filled: function(a) {return !!$.trim("" + a.value);}, + // http://docs.jquery.com/Plugins/Validation/unchecked + unchecked: function(a) {return !a.checked;} +}); + +// constructor for validator +$.validator = function( options, form ) { + this.settings = $.extend( true, {}, $.validator.defaults, options ); + this.currentForm = form; + this.init(); +}; + +$.validator.format = function(source, params) { + if ( arguments.length == 1 ) + return function() { + var args = $.makeArray(arguments); + args.unshift(source); + return $.validator.format.apply( this, args ); + }; + if ( arguments.length > 2 && params.constructor != Array ) { + params = $.makeArray(arguments).slice(1); + } + if ( params.constructor != Array ) { + params = [ params ]; + } + $.each(params, function(i, n) { + source = source.replace(new RegExp("\\{" + i + "\\}", "g"), n); + }); + return source; +}; + +$.extend($.validator, { + + defaults: { + messages: {}, + groups: {}, + rules: {}, + errorClass: "error", + validClass: "valid", + errorElement: "label", + focusInvalid: true, + errorContainer: $( [] ), + errorLabelContainer: $( [] ), + onsubmit: true, + ignore: ":hidden", + ignoreTitle: false, + onfocusin: function(element, event) { + this.lastActive = element; + + // hide error label and remove error class on focus if enabled + if ( this.settings.focusCleanup && !this.blockFocusCleanup ) { + this.settings.unhighlight && this.settings.unhighlight.call( this, element, this.settings.errorClass, this.settings.validClass ); + this.addWrapper(this.errorsFor(element)).hide(); + } + }, + onfocusout: function(element, event) { + if ( !this.checkable(element) && (element.name in this.submitted || !this.optional(element)) ) { + this.element(element); + } + }, + onkeyup: function(element, event) { + if ( element.name in this.submitted || element == this.lastElement ) { + this.element(element); + } + }, + onclick: function(element, event) { + // click on selects, radiobuttons and checkboxes + if ( element.name in this.submitted ) + this.element(element); + // or option elements, check parent select in that case + else if (element.parentNode.name in this.submitted) + this.element(element.parentNode); + }, + highlight: function(element, errorClass, validClass) { + if (element.type === 'radio') { + this.findByName(element.name).addClass(errorClass).removeClass(validClass); + } else { + $(element).addClass(errorClass).removeClass(validClass); + } + }, + unhighlight: function(element, errorClass, validClass) { + if (element.type === 'radio') { + this.findByName(element.name).removeClass(errorClass).addClass(validClass); + } else { + $(element).removeClass(errorClass).addClass(validClass); + } + } + }, + + // http://docs.jquery.com/Plugins/Validation/Validator/setDefaults + setDefaults: function(settings) { + $.extend( $.validator.defaults, settings ); + }, + + messages: { + required: "This field is required.", + remote: "Please fix this field.", + email: "Please enter a valid email address.", + url: "Please enter a valid URL.", + date: "Please enter a valid date.", + dateISO: "Please enter a valid date (ISO).", + number: "Please enter a valid number.", + digits: "Please enter only digits.", + creditcard: "Please enter a valid credit card number.", + equalTo: "Please enter the same value again.", + accept: "Please enter a value with a valid extension.", + maxlength: $.validator.format("Please enter no more than {0} characters."), + minlength: $.validator.format("Please enter at least {0} characters."), + rangelength: $.validator.format("Please enter a value between {0} and {1} characters long."), + range: $.validator.format("Please enter a value between {0} and {1}."), + max: $.validator.format("Please enter a value less than or equal to {0}."), + min: $.validator.format("Please enter a value greater than or equal to {0}.") + }, + + autoCreateRanges: false, + + prototype: { + + init: function() { + this.labelContainer = $(this.settings.errorLabelContainer); + this.errorContext = this.labelContainer.length && this.labelContainer || $(this.currentForm); + this.containers = $(this.settings.errorContainer).add( this.settings.errorLabelContainer ); + this.submitted = {}; + this.valueCache = {}; + this.pendingRequest = 0; + this.pending = {}; + this.invalid = {}; + this.reset(); + + var groups = (this.groups = {}); + $.each(this.settings.groups, function(key, value) { + $.each(value.split(/\s/), function(index, name) { + groups[name] = key; + }); + }); + var rules = this.settings.rules; + $.each(rules, function(key, value) { + rules[key] = $.validator.normalizeRule(value); + }); + + function delegate(event) { + var validator = $.data(this[0].form, "validator"), + eventType = "on" + event.type.replace(/^validate/, ""); + validator.settings[eventType] && validator.settings[eventType].call(validator, this[0], event); + } + $(this.currentForm) + .validateDelegate("[type='text'], [type='password'], [type='file'], select, textarea, " + + "[type='number'], [type='search'] ,[type='tel'], [type='url'], " + + "[type='email'], [type='datetime'], [type='date'], [type='month'], " + + "[type='week'], [type='time'], [type='datetime-local'], " + + "[type='range'], [type='color'] ", + "focusin focusout keyup", delegate) + .validateDelegate("[type='radio'], [type='checkbox'], select, option", "click", delegate); + + if (this.settings.invalidHandler) + $(this.currentForm).bind("invalid-form.validate", this.settings.invalidHandler); + }, + + // http://docs.jquery.com/Plugins/Validation/Validator/form + form: function() { + this.checkForm(); + $.extend(this.submitted, this.errorMap); + this.invalid = $.extend({}, this.errorMap); + if (!this.valid()) + $(this.currentForm).triggerHandler("invalid-form", [this]); + this.showErrors(); + return this.valid(); + }, + + checkForm: function() { + this.prepareForm(); + for ( var i = 0, elements = (this.currentElements = this.elements()); elements[i]; i++ ) { + this.check( elements[i] ); + } + return this.valid(); + }, + + // http://docs.jquery.com/Plugins/Validation/Validator/element + element: function( element ) { + element = this.validationTargetFor( this.clean( element ) ); + this.lastElement = element; + this.prepareElement( element ); + this.currentElements = $(element); + var result = this.check( element ); + if ( result ) { + delete this.invalid[element.name]; + } else { + this.invalid[element.name] = true; + } + if ( !this.numberOfInvalids() ) { + // Hide error containers on last error + this.toHide = this.toHide.add( this.containers ); + } + this.showErrors(); + return result; + }, + + // http://docs.jquery.com/Plugins/Validation/Validator/showErrors + showErrors: function(errors) { + if(errors) { + // add items to error list and map + $.extend( this.errorMap, errors ); + this.errorList = []; + for ( var name in errors ) { + this.errorList.push({ + message: errors[name], + element: this.findByName(name)[0] + }); + } + // remove items from success list + this.successList = $.grep( this.successList, function(element) { + return !(element.name in errors); + }); + } + this.settings.showErrors + ? this.settings.showErrors.call( this, this.errorMap, this.errorList ) + : this.defaultShowErrors(); + }, + + // http://docs.jquery.com/Plugins/Validation/Validator/resetForm + resetForm: function() { + if ( $.fn.resetForm ) + $( this.currentForm ).resetForm(); + this.submitted = {}; + this.lastElement = null; + this.prepareForm(); + this.hideErrors(); + this.elements().removeClass( this.settings.errorClass ); + }, + + numberOfInvalids: function() { + return this.objectLength(this.invalid); + }, + + objectLength: function( obj ) { + var count = 0; + for ( var i in obj ) + count++; + return count; + }, + + hideErrors: function() { + this.addWrapper( this.toHide ).hide(); + }, + + valid: function() { + return this.size() == 0; + }, + + size: function() { + return this.errorList.length; + }, + + focusInvalid: function() { + if( this.settings.focusInvalid ) { + try { + $(this.findLastActive() || this.errorList.length && this.errorList[0].element || []) + .filter(":visible") + .focus() + // manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find + .trigger("focusin"); + } catch(e) { + // ignore IE throwing errors when focusing hidden elements + } + } + }, + + findLastActive: function() { + var lastActive = this.lastActive; + return lastActive && $.grep(this.errorList, function(n) { + return n.element.name == lastActive.name; + }).length == 1 && lastActive; + }, + + elements: function() { + var validator = this, + rulesCache = {}; + + // select all valid inputs inside the form (no submit or reset buttons) + return $(this.currentForm) + .find("input, select, textarea") + .not(":submit, :reset, :image, [disabled]") + .not( this.settings.ignore ) + .filter(function() { + !this.name && validator.settings.debug && window.console && console.error( "%o has no name assigned", this); + + // select only the first element for each name, and only those with rules specified + if ( this.name in rulesCache || !validator.objectLength($(this).rules()) ) + return false; + + rulesCache[this.name] = true; + return true; + }); + }, + + clean: function( selector ) { + return $( selector )[0]; + }, + + errors: function() { + return $( this.settings.errorElement + "." + this.settings.errorClass, this.errorContext ); + }, + + reset: function() { + this.successList = []; + this.errorList = []; + this.errorMap = {}; + this.toShow = $([]); + this.toHide = $([]); + this.currentElements = $([]); + }, + + prepareForm: function() { + this.reset(); + this.toHide = this.errors().add( this.containers ); + }, + + prepareElement: function( element ) { + this.reset(); + this.toHide = this.errorsFor(element); + }, + + check: function( element ) { + element = this.validationTargetFor( this.clean( element ) ); + + var rules = $(element).rules(); + var dependencyMismatch = false; + for (var method in rules ) { + var rule = { method: method, parameters: rules[method] }; + try { + var result = $.validator.methods[method].call( this, element.value.replace(/\r/g, ""), element, rule.parameters ); + + // if a method indicates that the field is optional and therefore valid, + // don't mark it as valid when there are no other rules + if ( result == "dependency-mismatch" ) { + dependencyMismatch = true; + continue; + } + dependencyMismatch = false; + + if ( result == "pending" ) { + this.toHide = this.toHide.not( this.errorsFor(element) ); + return; + } + + if( !result ) { + this.formatAndAdd( element, rule ); + return false; + } + } catch(e) { + this.settings.debug && window.console && console.log("exception occured when checking element " + element.id + + ", check the '" + rule.method + "' method", e); + throw e; + } + } + if (dependencyMismatch) + return; + if ( this.objectLength(rules) ) + this.successList.push(element); + return true; + }, + + // return the custom message for the given element and validation method + // specified in the element's "messages" metadata + customMetaMessage: function(element, method) { + if (!$.metadata) + return; + + var meta = this.settings.meta + ? $(element).metadata()[this.settings.meta] + : $(element).metadata(); + + return meta && meta.messages && meta.messages[method]; + }, + + // return the custom message for the given element name and validation method + customMessage: function( name, method ) { + var m = this.settings.messages[name]; + return m && (m.constructor == String + ? m + : m[method]); + }, + + // return the first defined argument, allowing empty strings + findDefined: function() { + for(var i = 0; i < arguments.length; i++) { + if (arguments[i] !== undefined) + return arguments[i]; + } + return undefined; + }, + + defaultMessage: function( element, method) { + return this.findDefined( + this.customMessage( element.name, method ), + this.customMetaMessage( element, method ), + // title is never undefined, so handle empty string as undefined + !this.settings.ignoreTitle && element.title || undefined, + $.validator.messages[method], + "<strong>Warning: No message defined for " + element.name + "</strong>" + ); + }, + + formatAndAdd: function( element, rule ) { + var message = this.defaultMessage( element, rule.method ), + theregex = /\$?\{(\d+)\}/g; + if ( typeof message == "function" ) { + message = message.call(this, rule.parameters, element); + } else if (theregex.test(message)) { + message = jQuery.format(message.replace(theregex, '{$1}'), rule.parameters); + } + this.errorList.push({ + message: message, + element: element + }); + + this.errorMap[element.name] = message; + this.submitted[element.name] = message; + }, + + addWrapper: function(toToggle) { + if ( this.settings.wrapper ) + toToggle = toToggle.add( toToggle.parent( this.settings.wrapper ) ); + return toToggle; + }, + + defaultShowErrors: function() { + for ( var i = 0; this.errorList[i]; i++ ) { + var error = this.errorList[i]; + this.settings.highlight && this.settings.highlight.call( this, error.element, this.settings.errorClass, this.settings.validClass ); + this.showLabel( error.element, error.message ); + } + if( this.errorList.length ) { + this.toShow = this.toShow.add( this.containers ); + } + if (this.settings.success) { + for ( var i = 0; this.successList[i]; i++ ) { + this.showLabel( this.successList[i] ); + } + } + if (this.settings.unhighlight) { + for ( var i = 0, elements = this.validElements(); elements[i]; i++ ) { + this.settings.unhighlight.call( this, elements[i], this.settings.errorClass, this.settings.validClass ); + } + } + this.toHide = this.toHide.not( this.toShow ); + this.hideErrors(); + this.addWrapper( this.toShow ).show(); + }, + + validElements: function() { + return this.currentElements.not(this.invalidElements()); + }, + + invalidElements: function() { + return $(this.errorList).map(function() { + return this.element; + }); + }, + + showLabel: function(element, message) { + var label = this.errorsFor( element ); + if ( label.length ) { + // refresh error/success class + label.removeClass( this.settings.validClass ).addClass( this.settings.errorClass ); + + // check if we have a generated label, replace the message then + label.attr("generated") && label.html(message); + } else { + // create label + label = $("<" + this.settings.errorElement + "/>") + .attr({"for": this.idOrName(element), generated: true}) + .addClass(this.settings.errorClass) + .html(message || ""); + if ( this.settings.wrapper ) { + // make sure the element is visible, even in IE + // actually showing the wrapped element is handled elsewhere + label = label.hide().show().wrap("<" + this.settings.wrapper + "/>").parent(); + } + if ( !this.labelContainer.append(label).length ) + this.settings.errorPlacement + ? this.settings.errorPlacement(label, $(element) ) + : label.insertAfter(element); + } + if ( !message && this.settings.success ) { + label.text(""); + typeof this.settings.success == "string" + ? label.addClass( this.settings.success ) + : this.settings.success( label ); + } + this.toShow = this.toShow.add(label); + }, + + errorsFor: function(element) { + var name = this.idOrName(element); + return this.errors().filter(function() { + return $(this).attr('for') == name; + }); + }, + + idOrName: function(element) { + return this.groups[element.name] || (this.checkable(element) ? element.name : element.id || element.name); + }, + + validationTargetFor: function(element) { + // if radio/checkbox, validate first element in group instead + if (this.checkable(element)) { + element = this.findByName( element.name ).not(this.settings.ignore)[0]; + } + return element; + }, + + checkable: function( element ) { + return /radio|checkbox/i.test(element.type); + }, + + findByName: function( name ) { + // select by name and filter by form for performance over form.find("[name=...]") + var form = this.currentForm; + return $(document.getElementsByName(name)).map(function(index, element) { + return element.form == form && element.name == name && element || null; + }); + }, + + getLength: function(value, element) { + switch( element.nodeName.toLowerCase() ) { + case 'select': + return $("option:selected", element).length; + case 'input': + if( this.checkable( element) ) + return this.findByName(element.name).filter(':checked').length; + } + return value.length; + }, + + depend: function(param, element) { + return this.dependTypes[typeof param] + ? this.dependTypes[typeof param](param, element) + : true; + }, + + dependTypes: { + "boolean": function(param, element) { + return param; + }, + "string": function(param, element) { + return !!$(param, element.form).length; + }, + "function": function(param, element) { + return param(element); + } + }, + + optional: function(element) { + return !$.validator.methods.required.call(this, $.trim(element.value), element) && "dependency-mismatch"; + }, + + startRequest: function(element) { + if (!this.pending[element.name]) { + this.pendingRequest++; + this.pending[element.name] = true; + } + }, + + stopRequest: function(element, valid) { + this.pendingRequest--; + // sometimes synchronization fails, make sure pendingRequest is never < 0 + if (this.pendingRequest < 0) + this.pendingRequest = 0; + delete this.pending[element.name]; + if ( valid && this.pendingRequest == 0 && this.formSubmitted && this.form() ) { + $(this.currentForm).submit(); + this.formSubmitted = false; + } else if (!valid && this.pendingRequest == 0 && this.formSubmitted) { + $(this.currentForm).triggerHandler("invalid-form", [this]); + this.formSubmitted = false; + } + }, + + previousValue: function(element) { + return $.data(element, "previousValue") || $.data(element, "previousValue", { + old: null, + valid: true, + message: this.defaultMessage( element, "remote" ) + }); + } + + }, + + classRuleSettings: { + required: {required: true}, + email: {email: true}, + url: {url: true}, + date: {date: true}, + dateISO: {dateISO: true}, + dateDE: {dateDE: true}, + number: {number: true}, + numberDE: {numberDE: true}, + digits: {digits: true}, + creditcard: {creditcard: true} + }, + + addClassRules: function(className, rules) { + className.constructor == String ? + this.classRuleSettings[className] = rules : + $.extend(this.classRuleSettings, className); + }, + + classRules: function(element) { + var rules = {}; + var classes = $(element).attr('class'); + classes && $.each(classes.split(' '), function() { + if (this in $.validator.classRuleSettings) { + $.extend(rules, $.validator.classRuleSettings[this]); + } + }); + return rules; + }, + + attributeRules: function(element) { + var rules = {}; + var $element = $(element); + + for (var method in $.validator.methods) { + var value; + // If .prop exists (jQuery >= 1.6), use it to get true/false for required + if (method === 'required' && typeof $.fn.prop === 'function') { + value = $element.prop(method); + } else { + value = $element.attr(method); + } + if (value) { + rules[method] = value; + } else if ($element[0].getAttribute("type") === method) { + rules[method] = true; + } + } + + // maxlength may be returned as -1, 2147483647 (IE) and 524288 (safari) for text inputs + if (rules.maxlength && /-1|2147483647|524288/.test(rules.maxlength)) { + delete rules.maxlength; + } + + return rules; + }, + + metadataRules: function(element) { + if (!$.metadata) return {}; + + var meta = $.data(element.form, 'validator').settings.meta; + return meta ? + $(element).metadata()[meta] : + $(element).metadata(); + }, + + staticRules: function(element) { + var rules = {}; + var validator = $.data(element.form, 'validator'); + if (validator.settings.rules) { + rules = $.validator.normalizeRule(validator.settings.rules[element.name]) || {}; + } + return rules; + }, + + normalizeRules: function(rules, element) { + // handle dependency check + $.each(rules, function(prop, val) { + // ignore rule when param is explicitly false, eg. required:false + if (val === false) { + delete rules[prop]; + return; + } + if (val.param || val.depends) { + var keepRule = true; + switch (typeof val.depends) { + case "string": + keepRule = !!$(val.depends, element.form).length; + break; + case "function": + keepRule = val.depends.call(element, element); + break; + } + if (keepRule) { + rules[prop] = val.param !== undefined ? val.param : true; + } else { + delete rules[prop]; + } + } + }); + + // evaluate parameters + $.each(rules, function(rule, parameter) { + rules[rule] = $.isFunction(parameter) ? parameter(element) : parameter; + }); + + // clean number parameters + $.each(['minlength', 'maxlength', 'min', 'max'], function() { + if (rules[this]) { + rules[this] = Number(rules[this]); + } + }); + $.each(['rangelength', 'range'], function() { + if (rules[this]) { + rules[this] = [Number(rules[this][0]), Number(rules[this][1])]; + } + }); + + if ($.validator.autoCreateRanges) { + // auto-create ranges + if (rules.min && rules.max) { + rules.range = [rules.min, rules.max]; + delete rules.min; + delete rules.max; + } + if (rules.minlength && rules.maxlength) { + rules.rangelength = [rules.minlength, rules.maxlength]; + delete rules.minlength; + delete rules.maxlength; + } + } + + // To support custom messages in metadata ignore rule methods titled "messages" + if (rules.messages) { + delete rules.messages; + } + + return rules; + }, + + // Converts a simple string to a {string: true} rule, e.g., "required" to {required:true} + normalizeRule: function(data) { + if( typeof data == "string" ) { + var transformed = {}; + $.each(data.split(/\s/), function() { + transformed[this] = true; + }); + data = transformed; + } + return data; + }, + + // http://docs.jquery.com/Plugins/Validation/Validator/addMethod + addMethod: function(name, method, message) { + $.validator.methods[name] = method; + $.validator.messages[name] = message != undefined ? message : $.validator.messages[name]; + if (method.length < 3) { + $.validator.addClassRules(name, $.validator.normalizeRule(name)); + } + }, + + methods: { + + // http://docs.jquery.com/Plugins/Validation/Methods/required + required: function(value, element, param) { + // check if dependency is met + if ( !this.depend(param, element) ) + return "dependency-mismatch"; + switch( element.nodeName.toLowerCase() ) { + case 'select': + // could be an array for select-multiple or a string, both are fine this way + var val = $(element).val(); + return val && val.length > 0; + case 'input': + if ( this.checkable(element) ) + return this.getLength(value, element) > 0; + default: + return $.trim(value).length > 0; + } + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/remote + remote: function(value, element, param) { + if ( this.optional(element) ) + return "dependency-mismatch"; + + var previous = this.previousValue(element); + if (!this.settings.messages[element.name] ) + this.settings.messages[element.name] = {}; + previous.originalMessage = this.settings.messages[element.name].remote; + this.settings.messages[element.name].remote = previous.message; + + param = typeof param == "string" && {url:param} || param; + + if ( this.pending[element.name] ) { + return "pending"; + } + if ( previous.old === value ) { + return previous.valid; + } + + previous.old = value; + var validator = this; + this.startRequest(element); + var data = {}; + data[element.name] = value; + $.ajax($.extend(true, { + url: param, + mode: "abort", + port: "validate" + element.name, + dataType: "json", + data: data, + success: function(response) { + validator.settings.messages[element.name].remote = previous.originalMessage; + var valid = response === true; + if ( valid ) { + var submitted = validator.formSubmitted; + validator.prepareElement(element); + validator.formSubmitted = submitted; + validator.successList.push(element); + validator.showErrors(); + } else { + var errors = {}; + var message = response || validator.defaultMessage( element, "remote" ); + errors[element.name] = previous.message = $.isFunction(message) ? message(value) : message; + validator.showErrors(errors); + } + previous.valid = valid; + validator.stopRequest(element, valid); + } + }, param)); + return "pending"; + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/minlength + minlength: function(value, element, param) { + return this.optional(element) || this.getLength($.trim(value), element) >= param; + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/maxlength + maxlength: function(value, element, param) { + return this.optional(element) || this.getLength($.trim(value), element) <= param; + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/rangelength + rangelength: function(value, element, param) { + var length = this.getLength($.trim(value), element); + return this.optional(element) || ( length >= param[0] && length <= param[1] ); + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/min + min: function( value, element, param ) { + return this.optional(element) || value >= param; + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/max + max: function( value, element, param ) { + return this.optional(element) || value <= param; + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/range + range: function( value, element, param ) { + return this.optional(element) || ( value >= param[0] && value <= param[1] ); + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/email + email: function(value, element) { + // contributed by Scott Gonzalez: http://projects.scottsplayground.com/email_address_validation/ + return this.optional(element) || /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i.test(value); + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/url + url: function(value, element) { + // contributed by Scott Gonzalez: http://projects.scottsplayground.com/iri/ + return this.optional(element) || /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(value); + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/date + date: function(value, element) { + return this.optional(element) || !/Invalid|NaN/.test(new Date(value)); + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/dateISO + dateISO: function(value, element) { + return this.optional(element) || /^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(value); + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/number + number: function(value, element) { + return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:,\d{3})+)(?:\.\d+)?$/.test(value); + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/digits + digits: function(value, element) { + return this.optional(element) || /^\d+$/.test(value); + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/creditcard + // based on http://en.wikipedia.org/wiki/Luhn + creditcard: function(value, element) { + if ( this.optional(element) ) + return "dependency-mismatch"; + // accept only spaces, digits and dashes + if (/[^0-9 -]+/.test(value)) + return false; + var nCheck = 0, + nDigit = 0, + bEven = false; + + value = value.replace(/\D/g, ""); + + for (var n = value.length - 1; n >= 0; n--) { + var cDigit = value.charAt(n); + var nDigit = parseInt(cDigit, 10); + if (bEven) { + if ((nDigit *= 2) > 9) + nDigit -= 9; + } + nCheck += nDigit; + bEven = !bEven; + } + + return (nCheck % 10) == 0; + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/accept + accept: function(value, element, param) { + param = typeof param == "string" ? param.replace(/,/g, '|') : "png|jpe?g|gif"; + return this.optional(element) || value.match(new RegExp(".(" + param + ")$", "i")); + }, + + // http://docs.jquery.com/Plugins/Validation/Methods/equalTo + equalTo: function(value, element, param) { + // bind to the blur event of the target in order to revalidate whenever the target field is updated + // TODO find a way to bind the event just once, avoiding the unbind-rebind overhead + var target = $(param).unbind(".validate-equalTo").bind("blur.validate-equalTo", function() { + $(element).valid(); + }); + return value == target.val(); + } + + } + +}); + +// deprecated, use $.validator.format instead +$.format = $.validator.format; + +})(jQuery); + +// ajax mode: abort +// usage: $.ajax({ mode: "abort"[, port: "uniqueport"]}); +// if mode:"abort" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort() +;(function($) { + var pendingRequests = {}; + // Use a prefilter if available (1.5+) + if ( $.ajaxPrefilter ) { + $.ajaxPrefilter(function(settings, _, xhr) { + var port = settings.port; + if (settings.mode == "abort") { + if ( pendingRequests[port] ) { + pendingRequests[port].abort(); + } + pendingRequests[port] = xhr; + } + }); + } else { + // Proxy ajax + var ajax = $.ajax; + $.ajax = function(settings) { + var mode = ( "mode" in settings ? settings : $.ajaxSettings ).mode, + port = ( "port" in settings ? settings : $.ajaxSettings ).port; + if (mode == "abort") { + if ( pendingRequests[port] ) { + pendingRequests[port].abort(); + } + return (pendingRequests[port] = ajax.apply(this, arguments)); + } + return ajax.apply(this, arguments); + }; + } +})(jQuery); + +// provides cross-browser focusin and focusout events +// IE has native support, in other browsers, use event caputuring (neither bubbles) + +// provides delegate(type: String, delegate: Selector, handler: Callback) plugin for easier event delegation +// handler is only called when $(event.target).is(delegate), in the scope of the jquery-object for event.target +;(function($) { + // only implement if not provided by jQuery core (since 1.4) + // TODO verify if jQuery 1.4's implementation is compatible with older jQuery special-event APIs + if (!jQuery.event.special.focusin && !jQuery.event.special.focusout && document.addEventListener) { + $.each({ + focus: 'focusin', + blur: 'focusout' + }, function( original, fix ){ + $.event.special[fix] = { + setup:function() { + this.addEventListener( original, handler, true ); + }, + teardown:function() { + this.removeEventListener( original, handler, true ); + }, + handler: function(e) { + arguments[0] = $.event.fix(e); + arguments[0].type = fix; + return $.event.handle.apply(this, arguments); + } + }; + function handler(e) { + e = $.event.fix(e); + e.type = fix; + return $.event.handle.call(this, e); + } + }); + }; + $.extend($.fn, { + validateDelegate: function(delegate, type, handler) { + return this.bind(type, function(event) { + var target = $(event.target); + if (target.is(delegate)) { + return handler.apply(target, arguments); + } + }); + } + }); +})(jQuery); diff --git a/web/js/jquery.validate.min.js b/web/js/jquery.validate.min.js new file mode 100644 index 000000000..edd645255 --- /dev/null +++ b/web/js/jquery.validate.min.js @@ -0,0 +1,51 @@ +/** + * jQuery Validation Plugin 1.9.0 + * + * http://bassistance.de/jquery-plugins/jquery-plugin-validation/ + * http://docs.jquery.com/Plugins/Validation + * + * Copyright (c) 2006 - 2011 Jörn Zaefferer + * + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + */ +(function(c){c.extend(c.fn,{validate:function(a){if(this.length){var b=c.data(this[0],"validator");if(b)return b;this.attr("novalidate","novalidate");b=new c.validator(a,this[0]);c.data(this[0],"validator",b);if(b.settings.onsubmit){a=this.find("input, button");a.filter(".cancel").click(function(){b.cancelSubmit=true});b.settings.submitHandler&&a.filter(":submit").click(function(){b.submitButton=this});this.submit(function(d){function e(){if(b.settings.submitHandler){if(b.submitButton)var f=c("<input type='hidden'/>").attr("name", +b.submitButton.name).val(b.submitButton.value).appendTo(b.currentForm);b.settings.submitHandler.call(b,b.currentForm);b.submitButton&&f.remove();return false}return true}b.settings.debug&&d.preventDefault();if(b.cancelSubmit){b.cancelSubmit=false;return e()}if(b.form()){if(b.pendingRequest){b.formSubmitted=true;return false}return e()}else{b.focusInvalid();return false}})}return b}else a&&a.debug&&window.console&&console.warn("nothing selected, can't validate, returning nothing")},valid:function(){if(c(this[0]).is("form"))return this.validate().form(); +else{var a=true,b=c(this[0].form).validate();this.each(function(){a&=b.element(this)});return a}},removeAttrs:function(a){var b={},d=this;c.each(a.split(/\s/),function(e,f){b[f]=d.attr(f);d.removeAttr(f)});return b},rules:function(a,b){var d=this[0];if(a){var e=c.data(d.form,"validator").settings,f=e.rules,g=c.validator.staticRules(d);switch(a){case "add":c.extend(g,c.validator.normalizeRule(b));f[d.name]=g;if(b.messages)e.messages[d.name]=c.extend(e.messages[d.name],b.messages);break;case "remove":if(!b){delete f[d.name]; +return g}var h={};c.each(b.split(/\s/),function(j,i){h[i]=g[i];delete g[i]});return h}}d=c.validator.normalizeRules(c.extend({},c.validator.metadataRules(d),c.validator.classRules(d),c.validator.attributeRules(d),c.validator.staticRules(d)),d);if(d.required){e=d.required;delete d.required;d=c.extend({required:e},d)}return d}});c.extend(c.expr[":"],{blank:function(a){return!c.trim(""+a.value)},filled:function(a){return!!c.trim(""+a.value)},unchecked:function(a){return!a.checked}});c.validator=function(a, +b){this.settings=c.extend(true,{},c.validator.defaults,a);this.currentForm=b;this.init()};c.validator.format=function(a,b){if(arguments.length==1)return function(){var d=c.makeArray(arguments);d.unshift(a);return c.validator.format.apply(this,d)};if(arguments.length>2&&b.constructor!=Array)b=c.makeArray(arguments).slice(1);if(b.constructor!=Array)b=[b];c.each(b,function(d,e){a=a.replace(RegExp("\\{"+d+"\\}","g"),e)});return a};c.extend(c.validator,{defaults:{messages:{},groups:{},rules:{},errorClass:"error", +validClass:"valid",errorElement:"label",focusInvalid:true,errorContainer:c([]),errorLabelContainer:c([]),onsubmit:true,ignore:":hidden",ignoreTitle:false,onfocusin:function(a){this.lastActive=a;if(this.settings.focusCleanup&&!this.blockFocusCleanup){this.settings.unhighlight&&this.settings.unhighlight.call(this,a,this.settings.errorClass,this.settings.validClass);this.addWrapper(this.errorsFor(a)).hide()}},onfocusout:function(a){if(!this.checkable(a)&&(a.name in this.submitted||!this.optional(a)))this.element(a)}, +onkeyup:function(a){if(a.name in this.submitted||a==this.lastElement)this.element(a)},onclick:function(a){if(a.name in this.submitted)this.element(a);else a.parentNode.name in this.submitted&&this.element(a.parentNode)},highlight:function(a,b,d){a.type==="radio"?this.findByName(a.name).addClass(b).removeClass(d):c(a).addClass(b).removeClass(d)},unhighlight:function(a,b,d){a.type==="radio"?this.findByName(a.name).removeClass(b).addClass(d):c(a).removeClass(b).addClass(d)}},setDefaults:function(a){c.extend(c.validator.defaults, +a)},messages:{required:"This field is required.",remote:"Please fix this field.",email:"Please enter a valid email address.",url:"Please enter a valid URL.",date:"Please enter a valid date.",dateISO:"Please enter a valid date (ISO).",number:"Please enter a valid number.",digits:"Please enter only digits.",creditcard:"Please enter a valid credit card number.",equalTo:"Please enter the same value again.",accept:"Please enter a value with a valid extension.",maxlength:c.validator.format("Please enter no more than {0} characters."), +minlength:c.validator.format("Please enter at least {0} characters."),rangelength:c.validator.format("Please enter a value between {0} and {1} characters long."),range:c.validator.format("Please enter a value between {0} and {1}."),max:c.validator.format("Please enter a value less than or equal to {0}."),min:c.validator.format("Please enter a value greater than or equal to {0}.")},autoCreateRanges:false,prototype:{init:function(){function a(e){var f=c.data(this[0].form,"validator"),g="on"+e.type.replace(/^validate/, +"");f.settings[g]&&f.settings[g].call(f,this[0],e)}this.labelContainer=c(this.settings.errorLabelContainer);this.errorContext=this.labelContainer.length&&this.labelContainer||c(this.currentForm);this.containers=c(this.settings.errorContainer).add(this.settings.errorLabelContainer);this.submitted={};this.valueCache={};this.pendingRequest=0;this.pending={};this.invalid={};this.reset();var b=this.groups={};c.each(this.settings.groups,function(e,f){c.each(f.split(/\s/),function(g,h){b[h]=e})});var d= +this.settings.rules;c.each(d,function(e,f){d[e]=c.validator.normalizeRule(f)});c(this.currentForm).validateDelegate("[type='text'], [type='password'], [type='file'], select, textarea, [type='number'], [type='search'] ,[type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], [type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'] ","focusin focusout keyup",a).validateDelegate("[type='radio'], [type='checkbox'], select, option","click", +a);this.settings.invalidHandler&&c(this.currentForm).bind("invalid-form.validate",this.settings.invalidHandler)},form:function(){this.checkForm();c.extend(this.submitted,this.errorMap);this.invalid=c.extend({},this.errorMap);this.valid()||c(this.currentForm).triggerHandler("invalid-form",[this]);this.showErrors();return this.valid()},checkForm:function(){this.prepareForm();for(var a=0,b=this.currentElements=this.elements();b[a];a++)this.check(b[a]);return this.valid()},element:function(a){this.lastElement= +a=this.validationTargetFor(this.clean(a));this.prepareElement(a);this.currentElements=c(a);var b=this.check(a);if(b)delete this.invalid[a.name];else this.invalid[a.name]=true;if(!this.numberOfInvalids())this.toHide=this.toHide.add(this.containers);this.showErrors();return b},showErrors:function(a){if(a){c.extend(this.errorMap,a);this.errorList=[];for(var b in a)this.errorList.push({message:a[b],element:this.findByName(b)[0]});this.successList=c.grep(this.successList,function(d){return!(d.name in a)})}this.settings.showErrors? +this.settings.showErrors.call(this,this.errorMap,this.errorList):this.defaultShowErrors()},resetForm:function(){c.fn.resetForm&&c(this.currentForm).resetForm();this.submitted={};this.lastElement=null;this.prepareForm();this.hideErrors();this.elements().removeClass(this.settings.errorClass)},numberOfInvalids:function(){return this.objectLength(this.invalid)},objectLength:function(a){var b=0,d;for(d in a)b++;return b},hideErrors:function(){this.addWrapper(this.toHide).hide()},valid:function(){return this.size()== +0},size:function(){return this.errorList.length},focusInvalid:function(){if(this.settings.focusInvalid)try{c(this.findLastActive()||this.errorList.length&&this.errorList[0].element||[]).filter(":visible").focus().trigger("focusin")}catch(a){}},findLastActive:function(){var a=this.lastActive;return a&&c.grep(this.errorList,function(b){return b.element.name==a.name}).length==1&&a},elements:function(){var a=this,b={};return c(this.currentForm).find("input, select, textarea").not(":submit, :reset, :image, [disabled]").not(this.settings.ignore).filter(function(){!this.name&& +a.settings.debug&&window.console&&console.error("%o has no name assigned",this);if(this.name in b||!a.objectLength(c(this).rules()))return false;return b[this.name]=true})},clean:function(a){return c(a)[0]},errors:function(){return c(this.settings.errorElement+"."+this.settings.errorClass,this.errorContext)},reset:function(){this.successList=[];this.errorList=[];this.errorMap={};this.toShow=c([]);this.toHide=c([]);this.currentElements=c([])},prepareForm:function(){this.reset();this.toHide=this.errors().add(this.containers)}, +prepareElement:function(a){this.reset();this.toHide=this.errorsFor(a)},check:function(a){a=this.validationTargetFor(this.clean(a));var b=c(a).rules(),d=false,e;for(e in b){var f={method:e,parameters:b[e]};try{var g=c.validator.methods[e].call(this,a.value.replace(/\r/g,""),a,f.parameters);if(g=="dependency-mismatch")d=true;else{d=false;if(g=="pending"){this.toHide=this.toHide.not(this.errorsFor(a));return}if(!g){this.formatAndAdd(a,f);return false}}}catch(h){this.settings.debug&&window.console&&console.log("exception occured when checking element "+ +a.id+", check the '"+f.method+"' method",h);throw h;}}if(!d){this.objectLength(b)&&this.successList.push(a);return true}},customMetaMessage:function(a,b){if(c.metadata){var d=this.settings.meta?c(a).metadata()[this.settings.meta]:c(a).metadata();return d&&d.messages&&d.messages[b]}},customMessage:function(a,b){var d=this.settings.messages[a];return d&&(d.constructor==String?d:d[b])},findDefined:function(){for(var a=0;a<arguments.length;a++)if(arguments[a]!==undefined)return arguments[a]},defaultMessage:function(a, +b){return this.findDefined(this.customMessage(a.name,b),this.customMetaMessage(a,b),!this.settings.ignoreTitle&&a.title||undefined,c.validator.messages[b],"<strong>Warning: No message defined for "+a.name+"</strong>")},formatAndAdd:function(a,b){var d=this.defaultMessage(a,b.method),e=/\$?\{(\d+)\}/g;if(typeof d=="function")d=d.call(this,b.parameters,a);else if(e.test(d))d=jQuery.format(d.replace(e,"{$1}"),b.parameters);this.errorList.push({message:d,element:a});this.errorMap[a.name]=d;this.submitted[a.name]= +d},addWrapper:function(a){if(this.settings.wrapper)a=a.add(a.parent(this.settings.wrapper));return a},defaultShowErrors:function(){for(var a=0;this.errorList[a];a++){var b=this.errorList[a];this.settings.highlight&&this.settings.highlight.call(this,b.element,this.settings.errorClass,this.settings.validClass);this.showLabel(b.element,b.message)}if(this.errorList.length)this.toShow=this.toShow.add(this.containers);if(this.settings.success)for(a=0;this.successList[a];a++)this.showLabel(this.successList[a]); +if(this.settings.unhighlight){a=0;for(b=this.validElements();b[a];a++)this.settings.unhighlight.call(this,b[a],this.settings.errorClass,this.settings.validClass)}this.toHide=this.toHide.not(this.toShow);this.hideErrors();this.addWrapper(this.toShow).show()},validElements:function(){return this.currentElements.not(this.invalidElements())},invalidElements:function(){return c(this.errorList).map(function(){return this.element})},showLabel:function(a,b){var d=this.errorsFor(a);if(d.length){d.removeClass(this.settings.validClass).addClass(this.settings.errorClass); +d.attr("generated")&&d.html(b)}else{d=c("<"+this.settings.errorElement+"/>").attr({"for":this.idOrName(a),generated:true}).addClass(this.settings.errorClass).html(b||"");if(this.settings.wrapper)d=d.hide().show().wrap("<"+this.settings.wrapper+"/>").parent();this.labelContainer.append(d).length||(this.settings.errorPlacement?this.settings.errorPlacement(d,c(a)):d.insertAfter(a))}if(!b&&this.settings.success){d.text("");typeof this.settings.success=="string"?d.addClass(this.settings.success):this.settings.success(d)}this.toShow= +this.toShow.add(d)},errorsFor:function(a){var b=this.idOrName(a);return this.errors().filter(function(){return c(this).attr("for")==b})},idOrName:function(a){return this.groups[a.name]||(this.checkable(a)?a.name:a.id||a.name)},validationTargetFor:function(a){if(this.checkable(a))a=this.findByName(a.name).not(this.settings.ignore)[0];return a},checkable:function(a){return/radio|checkbox/i.test(a.type)},findByName:function(a){var b=this.currentForm;return c(document.getElementsByName(a)).map(function(d, +e){return e.form==b&&e.name==a&&e||null})},getLength:function(a,b){switch(b.nodeName.toLowerCase()){case "select":return c("option:selected",b).length;case "input":if(this.checkable(b))return this.findByName(b.name).filter(":checked").length}return a.length},depend:function(a,b){return this.dependTypes[typeof a]?this.dependTypes[typeof a](a,b):true},dependTypes:{"boolean":function(a){return a},string:function(a,b){return!!c(a,b.form).length},"function":function(a,b){return a(b)}},optional:function(a){return!c.validator.methods.required.call(this, +c.trim(a.value),a)&&"dependency-mismatch"},startRequest:function(a){if(!this.pending[a.name]){this.pendingRequest++;this.pending[a.name]=true}},stopRequest:function(a,b){this.pendingRequest--;if(this.pendingRequest<0)this.pendingRequest=0;delete this.pending[a.name];if(b&&this.pendingRequest==0&&this.formSubmitted&&this.form()){c(this.currentForm).submit();this.formSubmitted=false}else if(!b&&this.pendingRequest==0&&this.formSubmitted){c(this.currentForm).triggerHandler("invalid-form",[this]);this.formSubmitted= +false}},previousValue:function(a){return c.data(a,"previousValue")||c.data(a,"previousValue",{old:null,valid:true,message:this.defaultMessage(a,"remote")})}},classRuleSettings:{required:{required:true},email:{email:true},url:{url:true},date:{date:true},dateISO:{dateISO:true},dateDE:{dateDE:true},number:{number:true},numberDE:{numberDE:true},digits:{digits:true},creditcard:{creditcard:true}},addClassRules:function(a,b){a.constructor==String?this.classRuleSettings[a]=b:c.extend(this.classRuleSettings, +a)},classRules:function(a){var b={};(a=c(a).attr("class"))&&c.each(a.split(" "),function(){this in c.validator.classRuleSettings&&c.extend(b,c.validator.classRuleSettings[this])});return b},attributeRules:function(a){var b={};a=c(a);for(var d in c.validator.methods){var e;if(e=d==="required"&&typeof c.fn.prop==="function"?a.prop(d):a.attr(d))b[d]=e;else if(a[0].getAttribute("type")===d)b[d]=true}b.maxlength&&/-1|2147483647|524288/.test(b.maxlength)&&delete b.maxlength;return b},metadataRules:function(a){if(!c.metadata)return{}; +var b=c.data(a.form,"validator").settings.meta;return b?c(a).metadata()[b]:c(a).metadata()},staticRules:function(a){var b={},d=c.data(a.form,"validator");if(d.settings.rules)b=c.validator.normalizeRule(d.settings.rules[a.name])||{};return b},normalizeRules:function(a,b){c.each(a,function(d,e){if(e===false)delete a[d];else if(e.param||e.depends){var f=true;switch(typeof e.depends){case "string":f=!!c(e.depends,b.form).length;break;case "function":f=e.depends.call(b,b)}if(f)a[d]=e.param!==undefined? +e.param:true;else delete a[d]}});c.each(a,function(d,e){a[d]=c.isFunction(e)?e(b):e});c.each(["minlength","maxlength","min","max"],function(){if(a[this])a[this]=Number(a[this])});c.each(["rangelength","range"],function(){if(a[this])a[this]=[Number(a[this][0]),Number(a[this][1])]});if(c.validator.autoCreateRanges){if(a.min&&a.max){a.range=[a.min,a.max];delete a.min;delete a.max}if(a.minlength&&a.maxlength){a.rangelength=[a.minlength,a.maxlength];delete a.minlength;delete a.maxlength}}a.messages&&delete a.messages; +return a},normalizeRule:function(a){if(typeof a=="string"){var b={};c.each(a.split(/\s/),function(){b[this]=true});a=b}return a},addMethod:function(a,b,d){c.validator.methods[a]=b;c.validator.messages[a]=d!=undefined?d:c.validator.messages[a];b.length<3&&c.validator.addClassRules(a,c.validator.normalizeRule(a))},methods:{required:function(a,b,d){if(!this.depend(d,b))return"dependency-mismatch";switch(b.nodeName.toLowerCase()){case "select":return(a=c(b).val())&&a.length>0;case "input":if(this.checkable(b))return this.getLength(a, +b)>0;default:return c.trim(a).length>0}},remote:function(a,b,d){if(this.optional(b))return"dependency-mismatch";var e=this.previousValue(b);this.settings.messages[b.name]||(this.settings.messages[b.name]={});e.originalMessage=this.settings.messages[b.name].remote;this.settings.messages[b.name].remote=e.message;d=typeof d=="string"&&{url:d}||d;if(this.pending[b.name])return"pending";if(e.old===a)return e.valid;e.old=a;var f=this;this.startRequest(b);var g={};g[b.name]=a;c.ajax(c.extend(true,{url:d, +mode:"abort",port:"validate"+b.name,dataType:"json",data:g,success:function(h){f.settings.messages[b.name].remote=e.originalMessage;var j=h===true;if(j){var i=f.formSubmitted;f.prepareElement(b);f.formSubmitted=i;f.successList.push(b);f.showErrors()}else{i={};h=h||f.defaultMessage(b,"remote");i[b.name]=e.message=c.isFunction(h)?h(a):h;f.showErrors(i)}e.valid=j;f.stopRequest(b,j)}},d));return"pending"},minlength:function(a,b,d){return this.optional(b)||this.getLength(c.trim(a),b)>=d},maxlength:function(a, +b,d){return this.optional(b)||this.getLength(c.trim(a),b)<=d},rangelength:function(a,b,d){a=this.getLength(c.trim(a),b);return this.optional(b)||a>=d[0]&&a<=d[1]},min:function(a,b,d){return this.optional(b)||a>=d},max:function(a,b,d){return this.optional(b)||a<=d},range:function(a,b,d){return this.optional(b)||a>=d[0]&&a<=d[1]},email:function(a,b){return this.optional(b)||/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i.test(a)}, +url:function(a,b){return this.optional(b)||/^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(a)}, +date:function(a,b){return this.optional(b)||!/Invalid|NaN/.test(new Date(a))},dateISO:function(a,b){return this.optional(b)||/^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(a)},number:function(a,b){return this.optional(b)||/^-?(?:\d+|\d{1,3}(?:,\d{3})+)(?:\.\d+)?$/.test(a)},digits:function(a,b){return this.optional(b)||/^\d+$/.test(a)},creditcard:function(a,b){if(this.optional(b))return"dependency-mismatch";if(/[^0-9 -]+/.test(a))return false;var d=0,e=0,f=false;a=a.replace(/\D/g,"");for(var g=a.length-1;g>= +0;g--){e=a.charAt(g);e=parseInt(e,10);if(f)if((e*=2)>9)e-=9;d+=e;f=!f}return d%10==0},accept:function(a,b,d){d=typeof d=="string"?d.replace(/,/g,"|"):"png|jpe?g|gif";return this.optional(b)||a.match(RegExp(".("+d+")$","i"))},equalTo:function(a,b,d){d=c(d).unbind(".validate-equalTo").bind("blur.validate-equalTo",function(){c(b).valid()});return a==d.val()}}});c.format=c.validator.format})(jQuery); +(function(c){var a={};if(c.ajaxPrefilter)c.ajaxPrefilter(function(d,e,f){e=d.port;if(d.mode=="abort"){a[e]&&a[e].abort();a[e]=f}});else{var b=c.ajax;c.ajax=function(d){var e=("port"in d?d:c.ajaxSettings).port;if(("mode"in d?d:c.ajaxSettings).mode=="abort"){a[e]&&a[e].abort();return a[e]=b.apply(this,arguments)}return b.apply(this,arguments)}}})(jQuery); +(function(c){!jQuery.event.special.focusin&&!jQuery.event.special.focusout&&document.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(e){e=c.event.fix(e);e.type=b;return c.event.handle.call(this,e)}c.event.special[b]={setup:function(){this.addEventListener(a,d,true)},teardown:function(){this.removeEventListener(a,d,true)},handler:function(e){arguments[0]=c.event.fix(e);arguments[0].type=b;return c.event.handle.apply(this,arguments)}}});c.extend(c.fn,{validateDelegate:function(a, +b,d){return this.bind(b,function(e){var f=c(e.target);if(f.is(a))return d.apply(f,arguments)})}})})(jQuery); diff --git a/web/js/map-OpenLayers.js b/web/js/map-OpenLayers.js index b911b7c71..c8bdb85df 100644 --- a/web/js/map-OpenLayers.js +++ b/web/js/map-OpenLayers.js @@ -308,6 +308,12 @@ OpenLayers.Control.Click = OpenLayers.Class(OpenLayers.Control, { fixmystreet_activate_drag(); } fixmystreet_update_pin(lonlat); + // check to see if markers are visible. We click the + // link so that it updates the text in case they go + // back + if ( ! fixmystreet.markers.getVisibility() ) { + $('#hide_pins_link').click(); + } if (fixmystreet.page == 'new') { return; } diff --git a/web/js/map-bing-ol.js b/web/js/map-bing-ol.js index 391f837c6..94b777134 100644 --- a/web/js/map-bing-ol.js +++ b/web/js/map-bing-ol.js @@ -88,11 +88,13 @@ OpenLayers.Layer.Bing = OpenLayers.Class(OpenLayers.Layer.XYZ, { "http://c.tilma.mysociety.org/sv/${z}/${x}/${y}.png" ]; } else { + var type = ''; + if (z > 10) type = '&productSet=mmOS'; var url = [ - "http://ecn.t0.tiles.virtualearth.net/tiles/r${id}.png?g=701&productSet=mmOS", - "http://ecn.t1.tiles.virtualearth.net/tiles/r${id}.png?g=701&productSet=mmOS", - "http://ecn.t2.tiles.virtualearth.net/tiles/r${id}.png?g=701&productSet=mmOS", - "http://ecn.t3.tiles.virtualearth.net/tiles/r${id}.png?g=701&productSet=mmOS" + "http://ecn.t0.tiles.virtualearth.net/tiles/r${id}.png?g=701" + type, + "http://ecn.t1.tiles.virtualearth.net/tiles/r${id}.png?g=701" + type, + "http://ecn.t2.tiles.virtualearth.net/tiles/r${id}.png?g=701" + type, + "http://ecn.t3.tiles.virtualearth.net/tiles/r${id}.png?g=701" + type ]; } var s = '' + x + y + z; |