{"version":3,"file":"116.4d00a5bda6394072b3a8.js","mappings":"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","sources":["webpack://customer-portal-web-app/./src/common/locationSearch/boundingBox.ts","webpack://customer-portal-web-app/./src/common/locationSearch/locationSearcher.ts","webpack://customer-portal-web-app/./src/common/proj4Init.ts","webpack://customer-portal-web-app/./src/common/locationSearch/osNamesSearchProvider.ts","webpack://customer-portal-web-app/./src/templates/bannerAlert.html","webpack://customer-portal-web-app/./src/common/locationSearch/point.ts","webpack://customer-portal-web-app/./src/common/locationSearch/location.ts","webpack://customer-portal-web-app/./src/pages/brandedPage.ts","webpack://customer-portal-web-app/./src/templates/locationSearch.html","webpack://customer-portal-web-app/./src/templates/alert.html"],"sourcesContent":["export default class BoundingBox {\r\n constructor(public readonly lonMin: number,\r\n public readonly latMin: number,\r\n public readonly lonMax: number,\r\n public readonly latMax: number) { }\r\n\r\n public toString(): string {\r\n let asString: string = \"POLYGON((\" + \r\n this.lonMin + \" \" + this.latMin + \",\" +\r\n this.lonMax + \" \" + this.latMin + \",\" +\r\n this.lonMax + \" \" + this.latMax + \",\" + \r\n this.lonMin + \" \" + this.latMax + \",\" + \r\n this.lonMin + \" \" + this.latMin + \"))\";\r\n \r\n return asString;\r\n }\r\n}","import * as ko from \"knockout\";\r\nimport proj4 from '../proj4Init';\r\n\r\nimport OsNamesSearchProvider from \"./osNamesSearchProvider\";\r\nimport Location from \"./location\";\r\nimport Point from \"./point\";\r\nimport BoundingBox from \"./boundingBox\";\r\nimport OsApiConfigurationResponse from \"../webHostClient/configuration/osApiConfigurationResponse\";\r\n\r\nexport default class LocationSearcher {\r\n // Are we loading?\r\n public readonly loading: ko.Observable = ko.observable(true);\r\n\r\n // Search text (Debounced)\r\n public readonly searchText: ko.Observable = ko.observable('')\r\n .extend({ rateLimit: { timeout: 500, method: \"notifyWhenChangesStop\" } });\r\n\r\n private _searchTextChangedSubscription: ko.Subscription;\r\n\r\n // Search Results\r\n public readonly locationSearchResults: ko.ObservableArray = ko.observableArray([]);\r\n\r\n // Should we show the search results drop down?\r\n public readonly showSearchResults: ko.Computed;\r\n\r\n // Selected result\r\n public readonly selectedLocation: ko.Observable = ko.observable(null);\r\n\r\n public readonly settings: ko.Observable = ko.observable(null);\r\n\r\n // Can we start browser based geolocation?\r\n public readonly canStartGeolocate: ko.Computed = ko.computed(() => (\"geolocation\" in navigator));\r\n\r\n // Track which part of the control has focus\r\n public readonly searchTextHasFocus: ko.Observable = ko.observable(false);\r\n public readonly suggestionsHasFocus: ko.Observable = ko.observable(false);\r\n public readonly partOfWidgetHasFocus: ko.Computed;\r\n\r\n // 500km squares from the south west corner starting at the origin (S, T, N, O and H\r\n private readonly _osGrid500 = [\r\n \"S\", \"T\",\r\n \"N\", \"O\",\r\n \"H\"\r\n ];\r\n\r\n // 100km squares from the south west corner\r\n private readonly _osGrid100 = [\r\n \"V\", \"W\", \"X\", \"Y\", \"Z\",\r\n \"Q\", \"R\", \"S\", \"T\", \"U\",\r\n \"L\", \"M\", \"N\", \"O\", \"P\",\r\n \"F\", \"G\", \"H\", \"J\", \"K\",\r\n \"A\", \"B\", \"C\", \"D\", \"E\"\r\n ]\r\n\r\n constructor() {\r\n // Wrap up the check that part of the widget has focus in an observable so we can debounce to avoid the\r\n // 'not item selected' state between one element losing focus and another gaining focus.\r\n this.partOfWidgetHasFocus = ko.computed(this._computePartOfWidgetHasFocus, this).extend({\r\n rateLimit: { timeout: 10, method: \"notifyWhenChangesStop\" }\r\n });\r\n this.showSearchResults = ko.computed(this._computeShowSearchResults, this);\r\n this._searchTextChangedSubscription = this.searchText.subscribe(this._searchTextChanged, this);\r\n }\r\n\r\n public selectLocation(location: Location): void {\r\n this.selectedLocation(location);\r\n\r\n this._searchTextChangedSubscription.dispose();\r\n this.searchText(location.title());\r\n this._searchTextChangedSubscription = this.searchText.subscribe(this._searchTextChanged, this);\r\n }\r\n\r\n public handleKeyUp(data: any, event: KeyboardEvent): boolean {\r\n let allowDefault = true;\r\n if (\"Down\" === event.key) {\r\n console.log(\"DOWN\");\r\n this._moveSearchResultFocus(+1);\r\n allowDefault = false;\r\n }\r\n else if (\"Up\" === event.key) {\r\n console.log(\"UP\");\r\n this._moveSearchResultFocus(-1);\r\n allowDefault = false;\r\n }\r\n else if (\"Enter\" === event.key) {\r\n console.log(\"ENTER\");\r\n this.locationSearchResults().forEach((v, i) => {\r\n if (v.hasFocus()) {\r\n this.selectLocation(v);\r\n }\r\n });\r\n allowDefault = false;\r\n }\r\n return allowDefault;\r\n }\r\n\r\n public handleKeyPress(data: any, event: KeyboardEvent): boolean {\r\n let allowDefault = true;\r\n if (\"Down\" === event.key || \"Up\" === event.key || \"Enter\" === event.key) {\r\n allowDefault = false;\r\n }\r\n return allowDefault;\r\n }\r\n\r\n public handleKeyDown(data: any, event: KeyboardEvent): boolean {\r\n let allowDefault = true;\r\n if (\"Down\" === event.key || \"Up\" === event.key || \"Enter\" === event.key) {\r\n allowDefault = false;\r\n }\r\n return allowDefault;\r\n }\r\n\r\n public startGeolocate(success: (location: Location) => void, error: () => void) {\r\n if (\"geolocation\" in navigator) {\r\n navigator.geolocation.getCurrentPosition(\r\n (position: GeolocationPosition) => this._onGeolocateSuccess(position, success, error), error\r\n );\r\n }\r\n }\r\n\r\n private _computePartOfWidgetHasFocus(): boolean {\r\n let partOfWidgetHasFocus: boolean = (\r\n this.searchTextHasFocus() ||\r\n this.suggestionsHasFocus() ||\r\n this.locationSearchResults().some(l => l.hasFocus())\r\n );\r\n return partOfWidgetHasFocus;\r\n }\r\n\r\n private _computeShowSearchResults(): boolean {\r\n let showSearchResults = this.partOfWidgetHasFocus()\r\n && null === this.selectedLocation()\r\n && !!this.searchText();\r\n return showSearchResults;\r\n }\r\n\r\n private _moveSearchResultFocus(n: number) {\r\n let index: number = -1;\r\n\r\n if (this.locationSearchResults().length > 0) {\r\n this.locationSearchResults().forEach((v, i) => { if (v.hasFocus()) { index = i } });\r\n\r\n if (-1 != index) {\r\n // Got the index from the focussed item so we can move the selected item.\r\n index += n;\r\n }\r\n else {\r\n // No item has focus so lets focus the selected item - no need to move the selected item\r\n this.locationSearchResults().forEach((v, i) => { if (v == this.selectedLocation()) { index = i } });\r\n if (-1 != index) {\r\n // No item is selected so give focus to the first item\r\n index = 0;\r\n }\r\n }\r\n console.log(\"focus \" + index);\r\n\r\n index = Math.max(0, index);\r\n index = Math.min(this.locationSearchResults().length - 1, index);\r\n console.log(\"focus (after bounds check) \" + index);\r\n\r\n this.locationSearchResults()[index].hasFocus(true);\r\n console.log(\"focus2 \" + index);\r\n }\r\n }\r\n\r\n private _searchTextChanged(newValue: string): void {\r\n let eastings: number;\r\n let northings: number;\r\n let digits: string;\r\n let gridLocation: Location;\r\n let boundingBoxOriginEastings: number;\r\n let boundingBoxOriginNorthings: number;\r\n let boundingBoxSize: number = 0.5;\r\n let locationName: string;\r\n\r\n this.selectedLocation(null);\r\n\r\n if (!!newValue) {\r\n this.loading(true);\r\n this.locationSearchResults.removeAll();\r\n\r\n if (this.settings()) {\r\n let searchProviver = new OsNamesSearchProvider(this.settings().namesMaxResults, this.settings().appKey);\r\n let handleSuccess = (locations: Array) => this._handleSearchSuccess(locations);\r\n\r\n // All numeric grid reference\r\n let matchAllNumeric: RegExpMatchArray = newValue.match(/^(?:Grid\\sReference:\\s?)?(\\d{6})\\s*,\\s*(\\d{6})$/);\r\n let matchLetterNumeric: RegExpMatchArray = newValue.match(/^(?:Grid\\sReference:\\s?)?(S|T|N|O|H)([A-HJ-Z])(\\d{2}|\\d{4}|\\d{6}|\\d{8}|\\d{10})$/);\r\n if (matchAllNumeric || matchLetterNumeric) {\r\n if (matchAllNumeric) {\r\n eastings = parseInt(matchAllNumeric[1]);\r\n northings = parseInt(matchAllNumeric[2]);\r\n boundingBoxSize = 1;\r\n locationName = \"Grid Reference: \" + matchAllNumeric[1] + \", \" + matchAllNumeric[2];\r\n }\r\n else {\r\n digits = matchLetterNumeric[3];\r\n\r\n // Parse first letter - 500km squares S, T, N, O and H\r\n // Division and modulo by 2 because we are only interested in the grid east and north\r\n // of the grid origin with landmass so we only need the 2x3 grid\r\n eastings = (this._osGrid500.indexOf(matchLetterNumeric[1]) % 2) * 500000;\r\n northings = Math.floor(this._osGrid500.indexOf(matchLetterNumeric[1]) / 2) * 500000;\r\n\r\n // Parse the second letter - 100km squares A-Z (NOTE: I is not used)\r\n // Division and modulo by 5 because we need the entire 5x5 grid.\r\n eastings += (this._osGrid100.indexOf(matchLetterNumeric[2]) % 5) * 100000;\r\n northings += Math.floor(this._osGrid100.indexOf(matchLetterNumeric[2]) / 5) * 100000;\r\n\r\n // Parse the numeric component - shift the decimal place depending on the number of digits we have been given\r\n if (2 === digits.length) {\r\n eastings += parseInt(digits.substring(0, 1)) * 10000;\r\n northings += parseInt(digits.substring(1)) * 10000;\r\n boundingBoxSize = 10000\r\n }\r\n else if (4 == digits.length) {\r\n eastings += parseInt(digits.substring(0, 2)) * 1000;\r\n northings += parseInt(digits.substring(2)) * 1000;\r\n boundingBoxSize = 1000\r\n }\r\n else if (6 == digits.length) {\r\n eastings += parseInt(digits.substring(0, 3)) * 100;\r\n northings += parseInt(digits.substring(3)) * 100;\r\n boundingBoxSize = 100\r\n }\r\n else if (8 == digits.length) {\r\n eastings += parseInt(digits.substring(0, 4)) * 10;\r\n northings += parseInt(digits.substring(4)) * 10;\r\n boundingBoxSize = 10\r\n }\r\n else if (10 == digits.length) {\r\n boundingBoxSize = 1\r\n eastings += parseInt(digits.substring(0, 5));\r\n northings += parseInt(digits.substring(5));\r\n }\r\n\r\n locationName = \"Grid Reference: \" + matchLetterNumeric[1] + matchLetterNumeric[2] + matchLetterNumeric[3];\r\n }\r\n\r\n // The coordinates we have are for the south west corner of the bounding box.\r\n boundingBoxOriginEastings = eastings;\r\n boundingBoxOriginNorthings = northings;\r\n eastings = eastings + (boundingBoxSize / 2);\r\n northings = northings + (boundingBoxSize / 2);\r\n\r\n const latLongCoords: Array = proj4('EPSG:27700', 'WGS84', [eastings, northings]);\r\n const latLongMinCoords: Array = proj4('EPSG:27700', 'WGS84', [eastings - boundingBoxSize, northings - boundingBoxSize]);\r\n const latLongMaxCoords: Array = proj4('EPSG:27700', 'WGS84', [eastings + boundingBoxSize, northings + boundingBoxSize]);\r\n\r\n gridLocation = new Location(locationName, \"\", \"\", \"\",\r\n new Point(latLongCoords[0], latLongCoords[1]),\r\n new BoundingBox(\r\n latLongMinCoords[0],\r\n latLongMinCoords[1],\r\n latLongMaxCoords[0],\r\n latLongMaxCoords[1]));\r\n gridLocation.select = (d) => this.selectLocation(d);\r\n this.locationSearchResults.push(gridLocation);\r\n searchProviver.searchOsgb36GridRef(northings, eastings, handleSuccess, () => { });\r\n }\r\n else {\r\n searchProviver.searchText(newValue, handleSuccess);\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _handleSearchSuccess(locations: Array): void {\r\n locations.forEach((l) => {\r\n l.select = (d) => this.selectLocation(d);\r\n this.locationSearchResults.push(l);\r\n });\r\n this.loading(false);\r\n }\r\n\r\n private _onGeolocateSuccess(position: GeolocationPosition, success: (location: Location) => void, error: () => void) {\r\n \r\n const point: Point = new Point(position.coords.longitude, position.coords.latitude);\r\n\r\n const bounds = new BoundingBox(\r\n position.coords.longitude - (position.coords.accuracy / (111111 * Math.cos(position.coords.latitude))),\r\n position.coords.latitude - (position.coords.accuracy / 111111),\r\n position.coords.longitude + (position.coords.accuracy / (111111 * Math.cos(position.coords.latitude))),\r\n position.coords.latitude + (position.coords.accuracy / 111111));\r\n \r\n const revGeoCodeFail = () => {\r\n success(new Location(\"\", \"\", \"\", \"\", point, bounds));\r\n };\r\n\r\n const revGeoCodeSuccess = (locations: Array) => {\r\n if (locations.length > 0) {\r\n success(locations[0]);\r\n }\r\n else {\r\n revGeoCodeFail();\r\n }\r\n };\r\n\r\n // Don't even try the reverse geocode if we didn't get better than 100m accuracy\r\n if (position.coords.accuracy < 100) {\r\n\r\n // Convert lat/long to OSGB36 (British National Grid)\r\n const osgb36Coords: Array = proj4('WGS84', 'EPSG:27700', [position.coords.longitude, position.coords.latitude]);\r\n\r\n let provider: OsNamesSearchProvider = new OsNamesSearchProvider(this.settings().namesMaxResults, this.settings().appKey);\r\n provider.searchOsgb36GridRef(osgb36Coords[1], osgb36Coords[0], revGeoCodeSuccess, revGeoCodeFail);\r\n }\r\n else {\r\n revGeoCodeFail();\r\n }\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import * as proj4 from 'proj4'\r\n\r\n// Add OSGB36 projection to proj4.\r\nproj4.defs(\r\n 'EPSG:27700', \r\n '+proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000 +y_0=-100000 +ellps=airy +towgs84=446.448,-125.157,542.06,0.15,0.247,0.842,-20.489 +units=m +no_defs');\r\n\r\n// Expose proj4 as the default export.\r\nexport default proj4;","//\r\n\r\nimport BoundingBox from \"./boundingBox\";\r\nimport Point from \"./point\";\r\nimport Location from \"./location\";\r\nimport proj4 from '../proj4Init';\r\n\r\n// OS Names implementation\r\nexport default class OsNamesSearchProvider {\r\n private readonly _gridRefPattern: RegExp = /\\s*(\\d{6})\\s*,\\s*(\\d{6})\\s*/;\r\n\r\n //\r\n // Constructor\r\n public constructor(private _searchLimit: number, private _key: string) {\r\n }\r\n\r\n //\r\n // Search for locations that match passed string\r\n public searchText(query: string, success: (locations: Array) => void): void {\r\n let queryEncoded: string = encodeURIComponent(query);\r\n $.ajax({\r\n url: 'https://api.os.uk/search/names/v1/find?query=' + queryEncoded + '&key=' + this._key + '&maxresults=' + this._searchLimit,\r\n success: (data) => success(this._responseToLocationArray(data)),\r\n error: (jqXHR: JQueryXHR, textStatus: string, errorThrown: string) => console.log(textStatus + \" \" + errorThrown)\r\n });\r\n }\r\n\r\n //\r\n // Search for locations that match the passed grid reference\r\n public searchOsgb36GridRef(northings: number, eastings: number, success: (locations: Array) => void, error: () => void): void {\r\n let pointEncoded: string = encodeURIComponent(eastings.toString() + ',' + northings.toString());\r\n $.ajax({\r\n url: 'https://api.os.uk/search/names/v1/nearest?point=' + pointEncoded + '&key=' + this._key + '&radius=1000',\r\n success: (data) => success(this._responseToLocationArray(data)),\r\n error: error\r\n });\r\n }\r\n\r\n //\r\n // Convert a response from the API to a LocationSearchResult (Suggestion)\r\n private _responseToLocationArray(response: IOsNamesFindResponse): Array {\r\n let locations: Array = [];\r\n\r\n if (response.header.totalresults > 0) {\r\n response.results.forEach((value) => {\r\n let name1: string;\r\n let name2: string;\r\n let townCity: string;\r\n let county: string;\r\n let point: Point;\r\n let boundingBox: BoundingBox = null;\r\n\r\n // Only use a subset of fields to represent the location to the user.\r\n // Don't duplicate any parts and don't include blanks\r\n if (value.GAZETTEER_ENTRY.COUNTY_UNITARY) {\r\n county = value.GAZETTEER_ENTRY.COUNTY_UNITARY;\r\n }\r\n else {\r\n county = null;\r\n }\r\n\r\n if (value.GAZETTEER_ENTRY.POPULATED_PLACE && county != value.GAZETTEER_ENTRY.POPULATED_PLACE) {\r\n townCity = value.GAZETTEER_ENTRY.POPULATED_PLACE;\r\n }\r\n else {\r\n townCity = null;\r\n }\r\n\r\n if (value.GAZETTEER_ENTRY.NAME2 && -1 === [county, townCity].indexOf(value.GAZETTEER_ENTRY.NAME2)) {\r\n name2 = value.GAZETTEER_ENTRY.NAME2;\r\n }\r\n else {\r\n name2 = null;\r\n }\r\n\r\n if (value.GAZETTEER_ENTRY.NAME1 && -1 === [county, townCity, name2].indexOf(value.GAZETTEER_ENTRY.NAME1)) {\r\n name1 = value.GAZETTEER_ENTRY.NAME1;\r\n }\r\n else {\r\n name1 = null;\r\n }\r\n\r\n // If we got a bounding box, include it in the result\r\n if (value.GAZETTEER_ENTRY.MBR_XMIN\r\n && value.GAZETTEER_ENTRY.MBR_YMIN\r\n && value.GAZETTEER_ENTRY.MBR_XMAX\r\n && value.GAZETTEER_ENTRY.MBR_YMAX) {\r\n\r\n const latLongMin: Array = proj4('EPSG:27700', 'WGS84', [value.GAZETTEER_ENTRY.MBR_XMIN, value.GAZETTEER_ENTRY.MBR_YMIN]);\r\n const latLongMax: Array = proj4('EPSG:27700', 'WGS84', [value.GAZETTEER_ENTRY.MBR_XMAX, value.GAZETTEER_ENTRY.MBR_YMAX]);\r\n\r\n boundingBox = new BoundingBox(latLongMin[0], latLongMin[1], latLongMax[0], latLongMax[1]);\r\n }\r\n else {\r\n // When we give the OS api a really specific search string (like a postcode) then it starts\r\n // to return just a point and not a bounding box. To keep our output consistent lets\r\n // create a small bounding box using the point as the centre.\r\n\r\n const latLongMin: Array = proj4('EPSG:27700', 'WGS84', [value.GAZETTEER_ENTRY.GEOMETRY_X - 0.5, value.GAZETTEER_ENTRY.GEOMETRY_Y - 0.5]);\r\n const latLongMax: Array = proj4('EPSG:27700', 'WGS84', [value.GAZETTEER_ENTRY.GEOMETRY_X + 0.5, value.GAZETTEER_ENTRY.GEOMETRY_Y + 0.5]);\r\n boundingBox = new BoundingBox(latLongMin[0], latLongMin[1], latLongMax[0], latLongMax[1]);\r\n }\r\n\r\n const latLong: Array = proj4('EPSG:27700', 'WGS84', [value.GAZETTEER_ENTRY.GEOMETRY_X, value.GAZETTEER_ENTRY.GEOMETRY_Y]);\r\n point = new Point(latLong[0], latLong[1]);\r\n\r\n locations.push(new Location(name1, name2, townCity, county, point, boundingBox));\r\n });\r\n }\r\n return locations;\r\n }\r\n}","// Module\nvar code = \" \";\n// Exports\nexport default code;","// Represents a point (using lat long coordinates)\r\nexport default class Point {\r\n constructor(\r\n public readonly lon: number,\r\n public readonly lat: number) {\r\n }\r\n\r\n public toString(): string {\r\n const asString = \"POINT(\" + this.lon.toString() + \" \" + this.lat.toString() + \")\";\r\n return asString;\r\n }\r\n}","import * as ko from \"knockout\";\r\nimport BoundingBox from \"./boundingBox\";\r\nimport Point from \"./point\";\r\n\r\nexport default class Location {\r\n public title: ko.Computed;\r\n public select: (data: Location) => void;\r\n public hasFocus: ko.Observable = ko.observable(false);\r\n\r\n constructor(\r\n public readonly name1: string,\r\n public readonly name2: string,\r\n public readonly townCity: string,\r\n public readonly county: string,\r\n public readonly point: Point,\r\n public readonly boundingBox: BoundingBox) {\r\n this.title = ko.computed(() => {\r\n let title: string = \"\";\r\n if (this.name1) {\r\n title += this.name1;\r\n }\r\n if (this.name2) {\r\n if (title) {\r\n title += \", \";\r\n }\r\n title += this.name2\r\n }\r\n if (this.townCity) {\r\n if (title) {\r\n title += \", \";\r\n }\r\n title += this.townCity\r\n }\r\n if (this.county) {\r\n if (title) {\r\n title += \", \";\r\n }\r\n title += this.county\r\n }\r\n return title;\r\n });\r\n }\r\n}","import 'jquery';\r\nimport 'bootstrap';\r\nimport 'bootstrap-datepicker';\r\nimport * as ko from 'knockout';\r\n\r\nimport storage from '../common/storage';\r\nimport BasePage from './basePage';\r\nimport globals from '../common/globals';\r\nimport Alert from '../common/webHostClient/alert';\r\nimport alertTemplate from \"../templates/bannerAlert.html\";\r\n\r\n\r\ntype CookieMode = \"enable\" | \"disable\";\r\n\r\nexport default abstract class BrandedPage extends BasePage {\r\n\r\n \r\n public static aboutUsNavPage = \".about-us-nav\";\r\n public static whatWeOfferNavPage = \".what-we-offer-nav\";\r\n public static pricingNavPage = \".pricing-nav\";\r\n public static caseStudiesNavPage = \".case-studies-nav\";\r\n\r\n readonly orderInProgress: ko.Observable = ko.observable(!!storage.getInProgressOrderToken() || !!storage.getStartOrderSiteGeometry());\r\n readonly startOrContinueOrderButtonText: ko.Computed = ko.computed(() => this.orderInProgress() ? \"Continue search\" : \"Start search\");\r\n\r\n readonly analyticsCookiesMode: ko.Observable = ko.observable(null);\r\n readonly canSaveCookiePreferences: ko.Computed = ko.computed(() => \"enable\" === this.analyticsCookiesMode() || \"disable\" === this.analyticsCookiesMode());\r\n readonly showCookiePane: ko.Observable = ko.observable(!storage.getCookiePreferencesSaved());\r\n readonly showMobileNavMenu: ko.Observable = ko.observable(false);\r\n\r\n readonly pageIsLoading: ko.Observable = ko.observable(true);\r\n\r\n public readonly customerSupportTelephone: ko.Observable = ko.observable(null);\r\n\r\n public readonly alerts: ko.ObservableArray = ko.observableArray([]);\r\n\r\n protected async loadContentAsync() : Promise {\r\n await super.loadContentAsync();\r\n\r\n const bodyElement = document.getElementsByTagName(\"body\")[0];\r\n\r\n // Template snippets\r\n this.getTemplateHtmlSnippets().forEach(t => bodyElement.insertAdjacentHTML('beforeend', t));\r\n\r\n const pageDiv = document.createElement(\"div\");\r\n bodyElement.appendChild(pageDiv);\r\n\r\n const allowAnalytics = storage.getAllowAnalyticsCookies();\r\n if (null != allowAnalytics)\r\n {\r\n this.analyticsCookiesMode(allowAnalytics ? \"enable\" : \"disable\");\r\n } \r\n \r\n window.onscroll = this.handleHeaderMinimise;\r\n }\r\n\r\n protected async onLoadCompleteAsync(): Promise {\r\n await super.onLoadCompleteAsync();\r\n \r\n this.customerSupportTelephone(globals.config.customerSupportTelephone);\r\n this.pageIsLoading(false);\r\n\r\n\r\n // Uncomment to check the Bootstrap elements are structured correctly at run time.\r\n //this.checkBootstrapElementStructure();\r\n }\r\n\r\n protected getTemplateHtmlSnippets(): string[] \r\n {\r\n return [ alertTemplate ];\r\n }\r\n\r\n public saveCookiePreferences() : void {\r\n\r\n if (!this.canSaveCookiePreferences())\r\n {\r\n return;\r\n }\r\n\r\n storage.setAllowAnalyticsCookies(\"enable\" === this.analyticsCookiesMode());\r\n storage.setCookiePreferencesSaved(true);\r\n\r\n this.showCookiePane(false);\r\n }\r\n\r\n public showCookieSettings(): void {\r\n this.showCookiePane(true);\r\n }\r\n\r\n public toggleMobileNavMenu(): void{\r\n // Avoid double scroll bars\r\n !this.showMobileNavMenu() ? $('body').addClass('overflow-y-hidden') : $('body').removeClass('overflow-y-hidden');\r\n\r\n this.showMobileNavMenu(!this.showMobileNavMenu());\r\n }\r\n\r\n public acceptAllAndSaveCookiePreferences() : void {\r\n \r\n this.analyticsCookiesMode(\"enable\");\r\n this.saveCookiePreferences();\r\n }\r\n\r\n public handleHeaderMinimise() {\r\n // Ignore minimise on small screens\r\n if (document.body.clientWidth >= 1200 && (document.body.scrollTop > 50 || document.documentElement.scrollTop > 50)) {\r\n document.getElementById(\"nav\").classList.add(\"minimise\");\r\n document.getElementById(\"sub-padding\").classList.add(\"minimise\");\r\n } else {\r\n document.getElementById(\"nav\").classList.remove(\"minimise\");\r\n document.getElementById(\"sub-padding\").classList.remove(\"minimise\");\r\n }\r\n }\r\n\r\n public setActiveNav(target) {\r\n $(target).addClass('active-page');\r\n }\r\n\r\n\r\n\r\n private checkBootstrapElementStructure(): void {\r\n \r\n $(\"div\").each((index: number, divElement: Element) => {\r\n\r\n if (this.isBootstrapColumnElement(divElement))\r\n {\r\n this.checkBootstrapColumnElement(divElement);\r\n }\r\n\r\n if (this.isBootstrapRowElement(divElement))\r\n {\r\n this.checkBootstrapRowElement(divElement);\r\n }\r\n\r\n // if (this.isBootstrapContainerElement(divElement))\r\n // {\r\n // this.checkBootstrapContainerElement(divElement);\r\n // }\r\n });\r\n }\r\n\r\n \r\n private isBootstrapContainerElement(element: Element): boolean {\r\n\r\n const classAttr = element.getAttribute(\"class\");\r\n if (!classAttr)\r\n {\r\n return false;\r\n }\r\n\r\n const classList: Array = classAttr.split(\" \");\r\n\r\n let isContainer = classList.some((v, i, a) => v === \"container\");\r\n\r\n return isContainer;\r\n }\r\n\r\n private isBootstrapRowElement(element: Element): boolean {\r\n\r\n const classAttr = element.getAttribute(\"class\");\r\n if (!classAttr)\r\n {\r\n return false;\r\n }\r\n\r\n const classList: Array = classAttr.split(\" \");\r\n\r\n let isRow = classList.some((v, i, a) => v === \"row\" || v === \"responsive-row\");\r\n\r\n return isRow;\r\n }\r\n\r\n\r\n private isBootstrapColumnElement(element: Element): boolean {\r\n\r\n const classAttr = element.getAttribute(\"class\");\r\n if (!classAttr)\r\n {\r\n return false;\r\n }\r\n\r\n const classList: Array = classAttr.split(\" \");\r\n\r\n let isCol = classList.some((v, i, a) => v.startsWith(\"col-\"));\r\n\r\n return isCol;\r\n }\r\n\r\n\r\n private checkBootstrapColumnElement(colElement: Element): boolean {\r\n\r\n console.log(\"Checking col element\", colElement);\r\n let valid: boolean = false;\r\n\r\n // Column element should have a row element as an ancestor, if it has a column or container ancestor that must be more distant than the closest row ancestor.\r\n\r\n let ancestor: Element = colElement.parentElement;\r\n\r\n while (ancestor)\r\n {\r\n\r\n if (this.isBootstrapContainerElement(ancestor))\r\n {\r\n console.error(\"Detected column element with no row ancestor (container)\", colElement);\r\n valid = false;\r\n break;\r\n }\r\n\r\n if (this.isBootstrapColumnElement(ancestor))\r\n {\r\n console.error(\"Detected column element with no row ancestor (column)\", colElement);\r\n valid = false;\r\n break;\r\n }\r\n\r\n if (this.isBootstrapRowElement(ancestor))\r\n {\r\n // found ancestor row\r\n valid = true;\r\n break;\r\n }\r\n\r\n ancestor = ancestor.parentElement;\r\n }\r\n\r\n if (!valid)\r\n {\r\n console.error(\"Detected column element with no row ancestor (none)\", colElement);\r\n return false;\r\n }\r\n\r\n console.log(\"Checked col element\", colElement);\r\n return valid;\r\n }\r\n\r\n private checkBootstrapRowElement(rowElement: Element): boolean {\r\n\r\n console.log(\"Checking row element\", rowElement);\r\n let valid: boolean = false;\r\n\r\n // Row element should have a container or column element as an ancestor.\r\n\r\n let ancestor: Element = rowElement.parentElement;\r\n\r\n while (ancestor)\r\n {\r\n if ( this.isBootstrapRowElement(ancestor))\r\n {\r\n console.error(\"Detected row element with no column or container ancestor (row)\", rowElement);\r\n valid = false;\r\n break;\r\n }\r\n\r\n if (this.isBootstrapContainerElement(ancestor) || this.isBootstrapColumnElement(ancestor))\r\n {\r\n // found ancestor container or column\r\n valid = true;\r\n break;\r\n }\r\n\r\n ancestor = ancestor.parentElement;\r\n }\r\n\r\n if (!valid)\r\n {\r\n console.error(\"Detected row element with no column or container ancestor (none)\", rowElement);\r\n return false;\r\n }\r\n\r\n console.log(\"Checked row element\", rowElement);\r\n return valid;\r\n }\r\n}","// Module\nvar code = \" \";\n// Exports\nexport default code;","// Module\nvar code = \" \";\n// Exports\nexport default code;"],"names":["BoundingBox","lonMin","latMin","lonMax","latMax","this","LocationSearcher","loading","ko","observable","searchText","extend","rateLimit","timeout","method","locationSearchResults","observableArray","selectedLocation","settings","canStartGeolocate","computed","navigator","searchTextHasFocus","suggestionsHasFocus","_osGrid500","_osGrid100","partOfWidgetHasFocus","_computePartOfWidgetHasFocus","showSearchResults","_computeShowSearchResults","_searchTextChangedSubscription","subscribe","_searchTextChanged","location","dispose","title","data","event","allowDefault","key","console","log","_moveSearchResultFocus","forEach","v","i","hasFocus","selectLocation","success","error","geolocation","getCurrentPosition","position","_onGeolocateSuccess","some","l","n","index","length","Math","max","min","newValue","eastings","northings","digits","gridLocation","locationName","boundingBoxSize","removeAll","searchProviver","namesMaxResults","appKey","handleSuccess","locations","_handleSearchSuccess","matchAllNumeric","match","matchLetterNumeric","parseInt","indexOf","floor","substring","latLongCoords","latLongMinCoords","latLongMaxCoords","select","d","push","searchOsgb36GridRef","point","coords","longitude","latitude","bounds","accuracy","cos","revGeoCodeFail","osgb36Coords","proj4","defs","OsNamesSearchProvider","_searchLimit","_key","_gridRefPattern","query","queryEncoded","encodeURIComponent","$","ajax","url","_responseToLocationArray","jqXHR","textStatus","errorThrown","pointEncoded","toString","response","header","totalresults","results","value","name1","name2","townCity","county","boundingBox","GAZETTEER_ENTRY","COUNTY_UNITARY","POPULATED_PLACE","NAME2","NAME1","MBR_XMIN","MBR_YMIN","MBR_XMAX","MBR_YMAX","latLongMin","latLongMax","GEOMETRY_X","GEOMETRY_Y","latLong","Point","lon","lat","Location","BrandedPage","orderInProgress","getInProgressOrderToken","getStartOrderSiteGeometry","startOrContinueOrderButtonText","analyticsCookiesMode","canSaveCookiePreferences","showCookiePane","getCookiePreferencesSaved","showMobileNavMenu","pageIsLoading","customerSupportTelephone","alerts","loadContentAsync","bodyElement","document","getElementsByTagName","getTemplateHtmlSnippets","t","insertAdjacentHTML","pageDiv","createElement","appendChild","allowAnalytics","getAllowAnalyticsCookies","window","onscroll","handleHeaderMinimise","onLoadCompleteAsync","config","setAllowAnalyticsCookies","setCookiePreferencesSaved","removeClass","addClass","saveCookiePreferences","body","clientWidth","scrollTop","documentElement","getElementById","classList","add","remove","target","each","divElement","isBootstrapColumnElement","checkBootstrapColumnElement","isBootstrapRowElement","checkBootstrapRowElement","element","classAttr","getAttribute","split","a","startsWith","colElement","valid","ancestor","parentElement","isBootstrapContainerElement","rowElement","aboutUsNavPage","whatWeOfferNavPage","pricingNavPage","caseStudiesNavPage"],"sourceRoot":""}