aboutsummaryrefslogtreecommitdiffstats
path: root/docs
diff options
context:
space:
mode:
Diffstat (limited to 'docs')
-rw-r--r--docs/.gitignore6
-rw-r--r--docs/404.md12
-rw-r--r--docs/CNAME1
-rw-r--r--docs/Gemfile8
-rw-r--r--docs/Gemfile.lock212
-rw-r--r--docs/README.md30
-rw-r--r--docs/The-FixMyStreet-Platform-DIY-Guide-v1.1.pdfbin0 -> 1852533 bytes
-rw-r--r--docs/_config.yml27
-rw-r--r--docs/_includes/admin-tasks-content.md693
-rw-r--r--docs/_includes/footer.html61
-rw-r--r--docs/_includes/google-analytics.html9
-rw-r--r--docs/_layouts/default.html38
-rw-r--r--docs/_layouts/fullwidth.html14
-rw-r--r--docs/_layouts/landing.html9
-rw-r--r--docs/_layouts/page.html119
-rw-r--r--docs/_layouts/post.html19
-rw-r--r--docs/_layouts/pro-print.html20
-rw-r--r--docs/_layouts/pro.html163
-rw-r--r--docs/_plugins/incremental_regeneration_fixer.rb51
-rw-r--r--docs/_posts/2012-02-06-an-introduction.md33
-rw-r--r--docs/_posts/2012-07-27-default-workings.md43
-rw-r--r--docs/_posts/2012-08-17-improving-configuration.md27
-rw-r--r--docs/_posts/2012-10-02-easy-install.md34
-rw-r--r--docs/_posts/2013-02-22-bodies.md43
-rw-r--r--docs/_posts/2013-05-03-v1.2.md34
-rw-r--r--docs/_posts/2013-11-25-v1.3.md44
-rw-r--r--docs/_posts/2014-05-23-v1.4.md34
-rw-r--r--docs/_posts/2014-07-15-v1.4.2.md25
-rw-r--r--docs/_posts/2014-11-20-v1.5.md39
-rw-r--r--docs/_posts/2015-03-18-v1.5.4.md27
-rw-r--r--docs/_posts/2015-07-10-v1.5.5.md50
-rw-r--r--docs/_posts/2015-07-31-v1.6.1.md22
-rw-r--r--docs/_posts/2015-10-23-v1.7.md39
-rw-r--r--docs/_posts/2016-03-02-v1.8.md37
-rw-r--r--docs/_posts/2016-03-23-v1.8.1.md22
-rw-r--r--docs/_posts/2016-05-03-v1.8.2.md30
-rw-r--r--docs/_posts/2016-06-03-v1.8.3.md34
-rw-r--r--docs/_posts/2016-07-06-v1.8.4.md23
-rw-r--r--docs/_posts/2016-11-15-v2.0.md120
-rw-r--r--docs/_posts/2016-11-29-v2.0-html-emails.md220
-rw-r--r--docs/_posts/2016-12-05-v2.0-email-domain-name-validation.md38
-rw-r--r--docs/_posts/2016-12-06-v2.0-multi-select.md46
-rw-r--r--docs/_posts/2016-12-07-v2.0-new-user-system.md69
-rw-r--r--docs/_posts/2016-12-08-v2.0-area-highlighting.md42
-rw-r--r--docs/_posts/2016-12-09-v2.0-html5-history.md62
-rw-r--r--docs/_posts/2016-12-13-v2.0-improved-forms.md77
-rw-r--r--docs/_posts/2016-12-14-v2.0-exif-rotation-preview.md34
-rw-r--r--docs/_posts/2016-12-15-v2.0-faster-tests.md65
-rw-r--r--docs/_posts/2016-12-16-v2.0-javascript-improvements.md123
-rw-r--r--docs/_posts/2016-12-16-v2.0.1.md27
-rw-r--r--docs/_posts/2017-02-03-v2.0.2.md37
-rw-r--r--docs/_posts/2017-03-31-v2.0.3.md33
-rw-r--r--docs/_posts/2017-04-13-v2.0.4.md27
-rw-r--r--docs/_posts/2017-07-18-v2.1.md52
-rw-r--r--docs/_posts/2017-08-03-v2.1.1.md24
-rw-r--r--docs/_posts/2017-09-14-v2.2.md53
-rw-r--r--docs/_posts/2017-12-18-v2.3.md56
-rw-r--r--docs/_posts/2018-02-12-v2.3.1.md39
-rw-r--r--docs/_posts/2018-05-31-v2.3.2.md43
-rw-r--r--docs/_posts/2018-06-06-v2.3.3.md19
-rw-r--r--docs/_posts/2018-06-07-v2.3.4.md12
-rw-r--r--docs/_posts/2018-09-06-v2.4.md42
-rw-r--r--docs/_sass/_config.scss33
-rw-r--r--docs/_sass/_owl_carousel.scss70
-rw-r--r--docs/_sass/_training_slideshow.scss64
-rw-r--r--docs/_sass/fixmystreet-org.scss392
-rw-r--r--docs/_sass/fixmystreet-pro-print.scss36
-rw-r--r--docs/_sass/fixmystreet-pro.scss139
-rw-r--r--docs/assets/css/fixmystreet-org.scss6
-rw-r--r--docs/assets/css/fixmystreet-pro-print.scss6
-rw-r--r--docs/assets/css/fixmystreet-pro.scss6
-rw-r--r--docs/assets/img/2012-07-27-screenshot.pngbin0 -> 141922 bytes
-rw-r--r--docs/assets/img/fms-platform-logo-m.svg1
-rw-r--r--docs/assets/img/fms-platform-logo.svg1
-rw-r--r--docs/assets/img/fms-twitter-avatar-128.jpgbin0 -> 15517 bytes
-rw-r--r--docs/assets/img/fms-unusual-bird-screenshot.jpgbin0 -> 74047 bytes
-rw-r--r--docs/assets/img/fms_bodies_and_contacts.pngbin0 -> 122483 bytes
-rw-r--r--docs/assets/img/fms_integration_0.pngbin0 -> 50181 bytes
-rw-r--r--docs/assets/img/fms_integration_1.pngbin0 -> 47367 bytes
-rw-r--r--docs/assets/img/fms_integration_2.pngbin0 -> 48766 bytes
-rw-r--r--docs/assets/img/fms_integration_3.pngbin0 -> 50094 bytes
-rw-r--r--docs/assets/img/fms_with_sms_flowchart.pngbin0 -> 294100 bytes
-rw-r--r--docs/assets/img/icon-arrow-left.svg1
-rw-r--r--docs/assets/img/icon-arrow-right.svg29
-rw-r--r--docs/assets/img/icon-document.svg30
-rw-r--r--docs/assets/img/icon-download.svg35
-rw-r--r--docs/assets/img/icon-email.svg1
-rw-r--r--docs/assets/img/icon-github.svg1
-rw-r--r--docs/assets/img/icon-hash.svg30
-rw-r--r--docs/assets/img/icon-help.svg48
-rw-r--r--docs/assets/img/icon-mail.svg32
-rw-r--r--docs/assets/img/icon-opensource.svg1
-rw-r--r--docs/assets/img/icon-paint.svg1
-rw-r--r--docs/assets/img/icon-twitter.svg33
-rw-r--r--docs/assets/img/icon-world.svg1
-rw-r--r--docs/assets/img/monitor.pngbin0 -> 12252 bytes
-rw-r--r--docs/assets/img/pro-user-guide/all-reports-shortlist.pngbin0 -> 56920 bytes
-rw-r--r--docs/assets/img/pro-user-guide/all-the-sites.pngbin0 -> 264477 bytes
-rw-r--r--docs/assets/img/pro-user-guide/ban-user-report-page.pngbin0 -> 4680 bytes
-rw-r--r--docs/assets/img/pro-user-guide/category-admin-page.pngbin0 -> 56731 bytes
-rw-r--r--docs/assets/img/pro-user-guide/change-category-report.pngbin0 -> 66925 bytes
-rw-r--r--docs/assets/img/pro-user-guide/deal-undesirable-content.pngbin0 -> 81551 bytes
-rw-r--r--docs/assets/img/pro-user-guide/edit-category-page.pngbin0 -> 34822 bytes
-rw-r--r--docs/assets/img/pro-user-guide/filtering-sorting-reports.pngbin0 -> 33490 bytes
-rw-r--r--docs/assets/img/pro-user-guide/fms-pro.pngbin0 -> 377146 bytes
-rw-r--r--docs/assets/img/pro-user-guide/home.pngbin0 -> 666327 bytes
-rw-r--r--docs/assets/img/pro-user-guide/local-alerts.pngbin0 -> 28153 bytes
-rw-r--r--docs/assets/img/pro-user-guide/making-report-duplicates.pngbin0 -> 403529 bytes
-rw-r--r--docs/assets/img/pro-user-guide/making-report.pngbin0 -> 126828 bytes
-rw-r--r--docs/assets/img/pro-user-guide/navigating-as-pro-staff.pngbin0 -> 8580 bytes
-rw-r--r--docs/assets/img/pro-user-guide/report-change-priority.pngbin0 -> 2461 bytes
-rw-r--r--docs/assets/img/pro-user-guide/report-page-shortlist.pngbin0 -> 85565 bytes
-rw-r--r--docs/assets/img/pro-user-guide/report-public-update.pngbin0 -> 10740 bytes
-rw-r--r--docs/assets/img/pro-user-guide/report-response.pngbin0 -> 79814 bytes
-rw-r--r--docs/assets/img/pro-user-guide/response-priority-screen.pngbin0 -> 22119 bytes
-rw-r--r--docs/assets/img/pro-user-guide/response-template-screen.pngbin0 -> 29362 bytes
-rw-r--r--docs/assets/img/pro-user-guide/search-report.pngbin0 -> 49082 bytes
-rw-r--r--docs/assets/img/pro-user-guide/user-admin-categories.pngbin0 -> 5972 bytes
-rw-r--r--docs/assets/img/pro-user-guide/user-admin-page.pngbin0 -> 42018 bytes
-rw-r--r--docs/assets/img/pro-user-guide/user-admin-permissions.pngbin0 -> 41763 bytes
-rw-r--r--docs/assets/img/pro-user-guide/viewing-reports-your-area.pngbin0 -> 317464 bytes
-rw-r--r--docs/assets/img/pro-user-guide/your-shortlist.pngbin0 -> 139538 bytes
-rw-r--r--docs/assets/img/promo-community-pack-screenshot.pngbin0 -> 24878 bytes
-rw-r--r--docs/assets/img/promo-facebook-screenshot.pngbin0 -> 36783 bytes
-rw-r--r--docs/assets/img/promo-superuser-screenshot.pngbin0 -> 67216 bytes
-rw-r--r--docs/assets/img/promo-twitter-screenshot.pngbin0 -> 30592 bytes
-rw-r--r--docs/assets/img/promote-90x130.pngbin0 -> 27349 bytes
-rw-r--r--docs/assets/img/tn1.pngbin0 -> 89640 bytes
-rw-r--r--docs/assets/img/tn2.pngbin0 -> 81247 bytes
-rw-r--r--docs/assets/img/tn3.pngbin0 -> 53351 bytes
-rw-r--r--docs/assets/img/training/admin-add-a-body.pngbin0 -> 14486 bytes
-rw-r--r--docs/assets/img/training/admin-add-contact.pngbin0 -> 13235 bytes
-rw-r--r--docs/assets/img/training/admin-ban-a-user.pngbin0 -> 8853 bytes
-rw-r--r--docs/assets/img/training/admin-bodies.pngbin0 -> 9535 bytes
-rw-r--r--docs/assets/img/training/admin-edit-user.pngbin0 -> 11905 bytes
-rw-r--r--docs/assets/img/training/admin-flagged-reports-users.pngbin0 -> 25012 bytes
-rw-r--r--docs/assets/img/training/admin-polic-contacts.pngbin0 -> 34074 bytes
-rw-r--r--docs/assets/img/training/admin-search-reports.pngbin0 -> 21645 bytes
-rw-r--r--docs/assets/img/training/admin-stats-enter-dates.pngbin0 -> 12718 bytes
-rw-r--r--docs/assets/img/training/admin-stats.pngbin0 -> 14357 bytes
-rw-r--r--docs/assets/img/training/admin-users.pngbin0 -> 12767 bytes
-rw-r--r--docs/assets/img/training/fms-many-categories.pngbin0 -> 87165 bytes
-rw-r--r--docs/assets/img/training/mmi-01-front-page.pngbin0 -> 57345 bytes
-rw-r--r--docs/assets/img/training/mmi-02-click-on-map.pngbin0 -> 34286 bytes
-rw-r--r--docs/assets/img/training/mmi-03-enter-details.pngbin0 -> 39818 bytes
-rw-r--r--docs/assets/img/training/mmi-04-user-details.pngbin0 -> 31472 bytes
-rw-r--r--docs/assets/img/training/mmi-05-update.pngbin0 -> 33324 bytes
-rw-r--r--docs/assets/img/training/mmi-06-report-abuse.pngbin0 -> 34697 bytes
-rw-r--r--docs/assets/img/training/mmi-07-get-updates-link.pngbin0 -> 34543 bytes
-rw-r--r--docs/assets/img/training/mmi-08-get-updates.pngbin0 -> 41488 bytes
-rw-r--r--docs/assets/img/training/mmi-09-login.pngbin0 -> 58109 bytes
-rw-r--r--docs/assets/img/training/mmi-12-your-reports.pngbin0 -> 20078 bytes
-rw-r--r--docs/assets/img/training/mmi-13-staff-remove-from-site.pngbin0 -> 36677 bytes
-rw-r--r--docs/assets/img/training/mmi-14-staff-dashboard.pngbin0 -> 36216 bytes
-rw-r--r--docs/assets/img/training/mmi-15-staff-states.pngbin0 -> 28818 bytes
-rw-r--r--docs/assets/img/training/mmi-16-woo-it-is-fixed.pngbin0 -> 24514 bytes
-rw-r--r--docs/assets/img/training/mmi-17-logout.pngbin0 -> 35332 bytes
-rw-r--r--docs/assets/img/training/mmi-18-show-when-sent.pngbin0 -> 18075 bytes
-rw-r--r--docs/assets/posts/admin-category-add-before.pngbin0 -> 34673 bytes
-rw-r--r--docs/assets/posts/admin-category-edit-after.pngbin0 -> 45061 bytes
-rw-r--r--docs/assets/posts/admin-category-edit-before.pngbin0 -> 25582 bytes
-rw-r--r--docs/assets/posts/admin-report-form-after.pngbin0 -> 209529 bytes
-rw-r--r--docs/assets/posts/admin-report-form-before.pngbin0 -> 59887 bytes
-rw-r--r--docs/assets/posts/admin-user-permissions.pngbin0 -> 74261 bytes
-rw-r--r--docs/assets/posts/angus-streetlights.pngbin0 -> 508241 bytes
-rw-r--r--docs/assets/posts/area-highlighting-after.jpegbin0 -> 102276 bytes
-rw-r--r--docs/assets/posts/area-highlighting-before.jpegbin0 -> 112217 bytes
-rw-r--r--docs/assets/posts/big-head-small.jpegbin0 -> 68675 bytes
-rw-r--r--docs/assets/posts/big-head.jpegbin0 -> 392075 bytes
-rw-r--r--docs/assets/posts/html-email-example.pngbin0 -> 158285 bytes
-rw-r--r--docs/assets/posts/html-email-litmus.pngbin0 -> 251423 bytes
-rw-r--r--docs/assets/posts/html-email-map-centre.pngbin0 -> 150388 bytes
-rw-r--r--docs/assets/posts/html-email-map.pngbin0 -> 128550 bytes
-rw-r--r--docs/assets/posts/multi-select-groups.pngbin0 -> 26561 bytes
-rw-r--r--docs/assets/posts/multi-select-line-wrap.pngbin0 -> 23936 bytes
-rw-r--r--docs/assets/posts/multi-select-people.pngbin0 -> 15694 bytes
-rw-r--r--docs/assets/posts/multi-select.pngbin0 -> 70558 bytes
-rw-r--r--docs/assets/posts/new-reporting-form.pngbin0 -> 90032 bytes
-rw-r--r--docs/assets/posts/report-inspect.pngbin0 -> 165241 bytes
-rw-r--r--docs/assets/posts/report-selected.pngbin0 -> 171161 bytes
-rw-r--r--docs/assets/posts/testing-after.pngbin0 -> 35882 bytes
-rw-r--r--docs/assets/posts/testing-before.pngbin0 -> 35827 bytes
-rw-r--r--docs/assets/scripts/app.js154
-rw-r--r--docs/assets/scripts/jquery-migrate.min.js2
-rw-r--r--docs/assets/scripts/jquery.min.js5
-rw-r--r--docs/assets/scripts/owl.carousel.min.js47
-rw-r--r--docs/atom.xml26
-rw-r--r--docs/blog/index.html41
-rw-r--r--docs/community/index.md60
-rw-r--r--docs/community/irc.md37
-rw-r--r--docs/customising/boundaries.md459
-rw-r--r--docs/customising/checklist.md206
-rw-r--r--docs/customising/cobrand-module.md105
-rw-r--r--docs/customising/config.md1122
-rw-r--r--docs/customising/css.md322
-rw-r--r--docs/customising/fms_and_mapit.md63
-rw-r--r--docs/customising/geocoder.md35
-rw-r--r--docs/customising/index.md82
-rw-r--r--docs/customising/integration.md228
-rw-r--r--docs/customising/language/index.md140
-rw-r--r--docs/customising/language/technical.md38
-rw-r--r--docs/customising/login.md41
-rw-r--r--docs/customising/logo.md29
-rw-r--r--docs/customising/send_reports.md83
-rw-r--r--docs/customising/static-pages.md35
-rw-r--r--docs/customising/templates.md113
-rw-r--r--docs/directory_structure.md315
-rw-r--r--docs/favicon.icobin0 -> 6518 bytes
-rw-r--r--docs/feeding-back.md90
-rw-r--r--docs/glossary.md1267
-rw-r--r--docs/how-it-works.md161
-rw-r--r--docs/index.md131
-rw-r--r--docs/install/ami.md78
-rw-r--r--docs/install/database.md36
-rw-r--r--docs/install/fixmystreet-with-sms.md267
-rw-r--r--docs/install/index.md32
-rw-r--r--docs/install/install-script.md79
-rw-r--r--docs/install/manual-install.md283
-rw-r--r--docs/install/troubleshooting.md118
-rw-r--r--docs/install/vagrant.md70
-rw-r--r--docs/overview.md85
-rw-r--r--docs/pro-manual/admin-tasks.md23
-rw-r--r--docs/pro-manual/citizens-experience.md104
-rw-r--r--docs/pro-manual/index.md61
-rw-r--r--docs/pro-manual/print.md5
-rw-r--r--docs/pro-manual/staff-user-accounts.md196
-rw-r--r--docs/running/admin_manual.md969
-rw-r--r--docs/running/bodies_and_contacts.md194
-rw-r--r--docs/running/example_press_releases.md316
-rw-r--r--docs/running/index.md44
-rw-r--r--docs/running/promotion.md512
-rw-r--r--docs/running/staff.md18
-rw-r--r--docs/running/surveys.md175
-rw-r--r--docs/running/users.md165
-rw-r--r--docs/sites.md148
m---------docs/theme0
-rw-r--r--docs/training/admins.md512
-rw-r--r--docs/training/citizens.md297
-rw-r--r--docs/training/index.md33
-rw-r--r--docs/training/staff.md241
-rw-r--r--docs/updating/ami.md51
-rw-r--r--docs/updating/index.md74
-rw-r--r--docs/updating/templates.md63
243 files changed, 15175 insertions, 0 deletions
diff --git a/docs/.gitignore b/docs/.gitignore
new file mode 100644
index 000000000..b994cdda5
--- /dev/null
+++ b/docs/.gitignore
@@ -0,0 +1,6 @@
+_site
+.bundle
+.DS_Store
+.jekyll-metadata
+.sass-cache
+vendor
diff --git a/docs/404.md b/docs/404.md
new file mode 100644
index 000000000..269a5eb1e
--- /dev/null
+++ b/docs/404.md
@@ -0,0 +1,12 @@
+---
+layout: fullwidth
+permalink: /404.html
+title: Not Found
+---
+
+<h1>404 Not Found</h1>
+
+<p class="lead">I am afraid we could not find the page you were looking for.</p>
+
+<p>Please try <a href="{{ "/" | relative_url }}">the front page</a> or the
+main <a href="{{ "/overview/" | relative_url }}">documentation</a>.
diff --git a/docs/CNAME b/docs/CNAME
new file mode 100644
index 000000000..c28572aca
--- /dev/null
+++ b/docs/CNAME
@@ -0,0 +1 @@
+fixmystreet.org
diff --git a/docs/Gemfile b/docs/Gemfile
new file mode 100644
index 000000000..62a36141d
--- /dev/null
+++ b/docs/Gemfile
@@ -0,0 +1,8 @@
+source 'https://rubygems.org'
+
+gem 'github-pages'
+
+# https://github.com/RobertDeRose/jekyll-livereload/
+group :jekyll_plugins do
+ gem 'jekyll-livereload'
+end
diff --git a/docs/Gemfile.lock b/docs/Gemfile.lock
new file mode 100644
index 000000000..c51eb3c2e
--- /dev/null
+++ b/docs/Gemfile.lock
@@ -0,0 +1,212 @@
+GEM
+ remote: https://rubygems.org/
+ specs:
+ activesupport (4.2.8)
+ i18n (~> 0.7)
+ minitest (~> 5.1)
+ thread_safe (~> 0.3, >= 0.3.4)
+ tzinfo (~> 1.1)
+ addressable (2.5.1)
+ public_suffix (~> 2.0, >= 2.0.2)
+ coffee-script (2.4.1)
+ coffee-script-source
+ execjs
+ coffee-script-source (1.12.2)
+ colorator (1.1.0)
+ em-websocket (0.5.1)
+ eventmachine (>= 0.12.9)
+ http_parser.rb (~> 0.6.0)
+ ethon (0.10.1)
+ ffi (>= 1.3.0)
+ eventmachine (1.2.5)
+ execjs (2.7.0)
+ faraday (0.12.1)
+ multipart-post (>= 1.2, < 3)
+ ffi (1.9.18)
+ forwardable-extended (2.6.0)
+ gemoji (3.0.0)
+ github-pages (145)
+ activesupport (= 4.2.8)
+ github-pages-health-check (= 1.3.4)
+ jekyll (= 3.4.5)
+ jekyll-avatar (= 0.4.2)
+ jekyll-coffeescript (= 1.0.1)
+ jekyll-default-layout (= 0.1.4)
+ jekyll-feed (= 0.9.2)
+ jekyll-gist (= 1.4.0)
+ jekyll-github-metadata (= 2.5.1)
+ jekyll-mentions (= 1.2.0)
+ jekyll-optional-front-matter (= 0.2.0)
+ jekyll-paginate (= 1.1.0)
+ jekyll-readme-index (= 0.1.0)
+ jekyll-redirect-from (= 0.12.1)
+ jekyll-relative-links (= 0.4.1)
+ jekyll-sass-converter (= 1.5.0)
+ jekyll-seo-tag (= 2.2.3)
+ jekyll-sitemap (= 1.0.0)
+ jekyll-swiss (= 0.4.0)
+ jekyll-theme-architect (= 0.0.4)
+ jekyll-theme-cayman (= 0.0.4)
+ jekyll-theme-dinky (= 0.0.4)
+ jekyll-theme-hacker (= 0.0.4)
+ jekyll-theme-leap-day (= 0.0.4)
+ jekyll-theme-merlot (= 0.0.4)
+ jekyll-theme-midnight (= 0.0.4)
+ jekyll-theme-minimal (= 0.0.4)
+ jekyll-theme-modernist (= 0.0.4)
+ jekyll-theme-primer (= 0.3.1)
+ jekyll-theme-slate (= 0.0.4)
+ jekyll-theme-tactile (= 0.0.4)
+ jekyll-theme-time-machine (= 0.0.4)
+ jekyll-titles-from-headings (= 0.2.0)
+ jemoji (= 0.8.0)
+ kramdown (= 1.13.2)
+ liquid (= 3.0.6)
+ listen (= 3.0.6)
+ mercenary (~> 0.3)
+ minima (= 2.1.1)
+ rouge (= 1.11.1)
+ terminal-table (~> 1.4)
+ github-pages-health-check (1.3.4)
+ addressable (~> 2.3)
+ net-dns (~> 0.8)
+ octokit (~> 4.0)
+ public_suffix (~> 2.0)
+ typhoeus (~> 0.7)
+ html-pipeline (2.6.0)
+ activesupport (>= 2)
+ nokogiri (>= 1.4)
+ http_parser.rb (0.6.0)
+ i18n (0.8.6)
+ jekyll (3.4.5)
+ addressable (~> 2.4)
+ colorator (~> 1.0)
+ jekyll-sass-converter (~> 1.0)
+ jekyll-watch (~> 1.1)
+ kramdown (~> 1.3)
+ liquid (~> 3.0)
+ mercenary (~> 0.3.3)
+ pathutil (~> 0.9)
+ rouge (~> 1.7)
+ safe_yaml (~> 1.0)
+ jekyll-avatar (0.4.2)
+ jekyll (~> 3.0)
+ jekyll-coffeescript (1.0.1)
+ coffee-script (~> 2.2)
+ jekyll-default-layout (0.1.4)
+ jekyll (~> 3.0)
+ jekyll-feed (0.9.2)
+ jekyll (~> 3.3)
+ jekyll-gist (1.4.0)
+ octokit (~> 4.2)
+ jekyll-github-metadata (2.5.1)
+ jekyll (~> 3.1)
+ octokit (~> 4.0, != 4.4.0)
+ jekyll-livereload (0.2.2)
+ em-websocket (~> 0.5)
+ jekyll (~> 3.0)
+ jekyll-mentions (1.2.0)
+ activesupport (~> 4.0)
+ html-pipeline (~> 2.3)
+ jekyll (~> 3.0)
+ jekyll-optional-front-matter (0.2.0)
+ jekyll (~> 3.0)
+ jekyll-paginate (1.1.0)
+ jekyll-readme-index (0.1.0)
+ jekyll (~> 3.0)
+ jekyll-redirect-from (0.12.1)
+ jekyll (~> 3.3)
+ jekyll-relative-links (0.4.1)
+ jekyll (~> 3.3)
+ jekyll-sass-converter (1.5.0)
+ sass (~> 3.4)
+ jekyll-seo-tag (2.2.3)
+ jekyll (~> 3.3)
+ jekyll-sitemap (1.0.0)
+ jekyll (~> 3.3)
+ jekyll-swiss (0.4.0)
+ jekyll-theme-architect (0.0.4)
+ jekyll (~> 3.3)
+ jekyll-theme-cayman (0.0.4)
+ jekyll (~> 3.3)
+ jekyll-theme-dinky (0.0.4)
+ jekyll (~> 3.3)
+ jekyll-theme-hacker (0.0.4)
+ jekyll (~> 3.3)
+ jekyll-theme-leap-day (0.0.4)
+ jekyll (~> 3.3)
+ jekyll-theme-merlot (0.0.4)
+ jekyll (~> 3.3)
+ jekyll-theme-midnight (0.0.4)
+ jekyll (~> 3.3)
+ jekyll-theme-minimal (0.0.4)
+ jekyll (~> 3.3)
+ jekyll-theme-modernist (0.0.4)
+ jekyll (~> 3.3)
+ jekyll-theme-primer (0.3.1)
+ jekyll (~> 3.3)
+ jekyll-theme-slate (0.0.4)
+ jekyll (~> 3.3)
+ jekyll-theme-tactile (0.0.4)
+ jekyll (~> 3.3)
+ jekyll-theme-time-machine (0.0.4)
+ jekyll (~> 3.3)
+ jekyll-titles-from-headings (0.2.0)
+ jekyll (~> 3.3)
+ jekyll-watch (1.5.0)
+ listen (~> 3.0, < 3.1)
+ jemoji (0.8.0)
+ activesupport (~> 4.0)
+ gemoji (~> 3.0)
+ html-pipeline (~> 2.2)
+ jekyll (>= 3.0)
+ kramdown (1.13.2)
+ liquid (3.0.6)
+ listen (3.0.6)
+ rb-fsevent (>= 0.9.3)
+ rb-inotify (>= 0.9.7)
+ mercenary (0.3.6)
+ mini_portile2 (2.2.0)
+ minima (2.1.1)
+ jekyll (~> 3.3)
+ minitest (5.10.2)
+ multipart-post (2.0.0)
+ net-dns (0.8.0)
+ nokogiri (1.8.0)
+ mini_portile2 (~> 2.2.0)
+ octokit (4.7.0)
+ sawyer (~> 0.8.0, >= 0.5.3)
+ pathutil (0.14.0)
+ forwardable-extended (~> 2.6)
+ public_suffix (2.0.5)
+ rb-fsevent (0.10.2)
+ rb-inotify (0.9.10)
+ ffi (>= 0.5.0, < 2)
+ rouge (1.11.1)
+ safe_yaml (1.0.4)
+ sass (3.5.1)
+ sass-listen (~> 4.0.0)
+ sass-listen (4.0.0)
+ rb-fsevent (~> 0.9, >= 0.9.4)
+ rb-inotify (~> 0.9, >= 0.9.7)
+ sawyer (0.8.1)
+ addressable (>= 2.3.5, < 2.6)
+ faraday (~> 0.8, < 1.0)
+ terminal-table (1.8.0)
+ unicode-display_width (~> 1.1, >= 1.1.1)
+ thread_safe (0.3.6)
+ typhoeus (0.8.0)
+ ethon (>= 0.8.0)
+ tzinfo (1.2.3)
+ thread_safe (~> 0.1)
+ unicode-display_width (1.3.0)
+
+PLATFORMS
+ ruby
+
+DEPENDENCIES
+ github-pages
+ jekyll-livereload
+
+BUNDLED WITH
+ 1.13.7
diff --git a/docs/README.md b/docs/README.md
new file mode 100644
index 000000000..d1b4897d0
--- /dev/null
+++ b/docs/README.md
@@ -0,0 +1,30 @@
+fixmystreet.org
+===============
+
+The gh-pages branch is [fixmystreet.org](https://fixmystreet.org), the
+Jekyll-based static site running on GitHub Pages that is the documentation for
+setting up / running the FixMyStreet platform.
+
+## Installation
+
+The site is built by Jekyll. We manage our Ruby gem dependencies via
+[bundler](https://bundler.io/) so you’ll need to install that if you don’t
+already have it. Then you need to…
+
+```
+git clone --recursive -b gh-pages https://github.com/mysociety/fixmystreet fixmystreet-pages
+cd fixmystreet-pages
+bundle install --deployment
+```
+
+To preview the site locally, run:
+
+```
+bundle exec jekyll serve --incremental
+```
+
+And then visit <http://127.0.0.1:4000>.
+
+Jekyll automatically compiles the HTML/Markdown and Sass files as you go.
+And [livereload](https://github.com/RobertDeRose/jekyll-livereload)
+automatically reloads your web browser window when the site is recompiled.
diff --git a/docs/The-FixMyStreet-Platform-DIY-Guide-v1.1.pdf b/docs/The-FixMyStreet-Platform-DIY-Guide-v1.1.pdf
new file mode 100644
index 000000000..4651dbeda
--- /dev/null
+++ b/docs/The-FixMyStreet-Platform-DIY-Guide-v1.1.pdf
Binary files differ
diff --git a/docs/_config.yml b/docs/_config.yml
new file mode 100644
index 000000000..7f04e223c
--- /dev/null
+++ b/docs/_config.yml
@@ -0,0 +1,27 @@
+permalink: pretty
+exclude: [ vendor ]
+paginate: 10
+gems:
+ - jekyll-paginate
+paginate_path: "/blog/:num/"
+
+authors:
+ struan:
+ display_name: Struan
+ matthew:
+ display_name: Matthew
+ zarino:
+ display_name: Zarino
+
+# https://github.com/RobertDeRose/jekyll-livereload/
+# Enable livereload by default when running `jekyll serve` locally.
+# (Doesn't do anything on Github Pages.)
+livereload: true
+
+# https://github.com/jekyll/jekyll/issues/4112
+# Jekyll's --incremental flag is awesome, but has a few bugs.
+# _plugins/incremental_regeneration_fixer.rb makes it better.
+# (Doesn't do anything on Github Pages.)
+incremental_regeneration_fixer:
+ interdependent_files:
+ - "{_posts,blog}/*"
diff --git a/docs/_includes/admin-tasks-content.md b/docs/_includes/admin-tasks-content.md
new file mode 100644
index 000000000..2fe85ad4c
--- /dev/null
+++ b/docs/_includes/admin-tasks-content.md
@@ -0,0 +1,693 @@
+<div class="admin-task" markdown="1" id="navigating-as-pro-staff">
+
+### Navigating FixMyStreet Pro as a staff user
+
+<img alt="When you're logged in as an administrator the 'admin' button is in the navigation menu" src="/assets/img/pro-user-guide/navigating-as-pro-staff.png" class="admin-screenshot" />
+
+If your Administrator has already given you staff permissions, you’ll see additional admin button
+on the top menu when you’re logged in. If not, your Administrator can add these permissions at
+any time: see ‘[Creating a Staff Account](#adminstrating-staff-accounts)’.
+</div>
+
+<div class="admin-task" markdown="1" id="viewing-reports-your-area">
+
+### Viewing all reports in your area
+
+<span class="admin-task__permissions">Permissions required: none</span>
+
+If you want to view everything that’s been reported within the council area, here’s the quickest
+way.
+
+Click on ‘all reports’ in the top menu. You’ll see the boundaries of your council area on the map,
+and a list of all reports listed, with the most recent reports at the top, on the left hand panel.
+
+<img alt="Click all reports in the top menu to view all reports in an area" src="/assets/img/pro-user-guide/viewing-reports-your-area.png" class="admin-screenshot" />
+
+Note that staff members can be allocated one or more category (e.g. potholes, streetlights, etc) by
+the Administrator — see ‘[Creating a Staff Account](#adminstrating-staff-accounts)’ for more details. When logged in, these staff
+members will see reports within these categories by default.
+
+</div>
+
+<div class="admin-task" markdown="1" id="defining-area-interest">
+
+### Defining the area of interest
+
+<span class="admin-task__permissions">Permissions required: none</span>
+
+If required, you can also use the controls to the right of the screen to zoom in or out, or pan across
+the map. As you’ll see, the list of reports always reflects the area you are viewing on the map, so
+this is another way of refining your view.
+
+Once you've found a satisfactory view, and if you are likely to want to revisit it, click on the 'Permalink' button at the bottom of the screen. This will alter the URL displayed in your browser, and allow you it as a bookmark which you may revisit, so you don't have to define the location again in the future.
+
+</div>
+
+<div class="admin-task" markdown="1" id="view-report-specific-area">
+
+### Viewing a report in a specific area
+
+If you already know the street name or postcode of the location you’d like to view, you may find it
+quicker to use the search form on the front page.
+
+</div>
+
+<div class="admin-task" markdown="1" id="filtering-sorting-reports">
+
+### Filtering and sorting reports
+
+<span class="admin-task__permissions">Permissions required: none</span>
+
+<img alt="The drop-downs at the top of the report list allow you to filter which reports you see" src="/assets/img/pro-user-guide/filtering-sorting-reports.png" class="admin-screenshot" />
+
+The drop-downs at the top of the report list allow you to filter which reports you see, by state (e.g.
+‘Fixed’ or ‘In progress’) and category (e.g. Potholes or Graffiti). You may also sort them by date
+created, how recently they have been updated, or number of updates.
+
+</div>
+
+<div class="admin-task" markdown="1" id="view-single-report">
+
+### Viewing a single report
+
+<span class="admin-task__permissions">Permissions required: none</span>
+
+Click on one of the issues in the list, or on a map pin, to view the full report.
+See '[Dealing with undesirable content](#deal-undesirable-content)‘ below for how to moderate or hide a report.
+
+</div>
+
+<div class="admin-task" markdown="1" id="search-report">
+
+### Searching for a report
+
+<span class="admin-task__permissions">Permissions required: User must be marked
+as staff; “Edit reports” or “Edit users' details/search for their reports” must
+be ticked</span>
+
+
+Click on ‘admin’ in the top menu bar.
+
+There are a number of different options for using the Search Reports box:
+
+- Enter any word contained in the required report’s title or body
+- Search by the report-maker’s name (or part of the name), their email address or phone
+ number (where given).
+- Search by the report’s ID number if it’s known. Putting ‘id:’ directly before this number in
+ the search box will speed up the return of results.
+
+<img alt="There are a number of different options for using the Search Reports box" src="/assets/img/pro-user-guide/search-report.png" class="admin-screenshot" />
+
+The search will return a list of all reports that fulfil your parameters.
+Depending upon the staff user’s permissions, you can then either click on the
+report’s ID number to open the report in a new browser window and access the
+moderation/ editing/ inspection facilities there; or click on the word ‘Edit’
+to access the full report admin editing page.
+
+</div>
+
+<div class="admin-task" markdown="1" id="search-user">
+
+### Searching for a user
+
+<span class="admin-task__permissions">Permissions required: User must be marked
+as staff; “Edit users' details/search for their reports” must be ticked</span>
+
+Click on ‘admin’ in the top menu bar.
+
+Enter any part of the user’s name or email address in the ‘Search users’ box.
+
+</div>
+
+<div class="admin-task" markdown="1" id="editing-users-information">
+
+### Editing a user’s information
+
+<span class="admin-task__permissions">Permissions required: User must be marked as staff; "Edit users' details/search for their reports" must be ticked.</span>
+
+Click on ‘Edit’ beside any user to view or change their account details.
+Or, click the user’s email address to view a list of all reports and updates made by that user.
+
+</div>
+
+<div class="admin-task" markdown="1" id="view-reports-non-staff-user">
+
+### Viewing reports as a non-staff user
+
+As a staff user, your view of a report includes moderation functions which ordinary users do not
+see. If you would like to view a report as a member of the public would see it, there are three
+options:
+
+- Log out of FixMyStreet, or
+- Start a [private browsing session](https://www.howtogeek.com/269265/how-to-enable-private-browsing-on-any-web-browser/), or
+- View the page in a different browser (e.g. Chrome rather than Internet Explorer), in which you are
+not logged in to FixMyStreet.
+
+Any of these courses of action will allow you to view the site as an anonymous visitor, with no
+recognition of your staff role.
+
+</div>
+
+<div class="admin-task" markdown="1" id="create-reports-behalf-user">
+
+### Creating reports on behalf of another user/ the council
+
+<span class="admin-task__permissions">Permissions required: User must be marked
+as staff; one or more of ‘Create reports/updates on a user's behalf’, ‘Create
+reports/updates as anonymous user’ and ‘Create reports/updates as the council’
+must be ticked.</span>
+
+If a resident makes a report by phone or in person, staff members with the appropriate
+permissions can add it to FixMyStreet on their behalf. The report may bear the resident’s name; or
+it may be anonymous (i.e. the report-maker’s name is not published on the site, but will still be
+available in the admin interface). Alternatively, reports can be made as if from the council itself.
+In such cases, staff should make a new report just as a member of the public would — see ‘[The
+citizen’s experience](/pro-manual/citizens-experience/)'. Those with the appropriate permissions will see a dropdown box in
+the report-making interface, labeled ‘Report As’. Select ‘the council’, ‘yourself’, ‘anonymous’ or
+‘another user’.
+
+</div>
+
+
+<div class="admin-task" markdown="1" id="deal-undesirable-content">
+
+### Dealing with undesirable content
+
+Fortunately, abuse of FixMyStreet is fairly rare: undesirable content represents a tiny fraction of
+the reports made each year. But of course, you need the tools to deal with it, and there are other
+reasons you may wish to edit a report, too. We estimate that somewhere in the region of three in
+every thousand reports will require moderation, based on figures from other councils.
+
+#### Reasons for moderation
+
+- **Personal information** ​such as the accidental inclusion of contact details in the report
+body.
+- **Potentially libelous content** ​such as complaints about illegal or anti-social behaviour
+which implicate an identifiable individual.
+- **Abusive content** ​such as profanity or unsuitable images.
+- **Council staff** ​ may have added an update which they now wish to alter, eg because of a
+spelling mistake (if the report’s status has changed or a factual error was made, we
+recommend a new update rather than editing an existing one).
+
+We recommend a ‘light touch’ approach to editing, in which any content from a user, other than
+those types listed above, is left intact. For example, there is no need to correct a report-maker’s
+spelling or grammar unless they request that you do so.
+
+
+#### Moderating reports
+
+<span class="admin-task__permissions">Permissions required: User must be marked as staff; ‘moderate report details’ must be ticked.</span>
+
+When logged in, staff with the required level of permissions can moderate reports directly on the
+report webpage. You will see a ‘moderate’ button below the report’s main body, and above each
+update. Clicking this button gives you the ability to:
+
+- Edit the title or body of the report or update
+- Remove a user’s name from the report or update
+- Remove a photograph from a report
+
+<img alt="The ‘moderate’ button below the report’s main body" src="/assets/img/pro-user-guide/deal-undesirable-content.png" class="admin-screenshot" />
+
+You can also add a note to indicate the reason for the change to the report.
+
+#### Hiding reports
+
+Clicking the moderation button also gives you the option to hide an entire report or its updates.
+‘Hiding’ means that the report is no longer visible to the general public, but it remains in the site’s
+database and is accessible to staff with admin permissions.
+
+Once a report is hidden, staff without admin permissions can no longer access it — so if, for
+example, they hide a report by accident and wish to revert it to public, they must contact a team
+member with the appropriate permissions.
+
+#### Removing users’ names
+
+When users make a report on FixMyStreet, they may choose not to display their name on the
+public web page. If a user accidentally chooses to display their name and then wishes to remove it,
+they can do so themselves when logged in to FixMyStreet.
+
+However, if necessary, council staff can also remove a name from a public report on behalf of the
+user: see ‘[moderating reports](#deal-undesirable-content)’.
+
+#### Adding a user to the abuse list
+
+<span class="admin-task__permissions">Permissions required: User must be marked as staff, ‘Edit reports’ must be ticked.</span>
+
+You can add an abusive user's email to the abuse list, which automatically hides any reports they
+create, and means that their reports are not sent. Instead, the user sees a message that there was
+an error in confirming their report.
+
+Staff with the required permissions can ban a user directly from a report page, using the ‘Ban user’
+button.
+
+<img alt="Ban a user directly from a report page" src="/assets/img/pro-user-guide/ban-user-report-page.png" class="admin-screenshot" />
+
+#### Removing users from the banned list
+
+When a user has been banned, an ‘unban’ button will be visible on their records and reports. This
+restores them to the status of a standard user, but it does not have any effect on reports which
+were made during the period when the user was banned — these remain unsent.
+
+</div>
+
+<div class="admin-task" markdown="1" id="correct-reporter-errors">
+
+### Correcting reporter errors
+
+#### Changing a report’s category
+
+<span class="admin-task__permissions">Permissions required: User must be marked as staff, and ‘edit report category’ must be ticked.</span>
+
+If the user has chosen the wrong category for their report, when logged in, staff with the appropriate permissions can change it from within the on-page editing interface, from the dropdown to the right of the report.
+
+<img alt="Change the category of a report" src="/assets/img/pro-user-guide/change-category-report.png" class="admin-screenshot" />
+
+If changing the category of the report results in it becoming the responsibility of another authority,
+the report will be re-sent to that authority. Do not mark it as closed, even though you have now
+dealt with it as far as your council is concerned; from the other authority's point of view, and for
+the person who made the report, the status is still open.
+
+However, if the report remains your council’s responsibility, the category change does not re-send
+the report unless the send method has changed (e.g. in the case of councils where some reports are sent via the Open311 protocol and others by email).
+
+#### Changing the location
+
+<span class="admin-task__permissions">Permissions required: User must be marked
+as staff; ‘Markup problem details’, ‘Edit report category’, or ‘Edit report
+priority’ must be ticked</span>
+
+- You can click and drag a pin at any time to change the report’s specified location.
+- When viewing a report on the ground, staff with the appropriate permissions may click
+‘set to my current location’. This will reset the co-ordinates of the issue to reflect a more accurate placement.
+
+</div>
+
+<div class="admin-task" markdown="1" id="keep-report-maker-informed">
+
+### Keeping the report-maker informed
+
+Updates can be left on a report in order to keep the creator of the report, and
+the wider public viewing the site, informed on what is happening with the
+report. Staff members can update the state of the report if necessary,
+including states such as ‘in progress’ or ‘no further action’, plus leave a
+textual update to explain in more detail.
+
+Many issues require identical or very similar responses. Rather than type your reply out each time,
+staff can choose from a number of pre-written (but still editable) template responses, such as
+‘Thank you for your report, we’ll be back in touch with an update soon’, ‘Repairs are now
+underway’ and ‘This issue is now closed’.
+
+#### Status updates
+
+<span class="admin-task__permissions">Permissions required: User must be marked as staff</span>
+
+<img alt="Use a template to make public updates faster" src="/assets/img/pro-user-guide/report-public-update.png" class="admin-screenshot" />
+
+From the report page, staff with the appropriate permissions may select from the ‘public update’
+dropdown. This will prefill an update with template text for one of a number of common statuses.
+The templates are created by the Administrator; see ‘[Creating response templates](#creating-and-editing-priorities)’.
+
+The text in template responses is fully editable on the report page, so staff may also choose to add
+their own comments or edit the preformatted responses to reflect the precise circumstances of the
+report. Alternatively they may write an entirely new status update.
+
+In some cases, template responses are automatically attached to a report state — for example,
+setting the report state as closed may automatically select the template ‘Issue closed’. See
+‘creating a template’.
+
+If ‘Create reports/updates as the council’ is ticked in the staff user’s account permissions, their
+updates will be labeled as from the council rather than the staff member’s name. For the sake of
+staff privacy, this is usually preferable.
+
+This option is also available via the general 'Update' box under the main report.
+
+#### Requests for more information
+
+Depending on your preference, you may request more information by contacting the user directly,
+or by leaving a status update on the report that asks for the details you need. Both will reach the
+report-maker; the difference is that a status update can also be seen by anyone viewing the report
+online.
+
+</div>
+
+<div class="admin-task" markdown="1" id="prioritising-tasks">
+
+### Prioritising tasks
+
+<span class="admin-task__permissions">Permissions required: User must be marked as staff and ‘edit report priority’ or 'mark up problem
+details' must be ticked.</span>
+
+<img alt="Set a report priority from the report screen" src="/assets/img/pro-user-guide/report-change-priority.png" class="admin-screenshot" />
+
+#### Setting a priority
+From the panel on the right hand side of a report, staff with the appropriate permissions may
+select a priority from a drop-down list. These priorities are created by Administrator-level users;
+see ‘[Setting categories and priorities](#creating-and-editing-priorities) ’.
+
+</div>
+
+<div class="admin-task" markdown="1" id="working-with-shortlists">
+
+### Working with shortlists
+
+<span class="admin-task__permissions">Permissions required: User must be marked as staff and ‘manage shortlist’ must be ticked.</span>
+
+You can easily create a shortlist of reports that you need to inspect, and arrange them into the
+order that suits you best. Once that’s done, you can consult them via a mobile device — even when
+offline — or, if you prefer, print the list out on paper.
+
+#### Making a shortlist
+
+<img alt="Add reports to your shortlist by clicking the star icons" src="/assets/img/pro-user-guide/all-reports-shortlist.png" class="admin-screenshot" />
+
+First, navigate to the ‘All reports’ page where you will see issues listed on the left. In most cases,
+it’s useful to leave these in their default of ‘sort by newest’ so that you see the most recent reports
+first, and to use the dropdown to filter the reports so that you only see those which have an ‘open’
+status. You may also wish to limit your results to a specific category. See more about [filtering and
+sorting reports](#filtering-and-sorting-reports).
+
+Once this is done, you can add a report to your shortlist by clicking on the star beside it. The star
+will turn green to indicate that it has been added. Click the stars by any report which you wish to
+investigate.
+
+At a certain level of zoom, there’s also the ability to ‘add all reports visible to shortlist’, which
+allows you to make a bulk addition of everything within the area.
+
+Alternatively, you may add a report from within the individual report page.
+Adding a report to your own list will remove it from any other staff member’s list to which it has
+previously been added.
+
+<img alt="Add a report to your shortlist from within the individual report page" src="/assets/img/pro-user-guide/report-page-shortlist.png" class="admin-screenshot" />
+
+#### Viewing, editing and sorting the shortlist
+
+Click on ‘Shortlist’ in the top menu bar and you will see all the reports which you’ve selected.
+You can continue to add more reports by returning to the ‘all reports’ page.
+
+<img alt="View your shortlist from the link in the navigation bar" src="/assets/img/pro-user-guide/your-shortlist.png" class="admin-screenshot" />
+
+
+If you wish to remove a report from your list, click on the green star again. This can be done on the
+individual report’s page, from the ‘all reports’ page, or from within your shortlist.
+
+Shortlists can be ordered and filtered in the same way as the main list, by using the dropdown
+menus. You can also use the arrows beside each report title to move them up or down the list, until
+they are in a practical order for your route or priorities.
+
+#### Viewing navigation routes
+
+From any report, you can click the button marked ‘navigate to this problem’. This will open a
+separate tab in your browser, and plot a route on Google maps from your current location.
+
+</div>
+
+<div class="admin-task" markdown="1" id="viewing-editing-reports-offline">
+
+### Viewing and editing reports offline
+
+<span class="admin-task__permissions">Permissions required: User must be marked as staff and ‘manage shortlist’ must be ticked.</span>
+
+Sometimes it’s useful to be able to see and update reports even when you’re offline — perhaps in
+areas with low mobile connectivity, or because you want to save data. FixMyStreet Pro will let you
+do this, and then it syncs everything up when you’re back online.
+
+Visit your shortlist page before you go out and about: you’ll see a message that the list is being
+cached for use offline. That means that whenever you are viewing the page without an internet
+connection, you’ll be able to see the reports — make sure you have the shortlist page bookmarked
+so that you can find it when you need it.
+
+While offline, you can view reports, create and edit updates. The changes will all go live once you
+go online to sync.
+
+#### Syncing
+
+To synchronise your records once you're back online, just visit any page on FixMyStreet and click the prompt to submit your changes.
+
+</div>
+
+<div class="admin-task" markdown="1" id="adminstrating-staff-accounts">
+
+### Administrating staff accounts
+
+#### Creating a staff account
+
+<span class="admin-task__permissions">Permissions required: User must be marked as staff; ‘Edit other users’ permissions’ must be ticked.</span>
+
+<img alt="From the user admin page you can administer staff accounts" src="/assets/img/pro-user-guide/user-admin-page.png" class="admin-screenshot" />
+
+Go to the ‘Users’ tab in the admin menu.
+
+You’ll see a table of existing users. Below this is the ‘add user’ interface.
+
+First create the basic user account by inputting a name and email address, plus any other contact
+details desired. Once this is done and you have saved the input, you can edit the account to assign
+any permissions required.
+
+You can use the same form to create a user account for a resident or a member of staff, so tick
+‘staff user’ if you wish to create an admin account.
+
+The new staff user can then log in via the normal method.
+
+#### Assigning permissions
+
+<span class="admin-task__permissions">Permissions required: User must be marked as staff; ‘Edit other users' permissions must be ticked.</span>
+
+<img alt="You can assign permissions to users on this screen" src="/assets/img/pro-user-guide/user-admin-permissions.png" class="admin-screenshot" />
+
+Once you have created the basic staff user account, you’ll be taken to a page where you can assign
+permissions.
+
+You can also always edit any user from the table at the top of the Users page by clicking ‘edit’.
+Check the boxes relating to the permissions you wish that user to have, and click ‘submit changes’.
+
+
+#### Setting categories or areas
+
+<span class="admin-task__permissions">Permissions required: User must be marked as staff; ‘Edit other users' permissions’ must be ticked.</span>
+
+<img alt="You can allocate categories to individual users by checking the relevant category boxes" src="/assets/img/pro-user-guide/user-admin-categories.png" class="admin-screenshot" />
+
+The Administrator can allocate one or more categories of report (e.g. Potholes or Highways
+maintenance) to a staff user by editing the user and checking the relevant category boxes. The
+staff user, when logged in, will then only see reports within those categories. This is useful where a
+staff user only deals with reports of a specific type.
+
+#### Removing accounts
+
+To remove an account, the Administrator-level member of staff should make contact with
+mySociety.
+
+</div>
+
+<div class="admin-task" markdown="1" id="creating-editing-categories">
+
+### Creating and editing categories
+
+<div class="boxout" markdown="1">
+
+#### Note
+
+If your FixMyStreet Pro installation has been integrated with a CRM system, this
+section does not apply. In such cases, categories are managed from within the CRM, and
+FixMyStreet will be set up to work with these.
+
+</div>
+
+<span class="admin-task__permissions">Permissions required: User must be marked as staff; “Add/edit problem categories” must be
+ticked.</span>
+
+<img alt="Control the categories the site displays when a report is made here" src="/assets/img/pro-user-guide/category-admin-page.png" class="admin-screenshot" />
+
+#### Creating a category
+
+Those with the appropriate permissions can dictate which categories the site displays when a
+report is being made.
+
+These categories also become one of the criteria by which all users — both members of the public
+and staff users — can filter reports when viewing them on the site.
+
+From the Admin menu, click on ‘Categories’. You’ll see a table of existing categories, and below
+that, a form by which you can create new ones.
+
+
+Input a title for the category, and the email address to which reports in that category should be
+forwarded. When creating a category, these are the only fields required.
+
+You can set up as many or as few categories as you like, and each category can have its own email
+address attached to it, so for example, reports about potholes may go to one council email
+address, while reports about road signs go to another. More than one category may share the
+same email address, if required.
+
+For the best user experience, categories should be limited to no more than 20, and should be fairly
+broad — so for example, one category titled ‘Parking’ is better than several titled ‘Bad parking’,
+‘Car parks’, ‘Parking meters’, etc — especially if all the reports end up in the same mailbox. Fewer
+and broader categories ensure better accuracy in the routing of reports that you receive, as it is
+easier for a user to identify the correct one.
+
+Category titles should, as far as possible, use language that residents of all levels of experience or
+education are likely to understand, rather than internal council or highways management jargon
+(such as ‘paths’ rather than ‘footways’ and ‘roads’ rather than ‘carriageways’ or even ‘highways’).
+We always recommend the inclusion of one category titled ‘Other’, for reports which do not fit into
+any pre-existing category. This should route emails to a general mailbox from where a member of
+staff can forward them to the most suitable destination.
+
+#### Editing categories
+
+<span class="admin-task__permissions">Permissions required: User must be marked as staff; “Add/edit problem categories” must be
+ticked.</span>
+
+<img alt="You can edit categories using the edit category interface" src="/assets/img/pro-user-guide/edit-category-page.png" class="admin-screenshot" />
+
+
+You can edit categories at any time by clicking on their title within the table at the top of the
+Categories page.
+
+From here, you can:
+
+- Change the email address that the reports in this category are routed to
+- Set the category’s ‘state’ to Confirmed, Unconfirmed, Inactive or Deleted. This can be
+ useful when categories are discontinued or changed, for example if responsibilities are
+ transferred to another council, or your own council reconfigures its departments.
+ - **Confirmed** ​ indicates that the email address has been verified as correct.
+ - **Inactive** ​ will remove the category from use when reporting problems, but keep it
+ available in map filters. It’s useful for categories which have been discontinued,
+ but which you’d still like users to to be able to view data on.
+ - **Deleted** ​ will remove the category from use, and from map filters. Use this if you
+ want to discontinue a category and have no need for it to appear on the site.
+ - **Unconfirmed** ​ is for categories where the attached email address has not been
+ verified as correct. This option is not commonly used by councils. Reports sent to
+ unconfirmed categories are not routed to the council; instead, an alert email is
+ sent to mySociety staff.
+
+</div>
+
+<div class="admin-task" markdown="1" id="creating-editing-priorities">
+
+### Creating and editing priorities
+
+<span class="admin-task__permissions">Permissions required: User must be marked as staff; “Add/edit response priorities” must be ticked.</span>
+
+Priorities indicate the relative urgency or importance of a report. You can set them to reflect your
+own internal prioritisation system; there’s also space to add priority codes to comply with external
+services that reports may be passed on to.
+
+<img alt="Set your priorities to reflect your organisations needs" src="/assets/img/pro-user-guide/response-priority-screen.png" class="admin-screenshot" />
+
+#### Create a new priority
+Click on ‘Priorities’ in the admin menu. You will see any existing priorities listed in a table. Click
+‘New priority’ to add a new one, then provide the following details:
+
+- **Name** ​Give the priority a name which will be recognisable when it is being chosen from a
+ dropdown list within a report, e.g. ‘High priority’.
+- **Categories** ​ Priorities can be applied to one or more category of report: check the boxes to
+ indicate which categories.
+- **Description** ​ Include a description of the priority, e.g. ‘Four hour fix’.
+- **External ID** ​ Any code that needs to be passed on to external contractors or services.
+**- Default priority** ​Tick the box if this priority applies to all reports by default.
+
+#### Edit an existing priority
+Click on ‘Priorities’ in the admin menu. You will see any existing priorities listed in a table. Click
+‘edit’ to make changes to an existing priority, and change any of the following, as required:
+
+- **Name** ​ The identifier which appears, to staff with the appropriate permissions, in the
+dropdown menu within a report.
+- **Categories** ​ Priorities can apply to one or more category of report: check the boxes to
+indicate which categories.
+- **Description** ​ Include a description of the priority, e.g. ‘four hour fix’.
+- **External ID** ​ Any code that needs to be passed on to external contractors or services
+**- Default priority** ​Tick the box if this priority applies to all reports by default. If you check
+this box, it will override any existing default priorities.
+- **Flag as deleted** ​ Removes the priority from the system so that it can no longer be applied
+to reports.
+
+</div>
+
+<div class="admin-task" markdown="1" id="creating-editing-response-templates">
+
+### Creating and editing response templates
+
+<span class="admin-task__permissions">Permissions required: User must be marked as staff; “Add/edit response templates” must be ticked.</span>
+
+<img alt="You can create and edit pre-written responses on the response templates screen" src="/assets/img/pro-user-guide/response-template-screen.png" class="admin-screenshot"/>
+
+Staff users with the appropriate permissions may create and edit pre-written responses, so that
+they can be applied to reports quickly and easily.
+
+#### Creating a template
+
+Click on ‘Templates’ in the admin menu. You will see a table of any existing templates. Click on the
+button below, marked ‘New template’.
+
+Common template responses deal with statuses such as: Report received; Scheduled for
+inspection; Not council responsibility; Scheduled for repair; Work underway; Unable to fix;
+Re-opened; and Resolved.
+
+There is no limit to the number of template responses you can create.
+When creating templates, you should consider:
+- What are the most common response types that you send back to report makers? It may
+be worth examining recent responses to find out.
+- How should you word your response template text to make it as easy as possible for the
+report maker to understand the status of their issue?
+- What title should you give the template so that it can be easily identified from a drop-down
+list when it is being applied by staff users?
+
+Input a title and some text for your template, then set which categories it should apply to. You may
+create different templates for each category, or use the same templates across multiple
+categories.
+
+You can also set a State so that the template response is automatically used when that state is
+applied to a report.
+
+For example, you can set it so that when a staff user changes a report’s state to ‘No further action’,
+the ‘Resolved’ status update text is automatically applied. While this functionality can be a
+time-saver, we advise using it with caution to ensure that the template text is applicable to every
+situation in which is will be automatically applied.
+
+If you have an Open311 connection, you can click ‘auto-response’ so that a template will be
+applied when the state is updated by the automated Open311 process.
+
+
+#### Editing or deleting a template
+
+Click on ‘Templates’ in the admin menu. You will see a table of existing templates. Click on ‘Edit’
+beside the status you wish to change. You may alter any of the fields as described in the section
+above, ‘Creating a template’. Additionally you can delete the template from this page.
+
+</div>
+
+<div class="admin-task" markdown="1" id="view-statistics">
+
+### Viewing statistics
+
+<span class="admin-task__permissions">Permissions required: User must be marked as staff</span>
+
+When you first log in to the Admin area, you’ll see some top-level stats at the foot of the page,
+including the number of reports published on the site, the number of updates, the number of
+alerts set up and the number of user questionnaires sent out. This can be useful for a quick
+snapshot of activity.
+
+For a more detailed breakdown, visit the stats dashboard. This can be accessed by typing
+‘/dashboard’ on the end of your FixMyStreet url.
+
+From here, you can access statistics on:
+
+- All reports made across the council area
+- Reports made within any specific ward
+- Reports made within any specific category
+- Reports made between specific dates
+- Reports that have a specific status, eg ‘open’ or ‘fixed’
+- A combination of the above.
+
+You can also group the results by:
+
+- Category
+- State
+- Category and state
+- Month
+- Device (this allows you to see how many people access your site via the website, via an
+Android device or via an iOS device).
+
+These statistics can be downloaded as a CSV document, suitable for use in a spreadsheet program
+such as Excel.
+
+</div>
diff --git a/docs/_includes/footer.html b/docs/_includes/footer.html
new file mode 100644
index 000000000..25ffa94a7
--- /dev/null
+++ b/docs/_includes/footer.html
@@ -0,0 +1,61 @@
+<div class="mysoc-footer" role="contentinfo">
+ <div class="container">
+ <div class="row">
+
+ <div class="col-sm-5">
+ <h2 class="mysoc-footer__site-name">FixMyStreet Platform</h2>
+ <div class="mysoc-footer__site-description">
+ <p>Open source report-mapping software that can be deployed anywhere in the world. Most commonly used for reporting street issues to councils, but flexible enough to fit any project that matches geographical points to email addresses.</p>
+ </div>
+ </div>
+
+ <div class="col-sm-1">&nbsp;</div>
+
+ <div class="col-sm-3">
+ <nav class="mysoc-footer__links">
+ <ul>
+ <li role="presentation"><a href="{{ "/install/" | relative_url }}">Install</a></li>
+ <li role="presentation"><a href="{{ "/overview/" | relative_url }}">Documentation</a></li>
+ <li role="presentation"><a href="{{ "/blog/" | relative_url }}">Blog</a></li>
+ <li role="presentation"><a href="{{ "/community/" | relative_url }}">Contact</a></li>
+ </ul>
+ </nav>
+ </div>
+
+ <div class="col-sm-3">
+ <div class="mysoc-footer__donate">
+ <p>Your donations keep this site and others like it running</p>
+ <a href="https://www.mysociety.org/donate?utm_source=fixmystreet.org&utm_content=footer+donate+now&utm_medium=link&utm_campaign=mysoc_footer" class="mysoc-footer__donate__button">Donate now</a>
+ </div>
+ </div>
+
+ </div>
+ <hr class="mysoc-footer__divider" role="presentation">
+ <div class="row">
+
+ <div class="col-sm-5">
+ <div class="mysoc-footer__orgs">
+ <p class="mysoc-footer__org">
+ Built by
+ <a href="https://www.mysociety.org?utm_source=fixmystreet.org&utm_content=footer+logo&utm_medium=link&utm_campaign=mysoc_footer" class="mysoc-footer__org__logo mysoc-footer__org__logo--mysociety">mySociety</a>
+ </p>
+ </div>
+ </div>
+
+ <div class="col-sm-4">
+ <div class="mysoc-footer__legal">
+ <p>mySociety Limited is a project of UK Citizens Online Democracy, a registered charity in England and Wales. For full details visit <a href="https://www.mysociety.org?utm_source=fixmystreet.org&utm_content=footer+full+legal+details&utm_medium=link&utm_campaign=mysoc_footer">mysociety.org</a>.</p>
+ </div>
+ </div>
+
+ <div class="col-sm-3">
+ <ul class="mysoc-footer__badges">
+ <li role="presentation"><a href="https://github.com/mysociety/fixmystreet" class="mysoc-footer__badge mysoc-footer__badge--github">Github</a></li>
+ <li role="presentation"><a href="https://www.twitter.com/mysociety" class="mysoc-footer__badge mysoc-footer__badge--twitter">Twitter</a></li>
+ <li role="presentation"><a href="https://www.facebook.com/mysociety" class="mysoc-footer__badge mysoc-footer__badge--facebook">Facebook</a></li>
+ </ul>
+ </div>
+
+ </div>
+ </div>
+</div>
diff --git a/docs/_includes/google-analytics.html b/docs/_includes/google-analytics.html
new file mode 100644
index 000000000..16967f5e7
--- /dev/null
+++ b/docs/_includes/google-analytics.html
@@ -0,0 +1,9 @@
+<!-- Global site tag (gtag.js) - Google Analytics -->
+<script async src="https://www.googletagmanager.com/gtag/js?id=UA-660910-6"></script>
+<script>
+ window.dataLayer = window.dataLayer || [];
+ function gtag(){dataLayer.push(arguments);}
+ gtag('js', new Date());
+
+ gtag('config', 'UA-660910-6', { 'anonymize_ip': true });
+</script>
diff --git a/docs/_layouts/default.html b/docs/_layouts/default.html
new file mode 100644
index 000000000..fc08c22b2
--- /dev/null
+++ b/docs/_layouts/default.html
@@ -0,0 +1,38 @@
+<!doctype html>
+<html lang="en">
+ <head>
+ <meta charset="utf-8">
+ <title>{{ page.title }} | FixMyStreet Platform | mySociety</title>
+ <link rel="stylesheet" href="{{ "/assets/css/fixmystreet-org.css" | relative_url }}">
+ <link href="/atom.xml" rel="alternate" title="FixMyStreet Platform" type="application/atom+xml">
+ <meta name="viewport" content="initial-scale=1">
+ <link href='//fonts.googleapis.com/css?family=Source+Sans+Pro:400,600,700,900,400italic' rel='stylesheet' type='text/css'>
+ <!--[if lt IE 9]>
+ <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
+ <![endif]-->
+ {% include google-analytics.html %}
+ <script type="text/javascript" src="/assets/scripts/jquery.min.js"></script>
+ <script type="text/javascript" src="/assets/scripts/jquery-migrate.min.js"></script>
+ <script type="text/javascript" src="/assets/scripts/owl.carousel.min.js"></script>
+ </head>
+ <body{% if page.bodyclass %} class="{{ page.bodyclass }}"{% endif %}>
+ <div class="ms-header">
+ <nav class="ms-header__row">
+ <a class="ms-header__logo" href="https://www.mysociety.org">mySociety</a>
+ </nav>
+ </div>
+
+ <header class="site-header">
+ <div class="container">
+ <a href="{{ "/" | relative_url }}" class="site-title"><h1>FixMyStreet: Platform</h1></a>
+ </div>
+ </header>
+
+ {{ content }}
+
+ {% include footer.html %}
+
+ <script type="text/javascript" src="/assets/scripts/app.js"></script>
+
+ </body>
+</html>
diff --git a/docs/_layouts/fullwidth.html b/docs/_layouts/fullwidth.html
new file mode 100644
index 000000000..0999cf85c
--- /dev/null
+++ b/docs/_layouts/fullwidth.html
@@ -0,0 +1,14 @@
+---
+layout: default
+---
+
+<div class="page-wrapper">
+ <div class="page">
+ <div class="main-content-column-full-width">
+ <main role="main" class="main-content">
+ {{ content }}
+ </main>
+ </div>
+ </div>
+</div>
+
diff --git a/docs/_layouts/landing.html b/docs/_layouts/landing.html
new file mode 100644
index 000000000..ba21ac9f7
--- /dev/null
+++ b/docs/_layouts/landing.html
@@ -0,0 +1,9 @@
+---
+layout: default
+bodyclass: home
+---
+
+
+<div class="page-wrapper--white">
+ {{ content }}
+</div>
diff --git a/docs/_layouts/page.html b/docs/_layouts/page.html
new file mode 100644
index 000000000..79097b5a9
--- /dev/null
+++ b/docs/_layouts/page.html
@@ -0,0 +1,119 @@
+---
+layout: default
+---
+
+<script>
+ (function() {
+ var cx = '018335012393813682733:yb97auudu-a';
+ var gcse = document.createElement('script');
+ gcse.type = 'text/javascript';
+ gcse.async = true;
+ gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(gcse, s);
+ })();
+</script>
+
+<div class="page-wrapper">
+ <div class="page">
+
+ {% assign crumbs = page.url | split:"/" %}
+ <ul class="breadcrumb">
+ <li><a href="/">Home</a></li>
+ <li><a href="/overview/">Documentation</a></li>
+ {% if page.layout == 'post' %}
+ <li><a href="/blog/">Blog</a></li>
+ {% else %}
+ {% for crumb in crumbs offset:1 %}
+ {% unless forloop.last %}
+ <li><a href="/{% for c in crumbs offset:1 limit:forloop.index %}{{ c }}/{% endfor %}">{{ crumb | capitalize }}</a></li>
+ {% endunless %}
+ {% endfor %}
+ {% endif %}
+ </ul>
+
+ <div class="site-search">
+ <gcse:searchresults></gcse:searchresults>
+ </div>
+
+ <div class="main-content-column">
+ <main role="main" class="main-content">
+ {{ content }}
+ </main>
+ </div>
+
+ <div class="secondary-content-column">
+ <nav class="sidebar">
+
+ <div class="site-search">
+ <gcse:searchbox></gcse:searchbox>
+ </div>
+
+ <ul>
+ <li><a href="{{ "/" | relative_url }}">Home</a></li>
+ <li><a href="{{ "/how-it-works/" | relative_url }}">How it works</a></li>
+ <li><a href="{{ "/overview/" | relative_url }}">Documentation</a></li>
+ <li><h2>Installing</h2>
+ <ul>
+ <li><a href="{{ "/install/manual-install/" | relative_url }}">Manually</a>
+ <li><a href="{{ "/install/install-script/" | relative_url }}">Install script</a></li>
+ <li><a href="{{ "/install/vagrant/" | relative_url }}">Vagrant</a></li>
+ <li><a href="{{ "/install/ami/" | relative_url }}">AMI for EC2</a></li>
+ <li><a href="{{ "/install/troubleshooting/" | relative_url }}">Troubleshooting</a></li>
+ </ul>
+ </li>
+ <li><h2>Customising</h2>
+ <ul>
+ <li><a href="{{ "/customising/" | relative_url }}">Overview</a>
+ <li><a href="{{ "/customising/checklist/" | relative_url }}">Checklist</a>
+ <li><a href="{{ "/customising/config/" | relative_url }}">Configuration</a>
+ <li><a href='{{ "/customising/language/" | relative_url }}'>Language</a></li>
+ <li><a href='{{ "/customising/login/" | relative_url }}'>Login/authentication</a></li>
+ <li><a href='{{ "/customising/fms_and_mapit/" | relative_url }}'>Assigning reports</a></li>
+ <li><a href='{{ "/customising/geocoder/" | relative_url }}'>Geocoder</a></li>
+ <li><a href="{{ "/customising/boundaries/" | relative_url }}">Admin boundaries</a>
+ <li><a href='{{ "/customising/css/" | relative_url }}'>Design (CSS)</a></li>
+ <li><a href='{{ "/customising/templates/" | relative_url }}'>Templates</a></li>
+ <li><a href='{{ "/customising/static-pages/" | relative_url }}'>Static pages</a></li>
+ <li><a href='{{ "/customising/send_reports/" | relative_url }}'>Sending reports</a></li>
+ <li><a href='{{ "/customising/integration/" | relative_url }}'>Back-end integration</a></li>
+ <li><a href='{{ "/feeding-back/" | relative_url }}'>Feeding back changes</a></li>
+ </ul>
+ </li>
+ <li><h2>Running FixMyStreet</h2>
+ <ul>
+ <li><a href="{{ "/running/" | relative_url }}">Overview</a>
+ <li><a href='{{ "/running/admin_manual/" | relative_url }}'>Admin manual</a></li>
+ <li><a href='{{ "/running/staff/" | relative_url }}'>Staff</a></li>
+ <li><a href='{{ "/running/bodies_and_contacts/" | relative_url }}'>Bodies and contacts</a></li>
+ <li><a href='{{ "/running/users/" | relative_url }}'>Users</a></li>
+ <li><a href='{{ "/running/surveys/" | relative_url }}'>Surveys</a></li>
+ <li><a href='{{ "/running/promotion/" | relative_url }}'>Promoting</a></li>
+ </ul>
+ </li>
+ <li><h2>Updating your code</h2>
+ <ul>
+ <li><a href="{{ "/updating/" | relative_url }}">Overview</a></li>
+ <li><a href="{{ "/updating/ami/" | relative_url }}">AMI</a></li>
+ <li><a href="{{ "/updating/templates/" | relative_url }}">Templates</a></li>
+ </ul>
+ </li>
+ <li><h2>Community</h2>
+ <ul>
+ <li><a href="{{ "/community/" | relative_url }}">Mailing list</a></li>
+ <li><a href="https://github.com/mysociety/fixmystreet">GitHub</a></li>
+ <li><a href="{{ "/community/" | relative_url }}">IRC</a></li>
+ <li><a href="https://twitter.com/fixmystreet">Twitter</a></li>
+ </ul>
+ </li>
+ <li><h2>Blog</h2>
+ <ul>
+ <li><a href="{{ "/blog/" | relative_url }}">Latest posts</a>
+ <li><a href="{{ "/atom.xml" | relative_url }}">Feed</a>
+ </ul>
+ </li>
+ <li><a href="{{ "/glossary/" | relative_url }}">Glossary</a></li>
+ </ul>
+ </nav>
+ </div>
+</div>
diff --git a/docs/_layouts/post.html b/docs/_layouts/post.html
new file mode 100644
index 000000000..b4bef7e79
--- /dev/null
+++ b/docs/_layouts/post.html
@@ -0,0 +1,19 @@
+---
+layout: page
+---
+
+{% assign author = site.authors[page.author] %}
+<div class="post">
+ <div class="blog-post-header">
+ <h1 class="blog-title">{{ page.title }}</h1>
+ <p class="meta">by {{ author.display_name }}, on {{ page.date | date: "%-d %B %Y" }}</p>
+ </div>
+ {{ content }}
+
+ <hr>
+ <p>If you have any questions, or problems installing the code, please do
+ <a href="/community/">get in touch</a>, or post on our
+ <a href="https://groups.google.com/a/mysociety.org/forum/#!forum/fixmystreet">mailing list</a>.
+
+</div>
+
diff --git a/docs/_layouts/pro-print.html b/docs/_layouts/pro-print.html
new file mode 100644
index 000000000..4437007f4
--- /dev/null
+++ b/docs/_layouts/pro-print.html
@@ -0,0 +1,20 @@
+---
+layout: pro
+---
+
+<div class="user-guide-cover">
+ <h1 class="user-guide-title">FixMyStreet Pro User Guide</h1>
+ <p>Available from http://fixmystreet.com/pro/user-guide</p>
+</div>
+
+{% assign sorted_pages = (site.pages | where: "user-guide" , "true" | sort:"order" ) %}
+
+{% for page in sorted_pages %}
+
+<div class="user-guide-section">
+
+{{ page.content | markdownify }}
+
+</div>
+
+{% endfor %} \ No newline at end of file
diff --git a/docs/_layouts/pro.html b/docs/_layouts/pro.html
new file mode 100644
index 000000000..a0cbb0351
--- /dev/null
+++ b/docs/_layouts/pro.html
@@ -0,0 +1,163 @@
+<!doctype html>
+<html lang="en">
+ <head>
+ <meta charset="utf-8">
+ <title>{{ page.title }} | FixMyStreet Platform | mySociety</title>
+ <link rel="stylesheet" href="{{ "/assets/css/fixmystreet-org.css" | absolute_url }}">
+ <link rel="stylesheet" href="{{ "/assets/css/fixmystreet-pro.css" | absolute_url }}">
+ <link rel="stylesheet" href="{{ "/assets/css/fixmystreet-pro-print.css" | absolute_url }}" media="print">
+ <link rel="stylesheet" href="https://www.fixmystreet.com/pro/wp-content/themes/fixmystreet-pro/assets/css/main.css" />
+ <link href="{{ "/atom.xml" | absolute_url }}" rel="alternate" title="FixMyStreet Platform" type="application/atom+xml">
+ <meta name="viewport" content="initial-scale=1">
+ <link rel="stylesheet" id="google-fonts-css" href="https://fonts.googleapis.com/css?family=Rubik%3A400%2C500%2C700&amp;ver=4.9.4" type="text/css" media="all">
+ <!--[if lt IE 9]>
+ <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
+ <![endif]-->
+ {% include google-analytics.html %}
+ <script type="text/javascript" src="{{ "/assets/scripts/jquery.min.js" | absolute_url }}"></script>
+ <script type="text/javascript" src="{{ "/assets/scripts/jquery-migrate.min.js" | absolute_url }}"></script>
+ <script type="text/javascript" src="https://www.fixmystreet.com/pro/wp-content/themes/fixmystreet-pro/assets/javascript/bootstrap.min.js"></script>
+ <script type="text/javascript" src="https://www.fixmystreet.com/pro/wp-content/themes/fixmystreet-pro/assets/javascript/main.js"></script>
+ </head>
+ <body{% if page.bodyclass %} class="{{ page.bodyclass }}"{% endif %}>
+
+
+ <div class="ms-header">
+ <div class="container">
+ <div class="row">
+ <div class="col-sm-3 col-sm-push-9 ms-header__logo">
+ <a href="https://www.mysociety.org/">mySociety</a>
+ </div>
+ <a class="col-sm-9 col-sm-pull-3 ms-header__back-to-fms" href="https://www.fixmystreet.com">
+ <p><i class="glyphicon glyphicon-chevron-left"></i> <strong>Return to FixMyStreet.com</strong> to report a street issue in the UK</p>
+ </a>
+ </div>
+ </div>
+ </div>
+
+ <header class="site-header">
+ <div class="container">
+ <a href="https://www.fixmystreet.com/pro/" class="site-logo" aria-label="FixMyStreet Pro home">
+ FixMyStreet Pro </a>
+ <a href="#main-nav" role="button" data-toggle="collapse" aria-expanded="false" aria-controls="main-nav">
+ Menu
+ </a>
+ <nav id="main-nav" class="site-nav collapse">
+ <ul id="menu-main-menu" class="menu js-dropdown-sub-menus">
+ <li id="menu-item-29" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-29"><a href="https://www.fixmystreet.com/pro/take-a-tour/">Take a tour</a></li>
+ <li id="menu-item-537" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-537"><a href="https://www.fixmystreet.com/pro/case-studies/">Case Studies</a>
+ <ul class="sub-menu">
+ <li id="menu-item-615" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-615"><a href="https://www.fixmystreet.com/pro/take-a-tour/banes/">Bath &amp; North East Somerset Council</a></li>
+ <li id="menu-item-538" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-538"><a href="https://www.fixmystreet.com/pro/take-a-tour/bristol/">Bristol Council</a></li>
+ <li id="menu-item-630" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-630"><a href="https://www.fixmystreet.com/pro/take-a-tour/east-herts/">East Herts District Council</a></li>
+ <li id="menu-item-588" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-588"><a href="https://www.fixmystreet.com/pro/take-a-tour/ground-control/">Ground Control</a></li>
+ <li id="menu-item-539" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-539"><a href="https://www.fixmystreet.com/pro/take-a-tour/oxfordshire/">Oxfordshire County Council</a></li>
+ </ul>
+ </li>
+ <li id="menu-item-30" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-30"><a href="https://www.fixmystreet.com/pro/features/">Features</a>
+ <ul class="sub-menu">
+ <li id="menu-item-32" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-32"><a href="https://www.fixmystreet.com/pro/features/fully-integrated/">Fully integrated</a></li>
+ <li id="menu-item-34" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-34"><a href="https://www.fixmystreet.com/pro/features/open-standards/">Open standards</a></li>
+ <li id="menu-item-28" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-28"><a href="https://www.fixmystreet.com/pro/training/">Training</a></li>
+ <li id="menu-item-33" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-33"><a href="https://www.fixmystreet.com/pro/features/hosted-secure/">Hosted &amp; Secure</a></li>
+ <li id="menu-item-752" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-752"><a href="https://www.fixmystreet.com/pro/features/gdpr-and-fixmystreet-pro/">GDPR and FixMyStreet Pro</a></li>
+ <li id="menu-item-35" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-35"><a href="https://www.fixmystreet.com/pro/features/accessible/">Accessible</a></li>
+ <li id="menu-item-31" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-31"><a href="https://www.fixmystreet.com/pro/features/privacy/">Privacy</a></li>
+ </ul>
+ </li>
+ <li id="menu-item-36" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-36"><a href="https://www.fixmystreet.com/pro/how-to-buy/">How to buy</a></li>
+ <li id="menu-item-800" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-800"><a href="https://www.fixmystreet.com/pro/blog/">Blog</a></li>
+ </ul>
+ </nav>
+ </div>
+ </header>
+ <div class="page-wrapper page-wrapper--pro">
+ <div class="page">
+ <div class="main-content-column">
+ {{ content }}
+ </div>
+ <div class="secondary-content-column">
+ <div class="print-controls">
+ <a href="/pro-manual/print/" class="btn btn-primary">Print this guide</a>
+ </div>
+
+ <nav class="sidebar">
+ <ul>
+ <li><a href="/pro-manual/">What is FixMyStreet Pro?</a></li>
+ <li><a href="/pro-manual/citizens-experience/">The Citizens Experience</a></li>
+ <li><a href="/pro-manual/staff-user-accounts/">Staff User Accounts</a></li>
+ <li><a href="/pro-manual/admin-tasks/">Administrator Tasks</a>
+ <ul>
+ <li><a href="/pro-manual/admin-tasks/#navigating-as-pro-staff">Navigating FixMyStreet Pro as a staff user</a></li>
+ <li><a href="/pro-manual/admin-tasks/#viewing-reports-your-area">Viewing all reports in your area</a></li>
+ <li><a href="/pro-manual/admin-tasks/#defining-area-interest">Defining the area of interest</a></li>
+ <li><a href="/pro-manual/admin-tasks/#view-report-specific-area">Viewing a report in a specific area</a></li>
+ <li><a href="/pro-manual/admin-tasks/#filtering-sorting-reports">Filtering and sorting reports</a></li>
+ <li><a href="/pro-manual/admin-tasks/#view-single-report">Viewing a single report</a></li>
+ <li><a href="/pro-manual/admin-tasks/#search-report">Searching for a report</a></li>
+ <li><a href="/pro-manual/admin-tasks/#search-user">Searching for a user</a></li>
+ <li><a href="/pro-manual/admin-tasks/#editing-users-information">Editing a user’s information</a></li>
+ <li><a href="/pro-manual/admin-tasks/#view-reports-non-staff-user">Viewing reports as a non-staff user</a></li>
+ <li><a href="/pro-manual/admin-tasks/#create-reports-behalf-user">Creating reports on behalf of another user</a></li>
+ <li><a href="/pro-manual/admin-tasks/#deal-undesirable-content">Dealing with undesirable content</a></li>
+ <li><a href="/pro-manual/admin-tasks/#correct-reporter-errors">Correcting reporter errors</a></li>
+ <li><a href="/pro-manual/admin-tasks/#keep-report-maker-informed">Keeping the report-maker informed</a></li>
+ <li><a href="/pro-manual/admin-tasks/#prioritising-tasks">Prioritising tasks</a></li>
+ <li><a href="/pro-manual/admin-tasks/#working-with-shortlists">Working with shortlists</a></li>
+ <li><a href="/pro-manual/admin-tasks/#viewing-editing-reports-offline">Viewing and editing reports offline</a></li>
+ <li><a href="/pro-manual/admin-tasks/#adminstrating-staff-accounts">Administrating staff accounts</a></li>
+ <li><a href="/pro-manual/admin-tasks/#creating-editing-categories">Creating and editing categories</a></li>
+ <li><a href="/pro-manual/admin-tasks/#creating-editing-priorities">Creating and editing priorities</a></li>
+ <li><a href="/pro-manual/admin-tasks/#creating-editing-response-templates">Creating and editing response templates</a></li>
+ <li><a href="/pro-manual/admin-tasks/#view-statistics">Viewing statistics</a></li>
+ </ul>
+ </li>
+ </ul>
+ </nav>
+ </div>
+ </div>
+ </div>
+<div class="site-footer mysoc-footer">
+ <div class="container">
+ <div class="site-footer__primary">
+ <div class="footer-widget-area">
+ <span class="hidden">Footer Contact Details</span><div class="textwidget custom-html-widget"><ul class="list-inline">
+<li><a href="mailto:enquiries@fixmystreet.com">enquiries@fixmystreet.com</a></li>
+<li><a href="tel:+442032879859">020 3287 9859</a></li>
+</ul></div> </div>
+ <nav class="menu-footer-menu-container">
+ <ul id="menu-footer-menu" class="footer-nav-menu list-inline">
+ <li id="" class="menu-item menu-item-type-post_type menu-item-object-page"><a href="/pro-manual/">User guide</a></li>
+ <li id="menu-item-261" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-261"><a href="https://www.fixmystreet.com/pro/contact/">Contact</a></li>
+ <li id="menu-item-51" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-51"><a href="https://www.mysociety.org/subscribe/">Newsletter</a></li>
+ <li id="menu-item-282" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-282"><a href="https://www.fixmystreet.com/pro/features/privacy/">Privacy</a></li>
+ </ul>
+ </nav>
+ </div>
+ <hr class="mysoc-footer__divider" role="presentation">
+ <div class="row">
+ <div class="col-sm-4">
+ <a href="https://www.mysociety.org?utm_source=fixmystreet.com/pro&amp;utm_content=footer+logo&amp;utm_medium=link&amp;utm_campaign=mysoc_footer" class="mysoc-footer__org__logo mysoc-footer__org__logo--mysociety">mySociety</a>
+ </div>
+ <div class="col-sm-6">
+ <div class="mysoc-footer__legal">
+ <p>
+ mySociety Limited is a project of UK Citizens Online Democracy,
+ a registered charity in England and Wales. For full details visit
+ <a href="https://www.mysociety.org?utm_source=fixmystreet.com/pro&amp;utm_content=footer+full+legal+details&amp;utm_medium=link&amp;utm_campaign=mysoc_footer">mysociety.org</a>.
+ </p>
+ </div>
+ </div>
+ <div class="col-sm-2">
+ <ul class="mysoc-footer__badges">
+ <li role="presentation"><a href="https://github.com/mysociety/" class="mysoc-footer__badge mysoc-footer__badge--github">Github</a></li>
+ <li role="presentation"><a href="https://twitter.com/fixmystreet/" class="mysoc-footer__badge mysoc-footer__badge--twitter">Twitter</a></li>
+ <li role="presentation"><a href="https://www.facebook.com/fixmystreet" class="mysoc-footer__badge mysoc-footer__badge--facebook">Facebook</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+</div>
+
+</body>
+</html>
diff --git a/docs/_plugins/incremental_regeneration_fixer.rb b/docs/_plugins/incremental_regeneration_fixer.rb
new file mode 100644
index 000000000..f138c37bc
--- /dev/null
+++ b/docs/_plugins/incremental_regeneration_fixer.rb
@@ -0,0 +1,51 @@
+module IncrementalRegenerationFixer
+ def IncrementalRegenerationFixer.init(site)
+ if site.regenerator.disabled?
+ return
+ end
+
+ # This is a fix for the following bug:
+ #
+ # https://github.com/jekyll/jekyll/issues/4112
+ #
+ # To work around it, we'll remember groups of interdependent files;
+ # if any of the files in a group changes, we'll make sure to
+ # regenerate *all* the files in that group.
+ interdependent_files = []
+
+ config = site.config['incremental_regeneration_fixer']
+ if not config
+ raise ("You probably want to specify incremental_regeneration_fixer " +
+ "config if you want to use this plugin")
+ end
+
+ globs = config['interdependent_files']
+ if not globs
+ return
+ end
+
+ for glob in globs
+ group = Dir["#{site.source}/#{glob}"]
+ if group.length == 0
+ raise ("The path '#{glob}' contains no files! Please fix " +
+ "interdependent_files in your site's _config.yml.")
+ end
+ interdependent_files << group
+ end
+
+ for group in interdependent_files
+ for srcfile in group
+ if site.regenerator.modified? srcfile
+ for dependent_file in group
+ site.regenerator.force dependent_file
+ end
+ break
+ end
+ end
+ end
+ end
+end
+
+Jekyll::Hooks.register :site, :post_read do |site|
+ IncrementalRegenerationFixer.init(site)
+end
diff --git a/docs/_posts/2012-02-06-an-introduction.md b/docs/_posts/2012-02-06-an-introduction.md
new file mode 100644
index 000000000..f0633b0eb
--- /dev/null
+++ b/docs/_posts/2012-02-06-an-introduction.md
@@ -0,0 +1,33 @@
+---
+layout: post
+title: An Introduction
+author: struan
+---
+
+[mySociety](https://www.mysociety.org/) wrote
+[FixMyStreet](https://www.fixmystreet.com/) in 2007 in order to make it easy for
+people in the UK to report problems in their area. Since then over
+[200,000 problems](https://www.mysociety.org/2012/01/24/fixmystreet-another-big-number/)
+have been reported to UK councils using the site. As with all our
+sites we want people everywhere to be able to benefit so we were delighted to
+work with the Norwegian Unix User’s Group ([NUUG](http://www.nuug.no))
+last year to set up a [FixMyStreet in Norway](http://www.fiksgatami.no/).
+
+We want to build on that and help more people around the world install their
+own copy of FixMyStreet. In the months since
+[FiksGataMi](http://www.fiksgatami.no/) was launched we&#8217;ve made a number
+of changes to FixMyStreet to make it easier to install and customise for other
+countries. We&#8217;ve rewritten much of the code to use the
+[Catalyst](http://www.catalystframework.org/) web framework which has
+helped make it easier to customise and we&#8217;re now improving the
+documentation and ironing out the installation procedure.
+
+However, we know that easy to install code is only part of the process.
+Building a community around the software is far more valuable in encouraging
+people to use and improve it. This site and the new
+[mailing list](https://groups.google.com/a/mysociety.org/forum/#!forum/fixmystreet)
+are our first steps along that road.
+
+So, if you&#8217;ve ever wanted to have a FixMyStreet for your town, state or
+country then join the mailing list and we&#8217;ll help you along the way.
+
diff --git a/docs/_posts/2012-07-27-default-workings.md b/docs/_posts/2012-07-27-default-workings.md
new file mode 100644
index 000000000..ce89b3f4a
--- /dev/null
+++ b/docs/_posts/2012-07-27-default-workings.md
@@ -0,0 +1,43 @@
+---
+layout: post
+title: Default Workings
+author: matthew
+---
+
+In the past few weeks, a number of improvements have been made to the
+FixMyStreet default set up, so that installation should provide you with a
+working setup more easily and quickly, before you get on and make all the
+necessary customisations you will want to for the service you are setting up.
+
+Firstly, we've tidied and consolidated the documentation on to this site,
+putting everything you need in one place. We are using GitHub pages, which means
+that the documentation is bundled along with the repository when checking out,
+which might be useful. The installation guide now includes help for installing
+on Mac OS X, and various other tweaks and improvements.
+
+Next, the codebase now automatically defaults to
+[OpenStreetMap](http://www.openstreetmap.org/) maps and geocoding &ndash; these are
+available, with more or less data, everywhere in the world, so you should be
+able to test your installation and see working maps.
+
+Whilst an installation of [MapIt](http://global.mapit.mysociety.org/) may be
+necessary for your FixMyStreet to work as you want &ndash; mapping locations picked to
+the right authority might need some private boundary data, for example &ndash; the
+code will now default to work as if everywhere is one administrative area.
+
+The code for sending reports has been refactored and modularised, enabling
+proprietary options to be more easily added alongside the standard email,
+Open311, and so on.
+
+We have removed any UK specific code from the default cobrand, moving it to
+a UK cobrand (which is then in turn inherited by the various council cobrands
+we have made in the UK). This should mean that you find you have less to override,
+and more things should work by default.
+
+![Default screenshot](/assets/img/2012-07-27-screenshot.png)
+
+Lastly, the default cobrand now uses the new style that you can see on
+<https://www.fixmystreet.com>. By default, we have picked a pretty yet garish
+colour scheme, in order to remind you that you almost certainly want to change
+the colours being used for your own installation :)
+
diff --git a/docs/_posts/2012-08-17-improving-configuration.md b/docs/_posts/2012-08-17-improving-configuration.md
new file mode 100644
index 000000000..12ce5e34f
--- /dev/null
+++ b/docs/_posts/2012-08-17-improving-configuration.md
@@ -0,0 +1,27 @@
+---
+layout: post
+title: Improving Configuration
+author: matthew
+---
+
+Now that a default install is a bit more straightforward to set up, our
+thoughts turn to improving the customistation of that default install.
+Currently, apart from the options already present in the main configuration
+file, that involves knowing a bit of Perl, in order to create a Cobrand .pm
+file containing the various customistations. So to reduce that dependency,
+we've moved a number of these options into the main configuration file, so that
+hopefully a standard customisation might not need a Cobrand .pm file at all.
+
+These changes range from simple text strings that are now in templates, through
+to specifying what areas from MapIt you are interested in, or what languages
+the site is available in. The general.yml-example file contains information on
+each option, and we've updated our [customisation documentation](/customising/)
+as well.
+
+Also, thanks to some testing of a current installation by
+[Anders](https://github.com/kagee) for FiksGataMi, we've made more incremental
+improvements to the installation, including fixing a couple of tests that
+shouldn't run unless your configuration is set up in a particular way, making
+sure inherited cobrands use the best templates, and including the
+Catalyst::Devel module so running the development server is easier.
+
diff --git a/docs/_posts/2012-10-02-easy-install.md b/docs/_posts/2012-10-02-easy-install.md
new file mode 100644
index 000000000..b047b1f71
--- /dev/null
+++ b/docs/_posts/2012-10-02-easy-install.md
@@ -0,0 +1,34 @@
+---
+layout: post
+title: Easy Installation
+author: matthew
+---
+
+Four months ago, someone raised [a
+ticket](https://github.com/mysociety/fixmystreet/issues/302) on FixMyStreet's
+GitHub account, asking for alternative ways of setting up an installation.
+We certainly agreed this was a good idea, as we're well aware that there
+are various different parts to FixMyStreet that might require quite a bit of
+knowledge in setting up.
+
+We're now pleased to announce that we have created an [AMI](/install/ami/)
+(Amazon Machine Image) containing an already set-up default installation of
+FixMyStreet. You can use this to create a running server on an Amazon EC2
+instance. If you haven't used Amazon Web Services before, then you can get a
+Micro instance free for a year.
+
+If you have your own server, then we have separately released the [install
+script](/install/install-script/) that is used to create the AMI, which can be
+run on any clean Debian or Ubuntu server to set everything up for you, from
+the PostgreSQL database to nginx.
+
+If you prefer to do things manually, and already know how to set up your
+database and web server, our [manual documentation](/install/) is still
+available.
+
+An AMI and install script is also available for MapIt -- see our
+[MapIt documentation](http://mapit.poplus.org/) for more details.
+This should make it very straightforward to get something set up for testing
+and development.
+
+Do let us know how you get on.
diff --git a/docs/_posts/2013-02-22-bodies.md b/docs/_posts/2013-02-22-bodies.md
new file mode 100644
index 000000000..1d65640eb
--- /dev/null
+++ b/docs/_posts/2013-02-22-bodies.md
@@ -0,0 +1,43 @@
+---
+layout: post
+title: Version 1.1 - Bodies
+author: matthew
+---
+
+<img class="r" src="/assets/posts/big-head-small.jpeg" width="320" height="240" alt="Big Beautiful Face Statue in Tenerife by epSos.de">
+
+Today we're releasing **version 1.1** of the FixMyStreet platform. The [AMI](/install/ami/) has
+been updated and the [install script](/install/install-script/) will automatically now install
+this version.
+
+The main change since version 1.0 is the addition of **bodies**. Historically,
+FixMyStreet has assumed that the administrative areas that are returned from
+MapIt are the same thing as the bodies to which the reports will be sent. This
+has led over time to a number of workarounds when this hasn't been the case,
+either in manual code changes in FixMyStreet or by adding new types to a MapIt
+install, and dealing with it in that way.
+
+We have updated the code so that FixMyStreet holds its own records of bodies to
+which reports can be sent, and the MapIt area -- or areas -- that they cover.
+This is conceptually much clearer, as well as making it much easier to have a
+body covering multiple areas, an area with multiple bodies, or a combination.
+
+Smaller functional changes in this release include admin improvements (it now
+looks like the front end site, and has add a number of other additions), and a
+couple of new configuration variables, `DO_NOT_REPLY_EMAIL` and
+`SEND_REPORTS_ON_STAGING`, to make debugging a little easier, along with a
+`--debug` option to send-reports. Also, we found on the [mailing
+list](/community/) a couple of times that people ran into trouble because their
+MapIt had debug turned on, and FixMyStreet didn't cope well with the debug
+output MapIt included in its responses. This has now been fixed.
+
+Many others of the commits in the past few months have been for various
+installations of the codebase, from the forthcoming FixMyBarangay in the
+Philippines to local UK council installs such as Oxfordshire or Bromley. These
+have in many cases led to small improvements and bugfixes to the central
+codebase, which can then be used by any reusers of the code.
+
+Lastly, all the strings in the JavaScript are now translatable, along with a
+few other strings that had previously been missed; do let us know if you
+find any other strings that can't be translated and we'll look into it.
+
diff --git a/docs/_posts/2013-05-03-v1.2.md b/docs/_posts/2013-05-03-v1.2.md
new file mode 100644
index 000000000..7d839a41e
--- /dev/null
+++ b/docs/_posts/2013-05-03-v1.2.md
@@ -0,0 +1,34 @@
+---
+layout: post
+title: Version 1.2
+author: matthew
+---
+
+<a href="http://www.flickr.com/photos/rbm/100165557/" title="broken lamp post by Rob Mac, on Flickr"><img class="r" src="http://farm1.staticflickr.com/28/100165557_6aff9acd7b.jpg" width="375" height="500" alt="broken lamp post"></a>
+
+Today we're releasing **version 1.2** of the FixMyStreet platform. The
+[AMI](/install/ami/) has been updated and the [install
+script](/install/install-script/) will automatically now install this version.
+
+The main items in this release are things prompted by requests on [our mailing
+list](/community/) :-)
+
+* Postfix is now installed as part of the install script, or in the AMI. This
+ means email should work out of the box. For anyone already installed, you can
+ run the commands in [the GitHub ticket](https://github.com/mysociety/fixmystreet/issues/412).
+
+* A new configuration option `MAPIT_ID_WHITELIST` has been added, to restrict
+ usage to the IDs specified, if given. This means Claudio, who emailed last
+ week, could have `[ 239540 ]` as his `MAPIT_ID_WHITELIST`, and then reports
+ could only be made within the Marche region of Italy. We already use this new
+ option ourselves on https://www.zueriwieneu.ch/ where before it was
+ hard-coded in the code.
+
+* Other things include being able to zoom in further on OSM maps, and HTML
+ pages are now being gzipped.
+
+Lastly, as you can see this site has had a redesign to make it more friendly,
+and we've added some more documentation about e.g. updating an AMI instance to
+a newer version. If there's anything unclear, please do [ask on the mailing
+list](/community/) or submit an issue or pull request on GitHub.
+
diff --git a/docs/_posts/2013-11-25-v1.3.md b/docs/_posts/2013-11-25-v1.3.md
new file mode 100644
index 000000000..c94a63d79
--- /dev/null
+++ b/docs/_posts/2013-11-25-v1.3.md
@@ -0,0 +1,44 @@
+---
+layout: post
+title: Version 1.3
+author: matthew
+---
+
+<a href="http://www.flickr.com/photos/jasonbacon/2281783615/" title="Yosemite tunnel tonemapped in qtpfsgui by nineball2727, on Flickr"><img class="r" src="http://farm3.staticflickr.com/2252/2281783615_d1cb6f7ccd.jpg" width="500" height="339" alt="Yosemite tunnel tonemapped in qtpfsgui"></a>
+
+**Version 1.3** of FixMyStreet is now out :-) The [install
+script](/install/install-script/) and [AMI](/install/ami/) are both updated to
+this version.
+
+I realise I haven't posted here with each point release during version 1.2,
+sorry. You can see the changes in each release here on GitHub at
+[https://github.com/mysociety/fixmystreet/releases](https://github.com/mysociety/fixmystreet/releases) and below is a list of all
+the main things that have changed since version 1.2 (* means new since the
+last version, 1.2.6, if you were keeping track):
+
+* OpenLayers upgraded to 2.13.1, giving e.g. animated zooming
+* A fully functional Google Maps layer via OpenLayers
+* *\** If you only specify one cobrand in the configuration file, the site will
+ always use it, rather than only if your hostname also matches. This is
+ probably what you would expect to happen!
+* *\** A contact can be given multiple email addresses
+* *\** A body can be marked as deleted, and then it will not be used by the
+ front end at all
+* The admin interface has had a lot of inline documentation, hints and notices
+ added, along with a page showing the site's current configuration
+* *\** The admin interface has some feature additions from coding volunteers,
+ such as a date picker on the stats page thanks to Andrew Black, and searching
+ by external ID thanks to Andy Lulham
+* We've added an example Vagrantfile and improved the install scripts
+* *\** The test suite should now run regardless of the contents of your
+ configuration file
+* Translation improvements - some better wording of strings, some missed or
+ UK-only URLs/translations (thanks Jonas and Rikard), and a fix for the
+ long-standing issue where multiline strings were not being translated
+ (hooray)
+* *\** Bug fixes, most notably sometimes when changing report state in the admin
+ interface, and an issue with the bottom navbar in Chrome (which we've
+ reported to the Chromium project)
+
+As always, do [ask on the mailing list](/community/) if you'd like more
+information on any of the above, or submit an issue or pull request on GitHub.
diff --git a/docs/_posts/2014-05-23-v1.4.md b/docs/_posts/2014-05-23-v1.4.md
new file mode 100644
index 000000000..626312bcc
--- /dev/null
+++ b/docs/_posts/2014-05-23-v1.4.md
@@ -0,0 +1,34 @@
+---
+layout: post
+title: Version 1.4
+author: matthew
+---
+
+<div class="r" align="right"><a href="https://www.flickr.com/photos/rozabbotts/6675291613/" title="Yellow by RozSheffield on Flickr"><img src="https://farm8.staticflickr.com/7154/6675291613_3d4764abc5.jpg" width="379" height="500" alt="Yellow"><br>Yellow by RozSheffield on Flickr</a></div>
+
+Say hello to **version 1.4** of FixMyStreet. As usual, the [install
+script](/install/install-script/) and [AMI](/install/ami/) have both been
+updated to this version.
+
+Hopefully this release will run more smoothly on EC2 micro instances, with some
+cron rejigging to alleviate memory problems.
+
+There have been a few minor user-facing improvements, such as automatically
+selecting the reporting category if there's only one choice, and removing the
+indenting of emails; some bug fixes, including changes for the new version of
+Debian, a problem with language setting in email alerts, and removal of cached
+photos; and a number of improvements for people reusing the code, including a
+no-op send method, having reports on staging sites be sent to the reporter,
+adding an external URL field to bodies, and making it easier to change the pin
+icons.
+
+See the full changes over on GitHub at
+[https://github.com/mysociety/fixmystreet/releases](https://github.com/mysociety/fixmystreet/releases).
+
+Thanks to Andy Lulham, Chris Mytton, Dave Arter, Dave Whiteland, Gerald, Hakim
+Cassimally, Ian Chard, Jon Kristensen, Jonas Oberg, Kindrat, Matthew
+Somerville, Rikard, Steven Day, and Struan Donald for contributing to this
+release.
+
+As always, do [ask on the mailing list](/community/) if you'd like more
+information on any of the above, or submit an issue or pull request on GitHub.
diff --git a/docs/_posts/2014-07-15-v1.4.2.md b/docs/_posts/2014-07-15-v1.4.2.md
new file mode 100644
index 000000000..72cd43528
--- /dev/null
+++ b/docs/_posts/2014-07-15-v1.4.2.md
@@ -0,0 +1,25 @@
+---
+layout: post
+title: Version 1.4.2
+author: matthew
+---
+
+<div class="r" align="right"><a href="https://www.flickr.com/photos/theenmoy/8372727576/" title="Bicycle Rack by Theen Moy on Flickr"><img src="https://farm9.staticflickr.com/8083/8372727576_75d392409c.jpg" width="500" height="375" alt="Bicycle Rack"><br>Bicycle Rack by Theen Moy on Flickr</a></div>
+
+We’ve released **version 1.4.2**, a maintenance release, but also with a couple
+of new features. The main reason for this release was to fix a couple of issues
+with the installation script, which are hopefully now resolved. It also
+upgrades our bundled copy of `cpanm` (to cope better when an external module
+website is down), tidies up the template structure, copes with browser autofill
+on the `/auth` sign in page, and adds links from the All Reports page to a
+body’s open or fixed reports.
+
+The main new feature is the addition of SMTP username/password and SSL/TLS
+options for your setup. You can read about the new options on
+[the configuration settings page](/customising/config/#smtp_smarthost)
+
+See the full changes over on GitHub at
+[https://github.com/mysociety/fixmystreet/releases](https://github.com/mysociety/fixmystreet/releases).
+
+As always, do [ask on the mailing list](/community/) if you'd like more
+information on any of the above, or submit an issue or pull request on GitHub.
diff --git a/docs/_posts/2014-11-20-v1.5.md b/docs/_posts/2014-11-20-v1.5.md
new file mode 100644
index 000000000..69ffefb46
--- /dev/null
+++ b/docs/_posts/2014-11-20-v1.5.md
@@ -0,0 +1,39 @@
+---
+layout: post
+title: Version 1.5
+author: matthew
+---
+
+<div class="r" align="right">
+<a href="https://www.flickr.com/photos/shutupyourface/5545353603" title="Resting Tahr 2 by Jason Armstrong, on Flickr"><img src="https://farm6.staticflickr.com/5091/5545353603_71e3822ce9.jpg" width="500" height="303" alt="Resting Tahr 2"><br>Resting Tahr by Jason Armstrong on Flickr</a>
+</div>
+
+We’ve released **version 1.5** of FixMyStreet. This version fully supports the
+new Long Term Support (LTS) version of Ubuntu, Trusty Tahr 14.04 (the code did
+already run fine on Ubuntu Trusty if you set it up manually, but now the
+install script will work and a few other bits have been tidied).
+
+This release comes with a few improvements to the admin interface, including
+pagination of search results, validation of new categories, and some display
+enhancements.
+
+We've moved the map sidebar to be flush with the window edge, which we think is
+simpler and easier on the eye, and we've continued making the template
+structure easier to change and override.
+
+We've also fixed some bugs, such as map submission not working with JavaScript
+disabled or unavailable. As another example, we had a report of the Android
+browser crashing when showing a map page, which we tracked down to the slightly
+transparent map navigation controls – crashing wasn't worth this, so now on
+mobile they're fully opaque.
+
+From [Transifex](https://www.transifex.com/projects/p/fixmystreet/) we've added
+four new languages (as well as updating the existing ones):
+Albanian, Bulgarian, Hebrew, and Ukranian.
+
+See the full changes
+[over on GitHub](https://github.com/mysociety/fixmystreet/releases).
+
+As always, do [ask on the mailing list](/community/) if you'd like more
+information on any of the above, or submit an issue or pull request on GitHub.
+
diff --git a/docs/_posts/2015-03-18-v1.5.4.md b/docs/_posts/2015-03-18-v1.5.4.md
new file mode 100644
index 000000000..a7c6cd414
--- /dev/null
+++ b/docs/_posts/2015-03-18-v1.5.4.md
@@ -0,0 +1,27 @@
+---
+layout: post
+title: Version 1.5.4
+author: matthew
+---
+
+<div class="r" align="right">
+<a href="https://www.flickr.com/photos/alanvernon/6131124997" title="Female Yellow Warbler by Alan Vernon, on Flickr"><img src="https://farm7.staticflickr.com/6061/6131124997_f9e893b37c.jpg" width="500" height="333" alt="Female Yellow Warbler"><br>Female Yellow Warbler by Alan Vernon on Flickr</a>
+</div>
+
+We’ve released **version 1.5.4** of FixMyStreet.
+
+This includes a couple of new map layers, Bing Maps and Stamen's
+[toner-lite](http://maps.stamen.com/toner-lite/), and nicer confirmation pages
+for after you've made a report or update, along with other smaller improvements
+and bug fixes. See the full list of changes
+[over on GitHub](https://github.com/mysociety/fixmystreet/releases).
+
+For developers, it includes a few small improvements, to do with Mac
+installation, making some things optional, and including a new configuration
+variable for if you're running behind an SSL proxy. We've also added some test
+URLs so that you can view confirmation pages without having to leave a new
+report or update, e.g. see it in action on fixmystreet.com:
+[https://www.fixmystreet.com/P/\_test\_](https://www.fixmystreet.com/P/_test_).
+
+As always, do [ask on the mailing list](/community/) if you'd like more
+information on any of the above, or submit an issue or pull request on GitHub.
diff --git a/docs/_posts/2015-07-10-v1.5.5.md b/docs/_posts/2015-07-10-v1.5.5.md
new file mode 100644
index 000000000..b82c55738
--- /dev/null
+++ b/docs/_posts/2015-07-10-v1.5.5.md
@@ -0,0 +1,50 @@
+---
+layout: post
+title: Version 1.6
+author: matthew
+---
+
+<div class="r" align="right">
+<a data-flickr-embed="true" href="https://www.flickr.com/photos/caffeina/2079673826/" title="security"><img src="https://farm3.staticflickr.com/2065/2079673826_c4edb07e4d.jpg" width="500" height="333" alt="security"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>
+</div>
+
+We’ve released **version 1.6** of FixMyStreet (previously numbered 1.5.5).
+
+This release includes important security fixes:
+
+* A vulnerability in login email sending that could allow an account to
+ be hijacked by a third party;
+* Alterations to token logging in and timeout behaviour;
+* A dependency update to fix an issue with Unicode characters in passwords.
+
+More details on those items below. Other items in this release include a
+Chinese translation, a bug fix with shrunken update photos, and some front end
+improvements, such as a ‘hamburger’ menu icon and an easier Report button on
+mobile, and resized map pins based on zoom level.
+
+See the full list of changes
+[over on GitHub](https://github.com/mysociety/fixmystreet/releases).
+
+Security fixes
+--------------
+
+**Login email account hijacking:**
+Due to the way parameters were passed into the token table in the database, it
+was possible for someone to request a login email for one email address, but
+have the login email sent to different address. This would allow a third party
+to log in as someone else, letting them make reports or updates as that person.
+
+The code has been rewritten so all user parameter passing goes through central
+functions that return only one parameter even if the user has passed multiple
+parameters. [More details of this class of vulnerability](http://blog.gerv.net/2014/10/new-class-of-vulnerability-in-perl-web-applications/).
+
+**Email authentication tokens:**
+Problem confirmation tokens had to be used within a month; this now applies to
+all confirmation tokens, and email sign in tokens are valid for a day. Using
+those tokens after confirmation will redirect correctly, but no longer log you
+in; links in alert emails will no longer log you in.
+
+**Unicode characters in passwords:**
+The package our code uses to encode database columns,
+DBIx::Class::EncodedColumn, could have issues with Unicode characters provided
+to it. This was fixed by upgrading the version we use.
diff --git a/docs/_posts/2015-07-31-v1.6.1.md b/docs/_posts/2015-07-31-v1.6.1.md
new file mode 100644
index 000000000..fdf7544d6
--- /dev/null
+++ b/docs/_posts/2015-07-31-v1.6.1.md
@@ -0,0 +1,22 @@
+---
+layout: post
+title: Version 1.6.1
+author: matthew
+---
+
+<div class="r" align="right">
+<a data-flickr-embed="true" href="https://www.flickr.com/photos/bmiphone/5488751401/" title="Copenhagen trip"><img src="https://farm6.staticflickr.com/5052/5488751401_fe5bc84a49.jpg" width="500" height="333" alt="Copenhagen trip"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>
+</div>
+
+We’ve released **version 1.6.1** of FixMyStreet.
+
+This release fixes a bug introduced in the previous release when setting
+multiple areas for a body in the administration interface.
+
+It also includes improvements to the All Reports page, adding a fixed header
+and tooltips, and stops the sidebar running over the footer on alerts pages.
+The admin gets a variety of minor improvements, with better internal linking
+and a mark as sent button. Plus a Danish translation :)
+
+As ever, see the full list of changes
+[over on GitHub](https://github.com/mysociety/fixmystreet/releases).
diff --git a/docs/_posts/2015-10-23-v1.7.md b/docs/_posts/2015-10-23-v1.7.md
new file mode 100644
index 000000000..98035a921
--- /dev/null
+++ b/docs/_posts/2015-10-23-v1.7.md
@@ -0,0 +1,39 @@
+---
+layout: post
+title: Version 1.7
+author: matthew
+---
+
+<div class="r" align="right">
+<a data-flickr-embed="true" href="https://www.flickr.com/photos/flyingturtle/837938254/" title="yellow lines"><img src="https://farm2.staticflickr.com/1074/837938254_c4ecb36323.jpg" width="500" height="375" alt="yellow lines"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>
+</div>
+
+We’ve released **version 1.7** of FixMyStreet.
+
+This version adds some new features. First off is that the FixMyStreet design
+is now *bi-directional*, providing an easy switch to flip the design to either
+left-to-right or right-to-left. This was done with the kind support of the
+National Democratic Institute.
+
+We have added *state and category filters* to the list pages, letting users
+view only e.g. open reports in the potholes category, or all reports in the
+graffiti category. Various design improvements have been made, including the
+showing of the report on a questionnaire page and the email confirmation pages,
+and we've added a nicer default OpenGraph image.
+
+Database *performance* has been improved in a number of areas, and the
+accessibility of the map pages has been improved.
+
+This release also fixes a number of small *bugs*, including translating report
+states in the admin index, dealing with DMARC email issues, and fixes for
+Google Maps API users.
+
+For *developers*, we've made it easier to run gettext-extract if you're
+performing your own translations, removed some confusing warnings, finally
+removed the final few hardcoded "FixMyStreet" strings so it's easy to rename
+your site, streamlined the navigation menu and list item CSS using a BEM style
+naming scheme so it is easy to change and override, and lastly fixed a long
+standing issue where errors were not always logged correctly.
+
+Plus quite a few other things; as always, see the full list of changes
+[over on GitHub](https://github.com/mysociety/fixmystreet/releases).
diff --git a/docs/_posts/2016-03-02-v1.8.md b/docs/_posts/2016-03-02-v1.8.md
new file mode 100644
index 000000000..c79172515
--- /dev/null
+++ b/docs/_posts/2016-03-02-v1.8.md
@@ -0,0 +1,37 @@
+---
+layout: post
+title: Version 1.8
+author: matthew
+---
+
+<div class="r" align="right">
+<a data-flickr-embed="true" href="https://www.flickr.com/photos/danbri/2520508005/" title="Thin yellow line"><img src="https://farm4.staticflickr.com/3078/2520508005_4d388294fc.jpg" width="500" height="334" alt="Thin yellow line"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>
+</div>
+
+We’ve released **version 1.8** of FixMyStreet.
+
+The two main new features in this release are *Facebook login* – provide a
+Facebook app ID and secret in your configuration and it will smoothly fit into
+the creation and login flow – and *multiple photo support*, along with a modern
+interface for previewing and uploading photos whilst you create your report.
+
+Smaller improvements include *highlighting the pin* when you hover over an item
+in the sidebar, and vice-versa; fixing some small display bugs such as how
+updates were displayed in Your Reports and preventing a chevron being stretched
+in Firefox; improving the look of the 404 page, and making sure you can see an
+update if you got to it via an in-page link.
+
+Memory *performance* has been improved, meaning cron jobs can take up to half
+as much memory, and this release also fixes a number of small bugs, including
+an embarrassing swap of latitude and longitude in the Google geocoder, making
+sure you're signed up for updates if you used the app and were logged in, and
+better internationalisation and display of numbers.
+
+For *developers*, we've added a generic static route handler, so that adding
+new static HTML pages to your installation involves only creating a new file in
+your template directory and nothing more; improved bounce handling; and fixed
+the cobrand restriction handling on Your Reports and list pages.
+
+Plus quite a few other things; as always, see the full list of changes
+[over on GitHub](https://github.com/mysociety/fixmystreet/releases).
+
diff --git a/docs/_posts/2016-03-23-v1.8.1.md b/docs/_posts/2016-03-23-v1.8.1.md
new file mode 100644
index 000000000..2e028761a
--- /dev/null
+++ b/docs/_posts/2016-03-23-v1.8.1.md
@@ -0,0 +1,22 @@
+---
+layout: post
+title: Version 1.8.1
+author: matthew
+---
+
+We’ve released **version 1.8.1** of FixMyStreet, which fixes some bugs and
+makes some improvements to the 1.8 release.
+
+Now there is multiple photo support, the display of those photos on a report
+page is now a bit nicer, and if there's an error message on photo upload it
+should now always be visible. Auto-scrolling of the sidebar when you hover over
+a pin has been removed as it was confusing, and the site now remembers a user's
+last anonymous state. Fixes have been made for running on more recent versions
+of Perl, one of which was causing the geocoder to break.
+
+For developers, an easier way of adding cobrand-specific custom reporting
+fields has been added.
+
+There are a couple of other minor changes; see the full list of changes
+[over on GitHub](https://github.com/mysociety/fixmystreet/releases).
+
diff --git a/docs/_posts/2016-05-03-v1.8.2.md b/docs/_posts/2016-05-03-v1.8.2.md
new file mode 100644
index 000000000..009cb856a
--- /dev/null
+++ b/docs/_posts/2016-05-03-v1.8.2.md
@@ -0,0 +1,30 @@
+---
+layout: post
+title: Version 1.8.2
+author: matthew
+---
+
+<div class="r" align="right">
+<a data-flickr-embed="true" href="https://www.flickr.com/photos/m0php/4001836593/" title="Security barrier"><img src="https://farm3.staticflickr.com/2553/4001836593_492263c6cd.jpg" width="500" height="332" alt="Security barrier"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>
+</div>
+
+We’ve released **version 1.8.2** of FixMyStreet, along with versions 1.7.1 and 1.6.2.
+
+These releases include an important security fix, whereby a malicious user
+could craft an image upload to the server that allowed them to run external
+commands as the user running the site. Please update your installation as soon
+as possible.
+
+Version 1.8.2 also contains other improvements and additions to existing
+features:
+
+* Twitter social login, alongside the existing Facebook login;
+* PNG and GIF image upload support;
+* Some development improvements, including the final merging of `base` and
+`fixmystreet` templates, storing any Open311 error in the database, and tidying
+up some unused cobrands;
+* A few bug fixes, such as showing the right body user form value for fixed
+reports (thanks Jon Kristensen).
+
+See the full list of changes
+[over on GitHub](https://github.com/mysociety/fixmystreet/releases).
diff --git a/docs/_posts/2016-06-03-v1.8.3.md b/docs/_posts/2016-06-03-v1.8.3.md
new file mode 100644
index 000000000..9544c4f89
--- /dev/null
+++ b/docs/_posts/2016-06-03-v1.8.3.md
@@ -0,0 +1,34 @@
+---
+layout: post
+title: Version 1.8.3
+author: matthew
+---
+
+<div class="r" align="right">
+<a data-flickr-embed="true" href="https://www.flickr.com/photos/freedomiiphotography/5987366229/" title="Passing Light"><img src="https://c6.staticflickr.com/7/6121/5987366229_ecd877f4d8.jpg" width="500" height="333" alt="Passing Light"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>
+</div>
+
+We’ve released **version 1.8.3** of FixMyStreet.
+
+For developers, the main improvement in this version is the great speed up to
+CSS compilation by moving from sass to libsass.
+
+We've fixed some map issues, getting the Google Maps layer working again and
+dealing with tap sensitivity on some devices.
+
+The admin interface gets a bit of love, adding common search boxes to the index
+page, allowing change of email to an existing address, and speeding up photo
+removal.
+
+### Upgrading notes
+
+If your templates aren't kept in the main repository, there are a couple of
+things to be aware of with this release:
+
+* If you've used the `cf` class, you'll need to rename it to `clearfix`.
+* If you have customised any of the email templates that use `<?=...?>` style
+ variables (e.g. alert emails, questionnaire, submit), you'll need to
+ rewrite them to use the standard `[%...%]` variables.
+
+See the full list of changes
+[over on GitHub](https://github.com/mysociety/fixmystreet/releases).
diff --git a/docs/_posts/2016-07-06-v1.8.4.md b/docs/_posts/2016-07-06-v1.8.4.md
new file mode 100644
index 000000000..de4a7d3fd
--- /dev/null
+++ b/docs/_posts/2016-07-06-v1.8.4.md
@@ -0,0 +1,23 @@
+---
+layout: post
+title: Version 1.8.4
+author: matthew
+---
+
+<div class="r" align="right">
+<a data-flickr-embed="true" href="https://www.flickr.com/photos/ennid/5999264663/" title="Yellow Line (Mumbai)"><img src="https://c8.staticflickr.com/7/6002/5999264663_9384176094.jpg" width="500" height="375" alt="Yellow Line (Mumbai)"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>
+</div>
+
+We’ve released **version 1.8.4** of FixMyStreet, along with versions 1.7.2 and 1.6.3.
+
+These releases include a security fix, closing two
+cross-site scripting (XSS) vulnerabilities. Please update
+your installation as soon as possible.
+
+Version 1.8.4 also contains other minor bug fixes, such as correctly
+orientating preview images, wrapping emails better for differing screen sizes,
+a bug with filter redirect when JavaScript wasn't available, a race condition
+when starting a new report, and a couple of display bugs in IE7.
+
+See the full list of changes
+[over on GitHub](https://github.com/mysociety/fixmystreet/releases).
diff --git a/docs/_posts/2016-11-15-v2.0.md b/docs/_posts/2016-11-15-v2.0.md
new file mode 100644
index 000000000..dfc430b5b
--- /dev/null
+++ b/docs/_posts/2016-11-15-v2.0.md
@@ -0,0 +1,120 @@
+---
+layout: post
+title: Version 2.0
+author: matthew
+---
+
+<div class="r" align="right">
+<a data-flickr-embed="true" href="https://www.flickr.com/photos/nauright/4676220337/" title="bureau of street traffic"><img src="https://c2.staticflickr.com/5/4057/4676220337_fd38770a98.jpg" width="500" height="313" alt="bureau of street traffic"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>
+</div>
+
+We’re proud to announce the release of **version 2.0** of FixMyStreet.
+
+This version contains a wide array of new features, including HTML email and
+multiple state/category filtering, a new admin user system with graduated
+permissions, and various bugfixes and development improvements.
+
+Over the next few days and weeks, we will be writing a series of blog posts,
+going into details about a number of the changes, which I hope will be of
+interest. But before then, do [set up the code](/overview/) or update your
+installation, and [ask us questions](/community/) :)
+
+## New front end features
+
+* <img src="/assets/posts/html-email-example.png" alt="" class="r">
+**HTML email:**
+There is now the option for all emails sent by FixMyStreet to be HTML formatted
+where previously they were plain text only. This includes confirmation and
+questionnaire emails to the user, and report emails to the public body. These
+emails include any image added to the report, plus a small static map of the
+problem's location.
+<br style="clear:both">
+
+* <img src="/assets/posts/multi-select.png" alt="" class="r">
+**State/category filtering and sorting of list pages:**
+When viewing a list of reports, you can now filter and sort them in pretty
+much any way you choose, including sorting by most- or least-recently updated,
+newest or oldest, or most commented. You can also select multiple categories
+or states (e.g. "fixed").
+<br style="clear:both">
+
+* <img src="/assets/posts/area-highlighting-after.jpeg" alt="" class="r">
+**Pretty area highlighting on body pages:**
+The highlighting of areas on a body page has been inverted, so that the
+unimportant parts of the map are shaded and you can interact more easily with
+reports on the page.
+<br style="clear:both">
+
+* **Users can now update their own email address**
+This was a frequent request from users and we're glad to report that they can
+now do it themselves on their account page.
+
+* <img src="/assets/posts/report-selected.png" alt="" class="r">
+**Performance improvements:**
+When looking at reports from a list page, the other report pins stay visible so
+that it is easier to switch between them. The report itself is being pulled in
+behind the scenes, meaning the whole page does not need to reload. The map no
+longer extends underneath the sidebar and header, which makes things easier,
+and a scroll wheel can now zoom the map in and out.
+<br style="clear:both">
+
+* <div class="r" style="height:280px;overflow:auto"><img src="/assets/posts/new-reporting-form.png" alt=""></div>
+**Making privacy options clearer:**
+The reporting form has been separated into public and private sections, to make
+it clearer which parts of what you provide will be made visible on the site.
+
+ **Showing the relevant recipient:** If you live in an area where there's
+more than one body, the category you pick normally dictates which body we send
+your report to. Now, when you select the category we update the name of the
+body given at the top of the report page, if we know that the report will be
+sent there.
+<br style="clear:both">
+
+## New admin user system
+
+Admin users can now use the same log-in right across the site - whether they're
+making a report like a standard user, or logging in to make edits and moderate
+the site.
+
+In the past, the distinction between admin and other users was black and white.
+As an admin user, you had access to every part of the site, but users can now be
+given individual permissions for various layers of access. These include:
+
+* **Proxy users** This layer grants the ability to create a report or update on
+ behalf of a body, or as another user. We envisage this being useful in a
+ body's contact centre, where they receive a report over a phone and enter it
+ into FixMyStreet as that user;
+* **Report editors** Giving the power to edit a report's category, state, or
+ location. If the admin user changes the category, and that change means that
+ a different body is now responsible for the report, it will be re-sent;
+* **List makers**, who can compile their own shortlist of reports they wish to
+ go and inspect. This may be useful for a contractor or team who wishes to
+ compile the day's tasks;
+* **Quick responders** These users have access to response templates, allowing them
+ to edit and publish templated updates;
+* **Prioritisers** These users may set different priorities on reports;
+* **Trusted users** A simple reputation system, which e.g. potentially lets
+ reports from trusted users be actioned more quickly.
+
+The admin report edit form has also been greatly improved, including a map
+to update a report's location (and re-sending the report if the body changes),
+and much tidier layout.
+
+## Bugfixes and development changes
+
+Bugfixes include updating the top-level domain (TLD) list for email validation,
+hiding authorities which don't exist any more on the `/reports` page, and
+fixing the previously-broken photo preview display after form submission. We
+have dropped support for Internet Explorer 6.
+
+If you're a re-user of the codebase, there are a number of changes that will
+hopefully help you out. Geocoder results won't be cached in development, the
+`UPLOAD_DIR` and `GEO_CACHE` variables are now relative to the project root,
+we've added a server-side MapIt proxy, and you can add your own fields to the
+contact form. Open311 support has been tidied up and improved. If you run the
+tests, you can now run the test suite multiple times simultaneously, and the
+tests have been sped up quite a bit.
+
+Plus quite a few other things; as always, see the full list of changes
+[over on GitHub](https://github.com/mysociety/fixmystreet/releases).
+
diff --git a/docs/_posts/2016-11-29-v2.0-html-emails.md b/docs/_posts/2016-11-29-v2.0-html-emails.md
new file mode 100644
index 000000000..aa4791886
--- /dev/null
+++ b/docs/_posts/2016-11-29-v2.0-html-emails.md
@@ -0,0 +1,220 @@
+---
+layout: post
+title: Version 2.0 – HTML emails
+author: matthew
+---
+
+FixMyStreet sends a number of automated emails, both to users (confirmation
+emails, follow-up questionnaires) and to bodies (the reports themselves).
+Previously these were plain text, but we have now introduced HTML emails, with
+all the design possibilities that this implies.
+
+One reason for this is to make the site's communications look more
+professional; another is an attempt to minimise one of the most time-consuming
+admin tasks - dealing with users who reply to our automated emails.
+
+## Designing better emails
+
+In Version 2.0 we wanted to afford FixMyStreet emails the same design and
+usability attention that we normally spend on the FixMyStreet website.
+
+Incorporating feedback from our users, our support team, and our council
+partners, we quickly identified a few key places that HTML (graphical) emails
+could improve the FixMyStreet experience for everyone:
+
+1. **Attaching a map and photo** of each problem to our “Has your problem been
+ fixed?” questionnaire email, to help people remember the report we’re
+ asking about.
+1. **Styling calls to action as attractive, clickable buttons**, to make the
+ emails easier to quickly scan and comprehend, and to reduce user support
+ queries.
+1. **Using photos and a clearer typographical hierarchy** to make the area
+ alert emails easier to scan, especially when there are multiple new
+ problems in your chosen area.
+1. Letting our council partners and international reusers maintain their brand
+ image across the website and emails, by **easily customising the logo and
+ colour scheme** of emails sent to their users.
+
+The best way to see how we’ve improved FixMyStreet’s emails is to give
+FixMyStreet a try, and receive the emails yourself! Try
+[reporting a new problem near you](https://www.fixmystreet.com), or
+[subscribing to email alerts about new reports in your area](https://www.fixmystreet.com/alert).
+
+If you’d like to know *how* we implemented some of our more technical changes,
+read on…
+
+## Attaching the static map image
+
+One thing that we wanted to include in the email was a map showing the location
+of the report (be that the one you've just made, or the one you're receiving an
+alert or questionnaire for). The map that you see on the website is made up of
+many 256x256px tiles stitched together in HTML/CSS to appear as one smooth map,
+with separate pin images superimposed in the correct location; for the email,
+we needed just one image covering whatever portion of the map was necessary,
+plus the pin.
+
+![](/assets/posts/html-email-map-centre.png){: .r }
+
+This is the point at which FixMyStreet's
+[progressively-enhanced](https://gdstechnology.blog.gov.uk/2016/09/19/why-we-use-progressive-enhancement-to-build-gov-uk/)
+base came in very useful. If JavaScript does not work for whatever reason, the
+site has always displayed an alternative: a small map made up of four tiles in
+a square, with the pin located appropriately on top. It also makes sure that
+the pin location (the point at the bottom middle of the pin) is contained
+within the central half of the tiled map (the red dashed area in our image
+here), so that there's no chance the pin overlaps the edge of the map.
+
+This was perfect for the image to be used in an HTML email. The new static map
+function fetches the same data used by the front end, requests the tile data
+for those four tiles, stitches them together in one 512x512px image, composites the
+pin on top in the correct location, and then cuts off the bottom 128 and top 64
+pixels – as the pin's central location means those will always be pin-less. The
+image is then shrunk to 310px in width, providing output that looks like this,
+appearing in the top right hand corner of the email:
+
+<div style="text-align:center">
+<img src="/assets/posts/html-email-map.png" alt="">
+</div>
+
+## Inline images
+
+The new HTML email - whether they're reports, alerts, confirmations or
+questionnaires - normally have upwards of three images: the static map image,
+an image of the report (or repots for alert emails), and a site logo. We wanted
+to include all these images within the email itself, rather than use remote
+images, as due to spam many people have remote images switched off.
+
+We also wanted to keep things as simple as possible when including images in
+the email templates. Inline images in HTML emails use an image source of
+`cid:UNIQUE_ID` within the HTML (or CSS), and then give a particular attachment
+of the email the same `UNIQUE_ID` in its Content-ID header. Lastly, we may
+potentially also have normal attachments.
+
+We settled on an `inline_image` function in the template, which can be
+provided with either a path to an image file (for the static logo), or a
+function that returns image data and a content type (for the static map or
+report image). As the email template is processed, each call to this function
+generates a unique ID for the image and stores the information in a list to be
+added after the plain text/HTML email parts.
+
+There are a variety of ways to attach images to an email. Content types
+are used to identify what is contained by each part of the email. As well as
+the various types of image, and text/plain and text/html for the text and HTML
+parts, there are various containers: `multipart/alternative` as a container for
+parts containing the same information in different formats, `multipart/related`
+as a container for parts that are linked in some way, and `multipart/mixed` as
+a general container.
+
+The setups we decided on were as follows:
+
+* If the HTML email has no inline images or other attachments, then we create
+ a `multipart/alternative` email, containing the two textual parts.
+
+* If the HTML email has inline images but no other attachments (the most common
+ case), we create a `multipart/related` email, its first part being the
+ `multipart/alternative` as above, the subsequent parts the inline images.
+
+ An alternative here would be to create a `multipart/alternative` email, with its
+ first part being text, and its second part being `multipart/related` containing
+ the HTML part and the inline images. This would mean that an email client
+ that didn't support HTML email might only see the textual part and not any of
+ the images. If your inline images were not 'important' to the email (e.g. an
+ email footer signature) then this might be a way to go; we thought that the
+ map and image should be visible to all users if possible.
+
+* If the HTML email has attachments but no inline images,
+ we create a `multipart/mixed` email, its first part being the
+ `multipart/alternative` as above, the subsequent parts the attachments.
+
+* If the HTML email has both inline images and other attachments, then
+ we create a `multipart/mixed` email. Its first part is a `multipart/related`
+ email (that again contains `multipart/alternative` and the inline images),
+ and then its other attachments form the later parts of the mixed email. If
+ you imagine the parts as envelopes with brackets, it would look like this:
+
+ ```
+ multipart/mixed (
+ multipart/related (
+ multipart/alternative (
+ text/plain
+ text/html
+ )
+ image/jpeg
+ image/png
+ )
+ application/pdf
+ )
+ ```
+
+As part of this work, I discovered that the [oldest open
+GitHub](https://github.com/rails/rails/issues/2686) issue of the Rails
+framework was related to this topic – if you used Rails to create an email
+containing both inline images and normal attachments, the normal attachments
+were not accessible to most email clients (that support HTML email) as they had
+embedded all the normal attachments inside a `multipart/related` part. I have
+submitted a [pull request](https://github.com/rails/rails/pull/26445) to fix
+this structure, which I hope will be accepted in some way.
+
+## Templating
+
+This work was also a good opportunity to move some text generation out of
+some code into the templates (necessary because the text being generated
+now needed some HTML around each entry), for all the alert emails.
+
+## Testing
+
+Finally, this post wouldn’t be complete without a few words about
+email testing.
+
+Any of you who have built HTML emails in the past will agree that they are like
+taking a time machine back to web development in the mid 1990s. Email clients
+like Outlook, Gmail, and iOS Mail have dramatically different capabilities and
+ways of rendering the same email code.
+
+One way of avoiding cross-client complications is to keep your HTML layout as
+simple as possible; maybe add an `<img>` tag in for your site logo, some
+`<strong>` or `<em>` tags for emphasis, and call it a day.
+
+But our plans for FixMyStreet required much more complex email layouts than
+this. It was a hard requirement that the details of the report (the map, the
+name, the photo) in our questionnaire emails, were given equal priority to the
+introductory text and the call to action buttons. The requirements led us to a
+two-column layout, which, inevitably, required two or three layers of nested
+table cells. (Remember, we’re in our 1990s time machine!)
+
+To help us test these layout changes in all the required email clients,
+we used [Litmus](https://litmus.com), which is like
+[Browserstack](https://browserstack.com) but for emails.
+You send a single email to Litmus, and it renders that email in
+dozens of different email clients, grabbing screenshots of each one, and
+presenting them to you in a handy dashboard. Building HTML emails this way
+still requires a good deal of trial and error, and obscure CSS knowledge, but
+at least with Litmus, the process of iterating on your design is made as short
+and fast as possible. It’s an expensive service, but well worth the cost for
+the peace of mind that your new layout works in even the most uncooperative
+email clients.
+
+<div style="text-align:center">
+<img src="/assets/posts/html-email-litmus.png" alt="">
+</div>
+
+With the help of our Litmus checklists, we made a bunch of unintuitive
+discoveries, including:
+
+* Using `<th>` rather than `<td>` elements, so that the Android 4.x mail client
+ can give them `block` styling in the small screen media query.
+* Defining our font settings on every table cell, rather than simply inheriting
+ `font-family` from the `body`, so that sans-serif fonts are used in Outlook,
+ rather than Times New Roman.
+* Using a three-column wrapper table to create a 620px centred content area
+ that also shrinks down on narrow screens. (Outlook doesn’t like
+ max-width, so this is the simplest alternative.)
+* Enforcing a sensible (500px) min-width for the main content area,
+ on clients that don’t support media queries.
+* Using giant borders on `<a>` elements, to make them into Outlook-friendly
+ buttons without resorting to less accessible alternatives like images.
+* Aligning images with the deprecated `align` attribute, rather than CSS floats.
+* Applying the email background colour to a wrapper element inside the `body`,
+ and thus leaving the `body` to keep its default white background, so that
+ replies sent from Outlook (which inserts the reply message *inside* the body
+ of the original message) will have a white background.
diff --git a/docs/_posts/2016-12-05-v2.0-email-domain-name-validation.md b/docs/_posts/2016-12-05-v2.0-email-domain-name-validation.md
new file mode 100644
index 000000000..1794ad77a
--- /dev/null
+++ b/docs/_posts/2016-12-05-v2.0-email-domain-name-validation.md
@@ -0,0 +1,38 @@
+---
+layout: post
+title: Version 2.0 – email validation
+author: matthew
+---
+
+When someone enters an email address on FixMyStreet, we try and do some simple
+validation before sending a confirmation email, to catch typos and the like. We
+do the following:
+
+* Check the address is correctly formed (e.g. that it contains an @ sign and a
+ domain, and doesn't include irregular characters, etc);
+* Check that the email address's domain is a valid top-level domain (TLD) (it's
+ not going to be delivered anywhere if it's not); and
+* Check that the email address's domain has a valid DNS entry (so we'll be
+ able to try and deliver an email there).
+
+The middle point means using a Perl module,
+[Net::Domain::TLD](https://metacpan.org/pod/Net::Domain::TLD), that contains a
+list of all valid TLDs. This list has grown since we last updated it, and we
+found ourselves incorrectly rejecting an email address that was perfectly valid
+(a @domain.cymru address). It was at least easy to update our version of
+Net::Domain::TLD to ensure that our list of top-level domains is current.
+
+## Changing your email address
+
+The confirmation email is itself another form of validation, and the only one
+that can actually confirm that the user entering the email address has access
+to that email inbox.
+
+Version 2 of FixMyStreet now allows users to change their own email address,
+which threw up a complication – we can’t update the user’s table to their new
+email address until it’s been confirmed.
+
+So we have to store their old email address with the token that is sent to the
+new one. When the new address has been confirmed, we deal with it differently
+depending on whether or not that address already exists in the database. If it
+does, it's a matter of merging the two accounts.
diff --git a/docs/_posts/2016-12-06-v2.0-multi-select.md b/docs/_posts/2016-12-06-v2.0-multi-select.md
new file mode 100644
index 000000000..aaa5c9fa9
--- /dev/null
+++ b/docs/_posts/2016-12-06-v2.0-multi-select.md
@@ -0,0 +1,46 @@
+---
+layout: post
+title: Version 2.0 – Multi-select dropdown jQuery plugin
+author: zarino
+---
+
+There are several types of 'list page' on FixMyStreet: for example, when you
+view all reports from a specific body, or when you log into your account to see
+reports you have made.
+
+For quite a while now, users have been able to filter these by state (eg
+'fixed' or 'in progress') or category (eg 'pothole', 'streetlight', etc), but a
+recent suggestion from Oxfordshire County Council prompted us to look again at
+this functionality and improve it.
+
+So now it's simple to filter by multiple states or categories: want to see all
+unfixed potholes? All streetlights or flytipping reports that are fixed? No
+problem.
+
+HTML's `<select multiple>` is not the nicest tool in the box, especially when
+it comes to actually selecting multiple options. It usually involves holding
+down a key, but that key is different depending upon your operating system.
+
+So I looked at existing JavaScript plugins and finding nothing suitable created
+a very simple jQuery plugin which is available at
+[https://github.com/mysociety/jquery-multi-select](https://github.com/mysociety/jquery-multi-select).
+
+By default, it converts a multiple select into a dropdown with checkboxes:
+
+<img src="/assets/posts/multi-select-people.png" alt="">
+
+The options can be wrapped within a container to stop the dropdown overlapping other content:
+
+<img src="/assets/posts/multi-select-line-wrap.png" alt="">
+
+With options in the constructor, you can specify text for when all/no options
+are selected, and specify groups of options as presets that will be listed at
+the top of the dropdown:
+
+<img src="/assets/posts/multi-select-groups.png" alt="">
+
+On FixMyStreet, we have used this for both the state and category filters on list pages:
+
+<img src="/assets/posts/multi-select.png" alt="">
+
+Let us know if you find the plugin useful!
diff --git a/docs/_posts/2016-12-07-v2.0-new-user-system.md b/docs/_posts/2016-12-07-v2.0-new-user-system.md
new file mode 100644
index 000000000..f9c6bdda1
--- /dev/null
+++ b/docs/_posts/2016-12-07-v2.0-new-user-system.md
@@ -0,0 +1,69 @@
+---
+layout: post
+title: Version 2.0 – New user system
+author: matthew
+---
+
+Version 2 launches a new user system for admins, including more granular
+permissions and a variety of new features.
+
+## Logging in
+
+Admins can now use the same login system as the main front end. We highly
+recommend running your site over HTTPS in order to keep credentials secure;
+[LetsEncrypt](https://letsencrypt.org/) can supply free 3-month certificates.
+
+The main admin user type is the 'superuser'; a user with this flag set (which
+can be done in the database, or by running the `createsuperuser` command) has
+full access to all areas of the admin, just like admins under the old system.
+By default, these are the only types of user allowed to log in to `/admin`. (It
+is possible to change this, e.g. in the UK, non-superuser admin users
+associated with a body can log in to `/admin` on their own cobrand.)
+
+## User permissions
+
+<img class="r" src="/assets/posts/admin-user-permissions.png" alt="">
+
+Users associated with a body (called 'body users') can be given a variety
+of different feature-based permissions; the screenshot here shows the list
+of different options.
+
+* **Categories:** You can associate a user with a list of categories, which
+e.g. pre-selects those categories when the user visits the All Reports page.
+
+* **Response priorities:** This allows you to set a list of different
+priorities for a body, or again for a particular category in a body,
+letting you note different priorities for different reports.
+
+* **Response templates:** You can create and edit templates associated with
+your body, or with a particular category in that body, and then when leaving an
+update you can select one of these templates to allow easy updating of reports.
+
+* You can give a user access to a front-end **report 'inspect' view**, which
+lets a user edit a report's category, state, or location. If the category
+change moves the report to a different body, it will be re-sent. Alternatively,
+a user can be given *only* category edit or priority edit permission.
+Here is a screenshot of the top of an inspect form view:
+
+<img src="/assets/posts/report-inspect.png" alt="The inspect form lets you change category, state, report location, and so on.">
+
+## Create as another/body
+
+This permission gives a user the ability to create a report or update on behalf
+of a body, or as another user. We envisage this being useful in a body's
+contact centre, where they receive a report over a phone and enter it into
+FixMyStreet as that user. Below is a short animation showing this in action on
+the Oxfordshire cobrand of FixMyStreet.com:
+
+![Show an example of the create as another in action](https://cloud.githubusercontent.com/assets/739624/17371098/9a55c806-5996-11e6-9602-cf1cf58f8cdb.gif)
+
+## Shortlists
+
+<img class="l" src="https://cloud.githubusercontent.com/assets/739624/19122469/7fa927ba-8b22-11e6-8193-ef20d9ce496e.png" alt="">
+A user with the shortlist permission gains a shortlist button on each report;
+clicking this adds the report to your own personal shortlist of reports, which
+you can view in a section of Your Account. This may be useful for an
+'inspector' type of admin user, who wishes to compile the day's list of
+reports before going out and investigating them. You can also see if a report
+is on someone else's shortlist, and take it off them if you need to.
+<br style="clear:both">
diff --git a/docs/_posts/2016-12-08-v2.0-area-highlighting.md b/docs/_posts/2016-12-08-v2.0-area-highlighting.md
new file mode 100644
index 000000000..5cd424fbd
--- /dev/null
+++ b/docs/_posts/2016-12-08-v2.0-area-highlighting.md
@@ -0,0 +1,42 @@
+---
+layout: post
+title: Version 2.0 – area highlighting
+author: matthew
+---
+
+FixMyStreet's report pages for a particular body have always highlighted the
+area of the body covered, by fetching the KML shape from the associated MapIt
+and plotting it on a map. In version two we have made it look much nicer:
+
+<img src="/assets/posts/area-highlighting-before.jpeg" align="left" style="max-width:49%">
+<img src="/assets/posts/area-highlighting-after.jpeg" align="right" style="max-width:49%">
+
+Until now we have coloured in the shape in a light orange, as pictured above
+left. This is fine for an overall view of a body, but if you want to zoom in to
+a particular area, it makes it quite hard to see the underlying map.
+
+It would be preferable if every part of the map *except* the body's area could
+be shaded, highlighting the correct area without losing any clarity from the
+part you're interested in, as in the new image above right.
+
+## Polygon make-up
+
+Polygons in KML and other similar formats are made up of multiple linear rings
+– the first ring is the polygon's outline, and any subsequent entries are holes
+within the polygon. You can therefore 'invert' a polygon by having the outer
+ring be something surrounding the polygon, then having the polygon be a hole
+within that.
+
+So the way we have implemented this in our new version is to fetch the area
+from [MapIt](https://mapit.mysociety.org/), but before plotting it preface it
+with a giant rectangle covering the whole world. (Thankfully, any holes within
+the original shape are inverted too, though that is implementation dependent
+and it would have been a lot harder if they weren't!).
+
+There were a couple of issues along the way. MapIt may return either a polygon
+or multiple polygons, so we needed to deal with each differently (we turn
+multiple polygons into one polygon, which also thankfully Just Works). And
+OpenLayers has a hardcoded maximum pixel co-ordinate for SVG rendering, dating
+from [2007 and an issue in Firefox 2](https://github.com/openlayers/ol2/commit/ba5b664a2f34691574e149c8d48ab4deb33c532b).
+We hope that any such issues have been fixed by now. We haven't had any reports
+of crashes yet, anyway...
diff --git a/docs/_posts/2016-12-09-v2.0-html5-history.md b/docs/_posts/2016-12-09-v2.0-html5-history.md
new file mode 100644
index 000000000..c2376fd80
--- /dev/null
+++ b/docs/_posts/2016-12-09-v2.0-html5-history.md
@@ -0,0 +1,62 @@
+---
+layout: post
+title: Version 2.0 – HTML5 History
+author: matthew
+---
+
+We've [mentioned
+before](https://www.mysociety.org/2015/12/18/photo-upload-and-progressive-enhancement-for-fixmystreet/)
+that FixMyStreet is built on a progressively-enhanced base, a concept explained
+neatly [in a nice blog post from the UK
+government](https://gdstechnology.blog.gov.uk/2016/09/19/why-we-use-progressive-enhancement-to-build-gov-uk/).
+
+This means that e.g. the slippy map is, underneath it all, an old-style
+server-side image map that works out where you click; URLs are all shareable
+and pages are functional even if JavaScript is not available; the front page
+loads quickly and doesn't need to preload an entire application.
+
+None of this means that we don't use or like JavaScript, however. This post is
+about adding JavaScript to FixMyStreet to provide a quicker experience to users
+looking at reports on our map.
+
+When viewing a [list of
+reports](https://www.fixmystreet.com/reports/Oxfordshire) on FixMyStreet, you
+might want to look at a few reports one after the other, much as you can on a
+Google Maps or OpenStreetMap results screen.
+
+So now, when you click a report in the list or a pin on the map, the report
+page is pulled in via JavaScript. This updates the page, pin and URL in situ,
+rather than loading a new page. Other pins remain visible, plus the page feels
+(and probably is) a bit quicker as the page header doesn't reload, and it is
+easy to switch back to the list view.
+
+This feature uses HTML5's History API, ie. `pushState` and `popState`, to
+update the URL as the page changes. That means that when you share it,
+the page that loads will always be the one that the user intended it to be.
+
+This improvement did not come without problems, however. Overriding the
+browser's own behaviour when it comes to history and navigation means you have
+to think carefully, and I'm sure we'll need to make further refinements to
+ensure that everything works as the user would expect.
+
+There were small issues: for example, `pushState` stores the document title at
+the point when it's called, for the 'Back' button list, meaning we had to make
+sure any title change happened after that. Some browsers have a `popstate` on
+page load, which can cause an issue if you assume it's only fired due to
+history events.
+
+There was the complication of needing to tell the difference between someone
+clicking back to the 'initial state' of the page, and an internal hashchange or
+other less crucial event – as well as using a `replaceState` on page
+load, we store the original URL and title for use in such a situation.
+
+Then we forgot that the code would be running on `/reports` lists as well as
+`/around` which led to some confusion until we realised what was happening! And
+of course, you have to make sure everything JavaScript-wise is set up
+appropriately for content brought in via JavaScript.
+
+We also used `pushState` in the new report process, to update the URL as you
+select the report's location, and on list pages when you select one of the
+filters or sort. This has worked well, and is certainly much more preferable to
+the 'hash-bang' technique used by some sites in previous years (and still now),
+which is reliant on JavaScript functioning.
diff --git a/docs/_posts/2016-12-13-v2.0-improved-forms.md b/docs/_posts/2016-12-13-v2.0-improved-forms.md
new file mode 100644
index 000000000..efad888b7
--- /dev/null
+++ b/docs/_posts/2016-12-13-v2.0-improved-forms.md
@@ -0,0 +1,77 @@
+---
+layout: post
+title: Version 2.0 – Improved forms
+author: matthew
+---
+
+The new release of FixMyStreet includes a number of improvements to various
+forms on the site. In this post, we will take a brief look at the notable
+changes.
+
+## Public reporting form
+
+<img class="r" src="/assets/posts/new-reporting-form.png" alt="">
+
+This form has been rejigged, in order to more obviously split out details that
+will be public (e.g. photos, details) from those that will not be published on
+the site (e.g. the user's email address and phone number). The category
+selector has also moved to the top, and if the category chosen requires the
+display of extra questions or information (e.g. through Open311 attributes or a
+custom built asset layer), they will be shown immediately.
+
+If a report is made in an area that is covered by more than one body, the
+category the user selects will normally dictate which one the report is sent
+to. Now, when the category is selected, we update the list of bodies given at
+the top of the report page, if we know that the report will be sent there.
+
+Talking about custom built asset layers, this is a good place to show how the
+FixMyStreet codebase can be put to other uses, with a bit of development.
+
+Angus Council in Scotland provide a WFS layer (that is, vector format geographic
+information) containing the locations of all their streetlights, which
+we display if the street lighting category is selected within Angus on FixMyStreet.
+
+Importantly, it can display which lights Angus already knows are broken. If the
+user is able to identify precisely which street light is affected, they can
+click on it. But picking a street light isn't mandatory: we don't want to put
+people off who aren't certain, or who are unable to select an individual light.
+You can see an example of what this looks like on the Angus cobrand of
+FixMyStreet.com below.
+
+<img src="/assets/posts/angus-streetlights.png" alt="fix.angus.gov.uk shows individual street lights when the Street lighting category is selected.">
+
+<br style="clear:both">
+
+## Admin report editing
+
+<img class="r" src="/assets/posts/admin-report-form-before.png" alt="">
+
+Previously, the form for administrators to edit a report was functional, but
+certainly nothing more than that! Due to the work we've done on the new user
+system, more admin users may well be accessing this form in future, and so
+we've taken the opportunity to make it much tidier.
+
+It now looks much more like the front end of the site. We've added a map that
+lets you move the location of the report, tidied up the various functions an
+admin can perform, and so on. If a category change means the report should have
+been sent to a different body, it will be re-sent.
+
+<img src="/assets/posts/admin-report-form-after.png" alt="">
+
+## Admin category editing
+
+This was a historical oddity, in that the Add category form and the Edit
+category form were completely separate creatures, though both contained the
+same fields, and were used for basically the same purpose:
+
+<img src="/assets/posts/admin-category-add-before.png" alt="" class="l" style="max-width:45%">
+<img src="/assets/posts/admin-category-edit-before.png" alt="" class="r" style="max-width:45%">
+<br style="clear:both">
+
+<img src="/assets/posts/admin-category-edit-after.png" alt="" class="r">
+You can see how they looked different in the screenshots above. They now share
+an HTML template, which also makes it easier for us to update should it need
+changing in future.
+
+<br style="clear:both">
+
diff --git a/docs/_posts/2016-12-14-v2.0-exif-rotation-preview.md b/docs/_posts/2016-12-14-v2.0-exif-rotation-preview.md
new file mode 100644
index 000000000..8cbb9549d
--- /dev/null
+++ b/docs/_posts/2016-12-14-v2.0-exif-rotation-preview.md
@@ -0,0 +1,34 @@
+---
+layout: post
+title: Version 2.0 – EXIF rotation in JavaScript
+author: matthew
+---
+
+FixMyStreet has had a nice multiple image uploader since version 1.8. This uses
+multiple `input type=file` fields, progressively enhanced to add
+drag'n'drop, image preview, and uploading in the background whilst you fill in
+the rest of the form.
+
+<img src="https://cloud.githubusercontent.com/assets/739624/11398421/76c7c856-9378-11e5-9c25-971de271bd0c.gif" alt="">
+
+In version 1.8.4, we
+[patched](https://github.com/mysociety/fixmystreet/commit/4023ee86708f825b64e5f10bef31519ebfb0c5f8)
+the third party library we use, [dropzone](http://www.dropzonejs.com), to
+correctly orient photos in the image preview. We did this by including a
+cut-down version of [exif-js](https://github.com/exif-js/exif-js) to read in
+the EXIF orientation data, and then make sure we rotated the image as
+instructed in JavaScript before drawing the thumbnail preview. The rotation was
+accomplished by moving the image so its centre was over (0,0), rotating the
+appropriate amount, and then re-translating it back.
+
+<img src="https://cloud.githubusercontent.com/assets/8081877/16151581/b808b924-3495-11e6-8573-5e9828b3fa49.png" alt="" align="right" hspace="8">
+
+For this new version, we had a different bug to fix. If the user had uploaded a
+picture, submitted the form, and was shown the form again due to a server side
+error of some sort (some validation not caught by client-side validation, for
+example, or because you were logging in during the reporting process), the
+image for the preview was then being loaded from the server (where it had
+already been uploaded), not the client, and not displaying. We
+[patched the exif-js library](https://github.com/mysociety/fixmystreet/commit/7684ee064c717722003e920baed08d0230eb0d9e).,
+Now, if it is given a URL rather than a data: string, it will go off and fetch
+the image so that it can read out the orientation data.
diff --git a/docs/_posts/2016-12-15-v2.0-faster-tests.md b/docs/_posts/2016-12-15-v2.0-faster-tests.md
new file mode 100644
index 000000000..2e55cf7b3
--- /dev/null
+++ b/docs/_posts/2016-12-15-v2.0-faster-tests.md
@@ -0,0 +1,65 @@
+---
+layout: post
+title: Version 2.0 – testing improvements
+author: matthew
+---
+
+FixMyStreet has a large and hopefully comprehensive test suite that runs
+through all aspects of the codebase, checking everything is working. This
+makes it easier to change code and add new features, safe in the knowledge
+that any breakages will be quickly highlighted.
+
+## Speeding up the tests
+
+Every time someone commits code to our GitHub repository, or opens a pull
+request, the tests are automatically run for us by Travis CI. We're alerted to
+success or failure with little green ticks or red crosses on GitHub, and by
+notice in IRC.
+
+The tests seemed to have slowed down considerably in recent times, but we
+couldn't identify any changes at the FixMyStreet side which might have caused
+this.
+
+However, there had recently been some spam scraping of
+[Gaze](https://gaze.mysociety.org/), our web service that provides population
+density information to FixMyStreet (so that e.g. the [maps can try and guess an
+appropriate zoom
+level](https://www.mysociety.org/2012/08/14/mysociety-design-tips-how-we-choose-the-best-map-zoom-level/),
+and so alerts can try and guess an appropriate radius), and rate limiting had
+been added to try and help combat it.
+
+Dave spotted that this was being triggered by FixMyStreet test runs, leading to
+pauses as the suite waited for the rate limiting to ease. Thankfully, all Gaze
+calls were being routed through one function (that had been created in order to
+cope gracefully with a Gaze failure) and so it was a simple matter for this
+function to be stubbed out if being run as part of a test.
+
+[Before](https://travis-ci.org/mysociety/fixmystreet/builds/143317849):
+![The test suite took about 18 minutes to run.](/assets/posts/testing-before.png)
+
+[After](https://travis-ci.org/mysociety/fixmystreet/builds/143325800):
+![The test suite took under 6 minutes to run.](/assets/posts/testing-after.png)
+
+There are many tests that still rely on the internet (e.g. for some MapIt
+lookups) and eventually it would be good to get to the point where they are all
+stubbed out and the test suite can run completely offline, probably even more
+quickly.
+
+## Multiple test running
+
+When running the tests, the suite creates a test database (in PostgreSQL terms,
+it actually creates a temporary cluster) so that anything it does won't affect
+your development database. Theoretically, this means you should be able to run
+the test suite multiple times simultaneously – perhaps it's doing a full run,
+but you want to try and fix (and retest) the first error while it carries on.
+However, this was not working, and after some investigation it turned out that
+each run was creating (and overwriting) a test configuration `.yml` file, which
+meant the existing runs got all confused. Adding a process ID to the test
+configuration file meant that each run is independent and can successfully
+coexist with each other.
+
+## Keystroke saving
+
+Lastly, you used to have to run the full suite with `bin/run-tests t`, but now
+if you run `bin/run-tests`, it will assume you meant `t`. A small thing, but it
+might save a few seconds over the years. ;-)
diff --git a/docs/_posts/2016-12-16-v2.0-javascript-improvements.md b/docs/_posts/2016-12-16-v2.0-javascript-improvements.md
new file mode 100644
index 000000000..fa82fef6f
--- /dev/null
+++ b/docs/_posts/2016-12-16-v2.0-javascript-improvements.md
@@ -0,0 +1,123 @@
+---
+layout: post
+title: Version 2.0 – JavaScript performance
+author: matthew
+---
+
+The JavaScript on FixMyStreet has gradually evolved over many years (we
+launched in 2007, remember!), and while we were working on other features in
+this area (such as HTML5 History) it was a good opportunity to tidy up the
+JavaScript, making it clearer and simpler. Below I'm going to go through most
+of the steps I took, not necessarily in the order I took them, which hopefully
+might prove useful to your own websites. And there are exciting pictures at the
+end, I promise!
+
+It also let us add the Content-Security-Policy header to FixMyStreet, which is
+a method in browsers to prevent cross-site scripting (XSS), clickjacking and
+other code injection attacks by specifying the valid sources for script
+execution.
+
+## Separate scripting and styling
+
+When you report an issue on FixMyStreet on mobile, the map `/around` page is
+full-screen to make reporting easier. This was being done in JavaScript using
+some jQuery `css()` calls when setting up (or ending) the mobile view. It was
+straightforward to move this CSS to a `mobile-reporting-map` class and have the
+JavaScript do no more than add or remove this class, making both parts clearer.
+(Later during this process, I also added an `only-map` class to prevent the map
+being scrolled until it is clicked, when the rest of the form can then be
+shown.)
+
+Similarly, the JavaScript was requisitioning the desktop-width green banner to
+provide a different mobile banner; updating this to use a separate mobile
+banner made the code clearer and shorter.
+
+## Tidy up the JavaScript set up
+
+The main setting up of our JavaScript was taking place, for historical reasons,
+in two files, both confusingly called `fixmystreet.js`. Whilst in the future we
+may want to split this up into separate files more tailored to the particular
+pages where the code is used (though our main use of JavaScript is our map
+page, which already has its JavaScript separate), for now it made most sense to
+combine these in one file, and tidy up all the setup functions into a list of
+feature-based functions each called in turn on page load.
+
+We were bundling a copy of Modernizr (for media query detection) that contained
+html5shiv and yepnope. But html5shiv is only needed in old versions of Internet
+Explorer, and yepnope is only used on FixMyStreet's front page (to try and
+preload the map page JavaScript mentioned above), so I could move html5shiv
+into an IE conditional comment, and included yepnope.js only on the front page,
+reducing Modernizr to only Modernizr itself.
+
+## Move vital JavaScript as early as possible
+
+Now that I had a `mobile-reporting-map` class, I wanted this class activated
+as soon as possible as the page is loading, not only when the document had been
+parsed. There were also a couple of site-wide variables, `page` (the type of
+page, e.g. `around` or `new`), and `cobrand` (the branding of the site you're
+on). Lastly, I wanted to be able to set a class on the document if JavaScript
+was activated, so that CSS using that class would be instantly active,
+preventing a flash of style change or content.
+
+To achieve all this, I created a `header.js` file that performed the above
+three tasks, setting a class on &lt;html&gt;, setting two variables on our
+global `fixmystreet` variable, and if we're on a small width (using Modernizr)
+and perhaps a map page, setting the appropriate classes. I then minimized and
+inlined this script in the header of each page, so that we don't have to wait
+for any external script to load.
+
+## Move JavaScript to the end of the HTML, remove inline JavaScript
+
+As [recommended by Jake Archibald
+here](https://www.html5rocks.com/en/tutorials/speed/script-loading/), I moved
+all the JavaScript to the end of the HTML. To make this easier, and also to
+make adding a Content-Security-Policy header easier, I removed all the inline
+JavaScript from FixMyStreet (I didn't think FixMyStreet had that much inline
+JavaScript, and it didn't, but it still had more than I had remembered!). This
+was most commonly being used to set up some JavaScript variables with
+server-side data, so the easiest way to replace this was to place this data as
+attributes on HTML elements (preferably semantically related elements), and set
+up the JavaScript variables in an external script.
+
+## Minify JavaScript
+
+I didn't want to make this mandatory, as we have done with SCSS/CSS, but I
+wanted the option available, so I added an option to our templating code that
+means it will prefer an .auto.min.js file in preference to a .js file of the
+same basename. This lets you compile your JavaScript in a deploy process, for
+example, should you wish to. We do this with the standard Closure Compiler from
+Google; I haven't yet been brave enough to try and check/get the JavaScript
+working with the advanced option of the Closure Compiler :)
+
+## Activate Content-Security-Policy
+
+The Content-Security-Policy header lets you specify domains from which
+JavaScript will run, plus lets you choose to run inline JavaScript either en
+masse or only if you provide a specific unique nonce ID in the &lt;script&gt;
+tag that matches the same ID in the CSP header. That latter option is how we
+kept our inline header JavaScript running without having to externalise it
+again.
+
+"nonce" was only added in the second version of the CSP spec, so you may note
+our header also specifies `unsafe-inline`. Any browser that supports version 2
+will ignore this when it sees the nonce header, but it is needed in order for
+the inline script to still run in any browser only supporting version 1.
+
+## Conclusion
+
+In Google Page Speed Insights, with manual minification of the main JS files,
+this moves the front page from 68/84 to 85/92ish (filmstrip from
+webpagetest.org, top is live site, bottom is my dev site):
+
+[![filmstrip](https://cloud.githubusercontent.com/assets/154364/17670115/58b741f6-6308-11e6-9510-82c23fbd5c35.png)](https://cloud.githubusercontent.com/assets/154364/17670115/58b741f6-6308-11e6-9510-82c23fbd5c35.png)
+
+These are requests from the US: most of the initial delay is in that initial
+download. Now here's a report page going from 58/77 to 85/86ish ("ish" because
+e.g. live site will have analytics that my dev site doesn't):
+
+[![Site visible a second quicker](https://cloud.githubusercontent.com/assets/154364/17670122/680c9a16-6308-11e6-9bfb-721272ff1f71.png)](https://cloud.githubusercontent.com/assets/154364/17670122/680c9a16-6308-11e6-9bfb-721272ff1f71.png)
+
+Due to page elements displaying more quickly than might previously have been
+expected, there are still a few things to tidy up. For example, when an element
+displays before a bit of JavaScript kicks in and makes it look slightly
+different... but hopefully nothing major.
diff --git a/docs/_posts/2016-12-16-v2.0.1.md b/docs/_posts/2016-12-16-v2.0.1.md
new file mode 100644
index 000000000..629e25e61
--- /dev/null
+++ b/docs/_posts/2016-12-16-v2.0.1.md
@@ -0,0 +1,27 @@
+---
+layout: post
+title: Version 2.0.1
+author: matthew
+---
+
+<div class="r" align="right">
+<a data-flickr-embed="true" href="https://www.flickr.com/photos/s2art/189574055/" title="drowning"><img src="https://c8.staticflickr.com/1/67/189574055_37e836feaa.jpg" width="500" height="375" alt="drowning"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>
+</div>
+
+Today we have released **version 2.0.1** of FixMyStreet, a bugfix release.
+The issues fixed are:
+
+* Chrome 55 changes the way it handles mouse/touch events, [unifying them as
+ pointer events](https://developers.google.com/web/updates/2016/10/pointer-events),
+ and OpenLayers, the JavaScript mapping library we use, needed patching to
+ deal with this. Thanks to the Chrome team for helping debug this.
+* strftime output (e.g. used to display dates) was sometimes being double
+ decoded, giving incorrect output in some languages.
+* If a category was filtered, it was not being properly carried through to the
+ new report form.
+* The body/area inputs in the admin were being fixed to a too-small height.
+
+Some bugfixes and improvements have also been made to the admin inspector
+report view, along with a couple of development improvements – the tests coping
+better if run on a network that intercepts NXDOMAINs, and a better way of
+showing the git version in the admin config.
diff --git a/docs/_posts/2017-02-03-v2.0.2.md b/docs/_posts/2017-02-03-v2.0.2.md
new file mode 100644
index 000000000..0047f8120
--- /dev/null
+++ b/docs/_posts/2017-02-03-v2.0.2.md
@@ -0,0 +1,37 @@
+---
+layout: post
+title: Version 2.0.2
+author: matthew
+---
+
+<div class="r" align="right">
+<a data-flickr-embed="true" href="https://www.flickr.com/photos/amyeanderson/29212751225/" title="Lake Annecy"><img src="https://c1.staticflickr.com/9/8503/29212751225_67b5579e60.jpg" width="500" height="453" alt="Lake Annecy"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>
+</div>
+
+Today we have released **version 2.0.2** of FixMyStreet, a bugfix release along
+with some new admin improvements.
+
+The main bugfixes are to mark two missing strings for translation, to make sure
+email is lowercase when signing in via `/auth`, and to make sure a language
+subdomain can be included in calls to `base_url_for_report`. There are also
+some CSS fixes to the homepage and an improved print layout for report list
+pages. Fixes to the admin interface include fixing filtering on the shortlist
+page, and fixing the ‘save with public update’ toggle.
+
+For international users, there have been a few string renames, but we have
+maintained translations as the concept remains unchanged, so please only feel
+free to update if you consider it necessary:
+
+* ‘unable to fix’ has been renamed to ‘no further action’
+* ‘marked as a duplicate report’ has been changed to ‘closed as a duplicate report’
+
+An offline fallback page has been added using appcache, which inspectors can
+use for offline updating of reports in their shortlist.
+
+Admin improvements include allowing response templates to be associated with a
+state (so that template is used by default when the state is changed), allowing
+shortlist addition/removal from report lists, and shortlist reordering. Users
+with a new permission can see the body user who left a `contribute_as_body`
+report or update.
+
+[Full changelog](https://github.com/mysociety/fixmystreet/releases/tag/v2.0.2)
diff --git a/docs/_posts/2017-03-31-v2.0.3.md b/docs/_posts/2017-03-31-v2.0.3.md
new file mode 100644
index 000000000..cfbe75c52
--- /dev/null
+++ b/docs/_posts/2017-03-31-v2.0.3.md
@@ -0,0 +1,33 @@
+---
+layout: post
+title: Version 2.0.3
+author: matthew
+---
+
+<div class="r" align="right">
+<a data-flickr-embed="true" href="https://www.flickr.com/photos/mssuziecue/2637008185/" title="Untitled"><img src="https://c1.staticflickr.com/4/3071/2637008185_6c4bd4d6a0.jpg" width="440" height="500" alt="Untitled"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>
+</div>
+
+Today we have released **version 2.0.3** of FixMyStreet,
+a bugfix release along with some other improvements.
+
+The map on a mobile report page can now be made full screen, and if you are
+using Google Maps you can supply a custom map styling. There's also now a
+loading indicator whilst data is being fetched for the map.
+
+Various missing translations have been added, for moderation, social login,
+and offline usage.
+
+We've upgraded our email sending to deal with issues sending with SSL, dealt
+with IE11 caching report Ajax calls too aggressively, and with Safari 5/
+Android 4 not showing our questionnaire answer buttons.
+
+Performance improvements include moving admin-related JavaScript to its own
+file (so normal users don't need to download it), and reducing the amount of
+disk stats the code performs.
+
+Lastly, all the test suite can now run offline, and amusingly I found a bug in
+a test that only happened if the test was run c. 55 hours before daylight
+savings time began :)
+
+[Full changelog](https://github.com/mysociety/fixmystreet/releases/tag/v2.0.3)
diff --git a/docs/_posts/2017-04-13-v2.0.4.md b/docs/_posts/2017-04-13-v2.0.4.md
new file mode 100644
index 000000000..709e0aa01
--- /dev/null
+++ b/docs/_posts/2017-04-13-v2.0.4.md
@@ -0,0 +1,27 @@
+---
+layout: post
+title: Version 2.0.4
+author: matthew
+---
+
+<div class="r" align="right">
+<a data-flickr-embed="true" href="https://www.flickr.com/photos/pieczonysnieg/8635754135/" title="11"><img src="https://c1.staticflickr.com/9/8537/8635754135_4aa39ac521.jpg" width="338" height="500" alt="11"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>
+</div>
+
+Today we have released **version 2.0.4** of FixMyStreet, a bugfix release along
+with a couple of other improvements.
+
+The bugfixes are updating our Facebook library so that Facebook login works
+again, stopping an error if you had a devolved body and its contact both
+lacking a send method, and an issue in the multi-select front end if you had
+characters such as brackets in your category name.
+
+Strangely, while the backend has always allowed multiple email addresses for a
+contact, separated by commas, the admin interface hasn't allowed them to be
+entered - this has now been corrected.
+
+Lastly, body pages under `/reports` will now limit the reports shown to those
+within the visible map, which should make moving and zooming around much more
+intuitive.
+
+[Full changelog](https://github.com/mysociety/fixmystreet/releases/tag/v2.0.4)
diff --git a/docs/_posts/2017-07-18-v2.1.md b/docs/_posts/2017-07-18-v2.1.md
new file mode 100644
index 000000000..f3579f813
--- /dev/null
+++ b/docs/_posts/2017-07-18-v2.1.md
@@ -0,0 +1,52 @@
+---
+layout: post
+title: Version 2.1
+author: matthew
+---
+
+<div class="r" align="right">
+<a data-flickr-embed="true" href="https://www.flickr.com/photos/winnie_quan/2295947472/" title="Untitled"><img src="https://farm4.staticflickr.com/3048/2295947472_ed1a3fe0e1.jpg" width="500" height="281" alt="Untitled"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>
+</div>
+
+Today we have released **version 2.1** of FixMyStreet, with some new features
+and a variety of improvements for users and reusers.
+
+New features include allowing users to hide their own name on reports/updates,
+and a new graph-based /reports page, which you can see in operation on our
+[main UK site](https://www.fixmystreet.com/reports). We also now resize photos
+client-side before uploading, given the increase in very large images these
+days.
+
+Admin improvements include adding an 'inactive' state to categories, so you can
+prevent a category being used for new reports but still have it available in
+filters, various improvements to the inspect form and the new report process
+for inspectors, and an easier way for inspectors to shortlist all reports in
+their view.
+
+Geolocation is back on the alert page, lost sometime last year, and some random
+blank spaces are no longer clickable, hooray!
+
+Development-wise, FixMyStreet now supports Debian stretch and perl 5.24, badly
+configured SMTP options should now be spotted, and we have refactored and
+simplified the CSS used for header/content/navigation. This may mean you can
+simplify overrides in your cobrand. If you wish to have a static front page
+rather than the normal report page, that's now possible by creating an
+`about/homepage.html` template in your cobrand, and cobrands can now easily
+change the new report pin colour.
+
+The test suite now runs each file in a transaction which means it can be run in
+parallel and sped up dramatically; on the other hand, on Travis we added code
+coverage which slowed it down again.
+
+Two **backwards incompatible** changes that may require changes to your own
+templates if you have customised them:
+
+* The `nav-wrapper-2` class has been removed. If you have a custom footer
+ template, replace that class with 'container'.
+
+* The `/reports` page now uses different generated data. If you have a custom
+ `reports/index.html` template and wish to keep it, you may need to call
+ `update-all-reports` with a `--table` argument to generate the old style
+ data.
+
+[Full changelog](https://github.com/mysociety/fixmystreet/releases/tag/v2.1)
diff --git a/docs/_posts/2017-08-03-v2.1.1.md b/docs/_posts/2017-08-03-v2.1.1.md
new file mode 100644
index 000000000..b1b487fa2
--- /dev/null
+++ b/docs/_posts/2017-08-03-v2.1.1.md
@@ -0,0 +1,24 @@
+---
+layout: post
+title: Version 2.1.1
+author: struan
+---
+
+<div class="r" align="right">
+<a data-flickr-embed="true" href="https://www.flickr.com/photos/drinksmachine/435344339/" title="Untitled"><img src="https://farm1.staticflickr.com/176/435344339_84fd7e4705_z_d.jpg" width="640" height="480" alt="Untitled"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>
+</div>
+
+Today we have released **version 2.1.1** of FixMyStreet, a bugfix release with
+a few small improvements.
+
+The map in HTML emails is now a link through to the report page, and we've
+fixed a bug causing the wrong pin size to be shown there. We've also fixed a
+bug that could cause a different language from the requested one to be shown on
+about pages.
+
+Admin improvements include resending reports if changing the category
+has changed the `send_method` and displaying the reporter's phone number
+on the inspector form. Text deleted during moderation is no longer
+replaced with `[...]`.
+
+[Full changelog](https://github.com/mysociety/fixmystreet/releases/tag/v2.1.1)
diff --git a/docs/_posts/2017-09-14-v2.2.md b/docs/_posts/2017-09-14-v2.2.md
new file mode 100644
index 000000000..b4c0aa804
--- /dev/null
+++ b/docs/_posts/2017-09-14-v2.2.md
@@ -0,0 +1,53 @@
+---
+layout: post
+title: Version 2.2
+author: matthew
+---
+
+<div class="r" align="right">
+<a data-flickr-embed="true" href="https://www.flickr.com/photos/_chrisuk/6621444233/" title="Pothole"><img src="https://farm8.staticflickr.com/7155/6621444233_d109d69b26_z.jpg" width="640" height="360" alt="Pothole"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>
+</div>
+
+Today we have released **version 2.2** of FixMyStreet, with some new features,
+some bugfixes, and other improvements.
+
+* At long last, **body and category names can be translated** in the admin
+interface, letting you easily run sites in multiple languages without having to
+perform various amounts of custom work;
+
+* **Report states can now be edited** (and translated) in the admin interface, if
+you wish to have different options for the specific workflow of your site. If
+you want to have a closed state of "object removed", now you can;
+
+* Also through the admin interface you can now **add extra fields** to be
+ shown in the reporting form, letting you ask custom questions for your
+installation without needing to edit any code or templates.
+
+All the above improvements were funded by [NDI](https://www.ndi.org/) as part
+of their FixMyCommunity project; thanks very much to them.
+
+<hr>
+
+Staff users can now create reports on behalf of people anonymously, and have
+more filters on report list pages; new configuration options allow you to limit
+your site to logged-in users only, or prevent new users from using the site.
+
+The email alerts page has had some work to improve its clarity, and some work
+has gone into improving the performance of various pages. Some deep diving into
+SQL queries led to some notable cases where things could be sped up, and we
+also found one place (listing nearby duplicate reports for staff users) where
+the database was being queried at a radius of 1000km, rather than 1km :)
+
+One notable bugfix is if you logged in during the reporting process, or had a
+server side error, your photo thumbnails weren't being redisplayed correctly
+(though the photo itself was stored fine) due to change in the image library
+we use – everything should now be okay.
+
+Lastly, if you're developing on the code, we have added a debug toolbar
+(similar to the Django Debug Toolbar, if you're familiar with that) which lets
+you see which templates have been used, what SQL queries have been made, what
+external requests, and so on. This is automatically enabled when you run the
+development server.
+
+[Full changelog](https://github.com/mysociety/fixmystreet/releases/tag/v2.2)
+
diff --git a/docs/_posts/2017-12-18-v2.3.md b/docs/_posts/2017-12-18-v2.3.md
new file mode 100644
index 000000000..f769aeb2b
--- /dev/null
+++ b/docs/_posts/2017-12-18-v2.3.md
@@ -0,0 +1,56 @@
+---
+layout: post
+title: Version 2.3
+author: matthew
+---
+
+<div class="r" align="right">
+<a data-flickr-embed="true" href="https://www.flickr.com/photos/ursonate/9072504686" title="IMG_20130617_072808.jpg"><img src="https://farm6.staticflickr.com/5491/9072504686_8f948925c4.jpg" width="375" height="500" alt="IMG_20130617_072808.jpg"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>
+</div>
+
+Today we have released **version 2.3** of FixMyStreet.
+
+The major new feature in this release is adding <strong>confirmation by phone
+text</strong> instead of email, via Twilio, to allow optional verification of
+reports and updates, and logging in.
+
+Alongside that, there have been numerous front end improvements and bugfixes.
+Front end improvements include <strong>paginating reports</strong> everywhere,
+making sure all maps can be expanded on mobile, the pin loading indicator no
+longer covering the whole map whilst pins are loading, and improved location
+disambiguation on small screens.
+
+Some effort has gone into <strong>improving performance</strong> of various
+pages, especially the front page, reducing the amount of JavaScript loaded,
+replacing our image sprite with more SVG assets, and switching to modern
+prefetch. <a href="https://www.fixmystreet.com/">fixmystreet.com</a> goes a
+step further by inlining critical CSS on the front page so no external requests
+are needed to show the start of the site. You can read more about this process
+<a href="https://www.mysociety.org/2017/11/24/peak-performance/">on the
+mySociety blog</a>.
+
+We now support <strong>Open311 category groups</strong>, and if we fetch
+updates via Open311, we can use auto-response templates to fill in updates
+without their own description.
+
+Lastly, the <strong>dashboard and statistics</strong> have been streamlined and
+improved, and are all now available under <code>/dashboard</code>. This now
+includes lookup by date range, ward, category or state, and the CSV export uses
+machine-readable dates and is accessible via token-based authentication.
+
+### Bugfixes
+
+The number of updates on <a
+href="https://www.fixmystreet.com/">fixmystreet.com</a> hit a million! So we
+made sure large numbers don't overflow on the homepage. Also, multiple 'Expand
+map' links should no longer trouble your maps on mobile; with JavaScript off,
+the pins should no longer be double the size they're meant to be; and also some
+bad interaction between the list filters and the back button has been fixed.
+
+Staff users got a number of bugfixes to their interfaces, including making sure
+reports could always be removed from your shortlist (even if they've switched
+body), only creating one update when changing category, and making sure the
+text-only contacts output was indeed text, not HTML.
+
+[Full changelog](https://github.com/mysociety/fixmystreet/releases/tag/v2.3)
+
diff --git a/docs/_posts/2018-02-12-v2.3.1.md b/docs/_posts/2018-02-12-v2.3.1.md
new file mode 100644
index 000000000..075590ee0
--- /dev/null
+++ b/docs/_posts/2018-02-12-v2.3.1.md
@@ -0,0 +1,39 @@
+---
+layout: post
+title: Version 2.3.1
+author: matthew
+---
+
+<div class="r" align="right">
+<a data-flickr-embed="true" href="https://www.flickr.com/photos/luiscolas/9347625116/in/photolist-ff22hh-822Qzz-hUT-6XAG2R-Aj9tco-4AMCjJ-5JAudk-eRiDAZ-5gSMZS-9aCTMh-8tNEZa-hcWs5g-4HvS9p-aUjRov-LvqZbz-rDivP3-dRRVqb-bxrZTr-gBoCym-bP6HSF-85bACu-sAqHa1-o51A6W-8mVQtB-p4G8w1-GLHRtK-hcV8fg-3yn56F-apTU2w-86dnyQ-8mF2JJ-a5A1P6-xb9Ahd-adJTdh-86dny7-hCEwQ1-A4NHwV-eCvr5q-8Whq3z-81QKHC-bQTwSK-DrizbF-8V6js5-5KScte-fvZGqs-6G8mPr-5zyJXC-fJcHcV-M6HqY9-8V3dTs" title="Keep Behind This Line"><img src="https://farm6.staticflickr.com/5451/9347625116_8f3c8bf5e7.jpg" width="500" height="333" alt="Keep Behind This Line"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>
+</div>
+
+Today we have released **version 2.3.1** of FixMyStreet.
+
+This is a minor release, with a number of bug fixes but also a number of
+smaller front end and admin improvements.
+
+The site should be clearer when things are loading now, be that on initial page
+load or when an asset layer is incoming. Our phone number library has been
+updated, so national phone numbers should be displayed in a nicer format as
+long as you've set the `PHONE_COUNTRY` variable.
+
+FixMyStreet now asks for the current password (or sends an email) on password
+change, sets a minimum password length and checks against a list of commons
+passwords. Superusers can have optional two-factor authentication to protect
+their accounts.
+
+We fixed an error in sending `requires_inspection` reports, issues with
+multiple select-multiples on a page, a questionnaire CSS snafu, showing deleted
+bodies in the dashboard list, alongside other minor bugfixes.
+
+For staff users, 'report as another user' now allows phone number without
+email, and the inspector form shows any extra fields again.
+
+Admins can now anonymize/hide all a user's reports, log a user out, or remove a
+user's account details. We've provided a script to expire old sessions in the
+database (plus this script can be run with `--init` to set up the database for
+the new "log a user out" feature).
+
+[Full changelog](https://github.com/mysociety/fixmystreet/releases/tag/v2.3.1)
+
diff --git a/docs/_posts/2018-05-31-v2.3.2.md b/docs/_posts/2018-05-31-v2.3.2.md
new file mode 100644
index 000000000..9bbb444be
--- /dev/null
+++ b/docs/_posts/2018-05-31-v2.3.2.md
@@ -0,0 +1,43 @@
+---
+layout: post
+title: Version 2.3.2
+author: matthew
+---
+
+<div class="r" align="right">
+<a data-flickr-embed="true" href="https://www.flickr.com/photos/photosak/6214596375" title="London Loop Section 3"><img src="https://farm7.staticflickr.com/6041/6214596375_ca94e02b93.jpg" width="500" height="333" alt="London Loop Section 3"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>
+</div>
+
+Today we have released **version 2.3.2** of FixMyStreet.
+
+This is a minor release, but one with quite a number of bug fixes and other
+smaller front end and admin improvements.
+
+The questionnaire process has been improved, with “Don’t know” now an option in
+the email, and recording the answer as soon as the link is clicked. Smaller
+front end fixes include increasing the size of “sub map links” (hide pins,
+permalink, etc), clicking the "Click map" instruction banner now begins a new
+report, and improved cursor/display of the new report pin.
+
+Front end bug fixes include improving chart display in old IE versions, a CSS
+padding bug in the sidebar “drawer”, a race condition when making a new report
+quickly, some small RTL text display issues, and making sure the loading
+spinner is always shown when it should be.
+
+We now store a user’s creation and last active times, and have provided scripts
+so you can use tis new information to anonymize inactive users or reports,
+email inactive users, and/or close reports to new updates.
+
+At long last, the contents of a report’s extra field is now fully displayed in
+the admin.
+
+Open311 has had a number of improvements and bug fixes – we can now fetch
+problems over Open311, send multiple photos via an Open311 extension, and have
+the ability to have automated attributes that can be filled in but not shown to
+the user (e.g. asset IDs).
+
+For development, we’ve added an HTML email previewer at `/dev/_email/` which
+our designers love, added some Cypress browser-based testing so that some of
+our JavaScript is also tested, and upgraded our Vagrantfile to use Ubuntu Xenial.
+
+[Full changelog](https://github.com/mysociety/fixmystreet/releases/tag/v2.3.2)
diff --git a/docs/_posts/2018-06-06-v2.3.3.md b/docs/_posts/2018-06-06-v2.3.3.md
new file mode 100644
index 000000000..be0a9b668
--- /dev/null
+++ b/docs/_posts/2018-06-06-v2.3.3.md
@@ -0,0 +1,19 @@
+---
+layout: post
+title: Version 2.3.3
+author: matthew
+---
+
+Today we have released **version 2.3.3** of FixMyStreet.
+
+This fixes a few bugs found in the past week of the last release, including one
+potential data leak. It was possible to obtain from a crafted URL the textual
+content of an update, and the name of the user who left that update (only if
+they had made the update non-anonymously), even if that update was unconfirmed
+or hidden. No other details of the update or user were made available.
+
+Other fixes include incorrect behaviour when selecting report pins on mobile,
+bad admin navigation links in multi-language installs, and an issue with the
+map display when an inspector clicked back from a report page on mobile.
+
+[Full changelog](https://github.com/mysociety/fixmystreet/releases/tag/v2.3.3)
diff --git a/docs/_posts/2018-06-07-v2.3.4.md b/docs/_posts/2018-06-07-v2.3.4.md
new file mode 100644
index 000000000..09b9bb436
--- /dev/null
+++ b/docs/_posts/2018-06-07-v2.3.4.md
@@ -0,0 +1,12 @@
+---
+layout: post
+title: Version 2.3.4
+author: matthew
+---
+
+A very quick release, only a day after 2.3.3, but **version 2.3.4** fixes a bug
+introduced in 2.3.3 as part of the fix for selecting pins on mobile; whilst
+that was fixed, the fix then prevented pins being selected on non-`/around`
+pages, whoops.
+
+[Full changelog](https://github.com/mysociety/fixmystreet/releases/tag/v2.3.4)
diff --git a/docs/_posts/2018-09-06-v2.4.md b/docs/_posts/2018-09-06-v2.4.md
new file mode 100644
index 000000000..435eba699
--- /dev/null
+++ b/docs/_posts/2018-09-06-v2.4.md
@@ -0,0 +1,42 @@
+---
+layout: post
+title: Version 2.4
+author: matthew
+---
+
+<div class="r" align="right">
+<a data-flickr-embed="true" href="https://www.flickr.com/photos/matthamm/896309437/" title="Fattoria Palazetta, Field of Sunflowers, Cecina, Tuscany, Italy"><img src="https://farm2.staticflickr.com/1199/896309437_33a2c84a4e.jpg" width="500" height="375" alt="Fattoria Palazetta, Field of Sunflowers, Cecina, Tuscany, Italy"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>
+</div>
+
+Today we have released **version 2.4** of FixMyStreet.
+
+This release contains a security fix to prevent the potential leak of a user
+account's phone number, if you knew their email address; please upgrade your
+installation as soon as you can, or if that is not possible, please apply
+commit `abcb1f86` to your installation in the meantime. We have also released
+version 2.3.5 which is identical to 2.3.4 except with this fix applied.
+
+The front end has removed its input placeholders, for better accessibility;
+improved the report button in the navigation bar to be more context-aware and
+allow for easier reporting in the same location; will only show 6 months of
+reports on the around page by default, to hopefully deal with the issues of too
+many or too few reports being shown; and removes the need for a separate
+per-category ajax call by returning all category data up front.
+
+The admin now trims spaces from search input (at last!), lets you edit a
+category group, and has a 'send login email' button on a user's edit page, so
+you don't have to ask them to do it themselves.
+
+Bugfixes include an issue with the category filter if a category contained a
+comma, fixing duplicate category display on Your Account page, and making sure
+the Home link on mobile is always clickable. Staff workflows had various fixes
+as well, such as inspectors being able to unset priority, seeing all fixed
+issues with the map page filter, and fixing the pin dragging.
+
+For developers, there are new hooks for e.g. custom search results, extra login
+conditions, and changing the details placeholder; a new `/_dev/` URL
+(accessible to superusers) for previewing confirmation/submission pages; and
+the client can set bodis a repot must not be sent to (e.g. if asset selection
+means it has that knowledge).
+
+[Full changelog](https://github.com/mysociety/fixmystreet/releases/tag/v2.4)
diff --git a/docs/_sass/_config.scss b/docs/_sass/_config.scss
new file mode 100644
index 000000000..112873254
--- /dev/null
+++ b/docs/_sass/_config.scss
@@ -0,0 +1,33 @@
+$logo_path: "../img/fms-platform-logo.svg";
+$logo_height: 60px;
+$logo_width: 540px;
+$colour_brand: #fff066; // yellow
+
+
+// Action button icons
+
+$icon_download_path: "../img/icon-download.svg" !default;
+$icon_docs_path: "../img/icon-document.svg" !default;
+$icon_github_path: "../img/icon-github.svg" !default;
+$icon_email_path: "../img/icon-email.svg" !default;
+$icon_twitter_path: "../img/icon-twitter.svg" !default;
+$icon_irc_path: "../img/icon-hash.svg" !default;
+$icon_post_path: "../img/icon-mail.svg" !default;
+
+// Monitor image
+$monitor_path: "../img/monitor.png" !default;
+$monitor_width: 469px;
+$monitor_height: 361px;
+$monitor_breakpoint: 520px;
+
+$prev-arrow_path: "../img/icon-arrow-left.svg";
+$next-arrow_path: "../img/icon-arrow-right.svg";
+
+// Circle icons
+$icon_opensource_path: "../img/icon-opensource.svg" !default;
+$icon_paint_path: "../img/icon-paint.svg" !default;
+$icon_help_path: "../img/icon-help.svg" !default;
+$icon_world_path: "../img/icon-world.svg" !default;
+
+$circle_icon_height: 114px !default;
+$circle_icon_width: 114px !default;
diff --git a/docs/_sass/_owl_carousel.scss b/docs/_sass/_owl_carousel.scss
new file mode 100644
index 000000000..22d69e708
--- /dev/null
+++ b/docs/_sass/_owl_carousel.scss
@@ -0,0 +1,70 @@
+/**
+ * Core Owl Carousel CSS File
+ * v1.3.2
+ */
+
+/* clearfix */
+.owl-carousel .owl-wrapper:after {
+ content: ".";
+ display: block;
+ clear: both;
+ visibility: hidden;
+ line-height: 0;
+ height: 0;
+}
+/* display none until init */
+.owl-carousel{
+ display: none;
+ position: relative;
+ width: 100%;
+ -ms-touch-action: pan-y;
+}
+.owl-carousel .owl-wrapper{
+ display: none;
+ position: relative;
+ -webkit-transform: translate3d(0px, 0px, 0px);
+}
+.owl-carousel .owl-wrapper-outer{
+ overflow: hidden;
+ position: relative;
+ width: 100%;
+}
+.owl-carousel .owl-wrapper-outer.autoHeight{
+ -webkit-transition: height 500ms ease-in-out;
+ -moz-transition: height 500ms ease-in-out;
+ -ms-transition: height 500ms ease-in-out;
+ -o-transition: height 500ms ease-in-out;
+ transition: height 500ms ease-in-out;
+}
+
+.owl-carousel .owl-item{
+ float: left;
+}
+.owl-controls .owl-page,
+.owl-controls .owl-buttons div{
+ cursor: pointer;
+}
+.owl-controls {
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+
+/* mouse grab icon */
+.grabbing {
+ cursor:url(grabbing.png) 8 8, move;
+}
+
+/* fix */
+.owl-carousel .owl-wrapper,
+.owl-carousel .owl-item{
+ -webkit-backface-visibility: hidden;
+ -moz-backface-visibility: hidden;
+ -ms-backface-visibility: hidden;
+ -webkit-transform: translate3d(0,0,0);
+ -moz-transform: translate3d(0,0,0);
+ -ms-transform: translate3d(0,0,0);
+}
diff --git a/docs/_sass/_training_slideshow.scss b/docs/_sass/_training_slideshow.scss
new file mode 100644
index 000000000..9c1969b7c
--- /dev/null
+++ b/docs/_sass/_training_slideshow.scss
@@ -0,0 +1,64 @@
+.modal-slide {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ background: rgba(0, 0, 0, 0.8);
+ z-index: 99;
+ width:100%;
+ height:100%;
+ -webkit-transition: opacity 400ms ease-in;
+ -moz-transition: opacity 400ms ease-in;
+ transition: opacity 400ms ease-in;
+}
+.modal-slide:target {
+ opacity:1;
+ pointer-events: auto;
+}
+.modal-slide > div {
+ width: 90%;
+ height: 90%;
+ position: relative;
+ margin: 2em auto;
+ padding: 5px 20px 13px 20px;
+ border-radius: 10px;
+ background: #fff;
+ display: table;
+ .slide-contents {
+ padding: 1em 15%;
+ display:table-cell;
+ vertical-align: middle;
+ text-align: center;
+ height:100%;
+ ul, ol {
+ text-align: left;
+ display: inline-block;
+ margin:1em auto;
+ }
+ img {
+ border:1px solid #aaa;
+ }
+ }
+}
+.modal-slide-close {
+ background: #606061;
+ color: #FFFFFF;
+ line-height: 25px;
+ position: absolute;
+ right: -12px;
+ text-align: center;
+ top: -10px;
+ width: 24px;
+ text-decoration: none;
+ font-weight: bold;
+ -webkit-border-radius: 12px;
+ -moz-border-radius: 12px;
+ border-radius: 12px;
+ -moz-box-shadow: 1px 1px 3px #000;
+ -webkit-box-shadow: 1px 1px 3px #000;
+ box-shadow: 1px 1px 3px #000;
+ &:hover {
+ background: #ff6666;
+ }
+}
diff --git a/docs/_sass/fixmystreet-org.scss b/docs/_sass/fixmystreet-org.scss
new file mode 100644
index 000000000..e6cf0710a
--- /dev/null
+++ b/docs/_sass/fixmystreet-org.scss
@@ -0,0 +1,392 @@
+@import 'config';
+@import '../theme/sass/global';
+@import 'owl_carousel';
+@import 'training_slideshow';
+
+.site-title {
+ height: $logo_height * 0.75;
+ width: $logo_width * 0.75;
+}
+
+// Have a larger heading on the front page on larger screens
+@media (min-width: $large-screen) {
+ body.home .site-title {
+ margin: 0.5em auto;
+ height: $logo_height;
+ width: $logo_width;
+ background-size: $logo_width $logo_height;
+ }
+ body.home .site-header {
+ padding: 3.75em 0;
+ }
+}
+
+
+.homepage-feature {
+ @include clearfix;
+ .column {
+ // This is the point at which the monitor (fixed width) won't overlap
+ // the text column
+ @media (min-width: 60em) {
+ @include grid-column--one-of-two;
+ }
+ }
+}
+
+.monitor {
+ @media (min-width: $monitor_breakpoint) {
+ width: $monitor_width;
+ height: $monitor_height;
+ background: url($monitor_path);
+ }
+ // Add margin due to image caption positioning
+ margin: 0 auto $base-spacing-unit*3;
+ // This is the point at which the monitor can fit alongside text
+ @media (min-width: 50em) {
+ float: left;
+ }
+ position: relative;
+ #owl-slide {
+ margin: 0 auto;
+ width: 100%;
+ max-width: 412px;
+ height: 232px;
+ background: #fff;
+ @media (min-width: $monitor_breakpoint) {
+ position: absolute;
+ top: 30px;
+ left: 32px;
+ }
+ a p {
+ color: $colour_black;
+ }
+ }
+}
+
+.summary-of-features {
+ @extend .unstyled;
+ @include clearfix;
+ li {
+ @media (min-width: $medium-screen) {
+ @include grid-column--one-of-four;
+ text-align: center;
+ }
+ }
+ .circle-icon {
+ width: $circle_icon_width;
+ height: $circle_icon_height;
+ display: block;
+ margin: $base-spacing-unit auto $base-spacing-unit / 2;
+ background-position: center top;
+ background-size: $circle_icon_width $circle_icon_width;
+ background-repeat: no-repeat;
+ }
+ .icon-opensource {background-image: url($icon_opensource_path);}
+ .icon-paint {background-image: url($icon_paint_path);}
+ .icon-help {background-image: url($icon_help_path);}
+ .icon-world {background-image: url($icon_world_path);}
+ h3 {
+ font-size: 1em;
+ margin-bottom: $base-spacing-unit / 2;
+ }
+ p {
+ font-size: 1em;
+ margin: $base-spacing-unit / 4 $base-spacing-unit $base-spacing-unit;
+ }
+}
+
+
+
+.this-or-this {
+ .column {
+ text-align: center;
+ padding-bottom: $base-spacing-unit *2;
+ @include grid-column--one-of-two;
+ }
+}
+
+.action-buttons {
+ @extend .unstyled;
+ li {
+ // The point at which the links can be doubled up
+ @media (min-width: 50em) {
+ width: 50%;
+ float: left;
+ }
+ a {
+ width: 100%;
+ max-width: 9em;
+ margin: 0 auto 1em;
+ color: #fff;
+ }
+ .icon {
+ width: 30px;
+ height: 50px;
+ display: block;
+ float: left;
+ background-repeat: no-repeat;
+ background-position: center;
+ background-size: 20px;
+ opacity: 0.6;
+ margin-left: -10px;
+ }
+ .icon-document {background-image: url($icon_docs_path);}
+ .icon-download {background-image: url($icon_download_path);}
+ .icon-github {background-image: url($icon_github_path);}
+ .icon-email {background-image: url($icon_email_path);}
+ .icon-twitter {background-image: url($icon_twitter_path);}
+ .icon-irc {background-image: url($icon_irc_path);}
+ .icon-post {background-image: url($icon_post_path);}
+ }
+}
+
+
+.primary-nav {
+ @extend .unstyled;
+ margin: 0;
+ text-align: center;
+ li {
+ display: inline-block;
+ padding: 0 $base-spacing-unit * 2;
+ @media (min-width: $medium-screen) {
+ display: inline;
+ }
+ }
+ a {
+ display: inline-block;
+ padding: ($base-spacing-unit / 3) 0;
+ color: $colour_black;
+ }
+}
+
+.btn{
+ display:inline-block;
+ vertical-align:middle;
+ white-space:nowrap;
+ font-family:inherit;
+ font-size:100%;
+ cursor:pointer;
+ border:none;
+ margin:0;
+ padding-top:0;
+ padding-bottom:0;
+ line-height:3;
+ padding-right:1em;
+ padding-left: 1em;
+ border-radius: 3px;
+ transition-duration: 0.2s;
+ &:hover,
+ &:active {
+ text-decoration: none;
+ transition-duration: 0.2s;
+ }
+}
+
+.btn--green {
+ @extend .btn;
+ background: $colour_green;
+ &:hover {background: $colour_green_dark;}
+ &:active {
+ background: $colour_green_dark_2;
+ box-shadow: inset 0px 0px 6px darken($colour_green_dark_2, 30%);
+ }
+}
+
+.btn--blue {
+ @extend .btn;
+ background: $colour_blue;
+ &:hover {background: $colour_blue_dark;}
+ &:active {
+ background: $colour_blue_dark_2;
+ box-shadow: inset 0px 0px 6px darken($colour_blue_dark_2, 30%);
+ }
+}
+
+.bg-default { background: $colour_background;}
+
+.spacer-top {
+ margin-top: $base-spacing-unit * 1.5;
+}
+.spacer-bottom {
+ margin-bottom: $base-spacing-unit * 1.5;
+}
+
+.section-header {
+ background: $colour_black;
+ padding: $base-spacing-unit /2 0;
+ float: left;
+ width: 100%;
+ p {
+ color: $colour_light_grey;
+ font-weight: normal;
+ margin: 0;
+ display: block;
+ }
+}
+
+
+/**
+ * Owl Additions
+ */
+
+.owl-carousel {
+ // Push the caption down under the monitor
+ .owl__gap {
+ float: left;
+ padding-right: 100px;
+ // Links in with whether monitor is shown or not, above under .monitor
+ @media (min-width: $monitor_breakpoint) {
+ padding-top: 100px;
+ }
+ }
+ h3 {
+ margin-bottom: 0;
+ }
+ p {
+ margin-top: 0;
+ }
+}
+
+.owl-buttons {
+ // margin-top: 100px;
+ float: right;
+ // Move the buttons up, compensating for the caption pushing and then some
+ position: relative;
+ top: -70px;
+ @media (min-width: $monitor_breakpoint) {
+ right: -20px;
+ top: -130px;
+ }
+ @extend .unstyled;
+ .owl-next,
+ .owl-prev {
+ @extend .image-replacement;
+ display: block;
+ background-color: $colour_light_grey;
+ float: left;
+ background-position: center center;
+ background-size: $base-spacing-unit * 0.5;
+ background-repeat: no-repeat;
+ height: $base-spacing-unit * 1.5;
+ width: $base-spacing-unit * 1.5;
+ margin-right: 2px;
+ &:hover {
+ background-color: darken($colour_light_grey, 10%);
+ }
+ }
+ .owl-prev {
+ background-image: url($prev_arrow_path);
+ border-radius: 3px 0 0 3px;
+ }
+ .owl-next {
+ background-image: url($next_arrow_path);
+ border-radius: 0 3px 3px 0;
+ }
+}
+
+/* Community page */
+
+.contact-options {
+ @include clearfix;
+ .column {
+ @include grid-column--one-of-two;
+ }
+}
+
+.admin-help {
+ padding: 0.2em;
+ text-align: center;
+ color: #fff;
+ background-color: #f93;
+ -moz-border-radius: 0.333em;
+ -webkit-border-radius: 0.333em;
+ border-radius: 0.333em;
+}
+
+/* Site search */
+
+// Otherwise it's the default's c. 28px
+.site-search {
+ line-height: 15px;
+}
+
+// It expects things not to be changed from old-browser defaults
+.site-search * {
+ box-sizing: content-box;
+ border-collapse: separate;
+}
+
+// So there's no unsightly move of content down for empty gap
+.gsc-control-cse {
+ padding: 0 !important;
+ border: none !important;
+}
+
+/* mock spreadsheets in running/promotion/ */
+table.promo-spreadsheet {
+ width: 100%;
+ table-layout: fixed;
+ font-size: 90%;
+ line-height: 1;
+ tr {
+ th { text-align: left; }
+ &.sheet-header th { background-color:#a7cf97; }
+ td {
+ width: 2%;
+ word-wrap: break-word;
+ }
+ }
+}
+/* mock document for example_press_releases */
+.mock-document {
+ border:1px solid #666;
+ padding:1em;
+ h2 {
+ border-top: none;
+ padding-top: 0em;
+ line-height: 1.2;
+ }
+ .replace-text {
+ background-color: #ddd;
+ color:#555;
+ }
+}
+.toggle-button {
+ display: none; /* show() by JavaScript */
+}
+
+.admin-task {
+ border: 1px solid #ddd;
+ padding: 0 24px 1em;
+ margin: 2.5em 0;
+ border-top-right-radius: 3px;
+ border-top-left-radius: 3px;
+ h3 {
+ background-color: $colour_brand;
+ border-top-right-radius: 3px;
+ border-top-left-radius: 3px;
+ padding: 0.66em 24px;
+ margin: 0 -24px 1em;
+ }
+
+ > h4 {
+ padding: 1em 0 0;
+ }
+
+ .boxout {
+ margin-top: 1.5em;
+ }
+}
+
+.admin-task__permissions {
+ color: $colour_green_dark_2;
+ font-size: 0.875em;
+ line-height: 1.4em;
+}
+
+.admin-screenshot {
+ display: block;
+ margin: 1em auto 2em;
+ padding: 0.5em;
+ border: 3px solid $colour_borders;
+} \ No newline at end of file
diff --git a/docs/_sass/fixmystreet-pro-print.scss b/docs/_sass/fixmystreet-pro-print.scss
new file mode 100644
index 000000000..43f79e064
--- /dev/null
+++ b/docs/_sass/fixmystreet-pro-print.scss
@@ -0,0 +1,36 @@
+// Styles specifically for the print version of the pro user guide
+
+body {
+ font-size: 12pt;
+}
+
+.boolean-icon {
+ text-indent: 0 !important;
+ width: auto !important;
+ height: auto !important;
+ background-image: none !important;
+}
+
+.user-guide-title {
+ margin-top: 5em;
+}
+
+.user-guide-section {
+ page-break-before: always;
+ img {
+ max-width: 60% !important;
+ }
+}
+
+.admin-task {
+ page-break-inside: avoid;
+ h3 {
+ border-bottom: 1px solid #ddd;
+ }
+}
+
+.admin-screenshot {
+ margin-top: 1em;
+ margin-bottom: 2em;
+}
+
diff --git a/docs/_sass/fixmystreet-pro.scss b/docs/_sass/fixmystreet-pro.scss
new file mode 100644
index 000000000..9670b526c
--- /dev/null
+++ b/docs/_sass/fixmystreet-pro.scss
@@ -0,0 +1,139 @@
+@import '../theme/sass/global';
+
+/*
+ * There's a conflict here with the what the FMS docs and the FMS pro site do
+ * the mySociety standard header - the following resets a lot of this
+ */
+
+ $pro-yellow: #FED876;
+
+ .ms-header {
+ border: 0;
+ }
+
+.ms-header__logo {
+
+ border-radius: 0;
+ background-position: 0 0;
+ background-size: 0 0 ;
+ background-repeat: no-repeat;
+ background-image: none;
+ width: auto;
+ height: auto;
+ display: block;
+ position: static;
+ right: auto;
+ top: auto;
+ background-color: transparent;
+ background-repeat: no-repeat;
+ margin: 10px 0;
+}
+
+.site-header {
+ background-color: white;
+ padding: 0;
+ border: 0;
+}
+
+.page-wrapper--pro {
+ background-color: #fff;
+ padding-bottom: 3em;
+}
+
+h4 {
+ text-transform: none;
+}
+
+.boxout {
+ background-color: $colour_off_white;
+ padding: 0.5em 1.5em 1.5em;
+ margin-bottom: 2em;
+ font-size: 0.875em;
+ p:last-of-type {
+ margin-bottom: 0;
+ }
+}
+
+.boxout__title {
+ text-transform: none;
+ line-height: 1.25em;
+ font-size: 1.125em;
+}
+
+.print-controls {
+ margin-top: 2em;
+}
+
+.sidebar {
+ margin-top: 2em;
+ li {
+ margin-bottom: 0.5em;
+ line-height: 1.35em;
+ li:first-of-type > a {
+ margin-top: 0.5em;
+ }
+ }
+ a {
+ display: inline-block;
+ }
+}
+
+// user guide view, for printing (but these styles will be visible on screen too
+
+.user-guide-print {
+ .ms-header,
+ .mysoc-footer,
+ .site-nav,
+ .secondary-content-column,
+ a[href="#main-nav"] {
+ display: none !important;
+ visibility: hidden;
+
+ }
+
+ .main-content-column {
+ width: 100%;
+ float: none;
+ margin: 0 auto;
+ max-width: 54em;
+ img {
+ display: block;
+ margin-left: auto;
+ margin-right: auto;
+ }
+ }
+
+ .admin-screenshot {
+ max-width: 45em;
+ }
+
+ .site-logo {
+ float: none;
+ margin: 0 auto;
+ }
+}
+
+.user-guide-cover {
+ text-align: center;
+ margin-bottom: 6em;
+}
+
+.user-guide-title {
+ font-size: 3.5em;
+ margin-bottom: 0.5em;
+ padding-bottom: 0.5em;
+ border-bottom: 3px solid $colour_borders;
+ text-align: center;
+}
+
+.user-guide-section {
+ margin-bottom: 5em;
+ padding-bottom: 3em;
+ border-bottom: 3px solid $colour_borders;
+}
+
+.admin-task {
+ h3 {
+ background-color: $pro-yellow;
+ }
+} \ No newline at end of file
diff --git a/docs/assets/css/fixmystreet-org.scss b/docs/assets/css/fixmystreet-org.scss
new file mode 100644
index 000000000..2551b389a
--- /dev/null
+++ b/docs/assets/css/fixmystreet-org.scss
@@ -0,0 +1,6 @@
+---
+# This file is read as SCSS, and automatically compiled to CSS by Jekyll
+# See http://jekyllrb.com/docs/assets/
+---
+@charset "utf-8";
+@import "fixmystreet-org"; // ie: _sass/fixmystreet-org.scss
diff --git a/docs/assets/css/fixmystreet-pro-print.scss b/docs/assets/css/fixmystreet-pro-print.scss
new file mode 100644
index 000000000..6921d5b74
--- /dev/null
+++ b/docs/assets/css/fixmystreet-pro-print.scss
@@ -0,0 +1,6 @@
+---
+# This file is read as SCSS, and automatically compiled to CSS by Jekyll
+# See http://jekyllrb.com/docs/assets/
+---
+@charset "utf-8";
+@import "fixmystreet-pro-print"; // ie: _sass/fixmystreet-pro.scss \ No newline at end of file
diff --git a/docs/assets/css/fixmystreet-pro.scss b/docs/assets/css/fixmystreet-pro.scss
new file mode 100644
index 000000000..2a9d3b6ec
--- /dev/null
+++ b/docs/assets/css/fixmystreet-pro.scss
@@ -0,0 +1,6 @@
+---
+# This file is read as SCSS, and automatically compiled to CSS by Jekyll
+# See http://jekyllrb.com/docs/assets/
+---
+@charset "utf-8";
+@import "fixmystreet-pro"; // ie: _sass/fixmystreet-pro.scss \ No newline at end of file
diff --git a/docs/assets/img/2012-07-27-screenshot.png b/docs/assets/img/2012-07-27-screenshot.png
new file mode 100644
index 000000000..47de5651c
--- /dev/null
+++ b/docs/assets/img/2012-07-27-screenshot.png
Binary files differ
diff --git a/docs/assets/img/fms-platform-logo-m.svg b/docs/assets/img/fms-platform-logo-m.svg
new file mode 100644
index 000000000..7f862bd51
--- /dev/null
+++ b/docs/assets/img/fms-platform-logo-m.svg
@@ -0,0 +1 @@
+<svg baseProfile="tiny" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 275 102.2"><g><g><g fill="#37373A"><path d="M66.1 22.7h-2.6v-2.5h15c1.7 0 2.4.7 2.4 2.4v2.8h-2.6v-1.9c0-.6-.3-.9-.9-.9h-8.5v10.5h10.2v2.5h-10.2v12.5h-2.8v-25.4zM85.5 31.4c0-.6-.3-.9-.9-.9h-1.7v-2.3h2.8c1.7 0 2.4.7 2.4 2.4v14.4c0 .6.3.9.9.9h1.7v2.3h-2.8c-1.7 0-2.4-.7-2.4-2.4v-14.4zm-.1-11.2h2.6v3.4h-2.6v-3.4zM99.6 37.8l-4.4-6.4c-.5-.7-1-.8-1.8-.8h-.8v-2.3h1.4c2 0 2.6.3 3.8 2.2l2.9 4.5c.3.5.7 1.2.7 1.2h.1s.4-.7.6-1.2l2.9-4.5c1.2-1.8 1.7-2.2 3.8-2.2h1.4v2.3h-.8c-.8 0-1.4.1-1.9.8l-4.4 6.4 7.1 10.4h-3.2l-4.9-7.4c-.3-.5-.6-1.1-.6-1.1h-.1s-.3.6-.7 1.1l-4.9 7.4h-3.2l7-10.4zM111.8 45.7h1.5c.6 0 .8-.3.9-.9l2-24.6h2.8l7.5 16.3c.7 1.4 1.4 3.3 1.4 3.3h.1s.7-1.9 1.4-3.3l7.5-16.3h2.8l2 24.6c0 .6.3.9.9.9h1.5v2.5h-2.7c-1.7 0-2.3-.7-2.4-2.4l-1.3-17c-.1-1.5-.1-3.9-.1-3.9h-.1s-.8 2.5-1.4 3.9l-6.9 14.2h-2.5l-6.7-14.2c-.6-1.4-1.5-4-1.5-4h-.1s0 2.5-.1 4l-1.3 17c-.1 1.7-.7 2.4-2.4 2.4h-2.7v-2.5zM149.4 54.1c1.8 0 3-1.4 3.7-3.3l1.2-2.7-7.1-16.7c-.3-.7-.7-.9-1.4-.9h-.4v-2.3h1.2c1.8 0 2.4.4 3.1 2.2l5.2 12.5c.4 1 .7 2.1.7 2.1h.1s.3-1.2.7-2.1l5-12.5c.7-1.8 1.3-2.2 3.1-2.2h1.2v2.3h-.4c-.7 0-1.1.2-1.4.9l-8.7 20.9c-1 2.5-3.1 4.2-5.8 4.2-2.8 0-4.4-1.9-4.4-1.9l1.3-2c.1.1 1.4 1.5 3.1 1.5zM190.2 25.9c0 1.9-1.7 3-3.2 3-.8 0-1.6-.3-2.4-1.4-.2-.3-.4-.6-.6-.8-.9-1.2-2.4-1.9-4.7-1.9-2.8 0-4.8 1-4.8 2.9 0 .6.2 1.2.8 1.7.6.5 1.6.8 3.6 1.3 6.2 1.7 6.9 1.8 8.3 2.7 1.7 1.1 3.6 3.2 3.6 6.5 0 2.9-1.4 5.2-3.3 6.7-2.3 1.8-5.3 2.4-8.3 2.4-2.9 0-5.5-.5-7.6-1.5-4.2-2.1-4.5-4.8-4.5-5.5 0-1.9 1.6-3.1 3.1-3.1 1.3 0 2.2.8 3.1 2.2.9 1.3 1.9 2.8 6 2.8.9 0 1.9-.1 2.8-.4.3-.1 2.1-.8 2.1-2.9 0-1.1-.5-1.8-1.2-2.2-.8-.6-1.4-.7-5.2-1.7-4.6-1.2-9.9-2.6-9.9-8.4 0-5.1 4-8.5 11.3-8.5 7-.3 11 3.2 11 6.1zM200.3 27.5c1.7 0 2.1 0 2.6.2.4.2 1.1.8 1.1 1.9 0 .4-.1.8-.3 1.1-.6 1.2-1.4 1.2-3.4 1.2v9.9c0 1.8.6 1.9 2.1 1.9 1.6 0 2 1.2 2 2.1 0 2.4-2.8 2.6-4.3 2.6-5.4 0-5.5-3.1-5.5-5.5v-11c-.7 0-1.3 0-1.9-.3-.2-.1-1.1-.6-1.1-1.9 0-.4 0-.7.2-1 .6-1.2 1.8-1.2 2.8-1.2v-2.8c0-.9 0-2 .8-2.8.2-.2.8-.9 2.2-.9.4 0 .8.1 1.1.2 1.7.6 1.7 2.3 1.8 3.5v2.8zM206.1 31.1c0-1 0-2.1.9-2.9.4-.4 1-.8 2-.8.5 0 1 .1 1.2.3 1.6.8 1.6 2.5 1.6 3.2v.5c.2-.6.4-1.2.8-1.8.9-1.6 2.5-2.3 4.2-2.3 2.2 0 3 1.3 3 2.7 0 .8-.2 1.4-.7 1.9-.6.6-1.4.7-2.1.8-.6 0-1.1 0-1.6.1-3.1.5-3.1 3.7-3.2 5.9v6.2c0 .9 0 2.1-.8 2.9-.5.5-1.3.8-2.1.8-.2 0-.6 0-1-.2-2-.6-2-2.3-2-3.6v-13.7zM225.8 39.6c.1 1 .3 2.1 1.3 3.1 1.3 1.4 2.8 1.4 3.2 1.4 1.6 0 2.4-.6 2.8-1 .2-.2.4-.5.7-.7.6-.5 1.2-.7 1.7-.7 1.4 0 2.6 1.2 2.6 2.6 0 .8-.4 1.7-1.6 2.5-1.8 1.3-4.2 1.8-6.5 1.8-7.8 0-10.5-5.8-10.5-10.7 0-6.1 4-10.9 10.6-10.9 7.4 0 9.5 5.9 9.5 9.8 0 2.7-1.4 2.7-2.5 2.7h-11.3zm8.4-4.3c-.2-.7-.3-1.4-.7-2.1-.8-1.1-2-1.6-3.4-1.6-3.2 0-3.9 2.3-4.3 3.7h8.4zM247.5 39.6c.1 1 .3 2.1 1.3 3.1 1.3 1.4 2.8 1.4 3.2 1.4 1.6 0 2.4-.6 2.8-1 .2-.2.4-.5.7-.7.6-.5 1.2-.7 1.7-.7 1.4 0 2.6 1.2 2.6 2.6 0 .8-.4 1.7-1.6 2.5-1.8 1.3-4.2 1.8-6.5 1.8-7.8 0-10.5-5.8-10.5-10.7 0-6.1 4.1-10.9 10.6-10.9 7.4 0 9.5 5.9 9.5 9.8 0 2.7-1.4 2.7-2.5 2.7h-11.3zm8.5-4.3c-.2-.7-.3-1.4-.7-2.1-.8-1.1-2-1.6-3.4-1.6-3.2 0-3.9 2.3-4.3 3.7h8.4zM271 27.5c1.7 0 2.1 0 2.6.2.4.2 1.1.8 1.1 1.9 0 .4-.1.8-.3 1.1-.6 1.2-1.4 1.2-3.4 1.2v9.9c0 1.8.6 1.9 2.1 1.9 1.6 0 2 1.2 2 2.1 0 2.4-2.8 2.6-4.3 2.6-5.4 0-5.5-3.1-5.5-5.5v-11c-.7 0-1.3 0-1.9-.3-.2-.1-1.1-.6-1.1-1.9 0-.4 0-.7.2-1 .6-1.2 1.8-1.2 2.8-1.2v-2.8c0-.9 0-2 .8-2.8.2-.2.8-.9 2.2-.9.4 0 .8.1 1.1.2 1.7.6 1.7 2.3 1.8 3.5v2.8zM25.2 9.1c-13.9 0-25.2 11.2-25.2 25s11.3 25 25.2 25c13.9 0 25.2-11.2 25.2-25s-11.3-25-25.2-25zm0 44.8c-3.5 0-6.9-.9-9.7-2.5l9-9.2.1-.1c.7.2 1.5.3 2.3.3 5.3 0 9.5-4.2 9.6-9.4 0-.8-.1-1.6-.3-2.4l-5 5-5.6-1.2-1.2-5.5 5-5c-.8-.2-1.6-.4-2.5-.4-5.3 0-9.5 4.2-9.6 9.4 0 1.1.2 2.2.6 3.1l-9.1 9.3c-2.2-3.2-3.5-7-3.5-11.2 0-10.9 8.9-19.8 19.9-19.8 11 0 19.9 8.9 19.9 19.8s-8.9 19.8-19.9 19.8z"/></g><g fill="#37373A"><path d="M67.8 68.3h-2.6v-2.5h12c5 0 8.7 3.3 8.7 8.5 0 5.3-3.7 8.7-8.7 8.7h-6.5v11.1h-2.8v-25.8zm9 12.2c3.7 0 6.2-2.3 6.2-6.2 0-3.8-2.5-6-6.2-6h-6.2v12.2h6.2zM90.3 69.1c0-.6-.3-.9-.9-.9h-1.7v-2.4h2.9c1.7 0 2.5.7 2.5 2.5v22.6c0 .6.3.9.9.9h1.7v2.4h-2.9c-1.7 0-2.5-.7-2.5-2.5v-22.6zM110.7 81.7h1.1v-.2c0-4.2-1.5-5.7-5.2-5.7-1 0-4 .3-4 1.8v1.3h-2.6v-1.9c0-2.8 4.8-3.4 6.6-3.4 6.4 0 7.9 3.4 7.9 7.8v9.7c0 .6.3.9.9.9h1.7v2.4h-2.8c-1.7 0-2.4-.8-2.4-2.4v-1.5h-.1s-1.7 4.4-6.7 4.4c-3.4 0-6.9-2-6.9-6 .1-7 9-7.2 12.5-7.2zm-5.1 10.6c3.9 0 6.2-4 6.2-7.5v-.9h-1.2c-3.2 0-9.6.1-9.6 4.6.1 1.9 1.6 3.8 4.6 3.8zM121.7 76.2h-2.7v-2.3h2.7v-5.6h2.7v5.6h5.1v2.3h-5.1v10.3c0 4.8 3 5.4 4.6 5.4.6 0 .9-.1.9-.1v2.5s-.5.1-1.2.1c-2.3 0-7.1-.8-7.1-7.5v-10.7zM135.1 76.2h-2.5v-2.3h2.5v-.7c0-6.7 4.7-7.5 7-7.5.8 0 1.2.1 1.2.1v2.5s-.4-.1-1-.1c-1.5 0-4.5.6-4.5 5.1v.7h5.2v2.3h-5.2v18h-2.7v-18.1zM155.2 73.4c5.9 0 10.7 4.5 10.7 10.5 0 6.1-4.8 10.7-10.7 10.7-5.9 0-10.7-4.6-10.7-10.7 0-6 4.8-10.5 10.7-10.5zm0 18.8c4.3 0 7.9-3.5 7.9-8.3 0-4.6-3.5-8-7.9-8s-7.9 3.4-7.9 8c0 4.7 3.6 8.3 7.9 8.3zM171 77.1c0-.6-.3-.9-.9-.9h-1.7v-2.4h2.8c1.7 0 2.5.7 2.5 2.3v1.4c0 .8-.1 1.5-.1 1.5h.1c1-3.1 3.2-5.4 6.4-5.4.6 0 1.1.1 1.1.1v2.7s-.5-.1-1-.1c-2.9 0-5 2.3-5.9 5.2-.4 1.3-.6 2.7-.6 4v8.5h-2.7v-16.9zM185.9 77.1c0-.6-.3-.9-.9-.9h-1.7v-2.4h2.8c1.7 0 2.5.7 2.5 2.3v.9c0 .8-.1 1.5-.1 1.5h.1c1-2.7 4.2-5.1 7.3-5.1 3.8 0 5.7 1.7 6.3 5.1h.1c1.1-2.7 4-5.1 7.5-5.1 4.9 0 6.7 2.9 6.7 7.9v9.6c0 .6.3.9.9.9h1.7v2.4h-2.9c-1.7 0-2.5-.7-2.5-2.5v-9.8c0-3.3-.7-6-4.4-6-3.1 0-5.6 2.7-6.4 5.7-.3.9-.4 1.9-.4 2.9v9.6h-2.7v-12.2c0-3.1-.4-6-4.3-6-3.3 0-5.8 2.9-6.6 6-.2.8-.3 1.8-.3 2.7v9.6h-2.7v-17.1z"/></g></g></g></svg> \ No newline at end of file
diff --git a/docs/assets/img/fms-platform-logo.svg b/docs/assets/img/fms-platform-logo.svg
new file mode 100644
index 000000000..cd9d9f071
--- /dev/null
+++ b/docs/assets/img/fms-platform-logo.svg
@@ -0,0 +1 @@
+<svg baseProfile="tiny" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 445.8 50"><g><g><g fill="#37373A"><path d="M66.1 13.6h-2.6v-2.5h15c1.7 0 2.4.7 2.4 2.4v2.8h-2.6v-1.9c0-.6-.3-.9-.9-.9h-8.5v10.5h10.2v2.5h-10.2v12.5h-2.8v-25.4zM85.5 22.3c0-.6-.3-.9-.9-.9h-1.7v-2.3h2.8c1.7 0 2.4.7 2.4 2.4v14.4c0 .6.3.9.9.9h1.7v2.3h-2.8c-1.7 0-2.4-.7-2.4-2.4v-14.4zm-.1-11.2h2.6v3.4h-2.6v-3.4zM99.6 28.7l-4.4-6.4c-.5-.7-1-.8-1.8-.8h-.8v-2.3h1.4c2 0 2.6.3 3.8 2.2l2.9 4.5c.3.5.7 1.2.7 1.2h.1s.4-.7.6-1.2l2.9-4.5c1.2-1.8 1.7-2.2 3.8-2.2h1.4v2.3h-.8c-.8 0-1.4.1-1.9.8l-4.4 6.4 7.1 10.4h-3.2l-4.9-7.4c-.3-.5-.6-1.1-.6-1.1h-.1s-.3.6-.7 1.1l-4.9 7.4h-3.2l7-10.4zM111.8 36.6h1.5c.6 0 .8-.3.9-.9l2-24.6h2.8l7.5 16.3c.7 1.4 1.4 3.3 1.4 3.3h.1s.7-1.9 1.4-3.3l7.5-16.3h2.8l2 24.6c0 .6.3.9.9.9h1.5v2.5h-2.7c-1.7 0-2.3-.7-2.4-2.4l-1.3-17c-.1-1.5-.1-3.9-.1-3.9h-.1s-.8 2.5-1.4 3.9l-6.7 14.2h-2.5l-6.9-14.2c-.6-1.4-1.5-4-1.5-4h-.1s0 2.5-.1 4l-1.3 17c-.1 1.7-.7 2.4-2.4 2.4h-2.7v-2.5zM149.4 45c1.8 0 3-1.4 3.7-3.3l1.2-2.7-7.1-16.7c-.3-.7-.7-.9-1.4-.9h-.4v-2.3h1.2c1.8 0 2.4.4 3.1 2.2l5.2 12.5c.4 1 .7 2.1.7 2.1h.1s.3-1.2.7-2.1l5-12.5c.7-1.8 1.3-2.2 3.1-2.2h1.2v2.3h-.4c-.7 0-1.1.2-1.4.9l-8.7 20.9c-1 2.5-3.1 4.2-5.8 4.2-2.8 0-4.4-1.9-4.4-1.9l1.3-2c.1 0 1.4 1.5 3.1 1.5zM190.2 16.7c0 1.9-1.7 3-3.2 3-.8 0-1.6-.3-2.4-1.4-.2-.3-.4-.6-.6-.8-.9-1.2-2.4-1.9-4.7-1.9-2.8 0-4.8 1-4.8 2.9 0 .6.2 1.2.8 1.7.6.5 1.6.8 3.6 1.3 6.2 1.7 6.9 1.8 8.3 2.7 1.7 1.1 3.6 3.2 3.6 6.5 0 2.9-1.4 5.2-3.3 6.7-2.3 1.8-5.3 2.4-8.3 2.4-2.9 0-5.5-.5-7.6-1.5-4.2-2.1-4.5-4.8-4.5-5.5 0-1.9 1.6-3.1 3.1-3.1 1.3 0 2.2.8 3.1 2.2.9 1.3 1.9 2.8 6 2.8.9 0 1.9-.1 2.8-.4.3-.1 2.1-.8 2.1-2.9 0-1.1-.5-1.8-1.2-2.2-.8-.6-1.4-.7-5.2-1.7-4.6-1.2-9.9-2.6-9.9-8.4 0-5.1 4-8.5 11.3-8.5 7-.3 11 3.3 11 6.1zM200.3 18.4c1.7 0 2.1 0 2.6.2.4.2 1.1.8 1.1 1.9 0 .4-.1.8-.3 1.1-.6 1.2-1.4 1.2-3.4 1.2v9.9c0 1.8.6 1.9 2.1 1.9 1.6 0 2 1.2 2 2.1 0 2.4-2.8 2.6-4.3 2.6-5.4 0-5.5-3.1-5.5-5.5v-11c-.7 0-1.3 0-1.9-.3-.2-.1-1.1-.6-1.1-1.9 0-.4 0-.7.2-1 .6-1.2 1.8-1.2 2.8-1.2v-2.8c0-.9 0-2 .8-2.8.2-.2.8-.9 2.2-.9.4 0 .8.1 1.1.2 1.7.6 1.7 2.3 1.8 3.5v2.8zM206.1 21.9c0-1 0-2.1.9-2.9.4-.4 1-.8 2-.8.5 0 1 .1 1.2.3 1.6.8 1.6 2.5 1.6 3.2v.5c.2-.6.4-1.2.8-1.8.9-1.6 2.5-2.3 4.2-2.3 2.2 0 3 1.3 3 2.7 0 .8-.2 1.4-.7 1.9-.6.6-1.4.7-2.1.8-.6 0-1.1 0-1.6.1-3.1.5-3.1 3.7-3.2 5.9v6.2c0 .9 0 2.1-.8 2.9-.5.5-1.3.8-2.1.8-.2 0-.6 0-1-.2-2-.6-2-2.3-2-3.6v-13.7zM225.8 30.5c.1 1 .3 2.1 1.3 3.1 1.3 1.4 2.8 1.4 3.2 1.4 1.6 0 2.4-.6 2.8-1 .2-.2.4-.5.7-.7.6-.5 1.2-.7 1.7-.7 1.4 0 2.6 1.2 2.6 2.6 0 .8-.4 1.7-1.6 2.5-1.8 1.3-4.2 1.8-6.5 1.8-7.8 0-10.5-5.8-10.5-10.7 0-6.1 4-10.9 10.6-10.9 7.4 0 9.5 5.9 9.5 9.8 0 2.7-1.4 2.7-2.5 2.7h-11.3zm8.4-4.3c-.2-.7-.3-1.4-.7-2.1-.8-1.1-2-1.6-3.4-1.6-3.2 0-3.9 2.3-4.3 3.7h8.4zM247.5 30.5c.1 1 .3 2.1 1.3 3.1 1.3 1.4 2.8 1.4 3.2 1.4 1.6 0 2.4-.6 2.8-1 .2-.2.4-.5.7-.7.6-.5 1.2-.7 1.7-.7 1.4 0 2.6 1.2 2.6 2.6 0 .8-.4 1.7-1.6 2.5-1.8 1.3-4.2 1.8-6.5 1.8-7.8 0-10.5-5.8-10.5-10.7 0-6.1 4.1-10.9 10.6-10.9 7.4 0 9.5 5.9 9.5 9.8 0 2.7-1.4 2.7-2.5 2.7h-11.3zm8.5-4.3c-.2-.7-.3-1.4-.7-2.1-.8-1.1-2-1.6-3.4-1.6-3.2 0-3.9 2.3-4.3 3.7h8.4zM271 18.4c1.7 0 2.1 0 2.6.2.4.2 1.1.8 1.1 1.9 0 .4-.1.8-.3 1.1-.6 1.2-1.4 1.2-3.4 1.2v9.9c0 1.8.6 1.9 2.1 1.9 1.6 0 2 1.2 2 2.1 0 2.4-2.8 2.6-4.3 2.6-5.4 0-5.5-3.1-5.5-5.5v-11c-.7 0-1.3 0-1.9-.3-.2-.1-1.1-.6-1.1-1.9 0-.4 0-.7.2-1 .6-1.2 1.8-1.2 2.8-1.2v-2.8c0-.9 0-2 .8-2.8.2-.2.8-.9 2.2-.9.4 0 .8.1 1.1.2 1.7.6 1.7 2.3 1.8 3.5v2.8zM25.2 0c-13.9 0-25.2 11.2-25.2 25s11.3 25 25.2 25c13.9 0 25.2-11.2 25.2-25s-11.3-25-25.2-25zm0 44.8c-3.5 0-6.9-.9-9.7-2.5l9-9.2.1-.1c.7.2 1.5.3 2.3.3 5.3 0 9.5-4.2 9.6-9.4 0-.8-.1-1.6-.3-2.4l-5 5-5.6-1.2-1.2-5.5 5-5c-.8-.2-1.6-.4-2.5-.4-5.3 0-9.5 4.2-9.6 9.4 0 1.1.2 2.2.6 3.1l-9.1 9.3c-2.2-3.2-3.5-7-3.5-11.2 0-10.9 8.9-19.8 19.9-19.8 11 0 19.9 8.9 19.9 19.8s-8.9 19.8-19.9 19.8z"/></g><g fill="#37373A"><path d="M294.5 14.1h-2.6v-2.5h12c5 0 8.7 3.3 8.7 8.5 0 5.3-3.7 8.7-8.7 8.7h-6.5v11.1h-2.8v-25.8zm9 12.2c3.7 0 6.2-2.3 6.2-6.2 0-3.8-2.5-6-6.2-6h-6.2v12.2h6.2zM317 14.8c0-.6-.3-.9-.9-.9h-1.7v-2.4h2.9c1.7 0 2.5.7 2.5 2.5v22.6c0 .6.3.9.9.9h1.7v2.4h-2.9c-1.7 0-2.5-.7-2.5-2.5v-22.6zM337.4 27.4h1.1v-.2c0-4.2-1.5-5.7-5.2-5.7-1 0-4 .3-4 1.8v1.3h-2.6v-1.9c0-2.8 4.8-3.4 6.6-3.4 6.4 0 7.9 3.4 7.9 7.8v9.7c0 .6.3.9.9.9h1.7v2.4h-2.8c-1.7 0-2.4-.8-2.4-2.4v-1.5h-.1s-1.7 4.4-6.7 4.4c-3.4 0-6.9-2-6.9-6 .1-7 9-7.2 12.5-7.2zm-5 10.6c3.9 0 6.2-4 6.2-7.5v-.9h-1.2c-3.2 0-9.6.1-9.6 4.6.1 1.9 1.5 3.8 4.6 3.8zM348.5 21.9h-2.7v-2.3h2.7v-5.6h2.7v5.6h5.1v2.3h-5.1v10.3c0 4.8 3 5.4 4.6 5.4.6 0 .9-.1.9-.1v2.5s-.5.1-1.2.1c-2.3 0-7.1-.8-7.1-7.5v-10.7zM361.8 21.9h-2.5v-2.3h2.5v-.7c0-6.7 4.7-7.5 7-7.5.8 0 1.2.1 1.2.1v2.5s-.4-.1-1-.1c-1.5 0-4.5.6-4.5 5.1v.7h5.2v2.3h-5.2v18h-2.7v-18.1zM381.9 19.1c5.9 0 10.7 4.5 10.7 10.5 0 6.1-4.8 10.7-10.7 10.7-5.9 0-10.7-4.6-10.7-10.7 0-6 4.8-10.5 10.7-10.5zm.1 18.8c4.3 0 7.9-3.5 7.9-8.3 0-4.6-3.5-8-7.9-8s-7.9 3.4-7.9 8c0 4.8 3.5 8.3 7.9 8.3zM397.8 22.9c0-.6-.3-.9-.9-.9h-1.7v-2.4h2.8c1.7 0 2.5.7 2.5 2.3v1.4c0 .8-.1 1.5-.1 1.5h.1c1-3.1 3.2-5.4 6.4-5.4.6 0 1.1.1 1.1.1v2.7s-.5-.1-1-.1c-2.9 0-5 2.3-5.9 5.2-.4 1.3-.6 2.7-.6 4v8.5h-2.7v-16.9zM412.6 22.9c0-.6-.3-.9-.9-.9h-1.7v-2.4h2.8c1.7 0 2.5.7 2.5 2.3v.9c0 .8-.1 1.5-.1 1.5h.1c1-2.7 4.2-5.1 7.3-5.1 3.8 0 5.7 1.7 6.3 5.1h.1c1.1-2.7 4-5.1 7.5-5.1 4.9 0 6.7 2.9 6.7 7.9v9.6c0 .6.3.9.9.9h1.7v2.4h-2.8c-1.7 0-2.5-.7-2.5-2.5v-9.8c0-3.3-.7-6-4.4-6-3.1 0-5.6 2.7-6.4 5.7-.3.9-.4 1.9-.4 2.9v9.6h-2.7v-12.2c0-3.1-.4-6-4.3-6-3.3 0-5.8 2.9-6.6 6-.2.8-.3 1.8-.3 2.7v9.6h-2.7v-17.1z"/></g></g></g></svg> \ No newline at end of file
diff --git a/docs/assets/img/fms-twitter-avatar-128.jpg b/docs/assets/img/fms-twitter-avatar-128.jpg
new file mode 100644
index 000000000..cb7a3d252
--- /dev/null
+++ b/docs/assets/img/fms-twitter-avatar-128.jpg
Binary files differ
diff --git a/docs/assets/img/fms-unusual-bird-screenshot.jpg b/docs/assets/img/fms-unusual-bird-screenshot.jpg
new file mode 100644
index 000000000..bcf910381
--- /dev/null
+++ b/docs/assets/img/fms-unusual-bird-screenshot.jpg
Binary files differ
diff --git a/docs/assets/img/fms_bodies_and_contacts.png b/docs/assets/img/fms_bodies_and_contacts.png
new file mode 100644
index 000000000..f95e56f31
--- /dev/null
+++ b/docs/assets/img/fms_bodies_and_contacts.png
Binary files differ
diff --git a/docs/assets/img/fms_integration_0.png b/docs/assets/img/fms_integration_0.png
new file mode 100644
index 000000000..eec2ca08b
--- /dev/null
+++ b/docs/assets/img/fms_integration_0.png
Binary files differ
diff --git a/docs/assets/img/fms_integration_1.png b/docs/assets/img/fms_integration_1.png
new file mode 100644
index 000000000..171c7e4d0
--- /dev/null
+++ b/docs/assets/img/fms_integration_1.png
Binary files differ
diff --git a/docs/assets/img/fms_integration_2.png b/docs/assets/img/fms_integration_2.png
new file mode 100644
index 000000000..227d1d48d
--- /dev/null
+++ b/docs/assets/img/fms_integration_2.png
Binary files differ
diff --git a/docs/assets/img/fms_integration_3.png b/docs/assets/img/fms_integration_3.png
new file mode 100644
index 000000000..4f5760dd5
--- /dev/null
+++ b/docs/assets/img/fms_integration_3.png
Binary files differ
diff --git a/docs/assets/img/fms_with_sms_flowchart.png b/docs/assets/img/fms_with_sms_flowchart.png
new file mode 100644
index 000000000..0d5da6113
--- /dev/null
+++ b/docs/assets/img/fms_with_sms_flowchart.png
Binary files differ
diff --git a/docs/assets/img/icon-arrow-left.svg b/docs/assets/img/icon-arrow-left.svg
new file mode 100644
index 000000000..4b9af527e
--- /dev/null
+++ b/docs/assets/img/icon-arrow-left.svg
@@ -0,0 +1 @@
+<svg baseProfile="tiny" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12.7 18.5"><g><g><path fill="#fff" d="M8.6 0h4.1l-5.8 9.2 5.8 9.3h-4.1l-8.6-9.3z"/></g></g></svg> \ No newline at end of file
diff --git a/docs/assets/img/icon-arrow-right.svg b/docs/assets/img/icon-arrow-right.svg
new file mode 100644
index 000000000..20cf59a77
--- /dev/null
+++ b/docs/assets/img/icon-arrow-right.svg
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Tiny//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd">
+<svg version="1.1" baseProfile="tiny" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
+ y="0px" viewBox="0 0 14.5 18.5" xml:space="preserve">
+<g id="Background">
+</g>
+<g id="Working">
+ <g id="Alert">
+ </g>
+ <g id="mySociety_Logo">
+ <g id="Earth">
+ <g id="Paintbrush">
+ <g id="Refresh_F">
+ </g>
+ </g>
+ </g>
+ <g id="Duplicate_files">
+ </g>
+ <g id="Upload_-_Circle_1_">
+ </g>
+ <g id="Upload_-_Circle">
+ </g>
+ <polygon fill="#FFFFFF" points="5.8,0 1.8,0 7.6,9.2 1.8,18.5 5.8,18.5 14.5,9.2 "/>
+ <g id="Mail">
+ </g>
+ </g>
+</g>
+</svg>
diff --git a/docs/assets/img/icon-document.svg b/docs/assets/img/icon-document.svg
new file mode 100644
index 000000000..7b4adbde6
--- /dev/null
+++ b/docs/assets/img/icon-document.svg
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Tiny//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd">
+<svg version="1.1" baseProfile="tiny" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
+ y="0px" viewBox="0 0 20.1 23" xml:space="preserve">
+<g id="Background">
+</g>
+<g id="Working">
+ <g id="Alert">
+ </g>
+ <g id="mySociety_Logo">
+ <g id="Earth">
+ <g id="Paintbrush">
+ <g id="Refresh_F">
+ </g>
+ </g>
+ </g>
+ <g id="Duplicate_files">
+ </g>
+ <g id="Upload_-_Circle_1_">
+ </g>
+ <g id="Upload_-_Circle">
+ </g>
+ <path fill="#FFFFFF" d="M14.6,0H4.3v4.3H0V23h15.8v-4.3h4.3V5.9L14.6,0z M12.9,20.1H2.9V7.2h1.4v11.5h8.6V20.1z M7.2,15.8V2.9h5.8
+ v4.3h4.3v8.6H7.2z"/>
+ <g id="Mail">
+ </g>
+ </g>
+</g>
+</svg>
diff --git a/docs/assets/img/icon-download.svg b/docs/assets/img/icon-download.svg
new file mode 100644
index 000000000..672eeaed0
--- /dev/null
+++ b/docs/assets/img/icon-download.svg
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Tiny//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd">
+<svg version="1.1" baseProfile="tiny" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
+ y="0px" viewBox="0 0 22.5 21" xml:space="preserve">
+<g id="Background">
+</g>
+<g id="Working">
+ <g id="Alert">
+ </g>
+ <g id="mySociety_Logo">
+ <g id="Earth">
+ <g id="Paintbrush">
+ <g id="Refresh_F">
+ </g>
+ </g>
+ </g>
+ <g id="Duplicate_files">
+ </g>
+ <g id="Upload_-_Circle_1_">
+ </g>
+ <g id="Upload_-_Circle">
+ </g>
+ <g>
+ <path fill="#FFFFFF" d="M21.3,11.4c-0.7,0-1.2,0.6-1.2,1.2v5.9H2.5v-5.9c0-0.7-0.6-1.2-1.2-1.2S0,11.9,0,12.6v7.1
+ C0,20.4,0.6,21,1.2,21h20c0.7,0,1.2-0.6,1.2-1.2v-7.1C22.5,11.9,22,11.4,21.3,11.4z"/>
+ <path fill="#FFFFFF" d="M10.8,15.5c0.1,0.2,0.3,0.3,0.5,0.3c0.2,0,0.4-0.1,0.5-0.3l4.1-5.6c0.1-0.2,0.2-0.4,0-0.6
+ c-0.1-0.2-0.3-0.3-0.5-0.3h-2.7V1.4C12.7,0.6,12,0,11.3,0S9.8,0.6,9.8,1.4v7.5H7.2C6.9,8.9,6.7,9,6.6,9.2c-0.1,0.2-0.1,0.4,0,0.6
+ L10.8,15.5z"/>
+ </g>
+ <g id="Mail">
+ </g>
+ </g>
+</g>
+</svg>
diff --git a/docs/assets/img/icon-email.svg b/docs/assets/img/icon-email.svg
new file mode 100644
index 000000000..6e3ed145f
--- /dev/null
+++ b/docs/assets/img/icon-email.svg
@@ -0,0 +1 @@
+<svg baseProfile="tiny" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 19.3 20"><g><g><path fill="#fff" d="M0 11c0-1.7.3-3.2.9-4.5.5-1.4 1.3-2.5 2.3-3.5 1-1 2.1-1.7 3.4-2.2 1.4-.5 2.8-.8 4.2-.8 1.3 0 2.5.2 3.5.6 1.1.4 1.9 1 2.7 1.8.7.8 1.3 1.7 1.7 2.7.4 1.1.6 2.2.6 3.4 0 1.1-.2 2-.5 2.9-.3.8-.8 1.5-1.3 2s-1.1.9-1.8 1.2c-.7.3-1.3.4-2 .4s-1.3-.2-1.8-.5-.8-.7-1-1.3c-.2.2-.3.4-.6.6-.2.2-.5.4-.7.5l-.8.3c-.3.1-.5.1-.7.1-1 0-1.7-.3-2.3-1-.6-.5-.8-1.4-.8-2.5 0-.7.1-1.5.3-2.2.2-.7.6-1.3 1-1.9.4-.5.9-1 1.5-1.3.6-.3 1.2-.5 1.9-.5.4 0 .7.1 1 .3.3.2.5.5.7.9l.4-1h2.4l-1.1 5.3c-.3 1.2 0 1.7 1 1.7.3 0 .7-.1 1-.3.3-.2.6-.5.9-.8.2-.3.4-.8.6-1.3.1-.5.2-1 .2-1.6 0-.8-.1-1.6-.3-2.3-.2-.7-.6-1.4-1.1-2-.5-.6-1.2-1.1-2-1.4-.8-.4-1.8-.5-3-.5-1 0-1.9.2-2.9.6-.8.5-1.7 1.1-2.4 1.8-.7.8-1.3 1.7-1.8 2.7-.5 1.1-.7 2.2-.7 3.5 0 1.2.2 2.1.6 3 .4.8.9 1.5 1.5 2.1.6.5 1.4.9 2.2 1.2.8.3 1.7.4 2.5.4.6 0 1.2-.1 1.8-.2.6-.2 1.2-.4 1.7-.6l.8 2.2c-.7.4-1.5.6-2.2.8-.7.1-1.5.2-2.4.2-1.2 0-2.3-.2-3.4-.5-1.1-.4-2.1-.9-2.9-1.6-.8-.7-1.5-1.7-2-2.8-.5-1.2-.8-2.5-.8-4.1zm7.9 0c0 .9.4 1.4 1.1 1.4.2 0 .4-.1.6-.2.2-.1.4-.4.7-.7l.5-2.9c-.1-.2-.2-.3-.4-.4-.2-.1-.4-.2-.6-.2-.2-.1-.5 0-.7.2-.3.2-.5.5-.6.8-.2.3-.3.6-.4 1-.1.3-.2.7-.2 1z"/></g></g></svg> \ No newline at end of file
diff --git a/docs/assets/img/icon-github.svg b/docs/assets/img/icon-github.svg
new file mode 100644
index 000000000..9679d7229
--- /dev/null
+++ b/docs/assets/img/icon-github.svg
@@ -0,0 +1 @@
+<svg baseProfile="tiny" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 23.4 18"><g><g><path fill="#fff" d="M.3 9.5c1-.3 2.4-.6 4.9-.7l-.2-.4c-1 0-3.9.1-4.9.4 0 0-.1 0-.1-.1 0 0 0-.1.1-.1 1-.2 3.9-.4 4.9-.4-.3-.6-.4-1.4-.4-2.3 0-1.5.5-2.1 1.1-2.9-.4-1.8.2-3 .2-3s1-.2 3 1.2c1.1-.5 3.9-.5 5.2-.1.8-.5 2.3-1.3 2.9-1.1.2.3.5 1 .2 2.7.2.4 1.3 1.2 1.3 3.4 0 .8-.1 1.5-.3 2.1 2.5 0 4 .2 5.1.4 0 0 .1 0 .1.1 0 0 0 .1-.1.1-1-.2-2.5-.4-5.1-.4l-.1.4c.9 0 3.3.1 5.2.7l.1.1s0 .1-.1.1c-2-.6-4.5-.7-5.3-.7-.7 1.6-2.2 2.1-4.5 2.4.8.5 1 1.1 1 2.7v2.2c0 .6.9.9.9 1.1 0 .2-.8.2-1.1 0-1-.3-.9-1.1-.9-1.1v-2.2s.1-1.2-.4-1.2v3.6c0 .8.5 1 .5 1.3 0 .5-1 0-1.3-.4-.5-.5-.4-1.5-.4-2.2v-2.4h-.3s.1 3.6-.2 4.3c-.4.8-1.5 1.1-1.5.7 0-.3.3-.2.4-.8.1-.5.1-4.2.1-4.2s-.3.3-.3 1v2.7c0 .7-1 1.1-1.4 1.1-.2 0-.5 0-.5-.1 0-.3.9-.5.9-1.1v-2s-.4.1-1.1.1c-1.6 0-2.1-1-2.3-1.6-.3-.7-.7-1.1-1.1-1.4-.3-.2-.3-.4 0-.4 1.4-.3 1.8 1.6 2.7 1.9.7.2 1.5.1 2-.2.1-.6.5-1.1.8-1.3-2.6-.4-4-1.2-4.7-2.5-2.5 0-3.9.4-5 .6-.1 0-.1 0-.2.1 0 0-.1 0-.1-.1 0 0 0-.1.1-.1h.2z"/></g></g></svg> \ No newline at end of file
diff --git a/docs/assets/img/icon-hash.svg b/docs/assets/img/icon-hash.svg
new file mode 100644
index 000000000..70931efff
--- /dev/null
+++ b/docs/assets/img/icon-hash.svg
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Tiny//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd">
+<svg version="1.1" baseProfile="tiny" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
+ y="0px" viewBox="0 0 13.2 18" xml:space="preserve">
+<g id="Background">
+</g>
+<g id="Working">
+ <g id="Alert">
+ </g>
+ <g id="mySociety_Logo">
+ <g id="Earth">
+ <g id="Paintbrush">
+ <g id="Refresh_F">
+ </g>
+ </g>
+ </g>
+ <g id="Duplicate_files">
+ </g>
+ <g id="Upload_-_Circle_1_">
+ </g>
+ <g id="Upload_-_Circle">
+ </g>
+ <path fill="#FFFFFF" d="M2,13H0v-3h2.3l0.3-2.7H0.6v-3H3L3.6,0h2.7L5.8,4.4h2.5L8.9,0h2.7L11,4.4h2.2v3h-2.5L10.3,10h2.3v3H10
+ l-0.6,5H6.6l0.6-5H4.7l-0.6,5H1.4L2,13z M7.6,10l0.3-2.7H5.4L5,10H7.6z"/>
+ <g id="Mail">
+ </g>
+ </g>
+</g>
+</svg>
diff --git a/docs/assets/img/icon-help.svg b/docs/assets/img/icon-help.svg
new file mode 100644
index 000000000..b562051f4
--- /dev/null
+++ b/docs/assets/img/icon-help.svg
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Tiny//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd">
+<svg version="1.1" baseProfile="tiny" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
+ y="0px" viewBox="0 0 113.5 113.5" xml:space="preserve">
+<g id="Background">
+</g>
+<g id="Working">
+ <g id="Alert">
+ </g>
+ <g id="mySociety_Logo">
+ <g id="Earth">
+ <g id="Paintbrush">
+ <g id="Refresh_F">
+ </g>
+ </g>
+ </g>
+ <g id="Duplicate_files">
+ </g>
+ <g id="Upload_-_Circle_1_">
+ </g>
+ <g id="Upload_-_Circle">
+ </g>
+ <g>
+ <g>
+ <path fill="#37373A" d="M56.7,113.5C25.5,113.5,0,88,0,56.7S25.5,0,56.7,0s56.7,25.5,56.7,56.7S88,113.5,56.7,113.5z M56.7,6
+ C28.8,6,6,28.8,6,56.7s22.8,50.7,50.7,50.7s50.7-22.8,50.7-50.7S84.7,6,56.7,6z"/>
+ <path fill="#37373A" d="M56.7,22.1c-19.1,0-34.7,15.6-34.7,34.7c0,19.1,15.6,34.7,34.7,34.7s34.7-15.6,34.7-34.7
+ C91.4,37.6,75.9,22.1,56.7,22.1z M84.7,44l-14.6,5.5c-1.4-2.6-3.5-4.7-6.1-6.1l5.5-14.7C76.2,31.8,81.7,37.3,84.7,44z M56.7,68
+ c-6.2,0-11.3-5.1-11.3-11.3c0-6.2,5.1-11.3,11.3-11.3C63,45.5,68,50.5,68,56.7C68,63,63,68,56.7,68z M44,28.7l5.5,14.7
+ c-2.6,1.4-4.7,3.5-6.1,6.1L28.7,44C31.8,37.3,37.3,31.8,44,28.7z M28.7,69.4L43.4,64c1.4,2.6,3.5,4.7,6.1,6.1L44,84.7
+ C37.3,81.7,31.8,76.2,28.7,69.4z M69.4,84.7L64,70.1c2.6-1.4,4.7-3.5,6.1-6.1l14.6,5.5C81.7,76.2,76.2,81.7,69.4,84.7z"/>
+ </g>
+ <g>
+ <path fill="#333333" d="M56.7,113.5C25.5,113.5,0,88,0,56.7S25.5,0,56.7,0s56.7,25.5,56.7,56.7S88,113.5,56.7,113.5z M56.7,6
+ C28.8,6,6,28.8,6,56.7s22.8,50.7,50.7,50.7s50.7-22.8,50.7-50.7S84.7,6,56.7,6z"/>
+ <path fill="#333333" d="M56.7,22.1c-19.1,0-34.7,15.6-34.7,34.7c0,19.1,15.6,34.7,34.7,34.7s34.7-15.6,34.7-34.7
+ C91.4,37.6,75.9,22.1,56.7,22.1z M84.7,44l-14.6,5.5c-1.4-2.6-3.5-4.7-6.1-6.1l5.5-14.7C76.2,31.8,81.7,37.3,84.7,44z M56.7,68
+ c-6.2,0-11.3-5.1-11.3-11.3c0-6.2,5.1-11.3,11.3-11.3C63,45.5,68,50.5,68,56.7C68,63,63,68,56.7,68z M44,28.7l5.5,14.7
+ c-2.6,1.4-4.7,3.5-6.1,6.1L28.7,44C31.8,37.3,37.3,31.8,44,28.7z M28.7,69.4L43.4,64c1.4,2.6,3.5,4.7,6.1,6.1L44,84.7
+ C37.3,81.7,31.8,76.2,28.7,69.4z M69.4,84.7L64,70.1c2.6-1.4,4.7-3.5,6.1-6.1l14.6,5.5C81.7,76.2,76.2,81.7,69.4,84.7z"/>
+ </g>
+ </g>
+ <g id="Mail">
+ </g>
+ </g>
+</g>
+</svg>
diff --git a/docs/assets/img/icon-mail.svg b/docs/assets/img/icon-mail.svg
new file mode 100644
index 000000000..45f712365
--- /dev/null
+++ b/docs/assets/img/icon-mail.svg
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Tiny//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd">
+<svg version="1.1" baseProfile="tiny" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
+ y="0px" viewBox="0 0 23 16" xml:space="preserve">
+<g id="Background">
+</g>
+<g id="Working">
+ <g id="Alert">
+ </g>
+ <g id="mySociety_Logo">
+ <g id="Earth">
+ <g id="Paintbrush">
+ <g id="Refresh_F">
+ </g>
+ </g>
+ </g>
+ <g id="Duplicate_files">
+ </g>
+ <g id="Upload_-_Circle_1_">
+ </g>
+ <g id="Upload_-_Circle">
+ </g>
+ <g id="Mail">
+ <path fill="#FFFFFF" d="M11.5,9.3L18.7,3c0,0-0.1,0-0.1,0h-14c0,0-0.1,0-0.1,0L11.5,9.3z"/>
+ <path fill="#FFFFFF" d="M19.5,4c0-0.1,0-0.2-0.1-0.3l-5,4.5l5,4.4c0.1-0.1,0.1-0.3,0.1-0.5V4z"/>
+ <path fill="#FFFFFF" d="M3.6,3.6c0,0.1-0.1,0.2-0.1,0.4v8c0,0.1,0,0.3,0.1,0.4l5-4.3L3.6,3.6z"/>
+ <path fill="#FFFFFF" d="M13.6,8.8l-2.1,1.9L9.4,8.8L4.5,13c0,0,0,0,0.1,0h14L13.6,8.8z"/>
+ </g>
+ </g>
+</g>
+</svg>
diff --git a/docs/assets/img/icon-opensource.svg b/docs/assets/img/icon-opensource.svg
new file mode 100644
index 000000000..8611c22dd
--- /dev/null
+++ b/docs/assets/img/icon-opensource.svg
@@ -0,0 +1 @@
+<svg baseProfile="tiny" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 113.5 113.5"><g><g><path fill="#37373A" d="M56.7 113.5c-31.2 0-56.7-25.5-56.7-56.8s25.5-56.7 56.7-56.7 56.7 25.5 56.7 56.7-25.4 56.8-56.7 56.8zm0-107.5c-27.9 0-50.7 22.8-50.7 50.7s22.8 50.7 50.7 50.7 50.7-22.8 50.7-50.7-22.7-50.7-50.7-50.7zM41.3 57.8c0-8.5 6.9-15.4 15.4-15.4s15.4 6.9 15.4 15.4c0 5.9-3.3 11-8.2 13.6l10.2 20.3c12.3-6.4 20.7-19.2 20.7-33.9 0-21.1-17.1-38.2-38.2-38.2s-38.2 17.1-38.2 38.2c0 14.8 8.4 27.6 20.7 33.9l10.2-20.3c-4.7-2.6-8-7.7-8-13.6z"/><path fill="#333" d="M56.7 113.5c-31.2 0-56.7-25.5-56.7-56.8s25.5-56.7 56.7-56.7 56.7 25.5 56.7 56.7-25.4 56.8-56.7 56.8zm0-107.5c-27.9 0-50.7 22.8-50.7 50.7s22.8 50.7 50.7 50.7 50.7-22.8 50.7-50.7-22.7-50.7-50.7-50.7zM41.3 57.8c0-8.5 6.9-15.4 15.4-15.4s15.4 6.9 15.4 15.4c0 5.9-3.3 11-8.2 13.6l10.2 20.3c12.3-6.4 20.7-19.2 20.7-33.9 0-21.1-17.1-38.2-38.2-38.2s-38.2 17.1-38.2 38.2c0 14.8 8.4 27.6 20.7 33.9l10.2-20.3c-4.7-2.6-8-7.7-8-13.6z"/></g></g></svg> \ No newline at end of file
diff --git a/docs/assets/img/icon-paint.svg b/docs/assets/img/icon-paint.svg
new file mode 100644
index 000000000..5c699e801
--- /dev/null
+++ b/docs/assets/img/icon-paint.svg
@@ -0,0 +1 @@
+<svg baseProfile="tiny" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 113.5 113.5"><g><g><g fill="#37373A"><path d="M56.7 113.5c-31.2 0-56.7-25.5-56.7-56.8s25.5-56.7 56.7-56.7 56.7 25.5 56.7 56.7-25.4 56.8-56.7 56.8zm0-107.5c-27.9 0-50.7 22.8-50.7 50.7s22.8 50.7 50.7 50.7 50.7-22.8 50.7-50.7-22.7-50.7-50.7-50.7zM86.8 28.3c-2.6-2.6-5.8.6-5.8.6s-15.9 15.9-19.1 19c-3.2 3.2-12.3 6.8-12.3 6.8l10.5 10.5s3.9-8.9 7-12.1l19.1-19.1s3.2-3.1.6-5.7zM37.8 65.2c-4.8 11.6-4 18.1-12.2 20.2 31.3 5.4 31.3-17 31.3-17l-10.4-10.4s-6.3 1.6-8.7 7.2zm-3 16.7c2.4-2.8 6.1-16.1 11-19.4 3.3 2.3-.2 12.9-11 19.4z"/></g><g fill="#333"><path d="M56.7 113.5c-31.2 0-56.7-25.5-56.7-56.8s25.5-56.7 56.7-56.7 56.7 25.5 56.7 56.7-25.4 56.8-56.7 56.8zm0-107.5c-27.9 0-50.7 22.8-50.7 50.7s22.8 50.7 50.7 50.7 50.7-22.8 50.7-50.7-22.7-50.7-50.7-50.7zM86.8 28.3c-2.6-2.6-5.8.6-5.8.6s-15.9 15.9-19.1 19c-3.2 3.2-12.3 6.8-12.3 6.8l10.5 10.5s3.9-8.9 7-12.1l19.1-19.1s3.2-3.1.6-5.7zM37.8 65.2c-4.8 11.6-4 18.1-12.2 20.2 31.3 5.4 31.3-17 31.3-17l-10.4-10.4s-6.3 1.6-8.7 7.2zm-3 16.7c2.4-2.8 6.1-16.1 11-19.4 3.3 2.3-.2 12.9-11 19.4z"/></g></g></g></svg> \ No newline at end of file
diff --git a/docs/assets/img/icon-twitter.svg b/docs/assets/img/icon-twitter.svg
new file mode 100644
index 000000000..4f053068b
--- /dev/null
+++ b/docs/assets/img/icon-twitter.svg
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Tiny//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd">
+<svg version="1.1" baseProfile="tiny" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
+ y="0px" viewBox="0 0 20.4 17" xml:space="preserve">
+<g id="Background">
+</g>
+<g id="Working">
+ <g id="Alert">
+ </g>
+ <g id="mySociety_Logo">
+ <g id="Earth">
+ <g id="Paintbrush">
+ <g id="Refresh_F">
+ </g>
+ </g>
+ </g>
+ <g id="Duplicate_files">
+ </g>
+ <g id="Upload_-_Circle_1_">
+ </g>
+ <g id="Upload_-_Circle">
+ </g>
+ <path fill="#FFFFFF" d="M20.4,2c-0.8,0.3-1.6,0.6-2.4,0.7c0.9-0.5,1.5-1.4,1.8-2.4c-0.8,0.5-1.7,0.8-2.7,1C16.4,0.5,15.3,0,14.1,0
+ c-2.3,0-4.2,1.9-4.2,4.3c0,0.3,0,0.7,0.1,1C6.6,5.1,3.5,3.4,1.4,0.8C1.1,1.4,0.9,2.2,0.9,2.9c0,1.5,0.7,2.8,1.9,3.6
+ C2,6.5,1.4,6.3,0.8,6c0,0,0,0,0,0.1c0,2.1,1.4,3.8,3.4,4.2c-0.4,0.1-0.7,0.1-1.1,0.1c-0.3,0-0.5,0-0.8-0.1c0.5,1.7,2.1,2.9,3.9,3
+ C4.8,14.4,3,15.1,1,15.1c-0.3,0-0.7,0-1-0.1C1.9,16.3,4.1,17,6.4,17c7.7,0,11.9-6.5,11.9-12.2c0-0.2,0-0.4,0-0.6
+ C19.1,3.6,19.8,2.9,20.4,2z"/>
+ <g id="Mail">
+ </g>
+ </g>
+</g>
+</svg>
diff --git a/docs/assets/img/icon-world.svg b/docs/assets/img/icon-world.svg
new file mode 100644
index 000000000..b04f24943
--- /dev/null
+++ b/docs/assets/img/icon-world.svg
@@ -0,0 +1 @@
+<svg baseProfile="tiny" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 113.5 113.5"><g><g><g fill="#37373A"><path d="M57.7 31.8c0 .5 1.9.5 2.2.5-.5-.1.2-.1 0 0 1.8-1.1-3.6-2.1-3.7-2.2l.3-.3c-1 .4-.3-.7-1.2.4.2.8-.8 1.3-.4 2.2.9.8 1.9-.4 2.8-.6zM66.8 30.3c-.5-.1-1-1.2-1.6-1.4l-.1.4c0-.1.2.4 0 0 .2.3 1.1 1.6 1.7 1zM44.2 32c-.1.2-.3.2-.4.3v.1c.1.1.3-.4.4-.4zM56.7 15.7c-22.7 0-41.1 18.4-41.1 41.1 0 22.7 18.4 41.1 41.1 41.1s41.1-18.4 41.1-41.1c0-22.7-18.4-41.1-41.1-41.1zm11.3 62.4c.3 0 .3 0 .5-.3 0 .5.1 1 .3 1.4-.6-2.3 1.7-2.3 2.8-3.7.4-.5 1-1.9 1.5-2.2.3.4.3.8.2 1.3v.1c0 .5-.1.9-.3 1.3-.1-.1-.1-.2-.1-.3-1.8 1.5-1.8 5.7-4.3 6.7-1.3.6-1.2-1.2-.7-1.9.7-.8-.3-1.4.1-2.4-.4-.1-.9-1.2-.9-1.9.5-.1.8-.4.8-.2.1-.2.8-1.3.8-1.4.1 1-1.2 2.8-.7 3.5zm18.4-26.2c-.7-1.3-1.3-2.8-1.8-3.6-.9-1.4-1.4-3.6-2.7-4.7.3.4.3.8.1 1.2-.7-.2-1.2-.6-1.6-1.2-.1-.3.7.4.3-.4-1.1.1-1.8-.9-2.7-1.6-1.5-.2-3.2 1.1-4.7.2-.4-.2-.7-1.5-1.3-.7-.3.4-.6.4-1 .2-1.7-.5-2.5-2-4-2 0 .7 1.1 1.6 1.7 1.9.7.4 1.2 2.1 1.3.6 1 .6.3 1.8 1.7 1.4 1.1.4.8-1.3 1-1.8.3.2.5 1 .8 1.3.6.5 1.4.3 1.9.9.7.7 1 1.7.9 2.5-.6 0-.1.7-.5 1.3-.4.6-.4.8-.6 1.5-.7.2-1.6.5-1.5 1.5-.5.6-5 3.9-5.6 3-.7-1.1-.9-2.7-1.5-3.8-.9-.3-2.7-2.6-3.1-3.4.3-1.5-3.8-4.6-4.4-4.6.5 2.1 2.3 3.2 3.1 4.8.7 1.4 2 4.6 3.1 5.1 1.8-.2 2.9 3.1 3.9 3.8 1.2.9 3.8-2 4.9-1.7.1 1.5.1 1.9-.4 3.6-.9 3.3-2.4 4.8-4.4 7.5-1.1 1.6-1.9 2.7-2.7 4.4-.7 1.4 1.3 4.2.8 4.9.3 2.2-.3 3.5-2.2 4.6-1.4.8-2.6 1.6-2.1 3.1s-1.4 1.8-1.7 2.6c-.6 1.4-1.4 2.2-2.4 2.7l-2 .1c-1.2 0-2.4-.1-3.5-.2-1.5-1.9-3.2-4-4.8-5.9-1-1.2-2.4-3.3-.9-4.8.2-1-1-3.2-1.5-4-.9-1.4-4.8-4.6-3.3-6.2.2-1.1-.8-2.2-.8-3.1-.8-.7-1.7.9-2.5-.5-.9-1.5-2.5-1.1-3.8-.2-.3.2-4 .7-4.3.5-2.8-2.5-3.7-6.4-2.7-9.8.4-1.4.4-3.9 1.6-4.8.4-1.4 2-2.9 2.9-4.1.5-.6 1.2-.7 1.8-1.4.8-1 1.2-2.1 2.3-3 1.1-.9 3.4-2.3 1.4-2.6.8-1.1 2-2.4 2.5-3.8.7-.5 1.9-.3 2.7-.7.7-1.3.9-1.3.7-2.1.1-.5 1.9-1 2.2-1.1.7-.3 1.3-.9 1.9-1.4 2.6-.7 5.3-1.1 8.1-1.1 14.7-.2 27.1 10.8 29.4 25.1zM50.6 33.9c-1-.5-.3.2-.8.9-.8 1-.8 1.3-2 .8-.1-1.1 2.4-.1 1.3-2.1-.6-1-1.1-2.1-2.2-1.4-1 .7-2.8 1.1-3.6 2.5-.5.5-3.7 3-3.7 3.2 1.3 1 6.2-3 7.4-1.8l-1.1 2.3c.4.2.5.5.9.6 1.6-.4 1.2.8 2.4 1.1 2 .5.5.1 1.7-1.1.4-.4 2.6-.4 2.7.3-.1-.4.9-.2 0 0 1-.2 1.9.8 2.7.1.5-.5 1-.4 1.3-.1 1.8 1.3 1.2-3.8 1.2-4-.6.4-4.2.8-4.2.4.1-.4-.5-.5-.7-1 .7-.8-.6-.4.1-1.3-.4-.2-.7-.2-1.1 0-.1.6.3.4-.5.2-.3.7.6 1.1.5 1.7-.1-.1-.2-.1-.4-.1-.1.4 0 .3 0 1-1.2-.2-.6-1.1-1.6-2.5.9-.8-2-2.2-1.6-2.7-1.8.4 1.9 2.5 1.3 3zm-3.8.8c-.2.1-.4.1-.6.1.2-.5.9-2.4 1.4-2.4l-.8 2.3zM46.8 34.7c.1-.5-.3-.1 0 0zM64.3 32.4c-.5.2.1 1.7.9 1.6.5.5 1.2.5 1.8.3-.2-1.2-3.3-3.7-4.3-4.2.1-.1.2-.6.5-.5-.3-1.3-1.7-.3-1.7.6.6.6 2.7 1.6 2.8 2.2zM65.2 34c-.6.1.4.4 0 0zM56.7 113.5c-31.2 0-56.7-25.5-56.7-56.8s25.5-56.7 56.7-56.7 56.7 25.5 56.7 56.7-25.4 56.8-56.7 56.8zm0-107.5c-27.9 0-50.7 22.8-50.7 50.7s22.8 50.7 50.7 50.7 50.7-22.8 50.7-50.7-22.7-50.7-50.7-50.7z"/></g><g fill="#333"><path d="M57.7 31.8c0 .5 1.9.5 2.2.5-.5-.1.2-.1 0 0 1.8-1.1-3.6-2.1-3.7-2.2l.3-.3c-1 .4-.3-.7-1.2.4.2.8-.8 1.3-.4 2.2.9.8 1.9-.4 2.8-.6zM66.8 30.3c-.5-.1-1-1.2-1.6-1.4l-.1.4c0-.1.2.4 0 0 .2.3 1.1 1.6 1.7 1zM44.2 32c-.1.2-.3.2-.4.3v.1c.1.1.3-.4.4-.4zM56.7 15.7c-22.7 0-41.1 18.4-41.1 41.1 0 22.7 18.4 41.1 41.1 41.1s41.1-18.4 41.1-41.1c0-22.7-18.4-41.1-41.1-41.1zm11.3 62.4c.3 0 .3 0 .5-.3 0 .5.1 1 .3 1.4-.6-2.3 1.7-2.3 2.8-3.7.4-.5 1-1.9 1.5-2.2.3.4.3.8.2 1.3v.1c0 .5-.1.9-.3 1.3-.1-.1-.1-.2-.1-.3-1.8 1.5-1.8 5.7-4.3 6.7-1.3.6-1.2-1.2-.7-1.9.7-.8-.3-1.4.1-2.4-.4-.1-.9-1.2-.9-1.9.5-.1.8-.4.8-.2.1-.2.8-1.3.8-1.4.1 1-1.2 2.8-.7 3.5zm18.4-26.2c-.7-1.3-1.3-2.8-1.8-3.6-.9-1.4-1.4-3.6-2.7-4.7.3.4.3.8.1 1.2-.7-.2-1.2-.6-1.6-1.2-.1-.3.7.4.3-.4-1.1.1-1.8-.9-2.7-1.6-1.5-.2-3.2 1.1-4.7.2-.4-.2-.7-1.5-1.3-.7-.3.4-.6.4-1 .2-1.7-.5-2.5-2-4-2 0 .7 1.1 1.6 1.7 1.9.7.4 1.2 2.1 1.3.6 1 .6.3 1.8 1.7 1.4 1.1.4.8-1.3 1-1.8.3.2.5 1 .8 1.3.6.5 1.4.3 1.9.9.7.7 1 1.7.9 2.5-.6 0-.1.7-.5 1.3-.4.6-.4.8-.6 1.5-.7.2-1.6.5-1.5 1.5-.5.6-5 3.9-5.6 3-.7-1.1-.9-2.7-1.5-3.8-.9-.3-2.7-2.6-3.1-3.4.3-1.5-3.8-4.6-4.4-4.6.5 2.1 2.3 3.2 3.1 4.8.7 1.4 2 4.6 3.1 5.1 1.8-.2 2.9 3.1 3.9 3.8 1.2.9 3.8-2 4.9-1.7.1 1.5.1 1.9-.4 3.6-.9 3.3-2.4 4.8-4.4 7.5-1.1 1.6-1.9 2.7-2.7 4.4-.7 1.4 1.3 4.2.8 4.9.3 2.2-.3 3.5-2.2 4.6-1.4.8-2.6 1.6-2.1 3.1s-1.4 1.8-1.7 2.6c-.6 1.4-1.4 2.2-2.4 2.7l-2 .1c-1.2 0-2.4-.1-3.5-.2-1.5-1.9-3.2-4-4.8-5.9-1-1.2-2.4-3.3-.9-4.8.2-1-1-3.2-1.5-4-.9-1.4-4.8-4.6-3.3-6.2.2-1.1-.8-2.2-.8-3.1-.8-.7-1.7.9-2.5-.5-.9-1.5-2.5-1.1-3.8-.2-.3.2-4 .7-4.3.5-2.8-2.5-3.7-6.4-2.7-9.8.4-1.4.4-3.9 1.6-4.8.4-1.4 2-2.9 2.9-4.1.5-.6 1.2-.7 1.8-1.4.8-1 1.2-2.1 2.3-3 1.1-.9 3.4-2.3 1.4-2.6.8-1.1 2-2.4 2.5-3.8.7-.5 1.9-.3 2.7-.7.7-1.3.9-1.3.7-2.1.1-.5 1.9-1 2.2-1.1.7-.3 1.3-.9 1.9-1.4 2.6-.7 5.3-1.1 8.1-1.1 14.7-.2 27.1 10.8 29.4 25.1zM50.6 33.9c-1-.5-.3.2-.8.9-.8 1-.8 1.3-2 .8-.1-1.1 2.4-.1 1.3-2.1-.6-1-1.1-2.1-2.2-1.4-1 .7-2.8 1.1-3.6 2.5-.5.5-3.7 3-3.7 3.2 1.3 1 6.2-3 7.4-1.8l-1.1 2.3c.4.2.5.5.9.6 1.6-.4 1.2.8 2.4 1.1 2 .5.5.1 1.7-1.1.4-.4 2.6-.4 2.7.3-.1-.4.9-.2 0 0 1-.2 1.9.8 2.7.1.5-.5 1-.4 1.3-.1 1.8 1.3 1.2-3.8 1.2-4-.6.4-4.2.8-4.2.4.1-.4-.5-.5-.7-1 .7-.8-.6-.4.1-1.3-.4-.2-.7-.2-1.1 0-.1.6.3.4-.5.2-.3.7.6 1.1.5 1.7-.1-.1-.2-.1-.4-.1-.1.4 0 .3 0 1-1.2-.2-.6-1.1-1.6-2.5.9-.8-2-2.2-1.6-2.7-1.8.4 1.9 2.5 1.3 3zm-3.8.8c-.2.1-.4.1-.6.1.2-.5.9-2.4 1.4-2.4l-.8 2.3zM46.8 34.7c.1-.5-.3-.1 0 0zM64.3 32.4c-.5.2.1 1.7.9 1.6.5.5 1.2.5 1.8.3-.2-1.2-3.3-3.7-4.3-4.2.1-.1.2-.6.5-.5-.3-1.3-1.7-.3-1.7.6.6.6 2.7 1.6 2.8 2.2zM65.2 34c-.6.1.4.4 0 0zM56.7 113.5c-31.2 0-56.7-25.5-56.7-56.8s25.5-56.7 56.7-56.7 56.7 25.5 56.7 56.7-25.4 56.8-56.7 56.8zm0-107.5c-27.9 0-50.7 22.8-50.7 50.7s22.8 50.7 50.7 50.7 50.7-22.8 50.7-50.7-22.7-50.7-50.7-50.7z"/></g></g></g></svg> \ No newline at end of file
diff --git a/docs/assets/img/monitor.png b/docs/assets/img/monitor.png
new file mode 100644
index 000000000..94e8b0299
--- /dev/null
+++ b/docs/assets/img/monitor.png
Binary files differ
diff --git a/docs/assets/img/pro-user-guide/all-reports-shortlist.png b/docs/assets/img/pro-user-guide/all-reports-shortlist.png
new file mode 100644
index 000000000..b63d541b1
--- /dev/null
+++ b/docs/assets/img/pro-user-guide/all-reports-shortlist.png
Binary files differ
diff --git a/docs/assets/img/pro-user-guide/all-the-sites.png b/docs/assets/img/pro-user-guide/all-the-sites.png
new file mode 100644
index 000000000..6bbee4da3
--- /dev/null
+++ b/docs/assets/img/pro-user-guide/all-the-sites.png
Binary files differ
diff --git a/docs/assets/img/pro-user-guide/ban-user-report-page.png b/docs/assets/img/pro-user-guide/ban-user-report-page.png
new file mode 100644
index 000000000..7fd0f6831
--- /dev/null
+++ b/docs/assets/img/pro-user-guide/ban-user-report-page.png
Binary files differ
diff --git a/docs/assets/img/pro-user-guide/category-admin-page.png b/docs/assets/img/pro-user-guide/category-admin-page.png
new file mode 100644
index 000000000..716a1f4cb
--- /dev/null
+++ b/docs/assets/img/pro-user-guide/category-admin-page.png
Binary files differ
diff --git a/docs/assets/img/pro-user-guide/change-category-report.png b/docs/assets/img/pro-user-guide/change-category-report.png
new file mode 100644
index 000000000..d463a34d4
--- /dev/null
+++ b/docs/assets/img/pro-user-guide/change-category-report.png
Binary files differ
diff --git a/docs/assets/img/pro-user-guide/deal-undesirable-content.png b/docs/assets/img/pro-user-guide/deal-undesirable-content.png
new file mode 100644
index 000000000..7b0f8ad2a
--- /dev/null
+++ b/docs/assets/img/pro-user-guide/deal-undesirable-content.png
Binary files differ
diff --git a/docs/assets/img/pro-user-guide/edit-category-page.png b/docs/assets/img/pro-user-guide/edit-category-page.png
new file mode 100644
index 000000000..385633431
--- /dev/null
+++ b/docs/assets/img/pro-user-guide/edit-category-page.png
Binary files differ
diff --git a/docs/assets/img/pro-user-guide/filtering-sorting-reports.png b/docs/assets/img/pro-user-guide/filtering-sorting-reports.png
new file mode 100644
index 000000000..983bc899d
--- /dev/null
+++ b/docs/assets/img/pro-user-guide/filtering-sorting-reports.png
Binary files differ
diff --git a/docs/assets/img/pro-user-guide/fms-pro.png b/docs/assets/img/pro-user-guide/fms-pro.png
new file mode 100644
index 000000000..6e7cedd14
--- /dev/null
+++ b/docs/assets/img/pro-user-guide/fms-pro.png
Binary files differ
diff --git a/docs/assets/img/pro-user-guide/home.png b/docs/assets/img/pro-user-guide/home.png
new file mode 100644
index 000000000..0f7072430
--- /dev/null
+++ b/docs/assets/img/pro-user-guide/home.png
Binary files differ
diff --git a/docs/assets/img/pro-user-guide/local-alerts.png b/docs/assets/img/pro-user-guide/local-alerts.png
new file mode 100644
index 000000000..970dd9a67
--- /dev/null
+++ b/docs/assets/img/pro-user-guide/local-alerts.png
Binary files differ
diff --git a/docs/assets/img/pro-user-guide/making-report-duplicates.png b/docs/assets/img/pro-user-guide/making-report-duplicates.png
new file mode 100644
index 000000000..966a9aa48
--- /dev/null
+++ b/docs/assets/img/pro-user-guide/making-report-duplicates.png
Binary files differ
diff --git a/docs/assets/img/pro-user-guide/making-report.png b/docs/assets/img/pro-user-guide/making-report.png
new file mode 100644
index 000000000..8093d1d74
--- /dev/null
+++ b/docs/assets/img/pro-user-guide/making-report.png
Binary files differ
diff --git a/docs/assets/img/pro-user-guide/navigating-as-pro-staff.png b/docs/assets/img/pro-user-guide/navigating-as-pro-staff.png
new file mode 100644
index 000000000..2a0248dbc
--- /dev/null
+++ b/docs/assets/img/pro-user-guide/navigating-as-pro-staff.png
Binary files differ
diff --git a/docs/assets/img/pro-user-guide/report-change-priority.png b/docs/assets/img/pro-user-guide/report-change-priority.png
new file mode 100644
index 000000000..e253147c4
--- /dev/null
+++ b/docs/assets/img/pro-user-guide/report-change-priority.png
Binary files differ
diff --git a/docs/assets/img/pro-user-guide/report-page-shortlist.png b/docs/assets/img/pro-user-guide/report-page-shortlist.png
new file mode 100644
index 000000000..6658a6c1a
--- /dev/null
+++ b/docs/assets/img/pro-user-guide/report-page-shortlist.png
Binary files differ
diff --git a/docs/assets/img/pro-user-guide/report-public-update.png b/docs/assets/img/pro-user-guide/report-public-update.png
new file mode 100644
index 000000000..e6b4ac587
--- /dev/null
+++ b/docs/assets/img/pro-user-guide/report-public-update.png
Binary files differ
diff --git a/docs/assets/img/pro-user-guide/report-response.png b/docs/assets/img/pro-user-guide/report-response.png
new file mode 100644
index 000000000..702faeef4
--- /dev/null
+++ b/docs/assets/img/pro-user-guide/report-response.png
Binary files differ
diff --git a/docs/assets/img/pro-user-guide/response-priority-screen.png b/docs/assets/img/pro-user-guide/response-priority-screen.png
new file mode 100644
index 000000000..c4f21c746
--- /dev/null
+++ b/docs/assets/img/pro-user-guide/response-priority-screen.png
Binary files differ
diff --git a/docs/assets/img/pro-user-guide/response-template-screen.png b/docs/assets/img/pro-user-guide/response-template-screen.png
new file mode 100644
index 000000000..95a5581dc
--- /dev/null
+++ b/docs/assets/img/pro-user-guide/response-template-screen.png
Binary files differ
diff --git a/docs/assets/img/pro-user-guide/search-report.png b/docs/assets/img/pro-user-guide/search-report.png
new file mode 100644
index 000000000..c9ab2d089
--- /dev/null
+++ b/docs/assets/img/pro-user-guide/search-report.png
Binary files differ
diff --git a/docs/assets/img/pro-user-guide/user-admin-categories.png b/docs/assets/img/pro-user-guide/user-admin-categories.png
new file mode 100644
index 000000000..d3229711b
--- /dev/null
+++ b/docs/assets/img/pro-user-guide/user-admin-categories.png
Binary files differ
diff --git a/docs/assets/img/pro-user-guide/user-admin-page.png b/docs/assets/img/pro-user-guide/user-admin-page.png
new file mode 100644
index 000000000..92b26663d
--- /dev/null
+++ b/docs/assets/img/pro-user-guide/user-admin-page.png
Binary files differ
diff --git a/docs/assets/img/pro-user-guide/user-admin-permissions.png b/docs/assets/img/pro-user-guide/user-admin-permissions.png
new file mode 100644
index 000000000..b977f8bfa
--- /dev/null
+++ b/docs/assets/img/pro-user-guide/user-admin-permissions.png
Binary files differ
diff --git a/docs/assets/img/pro-user-guide/viewing-reports-your-area.png b/docs/assets/img/pro-user-guide/viewing-reports-your-area.png
new file mode 100644
index 000000000..edd3f1dcc
--- /dev/null
+++ b/docs/assets/img/pro-user-guide/viewing-reports-your-area.png
Binary files differ
diff --git a/docs/assets/img/pro-user-guide/your-shortlist.png b/docs/assets/img/pro-user-guide/your-shortlist.png
new file mode 100644
index 000000000..84a633ed6
--- /dev/null
+++ b/docs/assets/img/pro-user-guide/your-shortlist.png
Binary files differ
diff --git a/docs/assets/img/promo-community-pack-screenshot.png b/docs/assets/img/promo-community-pack-screenshot.png
new file mode 100644
index 000000000..dde75b312
--- /dev/null
+++ b/docs/assets/img/promo-community-pack-screenshot.png
Binary files differ
diff --git a/docs/assets/img/promo-facebook-screenshot.png b/docs/assets/img/promo-facebook-screenshot.png
new file mode 100644
index 000000000..94909f01f
--- /dev/null
+++ b/docs/assets/img/promo-facebook-screenshot.png
Binary files differ
diff --git a/docs/assets/img/promo-superuser-screenshot.png b/docs/assets/img/promo-superuser-screenshot.png
new file mode 100644
index 000000000..08cfefffa
--- /dev/null
+++ b/docs/assets/img/promo-superuser-screenshot.png
Binary files differ
diff --git a/docs/assets/img/promo-twitter-screenshot.png b/docs/assets/img/promo-twitter-screenshot.png
new file mode 100644
index 000000000..fddc42c58
--- /dev/null
+++ b/docs/assets/img/promo-twitter-screenshot.png
Binary files differ
diff --git a/docs/assets/img/promote-90x130.png b/docs/assets/img/promote-90x130.png
new file mode 100644
index 000000000..b30f1e3ff
--- /dev/null
+++ b/docs/assets/img/promote-90x130.png
Binary files differ
diff --git a/docs/assets/img/tn1.png b/docs/assets/img/tn1.png
new file mode 100644
index 000000000..32e359091
--- /dev/null
+++ b/docs/assets/img/tn1.png
Binary files differ
diff --git a/docs/assets/img/tn2.png b/docs/assets/img/tn2.png
new file mode 100644
index 000000000..f774b3f26
--- /dev/null
+++ b/docs/assets/img/tn2.png
Binary files differ
diff --git a/docs/assets/img/tn3.png b/docs/assets/img/tn3.png
new file mode 100644
index 000000000..5f1856343
--- /dev/null
+++ b/docs/assets/img/tn3.png
Binary files differ
diff --git a/docs/assets/img/training/admin-add-a-body.png b/docs/assets/img/training/admin-add-a-body.png
new file mode 100644
index 000000000..efe9bd667
--- /dev/null
+++ b/docs/assets/img/training/admin-add-a-body.png
Binary files differ
diff --git a/docs/assets/img/training/admin-add-contact.png b/docs/assets/img/training/admin-add-contact.png
new file mode 100644
index 000000000..971da5f9b
--- /dev/null
+++ b/docs/assets/img/training/admin-add-contact.png
Binary files differ
diff --git a/docs/assets/img/training/admin-ban-a-user.png b/docs/assets/img/training/admin-ban-a-user.png
new file mode 100644
index 000000000..35877c1e9
--- /dev/null
+++ b/docs/assets/img/training/admin-ban-a-user.png
Binary files differ
diff --git a/docs/assets/img/training/admin-bodies.png b/docs/assets/img/training/admin-bodies.png
new file mode 100644
index 000000000..1f768397f
--- /dev/null
+++ b/docs/assets/img/training/admin-bodies.png
Binary files differ
diff --git a/docs/assets/img/training/admin-edit-user.png b/docs/assets/img/training/admin-edit-user.png
new file mode 100644
index 000000000..e8cf1f1c1
--- /dev/null
+++ b/docs/assets/img/training/admin-edit-user.png
Binary files differ
diff --git a/docs/assets/img/training/admin-flagged-reports-users.png b/docs/assets/img/training/admin-flagged-reports-users.png
new file mode 100644
index 000000000..fae832009
--- /dev/null
+++ b/docs/assets/img/training/admin-flagged-reports-users.png
Binary files differ
diff --git a/docs/assets/img/training/admin-polic-contacts.png b/docs/assets/img/training/admin-polic-contacts.png
new file mode 100644
index 000000000..85d9f471c
--- /dev/null
+++ b/docs/assets/img/training/admin-polic-contacts.png
Binary files differ
diff --git a/docs/assets/img/training/admin-search-reports.png b/docs/assets/img/training/admin-search-reports.png
new file mode 100644
index 000000000..b38e600d5
--- /dev/null
+++ b/docs/assets/img/training/admin-search-reports.png
Binary files differ
diff --git a/docs/assets/img/training/admin-stats-enter-dates.png b/docs/assets/img/training/admin-stats-enter-dates.png
new file mode 100644
index 000000000..fbefc4ae3
--- /dev/null
+++ b/docs/assets/img/training/admin-stats-enter-dates.png
Binary files differ
diff --git a/docs/assets/img/training/admin-stats.png b/docs/assets/img/training/admin-stats.png
new file mode 100644
index 000000000..b7fab5c15
--- /dev/null
+++ b/docs/assets/img/training/admin-stats.png
Binary files differ
diff --git a/docs/assets/img/training/admin-users.png b/docs/assets/img/training/admin-users.png
new file mode 100644
index 000000000..f77bb9b94
--- /dev/null
+++ b/docs/assets/img/training/admin-users.png
Binary files differ
diff --git a/docs/assets/img/training/fms-many-categories.png b/docs/assets/img/training/fms-many-categories.png
new file mode 100644
index 000000000..3c1349a75
--- /dev/null
+++ b/docs/assets/img/training/fms-many-categories.png
Binary files differ
diff --git a/docs/assets/img/training/mmi-01-front-page.png b/docs/assets/img/training/mmi-01-front-page.png
new file mode 100644
index 000000000..4033b37f8
--- /dev/null
+++ b/docs/assets/img/training/mmi-01-front-page.png
Binary files differ
diff --git a/docs/assets/img/training/mmi-02-click-on-map.png b/docs/assets/img/training/mmi-02-click-on-map.png
new file mode 100644
index 000000000..3d1be8319
--- /dev/null
+++ b/docs/assets/img/training/mmi-02-click-on-map.png
Binary files differ
diff --git a/docs/assets/img/training/mmi-03-enter-details.png b/docs/assets/img/training/mmi-03-enter-details.png
new file mode 100644
index 000000000..edc3d87b3
--- /dev/null
+++ b/docs/assets/img/training/mmi-03-enter-details.png
Binary files differ
diff --git a/docs/assets/img/training/mmi-04-user-details.png b/docs/assets/img/training/mmi-04-user-details.png
new file mode 100644
index 000000000..6667b026b
--- /dev/null
+++ b/docs/assets/img/training/mmi-04-user-details.png
Binary files differ
diff --git a/docs/assets/img/training/mmi-05-update.png b/docs/assets/img/training/mmi-05-update.png
new file mode 100644
index 000000000..8a569f07a
--- /dev/null
+++ b/docs/assets/img/training/mmi-05-update.png
Binary files differ
diff --git a/docs/assets/img/training/mmi-06-report-abuse.png b/docs/assets/img/training/mmi-06-report-abuse.png
new file mode 100644
index 000000000..d04ec3802
--- /dev/null
+++ b/docs/assets/img/training/mmi-06-report-abuse.png
Binary files differ
diff --git a/docs/assets/img/training/mmi-07-get-updates-link.png b/docs/assets/img/training/mmi-07-get-updates-link.png
new file mode 100644
index 000000000..b21bcc603
--- /dev/null
+++ b/docs/assets/img/training/mmi-07-get-updates-link.png
Binary files differ
diff --git a/docs/assets/img/training/mmi-08-get-updates.png b/docs/assets/img/training/mmi-08-get-updates.png
new file mode 100644
index 000000000..4a10ae439
--- /dev/null
+++ b/docs/assets/img/training/mmi-08-get-updates.png
Binary files differ
diff --git a/docs/assets/img/training/mmi-09-login.png b/docs/assets/img/training/mmi-09-login.png
new file mode 100644
index 000000000..a3c4364f1
--- /dev/null
+++ b/docs/assets/img/training/mmi-09-login.png
Binary files differ
diff --git a/docs/assets/img/training/mmi-12-your-reports.png b/docs/assets/img/training/mmi-12-your-reports.png
new file mode 100644
index 000000000..fe1ccc2b2
--- /dev/null
+++ b/docs/assets/img/training/mmi-12-your-reports.png
Binary files differ
diff --git a/docs/assets/img/training/mmi-13-staff-remove-from-site.png b/docs/assets/img/training/mmi-13-staff-remove-from-site.png
new file mode 100644
index 000000000..4a152b5dc
--- /dev/null
+++ b/docs/assets/img/training/mmi-13-staff-remove-from-site.png
Binary files differ
diff --git a/docs/assets/img/training/mmi-14-staff-dashboard.png b/docs/assets/img/training/mmi-14-staff-dashboard.png
new file mode 100644
index 000000000..52caefbd4
--- /dev/null
+++ b/docs/assets/img/training/mmi-14-staff-dashboard.png
Binary files differ
diff --git a/docs/assets/img/training/mmi-15-staff-states.png b/docs/assets/img/training/mmi-15-staff-states.png
new file mode 100644
index 000000000..5d06e9d0f
--- /dev/null
+++ b/docs/assets/img/training/mmi-15-staff-states.png
Binary files differ
diff --git a/docs/assets/img/training/mmi-16-woo-it-is-fixed.png b/docs/assets/img/training/mmi-16-woo-it-is-fixed.png
new file mode 100644
index 000000000..74d382b06
--- /dev/null
+++ b/docs/assets/img/training/mmi-16-woo-it-is-fixed.png
Binary files differ
diff --git a/docs/assets/img/training/mmi-17-logout.png b/docs/assets/img/training/mmi-17-logout.png
new file mode 100644
index 000000000..5c927ef5b
--- /dev/null
+++ b/docs/assets/img/training/mmi-17-logout.png
Binary files differ
diff --git a/docs/assets/img/training/mmi-18-show-when-sent.png b/docs/assets/img/training/mmi-18-show-when-sent.png
new file mode 100644
index 000000000..657f7c9a8
--- /dev/null
+++ b/docs/assets/img/training/mmi-18-show-when-sent.png
Binary files differ
diff --git a/docs/assets/posts/admin-category-add-before.png b/docs/assets/posts/admin-category-add-before.png
new file mode 100644
index 000000000..01d19c070
--- /dev/null
+++ b/docs/assets/posts/admin-category-add-before.png
Binary files differ
diff --git a/docs/assets/posts/admin-category-edit-after.png b/docs/assets/posts/admin-category-edit-after.png
new file mode 100644
index 000000000..33bf837af
--- /dev/null
+++ b/docs/assets/posts/admin-category-edit-after.png
Binary files differ
diff --git a/docs/assets/posts/admin-category-edit-before.png b/docs/assets/posts/admin-category-edit-before.png
new file mode 100644
index 000000000..67e8eed0f
--- /dev/null
+++ b/docs/assets/posts/admin-category-edit-before.png
Binary files differ
diff --git a/docs/assets/posts/admin-report-form-after.png b/docs/assets/posts/admin-report-form-after.png
new file mode 100644
index 000000000..0c89faf10
--- /dev/null
+++ b/docs/assets/posts/admin-report-form-after.png
Binary files differ
diff --git a/docs/assets/posts/admin-report-form-before.png b/docs/assets/posts/admin-report-form-before.png
new file mode 100644
index 000000000..fb6b4f9df
--- /dev/null
+++ b/docs/assets/posts/admin-report-form-before.png
Binary files differ
diff --git a/docs/assets/posts/admin-user-permissions.png b/docs/assets/posts/admin-user-permissions.png
new file mode 100644
index 000000000..44d6431a4
--- /dev/null
+++ b/docs/assets/posts/admin-user-permissions.png
Binary files differ
diff --git a/docs/assets/posts/angus-streetlights.png b/docs/assets/posts/angus-streetlights.png
new file mode 100644
index 000000000..b8668126c
--- /dev/null
+++ b/docs/assets/posts/angus-streetlights.png
Binary files differ
diff --git a/docs/assets/posts/area-highlighting-after.jpeg b/docs/assets/posts/area-highlighting-after.jpeg
new file mode 100644
index 000000000..e9bba2198
--- /dev/null
+++ b/docs/assets/posts/area-highlighting-after.jpeg
Binary files differ
diff --git a/docs/assets/posts/area-highlighting-before.jpeg b/docs/assets/posts/area-highlighting-before.jpeg
new file mode 100644
index 000000000..d18145d66
--- /dev/null
+++ b/docs/assets/posts/area-highlighting-before.jpeg
Binary files differ
diff --git a/docs/assets/posts/big-head-small.jpeg b/docs/assets/posts/big-head-small.jpeg
new file mode 100644
index 000000000..0aff4ab89
--- /dev/null
+++ b/docs/assets/posts/big-head-small.jpeg
Binary files differ
diff --git a/docs/assets/posts/big-head.jpeg b/docs/assets/posts/big-head.jpeg
new file mode 100644
index 000000000..ca56009d7
--- /dev/null
+++ b/docs/assets/posts/big-head.jpeg
Binary files differ
diff --git a/docs/assets/posts/html-email-example.png b/docs/assets/posts/html-email-example.png
new file mode 100644
index 000000000..5a648837a
--- /dev/null
+++ b/docs/assets/posts/html-email-example.png
Binary files differ
diff --git a/docs/assets/posts/html-email-litmus.png b/docs/assets/posts/html-email-litmus.png
new file mode 100644
index 000000000..7dc105815
--- /dev/null
+++ b/docs/assets/posts/html-email-litmus.png
Binary files differ
diff --git a/docs/assets/posts/html-email-map-centre.png b/docs/assets/posts/html-email-map-centre.png
new file mode 100644
index 000000000..31edc074a
--- /dev/null
+++ b/docs/assets/posts/html-email-map-centre.png
Binary files differ
diff --git a/docs/assets/posts/html-email-map.png b/docs/assets/posts/html-email-map.png
new file mode 100644
index 000000000..d2d22300e
--- /dev/null
+++ b/docs/assets/posts/html-email-map.png
Binary files differ
diff --git a/docs/assets/posts/multi-select-groups.png b/docs/assets/posts/multi-select-groups.png
new file mode 100644
index 000000000..1be6f05bc
--- /dev/null
+++ b/docs/assets/posts/multi-select-groups.png
Binary files differ
diff --git a/docs/assets/posts/multi-select-line-wrap.png b/docs/assets/posts/multi-select-line-wrap.png
new file mode 100644
index 000000000..c78c81d80
--- /dev/null
+++ b/docs/assets/posts/multi-select-line-wrap.png
Binary files differ
diff --git a/docs/assets/posts/multi-select-people.png b/docs/assets/posts/multi-select-people.png
new file mode 100644
index 000000000..1d96ee9dc
--- /dev/null
+++ b/docs/assets/posts/multi-select-people.png
Binary files differ
diff --git a/docs/assets/posts/multi-select.png b/docs/assets/posts/multi-select.png
new file mode 100644
index 000000000..90d950110
--- /dev/null
+++ b/docs/assets/posts/multi-select.png
Binary files differ
diff --git a/docs/assets/posts/new-reporting-form.png b/docs/assets/posts/new-reporting-form.png
new file mode 100644
index 000000000..3a7b1cbd5
--- /dev/null
+++ b/docs/assets/posts/new-reporting-form.png
Binary files differ
diff --git a/docs/assets/posts/report-inspect.png b/docs/assets/posts/report-inspect.png
new file mode 100644
index 000000000..df11068f2
--- /dev/null
+++ b/docs/assets/posts/report-inspect.png
Binary files differ
diff --git a/docs/assets/posts/report-selected.png b/docs/assets/posts/report-selected.png
new file mode 100644
index 000000000..40351fca2
--- /dev/null
+++ b/docs/assets/posts/report-selected.png
Binary files differ
diff --git a/docs/assets/posts/testing-after.png b/docs/assets/posts/testing-after.png
new file mode 100644
index 000000000..62c0c2d3e
--- /dev/null
+++ b/docs/assets/posts/testing-after.png
Binary files differ
diff --git a/docs/assets/posts/testing-before.png b/docs/assets/posts/testing-before.png
new file mode 100644
index 000000000..08a7af640
--- /dev/null
+++ b/docs/assets/posts/testing-before.png
Binary files differ
diff --git a/docs/assets/scripts/app.js b/docs/assets/scripts/app.js
new file mode 100644
index 000000000..514dc2c9b
--- /dev/null
+++ b/docs/assets/scripts/app.js
@@ -0,0 +1,154 @@
+function replace_str(base, replacement) {
+ return base + replacement; // FIXME TODO should replace %s
+}
+
+$(function(){
+
+ $('.reveal-on-click dd').hide();
+ $('.reveal-on-click dt').on('click', function(){
+ // $(this).find('+ dd').toggle();
+ var $dd = $(this).find('+ dd');
+ if ($dd.is(':visible')) {
+ $(this).removeClass('revealed');
+ $dd.slideUp();
+ } else {
+ $(this).addClass('revealed');
+ $dd.slideDown();
+ }
+ });
+
+ var reveal_all_text = {'reveal': 'Show all ', 'hide': 'Collapse all '}; // TODO add %s
+
+ $('dl.reveal-on-click').each(function(){
+ $(this).before("<div class='reveal-all revealed'>&nbsp;</div>");
+ });
+ $('.reveal-all').on('click', function(){
+ console.log("reveal all clicked");
+ var $dl = $(this).find('+ dl.reveal-on-click');
+ var noun = $dl.data('reveal-noun');
+ if ($(this).hasClass('revealed')) {
+ console.log("hiding all");
+ $dl.find('dt').removeClass('revealed');
+ $dl.find('dd').slideUp();
+ $(this).removeClass('revealed');
+ $(this).text(replace_str(reveal_all_text['reveal'], noun));
+ } else {
+ console.log("showing all");
+ $dl.find('dt').addClass('revealed');
+ $dl.find('dd').slideDown();
+ $(this).addClass('revealed');
+ $(this).text(replace_str(reveal_all_text['hide'], noun));
+ }
+ });
+ $('.reveal-all').trigger('click');
+
+ // hide the attention-box breakouts within mock-documents so
+ // the use can copy-and-paste the templates
+ // this is used in: running/example_press_releases
+ $('.toggle-button').on('click', function(){
+ var target = $(this).data("target");
+ $('#' + target +'.mock-document .attention-box').slideToggle();
+ });
+ $('.toggle-button').show(); // reveal the show/hide buttons
+
+ /**
+ * Owl Slider
+ */
+ $("#owl-slide").owlCarousel({
+ items : 1,
+ singleItem : true,
+ navigation : true
+ });
+
+
+ /**
+ * training slideshow for /training pages
+ **/
+ $('a.play-as-slideshow').html('&raquo; View as slideshow').attr('href', '#');
+
+ var current_slide_number;
+ var slides;
+ $(".play-as-slideshow").on("click", function(){
+ var $slide;
+ if (current_slide_number === undefined) {
+ slides = [];
+ current_slide_number = 0;
+ $slide = $(
+ '<div id="full-screen-slide" class="modal-slide">'
+ + '<div>'
+ + '<div class="slide-contents"></div>'
+ + '<a href="#close" title="Close" class="modal-slide-close">&times;</a>'
+ + '</div>'
+ + '</div>');
+ $('body').prepend($slide);
+ $(".modal-slide-close").on("click", function(){
+ end_training_slides();
+ });
+ var slides_title = $('.main-content h1').text();
+ var $slide_0 = $('<div class="slide-contents">'
+ + '<h2>' + slides_title + '</h2>'
+ + '<p>press &rarr; to advance</p>'
+ + '<p>press esc to exit</p>'
+ + '</div>');
+ slides.push($slide_0);
+ var last_heading = "";
+ $("main.main-content").find("h2,h3").each(function($i){
+ last_heading = $(this).html();
+ var $contents = $(this).nextUntil("h2,h3");
+ var $slide_div = $('<div class="slide-contents"></div>');
+ $slide_div.append($("<h2/>").html(last_heading));
+ $slide_div.append($contents.clone(false));
+ slides.push($slide_div.clone(false));
+ });
+ $(document).keydown( function(e) { key_down_training(e.which);} );
+ }
+ display_training_slide(0);
+ });
+
+
+ // which_slide: "next", "prev", or a number
+ function display_training_slide(which_slide){
+ if (which_slide == 'next' && current_slide_number + 1 < slides.length) {
+ current_slide_number++;
+ } else if (which_slide == 'prev' && current_slide_number > 0 ) {
+ current_slide_number--;
+ } else {
+ var slide_number = parseInt(which_slide);
+ if (slide_number >= 0 && slide_number < slides.length) {
+ current_slide_number = slide_number;
+ }
+ }
+ $("#full-screen-slide .slide-contents")
+ .html(slides[current_slide_number].html());
+ $("#full-screen-slide").show();
+ }
+
+ function end_training_slides(){
+ $("#full-screen-slide").hide();
+ current_slide_number = 0;
+ }
+
+ var key_code_arrow_left = 37;
+ var key_code_arrow_right = 39;
+ var key_code_ENTER = 13;
+ var key_code_ESC = 27;
+ var key_code_SPACE = 32;
+ var key_code_0 = 48;
+ var key_code_9 = 57;
+ var key_code_B = 66;
+
+ function key_down_training(key_code){
+ if (key_code == key_code_arrow_right || key_code == key_code_ENTER) {
+ display_training_slide('next')
+ } else if (key_code == key_code_arrow_left || key_code == key_code_B ) {
+ display_training_slide('prev')
+ } else if (key_code >= key_code_0 && key_code <= key_code_9) {
+ display_training_slide(key_code - key_code_0);
+ } if (key_code == key_code_ESC || key_code == key_code_SPACE) {
+ end_training_slides();
+ }
+ }
+
+
+
+});
diff --git a/docs/assets/scripts/jquery-migrate.min.js b/docs/assets/scripts/jquery-migrate.min.js
new file mode 100644
index 000000000..385905720
--- /dev/null
+++ b/docs/assets/scripts/jquery-migrate.min.js
@@ -0,0 +1,2 @@
+/*! jQuery Migrate v1.2.1 | (c) 2005, 2015 jQuery Foundation, Inc. and other contributors | jquery.org/license */
+jQuery.migrateMute===void 0&&(jQuery.migrateMute=!0),function(e,t,n){function r(n){var r=t.console;i[n]||(i[n]=!0,e.migrateWarnings.push(n),r&&r.warn&&!e.migrateMute&&(r.warn("JQMIGRATE: "+n),e.migrateTrace&&r.trace&&r.trace()))}function a(t,a,i,o){if(Object.defineProperty)try{return Object.defineProperty(t,a,{configurable:!0,enumerable:!0,get:function(){return r(o),i},set:function(e){r(o),i=e}}),n}catch(s){}e._definePropertyBroken=!0,t[a]=i}var i={};e.migrateWarnings=[],!e.migrateMute&&t.console&&t.console.log&&t.console.log("JQMIGRATE: Logging is active"),e.migrateTrace===n&&(e.migrateTrace=!0),e.migrateReset=function(){i={},e.migrateWarnings.length=0},"BackCompat"===document.compatMode&&r("jQuery is not compatible with Quirks Mode");var o=e("<input/>",{size:1}).attr("size")&&e.attrFn,s=e.attr,u=e.attrHooks.value&&e.attrHooks.value.get||function(){return null},c=e.attrHooks.value&&e.attrHooks.value.set||function(){return n},l=/^(?:input|button)$/i,d=/^[238]$/,p=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,f=/^(?:checked|selected)$/i;a(e,"attrFn",o||{},"jQuery.attrFn is deprecated"),e.attr=function(t,a,i,u){var c=a.toLowerCase(),g=t&&t.nodeType;return u&&(4>s.length&&r("jQuery.fn.attr( props, pass ) is deprecated"),t&&!d.test(g)&&(o?a in o:e.isFunction(e.fn[a])))?e(t)[a](i):("type"===a&&i!==n&&l.test(t.nodeName)&&t.parentNode&&r("Can't change the 'type' of an input or button in IE 6/7/8"),!e.attrHooks[c]&&p.test(c)&&(e.attrHooks[c]={get:function(t,r){var a,i=e.prop(t,r);return i===!0||"boolean"!=typeof i&&(a=t.getAttributeNode(r))&&a.nodeValue!==!1?r.toLowerCase():n},set:function(t,n,r){var a;return n===!1?e.removeAttr(t,r):(a=e.propFix[r]||r,a in t&&(t[a]=!0),t.setAttribute(r,r.toLowerCase())),r}},f.test(c)&&r("jQuery.fn.attr('"+c+"') may use property instead of attribute")),s.call(e,t,a,i))},e.attrHooks.value={get:function(e,t){var n=(e.nodeName||"").toLowerCase();return"button"===n?u.apply(this,arguments):("input"!==n&&"option"!==n&&r("jQuery.fn.attr('value') no longer gets properties"),t in e?e.value:null)},set:function(e,t){var a=(e.nodeName||"").toLowerCase();return"button"===a?c.apply(this,arguments):("input"!==a&&"option"!==a&&r("jQuery.fn.attr('value', val) no longer sets properties"),e.value=t,n)}};var g,h,v=e.fn.init,m=e.parseJSON,y=/^([^<]*)(<[\w\W]+>)([^>]*)$/;e.fn.init=function(t,n,a){var i;return t&&"string"==typeof t&&!e.isPlainObject(n)&&(i=y.exec(e.trim(t)))&&i[0]&&("<"!==t.charAt(0)&&r("$(html) HTML strings must start with '<' character"),i[3]&&r("$(html) HTML text after last tag is ignored"),"#"===i[0].charAt(0)&&(r("HTML string cannot start with a '#' character"),e.error("JQMIGRATE: Invalid selector string (XSS)")),n&&n.context&&(n=n.context),e.parseHTML)?v.call(this,e.parseHTML(i[2],n,!0),n,a):v.apply(this,arguments)},e.fn.init.prototype=e.fn,e.parseJSON=function(e){return e||null===e?m.apply(this,arguments):(r("jQuery.parseJSON requires a valid JSON string"),null)},e.uaMatch=function(e){e=e.toLowerCase();var t=/(chrome)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+)/.exec(e)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(e)||/(msie) ([\w.]+)/.exec(e)||0>e.indexOf("compatible")&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(e)||[];return{browser:t[1]||"",version:t[2]||"0"}},e.browser||(g=e.uaMatch(navigator.userAgent),h={},g.browser&&(h[g.browser]=!0,h.version=g.version),h.chrome?h.webkit=!0:h.webkit&&(h.safari=!0),e.browser=h),a(e,"browser",e.browser,"jQuery.browser is deprecated"),e.sub=function(){function t(e,n){return new t.fn.init(e,n)}e.extend(!0,t,this),t.superclass=this,t.fn=t.prototype=this(),t.fn.constructor=t,t.sub=this.sub,t.fn.init=function(r,a){return a&&a instanceof e&&!(a instanceof t)&&(a=t(a)),e.fn.init.call(this,r,a,n)},t.fn.init.prototype=t.fn;var n=t(document);return r("jQuery.sub() is deprecated"),t},e.ajaxSetup({converters:{"text json":e.parseJSON}});var b=e.fn.data;e.fn.data=function(t){var a,i,o=this[0];return!o||"events"!==t||1!==arguments.length||(a=e.data(o,t),i=e._data(o,t),a!==n&&a!==i||i===n)?b.apply(this,arguments):(r("Use of jQuery.fn.data('events') is deprecated"),i)};var j=/\/(java|ecma)script/i,w=e.fn.andSelf||e.fn.addBack;e.fn.andSelf=function(){return r("jQuery.fn.andSelf() replaced by jQuery.fn.addBack()"),w.apply(this,arguments)},e.clean||(e.clean=function(t,a,i,o){a=a||document,a=!a.nodeType&&a[0]||a,a=a.ownerDocument||a,r("jQuery.clean() is deprecated");var s,u,c,l,d=[];if(e.merge(d,e.buildFragment(t,a).childNodes),i)for(c=function(e){return!e.type||j.test(e.type)?o?o.push(e.parentNode?e.parentNode.removeChild(e):e):i.appendChild(e):n},s=0;null!=(u=d[s]);s++)e.nodeName(u,"script")&&c(u)||(i.appendChild(u),u.getElementsByTagName!==n&&(l=e.grep(e.merge([],u.getElementsByTagName("script")),c),d.splice.apply(d,[s+1,0].concat(l)),s+=l.length));return d});var Q=e.event.add,x=e.event.remove,k=e.event.trigger,N=e.fn.toggle,T=e.fn.live,M=e.fn.die,S="ajaxStart|ajaxStop|ajaxSend|ajaxComplete|ajaxError|ajaxSuccess",C=RegExp("\\b(?:"+S+")\\b"),H=/(?:^|\s)hover(\.\S+|)\b/,A=function(t){return"string"!=typeof t||e.event.special.hover?t:(H.test(t)&&r("'hover' pseudo-event is deprecated, use 'mouseenter mouseleave'"),t&&t.replace(H,"mouseenter$1 mouseleave$1"))};e.event.props&&"attrChange"!==e.event.props[0]&&e.event.props.unshift("attrChange","attrName","relatedNode","srcElement"),e.event.dispatch&&a(e.event,"handle",e.event.dispatch,"jQuery.event.handle is undocumented and deprecated"),e.event.add=function(e,t,n,a,i){e!==document&&C.test(t)&&r("AJAX events should be attached to document: "+t),Q.call(this,e,A(t||""),n,a,i)},e.event.remove=function(e,t,n,r,a){x.call(this,e,A(t)||"",n,r,a)},e.fn.error=function(){var e=Array.prototype.slice.call(arguments,0);return r("jQuery.fn.error() is deprecated"),e.splice(0,0,"error"),arguments.length?this.bind.apply(this,e):(this.triggerHandler.apply(this,e),this)},e.fn.toggle=function(t,n){if(!e.isFunction(t)||!e.isFunction(n))return N.apply(this,arguments);r("jQuery.fn.toggle(handler, handler...) is deprecated");var a=arguments,i=t.guid||e.guid++,o=0,s=function(n){var r=(e._data(this,"lastToggle"+t.guid)||0)%o;return e._data(this,"lastToggle"+t.guid,r+1),n.preventDefault(),a[r].apply(this,arguments)||!1};for(s.guid=i;a.length>o;)a[o++].guid=i;return this.click(s)},e.fn.live=function(t,n,a){return r("jQuery.fn.live() is deprecated"),T?T.apply(this,arguments):(e(this.context).on(t,this.selector,n,a),this)},e.fn.die=function(t,n){return r("jQuery.fn.die() is deprecated"),M?M.apply(this,arguments):(e(this.context).off(t,this.selector||"**",n),this)},e.event.trigger=function(e,t,n,a){return n||C.test(e)||r("Global events are undocumented and deprecated"),k.call(this,e,t,n||document,a)},e.each(S.split("|"),function(t,n){e.event.special[n]={setup:function(){var t=this;return t!==document&&(e.event.add(document,n+"."+e.guid,function(){e.event.trigger(n,null,t,!0)}),e._data(this,n,e.guid++)),!1},teardown:function(){return this!==document&&e.event.remove(document,n+"."+e._data(this,n)),!1}}})}(jQuery,window); \ No newline at end of file
diff --git a/docs/assets/scripts/jquery.min.js b/docs/assets/scripts/jquery.min.js
new file mode 100644
index 000000000..e83647587
--- /dev/null
+++ b/docs/assets/scripts/jquery.min.js
@@ -0,0 +1,5 @@
+/*! jQuery v1.12.4 | (c) jQuery Foundation | jquery.org/license */
+!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=a.document,e=c.slice,f=c.concat,g=c.push,h=c.indexOf,i={},j=i.toString,k=i.hasOwnProperty,l={},m="1.12.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return e.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:e.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a){return n.each(this,a)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(e.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:g,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(n.isPlainObject(c)||(b=n.isArray(c)))?(b?(b=!1,f=a&&n.isArray(a)?a:[]):f=a&&n.isPlainObject(a)?a:{},g[d]=n.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray||function(a){return"array"===n.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){var b=a&&a.toString();return!n.isArray(a)&&b-parseFloat(b)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;try{if(a.constructor&&!k.call(a,"constructor")&&!k.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(!l.ownFirst)for(b in a)return k.call(a,b);for(b in a);return void 0===b||k.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?i[j.call(a)]||"object":typeof a},globalEval:function(b){b&&n.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(s(a)){for(c=a.length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):g.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(h)return h.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,g=0,h=[];if(s(a))for(d=a.length;d>g;g++)e=b(a[g],g,c),null!=e&&h.push(e);else for(g in a)e=b(a[g],g,c),null!=e&&h.push(e);return f.apply([],h)},guid:1,proxy:function(a,b){var c,d,f;return"string"==typeof b&&(f=a[b],b=a,a=f),n.isFunction(a)?(c=e.call(arguments,2),d=function(){return a.apply(b||this,c.concat(e.call(arguments)))},d.guid=a.guid=a.guid||n.guid++,d):void 0},now:function(){return+new Date},support:l}),"function"==typeof Symbol&&(n.fn[Symbol.iterator]=c[Symbol.iterator]),n.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){i["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=!!a&&"length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ga(),z=ga(),A=ga(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+M+"))|)"+L+"*\\]",O=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+N+")*)|.*)\\)|)",P=new RegExp(L+"+","g"),Q=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),R=new RegExp("^"+L+"*,"+L+"*"),S=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),T=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),U=new RegExp(O),V=new RegExp("^"+M+"$"),W={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M+"|[*])"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,_=/[+~]/,aa=/'|\\/g,ba=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ca=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},da=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(ea){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fa(a,b,d,e){var f,h,j,k,l,o,r,s,w=b&&b.ownerDocument,x=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==x&&9!==x&&11!==x)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==x&&(o=$.exec(a)))if(f=o[1]){if(9===x){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(w&&(j=w.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(o[2])return H.apply(d,b.getElementsByTagName(a)),d;if((f=o[3])&&c.getElementsByClassName&&b.getElementsByClassName)return H.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==x)w=b,s=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(aa,"\\$&"):b.setAttribute("id",k=u),r=g(a),h=r.length,l=V.test(k)?"#"+k:"[id='"+k+"']";while(h--)r[h]=l+" "+qa(r[h]);s=r.join(","),w=_.test(a)&&oa(b.parentNode)||b}if(s)try{return H.apply(d,w.querySelectorAll(s)),d}catch(y){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(Q,"$1"),b,d,e)}function ga(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ha(a){return a[u]=!0,a}function ia(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ja(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function ka(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function la(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function na(a){return ha(function(b){return b=+b,ha(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function oa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=fa.support={},f=fa.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fa.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ia(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ia(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Z.test(n.getElementsByClassName),c.getById=ia(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Z.test(n.querySelectorAll))&&(ia(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\r\\' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ia(function(a){var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ia(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ka(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?ka(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},fa.matches=function(a,b){return fa(a,null,null,b)},fa.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fa(b,n,null,[a]).length>0},fa.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fa.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fa.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fa.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fa.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fa.selectors={cacheLength:50,createPseudo:ha,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fa.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fa.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ba,ca).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fa.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(P," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fa.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ha(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ha(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ha(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ha(function(a){return function(b){return fa(a,b).length>0}}),contains:ha(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ha(function(a){return V.test(a||"")||fa.error("unsupported lang: "+a),a=a.replace(ba,ca).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Y.test(a.nodeName)},input:function(a){return X.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:na(function(){return[0]}),last:na(function(a,b){return[b-1]}),eq:na(function(a,b,c){return[0>c?c+b:c]}),even:na(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:na(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:na(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:na(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=la(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=ma(b);function pa(){}pa.prototype=d.filters=d.pseudos,d.setFilters=new pa,g=fa.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){c&&!(e=R.exec(h))||(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=S.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(Q," ")}),h=h.slice(c.length));for(g in d.filter)!(e=W[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?fa.error(a):z(a,i).slice(0)};function qa(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function ra(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(j=b[u]||(b[u]={}),i=j[b.uniqueID]||(j[b.uniqueID]={}),(h=i[d])&&h[0]===w&&h[1]===f)return k[2]=h[2];if(i[d]=k,k[2]=a(b,c,g))return!0}}}function sa(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}function ua(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)),ha(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ta(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ua(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ua(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ua(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ra(function(a){return a===b},h,!0),l=ra(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ra(sa(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return va(i>1&&sa(m),i>1&&qa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,e>i&&wa(a.slice(i,e)),f>e&&wa(a=a.slice(e)),f>e&&qa(a))}m.push(c)}return sa(m)}function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=F.call(i));u=ua(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&fa.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ha(f):f}return h=fa.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xa(e,d)),f.selector=a}return f},i=fa.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ba,ca),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=W.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ba,ca),_.test(j[0].type)&&oa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qa(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&oa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ia(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ia(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ja("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ia(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ja("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ia(function(a){return null==a.getAttribute("disabled")})||ja(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fa}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.uniqueSort=n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},v=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},w=n.expr.match.needsContext,x=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,y=/^.[^:#\[\.,]*$/;function z(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(y.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return n.inArray(a,b)>-1!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;e>b;b++)if(n.contains(d[b],this))return!0}));for(b=0;e>b;b++)n.find(a,d[b],c);return c=this.pushStack(e>1?n.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(z(this,a||[],!1))},not:function(a){return this.pushStack(z(this,a||[],!0))},is:function(a){return!!z(this,"string"==typeof a&&w.test(a)?n(a):a||[],!1).length}});var A,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=n.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||A,"string"==typeof a){if(e="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:B.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),x.test(e[1])&&n.isPlainObject(b))for(e in b)n.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}if(f=d.getElementById(e[2]),f&&f.parentNode){if(f.id!==e[2])return A.find(a);this.length=1,this[0]=f}return this.context=d,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof c.ready?c.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};C.prototype=n.fn,A=n(d);var D=/^(?:parents|prev(?:Until|All))/,E={children:!0,contents:!0,next:!0,prev:!0};n.fn.extend({has:function(a){var b,c=n(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(n.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=w.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?n.inArray(this[0],n(a)):n.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.uniqueSort(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function F(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return u(a,"parentNode")},parentsUntil:function(a,b,c){return u(a,"parentNode",c)},next:function(a){return F(a,"nextSibling")},prev:function(a){return F(a,"previousSibling")},nextAll:function(a){return u(a,"nextSibling")},prevAll:function(a){return u(a,"previousSibling")},nextUntil:function(a,b,c){return u(a,"nextSibling",c)},prevUntil:function(a,b,c){return u(a,"previousSibling",c)},siblings:function(a){return v((a.parentNode||{}).firstChild,a)},children:function(a){return v(a.firstChild)},contents:function(a){return n.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(E[a]||(e=n.uniqueSort(e)),D.test(a)&&(e=e.reverse())),this.pushStack(e)}});var G=/\S+/g;function H(a){var b={};return n.each(a.match(G)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?H(a):n.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h<f.length)f[h].apply(c[0],c[1])===!1&&a.stopOnFalse&&(h=f.length,c=!1)}a.memory||(c=!1),b=!1,e&&(f=c?[]:"")},j={add:function(){return f&&(c&&!b&&(h=f.length-1,g.push(c)),function d(b){n.each(b,function(b,c){n.isFunction(c)?a.unique&&j.has(c)||f.push(c):c&&c.length&&"string"!==n.type(c)&&d(c)})}(arguments),c&&!b&&i()),this},remove:function(){return n.each(arguments,function(a,b){var c;while((c=n.inArray(b,f,c))>-1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?n.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=!0,c||j.disable(),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().progress(c.notify).done(c.resolve).fail(c.reject):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=e.call(arguments),d=c.length,f=1!==d||a&&n.isFunction(a.promise)?d:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?e.call(arguments):d,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(d>1)for(i=new Array(d),j=new Array(d),k=new Array(d);d>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().progress(h(b,j,i)).done(h(b,k,c)).fail(g.reject):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(d,[n]),n.fn.triggerHandler&&(n(d).triggerHandler("ready"),n(d).off("ready"))))}});function J(){d.addEventListener?(d.removeEventListener("DOMContentLoaded",K),a.removeEventListener("load",K)):(d.detachEvent("onreadystatechange",K),a.detachEvent("onload",K))}function K(){(d.addEventListener||"load"===a.event.type||"complete"===d.readyState)&&(J(),n.ready())}n.ready.promise=function(b){if(!I)if(I=n.Deferred(),"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll)a.setTimeout(n.ready);else if(d.addEventListener)d.addEventListener("DOMContentLoaded",K),a.addEventListener("load",K);else{d.attachEvent("onreadystatechange",K),a.attachEvent("onload",K);var c=!1;try{c=null==a.frameElement&&d.documentElement}catch(e){}c&&c.doScroll&&!function f(){if(!n.isReady){try{c.doScroll("left")}catch(b){return a.setTimeout(f,50)}J(),n.ready()}}()}return I.promise(b)},n.ready.promise();var L;for(L in n(l))break;l.ownFirst="0"===L,l.inlineBlockNeedsLayout=!1,n(function(){var a,b,c,e;c=d.getElementsByTagName("body")[0],c&&c.style&&(b=d.createElement("div"),e=d.createElement("div"),e.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(e).appendChild(b),"undefined"!=typeof b.style.zoom&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",l.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(e))}),function(){var a=d.createElement("div");l.deleteExpando=!0;try{delete a.test}catch(b){l.deleteExpando=!1}a=null}();var M=function(a){var b=n.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b},N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(O,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}n.data(a,b,c)}else c=void 0;
+}return c}function Q(a){var b;for(b in a)if(("data"!==b||!n.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function R(a,b,d,e){if(M(a)){var f,g,h=n.expando,i=a.nodeType,j=i?n.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||n.guid++:h),j[k]||(j[k]=i?{}:{toJSON:n.noop}),"object"!=typeof b&&"function"!=typeof b||(e?j[k]=n.extend(j[k],b):j[k].data=n.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[n.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[n.camelCase(b)])):f=g,f}}function S(a,b,c){if(M(a)){var d,e,f=a.nodeType,g=f?n.cache:a,h=f?a[n.expando]:n.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){n.isArray(b)?b=b.concat(n.map(b,n.camelCase)):b in d?b=[b]:(b=n.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!Q(d):!n.isEmptyObject(d))return}(c||(delete g[h].data,Q(g[h])))&&(f?n.cleanData([a],!0):l.deleteExpando||g!=g.window?delete g[h]:g[h]=void 0)}}}n.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?n.cache[a[n.expando]]:a[n.expando],!!a&&!Q(a)},data:function(a,b,c){return R(a,b,c)},removeData:function(a,b){return S(a,b)},_data:function(a,b,c){return R(a,b,c,!0)},_removeData:function(a,b){return S(a,b,!0)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=n.data(f),1===f.nodeType&&!n._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));n._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){n.data(this,a)}):arguments.length>1?this.each(function(){n.data(this,a,b)}):f?P(f,a,n.data(f,a)):void 0},removeData:function(a){return this.each(function(){n.removeData(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=n._data(a,b),c&&(!d||n.isArray(c)?d=n._data(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return n._data(a,c)||n._data(a,c,{empty:n.Callbacks("once memory").add(function(){n._removeData(a,b+"queue"),n._removeData(a,c)})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?n.queue(this[0],a):void 0===b?this:this.each(function(){var c=n.queue(this,a,b);n._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&n.dequeue(this,a)})},dequeue:function(a){return this.each(function(){n.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=n.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=n._data(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}}),function(){var a;l.shrinkWrapBlocks=function(){if(null!=a)return a;a=!1;var b,c,e;return c=d.getElementsByTagName("body")[0],c&&c.style?(b=d.createElement("div"),e=d.createElement("div"),e.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(e).appendChild(b),"undefined"!=typeof b.style.zoom&&(b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",b.appendChild(d.createElement("div")).style.width="5px",a=3!==b.offsetWidth),c.removeChild(e),a):void 0}}();var T=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,U=new RegExp("^(?:([+-])=|)("+T+")([a-z%]*)$","i"),V=["Top","Right","Bottom","Left"],W=function(a,b){return a=b||a,"none"===n.css(a,"display")||!n.contains(a.ownerDocument,a)};function X(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:function(){return n.css(a,b,"")},i=h(),j=c&&c[3]||(n.cssNumber[b]?"":"px"),k=(n.cssNumber[b]||"px"!==j&&+i)&&U.exec(n.css(a,b));if(k&&k[3]!==j){j=j||k[3],c=c||[],k=+i||1;do f=f||".5",k/=f,n.style(a,b,k+j);while(f!==(f=h()/i)&&1!==f&&--g)}return c&&(k=+k||+i||0,e=c[1]?k+(c[1]+1)*c[2]:+c[2],d&&(d.unit=j,d.start=k,d.end=e)),e}var Y=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)Y(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},Z=/^(?:checkbox|radio)$/i,$=/<([\w:-]+)/,_=/^$|\/(?:java|ecma)script/i,aa=/^\s+/,ba="abbr|article|aside|audio|bdi|canvas|data|datalist|details|dialog|figcaption|figure|footer|header|hgroup|main|mark|meter|nav|output|picture|progress|section|summary|template|time|video";function ca(a){var b=ba.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}!function(){var a=d.createElement("div"),b=d.createDocumentFragment(),c=d.createElement("input");a.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",l.leadingWhitespace=3===a.firstChild.nodeType,l.tbody=!a.getElementsByTagName("tbody").length,l.htmlSerialize=!!a.getElementsByTagName("link").length,l.html5Clone="<:nav></:nav>"!==d.createElement("nav").cloneNode(!0).outerHTML,c.type="checkbox",c.checked=!0,b.appendChild(c),l.appendChecked=c.checked,a.innerHTML="<textarea>x</textarea>",l.noCloneChecked=!!a.cloneNode(!0).lastChild.defaultValue,b.appendChild(a),c=d.createElement("input"),c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),a.appendChild(c),l.checkClone=a.cloneNode(!0).cloneNode(!0).lastChild.checked,l.noCloneEvent=!!a.addEventListener,a[n.expando]=1,l.attributes=!a.getAttribute(n.expando)}();var da={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:l.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]};da.optgroup=da.option,da.tbody=da.tfoot=da.colgroup=da.caption=da.thead,da.th=da.td;function ea(a,b){var c,d,e=0,f="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||n.nodeName(d,b)?f.push(d):n.merge(f,ea(d,b));return void 0===b||b&&n.nodeName(a,b)?n.merge([a],f):f}function fa(a,b){for(var c,d=0;null!=(c=a[d]);d++)n._data(c,"globalEval",!b||n._data(b[d],"globalEval"))}var ga=/<|&#?\w+;/,ha=/<tbody/i;function ia(a){Z.test(a.type)&&(a.defaultChecked=a.checked)}function ja(a,b,c,d,e){for(var f,g,h,i,j,k,m,o=a.length,p=ca(b),q=[],r=0;o>r;r++)if(g=a[r],g||0===g)if("object"===n.type(g))n.merge(q,g.nodeType?[g]:g);else if(ga.test(g)){i=i||p.appendChild(b.createElement("div")),j=($.exec(g)||["",""])[1].toLowerCase(),m=da[j]||da._default,i.innerHTML=m[1]+n.htmlPrefilter(g)+m[2],f=m[0];while(f--)i=i.lastChild;if(!l.leadingWhitespace&&aa.test(g)&&q.push(b.createTextNode(aa.exec(g)[0])),!l.tbody){g="table"!==j||ha.test(g)?"<table>"!==m[1]||ha.test(g)?0:i:i.firstChild,f=g&&g.childNodes.length;while(f--)n.nodeName(k=g.childNodes[f],"tbody")&&!k.childNodes.length&&g.removeChild(k)}n.merge(q,i.childNodes),i.textContent="";while(i.firstChild)i.removeChild(i.firstChild);i=p.lastChild}else q.push(b.createTextNode(g));i&&p.removeChild(i),l.appendChecked||n.grep(ea(q,"input"),ia),r=0;while(g=q[r++])if(d&&n.inArray(g,d)>-1)e&&e.push(g);else if(h=n.contains(g.ownerDocument,g),i=ea(p.appendChild(g),"script"),h&&fa(i),c){f=0;while(g=i[f++])_.test(g.type||"")&&c.push(g)}return i=null,p}!function(){var b,c,e=d.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(l[b]=c in a)||(e.setAttribute(c,"t"),l[b]=e.attributes[c].expando===!1);e=null}();var ka=/^(?:input|select|textarea)$/i,la=/^key/,ma=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,na=/^(?:focusinfocus|focusoutblur)$/,oa=/^([^.]*)(?:\.(.+)|)/;function pa(){return!0}function qa(){return!1}function ra(){try{return d.activeElement}catch(a){}}function sa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)sa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=qa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return n().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=n.guid++)),a.each(function(){n.event.add(this,b,e,d,c)})}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=n.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return"undefined"==typeof n||a&&n.event.triggered===a.type?void 0:n.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(G)||[""],h=b.length;while(h--)f=oa.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=n.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=n.event.special[o]||{},l=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},i),(m=g[o])||(m=g[o]=[],m.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,l):m.push(l),n.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n.hasData(a)&&n._data(a);if(r&&(k=r.events)){b=(b||"").match(G)||[""],j=b.length;while(j--)if(h=oa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=m.length;while(f--)g=m[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(m.splice(f,1),g.selector&&m.delegateCount--,l.remove&&l.remove.call(a,g));i&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(k)&&(delete r.handle,n._removeData(a,"events"))}},trigger:function(b,c,e,f){var g,h,i,j,l,m,o,p=[e||d],q=k.call(b,"type")?b.type:b,r=k.call(b,"namespace")?b.namespace.split("."):[];if(i=m=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!na.test(q+n.event.triggered)&&(q.indexOf(".")>-1&&(r=q.split("."),q=r.shift(),r.sort()),h=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=r.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:n.makeArray(c,[b]),l=n.event.special[q]||{},f||!l.trigger||l.trigger.apply(e,c)!==!1)){if(!f&&!l.noBubble&&!n.isWindow(e)){for(j=l.delegateType||q,na.test(j+q)||(i=i.parentNode);i;i=i.parentNode)p.push(i),m=i;m===(e.ownerDocument||d)&&p.push(m.defaultView||m.parentWindow||a)}o=0;while((i=p[o++])&&!b.isPropagationStopped())b.type=o>1?j:l.bindType||q,g=(n._data(i,"events")||{})[b.type]&&n._data(i,"handle"),g&&g.apply(i,c),g=h&&i[h],g&&g.apply&&M(i)&&(b.result=g.apply(i,c),b.result===!1&&b.preventDefault());if(b.type=q,!f&&!b.isDefaultPrevented()&&(!l._default||l._default.apply(p.pop(),c)===!1)&&M(e)&&h&&e[q]&&!n.isWindow(e)){m=e[h],m&&(e[h]=null),n.event.triggered=q;try{e[q]()}catch(s){}n.event.triggered=void 0,m&&(e[h]=m)}return b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,d,f,g,h=[],i=e.call(arguments),j=(n._data(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())a.rnamespace&&!a.rnamespace.test(g.namespace)||(a.handleObj=g,a.data=g.data,d=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>-1:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},fix:function(a){if(a[n.expando])return a;var b,c,e,f=a.type,g=a,h=this.fixHooks[f];h||(this.fixHooks[f]=h=ma.test(f)?this.mouseHooks:la.test(f)?this.keyHooks:{}),e=h.props?this.props.concat(h.props):this.props,a=new n.Event(g),b=e.length;while(b--)c=e[b],a[c]=g[c];return a.target||(a.target=g.srcElement||d),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,h.filter?h.filter(a,g):a},props:"altKey bubbles cancelable ctrlKey currentTarget detail eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,e,f,g=b.button,h=b.fromElement;return null==a.pageX&&null!=b.clientX&&(e=a.target.ownerDocument||d,f=e.documentElement,c=e.body,a.pageX=b.clientX+(f&&f.scrollLeft||c&&c.scrollLeft||0)-(f&&f.clientLeft||c&&c.clientLeft||0),a.pageY=b.clientY+(f&&f.scrollTop||c&&c.scrollTop||0)-(f&&f.clientTop||c&&c.clientTop||0)),!a.relatedTarget&&h&&(a.relatedTarget=h===a.target?b.toElement:h),a.which||void 0===g||(a.which=1&g?1:2&g?3:4&g?2:0),a}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==ra()&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:"focusin"},blur:{trigger:function(){return this===ra()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return n.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(a){return n.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c){var d=n.extend(new n.Event,c,{type:a,isSimulated:!0});n.event.trigger(d,null,b),d.isDefaultPrevented()&&c.preventDefault()}},n.removeEvent=d.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c)}:function(a,b,c){var d="on"+b;a.detachEvent&&("undefined"==typeof a[d]&&(a[d]=null),a.detachEvent(d,c))},n.Event=function(a,b){return this instanceof n.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?pa:qa):this.type=a,b&&n.extend(this,b),this.timeStamp=a&&a.timeStamp||n.now(),void(this[n.expando]=!0)):new n.Event(a,b)},n.Event.prototype={constructor:n.Event,isDefaultPrevented:qa,isPropagationStopped:qa,isImmediatePropagationStopped:qa,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=pa,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=pa,a&&!this.isSimulated&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=pa,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},n.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){n.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return e&&(e===d||n.contains(d,e))||(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),l.submit||(n.event.special.submit={setup:function(){return n.nodeName(this,"form")?!1:void n.event.add(this,"click._submit keypress._submit",function(a){var b=a.target,c=n.nodeName(b,"input")||n.nodeName(b,"button")?n.prop(b,"form"):void 0;c&&!n._data(c,"submit")&&(n.event.add(c,"submit._submit",function(a){a._submitBubble=!0}),n._data(c,"submit",!0))})},postDispatch:function(a){a._submitBubble&&(delete a._submitBubble,this.parentNode&&!a.isTrigger&&n.event.simulate("submit",this.parentNode,a))},teardown:function(){return n.nodeName(this,"form")?!1:void n.event.remove(this,"._submit")}}),l.change||(n.event.special.change={setup:function(){return ka.test(this.nodeName)?("checkbox"!==this.type&&"radio"!==this.type||(n.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._justChanged=!0)}),n.event.add(this,"click._change",function(a){this._justChanged&&!a.isTrigger&&(this._justChanged=!1),n.event.simulate("change",this,a)})),!1):void n.event.add(this,"beforeactivate._change",function(a){var b=a.target;ka.test(b.nodeName)&&!n._data(b,"change")&&(n.event.add(b,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||n.event.simulate("change",this.parentNode,a)}),n._data(b,"change",!0))})},handle:function(a){var b=a.target;return this!==b||a.isSimulated||a.isTrigger||"radio"!==b.type&&"checkbox"!==b.type?a.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return n.event.remove(this,"._change"),!ka.test(this.nodeName)}}),l.focusin||n.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){n.event.simulate(b,a.target,n.event.fix(a))};n.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=n._data(d,b);e||d.addEventListener(a,c,!0),n._data(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=n._data(d,b)-1;e?n._data(d,b,e):(d.removeEventListener(a,c,!0),n._removeData(d,b))}}}),n.fn.extend({on:function(a,b,c,d){return sa(this,a,b,c,d)},one:function(a,b,c,d){return sa(this,a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,n(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return b!==!1&&"function"!=typeof b||(c=b,b=void 0),c===!1&&(c=qa),this.each(function(){n.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){n.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?n.event.trigger(a,b,c,!0):void 0}});var ta=/ jQuery\d+="(?:null|\d+)"/g,ua=new RegExp("<(?:"+ba+")[\\s/>]","i"),va=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,wa=/<script|<style|<link/i,xa=/checked\s*(?:[^=]|=\s*.checked.)/i,ya=/^true\/(.*)/,za=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,Aa=ca(d),Ba=Aa.appendChild(d.createElement("div"));function Ca(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function Da(a){return a.type=(null!==n.find.attr(a,"type"))+"/"+a.type,a}function Ea(a){var b=ya.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Fa(a,b){if(1===b.nodeType&&n.hasData(a)){var c,d,e,f=n._data(a),g=n._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)n.event.add(b,c,h[c][d])}g.data&&(g.data=n.extend({},g.data))}}function Ga(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!l.noCloneEvent&&b[n.expando]){e=n._data(b);for(d in e.events)n.removeEvent(b,d,e.handle);b.removeAttribute(n.expando)}"script"===c&&b.text!==a.text?(Da(b).text=a.text,Ea(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),l.html5Clone&&a.innerHTML&&!n.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&Z.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}}function Ha(a,b,c,d){b=f.apply([],b);var e,g,h,i,j,k,m=0,o=a.length,p=o-1,q=b[0],r=n.isFunction(q);if(r||o>1&&"string"==typeof q&&!l.checkClone&&xa.test(q))return a.each(function(e){var f=a.eq(e);r&&(b[0]=q.call(this,e,f.html())),Ha(f,b,c,d)});if(o&&(k=ja(b,a[0].ownerDocument,!1,a,d),e=k.firstChild,1===k.childNodes.length&&(k=e),e||d)){for(i=n.map(ea(k,"script"),Da),h=i.length;o>m;m++)g=k,m!==p&&(g=n.clone(g,!0,!0),h&&n.merge(i,ea(g,"script"))),c.call(a[m],g,m);if(h)for(j=i[i.length-1].ownerDocument,n.map(i,Ea),m=0;h>m;m++)g=i[m],_.test(g.type||"")&&!n._data(g,"globalEval")&&n.contains(j,g)&&(g.src?n._evalUrl&&n._evalUrl(g.src):n.globalEval((g.text||g.textContent||g.innerHTML||"").replace(za,"")));k=e=null}return a}function Ia(a,b,c){for(var d,e=b?n.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||n.cleanData(ea(d)),d.parentNode&&(c&&n.contains(d.ownerDocument,d)&&fa(ea(d,"script")),d.parentNode.removeChild(d));return a}n.extend({htmlPrefilter:function(a){return a.replace(va,"<$1></$2>")},clone:function(a,b,c){var d,e,f,g,h,i=n.contains(a.ownerDocument,a);if(l.html5Clone||n.isXMLDoc(a)||!ua.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(Ba.innerHTML=a.outerHTML,Ba.removeChild(f=Ba.firstChild)),!(l.noCloneEvent&&l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(d=ea(f),h=ea(a),g=0;null!=(e=h[g]);++g)d[g]&&Ga(e,d[g]);if(b)if(c)for(h=h||ea(a),d=d||ea(f),g=0;null!=(e=h[g]);g++)Fa(e,d[g]);else Fa(a,f);return d=ea(f,"script"),d.length>0&&fa(d,!i&&ea(a,"script")),d=h=e=null,f},cleanData:function(a,b){for(var d,e,f,g,h=0,i=n.expando,j=n.cache,k=l.attributes,m=n.event.special;null!=(d=a[h]);h++)if((b||M(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)m[e]?n.event.remove(d,e):n.removeEvent(d,e,g.handle);j[f]&&(delete j[f],k||"undefined"==typeof d.removeAttribute?d[i]=void 0:d.removeAttribute(i),c.push(f))}}}),n.fn.extend({domManip:Ha,detach:function(a){return Ia(this,a,!0)},remove:function(a){return Ia(this,a)},text:function(a){return Y(this,function(a){return void 0===a?n.text(this):this.empty().append((this[0]&&this[0].ownerDocument||d).createTextNode(a))},null,a,arguments.length)},append:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.appendChild(a)}})},prepend:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&n.cleanData(ea(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&n.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return Y(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(ta,""):void 0;if("string"==typeof a&&!wa.test(a)&&(l.htmlSerialize||!ua.test(a))&&(l.leadingWhitespace||!aa.test(a))&&!da[($.exec(a)||["",""])[1].toLowerCase()]){a=n.htmlPrefilter(a);try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(ea(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ha(this,arguments,function(b){var c=this.parentNode;n.inArray(this,a)<0&&(n.cleanData(ea(this)),c&&c.replaceChild(b,this))},a)}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=0,e=[],f=n(a),h=f.length-1;h>=d;d++)c=d===h?this:this.clone(!0),n(f[d])[b](c),g.apply(e,c.get());return this.pushStack(e)}});var Ja,Ka={HTML:"block",BODY:"block"};function La(a,b){var c=n(b.createElement(a)).appendTo(b.body),d=n.css(c[0],"display");return c.detach(),d}function Ma(a){var b=d,c=Ka[a];return c||(c=La(a,b),"none"!==c&&c||(Ja=(Ja||n("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=(Ja[0].contentWindow||Ja[0].contentDocument).document,b.write(),b.close(),c=La(a,b),Ja.detach()),Ka[a]=c),c}var Na=/^margin/,Oa=new RegExp("^("+T+")(?!px)[a-z%]+$","i"),Pa=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e},Qa=d.documentElement;!function(){var b,c,e,f,g,h,i=d.createElement("div"),j=d.createElement("div");if(j.style){j.style.cssText="float:left;opacity:.5",l.opacity="0.5"===j.style.opacity,l.cssFloat=!!j.style.cssFloat,j.style.backgroundClip="content-box",j.cloneNode(!0).style.backgroundClip="",l.clearCloneStyle="content-box"===j.style.backgroundClip,i=d.createElement("div"),i.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",j.innerHTML="",i.appendChild(j),l.boxSizing=""===j.style.boxSizing||""===j.style.MozBoxSizing||""===j.style.WebkitBoxSizing,n.extend(l,{reliableHiddenOffsets:function(){return null==b&&k(),f},boxSizingReliable:function(){return null==b&&k(),e},pixelMarginRight:function(){return null==b&&k(),c},pixelPosition:function(){return null==b&&k(),b},reliableMarginRight:function(){return null==b&&k(),g},reliableMarginLeft:function(){return null==b&&k(),h}});function k(){var k,l,m=d.documentElement;m.appendChild(i),j.style.cssText="-webkit-box-sizing:border-box;box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",b=e=h=!1,c=g=!0,a.getComputedStyle&&(l=a.getComputedStyle(j),b="1%"!==(l||{}).top,h="2px"===(l||{}).marginLeft,e="4px"===(l||{width:"4px"}).width,j.style.marginRight="50%",c="4px"===(l||{marginRight:"4px"}).marginRight,k=j.appendChild(d.createElement("div")),k.style.cssText=j.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",k.style.marginRight=k.style.width="0",j.style.width="1px",g=!parseFloat((a.getComputedStyle(k)||{}).marginRight),j.removeChild(k)),j.style.display="none",f=0===j.getClientRects().length,f&&(j.style.display="",j.innerHTML="<table><tr><td></td><td>t</td></tr></table>",j.childNodes[0].style.borderCollapse="separate",k=j.getElementsByTagName("td"),k[0].style.cssText="margin:0;border:0;padding:0;display:none",f=0===k[0].offsetHeight,f&&(k[0].style.display="",k[1].style.display="none",f=0===k[0].offsetHeight)),m.removeChild(i)}}}();var Ra,Sa,Ta=/^(top|right|bottom|left)$/;a.getComputedStyle?(Ra=function(b){var c=b.ownerDocument.defaultView;return c&&c.opener||(c=a),c.getComputedStyle(b)},Sa=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ra(a),g=c?c.getPropertyValue(b)||c[b]:void 0,""!==g&&void 0!==g||n.contains(a.ownerDocument,a)||(g=n.style(a,b)),c&&!l.pixelMarginRight()&&Oa.test(g)&&Na.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f),void 0===g?g:g+""}):Qa.currentStyle&&(Ra=function(a){return a.currentStyle},Sa=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ra(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Oa.test(g)&&!Ta.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function Ua(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}var Va=/alpha\([^)]*\)/i,Wa=/opacity\s*=\s*([^)]*)/i,Xa=/^(none|table(?!-c[ea]).+)/,Ya=new RegExp("^("+T+")(.*)$","i"),Za={position:"absolute",visibility:"hidden",display:"block"},$a={letterSpacing:"0",fontWeight:"400"},_a=["Webkit","O","Moz","ms"],ab=d.createElement("div").style;function bb(a){if(a in ab)return a;var b=a.charAt(0).toUpperCase()+a.slice(1),c=_a.length;while(c--)if(a=_a[c]+b,a in ab)return a}function cb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=n._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&W(d)&&(f[g]=n._data(d,"olddisplay",Ma(d.nodeName)))):(e=W(d),(c&&"none"!==c||!e)&&n._data(d,"olddisplay",e?c:n.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function db(a,b,c){var d=Ya.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function eb(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=n.css(a,c+V[f],!0,e)),d?("content"===c&&(g-=n.css(a,"padding"+V[f],!0,e)),"margin"!==c&&(g-=n.css(a,"border"+V[f]+"Width",!0,e))):(g+=n.css(a,"padding"+V[f],!0,e),"padding"!==c&&(g+=n.css(a,"border"+V[f]+"Width",!0,e)));return g}function fb(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Ra(a),g=l.boxSizing&&"border-box"===n.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Sa(a,b,f),(0>e||null==e)&&(e=a.style[b]),Oa.test(e))return e;d=g&&(l.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+eb(a,b,c||(g?"border":"content"),d,f)+"px"}n.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Sa(a,"opacity");return""===c?"1":c}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":l.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=n.camelCase(b),i=a.style;if(b=n.cssProps[h]||(n.cssProps[h]=bb(h)||h),g=n.cssHooks[b]||n.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=U.exec(c))&&e[1]&&(c=X(a,b,e),f="number"),null!=c&&c===c&&("number"===f&&(c+=e&&e[3]||(n.cssNumber[h]?"":"px")),l.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),!(g&&"set"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=n.camelCase(b);return b=n.cssProps[h]||(n.cssProps[h]=bb(h)||h),g=n.cssHooks[b]||n.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Sa(a,b,d)),"normal"===f&&b in $a&&(f=$a[b]),""===c||c?(e=parseFloat(f),c===!0||isFinite(e)?e||0:f):f}}),n.each(["height","width"],function(a,b){n.cssHooks[b]={get:function(a,c,d){return c?Xa.test(n.css(a,"display"))&&0===a.offsetWidth?Pa(a,Za,function(){return fb(a,b,d)}):fb(a,b,d):void 0},set:function(a,c,d){var e=d&&Ra(a);return db(a,c,d?eb(a,b,d,l.boxSizing&&"border-box"===n.css(a,"boxSizing",!1,e),e):0)}}}),l.opacity||(n.cssHooks.opacity={get:function(a,b){return Wa.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=n.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===n.trim(f.replace(Va,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Va.test(f)?f.replace(Va,e):f+" "+e)}}),n.cssHooks.marginRight=Ua(l.reliableMarginRight,function(a,b){return b?Pa(a,{display:"inline-block"},Sa,[a,"marginRight"]):void 0}),n.cssHooks.marginLeft=Ua(l.reliableMarginLeft,function(a,b){return b?(parseFloat(Sa(a,"marginLeft"))||(n.contains(a.ownerDocument,a)?a.getBoundingClientRect().left-Pa(a,{
+marginLeft:0},function(){return a.getBoundingClientRect().left}):0))+"px":void 0}),n.each({margin:"",padding:"",border:"Width"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+V[d]+b]=f[d]||f[d-2]||f[0];return e}},Na.test(a)||(n.cssHooks[a+b].set=db)}),n.fn.extend({css:function(a,b){return Y(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=Ra(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return void 0!==c?n.style(a,b,c):n.css(a,b)},a,b,arguments.length>1)},show:function(){return cb(this,!0)},hide:function(){return cb(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){W(this)?n(this).show():n(this).hide()})}});function gb(a,b,c,d,e){return new gb.prototype.init(a,b,c,d,e)}n.Tween=gb,gb.prototype={constructor:gb,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||n.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?"":"px")},cur:function(){var a=gb.propHooks[this.prop];return a&&a.get?a.get(this):gb.propHooks._default.get(this)},run:function(a){var b,c=gb.propHooks[this.prop];return this.options.duration?this.pos=b=n.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):gb.propHooks._default.set(this),this}},gb.prototype.init.prototype=gb.prototype,gb.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=n.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[n.cssProps[a.prop]]&&!n.cssHooks[a.prop]?a.elem[a.prop]=a.now:n.style(a.elem,a.prop,a.now+a.unit)}}},gb.propHooks.scrollTop=gb.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},n.fx=gb.prototype.init,n.fx.step={};var hb,ib,jb=/^(?:toggle|show|hide)$/,kb=/queueHooks$/;function lb(){return a.setTimeout(function(){hb=void 0}),hb=n.now()}function mb(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=V[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function nb(a,b,c){for(var d,e=(qb.tweeners[b]||[]).concat(qb.tweeners["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function ob(a,b,c){var d,e,f,g,h,i,j,k,m=this,o={},p=a.style,q=a.nodeType&&W(a),r=n._data(a,"fxshow");c.queue||(h=n._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,m.always(function(){m.always(function(){h.unqueued--,n.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=n.css(a,"display"),k="none"===j?n._data(a,"olddisplay")||Ma(a.nodeName):j,"inline"===k&&"none"===n.css(a,"float")&&(l.inlineBlockNeedsLayout&&"inline"!==Ma(a.nodeName)?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",l.shrinkWrapBlocks()||m.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],jb.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||n.style(a,d)}else j=void 0;if(n.isEmptyObject(o))"inline"===("none"===j?Ma(a.nodeName):j)&&(p.display=j);else{r?"hidden"in r&&(q=r.hidden):r=n._data(a,"fxshow",{}),f&&(r.hidden=!q),q?n(a).show():m.done(function(){n(a).hide()}),m.done(function(){var b;n._removeData(a,"fxshow");for(b in o)n.style(a,b,o[b])});for(d in o)g=nb(q?r[d]:0,d,m),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function pb(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a[c],n.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=n.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function qb(a,b,c){var d,e,f=0,g=qb.prefilters.length,h=n.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=hb||lb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:n.extend({},b),opts:n.extend(!0,{specialEasing:{},easing:n.easing._default},c),originalProperties:b,originalOptions:c,startTime:hb||lb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=n.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?(h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j,b])):h.rejectWith(a,[j,b]),this}}),k=j.props;for(pb(k,j.opts.specialEasing);g>f;f++)if(d=qb.prefilters[f].call(j,a,k,j.opts))return n.isFunction(d.stop)&&(n._queueHooks(j.elem,j.opts.queue).stop=n.proxy(d.stop,d)),d;return n.map(k,nb,j),n.isFunction(j.opts.start)&&j.opts.start.call(a,j),n.fx.timer(n.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}n.Animation=n.extend(qb,{tweeners:{"*":[function(a,b){var c=this.createTween(a,b);return X(c.elem,a,U.exec(b),c),c}]},tweener:function(a,b){n.isFunction(a)?(b=a,a=["*"]):a=a.match(G);for(var c,d=0,e=a.length;e>d;d++)c=a[d],qb.tweeners[c]=qb.tweeners[c]||[],qb.tweeners[c].unshift(b)},prefilters:[ob],prefilter:function(a,b){b?qb.prefilters.unshift(a):qb.prefilters.push(a)}}),n.speed=function(a,b,c){var d=a&&"object"==typeof a?n.extend({},a):{complete:c||!c&&b||n.isFunction(a)&&a,duration:a,easing:c&&b||b&&!n.isFunction(b)&&b};return d.duration=n.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in n.fx.speeds?n.fx.speeds[d.duration]:n.fx.speeds._default,null!=d.queue&&d.queue!==!0||(d.queue="fx"),d.old=d.complete,d.complete=function(){n.isFunction(d.old)&&d.old.call(this),d.queue&&n.dequeue(this,d.queue)},d},n.fn.extend({fadeTo:function(a,b,c,d){return this.filter(W).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=n.isEmptyObject(a),f=n.speed(b,c,d),g=function(){var b=qb(this,n.extend({},a),f);(e||n._data(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=n.timers,g=n._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&kb.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));!b&&c||n.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=n._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=n.timers,g=d?d.length:0;for(c.finish=!0,n.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),n.each(["toggle","show","hide"],function(a,b){var c=n.fn[b];n.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(mb(b,!0),a,d,e)}}),n.each({slideDown:mb("show"),slideUp:mb("hide"),slideToggle:mb("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){n.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),n.timers=[],n.fx.tick=function(){var a,b=n.timers,c=0;for(hb=n.now();c<b.length;c++)a=b[c],a()||b[c]!==a||b.splice(c--,1);b.length||n.fx.stop(),hb=void 0},n.fx.timer=function(a){n.timers.push(a),a()?n.fx.start():n.timers.pop()},n.fx.interval=13,n.fx.start=function(){ib||(ib=a.setInterval(n.fx.tick,n.fx.interval))},n.fx.stop=function(){a.clearInterval(ib),ib=null},n.fx.speeds={slow:600,fast:200,_default:400},n.fn.delay=function(b,c){return b=n.fx?n.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a,b=d.createElement("input"),c=d.createElement("div"),e=d.createElement("select"),f=e.appendChild(d.createElement("option"));c=d.createElement("div"),c.setAttribute("className","t"),c.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",a=c.getElementsByTagName("a")[0],b.setAttribute("type","checkbox"),c.appendChild(b),a=c.getElementsByTagName("a")[0],a.style.cssText="top:1px",l.getSetAttribute="t"!==c.className,l.style=/top/.test(a.getAttribute("style")),l.hrefNormalized="/a"===a.getAttribute("href"),l.checkOn=!!b.value,l.optSelected=f.selected,l.enctype=!!d.createElement("form").enctype,e.disabled=!0,l.optDisabled=!f.disabled,b=d.createElement("input"),b.setAttribute("value",""),l.input=""===b.getAttribute("value"),b.value="t",b.setAttribute("type","radio"),l.radioValue="t"===b.value}();var rb=/\r/g,sb=/[\x20\t\r\n\f]+/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e="":"number"==typeof e?e+="":n.isArray(e)&&(e=n.map(e,function(a){return null==a?"":a+""})),b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(rb,""):null==c?"":c)}}}),n.extend({valHooks:{option:{get:function(a){var b=n.find.attr(a,"value");return null!=b?b:n.trim(n.text(a)).replace(sb," ")}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],(c.selected||i===e)&&(l.optDisabled?!c.disabled:null===c.getAttribute("disabled"))&&(!c.parentNode.disabled||!n.nodeName(c.parentNode,"optgroup"))){if(b=n(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=n.makeArray(b),g=e.length;while(g--)if(d=e[g],n.inArray(n.valHooks.option.get(d),f)>-1)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),n.each(["radio","checkbox"],function(){n.valHooks[this]={set:function(a,b){return n.isArray(b)?a.checked=n.inArray(n(a).val(),b)>-1:void 0}},l.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var tb,ub,vb=n.expr.attrHandle,wb=/^(?:checked|selected)$/i,xb=l.getSetAttribute,yb=l.input;n.fn.extend({attr:function(a,b){return Y(this,n.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){n.removeAttr(this,a)})}}),n.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?n.prop(a,b,c):(1===f&&n.isXMLDoc(a)||(b=b.toLowerCase(),e=n.attrHooks[b]||(n.expr.match.bool.test(b)?ub:tb)),void 0!==c?null===c?void n.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=n.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!l.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(G);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)?yb&&xb||!wb.test(c)?a[d]=!1:a[n.camelCase("default-"+c)]=a[d]=!1:n.attr(a,c,""),a.removeAttribute(xb?c:d)}}),ub={set:function(a,b,c){return b===!1?n.removeAttr(a,c):yb&&xb||!wb.test(c)?a.setAttribute(!xb&&n.propFix[c]||c,c):a[n.camelCase("default-"+c)]=a[c]=!0,c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=vb[b]||n.find.attr;yb&&xb||!wb.test(b)?vb[b]=function(a,b,d){var e,f;return d||(f=vb[b],vb[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,vb[b]=f),e}:vb[b]=function(a,b,c){return c?void 0:a[n.camelCase("default-"+b)]?b.toLowerCase():null}}),yb&&xb||(n.attrHooks.value={set:function(a,b,c){return n.nodeName(a,"input")?void(a.defaultValue=b):tb&&tb.set(a,b,c)}}),xb||(tb={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},vb.id=vb.name=vb.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},n.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:tb.set},n.attrHooks.contenteditable={set:function(a,b,c){tb.set(a,""===b?!1:b,c)}},n.each(["width","height"],function(a,b){n.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),l.style||(n.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var zb=/^(?:input|select|textarea|button|object)$/i,Ab=/^(?:a|area)$/i;n.fn.extend({prop:function(a,b){return Y(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return a=n.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),n.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&n.isXMLDoc(a)||(b=n.propFix[b]||b,e=n.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=n.find.attr(a,"tabindex");return b?parseInt(b,10):zb.test(a.nodeName)||Ab.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),l.hrefNormalized||n.each(["href","src"],function(a,b){n.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),l.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),n.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){n.propFix[this.toLowerCase()]=this}),l.enctype||(n.propFix.enctype="encoding");var Bb=/[\t\r\n\f]/g;function Cb(a){return n.attr(a,"class")||""}n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,Cb(this)))});if("string"==typeof a&&a){b=a.match(G)||[];while(c=this[i++])if(e=Cb(c),d=1===c.nodeType&&(" "+e+" ").replace(Bb," ")){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=n.trim(d),e!==h&&n.attr(c,"class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,Cb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(G)||[];while(c=this[i++])if(e=Cb(c),d=1===c.nodeType&&(" "+e+" ").replace(Bb," ")){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=n.trim(d),e!==h&&n.attr(c,"class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):n.isFunction(a)?this.each(function(c){n(this).toggleClass(a.call(this,c,Cb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=n(this),f=a.match(G)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=Cb(this),b&&n._data(this,"__className__",b),n.attr(this,"class",b||a===!1?"":n._data(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+Cb(c)+" ").replace(Bb," ").indexOf(b)>-1)return!0;return!1}}),n.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){n.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),n.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var Db=a.location,Eb=n.now(),Fb=/\?/,Gb=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;n.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=n.trim(b+"");return e&&!n.trim(e.replace(Gb,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():n.error("Invalid JSON: "+b)},n.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new a.DOMParser,c=d.parseFromString(b,"text/xml")):(c=new a.ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||n.error("Invalid XML: "+b),c};var Hb=/#.*$/,Ib=/([?&])_=[^&]*/,Jb=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Kb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Lb=/^(?:GET|HEAD)$/,Mb=/^\/\//,Nb=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Ob={},Pb={},Qb="*/".concat("*"),Rb=Db.href,Sb=Nb.exec(Rb.toLowerCase())||[];function Tb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(G)||[];if(n.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Ub(a,b,c,d){var e={},f=a===Pb;function g(h){var i;return e[h]=!0,n.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Vb(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&n.extend(!0,a,c),a}function Wb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Xb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}n.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Rb,type:"GET",isLocal:Kb.test(Sb[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Qb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":n.parseJSON,"text xml":n.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Vb(Vb(a,n.ajaxSettings),b):Vb(n.ajaxSettings,a)},ajaxPrefilter:Tb(Ob),ajaxTransport:Tb(Pb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var d,e,f,g,h,i,j,k,l=n.ajaxSetup({},c),m=l.context||l,o=l.context&&(m.nodeType||m.jquery)?n(m):n.event,p=n.Deferred(),q=n.Callbacks("once memory"),r=l.statusCode||{},s={},t={},u=0,v="canceled",w={readyState:0,getResponseHeader:function(a){var b;if(2===u){if(!k){k={};while(b=Jb.exec(g))k[b[1].toLowerCase()]=b[2]}b=k[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===u?g:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return u||(a=t[c]=t[c]||a,s[a]=b),this},overrideMimeType:function(a){return u||(l.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>u)for(b in a)r[b]=[r[b],a[b]];else w.always(a[w.status]);return this},abort:function(a){var b=a||v;return j&&j.abort(b),y(0,b),this}};if(p.promise(w).complete=q.add,w.success=w.done,w.error=w.fail,l.url=((b||l.url||Rb)+"").replace(Hb,"").replace(Mb,Sb[1]+"//"),l.type=c.method||c.type||l.method||l.type,l.dataTypes=n.trim(l.dataType||"*").toLowerCase().match(G)||[""],null==l.crossDomain&&(d=Nb.exec(l.url.toLowerCase()),l.crossDomain=!(!d||d[1]===Sb[1]&&d[2]===Sb[2]&&(d[3]||("http:"===d[1]?"80":"443"))===(Sb[3]||("http:"===Sb[1]?"80":"443")))),l.data&&l.processData&&"string"!=typeof l.data&&(l.data=n.param(l.data,l.traditional)),Ub(Ob,l,c,w),2===u)return w;i=n.event&&l.global,i&&0===n.active++&&n.event.trigger("ajaxStart"),l.type=l.type.toUpperCase(),l.hasContent=!Lb.test(l.type),f=l.url,l.hasContent||(l.data&&(f=l.url+=(Fb.test(f)?"&":"?")+l.data,delete l.data),l.cache===!1&&(l.url=Ib.test(f)?f.replace(Ib,"$1_="+Eb++):f+(Fb.test(f)?"&":"?")+"_="+Eb++)),l.ifModified&&(n.lastModified[f]&&w.setRequestHeader("If-Modified-Since",n.lastModified[f]),n.etag[f]&&w.setRequestHeader("If-None-Match",n.etag[f])),(l.data&&l.hasContent&&l.contentType!==!1||c.contentType)&&w.setRequestHeader("Content-Type",l.contentType),w.setRequestHeader("Accept",l.dataTypes[0]&&l.accepts[l.dataTypes[0]]?l.accepts[l.dataTypes[0]]+("*"!==l.dataTypes[0]?", "+Qb+"; q=0.01":""):l.accepts["*"]);for(e in l.headers)w.setRequestHeader(e,l.headers[e]);if(l.beforeSend&&(l.beforeSend.call(m,w,l)===!1||2===u))return w.abort();v="abort";for(e in{success:1,error:1,complete:1})w[e](l[e]);if(j=Ub(Pb,l,c,w)){if(w.readyState=1,i&&o.trigger("ajaxSend",[w,l]),2===u)return w;l.async&&l.timeout>0&&(h=a.setTimeout(function(){w.abort("timeout")},l.timeout));try{u=1,j.send(s,y)}catch(x){if(!(2>u))throw x;y(-1,x)}}else y(-1,"No Transport");function y(b,c,d,e){var k,s,t,v,x,y=c;2!==u&&(u=2,h&&a.clearTimeout(h),j=void 0,g=e||"",w.readyState=b>0?4:0,k=b>=200&&300>b||304===b,d&&(v=Wb(l,w,d)),v=Xb(l,v,w,k),k?(l.ifModified&&(x=w.getResponseHeader("Last-Modified"),x&&(n.lastModified[f]=x),x=w.getResponseHeader("etag"),x&&(n.etag[f]=x)),204===b||"HEAD"===l.type?y="nocontent":304===b?y="notmodified":(y=v.state,s=v.data,t=v.error,k=!t)):(t=y,!b&&y||(y="error",0>b&&(b=0))),w.status=b,w.statusText=(c||y)+"",k?p.resolveWith(m,[s,y,w]):p.rejectWith(m,[w,y,t]),w.statusCode(r),r=void 0,i&&o.trigger(k?"ajaxSuccess":"ajaxError",[w,l,k?s:t]),q.fireWith(m,[w,y]),i&&(o.trigger("ajaxComplete",[w,l]),--n.active||n.event.trigger("ajaxStop")))}return w},getJSON:function(a,b,c){return n.get(a,b,c,"json")},getScript:function(a,b){return n.get(a,void 0,b,"script")}}),n.each(["get","post"],function(a,b){n[b]=function(a,c,d,e){return n.isFunction(c)&&(e=e||d,d=c,c=void 0),n.ajax(n.extend({url:a,type:b,dataType:e,data:c,success:d},n.isPlainObject(a)&&a))}}),n._evalUrl=function(a){return n.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},n.fn.extend({wrapAll:function(a){if(n.isFunction(a))return this.each(function(b){n(this).wrapAll(a.call(this,b))});if(this[0]){var b=n(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return n.isFunction(a)?this.each(function(b){n(this).wrapInner(a.call(this,b))}):this.each(function(){var b=n(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=n.isFunction(a);return this.each(function(c){n(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){n.nodeName(this,"body")||n(this).replaceWith(this.childNodes)}).end()}});function Yb(a){return a.style&&a.style.display||n.css(a,"display")}function Zb(a){if(!n.contains(a.ownerDocument||d,a))return!0;while(a&&1===a.nodeType){if("none"===Yb(a)||"hidden"===a.type)return!0;a=a.parentNode}return!1}n.expr.filters.hidden=function(a){return l.reliableHiddenOffsets()?a.offsetWidth<=0&&a.offsetHeight<=0&&!a.getClientRects().length:Zb(a)},n.expr.filters.visible=function(a){return!n.expr.filters.hidden(a)};var $b=/%20/g,_b=/\[\]$/,ac=/\r?\n/g,bc=/^(?:submit|button|image|reset|file)$/i,cc=/^(?:input|select|textarea|keygen)/i;function dc(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||_b.test(a)?d(a,e):dc(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==n.type(b))d(a,b);else for(e in b)dc(a+"["+e+"]",b[e],c,d)}n.param=function(a,b){var c,d=[],e=function(a,b){b=n.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=n.ajaxSettings&&n.ajaxSettings.traditional),n.isArray(a)||a.jquery&&!n.isPlainObject(a))n.each(a,function(){e(this.name,this.value)});else for(c in a)dc(c,a[c],b,e);return d.join("&").replace($b,"+")},n.fn.extend({serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=n.prop(this,"elements");return a?n.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!n(this).is(":disabled")&&cc.test(this.nodeName)&&!bc.test(a)&&(this.checked||!Z.test(a))}).map(function(a,b){var c=n(this).val();return null==c?null:n.isArray(c)?n.map(c,function(a){return{name:b.name,value:a.replace(ac,"\r\n")}}):{name:b.name,value:c.replace(ac,"\r\n")}}).get()}}),n.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return this.isLocal?ic():d.documentMode>8?hc():/^(get|post|head|put|delete|options)$/i.test(this.type)&&hc()||ic()}:hc;var ec=0,fc={},gc=n.ajaxSettings.xhr();a.attachEvent&&a.attachEvent("onunload",function(){for(var a in fc)fc[a](void 0,!0)}),l.cors=!!gc&&"withCredentials"in gc,gc=l.ajax=!!gc,gc&&n.ajaxTransport(function(b){if(!b.crossDomain||l.cors){var c;return{send:function(d,e){var f,g=b.xhr(),h=++ec;if(g.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(f in b.xhrFields)g[f]=b.xhrFields[f];b.mimeType&&g.overrideMimeType&&g.overrideMimeType(b.mimeType),b.crossDomain||d["X-Requested-With"]||(d["X-Requested-With"]="XMLHttpRequest");for(f in d)void 0!==d[f]&&g.setRequestHeader(f,d[f]+"");g.send(b.hasContent&&b.data||null),c=function(a,d){var f,i,j;if(c&&(d||4===g.readyState))if(delete fc[h],c=void 0,g.onreadystatechange=n.noop,d)4!==g.readyState&&g.abort();else{j={},f=g.status,"string"==typeof g.responseText&&(j.text=g.responseText);try{i=g.statusText}catch(k){i=""}f||!b.isLocal||b.crossDomain?1223===f&&(f=204):f=j.text?200:404}j&&e(f,i,j,g.getAllResponseHeaders())},b.async?4===g.readyState?a.setTimeout(c):g.onreadystatechange=fc[h]=c:c()},abort:function(){c&&c(void 0,!0)}}}});function hc(){try{return new a.XMLHttpRequest}catch(b){}}function ic(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}n.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return n.globalEval(a),a}}}),n.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),n.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=d.head||n("head")[0]||d.documentElement;return{send:function(e,f){b=d.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||f(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var jc=[],kc=/(=)\?(?=&|$)|\?\?/;n.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=jc.pop()||n.expando+"_"+Eb++;return this[a]=!0,a}}),n.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(kc.test(b.url)?"url":"string"==typeof b.data&&0===(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&kc.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=n.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(kc,"$1"+e):b.jsonp!==!1&&(b.url+=(Fb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||n.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){void 0===f?n(a).removeProp(e):a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,jc.push(e)),g&&n.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),n.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||d;var e=x.exec(a),f=!c&&[];return e?[b.createElement(e[1])]:(e=ja([a],b,f),f&&f.length&&n(f).remove(),n.merge([],e.childNodes))};var lc=n.fn.load;n.fn.load=function(a,b,c){if("string"!=typeof a&&lc)return lc.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>-1&&(d=n.trim(a.slice(h,a.length)),a=a.slice(0,h)),n.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&n.ajax({url:a,type:e||"GET",dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?n("<div>").append(n.parseHTML(a)).find(d):a)}).always(c&&function(a,b){g.each(function(){c.apply(this,f||[a.responseText,b,a])})}),this},n.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){n.fn[b]=function(a){return this.on(b,a)}}),n.expr.filters.animated=function(a){return n.grep(n.timers,function(b){return a===b.elem}).length};function mc(a){return n.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}n.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=n.css(a,"position"),l=n(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=n.css(a,"top"),i=n.css(a,"left"),j=("absolute"===k||"fixed"===k)&&n.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),n.isFunction(b)&&(b=b.call(a,c,n.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},n.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){n.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,n.contains(b,e)?("undefined"!=typeof e.getBoundingClientRect&&(d=e.getBoundingClientRect()),c=mc(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===n.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),n.nodeName(a[0],"html")||(c=a.offset()),c.top+=n.css(a[0],"borderTopWidth",!0),c.left+=n.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-n.css(d,"marginTop",!0),left:b.left-c.left-n.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&!n.nodeName(a,"html")&&"static"===n.css(a,"position"))a=a.offsetParent;return a||Qa})}}),n.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);n.fn[a]=function(d){return Y(this,function(a,d,e){var f=mc(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?n(f).scrollLeft():e,c?e:n(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),n.each(["top","left"],function(a,b){n.cssHooks[b]=Ua(l.pixelPosition,function(a,c){return c?(c=Sa(a,b),Oa.test(c)?n(a).position()[b]+"px":c):void 0})}),n.each({Height:"height",Width:"width"},function(a,b){n.each({
+padding:"inner"+a,content:b,"":"outer"+a},function(c,d){n.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return Y(this,function(b,c,d){var e;return n.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?n.css(b,c,g):n.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),n.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}}),n.fn.size=function(){return this.length},n.fn.andSelf=n.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return n});var nc=a.jQuery,oc=a.$;return n.noConflict=function(b){return a.$===n&&(a.$=oc),b&&a.jQuery===n&&(a.jQuery=nc),n},b||(a.jQuery=a.$=n),n});
diff --git a/docs/assets/scripts/owl.carousel.min.js b/docs/assets/scripts/owl.carousel.min.js
new file mode 100644
index 000000000..394505e0f
--- /dev/null
+++ b/docs/assets/scripts/owl.carousel.min.js
@@ -0,0 +1,47 @@
+"function"!==typeof Object.create&&(Object.create=function(f){function g(){}g.prototype=f;return new g});
+(function(f,g,k){var l={init:function(a,b){this.$elem=f(b);this.options=f.extend({},f.fn.owlCarousel.options,this.$elem.data(),a);this.userOptions=a;this.loadContent()},loadContent:function(){function a(a){var d,e="";if("function"===typeof b.options.jsonSuccess)b.options.jsonSuccess.apply(this,[a]);else{for(d in a.owl)a.owl.hasOwnProperty(d)&&(e+=a.owl[d].item);b.$elem.html(e)}b.logIn()}var b=this,e;"function"===typeof b.options.beforeInit&&b.options.beforeInit.apply(this,[b.$elem]);"string"===typeof b.options.jsonPath?
+(e=b.options.jsonPath,f.getJSON(e,a)):b.logIn()},logIn:function(){this.$elem.data("owl-originalStyles",this.$elem.attr("style"));this.$elem.data("owl-originalClasses",this.$elem.attr("class"));this.$elem.css({opacity:0});this.orignalItems=this.options.items;this.checkBrowser();this.wrapperWidth=0;this.checkVisible=null;this.setVars()},setVars:function(){if(0===this.$elem.children().length)return!1;this.baseClass();this.eventTypes();this.$userItems=this.$elem.children();this.itemsAmount=this.$userItems.length;
+this.wrapItems();this.$owlItems=this.$elem.find(".owl-item");this.$owlWrapper=this.$elem.find(".owl-wrapper");this.playDirection="next";this.prevItem=0;this.prevArr=[0];this.currentItem=0;this.customEvents();this.onStartup()},onStartup:function(){this.updateItems();this.calculateAll();this.buildControls();this.updateControls();this.response();this.moveEvents();this.stopOnHover();this.owlStatus();!1!==this.options.transitionStyle&&this.transitionTypes(this.options.transitionStyle);!0===this.options.autoPlay&&
+(this.options.autoPlay=5E3);this.play();this.$elem.find(".owl-wrapper").css("display","block");this.$elem.is(":visible")?this.$elem.css("opacity",1):this.watchVisibility();this.onstartup=!1;this.eachMoveUpdate();"function"===typeof this.options.afterInit&&this.options.afterInit.apply(this,[this.$elem])},eachMoveUpdate:function(){!0===this.options.lazyLoad&&this.lazyLoad();!0===this.options.autoHeight&&this.autoHeight();this.onVisibleItems();"function"===typeof this.options.afterAction&&this.options.afterAction.apply(this,
+[this.$elem])},updateVars:function(){"function"===typeof this.options.beforeUpdate&&this.options.beforeUpdate.apply(this,[this.$elem]);this.watchVisibility();this.updateItems();this.calculateAll();this.updatePosition();this.updateControls();this.eachMoveUpdate();"function"===typeof this.options.afterUpdate&&this.options.afterUpdate.apply(this,[this.$elem])},reload:function(){var a=this;g.setTimeout(function(){a.updateVars()},0)},watchVisibility:function(){var a=this;if(!1===a.$elem.is(":visible"))a.$elem.css({opacity:0}),
+g.clearInterval(a.autoPlayInterval),g.clearInterval(a.checkVisible);else return!1;a.checkVisible=g.setInterval(function(){a.$elem.is(":visible")&&(a.reload(),a.$elem.animate({opacity:1},200),g.clearInterval(a.checkVisible))},500)},wrapItems:function(){this.$userItems.wrapAll('<div class="owl-wrapper">').wrap('<div class="owl-item"></div>');this.$elem.find(".owl-wrapper").wrap('<div class="owl-wrapper-outer">');this.wrapperOuter=this.$elem.find(".owl-wrapper-outer");this.$elem.css("display","block")},
+baseClass:function(){var a=this.$elem.hasClass(this.options.baseClass),b=this.$elem.hasClass(this.options.theme);a||this.$elem.addClass(this.options.baseClass);b||this.$elem.addClass(this.options.theme)},updateItems:function(){var a,b;if(!1===this.options.responsive)return!1;if(!0===this.options.singleItem)return this.options.items=this.orignalItems=1,this.options.itemsCustom=!1,this.options.itemsDesktop=!1,this.options.itemsDesktopSmall=!1,this.options.itemsTablet=!1,this.options.itemsTabletSmall=
+!1,this.options.itemsMobile=!1;a=f(this.options.responsiveBaseWidth).width();a>(this.options.itemsDesktop[0]||this.orignalItems)&&(this.options.items=this.orignalItems);if(!1!==this.options.itemsCustom)for(this.options.itemsCustom.sort(function(a,b){return a[0]-b[0]}),b=0;b<this.options.itemsCustom.length;b+=1)this.options.itemsCustom[b][0]<=a&&(this.options.items=this.options.itemsCustom[b][1]);else a<=this.options.itemsDesktop[0]&&!1!==this.options.itemsDesktop&&(this.options.items=this.options.itemsDesktop[1]),
+a<=this.options.itemsDesktopSmall[0]&&!1!==this.options.itemsDesktopSmall&&(this.options.items=this.options.itemsDesktopSmall[1]),a<=this.options.itemsTablet[0]&&!1!==this.options.itemsTablet&&(this.options.items=this.options.itemsTablet[1]),a<=this.options.itemsTabletSmall[0]&&!1!==this.options.itemsTabletSmall&&(this.options.items=this.options.itemsTabletSmall[1]),a<=this.options.itemsMobile[0]&&!1!==this.options.itemsMobile&&(this.options.items=this.options.itemsMobile[1]);this.options.items>this.itemsAmount&&
+!0===this.options.itemsScaleUp&&(this.options.items=this.itemsAmount)},response:function(){var a=this,b,e;if(!0!==a.options.responsive)return!1;e=f(g).width();a.resizer=function(){f(g).width()!==e&&(!1!==a.options.autoPlay&&g.clearInterval(a.autoPlayInterval),g.clearTimeout(b),b=g.setTimeout(function(){e=f(g).width();a.updateVars()},a.options.responsiveRefreshRate))};f(g).resize(a.resizer)},updatePosition:function(){this.jumpTo(this.currentItem);!1!==this.options.autoPlay&&this.checkAp()},appendItemsSizes:function(){var a=
+this,b=0,e=a.itemsAmount-a.options.items;a.$owlItems.each(function(c){var d=f(this);d.css({width:a.itemWidth}).data("owl-item",Number(c));if(0===c%a.options.items||c===e)c>e||(b+=1);d.data("owl-roundPages",b)})},appendWrapperSizes:function(){this.$owlWrapper.css({width:this.$owlItems.length*this.itemWidth*2,left:0});this.appendItemsSizes()},calculateAll:function(){this.calculateWidth();this.appendWrapperSizes();this.loops();this.max()},calculateWidth:function(){this.itemWidth=Math.round(this.$elem.width()/
+this.options.items)},max:function(){var a=-1*(this.itemsAmount*this.itemWidth-this.options.items*this.itemWidth);this.options.items>this.itemsAmount?this.maximumPixels=a=this.maximumItem=0:(this.maximumItem=this.itemsAmount-this.options.items,this.maximumPixels=a);return a},min:function(){return 0},loops:function(){var a=0,b=0,e,c;this.positionsInArray=[0];this.pagesInArray=[];for(e=0;e<this.itemsAmount;e+=1)b+=this.itemWidth,this.positionsInArray.push(-b),!0===this.options.scrollPerPage&&(c=f(this.$owlItems[e]),
+c=c.data("owl-roundPages"),c!==a&&(this.pagesInArray[a]=this.positionsInArray[e],a=c))},buildControls:function(){if(!0===this.options.navigation||!0===this.options.pagination)this.owlControls=f('<div class="owl-controls"/>').toggleClass("clickable",!this.browser.isTouch).appendTo(this.$elem);!0===this.options.pagination&&this.buildPagination();!0===this.options.navigation&&this.buildButtons()},buildButtons:function(){var a=this,b=f('<div class="owl-buttons"/>');a.owlControls.append(b);a.buttonPrev=
+f("<div/>",{"class":"owl-prev",html:a.options.navigationText[0]||""});a.buttonNext=f("<div/>",{"class":"owl-next",html:a.options.navigationText[1]||""});b.append(a.buttonPrev).append(a.buttonNext);b.on("touchstart.owlControls mousedown.owlControls",'div[class^="owl"]',function(a){a.preventDefault()});b.on("touchend.owlControls mouseup.owlControls",'div[class^="owl"]',function(b){b.preventDefault();f(this).hasClass("owl-next")?a.next():a.prev()})},buildPagination:function(){var a=this;a.paginationWrapper=
+f('<div class="owl-pagination"/>');a.owlControls.append(a.paginationWrapper);a.paginationWrapper.on("touchend.owlControls mouseup.owlControls",".owl-page",function(b){b.preventDefault();Number(f(this).data("owl-page"))!==a.currentItem&&a.goTo(Number(f(this).data("owl-page")),!0)})},updatePagination:function(){var a,b,e,c,d,g;if(!1===this.options.pagination)return!1;this.paginationWrapper.html("");a=0;b=this.itemsAmount-this.itemsAmount%this.options.items;for(c=0;c<this.itemsAmount;c+=1)0===c%this.options.items&&
+(a+=1,b===c&&(e=this.itemsAmount-this.options.items),d=f("<div/>",{"class":"owl-page"}),g=f("<span></span>",{text:!0===this.options.paginationNumbers?a:"","class":!0===this.options.paginationNumbers?"owl-numbers":""}),d.append(g),d.data("owl-page",b===c?e:c),d.data("owl-roundPages",a),this.paginationWrapper.append(d));this.checkPagination()},checkPagination:function(){var a=this;if(!1===a.options.pagination)return!1;a.paginationWrapper.find(".owl-page").each(function(){f(this).data("owl-roundPages")===
+f(a.$owlItems[a.currentItem]).data("owl-roundPages")&&(a.paginationWrapper.find(".owl-page").removeClass("active"),f(this).addClass("active"))})},checkNavigation:function(){if(!1===this.options.navigation)return!1;!1===this.options.rewindNav&&(0===this.currentItem&&0===this.maximumItem?(this.buttonPrev.addClass("disabled"),this.buttonNext.addClass("disabled")):0===this.currentItem&&0!==this.maximumItem?(this.buttonPrev.addClass("disabled"),this.buttonNext.removeClass("disabled")):this.currentItem===
+this.maximumItem?(this.buttonPrev.removeClass("disabled"),this.buttonNext.addClass("disabled")):0!==this.currentItem&&this.currentItem!==this.maximumItem&&(this.buttonPrev.removeClass("disabled"),this.buttonNext.removeClass("disabled")))},updateControls:function(){this.updatePagination();this.checkNavigation();this.owlControls&&(this.options.items>=this.itemsAmount?this.owlControls.hide():this.owlControls.show())},destroyControls:function(){this.owlControls&&this.owlControls.remove()},next:function(a){if(this.isTransition)return!1;
+this.currentItem+=!0===this.options.scrollPerPage?this.options.items:1;if(this.currentItem>this.maximumItem+(!0===this.options.scrollPerPage?this.options.items-1:0))if(!0===this.options.rewindNav)this.currentItem=0,a="rewind";else return this.currentItem=this.maximumItem,!1;this.goTo(this.currentItem,a)},prev:function(a){if(this.isTransition)return!1;this.currentItem=!0===this.options.scrollPerPage&&0<this.currentItem&&this.currentItem<this.options.items?0:this.currentItem-(!0===this.options.scrollPerPage?
+this.options.items:1);if(0>this.currentItem)if(!0===this.options.rewindNav)this.currentItem=this.maximumItem,a="rewind";else return this.currentItem=0,!1;this.goTo(this.currentItem,a)},goTo:function(a,b,e){var c=this;if(c.isTransition)return!1;"function"===typeof c.options.beforeMove&&c.options.beforeMove.apply(this,[c.$elem]);a>=c.maximumItem?a=c.maximumItem:0>=a&&(a=0);c.currentItem=c.owl.currentItem=a;if(!1!==c.options.transitionStyle&&"drag"!==e&&1===c.options.items&&!0===c.browser.support3d)return c.swapSpeed(0),
+!0===c.browser.support3d?c.transition3d(c.positionsInArray[a]):c.css2slide(c.positionsInArray[a],1),c.afterGo(),c.singleItemTransition(),!1;a=c.positionsInArray[a];!0===c.browser.support3d?(c.isCss3Finish=!1,!0===b?(c.swapSpeed("paginationSpeed"),g.setTimeout(function(){c.isCss3Finish=!0},c.options.paginationSpeed)):"rewind"===b?(c.swapSpeed(c.options.rewindSpeed),g.setTimeout(function(){c.isCss3Finish=!0},c.options.rewindSpeed)):(c.swapSpeed("slideSpeed"),g.setTimeout(function(){c.isCss3Finish=!0},
+c.options.slideSpeed)),c.transition3d(a)):!0===b?c.css2slide(a,c.options.paginationSpeed):"rewind"===b?c.css2slide(a,c.options.rewindSpeed):c.css2slide(a,c.options.slideSpeed);c.afterGo()},jumpTo:function(a){"function"===typeof this.options.beforeMove&&this.options.beforeMove.apply(this,[this.$elem]);a>=this.maximumItem||-1===a?a=this.maximumItem:0>=a&&(a=0);this.swapSpeed(0);!0===this.browser.support3d?this.transition3d(this.positionsInArray[a]):this.css2slide(this.positionsInArray[a],1);this.currentItem=
+this.owl.currentItem=a;this.afterGo()},afterGo:function(){this.prevArr.push(this.currentItem);this.prevItem=this.owl.prevItem=this.prevArr[this.prevArr.length-2];this.prevArr.shift(0);this.prevItem!==this.currentItem&&(this.checkPagination(),this.checkNavigation(),this.eachMoveUpdate(),!1!==this.options.autoPlay&&this.checkAp());"function"===typeof this.options.afterMove&&this.prevItem!==this.currentItem&&this.options.afterMove.apply(this,[this.$elem])},stop:function(){this.apStatus="stop";g.clearInterval(this.autoPlayInterval)},
+checkAp:function(){"stop"!==this.apStatus&&this.play()},play:function(){var a=this;a.apStatus="play";if(!1===a.options.autoPlay)return!1;g.clearInterval(a.autoPlayInterval);a.autoPlayInterval=g.setInterval(function(){a.next(!0)},a.options.autoPlay)},swapSpeed:function(a){"slideSpeed"===a?this.$owlWrapper.css(this.addCssSpeed(this.options.slideSpeed)):"paginationSpeed"===a?this.$owlWrapper.css(this.addCssSpeed(this.options.paginationSpeed)):"string"!==typeof a&&this.$owlWrapper.css(this.addCssSpeed(a))},
+addCssSpeed:function(a){return{"-webkit-transition":"all "+a+"ms ease","-moz-transition":"all "+a+"ms ease","-o-transition":"all "+a+"ms ease",transition:"all "+a+"ms ease"}},removeTransition:function(){return{"-webkit-transition":"","-moz-transition":"","-o-transition":"",transition:""}},doTranslate:function(a){return{"-webkit-transform":"translate3d("+a+"px, 0px, 0px)","-moz-transform":"translate3d("+a+"px, 0px, 0px)","-o-transform":"translate3d("+a+"px, 0px, 0px)","-ms-transform":"translate3d("+
+a+"px, 0px, 0px)",transform:"translate3d("+a+"px, 0px,0px)"}},transition3d:function(a){this.$owlWrapper.css(this.doTranslate(a))},css2move:function(a){this.$owlWrapper.css({left:a})},css2slide:function(a,b){var e=this;e.isCssFinish=!1;e.$owlWrapper.stop(!0,!0).animate({left:a},{duration:b||e.options.slideSpeed,complete:function(){e.isCssFinish=!0}})},checkBrowser:function(){var a=k.createElement("div");a.style.cssText=" -moz-transform:translate3d(0px, 0px, 0px); -ms-transform:translate3d(0px, 0px, 0px); -o-transform:translate3d(0px, 0px, 0px); -webkit-transform:translate3d(0px, 0px, 0px); transform:translate3d(0px, 0px, 0px)";
+a=a.style.cssText.match(/translate3d\(0px, 0px, 0px\)/g);this.browser={support3d:null!==a&&1===a.length,isTouch:"ontouchstart"in g||g.navigator.msMaxTouchPoints}},moveEvents:function(){if(!1!==this.options.mouseDrag||!1!==this.options.touchDrag)this.gestures(),this.disabledEvents()},eventTypes:function(){var a=["s","e","x"];this.ev_types={};!0===this.options.mouseDrag&&!0===this.options.touchDrag?a=["touchstart.owl mousedown.owl","touchmove.owl mousemove.owl","touchend.owl touchcancel.owl mouseup.owl"]:
+!1===this.options.mouseDrag&&!0===this.options.touchDrag?a=["touchstart.owl","touchmove.owl","touchend.owl touchcancel.owl"]:!0===this.options.mouseDrag&&!1===this.options.touchDrag&&(a=["mousedown.owl","mousemove.owl","mouseup.owl"]);this.ev_types.start=a[0];this.ev_types.move=a[1];this.ev_types.end=a[2]},disabledEvents:function(){this.$elem.on("dragstart.owl",function(a){a.preventDefault()});this.$elem.on("mousedown.disableTextSelect",function(a){return f(a.target).is("input, textarea, select, option")})},
+gestures:function(){function a(a){if(void 0!==a.touches)return{x:a.touches[0].pageX,y:a.touches[0].pageY};if(void 0===a.touches){if(void 0!==a.pageX)return{x:a.pageX,y:a.pageY};if(void 0===a.pageX)return{x:a.clientX,y:a.clientY}}}function b(a){"on"===a?(f(k).on(d.ev_types.move,e),f(k).on(d.ev_types.end,c)):"off"===a&&(f(k).off(d.ev_types.move),f(k).off(d.ev_types.end))}function e(b){b=b.originalEvent||b||g.event;d.newPosX=a(b).x-h.offsetX;d.newPosY=a(b).y-h.offsetY;d.newRelativeX=d.newPosX-h.relativePos;
+"function"===typeof d.options.startDragging&&!0!==h.dragging&&0!==d.newRelativeX&&(h.dragging=!0,d.options.startDragging.apply(d,[d.$elem]));(8<d.newRelativeX||-8>d.newRelativeX)&&!0===d.browser.isTouch&&(void 0!==b.preventDefault?b.preventDefault():b.returnValue=!1,h.sliding=!0);(10<d.newPosY||-10>d.newPosY)&&!1===h.sliding&&f(k).off("touchmove.owl");d.newPosX=Math.max(Math.min(d.newPosX,d.newRelativeX/5),d.maximumPixels+d.newRelativeX/5);!0===d.browser.support3d?d.transition3d(d.newPosX):d.css2move(d.newPosX)}
+function c(a){a=a.originalEvent||a||g.event;var c;a.target=a.target||a.srcElement;h.dragging=!1;!0!==d.browser.isTouch&&d.$owlWrapper.removeClass("grabbing");d.dragDirection=0>d.newRelativeX?d.owl.dragDirection="left":d.owl.dragDirection="right";0!==d.newRelativeX&&(c=d.getNewPosition(),d.goTo(c,!1,"drag"),h.targetElement===a.target&&!0!==d.browser.isTouch&&(f(a.target).on("click.disable",function(a){a.stopImmediatePropagation();a.stopPropagation();a.preventDefault();f(a.target).off("click.disable")}),
+a=f._data(a.target,"events").click,c=a.pop(),a.splice(0,0,c)));b("off")}var d=this,h={offsetX:0,offsetY:0,baseElWidth:0,relativePos:0,position:null,minSwipe:null,maxSwipe:null,sliding:null,dargging:null,targetElement:null};d.isCssFinish=!0;d.$elem.on(d.ev_types.start,".owl-wrapper",function(c){c=c.originalEvent||c||g.event;var e;if(3===c.which)return!1;if(!(d.itemsAmount<=d.options.items)){if(!1===d.isCssFinish&&!d.options.dragBeforeAnimFinish||!1===d.isCss3Finish&&!d.options.dragBeforeAnimFinish)return!1;
+!1!==d.options.autoPlay&&g.clearInterval(d.autoPlayInterval);!0===d.browser.isTouch||d.$owlWrapper.hasClass("grabbing")||d.$owlWrapper.addClass("grabbing");d.newPosX=0;d.newRelativeX=0;f(this).css(d.removeTransition());e=f(this).position();h.relativePos=e.left;h.offsetX=a(c).x-e.left;h.offsetY=a(c).y-e.top;b("on");h.sliding=!1;h.targetElement=c.target||c.srcElement}})},getNewPosition:function(){var a=this.closestItem();a>this.maximumItem?a=this.currentItem=this.maximumItem:0<=this.newPosX&&(this.currentItem=
+a=0);return a},closestItem:function(){var a=this,b=!0===a.options.scrollPerPage?a.pagesInArray:a.positionsInArray,e=a.newPosX,c=null;f.each(b,function(d,g){e-a.itemWidth/20>b[d+1]&&e-a.itemWidth/20<g&&"left"===a.moveDirection()?(c=g,a.currentItem=!0===a.options.scrollPerPage?f.inArray(c,a.positionsInArray):d):e+a.itemWidth/20<g&&e+a.itemWidth/20>(b[d+1]||b[d]-a.itemWidth)&&"right"===a.moveDirection()&&(!0===a.options.scrollPerPage?(c=b[d+1]||b[b.length-1],a.currentItem=f.inArray(c,a.positionsInArray)):
+(c=b[d+1],a.currentItem=d+1))});return a.currentItem},moveDirection:function(){var a;0>this.newRelativeX?(a="right",this.playDirection="next"):(a="left",this.playDirection="prev");return a},customEvents:function(){var a=this;a.$elem.on("owl.next",function(){a.next()});a.$elem.on("owl.prev",function(){a.prev()});a.$elem.on("owl.play",function(b,e){a.options.autoPlay=e;a.play();a.hoverStatus="play"});a.$elem.on("owl.stop",function(){a.stop();a.hoverStatus="stop"});a.$elem.on("owl.goTo",function(b,e){a.goTo(e)});
+a.$elem.on("owl.jumpTo",function(b,e){a.jumpTo(e)})},stopOnHover:function(){var a=this;!0===a.options.stopOnHover&&!0!==a.browser.isTouch&&!1!==a.options.autoPlay&&(a.$elem.on("mouseover",function(){a.stop()}),a.$elem.on("mouseout",function(){"stop"!==a.hoverStatus&&a.play()}))},lazyLoad:function(){var a,b,e,c,d;if(!1===this.options.lazyLoad)return!1;for(a=0;a<this.itemsAmount;a+=1)b=f(this.$owlItems[a]),"loaded"!==b.data("owl-loaded")&&(e=b.data("owl-item"),c=b.find(".lazyOwl"),"string"!==typeof c.data("src")?
+b.data("owl-loaded","loaded"):(void 0===b.data("owl-loaded")&&(c.hide(),b.addClass("loading").data("owl-loaded","checked")),(d=!0===this.options.lazyFollow?e>=this.currentItem:!0)&&e<this.currentItem+this.options.items&&c.length&&this.lazyPreload(b,c)))},lazyPreload:function(a,b){function e(){a.data("owl-loaded","loaded").removeClass("loading");b.removeAttr("data-src");"fade"===d.options.lazyEffect?b.fadeIn(400):b.show();"function"===typeof d.options.afterLazyLoad&&d.options.afterLazyLoad.apply(this,
+[d.$elem])}function c(){f+=1;d.completeImg(b.get(0))||!0===k?e():100>=f?g.setTimeout(c,100):e()}var d=this,f=0,k;"DIV"===b.prop("tagName")?(b.css("background-image","url("+b.data("src")+")"),k=!0):b[0].src=b.data("src");c()},autoHeight:function(){function a(){var a=f(e.$owlItems[e.currentItem]).height();e.wrapperOuter.css("height",a+"px");e.wrapperOuter.hasClass("autoHeight")||g.setTimeout(function(){e.wrapperOuter.addClass("autoHeight")},0)}function b(){d+=1;e.completeImg(c.get(0))?a():100>=d?g.setTimeout(b,
+100):e.wrapperOuter.css("height","")}var e=this,c=f(e.$owlItems[e.currentItem]).find("img"),d;void 0!==c.get(0)?(d=0,b()):a()},completeImg:function(a){return!a.complete||"undefined"!==typeof a.naturalWidth&&0===a.naturalWidth?!1:!0},onVisibleItems:function(){var a;!0===this.options.addClassActive&&this.$owlItems.removeClass("active");this.visibleItems=[];for(a=this.currentItem;a<this.currentItem+this.options.items;a+=1)this.visibleItems.push(a),!0===this.options.addClassActive&&f(this.$owlItems[a]).addClass("active");
+this.owl.visibleItems=this.visibleItems},transitionTypes:function(a){this.outClass="owl-"+a+"-out";this.inClass="owl-"+a+"-in"},singleItemTransition:function(){var a=this,b=a.outClass,e=a.inClass,c=a.$owlItems.eq(a.currentItem),d=a.$owlItems.eq(a.prevItem),f=Math.abs(a.positionsInArray[a.currentItem])+a.positionsInArray[a.prevItem],g=Math.abs(a.positionsInArray[a.currentItem])+a.itemWidth/2;a.isTransition=!0;a.$owlWrapper.addClass("owl-origin").css({"-webkit-transform-origin":g+"px","-moz-perspective-origin":g+
+"px","perspective-origin":g+"px"});d.css({position:"relative",left:f+"px"}).addClass(b).on("webkitAnimationEnd oAnimationEnd MSAnimationEnd animationend",function(){a.endPrev=!0;d.off("webkitAnimationEnd oAnimationEnd MSAnimationEnd animationend");a.clearTransStyle(d,b)});c.addClass(e).on("webkitAnimationEnd oAnimationEnd MSAnimationEnd animationend",function(){a.endCurrent=!0;c.off("webkitAnimationEnd oAnimationEnd MSAnimationEnd animationend");a.clearTransStyle(c,e)})},clearTransStyle:function(a,
+b){a.css({position:"",left:""}).removeClass(b);this.endPrev&&this.endCurrent&&(this.$owlWrapper.removeClass("owl-origin"),this.isTransition=this.endCurrent=this.endPrev=!1)},owlStatus:function(){this.owl={userOptions:this.userOptions,baseElement:this.$elem,userItems:this.$userItems,owlItems:this.$owlItems,currentItem:this.currentItem,prevItem:this.prevItem,visibleItems:this.visibleItems,isTouch:this.browser.isTouch,browser:this.browser,dragDirection:this.dragDirection}},clearEvents:function(){this.$elem.off(".owl owl mousedown.disableTextSelect");
+f(k).off(".owl owl");f(g).off("resize",this.resizer)},unWrap:function(){0!==this.$elem.children().length&&(this.$owlWrapper.unwrap(),this.$userItems.unwrap().unwrap(),this.owlControls&&this.owlControls.remove());this.clearEvents();this.$elem.attr("style",this.$elem.data("owl-originalStyles")||"").attr("class",this.$elem.data("owl-originalClasses"))},destroy:function(){this.stop();g.clearInterval(this.checkVisible);this.unWrap();this.$elem.removeData()},reinit:function(a){a=f.extend({},this.userOptions,
+a);this.unWrap();this.init(a,this.$elem)},addItem:function(a,b){var e;if(!a)return!1;if(0===this.$elem.children().length)return this.$elem.append(a),this.setVars(),!1;this.unWrap();e=void 0===b||-1===b?-1:b;e>=this.$userItems.length||-1===e?this.$userItems.eq(-1).after(a):this.$userItems.eq(e).before(a);this.setVars()},removeItem:function(a){if(0===this.$elem.children().length)return!1;a=void 0===a||-1===a?-1:a;this.unWrap();this.$userItems.eq(a).remove();this.setVars()}};f.fn.owlCarousel=function(a){return this.each(function(){if(!0===
+f(this).data("owl-init"))return!1;f(this).data("owl-init",!0);var b=Object.create(l);b.init(a,this);f.data(this,"owlCarousel",b)})};f.fn.owlCarousel.options={items:5,itemsCustom:!1,itemsDesktop:[1199,4],itemsDesktopSmall:[979,3],itemsTablet:[768,2],itemsTabletSmall:!1,itemsMobile:[479,1],singleItem:!1,itemsScaleUp:!1,slideSpeed:200,paginationSpeed:800,rewindSpeed:1E3,autoPlay:!1,stopOnHover:!1,navigation:!1,navigationText:["prev","next"],rewindNav:!0,scrollPerPage:!1,pagination:!0,paginationNumbers:!1,
+responsive:!0,responsiveRefreshRate:200,responsiveBaseWidth:g,baseClass:"owl-carousel",theme:"owl-theme",lazyLoad:!1,lazyFollow:!0,lazyEffect:"fade",autoHeight:!1,jsonPath:!1,jsonSuccess:!1,dragBeforeAnimFinish:!0,mouseDrag:!0,touchDrag:!0,addClassActive:!1,transitionStyle:!1,beforeUpdate:!1,afterUpdate:!1,beforeInit:!1,afterInit:!1,beforeMove:!1,afterMove:!1,afterAction:!1,startDragging:!1,afterLazyLoad:!1}})(jQuery,window,document); \ No newline at end of file
diff --git a/docs/atom.xml b/docs/atom.xml
new file mode 100644
index 000000000..789cc5bb4
--- /dev/null
+++ b/docs/atom.xml
@@ -0,0 +1,26 @@
+---
+layout: null
+---
+<?xml version="1.0" encoding="utf-8"?>
+<feed xmlns="http://www.w3.org/2005/Atom">
+
+ <title>FixMyStreet Platform</title>
+ <link href="https://fixmystreet.org/atom.xml" rel="self"/>
+ <link href="https://fixmystreet.org/"/>
+ <updated>{{ site.time | date_to_xmlschema }}</updated>
+ <id>https://fixmystreet.org/</id>
+ <author>
+ <name>mySociety</name>
+ </author>
+
+ {% for post in site.posts %}
+ <entry>
+ <title>{{ post.title }}</title>
+ <link href="https://fixmystreet.org{{ post.url }}"/>
+ <updated>{{ post.date | date_to_xmlschema }}</updated>
+ <id>https://fixmystreet.org{{ post.id }}</id>
+ <content type="html">{{ post.content | xml_escape }}</content>
+ </entry>
+ {% endfor %}
+
+</feed>
diff --git a/docs/blog/index.html b/docs/blog/index.html
new file mode 100644
index 000000000..d84b7f5ab
--- /dev/null
+++ b/docs/blog/index.html
@@ -0,0 +1,41 @@
+---
+layout: page
+title: Blog
+---
+
+<h1>Blog</h1>
+
+<ul class="list-of-blog-posts">
+{% for post in paginator.posts %}
+ <li class="listed-blog-post">
+ <h2 class="blog-title"><a href="{{ post.url }}">{{ post.title }}</a> <small class="meta meta--date">{{ post.date | date: "%-d %B %Y" }}</small></h2>
+ {{ post.content }}
+ </li>
+{% endfor %}
+</ul>
+
+{% if paginator.total_pages > 1 %}
+<div class="pagination">
+ {% if paginator.previous_page %}
+ <a href="{{ paginator.previous_page_path | prepend: site.baseurl | replace: '//', '/' }}">&laquo; Prev</a>
+ {% else %}
+ <span>&laquo; Prev</span>
+ {% endif %}
+ &middot;
+ {% for page in (1..paginator.total_pages) %}
+ {% if page == paginator.page %}
+ {{ page }}
+ {% elsif page == 1 %}
+ <a href="{{ paginator.previous_page_path | prepend: site.baseurl | replace: '//', '/' }}">{{ page }}</a>
+ {% else %}
+ <a href="{{ site.paginate_path | prepend: site.baseurl | replace: '//', '/' | replace: ':num', page }}">{{ page }}</a>
+ {% endif %}
+ {% endfor %}
+ &middot;
+ {% if paginator.next_page %}
+ <a href="{{ paginator.next_page_path | prepend: site.baseurl | replace: '//', '/' }}">Next &raquo;</a>
+ {% else %}
+ <span>Next &raquo;</span>
+ {% endif %}
+</div>
+{% endif %}
diff --git a/docs/community/index.md b/docs/community/index.md
new file mode 100644
index 000000000..485d821bb
--- /dev/null
+++ b/docs/community/index.md
@@ -0,0 +1,60 @@
+---
+layout: page
+title: Community
+---
+
+# Community
+
+<p class="lead">If you are thinking of using the FixMyStreet Platform, please
+let our growing community help.</p>
+
+<div class="contact-options">
+<div class="column">
+<h3>Mailing list</h3>
+
+<p>The <a href="https://groups.google.com/a/mysociety.org/forum/#!forum/fixmystreet">FixMyStreet
+mailing list</a> is where people discuss implementing FixMyStreet Platform in
+their own jurisdictions and areas, and seek help with any issues they are
+facing.</p>
+
+</div>
+<div class="column">
+<h3>GitHub</h3>
+
+<p>FixMyStreet is open source under the Affero GPL licence. The code is hosted
+on <a href="https://github.com/mysociety/fixmystreet">GitHub</a> and is just a
+fork away. GitHub is also where you can file and discuss issues and feature
+requests, though please feel free to post a question to the mailing list
+first.</p>
+
+</div>
+</div>
+
+<div class="contact-options">
+<div class="column">
+<h3>IRC</h3>
+
+<p>If you would like to discuss things in a chat room, the <a
+href="irc://irc.freenode.net/fixmystreet">#fixmystreet</a> channel on
+irc.freenode.net allows for just that (<a
+href="irc/">web IRC interface</a>).</p>
+
+</div>
+<div class="column">
+<h3>Twitter</h3>
+
+<p>You can follow and tweet <a href="https://twitter.com/fixmystreet">@fixmystreet</a>.</p>
+</div>
+</div>
+
+<div class="contact-options">
+<div class="column">
+<h3>Email</h3>
+<p>
+If you're trying to set a FixMyStreet project up outside the UK, let mySociety's
+<a href="https://www.mysociety.org/about/mysociety-around-the-world/">international team</a>
+know by emailing
+<a href="mailto:international&#64;mysociety.org">international&#64;mysociety.org</a>.</p>
+</div>
+</div>
+
diff --git a/docs/community/irc.md b/docs/community/irc.md
new file mode 100644
index 000000000..dee0b6b2b
--- /dev/null
+++ b/docs/community/irc.md
@@ -0,0 +1,37 @@
+---
+layout: page
+title: IRC
+---
+
+# FixMyStreet chat
+
+<script>
+// clock added so folk know what time it is in Blighty
+// Anytime Anywhere Web Page Clock Generator
+// Clock Script Generated at
+// http://rainbow.arch.scriptmania.com/tools/clock/clock_generator.html
+
+function tS(){ x=new Date(tN().getUTCFullYear(),tN().getUTCMonth(),tN().getUTCDate(),tN().getUTCHours(),tN().getUTCMinutes(),tN().getUTCSeconds()); x.setTime(x.getTime()+dS()+0); return x; }
+function tN(){ return new Date(); }
+function dS(){ return ((tN().getTime()>fD(0,2,2,-1).getTime())&&(tN().getTime()<fD(0,9,3,-1).getTime()))?3600000:0; }
+function fD(d,m,h,p){ var week=(p<0)?7*(p+1):7*(p-1),nm=(p<0)?m+1:m,x=new Date(tN().getUTCFullYear(),nm,1,h,0,0),dOff=0; if(p<0){ x.setTime(x.getTime()-86400000); } if(x.getDay()!=d){ dOff=(x.getDay()<d)?(d-x.getDay()):0-(x.getDay()-d); if(p<0&&dOff>0){ week-=7; } if(p>0&&dOff<0){ week+=7; } x.setTime(x.getTime()+((dOff+week)*86400000)); } return x; }
+function lZ(x){ return (x>9)?x:'0'+x; }
+function dE(x){ if(x==1||x==21||x==31){ return 'st'; } if(x==2||x==22){ return 'nd'; } if(x==3||x==23){ return 'rd'; } return 'th'; }
+function dT(){ if(fr==0){ fr=1; document.write('<span id="tP">'+eval(oT)+'</span>'); } document.getElementById('tP').innerHTML=eval(oT); setTimeout('dT()',1000); }
+function y4(x){ return (x<500)?x+1900:x; }
+var dN=new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'),mN=new Array('January','February','March','April','May','June','July','August','September','October','November','December'),fr=0,oT="dN[tS().getDay()]+' '+tS().getDate()+dE(tS().getDate())+' '+mN[tS().getMonth()]+' '+y4(tS().getYear())+' '+':'+':'+' '+lZ(tS().getHours())+':'+lZ(tS().getMinutes())";
+</script>
+
+To connect to our <acronym title="Internet Relay Chat">IRC</acronym> channel
+(chat room), either choose a nickname below, provided by Mibbit, or if you know
+about IRC and have a client already, connect to irc.freenode.net and enter the
+#fixmystreet channel.
+
+<p>mySociety is mainly based in the UK, so you may find the
+IRC channel ('chatroom') quiet sometimes.
+The time in the UK now is
+<script>dT();</script></p>
+
+<iframe width="600" height="480" scrolling="no" frameborder="0"
+ src="https://webchat.freenode.net/?channels=%23fixmystreet&randomnick=1">
+ </iframe>
diff --git a/docs/customising/boundaries.md b/docs/customising/boundaries.md
new file mode 100644
index 000000000..d48a472aa
--- /dev/null
+++ b/docs/customising/boundaries.md
@@ -0,0 +1,459 @@
+---
+layout: page
+title: Admin boundaries
+---
+
+# Admin boundaries and FixMyStreet
+
+<p class="lead">
+ When you set up FixMyStreet, you usually need to provide <strong>admin boundaries</strong>
+ for each of the
+ <a href="{{ "/glossary/#body" | relative_url }}" class="glossary__link">bodies</a>
+ you'll be sending reports to. If you're lucky, the boundaries might already
+ be available. If not, you'll have to make them. This page explains your
+ options.
+</p>
+
+## Why FixMyStreet needs boundaries
+
+When someone sticks a pin in the map to report a problem, FixMyStreet uses
+boundaries to answer the question: _who is responsible for fixing problems
+**here**_?
+
+This also means that boundaries can be used to determine if the pin has
+been put somewhere that is *not* covered by any bodies.
+
+<div class="attention-box">
+ We've written a separate page about
+ <a href="{{ "/customising/fms_and_mapit/" | relative_url }}">how FixMyStreet uses MapIt</a>,
+ which is the service that determines which area any point (pin) is within. It's
+ helpful to understand how that works &mdash; because it also explains how
+ FixMyStreet determines which categories of problem can be reported at any
+ location &mdash; but the rest of this page is about making and using the boundaries that
+ FixMyStreet needs.
+</div>
+
+FixMyStreet finds all the bodies that are associated with the area (or areas)
+that the pin is inside -- those are the bodies to whom the report might be sent.
+Which of these bodies is actually chosen depends on the
+<a href="{{ "/glossary/#category" | relative_url }}" class="glossary__link">category</a>
+the user selects when they complete their problem report.
+
+## Boundaries are independent of your maps!
+
+**Boundaries are not really anything to do with maps** &mdash; they exist
+independently of the maps you're using (although, of course, both are about
+geography). FixMyStreet shows the map *before* the user clicks on it to place
+the pin. It doesn't check the boundaries until *after* the pin has been placed.
+
+## Every body must be associated with an area
+
+So if you're setting up FixMyStreet to run in your region, you *must* provide
+these boundaries to FixMyStreet. Once you've done this, you can associate the
+bodies you'll be sending reports to with these areas. This is easy to do in
+the FixMyStreet admin: you simply choose the area (or areas) from a drop-down
+list when you create or edit the body.
+
+## Where to get your boundary data from
+
+If the bodies you are going to be sending reports to are local government
+departments, it's possible that this data already exists. We use the admin
+boundary data from
+<a href="{{ "/glossary/#osm" | relative_url }}" class="glossary__link">OpenStreetMap</a>,
+and many countries' data is already available. If that's the case for you, then
+this is going to be easy! You just have to identify the areas you need, and
+tell FixMyStreet to ignore all the others.
+
+But if the boundaries you need are not already in Open Street Map -- maybe
+nobody has ever put them in, or maybe your government doesn't publish such data
+for people to use, or perhaps the areas your bodies use are not admin
+boundaries anyway -- you'll have to create your own.
+
+## The geometry of boundaries
+
+Areas often don't overlap -- because it's common for local government to
+arrange its jurisdiction so that each has its own area to cover.
+
+But actually the MapIt service is very flexible, and you can have areas that
+overlap, or be entirely separate and never touch, or even contain all or part
+of one another. This is because all FixMyStreet really cares about is asking
+MapIt "which areas is this pin in?" MapIt may reply with none, one, or many
+areas, depending on how your boundaries are arranged.
+
+Note that more than one body can cover the same area (actually it’s quite
+common). For example, two national bodies (the Highways Department and the
+Water Department) might both have the same national boundary data.
+
+Also, it's possible to associate a body in FixMyStreet with more than
+one area from MapIt. For example, a single port authority could be associated
+with the ports on three different islands.
+
+
+## Types of boundaries
+
+The type of boundary data you need depends on a number of factors, but will
+probably be one of these:
+
+ * ["Everywhere"](#everywhere) -- you can run FixMyStreet without a specific boundary
+ * [Simple approximate area](#approx-area) -- that is, just one area around the place you need
+ * [Simple approximate areas](#approx-areas) -- as above, but for multiple areas
+ * [Accurate OpenStreetMap data](#mysociety-mapit) -- the preferred option
+ * [Accurate data that isn't on OSM](#accurate) -- if you have your own boundary data, for example
+
+If you're not sure which is for you, read through the sections below.
+
+<!-- TODO add diagrams! Did some Isle of Wight ones but I don't like 'em -->
+
+<a name="everywhere"> </a>
+
+## "Everywhere"
+
+This is the simplest boundary: it's infinte, so anywhere the user clicks is
+inside the area called "everywhere".
+
+Use this type of boundary if:
+
+ * the bodies you're sending reports to don't depend on the whereabouts of the problem
+ * or all the problem reports are always sent to the same, single body
+ * you don't mind that FixMyStreet will never reject any problem report because it's too far away
+
+The advantage of using the boundary "Everywhere" is that it's very easy to set
+up. The disadvantage is that your FixMyStreet will accept clicks *anywhere* on
+the map. This may be acceptable if you are limiting your
+<a href="{{ "/glossary/#geocoder" | relative_url }}" class="glosssary">geocoder</a>
+to a very specific area.
+
+<dl class="reveal-on-click" data-reveal-noun="details">
+ <dt>
+ <h3>How to set this up</h3>
+ </dt>
+ <dd>
+ <p>
+ This is the default setup of a new FixMyStreet installation (if you used the
+ <a href="{{ "/install/install-script" | relative_url }}">installation script</a> or the
+ <a href="{{ "/install/ami" | relative_url }}">AMI install</a>).
+ </p>
+ <p>
+ Set
+ <code><a href="{{ "/customising/config/#mapit_url" | relative_url }}">MAPIT_URL</a></code>
+ to be blank, and set
+ <code><a href="{{ "/customising/config/#mapit_types" | relative_url }}">MAPIT_TYPES</a></code>
+ to the special value <code>ZZZ</code>. FixMyStreet will use a fake MapIt that always
+ returns "Everywhere" as the only area that contains the point &mdash; for any
+ location.
+ </p>
+ <p>
+ Your <code>conf/general.yml</code> file should contain this:
+ </p>
+<pre><code>MAPIT_URL: ''
+MAPIT_TYPES: ['ZZZ']
+MAPIT_ID_WHITELIST: [ ]
+</code></pre>
+ </dd>
+</dl>
+
+<a name="approx-area"> </a>
+
+## Simple approximate area
+
+Sometimes you just need a boundary to broadly determine if a pin in the map is
+too far away from the single area you're receiving reports for.
+
+Use this type of boundary if you:
+
+ * don't need an accurate boundary (for example, _"anything roughly near the town centre is OK"_)
+ * do want to prevent problem reports for locations that are not within this area
+
+<dl class="reveal-on-click" data-reveal-noun="details">
+ <dt>
+ <h3>How to set this up</h3>
+ </dt>
+ <dd>
+ <p>
+ You need to install your own MapIt instance, and add the area to that. The
+ MapIt admin interface (which uses the Django framework) lets you click-and-draw
+ a polygon over a map. Alternatively, we run a MapIt server for custom areas
+ like this, so &mdash; especially if you are just doing this as a probationary
+ trial &mdash; we may be able to host this for you (note though that we do
+ rate-limit calls to MapIt). Either send us
+ <a href="{{ "/glossary/#kml" | relative_url }}" class="glossary__link">KML shape files</a>,
+ or if you can't do that, maybe a clear image of the map with the boundary
+ drawn on it for us to copy.
+ </p>
+ <p>
+ In your <code>conf/general.yml</code>, you must set
+ <code><a href="{{ "/customising/config/#mapit_url" | relative_url }}">MAPIT_URL</a></code>
+ to either your MapIt or our custom one, and set
+ <code><a href="{{ "/customising/config/#mapit_types" | relative_url }}">MAPIT_TYPES</a></code>
+ to the areas you want (the actual values will depend on what that particular
+ MapIt is returning). You should also set
+ <code><a href="{{ "/customising/config/#mapit_id_whitelist" | relative_url }}">MAPIT_ID_WHITELIST</a></code>
+ to the ID of the single area you want.
+ </p>
+ <pre><code>MAPIT_URL: 'http://mapit.example.com'
+MAPIT_TYPES: ['CITY']
+MAPIT_ID_WHITELIST: [ 133 ]
+</code></pre>
+ </dd>
+</dl>
+
+<a name="approx-areas"> </a>
+
+## Simple approximate areas
+
+This is the same as the previous example, but shows that you can have multiple
+areas. This works best if they don't need to be very accurate &mdash; that is,
+no colinear borders.
+
+Use this type of boundary if you:
+
+ * don't need an accurate boundary (e.g. anything roughly in an area is OK)
+ * the boundaries don't adjoin, or are very simple (no crinkly edges)
+ * do want to prevent problem reports for locations that are not within these areas
+
+<dl class="reveal-on-click" data-reveal-noun="details">
+ <dt>
+ <h3>How to set this up</h3>
+ </dt>
+ <dd>
+ <p>
+ Same as previous example: either set up your own instance of MapIt, or ask to
+ have your boundaries added to our custom one. If you want us to host it, we'll
+ need <a href="{{ "/glossary/#kml" | relative_url }}" class="glossary__link">KML shape files</a>
+ or a graphic showing the boundary clearly shown so we can copy it.
+ </p>
+ <p>
+ Note that now there may be more than one type of area, and you'll need to explicitly
+ nominate every area you're interested in with
+ <code><a href="{{ "/customising/config/#mapit_id_whitelist" | relative_url }}">MAPIT_ID_WHITELIST</a></code>
+ (unless you want *all* the areas this MapIt returns for the given type, in
+ which case you can set it to be empty).
+ </p>
+ <pre><code>MAPIT_URL: 'http://mapit.example.com'
+MAPIT_TYPES: ['CITY', 'COUNTY']
+MAPIT_ID_WHITELIST: [ 133, 145, 12, 80 ]
+</code></pre>
+ </dd>
+</dl>
+
+<a name="mysociety-mapit"> </a>
+
+## Accurate OpenStreetMap data
+
+It's possible that the admin boundaries of local government in your area are
+already available in the OpenStreetMap project. If this is the case,
+FixMyStreet can automatically use them. **This is the easiest solution if the
+data you need is there** because we already run two servers
+([UK MapIt](https://mapit.mysociety.org) and
+[global MapIt](http://global.mapit.mysociety.org))
+that make this data available.
+
+Use this type of boundary if:
+
+ * the boundary data for the areas you need is already on OpenStreetMap
+
+<dl class="reveal-on-click" data-reveal-noun="details">
+ <dt>
+ <h3>How determine if the boundary data is available</h3>
+ </dt>
+ <dd>
+ <p>
+ Start by finding the <a href="{{ "/glossary/#latlong" | relative_url }}"
+ class="glossary__link">lat-long</a> of some of the places you want to cover,
+ and look them up on <a href="http://global.mapit.mysociety.org">global
+ MapIt</a> (or maybe the <a href="https://mapit.mysociety.org">UK one</a>).
+ If you see the "Areas covering this point" include the admin
+ boundaries you need, you're good to go! For example, here's
+ the <a
+ href="http://global.mapit.mysociety.org/point/4326/10.75,59.95.html">page
+ for Oslo, in Norway</a>.
+ </p>
+ <p>
+ Note that our MapIt servers' data may lag a little behind OSM, so
+ if it's not there, look on the
+ <a href="http://www.openstreetmap.org">OpenStreetMap website</a> just in
+ case it's been added since MapIt's last update. If so, let us
+ know, and we'll pull it in for you.
+ </p>
+ <p>
+ Here's an example of the steps to follow to find the data you need
+ to use global MapIt. This example uses Zurich as an example city.
+ </p>
+ <ol>
+ <li>
+ <p>
+ Go to <a href="http://nominamtim.openstreetmap.org">OpenStreetMap's
+ geocoder</a> and enter the name of the city, e.g., "Zurich,
+ Switzerland".
+ </p>
+ </li>
+ <li>
+ <p>
+ Check that's found the right place (and, if you want, check the map
+ is how you expected). Click on the <strong>details</strong> link just
+ below the name of the top hit. The details page lists lots of data,
+ including the centre point (lat/long values that will look something
+ like <code>-34.9059039,-56.1913569</code>).</p></li> <li><p>Go to <a
+ href="http://global.mapit.mysociety.org">global MapIt</a> and paste
+ those lat/long values into the text input.
+ </p>
+ </li>
+ <li>
+ <p>
+ MapIt will show you all the <a
+ href="http://global.mapit.mysociety.org/point/4326/8.55,47.366667.html">admin boundaries</a>
+ that contain that point. You're interested in
+ the ones that relate to bodies that serve those areas. For example,
+ if a district council fixes the potholes in that district.
+ Specifically, you need the <strong>Administrative Boundary
+ Levels</strong> (which will look like <code>O04</code> or
+ <code>O05</code>), which are the values for your
+ <code><a href="{{ "/customising/config/#mapit_types" | relative_url }}">MAPIT_TYPES</a></code>.
+ Remember this data is boundary data from OpenStreetMap &mdash;
+ if the boundaries you need are not shown, you may have to set up your
+ own (described below). You can also click on any of the boundaries
+ listed on MapIt to see the areas they actually cover on the map.
+ </p>
+ </li>
+ <li>
+ <p>
+ The individual <em>area_id</em>s are also useful, because you put
+ them into the <code><a href="{{ "/customising/config/#mapit_id_whitelist" | relative_url }}">MAPIT_ID_WHITELIST</a></code>.
+ </p>
+ </li>
+ </ol>
+ </dd>
+ <dt>
+ <h3>Using our MapIt servers: some restrictions</h3>
+ </dt>
+ <dd>
+ <p>
+ We run two public MapIt services: <a
+ href="https://mapit.mysociety.org">mapit.mysociety.org</a> covers the UK
+ (because that's where we're based, and it serves our own
+ <a href="www.fixmystreet.com">UK FixMySteet</a> site), and
+ <a href="http://global.mapit.mysociety.org">global.mapit.mysociety.org</a>,
+ which covers the whole world. The data we use for global MapIt is from
+ <a href="http://www.openstreetmap.org">OpenStreetMap</a>, so if someone has
+ put administrative boundary data for your country into OSM, before too
+ long global MapIt will have it too.
+ </p>
+ <p>
+ Please get in touch with us if you are expecting to generate a lot of
+ requests or <strong>if you are using it commercially</strong>. We
+ rate-limit calls to MapIt, so if your site gets really busy, you should
+ set up your own instance (we can help you, and the <a
+ href="https://github.com/mysociety/mapit">code is on GitHub</a>). But when
+ you're setting your site up to begin with, you can usually get it running
+ using one of our MapIt servers.
+ </p>
+ </dd>
+ <dt>
+ <h3>How to set this up</h3>
+ </dt>
+ <dd>
+ <p>
+ In your <code>conf/general.yml</code> file, point
+ <code><a href="{{ "/customising/config/#mapit_url" | relative_url }}">MAPIT_URL</a></code>
+ at the global MapIt server.
+ </p>
+ <p>
+ Find the areas you need by looking on the
+ <a href="http://global.mapit.mysociety.org">global MapIt website</a> or the
+ <a href="https://mapit.mysociety.org">UK one</a>. You must also nominate
+ the types of area these are (effectively the <em>level</em> of admin
+ boundary it is), and the generation. On global, the area types look
+ something like <code>[ 'O05', 'O06' ]</code>. (Note those contain capital
+ letter O followed by digits). To determine what types you need, look for
+ the codes marked &#8220;Administrative Boundary Levels&#8221; that MapIt
+ returns &mdash; for example, here's
+ <a href="http://global.mapit.mysociety.org/point/4326/8.55,47.366667.html">global
+ MapIt's data for Zurich</a>.
+ </p>
+ <p>
+ The UK MapIt types are different. For example, for UK FixMyStreet, we use:
+ </p>
+<pre><code>MAPIT_TYPES: [ 'DIS', 'LBO', 'MTD', 'UTA', 'CTY', 'COI', 'LGD' ]
+</code></pre>
+ <p>
+ which covers all the UK council types (for example, <code>DIS</code> is district council,
+ <code>CTY</code> is county council).
+ </p>
+ <p>
+ Finally, limit your installation to the specific areas you're interested
+ in (otherwise you'll be getting areas from the whole world). Identify the
+ specific areas you want to use, and list them explicitly in
+ <code><a href="{{ "/customising/config/#mapit_id_whitelist" | relative_url }}">MAPIT_ID_WHITELIST</a></code>.
+ You should also set
+ <code><a href="{{ "/customising/config/#mapit_generation" | relative_url }}">MAPIT_GENERATION</a></code>,
+ so that your areas can still be found when we update the global MapIt data.
+ </p>
+<pre><code>MAPIT_URL: 'http://global.mapit.mysociety.org'
+MAPIT_TYPES: ['O06','O07']
+MAPIT_ID_WHITELIST: ['12345','345432','978638']
+MAPIT_GENERATION: 3
+</code></pre>
+
+ </dd>
+
+</dl>
+
+<a name="accurate"> </a>
+
+## Accurate data that isn't on OSM
+
+Use this type of boundary if:
+
+ * you need accurate boundaries because the different bodies that
+ solve problems in your region serve specific areas that are geometrically
+ complex and/or are precisely adjacent
+ * the boundary data for the areas you need are not already on OpenStreetMap
+ * but you do have access to this data from some other source
+
+This means you have to source the data yourself -- either by getting your local
+government to release it, or else drawing it yourself. Then you need to import
+this data into a MapIt server and use that.
+
+<dl class="reveal-on-click" data-reveal-noun="details">
+ <dt>
+ <h3>How to set this up</h3>
+ </dt>
+ <dd>
+ <p>
+ Ideally, if you can source the data from your local government (which
+ means it's definitive), then it's great if you can add it (as
+ admin boundary data) to the OpenStreetMap project. Our global MapIt will
+ subsequently import it and your FixMyStreet can then use it as described
+ in the previous example. If you're going to do that, <strong>the
+ data must be open data</strong> and you should probably ask about it on
+ the <a href="http://lists.openstreetmap.org/listinfo/imports">OSM import
+ list</a> first. Of course, if you do this then anyone else in the world
+ who wants the data will be able to use it too, which is why we encourage
+ this approach.
+ </p>
+ <p>
+ But if you can't do that, or the boundary data you have is not
+ definitive, you can create your own. Use any good GIS software to plot
+ the boundaries accurately, and then export it as
+ <a href="{{ "/glossary/#kml" | relative_url }}" class="glossary__link">KML shape files</a>.
+ MapIt can import these, so you can then either run your own MapIt
+ instance, or ask us to add it to our custom one.
+ </p>
+ </dd>
+</dl>
+
+## Can you see the boundaries?
+
+FixMyStreet doesn't normally display the admin areas and boundaries on the maps
+(mainly because most users really don't care &mdash; they just want to report
+a problem). But it *is* possible, with some customisation, to change this
+behaviour.
+
+If you just want to see a boundary drawn on a map to check that it's covering
+the area you want, you can see this by going to the MapIt server it's on, and
+looking at that area's HTML page. For example, see the [boundary for
+Norway](http://global.mapit.mysociety.org/area/363186.html) on the global MapIt
+server.
+
+
+
diff --git a/docs/customising/checklist.md b/docs/customising/checklist.md
new file mode 100644
index 000000000..b066a4279
--- /dev/null
+++ b/docs/customising/checklist.md
@@ -0,0 +1,206 @@
+---
+layout: page
+title: Customising checklist
+---
+
+# Customising checklist
+
+<p class="lead">
+ Every time we help set up a new, custom FixMyStreet site, we follow the same
+ basic process to make sure all the key things get done. We've listed the
+ steps here so you can follow them too.
+</p>
+
+## Checklist: 13 things to do
+
+To create a custom FixMyStreet installation, these are the key things you need
+to do. You don't have to do them *exactly* in this order -- some can be done
+at the same time as others -- but if you're not sure then just work through the list.
+
+
+<dl class="reveal-on-click" data-reveal-noun="steps">
+ <dt>
+ <h3>Pick a name</h3>
+ </dt>
+ <dd>
+ You need a name for your
+ <a href="{{ "/glossary/#cobrand" | relative_url }}" class="glossary__link">cobrand</a>
+ right at the start because that's the name you'll use for the directories
+ where your own resources and templates go.
+ <p>
+ Your name needs to be unique (that is, no other FixMyStreet cobrands are
+ already using it), suitable as a directory name (so no punctuation), and
+ ideally related to the domain name you're going to use for it (although
+ this isn't 100% obligatory).
+ </p>
+ <p>
+ For example, if your project is called FixMyPark, the cobrand name will
+ be <code>fixmypark</code>.
+ </p>
+ </dd>
+ <dt>
+ <h3>Set up the domain name
+</h3>
+ </dt>
+ <dd>
+ If you already own the domain name,
+ you're good to go. But if this is a new project and you don't have the
+ domain set up already, don't leave it too late to register the domain
+ and point it at your server.
+ </dd>
+ <dt>
+ <h3>Translate into language(s) you need</h3>
+ </dt>
+ <dd>
+ If FixMyStreet doesn't already have translations for the language(s) you
+ need, you can start work on that right away &mdash; see
+ <a href="{{ "/customising/language/" | relative_url }}">more about languages</a>.
+ </dd>
+ <dt>
+ <h3>Install the software on the server</h3>
+ </dt>
+ <dd>
+ There are several different ways of doing this &mdash; see
+ <a href="{{ "/install/" | relative_url }}">installation instructions</a>.
+ <p>
+ Even if you're not hosting the site yourself, you might want to install
+ the software in order to see how your customisation looks before putting
+ it live.
+ </p>
+ </dd>
+ <dt>
+ <h3>Secure access to the admin</h3>
+ </dt>
+ <dd>
+ Make sure you're being challenged to provide a username and password when
+ accessing the admin at <code>/admin</code>.
+ <p>
+ Typically this means using creating a superuser. If you've
+ not already done so, run the `bin/createsuperuser` script to create a user
+ that has access to the admin.
+ </p>
+ </dd>
+ <dt>
+ <h3>Change the colour scheme</h3>
+ </dt>
+ <dd>
+ See <a href="{{ "/customising/css/" | relative_url }}">changing colour and CSS</a>
+ for detailed instructions.
+ <p>
+ You can just change the colour variables without needing to touch any other
+ CSS.
+ </p>
+ </dd>
+ <dt>
+ <h3>Change the logo</h3>
+ </dt>
+ <dd>
+ You'll need an understanding of CSS in order to change the logo &mdash;
+ it's optimised in the FixMyStreet design for good perfomance on old or
+ narrow clients, which makes it a little bit more difficult than just
+ dropping in a graphics file.
+ <p>
+ We'll be adding instructions later, but meanwhile see the page
+ <a href="{{ "/customising/css/" | relative_url }}">about changing the CSS</a>.
+ </p>
+ </dd>
+ <dt>
+ <h3>Write your own FAQ</h3>
+ </dt>
+ <dd>
+ You almost certainly need to re-write the FAQ and other information pages
+ to match your project.
+ <p>
+ To do this, copy the template files into your own cobrand's directory and
+ rewrite them. The generic base FAQ can be found at
+ <code>templates/web/base/about/faq-en-gb.html</code>
+ </p>
+ <p>
+ See <a href="{{ "/customising/templates/" | relative_url }}">more about templates</a>.
+ </p>
+ </dd>
+ <dt>
+ <h3>Limit geocoder lookups to your area <!-- NEW --></h3>
+ </dt>
+ <dd>
+ When someone enters a place name, you only want your FixMyStreet to look
+ for it in the place your site covers. This is controlled by the
+ <code><a href="{{ "/customising/config/#geocoding_disambiguation" | relative_url }}">GEOCODING_DISAMBIGUATION</a></code>
+ setting.
+ See <a href="{{ "/customising/geocoder/" | relative_url }}">more about the geocoder</a>.
+ <p>
+ We've listed this separately from the other config settings because it
+ may take a little bit of testing to see what options work best &mdash;
+ this depends on which geocoder you are using.
+ </p>
+ </dd>
+ <dt>
+ <h3>Configure your admin boundaries (MapIt)</h3>
+ </dt>
+ <dd>
+ You need to decide what kind of boundary data you'll be using &mdash; see
+ <a href="{{ "/customising/boundaries/" | relative_url }}">more about boundaries</a>.
+ <p>
+ As part of that work, you'll need to set
+ <code><a href="{{ "/customising/config/#mapit_url" | relative_url }}">MAPIT_URL</a></code>
+ and the other MapIt config settings to match the service you're using.
+ </p>
+ </dd>
+ <dt>
+ <h3>Set non-default config settings</h3>
+ </dt>
+ <dd>
+ Many of the
+ <a href="{{ "/customising/config/" | relative_url }}">configuration settings</a>
+ can be left with their defaults, but some you <em>must</em> change.
+ <p>
+ As well as system settings (for example,
+ <code><a href="{{ "/customising/config/#fms_db_name" | relative_url }}">FMS_DB_NAME</a></code>),
+ every new site needs custom
+ <code><a href="{{ "/customising/config/#email_domain" | relative_url }}">EMAIL_DOMAIN</a></code>
+ and
+ <code><a href="{{ "/customising/config/#example_places" | relative_url }}">EXAMPLE_PLACES</a></code>
+ settings. Make sure the example places you choose really do work if you enter them
+ as the location on the front page.
+ </p>
+ <p>
+ Even though your site might work with other settings left as defaults, you should go
+ through the <em>whole</em> <code>cong/general.yml</code> file to check everything is how
+ you want it.
+ </p>
+ </dd>
+ <dt>
+ <h3>Create the bodies (authorities, councils)</h3>
+ </dt>
+ <dd>
+ Once your site is running log into the admin and
+ <a href="{{ "/running/bodies_and_contacts/" | relative_url }}">add the bodies</a>.
+ <p>
+ You should have set up the
+ <a href="{{ "/customising/boundaries/" | relative_url }}">admin boundaries</a>
+ by this stage, because you need to associate each body with the area it covers.
+ For more information, see
+ <a href="{{ "/customising/fms_and_mapit/" | relative_url }}">how FixMyStreet uses MapIt</a>.
+ </p>
+ </dd>
+ <dt>
+ <h3>Add category names &amp; contact emails</h3>
+ </dt>
+ <dd>
+ Once you've created the bodies to whom reports will be sent, you can add
+ their problem categories (for example, "Potholes", "Streetlights"). At the
+ same time, add the contact email addresses for each one &mdash; see <a
+ href="{{ "/running/bodies_and_contacts/" | relative_url }}">more about
+ contacts and categories</a>.
+ </dd>
+</dl>
+
+
+## Further customisation
+
+Remember that this just covers the key parts of a custom installation. There's
+a lot more you can change &mdash; for example, you can write custom Perl code
+for the <a href="{{ "/customising/cobrand-module/" | relative_url }}">Cobrand
+module</a> if you want to override specific behaviour not covered by config
+variables.
+
diff --git a/docs/customising/cobrand-module.md b/docs/customising/cobrand-module.md
new file mode 100644
index 000000000..fb771ab26
--- /dev/null
+++ b/docs/customising/cobrand-module.md
@@ -0,0 +1,105 @@
+---
+layout: page
+title: Customising with a Cobrand module
+---
+
+# Cobrand module
+
+If you need customistation beyond what templates, configuration variables, and
+translations can offer, then you will have to have a Cobrand module. These are
+automatically loaded according to the current Cobrand and can be found in
+`perllib/FixMyStreet/Cobrand/`. There is a default Cobrand (`Default.pm`)
+which all Cobrands should inherit from. A Cobrand module can then override any
+of the methods from the default Cobrand.
+
+Many of the functions in the Cobrand module are used by FixMyStreet in the UK
+to allow the site to offer versions localised to a single authority and should
+not be needed for most installs. Listed below are some of the options that
+can be changed:
+
+* language_override
+
+ Return a language code string from this function if you wish your cobrand
+to always be in a particular language, rather than try and work it out from the
+domain name or the browser’s settings.
+
+* add_response_headers
+
+ Any extra headers you wish to send with your HTTP responses. For example,
+ fixmystreet.com uses this to send a Content-Security-Policy header.
+
+* on_map_default_max_pin_age
+
+ How far back to go by default showing pins on your around map.
+
+* areas_on_around
+
+ If you would like to plot the boundaries of MapIt IDs on an around page
+(not just reports page), you specify them here.
+
+* pin_colour
+
+ This can be used if you wish to specify different pin colours depending upon
+some aspect of the report - its state, category, and so on.
+
+* pin_new_report_colour
+
+ What colour to use for the pin when reporting a new issue.
+
+* geocode_postcode
+
+ This function is used to convert postcodes (zip codes, etc.) entered into a
+latitude and longitude, if there's a different way from your geocoder of doing so
+(e.g. a MapIt install). If the text passed is not a valid postcode then an
+error should be returned. If you do not want to use postcodes, just do not define
+this function.
+
+ If the postcode is valid and can be converted then the return value should
+look like this:
+
+ return { latitude => $latitude, longitude => $longitude };
+
+ If there is an error it should look like this:
+
+ return { error => $error_message };
+
+* find_closest and find_closest_address_for_rss
+
+ These are used to provide information on the closest street to the point of
+the address in reports and RSS feeds or alerts.
+
+* allow_photo_upload
+
+ Return 0 to disable the photo upload field.
+
+* allow_photo_display
+
+ Return 0 to disable the display of uploaded photos.
+
+* remove_redundant_areas
+
+ This is used to filter out any overlapping jurisdictions from MapIt results
+where only one of the authorities actually has responsibility for the events
+reported by the site. An example would be a report in a city where MapIt
+has an ID for the city council and the state council (and they are both the
+same MapIt area type) but problems are only reported to the state. In this case
+you could remove the ID for the city council from the results.
+
+ With the new bodies handling, a better way to handle this would be to simply
+have a body that only covered the state council administrative area.
+
+* short_name
+
+ This is used to turn the full authority name returned by MapIt into a short
+name.
+
+* send_questionnaires
+
+ By default, FixMyStreet [sends questionnaires]({{ "/running/surveys" | relative_url }})
+ (sometimes called _surveys_) four weeks after a user submitted a report. The
+ questionnaire encourages them to update the
+ <a href="{{ "/glossary/#state" | relative_url }}" class="glossary__link">state</a>
+ of the report. Return 0 to disable this feature so that surveys are never
+ sent.
+
+
diff --git a/docs/customising/config.md b/docs/customising/config.md
new file mode 100644
index 000000000..9f48bad7e
--- /dev/null
+++ b/docs/customising/config.md
@@ -0,0 +1,1122 @@
+---
+layout: page
+title: Configuration settings
+---
+
+# Configuration settings
+
+<p class="lead">
+ You can control much of how FixMyStreet looks and behaves just by
+ changing the config settings.
+</p>
+
+## The general configuration file
+
+<div class="attention-box info">
+You can look at a summary of the live configuration of your site by going to
+the Configuration page of your administration interface, at
+<code>/admin/config</code>.
+</div>
+
+The FixMyStreet code ships with an example configuration file:
+`conf/general.yml-example`.
+
+As part of the [installation process]({{ "/install " | relative_url }}), the example
+file gets copied to `conf/general.yml`. You **must** edit this file to suit
+your needs.
+
+When you edit this file, remember it must be in the <a
+href="http://yaml.org">YAML syntax</a>. It's not complicated but &mdash;
+especially if you're editing a list &mdash; be careful to get the indentation
+correct. If in doubt, look at the examples already in the file, and don't use
+tabs.
+
+## Config settings by topic
+
+The following are all the configuration settings that you can change in `conf/general.yml`.
+
+### Database config
+
+* <code><a href="#fms_db_host">FMS_DB_HOST</a></code>,
+<code><a href="#fms_db_port">FMS_DB_PORT</a></code>,
+<code><a href="#fms_db_name">FMS_DB_NAME</a></code>,
+<code><a href="#fms_db_user">FMS_DB_USER</a></code>, and
+<code><a href="#fms_db_pass">FMS_DB_PASS</a></code>
+
+### Site settings and behaviour
+
+* <code><a href="#allowed_cobrands">ALLOWED_COBRANDS</a></code>
+* <code><a href="#rss_limit">RSS_LIMIT</a></code>
+* <code><a href="#open311_limit">OPEN311_LIMIT</a></code>
+* <code><a href="#all_reports_per_page">ALL_REPORTS_PER_PAGE</a></code>
+* <code><a href="#area_links_from_problems">AREA_LINKS_FROM_PROBLEMS</a></code>
+
+### URLs and directories
+
+* <code><a href="#base_url">BASE_URL</a></code>
+* <code><a href="#secure_proxy_ssl_header">SECURE_PROXY_SSL_HEADER</a></code>
+* <code><a href="#upload_dir">UPLOAD_DIR</a></code>
+* <code><a href="#geo_cache">GEO_CACHE</a></code>
+* <code><a href="#admin_base_url">ADMIN_BASE_URL</a></code>
+
+### Emailing
+
+* <code><a href="#email_domain">EMAIL_DOMAIN</a></code>
+* <code><a href="#contact_email">CONTACT_EMAIL</a></code>
+* <code><a href="#contact_name">CONTACT_NAME</a></code>
+* <code><a href="#do_not_reply_email">DO_NOT_REPLY_EMAIL</a></code>
+* SMTP server settings: <code><a href="#smtp_smarthost">SMTP_SMARTHOST</a></code>,
+ <code><a href="#smtp_type">SMTP_TYPE</a></code>,
+ <code><a href="#smtp_port">SMTP_PORT</a></code>,
+ <code><a href="#smtp_username">SMTP_USERNAME</a></code>,
+ and <code><a href="#smtp_password">SMTP_PASSWORD</a></code>
+
+### Login methods, authentication
+
+* Social login: <code><a href="#facebook_app_id">FACEBOOK_APP_ID</a></code>,
+ <code><a href="#facebook_app_secret">FACEBOOK_APP_SECRET</a></code>,
+ <code><a href="#twitter_key">TWITTER_KEY</a></code>, and
+ <code><a href="#twitter_secret">TWITTER_SECRET</a></code>
+* SMS text authentication: <code><a href="#sms_authentication">SMS_AUTHENTICATION</a></code>,
+ <code><a href="#phone_country">PHONE_COUNTRY</a></code>,
+ <code><a href="#twilio_account_sid">TWILIO_ACCOUNT_SID</a></code>,
+ <code><a href="#twilio_auth_token">TWILIO_AUTH_TOKEN</a></code>, and
+ <code><a href="#twilio_from_parameter">TWILIO_FROM_PARAMETER</a></code>
+* <code><a href="#login_required">LOGIN_REQUIRED</a></code>
+* <code><a href="#signups_disabled">SIGNUPS_DISABLED</a></code>
+
+### Staging site (not production) behaviour
+
+* <code><a href="#staging_site">STAGING_SITE</a></code>
+* <code><a href="#staging_flags">STAGING_FLAGS</a></code>
+
+### MapIt (admin boundary service)
+
+* <code><a href="#mapit_url">MAPIT_URL</a></code>
+* <code><a href="#mapit_types">MAPIT_TYPES</a></code>
+* <code><a href="#mapit_api_key">MAPIT_API_KEY</a></code>
+* <code><a href="#mapit_id_whitelist">MAPIT_ID_WHITELIST</a></code>
+* <code><a href="#mapit_generation">MAPIT_GENERATION</a></code>
+* <code><a href="#mapit_types_children">MAPIT_TYPES_CHILDREN</a></code>
+
+### Localisation and maps
+
+* <code><a href="#languages">LANGUAGES</a></code>
+* <code><a href="#time_zone">TIME_ZONE</a></code>
+* <code><a href="#geocoder">GEOCODER</a></code>
+* <code><a href="#geocoding_disambiguation">GEOCODING_DISAMBIGUATION</a></code>
+* <code><a href="#example_places">EXAMPLE_PLACES</a></code>
+* <code><a href="#map_type">MAP_TYPE</a></code>
+* <code><a href="#google_maps_api_key">GOOGLE_MAPS_API_KEY</a></code>
+* <code><a href="#bing_maps_api_key">BING_MAPS_API_KEY</a></code>
+
+### Sundry external services
+
+* <code><a href="#gaze_url">GAZE_URL</a></code>
+* <code><a href="#message_manager_url">MESSAGE_MANAGER_URL</a></code>
+
+---
+
+## All the general settings
+
+<dl class="glossary">
+
+ <dt>
+ <a name="fms_db_host"><code>FMS_DB_HOST</code></a>,
+ <a name="fms_db_port"><code>FMS_DB_PORT</code></a>,
+ <a name="fms_db_name"><code>FMS_DB_NAME</code></a>,
+ <a name="fms_db_user"><code>FMS_DB_USER</code></a> &amp;
+ <a name="fms_db_pass"><code>FMS_DB_PASS</code></a>
+ </dt>
+ <dd>
+ These are the PostgreSQL database details for FixMyStreet.
+ <div class="more-info">
+ <p>Example:</p>
+ <ul class="examples">
+ <li>
+ <code>
+ FMS_DB_HOST: 'localhost'<br>
+ FMS_DB_PORT: '5432'<br>
+ FMS_DB_NAME: 'fms'<br>
+ FMS_DB_USER: 'fmsuser'<br>
+ FMS_DB_PASS: 'aSecretWord'
+ </code>
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <a name="base_url"><code>BASE_URL</code></a>
+ </dt>
+ <dd>
+ The base URL of your site.
+ <div class="more-info">
+ <p>Examples:</p>
+ <ul class="examples">
+ <li>
+ <code>BASE_URL: 'http://www.example.org'</code>
+ </li>
+ <li>
+ <p>
+ Use this if you're using the Catalyst development server:
+ </p>
+ <code>BASE_URL: 'http://localhost:3000'</code>
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <a name="secure_proxy_ssl_header"><code>SECURE_PROXY_SSL_HEADER</code></a>
+ </dt>
+ <dd>
+ If you are behind a proxy that is performing SSL termination, and so
+ FixMyStreet is e.g. responding locally on a non-HTTPS connection, then you
+ need to make your proxy set a custom HTTP header saying that the request
+ was via HTTPS, and then set this value to a two-element list containing the
+ trusted HTTP header and the required value.
+ <div class="more-info">
+ <p>Example:</p>
+ <ul class="examples">
+ <li>
+ <code>SECURE_PROXY_SSL_HEADER: [ 'X-Forwarded-Proto', 'https' ]</code>
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <a name="email_domain"><code>EMAIL_DOMAIN</code></a>,
+ <a name="contact_email"><code>CONTACT_EMAIL</code></a> &amp;
+ <a name="contact_name"><code>CONTACT_NAME</code></a>
+ </dt>
+ <dd>
+ The email domain used for emails, and the contact name and email
+ for admin use.
+ <div class="more-info">
+ <p>Example:</p>
+ <ul class="examples">
+ <li>
+ <code>
+ EMAIL_DOMAIN: 'example.org'<br>
+ CONTACT_EMAIL: 'team@example.org'<br>
+ CONTACT_NAME: 'FixMyStreet team'
+ </code>
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <a name="do_not_reply_email"><code>DO_NOT_REPLY_EMAIL</code></a>
+ </dt>
+ <dd>
+ The address used for emails you don't expect a reply to (for example,
+ confirmation emails). This can be the same as
+ <code><a href="#contact_email">CONTACT_EMAIL</a></code>, of course, if you don't have a special address.
+ <div class="more-info">
+ <p>Example:</p>
+ <ul class="examples">
+ <li>
+ <code>DO_NOT_REPLY_EMAIL: 'do-not-reply@example.org'</code>
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <a name="staging_site"><code>STAGING_SITE</code></a>
+ </dt>
+ <dd>
+ Is this site a
+ <a href="{{ "/glossary/#staging" | relative_url }}" class="glossary__link">staging</a>
+ (or <a href="{{ "/glossary/#development" | relative_url }}" class="glossary__link">development</a>)
+ site?
+ <p>
+ On a staging site, templates/CSS modified times aren't cached. Staging
+ sites also don't send reports to bodies unless explicitly configured to
+ (see <code><a href="#staging_flags">STAGING_FLAGS</a></code>)
+ &mdash; this means you can easily test your site without really sending
+ emails to the bodies' contacts that may be in your database.
+ </p>
+ <div class="more-info">
+ <p>Example:</p>
+ <ul class="examples">
+ <li>
+ If this is your live
+ <a href="{{ "/glossary/#production" | relative_url }}" class="glossary__link">production</a>
+ server:
+ <p>
+ <code>STAGING_SITE: 0</code>
+ </p>
+ </li>
+ <li>
+ If this is a development or staging server:
+ <p>
+ <code>STAGING_SITE: 1</code>
+ </p>
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <a name="staging_flags"><code>STAGING_FLAGS</code></a>
+ </dt>
+ <dd>
+ <p>
+ A variety of flags that change the behaviour of a site when
+ <code><a href="#staging_site">STAGING_SITE</a></code> is <code>1</code>.
+ <code>send_reports</code> being set to 0 will
+ <a href="{{ "/customising/send_reports" | relative_url }}">send
+ reports</a> to the reporter <em>instead of</em> the relevant body's
+ contact address; <code>skip_checks</code> will stop cobrands from
+ performing some checks such as the map pin location being within their
+ covered area, which makes testing multiple cobrands much easier;
+ <code>enable_appcache</code> lets you say whether the appcache should be
+ active or not.
+ </p>
+ <p>
+ Note that this setting is only relevant on a
+ <a href="{{ "/glossary/#staging" | relative_url }}" class="glossary__link">staging</a>
+ server.
+ On your
+ <a href="{{ "/glossary/#production" | relative_url }}" class="glossary__link">production</a>
+ server (where
+ <code><a href="#staging_site">STAGING_SITE</a></code> is <code>0</code>)
+ it will be ignored.
+ </p>
+ <div class="more-info">
+ <p>Example:</p>
+<pre>
+STAGING_FLAGS:
+ send_reports: 0
+ skip_checks: 1
+ enable_appcache: 0
+</pre>
+ </div>
+ <p>
+ Any reports created will now be sent to the email of the reporter
+ and <em>not</em> the body's; any location checks are skipped, and
+ we won't ever use appcache. Great for testing!
+ </p>
+ </dd>
+
+ <dt>
+ <a name="example_places"><code>EXAMPLE_PLACES</code></a>
+ </dt>
+ <dd>
+ The suggested input for a place name or names. By default, this appears
+ as a placeholder in the text input on FixMyStreet's front page, and in
+ alert emails. It defaults to displaying "High Street, Main Street".
+ <p>
+ You should ensure that the example places do return clear,
+ relevant results if they're entered in the font page text input
+ &mdash; this will probably depend on how you've set
+ <code><a href="#geocoding_disambiguation">GEOCODING_DISAMBIGUATION</a></code>.
+ </p>
+ <div class="more-info">
+ <p>Example:</p>
+ <ul class="examples">
+ <li>
+ The default behaviour is this, which you should certainly change:
+ <p>
+ <code>EXAMPLE_PLACES: [ 'High Street', 'Main Street' ]</code>
+ </p>
+ </li>
+ <li>
+ <code>EXAMPLE_PLACES: [ 'Iffley Road', 'Park St, Woodstock' ]</code>
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <a name="languages"><code>LANGUAGES</code></a>
+ </dt>
+ <dd>
+ An array of languages the site supports, each in the following format:
+ <p>
+ <em>&lt;language code&gt;,&lt;pretty name&gt;,&lt;locale&gt;</em>
+ </p>
+ <p>
+ Some important things to note:
+ </p>
+ <ul>
+ <li>
+ Put the default language as the first entry in the list.
+ </li>
+ <li>
+ Don't put any extra spaces in the strings (e.g., after the commas).
+ </li>
+ <li>
+ Remember that if you want your site to run in languages other than
+ English, you'll also need to check that the translations are
+ available, and your system supports the appropriate
+ <a href="{{ "/glossary/#locale" | relative_url }}" class="glossary__link">locales</a>.
+ </li>
+ </ul>
+ <p>
+ Just adding a language here does not necessarily mean FixMyStreet will
+ always use it (for example, a language coded subdomain name or browser preference may be considered). See this page about
+ <a href="{{ "/customising/language" | relative_url }}">languages and FixMyStreet</a> for more information.
+ </p>
+ <div class="more-info">
+ <p>Example:</p>
+ <ul class="examples">
+ <li>
+<pre>
+LANGUAGES:
+ - 'en-gb,English,en_GB'
+</pre>
+ </li>
+ <li>
+<pre>
+LANGUAGES:
+ - 'de,German,de_DE'
+ - 'en-gb,English,en_GB'
+</pre>
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <a name="time_zone"><code>TIME_ZONE</code></a>
+ </dt>
+ <dd>
+ If you're running an installation that is being used in a different time zone
+ from the server, set the time zone here. Use a
+ <a href="http://en.wikipedia.org/wiki/List_of_tz_database_time_zones">standard time zone (TZ) string</a>.
+ <div class="more-info">
+ <p>Example:</p>
+ <ul class="examples">
+ <li>
+ <code>TIME_ZONE: 'Asia/Manila'</code>
+ </li>
+ <li>
+ Leave the setting blank to use your server's default:
+ <p><code>TIME_ZONE: ''</code></p>
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <a name="upload_dir"><code>UPLOAD_DIR</code></a> &amp;
+ <a name="geo_cache"><code>GEO_CACHE</code></a>
+ </dt>
+ <dd>
+ The file locations for uploaded photos and cached geocoding results.
+ Normally you don't need to change these settings from the examples.
+ <div class="more-info">
+ <p>Example:</p>
+ <ul class="examples">
+ <li>
+ <code>
+ UPLOAD_DIR: '../upload/'<br>
+ GEO_CACHE: '../cache/'
+ </code>
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <code><a name="facebook_app_id">FACEBOOK_APP_ID</a></code> &amp;
+ <code><a name="facebook_app_secret">FACEBOOK_APP_SECRET</a></code>
+ </dt>
+ <dd>
+ If these parameters are set to a Facebook App's ID and secret, then
+ a user will be able to log in using their Facebook account when reporting,
+ updating, or logging in. <a href="../login/">More details</a>
+ </dd>
+
+ <dt>
+ <code><a name="twitter_key">TWITTER_KEY</a></code> &amp;
+ <code><a name="twitter_secret">TWITTER_SECRET</a></code>
+ </dt>
+ <dd>
+ If these parameters are set to a Twitter App's key and secret, then
+ a user will be able to log in using their Twitter account when reporting,
+ updating, or logging in. <a href="../login/">More details</a>
+ </dd>
+
+ <dt>
+ <code><a name="sms_authentication">SMS_AUTHENTICATION</a></code>
+ </dt>
+ <dd>
+ Set this to 1 if you wish people to be able to use their mobiles as login
+ identifiers, receiving confirmation codes by text to report, update or
+ login in a similar way to how they receive a link in a confirmation email.
+ <a href="../login/">More details</a>
+ </dd>
+
+ <dt>
+ <code><a name="phone_country">PHONE_COUNTRY</a></code>
+ </dt>
+ <dd>
+ Set this to the country code of where you are operating the site, so that
+ phone number parsing knows how to deal with national phone numbers entered.
+ </dd>
+
+ <dt>
+ <a name="twilio_account_sid"><code>TWILIO_ACCOUNT_SID</code></a> &amp;
+ <a name="twilio_auth_token"><code>TWILIO_AUTH_TOKEN</code></a>
+ </dt>
+ <dd>
+ These are your Twilio account details to use for sending text messages for
+ report and update verification.
+ See the <a href="https://www.twilio.com/docs/usage/api">Twilio docs</a> for more information.
+ </dd>
+
+ <dt>
+ <a name="twilio_from_parameter"><code>TWILIO_FROM_PARAMETER</code></a>
+ </dt>
+ <dd>
+ This is the phone number or alphanumeric string to use as the From of any
+ sent text messages.
+ You must specify either this or <code>TWILIO_MESSAGING_SERVICE_SID</code>.
+ See the <a href="https://www.twilio.com/docs/sms/send-messages">Twilio docs</a> for more information.
+ </dd>
+
+ <dt>
+ <a name="twilio_from_parameter"><code>TWILIO_MESSAGING_SERVICE_SID</code></a>
+ </dt>
+ <dd>
+ This is the unique id of the Twilio Messaging Service you want to associate with this message.
+ You must specify either this or <code>TWILIO_FROM_PARAMETER</code>.
+ See the <a href="https://www.twilio.com/docs/sms/send-messages">Twilio docs</a> for more information.
+ </dd>
+
+ <dt>
+ <a name="login_required"><code>LOGIN_REQUIRED</code></a>
+ </dt>
+ <dd>
+ If you're running an installation that should only be accessible to logged
+ in people, set this variable.
+ <div class="more-info">
+ <p>Example:</p>
+ <ul class="examples">
+ <li>
+ <code>LOGIN_REQUIRED: 1</code>
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <a name="signups_disabled"><code>SIGNUPS_DISABLED</code></a>
+ </dt>
+ <dd>
+ If you don't want any new people to be able to use the site, only the users
+ you have already created, then set this variable.
+ <div class="more-info">
+ <p>Example:</p>
+ <ul class="examples">
+ <li>
+ <code>SIGNUPS_DISABLED: 1</code>
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <a name="mapit_url"><code>MAPIT_URL</code></a>,
+ <a name="mapit_types"><code>MAPIT_TYPES</code></a>,
+ <a name="mapit_api_key"><code>MAPIT_API_KEY</code></a>
+ </dt>
+ <dd>
+ FixMyStreet uses the external service MapIt to map locations (points) to
+ administrative areas: see this
+ <a href="{{ "/customising/fms_and_mapit" | relative_url }}">explanation of MapIt</a>.
+ <!-- TODO link to explanation of boundaries -->
+ <p>
+ You must provide the URL of a MapIt server, and nominate what types of
+ area from it you want to use. If you leave this blank, a default area
+ will be used everywhere (a URL needs to be given for non-web things, like sending of reports, to function). <!-- TODO explain this: function? -->
+ If the MapIt you are using requires an API key, you can provide one.
+ </p>
+ <p>
+ See also <code><a href="#mapit_id_whitelist">MAPIT_ID_WHITELIST</a></code> to
+ efficiently limit the areas you need (especially if you're using
+ global MapIt).
+ </p>
+ <div class="more-info">
+ <p>Example:</p>
+ <ul class="examples">
+ <li>
+ If using the Catalyst development server, set to:
+ <p><code>
+ MAPIT_URL: 'http://localhost:3000/fakemapit/'<br>
+ MAPIT_TYPES: [ 'ZZZ' ]
+ </code></p>
+ </li>
+ <li>
+ In the UK, you probably want, to cover all councils:
+ <p><code>
+ MAPIT_URL: 'https://mapit.mysociety.org/'<br>
+ MAPIT_API_KEY: '12345'<br>
+ MAPIT_TYPES: [ 'DIS', 'LBO', 'MTD', 'UTA', 'CTY', 'COI', 'LGD' ]
+ </code></p>
+ <p>
+ ...but perhaps <code>MAPIT_TYPES: [ 'WMC' ]</code>
+ if you want to report on a per-constituency basis?
+ </p>
+ </li>
+ <li>
+ If our global MapIt (which is loaded with OpenStreetMap data)
+ contains boundaries you can use:
+ <p><code>
+ MAPIT_URL: 'http://global.mapit.mysociety.org/'
+ </code></p>
+ <p>
+ And then specify whichever type code have the boundaries you want:
+ </p>
+ <p><code>MAPIT_TYPES: [ 'O06' ]</code></p>
+ <p>
+ OSM type codes consist of the letter O followed by two digits
+ indicating the type of boundary. Typically, the higher the number,
+ the more specfic (localised) the boundary type.
+ </p>
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <a name="mapit_id_whitelist"><code>MAPIT_ID_WHITELIST</code></a>
+ </dt>
+ <dd>
+ If you are using global MapIt (see
+ <code><a href="#mapit_url">MAPIT_URL</a></code>),
+ you might want to restrict FixMyStreet usage
+ to only one or more areas, rather than <em>all</em> areas of the
+ specified type (afer all, there are a lot of <code>O04</code> boundaries
+ in the whole world, for example). Provide a list of all the MapIt
+ IDs that your FixMyStreet should recognise.
+ <p>
+ Note that you must still set <code><a href="#mapit_types">MAPIT_TYPES</a></code> to match
+ the type or types of each of these areas. And we recommend you set
+ <code><a href="#mapit_generation">MAPIT_GENERATION</a></code> too.
+ </p>
+ <p>
+ We recommend you use this setting, because doing so can improves the efficiency of your site's calls to MapIt considerably.
+ </p>
+ <div class="more-info">
+ <p>Examples:</p>
+ <ul class="examples">
+ <li>
+ If you don't specify a whitelist, all results (of the given area
+ type) will be considered. This may be OK if you're using a MapIt
+ server which is already only returning relevant results.
+ <p><code>MAPIT_ID_WHITELIST: []</code></p>
+ </li>
+ <li>
+ Otherwise, explicitly list the IDs (from the MapIt server you're
+ using) of the areas you're interested in:
+ <p>
+ <code>MAPIT_ID_WHITELIST: [ 240838, 246176, 246733 ]</code>
+ </p>
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <a name="mapit_generation"><code>MAPIT_GENERATION</code></a>
+ </dt>
+ <dd>
+ If you have set
+ <code><a href="#mapit_id_whitelist">MAPIT_ID_WHITELIST</a></code>, then you
+ should also specify the generation of MapIt data you are using, especially
+ if you are using our global MapIt service.
+ <p>
+ Global MapIt uses <a href="{{ "/glossary/#osm" | relative_url }}"
+ class="glossary__link">OpenStreetMap</a> data. From time to time we import the latest
+ data in order to pull in newly-added boundaries, or reflect changes to existing
+ ones. When this happens, the area IDs may change, which means the values in your
+ <code><a href="#mapit_id_whitelist">MAPIT_ID_WHITELIST</a></code> might no longer
+ be correct (because, by default, MapIt returns values from the <em>latest</em>
+ generation of data). Use the <code>MAPIT_GENERATION</code> setting to lock
+ the area IDs in your whitelist &mdash; and the geometry described by their boundary
+ data &mdash; to the specific generation they belong to. MapIt's generations
+ are numbered with an integer that we increment with each update.
+ </p>
+ <p>
+ To determine the generation of the data you're using, when you initially
+ identify the area IDs look at the <code>generation-high</code> and
+ <code>generation-low</code> values MapIt is returning. For example,
+ here's the global MapIt data for
+ <a href="http://global.mapit.mysociety.org/point/4326/100.466667,13.75.html">a
+ point within Thailand</a> &mdash; the national border for Thailand is the
+ top level returned ("OSM Administrative Boundary Level 2"). Look on
+ that page for "Exists in generations" (or "<code>generation-</code>" in the
+ JSON data, available by changing MapIt's <code>.html</code> URL to <code>.json</code>)
+ to see the range of generations in which this area appears. You should
+ probably use the highest number (that is, the most recent update).
+ </p>
+ <div class="more-info">
+ <p>Examples:</p>
+ <ul class="examples">
+ <li>
+ In this example, the whitelist contains a single area ID from global
+ MapIt's generation <code>4</code> for
+ <a href="http://global.mapit.mysociety.org/area/507455.html?generation=4">Thailand's national border</a>
+ (hence <code>507455</code> and
+ <a href="{{ "/glossary/#area-type" | relative_url }}" class="glossary__link">area type</a> <code>O02</code>):
+<pre>MAPIT_URL: http://global.mapit.mysociety.org/
+MAPIT_TYPES: ['O02']
+MAPIT_ID_WHITELIST: [507455]
+MAPIT_ID_GENERATION: 4
+</pre>
+ </li>
+ <li>
+ If you're not using a <code>MAPIT_ID_WHITELIST</code>
+ you usually don't need to specify a <code>MAPIT_ID_GENERATION</code>.
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <a name="mapit_types_children"><code>MAPIT_TYPES_CHILDREN</code></a>
+ </dt>
+ <dd>
+ If your MapIt has the concept of council wards (subareas of councils, where
+ people can sign up for alerts, but not report things), then you can give the
+ MapIt type codes for them here.
+ <p>
+ You can leave this blank if your jurisidction doesn't use subareas.
+ </p>
+ <div class="more-info">
+ <p>Example:</p>
+ <ul class="examples">
+ <li>
+ It's OK to leave this setting blank:
+ <p><code>MAPIT_TYPES_CHILDREN: ''</code></p>
+ </li>
+ <li>
+ In the UK we use something like:
+ <p><code>
+ MAPIT_TYPES_CHILDREN: [ 'DIW', 'LBW', 'MTW', 'UTE', 'UTW', 'CED', 'COP', 'LGW' ]
+ </code></p>
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <a name="geocoder"><code>GEOCODER</code></a>
+ </dt>
+ <dd>
+ Which <a href="{{ "/glossary/#geocoder" | relative_url }}" class="glossary__link">geocoder service</a> to use to look up results, for
+ example, from front page "Enter your location" searches.
+ <p>
+ Possible choices are
+ <code>Google</code>, <code>Bing</code>, or <code>OSM</code>.
+ By default, FixMyStreet will use <code>OSM</code>, the
+ <a href="{{ "/glossary/#osm" | relative_url }}" class="glossary__link">OpenStreetMap</a>
+ geocoder.
+ </p>
+ <p>
+ For more information, see the
+ <a href="{{ "/customising/geocoder" | relative_url }}">page about geocoding</a>.
+ </p>
+ <p>
+ It's also possible to add a new geocoder (for example, if your
+ jurisdiction provides a custom one). This requires some coding work, but
+ you can see exampes of <a
+ href="https://github.com/mysociety/fixmystreet/tree/master/perllib/FixMyStreet/Geocode">supported geocoders</a> in the FixMyStreet repo.
+ </p>
+ <p>
+ Whichever geocoder you use, check the terms of use for it
+ &mdash; there may be restrictions. You may also need to provide an API
+ key to use it: see
+ <code><a href="#google_maps_api_key">GOOGLE_MAPS_API_KEY</a></code>
+ and
+ <code><a href="#bing_maps_api_key">BING_MAPS_API_KEY</a></code>.
+ </p>
+ <p>
+ See also <code><a href="#geocoding_disambiguation">GEOCODING_DISAMBIGUATION</a></code>
+ for restricting geocoder service to specific places.
+ </p>
+ <div class="more-info">
+ <p>Example:</p>
+ <ul class="examples">
+ <li>
+ FixMyStreet defaults to <code>OSM</code> if you don't specify
+ a geocoder:
+ <p><code>GEOCODER: ''</code></p>
+ </li>
+ <li>
+ <code>GEOCODER: 'Bing'</code>
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <a name="google_maps_api_key"><code>GOOGLE_MAPS_API_KEY</code></a> &amp;
+ <a name="bing_maps_api_key"><code>BING_MAPS_API_KEY</code></a>
+ </dt>
+ <dd>
+ If you wish to use Google Maps or Bing Maps Geocoding, get the
+ relevant key and set it here. See also the
+ <code><a href="#geocoder">GEOCODER</a></code> setting.
+ <div class="more-info">
+ <p>Example:</p>
+ <ul class="examples">
+ <li>
+ <code>
+ GOOGLE_MAPS_API_KEY: ''<br>
+ BING_MAPS_API_KEY: ''
+ </code>
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <a name="geocoding_disambiguation"><code>GEOCODING_DISAMBIGUATION</code></a>
+ </dt>
+ <dd>
+ This setting provides parameters that are included in
+ <a href="{{ "/glossary/#geocoder" | relative_url }}" class="glossary__link">geocoding</a> requests, to hopefully
+ return more useful results. The options that will be applied vary depending
+ on which geocoder you are using (although unwanted options will be ignored,
+ so you can specify all of them, which might be convenient if you change
+ geocoder).
+ <p>
+ Remember that you specify which geocoder you are using with the
+ <code><a href="#geocoder">GEOCODER</a></code> setting.
+ </p>
+ <p>
+ For OSM, which is the default, you can use:
+ </p>
+<pre>
+GEOCODING_DISAMBIGUATION:
+ bounds: [ <em>&lt;min lat&gt;, &lt;min lon&gt;, &lt;max lat&gt;, &lt;max lon&gt;</em> ]
+ country: <em>&lt;country code to restrict results to&gt;</em>
+ town: <em>&lt;string added to geocoding requests if not already there&gt;</em>
+</pre>
+ <p>
+ If using Bing, you can use <code>town</code> and <code>bounds</code>, plus any of:
+ </p>
+<pre>
+ centre: "<em>&lt;lat&gt;&lt;lon&gt;</em>"
+ bing_culture: <em>&lt;culture code: see <a href="http://msdn.microsoft.com/en-us/library/hh441729.aspx">Bing docs</a>&gt;</em>
+ bing_country: <em>&lt;country name: only accept results that match this&gt;</em>
+</pre>
+ <p>
+ If using Google, you can use:
+ </p>
+<pre>
+ bounds: [ <em>&lt;min lat&gt;, &lt;min lon&gt;, &lt;max lat&gt;, &lt;max lon&gt;</em> ]
+ google_country: <em>&lt;.ccTLD to restrict results to&gt;</em>
+ lang: <em>&lt;language for results&gt;</em>
+</pre>
+ <div class="more-info">
+ <p>Example:</p>
+ <ul class="examples">
+ <li>
+ This limits geocoding requests to only return results in Mumbai, India:
+<pre>
+GEOCODER: 'OSM'
+GEOCODING_DISAMBIGUATION:
+ country: 'in'
+ town: 'Mumbai'
+</pre>
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <a name="map_type"><code>MAP_TYPE</code></a>
+ </dt>
+ <dd>
+ The type of map you want to use. If left blank, the default is
+ <code>OSM</code> for
+ <a href="{{ "/glossary/#osm" | relative_url }}" class="glossary__link">OpenStreetMap</a>.
+ Other options are <code>GoogleOL</code> for Google Open Layers,
+ and other UK-specific values, including <code>FMS</code>
+ for UK <a href="https://www.fixmystreet.com">FixMyStreet</a>.
+ <p>
+ Check the usage terms for the type of map you use &mdash; there may be
+ restrictions.
+ </p>
+ <div class="more-info">
+ <p>Example:</p>
+ <ul class="examples">
+ <li>
+ <code>MAP_TYPE: 'OSM'</code>
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <a name="allowed_cobrands"><code>ALLOWED_COBRANDS</code></a>
+ </dt>
+ <dd>
+ FixMyStreet uses a templating
+ <a href="{{ "/glossary/#cobrand" | relative_url }}" class="glossary__link">cobrand</a>
+ system to provide different looks (and behaviour) for
+ different installations. For example, if you create a cobrand
+ called <code>moon</code>, then FixMyStreet will look for templates in the
+ <code>templates/web/moon</code> directory and CSS in <code>web/cobrands/moon</code>. To make this work, set:
+<pre>
+ALLOWED_COBRANDS:
+ - moon
+</pre>
+ <p>
+ If you specify <em>only one</em> cobrand in this way, your FixMyStreet site will simply run using that cobrand (so that would be <code>moon</code> in the example above). This is probably all you need!
+ </p>
+ <p>
+ However, it is possible for a FixMyStreet site to support <em>more than
+ one cobrand at the same time</em>. <strong>Most installations don't need
+ this</strong>, but if yours does, it's very useful: the server decides
+ which cobrand to use by inspecting the hostname of the incoming request.
+ </p>
+ <p>
+ If you wish to use multiple cobrands, specify them in a list, optionally
+ with hostname-matching regular expressions if the name of the cobrand is
+ not enough. If the hostname of the current request does not match with
+ any in the list, FixMyStreet will use the Default cobrand. For example:
+ </p>
+<pre>
+ALLOWED_COBRANDS:
+ - moon
+ - venus
+</pre>
+ <p>
+ Any hostname with "<code>moon</code>" in it will use the moon cobrand
+ (for example, <code>fixmymoon.org</code>), any with "<code>venus</code>"
+ will use the venus cobrand. Anything else (such as
+ <code>www.example.com</code>, which contains neither "<code>moon</code>"
+ nor "<code>venus</code>") will use the Default cobrand.
+ </p>
+ <p>
+ Instead of using the cobrand's name as the matching string, you can
+ specify an alternative string to match on (in fact, the string can be a
+ regular expression):
+ </p>
+<pre>
+ALLOWED_COBRANDS:
+ - moon: 'orbital'
+ - venus
+</pre>
+ <p>
+ Here, any hostname with "<code>orbital</code>" in it will use the moon
+ cobrand. Conversely, a request to <code>www.fixmymoon.org</code> won't
+ match anything, so it would be served with the Default cobrand instead.
+ This also allows development servers to map to different cobrands if
+ needed, using DNS subdomains, for example.
+ </p>
+ <p>
+ If you're running a site with multiple cobrands, you'll never want to
+ serve the Default cobrand on your
+ <a href="{{ "/glossary/#production" | relative_url }}" class="glossary__link">production</a>
+ server, so make sure you've set ALLOWED_COBRANDS correctly.
+ </p>
+ <div class="more-info">
+ <p>Examples:</p>
+ <ul class="examples">
+ <li>
+ <p>
+ Note that specifying <em>a single allowed cobrand</em> is a
+ special, simple case: FixMyStreet will always use the
+ <code>mycobrand</code>. This is probably all you need!
+ </p>
+<pre>
+ALLOWED_COBRANDS:
+ - mycobrand
+</pre>
+ </li>
+ <li>
+ <p>
+ If there's more than one allowed cobrand, FixMyStreet uses string
+ matching (described above) on the hostname to determine which one
+ to use:
+ </p>
+<pre>
+ALLOWED_COBRANDS:
+ - cobrand1
+ - cobrand2: 'hostname_substring2'
+ - cobrand3
+</pre>
+ <p>
+ Make sure you've covered everything, because any requests to a
+ hostname that don't match will be served using the Default cobrand,
+ which isn't what you want.
+ </p>
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <a name="admin_base_url"><code>ADMIN_BASE_URL</code></a>
+ </dt>
+ <dd>
+ This is used in "offensive report" emails to provide a link directly
+ to the admin interface, and to make sure the admin can work through a
+ proxy. It defaults to `/admin` in your installation.
+ <div class="more-info">
+ <p>Example:</p>
+ <ul class="examples">
+ <li>
+ <code>ADMIN_BASE_URL: ''</code>
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <a name="rss_limit"><code>RSS_LIMIT</code></a>
+ </dt>
+ <dd>
+ How many items are returned in the GeoRSS feeds?
+ <div class="more-info">
+ <p>Example:</p>
+ <ul class="examples">
+ <li>
+ <code>RSS_LIMIT: '20'</code>
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <a name="open311_limit"><code>OPEN311_LIMIT</code></a>
+ </dt>
+ <dd>
+ How many items are returned by default in an Open311 response?
+ <div class="more-info">
+ <p>Example:</p>
+ <ul class="examples">
+ <li>
+ <code>OPEN311_LIMIT: 100</code>
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <a name="all_reports_per_page"><code>ALL_REPORTS_PER_PAGE</code></a>
+ </dt>
+ <dd>
+ How many reports to show per page on the <em>All Reports</em> pages?
+ <div class="more-info">
+ <p>Example:</p>
+ <ul class="examples">
+ <li>
+ <code>ALL_REPORTS_PER_PAGE: 100</code>
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <a name="smtp_smarthost"><code>SMTP_SMARTHOST</code></a>
+ </dt>
+ <dd>
+ The default SMTP smarthost is <code>localhost</code>, a mail server on the
+ same machine you are running FixMyStreet. If you wish to send email through
+ a SMTP server elsewhere, change this and the other SMTP settings.
+ <div class="more-info">
+ <p>Example:</p>
+ <ul class="examples">
+ <li>
+ <code>SMTP_SMARTHOST: 'localhost'</code>
+ </li>
+ </ul>
+ </div>
+ </dd>
+ <dt>
+ <a name="smtp_type"><code>SMTP_TYPE</code></a>
+ </dt>
+ <dd>
+ If your SMTP server supports SSL or TLS, set this variable to 'ssl' or
+ 'tls', otherwise leave it as '' for unencrypted SMTP.
+ </dd>
+ <dt>
+ <a name="smtp_port"><code>SMTP_PORT</code></a>
+ </dt>
+ <dd>
+ The default SMTP port is 25 for unencrypted, 465 for SSL and 587 for TLS.
+ Leave as '' to use the default, otherwise set to your SMTP server port.
+ </dd>
+ <dt>
+ <a name="smtp_username"><code>SMTP_USERNAME</code></a>
+ </dt>
+ <dd>
+ The username for authenticating with your SMTP server, if required.
+ </dd>
+ <dt>
+ <a name="smtp_password"><code>SMTP_PASSWORD</code></a>
+ </dt>
+ <dd>
+ The password for authenticating with your SMTP server, if required.
+ </dd>
+
+ <dt>
+ <a name="area_links_from_problems"><code>AREA_LINKS_FROM_PROBLEMS</code></a>
+ </dt>
+ <dd>
+ Should problem reports link to the council summary pages? Set to <code>0</code> to disable, or <code>1</code> to enable.
+ <div class="more-info">
+ <p>Example:</p>
+ <ul class="examples">
+ <li>
+ Disable links to the summary page:
+ <p><code>AREA_LINKS_FROM_PROBLEMS: '0'</code></p>
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <a name="gaze_url"><code>GAZE_URL</code></a>
+ </dt>
+ <dd>
+ Gaze is a world-wide service for population density lookups. You can leave
+ this as is. It is used to provide the default radius for email/RSS alerts
+ and to set the default zoom level on a map page (so in rural areas, you're
+ more likely to get a slightly more zoomed out map).
+ <div class="more-info">
+ <p>Example:</p>
+ <ul class="examples">
+ <li>
+ <code>GAZE_URL: 'https://gaze.mysociety.org/gaze'</code>
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <a name="message_manager_url"><code>MESSAGE_MANAGER_URL</code></a>
+ </dt>
+ <dd>
+ If you're using <a href="https://github.com/mysociety/message-manager/">Message Manager</a>,
+ integrated with an SMS gateway, include the URL here. FixMyStreet does
+ not usually use this, so you can leave it blank.
+ <p>
+ Providing a URL does not automatically enable the service &mdash; your <a
+ href="{{ "/glossary/#cobrand" | relative_url }}" class="glossary__link">cobrand</a>
+ must be explicitly coded to use it. Contact us if you need to use Message
+ Manager with your FixMyStreet site.
+ </p>
+ <div class="more-info">
+ <p>Example:</p>
+ <ul class="examples">
+ <li>
+ <code>MESSAGE_MANAGER_URL: ''</code>
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+</dl>
diff --git a/docs/customising/css.md b/docs/customising/css.md
new file mode 100644
index 000000000..c41d5b411
--- /dev/null
+++ b/docs/customising/css.md
@@ -0,0 +1,322 @@
+---
+layout: page
+title: Customising the design
+author: dave
+---
+
+# Customising the design
+
+<p class="lead">
+ This page describes how to change the directionality and colour scheme of
+ your installation &mdash; which is a good starting point for further
+ customisations.
+</p>
+
+## Background
+
+The CSS is stored in `web/cobrands/` under which there are directories for
+Cobrands. Note that FixMyStreet uses SCSS and Compass to generate its CSS so
+there are no CSS files until `bin/make_css` has been run as the site user.
+
+The CSS provided with FixMyStreet uses CSS3 media queries in a mobile-first
+format order to adapt the layout to work on different devices. It is structured
+into these main files:
+
+* `base.css` --
+ all the styling for the content of the pages in a mobile sized browser.
+* `layout.css` --
+ all the styling for the content of the pages in a desktop sized browser.
+* `_colours.css` --
+ basic settings information, so you can easily make a site that
+ looks different simply by copying these files to your own cobrand CSS
+ directory, and changing the contents, as we will describe below.
+
+Our `.gitignore` file assumes that any CSS files directly in a `cobrands/*`
+directory are generated from SCSS - if you have CSS files that you want to use
+directly, put them in a `css` directory within your cobrand directory.
+
+# Tutorial
+
+You can override any of the CSS or HTML templates of your FixMyStreet
+installation, but to begin with it's a good idea to just change the colours.
+That way you can learn how FixMyStreet customisation works, before tackling
+more complex layout, design, or code changes.
+
+## Start simple!
+
+FixMyStreet's default CSS comes with a few basic colour settings which you can
+change. Remember that ultimately **you can override any styling for your own
+site** but most of this page shows how to set your own colours *without adding
+any new HTML or CSS*. We know that you'll want to change more than just the
+default colours: but this is the best way to start.
+
+Once you've done this, you'll have your own <a href="{{ "/glossary/#cobrand" | relative_url }}"
+class="glossary__link">cobrand</a>, and can start changing other stylesheets and
+templates in the same way.
+
+
+## Why you should create a cobrand
+
+A cobrand is just FixMyStreet's way of separating your customisation from
+everybody else's. To start with, this is almost as simple as putting what you
+need in its own directory.
+
+<div class="attention-box warning">
+ You <em>can</em> simply edit the default settings (just edit the values in
+ <code>web/cobrands/default/_colours.scss</code> and run
+ <code>bin/make_css</code>) but we <strong>strongly recommend</strong> you do
+ not do that. It's OK if you just want to play with the settings to see what's
+ possible, but the right way to change how your site looks is to make a
+ cobrand.
+</div>
+
+By making your own cobrand you'll be keeping your changes separate from the
+core code, but also keeping it within the main repository. This has serious
+benefits later on: it means you can easily update the FixMyStreet code (we
+frequently add new features, for example) while retaining your changes.
+
+
+## How to change the colours
+
+
+This is the process:
+
+1. pick a name for your cobrand
+2. update your config to use the new cobrand
+3. create a directory for it in `web/cobrands`
+4. copy the default cobrand's CSS into it
+5. edit the colours
+6. run `bin/make_css`
+
+
+The rest of this page describes each step in detail.
+
+
+### Pick a name for your cobrand
+
+Choose a name for your cobrand. In the examples below, we've used `fixmypark`,
+but you can use anything provided it's not a cobrand already in use in the
+code. Only use lower case letters. This name is never seen by the public &mdash;
+it's FixMyStreet's internal name for it.
+
+### Update your config to use the new cobrand
+
+You need to tell FixMyStreet to use your cobrand instead of the default one.
+
+FixMyStreet uses the
+<code><a href="{{ "/customising/config/#allowed_cobrands" | relative_url }}">ALLOWED_COBRANDS</a></code>
+config variable to decide which cobrand to use. In `conf/general.yml`, set it to your new cobrand like this:
+
+ ALLOWED_COBRANDS:
+ - fixmypark
+
+In fact, `ALLOWED_COBRANDS` is
+[a little more complex that it looks]({{ "/customising/config/#allowed_cobrands" | relative_url }}).
+If you give it a list of cobrands, it will decide which one to use depending on string
+matches on the incoming URL *for every request* But for most cases you don't want it to switch.
+So if you just specify just one cobrand like this, FixMyStreet will simply use it.
+
+### Create a directory for your cobrand in web/cobrands
+
+Make a new directory with your cobrand's name in `web/cobrands/` For example,
+on the command line, do:
+
+ cd fixmystreet
+ mkdir web/cobrands/fixmypark
+
+
+### Copy the default cobrand's CSS into yours
+
+Copy the contents of `web/cobrands/default` into that directory.
+
+ cp web/cobands/default/* web/cobrands/fixmypark
+
+This puts the stylesheet files you need into your cobrand.
+At this point, your cobrand is effectively a copy of the default one.
+
+### Edit the colours
+
+The default cobrand's colour scheme, which you have copied, will be blue and
+orange &mdash; we picked startling colours to force people to want to customise it.
+
+We use SCSS (instead of CSS) because it's a more powerful way of defining and
+managing styles. This means that when you make any changes, FixMyStreet needs
+to compile those SCSS files to rebuild the CSS &mdash; see the following
+section.
+
+You can edit the colours defined in `web/cobrands/fixmypark/_colours.scss`.
+You'll need to use [web colour
+codes](https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Getting_started/Co
+lor) to specify the colours you want.
+
+Be careful: if you're not familiar with SCSS, the syntax of that file is a
+little strict. Typically, those colours *must* always be either exactly three
+or six hex characters long. And there must be a `#` before and a semicolon after each one.
+
+These are the colours which you can easily change within your copy of the
+stylesheet:
+
+<table class="table">
+ <tr>
+ <th>
+ variable
+ </th>
+ <th>
+ examples of where it's used in the default cobrand
+ </th>
+ </tr>
+ <tr>
+ <td>
+ <code>$primary</code>
+ </td>
+ <td>
+ the front page's main banner background
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <code>$primary_b</code>
+ </td>
+ <td>
+ border around the the front page street/area input
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <code>$primary_text</code>
+ </td>
+ <td>
+ text on the front page banner
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <code>$base_bg</code><br>
+ <code>$base_fg</code>
+ </td>
+ <td>
+ Large width page background/foreground (bleeding to edge)
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <code>$map_nav_bg</code><br>
+ <code>$nav_fg</code>
+ </td>
+ <td>
+ Mobile width, the header's colours; large width, the navigation's
+ foreground colour
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <code>$menu-image</code>
+ </td>
+ <td>
+ “Hamburger” menu colour (<code>menu-black</code> or
+ <code>menu-white</code>)
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <code>$col_click_map</code><br>
+ </td>
+ <td>
+ background of the "click map to report problem" banner on the
+ map page
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <code>$col_fixed_label</code><br>
+ <code>$col_fixed_label_dark</code>
+ </td>
+ <td>
+ background of the colour of the "fixed" label that appears on
+ fixed reports, and its darker underside
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <code>$col_big_numbers</code>
+ </td>
+ <td>
+ Colour to use for the step numbers on the front page.
+ </td>
+ </tr>
+</table>
+
+SCSS supports functions such as `darken` so you can specify colours that are
+calculated from other colours like this:
+
+ $col_click_map: #ee6040;
+ $col_click_map_dark: darken($col_click_map, 10%);
+
+For more about SCSS, see [the SASS website](http://sass-lang.com).
+
+
+### Run make_css so FixMyStreet's CSS uses the new values
+
+FixMyStreet now needs to absorb those changes by rebuilding the CSS. There's a
+task in the `bin` directory called `make_css` that will do this for you. You'll
+need to be logged into your shell in the `fixmystreet` directory as the site
+user, then do:
+
+ bin/make_css
+
+This will update the CSS files. You can run the command just for your cobrand
+by specifying the path to your cobrand’s SCSS as an argument, e.g.:
+
+ bin/make_css web/cobrands/fixmypark
+
+Keep an eye on the output of that command &mdash; if there's a problem (for
+example, if you've made a mistake in the SCSS syntax, which is easy to do), it
+will report it here.
+
+
+### See the new colours
+
+If you look at your site in a browser, you'll see the new colours. Remember
+that every time you edit them, you need to run `bin/make_css` to make
+FixMyStreet include the changes, or run `bin/make_css --watch` to have it
+monitor for changes itself.
+
+
+## Or... use your own CSS and HTML
+
+Remember that *all* you've done here is change the colours, **using the
+existing default CSS and HTML**. Of course any and all of this can be
+overridden (by overriding CSS files and overriding the bits of HTML that you
+want to change in the <a href="{{ "/glossary/#template" | relative_url }}"
+class="glossary__link">templates</a>) but this is just so you can get going.
+
+# Directionality
+
+If you wish to use FixMyStreet in a right-to-left layout, this is very
+straightforward and involves two steps:
+
+* First, uncomment the line in your cobrand’s `_colours.scss` file as explained,
+ so that the `$direction` variable is set to `right`.
+* Secondly, create a copy of the `templates/web/base/header.html` in
+ your own cobrand if you haven’t already (see
+ [template customising]({{ "/customising/templates/" | relative_url }}) for more
+ details) and uncomment the `SET` line that sets `dir="rtl"`.
+
+That’s it; recompile your CSS, reload your site and you will find that
+FixMyStreet has switched to a right-to-left layout. Your next step will
+probably be to [change the language]({{ "/customising/language/" | relative_url }})
+used by your site.
+
+# Next steps...
+
+If you want to customise the logo, [we have a tutorial for that](../logo/).
+
+Now you have your own cobrand, adding your own HTML <a
+href="{{ "/glossary/#template" | relative_url }}" class="glossary__link">templates</a> is straightforward.
+
+Please see our separate page on [customising templates]({{ "/customising/templates/" | relative_url }}).
+
+### Feeding back changes
+
+Finally, when you've finished creating your cobrand you should consider
+[feeding it back to us]({{ "/feeding-back" | relative_url }}) so it becomes part of the FixMyStreet repository.
diff --git a/docs/customising/fms_and_mapit.md b/docs/customising/fms_and_mapit.md
new file mode 100644
index 000000000..c02609404
--- /dev/null
+++ b/docs/customising/fms_and_mapit.md
@@ -0,0 +1,63 @@
+---
+layout: page
+title: How FixMyStreet assigns reports to bodies
+author: dave
+---
+
+# How FixMyStreet assigns reports to bodies
+
+<p class="lead">
+ When you add a <a href="{{ "/glossary/#body" | relative_url }}" class="glossary__link">body</a>
+ to FixMyStreet, you specify which <a href="{{ "/glossary/#area" | relative_url }}" class="glossary__link">areas</a>
+ it covers. The areas are typically defined by administrative boundaries: these
+ are <em>not</em> part of FixMyStreet, but are made available through our
+ service called <a href="{{ "/glossary/#mapit" | relative_url }}" class="glossary__link">MapIt</a>.
+</p>
+
+Note that MapIt tells FixMyStreet what administrative boundaries a point lies
+within: it does not actually draw the maps (by default, FixMyStreet uses
+<a href="{{ "/glossary/#osm" | relative_url }}" class="glossary__link">OpenStreetMap</a> for that).
+
+## How this works
+
+When someone places a pin on the FixMyStreet
+<a href="{{ "/glossary/#map" | relative_url }}" class="glossary__link">map</a>
+to report a problem, FixMyStreet sends the
+<a href="{{ "/glossary/#latlong" | relative_url }}" class="glossary__link">lat-long</a>
+coordinates of that position to MapIt. MapIt responds with a list of the areas
+that the pin lies within. FixMyStreet then looks in its own database to find
+all the bodies that cover that area, and the
+<a href="{{ "/glossary/#contact" | relative_url }}" class="glossary__link">contacts</a>
+(which are usually email addresses) that you have added for each of
+those bodies. Because each contact is associated with a
+<a href="{{ "/glossary/#category" | relative_url }}" class="glossary__link">category</a>
+of problem (for example, "Potholes" or "Graffiti"), FixMyStreet can build a
+list of all the problem categories that *can* be reported at this location. In
+fact, this list appears as the drop-down menu ("Pick a category") on the
+report-a-problem page.
+
+This means that your FixMyStreet installation must be able to connect to a
+MapIt service which knows about the administrative boundaries in your part of the
+world. [See below](#boundaries) for more about setting this up.
+
+## Detailed flow: location &rarr; map pin &rarr; drop-down menu
+
+![FMS bodies and contacts]({{ "/assets/img/fms_bodies_and_contacts.png" | relative_url }})
+
+<a name="boundaries"> </a>
+
+## How to set up the area boundaries
+
+The type of boundary data you need depends on a number of factors, but will
+probably be one of these:
+
+ * ["Everywhere"]({{ "/customising/boundaries/#everywhere" | relative_url }}) -- you can run FixMyStreet without a specific boundary
+ * [Simple approximate area]({{ "/customising/boundaries/#approx-area" | relative_url }}) -- that is, just one area around the place you need
+ * [Simple approximate areas]({{ "/customising/boundaries/#approx-areas" | relative_url }}) -- as above, but for multiple areas
+ * [Accurate OpenStreetMap data]({{ "/customising/boundaries/#mysociety-mapit" | relative_url }}) -- the preferred option
+ * [Accurate data that isn't on OSM]({{ "/customising/boundaries/#accurate" | relative_url }}) -- if you have your own boundary data, for example
+
+If you're not sure which is for you, read through the
+[whole page about admin boundaries]({{ "/customising/boundaries/" | relative_url }}).
+
+
diff --git a/docs/customising/geocoder.md b/docs/customising/geocoder.md
new file mode 100644
index 000000000..4dc44b507
--- /dev/null
+++ b/docs/customising/geocoder.md
@@ -0,0 +1,35 @@
+---
+layout: page
+title: How to customise the geocoder
+author: matthew
+---
+
+# How to customise the FixMyStreet geocoder
+
+<p class="lead">
+ The first step of using FixMyStreet is entering a string
+ that the needs to be <em>geocoded</em> to take you to a relevant map page.
+</p>
+
+See the diagram below for the full flow of using FixMyStreet. The geocoder is
+near the start of the process, before maps, MapIt boundaries or bodies enter
+the picture.
+
+The geocoder takes a string -- for example, the name of a place or a street --
+and converts it into a [lat-long]({{ "/glossary/#latlong" | relative_url }}) location.
+
+The geocoder defaults to OpenStreetMap's [Nominatim](http://nominatim.openstreetmap.org).
+FixMyStreet also contains Bing and Google based geocoders, and can use
+custom geocoders too.
+
+You can customise the geocoding by providing limiting parameters in
+<code><a href="{{ "/customising/config/#geocoding_disambiguation" | relative_url }}">GEOCODING_DISAMBIGUATION</a></code>.
+You typically need to do this so the geocoder only considers places in the area
+your FixMyStreet site is serving. For example, you may want to limit results to
+a specific country or city.
+
+The options vary [depending on which geocoder you use]({{ "/customising/config/#geocoding_disambiguation" | relative_url }}).
+
+## Detailed flow: location &rarr; map pin &rarr; drop-down menu
+
+![FMS bodies and contacts](/assets/img/fms_bodies_and_contacts.png)
diff --git a/docs/customising/index.md b/docs/customising/index.md
new file mode 100644
index 000000000..610e44ae3
--- /dev/null
+++ b/docs/customising/index.md
@@ -0,0 +1,82 @@
+---
+layout: page
+title: Customising
+---
+
+# Customising FixMyStreet
+
+<p class="lead">
+ When you set up your FixMyStreet site, you'll want to tailor the
+ default installation to your own requirements. This includes limiting
+ the geographic area it will accept problem reports for, the language
+ it's presented in, and how it looks.
+</p>
+
+
+## Your own cobrand
+
+Whatever you change, you'll almost certainly need to create a
+<a href="{{ "/glossary/#cobrand" | relative_url }}" class="glossary__link">cobrand</a>,
+which is the mechanism FixMyStreet uses to let you deviate from its default
+appearance and behaviour.
+
+As well as the
+[configuration settings]({{ "/customising/config/" | relative_url }}) you specify in
+the `conf/general.yml` file, a cobrand is made up of a set of templates, CSS,
+and an *optional* Cobrand module that contains custom Perl code. There are
+defaults for all of these, so the cobrand only needs to override things that are
+specific to it.
+
+We *strongly recommend* you follow this system -- rather than just editing
+existing files -- because it means that you'll be able to upgrade FixMyStreet
+without the updates overwriting your unique changes.
+
+It's a good idea for a cobrand to have the same name as your site. For example,
+if your site is `www.FixMyPark.com` then your cobrand could be called FixMyPark
+(with the "moniker" all lowercase, like this: `fixmypark`, which is used for
+things like directory names). The default cobrand is called Default (`default`).
+
+
+## What you can change
+
+There's a lot you can customise on your own FixMyStreet site.
+
+We've prepared a [customisation checklist]({{ "/customising/checklist/" | relative_url }})
+which covers all the key things you should work through when installing your own
+site.
+
+But if you just want to see what's possible, here are some of the
+aspects of FixMyStreet that you can customise:
+
+* [how to translate or change FixMyStreet's language]({{ "/customising/language/" | relative_url }})
+* [how FixMyStreet assigns reports to bodies]({{ "/customising/fms_and_mapit/" | relative_url }})
+* [how to customise the geocoder]({{ "/customising/geocoder/" | relative_url }})
+* [how to change the design]({{ "/customising/css/" | relative_url }})
+* [how to customise templates]({{ "/customising/templates/" | relative_url }})
+* [how reports are sent by FixMyStreet]({{ "/customising/send_reports/" | relative_url }})
+* [all the config settings]({{ "/customising/config/" | relative_url }})
+
+Note that none of the above require you to know or write any Perl (the language
+FixMyStreet is mostly written in).
+
+### The Cobrand module
+
+If you need more customistation than the config settings and templates give you,
+you'll probably need to make a Cobrand module. This is a Perl module that is automatically
+loaded according to the current cobrand -- you can see existing examples in
+[`perllib/FixMyStreet/Cobrand/`](https://github.com/mysociety/fixmystreet/tree/master/perllib/FixMyStreet/Cobrand).
+There is a default Cobrand
+([`Default.pm`](https://github.com/mysociety/fixmystreet/blob/master/perllib/FixMyStreet/Cobrand/Default.pm))
+that all Cobrands should inherit from. A Cobrand module can then override any
+of the methods from the default Cobrand.
+See [more about Cobrand modules](/customising/cobrand-module/).
+
+## Feeding back changes
+
+It would be great if the changes you make to the code could be fed back
+upstream to benefit other users. Obviously if you've only customised templates
+and CSS you may not feel you have to, but it's likely you'll have needed to
+make actual code changes for your particular environment, and feeding these
+back means it is easier to update the code from upstream in future to gain new
+features and bugfixes.
+See [more about feeding back changes]({{ "/feeding-back/" | relative_url }}).
diff --git a/docs/customising/integration.md b/docs/customising/integration.md
new file mode 100644
index 000000000..95806a039
--- /dev/null
+++ b/docs/customising/integration.md
@@ -0,0 +1,228 @@
+---
+layout: page
+title: Integration
+author: dave
+---
+
+# Integrating FixMyStreet with back-end systems
+
+<p class="lead">
+ By default, FixMyStreet uses email to send problem reports to the body
+ responsible for fixing them. But it's best if sending reports is
+ <strong>integrated</strong> directly, so that problems are injected directly
+ into the body's back-end system.
+</p>
+
+## Integrate if you can!
+
+Often <a href="{{ "/glossary/#body" | relative_url }}" class="glossary__link">bodies</a>,
+especially if they are local government bodies, already have databases and
+back-end systems for tracking problems they are fixing. FixMyStreet works fine
+if you just use the default <a href="{{ "/glossary/#send-method" | relative_url }}"
+class="glossary__link">send method</a>, which is email, but it's *much better* if you
+can integrate with the body's back-end systems.
+
+How hard this is depends on the kind of system the body is using, and how much
+cooperation they offer FixMyStreet. In general, once FixMyStreet is integrated
+it's *easier* for the body's staff to use.
+
+Our experience with FixMyStreet in the UK is that councils that integrate with
+FixMyStreet also choose to run it as a <a href="{{ "/glossary/#cobrand" | relative_url }}"
+class="glossary__link">cobrand</a> (that is, branded and on their own website). In
+fact, cobranding and integrating are not dependent on each other, so if you do
+one it is not necessary to do the other.
+
+## Levels of integration (and their benefits)
+
+<ol start="0">
+ <li>
+ <strong>no integration</strong> (the default)<br>
+ reports are sent by email
+ </li>
+ <li>
+ <strong>reports are injected directly into the back-end</strong>
+ <br>
+ so staff don't have to copy-and-paste from emails &mdash; furthermore,
+ if the body returns its own reference for the report, then FixMyStreet
+ can publish it
+ </li>
+ <li>
+ <strong>status changes on the back-end propogate to FixMyStreet</strong>
+ <br>
+ so staff don't have to log in to FixMyStreet and mark
+ problems as "fixed" by hand... and FixMyStreet publicises the
+ work that the authorities are doing
+ </li>
+ <li>
+ <strong>problems created in the back-end appear on FixMyStreet</strong>
+ <br>
+ so all the problems the body is working on are public
+ </li>
+</ol>
+
+Although you can approach each of these levels of integration as custom
+programming tasks, we *strongly recommend* you use the
+<a href="{{ "/glossary/#open311" | relative_url }}" class="glossary__link">Open311</a>
+open standard when you can.
+
+Strictly speaking it's possible to implement any of these levels independently
+of the others. In practice, though, each one tends to follow on from the
+previous one.
+
+## You don't need to integrate *everything*
+
+You can integrate with just one body (while the others continue to use email).
+You can even just integrate certain
+<a href="{{ "/glossary/#category" | relative_url }}" class="glossary__link">categories</a>
+for a body &mdash; for example, "Potholes" and "Fallen trees" could be
+submitted by Open311, while "Streetlighting" problems are sent by email.
+
+## No integration: send reports by email
+
+With **no integration**, problem reports are sent by email:
+
+<img src="/assets/img/fms_integration_0.png">
+
+
+## Stage 1: Injecting directly into the back-end
+
+With the **first level of integration**, problem reports are injected directly
+into back-end:
+
+<img src="/assets/img/fms_integration_1.png">
+
+
+If the body's server is already <a href="{{ "/glossary/#open311" | relative_url }}"
+class="glossary__link">Open311</a> compliant, you can switch on the first stage
+of integration -- which puts the problem report directly into the body's
+back-end system instead of emailing it -- just by setting the send method (for
+the body, or for specific categories) to Open311.
+
+To enable Open311 for a body, edit in in the admin and set **send method** to
+"Open311". A form will appear for Open311 connection details including, for
+example, the body's endpoint URL. It's common for Open311 endpoints to require
+an API key and possibly access criteria before they will accept Open311 service
+requests. You'll probably need to talk to the body's IT team to be granted
+access -- for example, they may only open a port to your server's single IP
+address.
+
+If you want to have the problem reports for some categories to be integrated
+into their body's back-end, but continue to send others by email, you can
+<a href="{{ "/glossary/#devolve" | relative_url }}"
+class="glossary__link">devolve</a>
+choosing the send method to the contacts. Set the body's send method as above,
+but also enable **contacts can be devolved**. Now you can set specific
+contacts' *send methods* to `email`, which will override the body's send method.
+
+### Passing external IDs between the two systems
+
+When a problem report is successfully posted to the body over Open311, usually
+the back-end responds with the body's reference. FixMyStreet stores this in the
+`problem` record as the `external_id` (because from FixMyStreet's point of view,
+the back-end is the external system).
+
+In our experience, bodies integrated in this way often want to know the
+FixMyStreet ID for the report, to store at their end. From the body's point of
+view, FixMyStreet is the external system, so we usually pass this to them in
+the Open311 POST request as `attribute[fixmystreet_id]`. If the body sets up
+their Open311 server to request this attribute, we will automatically fill it.
+If they want the field named differently, you will need to store it as the
+`id_field` extra metadata on the relevant contacts.
+
+### What if the back-end system is not Open311 compliant?
+
+If the body you want to integrate with does not yet support the Open311 standard,
+you can still integrate with it, but it takes a little more work. If the back-end
+offers an alternative way to post new problem reports into it, then you'll need to
+code it. Typically this could involve either adding a custom Perl module to
+`perlib/FixMyStreet/SendReport`, or writing a 'proxy' server that receives Open311
+data from FixMyStreet (so it *is* Open311 from FixMyStreet's point of view) and
+then sends on differently formatted data elsewhere.
+
+We *strongly recommend* you try to implement the Open311 standard instead, but
+you might well not be able to change the back-end system (often these are
+large, proprietary and inflexible systems), so you may be able to implement a
+shim that makes it behave like one. For example, in the UK we integrate with a
+number of councils whose back-end does not use the Open311 standard, by running
+a script either on our or their server, which accepts incoming Open311 requests
+and converts them into custom calls. The script captures the result and sends
+it back as the appropriate Open311 response. We have an
+[example](https://github.com/mysociety/open311-adapter) of one adapter we use
+on GitHub.
+
+The advantage of this approach is that, to FixMyStreet, the body uses the tried
+and tested Open311 send method. The benefit to the body is that should their
+back-end one day implement the Open311 standard, or they change to using one that
+does, then no changes will be necessary other than to remove the scripts.
+
+
+## Stage 2: Automatically updating problem statuses
+
+With the **second level of integration**, not only are reports injected
+directly into the back-end, but back-end status changes automatically propogate
+*back* to FixMyStreet:
+
+<img src="/assets/img/fms_integration_2.png">
+
+When the body fixes a problem, they mark it as fixed in their back-end system.
+Stage 2 integration detects this change and automatically updates the record
+on FixMyStreet. Typically this means marking the problem as fixed (turning the
+pin green, if configured to do so) and optionally adding a description from the
+council.
+
+A basic form of this is in the Open311 standard, but we prefer a slight extension
+(which we think should be: see [this
+explanation](https://www.mysociety.org/2013/02/20/open311-extended/)) and it
+requires the back-end to expose update data.
+
+Our experience is that most back-ends do not already provide this data, but that
+it is a relatively easy for them to implement if they choose to do so. For
+example, on a typical problem database, one method is to add a trigger that
+detects whenever the status of a problem changes (for example, is marked as
+fixed), and record the time and status change in a new table. FixMyStreet polls
+the back-end for updates within certain time bounds ("have any problems' statuses
+changed in the last 15 minutes?"), which effectively reads from
+this new table.
+
+FixMyStreet adds these changes automatically as updates on the public site: for
+example, marking a problem as fixed with either a custom comment send from the
+back-end or else a boilerplate one (for example, "Fixed by Borsetshire Council
+road crew").
+
+In order to set this up you first need to liaise with the body to make the
+update data available. You can then enable it by editing the body in the admin,
+and enabling **Open311 update-sending**. You also need to nominate a FixMyStreet
+user to which all these updates will be credited (for example, "Borsetshire
+Council") -- if necessary you can create a user just for this purpose at
+`/admin/users`.
+
+The mechanism we use for propogating fixes (and other status changes) from the
+back-end to the FixMyStreet site is deliberately light on the body. That is,
+once the body has implemented the update table (or its equivalent), FixMyStreet
+is responsible for polling the back-end -- there's no requirement for the body's
+system to do anything other than respond to these requests. Furthermore, when it
+does so, it uses the back-end's own reference (stored in FixMyStreet's database
+as the `external_id`) to identify problem reports, so there is no requirement
+to use the FixMyStreet ID. Because FixMyStreet polls regularly (typically
+every 15 minutes thoughout the day, with a single 24-hour mop-up once during
+the night), any problems connecting or tracking which updates have been picked
+up are handled at the FixMyStreet end.
+
+## Stage 3: Displaying problems not originating on FixMyStreet
+
+With the **third level of integration**, problems reported by staff on the
+back-end are shown on FixMyStreet too:
+
+<img src="/assets/img/fms_integration_3.png">
+
+The third level of integration is for *all* problem reports on the back-end to be
+displayed on the FixMyStreet system. Before doing this, you need to consider:
+
+ * how the body decides which, if any, reports should be excluded
+ * importing existing records (typically a big batch job, since there may be very many)
+ * ensuring imported categories all match
+ * ongoing acquisition of new records as they are added (feasible using Open311)
+
+Talk to us before doing this level of integration. Our experience is that levels
+1 and 2 are higher priority both for public users and for the authorities, so it's
+a good idea to implement those first.
diff --git a/docs/customising/language/index.md b/docs/customising/language/index.md
new file mode 100644
index 000000000..17cfec27b
--- /dev/null
+++ b/docs/customising/language/index.md
@@ -0,0 +1,140 @@
+---
+layout: page
+title: Changing the language
+---
+
+# Changing the language
+
+<p class="lead">Here we explain how to change what language is displayed on
+FixMyStreet, how to contribute your own if we don&rsquo;t have yours, and how to
+run a site in multiple languages.</p>
+
+## Setup
+
+The translations for most FixMyStreet strings are stored as standard
+<a href="{{ "/glossary/#gettext" | relative_url }}" class="glossary__link">gettext</a>
+files, in `FixMyStreet.po` files under `locale/<lang>/LC_MESSAGES/`. A
+few full pages, such as the FAQ, and emails, are stored separately in the
+templates directory and should be translated by creating new templates in your
+cobrand.
+
+
+Firstly, set the
+<code><a href="{{ "/customising/config/#languages" | relative_url }}">LANGUAGES</a></code>
+configuration option to the languages your site uses. This is an array of
+strings specifying what language or languages your installation uses. For
+example, if your site is available in English, French, and German, you would
+have:
+
+ LANGUAGES:
+ - 'en-gb,English,en_GB'
+ - 'fr,French,fr_FR'
+ - 'de,German,de_DE'
+
+This would then set up things appropriately to use the relevant language files
+you have made.
+
+You must make sure that the locale for any language you use is installed on the
+server in order for the translations to work properly. On Debian, you can alter
+`/etc/locale.gen` and run `sudo locale-gen`. On Ubuntu, you can just run `sudo
+locale-gen <LOCALE_NAME>`.
+
+## Seeing the site in your language
+
+By default, FixMyStreet is set up so visiting a hostname starting with the
+two-letter language code will use that language; otherwise it will detect based
+upon the browser. If you have used the install script on a clean server, or the
+AMI, you should be able to visit your domain with a language code at the start
+by default.
+
+Using the example above `http://fr.fixmystreet.com/` would display the
+French translation and `http://de.fixmystreet.com/` would display the
+German translation. If no language is specified in the URL, or an
+unsupported code is used then it will fall back to the language
+negotiated by the browser. If that language is not available,
+the first language listed in the `LANGUAGES` configuration option
+will be displayed.
+
+Note that this method only supports two letter language codes. This
+means you cannot use `sv-se` format strings to distingish regional
+variants in the hostname. However, the first part of the language string
+does not need to be an official language code so you can use it to allow
+regional variants, e.g:
+
+ LANGUAGES:
+ - 'sv,Svenska,sv_SE'
+ - 'sf,Svenska,sv_FI'
+
+`http://sv.fixmystreet.com` would display `sv_SE` and
+`http://sf.fixmystreet.com` would display `sv_FI`. However, this would
+not be detected automatically (at the bare domain) if the user's browser was
+set to sv-fi.
+
+These language links can be used for adding a language switcher to the
+site. For example, a basic two language switcher:
+
+ [% IF lang_code == 'fr' %]
+ <li><a href="https://en.[% c.cobrand.base_host %][% c.req.uri.path_query %]">English</a></li>
+ [% ELSE %]
+ <li><a href="https://fr.[% c.cobrand.base_host %][% c.req.uri.path_query %]">Français</a></li>
+ [% END %]
+
+## Ensuring links in emails default to the right language
+
+With the default configuration links in emails will use the `BASE_URL`
+and hence clicking on them means the user will see the browser
+negotiated language. This behaviour can be changed using the
+`base_url_with_lang` function in your Cobrand module which is used
+when generating URLs for emails.
+
+A basic version of this that supports two languages would look like
+like this:
+
+ sub base_url_with_lang {
+ my $self = shift;
+ my $base = $self->base_url;
+ my $lang = $mySociety::Locale::lang;
+ if ($lang eq 'fr') {
+ $base =~ s{https?://}{$&fr.};
+ } else {
+ $base =~ s{https?://}{$&en.};
+ }
+ return $base;
+ }
+
+The current language is stored when a report is made and this is used
+when sending out emails related to the report. When the email is sent
+this means that `$mySociety::Locale::lang` returns the language used at
+the time the report was submitted, hence the function above will return
+URLs for the correct language.
+
+## Contributing a translation
+
+If we don't already have a translation for the language you want, please do
+consider contributing one :) You can use our repository on
+[Transifex](https://www.transifex.com/projects/p/fixmystreet/),
+or translate the `.po` files directly using a local program such as
+[PoEdit](http://www.poedit.net/).
+
+The templates use the `loc` function to pass strings to gettext for
+translation. If you create or update a `.po` file, you will need to run the
+`commonlib/bin/gettext-makemo` script to compile these files into the machine
+readable format used by the site.
+
+## Translating the FAQ and other static pages
+
+Static pages do not use gettext so need to be translated separately by
+creating a new template under your cobrand, e.g. for a German
+translation of the FAQ:
+
+ templates/web/<cobrand>/about/faq-de.html
+
+For other languages the file should be `faq-<lang>.html`. If there is
+not a translated template it will fall back to `faq.html`.
+
+## Translating body names, categories, and report states
+
+As long as you have set up the <code>LANGUAGES</code> configuration first, you
+will find that in the admin you can give translations for each of body names,
+report categories, and report states. These translations will be used as
+appropriate depending upon the language of the front end.
diff --git a/docs/customising/language/technical.md b/docs/customising/language/technical.md
new file mode 100644
index 000000000..11a10a147
--- /dev/null
+++ b/docs/customising/language/technical.md
@@ -0,0 +1,38 @@
+---
+layout: page
+title: Adding new strings to FixMyStreet
+---
+
+# Adding new strings
+
+<p class="lead">Technical details for people who wish to add new strings for
+translation.</p>
+
+You will need to install the Locale::Maketext::Extract package in order to
+parse strings out of templates:
+
+ $ cpanm -l local-carton Locale::Maketext::Extract
+
+A new clean `.po` file, containing all the strings marked for translation in
+the code and templates, can be created by running the `bin/gettext-extract`
+script.
+
+ export PERL5LIB="local-carton/lib/perl5:local/lib/perl5"
+ export PATH="local-carton/bin:$PATH"
+ bin/gettext-extract
+
+To merge in new strings with the existing translations:
+
+ bin/gettext-merge
+
+To compile translations into `.mo` files:
+
+ commonlib/bin/gettext-makemo
+
+You may find it helpful to add an alias to your .gitconfig:
+
+ [alias]
+ podiff = "!f() { git diff --color $@ | grep -v '^ ' | grep -v @@ | grep -v '#:' | less -FRSX; }; f"
+
+Then `git podiff locale` will show you actual changes, rather than all the
+changes to comments and line numbers.
diff --git a/docs/customising/login.md b/docs/customising/login.md
new file mode 100644
index 000000000..4b9cc25f1
--- /dev/null
+++ b/docs/customising/login.md
@@ -0,0 +1,41 @@
+---
+layout: page
+title: Login/authenticaton
+author: matthew
+---
+
+# Customising login/authentication
+
+<p class="lead">
+ This page describes the different possible forms of logging in.
+</p>
+
+By default, FixMyStreet uses email or password authentication. Confirmation
+emails are sent containing a link, clicking which confirms the account (and
+optionally sets a password for future use).
+
+## Social authentication
+
+If you set up a Facebook or a Twitter App, and provide its configuration
+details in your `general.yml`, then your users will be able to verify
+reports/updates and log in using their social media account. Using this method,
+FixMyStreet will still ask for and confirm an email address (if one is not
+provided by Facebook). The login form on the site automatically adjusts
+to allow people to pick whether to use the social login or the default email
+authentication.
+
+The Facebook App's domain should be set to your site's domain, and under
+advanced settings the OAuth redirect URL should be yourdomain/auth/Facebook.
+
+## Text authentication
+
+If you set up a <a href="https://www.twilio.com/">Twilio</a> account and enter
+the correct parameters in your configuration, you can also activate text
+authentication, whereby instead of a confirmation email being sent, a
+confirmation text is sent to the user's mobile containing a code they enter on
+the site to continue with their report/update/logging in. The user flow
+behaviour is otherwise identical, it is merely using a phone number instead of
+an email for authentication.
+
+On their profile page, users can add email/phone number, and verify ones they
+may have entered previously but not verified.
diff --git a/docs/customising/logo.md b/docs/customising/logo.md
new file mode 100644
index 000000000..f7d39b5a1
--- /dev/null
+++ b/docs/customising/logo.md
@@ -0,0 +1,29 @@
+---
+layout: page
+title: Customising the logo
+author: matthew
+---
+
+# Customising the logo
+
+<p class="lead">
+ This page describes how to change the logo of your installation.
+</p>
+
+Do make sure you have followed the
+[initial CSS guide]({{ "/customising/css/" | relative_url }}) first to set up the
+initial CSS for your own cobrand.
+
+To use a different logo, by default you should have an image 175x35 in size,
+preferably placed in `web/cobrands/YOURCOBRAND/` somewhere. You should then set
+the `background-image` property of `#site-logo` in your `base.scss`. If you
+wish a differently sized logo, you will also need to set the `width`, `height`,
+and `background-size` properties of `#site-logo`. Note if you make it larger in
+height, you might also need to investigate e.g. `$mappage-header-height`.
+
+On fixmystreet.com we use a larger logo on the desktop front page; if you wish
+to do the same, in your `layout.scss` set the `background-image` of
+`body.frontpage #site-logo`, along with (as before) corresponding `width`,
+`height`, and `background-size`. See fixmystreet.com’s `layout.scss` for how it
+does it, though note it is a bit more complex as it uses SVG with a PNG
+fallback.
diff --git a/docs/customising/send_reports.md b/docs/customising/send_reports.md
new file mode 100644
index 000000000..22d46034d
--- /dev/null
+++ b/docs/customising/send_reports.md
@@ -0,0 +1,83 @@
+---
+layout: page
+title: How FixMyStreet sends reports
+author: dave
+---
+
+# How FixMyStreet sends reports
+
+<p class="lead">
+After a user submits a problem, FixMyStreet sends a <strong>problem report</strong> to the body responsible for fixing it. Typically, reports
+are sent by email. It's possible to override the content of the report (the email template), or even the way in which it is sent.
+</p>
+
+## Check and send every few minutes
+
+FixMyStreet runs a task called `send-reports` at regular intervals (by default this is every 5 minutes) that finds all new reports and sends them on to the bodies responsible.
+
+To change the frequency of this job, change the `crontab` settings. Suggested values are in `conf/crontab.example`. You'll need to understand the Unix crontab syntax to make sense of that file. Be careful editing it if you are not familiar with crontab, because the syntax is very precise.
+
+## Which reports are sent?
+
+The `send-reports` task finds all *confirmed* reports that have not yet been sent, and runs through each one, determines which body (or bodies) it needs to go to, and sends them.
+
+Reports are usually confirmed by the user clicking on the confirmation link in the email that was sent to them.
+
+Alternatively, a report is marked as confirmed if it was created after the user logged in either with a password or by clicking on a confirmation link in an email (a browser session).
+
+It's possible to add a user who repeatedly sends abusive reports to the abuse list -- reports created by such users are automatically hidden and are never sent. To add a user to the abuse list, in the admin go to any report they have created and click on **Ban email address**.
+
+## Where does the report get sent?
+
+FixMyStreet uses the location of the problem to identify which bodies may be responsible for fixing it, and then decides which contact (typically an email address) to use) based on the chosen category. This is described in more detail on the page about [FMS and MapIt](/customising/fms_and_mapit).
+
+The actual contacts can be added, changed, or deleted via the admin. See [managing bodies and contacts](/running/bodies_and_contacts) for details.
+
+## What gets sent?
+
+If the contact is an email (which is the simplest and most common form of report sending) then the email template `templates/email/default/submit.txt` is used. This is a simple text-based email with a simple preamble and all the useful details from the report.
+
+If you want to change this (which is a good idea) add your own `submit.txt` to `templates/email/your-cobrand-name/`.
+
+## How to know if a report has been sent
+
+The public view of the report shows this: it says how long after creation the
+report was sent (for example, "Sent to South Borsetshire District Council two
+minutes later"). Alternatively, find the report in `admin/reports` -- the
+report will show a "when sent" date if the `send-reports` task has processed
+it successfully.
+
+## Alternatives to email
+
+Although by default FixMyStreet sends reports by email, it's possible to inject reports *directly* into some
+bodies' databases or back-end systems. This is usually much better than using email because it's more convenient
+for the staff working at the receiving end. See
+[more about integration]({{ "/customising/integration/" | relative_url }}) for details.
+
+## Technical investigation
+
+If you have access to your server and are comfortable using the command line,
+you can manually run the `send-reports` script. Normally you never need to do
+this because, as described above, FixMyStreet runs it using `crontab` every
+five minutes. But if you're investigating why reports aren't sending, you can
+run the script manually. The `send-reports` script normally runs silently, that
+is, it produces no output (this is to prevent cron sending a logging email
+every time it runs, including the times there are no reports to send anyway).
+But if you want to see what's going on, you can use these options:
+
+ * the `--verbose` option prints out a summary of reports that did not get
+ sent. Incidentally, this option is useful even in
+ <a href="{{ "/glossary/#production" | relative_url }}" class="glossary__link">production</a>,
+ because it causes cron to send a logging email containing this summary of
+ failed-to-send reports if anything goes wrong.
+
+ * the `--debug` option prints out detail about the sending process as
+ it is being attempted. As the script loops through each of the reports
+ it's trying to send, it will try to print out useful information for each
+ attempt. It also makes it clear if the script hasn't found *any* reports
+ to send.
+
+For example, to run `send-reports` with debugging output, do:
+
+ bin/send-reports --debug
+
diff --git a/docs/customising/static-pages.md b/docs/customising/static-pages.md
new file mode 100644
index 000000000..38ab02d60
--- /dev/null
+++ b/docs/customising/static-pages.md
@@ -0,0 +1,35 @@
+---
+layout: page
+title: Adding static pages
+---
+
+# Adding static pages
+
+<p class="lead">How to add your own static pages to your installation.</p>
+
+If you wish to add a new static page to your site, then you can place a
+template file, say `team.html`, in the `templates/web/cobrand/about/`
+directory, where `cobrand` should be replaced with your cobrand name (as
+explained in [customising FixMyStreet templates](../templates/)).
+
+The page will then be available to view at `/about/team` on your site.
+
+Have a look at the existing files in `templates/web/base/about/` for an idea
+of the contents of a file – you need a header and a footer include, but other
+than that the contents are up to you.
+
+If you want the page to be available in multiple languages, then name your file
+`team-LANG.html` for each language and it will automatically be used. For
+example, if your site is available in Welsh and French, you could have
+`team-cy.html` and `team-fr.html`
+
+<hr>
+
+As a special case, if you create an `about/homepage.html` template file, then
+it will be used as the front page of your site, and the normal front page will
+instead be available at `/report`.
+
+<hr>
+
+If you wish to do more complex pages, or wish to then we recommend setting up
+e.g. a WordPress installation running at a subdomain of your site.
diff --git a/docs/customising/templates.md b/docs/customising/templates.md
new file mode 100644
index 000000000..793156f70
--- /dev/null
+++ b/docs/customising/templates.md
@@ -0,0 +1,113 @@
+---
+layout: page
+title: Customising templates
+---
+
+# Customising FixMyStreet templates
+
+<p class="lead">This document explains how template inheritance works
+and how to create your own custom templates.</p>
+
+When it's building a page, FixMyStreet always looks in your cobrand's web
+template directory first: if it finds a template there, it uses it, and if it
+doesn't it falls back and uses the `base` one instead.
+
+ <svg width="300" height="160" xmlns="http://www.w3.org/2000/svg">
+ <g>
+ <g id="fms-template-stack">
+ <g id="fms_template_base">
+ <rect stroke="#000000" id="svg_8" height="50.185915" width="222.884508" y="100.373239" x="38.557748" stroke-width="3" fill="#ffffff"/>
+ <text stroke="#000000" transform="matrix(0.738028 0 0 0.738028 5.23944 6.41831)" xml:space="preserve" text-anchor="middle" font-family="Monospace" font-size="29" id="svg_13" y="170.305344" x="196.145042" stroke-linecap="null" stroke-linejoin="null" stroke-dasharray="null" stroke-width="0" fill="#000000">base</text>
+ </g>
+ <g id="fms-template-cobrand">
+ <path stroke="#000000" id="svg_18" d="m136.165344,36.887947l0,44.606102l-12.435638,0l28.656036,28.656036l28.656052,-28.926376l-14.598373,0.54068l0,-45.146778l-30.278076,0.270336z" stroke-linecap="null" stroke-linejoin="null" stroke-dasharray="null" stroke-width="3" fill="#ffffff"/>
+ <rect stroke="#000000" id="svg_11" height="50.185915" width="174.91267" y="15.5" x="62.543663" stroke-width="3" fill="#ffffff"/>
+ <text stroke="#000000" transform="matrix(0.738028 0 0 0.738028 5.23944 6.41831)" xml:space="preserve" text-anchor="middle" font-family="Monospace" font-size="29" id="svg_14" y="55.305344" x="196.145046" stroke-linecap="null" stroke-linejoin="null" stroke-dasharray="null" stroke-width="0" fill="#000000">your_cobrand</text>
+ <rect stroke="#000000" stroke-opacity="0" id="svg_19" height="5.660965" width="28.055539" y="62.210247" x="137.293877" stroke-linecap="null" stroke-linejoin="null" stroke-dasharray="null" stroke-width="3" fill="#ffffff"/>
+ </g>
+ </g>
+ </g>
+ </svg>
+
+To see how this works, look at some of the cobrands that already exist in the
+`templates/web` directory. You need to create a new directory with your
+cobrand's name: for example, do:
+
+ mkdir templates/web/fixmypark
+
+Then, to override an existing template, copy it into the
+`templates/web/fixmypark/` directory and edit it there. You *must* use the
+same directory and file names as in the parent cobrand (that is, in
+`templates/web/base`).
+
+<div class="attention-box">
+ <strong>Please note:</strong> only make template files for those things you
+ need to do differently; you do not need to copy all the files into your own
+ templates folder. If the change you want to make is very small to the
+ base template, you could consider just adding an <code>IF</code>
+ statement to that parent template instead. The
+ <a href="/feeding-back/">Feeding back page</a> has more details.
+</div>
+
+One template you will probably want to override is the `site-name.html`, which
+contains the name of your site for use in various other templates, and e.g. the
+site's &lt;title&gt;. Copy this template into your cobrand like this:
+
+ cp templates/web/base/site-name.html templates/web/fixmypark/
+
+Or it’s likely you’ll want to change the footer template, which puts text right
+at the bottom of every page. Copy the footer template into your cobrand like
+this:
+
+ cp templates/web/base/footer.html templates/web/fixmypark/
+
+The templates use the popular <a
+href="http://www.template-toolkit.org">Template Toolkit</a> system &mdash; look
+inside and you'll see HTML with placeholders like `[% THIS %]`. The `[% INCLUDE
+...%]` marker pulls in another template, which, just like the footer, you can
+copy into your own cobrand from `fixmystreet` or `base` and edit.
+
+<div class="attention-box warning">
+ One thing to be careful of: <strong>only edit the <code>.html</code> files</strong>. FixMyStreet
+ generates <code>.ttc</code> versions, which are cached copies &mdash; don't edit these, they
+ automatically get created (and overwritten) when FixMyStreet is running.
+</div>
+
+The other template you will probably make your own version of is the FAQ which
+is in `templates/web/base/about/faq-en-gb.html`. If you translate it too,
+you will need to rename it accordingly.
+
+## Emails
+
+There are also email templates that FixMyStreet uses when it constructs email
+messages to send out. You can override these in a similar way: look in the
+`templates/email` directory and you'll see cobrands overriding the templates in
+`templates/email/default`.
+
+For example, many of the email templates themselves use the small
+`site-name.txt` and `signature.txt` templates, so you may want to override
+these (by copying them from `templates/email/default` into your own cobrand's
+directory within `templates/email`, and editing them) even if you're not
+changing anything else. On the other hand, you may wish to create new versions
+of all the emails in order to translate them.
+
+<div class="attention-box helpful-hint">
+Please do not translate the `Subject:` at the beginning of the first line, as
+that is used by the code to locate the Subject line of the email.
+</div>
+
+You may also send out HTML emails, by creating templates with an `.html`
+extension as well as the plain text `.txt` one. In order to save you a lot of
+time making working HTML emails, you may want to override the
+`_email_color_overrides.html` and `_email_setting_overrides.html` templates to
+set your own colours/branding, and then only copy other HTML templates to
+translate or otherwise change the wording.
+
+To preview HTML emails, when running the development server go to `/_dev/email/`
+and click the email you wish to preview.
+
+To include an inline logo in your HTML email, put it at
+`web/cobrands/yourcobrands/images/email-logo.gif` and make sure `logo_width`
+and `logo_height` are set appropriately in your
+`_email_setting_overrides.html`. The email template should then pick it up
+automatically.
diff --git a/docs/directory_structure.md b/docs/directory_structure.md
new file mode 100644
index 000000000..5b9e8077d
--- /dev/null
+++ b/docs/directory_structure.md
@@ -0,0 +1,315 @@
+---
+layout: page
+title: Directory structure
+---
+
+
+# The FixMyStreet platform's directory structure
+
+<p class="lead">This page gives you an overview of where to find things in FixMyStreet's
+directories.</p>
+
+You'll probably never need to worry about this if you're just
+installing FixMyStreet -- this is really more useful if you're a developer
+planning on making more substantive changes to the code (and if you do,
+remember to read the page about [feeding your changes back](/feeding-back)).
+
+FixMyStreet uses [Catalyst](http://www.catalystframework.org/), which is a
+common Perl "Model-View-Controller" web framework. Again, you don't need to be
+familiar with Catalyst to install or even work on the code, especially if all
+you're doing is [customising your installation](/customising).
+
+## Key directories and what they're for
+
+<dl class="dir-structure">
+ <dt>
+ bin
+ </dt>
+ <dd>
+ <p><em>scripts for system tasks</em></p>
+ <p>
+ For example, scripts used for installation or set-up, such as <code>make_css</code>,
+ and cron jobs (that is, those tasks that must be run at regular intervals,
+ such as <code>send-reports</code>).
+ </p>
+ </dd>
+ <dt>
+ commonlib
+ </dt>
+ <dd>
+ <p><em>mySociety's library of common functions</em></p>
+ <p>
+ We maintain a <a href="https://github.com/mysociety/commonlib/">common library</a> that
+ we use across many of our projects (not just FixMyStreet). This is implemented as a
+ <a href="http://git-scm.com/book/en/Git-Tools-Submodules">git submodule</a>,
+ so FixMyStreet contains it even though the code is separate. Normally, you
+ don't need to think about this (because git handles it automatically)... but if you
+ really <em>do</em> need to change anything here, be aware that it is a separate git repository.
+ </p>
+ </dd>
+ <dt>
+ conf
+ </dt>
+ <dd>
+ <p><em>configuration files</em></p>
+ <p>
+ The primary configuration file is <code>general.yml</code>. This file isn't in the git
+ repository (since it will contain information specific to your installation, including
+ the database password), but example files are.
+ See <a href="{{ "/customising/config/" | relative_url }}">details of all
+ configuration settings</a>.
+ </p>
+ </dd>
+ <dt>
+ data
+ </dt>
+ <dd>
+ <p><em>data files</em></p>
+ </dd>
+ <dt>
+ db
+ </dt>
+ <dd>
+ <p><em>database SQL</em></p>
+ <p>
+ The <code>db</code> directory contains SQL for creating the tables and seeding some of the data &mdash;
+ for example, <code>schema.sql</code> contains the full database structure, and you use this when
+ you first create the database (see <em>2. Create a new PostgreSQL database</em> in the
+ <a href="{{ "/install/" | relative_url }}">installation instructions</a> if you're installing manually).
+ </p>
+ <p>
+ By convention, we also put "migration" SQL in here, so if the schema has changed since you installed and
+ you need to add new fields, you'll find the individual changes you need to apply here.
+ </p>
+ </dd>
+ <dt>
+ local
+ </dt>
+ <dd>
+ <p><em>local (as opposed to system-wide) Perl libraries</em></p>
+ <p>
+ FixMyStreet installs its local CPAN modules here. These are populated by the script
+ <code>bin/install_perl_modules</code>.
+ </p>
+ </dd>
+ <dt>
+ locale
+ </dt>
+ <dd>
+ <p><em>translations (internationalisation/i18n)</em></p>
+ <p>
+ The translation strings are stored in <code>.po</code> files in directories specific to
+ the locale and encoding. For example, <code>nn_NO.UTF-8/</code> contains the translations
+ for the Norwegian site. See more about
+ <a href="{{ "/customising/language/" | relative_url }}">translating FixMyStreet</a>.
+ </p>
+ </dd>
+ <dt>
+ notes
+ </dt>
+ <dd>
+ <p><em>documentation notes</em></p>
+ <p>
+ These are technical notes. This is in addition to the
+ <a href="https://fixmystreet.org/">core documentation</a> &mdash; which you are reading now &mdash;
+ which is actually stored in the git repository in the <code>gh-pages</code> branch, and published
+ as GitHub pages.
+ </p>
+ </dd>
+ <dt>
+ perllib
+ </dt>
+ <dd>
+ <p><em>the main application code</em></p>
+ <dl>
+ <dt>
+ Catalyst
+ </dt>
+ <dd>
+ <p><em>the Catalyst framework's own files &mdash; not FixMyStreet-specific</em></p>
+ </dd>
+ <dt>
+ DBIx
+ </dt>
+ <dd>
+ <p><em>database bindings</em></p>
+ </dd>
+ <dt>
+ FixMyStreet
+ </dt>
+ <dd>
+ <p><em>the core FixMyStreet Catalyst application</em></p>
+ <dl>
+ <dt>
+ App
+ </dt>
+ <dd>
+ <p><em>the core FixMyStreet program code</em></p>
+ <dl>
+ <dt>
+ Controller
+ </dt>
+ <dt>
+ Model
+ </dt>
+ <dt class="last">
+ View
+ </dt>
+ </dl>
+ </dd>
+ <dt>
+ Cobrand
+ </dt>
+ <dd>
+ Contains the <a href="{{ "/customising/cobrand-module/" | relative_url }}">Cobrand modules</a>, which you
+ can use if you need to add custom behaviour beyond that provided by config
+ and template changes.
+ See <a href="{{ "/customising/" | relative_url }}">more abobut customising</a> your site.
+ </dd>
+ <dt>
+ DB
+ </dt>
+ <dd>
+ <p><em>code for handling model data from the database</em></p>
+ <dl>
+ <dt>
+ Result
+ </dt>
+ <dt class="last">
+ ResultSet
+ </dt>
+ </dl>
+ </dd>
+ <dt>
+ GeoCode
+ </dt>
+ <dt>
+ Map
+ </dt>
+ <dt>
+ Roles
+ </dt>
+ <dt class="last">
+ SendReport
+ </dt>
+ <dd class="last">
+ <p><em>code for handling report sending</em></p>
+ <p>
+ In addition to email and Open311, this is where the
+ custom
+ <a href="{{ "/customising/integration/" | relative_url }}">back-end integrations</a>
+ are found.
+ </p>
+ </dd>
+ </dl>
+ </dd>
+ <dt>
+ Geo
+ </dt>
+ <dt class="last">
+ Open311
+ </dt>
+ <dd class="last">
+ <p>
+ <em>code for implementing FixMyStreet's <a href="{{ "/glossary/#open311" | relative_url }}" class="glossary__link">Open311</a> functionality</em>
+ </p>
+ </dd>
+ </dl>
+
+ </dd>
+ <dt>
+ script
+ </dt>
+ <dd>
+ <p><em>Catalyst scripts</em></p>
+ <p>
+ For example, <code>fixmystreet_app_server.pl</code> for running the Catalyst development server.
+ </p>
+ </dd>
+ <dt>
+ t
+ </dt>
+ <dd>
+ <p><em>tests</em></p>
+ <p>
+ FixMyStreet's test suite runs under <a href="http://perldoc.perl.org/5.8.9/prove.html">prove</a>.
+ </p>
+ </dd>
+ <dt>
+ templates
+ </dt>
+ <dd>
+ <p>
+ <em>email and web templates</em>
+ </p>
+ <p>
+ These are templates for the email messages that FixMyStreet sends, and the web pages it
+ shows, in cobrand-specific directories. If no template can be found for a specific
+ email or web page in the required cobrand, FixMyStreet uses the template in
+ <code>default/</code>. In this way, cobrands only need to override templates that
+ differ from FixMyStreet's default &mdash; it's feasible for your cobrand's template
+ directories to be empty.
+ See <a href="{{ "/customising/" | relative_url }}">more abobut customising</a> your site.
+ </p>
+ <dl>
+ <dt>
+ email
+ </dt>
+ <dd>
+ Template files for the email messages that FixMyStreet sends, as <code>.txt</code>
+ text files.
+ </dd>
+ <dt class="last">
+ web
+ </dt>
+ <dd class="last">
+ <p>
+ Template files for the web pages.
+ The templates, which all have the extension <code>.html</code>, use the popular
+ <a href="http://www.template-toolkit.org">Template Toolkit</a> system.
+ </p>
+ <p>
+ FixMyStreet stores compiled templates, created on demand with the extension
+ <code>.ttc</code>, alongside the template files. Don't edit these files: edit
+ the <code>.html</code> ones, and FixMyStreet will overwrite the <code>.ttc</code>
+ files automatically.
+ </p>
+ </dd>
+ </dl>
+ </dd>
+ <dt class="last">
+ web
+ </dt>
+ <dd class="last">
+ <p><em>static resources for the web pages, including stylesheets, javascript, images</em></p>
+ <dl>
+ <dt>cobrands</dt>
+ <dd>
+ <p><em>resources specific to cobrands</em></p>
+ <p>For example, if your installation has its own logo, put it here.</p>
+ </dd>
+ <dt>css</dt>
+ <dd>
+ <p><em>some core SCSS definitions</em></p>
+ </dd>
+ <dt>i</dt>
+ <dd>
+ <p><em>images</em></p>
+ <p>
+ Images, including navigation icons and sprites, used by the default site (and hence
+ available to other cobrands too) &mdash; for example <code>pin-green.png</code>
+ is the green pin used on most cobrand's maps.
+ </p>
+ </dd>
+ <dt>iphone</dt>
+ <dt>js</dt>
+ <dd>
+ <p><em>JavaScript files</em></p>
+ </dd>
+ <dt class="last">posters</dt>
+ </dl>
+ </dd>
+</dl>
+
+We've missed out some of the less important subdirectories here just to keep
+things clear.
diff --git a/docs/favicon.ico b/docs/favicon.ico
new file mode 100644
index 000000000..65b59218e
--- /dev/null
+++ b/docs/favicon.ico
Binary files differ
diff --git a/docs/feeding-back.md b/docs/feeding-back.md
new file mode 100644
index 000000000..a52b030a3
--- /dev/null
+++ b/docs/feeding-back.md
@@ -0,0 +1,90 @@
+---
+layout: page
+title: Feeding back your changes
+---
+
+# Feeding back your changes
+
+<p class="lead">We want people using the code to keep it as up to date as they can, so that
+they gain the benefits of any changes made to the code by us or by other users.
+To do this, we need your help when you are making changes to the code, feeding
+the changes back to us and <a href="{{ "/updating/" | relative_url }}">updating your code</a>.</p>
+
+**If you haven't done this, don't panic!**
+Everything is solvable, and we fully understand that what little
+time you have has been better spent getting the code to work at all for you
+than to make sure it was done in the best possible way for the future. Get in
+touch to discuss how best we can bring things together.
+
+## 0. Setting up a fork of the repository to work on
+
+Firstly, fork our repository on GitHub -- go to
+[https://github.com/mysociety/fixmystreet](https://github.com/mysociety/fixmystreet)
+and hit the Fork button.
+
+If you've run the install script or used the AMI, the checkout there will be
+pointing at the mysociety repository. Let's add a new remote pointing at your
+fork, replacing username with your GitHub username:
+
+ git remote add fork https://github.com/<username>/fixmystreet
+ git fetch fork
+ git checkout -b our-master
+ git push -u fork our-master
+
+You can then make commits on the our-master branch. To then push your commits
+to your fork, you would use:
+
+ git push fork our-master
+
+## 1. Make small, atomic changes
+
+Git is easiest to work with if you make small, coherent commits, with good
+commit messages. That way, it is easier to rearrange and adjust in order to get
+things back upstream with pull requests and merges.
+
+Even if you're working on your own on a fork, please do use git appropriately,
+because that will only make it easier to integrate changes in the future. If
+you simply edit files without any sort of version control, you will make things
+very hard for yourself as well as for us.
+
+## 2. Only make the minimal changes necessary
+
+Please do not copy all the templates and all the stylesheets into your own
+cobrand directories and then hack them until they work how you want. If you do
+that, you will find it very hard to incorporate any changes and fixes to the
+parent templates/CSS that are made, as your own forked copies will override
+them.
+
+Instead, copy only the templates, or bits of templates, you need, and inherit
+the existing CSS and change only what you need to change. If you only want to
+change one bit of a template, consider the following options:
+
+1. If it's a tiny one line change, perhaps simply add an `IF` statement to the
+template using `c.cobrand.moniker`. There are many such examples in the
+existing templates.
+2. If it's slightly larger, think about creating a new template containing the
+relevant bit of this template, which you can then override in your cobrand
+template directory. Again, there are many existing examples.
+3. Only now consider copying a whole template, if you need to make substantial
+changes to the parent. And be aware of having to notice changes to the parent
+that might affect your copy.
+
+If you need to change the CSS, override it in your cobrand's `base.scss` or
+`layout.scss` -- consider if the CSS could be changed, e.g. a variable added,
+in order to reduce the amount of overriding needed. But in general the amount
+needed is not large.
+
+## 3. Changing the core code
+
+If you need to make a change to some code that isn't in your cobrand's
+templates, front end files, or cobrand `.pm` file, which may be necessary,
+consider that other people may already be using the existing code. Can you add
+a hook to a function in your cobrand file, so current users are unaffected? Do
+feel free to [ask on the mailing list](/community/) about your proposed changes
+and how best they could be implemented.
+
+Please implement your changes in a fork of the repository on GitHub and submit
+a pull request as soon as you can so that the changes can be discussed and
+incorporated as soon as possible, reducing the amount of time your code and
+upstream are apart.
+
diff --git a/docs/glossary.md b/docs/glossary.md
new file mode 100644
index 000000000..47728c7b5
--- /dev/null
+++ b/docs/glossary.md
@@ -0,0 +1,1267 @@
+---
+layout: page
+title: Glossary
+---
+
+FixMyStreet glossary
+====================
+
+<p class="lead">Glossary of terms for FixMyStreet, mySociety's geographic
+problem reporting platform.</p>
+
+The [FixMyStreet](https://www.fixmystreet.com/) Platform is an open source
+project to help people run websites for reporting common street problems such
+as potholes and broken street lights to an appropriate authority. For
+technical information, see
+[fixmystreet.org](https://fixmystreet.org/).
+
+## Definitions
+
+<ul class="definitions">
+ <li><a href="#abuse-list">abuse list</a></li>
+ <li><a href="#area">admin boundary</a></li>
+ <li><a href="#administrator">administrator</a></li>
+ <li><a href="#alert">alert</a></li>
+ <li><a href="#area-type">area type</a></li>
+ <li><a href="#abuse-list">banning</a></li>
+ <li><a href="#body">body</a></li>
+ <li><a href="#catalyst">Catalyst</a></li>
+ <li><a href="#category">category</a></li>
+ <li><a href="#cobrand">cobrand</a></li>
+ <li><a href="#config-variable">config variable</a></li>
+ <li><a href="#token">confirmation</a></li>
+ <li><a href="#contact">contact</a></li>
+ <li><a href="#council">council</a></li>
+ <li><a href="#dashboard">dashboard</a></li>
+ <li><a href="#development">development site</a></li>
+ <li><a href="#devolve">devolved contacts</a></li>
+ <li><a href="#flagged">flagged</a></li>
+ <li><a href="#geocoder">geocoder</a></li>
+ <li><a href="#gettext">gettext</a></li>
+ <li><a href="#git">git</a></li>
+ <li><a href="#kml">KML</a></li>
+ <li><a href="#integration">integration</a></li>
+ <li><a href="#latlong">lat-long</a></li>
+ <li><a href="#locale">locale</a></li>
+ <li><a href="#map">map</a></li>
+ <li><a href="#mapit">MapIt</a></li>
+ <li><a href="#message-manager">Message Manager</a></li>
+ <li><a href="#open311">Open311</a></li>
+ <li><a href="#partial">partial report</a></li>
+ <li><a href="#production">production site</a></li>
+ <li><a href="#report">problem report</a></li>
+ <li><a href="#sms">SMS</a></li>
+ <li><a href="#survey">questionnaire</a></li>
+ <li><a href="#send-method">send method</a></li>
+ <li><a href="#staff-user">staff users</a></li>
+ <li><a href="#staging">staging site</a></li>
+ <li><a href="#state">state</a></li>
+ <li><a href="#survey">survey</a></li>
+ <li><a href="#template">template</a></li>
+ <li><a href="#token">token</a></li>
+ <li><a href="#update">update</a></li>
+ <li><a href="#user-account">user account</a></li>
+</ul>
+
+<dl class="glossary">
+
+ <dt>
+ <a name="abuse-list">abuse list</a> (also banning)
+ </dt>
+ <dd>
+ The <strong>abuse list</strong> is a list of email addresses that are
+ banned from using the site for misuse. In our experience, this is rare;
+ but, for example, a user who repeatedly posts offensive or vexatious <a
+ href="#report" class="glossary__link">problem reports</a> may be blocked in this
+ way.
+ <div class="more-info">
+ <p>More information:</p>
+ <ul>
+ <li>
+ See <a href="{{ "/running/users/" | relative_url }}">About users</a> for more about managing
+ abusive users.
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <a name="administrator">administrator</a>
+ </dt>
+ <dd>
+ An <strong>administrator</strong> is a user who has access to the back-end
+ admin (so can do things like add or edit <a href="#body"
+ class="glossary__link">bodies</a>, modify <a href="#report"
+ class="glossary__link">problem reports</a>, and <a href="{{ "/running/users/" | relative_url }}">manage
+ users</a>). An administrator should also have access to the email account
+ to which user support emails are sent.
+ <p>
+ Depending on how the site has been configured, this may be a regular
+ FixMyStreet <a href="#user-account" class="glossary__link">user</a>. However,
+ often it's an <code>htauth</code> user instead (which is a user managed
+ by the webserver, rather than the FixMyStreet application itself).
+ </p>
+ <div class="more-info">
+ <p>More information:</p>
+ <ul>
+ <li>
+ See also <strong><a href="#staff-user" class="glossary__link">staff
+ user</a></strong>, which is a FixMyStreet user who works for a <a
+ href="#body" class="glossary__link">body</a>.
+ </li>
+ <li>
+ See the <a href="{{ "/running/admin_manual/" | relative_url }}">Administrator's Manual</a> for
+ details of what an administrator does.
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <a name="alert">alert</a>
+ </dt>
+ <dd>
+ FixMyStreet users can subscribe to emails (or RSS feeds) which will notify
+ them when reports or updates are made within a certain area. These notifications
+ are called <strong>alerts</strong>.
+ <p>
+ Users can subscribe to various alerts - for example, all reports made
+ within a body, or within a certain distance of their chosen location
+ </p>
+ <p>
+ Alerts are available on the FixMyStreet site at <code>/alert</code>.
+ </p>
+ </dd>
+
+ <dt>
+ <a name="area">area</a> (also administrative boundary)
+ </dt>
+ <dd>
+ FixMyStreet uses <strong>areas</strong> to determine which <a href="#body"
+ class="glossary__link">bodies</a> are responsible for handling problems at a
+ specific location. When a user clicks on the <a href="#map"
+ class="glossary__link">map</a>, FixMyStreet finds all the bodies that are responsible
+ for that area. Technically, an area comprises one or more polygons on a
+ map &mdash; either those areas already exist (from <a href="#osm"
+ class="glossary__link">OpenStreetMap</a>, for example) or you can provide your
+ own. You can add your own areas to <a href="#mapit"
+ class="glossary__link">MapIt</a> by drawing them on a map, or importing
+ shapefiles from other mapping applications.
+ <p>
+ The
+ <code><a href="{{ "/customising/config/#mapit_id_whitelist" | relative_url }}">MAPIT_ID_WHITELIST</a></code>
+ config setting can explicitly list the <em>only</em>
+ areas your installation will recognise &mdash; alternatively, you can
+ limit them by <a href="#area-type" class="glossary__link">area type</a>
+ instead.
+ </p>
+ <div class="more-info">
+ <p>More information:</p>
+ <ul>
+ <li>
+ See <a href="{{ "/customising/boundaries/" | relative_url }}">more about boundaries</a>
+ and the different ways to set them up.
+ </li>
+ <li>
+ See <a href="{{ "/customising/fms_and_mapit/" | relative_url }}">How FixMyStreet uses
+ MapIt</a> for more about how bodies relate to <a href="#area"
+ class="glossary__link">areas</a>.
+ </li>
+ <li>
+ See the <a href="http://global.mapit.mysociety.org/">global MapIt
+ website</a> for more about the service.
+ </li>
+ <li>
+ Every area has an <strong><a href="#area-type" class="glossary__link">area
+ type</a></strong> which indicates what level of administration
+ boundary it represents.
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <a name="area-type">area type</a>
+ </dt>
+ <dd>
+ The <a href="#area" class="glossary__link">areas</a> that <a href="#mapit"
+ class="glossary__link">MapIt</a> returns are administrative boundaries. In
+ addition to each boundary's geometry (that is, its actual shape on the
+ map), MapIt also identifies what <strong>area type</strong> it is. The
+ area type indicates what level of administrative boundary that area
+ represents &mdash; for example, a national border, or the boundary of a
+ province, or a ward, and so on.
+ <p>
+ The
+ <code><a href="{{ "/customising/config/#mapit_types" | relative_url }}">MAPIT_TYPES</a></code>
+ config setting specifies the area types your installation uses.
+ </p>
+ <p>
+ These types' actual values vary depending on the source of the data. For
+ example, if you're using our global MapIt, these will look like
+ <code>O02</code>, <code>O03</code>, <code>O04</code> and so on (because
+ those are the values <a href="#osm" class="glossary__link">OpenStreetMap</a>
+ uses, from where global MapIt gets its data). OpenStreetMap's codes get
+ higher as the boundaries get more local: <code>O02</code> indicates a
+ <em>national boundary</em>, codes <code>O03</code> and above are for
+ subnational areas. The exact meaning of such boundaries varies according
+ to the administrative hierarchy of the specific country.
+ </p>
+ <div class="more-info">
+ <p>More information:</p>
+ <ul>
+ <li>
+ See <a href="{{ "/customising/boundaries/" | relative_url }}">more about boundaries</a>
+ and the different ways to set them up.
+ </li>
+ <li>
+ See <a href="{{ "/customising/fms_and_mapit/" | relative_url }}">How FixMyStreet uses
+ MapIt</a> for more about how bodies relate to <a href="#area"
+ class="glossary__link">areas</a>.
+ </li>
+ <li>
+ See the <a href="http://global.mapit.mysociety.org/">global MapIt
+ website</a> for more about the service.
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <a name="body">body</a>
+ </dt>
+ <dd>
+ A <strong>body</strong> is the authority responsible for a problem. Bodies
+ can be councils, local government departments (such as the Department of
+ Public Works, or the Highways Department), or even private companies that
+ are paid to fix particular problems.
+ <div class="more-info">
+ <p>More information:</p>
+ <ul>
+ <li>
+ See <a href="{{ "/running/bodies_and_contacts/" | relative_url }}">Managing bodies and
+ contacts</a> for how to set these up.
+ </li>
+ <li>
+ See <a href="{{ "/customising/fms_and_mapit/" | relative_url }}">How FixMyStreet uses
+ MapIt</a> for more about how bodies relate to <a href="#area"
+ class="glossary__link">areas</a>.
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <a name="catalyst">Catalyst</a> (Perl framework)
+ </dt>
+ <dd>
+ FixMyStreet is written in Perl, and uses the <strong>Catalyst</strong>
+ framework. For basic customisation you don't need to write any Perl &mdash;
+ you can get a site up and running with your own colours, logo, and location
+ without needing to do any programming. But if you do need to look into the
+ source code, you'll find the Catalyst framework helps, because it's a
+ "Model-View-Controller" framework (which is common in web applications).
+ <div class="more-info">
+ <p>More information:</p>
+ <ul>
+ <li>
+ See the <a href="{{ "/directory_structure/" | relative_url }}">FixMyStreet
+ directory structure</a> explained.
+ </li>
+ <li>
+ If you need to understand more about the framework, see the
+ <a href="http://www.catalystframework.org">Catayst project website</a>.
+ </li>
+ <li>
+ More about
+ <a href="{{ "/customising/" | relative_url }}">customising FixMyStreet</a>.
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <a name="category">category</a>
+ </dt>
+ <dd>
+ <strong>Categories</strong> describe the different types of problem that a
+ user can report, for example, "Pothole", or "Graffiti". The names of these
+ categories are displayed in the drop-down menu when the user reports a
+ problem. FixMyStreet uses the category, together with the <a href="#area"
+ class="glossary__link">area</a>, to determine which <a href="#contact"
+ class="glossary__link">contact</a> will be sent the report.
+ <div class="more-info">
+ <p>More information:</p>
+ <ul>
+ <li>
+ See <a href="{{ "/running/bodies_and_contacts/" | relative_url }}">Managing bodies and
+ contacts</a> for how to set these up.
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <a name="cobrand">cobrand</a>
+ </dt>
+ <dd>
+ FixMyStreet uses a system of cobranding to customise the
+ way the site looks and behaves. This can be as simple as changing the
+ colour scheme and logo, right through to overriding specific behaviour with
+ custom Perl code. Each <strong>cobrand</strong> has a name which the FixMyStreet
+ code uses when deciding which style and behaviour to apply.
+ <p>
+ For a live example of cobranding, consider two sites in the UK. Our <a
+ href="https://www.fixmystreet.com/">FixMyStreet site</a> runs with the
+ <code>fixmystreet</code> cobrand, which has a yellow-and-asphalt
+ appearance, and has an example street from the city of Manchester in the
+ "enter a street name" box. But the <a
+ href="https://fixmystreet.oxfordshire.gov.uk/">Oxfordshire site</a> is
+ running the <code>oxfordshire</code> cobrand, which makes the site green
+ and suggests a street name from Oxfordshire.
+ </p>
+ <div class="more-info">
+ <p>More information:</p>
+ <ul>
+ <li>
+ The cobrands that FixMyStreet will use are defined in the
+ <code><a href="{{ "/customising/config/#allowed_cobrands" | relative_url }}">ALLOWED_COBRANDS</a></code>
+ config setting, based on the URL of the incoming request.
+ </li>
+ <li>
+ <a href="{{ "/customising/" | relative_url }}">more about customising</a>, including a
+ <a href="{{ "/customising/checklist/" | relative_url }}">checklist</a> of the key things to consider.
+ </li>
+ <li>
+ See <a href="{{ "/customising/cobrand-module/" | relative_url }}">Cobrand module</a> for
+ information about the Perl class you can override.
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <a name="config-variable">config variable</a> (also config setting, or config option)
+ </dt>
+ <dd>
+ A <strong>config variable</strong> is one of the settings in the
+ configuration file <code>conf/general.yml</code>. Config variables affect
+ the way your FixMyStreet installation behaves, and you must make sure they
+ are correct when you install and customise your site.
+ <p>
+ Note that <code>conf/general.yml</code> is <em>not</em> in the <a
+ href="#git" class="glossary__link">git repository</a> (it cannot be, because
+ it would contain your own private config settings, such as your database
+ password). Instead, there is an example file,
+ <code>cong/general.yml-example</code> you can
+ copy and edit. If you install using the
+ <a href="{{ "/install/install-script/" | relative_url }}">installation script</a>
+ or the <a href="{{ "/install/ami/" | relative_url }}">AMI</a>, this file will
+ automatically be created for you.
+ </p>
+ <div class="more-info">
+ <p>More information:</p>
+ <ul>
+ <li>
+ See <a href="{{ "/customising/config" | relative_url }}">all the config settings</a>
+ you need to get your site running.
+ </li>
+ <li>
+ See <a href="http://www.yaml.org/">the YAML website</a> for
+ everything about YAML, which is the format of the
+ <code>general.yml</code> file
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <a name="contact">contact</a>
+ </dt>
+ <dd>
+ Each <a href="#body" class="glossary__link">body</a> has one or more
+ <strong>contacts</strong> to which reports are sent. Typically these are
+ email addresses (but if you have <a href="#integration"
+ class="glossary__link">integrated</a> with the body's back-end, these may be
+ codes or IDs used by that instead of email addresses). It's not uncommon
+ for a body to have many contacts with the same email address, but with
+ different <a href="#category" class="glossary__link">categories</a>.
+ <div class="more-info">
+ <p>More information:</p>
+ <ul>
+ <li>
+ See <a href="{{ "/running/bodies_and_contacts/" | relative_url }}">Managing bodies and
+ contacts</a> for how to set these up.
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <a name="council">council</a>
+ </dt>
+ <dd>
+ A <strong>council</strong> is an example of a <a href="#body"
+ class="glossary__link">body</a>. We sometimes use the term because in the UK,
+ where we first launched FixMyStreet, the bodies to which the site sends
+ its <a href="#report" class="glossary__link">problem reports</a> were all called
+ councils.
+ </dd>
+
+ <dt>
+ <a name="dashboard">dashboard</a>
+ </dt>
+ <dd>
+ The <strong>dashboard</strong> shows a summary of statistics (numbers of
+ <a href="#report" class="glossary__link">problem reports</a> by <a href="state"
+ class="glossary__link">state</a>, and so on) for a single <a href="#body"
+ class="glossary__link">body</a>.
+ <p>
+ The dashboard is shown on the FixMyStreet website at
+ <code>/dashboard</code>, but can only be accessed by a <a
+ href="#staff-user" class="glossary__link">staff user</a>.
+ </p>
+ </dd>
+
+ <dt>
+ <a name="development">development site</a> (also: dev, development server)
+ </dt>
+ <dd>
+ A <strong>dev server</strong> is one that is running your FixMyStreet site
+ so you can <a href="{{ "/customising/" | relative_url }}">customise it</a>, experiment
+ with different settings, and test that it does what you expect.
+ This is different from a
+ <a href="#production" class="glossary__link">production server</a>, which is the one your
+ users actually visit running with live data, or a
+ <a href="#staging" class="glossary__link">staging server</a>,
+ which is used for testing code before it goes live.
+ <p>
+ On your dev server, you should set
+ <code><a href="{{ "/customising/config/#staging_site" | relative_url }}">STAGING_SITE</a></code>
+ to <code>1</code>.
+ </p>
+ </dd>
+
+ <dt>
+ <a name="devolve">devolved contacts</a>
+ </dt>
+ <dd>
+ Normally, you specifiy the
+ <a href="#administrator" class="glossary__link">send method</a>
+ for a whole <a href="#body" class="glossary__link">body</a>, so all
+ its <a href="#report" class="glossary__link">problem reports</a>
+ will be sent in that way. But you can <strong>devolve</strong>
+ the decision of which send method to use to the body's
+ <a href="#contact" class="glossary__link">contacts</a>
+ instead. For example, this lets you mix both email addresses and
+ <a href="#open311" class="glossary__link">Open311</a>
+ service codes within the same body.
+ <div class="more-info">
+ <p>More information:</p>
+ <ul>
+ <li>
+ See <a href="{{ "/running/bodies_and_contacts/" | relative_url }}">Managing
+ bodies and contacts</a> for how to set these up.
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <a name="flagged">flagged</a>
+ </dt>
+ <dd>
+ A report or a user can be <strong>flagged</strong> if an <a
+ href="#administrator" class="glossary__link">administrator</a> wants to mark it
+ as for special attention, typically because it may be abusive or
+ inappropriate. Flagged items are shown in the admin on their own page
+ (<code>/admim/flagged</code>) so can be more easily managed. This is
+ especially useful if you have more than one administrator, as you can see
+ whether other administrators have marked the user or report as
+ problematic.
+ <p>
+ Flagging users is only advisory: it marks them for attention, but does
+ not ban them. You can ban a user who persists in abusing your
+ FixMyStreet site by adding them to the <a href="#abuse-list"
+ class="glossary__link">abuse list</a>.
+ </p>
+ <div class="more-info">
+ <p>More information:</p>
+ <ul>
+ <li>
+ See <a href="{{ "/running/users/" | relative_url }}">About users</a> for more about managing
+ abusive users.
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <a name="geocoder">geocoder</a>
+ </dt>
+ <dd>
+ The <strong>geocoder</strong> turns the name of a place into a <a
+ href="#long-lat" style="glossary">long-lat</a> position. FixMyStreet then
+ uses this to display the appropriate region on the <a href="#map"
+ class="glossary__link">map</a>.
+ <p>
+ FixMyStreet can use the <a href="#osm"
+ class="glossary__link">OpenStreetMap</a>, Google, or Bing geocoders, or a custom one.
+ The
+ <code><a href="{{ "/customising/config/#geocoder" | relative_url }}">GEOCODER</a></code>
+ setting controls which one your site uses.
+ </p>
+ <div class="more-info">
+ <p>More information:</p>
+ <ul>
+ <li>
+ See <a href="{{ "/customising/fms_and_mapit/" | relative_url }}">How FixMyStreet uses
+ MapIt</a> for more about how the geocoder is used.
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <a name="gettext">gettext</a>
+ </dt>
+ <dd>
+ <strong>gettext</strong> is a set of utitlies provided by the GNU project
+ to help get translations into software. We use it throughout FixMyStreet
+ so that anywhere English text appears (the default), it can be replaced
+ with an appropriate translation in a different language. This presupposes
+ the text has been translated &mdash; the alternative translations are
+ storied in <code>.po</code> files.
+ <div class="more-info">
+ <p>More information:</p>
+ <ul>
+ <li>
+ More about <a href="{{ "/customising/language/" | relative_url }}">translating
+ FixMyStreet</a>.
+ </li>
+ <li>
+ See the <a href="http://www.gnu.org/software/gettext/">GNU gettext page</a>
+ for more about the project.
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <a name="git">git</a> (also GitHub, git repository, and git repo)
+ </dt>
+ <dd>
+ We use a popular source code control system called <strong>git</strong>. This
+ helps us track changes to the code, and also makes it easy for other people
+ to duplicate and even contribute to our software.
+ <p>
+ The website <a href="https://github.com/mysociety">github.com</a> is a central, public
+ place where we make our software available. Because it's Open Source, you can
+ inspect the code there (FixMyStreet is mostly written in the programming language
+ Perl), report bugs, suggest features and many other useful things.
+ </p>
+ <p>
+ The entire set of files that form the FixMyStreet platform is called the
+ <strong>git repository</strong> or <strong>repo</strong>. When you
+ install FixMyStreet, you are effectively cloning our repository on your
+ own machine.
+ </p>
+ <div class="more-info">
+ <p>More information:</p>
+ <ul>
+ <li>
+ See the <a href="{{ "/install/" | relative_url }}">installation instructions</a> which will
+ clone the FixMyStreet repo.
+ </li>
+ <li>
+ Everything about git from the <a
+ href="http://git-scm.com/">official website</a>.
+ </li>
+ <li>
+ See <a href="https://github.com/mysociety">the mySociety projects on
+ GitHub</a>.
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <a name="integration">integration</a> with bodies' back-end systems
+ </dt>
+ <dd>
+ By default, FixMyStreet sends <a href="#report" class="glossary__link">problem
+ reports</a> by email. The disadvantage of using email is that many <a
+ href="#body" class="glossary__link">bodies</a> then need to transfer the
+ information in the email into their own back-end systems, such as their
+ works database or customer management system. But FixMyStreet can be
+ <strong>integrated</strong> with those back ends so the data is passed
+ directly into them, instead of via email.
+ <p>
+ There are three levels of integration:
+ </p>
+ <ol>
+ <li>
+ problems reports are injected directly into the back end
+ </li>
+ <li>
+ updates made in the back end are automatically passed back into
+ FixMyStreet
+ </li>
+ <li>
+ problem reports created in the back end (that is, not initiated on
+ FixMyStreet) are passed into FixMyStreet
+ </li>
+ </ol>
+ <p>
+ Integration is often related to <a href="#cobrand"
+ class="glossary__link">cobranding</a>, which is how you can customise the look
+ and behaviour of your FixMyStreet installation.
+ </p>
+ <div class="more-info">
+ <p>More information:</p>
+ <ul>
+ <li>
+ More about <a href="{{ "/customising/integration/" | relative_url }}">integrating FixMyStreet</a>
+ with back-end systems (includes diagrams)
+ </li>
+ <li>
+ See <a
+ href="https://www.fixmystreet.com/council">FixMyStreet
+ for Councils</a> for mySociety's commercial support for UK councils
+ </li>
+ <li>
+ <a href="#open311" class="glossary__link">Open311</a> is the easiest form
+ of integration.
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <a name="kml">KML</a> (Keyhole Markup Language)
+ </dt>
+ <dd>
+ <strong>KML</strong> is an open standard XML format for geographic data.
+ <a href="#mapit" class="glossary__link">MapIt</a> can read KML files. If you need
+ to provide your own <a href="#area" class="glossary__link">admin boundary</a>
+ data, you can use common GIS software (such as Google Earth) to create a
+ KML "shape file" containing the boundaries, and then import them to MapIt.
+ <div class="more-info">
+ <p>More information:</p>
+ <ul>
+ <li>
+ Article about <a
+ href="http://en.wikipedia.org/wiki/Keyhole_Markup_Language">Keyhole
+ Markup Language</a> on wikipedia.
+ </li>
+ <li>
+ <a href="https://developers.google.com/kml/documentation/">KML documentation</a>
+ at Google Developers.
+ </li>
+ <li>
+ More about <a href="{{ "/customising/boundaries/" | relative_url }}">admin boundaries</a>
+ and why you might need to create them yourself.
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <a name="latlong">lat-long</a>
+ </dt>
+ <dd>
+ A <strong>lat-long</strong> is a pair of coordinates (latitude and
+ longitude) that describe a location. FixMyStreet sends a lat-long to <a
+ href="#mapit" class="glossary__link">MapIt</a> when the user clicks on the <a
+ href="#map" class="glossary__link">map</a>.
+ <p>
+ Example lat-long for London, UK: <code>51.5072759,-0.1276597</code>
+ </p>
+ </dd>
+
+ <dt>
+ <a name="locale">locale</a>
+ </dt>
+ <dd>
+ A <strong>locale</strong> defines the way things like language, date
+ formats, and currency should be handled. Locales are identified by codes
+ like <code>en_GB</code> or <code>hr_HR</code> (these are actually language
+ and region codes). If you need your installation to present FixMyStreet
+ using anything other than the default English translations, then the
+ locale you want <em>must</em> be installed on your server (note &mdash;
+ this is about your <em>server</em>'s configuration, not a FixMyStreet
+ setting). It's common for servers to support many locales, but not all
+ locales are installed by default.
+ <div class="more-info">
+ <p>More information:</p>
+ <ul>
+ <li>
+ See more about <a href="{{ "/customising/" | relative_url }}">customising</a> your
+ installation, which includes language and translation considerations
+ </li>
+ <li>
+ To see what locales your server currently supports, do <code>locale
+ -a</code>. You can generate missing locales with
+ <code>locale-gen</code> &mdash; for example, <code>sudo locale-gen
+ fr_FR.UTF-8</code>
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <a name="map">map</a>
+ </dt>
+ <dd>
+ FixMyStreet displays a <strong>map</strong> so users can easily pinpoint
+ the location of the problem they are reporting. By default, these are <a
+ href="#osm" class="glossary__link">OpenStreetMap</a> tiles displayed using
+ OpenLayers, but you can configure your installation to use other maps,
+ including your own custom tiles.
+ <div class="more-info">
+ <p>More information:</p>
+ <ul>
+ <li>
+ <a href="http://openlayers.org/">OpenLayers</a>, the JavaScript map
+ library FixMyStreet uses by default
+ </li>
+ <li>
+ <a href="http://leafletjs.com/">Leaflet</a>, another JS map library
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <a name="mapit">MapIt</a>
+ </dt>
+ <dd>
+ <strong>MapIt</strong> is a web service that manages <a href="#area"
+ class="glossary__link">administrative boundary areas</a>. More specifically,
+ FixMyStreet uses this to determine which areas (and hence which <a
+ href="#body" class="glossary__link">bodies</a>) cover any given location.
+ <p>
+ In a nutshell, MapIt accepts a <a href="#latlong"
+ class="glossary__link">lat-long</a> position, and returns a list of areas.
+ </p>
+ <p>
+ Like FixMyStreet, MapIt is a product by <a
+ href="https://www.mysociety.org/">mySociety</a>.
+ </p>
+ <div class="more-info">
+ <p>More information:</p>
+ <ul>
+ <li>
+ <a href="{{ "/customising/fms_and_mapit/" | relative_url }}">How FixMyStreet uses MapIt</a>
+ </li>
+ <li>
+ <a
+ href="http://global.mapit.mysociety.org/">global.mapit.mysociety.org</a>
+ is the global MapIt service
+ </li>
+ <li>
+ <a href="https://mapit.mysociety.org/">mapit.mysociety.org</a> is the
+ UK MapIt service
+ </li>
+ <li>
+ See <a
+ href="http://mapit.poplus.org/">mapit.poplus.org</a>
+ for technical information, including how to set up your own
+ installation
+ </li>
+ <li>
+ See <a href="{{ "/customising/boundaries/" | relative_url }}">more about boundaries</a>,
+ which define the areas, and the different ways to set them up.
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <a name="message-manager">Message Manager</a>
+ </dt>
+ <dd>
+ <strong>Message Manager</strong> is a mySociety web application that
+ can integrate an <a href="#sms" class="glossary__link">SMS</a> gateway
+ with FixMyStreet.
+ <div class="more-info">
+ <p>More information:</p>
+ <ul>
+ <li>
+ <a href="https://github.com/mysociety/message-manager/">Message
+ Manager on GitHub</a>.
+ </li>
+ <li>
+ More about
+ <a href="{{ "/install/fixmystreet-with-sms/" | relative_url }}">running
+ FixMyStreet with SMS</a>, and the limitations of doing so.
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <a name="open311">Open311</a>
+ </dt>
+ <dd>
+ <strong>Open311</strong> is an open standard for making online requests
+ for a civic service (such as fixing a pothole). FixMyStreet implements
+ Open311 so it's easy to <a href="#integration"
+ class="glossary__link">integrate</a> with <a href="#body"
+ class="glossary__link">bodies</a> whose back-ends also support it.
+ <p>
+ Open311 is effectively a more efficient alternative to email as a <a
+ href="#send-method" class="glossary__link">send method</a>.
+ </p>
+ <div class="more-info">
+ <p>More information:</p>
+ <ul>
+ <li>
+ More about <a href="{{ "/customising/integration/" | relative_url }}">integrating FixMyStreet</a>
+ using Open311 (includes diagrams)
+ </li>
+ <li>
+ mySociety blog post <a
+ href="https://www.mysociety.org/2013/01/10/open311-introduced/">introducing
+ Open311</a>
+ </li>
+ <li>
+ mySociety blog post <a
+ href="https://www.mysociety.org/2013/01/17/open311-explained//">explaining
+ basic Open311 functionality</a>.
+ </li>
+ <li>
+ <a href="http://www.open311.org/">open311.org</a>, the Open311
+ project's own website
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <a name="osm">OpenStreetMap (OSM)</a>
+ </dt>
+ <dd>
+ <strong>OpenStreetMap</strong> is a project that creates and distributes
+ free geographic data for the world, with an open license. By default,
+ FixMyStreet's <a href="#map" class="glossary__link">map</a> uses OSM maps.
+ <div class="more-info">
+ <p>More information:</p>
+ <ul>
+ <li>
+ <a href="http://www.openstreetmap.org/">www.openstreetmap.org</a>
+ </li>
+ <li>
+ <a href="http://wiki.openstreetmap.org/wiki/Main_Page">OpenStreetMap
+ wiki</a> for technical OSM documentation
+ </li>
+ <li>
+ web interface to <a
+ href="http://nominatim.openstreetmap.org/">OpenStreetMap's
+ geocoder</a>
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <a name="partial">partial report</a>
+ </dt>
+ <dd>
+ Some external applications might create a report by first uploading a photograph
+ and capturing a description, without identifying the location. This is a
+ <strong>partial report</strong> and is not shown until it has been completed.
+ <p>
+ <em>FixMyStreet itself does not create partial reports</em>, because all problem
+ reports created within the application always include a location.
+ </p>
+ <div class="more-info">
+ <p>More information:</p>
+ <ul>
+ <li>
+ Remember that FixMyStreet uses the location to
+ <a href="{{ "/fms_and_mapit/" | relative_url }}">determine where to send reports</a>,
+ so a partial report (having no location) effectively has no
+ <a href="#body" class="glossary__link">body</a> responsible for it.
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+
+ <dt>
+ <a name="report">problem report</a>
+ </dt>
+ <dd>
+ When a FixMyStreet user reports a problem (for example, a pothole or a
+ broken streetlight), that <strong>problem report</strong> is sent to the
+ <a href="#body" class="glossary__link">body</a> responsible. Problem reports
+ remain unpublished until the user confirms them; they may also be hidden
+ by an administrator. In both cases, the report is still stored in
+ FixMyStreet's back-end database.
+ <p>
+ Users may choose to submit their report anonymously. This means that
+ their name is not displayed on the website, although it is still sent to
+ the body.
+ </p>
+ <p>
+ A report may include a photograph.
+ </p>
+ <div class="more-info">
+ <p>More information:</p>
+ <ul>
+ <li>
+ <a href="{{ "/customising/send_reports/" | relative_url }}">How FixMyStreet sends reports</a>.
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <a name="production">production site</a> (also: live, production server)
+ </dt>
+ <dd>
+ A <strong>production server</strong> is one that is running your FixMyStreet site
+ for real users, with live data. This is different from a
+ <a href="#development" class="glossary__link">development server</a>, which you use make your
+ customisation and environment changes and try to get them to all work OK, or a
+ <a href="#staging" class="glossary__link">staging server</a>, which is used for testing code
+ and configuration after it's been finished but before it goes live.
+ <p>
+ Your production site should be configured to run as efficiently as possible: for
+ example, with caching disabled, and debugging switched off. Make sure you set
+ <code><a href="{{ "/customising/config/#staging_site" | relative_url }}">STAGING_SITE</a></code>
+ to <code>0</code>.
+ </p>
+ <p>
+ If you have a staging server, the system environment of your staging and
+ production servers should be identical.
+ </p>
+ <p>
+ You should never need to edit code directly on your production server.
+ We recommend you make any changes to the program code on your
+ development server, add it to the appropriate branch, test it on a staging
+ server, and then deploy it directly &mdash; that is, from the repo &mdash; on production.
+ </p>
+ </dd>
+
+ <dt>
+ <a name="send-method">send method</a>
+ </dt>
+ <dd>
+ The <strong>send method</strong> is the way that a <a href="#report"
+ class="glossary__link">problem report</a> is sent to the <a href="#body"
+ class="glossary__link">body</a> responsible for fixing it. <em>By default, the
+ send method is email.</em>
+ <p>
+ Alternatives to email are only available if some <a href="#integration"
+ class="glossary__link">integration</a> with the target body's back-end is
+ available (for example, if they are using <a href="#open311"
+ class="glossary__link">Open311</a>).
+ </p>
+ <div class="more-info">
+ <p>More information:</p>
+ <ul>
+ <li>
+ <a href="{{ "/customising/send_reports/" | relative_url }}">How FixMyStreet sends
+ reports</a>.
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <a name="staging">staging server</a> (also: staging site)
+ </dt>
+ <dd>
+ A <strong>staging server</strong> is one that you use for testing code or configuration
+ before it goes live. This is different from a <a href="#development"
+ class="glossary__link">development server</a>, on which you change the code and settings to
+ make everything work, or the
+ <a href="#production" class="glossary__link">production server</a>, which is the
+ site your users visit running with live data.
+ <p>
+ On your staging server, you should set
+ <code><a href="{{ "/customising/config/#staging_site" | relative_url }}">STAGING_SITE</a></code>
+ to <code>1</code>.
+ </p>
+ <p>
+ If you have a staging server, the system environment of your staging and
+ production servers should be identical.
+ </p>
+ <p>
+ You should never need to edit code directly on your staging or production servers.
+ We recommend you make any changes to the program code on your
+ development server, add it to the appropriate branch, and then deploy it directly
+ &mdash; that is, from the repo &mdash; on staging.
+ </p>
+ </dd>
+
+ <dt>
+ <a name="state">state</a>
+ </dt>
+ <dd>
+ A <a href="#report" class="glossary__link">problem report</a> can go through several
+ <strong>states</strong> in its lifetime. Problems typically start as
+ <em>unconfirmed</em>, then <em>open</em>, then <em>fixed</em>. There are
+ other states, including those that can only be allocated by a <a
+ href="#staff-user" class="glossary__link">staff user</a> or an <a
+ href="#administrator" class="glossary__link">administrator</a>.
+ <div class="more-info">
+ <p>More information:</p>
+ <ul>
+ <li>
+ See the <a href="{{ "/running/admin_manual/" | relative_url }}">Administrator's manual</a>
+ for a more detailed list of problem states.
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <a name="staff-user">staff user</a>
+ </dt>
+ <dd>
+ A <strong>staff user</strong> is someone on FixMyStreet who works for a <a
+ href="#body" class="glossary__link">body</a>. This means their <a href=
+ "#user-account" class="glossary__link">user account</a> is marked as belonging
+ to that body. This differentiates such accounts from normal users, who are
+ members of the public.
+ <p>
+ A staff user is <strong>not</strong> the same thing as an <a
+ href="#administrator" class="glossary__link">administrator</a>. A staff user
+ logs into the public website, like a normal user, but has additional
+ powers over some reports. An administrator logs into the private admin
+ and has access to how the whole FixMyStreet site is run.
+ </p>
+ <p>
+ A staff user has additional powers that <em>only apply to <a
+ href="#report" class="glossary__link">problem reports</a> for their own
+ body</em>, such as:
+ </p>
+ <ul>
+ <li>
+ hiding reports
+ </li>
+ <li>
+ setting state of reports to things other than just <em>fixed</em> and
+ <em>not fixed</em>
+ </li>
+ <li>
+ viewing a <a href="#dashboard" class="glossary__link">dashboard</a> showing
+ the body's statistics
+ </li>
+ </ul>
+ <p>
+ Actually, the distinction between an administrator and a staff user, and
+ the powers staff users have, can vary depending on your installation's <a
+ href="#cobrand" class="glossary__link">cobrand</a>.
+ </p>
+ <div class="more-info">
+ <p>More information:</p>
+ <ul>
+ <li>
+ compare <strong>staff user</strong> to <strong><a href="#administrator"
+ class="glossary__link">administrator</a></strong>
+ </li>
+ <li>
+ See <a href="{{ "/running/users/" | relative_url }}">About users</a> for more about managing
+ users, including how to create a staff account.
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <a name="sms">SMS</a> (Short Message Service, or texting)
+ </dt>
+ <dd>
+ <strong>SMS</strong> is the service for sending text messages across a
+ phone network. FixMyStreet is primarily a web-based application, but
+ it is possible to run it so that it can accept
+ <a href="#report" class="glossary__link">problem reports</a>
+ over SMS too.
+ <p>
+ An <strong>SMS gateway</strong> is a service that passes SMS messages
+ between the phone network and the internet. This allows you to receive
+ or send messages from a web application, such as FixMyStreet.
+ </p>
+ <div class="more-info">
+ <p>More information:</p>
+ <ul>
+ <li>
+ More about <a
+ href="{{ "/install/fixmystreet-with-sms/" | relative_url }}">running FixMyStreet with SMS</a>, and the limitations of doing so.
+ </li>
+ <li>
+ <a href="http://en.wikipedia.org/wiki/Short_Message_Service">More about SMS</a>
+ on wikipedia.
+ </li>
+ <li>
+ The <a href="#message-manager" class="glossary__link">Message Manager</a> web application can be used to integrate FixMyStreet
+ with an SMS gateway.
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <a name="survey">survey</a> (or questionnaire)
+ </dt>
+ <dd>
+ By default, FixMyStreet sends out <strong>surveys</strong> (also called
+ <strong>questionnaires</strong>) to users four weeks after they reported a
+ problem. The surveys encourage the users who reported each problem to
+ indicate whether or not the problem has been fixed (if it hasn't already
+ been marked as such). These surveys help you collect data on the performance
+ of the <a href="#bodies" class="glossary__link">bodies</a>.
+ <div class="more-info">
+ <p>More information:</p>
+ <ul>
+ <li>
+ <a href="{{ "/running/surveys" | relative_url }}">more about surveys</a>
+ </li>
+ <li>
+ Survey data is available to <a href="#administrator"
+ class="glossary__link">administrators</a> on the Survey page of the admin
+ </li>
+ <li>
+ Survey <a href="#template" class="glossary__link">templates</a> are in
+ <code>/templates/email/default/questionnaire.txt</code> and
+ <code>/templates/web/base/questionnaire</code>
+ </li>
+ <li>
+ If you don't want your FixMyStreet site to send out surveys, you can
+ switch off this behaviour in a <a
+ href="{{ "/customising/cobrand-module/" | relative_url }}">cobrand module</a>.
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <a name="template">template</a>
+ </dt>
+ <dd>
+ FixMyStreet creates its web pages (and emails) using
+ <strong>templates</strong>. If you want to customise your installation
+ beyond just changing the colours and logo (that is, using CSS), you can
+ add new templates for your own <a href="#cobrand"
+ class="glossary__link">cobrand</a>. You only need to create templates that are
+ different from the default ones.
+ <p>
+ Templates are in the <code>templates/web</code> and
+ <code>templates/email</code> directories &mdash; themselves containing
+ directories for every cobrand.
+ </p>
+ <p>
+ The web templates use the popular Template Toolkit system. You can
+ change the templates without needing to know how to write Perl (the
+ programming language the rest of FixMyStreet is written in).
+ </p>
+ <div class="more-info">
+ <p>More information:</p>
+ <ul>
+ <li>
+ See more about using templates to <a
+ href="{{ "/customising/" | relative_url }}">customise</a> your installation.
+ </li>
+ <li>
+ See the <a href="http://www.template-toolkit.org/">Template Toolkit
+ website</a>, which is the system the FixMyStreet web templates use.
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <a name="token">token</a> (also confirmation link)
+ </dt>
+ <dd>
+ By default, FixMyStreet uses confirmation emails containing links as
+ authorisation where the user is not already logged in. The links
+ contain unique <strong>tokens</strong> (these look like runs of random
+ letters and numbers).
+ <p>
+ If text authentication is switched on, authentication can also be
+ performed by text, sending a numeric code to enter in order to proceed.
+ </p>
+ <p>
+ Tokens are typically used to confirm the final part (authorisation) of an
+ action, and are therefore often related to a specific <a href="#report"
+ class="glossary__link">report</a>. FixMyStreet generally doesn't delete tokens
+ after they've been used because (as they often live on in email inboxes)
+ people sometimes click on old confirmation links to access reports
+ &mdash; so the mapping between token and report is still useful.
+ </p>
+ <div class="more-info">
+ <p>More information:</p>
+ <ul>
+ <li>
+ Tokens are implemented using <code>AuthToken</code> from mySociety's
+ <a href="https://github.com/mysociety/commonlib">commonlib</a>
+ common library.
+ </li>
+ <li>
+ For details about authorisation and how sessions work, see
+ <a href="{{ "/running/users/#sessions" | relative_url }}">more about users</a>.
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <a name="update">update</a>
+ </dt>
+ <dd>
+ Anyone can add an <strong>update</strong> to an existing <a href="#report"
+ class="glossary__link">problem report</a>. The update can contain a message, a
+ picture, and even change the report's <a href="#state"
+ class="glossary__link">state</a>.
+ <p>
+ For example, someone can leave an update on a pothole report to say, "I
+ think the hole is getting bigger!", and add a photograph. Or they can
+ mark the problem as fixed.
+ </p>
+ <p>
+ <a href="#staff-user" class="glossary__link">Staff users</a> can add more
+ specific states if they update a problem that belongs to the body they
+ work for.
+ </p>
+ <div class="more-info">
+ <p>More information:</p>
+ <ul>
+ <li>
+ FixMyStreet supports <strong><a href="#integration"
+ class="glossary__link">integration</a></strong>, which can enable
+ automatic updates whenever a body fixes a problem.
+ </li>
+ </ul>
+ </div>
+ </dd>
+
+ <dt>
+ <a name="user-account">user account</a>
+ </dt>
+ <dd>
+ FixMyStreet creates a <strong>user account</strong> for every user,
+ identified by the user's email address. An <a href="#administrator"
+ class="glossary__link">administrator</a> can change the email address, and the
+ name, of a user account. Optionally, a user account can have a password
+ associated with it too.
+ <div class="more-info">
+ <p>More information:</p>
+ <ul>
+ <li>
+ See <a href="{{ "/running/users/" | relative_url }}">About users</a> for more about managing
+ users.
+ </li>
+ <li>
+ A <strong><a href="#staff-user" class="glossary__link">staff
+ user</a></strong> is one whose user account is marked as belonging
+ to a <a href="#body" class="glossary__link">body</a>.
+ </li>
+ </ul>
+ </div>
+ </dd>
+</dl>
diff --git a/docs/how-it-works.md b/docs/how-it-works.md
new file mode 100644
index 000000000..778563710
--- /dev/null
+++ b/docs/how-it-works.md
@@ -0,0 +1,161 @@
+---
+layout: page
+title: How to FixMyStreet
+---
+
+# How does FixMyStreet work?
+
+<p class="lead">
+ FixMyStreet sends problem reports to the people who can fix them!
+</p>
+
+## How it works
+
+FixMyStreet makes it easy for anyone to report a problem without worrying about
+the correct authority to send it to. FixMyStreet takes care of that using the
+problem's location and <a href="{{ "/glossary/#category" | relative_url }}"
+class="glossary__link">category</a>, and sends a
+<a href="{{ "/glossary/#report" | relative_url }}" class="glossary__link">report</a>,
+by email or using a web service such as <a href="{{ "/glossary/#open311" | relative_url }}"
+class="glossary__link">Open311</a>, to the department or body responsible for fixing
+it.
+
+But FixMyStreet doesn't just send problem reports &mdash; it makes the reports
+visible to everyone. Anyone can see what's already been reported, leave <a
+href="{{ "/glossary/#update" | relative_url }}" class="glossary__link">updates</a>, or
+subscribe to <a href="{{ "/glossary/#alert" | relative_url }}"
+class="glossary__link">alerts</a>. We help prevent duplicate reports and offer
+additional features for <a href="{{ "/glossary/#staff-user" | relative_url }}"
+class="glossary__link">staff users</a> working for the authorities who are actually
+fixing problems.
+
+
+## Want to run FixMyStreet in your area?
+
+If you want to get FixMyStreet up and running, this is what you need to do:
+
+<dl class="reveal-on-click" data-reveal-noun="steps">
+ <dt>
+ <h3 id="gather_a_team">1. Gather a team</h3>
+ </dt>
+ <dd>
+ <p>
+ To begin with, we think this is the <em>minimum</em>:
+ </p>
+ <ul>
+ <li>
+ <strong>an administrator</strong> who can
+ <a href="{{ "/running" | relative_url }}">run the site</a> and the project
+ </li>
+ <li>
+ <strong>a developer</strong> who can
+ <a href="{{ "/install" | relative_url }}">do the tech</a> and
+ <a href="{{ "/customising" | relative_url }}">customise the code</a>
+ </li>
+ <li>
+ <strong>a translator</strong> (unless you'll be using a
+ <a href="{{ "/customising/language" | relative_url }}">language</a>
+ we already support)
+ </li>
+ </ul>
+ <p>
+ This describes a tiny team of three &mdash; if you can get more, great!
+ Admins can share the work, translators can work on different texts at the
+ same time, and devs can work on code and design customisations.
+ </p>
+ </dd>
+ <dt>
+ <h3 id="install_the_software">2. Install the software</h3>
+ </dt>
+ <dd>
+ <ul>
+ <li><a href="{{ "/install/install-script" | relative_url }}">on your own server</a></li>
+ <li><a href="{{ "/install/ami" | relative_url }}">on an Amazon Web Services EC2 server</a></li>
+ </ul>
+ </dd>
+ <dt>
+ <h3 id="get_the_data_for_the_areas_you_want_to_cover">3. Get the data for the areas you want to cover</h3>
+ </dt>
+ <dd>
+ <p>
+ We know from experience it's a good idea to start small and expand later (for
+ example, maybe start with one city and go national when that's running well):
+ </p>
+ <ul>
+ <li>
+ you'll need to get the
+ <a href="{{ "/customising/boundaries" | relative_url }}">boundary data</a>
+ for the area you're covering (and the borders of any authorities within it)
+ </li>
+ <li>
+ you must find
+ <a href="{{ "/running/bodies_and_contacts" | relative_url }}">email addresses</a>
+ for each of the departments responsible for each category of problem,
+ in each of the bodies responsible for the areas you're covering
+ </li>
+ </ul>
+ </dd>
+ <dt>
+ <h3 id="customise_the_site">4. Customise the site</h3>
+ </dt>
+ <dd>
+ There's lots you can do to
+ <a href="{{ "/customising" | relative_url }}">customise the site</a>:
+ <ul>
+ <li>
+ <a href="{{ "/customising/config" | relative_url }}">configure the site</a>
+ so it does what you want
+ </li>
+ <li>
+ make simple <a href="{{ "/customising/css" | relative_url }}">colour scheme</a> changes,
+ logo, and wording changes
+ </li>
+ <li>
+ optionally make more complex design or
+ <a href="{{ "/customising/cobrand-module" | relative_url }}">behaviour changes</a>
+ &mdash; this will require dev skills (you can do this, or ask us to)
+ </li>
+ <li>
+ <a href="{{ "/customising/language" | relative_url }}">translate</a>
+ it into the language(s) you need. We use a service called
+ Transifex so your translators don't need to be programmers.
+ </li>
+ <li>
+ change the about/privacy/FAQ pages by
+ <a href="{{ "/customising/templates" | relative_url }}">writing your own</a>
+ </li>
+ </ul>
+
+ </dd>
+ <dt>
+ <h3 id="go_live">5. Go live!</h3>
+ </dt>
+ <dd>
+ <p>
+ Actually setting up a FixMyStreet project is just the beginning &mdash;
+ you need to be committed for the long term to see the site grow and
+ succeed. There will be
+ <a href="{{ "/running/admin_manual" | relative_url }}">user support</a>
+ to do, marketing and press to handle, liaison with the authorities you're
+ sending the reports to, and perhaps even
+ <a href="{{ "/customising/integration" | relative_url }}">integration</a>
+ (because email is the easiest, but not necessarily the best, way to send
+ those reports).
+ </p>
+ </dd>
+</dl>
+
+<!-- NB duplicated from /overview -->
+We've written a clear guide for anyone who's thinking about [setting up and
+running FixMyStreet]({{ "/The-FixMyStreet-Platform-DIY-Guide-v1.1.pdf" | relative_url }}).
+If you're thinking of running such a project, you **must** read it first -- it
+explains why these sites work, and what you need to think about before you start.
+
+If you still want to be involved, we welcome questions about how it works
+[on our mailing list]({{ "/community/" | relative_url }}).
+Or, if you're outside the UK, email
+<a href="mailto:international&#64;mysociety.org">international&#64;mysociety.org.</a>
+
+There's also the [FixMyStreet blog]({{ "/blog/" | relative_url }}) where we post version release
+information and other progress reports. And we often post FixMyStreet news on
+the <a href="https://www.mysociety.org/blog/">mySociety blog</a> too.
diff --git a/docs/index.md b/docs/index.md
new file mode 100644
index 000000000..753490ffb
--- /dev/null
+++ b/docs/index.md
@@ -0,0 +1,131 @@
+---
+layout: landing
+title: Welcome
+---
+
+<nav class="bg-default">
+ <div class="container">
+ <ul class="primary-nav">
+ <li><a href="{{ "/overview/" | relative_url }}">Documentation</a></li>
+ <li><a href="{{ "/how-it-works/" | relative_url }}">How it works</a></li>
+ <li><a href="https://github.com/mysociety/fixmystreet">GitHub</a></li>
+ <li><a href="{{ "/community/" | relative_url }}">Contact us</a></li>
+ </ul>
+ </div>
+</nav>
+
+
+<div class="container">
+ <div class="homepage-feature spacer-top">
+ <div class="column">
+ <div class="monitor">
+ <div id="owl-slide" class="owl-carousel">
+ <div>
+ <a href="https://www.zueriwieneu.ch/">
+ <img src="/assets/img/tn1.png">
+ <div class='owl__gap'>
+ <h3>Züri wie neu</h3>
+ <p>Run by Stadt Z&uuml;rich, Switzerland</p>
+ </div>
+ </a>
+ </div>
+ <div>
+ <a href="http://www.fixamingata.se/">
+ <img src="/assets/img/tn2.png">
+ <div class='owl__gap'>
+ <h3>Fixa min gata</h3>
+ <p>Run by KIVOS, Sweden</p>
+ </div>
+ </a>
+ </div>
+ <div>
+ <a href="https://aduanku.my/">
+ <img src="/assets/img/tn3.png">
+ <div class='owl__gap'>
+ <h3>AduanKu.my</h3>
+ <p>Run by Sinar Project, Malaysia</p>
+ </div>
+ </a>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <div class="column">
+ <h1 class="secondary-heading title">
+ Run a website like FixMyStreet in your country or city, for free
+ </h1>
+ <p>
+ With FixMyStreet Platform you can easily launch a website that helps
+ people to report street problems like potholes and broken street
+ lights. Problem reports are then sent to authorities for fixing.
+ </p>
+ <p>
+ In the wrong place? You might want to
+ <a href="https://www.fixmystreet.com/">report problems in the UK</a>;
+ or to learn about
+ <a href="https://www.fixmystreet.com/council">FixMyStreet
+ for local governments</a>. FixMyStreet Platform is for citizens who
+ want to run their own sites. Welcome!
+ </p>
+ </div>
+ </div>
+</div>
+
+
+<div class="bg-default spacer-top">
+ <div class="container">
+ <ul class="summary-of-features">
+ <li>
+ <div class="circle-icon icon-opensource">&nbsp;</div>
+ <h3>Free software</h3>
+ <p>Using open source technologies</p>
+ </li>
+ <li>
+ <div class="circle-icon icon-paint">&nbsp;</div>
+ <h3>Brandable</h3>
+ <p>Add your own colour, fonts and logos</p>
+ </li>
+ <li>
+ <div class="circle-icon icon-help">&nbsp;</div>
+ <h3>Friendly support</h3>
+ <p>Backup from mySociety and a strong community</p>
+ </li>
+ <li>
+ <div class="circle-icon icon-world">&nbsp;</div>
+ <h3>Many languages</h3>
+ <p>Use existing languages, or add your own</p>
+ </li>
+ </ul>
+ </div>
+</div>
+
+<div class="container">
+ <h2 class="text--center spacer-top primary-heading title">Let&rsquo;s get started</h2>
+
+ <div class="this-or-this">
+ <div class="column">
+ <h3 class="secondary-heading spacer-top title">Learn more</h3>
+ <p class="tertiary-heading">Get your FixMyStreet <br>site up and running</p>
+ <ul class="action-buttons spacer-top">
+ <li><a href="{{ "/install/" | relative_url }}" class="btn--green"><i class="icon icon-download">&nbsp;</i> Install</a></li>
+ <li><a href="{{ "/overview/" | relative_url }}" class="btn--green"><i class="icon icon-document">&nbsp;</i> Docs</a></li>
+ <li><a href="https://github.com/mysociety/fixmystreet" class="btn--green"><i class="icon icon-github">&nbsp;</i> GitHub</a></li>
+ <li><a href="https://github.com/mysociety/fixmystreet/blob/master/LICENSE.txt" class="btn--green"><i class="icon icon-document">&nbsp;</i> Licence Info</a></li>
+ </ul>
+ </div>
+ <div class="column">
+ <h3 class="secondary-heading spacer-top title">Get in touch</h3>
+ <p class="tertiary-heading">Say hello, we&rsquo;ll help you make <br>your new site awesome</p>
+ <ul class="action-buttons spacer-top">
+ <li><a href="mailto:international&#64;mysociety.org" class="btn--blue"><i class="icon icon-email">&nbsp;</i> Email us</a></li>
+ <li><a href="https://twitter.com/fixmystreet" class="btn--blue"><i class="icon icon-twitter">&nbsp;</i> Follow us</a></li>
+ <li><a href="{{ "/community/" | relative_url }}" class="btn--blue"><i class="icon icon-irc">&nbsp;</i> Chat on IRC</a></li>
+ <li><a href="{{ "/community/" | relative_url }}" class="btn--blue"><i class="icon icon-post">&nbsp;</i> Mailing list</a></li>
+ </ul>
+ </div>
+ </div>
+</div>
+
+
+
diff --git a/docs/install/ami.md b/docs/install/ami.md
new file mode 100644
index 000000000..783c23727
--- /dev/null
+++ b/docs/install/ami.md
@@ -0,0 +1,78 @@
+---
+layout: page
+title: AMI for EC2
+---
+
+# FixMyStreet AMI for EC2
+
+<p class="lead">
+ To help people to get started with the FixMyStreet platform, we have
+ created an AMI (Amazon Machine Image) with a basic installation of
+ FixMyStreet, which you can use to create a running server on an Amazon
+ EC2 instance.
+</p>
+
+Note that this is just one of [four ways to install FixMyStreet]({{ "/install/" | relative_url }}).
+
+## Installing on Amazon's Web Services
+
+If you don't have your own server, or simply prefer to use an external one, you
+can use Amazon Web Services (AWS) instead. They provide difference scale
+servers, called instances. The smallest instance, the Micro, will be [free
+for a year](http://aws.amazon.com/free/).
+
+The AMI we've prepared for you can be found in the **EU West (Ireland)**
+region, with the ID `ami-0a9b70ca6708395b5` and name "FixMyStreet installation
+2018-09-06". You can launch an instance based on that AMI with
+[this link](https://console.aws.amazon.com/ec2/home?region=eu-west-1#launchAmi=ami-0a9b70ca6708395b5).
+
+When you create an EC2 instance based on that AMI, make sure that you
+choose Security Groups that allow at least inbound HTTP, HTTPS and
+SSH, and perhaps SMTP as well for email.
+
+When your EC2 instance is launched, you will be able to log in as the
+`ubuntu` user. This user can `sudo` freely to run commands as root.
+However, the code is actually owned by (and runs as) the `fms` user.
+After creating the instance, you may want to edit a configuration
+file to set a couple of parameters. That configuration file is
+`/home/fms/fixmystreet/conf/general.yml`, which can be edited with:
+
+ ubuntu@ip-10-58-191-98:~$ sudo su - fms
+ fms@ip-10-58-191-98:~$ cd fixmystreet
+ fms@ip-10-58-191-98:~/fixmystreet$ nano conf/general.yml
+
+You should set
+<code><a href="{{ "/customising/config/#contact_email" | relative_url }}">CONTACT_EMAIL</a></code>
+and
+<code><a href="{{ "/customising/config/#do_not_reply_email" | relative_url }}">DO_NOT_REPLY_EMAIL</a></code>
+or whatever you wish to use. postfix is installed so that outgoing email will
+work, but this may need further configuration.
+
+Then you should restart the Catalyst FastCGI server with:
+
+ fms@ip-10-58-191-98:~/fixmystreet$ logout
+ ubuntu@ip-10-58-191-98:~$ sudo /etc/init.d/fixmystreet restart
+
+If you find the hostname of your EC2 instance from the AWS console,
+you should then be able to see the site at http://your-ec2-hostname.eu-west-1.compute.amazonaws.com
+
+By default, the admin part of the website (`/admin`) requires a user with
+superuser permission to log in. In order to use this
+interface, you will need to create a username and password for one or
+more superusers. To add such a user, you can use the `createsuperuser`
+command, as follows:
+
+ ubuntu@ip-10-58-66-208:~$ sudo su - fms
+ fms@ip-10-58-191-98:~$ cd fixmystreet
+ fms@ip-10-58-191-98:~/fixmystreet$ bin/createsuperuser fmsadmin@example.org password
+ fmsadmin@example.org is now a superuser.
+
+This basic installation uses the default cobrand, with a
+(deliberately) rather garish colour scheme.
+
+## Installation complete... now customise
+
+You should then proceed
+to [customise your installation](/customising/).
+
+Please also see the instructions for [updating your installation](/updating/ami/).
diff --git a/docs/install/database.md b/docs/install/database.md
new file mode 100644
index 000000000..f282c8985
--- /dev/null
+++ b/docs/install/database.md
@@ -0,0 +1,36 @@
+---
+layout: page
+title: Database troubleshooting
+---
+
+# Database user access control
+
+<p class="lead">
+ These instructions are for Debian &mdash; do consult the PostgreSQL
+ documentation if you are having trouble at this stage.
+</p>
+
+At this point you might need to configure PostgreSQL to allow password-based
+access to the `fms` database as the user `fms` from using Unix-domain sockets.
+Edit the file `/etc/postgresql/8.4/main/pg_hba.conf` and add as the
+first line:
+
+ local fms fms md5
+
+You will then need to restart PostgreSQL with:
+
+ $ sudo /etc/init.d/postgresql restart
+
+If you want to access the database from the command line, you can add
+the following line to `~/.pgpass`:
+
+ localhost:*:fms:fms:somepassword
+
+Then you should be able to access the database with:
+
+ $ psql -U fms fms
+
+## Configuration
+
+When you've got everything working, you'll need to update the
+[database config settings]({{ "/customising/config/#fms_db_host" | relative_url }}).
diff --git a/docs/install/fixmystreet-with-sms.md b/docs/install/fixmystreet-with-sms.md
new file mode 100644
index 000000000..4d6ce9436
--- /dev/null
+++ b/docs/install/fixmystreet-with-sms.md
@@ -0,0 +1,267 @@
+---
+layout: page
+title: Using FixMyStreet with SMS
+---
+
+# Using FixMyStreet with SMS
+
+<p class="lead">
+ We're sometimes asked about running FixMyStreet with
+ <a href="{{ "/glossary/#sms" | relative_url }}" class="glossary__link">SMS</a>.
+ With SMS, users can report problems by text message instead of using the web
+ interface. This page describes how it can work, and what you must consider
+ before going ahead.
+</p>
+
+Adding SMS capability to your FixMyStreet site is, on the face of it, a great
+idea. In theory, it allows people with non-internet enabled handsets, or with
+no data network coverage, to report problems. Such people may represent a large
+and important section of the local population who might otherwise be unable to
+use the service. However, it's important to appreciate what the limitations of
+SMS are, and why we always recommend you establish and run your site on the web
+*before* you try to add SMS capability to it.
+
+## Limitations of SMS
+
+### Main issues: duplicate reports, no location information
+
+One important aspect to FixMyStreet is that most
+<a href="{{ "/glossary/#report" | relative_url }}" class="glossary__link">problem reports</a> are about problems with specific locations. On the web, this
+means we can present the user with a map to click on.
+
+This interface, encouraging people to click on a map, serves a couple of functions:
+
+ * it deters duplicate reports being sent for the same problem, because it's obvious if a problem has already been reported (a pin will already be there)
+
+ * it provides an accurate
+ <a href="{{ "/glossary/#latlong" | relative_url }}" class="glossary__link">lat-long</a>
+ position of the location of the problem
+
+The main problem with SMS &mdash; although there are others &mdash; is that
+both of these benefits are lost. So although SMS may be beneficial because it
+doesn't require a more powerful device or interface capability, these are two
+significant drawbacks. Both of them require your team to process the incoming
+reports -- either to detect and intecept duplicate reports, or to identify the
+precise location of a problem where this is not clear.
+
+<div class="attention-box info">
+ In effect, this means that adding SMS capability to FixMyStreet <em>increases
+ the burden on the support team running the site</em>. Or, if it doesn't, then
+ this burden is passed directly on to the authorities who are receiving the
+ reports &mdash; and you should not run your site in this way.
+</div>
+
+This is not to say it should not be done, just that if you do it you must
+appreciate that you will not be making your team's lives easier. Of course, you
+might be making things easier for the citizen users, but this will only happen
+if your team is able to handle the work it may generate. It might not be a lot
+of work -- that depends on how the system is used, and how widely -- but it
+will certainly not be less work.
+
+We have also encountered misunderstanding about using geolocation on mobile
+devices. The technical issue here is secondary &mdash; the main point is that
+FixMyStreet doesn't need the location of the *handset*; it needs the location
+of the problem being reported. This distinction is handled by the web
+interface, but not when using SMS. See
+*[Geolocating via SMS](#geolocating-via-sms)* below for more details.
+
+So, we have two approaches to this, and we always recommend anyone looking to
+add SMS reporting capability to FixMyStreet tries the first one (method 1,
+below) first.
+
+In both cases, you start by advertising a number (possibly a shortcode which is
+easier for people to remember) for people to send SMS reports to. This means
+you should
+[customise your templates]({{ "/customising/templates" | relative_url }}), because (when it's running live) the number should presumably appear on the website
+too.
+
+## Method 1: use a mobile phone (yes, really!)
+
+<div class="attention-box info">
+Have all incoming message go to a mobile phone your team has access to. They
+then create problem reports in the FixMyStreet using their staff login, on behalf
+of the reporter.
+</div>
+
+The main reason for doing this is you get to discover just how badly needed SMS
+input is. If nobody sends reports to you, you've discovered that it's not in
+demand, and you haven't invested any time in integrating SMS into the system.
+And if they do, you get a good idea of the kind and quality of the reports you
+will be receiving.
+
+The downside of this is that the reports you create are not in the name (or
+account) of the sender -- this may be more of a problem than you might realise,
+because it means that the body (the council) who eventually gets the report
+cannot reply directly (unless you also pass on the phone number -- note that
+you typically won't know the name of the citizen either, as you've probably only
+got their number).
+
+It's likely that you will need to reply to some incoming SMSs to clarify the
+nature of the report (especially to pinpoint the location if it's not clear),
+which you can do from the mobile phone. Of course there is an implicit cost to
+this because you're sending an outgoing messages from the mobile phone each time.
+
+## Method 2: use an SMS gateway
+
+<div class="attention-box info">
+Use "Message Manager" integrated with an SMS gateway. Your staff can access
+the messages using their staff login, and create problem reports on behalf
+of the reporter.
+</div>
+
+We have a web application called
+<a href="{{ "/glossary/#message-manager" | relative_url }}" class="glossary__link">Message Manager</a> that accepts incoming messages from an SMS gateway, and makes them available to
+<a href="{{ "/glossary/#staff-user" | relative_url }}" class="glossary__link">staff users</a>
+within the FixMyStreet website. A staff user on a FixMyStreet site that is
+using Message Manager can see incoming SMS reports, reply to them, and turn
+them into reports by clicking on the map. This effectively integrates SMS
+messages to FixMyStreet but it's very important to understand this does not
+automate the creation of reports. We do not do that, because of the subtleties
+described above: the location of the problem is often vague, and the submission
+may be a duplicate report anyway.
+
+The advantage of using Message Manager is that the reports are easier for
+trained staff to manage, because it's all happening in the web browser. Reports
+submitted in this way are marked as such ("via mobile") on the site. It also
+tracks the conversation threads for any replies. Commonly, your staff may need
+to clarify details with the original reporter before the report can be
+accurately made. Message Manager allows those replies to be sent from within
+the browser too, and maintains them as threads. It also supports a certain
+amount of processing based on codes within the message, for example, incoming
+messages can be automatically classified by looking for prefix codes (e.g.,
+"to report problems in the Foo district, text 'FOO pothole outside
+Example Shop in Demo Street").
+
+So, Message Manager makes sense if you're getting a lot of SMS messages and
+your team is willing to handle them.
+
+But there are two big caveats: firstly, it is not straightforward to set up,
+because it needs to be integrated with an SMS gateway that is using the
+advertised number or short code. This integration almost certainly requires
+custom coding depending on the characteristics of whichever SMS gateway you use
+(for example,
+[this is the code](https://github.com/mysociety/message-manager/blob/master/app/Console/Command/NetcastShell.php)
+we wrote so that Message Manager could run with the NetCast SMS gateway in the
+Philippines). Also, of course there is a cost involved in using an SMS gateway,
+typically both for its setup (for receiving messages), its ongoing service, and
+possibly charges for outgoing messages.
+
+And remember, accepting SMS messages through an SMS gateway with Message
+Manager does not lessen the burden of work on your team, it adds to it. It just
+makes that work a little easier because it's possible to handle everything
+entirely in a web browser, and there's a little less typing to do.
+
+## Process/comparison of methods
+
+<table class="table">
+ <tr>
+ <th></th>
+ <th>
+ Method 1:<br>mobile phone receiving SMS directly
+ </th>
+ <th>
+ Method 2:<br>Message Manager via SMS&nbsp;gateway
+ </th>
+ </tr>
+ <tr>
+ <td>
+ Set up
+ </td>
+ <td>Practically none</td>
+ <td>
+ Potentially complex:
+ <br>
+ Install MM and create MM admin user(s),
+ configure with FMS (including CORS),
+ integration with SMS gateway (requires local testing),
+ authorise nominated staff accounts,
+ configure prefixes if used
+ </td>
+ </tr>
+ <tr>
+ <td>
+ Incoming messages
+ </td>
+ <td>arrive in phone's inbox</td>
+ <td>appear in message list in FMS, when logged in as staff</td>
+ </tr>
+ <tr>
+ <td>
+ Report creation (staff&nbsp;user)
+ </td>
+ <td>click on map, copy text manually from phone, select category</td>
+ <td>click on message, click on map: message text appears in the report, select category</td>
+ </tr>
+ <tr>
+ <td>
+ How location is determined
+ </td>
+ <td>
+ staff user clicks on map
+ </td>
+ <td>
+ staff user clicks on map
+ <br>
+ Area can be automatically detected by prefix
+ in SMS message
+ </td>
+ </tr>
+ <tr>
+ <td>
+ Reply to user (i.e., send SMS)
+ </td>
+ <td>by replying to incoming message (staff user sees the texter's phone number)</td>
+ <td>via the SMS gateway (can be configured not to reveal phone numbers to staff users)</td>
+ </tr>
+ <tr>
+ <td>
+ FMS records this as coming via SMS
+ </td>
+ <td>
+ not automatically
+ </td>
+ <td>
+ yes
+ </td>
+ </tr>
+ <tr>
+ <td>
+ automatic notification of status change
+ (e.g., when fixed)
+ </td>
+ <td>no<br>&nbsp;</td>
+ <td>no<br>(but theoretically possible)</td>
+ </tr>
+</table>
+
+<img src="/assets/img/fms_with_sms_flowchart.png">
+
+
+## Geolocating via SMS
+
+Finally, a note about geo-location via SMS: some people get enthusiastic about
+being able to automatically detect the location an SMS was sent from. It's
+important to remember, in the context of FixMyStreet, that even if you can
+determine the location from which an SMS was sent (technically, SMS itself does
+not provide such a capability, but some network providers may offer a service
+which does a similar thing) this isn't automatically *useful*.
+
+The problem is this: very often a report to FixMyStreet is not being made from
+the location of the problem. That means you don't care where the phone is; you
+care where the problem (e.g., the pothole) is. This works fine with the web
+interface where the user can (if they want, and if the device supports it) use
+their current location which the device can automagically supply. But there's
+no such interface with SMS, and even if there was a reliable way to identify
+the location of the sender, we would warn agains sending reports on to the body
+responsible for fixing them when there's no way of knowing if the geolocation
+data is or is not the correct location. FixMyStreet would fail as a service if
+the authorities it is reporting to cannot trust the location information it is
+sending to be useful.
+
+
+
+
+
+
+
+
diff --git a/docs/install/index.md b/docs/install/index.md
new file mode 100644
index 000000000..ebd4a8d7e
--- /dev/null
+++ b/docs/install/index.md
@@ -0,0 +1,32 @@
+---
+layout: page
+title: Installing
+---
+
+# Installing FixMyStreet Platform
+
+<p class="lead">
+ There are several options for installing the FixMyStreet platform. Unless
+ you're confident deploying web applications, we recommend you use the
+ installation script or the AMI for Amazon EC2.
+</p>
+
+## Four ways to install
+
+* [Use an install script for Debian or Ubuntu servers]({{ "/install/install-script/" | relative_url }})
+* [Use a FixMyStreet AMI for Amazon EC2]({{ "/install/ami/" | relative_url }})
+* [Vagrant installation]({{ "/install/vagrant/" | relative_url }}), for development
+* [Install the software manually]({{ "/install/manual-install/" | relative_url }})
+
+FixMyStreet is a web application written in Perl, using the Catalyst framework.
+Installation deploys the core code and also manages its dependencies.
+
+If you're not technical, this can be a little daunting &mdash; if you haven't
+already done so, [get in touch]({{ "/community" | relative_url }}) and ask for help.
+
+Please also see the instructions for [updating your code](/updating/) once it's installed.
+
+If you're trying to set a FixMyStreet project up outside the UK, let the
+[international team](https://www.mysociety.org/about/mysociety-around-the-world/)
+know by emailing
+<a href="mailto:international&#64;mysociety.org">international&#64;mysociety.org</a>.
diff --git a/docs/install/install-script.md b/docs/install/install-script.md
new file mode 100644
index 000000000..ba2c2bef8
--- /dev/null
+++ b/docs/install/install-script.md
@@ -0,0 +1,79 @@
+---
+layout: page
+title: Install script
+---
+
+# FixMyStreet Install Script
+
+<p class="lead">
+ If you have a new installation of Debian wheezy or Ubuntu precise,
+ you can use an install script to set up a basic installation of
+ FixMyStreet on your server.
+</p>
+
+Note that this is just one of [four ways to install FixMyStreet]({{ "/install/" | relative_url }}).
+
+## Warning: installation changes your setup!
+
+*Warning: only use this script on a newly installed server -- it will
+make significant changes to your server's setup, including modifying
+your nginx setup, creating a user account, creating a database,
+installing new packages, and so on.*
+
+## Running the script
+
+The script to run is called [`install-site.sh`, in our `commonlib` repository](https://github.com/mysociety/commonlib/blob/master/bin/install-site.sh).
+That script's usage is as follows:
+
+ Usage: ./install-site.sh [--default] <SITE-NAME> <UNIX-USER> [HOST]
+ HOST is only optional if you are running this on an EC2 instance.
+ --default means to install as the default site for this server,
+ rather than a virtualhost for HOST.
+
+The `<UNIX-USER>` parameter is the name of the Unix user that you want
+to own and run the code. (This user will be created by the script.)
+
+The `HOST` parameter is a hostname for the server that will be usable
+externally -- a virtualhost for this name will be created by the
+script, unless you specified the `--default` option.. This parameter
+is optional if you are on an EC2 instance, in which case the hostname
+of that instance will be used.
+
+For example, if you wish to use a new user called `fms` and the
+hostname `fixmystreet.127.0.0.1.xip.io` (xip.io is a very helpful service for
+development, allowing easy domain/wildcard domain usage without having to edit
+your hosts file), creating a virtualhost just for that hostname, you could
+download and run the script with:
+
+ curl -L -O https://github.com/mysociety/commonlib/raw/master/bin/install-site.sh
+ sudo sh install-site.sh fixmystreet fms fixmystreet.127.0.0.1.xip.io
+
+Or, if you want to set this up as the default site on an EC2 instance,
+you could download the script, make it executable and then invoke it
+with:
+
+ sudo ./install-site.sh --default fixmystreet fms
+
+Please be aware that the last part of the installation process,
+installing Perl modules, may take a long time to complete.
+
+When the script has finished, you should have a working copy of the
+website, accessible via the hostname you supplied to the script.
+
+By default, the admin part of the website (`/admin`) requires a user with
+superuser permission to log in. In order to use this
+interface, you will need to create a username and password for one or
+more superusers. To add such a user, you can use the `createsuperuser`
+command, as follows:
+
+ ubuntu@ip-10-58-66-208:~$ sudo su - fms
+ fms@ip-10-58-191-98:~$ cd fixmystreet
+ fms@ip-10-58-191-98:~/fixmystreet$ bin/createsuperuser fmsadmin@example.org password
+ fmsadmin@example.org is now a superuser.
+
+The script will install postfix to allow outgoing email; you can change the
+`SMTP_SMARTHOST` and other `SMTP` variables in `conf/general.yml` to use a
+different SMTP server.
+
+Please also see the instructions for [updating your installation](/updating/ami/).
+
diff --git a/docs/install/manual-install.md b/docs/install/manual-install.md
new file mode 100644
index 000000000..45522fd4e
--- /dev/null
+++ b/docs/install/manual-install.md
@@ -0,0 +1,283 @@
+---
+layout: page
+title: Installing
+---
+
+# Manual installation
+
+<p class="lead">
+ This page describes how to install FixMyStreet patform manually.
+ You can use this if you're used to setting up web applications &mdash;
+ but the other installation options may be easier:</p>
+
+Note that this is just one of
+[four ways to install FixMyStreet]({{ "/install/" | relative_url }})
+(the other ways are easier!).
+
+
+## Manual installation
+
+If you prefer to set up each required component of FixMyStreet
+yourself, proceed with the instructions below.
+
+### 1. Get the code
+
+Fetch the latest version from GitHub:
+
+{% highlight bash %}
+$ mkdir FixMyStreet
+$ cd FixMyStreet
+$ git clone --recursive https://github.com/mysociety/fixmystreet.git
+$ cd fixmystreet
+{% endhighlight %}
+
+<div class="attention-box helpful-hint">
+If you're running an old version of git, prior to 1.6.5, you'll have to clone
+and then run <code>git submodule update --init</code> separately.
+</div>
+
+### 2. Install prerequisite packages
+
+#### a. Debian / Linux
+
+If you're using Debian or Ubuntu, then the packages to install required
+dependencies are listed in `conf/packages.generic`. To install all of them you
+can run e.g.:
+
+{% highlight bash %}
+$ sudo xargs -a conf/packages.generic apt-get install
+{% endhighlight %}
+
+A similar list of packages should work for other Debian-based distributions.
+(Please let us know if you would like to contribute such a package list or
+instructions for other distributions.)
+
+#### b. Mac OS X
+
+Install either MacPorts or HomeBrew (you might well have one already), and then
+use the command below to install a few packages that FixMyStreet needs, for
+which it's much simpler to install via a packaging system.
+
+##### i. MacPorts
+
+{% highlight bash %}
+$ port install gettext p5-locale-gettext p5-perlmagick jhead postgresql91-server
+{% endhighlight %}
+
+##### ii. HomeBrew
+
+{% highlight bash %}
+$ brew install gettext perlmagick jhead postgresql
+$ brew link gettext --force
+{% endhighlight %}
+
+<div class="attention-box">
+gettext needs to be linked for the Locale::gettext Perl module to install; you
+can unlink gettext once everything is installed.
+</div>
+
+#### c. Other
+
+You need Perl 5.8, ImageMagick with the perl bindings, and gettext.
+If you're expecting a lot of traffic it's recommended that you install memcached: <http://memcached.org/>
+
+### 3. Install prerequisite Perl modules
+
+FixMyStreet uses a number of CPAN modules; to install them, run:
+
+{% highlight bash %}
+$ bin/install_perl_modules
+{% endhighlight %}
+
+This should tell you what it is installing as it goes. It takes some time, so
+feel free to continue with further steps whilst it's running.
+
+<div class="attention-box helpful-hint">
+<!-- Below hopefully not needed as installed p5-locale-gettext above
+<p>Note, with MacPorts you might have to specify some compilation PATHs:</p>
+<pre><code>C_INCLUDE_PATH=/opt/local/include LIBRARY_PATH=/opt/local/lib bin/install_perl_modules</code></pre>
+-->
+<p>It is possible you may need to install some source packages to allow some of
+the included modules to be built, including expat (libexpat1-dev), postgresql
+(postgresql-server-dev-8.4), or the GMP math library (libgmp3-dev).</p>
+</div>
+
+### 4. Generate CSS
+
+There is a script, `bin/make_css`, that converts our SCSS files to CSS files.
+So let's run that:
+
+{% highlight bash %}
+$ bin/make_css
+{% endhighlight %}
+
+### 5. Create a new PostgreSQL database
+
+The default settings assume the database is called fms and the user the same.
+You can change these if you like. Using the defaults, create a user and
+database using the following (do not worry if the `CREATE LANGUAGE` step gives
+an error that it already exists, it might well do depending on how your
+PostgreSQL was installed):
+
+{% highlight sql %}
+$ sudo -u postgres psql
+postgres=# CREATE USER fms WITH PASSWORD 'somepassword';
+CREATE ROLE
+postgres=# CREATE DATABASE fms WITH OWNER fms;
+CREATE DATABASE
+postgres=# \c fms
+postgres=# CREATE LANGUAGE plpgsql;
+postgres=# \q
+$
+{% endhighlight %}
+
+You should be able to connect to the database with `psql -U fms fms` -- if not,
+you will need to investigate [how to allow access to your PostgreSQL database]({{ "/install/database" | relative_url }}).
+
+#### 5b. Install database schema
+
+Now you can use the provided schema migration script to create the required
+tables, triggers, and initial data. Run the following:
+
+{% highlight bash %}
+$ bin/update-schema --commit
+{% endhighlight %}
+
+### 6. Set up config
+
+The settings for FixMyStreet are defined in `conf/general.yml` using the YAML
+markup language. There are some defaults in `conf/general.yml-example` which
+you should copy to `conf/general.yml`:
+
+{% highlight bash %}
+$ cp conf/general.yml-example conf/general.yml
+{% endhighlight %}
+
+The bare minimum of settings you will need to fill in or update are:
+
+* [FMS_DB_PASS]({{ "/customising/config/#fms_db_pass" | relative_url }}) -- this is the password for the database. (Also obviously change any other database settings you did differently here.)
+* [BASE_URL]({{ "/customising/config/#base_url" | relative_url }}) -- for using the development server, set to `'http://localhost:3000/'`. This is the URL of the homepage of your FixMyStreet installation.
+* [MAPIT_URL]({{ "/customising/config/#mapit_url" | relative_url }}) -- for the development server, set to `'http://localhost:3000/fakemapit/'`. This would be the URL of a MapIt installation, as and when you use one.
+
+Some others you might want to look at, though the defaults are enough for it to run:
+
+* [EMAIL_DOMAIN]({{ "/customising/config/#email_domain" | relative_url }}) -- the email domain that emails will be sent from
+* [CONTACT_EMAIL]({{ "/customising/config/#contact_email" | relative_url }}) -- the email address to be used on the site for the contact us form.
+* [DO_NOT_REPLY_EMAIL]({{ "/customising/config/#do_not_reply_email" | relative_url }}) -- the email address to be used on the site for e.g. confirmation emails.
+* [STAGING_SITE]({{ "/customising/config/#staging_site" | relative_url }}) -- if this is 1 then all email (alerts and reports) will be sent to the contact email address. Use this for development sites.
+* [UPLOAD_DIR]({{ "/customising/config/#upload_dir" | relative_url }}) -- this is the location where images will be stored when they are uploaded. It should be accessible by and writeable by the FixMyStreet process.
+* [GEO_CACHE]({{ "/customising/config/#geo_cache" | relative_url }}) -- this is the location where Geolocation data will be cached. It should be accessible by and writeable by the FixMyStreet process.
+
+If you are using Bing or Google maps you should also set one of
+[BING_MAPS_API_KEY]({{ "/customising/config/#bing_maps_api_key" | relative_url }}) or
+[GOOGLE_MAPS_API_KEY]({{ "/customising/config/#google_maps_api_key" | relative_url }}).
+
+### 7. Set up some required data
+
+You need to generate the data used for the `/reports` page (this is run by the
+crontab, but to have it working from the start, we can run the script
+manually). Also, if you wish to use other languages, you will need to generate
+.mo files for them.
+
+{% highlight bash %}
+$ bin/update-all-reports
+$ commonlib/bin/gettext-makemo FixMyStreet
+{% endhighlight %}
+
+### 8. Run
+
+The development server can now hopefully be run with:
+
+{% highlight bash %}
+$ script/server
+{% endhighlight %}
+
+The server will be accessible as <http://localhost:3000/>. You can run with -r
+in order for the server to automatically restart when you update the code.
+
+
+### Post-install: Things you might want to change
+
+#### Next Steps
+
+* Create a superuser with the `bin/createsuperuser` script to access admin site.
+* [Customise your install using Templates, CSS and a Cobrand module](/customising/).
+* Add contact details for authorities and categories using the admin interface.
+
+#### Tile server
+
+You will also need a tile server to serve up map tiles. FixMyStreet can
+currently use tile servers such as Bing, OpenStreetMap and Google, defaulting
+to OpenStreetMap.
+
+#### Geocoding
+
+Finally, you will need a geolocation service to turn addresses into longitude
+and latitudes. FixMyStreet currently includes code to use Bing, Google, and
+OpenStreetMap geolocation services, again defaulting to OpenStreetMap.
+
+#### Cron jobs
+
+There is an example crontab in `conf/crontab-example`. You can use that as a
+base for your own user crontab.
+
+### Deployment
+
+For <a href="{{ "/glossary/#production" | relative_url }}" class="glossary__link">production</a>
+use of FixMyStreet, we suggest you use Apache or nginx, and
+FastCGI. It should also be possible to run it using Plack/PSGI, if that is
+preferable.
+
+#### Apache
+
+There is an example Apache vhost configuration file in
+`conf/apache-vhost.conf.example` and `conf/httpd.conf-example`, which contain a
+sample configuration and the required redirect rules.
+
+The sample configuration will need the following modules enabled:
+
+* mod_rewrite
+* mod_proxy
+* mod_expires
+* mod_fastcgi
+
+For most Linux distributions you should be able to install these using the
+distribution's packaging system.
+
+#### nginx
+
+There is an example nginx configuration in `conf/nginx.conf.example`. With
+nginx, you need to run the FastCGI service separately - the
+`conf/sysvinit.example` file is an example script you could use to run it as a
+daemon. And you will need to install a FastCGI process manager:
+
+{% highlight bash %}
+$ apt-get install libfcgi-procmanager-perl
+{% endhighlight %}
+
+#### Check it's working
+
+At this point you should be able to restart the webserver and see your
+FixMyStreet installation at the configured URL.
+
+You can run the unit tests by running the following command in the
+`fixmystreet` directory:
+
+{% highlight bash %}
+$ bin/run-tests t
+{% endhighlight %}
+
+The `master` branch of the repository should always be passing all tests for
+our developers and on mySociety's servers.
+
+## Problems?
+
+See some [troubleshooting hints]({{ "/install/troubleshooting/" | relative_url }}) if
+something's not working for you.
+
+## When you've finished
+
+Please see the instructions for [updating your code](/updating/) once it's installed.
+
+If you want to know which bits of FixMyStreet are in which directory, see this
+[summary of the directory structure](/directory_structure).
diff --git a/docs/install/troubleshooting.md b/docs/install/troubleshooting.md
new file mode 100644
index 000000000..2b49cb616
--- /dev/null
+++ b/docs/install/troubleshooting.md
@@ -0,0 +1,118 @@
+---
+layout: page
+title: Installation troubleshooting
+---
+
+# Installation troubleshooting
+
+<p class="lead">
+ If you've installed FixMyStreet using the
+ <a href="{{ "/install/install-script" | relative_url }}">installation script</a>
+ or the
+ <a href="{{ "/install/ami" | relative_url }}">AMI</a>, you should be good to go.
+ However, if you've done a
+ <a href="{{ "/install/manual-install" | relative_url }}">manual install</a>,
+ sometimes you might bump into a problem if your system is different from
+ what FixMyStreet expects. These hints might help.
+</p>
+
+## Common Problems
+
+* [locale](#locale): must be installed
+* [template caching](#template-caching)
+* [Image::Magick perl module](#image-magick)
+* [missing Perl modules](#missing-perl-modules)
+* [No styling (CSS)](#no-styling)
+* [Bad YAML format in config settings](#bad-yaml): no response or 500 error
+* [Change of config being ignored](#requires-restart): requires restart
+
+
+<a name="locale"> </a>
+
+### locale: must be installed
+
+By default, FixMyStreet uses the `en_GB.UTF-8`
+<a href="{{ "/glossary/#locale" | relative_url }}" class="glossary__link">locale</a>.
+If it is not installed then it may not start. You need this locale on your
+system even if you're planning on running your site in a different language.
+
+If you've changed the language or languages you're supporting, you must have
+the appropriate locales installed for each of those too.
+
+Check to see what locales your system currently supports with:
+
+<pre><code>locale -a
+</code></pre>
+
+<a name="template-caching"> </a>
+
+### Template caching
+
+FixMyStreet caches compiled
+<a href="{{ "/glossary/#template" | relative_url }}" class="glossary__link">templates</a>
+alongside the source files, so the `templates/web/` directory needs to be writable
+by the process that is running FixMyStreet.
+
+When everything is running OK, you'll see compiled template files with a
+`.ttc` suffix appearing alongside the `.html` ones.
+
+<a name="image-magick"> </a>
+
+### Image::Magick perl module
+
+If your OS has a way to install a binary version of `Image::Magick` then we recommend
+that you do that rather than install via CPAN.
+
+<a name="missing-perl-modules"> </a>
+
+### Missing Perl modules
+
+We think we've included all the modules you should need to run and develop
+FixMyStreet on your machine but if we've missed one, please let us know. If you
+need a new module for something you're developing, please get in touch as
+adding things to carton (the mechanism FixMyStreet uses to manage Perl
+dependencies) is currently not as simple as we would like.
+
+If you tried to run a script in the `bin` directory manually, it failed with
+missing Perl module errors, you can try running it using `bin/cron-wrapper`.
+This sets up the FixMyStreet environment for any script that doesn't do it
+itself (though all provided scripts should do).
+
+<a name="no-styling"> </a>
+
+### No styling (CSS)
+
+FixMyStreet's stylesheets are built using SASS -- the `.css` files themselves
+must be created (they are not shipped as compiled files in the repo). The
+installation process does this for you, but if you did a manual install
+and forgot to do it, or you've changed the `.scss` files and those changes
+aren't showing up, do `bin/make_css` to create them.
+
+<a name="bad-yaml"> </a>
+
+### Bad YAML format in config settings: no response or 500 error
+
+When you change any of the [config settings]({{ "/customising/config/" | relative_url }})
+in `conf/general.yml` (which you will do!), make sure you don't break the YAML
+format. If FixMyStreet can't read that file cleanly, it may time out, causing fastcgi
+to eventually respond with a 500 Internal Server Error.
+
+There are YAML lint tools available for checking the well-formedness of YAML files.
+Remember that your config settings may include sensitive information (your database
+password, for example) so be sensible before using online validators.
+
+Simple things to be wary of: always quote strings that themselves contain a colon,
+be sure to close any open quotes, and avoid using tabs.
+
+<a name="requires-restart"> </a>
+
+### Change of config being ignored: requires restart
+
+If you make changes (such as editing the `conf/general.yml` file) while FixMyStreet
+is running, you may need to restart the process for the change to take effect.
+
+For example, restart the Catalyst FastCGI server with:
+
+<pre><code>sudo /etc/init.d/fixmystreet restart
+</code></pre>
+
diff --git a/docs/install/vagrant.md b/docs/install/vagrant.md
new file mode 100644
index 000000000..0b9cd8812
--- /dev/null
+++ b/docs/install/vagrant.md
@@ -0,0 +1,70 @@
+---
+layout: page
+title: Vagrant
+---
+
+# FixMyStreet using Vagrant
+
+<p class="lead">
+Vagrant provides an easy method to set up virtual development environments &mdash; for
+further information see <a href="http://www.vagrantup.com">the Vagrant website</a>.
+We bundle an example Vagrantfile in the repository, which runs the
+<a href="{{ "/install/install-script/" | relative_url }}">install script</a> for you.
+</p>
+
+Note that this is just one of [four ways to install FixMyStreet]({{ "/install/" | relative_url }}).
+
+<div class="attention-box warning">
+ Vagrant is only suitable for use as a
+ <a href="{{ "/glossary/#development" | relative_url }}" class="glossary__link">development</a>
+ server &mdash; <strong>do not</strong> use it in
+ <a href="{{ "/glossary/#production" | relative_url }}" class="glossary__link">production</a>!
+</div>
+
+This pages describes how to use Vagrant to create a development environment
+where you can run the test suite and the development server, and make changes
+to the codebase.
+
+The advantage of using Vagrant is that it lets you run FixMyStreet within a
+virtual machine (VM), with its own system software and environment set up
+entirely independently of the actual machine it's running on. This means you
+don't have to worry about it interfering with your own machine's operating
+system. The main disadvantage is that the virtual machine runs somewhat slower,
+and makes more demands on the processor, than FixMyStreet running natively.
+
+The basic process is to create a base virtual machine, and then provision it
+with the software packages and setup needed. There are several ways to do this,
+including Chef, Puppet, or the existing FixMyStreet install script (which is
+the method used in the example below). The supplied scripts will create a
+Vagrant VM based on the server edition of Ubuntu 12.04 LTS. This contains
+everything you need to work on FixMyStreet.
+
+1. Clone the repository, `cd` into it and run vagrant. This will provision the
+ system and can take some time.
+
+ git clone --recursive https://github.com/mysociety/fixmystreet.git
+ cd fixmystreet
+ vagrant up --no-color
+
+## Working with the Vagrant box
+
+You've now got a local FixMyStreet development server to work with. You can
+edit the files locally (which means you can use your favourite text editor, for
+example) and the changes will be reflected on the virtual machine.
+
+To start the dev server:
+
+ vagrant ssh
+
+ # You are now in a terminal on the virtual machine
+ cd fixmystreet
+
+ # run the dev server
+ script/server
+
+The server will now be running and you can visit it at the address
+`http://fixmystreet.127.0.0.1.xip.io:3000/`
+
+The username and password to access the admin (at address
+`http://fixmystreet.127.0.0.1.xip.io:3000/admin/`) will have been shown at the
+end of the `vagrant up` output.
diff --git a/docs/overview.md b/docs/overview.md
new file mode 100644
index 000000000..a7af0bf15
--- /dev/null
+++ b/docs/overview.md
@@ -0,0 +1,85 @@
+---
+layout: page
+title: Documentation
+---
+
+Welcome to FixMyStreet Platform
+===============================
+
+<p class="lead">
+ mySociety's open source geographic problem-reporting platform
+</p>
+<div class="homepage-feature">
+ <div class="column">
+ <h3>Install</h3>
+ <p>
+ Begin with the <a href="/install/">installation documentation</a>. Put
+ FixMyStreet on your own Debian/Ubuntu server, or on Amazon EC2.
+ </p>
+ </div>
+ <div class="column">
+ <h3>Customise</h3>
+ <p>
+ FixMyStreet is <a href="/customising/">fully customisable</a> &mdash;
+ change the style, layout, maps, and behaviour of your installation.
+ It's international too: if FixMyStreet is not already available in your
+ language, you don't need any hard-core coding skills to provide a new
+ translation.
+ </p>
+ </div>
+</div>
+<div class="homepage-feature">
+ <div class="column">
+ <h3>Run</h3>
+ <p>
+ Our <a href="/running">information for administrators</a> covers
+ everything you need to do once your FixMyStreet site is up and running.
+ Help is available on everything from defining <a href="/glossary/#area"
+ class="glossary__link">admin boundaries</a> to writing common user support
+ emails.
+ </p>
+ </div>
+ <div class="column">
+ <h3>Join in or get help</h3>
+ <p>
+ There's a friendly <a href="/community/">community</a> comprising
+ full-time mySociety staff, international volunteers, and <em>people like
+ you</em> who are already running their own FixMyStreet sites in their own
+ countries. They're happy to offer technical and non-technical support
+ &mdash; jump in and join!
+ </p>
+ </div>
+</div>
+
+About the FixMyStreet Platform
+------------------------------
+
+The FixMyStreet Platform is an open source project from
+[mySociety](https://www.mysociety.org) to help people run websites for
+reporting common street problems such as potholes and broken street lights to
+an appropriate authority. It's been [running successfully in the
+UK](https://www.fixmystreet.com) since 2007 (in fact, it works so well some UK
+councils use it too), and we're still working on making it better.
+
+FixMyStreet has been copied around the world, and is still under
+<strong>active development</strong>. We work hard to make sure it's easy to
+deploy, customise, and run in locations all over the world.
+
+Could your location use a FixMyStreet site?
+-------------------------------------------
+
+<!-- NB duplicated this in how-it-works.md too -->
+We've written a clear guide for anyone who's thinking about [setting up and
+running FixMyStreet]({{ "/The-FixMyStreet-Platform-DIY-Guide-v1.1.pdf" | relative_url }}). Anyone
+thinking of running such a project **must** read it first -- it explains why
+these sites work, and what you need to think about before you start.
+
+If you're thinking of getting involved, we welcome questions about how it
+works [on our mailing
+list](https://groups.google.com/a/mysociety.org/forum/#!forum/fixmystreet).
+Or, if you're outside the UK, email
+<a href="mailto:international&#64;mysociety.org">international&#64;mysociety.org.</a>
+
+There's also the [FixMyStreet blog](blog/) where we post version release
+information and other progress reports. And we often post FixMyStreet news on
+the <a href="https://www.mysociety.org/blog/">mySociety blog</a> too.
diff --git a/docs/pro-manual/admin-tasks.md b/docs/pro-manual/admin-tasks.md
new file mode 100644
index 000000000..3dd6e30e1
--- /dev/null
+++ b/docs/pro-manual/admin-tasks.md
@@ -0,0 +1,23 @@
+---
+layout: pro
+title: Administrator tasks
+order: 4
+user-guide: true
+---
+
+# Administrator tasks
+
+If you find that you cannot perform any of the tasks detailed below when logged into your FixMyStreet account, it is likely that your account has not been given the relevant permissions.
+
+Contact your account administrator to request these permissions. Accompanying each task covered in this document, you will see ‘permissions required’, listing the checkboxes an Administrator must tick on your account for you to be able to perform this task.
+
+{% include admin-tasks-content.md %}
+
+### Further help
+
+- If you’re a member of council staff using FixMyStreet Pro, questions should be addressed
+to your Administrator.
+- For technical problems and queries, Administrators may contact the FixMyStreet team on
+[bettercities@mysociety.org](mailto:bettercities@mysociety.org).
+- Is something not quite right, or missing from this documentation? Let us know on
+[bettercities@mysociety.org](mailto:bettercities@mysociety.org).
diff --git a/docs/pro-manual/citizens-experience.md b/docs/pro-manual/citizens-experience.md
new file mode 100644
index 000000000..f47c2a124
--- /dev/null
+++ b/docs/pro-manual/citizens-experience.md
@@ -0,0 +1,104 @@
+---
+layout: pro
+title: What is FixMyStreet Pro?
+order: 2
+user-guide: true
+category: user-guide
+---
+
+# The citizen’s experience
+
+Before we can fully explore FixMyStreet Pro’s tools for council staff, it’s important to understand
+the report-making process from the citizen’s point of view.
+
+Here’s a brief look at how a citizen’s experience when reporting an issue located within the
+boundaries of a council using FixMyStreet Pro.
+
+## Making a report
+
+### Where to report
+When a citizen sees a problem and wishes to report it, they can do so in one of three places:
+
+<img alt="Make a report on a council website, fixmystreet.com, or via the FixMyStreet app" src="/assets/img/pro-user-guide/all-the-sites.png" />
+
+- Through the council website, on the council’s branded FixMyStreet instance
+- On FixMyStreet.com, the UK-wide site
+- Via the FixMystreet app
+
+
+No matter which of these channels they use, the report will be visible in all three places. All
+FixMyStreet instances draw from the same database of reports.
+
+<div class="boxout" markdown="1">
+
+<h4 class="boxout__title">What if a user makes a report on the council site, but it’s the responsibility of a different authority?</h4>
+
+That’s fine: FixMyStreet will simply channel it to the correct authority. If it’s within your council boundaries (so, if you are within a two- or three-tier area, and the report category is handled by a different council) the report will still show on the map, but it won’t go into your workflow.
+
+If a user attempts to make a report in a location outside your council boundaries, they’re guided to the main FixMyStreet website.
+
+</div>
+
+### Identifying the report location
+
+<img alt="The start page invites the resident to search for the location of their issue" src="/assets/img/pro-user-guide/home.png" class="admin-screenshot" />
+
+FixMyStreet’s start page invites the resident to search for the location of their issue, by entering any part of an address, for example a street name or postcode. Alternatively they can allow the site to identify their location automatically.
+
+They’re then taken to a map, centred on this location. The user can pan and zoom the map until they find the exact position of the issue they are reporting. Councils on the ‘Avenue’ price tier may
+choose to include GIS data showing assets such as streetlights or trees which may enable further accuracy.
+
+<img alt="Existing reports are visible to reduce the chance of duplicates" src="/assets/img/pro-user-guide/making-report-duplicates.png" class="admin-screenshot"/>
+
+All reports are published online, so at this stage, citizens can see if their issue has already been reported. If they find an existing report they may choose to add an update instead of making their own report.
+
+If not, they place a pin on the map and make their report.
+
+<img alt="When a report is made the details are added via a web form" src="/assets/img/pro-user-guide/making-report.png" class="admin-screenshot" />
+
+They are asked for:
+
+- A category, selected from those provided by the council
+- A title
+- A description
+- Their contact details (if they have previously registered, these do not need to be
+ re-entered)
+- Any other information that the council has stipulated as a requirement, eg for potholes
+ you may add a field which asks for the dimensions.
+
+If the user is not registered or logged in, they may confirm their report by email.
+Note that although it is obligatory to include a name and contact details, the user may opt for their
+name not to be shown on the public report page. Of course, their other contact details are only
+sent to the council and are never made public.
+
+## Receiving a response
+
+<img alt="Reponses from the council via email and published on the report page" src="/assets/img/pro-user-guide/report-response.png" class="admin-screenshot" />
+
+Responses from the council come directly back to the user, via the email address they used to
+make the report. Where councils have opted for full integration with FixMyStreet Pro, responses
+may also be posted as automatic updates on the report. Responses may take the form of a request
+for further information or an update on the status of the issue.
+
+### Updates from other users
+
+FixMyStreet reports are public, and other users may also add updates. This creates an informal
+community forum, and also provides a useful way for the council to understand which issues have
+the highest visibility or create the most dissatisfaction among residents. Any updates on a report
+are sent by email to the report maker, unless they opt out.
+
+## Subscribing to alerts
+
+<img alt="Reponses from the council via email and published on the report page" src="/assets/img/pro-user-guide/local-alerts.png" class="admin-screenshot" />
+
+FixMyStreet users can sign up to receive an email every time a report is made within a specified
+area. This can be useful for anyone who wants to keep an eye on issues within their
+neighbourhood: it’s often used by councillors, community groups, journalists and neighbourhood
+policing teams, as well as by residents.
+
+To set up an email alert, click on ‘Local alerts’ in the top menu bar. Input a postcode or place name
+and you’ll be offered a range of options: you can subscribe to every report made within the entire
+council area; every report made within a particular ward; or within an area roughly covering a
+population of 200,000 people (the size of this area varies with population density).
+Staff need not normally do this, as they will be working in the reports interface daily, and will be
+aware of issues as they arise. \ No newline at end of file
diff --git a/docs/pro-manual/index.md b/docs/pro-manual/index.md
new file mode 100644
index 000000000..85ed8377f
--- /dev/null
+++ b/docs/pro-manual/index.md
@@ -0,0 +1,61 @@
+---
+layout: pro
+title: What is FixMyStreet Pro?
+order: 1
+user-guide: true
+category: user-guide
+---
+
+# What is FixMyStreet Pro?
+
+## History & background
+
+<img alt="This is FixMyStreet Pro" src="/assets/img/pro-user-guide/all-the-sites.png" />
+
+FixMyStreet Pro is a service for councils, which grew out of the website FixMyStreet.com.
+Set up in 2007 by the not-for-profit organisation mySociety, and still running today,
+FixMyStreet.com ​makes it simple for any citizen to report a public street issue, such as graffiti,
+broken streetlights, unsafe paving, highways maintenance or potholes. It covers the whole of the
+UK.
+
+Reports made through FixMyStreet.com are published on the website and sent — primarily by
+email — to the correct UK council for resolution. Councils do not need to have purchased
+FixMyStreet Pro in order to receive these reports, but FixMyStreet Pro adds enhanced functionality
+for staff users, as well as the ability to integrate a tailored version of FixMyStreet on the council
+website as their fault reporting interface.
+
+FixMyStreet has a number of benefits for users. These include:
+- A strong focus on usability, with an interface that practically anyone can use and
+understand;
+- No knowledge required as to which council is responsible for a report: the website sends
+reports to the correct authority based on the category and location selected;
+- Reports are published online, building up a picture of issues in the area, so it’s easy to see
+recurrent problems and resolution rates.
+There are benefits for councils, too:
+- Reports are sent to the correct authority, based on category and location;
+- Because reports are published online, residents can easily see if an issue has been
+reported before, helping cut down on duplicates;
+- The site gives residents a clear illustration of the often otherwise hidden work the council
+has been doing to improve neighbourhoods and communities.
+
+In 2012, mySociety began to develop FixMyStreet as a tool which would be as useful for council
+staff as it is for citizens. FixMyStreet Pro is now a fully-featured cloud-based service which not only
+allows councils to place the report-making functionality on their own websites, but which also provides a number of tools to make report tracking, prioritising and resolution simpler. These have
+been developed in consultation with UK councils.
+
+## FixMyStreet Pro’s features for council staff
+
+FixMyStreet Pro offers enhanced features to client councils, including:
+- A FixMyStreet instance for the council website, providing the council's fault-reporting
+interface, and branded to look like the rest of the site
+- A variety of permissions which can be allocated to staff at a granular level
+- Simple channels of communication with report makers, through status updates and
+template responses
+- The ability to moderate, edit or remove reports
+- Statistical breakdowns of reports
+Depending on which type of installation the council has opted for, there may also be access to:
+- Integration with the council’s existing systems, including CRM tools
+- The ability to view and update reports even when offline
+- Workflow prioritisation and shortlist generation
+- The integration of council-owned assets, such as bins or streetlights, into the map
+interface \ No newline at end of file
diff --git a/docs/pro-manual/print.md b/docs/pro-manual/print.md
new file mode 100644
index 000000000..f69ebe9d6
--- /dev/null
+++ b/docs/pro-manual/print.md
@@ -0,0 +1,5 @@
+---
+layout: pro-print
+title: FixMyStreet Pro User Manual
+bodyclass: user-guide-print
+--- \ No newline at end of file
diff --git a/docs/pro-manual/staff-user-accounts.md b/docs/pro-manual/staff-user-accounts.md
new file mode 100644
index 000000000..3712dfcf5
--- /dev/null
+++ b/docs/pro-manual/staff-user-accounts.md
@@ -0,0 +1,196 @@
+---
+layout: pro
+title: FixMyStreet Pro staff user accounts
+order: 3
+user-guide: true
+categories: user-guide
+---
+
+# FixMyStreet Pro staff user accounts
+
+Now you know how FixMyStreet works from the residents’ point of view, it’s time to look at how
+staff can access and use the admin tools.
+
+## Logging in
+
+Council staff accounts are managed by Administrator-level users.
+
+Contact your Administrator/s if you encounter any problems logging in, or any other aspect of
+account management.
+
+### How to log in
+
+Go to your council’s FixMyStreet installation, click on ‘sign in’, and enter your council email
+address.
+
+You’ll be invited to enter your password if you already have one (i.e, if you have an existing
+FixMyStreet account associated with this email address). If not, go to ‘No, let me sign in by email’.
+
+Decide on a password and enter it in the password box, then click ‘sign in’. A confirmation email
+will be sent to the email address you provided.
+
+### Password security
+
+Your password must contain 6 or more characters, and must not be one of the most commonly
+used combinations (such as ‘Password’ or ‘123456’). Your council may also have password policies
+which you are expected to abide by.
+
+### How to log out
+
+Click on ‘Your account’ in the top menu, then click ‘Sign out’.
+If you are using a device or computer that is shared with others, we advise always logging out at
+the end of your session.
+
+## Changing your password
+
+You can change your password at any time by clicking on ‘Your account’ in the top menu bar.
+
+
+## Permissions
+
+Staff accounts can be assigned a variety of permissions, depending on each team member’s needs
+or responsibilities. Permissions can be combined in any way.
+
+Some common staff roles and the appropriate permissions are shown in the table below, but you
+can tailor your permissions to best reflect your team’s operations.
+
+
+<table class="table table--responsive">
+<thead>
+ <tr>
+ <th></th>
+ <th scope="col">Customer Services</th>
+ <th scope="col">Inspectors</th>
+ <th scope="col">Internal maintenance teams</th>
+ <th scope="col">Administrators</th>
+ </tr>
+</thead>
+<tbody>
+ <tr>
+ <th scope="row">View all reports across the council area</th>
+ <td data-label="Customer Services"><i class="boolean-icon boolean-icon--yes">Yes</i></td>
+ <td data-label="Inspectors"><i class="boolean-icon boolean-icon--yes">Yes</i></td>
+ <td data-label="Internal maintenance teams"><i class="boolean-icon boolean-icon--yes">Yes</i></td>
+ <td data-label="Administrators"><i class="boolean-icon boolean-icon--yes">Yes</i></td>
+ </tr>
+ <tr>
+ <th scope="row">View a single report</th>
+ <td data-label="Customer Services"><i class="boolean-icon boolean-icon--yes">Yes</i></td>
+ <td data-label="Inspectors"><i class="boolean-icon boolean-icon--yes">Yes</i></td>
+ <td data-label="Internal maintenance teams"><i class="boolean-icon boolean-icon--yes">Yes</i></td>
+ <td data-label="Administrators"><i class="boolean-icon boolean-icon--yes">Yes</i></td>
+ </tr>
+ <tr>
+ <th scope="row">Acknowledge a report</th>
+ <td data-label="Customer Services"><i class="boolean-icon boolean-icon--yes">Yes</i></td>
+ <td data-label="Inspectors"><i class="boolean-icon boolean-icon--yes">Yes</i></td>
+ <td data-label="Internal maintenance teams"><i class="boolean-icon boolean-icon--yes">Yes</i></td>
+ <td data-label="Administrators"><i class="boolean-icon boolean-icon--yes">Yes</i></td>
+ </tr>
+ <tr>
+ <th scope="row">Provide an update on a report</th>
+ <td data-label="Customer Services"><i class="boolean-icon boolean-icon--no">No</i></td>
+ <td data-label="Inspectors"><i class="boolean-icon boolean-icon--yes">Yes</i></td>
+ <td data-label="Internal maintenance teams"><i class="boolean-icon boolean-icon--yes">Yes</i></td>
+ <td data-label="Administrators"><i class="boolean-icon boolean-icon--yes">Yes</i></td>
+ </tr>
+ <tr>
+ <th scope="row">Create reports on another user’s behalf</th>
+ <td data-label="Customer Services"><i class="boolean-icon boolean-icon--yes">Yes</i></td>
+ <td data-label="Inspectors"><i class="boolean-icon boolean-icon--yes">Yes</i></td>
+ <td data-label="Internal maintenance teams"><i class="boolean-icon boolean-icon--no">No</i></td>
+ <td data-label="Administrators"><i class="boolean-icon boolean-icon--yes">Yes</i></td>
+ </tr>
+ <tr>
+ <th scope="row">Prioritise a report</th>
+ <td data-label="Customer Services"><i class="boolean-icon boolean-icon--no">No</i></td>
+ <td data-label="Inspectors"><i class="boolean-icon boolean-icon--yes">Yes</i></td>
+ <td data-label="Internal maintenance teams"><i class="boolean-icon boolean-icon--yes">Yes</i></td>
+ <td data-label="Administrators"><i class="boolean-icon boolean-icon--yes">Yes</i></td>
+ </tr>
+ <tr>
+ <th scope="row">Moderate a report</th>
+ <td data-label="Customer Services"><i class="boolean-icon boolean-icon--yes">Yes</i></td>
+ <td data-label="Inspectors"><i class="boolean-icon boolean-icon--no">No</i></td>
+ <td data-label="Internal maintenance teams"><i class="boolean-icon boolean-icon--no">No</i></td>
+ <td data-label="Administrators"><i class="boolean-icon boolean-icon--yes">Yes</i></td>
+ </tr>
+ <tr>
+ <th scope="row">Hide a report</th>
+ <td data-label="Customer Services"><i class="boolean-icon boolean-icon--yes">Yes</i></td>
+ <td data-label="Inspectors"><i class="boolean-icon boolean-icon--no">No</i></td>
+ <td data-label="Internal maintenance teams"><i class="boolean-icon boolean-icon--no">No</i></td>
+ <td data-label="Administrators"><i class="boolean-icon boolean-icon--yes">Yes</i></td>
+ </tr>
+ <tr>
+ <th scope="row">Update a report’s status</th>
+ <td data-label="Customer Services"><i class="boolean-icon boolean-icon--no">No</i></td>
+ <td data-label="Inspectors"><i class="boolean-icon boolean-icon--yes">Yes</i></td>
+ <td data-label="Internal maintenance teams"><i class="boolean-icon boolean-icon--yes">Yes</i></td>
+ <td data-label="Administrators"><i class="boolean-icon boolean-icon--yes">Yes</i></td>
+ </tr>
+ <tr>
+ <th scope="row">Ask for more information</th>
+ <td data-label="Customer Services"><i class="boolean-icon boolean-icon--no">No</i></td>
+ <td data-label="Inspectors"><i class="boolean-icon boolean-icon--yes">Yes</i></td>
+ <td data-label="Internal maintenance teams"><i class="boolean-icon boolean-icon--yes">Yes</i></td>
+ <td data-label="Administrators"><i class="boolean-icon boolean-icon--yes">Yes</i></td>
+ </tr>
+ <tr>
+ <th scope="row">Use template responses</th>
+ <td data-label="Customer Services"><i class="boolean-icon boolean-icon--no">No</i></td>
+ <td data-label="Inspectors"><i class="boolean-icon boolean-icon--yes">Yes</i></td>
+ <td data-label="Internal maintenance teams"><i class="boolean-icon boolean-icon--yes">Yes</i></td>
+ <td data-label="Administrators"><i class="boolean-icon boolean-icon--yes">Yes</i></td>
+ </tr>
+ <tr>
+ <th scope="row">Create template responses</th>
+ <td data-label="Customer Services"><i class="boolean-icon boolean-icon--no">No</i></td>
+ <td data-label="Inspectors"><i class="boolean-icon boolean-icon--no">No</i></td>
+ <td data-label="Internal maintenance teams"><i class="boolean-icon boolean-icon--no">No</i></td>
+ <td data-label="Administrators"><i class="boolean-icon boolean-icon--yes">Yes</i></td>
+ </tr>
+ <tr>
+ <th scope="row">Make a shortlist</th>
+ <td data-label="Customer Services"><i class="boolean-icon boolean-icon--no">No</i></td>
+ <td data-label="Inspectors"><i class="boolean-icon boolean-icon--yes">Yes</i></td>
+ <td data-label="Internal maintenance teams"><i class="boolean-icon boolean-icon--yes">Yes</i></td>
+ <td data-label="Administrators"><i class="boolean-icon boolean-icon--yes">Yes</i></td>
+ </tr>
+ <tr>
+ <th scope="row">View reports offline</th>
+ <td data-label="Customer Services"><i class="boolean-icon boolean-icon--no">No</i></td>
+ <td data-label="Inspectors"><i class="boolean-icon boolean-icon--yes">Yes</i></td>
+ <td data-label="Internal maintenance teams"><i class="boolean-icon boolean-icon--yes">Yes</i></td>
+ <td data-label="Administrators"><i class="boolean-icon boolean-icon--yes">Yes</i></td>
+ </tr>
+ <tr>
+ <th scope="row">Manage staff accounts</th>
+ <td data-label="Customer Services"><i class="boolean-icon boolean-icon--no">No</i></td>
+ <td data-label="Inspectors"><i class="boolean-icon boolean-icon--no">No</i></td>
+ <td data-label="Internal maintenance teams"><i class="boolean-icon boolean-icon--no">No</i></td>
+ <td data-label="Administrators"><i class="boolean-icon boolean-icon--yes">Yes</i></td>
+ </tr>
+ <tr>
+ <th scope="row">Set categories</th>
+ <td data-label="Customer Services"><i class="boolean-icon boolean-icon--no">No</i></td>
+ <td data-label="Inspectors"><i class="boolean-icon boolean-icon--no">No</i></td>
+ <td data-label="Internal maintenance teams"><i class="boolean-icon boolean-icon--no">No</i></td>
+ <td data-label="Administrators"><i class="boolean-icon boolean-icon--yes">Yes</i></td>
+ </tr>
+ <tr>
+ <th scope="row">Access dashboard: summary, timeline, stats</th>
+ <td data-label="Customer Services"><i class="boolean-icon boolean-icon--yes">Yes</i></td>
+ <td data-label="Inspectors"><i class="boolean-icon boolean-icon--yes">Yes</i></td>
+ <td data-label="Internal maintenance teams"><i class="boolean-icon boolean-icon--yes">Yes</i></td>
+ <td data-label="Administrators"><i class="boolean-icon boolean-icon--yes">Yes</i></td>
+ </tr>
+ <tr>
+ <th scope="row">Set priority parameters</th>
+ <td data-label="Customer Services"><i class="boolean-icon boolean-icon--no">No</i></td>
+ <td data-label="Inspectors"><i class="boolean-icon boolean-icon--no">No</i></td>
+ <td data-label="Internal maintenance teams"><i class="boolean-icon boolean-icon--no">No</i></td>
+ <td data-label="Administrators"><i class="boolean-icon boolean-icon--yes">Yes</i></td>
+ </tr>
+</tbody>
+</table>
diff --git a/docs/running/admin_manual.md b/docs/running/admin_manual.md
new file mode 100644
index 000000000..459449a4f
--- /dev/null
+++ b/docs/running/admin_manual.md
@@ -0,0 +1,969 @@
+---
+layout: page
+title: FixMyStreet Administrator's Manual
+author: dave
+---
+
+
+# Administrator's Manual
+
+<p class="lead">What is it like running a FixMyStreet site? This guide
+explains what you can expect, and the types of problem that you might
+encounter. It includes examples of how mySociety manages their own site, <a
+href="https://www.fixmystreet.com/">fixmystreet.com</a>.</p>
+
+## About this document
+
+We'll be giving suggestions and examples of problems from our experience in
+the UK. But there is more than one way to solve issues, and you may well find
+that your own solutions work best.
+
+We hope that you will contribute to this document with your own ideas and
+feedback. You can do this by [contacting us](https://www.mysociety.org/contact/)
+directly, or joining the mailing list.
+
+The [FixMyStreet mailing list](/community) is a great place to share ideas or
+ask questions. Everyone on there has either built, or is building, a
+FixMyStreet site, so they have real-life knowledge and are keen to help.
+
+It's a friendly community, and we recommend that you join in and ask as many
+questions as you need to.
+
+## Other helpful documents
+
+* **Before** you decide to run FixMyStreet, you should read the
+ ["Can we fix it?" DIY Guide]({{ "/The-FixMyStreet-Platform-DIY-Guide-v1.1.pdf" | relative_url }}).
+
+* If you are hosting FixMyStreet yourself, you **must** read the [installation
+ instructions](/install) first. Once you've done that, you'll probably need
+ the information about [customising your site](/customising) too.
+
+* This guide is just one of several useful pages for <a
+ href="{{ "/glossary/#administrator" | relative_url }}" class="glossary__link">administrators</a> in the
+ section about [running FixMyStreet](/running). This document is the most
+ general, so is a good place to start.
+
+## Find your administrator
+
+Every FixMyStreet site needs an <a href="{{ "/glossary/#administrator" | relative_url }}"
+class="glossary__link">administrator</a>. Even when the site is running smoothly,
+your users will need help, and there will be regular administrative tasks to
+perform. So, sooner rather than later, you will need to think about who will
+be responsible.
+
+<div class="attention-box info">
+ If you're just starting on your FixMyStreet project, it's possible that you
+ have not found an administrator yet, or that you didn't realise you needed
+ one. Don't worry! Look through this document to see why you need one, and
+ what sort of tasks they'll be doing.
+</div>
+
+## Who do I need?
+
+The team who sets up the site and those who keep it running day-to-day might
+(or might not) be the same people.
+
+**To set up a new installation**, we recommend you have at least **one
+developer** and **one administrator** who can work on the site.
+
+At the beginning you'll be quite busy. You'll be doing a lot of things, like
+customising your site, collecting the email addresses your users' <a
+href="{{ "/glossary/#report" | relative_url }}" class="glossary__link">problem reports</a> will be sent to,
+and perhaps [promoting your project]({{ "/running/promotion/" | relative_url }}).
+
+**Once your site is up and running**, you can manage with just **one
+administrator**.
+
+The administrator deals with problems and questions from users - we call this
+'user support'. He or she will also answer questions from the bodies you send
+your reports to.
+
+Each day, the administrator of mySociety's UK FixMyStreet site spends, on
+average, between 15 minutes and an hour on user support.
+
+Ideally, your administrator will work every day, as there may be urgent
+requests (see "Types of tasks", below). But if you cannot manage this, a
+couple of sessions a week will be sufficient.
+
+Our administrator usually checks support emails twice a day, in the morning
+and at lunchtime. This breaks the work into very short blocks, but also
+ensures that she can deal with any urgent problems promptly.
+
+## The administration pages ("admin")
+
+### Security
+
+By default, the administration pages &mdash; the "admin" &mdash; can be found at
+`/admin`. These pages must be secured against public access.
+
+We strongly recommend you access your admin over a secure connection, such as
+HTTPS. This means that everything that goes between your computer and the
+server is encrypted, so can't easily be intercepted.
+
+It's also a good idea to allow access to admin only from your own, trusted IP
+addresses.
+
+Both of these precautions require system configuration (that is, they depend
+on settings outside FixMyStreet). If you're running an Apache webserver, you
+can do this using `htauth` &mdash; see [the Apache htauth
+documentation](http://httpd.apache.org/docs/current/mod/mod_authn_file.html).
+If you're using an external hosting service, their technical support staff may
+be willing set this up for you if you can't do it yourself.
+
+It's very important that you do secure your admin: so if you really do have
+problems setting this up, [get in touch](/community/) and we'll try to help.
+
+### Contents
+
+The Admin interface is divided into the following sections. You can access
+them by clicking on the link at the top of any admin page:
+
+* **Summary page** <br/> The summary page shows the number of live <a
+ href="{{ "/glossary/#report" | relative_url }}" class="glossary__link">reports</a>, <a
+ href="{{ "/glossary/#update" | relative_url }}" class="glossary__link">updates</a>, <a
+ href="{{ "/glossary/#alert" | relative_url }}" class="glossary__link">alerts</a>, sent
+ <a href="{{ "/glossary/#survey" | relative_url }}" class="glossary__link">questionnaires</a> and
+ bodies' <a href="{{ "/glossary/#contact" | relative_url }}" class="glossary__link">contacts</a>.
+
+ <p>
+ This page is useful when the media ask how many reports your site has
+ processed. You can also use it to motivate your team, or to prove yourself
+ to official bodies.
+ </p>
+
+* **Bodies** <br/> <a href="{{ "/glossary/#body" | relative_url }}" class="glossary__link">Bodies</a> are the
+ authorities that your site sends reports to. Each body has its own page in
+ the admin, listing the categories of problem that they accept (eg, potholes,
+ street lights, etc) and the email address associated with the category.
+
+ <p>
+ Bodies sometimes change their email addresses, and dealing with this is a
+ regular task for an administrator. You can add or edit bodies from these
+ pages. You can also add or edit their <a href="{{ "/glossary/#category" | relative_url }}"
+ class="glossary__link">categories</a> and <a href="{{ "/glossary/#contact" | relative_url }}"
+ class="glossary__link">contact</a> email addresses. Bodies are associated with
+ one or more <a href="{{ "/glossary/#area" | relative_url }}" class="glossary__link">areas</a>. <a
+ href="{{ "/running/bodies_and_contacts/" | relative_url }}">More information on bodies</a>.
+ </p>
+
+* **Reports** <br/> The reports page lets you search for, and edit <a
+ href="{{ "/glossary/#report" | relative_url }}" class="glossary__link">problem reports</a> and updates.
+
+ <p>
+ You will need to do this often - for example, when a user has emailed to
+ complain about a report, or to ask you to check if the report has been
+ sent.
+ </p>
+ <p>
+ You can search by the user's name, email address, or a word or phrase from
+ the report.
+ </p>
+ <p>
+ If your database is very large &mdash; like the UK FixMyStreet, which has many
+ thousands of reports &mdash; some searches may be a little slow. But if you
+ know the ID of the report, you can tell FixMyStreet to find it directly,
+ using <code>id:</code> first. The ID is in the URL of the live report: for
+ example, on our site, we can find
+ <code>https://www.fixmystreet.com/report/391267</code> by searching for
+ <code>id:391267</code>.
+ </p>
+
+* **Timeline** <br/> The timeline is a log of FixMyStreet activity: report
+ updates, status changes, and so on.
+
+* **Survey** <br/> By default, FixMyStreet sends out <a
+ href="{{ "/glossary/#survey" | relative_url }}" class="glossary__link">surveys</a> (also called
+ questionnaires) to users four weeks after they reported a problem.
+
+ <p>
+ We use these surveys to collect data on the performance of the bodies. The
+ survey page shows statistics based on the responses, which again can be
+ useful for the media, or for research when you are looking at how
+ effective your site has been.
+ </p>
+ <p>
+ If you don't want your FixMyStreet site to send out surveys, you can
+ switch off this behaviour in a <a
+ href="{{ "/customising/cobrand-module/" | relative_url }}">cobrand module</a>.
+ </p>
+
+* **Users** <br/> You can [manage users](/running/users) from this section.
+ For example you can edit a <a href="{{ "/glossary/#user-account" | relative_url }}">user's</a>
+ email address, or <a href="{{ "/glossary/#flagged" | relative_url }}" class="glossary__link">flag</a> or
+ <a href="{{ "/glossary/#abuse-list" | relative_url }}" class="glossary__link">ban</a> or abusive one.
+
+ <p>
+ Each user has an individual page in the admin, and it is sometimes quicker
+ to search for a user than a report, if they have contacted you by email
+ and have not mentioned which report they are talking about. Each user's
+ page lists all their activity on the site.
+ </p>
+ <p>
+ By default, any staff users (those that belong to a body) are listed on
+ this page.
+ </p>
+
+* **Flagged** <br/> You can <a href="{{ "/glossary/#flag" | relative_url }}"
+ class="glossary__link">flag</a> any report or user. This does not <a
+ href="{{ "/glossary/#abuse-list" | relative_url }}" class="glossary__link">ban</a> the user or delete the
+ report - it is just a way of marking a person or a situation as potentially
+ troublesome. Note that you can only flag a report or user from the report
+ or page.
+
+ <p>
+ This can be useful if your team has more than one <a
+ href="{{ "/glossary/#administrator" | relative_url }}" class="glossary__link">administrator</a>. <a
+ href="{{ "/running/users/" | relative_url }}">More information about managing users</a>.
+ </p>
+
+* **Stats** <br/> The stats page lets you analyse the number and types of <a
+ href="{{ "/glossary/#report" | relative_url }}" class="glossary__link">report</a> over a particular date
+ range. Optionally, you can restrict it to report on a single <a
+ href="{{ "/glossary/#body" | relative_url }}" class="glossary__link">body</a>.
+
+ <p>
+ You might use this if you want to know how many reports have been sent
+ within, for example, the last three months, or how many reports have been
+ sent to a specific body since launch.
+ </p>
+
+* **Configuration** <br/> This page shows you a summary of the live
+ configuration information for your site.
+
+<a name="report-states"></a>
+
+## Report states
+
+A <a href="{{ "/glossary/#report" | relative_url }}" class="glossary__link">problem report</a> can be in
+one of these <a href="{{ "/glossary/#state" | relative_url }}" class="glossary__link">states</a>:
+
+<dl class="reveal-on-click" data-reveal-noun="report states">
+ <dt>
+ Unconfirmed
+ </dt>
+ <dd>
+ <p>
+ Until FixMyStreet is certain that the report's creator is genuine, its
+ state remains <em>unconfirmed</em>. Unconfirmed reports do not appear on
+ the website. A report is confirmed (and its state becomes <em>open</em>)
+ when:
+ </p>
+ <ul>
+ <li>
+ its creator clicks on the link in FixMyStreet's confirmation email, or
+ </li>
+ <li>
+ its creator was already logged in when the report was created, or
+ </li>
+ <li>
+ an <a href="{{ "/glossary/#administrator" | relative_url }}"
+ class="glossary__link">administrator</a> confirms it (by searching in
+ <strong>Reports</strong> and changing the state by clicking
+ <strong>edit</strong>).
+ </li>
+ </ul>
+ </dd>
+ <dt>
+ Open
+ </dt>
+ <dd>
+ <p>
+ An <em>open</em> report is one that has not been fixed or closed. This
+ generally means that the body has not yet attended to the problem. Also,
+ this implies that the report is not <em>unconfirmed</em> (see above). <a
+ href="{{ "/glossary/#staff-user" | relative_url }}" class="glossary__link">Staff users</a> can set
+ problems to have alternative "open" states, which by default are:
+ </p>
+ <ul>
+ <li>
+ <em>investigating</em>
+ </li>
+ <li>
+ <em>in progress</em>
+ </li>
+ <li>
+ <em>action scheduled</em>
+ </li>
+ </ul>
+ <p>This list of states can be edited in the admin interface.</p>
+ </dd>
+ <dt>
+ Fixed
+ </dt>
+ <dd>
+ <p>
+ <em>Fixed</em> reports are marked in two possible ways:
+ </p>
+ <ul>
+ <li>
+ <em>fixed - user</em>
+ <br>
+ If a user marks them as fixed in an <a href="{{ "/glossary/#update" | relative_url }}"
+ class="glossary__link">update</a>, or (for the report creator only) as part
+ of the process of answering the 4-week <a href="{{ "/glossary/#survey" | relative_url }}"
+ class="glossary__link">survey</a>.
+ </li>
+ <li>
+ <em>fixed - council</em>
+ <br>
+ If updated by a <a href="{{ "/glossary/#staff-user" | relative_url }}" class="glossary__link">staff
+ user</a> from the body responsible for that report.
+ </li>
+ </ul>
+ </dd>
+ <dt>
+ Closed
+ </dt>
+ <dd>
+ <p>
+ A <a href="{{ "/glossary/#staff-user" | relative_url }}" class="glossary__link">staff user</a>
+ associated with the report's body (or an <a
+ href="{{ "/glossary/#administrator" | relative_url }}" class="glossary__link">administrator</a>) can
+ mark a report as <em>closed</em> without declaring it to be
+ <em>fixed</em>. Possible states by default are:
+ </p>
+ <ul>
+ <li><em>no further action</em></li>
+ <li><em>not responsible</em></li>
+ <li><em>duplicate</em></li>
+ <li><em>internal referral</em></li>
+ </ul>
+ <p>This list of states can also be edited in the admin interface.</p>
+ </dd>
+ <dt>
+ Hidden
+ </dt>
+ <dd>
+ <p>
+ Reports can be hidden by an <a href="{{ "/glossary/#administrator" | relative_url }}"
+ class="glossary__link">administrator</a>, or (if the <a
+ href="{{ "/glossary/cobrand" | relative_url }}" class="glossary__link">cobrand</a> allows it) by a <a
+ href="{{ "/glossary/#staff-user" | relative_url }}" class="glossary__link">staff user</a> associated
+ with the body to which it was sent.
+ </p>
+ <p>
+ Hiding a report means that it is unpublished, and can no longer be seen
+ on the live site - usually because it is abusive or inappropriate.
+ Hidden reports remain in the database, and can be republished if
+ necessary.
+ </p>
+ <p>
+ Remember that a hidden report will probably have been sent to the <a
+ href="{{ "/glossary/#body" | relative_url }}" class="glossary__link">body</a> responsible (so it can
+ still be fixed) &mdash; hiding a report simply prevents it being displayed.
+ </p>
+ </dd>
+</dl>
+
+## Types of Tasks
+
+There are two main types of tasks for FixMyStreet <a
+href="{{ "/glossary/#administrator" | relative_url }}" class="glossary__link">administrators</a>.
+
+* **Maintenance** tasks can be fixed through the FixMyStreet admin interface.
+
+* **User support** is generally handled by email.
+
+The most common maintenance tasks are described below, based on our own
+experience with the UK site.
+
+<dl class="reveal-on-click" data-reveal-noun="types of task">
+ <dt>
+ Bounce-backs / dead email addresses from the bodies
+ </dt>
+ <dd>
+ <p>
+ When FixMyStreet sends a <a href="{{ "/glossary/#report" | relative_url }}"
+ class="glossary__link">problem report</a> to the <a href="{{ "/glossary/#body" | relative_url }}"
+ class="glossary__link">body</a> responsible, sometimes that email bounces
+ back. This usually means the <a href="{{ "/glossary/#contact" | relative_url }}"
+ class="glossary__link">contact</a> email address you've got for that body (and
+ that <a href="{{ "/glossary/#category" | relative_url }}" class="glossary__link">category</a>) is
+ wrong, or has changed.
+ </p>
+ <p>
+ You can tell which report &mdash; and which body and category &mdash;
+ caused the problem by looking at the returned email.
+ </p>
+ <p>
+ Then, in admin, go to <strong>Bodies</strong> and look at the contact
+ email addresses for that body. Check that the email address looks
+ correct (for example, if there are several, see if they adhere to the
+ same format).
+ </p>
+ <p>
+ If everything looks OK, you can check online to see if you can find a
+ better address. Otherwise, you'll need to contact the body and confirm
+ the correct email address to use.
+ </p>
+ <p>
+ Sometimes the email address may be correct, but there's another problem
+ which prevents it receiving the email (such as a full mailbox). Be sure
+ to check the error message that the mail server returned in the
+ bounce-back message.
+ </p>
+ <p>
+ When you have found the correct email address, make sure that you
+ re-send the report which bounced. And if you can't find an address, you
+ should contact the user to let them know that unfortunately you couldn't
+ deliver their report.
+ </p>
+ </dd>
+ <dt>
+ Removing personal data from reports or making them anonymous
+ </dt>
+ <dd>
+ <p>
+ Sometimes people include personal details such as their address in their
+ report. Or they forget to tick the box to make their reports anonymous.
+ Sometimes a user decides to make their report anonymous after they have
+ submitted it.
+ </p>
+ <p>
+ In all cases, you can edit the report in admin by going to
+ <strong>Reports</strong>. Find the report you want, then click on
+ <strong>Edit</strong>.
+ </p>
+ <p>
+ Remove the details that should not be shown (we recommend replacing them
+ with something like “[address removed, but sent to
+ <em>name-of-body</em>]”).
+ </p>
+ <p>
+ If necessary, you can mark the report as anonymous with the yes/no
+ selection box.
+ </p>
+ <p>
+ Be sure to save your changes (click <strong>submit changes</strong>)
+ when you've finished editing.
+ </p>
+ </dd>
+ <dt>
+ Removing reports when users say they didn't realise their report would be
+ public
+ </dt>
+ <dd>
+ <p>
+ Occasionally people who are reporting issues don't understand that the
+ site is public, and they don't want their name associated with the
+ report.
+ </p>
+ <p>
+ In the UK, mySociety's first step is to anonymise the report. If the
+ user insists that the report must be removed, you can hide it instead -
+ then let your user know that you've made the changes they asked for.
+ </p>
+ <p>
+ We're generally happy to hide such reports because we don't want to
+ anger our users. And although this removes them from the website, the
+ problem report will still have been sent to the body responsible.
+ </p>
+ </dd>
+ <dt>
+ Removing inappropriate reports
+ </dt>
+ <dd>
+ <p>
+ There is a 'report abuse' link at the foot of every report, which any
+ user can use to alert you to a report. You will sometimes receive emails
+ to tell you that a report or update is inappropriate or potentially
+ libellous.
+ </p>
+ <p>
+ UK law states that we can be held legally responsible for the content,
+ but only if we have been made aware of it. You should make yourself
+ familiar with the law in your own jurisdiction, and how it may affect
+ your liability.
+ </p>
+ <p>
+ In most cases, if a report has been brought to your attention, you
+ should hide it - unless there is clearly nothing wrong with it.
+ </p>
+ <p>
+ Abuse report emails contain the admin URL of the problem report, so you
+ can click on it and change its state to <em>hidden</em>.
+ </p>
+ <p>
+ It's generally a good idea to then tell the user who reported the abuse
+ that you have removed it. You may also wish to contact the abusive site
+ member to explain why their report has been removed.
+ </p>
+ </dd>
+ <dt>
+ Users who send a report to the support email address
+ </dt>
+ <dd>
+ <p>
+ On the UK FixMyStreet site we are careful to explain that we are an
+ independent organisation, and we do not fix street problems ourselves.
+ </p>
+ <p>
+ But we still frequently receive email that should have gone to a local
+ council. In other words, people click on the 'support' button and submit
+ a report, rather than going through the normal report-making process on
+ the site.
+ </p>
+ <p>
+ We send a carefully-worded response like this:
+ </p>
+ <div class="correspondence">
+ <p>
+ You have emailed the technical support team behind FixMyStreet, when
+ it looks as though you intended your message to go to your council.
+ FixMyStreet is an independent website through which you can contact
+ any council in the UK.
+ </p>
+ <p>
+ If you wish to report a problem please visit www.fixmystreet.com and
+ enter a postcode or street name near where the problem is located. You
+ will then be invited to click on a map to show where the problem is
+ occurring.
+ </p>
+ <p>
+ Your message is below so that you can copy and paste it into the form.
+ *Note that all messages appear on our website, as well as going to the
+ council*.
+ </p>
+ <p>
+ If you are able to take the time to let us know why you emailed this
+ address rather than file a report on the site, it would really help us
+ to make the process clearer for future users.
+ </p>
+ </div>
+ <p>
+ You are welcome to adapt this text to your own site's needs.
+ </p>
+ </dd>
+ <dt>
+ Manually changing users' email addresses </dt>
+ <dd>
+ <p>
+ Users cannot change their email addresses themselves. In admin, go to
+ <strong>Users</strong>, find the user (search by their name or the old
+ email address) and edit the email address to be the new one.
+ </p>
+ </dd>
+</dl>
+
+## Common user support queries
+
+Here is a list of the most common user support queries we get on the UK
+FixMyStreet site.
+
+<dl class="reveal-on-click" data-reveal-noun="support queries">
+ <dt>
+ A body wants to know what email addresses you have on file
+ </dt>
+ <dd>
+ <p>
+ In the UK, it's common for each body to have multiple <a
+ href="{{ "/glossary/#contact" | relative_url }}" class="glossary__link">contacts</a> (usually email
+ addresses) &mdash; for more information, see <a
+ href="{{ "/running/bodies_and_contacts/" | relative_url }}">About bodies and contacts</a>. Your
+ site may be the same.
+ </p>
+ <p>
+ Often, a body will make contact to ask where your reports are being
+ sent. Perhaps they are changing addresses, or they are puzzled because
+ they can see reports on the site but don't know who is receiving them.
+ </p>
+ <p>
+ It's worth being friendly and helpful - if you have a good relationship
+ with the body, they will inform you when their contact details change,
+ and are more likely to treat your users' reports with respect.
+ </p>
+ <p>
+ Note that you can quickly copy and paste all email addresses for a body
+ by clicking on <strong>text only version</strong> on that body's page.
+ </p>
+ </dd>
+ <dt>
+ Body replies to you, not the user
+ </dt>
+ <dd>
+ <p>
+ This can happen if the body has set up their auto-response system
+ incorrectly, for example, the body has used your support email address
+ instead of responding directly to a user.
+ </p>
+ <p>
+ Forward the email to the user. Let the body know you've had to do this,
+ and point out the correct email address to use (FixMyStreet sends its
+ emails with the reply-to field set to that of the user who reported the
+ problem).
+ </p>
+ </dd>
+ <dt>
+ Press enquiries or data/statistic enquiries
+ </dt>
+ <dd>
+ <p>
+ Currently any requests for data or statistics that cannot be seen on the
+ admin summary page have to be handled by a developer, by making SQL
+ queries directly on the database.
+ </p>
+ <p>
+ <a href="{{ "/glossary#staff-user" | relative_url }}" class="glossary__link">Staff users</a> can see
+ the <a href="{{ "/glossary#dashboard" | relative_url }}" class="glossary__link">dashboard</a> for
+ their own body by going to <code>/dashboard</code> when they are logged
+ into the public site. If they don't have a staff user set up, offer to
+ do this for them: see <a href="{{ "/running/users/" | relative_url }}">managing users</a>.
+ </p>
+ </dd>
+ <dt>
+ User needs help on how to make a report on the site
+ </dt>
+ <dd>
+ <p>
+ Sometimes you may get an email from a user saying the site isn't
+ working, or they can't use it. Remember that your users come from all
+ sectors of society, including the very elderly or those who are not used
+ to computers.
+ </p>
+ <p>
+ You will often need to write back to clarify the problem. Ask for as
+ much detail as possible about their operating system and browser - in
+ simple words - and ask them to describe the issue precisely.
+ </p>
+ <p>
+ Often there is no problem with the site (although you should never be
+ certain of that until you have checked). Maybe the user has not seen the
+ submit button, or doesn't understand how to upload a photo, or has not
+ understood how the site works for some other reason.
+ </p>
+ <p>
+ Step-by-step instructions by email can almost always help.
+ </p>
+ </dd>
+ <dt>
+ User does not receive report confirmation email
+ </dt>
+ <dd>
+ <p>
+ <strong>This is almost always because the automated confirmation email
+ has gone into the user's spam folder</strong>.
+ </p>
+ <p>
+ Ask the user to look in their spam folder (and mark email coming from
+ your domain as "not spam" so future emails don't get caught in the same
+ way). If they still can't find it, you can confirm the report from
+ within admin (see <a href="#report-states">Report States</a>, above).
+ </p>
+ <p>
+ If you're running FixMyStreet on your own server, you (or your system
+ administrator) can check your outgoing email logs to confirm that the
+ user's mail server accepted delivery from your end.
+ </p>
+ </dd>
+ <dt>
+ User wants to know how to change their password
+ </dt>
+ <dd>
+ <p>
+ Users don't need a password to use FixMyStreet - they can click the link
+ in the confirmation email instead. But if a user makes a large number of
+ reports, it makes sense to have a password. If they are logged into the
+ site, they do not have to confirm reports via the email link.
+ </p>
+ <p>
+ Any user can set a new password at any time.
+ </p>
+ <p>
+ We send this response to requests to change the password:
+ </p>
+ <div class="correspondence">
+ When you next create a problem report or update, simply choose the
+ option that says 'No, let me confirm by email'. You will be able to
+ create a new password at that point. This will send you a confirmation
+ email. Clicking the link in that email will update your password for
+ you.
+ <p>
+ Alternatively, you can visit https://www.fixmystreet.com/auth and do
+ the same (that is, choose the 'no' option and input your new
+ password).
+ </p>
+ </div>
+ <p>
+ Of course, make sure you change the URL in that message to match your
+ own installation.
+ </p>
+ <p>
+ Note that there's no need to provide the old password, because the
+ change requires the user to click on the confirmation link in the email.
+ </p>
+ </dd>
+ <dt>
+ User wants to edit their problem report
+ </dt>
+ <dd>
+ <p>
+ A user cannot change their message once they have submitted it &mdash; and
+ remember that the report will have already been sent to the body
+ responsible.
+ </p>
+ <p>
+ However, if there is a good case for changing the post on the website,
+ you can do this in the admin. Go to <strong>Reports</strong>, find the
+ report you want, and click on <strong>Edit</strong>.
+ </p>
+ <p>
+ Be sure to save your changes (click <strong>submit changes</strong>)
+ when you've finished editing.
+ </p>
+ </dd>
+ <dt>
+ User requests a new feature or reports a bug
+ </dt>
+ <dd>
+ <p>
+ You can log feature requests and bug reports by submitting (or, if you
+ prefer, by asking your developer to submit) an issue to the public
+ FixMyStreet <a
+ href="https://github.com/mysociety/fixmystreet/issues">GitHub
+ repository</a>.
+ </p>
+ <p>
+ Always search the issues first to check that it hasn't already been
+ raised. If it has, you can add a comment noting that it's been requested
+ again by another user.
+ </p>
+ <p>
+ When users in the UK contact FixMyStreet support with a request for a
+ new feature, we also reply to thank the person for taking an interest in
+ the site. We really do change FixMyStreet in response to user feedback!
+ </p>
+ </dd>
+ <dt>
+ User can't find a relevant category for their problem
+ </dt>
+ <dd>
+ <p>
+ FixMyStreet constructs the list of <a href="{{ "/glossary/#category" | relative_url }}"
+ class="glossary__link">categories</a> of report (for example, "Pothole" or
+ "Graffiti") based on what services the body (or bodies) <em>in that <a
+ href="{{ "/glossary/#area" | relative_url }}" class="glossary__link">area</a></em> provide. See <a
+ href="{{ "/running/bodies_and_contacts/" | relative_url }}">Managing bodies and contacts</a> to
+ see how this works.
+ </p>
+ <p>
+ This has two important consequences: it means the list of categories may
+ be different depending on <em>where</em> the user is reporting the
+ problem, and it means that sometimes the category the user wants is not
+ available.
+ </p>
+ <p>
+ When you add categories for the bodies in your FixMyStreet installation,
+ you should consider adding an "Other" category &mdash; provided, of course,
+ that the body has a general email address for such requests to go to.
+ </p>
+ <p>
+ Be careful, though, because if multiple bodies at the same location
+ offer a category called "Other", FixMyStreet &mdash; correctly &mdash; will send
+ such reports to all of them.
+ </p>
+ <p>
+ To understand more about about this, see <a
+ href="{{ "/running/bodies_and_contacts/" | relative_url }}">Managing bodies and contacts</a>.
+ </p>
+ </dd>
+ <dt>
+ Report has gone to wrong body
+ </dt>
+ <dd>
+ <p>
+ Sometimes a report is sent to the wrong body because the user has placed
+ the pin wrongly, putting the report in a different administrative
+ jurisdiction. Or perhaps the user has chosen the wrong category, routing
+ the report to a different body.
+ </p>
+ <p>
+ mySociety replies to the user asking them to resubmit the report with
+ the pin more correctly positioned, or the right category selected.
+ </p>
+ <p>
+ This problem may indicate that the boundary data you are using is either
+ incorrect, or not accurate enough &mdash; for more information, see <a
+ href="{{ "/customising/fms_and_mapit/" | relative_url }}">How FixMyStreet uses MapIt</a>.
+ </p>
+ </dd>
+ <dt>
+ User wants to unsubscribe from local alerts
+ </dt>
+ <dd>
+ <p>
+ Alerts are sent as emails: there's an unsubscribe link at the foot of
+ each one, so usually you just need to point this out politely.
+ <!-- TODO should be able to unsubscribe them in the admin -->
+ </p>
+ </dd>
+ <dt>
+ User just wants to send praise or thanks
+ </dt>
+ <dd>
+ <p>
+ It's nice to hear! mySociety's FixMyStreet administrator shares these
+ with the team and will always write back to the user to thank them.
+ </p>
+ </dd>
+ <dt>
+ The maps are out of date because there's been new development in the
+ user's area
+ </dt>
+ <dd>
+ <p>
+ Your FixMyStreet installation will normally be using maps from an
+ external source &mdash; by default this is <a href="{{ "/glossary/#openstreetmap" | relative_url }}"
+ class="glossary__link">OpenStreetMap</a>.
+ </p>
+ <p>
+ For the UK FixMyStreet, we use maps produced by the government (Ordnance
+ Survey), and we advise our users to contact them with any errors. Other
+ installations use custom maps too, so the remedy to this problem will be
+ different in different locations.
+ </p>
+ <p>
+ OpenStreetMap is an editable project, so it is possible to encourage
+ users &mdash; or your own team &mdash; to update the map information. It will take
+ a while for the map tiles to update, so these changes might not appear
+ on your own site immediately.
+ </p>
+ </dd>
+</dl>
+<div class="attention-box helpful-hint">
+ <p>
+ A tip from Myf, who looks after the UK FixMyStreet site:
+ </p>
+ <p>
+ “User Support got much quicker for me once I assembled a spreadsheet with
+ the responses to all our most common questions and enquiries - it took a
+ while to put together (because I was learning the ropes) but once it was
+ done, I could just copy and paste, and I can now send the majority of
+ replies off with just a few modifications.
+ </p>
+ <p>
+ I'd really recommend that approach. As well as saving me time, it means I
+ can hand user support over to others when needed, for example, when I go
+ on holiday.”
+ </p>
+</div>
+
+## How the site may be abused
+
+Any website that accepts input from the public can attract abuse - but our
+experience from the UK FixMyStreet site is that it's rare. The following
+section discusses some issues you should be aware of.
+
+### Obscene, rude or illegal material
+
+People may occasionally post rude, defamatory or vexatious material. Here's
+our official policy from the UK FixMyStreet site:
+
+<div class="correspondence">
+ FixMyStreet does not moderate reports before they appear on the site, and we
+ are not responsible for the content or accuracy of material submitted by our
+ users. We will remove any problem report containing inappropriate details
+ upon being informed, a process known as reactive moderation. Many sites
+ utilise this process, for example the BBC, as explained here:
+ <a href="http://news.bbc.co.uk/1/hi/help/4180404.stm">http://news.bbc.co.uk/1/hi/help/4180404.stm</a>.
+</div>
+
+If a user gets in touch to complain about a report, it is sometimes because
+they are offended or distressed by the content. Sometimes a report will
+contain their name and address, and may be a top result when they search for
+themselves on Google.
+
+Understandably, they may be upset or angry. Once you have made any necessary
+modifications to the report - or removed it completely - you should reply
+politely and calmly. Tell the user what action you have taken, and let them
+know about the site policy.
+
+It is important to make it clear that the views our users post on FixMyStreet
+are not the views of mySociety.
+
+We don't perform proactive moderation (that is, checking everything *before*
+publishing it on the site) for two reasons.
+
+First, for the quantity of traffic we handle, it would be impractical. Second,
+doing so would make us liable for the content under UK law. You will need to
+check what the law is in your country, and how best to deal with issues such
+as these.
+
+The FixMyStreet code *does* support moderation-before-publication, although
+this is currently only enabled in the Zurich cobrand.
+
+### Spam reports
+
+Many sites which publish user-generated content suffer from spam - that is,
+automated bots posting messages.
+
+On the UK FixMyStreet site, we do not receive many spam reports. Currently it
+is almost entirely prevented by the confirmation link process.
+
+However, we cannot say that this will always be true, and you will need to be
+aware of this possibility.
+
+If your site does start to suffer from spam, please share your experience with
+mySociety and the community, because it's likely that solutions and responses
+to the problem will be useful to everyone.
+
+### Silly or time-wasting reports
+
+Occasionally a user will post a nonsensical report, just for amusement.
+
+Although such things generally seem harmless, remember that, in the age of
+social media, a link to amusing content can spread fast.
+
+In the UK, we've had one memorable case where the comedy report was publicised
+in many media, and was eventually reported on the BBC website.
+
+You may be thinking that it's great publicity for your site, but remember that
+these reports do get sent through to the bodies responsible. FixMyStreet's
+role as a credible source of reports may be undermined if this happens too
+often.
+
+Also, unfortunately, once one silly report has been made, it often gives other
+users the idea to do the same.
+
+Consequently, on the UK FixMyStreet site we have a policy of hiding such
+reports as soon as we are aware of them, to prevent other users being
+encouraged to copy the behaviour.
+
+### Abuse: conclusion
+
+In practice, "problem users" are judged on a one-by-one basis. You can flag a
+user or a report as problematic, and then, if they transgress again, you can
+ban their email address by adding it to the "abuse list". See [managing
+users](/running/users/) for details.
+
+It's a good idea to agree on a policy for dealing with abuse issues, and to
+make sure all your administrators know what it is.
+
+## Software updates
+
+The FixMyStreet platform is under constant development. This means that new
+features and improvements are made from time to time: we announce new releases
+(which have version numbers) on the [fixmystreet.org blog](/blog), and on
+the mailing list (see [more about staying in touch](/community)).
+
+Updating is a technical activity, and you'll need to log into the server's
+"command shell" to do it &mdash; so ask your developer to do this for you if you're
+not confident.
+
+If you've installed FixMyStreet as a git repository cloned from
+[github.com/mysociety/fixmystreet](https://github.com/mysociety/fixmystreet) &mdash;
+which will be the case if you've followed our installation instructions &mdash;
+your developer should find it easy to update. Make sure they know that
+sometimes these updates do require changes to the database schema too (look
+for new migration files in the `db` directory). Always check the version
+release notes (for example, on the blog) because we'll mention such things
+there.
+
+## And finally...
+
+We wish you all the best with your FixMyStreet problem reporting site.
+
+If you're running an installation outside the UK please let us know by
+emailing international&#64;mysociety.org. If you have any questions, don't
+hesitate to <a href="{{ "/community/" | relative_url }}">contact us</a> and we'll get back to you as
+soon as possible with an answer.
+
diff --git a/docs/running/bodies_and_contacts.md b/docs/running/bodies_and_contacts.md
new file mode 100644
index 000000000..86d06f560
--- /dev/null
+++ b/docs/running/bodies_and_contacts.md
@@ -0,0 +1,194 @@
+---
+layout: page
+title: Bodies and Contacts in FixMyStreet
+author: dave
+---
+
+# Managing bodies and contacts in FixMyStreet
+
+<p class="lead">A <strong><a href="/glossary/#body" class="glossary__link">body</a></strong> is the authority to which problem
+reports will be sent. Each body needs one or more <strong><a href="{{ "/glossary/#contact" | relative_url }}" class="glossary__link">contacts</a></strong>
+(typically these are email addresses) to which particular
+<strong><a href="{{ "/glossary/#category" | relative_url }}" class="glossary__link">categories</a></strong> of problem are sent. </p>
+
+For [FixMyStreet in the UK](https://www.fixmystreet.com/), bodies are councils (county, district, and metropolitan).
+
+## How to add (or edit) a body
+
+You need access to the administration pages of your FixMyStreet installation.
+By default, this is at `/admin`.
+
+Click on **Bodies** and fill in the form. Normally, you _must_ provide a name
+and pick at least one area it covers. See [How FixMyStreet uses
+MapIt](/customising/fms_and_mapit) for more information on how these areas are chosen.
+
+You can specify a <strong><a href="{{ "/glossary/#send-method" | relative_url }}" class="glossary__link">send method</a></strong>. This is *how* FixMyStreet will send the
+problem reports to this body.
+
+If you leave it blank, **send method will default to email**.
+
+A body can have none, one, or many contacts. We strongly recommend every body
+has at least one.
+
+## Add contacts for every category of problem this body can handle
+
+Even if you only have one email address for the body, you can add multiple
+contacts, because each contact is for a particular **category** of problem. So
+even if all the contacts' email addresses are the same, FixMyStreet treats
+them separately. This often makes sense because the body passes these reports
+on to different departments internally. This is also the mechanism FixMyStreet
+uses to describe the category of the problem to the body: it's included,
+clearly, in the email that is sent.
+
+Here's an example of a body and its contacts:
+
+ Body: South Borsetshire District Council
+
+ Contacts:
+
+ Category Email
+ ---------------------------------------------------
+ Bridges road_department@sbdc.gov.uk
+ Potholes road_department@sbdc.gov.uk
+ Traffic lights road_department@sbdc.gov.uk
+ Graffiti services@sbdc.gov.uk
+ Street lighting lights@sbdc.gov.uk
+ Other enquiries@sbdc.gov.uk
+
+Problems about bridges, potholes, and traffic lights in South Borsetshire all
+get sent to the same email address. Don't worry about the order in which the
+contacts appear in the admin, because FixMyStreet sorts them before presenting
+them to the user.
+
+The FixMyStreet admin makes it easy to change your setup if the body changes
+its email addresses or even adds a new department after your site is running.
+
+<div class="attention-box warning">
+<h3>A body with no contacts will never receive any reports</h3>
+<p>
+We do not recommend you run your installation of FixMyStreet with bodies that
+have no contacts. Problems submitted to such a body will remain on the site
+but will not be sent. Problems like this may never get fixed.
+</p>
+<p>
+You really need to find at least one working contact for each body to which
+you want to send reports. This isn't a technical problem, but it can be one of
+the more difficult parts about setting up FixMyStreet.
+</p>
+</div>
+
+### Normally, contacts use email addresses
+
+In most new installations, each contact needs an email address because
+FixMyStreet will send the problem report to the body by email (that's the
+default **send method** for bodies). Make sure you enter the correct email
+address! Note that the public users of FixMyStreet do not automatically see
+these email addresses, because FixMyStreet sends them directly to the body and
+not to the user.
+
+If you're only using email as the send method (which is by far the most
+common), you don't need to provide any more data (such as endpoints or API
+keys). These fields are for alternatives to email.
+
+### Alternatives to email addresses
+
+Although the default method for sending reports is email, there are other ways
+of sending the reports. Note, though, that alternatives to email are only
+possible if the body to which you are trying to send reports supports them.
+Some do; many do not.
+
+See
+[more about integration]({{ "/customising/integration/" | relative_url }})
+to understand the different ways this can work. The first stage of
+integration is injecting problem reports directly into the body's back-end
+system.
+
+We like
+<a href="{{ "/glossary/#open311" | relative_url }}" class="glossary__link">Open311</a>,
+which is an open standard for
+submitting problem reports to a body automatically (by sending the data
+directly to a webservice that consumes it). FixMyStreet also has a number of
+other, custom, methods for submitting data that we've written for specific
+councils in the UK: if you need to write your own, look at the code or ask us
+to help you. Custom integrations can sometimes be difficult, depending on how
+easy it is to get data in and out of the body's internal, back-end systems.
+
+You can change a body's send method -- for example, if you start by sending
+emails, but then discover the body is running an Open311 server, it's easy to
+change over. Note that if you choose a different send method, FixMyStreet will
+need some extra information, such as the URL of the body's endpoint. This
+appears on the form if it's needed.
+
+For more information about Open311, see [this blog post explaining
+it](https://www.mysociety.org/blog/open311-explained).
+
+#### Not all of a body's contacts need to be sent the same way
+
+In fact, if you're working on an installation that can connect to bodies using
+a method other than email, not *all* of a body's contacts need to be sent the
+same way. It's possible to specify a different
+<a href="{{ "/glossary/#send-method" | relative_url }}" class="glossary__link">send method</a>
+for an individual contact. To do this you need to tell FixMyStreet that, for
+this body, the decision of which send method to use can be
+<a href="{{ "/glossary/#devolve" | relative_url }}" class="glossary__link">devolved</a>
+to the contacts. You'll need to edit the body (in `/admin`) and check the box
+marked "Contacts can be devolved". Then mark each of the contacts that are not
+using the body's send method (which by default is email) as "devolved", and
+specify their own send method and details.
+
+## Deleting contacts
+
+If a contact is no longer valid, you can delete it or mark it as inactive. Find
+it on the body's admin page, click to edit it, and select **inactive** or
+**deleted**.
+
+Inactive contacts can still be filtered on map pages, but deleted contacts will
+not appear there at all. Neither sort of contact can be used for new reports.
+
+Deleted contacts are not removed from the FixMyStreet database because doing
+so might break any existing problem reports that used it.
+
+## Deleting bodies
+
+It's unusual to need to delete a body, but it sometimes happens &mdash; for
+example, if a body ceases to exist because it has merged with an existing
+one. If this happens, remember that you may also need to create a new body, or
+change the
+<a href="/glossary/#area" class="glossary__link">admin boundary</a>
+of an existing one.
+
+To delete a body, go to the body's admin page to edit it. Tick the checkbox
+marked **Flag as deleted**, and then click **Update body**.
+
+This does not remove the body from the FixMyStreet database (because there may
+be existing problem reports that depend on it). The reports, and the "deleted"
+body, remain as historic data. Users cannot submit reports to a deleted body.
+
+<div class="attention-box warning">
+ If you're testing FixMyStreet and you're sure you want to <em>really</em>
+ delete a body, because you just created it as test, you need to delete it
+ directly within the database.
+ You cannot do destructive deletion like this through the admin interface.
+ <p>
+ We recommend you do your testing on a
+ <a href="/glossary/#staging" class="glossary__link">staging site</a>
+ rather than
+ <a href="/glossary/#production" class="glossary__link">production</a>.
+ </p>
+</div>
+
+In the UK, where FixMyStreet has been running for a long time, there have
+been several changes to the councils that we cover. You can see deleted councils
+marked in grey on [the list of councils](https://www.fixmystreet.com/reports).
+We handle deleted councils as a special case because we want to direct the user
+to the appropriate extant body instead. For example, see the page for
+[Alnwick Council's reports](https://www.fixmystreet.com/reports/Alnwick); that
+council ceased to exist in 2009.
+
+If you want to replicate behaviour like this on your site, copy the
+`reports/_body_gone.html` template from the `fixmystreet.com` cobrand into your
+own <a href="/glossary/#cobrand" class="glossary__link">cobrand</a>,
+<a href="/customising/templates/">customise it</a>, and make sure you update
+the body to not be associated with any area. You can do this by editing the
+body, and at the **Area covered** drop-down menu making sure no areas are
+selected.
diff --git a/docs/running/example_press_releases.md b/docs/running/example_press_releases.md
new file mode 100644
index 000000000..9a68cfd87
--- /dev/null
+++ b/docs/running/example_press_releases.md
@@ -0,0 +1,316 @@
+---
+layout: page
+title: Example press releases
+author: myf+dave
+---
+
+# Example press releases
+
+Here are templates for two types of press release: one [for national
+media](#national) and one [for local media](#local). These templates show you
+what to include in a standard press release.
+
+Adapt the wording so that it’s suitable for your project — or of course, you
+may wish to write your own press releases from scratch.
+
+Then send it to your media contacts, as described in our
+[guide to promoting FixMyStreet]({{ "/running/promotion" | relative_url }}).
+
+It’s best to copy and paste the text into the body of an email, rather than
+send it as an attachment: journalists say that they are far more likely to read
+an email than an attachment.
+
+<a name="national">&nbsp;</a>
+
+## Press release 1: For national media
+
+<input type="button" class="toggle-button" value="Show/hide explanations" data-target="national-press-release"/>
+
+<div class="mock-document" id="national-press-release">
+ <div class="attention-box helpful-hint">
+ <p>
+ Headline: Put a large headline at the top; you can also use the same
+ wording as the title of your emails, prefaced by the words: PRESS RELEASE.
+ </p>
+ <p>
+ You don’t have to use this sentence, but try to think of a short
+ statement that will attract journalists’ attention as well as explaining
+ what your site will do.
+ </p>
+ </div>
+
+ <h2><span class="replace-text">[Your site’s name]</span>: a new way to get your community fixed</h2>
+
+ <div class="attention-box helpful-hint">
+ <p>
+ If you would like to send your press release before launch, to give
+ journalists a little time to write their story, include an embargo
+ date/time. That means they won’t publish anything until this date.
+ Typically embargo times are given as 12:01am.
+ </p>
+ </div>
+ <h3>EMBARGO: <span class="replace-text">[Date/time]</span></h3>
+
+ <div class="attention-box helpful-hint">
+ <p>
+ Include the URL of your FixMyStreet site, and any other URL that’s
+ useful, eg your organisation’s website.
+ </p>
+ </div>
+ <h3>LINK/S: <span class="replace-text">[URLs]</span></h3>
+
+ <div class="attention-box helpful-hint">
+ <p>
+ Your name and email address/phone number
+ </p>
+ </div>
+ <h3>CONTACT: <span class="replace-text">[hello@example.org]</span></h3>
+
+ <div class="attention-box helpful-hint">
+ <p>
+ Three or four bullet points which summarise the main content of the press
+ release. If you have a quote from a councillor or mayor, so much the
+ better, but if not, it’s fine to quote yourself.
+ </p>
+ </div>
+ <uL>
+ <li>
+ <span class="replace-text">[Name of site]</span> launches today
+ </li>
+ </uL>
+
+ <div class="attention-box helpful-hint">
+ <p>
+ List the most common problems in your own country:
+ </p>
+ </div>
+
+ <ul>
+ <li>
+ Report potholes, broken pavements and other community problems to the
+ authorities responsible for getting them fixed
+ </li>
+ </ul>
+ <ul>
+ <li>
+ “A revolution in citizen to government communication” says founder
+ </li>
+ </ul>
+
+ <div class="attention-box helpful-hint">
+ <p>
+ This is the main body of your press release. Keep it fairly succinct:
+ 5&ndash;10 paragraphs of 1&ndash;2 sentences each is plenty. You can, of
+ course, alter the text to make it more appropriate to your country’s own
+ circumstances.
+ </p>
+ </div>
+
+ <p>
+ <span class="replace-text">[Name of your site]</span>, a new and simple way
+ for citizens to report street faults, launches today.
+ </p>
+ <p>
+ Most people know that it’s the council’s job to fix problems like potholes,
+ dangerous pavements or broken street lights. But reporting such problems
+ can often be a difficult task. People don’t always know which council area
+ they are in. Even if they do, they’re often faced with a lack of
+ information online, or hard-to-navigate web forms.
+ </p>
+ <p>
+ Now, a new website simplifies the process for people in <span
+ class="replace-text">[name of your country or the area that your site
+ covers]</span>.
+ </p>
+ <p>
+ With <span class="replace-text">[name of your site]</span>, a project from
+ <span class="replace-text">[your organisation]</span>, all the user has to
+ do is put a pin in a map to show where the problem is, then add a few lines
+ of text to describe the issue. Optionally, they can also add a photo.
+ </p>
+ <p>
+ <span class="replace-text">[Name of site]</span> sends the issue to the
+ right department of the right council: the user doesn’t even have to know
+ which jurisdiction they are in. From the council’s side, responding to the
+ problem report is as simple as replying to any other email.
+ </p>
+ <p>
+ Reports are already flooding in, including <span class="replace-text">[list
+ some interesting existing reports, with links]</span>.
+ </p>
+ <p>
+ <span class="replace-text">[Name of site]</span> also publishes all reports
+ online, eventually building into a rich resource showing what the prevalent
+ types of problem are in any area. The site uses the FixMyStreet Platform
+ open source software, which has proven effective in the UK and across more
+ than 20 other countries around the world.
+ </p>
+ <p>
+ <span class="replace-text">[Your name]</span>, <span
+ class="replace-text">[your job title or description]</span>, says, “<span
+ class="replace-text">[add a quote here]</span>”.
+ </p>
+ <p>
+ <span class="replace-text">[Name of site]</span> is ready to send off your
+ street fault reports: give it a try at <span
+ class="replace-text">[URL]</span>.
+ </p>
+</div>
+
+<a name="local">&nbsp;</a>
+
+## Press release 2: For regional/local media
+
+<input type="button" class="toggle-button" value="Show/hide explanations" data-target="local-press-release"/>
+
+<div class="mock-document" id="local-press-release">
+ <div class="attention-box helpful-hint">
+ <p>
+ Headline: Put a large headline at the top; you can also use the same
+ wording as the title of your emails, prefaced by the words: PRESS RELEASE.
+ </p>
+ <p>
+ You don’t have to use this sentence, but try to think of a short
+ statement that will attract journalists’ attention as well as explaining
+ what your site will do. Include the name of the local area so they can
+ see how relevant it is to their audience.
+ </p>
+ </div>
+ <h2>
+ <span class="replace-text">[Your site’s name]</span>: a new way to get
+ <span class="replace-text">[city or county name]</span> fixed
+ </h2>
+
+ <div class="attention-box helpful-hint">
+ <p>
+ If you would like to send your press release before launch, to give
+ journalists a little time to write their story, include an embargo
+ date/time. That means they won’t publish anything until this date.
+ Typically embargo times are given as 12:01am.
+ </p>
+ </div>
+ <h3>
+ EMBARGO: <span class="replace-text">[Date/time]</span>
+ </h3>
+
+ <div class="attention-box helpful-hint">
+ <p>
+ Include the URL of your FixMyStreet site, and any other URL that’s
+ useful, eg your organisation’s website.
+ </p>
+ </div>
+ <h3>
+ LINK/S: <span class="replace-text">[URLs]</span>
+ </h3>
+
+ <div class="attention-box helpful-hint">
+ <p>
+ Your name and email address/phone number
+ </p>
+ </div>
+ <h3>
+ CONTACT: <span class="replace-text">[hello@example.org]</span>
+ </h3>
+
+ <div class="attention-box helpful-hint">
+ <p>
+ Three or four bullet points which summarise the main content of the press
+ release. If you have a quote from a councillor or mayor, so much the
+ better, but if not, it’s fine to quote yourself.
+ </p>
+ </div>
+ <ul>
+ <li>
+ <span class="replace-text">[Name of site]</span> launches today
+ </li>
+ </ul>
+
+ <div class="attention-box helpful-hint">
+ <p>
+ List the most common problems in your own country:
+ </p>
+ </div>
+ <ul>
+ <li>
+ Now it’s simple for residents of <span class="replace-text">[city or
+ county name]</span> to report potholes, broken pavements and other
+ community problems
+ </li>
+ </ul>
+
+ <ul>
+ <li>
+ “Let’s get <span class="replace-text">[name of city or county]</span>
+ fixed”, says founder
+ </li>
+ </ul>
+
+ <div class="attention-box helpful-hint">
+ <p>
+ This is the main body of your press release. Keep it fairly succinct:
+ 5&ndash;10 paragraphs of 1&ndash;2 sentences is plenty. You can, of
+ course, alter the text to make it more appropriate to your country’s own
+ circumstances.
+ </p>
+ </div>
+ <p>
+ <span class="replace-text">[Name of your site]</span>, a new and simple way
+ for <span class="replace-text">[city or county name]</span> to report
+ street faults, launches today.
+ </p>
+ <p>
+ Most people know that it’s the council’s job to fix problems like potholes,
+ dangerous pavements or broken street lights <span class="replace-text">[or
+ substitute the common problems in that region]</span>. But reporting such
+ problems can often be a difficult task. People don’t always know which
+ council department to contact. Even if they do, they’re often faced with a
+ lack of information online, or hard-to-navigate web forms.
+ </p>
+ <p>
+ Now, a new website simplifies the process for people in <span
+ class="replace-text">[city or county name]</span>.
+ </p>
+ <p>
+ <span class="replace-text">[Name of your site]</span>, a project from <span
+ class="replace-text">[your organisation]</span>, covers the whole of <span
+ class="replace-text">[the country/name of city]</span>, using smart
+ technology to send problems to the department responsible for getting them
+ fixed.
+ </p>
+ <p>
+ All the user has to do is put a pin in a map to show where the problem is,
+ then add a few lines of text to describe the issue. Optionally, they can
+ also add a photo.
+ </p>
+ <p>
+ <span class="replace-text">[Name of site]</span> sends the issue to the
+ right department of the council: the user doesn’t even have to know which
+ jurisdiction they are in. From the council’s side, responding to the
+ problem report is as simple as replying to any other email.
+ </p>
+ <p>
+ <span class="replace-text">[Name of site]</span> also publishes all reports
+ online, eventually building into a rich resource showing what the prevalent
+ types of problem are in any area. Residents of <span
+ class="replace-text">[city/county name]</span> have already reported issues
+ such as <span class="replace-text">[list some existing reports, with
+ links]</span>.
+ </p>
+ <p>
+ The site uses the FixMyStreet Platform open source software, which has
+ proven effective in the UK and across more than 20 other countries around
+ the world.
+ </p>
+ <p>
+ <span class="replace-text">[Your name]</span>, <span
+ class="replace-text">[your job title or description]</span>, says, “<span
+ class="replace-text">[add a quote here, perhaps mentioning the city or
+ county]</span>”.
+ </p>
+ <p>
+ <span class="replace-text">[Name of site]</span> is ready to send off your
+ street fault reports: give it a try at <span
+ class="replace-text">[URL]</span>.
+ </p>
+
+</div>
diff --git a/docs/running/index.md b/docs/running/index.md
new file mode 100644
index 000000000..e552826dd
--- /dev/null
+++ b/docs/running/index.md
@@ -0,0 +1,44 @@
+---
+layout: page
+title: Running FixMyStreet
+author: dave
+---
+
+# Running FixMyStreet
+
+<p class="lead">After you've installed FixMyStreet, you need to manage the
+site. The information here will help you with the common tasks needed to keep
+everything running smoothly. </p>
+
+<div class="row-fluid">
+<div class="span6">
+<ul class="nav nav-pills nav-stacked">
+<li><a href="admin_manual/">Administrator's manual</a></li>
+<li><a href="staff/">Staff user's manual</a></li>
+<li><a href="bodies_and_contacts">About managing bodies and contacts</a></li>
+<li><a href="users">About users</a></li>
+</ul>
+</div>
+</div>
+
+## Accessing the admin pages
+
+By default the administration pages for FixMyStreet can be found on your
+installation at `/admin`.
+
+When you first deploy your installation of FixMyStreet, this is just a public
+directory. Obviously, for a
+<a href="{{ "/glossary/#production" | relative_url }}" class="glossary__link">production</a>
+server you should **restrict access to
+authorised users only**. For example, if you're running the Apache webserver,
+you can use `htaccess` to do this.
+
+<div class="attention-box warning">
+ <p><strong>You <em>must</em> restrict access to admin</strong>
+ <br>
+ Never put your FixMyStreet site live until you have protected
+ your admin pages.
+ </p>
+</div>
+
+If you can configure your webserver to only allow access to the admin URLs over https, then you should do that, and deny access any other way. It's also a good idea to IP-restrict access to admin URLs if you know where your authorised users will be accessing them from.
diff --git a/docs/running/promotion.md b/docs/running/promotion.md
new file mode 100644
index 000000000..d20c19695
--- /dev/null
+++ b/docs/running/promotion.md
@@ -0,0 +1,512 @@
+---
+layout: page
+title: Promoting your FixMyStreet
+author: myf
+---
+
+# How to promote your FixMyStreet site
+
+So your site is up and running, emails are going off to the right places and
+everything looks good. There’s just one more thing you need: some users.
+
+When people think of the phrase ‘publicity campaign’, they may imagine
+expensive TV advertisements, billboard posters and magazine spreads.
+
+But there are plenty of ways to promote your site that cost nothing, or only a
+little. In this guide, we will be looking at some of the most effective ways
+you can publicise your site on a low budget.
+
+Anyone can manage the actions we’re about to run through, and we promise they
+will bring you more users.
+
+## Things to do before you launch
+
+### Four weeks before launch: make plans
+
+Will you have a launch party or other event? Who will you invite? Do you need
+printed materials? Now is the time to get everything in place.
+
+*Launch parties are not vital, but if you have contacts in the media or local
+government, they’re a good way to make a bit of a splash. They don’t have to be
+expensive: all you need is a few snacks and a good presentation.*
+
+### Three weeks before launch: start filling your site with content
+
+When people start to visit your site, ideally it will already look like a
+successful project that is getting problems fixed.
+
+Consider asking your friends and family to start using it before your official
+launch, so that there is plenty of activity on display.
+
+Or invite your supporters to be ‘beta testers’, with early access to the site.
+If you have a mailing list or newsletter, you can invite your subscribers. If
+you prefer to keep your site protected until your launch, you can always share
+the password with this small group of early users.
+
+If all else fails, post some reports yourself!
+
+### Two weeks before launch: gather media contact details
+
+You’ll be sending announcements to the media, so you’ll need to gather the relevant email addresses before your launch date.
+
+There are often useful lists of these online - search for things like ‘press contact lists’ or ‘media contacts’.
+
+Otherwise, most publications provide a contact page. Put together a spreadsheet of addresses that you can use to send out your press releases when the time comes. Here’s what your spreadsheet might look like at this stage:
+
+<table class="table promo-spreadsheet">
+ <tr class="sheet-header">
+ <th colspan="6">National press</th>
+ </tr>
+ <tr>
+ <th>Name</th>
+ <th>Contact</th>
+ <th>Email address</th>
+ <th>Did they write about us?</th>
+ <th>Link to story</th>
+ <th>Journalist’s name</th>
+ </tr>
+ <tr>
+ <td>The National News</td>
+ <td>James Bloggs</td>
+ <td>newsdesk@nationalnews.com</td>
+ <td>&nbsp;</td>
+ <td>&nbsp;</td>
+ <td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td>The Daily Blah</td>
+ <td>Diana Penfold</td>
+ <td>diana.penfold@thedailyblah.org</td>
+ <td>&nbsp;</td>
+ <td>&nbsp;</td>
+ <td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td><em>add more here...</em></td>
+ <td>&nbsp;</td>
+ <td>&nbsp;</td>
+ <td>&nbsp;</td>
+ <td>&nbsp;</td>
+ <td>&nbsp;</td>
+ </tr>
+ <tr class="sheet-header">
+ <th colspan="6">Regional press</th>
+ </tr>
+ <tr>
+ <th>Name</th>
+ <th>Contact</th>
+ <th>Email address</th>
+ <th>Did they write about us?</th>
+ <th>Link to story</th>
+ <th>Journalist’s name</th>
+ </tr>
+ <tr>
+ <td>Smallton Times</td>
+ <td>William Whistler</td>
+ <td>will@smalltontimes.co.uk</td>
+ <td>&nbsp;</td>
+ <td>&nbsp;</td>
+ <td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td>Realville Mercury</td>
+ <td>Editor</td>
+ <td>editor@themercury.co.uk</td>
+ <td>&nbsp;</td>
+ <td>&nbsp;</td>
+ <td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td><em>add more here...</em></td>
+ <td>&nbsp;</td>
+ <td>&nbsp;</td>
+ <td>&nbsp;</td>
+ <td>&nbsp;</td>
+ <td>&nbsp;</td>
+ </tr>
+</table>
+
+You can fill in the last three columns after launch.
+
+### One week before launch: notify councils and local authorities (perhaps)
+
+Consider speaking to the authorities who will be receiving your reports —
+especially those who do not already have a fault-reporting system online.
+
+You will know best how your site is likely to be received by these authorities.
+In the UK, we’ve had a variety of experiences, from a small number of councils
+who don’t see the point, or dislike our service, to those who think it’s
+wonderful.
+
+Approach councils in the right way, and they may be glad to help you advertise
+your site to their residents. In any case, it’s always good to build up
+relationships with these bodies, because they can keep you updated about
+changes of email addresses or the different departments reports should be sent
+to.
+
+## At launch
+
+Your launch day has arrived! Time to get busy.
+
+Hopefully, your period of beta-testing (or while your friends and family have
+been using the site) will have helped you detect and solve any technical
+issues, so when launch comes, you can dedicate yourself at least a couple of
+days to promotion.
+
+### 1. Tell the media
+
+Newspapers and magazines, TV and radio shows — every time there’s a mention of
+your new site, it will bring you users.
+
+FixMyStreet has a great advantage when it comes to press coverage: the overall
+concept is interesting to national media, while the local aspects of the site
+appeal to regional media, too.
+
+#### Press releases
+
+Send details of your launch to any outlet you think will cover it. Be clear and
+concise: explain what the site is for and how it benefits users.
+
+Not sure how to write a press release?
+[We’ve provided a template here]({{ "/running/example_press_releases" | relative_url }}).
+
+You may wish to send out two types of press release:
+
+* A release for the national media, explaining that the site covers the whole
+ country (if that’s the case) and that the great benefit for users is that
+ they don’t need to know which council is responsible for which type of
+ problem in which jurisdiction.
+
+* A release for local press, pointing out that residents in their area can now
+ make reports quickly and easily. You can copy and paste the name of the
+ region into each one, so it seems especially relevant to them.
+
+But be careful: when the team behind [FiksGataMi](http://fiksgatami.no), the
+Norwegian FixMyStreet, sent press releases to every media outlet in the
+country, it attracted so many users that their server was overwhelmed with
+traffic!
+
+You can avoid this with load testing, which makes sure that your servers can
+cope with increased amounts of traffic, or simply by sending out your press
+releases at intervals, over a period of time.
+
+> **Pere**: We gathered the email address of every media outlet
+> in Norway, and used this list to send press releases
+> about the service. All local media, all national press,
+> all tv stations, radio stations, technical magazine,
+> everything.
+>
+> This overloaded the service after a few hours.
+> FiksGataMi went down after 2-3 hours.
+> I believe we sent the press release around 8:00 in the
+> morning, it went down before 11:00, and came back online
+> around 14:00.
+>
+> Quite a lot of local papers wrote about FiksGataMi, and
+> suggested their readers used it to report problems. For
+> example Adressavisa, the largest paper in the middle of
+> Norway (Trondheim), published several stories over many
+> days. This caused Trondheim municipality to get more
+> requests than they could handle...
+
+### 2. Local outreach
+
+One of the most direct ways to publicise FixMyStreet is to take it out to the
+people who will use it.
+
+You can do this in your own local town — and if you have friends and supporters in other towns, you can ask them to put up posters or leave leaflets in public places for people to take.
+
+> In the Maldives, the [MakeMyIsland](http://www.makemyisland.mv) ‘roadshow’
+> handed out leaflets on the street, and explained the service to passers-by.
+
+<blockquote class="twitter-tweet" lang="en"><p lang="et" dir="ltr"><a href="https://twitter.com/hashtag/MakeMyIsland?src=hash">#MakeMyIsland</a> roadshow <a href="https://twitter.com/hashtag/hapsnau?src=hash">#hapsnau</a> in Hulhumale&#39; <a href="https://twitter.com/UNDPMaldives">@UNDPMaldives</a> <a href="https://twitter.com/InnovateAP">@InnovateAP</a> <a href="https://twitter.com/UNDPasiapac">@UNDPasiapac</a> <a href="https://twitter.com/mysociety">@mysociety</a> <a href="https://t.co/hqh6busDZr">pic.twitter.com/hqh6busDZr</a></p>&mdash; Nathu Wafir (@nathuwafir) <a href="https://twitter.com/nathuwafir/status/684358147914387456">January 5, 2016</a></blockquote>
+<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
+
+You could do the same: is there an area that is particularly notorious for
+problems such as potholes or rubbish tipping, perhaps? That would be a good
+place to chat to people.
+
+Print up or photocopy a few leaflets. These can be very simple and direct, so
+long as they explain the concept and include the URL. Here’s a postcard that
+the UK FixMyStreet has used:
+
+<a href="https://www.fixmystreet.com/about/posters"><img src="/assets/img/promote-90x130.png" alt="FixMyStreet postcard"></a>
+
+The nice thing about postcards is that they can get your message out twice:
+once to the person who picks it up, and once to the person they send it to.
+
+Put up posters, anywhere people are likely to see them: on universities’ notice
+boards, in shops and cafes, libraries... anywhere it’s allowed.
+
+When you design your leaflets and posters, don’t include any content that will
+date (eg mentioning that the site is new and has just launched), and you will
+be able to use them at other events in the future.
+
+## After launch
+
+So, you told lots of people about your FixMyStreet site, and it got lots of
+interest. That’s great.
+
+But people have short memories, so it’s important to keep dedicating some time
+to promoting your site.
+
+You might not have the time or resources to do everything that’s suggested
+below. Why not try a couple, and see how effective they are, then try another
+couple later on, and compare? That way you can find out what works best, and
+where to dedicate your time.
+
+### Social media
+
+Set up accounts on whichever social media is most used in your country: in the
+UK, we have FixMyStreet accounts on Twitter and Facebook. You have the option
+to set up links to your social media accounts in the site’s footer, report
+pages, etc: you can
+[read more about customising your FixMyStreet site here]({{ "/customising/" | relative_url }})
+— or [contact us]({{ "/community/" | relative_url }}) if you need more help.
+
+You’ll need to monitor your accounts daily, in case people ask you questions
+that need a prompt reply. The easiest way is to set up your accounts so that
+you automatically receive an email every time someone mentions you.
+
+For Twitter, go to
+[https://twitter.com/settings/notifications](https://twitter.com/settings/notifications)
+to set your preferences for email alerts.
+
+<a href="https://twitter.com/settings/notifications"><img src="/assets/img/promo-twitter-screenshot.png" alt="Twitter settings screenshot" /></a>
+
+And for Facebook, go to
+[https://www.facebook.com/settings?tab=notifications](https://www.facebook.com/settings?tab=notifications)
+to set your preferences for alerts. Click on ‘pages you manage’ to find the
+settings for your FixMyStreet page.
+
+<a href="https://www.facebook.com/settings?tab=notifications"><img src="/assets/img/promo-facebook-screenshot.png" alt="Facebook notifications screenshot" /></a>
+
+Use your social media accounts to send out regular messages to your followers.
+You might:
+
+* Link to your most interesting (or infuriating, or puzzling, or funny)
+ reports. If they’re interesting enough, people will share them, helping you
+ publicise your site even further.
+* Answer your users’ questions about how the site works.
+* Find people who are complaining about their local community, and tell them
+ about your site.
+* Generally promote your site with timely messages. In the UK, we talk about
+ potholes in the colder months because that is when they tend to appear; and
+ we remind people to report broken street lights when the clocks go back and
+ people are walking home in the dark.
+* Things tend to get fixed more just before the elections - a cynical view, but
+ one that’s true. So this may be a great time to encourage people to make
+ reports, and highlight those that have got things fixed.
+
+#### Keep a blog
+Let users know what enhancements you’ve made, events you’ll be at, or just what you’ve been doing lately, with regular blog posts.
+
+### Regular press releases
+
+Don’t lose that spreadsheet of media contact addresses - you’re going to need
+it again. In fact, make a note on it of which outlets wrote stories about your
+site, and the details of the journalists who wrote the stories, so you can
+contact them directly next time.
+
+> **Pere**: To remind the press about our existence we’ve
+> sent press releases about FiksGataMi on and off since the
+> release.
+
+Of course, you don’t want to irritate your press contacts with over-frequent press releases, but if you make sure that you have a good story to share, many will welcome your emails.
+
+What makes a good story after launch?
+
+* **Statistics**. Use the FixMyStreet dashboard or
+ your Analytics programme to find out things like:
+ * how many reports have been made? (Check `/stats` in
+ your site’s admin dashboard for the overall count, or
+ count for specific councils/within specific timeframes)
+
+ * what are the most frequent types of report?
+ (Difficult to be precise, but
+ `/summary?show_categories=1#category-fix-rate`
+ will give you a general idea)
+
+ * which area is filing the most reports?
+ (Check `/reports` on your live site, but do remember
+ that if council areas are of different sizes or
+ population densities, that also affects numbers)
+
+ * which reports are the most people viewing?
+ (Use your analytics programme, and filter to see URLs
+ containing `report/`)
+
+* **Unusual or funny reports**. You can use your Analytics programme to see
+ which reports have been most-viewed: often they are the ones with the most
+ human interest.
+
+In the UK, one of our most-viewed reports was about a rare bird which had been
+spotted after it escaped from its owner.
+
+<a href="https://www.fixmystreet.com/report/242529"><img src="/assets/img/fms-unusual-bird-screenshot.jpg" alt="FixMyStreet screenshot: report 242529"></a>
+
+The UK FixMyStreet site includes [this page](https://www.fixmystreet.com/about/fun).
+You might like to include something similar: it’s great to point press towards,
+so long as you keep it up to date.
+
+
+* **Success stories** Check the reports that have been marked as fixed, to see
+ if any of them has made a really big difference to a local community.
+* **The local angle** Send local media summaries of the most common types of
+ report in their own area, or the numbers of reports made.
+* **Local radio** In the UK, we are often invited to speak on local radio when
+ they are doing a feature about issues such as potholes or rubbish clearance.
+ Normally, we just talk for five minutes, telling people about the site and
+ what it does. If you have a radio network that covers all regions, contact
+ them to let them know that you are available as a speaker, and you may be
+ added to their list of people to include in such features.
+
+#### Tell journalists to subscribe
+
+You can tell local journalists about the alerts service on FixMyStreet. There
+are links to instructions on setting up alerts on all map pages on the site, or
+on `/alert`.
+
+This functionality allows anyone to subscribe to their local area, so that they
+get an email every time anyone makes a report within that neighbourhood. It’s
+an effort-free way of staying up to date with the issues that concern their
+readers, and also means the journalists can be the first to see any potential
+stories.
+
+> **Myf**: In the UK, we also spent a bit of time contacting very local
+> publications, including parish newsletters and community magazines. Although
+> each publication may only be read by a couple of hundred to a few thousand
+> readers, they are really focused on their own neighbourhood, so the FixMyStreet
+> message works well for them.
+>
+> Because such publications tend to have few staff and not much time, we provided
+> them with a ready-written news story and also some graphics, so all they had to
+> do was drop them into their templates.
+
+### Events
+
+Get involved with events in your area — it’s a good way to meet potential
+users. Or, for most of the types of event listed below, if you can’t attend,
+you could send some leaflets and posters along and ask for them to be
+distributed.
+
+#### Community fairs, festivals, conferences and meetings
+
+Ask if you can have a table. Take leaflets, and a smartphone, tablet or laptop
+if you have internet access.
+
+One very direct way to explain what FixMyStreet does is to invite people to
+search the site and see the problems reported around their own home. Everyone
+is interested to see what has been reported in their own community.
+
+Then you can guide them through the process of making a report themselves.
+
+Optionally, ask people for their email addresses so that you can sign them up
+to a newsletter.
+
+#### Set up your own events
+
+Your local library, hall or co-working space may be glad to let you have a
+room and internet access so that you can show residents how to use FixMyStreet.
+Put up some posters and invite people to drop by for a fifteen-minute demo.
+
+#### Clubs and societies
+
+Certain types of societies’ members will be particularly interested in
+FixMyStreet.
+
+Are there any associations in your country who volunteer to keep the streets
+clean, or do gardening in the local parks? Local history organisations tend to
+be full of people who also have an interest in keeping the community to a good
+standard! Consider women’s groups, local co-operatives, church societies… and
+any other groups with a stake in their community.
+
+> In the UK, we provided special downloadable ‘packs’ for clubs and societies:
+> see the Community Group pack on <a href="https://www.fixmystreet.com/about/posters">this page</a>.
+
+<a href="https://www.fixmystreet.com/about/posters"><img src="/assets/img/promo-community-pack-screenshot.png" alt="FixMyStreet posters screenshot"></a>
+
+#### Internet-related conferences and hackdays
+
+FixMyStreet is for everyone to use, not just those with technical skills — but
+you may find that some of your strongest supporters come from the coder
+community. Because the code is open source, developers can use it to develop
+their own tools, too. Perhaps they will contribute some improvements to the
+main codebase.
+
+### Newsletter
+
+You might have a newsletter that goes out to all supporters of your
+organisation, or one that’s specific to your FixMyStreet site. Either way, send
+regular messages. If you are doing some or all of the activities listed above -
+events, blog posts, news stories - you will already have content for your
+newsletter; you’ll just need to link to it.
+
+Make sure you invite users to sign up to your newsletter. Check our
+[documentation on customising your site]({{ "/customising/" | relative_url }}),
+or mySociety can help you include a message about the newsletter at various
+key points, like:
+
+* in your email alerts
+* at the point when people have completed making a report
+* in the footer of your site
+
+
+### Word of mouth
+
+Word of mouth is an effective way of getting your site known — and it’s free.
+But generally, people won’t talk about your site unless you explicitly ask them
+to.
+
+In the UK, we created [this page](https://www.fixmystreet.com/about/posters),
+with downloads of resources that help people spread the word about FixMyStreet.
+They can print out posters and flyers, and there are templates for news stories
+they can send to local magazines or newsletters. There are even activities for
+school children and Girl Guides, Scouts, Cubs and Brownies. Feel free to copy
+anything from that page and adapt it for your own site/culture/language.
+
+You may also wish to send this same message - “Please tell your friends about
+this site” - via your email alerts, your newsletter, social media, and when you
+meet users face to face. You can never ask enough!
+
+> **Myf**: In the UK, we took this idea one step further. We
+> identified some of our site’s most prolific report-makers,
+> and emailed them to congratulate them for being
+> “FixMyStreet SuperUsers”.
+>
+> We offered to send them a tote bag and stickers which we’d
+> printed up with the FixMyStreet logo, as a way of saying
+> thank you — and we also sent them a large stack of
+> promotional postcards, asking them to leave these in spots
+> around their local town.
+>
+> These people were obviously already predisposed to feel
+> positive about FixMyStreet, so they gladly performed what
+> was, however you look at it, a task that benefited us more
+> than them.
+
+<img src="/assets/img/promo-superuser-screenshot.png" alt="FixMyStreet superuser notice screenshot"/>
+
+Of course, the nice thing about a bright bag is that it also helps promote the
+site as its owner carries it around. Some recipients even photographed their
+bag and put them on Twitter and Instagram!
+
+### Online advertising
+
+If your organisation is a registered charity, and if you operate in one of the
+eligible countries, you can apply for free Google Adwords advertising worth up
+to US $40,000 per year. [Find out more here](https://www.google.co.uk/intl/en/grants/).
+
+mySociety can help you with setting up your account, if required, once you have
+got the grant.
+
+### Share your experiences
+
+If you’ve tried any of these ideas, let us know how it went. What did you
+learn? Any tips for others who are about to launch their own FixMyStreet sites?
+
+Maybe you have some more ideas, or can tell us how you promoted your own site.
+Please share your thoughts and stories on the
+[FixMyStreet mailing list](https://groups.google.com/a/mysociety.org/forum/#!forum/fixmystreet),
+so that everyone can benefit from your knowledge.
+
diff --git a/docs/running/staff.md b/docs/running/staff.md
new file mode 100644
index 000000000..77ca05c8e
--- /dev/null
+++ b/docs/running/staff.md
@@ -0,0 +1,18 @@
+---
+layout: page
+title: Staff users in FixMyStreet
+author: matthew
+---
+
+# Staff users in FixMyStreet
+
+<p class="lead">Privileged accounts with access to management features.</p>
+
+Staff users are a middle rung of account, inbetween normal users of the site
+and superusers with full access to everything. They are associated with a
+particular body, and can have access to different features, depending upon the
+permissions granted to them. All their abilities only apply to reports made
+to the body with which they are associated; all staff users have access to all
+report states, not just open/fixed.
+
+{% include admin-tasks-content.md %}
diff --git a/docs/running/surveys.md b/docs/running/surveys.md
new file mode 100644
index 000000000..fbb889b61
--- /dev/null
+++ b/docs/running/surveys.md
@@ -0,0 +1,175 @@
+---
+layout: page
+title: FixMyStreet's surveys
+author: dave
+---
+
+# FixMyStreet's surveys
+
+<p class="lead">
+ By default, four weeks after a user reports a problem, FixMyStreet sends an
+ email inviting that user to complete a survey (which we also sometimes call a
+ questionnaire). The survey is presented as a page on the site that asks the
+ user about the current
+ <a href="{{ "/glossary/#state" | relative_url }}" class="glossary__link">state</a>
+ of the problem (for example, it may have been fixed), and lets them add an
+ <a href="{{ "/glossary/#update" | relative_url }}" class="glossary__link">update</a>
+ too.
+</p>
+
+We recommend that you keep this feature enabled, because it gives you
+useful data about the problems that have been reported on your site, and
+an indication of the performance of the
+<a href="{{ "/glossary/#body" | relative_url }}" class="glossary__link">bodies</a>
+that should be fixing them. Some users will report a problem and then won't
+really think about it after that. We're happy with this, because it's how the
+site is supposed to work &mdash; reporting a problem is easy and doesn't demand
+any further interaction.
+
+That's why sending a survey email a month later works well. It serves as a
+reminder, and it helps ensure that the reports that have been fixed have their
+states set accordingly.
+
+Of course, it's possible that the problem has already been marked as fixed (or
+indeed any other state). The questionnaire is an opportunity for the user who
+reported the problem to confirm or change this.
+
+The email contains a unique link to a page on the site, inviting the reporter
+to set the state of the problem and, optionally, to add an update. Updates can
+include photographs, so sometimes users add a picture to show the repair or
+fix.
+
+The survey link is authorised for the user who submitted the problem report,
+because it's been sent directly to the email address they've registered with
+your site. This means that the survey is easy for them to access and complete.
+
+Each survey updates and collects data concerning a _single_ report. It's not
+a questionnaire about the general performance of your site.
+
+## Follow-up surveys
+
+If the user doesn't confirm that the problem has been fixed, FixMyStreet will
+offer to send another survey in another four weeks. That's an opt-in question:
+the process will repeat with a new email and survey in four weeks' time, but
+only because the user agreed to this.
+
+## The survey email
+
+The email that is sent out is made using the `questionnaire.txt` template. The
+default is in `/templates/email/default/`. Of course, you should override this
+in your own
+<a href="{{ "/glossary/#cobrand" | relative_url }}" class="glossary__link">cobrand</a>
+&mdash; see more about
+[customising email templates]({{ "/customising/templates/#emails" | relative_url }}).
+
+The email message contains a link to the survey page that includes a token that
+authenticates the user who submitted the report (this is possible because it is
+sent directly to their own email address).
+
+The basic wording of the email is shown below. We put more information in the
+footer (such as links to the site and related social media), and include the
+text of the report that was submitted.
+
+ Hello Anne Example,
+
+ 4 weeks ago, you reported a problem using FixMyStreet.
+
+ The details of that report are at the end of this email.
+
+ To keep FixMyStreet up to date and relevant, we'd appreciate it if
+ you could follow the link below and fill in our short questionnaire
+ updating the status of your problem:
+
+ https://fixmystreet.example.com/Q/BJ6muiBaxLwuF7kwqo
+
+ All the best,
+
+ The FixMyStreet team
+ ...
+
+## What's in the survey?
+
+The default survey invites the user to make an
+<a href="{{ "/glossary/#update" | relative_url }}" class="glossary__link">update</a>
+to the problem report:
+
+ * change the <a href="{{ "/glossary/#state" | relative_url }}" class="glossary__link">state</a>
+ &mdash; for example, to _fixed_, because it's been fixed (unless it was
+ already in that state)
+ * add a comment or description (optional)
+ * upload a photo (also optional)
+
+It also asks:
+
+ * have you ever reported a problem to the body before?
+ * (if the problem has not been marked as fixed) do you want to receive
+ another survey email in four weeks' time?
+
+The default template is defined in `/templates/web/default/questionnaire/*`,
+with the questions in `index`. As with all templates, you can override
+these with your own cobrand &mdash; for details, see
+[customising templates]({{ "/customising/templates/#emails" | relative_url }}).
+
+Note that if you want to collect other data in your survey, you'll need to
+update the source code to handle this.
+
+If the user changes the state of a problem that is currently _fixed_ to
+something else, that is, they effectively re-open the problem, then the update
+comment is not optional.
+
+## How to see the results
+
+You can see the collected results of surveys by logging in as an
+<a href="{{ "/glossary/#administrator" | relative_url }}" class="glossary__link">administrator</a>
+and visiting `admin/questionnaire` in the admin (or click on **Survey** in the
+admin menu bar).
+
+The survey results are shown as total counts and percentages. They provide the
+following numbers:
+
+### First-timers, or repeat users?
+
+* _Reported before / Not reported before_
+ <br>
+ How many reports were made by users who had reported a problem before, and
+ how many are first-time reporters?
+
+We collect that information because it's a key indicator of how much impact a
+platform like FixMyStreet is having. Is it encouraging and enabling people who
+had not previously engaged with authorities to do so?
+
+### How did the state change in the surveys?
+
+* _Old state_
+ <br>
+ The state the problem was in when the user did the survey (remember that
+ anyone, including the body or the user themselves, may have set the state
+ already, before the survey was sent).
+
+* _New state_
+ <br>
+ What state did they change it to?
+
+* _Total_
+ <br>
+ This is the number of problem reports (also expressed as a percentage) that
+ users have moved from the old state to the new state in their surveys.
+
+How complex these results are will depend to some extent on the states that
+your site allows. For example, if you've allowed
+<a href="{{ "/glossary/#staff-user" | relative_url }}" class="glossary__link">staff users</a>
+to have more detailed states to choose from than the public (such as "fixed
+&mdash; council", or "in&nbsp;progress"), then you'll have more combinations to
+deal with. See the [admin manual]({{ "/running/admin_manual/" | relative_url }}) for more
+information about the report states that are available to staff users.
+
+## How to turn questionnaire-sending off
+
+By default, your site will send out questionnaires.
+
+If you don't want your site to send out questionnaires, you need to override
+the `send_questionnaires` method in the `Cobrand` module for your cobrand.
+Surveys will never be sent if that method returns false. This is not controlled
+by a configuration setting, so you do need to edit the Perl code &mdash; see
+more about [changing the Cobrand module](customising/cobrand-module).
+
diff --git a/docs/running/users.md b/docs/running/users.md
new file mode 100644
index 000000000..87b38f0d2
--- /dev/null
+++ b/docs/running/users.md
@@ -0,0 +1,165 @@
+---
+layout: page
+title: Managing users in FixMyStreet
+author: dave
+---
+
+# Managing users in FixMyStreet
+
+<p class="lead">Members of the public who just want to report a problem often
+don't expect or want to create an account. They choose confirmation-by-email
+instead of logging in. Nonetheless FixMyStreet does offer admin capability for
+managing your users.</p>
+
+Regular users or staff can benefit from having an account -- they can set a
+password to make future visits to the site easier. But this is not mandatory.
+
+## How users are normally created
+
+You do not need to create users before the system goes live. Public user
+accounts are created during normal operation. In fact, **it's common to
+*never* create a user in the admin** because the FixMyStreet site takes care
+of it for you..
+
+A new user record is created when an email confirmation link is clicked
+(unless, of course, the user already exists with that email address). This
+process is automatic and, unless the user subsequently sets a password, most
+people don't consider their interaction with FixMyStreet as being
+account-based. For example, around 70% of the users who have reported a
+problem on the UK's [fixmystreet.com](https://www.fixmystreet.com) site did not
+use a password (this effectively means: they did not consider creating an
+account).
+
+## Manually creating a new account (in the admin)
+
+Sometimes it's helpful to manually create a new account for someone --
+typically this is for a staff user (see below).
+
+Firstly if you don't have admin access, you'll want to run the
+`bin/createsuperuser` script to create a user that has access to the admin.
+
+You can create a new user account explicitly using the admin. Go to
+`admin/users` and fill in the form. A confirmation email is not sent to the
+email address if you create a new account in this way.
+
+## Users' passwords
+
+If a user sets a password, they can use it to login on future visits (instead
+of using a confirmation link in an email). We don't make this mandatory.
+
+### Setting or changing a password
+
+Any user can set a password by going to `/auth` and entering a password. A
+confirmation link is emailed in the same way as usual. Clicking on the link
+sets the password for future use, and also confirms the current session.
+
+Changing a password is the same as setting it. A confirmation link is sent to
+the email, which they must click on before the change is made. There's no need
+for the user to enter their *old* password when changing an existing one,
+because the authorisation is still sent as an email confirmation link anyway.
+
+You cannot change a user's password within the admin pages.
+
+### Storing passwords
+
+Passwords are hashed (one-way encryption) when they are stored in the
+database. You cannot recover a user's password; if they forget it, they must
+set a new one.
+
+## Changing a user's email address
+
+You can change a user's email address or name by finding their record at
+`admin/users` and changing the entry there. Email addresses must be unique.
+
+## When users misbehave
+
+Occasionally a user repeatedly posts inappropriate or vexations posts. In our
+experience this is much less common than most people expect. However, it's a
+problem that arises from time to time. As administrator of your installation,
+there are two actions you can take. Firstly, you can *flag* a user, which is
+just a way of marking them (in the admin) so you and other administrators know
+to keep an eye on them. Secondly, you can add their email address to the
+"abuse table".
+
+### Flagging a user
+
+Flagging a user has no practical effect, other than to mark the user as one
+whose actions need to be checked. You can see the flagged users by going to
+`admin/flagged`.
+
+### Blocking a user's email address
+
+If a user persistently abuses your installation, by repeatedly creating
+inappropriate or false reports, for example, you can ban them. If a user
+creates a report while they are banned, they are automatically hidden and not
+sent to the bodies (see [how FixMyStreet sends
+reports](/customising/send_reports)).
+
+To add a user to the 'abuse table', go to the admin pages and find any report
+they have created. Click on **ban email address**.
+
+Users are not automatically notified that they have been banned.
+
+### How you know when a user is misbehaving
+
+The default behaviour of FixMyStreet is **not** to moderate reports before
+they are displayed (although at least one cobrand does support this). Instead,
+every report displayed on the FixMyStreet site has a "report abuse" link, so
+anyone can notify you if inappropriate content has been posted. You can hide a
+report (go to `/admin/reports` to find it, and mark it as hidden) and
+optionally flag or ban its creator. On some installations, staff users can
+hide reports themselves. Hiding a report usually occurs *after* it's already
+been sent to the body responsible (you're simply hiding it from view on the
+FixMyStreet website).
+
+## Staff user accounts (associated with a body)
+
+You can mark any FixMyStreet user as belonging to a body. This marks them as a
+"staff user" for that body. Staff users have extra privileges *which only apply
+to problem reports under the jurisdiction of the body to which the use
+belongs*. These permissions can be set on a per-user basis.
+
+To set (or revoke) staff user status, choose **Users** in the admin, and enter
+the email or name. (It's also possible to access a user via the reports they
+have made). Choose the appropriate body from the **Body** dropdown. Normal
+(not staff) users have no body associated. Then you can assign permissions
+to that user, depending upon what they require access to.
+
+For full details of what staff accounts can do, please see the
+dedicated [staff user](../staff/) page.
+
+<a name="sessions"> </a>
+
+## How FixMyStreet user sessions work
+
+*The following information about sessions is here in case you need to
+understand how it works. For normal operation, you don't need to worry about
+it.*
+
+By default, FixMyStreet uses email confirmation links, text confirmation codes,
+or Facebook/Twitter login tokens, to check that the user is a genuine person,
+with access to the email address/phone number they have provided. Even if
+Facebook/Twitter are used, the site still performs email confirmation.
+
+So FixMyStreet uses the email address or phone number as the key piece of
+information when identifying a user. For email authentication, it sends a
+confirmation link -- with a unique token within it -- to the specified email
+address when an unidentified user performs a task that requires authentication,
+such as submitting a report, or changing their password. For phone
+authentication, it sends a confirmation code by text.
+
+Clicking on a valid email confirmation link, or entering a text confirmation
+code, not only confirms the action it was created for (for example, the report
+is marked as *confirmed*, or the password is changed), but also starts a user
+session. This means that, for the remainder of the session, other such actions
+do not trigger further email confirmations. This is an nonintrusive way of
+authenticating report submissions without explicitly using usernames, or
+accounts, and is a deliberate part of FixMyStreet's design.
+
+It *is* nonetheless possible to set a password, and log into FixMyStreet using
+the email address as the identifier. Regular users, of course, use this
+mechanism. When this happens, a user session is created when they log in.
+
+A **sign out** link is shown on a user's account page once a user session has
+begun. Clicking on it ends the session. User sessions are browser sessions:
+they automatically expire when the user's browser shuts down.
diff --git a/docs/sites.md b/docs/sites.md
new file mode 100644
index 000000000..1f66ee646
--- /dev/null
+++ b/docs/sites.md
@@ -0,0 +1,148 @@
+---
+layout: page
+title: Sites running on the FixMyStreet platform
+---
+
+<H1>Sites running on the FixMyStreet platform</H1>
+
+FixMyStreet works everywhere! Take a look at how FixmyStreet is being
+used in cities and countries across the world.
+
+<h2>Africa</h2>
+<h3>Uganda</h3>
+Site: <a href="http://fixmycommunity.ug/">FixMyCommunity</a>
+<br>
+Launched: 2015
+<br>
+Run by: <a href="http://cewit.or.ug">CEW-IT</a>
+
+<h2>Americas</h2>
+<h3>Dominican Republic</h3>
+Site: <a href="https://www.cuidomiciudad.do/">CuidoMiCiudad</a>
+<br>
+Launched: 2017
+<br>
+Run by: <a href="http://www.adn.gob.do/">Ayuntamiento del Distrito Nacional (ADN)</a>
+
+<h3>Uruguay</h3>
+Site: <a href="http://www.pormibarrio.uy/">PorMiBarrio</a>
+<br>
+Launched: 2014
+<br>
+Run by: <a href="http://www.datauy.org/">DATA</a>
+
+<h2>Asia</h2>
+<h3>Malaysia</h3>
+Site: <a href="http://aduanku.my/">Aduanku</a>
+<br>
+Launched: 2014
+<br>
+Run by: <a href="http://sinarproject.org/">Sinar project</a>
+
+<h2>Australasia</h2>
+<h3>Australia</h3>
+Site: <a href="http://www.fixmystreet.org.au/">FixMyStreet.org.au</a>
+<br>
+Launched: 2013
+<br>
+Run by: <a href="http://www.openlocal.org.au/">Open Local</a>
+
+<h2>Europe</h2>
+
+<h3>France</h3>
+Site: <a href="http://www.fixmystreet.fr/">FixMyStreet.fr</a>
+<br>
+Launched: 2015
+<br>
+Run by: <a href="http://www.fixmystreet-france.fr/">FixMyStreet-France</a>
+
+<h3>Ireland</h3>
+Site: <a href="http://fixmystreet.ie/">FixMyStreet.ie</a>
+<br>
+Launched: 2012
+<br>
+Run by: <a href="http://mygov.ie/">mygov.ie</a>
+
+<h3>Kosovo</h3>
+Site: <a href="https://lokalizo.org">Lokalizo</a>
+<br>
+Launched: 2017
+<br>
+Run by: <a href="http://pi-ks.org/">Prosperity Initiative in Kosovo (PIKS)</a>
+
+<h3>Kosovo</h3>
+Site: <a href="https://ndreqe.com">ndreqe.</a>
+<br>
+Launched: 2017
+<br>
+Run by: <a href="http://dplus-ks.org">Democracy Plus</a>
+
+<h3>Norway</h3>
+Site: <a href="http://www.fiksgatami.no/">FiksGataMi</a>
+<br>
+Launched: 2011
+<br>
+Run by: <a href="http://www.nuug.no/">NUUG</a>
+
+<h3>Alcantarilla, Spain</h3>
+Site: <a href="http://arreglamibarrio.org/">Arregla Mi Barrio</a>
+<br>
+Launched: 2015
+<br>
+Run by: <a href="http://ocm.ocmalcantarilla.es/">Observatorio Ciudadano Municipal de Alcantarilla</a>
+
+<h3>Alcalá de Henares, Spain</h3>
+Site: <a href="http://cuida.alcala.org/">Cuida Alcalá</a>
+<br>
+Launched: 2015
+<br>
+Run by: <a href="http://www.kyopol.net">La Asociación KYOPOL</a>
+
+<h3>Sweden</h3>
+Site: <a href="http://www.fixamingata.se/">FixaMinGata</a>
+<br>
+Launched: 2013
+<br>
+Run by: <a href="http://sambruk.se/">Sambruk</a>
+
+<h3>Switzerland</h3>
+Site: <a href="https://www.zueriwieneu.ch/">ZueriWieNeu</a> in Zurich
+<br>
+Launched: 2013
+<br>
+Run by: <a href="https://www.stadt-zuerich.ch/portal">Zurich City
+Council</a>
+
+<h3>United Kingdom</h3>
+Site: <a href="https://www.fixmystreet.com/">FixMyStreet</a> (the one that started it all!)
+<br>
+Launched: 2007
+<br>
+Run by: <a href="https://www.mysociety.org/">mySociety</a>
+
+
+<h2>And you?</h2>
+
+If you don't see your country listed above, you could start your own
+FixMyStreet. <a href="/overview/">Find out more here</a>.
+
+<h2>Honourable mentions</h2>
+
+<p>Sites powered by FixMyStreet, but sadly no longer running.</p>
+
+<h3>India</h3>
+Site: <b>ZeroTB</b> in Delhi. A
+project to report medicine shortages in the city's clinics, based on a
+modified version of the FixMyStreet platform.
+<br>
+Launched: 2014
+<br>
+Run by: <a href="http://www.article-25.org/">Article 25</a>
+
+<h3>Chile</h3>
+Site: <b>Bellavista En Ación</b>
+<br>
+Launched: 2014
+<br>
+Run by: <a href="http://www.ciudadviva.cl/">Ciudad Viva</a>
+
diff --git a/docs/theme b/docs/theme
new file mode 160000
+Subproject 24fa74a26b1e04b5b4e05ae4f6318700c093f50
diff --git a/docs/training/admins.md b/docs/training/admins.md
new file mode 100644
index 000000000..640cab9c7
--- /dev/null
+++ b/docs/training/admins.md
@@ -0,0 +1,512 @@
+---
+layout: page
+title: FixMyStreet training - administrators
+author: dave
+---
+
+
+Training notes for new administrators
+=============================
+
+<p class="lead">
+ These notes may serve as a basis for training people new to the FixMyStreet
+ platform. They might be helpful if you&rsquo;re setting up a new site or team.
+</p>
+<div class="attention-box helpful-hint">
+ <p>
+ Basic training notes like these are available for
+ <br>
+ <a href="{{ "/training/citizens" | relative_url }}">citizens</a>,
+ <a href="{{ "/training/staff" | relative_url }}">staff</a>, and
+ <a href="{{ "/training/admins" | relative_url }}">administrators</a>.
+ </p>
+ <p>
+ Refer to the <a href="{{ "/overview" | relative_url }}">full documentation</a>
+ for more detailed information!
+ </p>
+</div>
+
+Remember that every FixMyStreet installation is different, and can both
+look and behave differently, depending on how it has been
+[customised]({{ "/customising/" | relative_url }}).
+
+<!-- magically present as slideshow, slides split on h2 or h3 -->
+<a name class="play-as-slideshow"></a>
+
+---
+
+## Admin accounts
+
+* **admin accounts are usually _completely separate_ from staff accounts**
+
+* a _staff user_ logs into the front-end web site
+
+* an _administrator_ normally logs into the back-end
+
+We encourage you to run the admin over an encrypted connection (that is,
+over `https`).
+
+
+## How to log in
+
+You can log into the FixMyStreet admin using the username and password provided.
+
+### Using HTAuth
+
+If your browser asks you to enter your username and password in a browser
+dialogue box (that is, it's not part of the website), you're using HTAuth.
+
+With HTAuth, how you logout will depend on your browser. Some browsers
+automatically log you out when you quit the browser.
+
+Don't access the admin on a public machine using this mechanism unless you
+know how to log out.
+
+## Understanding how the site works
+
+A key thing is that citizen users do not need to know _who_ to send their
+report to.
+
+FixMyStreet works this out by using:
+
+* **the precise _location_** (pin on the map) ...combined with...
+
+* **the _category_ of the problem**
+
+These two things determine:
+
+* **which _body_ is responsible, and hence which _contact_ to send the**
+ **report to**
+
+
+## Or to look at it the other way round
+
+When a user clicks on the map to report a problem...
+
+* the drop-down menu of _categories_ that the user sees
+ only contains categories with contacts belonging to bodies
+ operating in that area
+
+<div class="attention-box info">
+ <p>
+ So users cannot send problem reports to a body...
+ </p>
+ <ul>
+ <li>
+ for a problem that's not within that body's admin boundary
+ </li>
+ <li>
+ with a category of problem that the body isn't responsbile for
+ </li>
+ </ul>
+</div>
+
+## There might be lots of categories!
+
+![example showing many categories]({{ "/assets/img/training/fms-many-categories.png" | relative_url }})
+
+## Getting help in the admin
+
+* there are lots of hints in the admin
+
+* click on <span class="admin-help">**?**</span> orange question marks to
+ see them
+
+## Working with bodies
+
+Click on **Bodies** in the admin (at the top of the admin section)
+to list all the bodies in your system.
+
+* **click on each body's name to see and edit the details**
+
+![example showing many categories]({{ "/assets/img/training/admin-bodies.png" | relative_url }})
+
+
+## Configuring bodies and contacts
+
+You can add new bodies in the admin. Click on **Bodies** -- the form for
+adding a new body is underneath the list of existing bodies.
+The key things you need to provide:
+
+* **the name of the body**
+ <br>
+ as it will appear to the public
+
+* **the administrative boundary**
+ <br>
+ that this body covers (usually just one, but sometimes many, for example, islands)
+
+* **contact addresses** (usually emails)
+ <br>
+ for specific **categories** of problem
+
+## Add a body
+
+![example showing many categories]({{ "/assets/img/training/admin-add-a-body.png" | relative_url }})
+
+
+### You must specify an area
+
+You must indicate the body's admin boundary because if a problem is
+not within the body's area, it won't be reported to it.
+
+<div class="attention-box warning">
+ <strong>a body with no area will not receive any problem reports</strong>
+ <br>
+ this is why you must specify an area
+</div>
+
+We can help with admin boundary data, or providing alternatives
+(such as a the special area "everywhere").
+
+### Where do "areas" come from?
+
+FixMyStreet uses a separate service called MapIt to serve area data.
+
+This is described in detail in the documentation, and must be configured when
+your FixMyStreet site is first set up.
+
+The actual geometric data (polygons describing the boundary of each area) may
+come from the OpenStreetMap project, from your own government's official data,
+or be custom. Ask us if you need help.
+
+## Adding contacts and categories
+
+You need to add contacts to each body.
+
+<div class="attention-box warning">
+ <strong>a body with no contacts will not receive any problem reports</strong>
+ <br>
+ this is why you must add at least one contact
+</div>
+
+* usually contacts are email addresses
+
+* each contact is for a _category_ of problem
+
+* you can have lots of categories even if some or all use the _same_ email address
+
+### Adding a contact
+
+![add a contact/category]({{ "/assets/img/training/admin-add-contact.png" | relative_url }})
+
+
+### Confirm your contacts!
+
+When you enter a contact, if you can confirm it's valid, tick the __Confirmed__
+checkbox:
+
+* reports are only sent to confirmed contacts
+
+<div class="attention-box warning">
+ <strong>a body with no confirmed contacts will not receive any problem reports</strong>
+ <br>
+ this is why you must confirm the contacts if you know they are correct
+</div>
+
+
+We used this mechanism when we started FixMyStreet in the UK -- we crowdsourced
+the contacts from the public, so an admin needed to confirm they were valid
+before we could use them.
+
+### Simple example of a body and its area and contacts
+
+If there's a single authority responsible for burst water
+pipes and public standpipes in the whole country, and it has one email
+address:
+
+* _body:_ National Water Company
+* _area:_ the country's border
+* _categories & contacts_:
+ <br>burst water pipe &rarr; help@examplewater.com
+ <br>blocked standpipe &rarr; help@examplewater.com
+
+## Alternatives to email
+
+If the body has a back-end system that supports it, FixMyStreet _can_
+deliver problem reports directly.
+
+* Open311 -- an open standard for this kind of submission
+
+* admin already supports Open311
+
+* a single body can support more than one kind of "send method" -- some
+ categories using email addresses, and others direct submission
+
+See the full documentation for details about "back-end integration".
+
+## Deleting a body or a contact
+
+Normally you don't need to do this often.
+
+* to delete a body, edit it and tick the checkbox **Flag as deleted**
+
+* to delete a contact (or category), edit it and tick the checkbox **Deleted**
+
+In both cases, this treats it as deleted, but does not remove it from the database.
+
+This is mainly because existing reports may well depend on the (old)
+body or the (old) category.
+
+## Deleting records from the database
+
+* **you cannot delete bodies or categories from the database**
+
+* you can mark them as _deleted_, which behaves in a similar way
+
+If you really need to delete something (a training example body), you
+can't do it through the admin. If you're not sure, or you don't have
+access to your site's database, ask us for help!
+
+## Administering reports
+
+You can access all the report data from the admin.
+For example, as an administrator, you can:
+
+* search for reports on keyword or id
+* find all reports submitted by a particular user
+* change the report wording as displayed on the site
+* see the history of a report
+* hide reports
+
+## Finding a report
+
+Click on **Reports** -- there's a search box at the top.
+
+* if you know the report's number (id), search for `id:1234`
+ <br>
+ a report's id is shown as the number in its URL:
+ <br>
+ `fixmystreet.com/report/1234`
+
+* search by keyword
+
+* find user or body, and scroll
+
+### Searching reports
+
+![search reports]({{ "/assets/img/training/admin-search-reports.png" | relative_url }})
+
+## What the different timestamps mean
+
+There are four date stamps listed when you edit a report.
+You can't change them because they are recorded by the system
+but it can be helpful to understand them.
+
+* **Created** -- when the problem report was entered on the website
+
+* **Confirmed** -- when the creator clicked the email confirmation link
+ <br>
+ If a report was very late in being sent, check this timestamp: remember that
+ a report is _never sent until it has been confirmed_
+ <br>
+ Also, if a user is logged in when they create a report, it's automatically
+ confirmed
+
+* **Sent** -- when the report was sent to the body
+ <br>
+ normally this is up to 5 minutes after the report was confirmed
+
+* **Last update** -- when the record was last changed in the admin
+
+
+## Editing reports
+
+Remember, to edit a report, normally you click on **Reports** and then
+find the report you want by searching, and then clicking on **Edit**
+in list of results.
+
+These are the things you can do when you edit a report:
+
+* change the report's wording
+* change the report's state
+* hide the whole report
+* hide the name of the person who submitted it
+
+Remember to click the **Submit changes** button when you have finished
+editing a report.
+
+## Editing the wording of a report
+
+* **edit the report**
+
+* **text is free to edit in a text area**
+
+* we recommend you **always mark text you've changed**
+
+For example, if you remove someone's telephone number, replace it with
+
+`[telephone number redacted]`
+
+...or something similar. It's good to make it clear that:
+
+1. something was removed
+2. why you removed it
+
+## Changing a report's state
+
+* **edit the report**
+
+* **select the new state from the drop-down list**
+
+If you want to confirm a report (for example, a user has told you they deleted
+their confirmation email before clicking on the link), you can mark an
+_unconfirmed_ report as _open_. This simulates them clicking on the
+confirmation link themselves.
+
+## Hiding a report
+
+<div class="attention-box info">
+ Note that staff users can hide reports belonging to the body they represent,
+ so typically you don't need to do this as an administrator.
+</div>
+
+* **edit the report**
+
+* **change the state to _Hidden: hidden_**
+
+(There are other kinds of _Hidden_ state, but you don't normally need them.)
+
+Remember, hiding a report does not prevent it being sent. It just prevents
+it being displayed on the website.
+
+## Hiding the name of the report's creator
+
+* **edit the report**
+
+* **tick the checkbox labelled _Anonymous_**
+
+## You can edit updates too
+
+When you edit a report, any updates on that report are listed at the bottom
+of the page. You can click **Edit** next to any of those to edit them.
+
+* **you can change similar things in updates as you can reports:**
+
+* change the wording in the update
+* change the state the update sets the report to
+* hide the name of the person who submitted the update
+
+## When did a report get sent?
+
+You can see this on the public site:
+
+![sent yet?]({{ "/assets/img/training/mmi-18-show-when-sent.png" | relative_url }})
+
+..but it's also shown as the "Sent" field if you look at the report in the admin.
+
+* **the report has not been sent yet** if there's no "Sent to..." sentence
+
+* **the "send reports" job normally runs every 5 minutes**
+ <br>
+ so it's normal for a report to not go immediately when it is submitted
+
+## Resending a report
+
+If a report fails to get delivered, you can schedule it to be sent again.
+
+* **to resend a report, edit it and click _Resend report_**
+ <br>
+ again, this can take up to five minutes before it's handled
+
+## Managing users
+
+To access the users in the admin, click **Users**. The page only
+list _staff users_ by default. To see other users, use the search box
+to search across email or name.
+
+![show user]({{ "/assets/img/training/admin-users.png" | relative_url }})
+
+## Editing a user
+
+![edit user]({{ "/assets/img/training/admin-edit-user.png" | relative_url }})
+
+### Change a user's name or email address
+
+* **edit a user by finding them in the list of users and clicking _Edit_**
+
+* (if you click on their email address in the list of search results, you
+ get a list of all the reports and updates they've made)
+
+* note that changing the user's name here doesn't change the name that
+ was recorded with each report that they made before
+
+## Creating a new user
+
+The **Add user** form is underneath the search box and the list of staff users
+when you click **Users**.
+
+<div class="attention-box info">
+ Note that it's unusual to make a normal user this way because, if they need
+ to, any user can make their own account by signing in on the website.
+</div>
+
+* make sure the user has access to the email address you enter
+ <br>
+ check that you've spelled the email address exactly!
+
+* creating a new user in this way means they will _not_ be emailed
+ a notification email
+
+* a normal (not staff) user has _"No body"_ as their body
+
+## Make a staff user
+
+* a staff user is simply a user account that's linked to a body
+
+* they have some special powers over problem reports that were
+ submitted to the body they are linked to
+
+* **edit (or create) the user and choose the right body**
+
+* normal (not staff) users have _"No body"_ as their body
+
+## Flagging reports or users
+
+* **flagging just marks the user or the report for attention**
+ <br>
+ so other administrators know to keep an eye on their activity
+
+* it has no other effect
+
+* if you want to ban a user, add them to the abuse list
+
+### Flagged reports and users
+
+![flagged things]({{ "/assets/img/training/admin-flagged-reports-users.png" | relative_url }})
+
+## Banning a user: the abuse list
+
+In addition to flagging a user, you can also add them to the
+"abuse list" (that's a list of users who have abused their right
+to have access to your site).
+
+* **a user who's on the "abuse list" cannot use the site**
+
+* **ban a user by clicking on "BAN EMAIL ADDRESS"**
+ <br>
+ when you are **editing a _report_ or _update_** they submitted
+
+![ban a user]({{ "/assets/img/training/admin-ban-a-user.png" | relative_url }})
+
+## Getting statistics
+
+![getting stats]({{ "/assets/img/training/admin-stats-enter-dates.png" | relative_url }})
+
+## Example of statistics
+
+![output stats]({{ "/assets/img/training/admin-stats.png" | relative_url }})
+
+## Other administration tasks
+
+Remember to check the full documentation on
+[fixmystreet.org](https://fixmystreet.org).
+
+If you need help, email us or ask for advice on the (public) FixMyStreet
+mailing list.
+
+
+
+
+
+
diff --git a/docs/training/citizens.md b/docs/training/citizens.md
new file mode 100644
index 000000000..fb19a266f
--- /dev/null
+++ b/docs/training/citizens.md
@@ -0,0 +1,297 @@
+---
+layout: page
+title: FixMyStreet training - citizens
+author: dave
+---
+
+Training notes for citizens
+=============================
+
+<p class="lead">
+ These notes may serve as a basis for training people new to the FixMyStreet
+ platform. They might be helpful if you&rsquo;re setting up a new site or team.
+</p>
+<div class="attention-box helpful-hint">
+ <p>
+ Basic training notes like these are available for
+ <br>
+ <a href="{{ "/training/citizens" | relative_url }}">citizens</a>,
+ <a href="{{ "/training/staff" | relative_url }}">staff users</a>, and
+ <a href="{{ "/training/admins" | relative_url }}">administrators</a>.
+ </p>
+ <p>
+ Refer to the <a href="{{ "/overview" | relative_url }}">full documentation</a>
+ for more detailed information!
+ </p>
+</div>
+
+Remember that every FixMyStreet installation is different, and can both
+look and behave differently, depending on how it has been
+[customised]({{ "/customising/" | relative_url }}).
+
+<!-- magically present as slideshow, slides split on h2 or h3 -->
+<a name class="play-as-slideshow"></a>
+
+---
+
+## Why use MakeMyIsland?
+
+You have a problem in the street (for example, a streetlight is broken).
+Here's why you should report it on MakeMyIsland.
+
+* **it's helpful**
+ <br>
+ problems can't be fixed until someone knows about them!
+* **even if you don't know who to tell**
+ <br>
+ because MakeMyIsland will pass it on to the right people
+* **it's quick**
+ <br>
+ click on the map, describe the problem, send it
+* **avoids duplicates**
+ <br>
+ if there's already a pin on the map, you know it's already been reported
+* **everyone knows when it's fixed**
+ <br>
+ when it's marked as _fixed_ you receive an email letting you know
+
+Over time, the community gets a public record of where the problems
+were, and how busy everyone has been fixing them.
+
+## How to report a problem
+
+This example starts at the home page, that is, the front of the site. You can
+click on "Report a problem" anywhere on the site to get started.
+
+## Enter location...
+
+![front page]({{ "/assets/img/training/mmi-01-front-page.png" | relative_url }})
+
+
+## Start with a general location
+
+* **enter a nearby street name or area**
+ <br>
+ If MakeMyIsland isn't sure where you meant, it will offer choices
+
+* or **use your current location**
+ <br>
+ if your device supports that
+
+## Click on the map...
+
+![click on map]({{ "/assets/img/training/mmi-02-click-on-map.png" | relative_url }})
+
+## Click the map (a pin appears!)
+
+* **click on the map exactly where the problem is**
+ <br>
+ You can zoom the map. After you've clicked on the map, if the
+ pin isn't in the right place, you can drag it to reposition it...
+ or just click again.
+
+
+## Enter details...
+
+![enter details]({{ "/assets/img/training/mmi-03-enter-details.png" | relative_url }})
+
+## Enter details
+
+* **enter a one-line summary of the problem**
+ <br>
+ this is used as the summary when the problem is shown in lists
+
+* **type in a description of the problem**
+ <br>
+ What's wrong? Has it been like it long?
+
+* **choose a category**
+ <br>
+ the site uses the precise location and the category to decide
+ to whom your report will be sent
+
+* **attach a photo if you want**
+
+## Enter your _own_ details
+
+![enter user details]({{ "/assets/img/training/mmi-04-user-details.png" | relative_url }})
+
+## Provide your email address
+
+* **enter your email address**
+ <br>
+ Because that's what MakeMyIsland uses to identify you
+
+Some versions of FixMyStreet use other ways to identify you too,
+so you might be able to login with Facebook, for example.
+
+## Got a password?
+
+If you've signed into MakeMyIsland before, and you've got a
+password:
+
+* **enter your password**
+
+* **click _Submit_**
+
+## No password? Click in email link
+
+If you haven't signed in before and set a password;
+
+* **enter your name**
+
+* **check or uncheck "show my name publicly"**
+ <br>
+ You name is sent, with your message, to the body along
+ with your report, but it won't be shown on the report's
+ web page unless you want it to be
+
+* **click _Submit_**
+
+* **look in your email inbox**
+ <br>
+ MakeMyIsland has sent you an email: click on the "confirmation
+ link" in it, so MakeMyIsland knows you really are the
+ person who uses that email address
+
+
+## The report has been submitted
+
+* **you can see it on the website**
+ <br>
+ it has a simple URL that won't change, so you can
+ use it to share your report
+
+* **it gets sent to the right authority**
+ <br>
+ the report will be emailed to the public body responsible for fixing
+ it in a few moments
+
+In fact, reports are rounded up and sent every five minutes. And in
+some implementations of FixMyStreet, the problems are put directly into
+the authorities' "problem database" instead of emailing... but it works
+the same for you, either way.
+
+## When did a report get sent?
+
+You can see this on the public site:
+
+![sent yet?]({{ "/assets/img/training/mmi-18-show-when-sent.png" | relative_url }})
+
+* **the report has not been sent yet** if there's no "Sent to..." sentence
+
+* **it's normal for a report to not go immediately when it is submitted**
+ <br>
+ usually, all reports are rounded up and sent every 5 minutes
+
+## Add an update...
+
+![add an update]({{ "/assets/img/training/mmi-05-update.png" | relative_url }})
+
+
+## Add an update to a report
+
+Later, you can add an update to a report:
+
+* **any report (not just yours!)**
+ <br>
+ To get to a report, click on the pin and **Details**,
+ or (if it's in a list) click on its name
+
+* **you can mark the problem as _Fixed_**
+ <br>
+ or mark it as "not fixed" if it's wrongly already marked as "fixed"
+
+## Report an offensive report
+
+If you find a report that you think should not be displayed (for example,
+it contains offensive language or an inappropriate photograph):
+
+* **click on _Report abuse_ on the report**
+
+The administrators will be alerted and can hide the report.
+
+## The "report abuse" link
+
+![report abuse]({{ "/assets/img/training/mmi-06-report-abuse.png" | relative_url }})
+
+
+## Find problems nearby
+
+If you're looking at a problem report...
+
+* **click on _Problems nearby_**
+ <br>
+ to see all pins stuck in the map where other problems
+ have been reported near this one
+
+## Ask to be notified...
+
+![the get-updates link]({{ "/assets/img/training/mmi-07-get-updates-link.png" | relative_url }})
+
+## Get email updates
+
+You can ask MakeMyIsland to email you whenever:
+
+* **problem reports are submitted near a place you're interested in**
+
+* **a particular problem gets an update**
+ <br>
+ any problem report _you_ create is automatically one of these
+
+Click on **Get updates** or **Local alerts** to set this up.
+
+MakeMyIsland also makes alerts available with RSS, which is useful
+for programmers/other apps.
+
+## Getting updates...
+
+![get updates]({{ "/assets/img/training/mmi-08-get-updates.png" | relative_url }})
+
+
+## Use your account
+
+If you set a password, you can login when you use MakeMyIsland.
+When you are logged in:
+
+* **you don't keep getting confirmation email links**
+ <br>
+ because the site already knows who you are
+
+* **you can see all your reports on one page**
+ <br>
+ Click on **Your reports**
+
+* **sign out any time by clicking on... _Sign out_**
+
+## Signing in...
+
+![sign in screen]({{ "/assets/img/training/mmi-09-login.png" | relative_url }})
+
+## Your reports
+
+![your reports]({{ "/assets/img/training/mmi-12-your-reports.png" | relative_url }})
+
+## Share what you've done!
+
+* **every report has a simple URL that never changes**
+ <br>
+ for example `www.fixmystreet.com/report/12345`
+
+* **you can share that link!**
+ <br>
+ when a problem gets fixed, let your friends know: you got something fixed!
+
+
+## Sign out if anyone else might use the same device
+
+* **click on _Sign out_**
+ <br>
+ it always appears somewhere near the top of the screen when you're logged in
+
+![sign out]({{ "/assets/img/training/mmi-17-logout.png" | relative_url }})
+
+
+
+
+
diff --git a/docs/training/index.md b/docs/training/index.md
new file mode 100644
index 000000000..9fcaee9df
--- /dev/null
+++ b/docs/training/index.md
@@ -0,0 +1,33 @@
+---
+layout: page
+title: FixMyStreet training guides
+author: dave
+---
+
+FixMyStreet training notes
+===========================
+
+<p class="lead">
+ These notes may serve as a basis for training people new to the FixMyStreet
+ platform. They might be helpful if you're setting up a new site or team.
+</p>
+<div class="attention-box helpful-hint">
+ <p>
+ Basic training notes like these are available for
+ </p>
+ <ul>
+ <li><a href="{{ "/training/citizens" | relative_url }}">citizens</a></li>
+ <li><a href="{{ "/training/staff" | relative_url }}">staff</a></li>
+ <li><a href="{{ "/training/admins" | relative_url }}">administrators</a></li>
+ </ul>
+ <p>
+ Refer to the <a href="{{ "/overview" | relative_url }}">full documentation</a>
+ for more detailed information!
+ </p>
+</div>
+
+Remember that every FixMyStreet installation is different, and can both
+look and behave differently, depending on how it has been
+[customised]({{ "/customising/" | relative_url }}).
+
+
diff --git a/docs/training/staff.md b/docs/training/staff.md
new file mode 100644
index 000000000..0216bd62f
--- /dev/null
+++ b/docs/training/staff.md
@@ -0,0 +1,241 @@
+---
+layout: page
+title: FixMyStreet training - staff users
+author: dave
+---
+
+
+Training notes for new staff users
+=============================
+
+<p class="lead">
+ These notes may serve as a basis for training people new to the FixMyStreet
+ platform. They might be helpful if you&rsquo;re setting up a new site or team.
+</p>
+<div class="attention-box helpful-hint">
+ <p>
+ Basic training notes like these are available for
+ <br>
+ <a href="{{ "/training/citizens" | relative_url }}">citizens</a>,
+ <a href="{{ "/training/staff" | relative_url }}">staff</a>, and
+ <a href="{{ "/training/admins" | relative_url }}">administrators</a>.
+ </p>
+ <p>
+ Refer to the <a href="{{ "/overview" | relative_url }}">full documentation</a>
+ for more detailed information!
+ </p>
+</div>
+
+Remember that every FixMyStreet installation is different, and can both
+look and behave differently, depending on how it has been
+[customised]({{ "/customising/" | relative_url }}).
+
+
+<!-- magically present as slideshow, slides split on h2 or h3 -->
+<a name class="play-as-slideshow"></a>
+
+---
+
+## If you're a staff user... you work for a "body"
+
+That means MakeMyIsland is sending problem reports to you (or
+the body you represent).
+Normally this means by email.
+
+* **citizens interact with the MakeMyIsland website**
+ <br>
+ (because it's easy)
+
+* **MakeMyIsland sends emails to the body you represent**
+ <br>
+ with the details of the problem from them
+
+* **the emails come in with `Reply-To` set to the _citizen's_ email address**
+ <br>
+ so if you **reply**, your email goes to the citizen
+
+* **you can _sign in_ to the MakeMyIsland website to mark problems as _fixed_**
+ <br>
+ ...or add updates, or set them to states other than _fixed_
+
+## Problems reported _on behalf_ of someone else
+
+Be careful: in some places, citizens send their problems to the
+MakeMyIsland staff (for example, by SMS) who submit the problem
+on their behalf.
+
+<div class="attention-box warning">
+ In this case, replying to the email will go to the staff.
+ <br>
+ It will <strong>not</strong> automatically go to the original reporter.
+</div>
+
+OK... so it's not a big problem, but bear it in mind if you think your replies
+keep going to the same person.
+
+## What is a staff user?
+
+A staff user is the same as a normal MakeMyIsland user except
+
+* **your account is linked with a _body_**
+ <br>
+ for example, you work for a council or city department
+
+<div class="attention-box helpful-hint">
+ so everything you can do as a normal user, you can do as
+ a staff user... with a few extra powers!
+</div>
+
+* **your extra powers only apply to problem reports submitted**
+ **to the body you're linked to**
+
+## How to create an account
+
+You can sign up to MakeMyIsland just using your email, but you'll
+need an administrator to convert your account to a *staff account*.
+
+* **create an account the usual way**
+ <br>
+ use your email and add a password
+
+* **you can do this without submitting a problem report**
+ <br>
+ just click on **Your reports**
+
+* **then ask an administrator to link your email address with the body**
+ <br>
+ be sure to tell them _which_ body
+
+## Signing up
+
+![sign in screen]({{ "/assets/img/training/mmi-09-login.png" | relative_url }})
+
+## How to log in
+
+* **click on _Your reports_ to get a login form**
+ <br>
+ unless you're already logged in, of course!
+
+* **you'll need your _email address_ and your _password_**
+
+Because your email address (and hence your account) is linked with
+the body you represent, MakeMyIsland knows you're a staff user.
+
+## Basic problem report process
+
+Here's a reminder of the normal lifecycle of a problem report:
+
+1. citizen submits problem
+2. ...and then confirms it
+3. MakeMyIsland sends problem to body
+4. people update the report
+5. the body responsible (**you?**) marks it as fixed
+
+
+## Update a report
+
+Anyone can update a report. But it's especially helpful if
+the body responsible for it does this. That's where you come
+in!
+
+* **update the report by leaving a comment in the normal way**
+ <br>
+ you can add a photo too
+
+* **make sure you've set the account name correctly**
+ <br>
+ for example, use "John Example of the City Council" if
+ that's who you work for, or even "City Council" if you
+ share the login with your colleagues
+
+### Add an update...
+
+![add an update]({{ "/assets/img/training/mmi-05-update.png" | relative_url }})
+
+## Change a report's state
+
+When you're logged in with a staff account, you can
+
+* **change the state of a problem report**
+ <br>
+ normal users can only choose between two states:
+ <br>
+ _fixed_ or _not&nbsp;fixed_...
+ <br>
+ that is, they just get a checkbox
+
+* **you can choose from more detailed states!**
+ <br>
+ you get a drop-down menu:
+ <br>
+ _Investigating_, _Action scheduled_, _Unable to fix_
+ and so on
+
+### More states available to a staff user
+
+![staff states]({{ "/assets/img/training/mmi-15-staff-states.png" | relative_url }})
+
+## This is what a fixed problem looks like
+
+The problem report has a green tag marked "fixed"!
+
+![it is fixed]({{ "/assets/img/training/mmi-16-woo-it-is-fixed.png" | relative_url }})
+
+## Hiding reports
+
+Normal users see a _Report abuse_ link at the bottom of every report, so they
+can report a problem report if it contains offensive or inappropriate material.
+
+* _If you're logged in with a staff account_, that link automatically
+ becomes a **Remove from site** link.
+
+* **click _Remove from site_ to take it off the site**
+ <br>
+ this doesn't prevent the report from being sent, so everything still works
+
+## The "remove from site" link
+
+![remove from site]({{ "/assets/img/training/mmi-13-staff-remove-from-site.png" | relative_url }})
+
+## View all reports for your body
+
+Any users can do this, but it's especially useful for you if you want to
+see all the reports on a map.
+
+* **click on _All reports_ in the menu bar**
+
+## View the dashboard
+
+* **there's a dashboard showing a summary of report statistics for your body**
+ <br>
+ see `/dashboard`
+
+This only displays something if you are logged in with a staff account.
+
+
+## Submit new problem reports as staff user?
+
+* can you **submit new problem reports while logged in with your staff account?**
+
+* **sure!**
+
+You can create a personal account too if you want, but there's no reason
+why you can't report problems for your own staff to fix.
+
+People are happy to know you're reporting problems when you find them.
+
+### Sign out if anyone else might use the same device
+
+* **click on _Sign out_**
+ <br>
+ it always appears somewhere near the top of the screen when you're signed in
+
+* be extra careful: **do not to leave a staff account logged in!**
+
+![sign out]({{ "/assets/img/training/mmi-17-logout.png" | relative_url }})
+
+
+<!--
+## Moderating reports
+-->
+
diff --git a/docs/updating/ami.md b/docs/updating/ami.md
new file mode 100644
index 000000000..48d8cb065
--- /dev/null
+++ b/docs/updating/ami.md
@@ -0,0 +1,51 @@
+---
+layout: page
+title: Updating an AMI installation
+---
+
+# Updating an AMI installation
+
+<p class="lead">Let's say you set up an EC2 instance from our AMI when FixMyStreet was on
+version 2.0, and you now want to upgrade to version 2.1. This page should
+help.</p>
+
+(If you forked the code on GitHub and cloned it yourself, you probably want to see our
+main [update help](/updating/).)
+
+Firstly, log in to your EC2 instance as the `ubuntu` user, as you did when
+setting up the instance. You should become the fms user and switch to the right
+directory:
+
+ ubuntu@ip-10-58-191-98:~$ sudo su - fms
+ fms@ip-10-58-191-98:~$ cd fixmystreet
+ fms@ip-10-58-191-98:~/fixmystreet$
+
+To fetch new upstream code, but not yet use it, use:
+
+ fms@ip-10-58-191-98:~/fixmystreet$ git fetch origin
+
+Then merging the new version of the upstream code into your version will bring
+your code up-to-date. You can do that with:
+
+ fms@ip-10-58-191-98:~/fixmystreet$ git merge v2.1
+
+If you have made alterations to your local repository, then you will need to
+make sure they are all committed to your local branch and fork first, see
+[setting up a fork](/feeding-back/) for more information. You may want
+to try checking out your repository elsewhere and trying the merge there first,
+to see if it there are any problems.
+
+After updating the code, you should run the following command to update any
+needed dependencies and any schema changes to your database. It's a good idea
+to take a backup of your database first.
+
+ fms@ip-10-58-191-98:~/fixmystreet$ script/update
+
+If you have made changes to the schema yourself, this may not work,
+please feel free to [contact us](/community/) to discuss it first.
+
+Lastly, you should restart the Catalyst FastCGI server with:
+
+ fms@ip-10-58-191-98:~/fixmystreet$ logout
+ ubuntu@ip-10-58-191-98:~$ sudo /etc/init.d/fixmystreet restart
+
diff --git a/docs/updating/index.md b/docs/updating/index.md
new file mode 100644
index 000000000..e65097e6d
--- /dev/null
+++ b/docs/updating/index.md
@@ -0,0 +1,74 @@
+---
+layout: page
+title: Updating your installation
+---
+
+# Updating your installation
+
+<p class="lead">Keeping your installation up to date means you get new features
+and bug fixes implemented by other users of the platform.</p>
+
+Please read the guidelines for [feeding back changes](/feeding-back/) -- if
+you follow those when working on your site it should be much easier for you to
+keep your code up to date with upstream. In the best case scenario, if you
+submit frequent pull requests and keep up to date, you shouldn't run into many
+conflicts at all.
+
+If your cobrand is not present upstream, then you may want to check changes in
+core templates against your cobrand before updating – [we have a script to help
+with that](/updating/templates/).
+
+## Updating the code itself
+
+The `master` branch of the main FixMyStreet repository should always be safe,
+stable, and deployable. On top of that, we have fixed version numbers that our
+install script and packaged options use, and you are welcome to as well.
+
+<div class="attention-box info">
+<strong>Install script/ package users:</strong> Note that if you have used the install script or
+a packaged image, then your repository by default will be cloned from the main
+FixMyStreet repository. Please see our <a href="ami/">package-specific updating instructions</a>.
+</div>
+
+Let's say you have forked the main FixMyStreet repository on GitHub, and you
+have cloned your fork and have been working on that. You have made some commits
+that you have not yet submitted upstream to be merged in. GitHub have some
+[helpful instructions](https://help.github.com/articles/fork-a-repo) on pulling
+in upstream changes, and it basically boils down to:
+
+{% highlight bash %}
+# If you haven't set up the remote before
+git remote add upstream https://github.com/mysociety/fixmystreet.git
+# Fetch new commits from upstream
+git fetch upstream
+# Merge those commits into your current branch
+# Or whichever version tag e.g. v2.5
+git merge upstream/master
+{% endhighlight %}
+
+If you're proficient with git, of course feel free to rebase your changes on
+top of the upstream master, or however else you wish to best go about the
+issue :-) Doing this frequently will help prevent you get in a situation where
+you are too worried to merge in case it breaks something.
+
+## Subsequent dependency updates
+
+After updating the code, you should run the following command to update any
+needed dependencies and any schema changes to your database. It's a good idea
+to take a backup of your database first.
+
+{% highlight bash %}
+script/update
+{% endhighlight %}
+
+Of course, if you have made changes to the database schema yourself, this may
+not work, please feel free to [contact us](/community/) to discuss it first.
+
+## Restart the server
+
+Lastly, you should restart your application server, this may be restarting
+your webserver, or if it is running separately, something like:
+
+{% highlight bash %}
+sudo /etc/init.d/fixmystreet restart
+{% endhighlight %}
diff --git a/docs/updating/templates.md b/docs/updating/templates.md
new file mode 100644
index 000000000..ee4fca7e5
--- /dev/null
+++ b/docs/updating/templates.md
@@ -0,0 +1,63 @@
+---
+layout: page
+title: Updating your installation
+---
+
+# Checking core template changes against your cobrand
+
+<p class="lead">You may have your own cobrand, overriding templates in core,
+and wish to check what changes there have been in core since your current
+version, to see whether you need to make similar/related changes to your
+cobrand templates. We provide a script to help with this.</p>
+
+First, let's assume your cobrand is called `fixmypark` and you are in a git
+repository with your current code checked out, but with access to the new
+version you wish to compare against (ie. your repository is up to date with
+upstream via `git fetch`, see below).
+
+Then you can run the following to list templates that have changed between the
+most recent version accessible from the current checkout and the newest
+available version:
+
+{% highlight bash %}
+$ bin/cobrand-checks fixmypark
+templates/web/base/report/update-form.html
+{% endhighlight %}
+
+If you prefer to be more explicit, you can specify old and new revisions:
+
+{% highlight bash %}
+$ bin/cobrand-checks fixmypark v2.3 v2.4
+templates/web/base/report/new/after_photo.html
+{% endhighlight %}
+
+## --diff
+
+If you specify `--diff`, you get a diff of the changes in core templates
+between the specified versions, but only in templates that your cobrand
+has overridden:
+
+{% highlight diff %}
+$ bin/cobrand-checks fixmypark v2.3 v2.4 --diff
+diff --git a/templates/web/base/report/new/after_photo.html b/templates/web/base/report/new/after_photo.html
+index b337977e4..4b28bf7f7 100644
+--- a/templates/web/base/report/new/after_photo.html
++++ b/templates/web/base/report/new/after_photo.html
+@@ -1,3 +1,4 @@
++[% IF c.cobrand.allow_photo_upload %]
+ <div class="description_tips" aria-label="[% loc('Tips for perfect photos') %]">
+ <ul class="do">
+ <li>[% loc('For best results include a close-up and a wide shot') %]</li>
+@@ -6,3 +7,4 @@
+ <li>[% loc('Avoid personal information and vehicle number plates') %]</li>
+ </ul>
+ </div>
++[% END %]
+{% endhighlight %}
+
+## --interactive
+
+For more advanced usage, `--interactive` will step through those files one by
+one, letting you pick various different diffs (e.g. core change version to
+version, or the change between old/new version and your cobrand), and edit your
+cobrand template using vimdiff.