aboutsummaryrefslogtreecommitdiffstats
path: root/web
diff options
context:
space:
mode:
Diffstat (limited to 'web')
-rw-r--r--web/cobrands/fixmystreet/assets.js479
-rw-r--r--web/cobrands/fixmystreet/fixmystreet.js4
-rw-r--r--web/cobrands/sass/_base.scss31
-rw-r--r--web/cobrands/westminster/_colours.scss38
-rw-r--r--web/cobrands/westminster/assets.js313
-rw-r--r--web/cobrands/westminster/base.scss232
-rw-r--r--web/cobrands/westminster/favicon.icobin0 -> 2070 bytes
-rw-r--r--web/cobrands/westminster/images/chevron-black-right.pngbin0 -> 329 bytes
-rw-r--r--web/cobrands/westminster/images/chevron-black-right.svg1
-rw-r--r--web/cobrands/westminster/images/collection-default-bg.jpgbin0 -> 136484 bytes
-rw-r--r--web/cobrands/westminster/images/footer-facebook.pngbin0 -> 283 bytes
-rw-r--r--web/cobrands/westminster/images/footer-facebook.svg1
-rw-r--r--web/cobrands/westminster/images/footer-instagram.pngbin0 -> 492 bytes
-rw-r--r--web/cobrands/westminster/images/footer-instagram.svg1
-rw-r--r--web/cobrands/westminster/images/footer-logo.pngbin0 -> 4725 bytes
-rw-r--r--web/cobrands/westminster/images/footer-logo.svg1
-rw-r--r--web/cobrands/westminster/images/footer-twitter.pngbin0 -> 489 bytes
-rw-r--r--web/cobrands/westminster/images/footer-twitter.svg1
-rw-r--r--web/cobrands/westminster/images/search-icon.pngbin0 -> 881 bytes
-rw-r--r--web/cobrands/westminster/images/wcc_logo.pngbin0 -> 9365 bytes
-rw-r--r--web/cobrands/westminster/layout.scss148
-rw-r--r--web/js/geolocation.js2
22 files changed, 1056 insertions, 196 deletions
diff --git a/web/cobrands/fixmystreet/assets.js b/web/cobrands/fixmystreet/assets.js
index caef01886..096a5824e 100644
--- a/web/cobrands/fixmystreet/assets.js
+++ b/web/cobrands/fixmystreet/assets.js
@@ -27,8 +27,15 @@ OpenLayers.Layer.VectorAsset = OpenLayers.Class(OpenLayers.Layer.Vector, {
relevant: function() {
var category = $('select#form_category').val(),
- layer = this.fixmystreet;
- return OpenLayers.Util.indexOf(layer.asset_category, category) != -1 &&
+ group = $('select#category_group').val(),
+ layer = this.fixmystreet,
+ relevant;
+ if (layer.asset_group) {
+ relevant = (layer.asset_group === group);
+ } else {
+ relevant = (OpenLayers.Util.indexOf(layer.asset_category, category) != -1);
+ }
+ return relevant &&
( !layer.body || OpenLayers.Util.indexOf(fixmystreet.bodies, layer.body) != -1 );
},
@@ -77,10 +84,10 @@ OpenLayers.Layer.VectorAsset = OpenLayers.Class(OpenLayers.Layer.Vector, {
},
get_select_control: function() {
- var controls = fixmystreet.map.getControlsByClass('OpenLayers.Control.SelectFeature');
- for (var i=0; i<controls.length; i++) {
+ var controls = this.controls || [];
+ for (var i = 0; i < controls.length; i++) {
var control = controls[i];
- if (control.layer == this && !control.hover) {
+ if (!control.hover) {
return control;
}
}
@@ -253,7 +260,7 @@ var fault_popup = null;
function init_asset_layer(layer, pins_layer) {
layer.update_layer_visibility();
fixmystreet.map.addLayer(layer);
- if (layer.fixmystreet.asset_category) {
+ if (layer.fixmystreet.asset_category || layer.fixmystreet.asset_group) {
fixmystreet.map.events.register( 'zoomend', layer, check_zoom_message_visibility);
}
@@ -370,7 +377,8 @@ function check_zoom_message_visibility() {
if (this.fixmystreet.non_interactive) {
return;
}
- var category = $("select#form_category").val(),
+ var select = this.fixmystreet.asset_group ? 'category_group' : 'form_category';
+ var category = $("select#" + select).val() || '',
prefix = category.replace(/[^a-z]/gi, ''),
id = "category_meta_message_" + prefix,
$p = $('#' + id);
@@ -390,6 +398,11 @@ function check_zoom_message_visibility() {
$p.html('Zoom in to pick a ' + this.fixmystreet.asset_item + ' from the map');
}
+ } else if (this.fixmystreet.asset_group) {
+ prefix = this.fixmystreet.asset_group.replace(/[^a-z]/gi, '');
+ id = "category_meta_message_" + prefix;
+ $p = $('#' + id);
+ $p.remove();
} else {
$.each(this.fixmystreet.asset_category, function(i, c) {
var prefix = c.replace(/[^a-z]/gi, ''),
@@ -407,7 +420,20 @@ function layer_visibilitychanged() {
}
return;
} else if (!this.getVisibility()) {
- this.asset_not_found();
+ asset_unselected.call(this);
+ this.asset_not_found(); // as trigger won't call on non-visible layers
+ }
+
+ var controls = this.controls || [];
+ var j;
+ if (this.getVisibility()) {
+ for (j = 0; j < controls.length; j++) {
+ controls[j].activate();
+ }
+ } else {
+ for (j = 0; j < controls.length; j++) {
+ controls[j].deactivate();
+ }
}
check_zoom_message_visibility.call(this);
@@ -480,6 +506,231 @@ function get_fault_stylemap() {
});
}
+function construct_protocol_options(options) {
+ var protocol_options;
+ if (options.http_options !== undefined) {
+ protocol_options = options.http_options;
+ OpenLayers.Util.applyDefaults(options, {
+ format_class: OpenLayers.Format.GML,
+ format_options: {}
+ });
+ if (options.geometryName) {
+ options.format_options.geometryName = options.geometryName;
+ }
+ protocol_options.format = new options.format_class(options.format_options);
+ } else {
+ protocol_options = {
+ version: "1.1.0",
+ url: options.wfs_url,
+ featureType: options.wfs_feature,
+ geometryName: options.geometryName
+ };
+ if (options.srsName !== undefined) {
+ protocol_options.srsName = options.srsName;
+ } else if (fixmystreet.wmts_config) {
+ protocol_options.srsName = fixmystreet.wmts_config.map_projection;
+ }
+ if (options.propertyNames) {
+ protocol_options.propertyNames = options.propertyNames;
+ }
+ }
+ return protocol_options;
+}
+
+function construct_protocol_class(options) {
+ if (options.http_options !== undefined) {
+ return options.protocol_class || OpenLayers.Protocol.HTTP;
+ } else {
+ return OpenLayers.Protocol.WFS;
+ }
+}
+
+function construct_layer_options(options, protocol) {
+ var StrategyClass = options.strategy_class || OpenLayers.Strategy.BBOX;
+
+ var max_resolution = options.max_resolution;
+ if (typeof max_resolution === 'object') {
+ max_resolution = max_resolution[fixmystreet.cobrand];
+ }
+
+ var layer_options = {
+ fixmystreet: options,
+ strategies: [new StrategyClass()],
+ protocol: protocol,
+ visibility: false,
+ maxResolution: max_resolution,
+ minResolution: options.min_resolution,
+ styleMap: options.stylemap || get_asset_stylemap(),
+ assets: true
+ };
+ if (options.attribution !== undefined) {
+ layer_options.attribution = options.attribution;
+ }
+ if (options.srsName !== undefined) {
+ layer_options.projection = new OpenLayers.Projection(options.srsName);
+ } else if (fixmystreet.wmts_config) {
+ layer_options.projection = new OpenLayers.Projection(fixmystreet.wmts_config.map_projection);
+ }
+
+ if (options.filter_key) {
+ // Add this filter to the layer, so it can potentially be used
+ // in the request (though only Bristol currently does this).
+ if (OpenLayers.Util.isArray(options.filter_value)) {
+ layer_options.filter = new OpenLayers.Filter.Logical({
+ type: OpenLayers.Filter.Logical.OR,
+ filters: $.map(options.filter_value, function(value) {
+ return new OpenLayers.Filter.Comparison({
+ type: OpenLayers.Filter.Comparison.EQUAL_TO,
+ property: options.filter_key,
+ value: value
+ });
+ })
+ });
+ } else if (typeof options.filter_value === 'function') {
+ layer_options.filter = new OpenLayers.Filter.FeatureId({
+ type: OpenLayers.Filter.Function,
+ evaluate: options.filter_value
+ });
+ } else {
+ layer_options.filter = new OpenLayers.Filter.Comparison({
+ type: OpenLayers.Filter.Comparison.EQUAL_TO,
+ property: options.filter_key,
+ value: options.filter_value
+ });
+ }
+ // Add a strategy filter to the layer, to filter the incoming results
+ // after they are received. Bristol does not need this, but has to ask
+ // for the filter data in its response so it doesn't then disappear.
+ layer_options.strategies.push(new OpenLayers.Strategy.Filter({filter: layer_options.filter}));
+ }
+
+ return layer_options;
+}
+
+function construct_layer_class(options) {
+ var layer_class = options.class || OpenLayers.Layer.VectorAsset;
+ if (options.usrn || options.road) {
+ layer_class = OpenLayers.Layer.VectorNearest;
+ }
+ return layer_class;
+}
+
+function construct_fault_layer(options, protocol_options, layer_options) {
+ if (!options.wfs_fault_feature) {
+ return null;
+ }
+
+ // A non-interactive layer to display existing asset faults
+ var po = {
+ featureType: options.wfs_fault_feature
+ };
+ OpenLayers.Util.applyDefaults(po, protocol_options);
+ var fault_protocol = new OpenLayers.Protocol.WFS(po);
+ var lo = {
+ strategies: [new OpenLayers.Strategy.BBOX()],
+ protocol: fault_protocol,
+ styleMap: get_fault_stylemap(),
+ assets: true
+ };
+ OpenLayers.Util.applyDefaults(lo, layer_options);
+ asset_fault_layer = new OpenLayers.Layer.Vector("WFS", lo);
+ asset_fault_layer.events.register( 'loadstart', null, fixmystreet.maps.loading_spinner.show);
+ asset_fault_layer.events.register( 'loadend', null, fixmystreet.maps.loading_spinner.hide);
+ return asset_fault_layer;
+}
+
+function construct_asset_layer(options) {
+ // An interactive layer for selecting an asset (e.g. street light)
+ var protocol_options = construct_protocol_options(options);
+ var protocol_class = construct_protocol_class(options);
+ var protocol = new protocol_class(protocol_options);
+
+ var layer_options = construct_layer_options(options, protocol);
+ var layer_class = construct_layer_class(options);
+ var asset_layer = new layer_class(options.name || "WFS", layer_options);
+
+ var asset_fault_layer = construct_fault_layer(options, protocol_options, layer_options);
+ if (asset_fault_layer) {
+ asset_layer.fixmystreet.fault_layer = asset_fault_layer;
+ }
+
+ return asset_layer;
+}
+
+function construct_select_layer_events(asset_layer, options) {
+ asset_layer.events.register( 'featureselected', asset_layer, asset_selected);
+ asset_layer.events.register( 'featureunselected', asset_layer, asset_unselected);
+
+ // When panning/zooming the map check that this layer is still correctly shown
+ // and any selected marker is preserved
+ asset_layer.events.register( 'loadend', asset_layer, layer_loadend);
+
+ if (options.disable_pin_snapping) {
+ // The pin is snapped to the centre of a feature by the select
+ // handler. We can stop this handler from running, and the pin
+ // being snapped, by returning false from a beforefeatureselected
+ // event handler. This handler does need to make sure the
+ // attributes of the clicked feature are applied to the extra
+ // details form fields first though.
+ asset_layer.events.register( 'beforefeatureselected', asset_layer, function(e) {
+ var attributes = this.fixmystreet.attributes;
+ if (attributes) {
+ set_fields_from_attributes(attributes, e.feature);
+ }
+
+ // The next click on the map may not be on an asset - so
+ // clear the fields for this layer when the pin is next
+ // updated. If it is on an asset then the fields will be
+ // set by whatever feature was selected.
+ $(fixmystreet).one('maps:update_pin', function() {
+ if (attributes) {
+ clear_fields_for_attributes(attributes);
+ }
+ });
+ return false;
+ });
+ }
+}
+
+// Set up handler for selecting/unselecting markers
+function construct_select_feature_control(asset_layers, options) {
+ if (options.non_interactive) {
+ return;
+ }
+
+ $.each(asset_layers, function(i, layer) {
+ construct_select_layer_events(layer, options);
+ });
+
+ return new OpenLayers.Control.SelectFeature(asset_layers);
+}
+
+function construct_hover_feature_control(asset_layers, options) {
+ // Even if an asset layer is marked as non-interactive it can still have
+ // a hover style which we'll need to set up.
+ if (options.non_interactive && !(options.stylemap && options.stylemap.styles.hover)) {
+ return;
+ }
+
+ // Set up handlers for simply hovering over an asset marker
+ var hover_feature_control = new OpenLayers.Control.SelectFeature(
+ asset_layers,
+ {
+ hover: true,
+ highlightOnly: true,
+ renderIntent: 'hover'
+ }
+ );
+ hover_feature_control.events.register('beforefeaturehighlighted', null, function(e) {
+ // Don't let marker go from selected->hover state,
+ // as it causes some mad flickering effect.
+ if (e.feature.renderIntent == 'select') {
+ return false;
+ }
+ });
+ return hover_feature_control;
+}
+
// fixmystreet.pin_prefix isn't always available here, due
// to file loading order, so get it from the DOM directly.
var map_data = document.getElementById('js-map-data');
@@ -531,186 +782,18 @@ fixmystreet.assets = {
}
options = $.extend(true, {}, default_options, options);
+ var asset_layer = this.add_layer(options);
+ this.add_controls([asset_layer], options);
+ },
- var asset_fault_layer = null;
-
- // An interactive layer for selecting an asset (e.g. street light)
- var protocol_options;
- var protocol;
- if (options.http_options !== undefined) {
- protocol_options = options.http_options;
- OpenLayers.Util.applyDefaults(options, {
- format_class: OpenLayers.Format.GML,
- format_options: {}
- });
- if (options.geometryName) {
- options.format_options.geometryName = options.geometryName;
- }
- protocol_options.format = new options.format_class(options.format_options);
- var protocol_class = options.protocol_class || OpenLayers.Protocol.HTTP;
- protocol = new protocol_class(protocol_options);
- } else {
- protocol_options = {
- version: "1.1.0",
- url: options.wfs_url,
- featureType: options.wfs_feature,
- geometryName: options.geometryName
- };
- if (options.srsName !== undefined) {
- protocol_options.srsName = options.srsName;
- } else if (fixmystreet.wmts_config) {
- protocol_options.srsName = fixmystreet.wmts_config.map_projection;
- }
- if (options.propertyNames) {
- protocol_options.propertyNames = options.propertyNames;
- }
- protocol = new OpenLayers.Protocol.WFS(protocol_options);
- }
- var StrategyClass = options.strategy_class || OpenLayers.Strategy.BBOX;
-
+ add_layer: function(options) {
// Upgrade `asset_category` to an array, in the case that this layer is
// only associated with a single category.
if (options.asset_category && !OpenLayers.Util.isArray(options.asset_category)) {
options.asset_category = [ options.asset_category ];
}
- var max_resolution = options.max_resolution;
- if (typeof max_resolution === 'object') {
- max_resolution = max_resolution[fixmystreet.cobrand];
- }
-
- var layer_options = {
- fixmystreet: options,
- strategies: [new StrategyClass()],
- protocol: protocol,
- visibility: false,
- maxResolution: max_resolution,
- minResolution: options.min_resolution,
- styleMap: options.stylemap || get_asset_stylemap(),
- assets: true
- };
- if (options.attribution !== undefined) {
- layer_options.attribution = options.attribution;
- }
- if (options.srsName !== undefined) {
- layer_options.projection = new OpenLayers.Projection(options.srsName);
- } else if (fixmystreet.wmts_config) {
- layer_options.projection = new OpenLayers.Projection(fixmystreet.wmts_config.map_projection);
- }
- if (options.filter_key) {
- // Add this filter to the layer, so it can potentially be used
- // in the request (though only Bristol currently does this).
- if (OpenLayers.Util.isArray(options.filter_value)) {
- layer_options.filter = new OpenLayers.Filter.Logical({
- type: OpenLayers.Filter.Logical.OR,
- filters: $.map(options.filter_value, function(value) {
- return new OpenLayers.Filter.Comparison({
- type: OpenLayers.Filter.Comparison.EQUAL_TO,
- property: options.filter_key,
- value: value
- });
- })
- });
- } else if (typeof options.filter_value === 'function') {
- layer_options.filter = new OpenLayers.Filter.FeatureId({
- type: OpenLayers.Filter.Function,
- evaluate: options.filter_value
- });
- } else {
- layer_options.filter = new OpenLayers.Filter.Comparison({
- type: OpenLayers.Filter.Comparison.EQUAL_TO,
- property: options.filter_key,
- value: options.filter_value
- });
- }
- // Add a strategy filter to the layer, to filter the incoming results
- // after they are received. Bristol does not need this, but has to ask
- // for the filter data in its response so it doesn't then disappear.
- layer_options.strategies.push(new OpenLayers.Strategy.Filter({filter: layer_options.filter}));
- }
-
- var layer_class = options.class || OpenLayers.Layer.VectorAsset;
- if (options.usrn || options.road) {
- layer_class = OpenLayers.Layer.VectorNearest;
- }
- var asset_layer = new layer_class(options.name || "WFS", layer_options);
-
- // A non-interactive layer to display existing asset faults
- if (options.wfs_fault_feature) {
- var po = {
- featureType: options.wfs_fault_feature
- };
- OpenLayers.Util.applyDefaults(po, protocol_options);
- var fault_protocol = new OpenLayers.Protocol.WFS(po);
- var lo = {
- strategies: [new OpenLayers.Strategy.BBOX()],
- protocol: fault_protocol,
- styleMap: get_fault_stylemap(),
- assets: true
- };
- OpenLayers.Util.applyDefaults(lo, layer_options);
- asset_fault_layer = new OpenLayers.Layer.Vector("WFS", lo);
- asset_fault_layer.events.register( 'loadstart', null, fixmystreet.maps.loading_spinner.show);
- asset_fault_layer.events.register( 'loadend', null, fixmystreet.maps.loading_spinner.hide);
- asset_layer.fixmystreet.fault_layer = asset_fault_layer;
- }
-
- var hover_feature_control, select_feature_control;
- if (!options.non_interactive) {
- // Set up handlers for selecting/unselecting markers
- select_feature_control = new OpenLayers.Control.SelectFeature( asset_layer );
- asset_layer.events.register( 'featureselected', asset_layer, asset_selected);
- asset_layer.events.register( 'featureunselected', asset_layer, asset_unselected);
- if (options.disable_pin_snapping) {
- // The pin is snapped to the centre of a feature by the select
- // handler. We can stop this handler from running, and the pin
- // being snapped, by returning false from a beforefeatureselected
- // event handler. This handler does need to make sure the
- // attributes of the clicked feature are applied to the extra
- // details form fields first though.
- asset_layer.events.register( 'beforefeatureselected', asset_layer, function(e) {
- var attributes = this.fixmystreet.attributes;
- if (attributes) {
- set_fields_from_attributes(attributes, e.feature);
- }
-
- // The next click on the map may not be on an asset - so
- // clear the fields for this layer when the pin is next
- // updated. If it is on an asset then the fields will be
- // set by whatever feature was selected.
- $(fixmystreet).one('maps:update_pin', function() {
- if (attributes) {
- clear_fields_for_attributes(attributes);
- }
- });
- return false;
- });
- }
- // When panning/zooming the map check that this layer is still correctly shown
- // and any selected marker is preserved
- asset_layer.events.register( 'loadend', asset_layer, layer_loadend);
- }
-
- // Even if an asset layer is marked as non-interactive it can still have
- // a hover style which we'll need to set up.
- if (!options.non_interactive || (options.stylemap && options.stylemap.styles.hover)) {
- // Set up handlers for simply hovering over an asset marker
- hover_feature_control = new OpenLayers.Control.SelectFeature(
- asset_layer,
- {
- hover: true,
- highlightOnly: true,
- renderIntent: 'hover'
- }
- );
- hover_feature_control.events.register('beforefeaturehighlighted', null, function(e) {
- // Don't let marker go from selected->hover state,
- // as it causes some mad flickering effect.
- if (e.feature.renderIntent == 'select') {
- return false;
- }
- });
- }
+ var asset_layer = construct_asset_layer(options);
if (!options.always_visible || options.road) {
asset_layer.events.register( 'visibilitychanged', asset_layer, layer_visibilitychanged);
@@ -724,12 +807,22 @@ fixmystreet.assets = {
if (options.always_visible) {
asset_layer.setVisibility(true);
}
- if (hover_feature_control) {
- fixmystreet.assets.controls.push(hover_feature_control);
- }
- if (select_feature_control) {
- fixmystreet.assets.controls.push(select_feature_control);
- }
+ return asset_layer;
+ },
+
+ add_controls: function(asset_layers, options) {
+ var select_feature_control = construct_select_feature_control(asset_layers, options);
+ var hover_feature_control = construct_hover_feature_control(asset_layers, options);
+
+ $.each(asset_layers, function(i, asset_layer) {
+ asset_layer.controls = asset_layer.controls || [];
+ if (hover_feature_control) {
+ asset_layer.controls.push(hover_feature_control);
+ }
+ if (select_feature_control) {
+ asset_layer.controls.push(select_feature_control);
+ }
+ });
},
init: function() {
@@ -759,12 +852,12 @@ fixmystreet.assets = {
var pins_layer = fixmystreet.map.getLayersByName("Pins")[0];
for (var i = 0; i < fixmystreet.assets.layers.length; i++) {
- init_asset_layer(fixmystreet.assets.layers[i], pins_layer);
- }
-
- for (i = 0; i < fixmystreet.assets.controls.length; i++) {
- fixmystreet.map.addControl(fixmystreet.assets.controls[i]);
- fixmystreet.assets.controls[i].activate();
+ var asset_layer = fixmystreet.assets.layers[i];
+ var controls = asset_layer.controls || [];
+ for (var j = 0; j < controls.length; j++) {
+ fixmystreet.map.addControl(controls[j]);
+ }
+ init_asset_layer(asset_layer, pins_layer);
}
}
};
diff --git a/web/cobrands/fixmystreet/fixmystreet.js b/web/cobrands/fixmystreet/fixmystreet.js
index 7aac072ea..704a665ff 100644
--- a/web/cobrands/fixmystreet/fixmystreet.js
+++ b/web/cobrands/fixmystreet/fixmystreet.js
@@ -347,7 +347,7 @@ $.extend(fixmystreet.set_up, {
$('.js-form-name').addClass('required');
} );
- $('#facebook_sign_in, #twitter_sign_in').click(function(e){
+ $('#facebook_sign_in, #twitter_sign_in, #oidc_sign_in').click(function(e){
$('#username, #form_username_register, #form_username_sign_in').removeClass('required');
});
@@ -1242,7 +1242,7 @@ fixmystreet.fetch_reporting_data = function() {
return;
}
$('#side-form').show();
- var old_category_group = $('#category_group').val(),
+ var old_category_group = $('#category_group').val() || $('#filter_group').val(),
old_category = $("#form_category").val(),
filter_category = $("#filter_categories").val();
diff --git a/web/cobrands/sass/_base.scss b/web/cobrands/sass/_base.scss
index 8c1445b36..32a85fa04 100644
--- a/web/cobrands/sass/_base.scss
+++ b/web/cobrands/sass/_base.scss
@@ -379,6 +379,14 @@ select.form-control {
margin: 0 0 0.5em 0;
}
}
+
+ small {
+ margin: 0.5em auto;
+ display: block;
+ text-align: center;
+ font-style: normal;
+ width: 75%;
+ }
}
// Purposefully *not* wrapped in `html.js` because the margin-top helps
@@ -387,6 +395,29 @@ select.form-control {
margin-top: 1.5em;
}
+/* On a reporting page MyW/anon */
+small#or {
+ margin: 1em auto;
+ width: 100%;
+}
+small#or:before, small#or:after {
+ background-color: #fff;
+ content: "";
+ display: inline-block;
+ height: 2px;
+ position: relative;
+ vertical-align: middle;
+ width: 50%;
+}
+small#or:before {
+ right: 1em;
+ margin-left: -50%;
+}
+small#or:after {
+ left: 1em;
+ margin-right: -50%;
+}
+
// grey background, full width box
.form-box {
margin: 0 -1em 0.25em;
diff --git a/web/cobrands/westminster/_colours.scss b/web/cobrands/westminster/_colours.scss
new file mode 100644
index 000000000..be1779daa
--- /dev/null
+++ b/web/cobrands/westminster/_colours.scss
@@ -0,0 +1,38 @@
+/* COLOURS */
+
+$westminster_black: #0d0e16;
+$westminster_blue: #1e6dc7;
+$westminster_green: #137c71;
+$westminster_pink: #c8007b;
+$westminster_navy: #0b2265;
+$westminster_yellow: #fecb00;
+$westminster_grey: #f7f5f6;
+
+$primary: $westminster_yellow;
+
+$primary_b: #000000;
+$primary_text: #222222;
+
+$base_bg: $westminster_grey;
+$base_fg: #000;
+
+$nav_background_colour: #fff;
+$nav_colour: $westminster_navy;
+$nav_hover_background_colour: $westminster_blue;
+
+// Colour used for front page 'how to report a problem' steps
+$col_big_numbers: #ccc;
+
+$header-top-border: false;
+
+$menu-image: 'menu-black';
+
+$col_click_map: $westminster_yellow;
+
+$body-font: 'Open Sans', sans-serif;
+$heading-font: $body-font;
+$meta-font: $body-font;
+
+$mappage-header-height: 4.5em;
+
+$high-dpi-screen: '-webkit-min-device-pixel-ratio: 1.5), (min-resolution: 144dpi'; \ No newline at end of file
diff --git a/web/cobrands/westminster/assets.js b/web/cobrands/westminster/assets.js
new file mode 100644
index 000000000..1e46ae192
--- /dev/null
+++ b/web/cobrands/westminster/assets.js
@@ -0,0 +1,313 @@
+(function(){
+
+if (!fixmystreet.maps) {
+ return;
+}
+
+/* First let us set up some necessary subclasses */
+
+/* ArcGIS wants to receive the bounding box as a 'geometry' parameter, not 'bbox' */
+var format = new OpenLayers.Format.QueryStringFilter();
+OpenLayers.Protocol.Westminster = OpenLayers.Class(OpenLayers.Protocol.HTTP, {
+ filterToParams: function(filter, params) {
+ params = format.write(filter, params);
+ params.geometry = params.bbox;
+ delete params.bbox;
+ return params;
+ },
+ CLASS_NAME: "OpenLayers.Protocol.Westminster"
+});
+
+/* This layer is relevant depending upon the category *and* the choice of the 'type' Open311 extra attribute question */
+var SubcatMixin = OpenLayers.Class({
+ relevant: function() {
+ var relevant = OpenLayers.Layer.VectorAsset.prototype.relevant.apply(this, arguments),
+ subcategories = this.fixmystreet.subcategories,
+ subcategory = $(this.fixmystreet.subcategory_id).val(),
+ relevant_sub = OpenLayers.Util.indexOf(subcategories, subcategory) > -1;
+ return relevant && relevant_sub;
+ },
+ CLASS_NAME: 'SubcatMixin'
+});
+OpenLayers.Layer.VectorAssetWestminsterSubcat = OpenLayers.Class(OpenLayers.Layer.VectorAsset, SubcatMixin, {
+ CLASS_NAME: 'OpenLayers.Layer.VectorAssetWestminsterSubcat'
+});
+
+// This is required so that the found/not found actions are fired on category
+// select and pin move rather than just on asset select/not select.
+function uprn_init(name, options) {
+ OpenLayers.Layer.VectorAsset.prototype.initialize.apply(this, arguments);
+ $(fixmystreet).on('report_new:category_change', this.checkSelected.bind(this));
+}
+OpenLayers.Layer.VectorAssetWestminsterUPRN = OpenLayers.Class(OpenLayers.Layer.VectorAsset, {
+ initialize: function(name, options) { uprn_init.apply(this, arguments); },
+ CLASS_NAME: 'OpenLayers.Layer.VectorAssetWestminsterUPRN'
+});
+OpenLayers.Layer.VectorAssetWestminsterSubcatUPRN = OpenLayers.Class(OpenLayers.Layer.VectorAsset, SubcatMixin, {
+ cls: OpenLayers.Layer.VectorAsset,
+ initialize: function(name, options) { uprn_init.apply(this, arguments); },
+ CLASS_NAME: 'OpenLayers.Layer.VectorAssetWestminsterSubcatUPRN'
+});
+
+var url_base = 'https://tilma.staging.mysociety.org/resource-proxy/proxy.php?https://westminster.assets/';
+
+var defaults = {
+ http_options: {
+ params: {
+ inSR: '4326',
+ f: 'geojson'
+ }
+ },
+ asset_type: 'spot',
+ max_resolution: 4.777314267158508,
+ min_resolution: 0.5971642833948135,
+ asset_id_field: 'central_asset_id',
+ srsName: "EPSG:4326",
+ body: "Westminster City Council",
+ format_class: OpenLayers.Format.GeoJSON,
+ format_options: {ignoreExtraDims: true},
+ protocol_class: OpenLayers.Protocol.Westminster,
+ strategy_class: OpenLayers.Strategy.FixMyStreet
+};
+
+fixmystreet.assets.add(defaults, {
+ http_options: {
+ url: url_base + '40/query?',
+ params: {
+ outFields: 'USRN'
+ }
+ },
+ all_categories: true,
+ always_visible: true,
+ non_interactive: true,
+ stylemap: fixmystreet.assets.stylemap_invisible,
+ nearest_radius: 100,
+ usrn: {
+ attribute: 'USRN',
+ field: 'USRN'
+ }
+});
+
+var tfl_categories = [ 'Pavement damage', 'Pothole', 'Road pavement damage', 'Road or pavement damage' ];
+
+fixmystreet.assets.add(defaults, {
+ http_options: {
+ url: url_base + '2/query?'
+ },
+ asset_category: tfl_categories,
+ non_interactive: true,
+ road: true,
+ nearest_radius: 25,
+ stylemap: fixmystreet.assets.stylemap_invisible,
+ actions: {
+ found: function(layer, feature) {
+ if (!fixmystreet.assets.selectedFeature()) {
+ fixmystreet.body_overrides.only_send('TfL');
+ } else {
+ fixmystreet.body_overrides.remove_only_send();
+ }
+ },
+ not_found: function(layer) {
+ fixmystreet.body_overrides.remove_only_send();
+ }
+ }
+});
+
+fixmystreet.message_controller.register_category({
+ body: defaults.body,
+ category: function() {
+ var category = $('#form_category').val();
+ if (OpenLayers.Util.indexOf(tfl_categories, category) === -1 ||
+ fixmystreet.body_overrides.get_only_send() === 'TfL') {
+ return false;
+ }
+ return true;
+ },
+ message: 'Due to the need to consider a priority response we would ask you to call <a href="tel:+442076412000">020 7641 2000</a> with exact details of the problem.'
+});
+
+var layer_data = [
+ { category: [ 'Food safety/hygiene' ] },
+ { category: 'Damaged, dirty, or missing bin', subcategories: [ '1', '4' ], subcategory_id: '#form_bin_type' },
+ { category: 'Noise', subcategories: [ '1', '3', '4', '7', '8', '9', '10' ] },
+ { category: 'Smoke and odours' },
+];
+
+function uprn_sort(a, b) {
+ a = a.attributes.ADDRESS;
+ b = b.attributes.ADDRESS;
+ var a_flat = a.match(/^(Flat|Unit)s? (\d+)/);
+ var b_flat = b.match(/^(Flat|Unit)s? (\d+)/);
+ if (a_flat && b_flat && a_flat[1] === b_flat[1]) {
+ return a_flat[2] - b_flat[2];
+ }
+ return a.localeCompare(b);
+}
+
+var old_uprn;
+
+function add_to_uprn_select($select, assets) {
+ assets.sort(uprn_sort);
+ $.each(assets, function(i, f) {
+ $select.append('<option value="' + f.attributes.UPRN + '">' + f.attributes.ADDRESS + '</option>');
+ });
+ if (old_uprn && $select.find('option[value=\"' + old_uprn + '\"]').length) {
+ $select.val(old_uprn);
+ }
+}
+
+function construct_uprn_select(assets, has_children) {
+ old_uprn = $('#uprn').val();
+ $("#uprn_select").remove();
+ $('.category_meta_message').html('');
+ var $div = $('<div class="extra-category-questions" id="uprn_select">');
+ if (assets.length > 1 || has_children) {
+ $div.append('<label for="uprn">Please choose a property:</label>');
+ var $select = $('<select id="uprn" class="form-control" name="UPRN" required>');
+ $select.append('<option value="">---</option>');
+ add_to_uprn_select($select, assets);
+ $div.append($select);
+ } else {
+ $div.html('You have selected <b>' + assets[0].attributes.ADDRESS + '</b>');
+ }
+ $div.appendTo('#js-post-category-messages');
+}
+
+$.each(layer_data, function(i, o) {
+ var params = {
+ class: OpenLayers.Layer.VectorAssetWestminsterUPRN,
+ asset_category: o.category,
+ asset_item: 'property',
+ http_options: {
+ url: url_base + '25/query?',
+ params: {
+ where: "PARENTUPRN='XXXX' AND PROPERTYTYPE NOT IN ('Pay Phone','Street Record')",
+ outFields: 'UPRN,Address,ParentChild'
+ }
+ },
+ max_resolution: 0.5971642833948135,
+ select_action: true,
+ attributes: {
+ 'UPRN': 'UPRN'
+ },
+ actions: {
+ asset_found: function(asset) {
+ if (fixmystreet.message_controller.asset_found()) {
+ return;
+ }
+ var lonlat = asset.geometry.getBounds().getCenterLonLat();
+ var overlap_threshold = 1; // Features considered overlapping if within 1m of each other
+ var overlapping_features = this.getFeaturesWithinDistance(
+ new OpenLayers.Geometry.Point(lonlat.lon, lonlat.lat),
+ overlap_threshold
+ );
+
+ var parent_uprns = [];
+ $.each(overlapping_features, function(i, f) {
+ if (f.attributes.PARENTCHILD === 'Parent') {
+ parent_uprns.push("PARENTUPRN='" + f.attributes.UPRN + "'");
+ }
+ });
+ parent_uprns = parent_uprns.join(' OR ');
+
+ if (parent_uprns) {
+ var url = url_base + '25/query?' + OpenLayers.Util.getParameterString({
+ inSR: 4326,
+ f: 'geojson',
+ outFields: 'UPRN,Address',
+ where: parent_uprns
+ });
+ $.getJSON(url, function(data) {
+ var features = [];
+ $.each(data.features, function(i, f) {
+ features.push({ attributes: f.properties });
+ });
+ add_to_uprn_select($('#uprn'), features);
+ });
+ }
+ construct_uprn_select(overlapping_features, parent_uprns);
+ },
+ asset_not_found: function() {
+ $('.category_meta_message').html('You can pick a <b class="asset-spot">' + this.fixmystreet.asset_item + '</b> from the map &raquo;');
+ $("#uprn_select").remove();
+ fixmystreet.message_controller.asset_not_found(this);
+ }
+ }
+ };
+
+ if (o.subcategories) {
+ params.class = OpenLayers.Layer.VectorAssetWestminsterSubcatUPRN;
+ params.subcategories = o.subcategories;
+ params.subcategory_id = o.subcategory_id || '#form_type';
+ }
+
+ fixmystreet.assets.add(defaults, params);
+});
+
+layer_data = [
+ { group: 'Street lights', item: 'street light', layers: [ 18, 50, 60 ] },
+ { category: 'Pavement damage', layers: [ 14 ], road: true },
+ { category: 'Pothole', layers: [ 11, 44 ], road: true },
+ { group: 'Drains', item: 'gully', layers: [ 16 ] },
+
+ { category: 'Signs and bollards', subcategories: [ '1' ], subcategory_id: '#form_featuretypecode', item: 'bollard', layers: [ 42, 52 ] },
+ { category: 'Signs and bollards', subcategories: [ 'PLFP' ], subcategory_id: '#form_featuretypecode', item: 'feeder pillar', layers: [ 56 ] },
+ { category: 'Signs and bollards', subcategories: [ '3' ], subcategory_id: '#form_featuretypecode', item: 'sign', layers: [ 48, 58, 54 ] },
+ { category: 'Signs and bollards', subcategories: [ '2' ], subcategory_id: '#form_featuretypecode', item: 'street nameplate', layers: [ 46 ] }
+];
+
+$.each(layer_data, function(i, o) {
+ var layers_added = [];
+ var attr = 'central_asset_id';
+ var params = $.extend(true, {}, defaults, {
+ asset_category: o.category,
+ asset_item: o.item,
+ http_options: {
+ params: {
+ outFields: attr
+ }
+ },
+ attributes: {}
+ });
+
+ if (o.group) {
+ params.asset_group = o.group;
+ } else if (o.subcategories) {
+ params.class = OpenLayers.Layer.VectorAssetWestminsterSubcat;
+ params.subcategories = o.subcategories;
+ params.subcategory_id = o.subcategory_id || '#form_type';
+ }
+
+ if (o.road) {
+ params.non_interactive = true;
+ params.nearest_radius = 100;
+ params.stylemap = fixmystreet.assets.stylemap_invisible;
+ params.usrn = {
+ attribute: attr,
+ field: attr
+ };
+ } else {
+ params.attributes[attr] = attr;
+ }
+
+ $.each(o.layers, function(i, l) {
+ var layer_url = { http_options: { url: url_base + l + '/query?' } };
+ var options = $.extend(true, {}, params, layer_url);
+ layers_added.push(fixmystreet.assets.add_layer(options));
+ });
+ fixmystreet.assets.add_controls(layers_added, params);
+});
+
+$(function(){
+ $("#problem_form").on("change.category", "#form_type, #form_featuretypecode, #form_bin_type", function() {
+ $(fixmystreet).trigger('report_new:category_change');
+ });
+});
+
+fixmystreet.message_controller.register_category({
+ body: defaults.body,
+ category: 'Burst water main',
+ message: 'To report a burst water main, please <a href="https://www.thameswater.co.uk/help-and-advice/Report-a-problem/Report-a-problem">contact Thames Water</a>'
+});
+
+})();
diff --git a/web/cobrands/westminster/base.scss b/web/cobrands/westminster/base.scss
new file mode 100644
index 000000000..3820c8fea
--- /dev/null
+++ b/web/cobrands/westminster/base.scss
@@ -0,0 +1,232 @@
+@import "../sass/h5bp";
+@import "colours";
+@import "../sass/mixins";
+
+@import "../sass/base";
+
+body.frontpage {
+ background-color: #fff; // instead of $westminster_grey
+}
+
+#site-logo {
+ background-position: 0 0;
+ background-size: 120px 30px;
+ height: 30px;
+ width: 130px; // 10px of white space to the right, so centred logo position matches main site
+ background-image: url(/cobrands/westminster/images/wcc_logo.png);
+ margin: 0 auto; // centre logo
+}
+
+#site-header {
+ padding-top: 13px;
+ padding-bottom: 15px;
+ border-bottom: 3px solid $westminster-yellow;
+}
+
+#nav-link {
+ right: auto;
+ left: 0.25em; // roughly match "menu" icon location on left of the main site
+}
+
+#report-cta {
+ right: 1em; // right-aligned, rather than left-aligned
+}
+
+#front-main {
+ background-color: $westminster_grey;
+ margin: 0;
+ padding: 1em;
+ text-align: inherit;
+
+ h1 {
+ font-weight: bold;
+ color: $westminster_navy;
+ }
+
+ #postcodeForm {
+ margin: 0;
+ padding: 0;
+ background: transparent;
+ color: inherit;
+
+ div {
+ display: block;
+ border: none;
+ background: transparent;
+ position: relative;
+
+ input#pc {
+ display: block;
+ width: 100%;
+ box-sizing: border-box;
+ padding: 10px 22px;
+ box-shadow: 1px 1px 5px 1px rgba(104, 104, 104, 0.4);
+ background: #fff;
+ }
+
+ input#sub {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ display: block;
+ width: 0;
+ height: auto;
+ padding-left: 50px;
+ overflow: hidden;
+ background: transparent url(/cobrands/westminster/images/search-icon.png) no-repeat 50% 50%;
+ background-size: 25px 25px;
+
+ &:hover {
+ background: transparent url(/cobrands/westminster/images/search-icon.png) no-repeat 50% 50%;
+ background-size: 25px 25px;
+ }
+
+ &:focus {
+ outline: 1px dotted #000;
+ }
+ }
+ }
+ }
+
+ a#geolocate_link {
+ background: transparent;
+ display: block;
+ padding: 0;
+ margin-top: 0.5em;
+ font-family: inherit;
+ font-size: 1em;
+ border-radius: 0;
+ color: $westminster_blue;
+
+ &:hover {
+ background: transparent;
+ text-decoration: underline;
+ }
+ }
+
+ .form-hint {
+ color: inherit;
+ }
+}
+
+#front-howto h2,
+#front-recently h2 {
+ font-weight: bold;
+ color: $westminster-navy;
+}
+
+ol.big-numbers>li:before {
+ color: $westminster-navy;
+}
+
+#front_stats {
+ background-color: $westminster-blue;
+ color: #fff;
+}
+
+#report-cta {
+ border: 0;
+ background-color: $westminster-yellow;
+ &:hover,
+ &:focus {
+ color: #fff;
+ }
+}
+
+.westminster-footer {
+ background-color: $westminster_navy;
+ border-top: 3px solid $westminster-yellow;
+ padding: 1.5em 0;
+ text-align: center;
+
+ a {
+ color: #fff;
+ }
+}
+
+.westminster-footer-logo {
+ a {
+ $image-width: 200px*(130/200);
+ $image-height: 49px*(130/200);
+ display: inline-block;
+ overflow: hidden;
+ width: $image-width;
+ padding-top: $image-height;
+ height: 0;
+ background-size: $image-width $image-height;
+ background-position: center center;
+ background-repeat: no-repeat;
+ @include svg-background-image('/cobrands/westminster/images/footer-logo');
+ }
+}
+
+.westminster-site-links,
+.westminster-social-links,
+.westminster-tertiary-links {
+ list-style: none;
+ margin: 0;
+
+ li {
+ list-style: none;
+ }
+}
+
+.westminster-site-links {
+ margin-top: 1.5em;
+ font-size: 1.1em;
+
+ li {
+ margin-bottom: 1em;
+ }
+}
+
+.westminster-social-links {
+ margin: 1.5em -6px;
+
+ li {
+ display: inline-block;
+ margin: 0 6px;
+ }
+
+ a {
+ display: inline-block;
+ overflow: hidden;
+ width: 38px;
+ padding-top: 38px;
+ height: 0;
+ background-color: $westminster_grey;
+ background-size: 24px 24px;
+ background-repeat: no-repeat;
+ background-position: center center;
+ border-radius: 38px;
+ }
+}
+
+.westminster-social-links__twitter {
+ @include svg-background-image('/cobrands/westminster/images/footer-twitter');
+}
+
+.westminster-social-links__instagram {
+ @include svg-background-image('/cobrands/westminster/images/footer-instagram');
+}
+
+.westminster-social-links__facebook {
+ @include svg-background-image('/cobrands/westminster/images/footer-facebook');
+}
+
+.westminster-tertiary-links {
+ font-size: 0.8em;
+ padding-top: 2em;
+ border-top: 1px solid $westminster_grey;
+ margin: 0 -6px;
+
+ li {
+ display: inline-block;
+ margin: 0.2em 6px;
+ }
+}
+
+.item-list__item--expandable__actions a.btn--primary {
+ display: none; // No updates
+}
diff --git a/web/cobrands/westminster/favicon.ico b/web/cobrands/westminster/favicon.ico
new file mode 100644
index 000000000..35c7ff782
--- /dev/null
+++ b/web/cobrands/westminster/favicon.ico
Binary files differ
diff --git a/web/cobrands/westminster/images/chevron-black-right.png b/web/cobrands/westminster/images/chevron-black-right.png
new file mode 100644
index 000000000..4375d7f71
--- /dev/null
+++ b/web/cobrands/westminster/images/chevron-black-right.png
Binary files differ
diff --git a/web/cobrands/westminster/images/chevron-black-right.svg b/web/cobrands/westminster/images/chevron-black-right.svg
new file mode 100644
index 000000000..5b24145ac
--- /dev/null
+++ b/web/cobrands/westminster/images/chevron-black-right.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="43" height="33"><path fill="#0D0E16" d="M0 0h13l13 16-13 16H0l13-16"/></svg> \ No newline at end of file
diff --git a/web/cobrands/westminster/images/collection-default-bg.jpg b/web/cobrands/westminster/images/collection-default-bg.jpg
new file mode 100644
index 000000000..7ccfab873
--- /dev/null
+++ b/web/cobrands/westminster/images/collection-default-bg.jpg
Binary files differ
diff --git a/web/cobrands/westminster/images/footer-facebook.png b/web/cobrands/westminster/images/footer-facebook.png
new file mode 100644
index 000000000..72e74c606
--- /dev/null
+++ b/web/cobrands/westminster/images/footer-facebook.png
Binary files differ
diff --git a/web/cobrands/westminster/images/footer-facebook.svg b/web/cobrands/westminster/images/footer-facebook.svg
new file mode 100644
index 000000000..4dea6ce6f
--- /dev/null
+++ b/web/cobrands/westminster/images/footer-facebook.svg
@@ -0,0 +1 @@
+<svg width="24" height="24" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M17.8 1v3.6h-2.1c-.8 0-1.3.1-1.6.4-.2.4-.4.8-.4 1.5V9h4l-.6 4h-3.4V23h-4V13H6.1V9h3.4V6c0-1.6.5-2.9 1.4-3.8A5 5 0 0 1 14.7 1l3 .1z" fill="#091F67" fill-rule="nonzero"/></svg> \ No newline at end of file
diff --git a/web/cobrands/westminster/images/footer-instagram.png b/web/cobrands/westminster/images/footer-instagram.png
new file mode 100644
index 000000000..f1bdee818
--- /dev/null
+++ b/web/cobrands/westminster/images/footer-instagram.png
Binary files differ
diff --git a/web/cobrands/westminster/images/footer-instagram.svg b/web/cobrands/westminster/images/footer-instagram.svg
new file mode 100644
index 000000000..a3623fde1
--- /dev/null
+++ b/web/cobrands/westminster/images/footer-instagram.svg
@@ -0,0 +1 @@
+<svg width="24" height="24" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M20 19.1v-8.7H18l.3 1.8a6.2 6.2 0 0 1-3.2 5.4c-1 .5-2 .8-3.2.8-1.7 0-3.3-.6-4.5-1.8a5.9 5.9 0 0 1-1.6-6.2H4v8.7c0 .2 0 .4.2.6l.6.2h14.3c.3 0 .5 0 .6-.2l.3-.6zM16.2 12c0-1.1-.5-2-1.3-2.9A4 4 0 0 0 12 8 4 4 0 0 0 9.1 9C8.3 10 7.9 11 7.9 12a4 4 0 0 0 4.1 4 4 4 0 0 0 3-1.2c.7-.8 1.2-1.7 1.2-2.8zM20 7V5l-.3-.6A.9.9 0 0 0 19 4h-2.3c-.3 0-.5.1-.7.3l-.2.6v2.2c0 .3 0 .5.2.7.2.2.4.3.7.3H19c.3 0 .5-.1.7-.3.2-.2.3-.4.3-.7zm2.3-2.7v15.2c0 .8-.3 1.4-.8 2-.5.4-1.1.7-1.9.7H4.4c-.8 0-1.4-.3-2-.8-.4-.5-.7-1.1-.7-1.9V4.4c0-.8.3-1.4.8-2 .5-.4 1.1-.7 1.9-.7h15.2c.8 0 1.4.3 2 .8.4.5.7 1.1.7 1.9z" fill="#091F67" fill-rule="nonzero"/></svg> \ No newline at end of file
diff --git a/web/cobrands/westminster/images/footer-logo.png b/web/cobrands/westminster/images/footer-logo.png
new file mode 100644
index 000000000..0131b9342
--- /dev/null
+++ b/web/cobrands/westminster/images/footer-logo.png
Binary files differ
diff --git a/web/cobrands/westminster/images/footer-logo.svg b/web/cobrands/westminster/images/footer-logo.svg
new file mode 100644
index 000000000..b06e03cb4
--- /dev/null
+++ b/web/cobrands/westminster/images/footer-logo.svg
@@ -0,0 +1 @@
+<svg width="200" height="49" viewBox="0 0 200 49" xmlns="http://www.w3.org/2000/svg"><g fill="#FFF" fill-rule="nonzero"><path d="M195 33.4c0-.3 0-.5-.3-.5l-.7.8c-.5.7-1.9 1.6-2.4 1.9-.3 0-.4.2-.4.4 0 .3.2.3.3.3.9.1 1.2.2 1.2 2.1v6c0 1.7 0 2-1 2.3-.6 0-.8.2-.8.5 0 .4.3.4.4.4l2.5-.1h2.8c.2 0 .5 0 .5-.4s-.3-.5-.8-.5c-1.3 0-1.3-1-1.3-2.2v-5.9c0-2.6.7-3 1.2-3 .2 0 .3 0 .8.6.3.6.7.8 1.2.8.6 0 1.5-.5 1.5-1.7 0-1.3-.9-2-1.8-2-1.4 0-2.5 1.9-2.6 2l-.2.2-.1-.4v-1.6zM84.7 36.4l-.2-.7.1-.4 1.6-4c.8-2 1-2.2 1.7-2.2.6 0 .9-.2.9-.6 0-.4-.3-.4-.6-.4l-1.3.1h-2c-.2 0-.4 0-.4.3a.4.4 0 0 0 .4.4c.5.1.8.3.8.7 0 .4-.1.7-.3 1L84 34.5l-1.4-4-.2-1.1c0-.3.2-.4.5-.4.2 0 .9 0 .9-.5a.4.4 0 0 0-.4-.4l-2.3.1h-2.6c-.2 0-.5 0-.5.3 0 .4.3.4.9.6.4 0 .6.4 1.1 1.9l2.4 6.6v.9l-1.9 4.7-4.4-12.7c-.2-.3-.2-.7-.3-1 0-.4.5-.5.6-.5.4 0 .7 0 .7-.5 0-.4-.3-.4-.6-.4l-2.5.1-2.4-.1c-.2 0-.5 0-.5.4s0 .4.9.6c.4 0 .7.2 1.3 1.8L79 47.3c.1.4.3.7.5.7s.3-.1.6-.9l2.9-7.8 2.5 8c.2.6.4.7.6.7.2 0 .3-.2.4-.6l5.1-15.6c.8-2.6 1.2-2.6 1.7-2.7.6-.1.9-.2.9-.6 0-.4-.3-.4-.4-.4l-1.7.1h-1.8c-.2 0-.6 0-.6.3 0 .4.2.4.4.5.8.1 1 .2 1 .7a9 9 0 0 1-.4 1.7L87 43l-2.2-6.5zM101.6 38.2c.3 0 .6 0 .6-.5 0-1-.8-4.5-4.4-4.5-3.2 0-6 3-6 7.5 0 4.4 2.5 7 5.6 7 3 0 4.8-2.7 4.8-3.1 0-.1 0-.3-.3-.3l-.5.5c-.6.8-1.6 1.2-2.6 1.2-2.5 0-4.3-2.6-4.3-6.1 0-1.6.3-1.7.7-1.7h6.4zm-6.1-1c-.6 0-.7 0-.7-.3 0-.5.8-3 3-3 .3 0 2 0 2 1.9 0 .8-.7 1.5-1.7 1.5h-2.6zM103.6 45.7c0 .8 0 1 .3 1.2.9.5 2 .8 3 .9 3.2 0 4.6-2.7 4.6-5 0-2.7-2-3.8-2.8-4.2-2.4-1.3-3-1.6-3-2.8a1.8 1.8 0 0 1 2-2c1.6 0 2.2 1.7 2.4 2.3.1.6.2.7.4.7s.3-.4.3-.5v-1.8c0-.5 0-.9-.5-1l-2.4-.3c-3.1 0-4.2 2.5-4.2 4.2 0 2.3 1.7 3.1 3.1 3.9 1.7.8 2.8 1.5 2.8 3.2 0 1.6-1.3 2.5-2.4 2.5-2 0-2.6-2.7-2.7-3.3-.1-.5-.3-.8-.5-.8-.3 0-.4.4-.4.5v2.3zM116.3 35.6c0-.6 0-.7.4-.7h2.1c.4 0 .4 0 .5-.6 0-.5-.1-.6-.3-.6h-2.1c-.5 0-.6 0-.6-.7v-2c0-.6-.3-.6-.3-.6-.2 0-.4.3-.4.4a7 7 0 0 1-2.2 2.8l-.6.4-.4.6c0 .3.3.3.4.3h.6c.4 0 .5.2.5.6v8.9c0 2.3 1.2 3.4 2.5 3.4 1.7 0 3.2-2 3.2-2.4 0-.1 0-.3-.2-.3l-.2.2c-.9.6-1.2.7-1.6.7-1.2 0-1.3-1.4-1.3-2.8v-7.6zM135.8 44.4c0 1.7 0 2-1 2.3-.5 0-.7.2-.7.5 0 .4.2.4.4.4l2.4-.1h2.5c.2 0 .4 0 .4-.3s-.1-.4-.7-.5c-1-.2-1-.6-1-2.3V37c0-1-.3-3.8-3.4-3.8-.8 0-1.7.4-2.7 1.4 0 .1-.6 1-.8 1l-.5-.8c-.4-1-1.4-1.6-2.5-1.6s-2 .2-3.3 2l-.3.3-.1-.6v-1.5c0-.3 0-.6-.3-.6-.2 0-.4.3-.5.6a7 7 0 0 1-2.5 2c-.2 0-.3.2-.3.4 0 .4.3.4.6.4.8.1.8.8.8 2.3v6c0 1.6 0 2-1 2.2-.6 0-.8.2-.8.5 0 .4.3.4.4.4l2.5-.1h2.4c.2 0 .5 0 .5-.3s-.1-.4-.7-.5c-1-.2-1-.6-1-2.3v-6.6c0-.7 0-1.3.4-1.7.4-.7 1-1 2-1 1.7 0 2 1.6 2 3.2v6c0 1.9 0 2.2-1 2.4-.5 0-.7.2-.7.5 0 .4.2.4.4.4l2.5-.1h2.4c.2 0 .4 0 .4-.3s0-.4-.7-.5c-1-.2-1-.6-1-2.3v-6.7c0-.6 0-1.3.4-1.8.5-.6 1.2-1 2-1 2 0 2 2 2 3v6.5zM145 29.8c0-1-.5-1.8-1.2-1.8-.8 0-1.4.9-1.4 1.7 0 1 .6 1.7 1.4 1.7.7 0 1.3-.8 1.3-1.6M142.6 44.4c0 1.7 0 2-1 2.3-.5 0-.7.2-.7.5 0 .4.2.4.4.4l2.5-.1h2.5c.1 0 .4 0 .4-.3s-.1-.4-.7-.5c-1-.2-1-.6-1-2.3v-10c0-.7 0-1.1-.3-1.1-.2 0-1 .8-1.1 1-.4.4-1 .8-2.1 1.3-.3 0-.4.2-.4.5s.4.4.4.4c.9 0 1.1.5 1.1 2v6zM156.6 44.4c0 1.7 0 2-1 2.3-.6 0-.8.2-.8.5 0 .4.3.4.4.4l2.5-.1h2.5c.2 0 .4 0 .4-.3s0-.4-.7-.5c-1-.2-1-.6-1-2.3v-7.2c0-3-1.7-4-3.3-4-1.4 0-2 .4-3.5 2.1l-.4.2v-2.1c0-.3-.1-.6-.3-.6-.2 0-.4.3-.6.6a7 7 0 0 1-2.4 2c-.3 0-.3.2-.3.4 0 .4.2.4.6.4.7.1.7.8.7 2.2v6c0 1.7 0 2-1 2.3-.5 0-.7.2-.7.5 0 .4.2.4.4.4l2.5-.2 2.5.2c.2 0 .4 0 .4-.4 0-.3-.1-.4-.7-.5-1-.2-1-.6-1-2.3v-6.6c0-.7 0-1.3.4-1.7.5-.7 1.2-1 2-1 2.4 0 2.4 2.2 2.4 3.7v5.6zM162.4 45.7c0 .8 0 1 .3 1.2 1 .5 2 .8 3 .9 3.2 0 4.7-2.7 4.7-5 0-2.7-2-3.8-2.8-4.2-2.5-1.3-3-1.6-3-2.8a1.8 1.8 0 0 1 2-2c1.6 0 2.2 1.7 2.3 2.3.2.6.3.7.5.7s.3-.4.3-.5v-1.8c0-.5 0-.9-.6-1l-2.3-.3c-3.2 0-4.2 2.5-4.2 4.2 0 2.3 1.7 3.1 3 3.9 1.7.8 2.8 1.5 2.8 3.2 0 1.6-1.2 2.5-2.3 2.5-2 0-2.6-2.7-2.8-3.3 0-.5-.2-.8-.5-.8s-.3.4-.3.5v2.3zM175.8 35.6c0-.6 0-.7.5-.7h2c.4 0 .5 0 .5-.6 0-.5 0-.6-.3-.6H176.4c-.5 0-.6 0-.6-.7v-2c0-.6-.2-.6-.3-.6-.2 0-.3.3-.4.4a7 7 0 0 1-2.1 2.8l-.6.4c-.2.2-.4.4-.4.6 0 .3.3.3.4.3h.5c.4 0 .6.2.6.6v8.9c0 2.3 1.2 3.4 2.4 3.4 1.8 0 3.3-2 3.3-2.4 0-.1 0-.3-.2-.3 0 0-.2 0-.3.2-.8.6-1.1.7-1.5.7-1.2 0-1.4-1.4-1.4-2.8v-7.6zM189.3 38.2c.3 0 .6 0 .6-.5 0-1-.8-4.5-4.4-4.5-3.2 0-6 3-6 7.5 0 4.4 2.5 7 5.6 7 3 0 4.7-2.7 4.7-3.1 0-.1 0-.3-.2-.3l-.5.5c-.6.8-1.6 1.2-2.6 1.2-2.5 0-4.2-2.6-4.2-6.1 0-1.6.2-1.7.6-1.7h6.4zm-6.1-1c-.6 0-.6 0-.6-.3 0-.5.7-3 2.9-3 .3 0 2 0 2 1.9 0 .8-.7 1.5-1.7 1.5h-2.6z"/><g><path d="M86.5 2.8c-.1-.9-.2-1.2-1.3-1.4-1.6-.4-2-.5-3.1-.5C75.9 1 73 6.6 73 11c0 4 2.6 10.2 8.7 10.2 2.4 0 4-1 4.4-1.3.3-.3.6-.7.5-1.2l.2-2.6c0-.3 0-.5-.3-.5s-.5.4-.5.6c-1 2.4-2 4.1-4.3 4.1-3.5 0-5.5-5-5.5-9.4 0-4 1.8-9.1 5.7-9.1 2.2 0 3 1.4 4 3.2.2.5.4.5.5.5.3 0 .3-.2.3-.5l-.2-2.2zM92.5 2.8c0-1-.6-1.8-1.3-1.8-.8 0-1.3.9-1.3 1.8s.5 1.7 1.3 1.7 1.3-.9 1.3-1.7M90 17.8c0 1.7 0 2-1 2.2-.5.1-.7.3-.7.5 0 .5.2.5.4.5l2.5-.2 2.5.2c.2 0 .4 0 .4-.4 0-.3-.1-.5-.7-.6-1-.2-1-.5-1-2.3V7.5c0-.7 0-1-.3-1-.2 0-1 .8-1.1 1-.4.3-1 .7-2.1 1.2-.3.1-.4.3-.4.5 0 .4.4.4.5.4.8.1 1 .5 1 2.2v6zM98 8.8c0-.7 0-.7.5-.7h2.1c.3 0 .4 0 .4-.6s0-.7-.3-.7H98.6c-.5 0-.6 0-.6-.6V4c0-.5-.2-.5-.3-.5l-.4.4a7.2 7.2 0 0 1-2 2.8l-.7.5c-.2 0-.4.3-.4.5 0 .4.3.4.4.4h.6c.3 0 .5.1.5.5v9.1c0 2.4 1.2 3.4 2.4 3.4 1.8 0 3.3-1.9 3.3-2.4 0 0 0-.2-.2-.2h-.3c-.8.8-1.1.9-1.5.9-1.2 0-1.4-1.5-1.4-2.9V8.8zM106 9.5c-.2-.3-.2-.6-.3-1 0-.5.3-.8.6-.8 1-.1 1-.1 1-.5 0-.3-.1-.4-.4-.4h-5c-.2 0-.6 0-.6.4l.1.3h.3c1 .2 1.1.2 1.7 2l3 10 .4 1.6-.2.9-.6 1.8c-.4 1-.7 1.1-1 1.1h-.8c-.8 0-1 .8-1 1.5 0 .4 0 1.3 1.3 1.3s1.4-.5 1.7-1.8l2.2-7.7c1-3.3 1.9-5.6 2.9-8.3.5-1.5.8-2.2 1.3-2.3.7 0 .9-.1.9-.5V7c-.2-.1-.3-.2-.4-.1h-3.8s-.4 0-.4.4.3.4.9.4c.6 0 .8.4.8 1l-.3 1.5-2.1 6.7-2.3-7.3zM135.8 8.8c0-.6.1-.7.6-.7h2.1c.3 0 .4 0 .4-.4 0-.7-.2-.9-.4-.9h-2.2c-.4 0-.5 0-.5-.7 0-1.2 0-5 1.5-5 .4 0 .7.3 1.3 1.5.1.2.5.7.8.7.4 0 1-1.5 1-2 0-1.2-1.7-1.3-2-1.3-1.5 0-4.3 1.6-4.7 5.4-.2 1.4-.3 1.5-.8 1.6-.6.2-.9.4-.9.8 0 .3.2.4.4.4l.6-.1c.4 0 .5 0 .5 1.1v8.5c0 1.3 0 2.1-1.2 2.3-.5 0-.8 0-.8.5s.3.5.5.5c.1 0 1-.2 2.7-.2 1.6 0 2.4.2 2.7.2.2 0 .5 0 .5-.5s-.4-.5-.9-.5c-1.2-.1-1.2-1-1.2-2.3V8.8zM130.5 13.4c0-4.7-3-7.1-5.8-7.1-3.5 0-5.8 3.8-5.8 7.4 0 3.6 2.2 7.4 6 7.4 3.2 0 5.6-3.5 5.6-7.7m-9-.3c0-3.8 1.3-6.1 3-6.1 2.7 0 3.5 4.6 3.5 6.7 0 3.8-1.5 6.7-3.2 6.7-2 0-3.4-3.3-3.4-7.3"/></g><g><path d="M30.8 14.5c1.8-.1 3.5-.1 5.2.1.7.2.3-.4.2-.5l-1.1-1H35l-.3-.2h-2.2c-1 0-1.8.2-2.7.4-.4.1 0 .4 0 .4a4.6 4.6 0 0 1 .6.8h.4M27.7 13.4a8 8 0 0 0 1-.3c.1-.1.1-.2-.1-.2h-1l-.3.1c.1.2 0 .5.4.4M23 16.7l-.2.2-.2.2-.4 2.8v2.5l.2.4s.1.3.3.3h2.7c1.6.1 3.1.3 3.4-.2.3-.4.2-1.4.4-2.6 0-2 .1-3-.1-3.4-.4-.4-2.1-.2-6.2-.2m5 2.6v1.1c0 .4-.4.6-.6.9-.2.2.1.7 0 .9-.2 0-.3 0-.5-.2-.2-.3-.5.3-1.1.3l-1-.5c-.2 0-.3 0-.5.2-.3 0 0-.4-.2-.8-.1-.3-.4-.1-.6-.5-.1-.4 0-.8.1-1l-.2-.6c-.1-.2.5 0 .7-.2.2-.2 0-.3.2-.7.2-.3.5-.2.9-.3.3 0 .3-.5.5-.7.2-.2.2.6.8.6.5 0 .9.1 1 .6.3.4.5.4.8.5.2 0 0 .1-.2.4"/><path d="M65.8 15.4h-.3c-.7 0-1.3.2-1.7.7l-.6 1.3-.1.3c0 .1 0 .2-.2.3h-.4l.3-.5v-.8c0-.2 0-.5.2-.7.1-.3 0-.7-.3-.8-.2 0-.4.1-.4.3l-.7 1-.8.8c-1.3 1.9-2.3 3.8-2 6 .2 1.6.7 2 2 3.5.9 1.6 1.8 2.8 1.4 4.2-.2.9-1.3.9-2.2.7.1-2.1-.4-3.2-1.4-5-1-1.8-2.4-2.8-3.6-4.5l-.1-.2v-.1c.2 0 .2-.2.3-.3.2.2.6.3.8.1.5-.4.2-1 .2-1.3l.1-.2.4-.1h.3c0 .1.8.1 1-.1.5-.4.2-1.4 0-2.2-.2-.8-.5-1-.4-1.6.4-.3 1 1 1.4.4.5-.5-.2-.8-.2-1.4 0-.2.7-.3.7-.7.1-.4-.5-1-.7-1.2h-.3V13l-.1-1.6-.5-1.3c0-.4.6-.7.6-1 0-.2-.4-.2-.6-.5-.3-.8.1-1.3-.3-1.4-.3 0-.3.2-.7.5-.2 0-.1-.4-.4-.5l-.5.3-.4.4-.4.2-.6.3-1.1.3c-.4 0-.7.2-1 .3-.7.4-.9.6-1.5 1.2-.2 0-.3.3-.3.5 0 .1 0 .3.2.4 0 .5 0 1 .2 1 .6.4 1.1 0 1.5.2 0 .2-.9.4-1.6.4l-1.1-.2h-.6l-.3-.1h-.2c-.1.1.3.3.7.6.5.3.4.7 1 .7.5 0 1.8-.7 1.8-.5.1.1-.4.3-.7.4-.5.3-1 0-1.2 1 0 .7 1.4 0 1.3.3 0 .3-.8.6-1.5.6a2 2 0 0 0-.6.5c-.1.1 0 .3-.2.4-.4.6-1.4.1-4.1-1a5.2 5.2 0 0 0-3.6-.5c-.2 0-.4.3-.4.5 0 .4.6.6 1 .4.4 0 .9-.1 1.2.3.3.3.1.5 0 1.2 0 .3.1.7.3 1l.4.5c.2.2.4 0 .5.1l.2.4.2.1c.2.2 0 .5.1.5.1.1.4 0 .6-.2v-.1l.3.3c0 .2 0 .5.3.6.3.3.6-.2.8 0 .1.1-.6 1-1.2 1.4-.4.5-.7.6-1.3 1.1-.5.6-.6 1.1-1 2.2-.2.4-.1.6-.6 1l.2-.9c.1-.4.1-.8.4-1 0-.1.3-.3.2-.4h-22l.3.3c.2.3.2.7.3 1.1.2.4.3.5.3 1-.5-.5-.5-.7-.6-1.1-.4-1-.5-1.6-1-2.2l-1.4-1c-.5-.6-1.3-1.4-1.2-1.5.2-.2.6.3.9 0 .2-.1.3-.4.3-.6l.2-.3c.3.2.5.4.6.3.2 0 0-.3.1-.5h.3l.1-.5h.6l.3-.6.4-1c-.2-.6-.3-.8 0-1.2.3-.4.7-.3 1.2-.2.3.1 1 0 1-.5 0-.2-.2-.4-.5-.5-1.2-.3-2.4 0-3.5.5-2.8 1.1-3.8 1.6-4.2 1l-.1-.4a2 2 0 0 0-.6-.5h-.1c-.7 0-1.5-.3-1.5-.6s1.3.4 1.3-.2c-.2-1.1-.6-.8-1.2-1-.3-.2-.8-.3-.7-.5 0-.2 1.3.6 1.8.6.6 0 .6-.5 1-.8.4-.3.9-.5.7-.5h-.2-.8c-.5 0-.7.3-1.2.2-.7 0-1.5-.2-1.6-.4.4-.1 1 .2 1.5-.1.3-.2.2-.6.3-1.1a.6.6 0 0 0-.2-1c-.6-.5-.8-.7-1.4-1l-1-.4-1.1-.2-.6-.4-.5-.2-.4-.4s-.4-.4-.5-.3c-.2 0-.1.4-.4.5-.4-.3-.4-.5-.7-.5-.4.1 0 .6-.3 1.5-.2.2-.6.2-.6.5 0 .2.6.6.6.9l-.5 1.3a5.1 5.1 0 0 0 0 1.8H7c-.2.3-1 .8-.8 1.2 0 .4.8.5.8.7 0 .6-.8 1-.3 1.4.6.6 1-.7 1.4-.4.1.6-.1.8-.4 1.6-.2.8-.4 1.7 0 2.2.2.2 1 .3 1 0h.3c0 .2.2.1.4.2l.2.2c0 .3-.4 1 .2 1.3.2.2.5 0 .7 0l.3.2v.3c-1.2 1.6-2.6 2.7-3.6 4.5-1 1.8-1.6 2.9-1.4 5-1 .2-2 .2-2.2-.7-.4-1.4.5-2.6 1.4-4.2 1.2-1.5 1.7-2 2-3.5.3-2.2-.7-4.1-2-6-.4-.2-.7-.5-.9-.8l-.6-1c-.1-.2-.3-.3-.5-.3-.3 0-.4.5-.2.8l.1.7v.8l.3.5h-.4a2.5 2.5 0 0 1-.3-.6c-.3-.7-.3-1-.6-1.3-.4-.5-1-.7-1.6-.8-.2 0-.4 0-.4.2v.2c.4.2.7.4 1 .8.5.9.2 1.7.9 2.4.9.9 2 1.5 3 1.9h.4l.4.9c.3.5.5.8.3 1.4-.3 1-.8 2-1.5 2.8-1.9 2.2-2.8 3.7-2.4 5.9.2 1.1 1.9 1.7 3.7 1l.4-.2h.1l.3.3s.2 0 .3.2c.4.3.6.9.4 1.4-.3 1-1 1.5-1.8 2.4v.2l-.4.1v.3l-.3.2c-.2.1 0 .4 0 .7 0 .4-.8.4-.7 1 0 .5.5.3.6.6.1.3-.8.5-.5 1.2.6.6 1.2.4 1.4 1l-.1.6c-.2.2-.2.5 0 .7 0 .2.2.1.6.1l.4-.2.7-.3c.1-.1.3-.1.4 0 .1 0 .2 0 .2.2-.3 0-1 .3-1.2.5-.7.3-1 .6-1.1.8-.2.5 0 .5.4 1.2.3.7.3 1.7.6 2 .4.3 1.2.2 2-.4 2.8-1.4 4.3-1.7 7-2.9l3.8-1.6c-.2.3-.3.5-.3.8 0 .8.2 1 0 2.3 0 .7 0 1 .2 1.5.5.7 1.5.5 2.7.5.8 0 5.7-.3 10.2-.3h1.6c4.5 0 9.4.3 10.2.3 1.2 0 2.2.2 2.7-.5.3-.5.3-.8.2-1.5-.2-1.3 0-1.5 0-2.3 0-.3-.1-.5-.3-.8l3.8 1.6c2.7 1.2 4.2 1.5 7 3 .8.5 1.7.6 2 .2.3-.3.3-1.2.6-1.9.4-.7.6-.8.4-1.2 0-.2-.4-.5-1-.8-.2-.2-1-.5-1.3-.5l.2-.3h.4l.7.3.5.3c.3 0 .4 0 .6-.2v-.6a.7.7 0 0 1-.2-.6c.2-.6.9-.4 1.4-1 .4-.8-.6-.9-.5-1.2.1-.3.6-.1.6-.7.1-.5-.6-.5-.7-1 0-.2.2-.5 0-.6l-.2-.2v-.3c-.2-.1-.3-.2-.4-.1l-.1-.2c-.7-.9-1.5-1.5-1.8-2.5-.2-.5 0-1 .4-1.4.1 0 .3 0 .3-.2 0 0 .2 0 .2-.2h.2c.1 0 .3 0 .4.2 1.8.7 3.5 0 3.7-1 .4-2.2-.6-3.7-2.4-6a7.5 7.5 0 0 1-1.5-2.8c-.2-.5 0-.9.3-1.4l.4-.8h.3a8 8 0 0 0 3.1-2c.7-.7.4-1.4 1-2.4l.8-.8c.1 0 .1-.2 0-.2m-12.7-5c.3-.2 1.1-.5 1.1-.3.2.8-.3.5-.6.7-.2.2-.8.6-.8.2 0-.3 0-.6.3-.7m-15.8 17c.4-.1.4-.4.5-.6 0-.3.5-.3.9-.2h.2l.3-.4c.1-.2.2-.3.4-.3.3.2.2.4.5.4s.7-.7 1-.3c.1.3-.3 1-.4 1.3l-.2.4c0 .3.1.6.3.7a.6.6 0 0 1 0 .9c-.2.4 0 .4.1.7v.4l-.6.8c-.3 0-.6-.4-.9-.2-.3.1-.6.7-1 .4-.3-.2-.3-.2-.6 0-.5.4-1 .6-.9 0 0-.4.2-.7.5-1 .2-.3-.3-.5.2-.8.7-.3.6-.6.5-.6h-.4l-.5.2c-.2 0-.4-.6-.1-.7.4-.1.8-.2.8-.4h-.6c-.2.3-.4.1-.5.1l-.1-.4c0-.4.3-.4.6-.5m-6.5.7l.5-1.1c0-.3.3-.6.2-.9 0-.3-.2-.6 0-.8.2-.4.7-.5 1-.5 1.4 0 1.4 1.3 1.5 1.5.2.3.8 0 1 .4v1c.1.6.7.3.8 1.5 0 .7-.3.7-.4 1.1l-.2.6v.3c0 .1-.3.5-.2.6l.2 1c.1.5.4.8.6 1.2v.7c0 .8 0 1.1-.2 1.2-.3.2-.4.2-1 .2a6 6 0 0 1-1 0c-.5-.2-1-.2-1.5 0-.4 0-.6.3-1 .3h-.5l-.3.2c-.1 0 0-.2-.2-.3v-.9c0-.6.2-1.2.4-1.8l.7-1.7-.1-.6v-.2c-.4-.1-.9-.3-1-.7-.5-.7.4-1.5.7-2.3m-.2 8.9c.7 0 1.2.5 1.6.3.8 0 1.1-.3 1.9-.3h.5c.7.2 1.2.4 1.7.4l1.4-.2c.2.4 0 .5-.4 1l-.3.2h-.2c-.7.2-.7 0-1.4 0L34 38h-.3c-.3 0-.9.3-1.5.3-.7 0-1.4-.5-1.7-.3-.6 0-1 .4-1.5.3-.3 0-.5-.2-.7-.3-.4-.5-.5-.6-.4-1l1.2.1 1.4-.2m3.7 2.5c-.3-.1-.8.2-1.3.2h-.2c-.5 0-1-.3-1.2-.2-.5 0-.7.3-1.1.2l-.6-.2c-.3-.4-.4-.5-.3-.8l1 .1 1-.2c.6 0 1 .4 1.3.3h.2l1.2-.2 1 .1h1c.1.2 0 .3-.3.6-.1.2-.3.2-.5.3-.5 0-.7-.2-1.2-.3m.4 1.3l-.2.2c-.3.1-.4-.1-.6-.2l-.6.2-.5-.1h-.1c-.2 0-.4.3-.6.2a.5.5 0 0 1-.3-.2c-.1-.3-.2-.4-.1-.6h.5l.4-.1.7.2.6-.2.5.1h.5l-.2.5m-9.5-13.3c.3 0 .3-.3.4-.5.2-.3.5-.3 1-.2h.2l.3-.4c.1-.2.1-.3.3-.3.3.2.2.4.6.4.3 0 .7-.7 1-.3.1.3-.3 1-.4 1.3l-.2.4c0 .3 0 .6.2.7a.6.6 0 0 1 .1.9c-.3.4 0 .4 0 .7.1.1 0 .3 0 .4-.1.2-.3.7-.6.8-.2 0-.5-.4-.8-.2-.3.1-.6.7-1 .4-.3-.2-.3-.2-.7 0-.5.4-.9.6-.8 0 0-.4.2-.7.5-1 .2-.3-.3-.5.2-.8.6-.3.5-.6.5-.6h-.4l-.5.2c-.3 0-.4-.6-.2-.7.5-.1.8-.2.8-.4 0-.1 0 0-.2 0H25c-.2.3-.3.1-.4.1l-.2-.4c0-.4.4-.4.7-.5m-13.4-17c0-.2.8 0 1.2.1.3.2.2.5.2.7 0 .4-.5 0-.8-.2-.3-.2-.7 0-.6-.7M18 39l-3 1.4-2.3 1-1.7.6a5.8 5.8 0 0 0-1.2.6l.1-.4c.4-.4.5-1 .3-1.3-.4-.6-1.9-.4-2.4-.2h-.2-.2v-.2a9.8 9.8 0 0 1 2.8-3.1c2.2-1.7 3.1-3 3-3.8-.1-.5-.3-1-.6-1.4h.5c.4-.1.7 0 1 .4.1.2 0 .2 0 .4 0 .4-.7 2.5.4 3.4 1.1 1.1 2.7.5 3.2 1 .3.3.3.9.7.9.4 0 .5-.5.8-.6.4 0 .7.3 1 .5l-2.2.8m3.9-1.3l-1.4.4c.2-.3.4-.6.6-.6.3 0 .5.2.8 0v.2m22.2 0v-.1c.3.1.6-.1.8-.1.2 0 .4.3.7.6a38 38 0 0 0-1.5-.4m1.6-2.4a.5.5 0 0 0-.4-.2l-.7-.2c-.4 0-.8.1-1.1.5a4 4 0 0 1-.5.6l-.5.5c-.1.1-.2.2-.1.3v.1l.4.1-.2.3c-.2 0-.5 0-.6.2-.5.4-.5 1-.7 1.7-.2.8-.6 1-.6 1.4.2.7.6.9 1 1.3.5.3.8.7 1.1 1.2l.3.4-1.6-.2a54.2 54.2 0 0 0-6.6 0h-2 .3-8.6l-1.7.2.3-.4c.3-.5.7-.9 1.1-1.2.5-.4.8-.6 1-1.3.1-.4-.3-.6-.5-1.4-.2-.7-.3-1.3-.7-1.7a.7.7 0 0 0-.6-.2l-.2-.2V37h.3l.1-.2c0-.1 0-.2-.2-.3l-1-1.1c-.2-.4-.6-.6-1-.5-.3 0-.5 0-.7.2l-.4.2-.1.1H20l-.1.1c-1.3-.3-2-.7-2.5-1.9-.8-2 .2-4-.8-5-.9-.6-1.6-.3-2.4 0l-1 .3h-.9l.6-.8c.7-.7 1.5-.6 2.3-1.3.8-.7 1.6-2.4 1.7-2.2.2 0-.2 1 .6 1.1.5.1.8-.7 1-.6.2 0 .3.3.3.5 0 .4 0 .8-.3 1.1-.2.2-.3.8-.2 1 .2.2 1.2-.5 1.4-.4.2.1 0 1.2.6 1.3.3 0 .5 0 .7-.3l.2-.3c.1.3.2.5.6.4.4 0 .4-.5.4-.7.1-.3.3-.2.3 0v1.4c0 1.7.6 3.4 1.4 4.9 1.5 2.5 3.4 4.1 5.5 5.8l1.4 1.2 1.5 1.1c.2.2.2.3.4.3h.4l.4-.3c.6-.3 1-.7 1.5-1.2l1.4-1c2.1-1.8 4-3.4 5.5-6a10.9 10.9 0 0 0 1.4-6.2c0-.2.3-.3.3 0 0 .2 0 .6.5.7.3 0 .5-.2.6-.5l.2.3c.1.3.4.4.7.3.5 0 .4-1.1.6-1.2.2-.1 1.1.6 1.3.4.2-.2 0-.8-.2-1-.2-.4-.3-.7-.2-1.1l.2-.6c.2 0 .6.7 1.1.7.7-.1.4-1.2.5-1.2.1-.2 1 1.5 1.8 2.3.8.6 1.5.5 2.3 1.2l.6.8h-.8-.1l-1-.2c-.8-.3-1.6-.6-2.4 0-1 1 0 3-.8 5-.5 1.1-1.3 1.6-2.6 1.9l-.2-.1-.1-.1m12.9 5.1v.2l-.2.1h-.2c-.5-.3-2-.5-2.3.1-.2.3-.1 1 .2 1.4v.3L55 42l-1.7-.6c-1-.3-1.4-.6-2.2-1l-3.1-1.5-2.2-.8c.3-.1.6-.5 1-.4.4 0 .4.6.8.5.4 0 .4-.6.7-.9.5-.5 2.1.2 3.2-1 1-.8.5-3 .4-3.4 0-.2-.1-.2 0-.4a1 1 0 0 1 1-.4h.5c-.3.4-.4 1-.5 1.4-.2.8.7 2.1 3 3.8 1 .8 2 1.9 2.7 3.1"/><path d="M29.2 13.8c-.3-.2-.2-.3-.4-.3l-1.6.3c-1.9.6-2.2 1-2.1 1.6 0 .6 1.2.4 1.6.2a31 31 0 0 1 2.7-1c.8 0 .2-.5-.2-.8M43 9.1c-.8-1.3-1-1.9-1.5-2.2-.2-.1-.4 0-.6.2-.5-.2-.8-.5-1.1-.2-.2.2 0 .3 0 .5-.4.3-.7.7-.7 1 .2.4.7.6 1.5 2.2.6 1.1 1.2 0 1.3.4 0 .2-.6.3-.6.9.3.8.8 1.5 1.3 2.2.2.2.3.5.5.5.2.1.7-.2.8-.3.3 0 .6.5.9.3.2-.2 0-.3.1-.6.2-.3.6-.3.6-.6l-.1-.7c-1.2-1.5-1-2-1.5-2.3-.3-.1-.6.3-1 .2l-.1-.4c.2-.4.4-.3.4-.6L43 9m-1.4.3c-.1.7-.3.9-.4.8-1-1.3-1.4-1.3-1.2-1.6.3-.3.4-.3.7.1.1 0 .3 0 .3-.2s-.2-.3-.1-.5c.3 0 .6-.2.7 0 .3.4.9 1 .6 1.5-.3.2-.6-.3-.6 0m1.5 2.8c.1-.3 0-.8.2-.9.3 0 .5.3.8.7 0 .2.5 1 .2 1-.3.2-.6-.7-.7-.4.2.6 0 .6-.2.7-.5.3-.7-.2-1-.5-.2-.7-.4-.7-.1-1 .4-.3.5.3.8.4M25.5 13.4s0-.1-.2 0l-1 .1s-.3.2-.1.4c0 .2.3.6.5.5l1-.4c.2 0 .2-.2 0-.4 0-.2-.2-.2-.2-.2M26.4 13.8c.5-.1 1-.2.8-.5-.1-.3-.2-.3-.4-.3l-.7.2c-.3 0-.4.1-.2.4.1.2 0 .4.5.2M40.4 3.3c-.4.7-.6.8-.7 1.4a1 1 0 0 0 1.1 1c.6 0 1-.4 1.1-.6.6-.4 1 0 1.1-.2.3-.3-.3-1-.2-1.3 0-.4.5-1 .2-1.3-.3-.1-1 .3-1.5.3s-.5-.3-1-.2c-.3 0 .2.4 0 .9M24.5 5.7c1.5-.1 3-3.5-.3-3.2l-.9.2c-1.4.5-2.2 3.4 1.1 3m.4-2.3l.1.1c.6.6-.6 1.7-1.3 1.2-1-.6.4-1.9 1.2-1.3M29.8 23h1a139.4 139.4 0 0 0 3.6 0H36.1c.3-.2.5-.2.4-2l-.2-3.6c0-.2 0-.5-.2-.7l-.8-.3H33l-1 .1-1.9.1c-.3.1-.4.2-.5.6l-.2 3.2v2c0 .2.1.5.4.6m2.4-4c.2 0 0-.9 0-1.2 0-.3 0-.8.7-.7.6 0 .5.6.5.8v1.2c.2.1 2.3-.3 2 .5 0 .4.3.6-1 .6-.3.1-1 0-1 .5l-.1 1.1v.2c-.2.2-.4.4-.7.4-1.1.1 0-2.2-.5-2.2 0-.4-2.3.4-2.2-.6.2-1 2-.4 2.3-.6M41.6 13.9c.2-.2 0-.3-.2-.4l-1-.2-.3.3c-.2.2-.1.4 0 .4l1 .4c.2.1.4-.3.6-.5M26.3 27.6s.6-.2.7-.4c0-.2-.3-.3-.5-.2-.2 0-.5.2-.5.3 0 .2.1.3.3.3M38.1 13.4c.3 0 .3-.2.4-.4 0-.2-.2-.2-.4-.2h-.9c-.2.1-.2.2-.1.3l1 .2M37 23c.3.4 1.9.2 3.5.2 1-.2 2.1 0 2.9 0l.2-.5v-.3-2.5c0-1-.1-1.9-.3-2.8-.1-.2-.1-.3-.2-.2-4 0-6-.4-6.3 0-.3.5-.2 1.4 0 3.4 0 1.2 0 2.2.3 2.6m.6-4c.2-.1.5 0 .7-.5.2-.5.6-.5 1-.6.7 0 .7-.8.9-.6.2.2.2.7.5.7.4.1.6 0 .9.3.2.4 0 .5.2.7.2.2.8 0 .7.2 0 .2-.3.3-.2.6 0 .2.2.6 0 1-.1.4-.4.2-.5.5-.2.4 0 .9-.2.8-.2-.1-.3-.3-.5-.2-.2.1-.5.4-1 .5-.6 0-1-.5-1.1-.3-.2.2-.4.3-.5.2-.1-.2.2-.7 0-1-.2-.2-.6-.4-.6-.8v-1c-.3-.4-.5-.5-.3-.5M37.2 14.8h.2l2 .9c.5.1 1.6.4 1.7-.3 0-.5-.3-1-2.1-1.5-1.6-.5-2.8-.7-3-.7-.1 0-.2.1-.1.2.5.3.9.7 1.2 1.2l.1.2M40 13.6c.1-.3 0-.4-.2-.4L39 13c-.2 0-.2 0-.4.3s.4.4.8.5c.5.2.4 0 .6-.2"/><path d="M21 14c0 .3 0 .5.2.6.2.3.5-.2.8-.2.1 0 .6.4.8.2.2 0 .3-.3.5-.5.5-.6 1-1.4 1.3-2.2 0-.6-.7-.6-.6-.9.1-.3.7.7 1.3-.3.8-1.6 1.3-1.9 1.4-2.3 0 1.2.2 2 .3 3.2a5.5 5.5 0 0 0 .4 1c.1.1.1 0 .4 0 .5-.2 1-.3 1.1-.6 0-.2 0-.2-.4-.2-.2 0 0-1 0-1.1h1c0 .1.3.8.1.8-.6.2-.4.3.2.8.3.2.4.7.6.7.2 0 .2-.3.6-.6.1-.2.8-.7.1-.7-.1 0 0-1 .2-1l1 .1c0 .2.2.7-.2.7-.3 0-.3.3.3.8.2.1.4.5.6.4.2 0 .5-.4.8-.6 0 0 .5-.4 0-.5l-.3-.1.1-.8h1c.2-.1.3.1.3.4.1.5 0 .4-.2.4l-.2.4.7.5c.4.2.2.4.5.5l.6-.5c.3-.2 1-.5.4-.8-.3-.1-.3-.2-.3-.5 0-.1 0-.3.2-.4.2-.2.7 0 1 0 .1 0 .1.8-.2.8-.6.1-.1.3 0 .5l.6.5.3.2c.2.1.4-.8.6-1.1 0-1.7.3-2.5.2-4.2-.2-2.2 0-4.3.2-4.3.3-.3 2-1.3.8-2.6-.6-.7-2-.3-2.2 1l-.6.2h-2.7l-1.7.1h-4.2l-.7-.1v-.3C27.5.2 26.3-.2 25.6.5c-1.1 1.2.6 2.3 1 2.6.1 0 .3 2 .1 4.2v.7a2 2 0 0 0-.6-.7V7c-.4-.3-.7 0-1.1.2-.3-.1-.5-.3-.7-.2-.5.3-.7.9-1.4 2.2-.2.3-.3.3-.3.5 0 .3.2.2.4.6-.1.3 0 .4-.2.4-.2.1-.6-.3-.8-.2-.6.4-.4.8-1.5 2.4-.2.1-.3.4-.2.6 0 .3.4.3.6.6M39.4.8h.2c.4.6 0 1.3-.6 1.2-1.1-.3-.2-1.7.4-1.2m-1.3 8.8l-2-.1.1-1.7c.1-.2 1.7-.1 1.8 0 0 0 .3 1.8 0 1.8m-1.7-7a5.8 5.8 0 0 1 1.7-.1v.3c-.1.6.2 1.2-.2 1.5h-1.3-.1v-.1c.1-.9-.2-1.5 0-1.6m-.2 2.7c.2-.3.9 0 1.6-.2a.1.1 0 0 1 .2.2c-.1.9.3 1.7 0 1.7-.7.2-1.8.2-1.8 0V5.3m-2.7-2.6v-.1h.1c.8 0 1.5-.2 1.7 0v1.8c0 .2-1.1.2-1.7 0-.4 0 0-.8 0-1.7m0 2.8c-.1 0 0 0 0-.2h1.6c.1 0 0 .2 0 .4v.7.6h-1.7c-.2 0 0-.8 0-1.6m-.1 2.4c0-.2 1.2-.1 1.9-.1.2 0 0 1.8-.1 1.8h-1.8V7.7m-2.8-2.4v-.2h1.6c.3.2 0 .9.1 1.5V7L30.5 7V5.4m1.9 2.8l-.1.7v.6h-1.7c-.2 0 0-.8 0-1.6h.1c0-.2 1.4-.2 1.6-.1.1 0 0 .1 0 .4m-1.8-5.5v-.2h.1c.8.1 1.4 0 1.6.2a6 6 0 0 1 0 1.6c0 .3-1 .3-1.7.1-.3 0 0-.9 0-1.7M28 2.5s1.5 0 1.6.2V4s.1.3 0 .4H28c-.3-.3 0-1-.2-1.6v-.2m0 2.8a.2.2 0 0 1 .1-.2h.1c.8.1 1.4-.1 1.6.1V7c0 .2-1.1.2-1.7.1-.3 0 0-.9 0-1.7m-.1 2.4l1.8.1v1.6c0 .2-1.2.1-1.9.2-.2 0 0-1.8.1-1.9m-1-5.8c-.6.2-1-.5-.6-1.1h.2V.7h.2c.4-.3 1.4 1 .2 1.2m-2.6 6c.1-.2.5 0 .8 0 0 .2-.3.3-.2.5l.3.2c.3-.4.4-.4.7 0 .2.2-.2.2-1.1 1.5-.2.1-.4-.1-.4-.7 0-.3-.4.2-.7 0-.3-.6.3-1.1.6-1.5m-2.4 4c.2-.3.4-.6.7-.6.2 0 0 .6.2.9.3 0 .4-.6.8-.3.3.2 0 .2-.2.9-.2.3-.4.8-.9.6-.2-.1-.4-.2-.2-.7 0-.4-.4.5-.7.4-.2-.2.1-.8.3-1.1"/></g></g></svg> \ No newline at end of file
diff --git a/web/cobrands/westminster/images/footer-twitter.png b/web/cobrands/westminster/images/footer-twitter.png
new file mode 100644
index 000000000..e70085637
--- /dev/null
+++ b/web/cobrands/westminster/images/footer-twitter.png
Binary files differ
diff --git a/web/cobrands/westminster/images/footer-twitter.svg b/web/cobrands/westminster/images/footer-twitter.svg
new file mode 100644
index 000000000..092ec907e
--- /dev/null
+++ b/web/cobrands/westminster/images/footer-twitter.svg
@@ -0,0 +1 @@
+<svg width="24" height="24" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M22.6 5.5a9 9 0 0 1-2.2 2.2v.6a12.3 12.3 0 0 1-2 6.8c-.8 1-1.6 2-2.5 2.8a12.6 12.6 0 0 1-14.4.7h1c2 0 3.8-.5 5.4-1.8-1 0-1.8-.3-2.6-.8a4.2 4.2 0 0 1-1.5-2.2l.8.1 1.2-.1c-1-.3-1.9-.7-2.5-1.5-.7-.8-1-1.7-1-2.8.6.3 1.3.5 2 .5a4.3 4.3 0 0 1-1.4-5.8 12.3 12.3 0 0 0 9 4.5l-.2-1c0-1.1.5-2.2 1.3-3 .8-.8 1.9-1.3 3-1.3 1.3 0 2.4.5 3.2 1.4 1-.2 2-.5 2.8-1-.4 1-1 1.8-2 2.3.9 0 1.7-.3 2.6-.6z" fill="#091F67" fill-rule="nonzero"/></svg> \ No newline at end of file
diff --git a/web/cobrands/westminster/images/search-icon.png b/web/cobrands/westminster/images/search-icon.png
new file mode 100644
index 000000000..8a2937508
--- /dev/null
+++ b/web/cobrands/westminster/images/search-icon.png
Binary files differ
diff --git a/web/cobrands/westminster/images/wcc_logo.png b/web/cobrands/westminster/images/wcc_logo.png
new file mode 100644
index 000000000..9144bf5b1
--- /dev/null
+++ b/web/cobrands/westminster/images/wcc_logo.png
Binary files differ
diff --git a/web/cobrands/westminster/layout.scss b/web/cobrands/westminster/layout.scss
new file mode 100644
index 000000000..7864f37ac
--- /dev/null
+++ b/web/cobrands/westminster/layout.scss
@@ -0,0 +1,148 @@
+@import "colours";
+@import "../sass/layout";
+
+#site-logo {
+ margin: 0; // reset the centering we introduced in the mobile view
+}
+
+#site-header {
+ padding-top: 1.25em;
+ padding-bottom: 1.25em;
+}
+
+#front-main {
+ background-color: $westminster_grey;
+ padding: 50px 0;
+
+ label {
+ font-size: 18px;
+ }
+
+ h1 {
+ font-size: 40px;
+ }
+
+ #postcodeForm {
+ overflow: visible;
+ margin: 0;
+
+ div {
+ margin: 0;
+ overflow: visible;
+
+ input#pc {
+ float: none;
+ height: auto;
+ width: 100%;
+ padding: 10px 22px;
+ }
+
+ input#sub {
+ float: none;
+ height: auto;
+ width: 0;
+ padding-top: 0;
+ }
+ }
+ }
+
+ #front-main-container {
+ padding: 0 1em;
+ }
+}
+
+#front-main a#geolocate_link {
+ color: $westminster-blue;
+}
+
+body.mappage {
+ #site-header {
+ box-sizing: border-box; // count padding as part of height, so border-bottom is visible
+ padding-top: 18px; // 1.25em minus 3px, to visually compensate for 3px border-bottom
+ }
+
+ .nav-wrapper {
+ top: -3px; // to visually compensate for 3px border-bottom on #site-header
+ }
+
+ .westminster-footer {
+ display: none;
+ }
+}
+
+.nav-menu--main {
+ li {
+ color: $westminster_navy;
+ }
+
+ a, span, a:visited {
+ padding: 0.25em 0.5em;
+ margin: 0.5em 0.25em;
+ color: inherit;
+ font-weight: bold;
+ }
+
+ a {
+ &:hover,
+ &:focus {
+ background: transparent;
+ color: inherit;
+ }
+ }
+
+ // Make it look unclickable (because it is).
+ span.report-a-problem-btn:hover {
+ color: inherit;
+ cursor: default;
+ }
+
+ // Make it not look like a button any more.
+ a.report-a-problem-btn,
+ a.report-a-problem-btn:hover {
+ color: inherit;
+ background: transparent;
+ padding: 0.25em 0.5em;
+ margin: 0.5em 0.25em;
+ }
+}
+
+.big-green-banner {
+ color: $westminster-black;
+ background: $col_click_map inline-image("../westminster/images/chevron-black-right.svg") $right center no-repeat;
+
+ .ie8 & {
+ background-image: url(/cobrands/westminster/images/chevron-black-right.png);
+ }
+}
+
+.problem-header h1 {
+ font-weight: bold;
+}
+
+.westminster-footer {
+ text-align: inherit;
+}
+
+.westminster-footer-logo {
+ a {
+ $image-width: 200px;
+ $image-height: 49px;
+ float: right;
+ margin-top: 70px;
+ width: $image-width;
+ padding-top: $image-height;
+ background-size: $image-width $image-height;
+ }
+}
+
+.westminster-site-links {
+ margin-top: 0;
+
+ li {
+ margin-bottom: 0.5em;
+ }
+}
+
+.westminster-tertiary-links {
+ text-align: center;
+}
diff --git a/web/js/geolocation.js b/web/js/geolocation.js
index fbef4d7ea..63599d4c1 100644
--- a/web/js/geolocation.js
+++ b/web/js/geolocation.js
@@ -34,7 +34,7 @@ fixmystreet.geolocate = function(element, success_callback) {
fixmystreet.geolocate(link, function(pos) {
var latitude = pos.coords.latitude.toFixed(6);
var longitude = pos.coords.longitude.toFixed(6);
- var coords = 'latitude=' + latitude + ';longitude=' + longitude;
+ var coords = 'lat=' + latitude + '&lon=' + longitude;
location.href = link.href + (link.href.indexOf('?') > -1 ? ';' : '?') + coords;
});
} else {