{"version":3,"sources":["to-title-case.js","application-logging.js","map-popup.js","map-permalink.js","map-base-layers.js","map-fts.js","map-usrn-search.js","main-map.js","map-layer-extents-loader.js","map-gazetteer.js","map-overlays.js","map-store.js","storage.js"],"names":["String","prototype","toTitleCase","smallWords","alphanumericPattern","this","split","map","current","index","array","search","length","toLowerCase","substr","replace","match","toUpperCase","join","applicationLogging","events","accessToken","init","loggingAccessToken","nsgEvents","addListener","nsg_events","mapPopupFeatureSelected","data","i","features","usrn","params","query","source","$","ajax","url","headers","accesstoken","mapWfsRequest","mapPopup","_map","_overlay","_markerLayer","_popupContainer","_popupContent","_popupCloser","_events","_hasPopup","sessionTimedOut","onSessionTimeout","removeLayer","removeOverlay","hidePopovers","popover","onSessionTimeoutActionStopped","dispatch","sessionTimeOutActionStopped","showFeaturesAtCoordinateUsrn","coordinate","count","feature","featureDataArray","pixel","getPixelFromCoordinate","getFeaturesAtPixel","hitTolerance","htmlAggregate","streetsEng","Map","streetsCym","getSource","clear","f","props","getProperties","item","key","lang","geom","getGeometry","has","set","forEach","street","cym","get","size","html","attributeName","hasOwnProperty","RegExp","streetEng","constructStreetText","streetCym","classification","maintainedBy","street_status_id","provider","maintaining_authority","use_classification_data","type3_street_classification","g","getClosestPoint","ol","extent","getCenter","getExtent","coordinates","css","setPosition","Feature","marker","setGeometry","Point","addFeature","window","setTimeout","_showingPopup","tooltip","placement","container","document","querySelectorAll","ele","bootstrap","Popover","content","trigger","getElementById","fallbackPlacement","push","eventBus","getTopic","showFeaturesAtCoordinate","sessionTimeOut","on","evt","isMarker","toggle","getView","e","let","zoom","target","getZoom","setVisible","visible","iconStyle","style","Style","image","Icon","anchor","anchorXUnits","anchorYUnits","src","imgSize","layer","Vector","addLayer","id","class","href","append","Overlay","element","autoPan","autoPanAnimation","duration","addOverlay","mapPermaLink","boundary","delay","show","hide","el","text","location","origin","pathname","placeHolderId","queryCommandSupported","ph","copyTextArea","createElement","value","appendChild","select","msg","execCommand","dispose","err","console","log","removeChild","prompt","mapBaseLayers","osOpenSpace","oSOpenSpaceURL","oSOpenSpaceKey","OS_source","WMTS","name","title","format","version","matrixSet","Service","Request","attributions","Date","getFullYear","logo","projection","tileGrid","tilegrid","resolutions","matrixIds","wrapX","Tile","type","mapFts","searchTerm","activeQueries","access_token","unbind","process","toggleFtsSearching","beforeSend","request","setRequestHeader","dataType","done","response","idx","indexOf","slice","headline","description","warn","sortItems","items","beginswithfirst3","beginswithfirst2","beginswithfirst1","other","getFirstXWords","queryNoPunc","shift","it","q3","q2","q1","concat","typeahead","displayText","theme","minLength","highlighter","sorter","matcher","autoSelect","changeInputOnMove","changeInputOnSelect","afterSelect","$element","val","blur","streetSearchSelected","mapUsrnSearch","btnSearchUsrn","usrnSearchInput","usrnSearchingLoader","invalidUsrn","noUsrnResults","usrnSearchUrl","btnSearchUsrnClick","searchUsrn","requestUrl","method","display","visibility","trim","test","Promise","resolve","reject","xhr","XMLHttpRequest","onreadystatechange","readyState","status","responseText","open","responseType","send","then","coord","json","JSON","parse","GeoJSON","readFeatures","getFirstCoordinate","startX","startY","usrnSearchSelected","mapServerUrl","addEventListener","event","preventDefault","keyCode","click","MainMap","elementId","loaderId","zoomInfoId","oopsAlertId","func","wait","immediate","timeout","self","mapExtent","zoomToUsrn","usrnSelectionSource","ftsQuery","toggleLayersDialogue","delayInMilliseconds","animate","width","opacity","onSessionTimeOutActionStopped","modal","onUsrnSearchSelected","view","setCenter","setZoom","onFtsStreetSelected","resizeMap","windowResize","fHeight","height","Math","min","offset","top","updateSize","onMapChange","res","z","c","getResolution","enableDebugLog","oopsAlert","hideIndicator","resize","context","args","arguments","callNow","clearTimeout","apply","selection","streetVectorLayer","setStyle","getStyle","keyboard","TOUCH","addClass","keyup","t","siblings","focus","bind","mapElement","dataset","mapToken","accessTokenExpiresIn","mapTokenExpiresIn","timedout","removeListener","a","Array","isArray","parseFloat","mapDebugLog","encodeURIComponent","initialZoom","Number","mapInitialZoom","maxFeatures","mapMaxFeatures","maxTotalFeatures","mapMaxTotalFeatures","nameSearchUrl","nameWithProviderSearchUrl","oS_extent","mapCenter","mapLayers","idProp","zoomToLargeExtentLevel","zoomToSmallExtentLevel","proj4","defs","proj","register","Projection","code","units","mapOverLays","mapStore","openSpaceKey","openSpaceUrl","oSOpenSpaceAllowedDomain","openSpaceAllowedDomain","openSpaceLayer","streetVectorSource","loader","resolution","mapLayerExtentsLoader","reloadLayer","Infinity","getFeatures","widthInMetres","getWidth","bufferedExtent","buffer","onError","removeLoadedExtent","onerror","onload","getFormat","addFeatures","ex","calculateExtent","getSize","containsCoordinate","storeExtent","minX","minY","maxX","maxY","centrePointX","centrePointY","strategy","loadingstrategy","bbox","selected","differentClassification","stroke","Stroke","color","lineDash","minResolution","maxResolution","mapSettings","settings","overlays","wards","attr","wardsLegendUrl","prop","checked","onLayerVisibiltyChanged","highway_authority","highwayAuthority","highwayAuthorityLegendUrl","setSource","attribution","control","Attribution","collapsible","layers","interactions","interaction","defaults","altShiftDragRotate","pinchRotate","controls","extend","View","center","maxZoom","minZoom","mousePositionControl","MousePosition","coordinateFormat","toFixed","className","undefinedHTML","addControl","ScaleLine","FullScreen","initMap","didLoadFromStorage","centre","showingPopup","mapGazetteer","call","popoverTriggerEl","_layerExtents","newExtent","featureCount","lyrEx","zoomLevel","currentExtent","maxFeatureCount","alwaysLoadOnZoom","hasChanged","previousExtent","containsExtent","_container","_displayProjection","_gazResults","_input","_noResults","_loadingIndicator","_pointLayer","_searchResults","_zoomToLevel","_initialised","initPointLayer","locationPinStyle","Text","font","textBaseline","fill","Fill","find","searchGazetteer","postalcode","toggleGazSearching","success","geonames","processSearchResult","postalCodes","empty","error","always","matches","zoomToLevel","m","locations","coord3857","transform","lng","lat","Easting","Northing","Name","postalCode","Name2","ZoomLevel","adminName2","adminCode1","selectedIndex","parseInt","resultIndex","resultName2","addLocationPin","addPinAndCenterMap","displayCoordinates","locationFeature","geometry","next","Boolean","prev","keypress","which","is","getImageWms","wmsLayerSource","ImageWMS","LAYERS","VERSION","serverType","Image","getLegendGraphicUrl","wmsUrl","storeKey","onMapMoveEnd","localMap","getMapStorage","saveMapStorage","storage","getValueFromJson","mapStoreObj","setValue","stringify","theKey","theMap","enableBoundsTracking","executedFunction","later","isLayerVisible","defaultValue","store","localStorage","sessionStore","sessionStorage","setSessionValue","getValue","getSessionValue","removeItem","clearFromSession","getSessionValueFromJson","getArray","setArray"],"mappings":"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","file":"../main-map.min.js","sourcesContent":["/* To Title Case © 2018 David Gouch | https://github.com/gouch/to-title-case */\r\n\r\n// eslint-disable-next-line no-extend-native\r\nString.prototype.toTitleCase = function () {\r\n 'use strict'\r\n var smallWords = /^(a|an|and|as|at|but|by|en|for|if|in|nor|of|on|or|per|the|to|v.?|vs.?|via)$/i\r\n var alphanumericPattern = /([A-Za-z0-9\\u00C0-\\u00FF])/\r\n var wordSeparators = /([ :–—-])/\r\n\r\n return this.split(wordSeparators)\r\n .map(function (current, index, array) {\r\n if (\r\n /* Check for small words */\r\n current.search(smallWords) > -1 &&\r\n /* Skip first and last word */\r\n index !== 0 &&\r\n index !== array.length - 1 &&\r\n /* Ignore title end and subtitle start */\r\n array[index - 3] !== ':' &&\r\n array[index + 1] !== ':' &&\r\n /* Ignore small words that start a hyphenated phrase */\r\n (array[index + 1] !== '-' ||\r\n (array[index - 1] === '-' && array[index + 1] === '-'))\r\n ) {\r\n return current.toLowerCase()\r\n }\r\n\r\n /* Ignore intentional capitalization */\r\n if (current.substr(1).search(/[A-Z]|\\../) > -1) {\r\n return current\r\n }\r\n\r\n /* Ignore URLs */\r\n if (array[index + 1] === ':' && array[index + 2] !== '') {\r\n return current\r\n }\r\n\r\n /* Capitalize the first letter */\r\n return current.replace(alphanumericPattern, function (match) {\r\n return match.toUpperCase()\r\n })\r\n })\r\n .join('')\r\n}","var applicationLogging = function () {\r\n\r\n var events;\r\n var accessToken;\r\n\r\n function init(loggingAccessToken) { \r\n events = nsgEvents.events();\r\n accessToken = loggingAccessToken;\r\n //data={\r\n // features, \r\n // source\r\n //}\r\n events.addListener(nsg_events.mapPopupFeatureSelected, function (data) { \r\n for (var i = 0; i < data.features.length; i++) {\r\n var usrn = data.features[i][\"usrn\"]; \r\n logStreetSelection(usrn, data.source, data.query);\r\n } \r\n });\r\n\r\n events.addListener(\"search_printed\", function (data) {\r\n logSearchPrint(data);\r\n });\r\n \r\n events.addListener(nsgEvents.mapWfsRequest, function (data) {\r\n logMapWfsRequest(data);\r\n });\r\n }\r\n\r\n function logStreetSelection(usrn, source, query) {\r\n //console.info(\"Logging usrn: \" + usrn + \" from source \" + source);\r\n\r\n //fire & forget\r\n var params = {\r\n usrn: usrn,\r\n source: source,\r\n query: query\r\n } \r\n\r\n $.ajax({\r\n url: \"/api/geoplace/logging/LogStreetSelected\",\r\n data: params,\r\n headers: {\r\n accesstoken: accessToken\r\n }\r\n });\r\n }\r\n\r\n function logSearchPrint(data) {\r\n //console.info(data);\r\n\r\n //fire & forget\r\n $.ajax({\r\n url: \"/api/geoplace/logging/LogSearchPrint\",\r\n data: data,\r\n headers: {\r\n accesstoken: accessToken\r\n }\r\n }); \r\n }\r\n\r\n\r\n function logMapWfsRequest(data) {\r\n //console.info(\"Logging wfs: \" + data);\r\n\r\n $.ajax({\r\n url: \"/api/geoplace/logging/LogWfsRequest\",\r\n data: data,\r\n headers: {\r\n accesstoken: accessToken\r\n }\r\n });\r\n }\r\n\r\n\r\n return {\r\n init : init\r\n }\r\n\r\n}();","var mapPopup = function () {\r\n\r\n var _map,\r\n _overlay,\r\n _markerLayer,\r\n _popupContainer,\r\n _popupContent,\r\n _popupCloser,\r\n _events,\r\n _hasPopup = false,\r\n sessionTimedOut = false;\r\n\r\n //issue with info click on mobile,\r\n //showing then closing, timing issue\r\n //we'll use to track when we're actually showing info\r\n var _showingPopup = false;\r\n\r\n function init(map) {\r\n _map = map;\r\n\r\n //eventbus\r\n _events = eventBus.getTopic(\"nsg\");\r\n _events.addListener(nsg_events.showFeaturesAtCoordinate, function (data) {\r\n showFeaturesAtCoordinateUsrn(data.coordinates, data.usrn, data.source, data.query);\r\n });\r\n _events.addListener(nsg_events.sessionTimeOut, onSessionTimeout);\r\n\r\n mapEvents();\r\n markerLayer();\r\n buildPopup();\r\n }\r\n\r\n function onSessionTimeout() {\r\n sessionTimedOut = true;\r\n _map.removeLayer(_markerLayer);\r\n _map.removeOverlay(_overlay);\r\n }\r\n\r\n function mapEvents() {\r\n _map.on(\"click\", function (evt) {\r\n\r\n var coordinate = evt.coordinate,\r\n pixel = _map.getPixelFromCoordinate(coordinate),\r\n features = _map.getFeaturesAtPixel(pixel, { hitTolerance: 4 }),\r\n isMarker = false;\r\n\r\n if (features) {\r\n\r\n if (sessionTimedOut) {\r\n onSessionTimeoutActionStopped();\r\n return;\r\n }\r\n\r\n for (var i = 0; i < features.length; i++) {\r\n if (features[i].getProperties()[\"marker\"] == true) {\r\n isMarker = true;\r\n }\r\n }\r\n }\r\n\r\n //marker or street?\r\n if (isMarker) {\r\n onMarkerClicked();\r\n } else {\r\n showFeaturesAtCoordinateFromMapClick(evt.coordinate, \"map\");\r\n }\r\n });\r\n\r\n _map.getView().on(\"change\", function (e) {\r\n hidePopovers();\r\n });\r\n\r\n _map.getView().on(\"change:resolution\", function (e) {\r\n let zoom = e.target.getZoom();\r\n\r\n //close the popup when we get beyond the NSG zoom level\r\n \r\n //this event seems to be firing multiple times until an integer zoomlevel is reached\r\n //we therefore need to test for when zoom is a whole int before we do anything\r\n if (zoom % 1 === 0) {\r\n //console.log(\"zoom=\" + e.target.getZoom());\r\n\r\n if (_hasPopup) {\r\n var visible = zoom >= 9;\r\n _overlay.setVisible(visible);\r\n _markerLayer.setVisible(visible); \r\n _popupContainer.css(\"display\", (visible)?\"block\":\"none\");\r\n } \r\n }\r\n });\r\n }\r\n\r\n function markerLayer() {\r\n var iconStyle = new ol.style.Style({\r\n image: new ol.style.Icon({\r\n anchor: [0.5, 0.8],\r\n anchorXUnits: 'fraction',\r\n anchorYUnits: 'fraction',\r\n src: '/images/Geoplace_marker.svg',\r\n imgSize: [50, 50]\r\n //scale: 0.4,\r\n //offsetOrigin: \"bottom-left\",\r\n //offset: [0, -10]\r\n })\r\n });\r\n\r\n _markerLayer = new ol.layer.Vector({\r\n source: new ol.source.Vector(),\r\n style: iconStyle\r\n });\r\n _map.addLayer(_markerLayer);\r\n }\r\n\r\n function hidePopovers() {\r\n $(\".popupStreetStatusPopover, .popupStreetStatePopover, .popupClassificationPopover\").popover('hide'); \r\n }\r\n\r\n function buildPopup() {\r\n _popupContainer = $(\"
\", { id: \"popup\", class: \"ol-popup\" });\r\n _popupCloser = $(\"
\", { id: \"popup-closer\", class: \"ol-popup-closer\", href: \"#\" });\r\n _popupContent = $(\"
\", { id: \"popup-content\", class: \"ol-popup-content\" });\r\n\r\n $(\"main-map\").append(_popupContainer);\r\n _popupContainer.append(_popupCloser);\r\n _popupContainer.append(_popupContent); \r\n\r\n //Add a click handler to hide the popup.\r\n _popupCloser.on(\"click\", function () {\r\n hidePopovers(); \r\n _popupContainer.toggle();\r\n //closePopup();\r\n return false;\r\n });\r\n\r\n _overlay = new ol.Overlay({\r\n element: _popupContainer[0],\r\n autoPan: true,\r\n autoPanAnimation: {\r\n duration: 250\r\n }\r\n });\r\n _map.addOverlay(_overlay);\r\n }\r\n\r\n function onMarkerClicked() {\r\n hidePopovers(); \r\n _popupContainer.toggle();\r\n }\r\n\r\n function onSessionTimeoutActionStopped() {\r\n _events.dispatch(nsg_events.sessionTimeOutActionStopped);\r\n } \r\n\r\n //show all feature at coordinate\r\n function showFeaturesAtCoordinateFromMapClick(coordinate, source) {\r\n showFeaturesAtCoordinateUsrn(coordinate, null, source, null);\r\n }\r\n\r\n //show all feature at coordinate, with a given usrn\r\n //if usrn is null then all features at location will be selected\r\n function showFeaturesAtCoordinateUsrn(coordinate, usrn, source, query) {\r\n hidePopovers(); \r\n\r\n if (sessionTimedOut) {\r\n onSessionTimeoutActionStopped();\r\n return;\r\n }\r\n\r\n var coordinate = coordinate,\r\n pixel = _map.getPixelFromCoordinate(coordinate),\r\n features = _map.getFeaturesAtPixel(pixel, { hitTolerance: 4 }),\r\n htmlAggregate = \"\",\r\n streetsEng = new Map(),\r\n streetsCym = new Map();\r\n \r\n if (features) {\r\n\r\n _markerLayer.getSource().clear();\r\n\r\n for (i = 0; i < features.length; i++) {\r\n var f = features[i],\r\n props = f.getProperties();\r\n\r\n if (usrn === null || usrn === props[\"usrn\"]) {\r\n var item = {\r\n key: props[\"usrn\"] + \"-\" + props[\"language\"],\r\n usrn: props[\"usrn\"],\r\n lang: props[\"language\"],\r\n data: props,\r\n geom: f.getGeometry()\r\n };\r\n\r\n //de-duplicate\r\n if (!streetsEng.has(item.usrn) && item.lang.toLowerCase() === \"eng\") {\r\n streetsEng.set(item.usrn, item);\r\n }\r\n else if (!streetsCym.has(item.usrn) && item.lang.toLowerCase() === \"cym\") {\r\n //keep welsh records in a seperate list\r\n streetsCym.set(item.usrn, item);\r\n }\r\n }\r\n }\r\n\r\n //add any matching welsh usrns\r\n streetsEng.forEach(function (street, usrn, map) {\r\n if (streetsCym.has(usrn)) {\r\n street.data.cym = streetsCym.get(usrn).data;\r\n }\r\n });\r\n\r\n if (streetsEng.size > 0) {\r\n var count = 0;\r\n\r\n streetsEng.forEach(function (street, usrn, map) {\r\n var html = replaceTokens(htmlForDetails(street.data), street.data); \r\n\r\n if (count > 0) {\r\n html = \"
\" + html;\r\n }\r\n\r\n htmlAggregate += html;\r\n\r\n count += 1;\r\n });\r\n\r\n if (usrn) {\r\n //we're looking for a usrn, so we'll need to get the rough midpoint\r\n var g = streetsEng.get(usrn).geom;\r\n coordinate = g.getClosestPoint(ol.extent.getCenter(g.getExtent()));\r\n }\r\n\r\n showPopup(htmlAggregate, coordinate);\r\n\r\n //popovers for popup\r\n\r\n document.querySelectorAll(\".popupStreetStatusPopover\").forEach(ele => {\r\n new bootstrap.Popover(ele, {\r\n html: true,\r\n content: \"This shows the maintenance status of the street and, if known, who has the responsibility for maintaining it.\",\r\n trigger: 'focus',\r\n container: document.getElementById(\"popup-content\"),\r\n placement: 'top',\r\n fallbackPlacement: ['top']\r\n });\r\n });\r\n\r\n\r\n document.querySelectorAll(\".popupStreetStatePopover\").forEach(ele => {\r\n new bootstrap.Popover(ele, {\r\n content: \"This identifies the state of the street, whether it is under construction or wholly or partly built (Open).\",\r\n trigger: 'focus',\r\n container: document.getElementById(\"popup-content\"),\r\n placement: 'top',\r\n fallbackPlacement: ['top']\r\n }); \r\n });\r\n\r\n document.querySelectorAll(\".popupClassificationPopover\").forEach(ele => {\r\n new bootstrap.Popover(ele, {\r\n html: true,\r\n content: \"This shows the road classification of the section of street selected.\",\r\n trigger: 'focus',\r\n container: document.getElementById(\"popup-content\"),\r\n placement: 'top',\r\n fallbackPlacement: ['top']\r\n }); \r\n }); \r\n \r\n\r\n var featureDataArray = [];\r\n streetsEng.forEach(function (street, usrn, map) {\r\n featureDataArray.push(street.data);\r\n });\r\n _events.dispatch(nsg_events.mapPopupFeatureSelected, { features: featureDataArray, source: source, query: query }); \r\n }\r\n }\r\n }\r\n\r\n function constructStreetText(data) {\r\n var street = \"\" + data[\"street_descriptor\"] + \"\";\r\n\r\n if (data[\"locality_name\"]) {\r\n street += \", \" + data[\"locality_name\"] + \"\";\r\n }\r\n if (data[\"town_name\"]) {\r\n street += \", \" + data[\"town_name\"] + \"\"; \r\n }\r\n\r\n //return street.toLowerCase().toTitleCase();\r\n return street;\r\n }\r\n\r\n function htmlForDetails(data) {\r\n\r\n data.streetEng = constructStreetText(data);\r\n\r\n if (data.cym) {\r\n data.streetCym = constructStreetText(data.cym);\r\n }\r\n\r\n var htmlClassification = function () {\r\n\r\n if (data.use_classification_data === \"f\") {\r\n return \"\";\r\n }\r\n\r\n var classification = \"Neither M, A, B or C\";\r\n\r\n if (data.type3_street_classification) {\r\n //console.log(\"Classification:\" + data.type3_usrn + \", \" + data.type3_street_descriptor); \r\n classification = data.type3_street_classification + \"-road\"\r\n if (data.type3_street_classification === \"M\") {\r\n classification = \"Motorway\";\r\n }\r\n }\r\n return \"\" +\r\n \"
\" +\r\n \" Classification: \" + classification +\r\n \" \" +\r\n \" \" +\r\n \" \" +\r\n \"
\";\r\n };\r\n\r\n var htmlStreetStatus = function (data) { \r\n var maintainedBy = (data.street_status_id == 1) ? data.provider : data.maintaining_authority;\r\n\r\n //street_status_id\r\n return \"\" +\r\n \"\";\r\n };\r\n\r\n var htmlStreetName = function () {\r\n if (!data.cym) {\r\n return \" \";\r\n } else {\r\n return \"\" +\r\n \"\";\r\n }\r\n };\r\n\r\n var html = \"\" +\r\n \"
\" +\r\n \"
\" +\r\n \" \" +\r\n \" \" +\r\n \"
\" + \r\n \"\" + htmlStreetName() +\r\n \"\" + htmlStreetStatus(data) +\r\n \"
\"; \r\n \r\n return html;\r\n }\r\n\r\n function showPopup(html, coordinates) {\r\n if (html) {\r\n _showingPopup = true;\r\n _popupContent.html(html);\r\n _popupContainer.css(\"display\", \"block\");\r\n\r\n if (coordinates) {\r\n _overlay.setPosition(coordinates);\r\n }\r\n\r\n var source = _markerLayer.getSource();\r\n source.clear();\r\n \r\n var feature = new ol.Feature({\r\n \"marker\": true\r\n });\r\n feature.setGeometry(new ol.geom.Point(coordinates));\r\n source.addFeature(feature);\r\n\r\n window.setTimeout(function () {\r\n _showingPopup = false;\r\n }, 500);\r\n\r\n _hasPopup = true; \r\n \r\n $('.popup-street [data-bs-toggle=\"tooltip\"]').tooltip({ \r\n placement: 'bottom',\r\n container: '#popup-content' \r\n });\r\n }\r\n }\r\n\r\n //function closePopup() {\r\n // if (_showingPopup) {\r\n // return;\r\n // }\r\n\r\n // _markerLayer.getSource().clear(); \r\n // _overlay.setPosition(undefined);\r\n // _popupContainer.css(\"display\", \"none\"); \r\n\r\n // return false;\r\n //}\r\n\r\n function replaceTokens(html, data) {\r\n //go thru html string and replace any tokens with attribute values\r\n for (var attributeName in data) {\r\n if (data.hasOwnProperty(attributeName)) {\r\n html = html.replace(new RegExp(\"\\\\[\" + attributeName + \"\\\\]\", \"g\"), data[attributeName]);\r\n }\r\n }\r\n return html;\r\n }\r\n\r\n return {\r\n init: init\r\n }\r\n\r\n}();","var mapPermaLink = function () {\r\n\r\n var _map,\r\n _events;\r\n\r\n function init(map) {\r\n _map = map; \r\n \r\n //eventbus\r\n _events = eventBus.getTopic(\"nsg\");\r\n _events.addListener(nsg_events.mapPopupFeatureSelected, function (data, source, query) {\r\n for (var i = 0; i < data.features.length; i++){\r\n buildHtml(data.features[i].usrn); \r\n }\r\n addClickHandler(); \r\n });\r\n _events.addListener(nsg_events.sessionTimeOut, onSessionTimeout); \r\n }\r\n \r\n function buildHtml(usrn) {\r\n var id = \"permalink_\" + usrn; \r\n let html = \"\" +\r\n \" \" + \r\n \" \" +\r\n \" \"; \r\n\r\n //placeholder id format = permalink_placeholder_[usrn]\r\n $(\"#permalink_placeholder_\" + usrn).append(html);\r\n $('.permalink [data-bs-toggle=\"tooltip\"]').tooltip({\r\n boundary: 'window',\r\n placement:'bottom',\r\n delay: {\r\n show: 100,\r\n hide: 1000\r\n }\r\n });\r\n }\r\n\r\n function addClickHandler() { \r\n $('.permalink').on('click', function () { \r\n var el = $(this);\r\n var usrn = el.data(\"usrn\");\r\n var link = window.location.origin + window.location.pathname + \"?usrn=\" + usrn;\r\n copyToClipboard(link, el[0], \"clipBoardPlaceHolder_\" + usrn, \"permalink_\" + usrn); \r\n }); \r\n }\r\n\r\n function copyToClipboard (text, el, placeHolderId, popoverId){\r\n var copyTest = document.queryCommandSupported('copy');\r\n \r\n if (copyTest === true) {\r\n //close current popover\r\n $(\".permalink\").popover('dispose');\r\n\r\n var ph = document.getElementById(placeHolderId);\r\n var copyTextArea = document.createElement(\"textarea\");\r\n copyTextArea.value = text;\r\n ph.appendChild(copyTextArea);\r\n \r\n copyTextArea.select();\r\n try {\r\n let successful = document.execCommand('copy');\r\n let msg = successful ? \"Link to the street copied to clipboard\" : 'Whoops, not copied!'; \r\n\r\n let popover = new bootstrap.Popover(el, { \r\n content: msg,\r\n trigger: 'manual',\r\n container: document.getElementById(\"popup-content\"),\r\n placement: 'top',\r\n fallbackPlacement: ['top']\r\n });\r\n \r\n popover.show();\r\n \r\n window.setTimeout(function () {\r\n popover.dispose(); \r\n }, 3000); \r\n \r\n } catch (err) {\r\n console.log('Oops, unable to copy');\r\n }\r\n ph.removeChild(copyTextArea);\r\n \r\n } else {\r\n // Fallback if browser doesn't support .execCommand('copy')\r\n window.prompt(\"Copy to clipboard: Ctrl+C or Command+C, Enter\", text);\r\n }\r\n }\r\n\r\n function onSessionTimeout() {\r\n //disable marker\r\n\r\n }\r\n\r\n return {\r\n init: init\r\n }\r\n\r\n}();","var mapBaseLayers = function () {\r\n\r\n function osOpenSpace(oSOpenSpaceURL, oSOpenSpaceKey) {\r\n \r\n if (oSOpenSpaceKey) {\r\n oSOpenSpaceURL = oSOpenSpaceURL + \"?key=\" + oSOpenSpaceKey;\r\n } \r\n\r\n //https://apidocs.os.uk/docs/layer-information\r\n var OS_source = new ol.source.WMTS({\r\n name: \"OS\",\r\n title: \"OS\",\r\n url: oSOpenSpaceURL,\r\n layer: 'Road 27700',\r\n format: 'image/png',\r\n version: '1.0.0',\r\n matrixSet: 'EPSG:27700',\r\n params: {\r\n 'Service': 'WMTS',\r\n 'Request': 'GetTile'\r\n },\r\n attributions: '© Crown copyright and database rights ' +\r\n new Date().getFullYear() +\r\n ' OS (100050727)'\r\n ,\r\n logo: 'https://openspace.ordnancesurvey.co.uk/osmapapi/img_versions/img_4.0.0/OS/poweredby_free.png',\r\n projection: \"EPSG:27700\",\r\n tileGrid: new ol.tilegrid.WMTS({\r\n origin: [-238375.0, 1376256.0],\r\n resolutions: [896, 448, 224, 112, 56, 28, 14, 7, 3.5, 1.75, 0.875],\r\n matrixIds: ['EPSG:27700:0', 'EPSG:27700:1', 'EPSG:27700:2', 'EPSG:27700:3', 'EPSG:27700:4', 'EPSG:27700:5', 'EPSG:27700:6', 'EPSG:27700:7', 'EPSG:27700:8', 'EPSG:27700:9', 'EPSG:27700:10', 'EPSG:27700:11', 'EPSG:27700:12', 'EPSG:27700:13'] \r\n }),\r\n style: 'default',\r\n wrapX: true\r\n });\r\n\r\n var openSpaceLayer = new ol.layer.Tile({\r\n title: 'OS',\r\n type: 'base',\r\n //zIndex: 100,\r\n source: OS_source,\r\n id: 'OS',\r\n visible: true,\r\n extent: [0, 0, 683518, 658850]\r\n });\r\n\r\n return openSpaceLayer;\r\n\r\n }\r\n\r\n return {\r\n osOpenSpace: osOpenSpace\r\n } \r\n\r\n}();","var mapFts = function () {\r\n\r\n var events;\r\n //keep track of searches, when one completes we remove all earlier ones from the array\r\n var activeQueries = [];\r\n var searchTerm,\r\n sessionTimedOut = false,\r\n access_token = null;\r\n\r\n function init(accessToken) {\r\n access_token = accessToken;\r\n\r\n //eventbus\r\n events = nsgEvents.events();\r\n events.addListener(nsg_events.sessionTimeOut, onSessionTimeout);\r\n\r\n $(\"#ftSearchClear\").hide(); \r\n $(\"#noFtsResults\").hide();\r\n\r\n $(\"#txtFtSearchxx\").typeahead({\r\n displayText: function (item) {\r\n return item.headline;\r\n },\r\n theme: \"bootstrap4\",\r\n minLength: 3,\r\n delay: 500,\r\n items: 30,\r\n highlighter: function (item) {\r\n //no highlighting\r\n return item;\r\n },\r\n sorter: sortItems,\r\n matcher: function (item) {\r\n //no matching\r\n return 1;\r\n },\r\n source: source,\r\n autoSelect: false,\r\n changeInputOnMove: false,\r\n changeInputOnSelect: false,\r\n afterSelect: function (item) {\r\n this.$element.val(item.description);\r\n\r\n window.setTimeout(function () {\r\n //remove focus from textbox, or the cursor flashes through the popup\r\n $(\"#txtFtSearchxx\").blur();\r\n }, 10); \r\n \r\n events.dispatch(nsg_events.streetSearchSelected, {\r\n query: searchTerm,\r\n street: item\r\n });\r\n }\r\n });\r\n }\r\n\r\n function onSessionTimeout() {\r\n sessionTimedOut = true;\r\n $(\"#txtFtSearchxx\").unbind();\r\n $(\"#txtFtSearchxx\").on(\"focus\", onSessionTimeoutActionStopped);\r\n }\r\n\r\n function onSessionTimeoutActionStopped() {\r\n events.dispatch(nsg_events.sessionTimeOutActionStopped);\r\n } \r\n\r\n function source(query, process) {\r\n //double check query length\r\n //the log shows some two letter ones creeping in (might be result of backspacing)\r\n $(\"#noFtsResults\").hide();\r\n\r\n if (query.length > 2) {\r\n activeQueries.push(query);\r\n\r\n toggleFtsSearching(true);\r\n\r\n $.ajax({\r\n url: \"/geoplace/fulltextsearch\", \r\n beforeSend: function (request) {\r\n request.setRequestHeader(\"AccessToken\", access_token);\r\n },\r\n data: {\r\n searchTerm: query\r\n },\r\n dataType: 'json'\r\n }).done(function (response) {\r\n toggleFtsSearching(false);\r\n \r\n if (response.length === 0) {\r\n $(\"#noFtsResults\").show();\r\n\r\n window.setTimeout(function () {\r\n $(\"#noFtsResults\").hide();\r\n }, 5000);\r\n } \r\n\r\n //only do this if the value is present in the array, i.e. not removed by a later search \r\n var idx = activeQueries.indexOf(query)\r\n if (idx > -1) {\r\n //only set the searchTerm after the ajax response is received & processed\r\n searchTerm = query;\r\n\r\n //remove this and any earlier entries\r\n activeQueries = activeQueries.slice(idx + 1);\r\n\r\n //remove all 'S\r\n for (var i = 0; i < response.length; i++) {\r\n var item = response[i];\r\n item.headline = item.headline.replace(/'[A-Z]/g, function (match) {\r\n return match.toLowerCase();\r\n });\r\n item.description = item.description.replace(/'[A-Z]/g, function (match) {\r\n return match.toLowerCase();\r\n });\r\n }\r\n\r\n return process(response);\r\n } else { \r\n console.warn(\"No query for '\" + query + \"' found\");\r\n }\r\n });\r\n }\r\n }\r\n\r\n function sortItems(items) {\r\n var beginswithfirst3 = [];\r\n var beginswithfirst2 = [];\r\n var beginswithfirst1 = [];\r\n var other = [];\r\n var item;\r\n\r\n function getFirstXWords(count) {\r\n return (queryNoPunc.split(\" \").slice(0, count)).join(\" \");\r\n }\r\n\r\n while ((item = items.shift())) {\r\n var it = item.description.replace(/[^\\w\\s]|_/g, \"\").replace(/\\s+/g, \" \").toLowerCase();\r\n\r\n //Removes everything except alphanumeric characters and whitespace, then collapses multiple adjacent characters to single spaces.\r\n var queryNoPunc = this.query.replace(/[^\\w\\s]|_/g, \"\").replace(/\\s+/g, \" \").toLowerCase();\r\n\r\n //just use the first 3 words?\r\n var q3 = getFirstXWords(3);\r\n var q2 = getFirstXWords(2);\r\n var q1 = getFirstXWords(1);\r\n\r\n if (!it.indexOf(q3)) {\r\n beginswithfirst3.push(item);\r\n }\r\n else if (!it.indexOf(q2)) {\r\n beginswithfirst2.push(item);\r\n }\r\n else if (!it.indexOf(q1)) {\r\n beginswithfirst1.push(item);\r\n }\r\n else {\r\n other.push(item);\r\n }\r\n }\r\n\r\n return beginswithfirst3.concat(beginswithfirst2, beginswithfirst1, other);\r\n }\r\n\r\n function toggleFtsSearching(show){\r\n if (show) {\r\n $('#ftSearching').css('visibility', 'visible');\r\n } \r\n else {\r\n $('#ftSearching').css('visibility', 'hidden');\r\n } \r\n };\r\n\r\n function hide() {\r\n $(\"#txtFtSearchxx\").typeahead('hide');\r\n }\r\n\r\n return {\r\n init: init,\r\n hide: hide\r\n }\t\t\r\n\r\n}();","var mapUsrnSearch = function () {\r\n\r\n var events,\r\n btnSearchUsrn,\r\n usrnSearchInput,\r\n usrnSearchingLoader,\r\n invalidUsrn,\r\n noUsrnResults,\r\n usrnSearchUrl,\r\n sessionTimedOut = false;\r\n\r\n function init(mapServerUrl) {\r\n //eventbus\r\n events = nsgEvents.events();\r\n events.addListener(nsg_events.sessionTimeOut, onSessionTimeout);\r\n\r\n btnSearchUsrn = document.getElementById(\"btnUsrnSearch\");\r\n btnSearchUsrn.addEventListener('click', btnSearchUsrnClick);\r\n\r\n usrnSearchInput = document.getElementById(\"txtUsrnSearch\");\r\n usrnSearchInput.addEventListener(\"keyup\", function (event) {\r\n event.preventDefault();\r\n if (event.keyCode === 13) {\r\n btnSearchUsrn.click();\r\n }\r\n });\r\n\r\n usrnSearchingLoader = document.getElementById(\"usrnSearching\");\r\n invalidUsrn = document.getElementById(\"invalidUsrn\");\r\n noUsrnResults = document.getElementById(\"noUsrnResults\");\r\n usrnSearchUrl = mapServerUrl + \"&SERVICE=WFS&VERSION=2.0.0&REQUEST=GetFeature&TYPENAME=StreetLines&outputformat=geojson&count=100&Filter=usrnLiteralUsrn\";\r\n }\r\n\r\n function btnSearchUsrnClick(evt) { \r\n\r\n if (sessionTimedOut) {\r\n onSessionTimeoutActionStopped()\r\n return;\r\n }\r\n\r\n $(\"#usrnMessages\").hide();\r\n invalidUsrn.style.display = 'none';\r\n noUsrnResults.style.display = 'none';\r\n usrnSearchingLoader.style.visibility = 'hidden';\r\n var searchUsrn = usrnSearchInput.value.trim();\r\n\r\n var isnum = /^\\d+$/.test(searchUsrn);\r\n if (isnum === false || searchUsrn.length > 8 || searchUsrn.length < 6) {\r\n $(\"#usrnMessages\").show();\r\n invalidUsrn.style.display = 'block';\r\n return;\r\n }\r\n var requestUrl = usrnSearchUrl.replace(\"LiteralUsrn\", searchUsrn);\r\n usrnSearchingLoader.style.visibility = 'visible';\r\n\r\n fetchText(\"GET\", requestUrl)\r\n .then(function (text) {\r\n usrnSearchingLoader.style.visibility = 'hidden';\r\n //console.log(text);\r\n var json = JSON.parse(text);\r\n var features = new ol.format.GeoJSON().readFeatures(json);\r\n\r\n if (features.length > 0) {\r\n var g = features[0].getGeometry();\r\n var coord = g.getFirstCoordinate();\r\n\r\n var street = features[0].getProperties(); \r\n street.startX = coord[0]; \r\n street.startY = coord[1]; \r\n street.extent = g.getExtent();\r\n\r\n events.dispatch(nsg_events.usrnSearchSelected, {\r\n query: searchUsrn,\r\n street: street\r\n });\r\n } else {\r\n $(\"#usrnMessages\").show();\r\n\r\n window.setTimeout(function () {\r\n $(\"#usrnMessages\").hide();\r\n }, 5000);\r\n\r\n noUsrnResults.style.display = 'block';\r\n }\r\n });\r\n }\r\n\r\n function onSessionTimeout() {\r\n sessionTimedOut = true;\r\n }\r\n\r\n function onSessionTimeoutActionStopped() {\r\n events.dispatch(nsg_events.sessionTimeOutActionStopped);\r\n } \r\n\r\n function fetchText(method, url) {\r\n return new Promise(function (resolve, reject) {\r\n let xhr = new XMLHttpRequest();\r\n xhr.onreadystatechange = function () {\r\n let DONE = 4; // readyState 4 means the request is done.\r\n let OK = 200; // status 200 is a successful return.\r\n if (xhr.readyState === DONE) {\r\n if (xhr.status === OK) {\r\n resolve(xhr.responseText);\r\n }\r\n else {\r\n reject(\"request failed for \" + url + \" \" + xhr.status);\r\n }\r\n }\r\n };\r\n xhr.open(method, url);\r\n // The header must be after `.open()`, but before `.send()`\r\n xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');\r\n xhr.responseType = \"text\";\r\n xhr.send(null);\r\n });\r\n }\r\n \r\n return {\r\n init :init\r\n }\r\n\r\n}();","\r\n(function () {\r\n document.addEventListener(\"DOMContentLoaded\", function () {\r\n \r\n applicationLogging.init($(\"#loggingAccessToken\").val());\r\n\r\n var map = new MainMap(\r\n \"main-map\",\r\n \"mapLoader\",\r\n \"zoomHeading\",\r\n \"oopsAlert\"\r\n );\r\n\r\n let popoverTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle=\"popover\"]'))\r\n let popoverList = popoverTriggerList.map(function (popoverTriggerEl) {\r\n return new bootstrap.Popover(popoverTriggerEl)\r\n })\r\n });\r\n})();\r\n\r\n\r\nfunction MainMap(\r\n elementId,\r\n loaderId,\r\n zoomInfoId, \r\n oopsAlertId\r\n) {\r\n var self = this;\r\n var mapExtent = null,\r\n usrn = null,\r\n zoomToUsrn = false,\r\n mapStoreID = \"fms-map\";\r\n \r\n //where the usrn came from, e.g. data attribute(list), fts selection, usrn search\r\n var usrnSelectionSource = null,\r\n ftsQuery = \"\";\r\n var events;\r\n\r\n //constructor invoked at bottom\r\n function _constructor(\r\n elementId,\r\n loaderId,\r\n zoomInfoId, \r\n oopsAlertId\r\n ) {\r\n //eventbus\r\n events = nsgEvents.events();\r\n events.addListener(nsg_events.mapPopupFeatureSelected, function (data) {\r\n self.selection = {};\r\n\r\n for (var i = 0; i < data.features.length; i++) {\r\n self.selection[data.features[i][\"usrn\"]] = data.features[i][\"type3_street_classification\"];\r\n }\r\n\r\n self.streetVectorLayer.setStyle(self.streetVectorLayer.getStyle());\r\n });\r\n events.addListener(nsg_events.sessionTimeOutActionStopped, onSessionTimeOutActionStopped);\r\n\r\n $('#modalTimeout').modal({\r\n keyboard: false,\r\n show: false \r\n })\r\n\r\n //touch\r\n if (ol.has.TOUCH) {\r\n $(\"#mapContainer\").addClass(\"ol-touch\");\r\n } \r\n \r\n $(\".close-alert\").click(function () {\r\n $(\"#noFtsResults\").hide();\r\n $(\"#usrnMessages\").hide(); \r\n });\r\n\r\n //setup the clearer on the input textbox\r\n $(\"#street-search-tabs .hasclear\").keyup(function () {\r\n var t = $(this);\r\n\r\n if (t.val()) {\r\n t.siblings('.clearer').show();\r\n } else {\r\n t.siblings('.clearer').hide();\r\n }\r\n });\r\n $(\"#street-search-tabs .clearer\").hide(function () {\r\n var id = $(this).data(\"target\");\r\n\r\n $(id).val('');\r\n //$(this).prev('[type=text]').val();\r\n });\r\n $(\"#street-search-tabs .clearer\").click(function () {\r\n var id = $(this).data(\"target\");\r\n $(id).val('').focus(); \r\n $(this).hide(); \r\n });\r\n\r\n //do this before the map is first drawn\r\n resizeMap();\r\n\r\n var resize = debounce(function () {\r\n resizeMap(true);\r\n }, 250);\r\n\r\n $(window).bind('resize', resize);\r\n\r\n self.elementId = elementId;\r\n self.loaderId = loaderId;\r\n self.zoomInfoId = zoomInfoId;\r\n self.mapElement = document.getElementById(elementId);\r\n\r\n self.accessToken = self.mapElement.dataset.mapToken;\r\n //convert minutes to seconds, then take off 10 seconds\r\n self.accessTokenExpiresIn = (self.mapElement.dataset.mapTokenExpiresIn * 60000) - 10000;\r\n\r\n //session timeout\r\n self.timedout = false;\r\n setTimeout(function () {\r\n onSessionTimeOut()\r\n }, self.accessTokenExpiresIn);\r\n\r\n //get any extents\r\n if (self.mapElement.dataset.extent) {\r\n var a = self.mapElement.dataset.extent.split(',');\r\n\r\n if (Array.isArray(a) && a.length === 4) {\r\n mapExtent = a;\r\n mapExtent[0] = parseFloat(mapExtent[0]);\r\n mapExtent[1] = parseFloat(mapExtent[1]);\r\n mapExtent[2] = parseFloat(mapExtent[2]);\r\n mapExtent[3] = parseFloat(mapExtent[3]);\r\n console.log(\"map extent:\" + self.mapElement.dataset.extent);\r\n }\r\n };\r\n\r\n //usrn passed in from url (list)\r\n if (self.mapElement.dataset.usrn) {\r\n usrn = self.mapElement.dataset.usrn;\r\n zoomToUsrn = true;\r\n usrnSelectionSource = \"list\";\r\n }\r\n\r\n self.enableDebugLog = (self.mapElement.dataset.mapDebugLog === 'true');\r\n\r\n self.mapServerUrl = self.mapElement.dataset.mapServerUrl + \"?accesstoken=\" + encodeURIComponent(self.accessToken);\r\n self.initialZoom = Number(self.mapElement.dataset.mapInitialZoom);\r\n self.maxFeatures = self.mapElement.dataset.mapMaxFeatures;\r\n self.maxTotalFeatures = self.mapElement.dataset.mapMaxTotalFeatures;\r\n \r\n self.oopsAlert = document.getElementById(oopsAlertId);\r\n \r\n self.nameSearchUrl = self.mapServerUrl + \"&SERVICE=WFS&VERSION=2.0.0&REQUEST=GetFeature&TYPENAME=StreetLines&outputformat=geojson&count=100&SORTBY=street_descriptor&Filter=street_descriptorQUERY\"; \r\n self.nameWithProviderSearchUrl = self.mapServerUrl + \"&SERVICE=WFS&VERSION=2.0.0&REQUEST=GetFeature&TYPENAME=StreetLines&outputformat=geojson&count=100&SORTBY=street_descriptor&Filter=street_descriptorQUERYprovider_idPROVIDER\";\r\n\r\n // lookup for selection objects\r\n // key is usrn\r\n // value is classification\r\n self.selection = {};\r\n\r\n //https://apidocs.os.uk/docs/layer-information \r\n self.resolutions = [896, 448, 224, 112, 56, 28, 14, 7, 3.5, 1.75, 0.875]; \r\n self.oS_extent = [0, 0, 683518, 658850];\r\n\r\n self.origin = [-238375.0, 1376256.0];\r\n self.mapCenter = [452000, 314752];\r\n self.initialZoom = 0;\r\n self.mapLayers = [];\r\n self.idProp = 'usrn';\r\n self.zoomToLargeExtentLevel = 9;\r\n self.zoomToSmallExtentLevel = 12;\r\n\r\n proj4.defs(\"EPSG:27700\", \"+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 ol.proj.proj4.register(proj4);\r\n\r\n self.projection = new ol.proj.Projection({\r\n code: 'EPSG:27700',\r\n extent: self.oS_extent,\r\n units: 'm'\r\n });\r\n\r\n mapOverLays.init(self.mapServerUrl);\r\n mapStore.init(mapStoreID);\r\n self.map = _buildMap();\r\n addMapControls(self.map);\r\n mapStore.initMap(self.map, true); \r\n\r\n self.didLoadFromStorage = false;\r\n loadStorageOverrides();\r\n \r\n //issue with info click on mobile,\r\n //showing then closing, timing issue\r\n //we'll use to track when we're actually showing info\r\n self.showingPopup = false;\r\n\r\n $(\"#btnMapLayers\").on(\"click\", function () {\r\n toggleLayersDialogue(10);\r\n });\r\n\r\n $(\"#btnMapLayersClose\").on(\"click\", function () {\r\n toggleLayersDialogue(10);\r\n });\r\n\r\n //$(\"#btnGazetteer\").on(\"click\", function () {\r\n // toggleGazetteerDialogue(10);\r\n //});\r\n\r\n //$(\"#btnGazetteerClose\").on(\"click\", function () {\r\n // toggleGazetteerDialogue(10);\r\n //});\r\n\r\n initUsrnSearch();\r\n initFullTextSearch(); \r\n initGazetteer();\r\n\r\n mapPopup.init(self.map);\r\n mapPermaLink.init(self.map);\r\n mapLayerExtentsLoader.init()\r\n } \r\n\r\n function debounce(func, wait, immediate) {\r\n var timeout;\r\n return function () {\r\n var context = this, args = arguments;\r\n var later = function () {\r\n timeout = null;\r\n if (!immediate) func.apply(context, args);\r\n };\r\n var callNow = immediate && !timeout;\r\n clearTimeout(timeout);\r\n timeout = setTimeout(later, wait);\r\n if (callNow) func.apply(context, args);\r\n };\r\n };\r\n\r\n function toggleLayersDialogue(delayInMilliseconds) {\r\n window.setTimeout(function () {\r\n $('#mapLayersContainer').animate({ width: 'toggle', opacity: 'toggle' });\r\n }, delayInMilliseconds);\r\n }\r\n\r\n //function toggleGazetteerDialogue(delayInMilliseconds) {\r\n // //window.setTimeout(function () {\r\n // $('#gazetteerContainer').animate({ opacity: 'toggle', width: 'toggle' });\r\n // //}, delayInMilliseconds);\r\n //}\r\n\r\n function onSessionTimeOut() {\r\n //console.log(\"Token timed out\");\r\n self.timedout = true;\r\n $('#modalTimeout').modal('show');\r\n\r\n events.removeListener(nsg_events.streetSearchSelected, onFtsStreetSelected);\r\n events.removeListener(nsg_events.usrnSearchSelected, onUsrnSearchSelected);\r\n\r\n self.selection = {};\r\n self.streetVectorLayer.setStyle(self.streetVectorLayer.getStyle());\r\n\r\n events.dispatch(nsg_events.sessionTimeOut);\r\n }\r\n\r\n function onSessionTimeOutActionStopped() {\r\n $('#modalTimeout').modal('show');\r\n }\r\n\r\n function initGazetteer() {\r\n mapGazetteer.init(self.map); \r\n }\r\n\r\n function initUsrnSearch() {\r\n mapUsrnSearch.init(self.mapServerUrl);\r\n events.addListener(nsg_events.usrnSearchSelected, onUsrnSearchSelected);\r\n }\r\n\r\n function onUsrnSearchSelected(data) { \r\n //move the map\r\n //then set zoomToUsrn/usrn values which will cause the feature to be selected after the wfs request has completed\r\n usrnSelectionSource = \"usrn-search\";\r\n ftsQuery = data.query\r\n zoomToUsrn = true;\r\n usrn = data.street.usrn;\r\n\r\n self.view.setCenter(ol.extent.getCenter(data.street.extent));\r\n self.view.setZoom(9);\r\n\r\n window.setTimeout(function () {\r\n showFeaturesAtCoordinateUsrn([data.street.startX, data.street.startY], usrn, usrnSelectionSource, ftsQuery);\r\n }, 10); \r\n }\r\n\r\n function initFullTextSearch() {\r\n //mapFts.init($(\"#ftsAccessToken\").val());\r\n //events.addListener(nsg_events.streetSearchSelected, onFtsStreetSelected);\r\n }\r\n\r\n function onFtsStreetSelected(data) {\r\n //move the map\r\n //then set zoomToUsrn/usrn values which will cause the feature to be selected after the wfs request has completed\r\n usrnSelectionSource = \"fts_search\";\r\n ftsQuery = data.query\r\n zoomToUsrn = true;\r\n usrn = data.street.usrn;\r\n\r\n self.view.setCenter(ol.extent.getCenter(data.street.extent));\r\n self.view.setZoom(9);\r\n window.setTimeout(function () {\r\n showFeaturesAtCoordinateUsrn([data.street.startX, data.street.startY], usrn, usrnSelectionSource, ftsQuery);\r\n }, 10); \r\n }\r\n \r\n function showFeaturesAtCoordinateUsrn(coordinates, usrn, usrnSelectionSource, query) {\r\n events.dispatch(nsg_events.showFeaturesAtCoordinate, {\r\n coordinates: coordinates,\r\n usrn: usrn,\r\n source: usrnSelectionSource,\r\n query: query\r\n });\r\n }\r\n\r\n function resizeMap(windowResize) {\r\n //use max footer height, especially on mobile\r\n var fHeight = $(\"footer\").height();\r\n fHeight = Math.min(fHeight, 200);\r\n\r\n var height = $(window).height() - $(\"#mapContainer\").offset().top;\r\n if (height <= 400) {\r\n height = 400;\r\n }\r\n $('#mapContainer').height(height)\r\n\r\n if (windowResize) {\r\n setTimeout(function () { \r\n self.map.updateSize();\r\n }, 0); \r\n }\r\n //$('#slide-content').height(height-100); \r\n };\r\n\r\n function loadStorageOverrides() {\r\n if (mapExtent) { \r\n self.view.setCenter(ol.extent.getCenter(mapExtent));\r\n self.view.setZoom(9);\r\n } else {\r\n var settings = mapStore.settings();\r\n self.view.setCenter(settings.centre);\r\n self.view.setZoom(settings.zoom); \r\n } \r\n\r\n self.didLoadFromStorage = true;\r\n }\r\n\r\n function onMapChange(evt) { \r\n var map = evt.map;\r\n\r\n if (map) { \r\n\r\n var view = map.getView();\r\n var res = view.getResolution();\r\n var z = view.getZoom();\r\n var c = view.getCenter();\r\n \r\n //if (self.didLoadFromStorage === true) {\r\n // storeMapSettings();\r\n //} else {\r\n // loadStorageOverrides();\r\n //}\r\n\r\n //https://github.com/exeGesIS-SDM/GeoPlace-OnlineNSG/issues/120\r\n if (z > 10) {\r\n map.getView().setZoom(10);\r\n }\r\n if (self.enableDebugLog) {\r\n console.log('resolution ' + res);\r\n console.log('zoom ' + z);\r\n console.log('center ' + c);\r\n }\r\n if (res < 3.5) {\r\n hideZoomInfo();\r\n }\r\n else {\r\n showZoomInfo();\r\n self.oopsAlert.style.display = 'none';\r\n }\r\n }\r\n }\r\n\r\n function _buildMap() {\r\n \r\n //base layer\r\n var oSOpenSpaceKey = self.mapElement.dataset.openSpaceKey;\r\n var oSOpenSpaceURL = self.mapElement.dataset.openSpaceUrl; \r\n self.oSOpenSpaceAllowedDomain = self.mapElement.dataset.openSpaceAllowedDomain;\r\n\r\n var openSpaceLayer = mapBaseLayers.osOpenSpace(oSOpenSpaceURL, oSOpenSpaceKey); \r\n self.mapLayers.push(openSpaceLayer);\r\n \r\n self.streetVectorSource = new ol.source.Vector({\r\n format: new ol.format.GeoJSON(), \r\n \r\n loader: function (extent, resolution, projection) {\r\n \r\n if (!mapLayerExtentsLoader.reloadLayer(extent, self.streetVectorLayer, self.map.getView().getZoom(), Infinity, false)) {\r\n return;\r\n }\r\n\r\n\r\n var features = self.streetVectorSource.getFeatures(); \r\n if (features.length >= self.maxTotalFeatures) {\r\n var fast = true;\r\n self.streetVectorSource.clear(fast); \r\n }\r\n\r\n\r\n //buffer the extent by 1km (assuming projection is in m)\r\n //var bufferedExtent = ol.extent.buffer(extent, 1000);\r\n //buffer the extent by 15%\r\n\r\n let widthInMetres = ol.extent.getWidth(extent);\r\n let bufferedExtent = ol.extent.buffer(extent, widthInMetres * 0.15);\r\n\r\n \r\n\r\n this.resolution = resolution;\r\n var url = self.mapServerUrl + '&SERVICE=WFS&' +\r\n 'VERSION=2.0.0&REQUEST=GetFeature&TYPENAME=StreetLines&' +\r\n 'SRSNAME=EPSG:27700&BBOX=' + bufferedExtent.join(', ') +\r\n ' &outputformat=geojson&count=' + self.maxFeatures;\r\n\r\n self.oopsAlert.style.display = 'none';\r\n showIndicator();\r\n var xhr = new XMLHttpRequest();\r\n \r\n xhr.open('GET', url);\r\n // The header must be after `.open()`, but before `.send()`\r\n xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');\r\n\r\n var onError = function () {\r\n //alert('eror');\r\n self.streetVectorSource.removeLoadedExtent(bufferedExtent);\r\n hideIndicator();\r\n };\r\n xhr.onerror = onError;\r\n xhr.onload = function () {\r\n if (xhr.status === 200) {\r\n var text = xhr.responseText;\r\n //alert(text);\r\n // we get 200 status code even for access denied and not found so try catch\r\n try {\r\n var features = self.streetVectorSource.getFormat().readFeatures(text);\r\n self.streetVectorSource.addFeatures(features);\r\n \r\n if (zoomToUsrn) {\r\n //find the feature\r\n\r\n if (usrnSelectionSource !== \"fts_search\") {\r\n //clear the search term\r\n ftsQuery = \"\";\r\n }\r\n\r\n for (var i = 0; i < features.length; i++) {\r\n var props = features[i].getProperties();\r\n if (props.usrn == usrn) {\r\n var geom = features[i].getGeometry();\r\n var coord = geom.getFirstCoordinate();\r\n\r\n //check if coord is with map extent\r\n //if the street is long and curved the coord may not always be on th emap\r\n var ex = self.map.getView().calculateExtent(self.map.getSize());\r\n if (!ol.extent.containsCoordinate(ex, coord)) { \r\n self.map.getView().setCenter(coord);\r\n }\r\n\r\n window.setTimeout(function () {\r\n showFeaturesAtCoordinateUsrn(coord, usrn, usrnSelectionSource, ftsQuery);\r\n zoomToUsrn = false;\r\n usrn = null;\r\n usrnSelectionSource = null;\r\n }, 500);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n mapLayerExtentsLoader.storeExtent(self.streetVectorLayer, bufferedExtent, self.map.getView().getZoom(), features.length);\r\n\r\n //log, request bounds + center point\r\n events.dispatch(nsgEvents.mapWfsRequest, {\r\n minX: bufferedExtent[0],\r\n minY: bufferedExtent[1],\r\n maxX: bufferedExtent[2],\r\n maxY: bufferedExtent[3],\r\n centrePointX: ol.extent.getCenter(bufferedExtent)[0],\r\n centrePointY: ol.extent.getCenter(bufferedExtent)[1]\r\n }); \r\n }\r\n catch (err) {\r\n\r\n console.log(err);\r\n //alert(err);\r\n console.log('response was: ' + text);\r\n hideIndicator();\r\n self.oopsAlert.style.display = 'block';\r\n }\r\n \r\n hideIndicator();\r\n } else {\r\n \r\n onError(); \r\n }\r\n };\r\n xhr.send();\r\n }, \r\n strategy: ol.loadingstrategy.bbox\r\n });\r\n \r\n self.streetVectorLayer = new ol.layer.Vector({ \r\n style: function (feature) {\r\n\r\n var usrn = feature.get(self.idProp)\r\n var selected = typeof self.selection[usrn] !== \"undefined\";\r\n var differentClassification = false;\r\n\r\n if (selected) {\r\n differentClassification = (feature.get(\"type3_street_classification\") != self.selection[usrn]);\r\n }\r\n\r\n if (!selected) {\r\n //return standard street style\r\n return new ol.style.Style({\r\n stroke: new ol.style.Stroke({\r\n color: \"rgba(0, 0, 255, 1.0)\",\r\n width: 2\r\n })\r\n });\r\n }\r\n\r\n if (differentClassification) {\r\n return new ol.style.Style({\r\n stroke: new ol.style.Stroke({\r\n color: \"rgba(255, 0, 0, 1.0)\",\r\n width: 5,\r\n lineDash: [10]\r\n })\r\n });\r\n }\r\n else {\r\n return new ol.style.Style({\r\n stroke: new ol.style.Stroke({\r\n color: \"rgba(255, 0, 0, 1.0)\",\r\n width: 5\r\n })\r\n });\r\n } \r\n }, \r\n minResolution: 0.109375, //zoom13\r\n maxResolution:3.5 //zoom 8\r\n });\r\n\r\n self.streetVectorLayer.set(\"name\", \"streets\", true);\r\n addWards();\r\n addHighwayAuthority(); \r\n self.mapLayers.push(self.streetVectorLayer);\r\n self.streetVectorLayer.setSource(self.streetVectorSource);\r\n\r\n \r\n var attribution = new ol.control.Attribution({\r\n collapsible: false\r\n });\r\n \r\n var map = new ol.Map({\r\n //overlays: [self.overlay],\r\n target: self.elementId,\r\n layers: self.mapLayers,\r\n interactions: ol.interaction.defaults({\r\n altShiftDragRotate: false,\r\n pinchRotate: false\r\n }),\r\n controls: ol.control.defaults({ attribution: false }).extend([attribution]),\r\n view: getView()\r\n });\r\n\r\n map.getView().setZoom(self.initialZoom);\r\n map.on('moveend', onMapChange);\r\n\r\n map.on(\"click\", function (evt) {\r\n mapFts.hide();\r\n });\r\n\r\n map.on(\"movestart\", function (evt) {\r\n mapFts.hide();\r\n $(\"#street-search-tabs .clearer\")[0].click(); \r\n });\r\n\r\n return map;\r\n }\r\n\r\n function addHighwayAuthority() {\r\n let mapSettings = mapStore.settings();\r\n let visible = (mapSettings.overlays.highway_authority === true);\r\n let layer = mapOverLays.highwayAuthority();\r\n layer.setVisible(visible)\r\n self.mapLayers.push(layer)\r\n\r\n $(\"#imgProviderBoundaries\").attr(\"src\", mapOverLays.highwayAuthorityLegendUrl());\r\n $(\"#chkProviderBoundaries\").prop(\"checked\", visible);\r\n\r\n $(\"#chkProviderBoundaries\").on(\"change\", function () { \r\n let checked = $(this).prop(\"checked\");\r\n layer.setVisible(checked); \r\n mapStore.onLayerVisibiltyChanged(\"highway_authority\", checked);\r\n });\r\n }\r\n\r\n function addWards() {\r\n let mapSettings = mapStore.settings();\r\n let visible = (mapSettings.overlays.wards === true);\r\n let layer = mapOverLays.wards();\r\n layer.setVisible(visible)\r\n self.mapLayers.push(layer)\r\n\r\n $(\"#imgWards\").attr(\"src\", mapOverLays.wardsLegendUrl());\r\n $(\"#chkWards\").prop(\"checked\", visible);\r\n\r\n $(\"#chkWards\").on(\"change\", function () {\r\n let checked = $(this).prop(\"checked\");\r\n layer.setVisible(checked);\r\n mapStore.onLayerVisibiltyChanged(\"wards\", checked);\r\n });\r\n }\r\n \r\n function getView() {\r\n\r\n self.view = new ol.View({\r\n projection: self.projection,\r\n center: self.mapCenter,\r\n resolutions: self.resolutions, \r\n extent: self.oS_extent, \r\n maxZoom: 10,\r\n minZoom: 1\r\n });\r\n\r\n self.view.on(\"change:resolution\", onMapChange);\r\n return self.view;\r\n }\r\n \r\n function addMapControls(map) {\r\n var mousePositionControl = new ol.control.MousePosition({\r\n coordinateFormat: function (coordinate) {\r\n //console.log(coordinate);\r\n try {\r\n return coordinate[0].toFixed(0) + \" \" + coordinate[1].toFixed(0); \r\n }\r\n catch (err) {\r\n return \"Out of Range\";\r\n }\r\n }, \r\n projection: \"EPSG:27700\",\r\n className: \"custom-mouse-position\",\r\n target: document.getElementById(\"mouse-position\"), \r\n undefinedHTML: 'Mouse Position'\r\n });\r\n\r\n map.addControl(mousePositionControl);\r\n map.addControl(new ol.control.ScaleLine({\r\n units: 'metric' \r\n })\r\n );\r\n map.addControl(new ol.control.FullScreen()); \r\n }\r\n\r\n function showZoomInfo() {\r\n var heading = document.getElementById(self.zoomInfoId);\r\n heading.style.display = 'block';\r\n }\r\n\r\n function hideZoomInfo() {\r\n var heading = document.getElementById(self.zoomInfoId);\r\n heading.style.display = 'none';\r\n }\r\n\r\n function showIndicator() {\r\n var indicator = document.getElementById(self.loaderId);\r\n indicator.style.display = 'block';\r\n }\r\n\r\n function hideIndicator() {\r\n var indicator = document.getElementById(self.loaderId);\r\n indicator.style.display = 'none';\r\n }\r\n \r\n _constructor(\r\n elementId,\r\n loaderId,\r\n zoomInfoId,\r\n oopsAlertId\r\n );\r\n \r\n}\r\n\r\n\r\n","var mapLayerExtentsLoader = function () {\r\n\r\n var _layerExtents;\r\n\r\n function init() {\r\n _layerExtents = [];\r\n }\r\n\r\n function reloadLayer(currentExtent, layer, zoom, maxFeatureCount, alwaysLoadOnZoom) {\r\n var hasChanged = false;\r\n var previousExtent = null;\r\n\r\n //get the stored/previous extent for this layer\r\n for (var i = 0; i < _layerExtents.length; i++) {\r\n var lyrEx = _layerExtents[i];\r\n if (lyrEx.layer.get(\"name\") === layer.get(\"name\")) {\r\n previousExtent = lyrEx;\r\n break;\r\n }\r\n }\r\n\r\n if (previousExtent === null) {\r\n hasChanged = true;\r\n\r\n } else {\r\n if (zoom !== previousExtent.zoomLevel && alwaysLoadOnZoom) {\r\n hasChanged = true;\r\n\r\n } else if (!ol.extent.containsExtent(previousExtent.extent, currentExtent)) {\r\n //the new extent is NOT within the old one \r\n hasChanged = true;\r\n\r\n } else if (zoom !== previousExtent.zoomLevel && maxFeatureCount !== Infinity && previousExtent.featureCount === maxFeatureCount) {\r\n //zoom level has changed\r\n //the new bounds will be contained but re-fetch the data if the maxcount was reached last time\r\n //otherwise the user won't see all the points as they zoom in \r\n hasChanged = true;\r\n }\r\n }\r\n return hasChanged;\r\n }\r\n\r\n function storeExtent(layer, newExtent, zoom, featureCount) { \r\n\r\n //find the extent help and set the new extent\r\n for (var i = 0; i < _layerExtents.length; i++) {\r\n var lyrEx = _layerExtents[i];\r\n if (lyrEx.layer.get(\"name\") === layer.get(\"name\")) {\r\n lyrEx.zoomLevel = zoom;\r\n lyrEx.extent = newExtent;\r\n lyrEx.featureCount = featureCount;\r\n return;\r\n }\r\n } \r\n\r\n //not returned, so add to array\r\n _layerExtents.push({\r\n layer: layer,\r\n zoomLevel: zoom,\r\n extent: newExtent,\r\n featureCount: featureCount\r\n });\r\n }\r\n\r\n return {\r\n init: init,\r\n storeExtent: storeExtent,\r\n reloadLayer: reloadLayer\r\n }\r\n\r\n}();","var mapGazetteer = function () {\r\n let _events,\r\n _map,\r\n _container,\r\n _displayProjection,\r\n _gazResults,\r\n _input,\r\n _noResults,\r\n _loadingIndicator,\r\n _pointLayer,\r\n _searchResults = [],\r\n _zoomToLevel = 12,\r\n _initialised = false;\r\n\r\n function init(map) {\r\n if (!_initialised) {\r\n _events = nsgEvents.events();\r\n _map = map;\r\n _displayProjection = \"EPSG:27700\";\r\n _container = $(\"#gazSearch\"); \r\n initPointLayer();\r\n \r\n ////get an handle on all the html elements \r\n _gazResults = $(\"#gazResults\");\r\n _input = $(\"#gazetteerInput\");\r\n _noResults = $(\"#noGazResults\");\r\n _loadingIndicator = $(\"#gazLoading\");\r\n initPointLayer();\r\n addHandlers();\r\n _initialised = true;\r\n }\r\n }\r\n\r\n function initPointLayer() {\r\n locationPinStyle = new ol.style.Style({\r\n text: new ol.style.Text({\r\n text: '\\uf3c5',\r\n font: 'normal 52px \"Font Awesome 6 Pro\"',\r\n textBaseline: 'bottom',\r\n fill: new ol.style.Fill({\r\n color: '#ff0000'\r\n })\r\n })\r\n }); \r\n\r\n _pointLayer = new ol.layer.Vector({\r\n source: new ol.source.Vector(),\r\n style: locationPinStyle\r\n });\r\n\r\n _map.addLayer(_pointLayer);\r\n } \r\n\r\n function addHandlers() {\r\n //setup the clearer on the input textbox\r\n $(\"#gazSearch .hasclear\").keyup(function () {\r\n let t = $(this);\r\n t.next('span').toggle(Boolean(t.val()));\r\n });\r\n $(\"#gazSearch .clearer\").hide(function () {\r\n $(this).prev('input').val();\r\n });\r\n\r\n $(\"#gazSearch .clearer\").click(function () {\r\n $(this).prev('input').val('').focus();\r\n $(this).hide();\r\n _gazResults.empty();\r\n _gazResults.hide();\r\n _noResults.hide();\r\n _pointLayer.getSource().clear();\r\n });\r\n\r\n //set the input click and enter key press handlers\r\n _input.keypress(function (e) {\r\n if (e.which === 13) {\r\n find(_input.val());\r\n }\r\n }); \r\n $(\"#btnPostcodeSearch\").on(\"click\", function () { \r\n _gazResults.empty();\r\n _gazResults.hide();\r\n _noResults.hide();\r\n _pointLayer.getSource().clear();\r\n\r\n find(_input.val());\r\n });\r\n\r\n $(\"#btnCloseGazAlert\").click(function () { \r\n _noResults.hide();\r\n });\r\n \r\n _events.addListener(nsg_events.mapPopupFeatureSelected, function (data) {\r\n _pointLayer.getSource().clear();\r\n });\r\n \r\n _events.addListener(nsg_events.usrnSearchSelected, function (data) {\r\n _pointLayer.getSource().clear();\r\n });\r\n\r\n _events.addListener(nsg_events.streetSearchSelected, function (data) {\r\n _pointLayer.getSource().clear();\r\n });\r\n\r\n window.addEventListener(\"click\", function (event) {\r\n if (_gazResults.is(\":visible\")) { \r\n if (!event.target.matches('.dropdown-item') && !event.target.matches('.clearer')) {\r\n _gazResults.empty();\r\n _gazResults.hide();\r\n }\r\n } \r\n });\r\n\r\n }\r\n\r\n function getSearchType(searchTerm) {\r\n //if (/\\d/.test(searchTerm)) {//If the search term has numeric characters then it's not a placename\r\n // return \"postcode\";\r\n //}\r\n //else {\r\n // return \"location\";\r\n //}\r\n return \"postcode\";\r\n }\r\n\r\n function find(searchTerm) {\r\n let searchType = getSearchType(searchTerm);\r\n\r\n if (searchTerm.trim() === \"\") {\r\n return;\r\n }\r\n\r\n switch (searchType) {\r\n case \"postcode\":\r\n findPostcode(searchTerm);\r\n break;\r\n\r\n case \"location\":\r\n findLocation(searchTerm);\r\n break;\r\n }\r\n }\r\n\r\n function findPostcode(searchTerm) {\r\n searchGazetteer({\r\n url: \"api/GeoNames/PostCode\",\r\n postalcode: searchTerm\r\n });\r\n }\r\n\r\n function findLocation(searchTerm) {\r\n searchGazetteer({\r\n url: \"api/GeoNames/Location\",\r\n name_startsWith: searchTerm\r\n });\r\n }\r\n\r\n function searchGazetteer(params) {\r\n let url = params.url;\r\n delete params.url;\r\n\r\n toggleGazSearching(true);\r\n\r\n $.ajax({\r\n url: url,\r\n data: params,\r\n success: function (e) {\r\n try {\r\n onSearchGazetteerResult(e);\r\n } catch (err) {\r\n toggleGazSearching(false);\r\n console.error(err);\r\n }\r\n },\r\n dataType: \"json\"\r\n }).always(function () {\r\n toggleGazSearching(false);\r\n });\r\n }\r\n\r\n function onSearchGazetteerResult(e) {\r\n if (e.geonames && e.geonames.length > 0) {\r\n //one or more matches - placename search\r\n processSearchResult(e.geonames, _zoomToLevel);\r\n\r\n } else if (e.postalCodes && e.postalCodes.length > 0) {\r\n //one or more matches - postcode search\r\n processSearchResult(e.postalCodes, _zoomToLevel);\r\n } else {\r\n _gazResults.empty(); \r\n _gazResults.hide();\r\n _noResults.show();\r\n window.setTimeout(function () {\r\n _noResults.hide();\r\n }, 5000);\r\n }\r\n }\r\n\r\n function processSearchResult(matches, zoomToLevel) {\r\n let locations = [],\r\n location;\r\n\r\n //remove all existing entries \r\n _gazResults.empty();\r\n _gazResults.hide();\r\n _noResults.hide();\r\n \r\n\r\n for (let m of matches) {\r\n //transform fails if there are only a few decimal places in the result coords, force value to a float\r\n let coord3857 = ol.proj.transform([parseFloat(m.lng), parseFloat(m.lat)], \"EPSG:4326\", _displayProjection);\r\n \r\n location = {\r\n Easting: coord3857[0],\r\n Northing: coord3857[1],\r\n Name: m.name || m.postalCode,\r\n Name2: m.name || m.postalCode,\r\n ZoomLevel: zoomToLevel\r\n };\r\n\r\n if (m.adminName2) {\r\n location.Name += ` (${m.adminName2})`;\r\n }\r\n\r\n if (m.adminCode1 === \"WLS\" || m.adminCode1 === \"ENG\") { \r\n locations.push(location); \r\n } \r\n }\r\n\r\n _searchResults = [];\r\n\r\n if (locations.length === 0) { \r\n _noResults.show();\r\n\r\n window.setTimeout(function () {\r\n _noResults.hide();\r\n }, 5000);\r\n\r\n } else if (locations.length > 1) {\r\n\r\n //add empty option\r\n //_gazResults.append(``); \r\n\r\n for (let i = 0; i < locations.length; i++) {\r\n /*_gazResults.append(``);*/\r\n _gazResults.append(``);\r\n _searchResults.push(locations[i]);\r\n }\r\n _gazResults.show();\r\n _gazResults.find(\"button\")[0].focus(); \r\n\r\n _gazResults.find(\".dropdown-item\").click(function () { \r\n let selectedIndex = parseInt($(this)[0].dataset.resultIndex);\r\n let name = $(this)[0].dataset.resultName2;\r\n $(\"#gazetteerInput\").val(name);\r\n showOnMap(selectedIndex);\r\n });\r\n\r\n } else if (locations.length === 1) {\r\n let coord3857 = [locations[0].Easting, locations[0].Northing];\r\n addPinAndCenterMap(coord3857, zoomToLevel);\r\n }\r\n }\r\n\r\n\r\n function toggleGazSearching(show) {\r\n if (show) {\r\n _loadingIndicator.css('visibility', 'visible');\r\n }\r\n else {\r\n _loadingIndicator.css('visibility', 'hidden');\r\n }\r\n }\r\n\r\n function showOnMap(selectedIndex) {\r\n\r\n if (_searchResults.length > 0 && _searchResults.length >= selectedIndex) {\r\n let coord = [_searchResults[selectedIndex].Easting, _searchResults[selectedIndex].Northing];\r\n addLocationPin(coord);\r\n addPinAndCenterMap(coord, _searchResults[selectedIndex].ZoomLevel);\r\n }\r\n }\r\n\r\n function addPinAndCenterMap(coord, zoomToLevel) {\r\n addLocationPin(coord);\r\n _map.getView().setCenter(coord);\r\n _map.getView().setZoom(zoomToLevel);\r\n }\r\n\r\n function addLocationPin(displayCoordinates) {\r\n let locationFeature = new ol.Feature({\r\n geometry: new ol.geom.Point(displayCoordinates),\r\n });\r\n\r\n //locationFeature.setStyle(locationPinStyle);\r\n _pointLayer.getSource().clear();\r\n _pointLayer.getSource().addFeature(locationFeature);\r\n }\r\n\r\n return {\r\n init: init\r\n }\r\n\r\n}();","var mapOverLays = function () {\r\n\r\n var url;\r\n\r\n function init(wmsUrl) {\r\n url = wmsUrl;\r\n }\r\n\r\n function highwayAuthority() {\r\n return getImageWms(\"HighwaysAuthorityBoundaries\"); \r\n }\r\n\r\n function highwayAuthorityLegendUrl() {\r\n return getLegendGraphicUrl(\"HighwaysAuthorityBoundaries\");\r\n }\r\n\r\n function wards() {\r\n return getImageWms(\"Wards\");\r\n }\r\n\r\n function wardsLegendUrl() {\r\n return getLegendGraphicUrl(\"Wards\");\r\n }\r\n\r\n function getImageWms(layer) {\r\n var wmsLayerSource = new ol.source.ImageWMS({\r\n url: url,\r\n params: {\r\n LAYERS: layer,\r\n VERSION: \"1.3.0\"\r\n },\r\n projection: \"EPSG:27700\",\r\n serverType: \"mapserver\"\r\n });\r\n\r\n var layer = new ol.layer.Image({\r\n source: wmsLayerSource,\r\n visible: true\r\n });\r\n\r\n return layer;\r\n }\r\n\r\n function getLegendGraphicUrl(layer) {\r\n return url + \"&service=wms&version=1.3.0&request=getlegendgraphic&layer=\" + layer + \"&format=image/png&SLD_VERSION=1.1.0\"\r\n }\r\n\r\n return {\r\n init: init,\r\n highwayAuthority: highwayAuthority,\r\n highwayAuthorityLegendUrl: highwayAuthorityLegendUrl,\r\n wards: wards,\r\n wardsLegendUrl: wardsLegendUrl\r\n }\r\n\r\n}();\r\n\r\n //var mapOverLays = function () {\r\n\r\n// function highwayAuthority(wmsUrl) {\r\n\r\n// var layer = new ol.layer.Tile({\r\n// source: new ol.source.TileWMS({\r\n// url: wmsUrl,\r\n// params: {\r\n// LAYERS: \"HighwaysAuthorityBoundaries\",\r\n// VERSION: \"1.3.0\",\r\n// TILED: true\r\n// },\r\n// tileGrid: new ol.tilegrid.TileGrid({\r\n// origin: [0, 0],\r\n// resolutions: [1000, 500, 250, 100, 50, 25, 10, 5, 2.5, 1, 0.5, 0.25],\r\n// }),\r\n// projection: \"EPSG:27700\",\r\n// serverType: \"mapserver\"\r\n// }),\r\n// visible: true\r\n// });\r\n\r\n// return layer;\r\n// }\r\n\r\n// return {\r\n// highwayAuthority: highwayAuthority\r\n// }\r\n\r\n//}();","//stores the last map bounds and visible layers\r\nvar mapStore = function () {\r\n var map,\r\n storeKey;\r\n\r\n function init(theKey) {\r\n storeKey = theKey;\r\n }\r\n\r\n function initMap(theMap, enableBoundsTracking) {\r\n map = theMap;\r\n\r\n if (enableBoundsTracking) {\r\n //remember map extent\r\n map.on('moveend', debounce(onMapMoveEnd,100));\r\n }\r\n }\r\n\r\n function onMapMoveEnd(e) {\r\n var localMap = e.map;\r\n var m = getMapStorage();\r\n\r\n m.centre = map.getView().getCenter();\r\n m.zoom = localMap.getView().getZoom();\r\n\r\n saveMapStorage(m);\r\n }\r\n\r\n function isLayerVisible(name, defaultValue) {\r\n var m = getMapStorage();\r\n if (typeof m.overlays[name] === \"undefined\") {\r\n m.overlays[name] = defaultValue;\r\n saveMapStorage(m);\r\n }\r\n return m.overlays[name];\r\n }\r\n\r\n function onLayerVisibiltyChanged(name, visible) {\r\n var m = getMapStorage();\r\n m.overlays[name] = visible;\r\n saveMapStorage(m);\r\n }\r\n \r\n function getMapStorage() { \r\n \r\n var m = storage.getValueFromJson(storeKey) ||\r\n {\r\n centre: [452000, 314752],\r\n zoom: 0, \r\n overlays: {\r\n highway_authority: false,\r\n wards: false\r\n }\r\n };\r\n \r\n return m;\r\n }\r\n\r\n function saveMapStorage(mapStoreObj) {\r\n storage.setValue(storeKey, JSON.stringify(mapStoreObj));\r\n }\r\n\r\n function clear() {\r\n storage.clear(storeKey);\r\n }\r\n\r\n const debounce = (func, wait) => {\r\n let timeout;\r\n\r\n return function executedFunction(...args) {\r\n const later = () => {\r\n clearTimeout(timeout);\r\n func(...args);\r\n };\r\n\r\n clearTimeout(timeout);\r\n timeout = setTimeout(later, wait);\r\n };\r\n };\r\n\r\n return {\r\n init: init,\r\n initMap: initMap,\r\n settings: getMapStorage,\r\n isLayerVisible: isLayerVisible,\r\n onLayerVisibiltyChanged: onLayerVisibiltyChanged, \r\n saveMapStorage: saveMapStorage,\r\n clear: clear\r\n };\r\n}();","storage = function () {\r\n\r\n //remap to local var\r\n var store = localStorage;\r\n var sessionStore = sessionStorage;\r\n\r\n //returns true if HTML5 storage is present\r\n function canStore() {\r\n return typeof (Storage) !== \"undefined\";\r\n }\r\n\r\n //set a storage value\r\n function setValue(name, value) {\r\n if (canStore) {\r\n store[name] = value;\r\n }\r\n }\r\n\r\n function setSessionValue(name, value) {\r\n if (canStore) {\r\n sessionStore[name] = value;\r\n }\r\n }\r\n\r\n //get a value by name from the store\r\n function getValue(name) {\r\n if (canStore) {\r\n var val = store[name];\r\n return (typeof val === 'undefined') ? null : val;\r\n }\r\n return null;\r\n }\r\n\r\n function getSessionValue(name) {\r\n if (canStore) {\r\n var val = sessionStore[name];\r\n return (typeof val === 'undefined') ? null : val;\r\n }\r\n return null;\r\n }\r\n\r\n //get value from the store and parse it\r\n function getValueFromJson(name) {\r\n if (canStore) {\r\n if (store[name] != null) {\r\n return JSON.parse(store[name]);\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n function getSessionValueFromJson(name) {\r\n if (canStore) {\r\n if (sessionStore[name] != null) {\r\n return JSON.parse(sessionStore[name]);\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n function setArray(name, value) {\r\n if (canStore) {\r\n store[name] = JSON.stringify(value);\r\n }\r\n }\r\n\r\n function getArray(name) {\r\n if (canStore) {\r\n if (store[name] != null) {\r\n return JSON.parse(store[name]);\r\n }\r\n }\r\n return [];\r\n }\r\n\r\n function clearFromSession(name) {\r\n if (canStore) {\r\n sessionStore.removeItem(name);\r\n }\r\n }\r\n\r\n function clear(name) {\r\n if (canStore) {\r\n store.removeItem(name);\r\n }\r\n }\r\n\r\n return {\r\n setValue: setValue,\r\n setSessionValue: setSessionValue,\r\n getValue: getValue,\r\n getSessionValue: getSessionValue,\r\n clear: clear,\r\n clearFromSession: clearFromSession,\r\n getValueFromJson: getValueFromJson,\r\n getSessionValueFromJson: getSessionValueFromJson,\r\n getArray: getArray,\r\n setArray: setArray\r\n }\r\n\r\n}();\r\n\r\n"]}