{"version":3,"file":"329.4a9f339ff1c5253d1e6a.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/location.ts","webpack://customer-portal-web-app/./src/common/locationSearch/locationSearcher.ts","webpack://customer-portal-web-app/./src/common/locationSearch/osNamesSearchProvider.ts","webpack://customer-portal-web-app/./src/common/locationSearch/point.ts","webpack://customer-portal-web-app/./src/common/proj4Init.ts","webpack://customer-portal-web-app/./src/pages/brandedPage.ts","webpack://customer-portal-web-app/./src/templates/alert.html","webpack://customer-portal-web-app/./src/templates/locationSearch.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 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 * 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","//\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}","// 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 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;","import 'jquery';\r\nimport 'bootstrap';\r\nimport 'bootstrap-datepicker';\r\nimport * as ko from 'knockout';\r\n\r\nimport { MobileNavItem } from '../links';\r\nimport storage from '../common/storage';\r\nimport BasePage from './basePage';\r\nimport globals from '../common/globals';\r\n\r\ntype CookieMode = \"enable\" | \"disable\";\r\n\r\nexport default abstract class BrandedPage extends BasePage {\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 mobileMenuItems: ko.Computed> = ko.computed>(() => this.links.getMobileNavItems(!!this.currentUser(), this.signOut.bind(this)));\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 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 [];\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","Location","name1","name2","townCity","county","point","boundingBox","hasFocus","ko","observable","title","computed","LocationSearcher","loading","searchText","extend","rateLimit","timeout","method","locationSearchResults","observableArray","selectedLocation","settings","canStartGeolocate","navigator","searchTextHasFocus","suggestionsHasFocus","_osGrid500","_osGrid100","partOfWidgetHasFocus","_computePartOfWidgetHasFocus","showSearchResults","_computeShowSearchResults","_searchTextChangedSubscription","subscribe","_searchTextChanged","location","dispose","data","event","allowDefault","key","console","log","_moveSearchResultFocus","forEach","v","i","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","coords","longitude","latitude","bounds","accuracy","cos","revGeoCodeFail","osgb36Coords","OsNamesSearchProvider","_searchLimit","_key","_gridRefPattern","query","queryEncoded","encodeURIComponent","$","ajax","url","_responseToLocationArray","jqXHR","textStatus","errorThrown","pointEncoded","toString","response","header","totalresults","results","value","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","proj4","defs","BrandedPage","mobileMenuItems","links","getMobileNavItems","currentUser","signOut","bind","orderInProgress","getInProgressOrderToken","getStartOrderSiteGeometry","startOrContinueOrderButtonText","analyticsCookiesMode","canSaveCookiePreferences","showCookiePane","getCookiePreferencesSaved","showMobileNavMenu","pageIsLoading","customerSupportTelephone","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":""}