{"version":3,"file":"maps.Dgp4ykjK.js","sources":["../Scripts/global/modules/map-inventory_wp.js","../Scripts/maps.js"],"sourcesContent":["import axios from 'axios';\r\nimport { locateStore } from'./gtmdata_wp';\r\nimport { scrollToTarget } from'../../utils';\r\n\r\nlet map;\r\nlet fs;\r\nlet filteredJsonInventory = [];\r\nconst inventoryShowAll = document.getElementById('inventoryShowAll');\r\nconst postalCodeInput = document.getElementById('inventoryPostnumber');\r\n\r\nconst ajax = axios.create({\r\n headers: {\r\n 'X-Requested-With': 'XMLHttpRequest'\r\n },\r\n});\r\n\r\nconst favourite = id => {\r\n if (fs == id) {\r\n return ' is-favourite';\r\n } else {\r\n return '';\r\n }\r\n};\r\n\r\nconst clearStore = (store) => {\r\n store.removeAttribute('checked');\r\n store.classList.remove('is-active');\r\n};\r\n\r\nconst resetFields = () => {\r\n inventoryShowAll.classList.remove('is-hidden');\r\n const inventoryPostnumber = document.getElementById('inventoryPostnumber');\r\n if (inventoryPostnumber) {\r\n inventoryPostnumber.classList.remove('invalid');\r\n }\r\n const inventoryNoHits = document.getElementById('inventoryNohits');\r\n if (inventoryNoHits) {\r\n inventoryNoHits.classList.add('is-hidden');\r\n }\r\n};\r\n\r\nconst updatePosition = () => {\r\n // User enters po-number\r\n const searchInput = document.getElementById('inventoryPostnumber').value;\r\n useMyLocationButton.forEach(el => {\r\n el.classList.remove('disabled');\r\n });\r\n\r\n // Define if search i text or PO number\r\n function searchQuery() {\r\n if (searchInput > 0 && searchInput < 9999) {\r\n return '?postalCode=' + searchInput;\r\n } else {\r\n return '?postalPlace=' + searchInput;\r\n }\r\n }\r\n\r\n // Generate url\r\n const postNordApiUrl = '/publicapi/findstore';\r\n const postNordQuery = searchQuery(searchInput);\r\n const postNordUrl = postNordApiUrl + postNordQuery;\r\n const inventoryPostnumber = document.getElementById('inventoryPostnumber');\r\n\r\n ajax.get(postNordUrl)\r\n .then(response => {\r\n if (response.status === 204) {\r\n // Handle 204 No Content response same way as 404 Not Found\r\n if (inventoryPostnumber) {\r\n inventoryPostnumber.classList.add('invalid');\r\n }\r\n filteredJsonInventory = [];\r\n updateMapList(59.9142366, 10.75309029999994, 1000);\r\n } else {\r\n if (inventoryPostnumber) {\r\n filteredJsonInventory = response.data;\r\n const lat = parseFloat(response.data[0].latitude);\r\n const long = parseFloat(response.data[0].longitude);\r\n mapInventory(\r\n lat,\r\n long,\r\n false,\r\n 1000,\r\n response.data,\r\n window.jsonInventory,\r\n );\r\n updateMapList(\r\n lat,\r\n long,\r\n 1000);\r\n }\r\n resetFields();\r\n }})\r\n .catch(e => {\r\n if (e && e.response && e.response.status === 404) {\r\n if (inventoryPostnumber) {\r\n inventoryPostnumber.classList.add('invalid');\r\n }\r\n filteredJsonInventory = [];\r\n updateMapList(59.9142366, 10.75309029999994, 1000);\r\n }\r\n });\r\n};\r\n\r\n// If less than 1km use meters\r\nconst distanceRounder = (located, dist) => {\r\n if (located && dist >= 1) {\r\n return parseFloat(dist).toFixed(2) + 'km';\r\n } else if (located && dist < 1) {\r\n return parseFloat(dist * 1000).toFixed(0) + 'm';\r\n } else {\r\n return '';\r\n }\r\n};\r\n\r\n// HTML list\r\n// Make class is-hidden in list if too far from user\r\nconst toofar = (radius, located, where) => {\r\n if (where > radius && located) {\r\n return 'is-hidden';\r\n } else {\r\n return 'is-visible';\r\n }\r\n};\r\n\r\nconst decodeEntities = encodedString => {\r\n const parser = new DOMParser;\r\n const dom = parser.parseFromString(\r\n '' + encodedString,\r\n 'text/html');\r\n return dom.body.textContent;\r\n};\r\n\r\nconst mapInventory = (userLat, userLng, located, accuracy, stores, jsonInventory, sortOnDistance = false) => {\r\n const storeItems = document.querySelectorAll('._js-inventory-store');\r\n if (window.google) {\r\n // Initial map setup\r\n let isInitial = true;\r\n if (storeItems.length > 0) {\r\n storeItems.forEach(el => {\r\n el.classList.add('is-hidden');\r\n });\r\n isInitial = false;\r\n }\r\n\r\n if (!isInitial) {\r\n document.querySelectorAll('._js-inventory-store').forEach(el => {\r\n el.remove();\r\n });\r\n }\r\n\r\n useMyLocationButton.forEach(el => {\r\n el.classList.remove('disabled');\r\n });\r\n\r\n const myLatLng = {lat: userLat, lng: userLng};\r\n const markers = [];\r\n const storeCounter = [];\r\n\r\n const radius = 20;\r\n\r\n // Make bounds to zoom map to correct position\r\n const bounds = new window.google.maps.LatLngBounds();\r\n const boundsAll = new window.google.maps.LatLngBounds();\r\n\r\n // Make infowindow displayed on markers\r\n let infowindow = new window.google.maps.InfoWindow();\r\n\r\n // Giving the map som options\r\n const mapOptions = {\r\n center: myLatLng,\r\n fullscreenControl: false,\r\n mapTypeControl: false,\r\n zoom: 2,\r\n maxZoom: 18,\r\n styles: [\r\n {\r\n 'featureType': 'poi.business',\r\n 'stylers': [\r\n {\r\n 'visibility': 'off'\r\n }\r\n ]\r\n }\r\n ]\r\n };\r\n\r\n if (map) {\r\n map = null;\r\n }\r\n // Creating the map\r\n const mapDiv = document.getElementById('mapInventory');\r\n if (mapDiv) {\r\n map = new window.google.maps.Map(document.getElementById('mapInventory'), mapOptions);\r\n }\r\n\r\n function currentStore(el) {\r\n const selectedStore = document.getElementById(el);\r\n if (selectedStore) {\r\n document.querySelectorAll('._js-inventory-store').forEach(store => {\r\n clearStore(store);\r\n });\r\n\r\n selectedStore.querySelector('input').setAttribute('checked', true);\r\n selectedStore.classList.add('is-active');\r\n }\r\n }\r\n\r\n // Click events\r\n // Adding a new click event listener for the object\r\n // In map\r\n function addClicker(marker, content, id) {\r\n window.google.maps.event.addListener(marker,\r\n 'click',\r\n function () {\r\n currentStore(id);\r\n const mq = window.matchMedia('(min-width: 64em)');\r\n if (mq.matches) {\r\n if (infowindow) {\r\n infowindow.close();\r\n }\r\n infowindow = new window.google.maps.InfoWindow({content: content});\r\n infowindow.open(map, marker);\r\n }\r\n map.setZoom(14);\r\n map.panTo(marker.position);\r\n document.getElementById('storeInventory').classList.add('has-store-selected');\r\n }\r\n );\r\n }\r\n\r\n let usersPositionMarker = null;\r\n function setUserPosition(lat, lng) {\r\n const currentLat = lat;\r\n const currentLng = lng;\r\n\r\n // Marker style\r\n const userPin = {\r\n path: window.google.maps.SymbolPath.CIRCLE,\r\n fillColor: '#507cec',\r\n fillOpacity: 1,\r\n scale: 7,\r\n strokeColor: 'white',\r\n strokeWeight: 2,\r\n anchor: new window.google.maps.Point(0, 0)\r\n };\r\n usersPositionMarker = new window.google.maps.Marker({\r\n map: map,\r\n position: new window.google.maps.LatLng(currentLat, currentLng),\r\n title: 'Deg',\r\n icon: userPin,\r\n zIndex: 1000,\r\n id:'usersPositionMarker'\r\n });\r\n markers.push(usersPositionMarker);\r\n const clicker = addClicker(usersPositionMarker,'Her er du');\r\n }\r\n\r\n //Set user postion\r\n if (located && accuracy < 300) {\r\n setUserPosition(userLat, userLng);\r\n }\r\n if (stores && stores.length > 0) {\r\n let objs = [].concat(stores).map((store) => {\r\n return { distance: getDistanceFromLatLonInKm(store.latitude, store.longitude, userLat, userLng), obj: store,\r\n };\r\n });\r\n \r\n if(sortOnDistance) {\r\n objs = objs.sort((a, b) => {\r\n return a.distance < b.distance ? -1 : 1;\r\n });\r\n }\r\n \r\n objs.forEach(({ distance, obj }) => {\r\n const sizes = ((jsonInventory || []).find(x => x.id === obj.id) || obj).sizes;\r\n\r\n const distanceRound = distanceRounder(located, distance);\r\n\r\n const fav = favourite(obj.id);\r\n const far = toofar(radius, located, distance);\r\n\r\n const HTMLid = String(obj.id);\r\n const HTMLtitle = '

' + obj.title + '

';\r\n const HTMLfav = '';\r\n const HTMLsizes = sizes ?\r\n '' :\r\n '';\r\n const HTMLadress = '

' +\r\n HTMLfav +\r\n obj.adress +\r\n '
' +\r\n obj.openinghours +\r\n '

';\r\n let HTMLphone = '';\r\n if (obj.tel && obj.tel.length > 0) {\r\n HTMLphone = 'Ring: ' +\r\n obj.tel +\r\n ' ';\r\n }\r\n const HTMLnav = 'Finn veien';\r\n\r\n const decodedTitle = decodeEntities(obj.title);\r\n\r\n // Content\r\n const contentString = '
' +\r\n '' +\r\n distanceRound +\r\n '' +\r\n HTMLtitle +\r\n HTMLadress +\r\n '
' +\r\n HTMLsizes +\r\n '
' +\r\n HTMLphone +\r\n HTMLnav +\r\n '
' +\r\n '
' +\r\n '' +\r\n '
';\r\n\r\n // Marker style\r\n const pin = {\r\n path:\r\n 'M14,2.6c-4.3,0-7.9,3.5-7.9,7.9c0,1.2,0.5,2.6,1.2,4.2c0.7,1.5,1.5,3.2,2.4,4.7c1.8,3.1,3.6,5.6,3.6,5.6l0.7,1l0.7-1c0,0,1.8-2.6,3.6-5.6c0.9-1.5,1.8-3.2,2.4-4.7c0.7-1.5,1.2-3,1.2-4.2C21.9,6.2,18.3,2.6,14,2.6z M14,14.3c-2.1,0-3.8-1.7-3.8-3.8c0-2.1,1.7-3.8,3.8-3.8s3.8,1.7,3.8,3.8C17.8,12.6,16.1,14.3,14,14.3z',\r\n fillColor: 'red',\r\n fillOpacity: 1,\r\n scale: 1.5,\r\n strokeColor: 'white',\r\n strokeWeight: 1,\r\n anchor: new window.google.maps.Point(15, 30)\r\n };\r\n\r\n // Marker style Favourite store\r\n const pinFav = {\r\n path:\r\n 'M19.3,11.7L9.9,22.1c-0.2,0.2-0.5,0.2-0.7,0l0,0l-9.4-10.4C-3,8.6-3,3.8-0.2,0.7c2.4-2.8,6.7-3.1,9.5-0.6c0.1,0.1,0.2,0.2,0.3,0.3c1.3-1.2,2.9-1.9,4.7-1.9c1.9,0,3.8,0.8,5.1,2.3C22,3.9,22,8.6,19.3,11.7z',\r\n fillColor: 'red',\r\n fillOpacity: 1,\r\n scale: 1,\r\n strokeColor: 'white',\r\n strokeWeight: 2,\r\n anchor: new window.google.maps.Point(15, 30)\r\n };\r\n\r\n // Decide if favourite store\r\n if (fs == obj.id) {\r\n // Adding a new marker for the object\r\n var marker = new window.google.maps.Marker({\r\n position: new window.google.maps.LatLng(obj.latitude, obj.longitude),\r\n icon: pinFav,\r\n map: map,\r\n infowindow: infowindow, // this works, giving the marker a title with the correct title,\r\n title: decodedTitle,\r\n id: HTMLid\r\n });\r\n\r\n // Push marker to markers list\r\n markers.push(marker);\r\n } else {\r\n // Adding a new marker for the object\r\n var marker = new window.google.maps.Marker({\r\n position: new window.google.maps.LatLng(obj.latitude, obj.longitude),\r\n icon: pin,\r\n map: map,\r\n infowindow: infowindow, // this works, giving the marker a title with the correct title,\r\n title: decodedTitle,\r\n id: HTMLid\r\n });\r\n\r\n // Push marker to markers list\r\n markers.push(marker);\r\n }\r\n\r\n // Adding a new info window for the object\r\n const clicker = addClicker(marker, contentString, HTMLid);\r\n\r\n // Add elements within 20km if located user to bounds\r\n if (distance < radius && located) {\r\n //Extend bound using items-position\r\n bounds.extend(new window.google.maps.LatLng(obj.latitude, obj.longitude));\r\n storeCounter.push(obj.id);\r\n } else if (distance < 3000 && !located) {\r\n boundsAll.extend(new window.google.maps.LatLng(obj.latitude, obj.longitude));\r\n } else if (located) {\r\n boundsAll.extend(new window.google.maps.LatLng(obj.latitude, obj.longitude));\r\n }\r\n\r\n // Add to html-list\r\n const HTMLlistItem = '
  • ' +\r\n contentString +\r\n '
  • ';\r\n\r\n const list = document.querySelector('._js-inventory-list');\r\n\r\n if (list) {\r\n list.insertAdjacentHTML('beforeend', HTMLlistItem);\r\n }\r\n });\r\n }\r\n\r\n if (map) {\r\n if (storeCounter.length > 0) {\r\n map.fitBounds(bounds);\r\n } else {\r\n map.fitBounds(boundsAll);\r\n }\r\n }\r\n\r\n document.querySelectorAll('._js-inventory-store').forEach(el => {\r\n el.addEventListener('click', e => {\r\n if (window.matchMedia('(max-width: 64em)').matches) {\r\n scrollToTarget('#mapInventory');\r\n }\r\n\r\n if (el && el.id) {\r\n const marker = markers.find(m => m.id === el.id);\r\n if (marker && map) {\r\n window.google.maps.event.trigger(marker, 'click');\r\n map.setZoom(14);\r\n map.panTo(marker.position);\r\n locateStore(marker.title);\r\n }\r\n }\r\n });\r\n });\r\n\r\n document.querySelectorAll('._js-fs-button').forEach(b => {\r\n b.addEventListener('click', e => {\r\n const targetElement = e.target;\r\n const favId = targetElement.value;\r\n\r\n document.querySelectorAll('.is-favourite').forEach(fav => {\r\n fav.classList.remove('is-favourite');\r\n });\r\n targetElement.classList.add('is-favourite');\r\n document.getElementById(favId).classList.add('is-favourite');\r\n setFavoriteStore(favId);\r\n });\r\n });\r\n }\r\n};\r\n\r\n// Changing postnumber (click on button or enter in input)\r\nconst postalCodeInputButton = document.getElementById('inventoryPostnumberButton');\r\nif (postalCodeInputButton) {\r\n postalCodeInputButton.addEventListener('click', updatePosition);\r\n}\r\n\r\nif (postalCodeInput) {\r\n postalCodeInput.addEventListener('keypress', e => {\r\n if (e.keyCode == 13) {\r\n updatePosition();\r\n }\r\n });\r\n}\r\n\r\n// Show all button\r\nif (inventoryShowAll) {\r\n const inventoryShowAllEvent = () => {\r\n updateMapList(59.9142366, 10.75309029999994, 1000);\r\n initialMap();\r\n inventoryShowAll.classList.add('is-hidden');\r\n postalCodeInput.value ='';\r\n };\r\n inventoryShowAll.addEventListener('click', inventoryShowAllEvent);\r\n}\r\n\r\nconst initialMap = () => {\r\n resetFields();\r\n mapInventory(59.9142366, 10.75309029999994, false, 10000, window.jsonInventory);\r\n inventoryShowAll.classList.add('is-hidden');\r\n};\r\n\r\nconst getFavoriteStore = () => ajax.get('/publicapi/findstore/getFavoriteStore/');\r\nconst setFavoriteStore = storeId => {\r\n const bodyFormData = new URLSearchParams();\r\n bodyFormData.append('', storeId);\r\n ajax({\r\n method: 'post', url: '/publicapi/findstore/setFavoriteStore/', data: bodyFormData, headers: {\r\n 'Content-Type': 'application/x-www-form-urlencoded'\r\n }\r\n });\r\n};\r\n\r\n// Updating the bounds of the map\r\nconst updateMapList = (updatedLat, updatedLng, updateRadius) => {\r\n document.querySelectorAll('._js-inventory-store').forEach(el => {\r\n clearStore(el);\r\n el.classList.add('is-hidden');\r\n });\r\n\r\n // Define new bounds\r\n const bounds = new window.google.maps.LatLngBounds();\r\n\r\n // Add user lnglat to bounds\r\n bounds.extend(new window.google.maps.LatLng(updatedLat, updatedLng));\r\n\r\n const storeCount = [];\r\n\r\n for (let i = 0; i < filteredJsonInventory.length; i++) {\r\n const obj = filteredJsonInventory[i];\r\n\r\n //Find distance in km\r\n const distance = getDistanceFromLatLonInKm(obj.latitude, obj.longitude, updatedLat, updatedLng);\r\n const storeElement = document.getElementById(obj.id);\r\n\r\n if (distance < updateRadius) {\r\n //Extend bound using items-position\r\n bounds.extend(new window.google.maps.LatLng(obj.latitude, obj.longitude));\r\n if (storeElement) {\r\n storeElement.classList.remove('is-hidden');\r\n }\r\n storeCount.push(obj.id); // Count number of stores within radius\r\n } else {\r\n if (storeElement) {\r\n storeElement.classList.remove('is-visible');\r\n storeElement.classList.add('is-hidden');\r\n }\r\n }\r\n }\r\n\r\n // Only fit bounds if any store hits\r\n if (storeCount.length > 0) {\r\n if (map) {\r\n // update bounds\r\n map.fitBounds(bounds);\r\n }\r\n document.getElementById('inventoryNohits').classList.add('is-hidden');\r\n document.getElementById('inventoryShowAll').classList.add('is-hidden');\r\n } else {\r\n document.getElementById('inventoryNohits').classList.remove('is-hidden');\r\n document.getElementById('inventoryShowAll').classList.remove('is-hidden');\r\n }\r\n};\r\n\r\n// Tools\r\n// **************************\r\n\r\nconst getDistanceFromLatLonInKm = (lat1, lon1, lat2, lon2) => {\r\n const R = 6371; // Radius of the earth in km\r\n const dLat = deg2rad(lat2 - lat1); // deg2rad below\r\n const dLon = deg2rad(lon2 - lon1);\r\n const a =\r\n Math.sin(dLat / 2) * Math.sin(dLat / 2) +\r\n Math.cos(deg2rad(lat1)) *\r\n Math.cos(deg2rad(lat2)) *\r\n Math.sin(dLon / 2) *\r\n Math.sin(dLon / 2);\r\n const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\r\n const d = R * c; // Distance in km\r\n return d;\r\n};\r\nconst useMyLocationButton = document.querySelectorAll('._js-use-my-location');\r\n\r\n\r\nconst deg2rad = deg => deg * (Math.PI / 180);\r\n\r\nexport const initMap = () => {\r\n getFavoriteStore()\r\n .then(response => {\r\n fs ='';\r\n if (response && response.data !== '') {\r\n fs = response.data;\r\n }\r\n initialMap();\r\n })\r\n .catch(error => {\r\n initialMap();\r\n //console.log(error)\r\n });\r\n\r\n function onGeolocateSuccess(pos) {\r\n if (navigator.geolocation) {\r\n const crd = pos.coords;\r\n mapInventory(crd.latitude,\r\n crd.longitude,\r\n true,\r\n crd.accuracy,\r\n window.jsonInventory,\r\n null,\r\n true,\r\n ); // True used to indicate if we actually have a user position\r\n resetFields();\r\n }\r\n }\r\n\r\n function onGeolocateError() {\r\n useMyLocationButton.forEach(el => {\r\n el.classList.add('disabled');\r\n });\r\n }\r\n\r\n useMyLocationButton.forEach(el => {\r\n el.addEventListener('click', e => {\r\n navigator.geolocation.getCurrentPosition(onGeolocateSuccess, onGeolocateError, { timeout: 5000 });\r\n });\r\n });\r\n};\r\n\r\n\r\nexport const init = () => {\r\n initMap();\r\n\r\n /* Trigger \"show all\" button if list remains empty after 2 seconds to avoid grey map */\r\n setTimeout(function () {\r\n if (document.querySelectorAll('._js-inventory-store').length == 0) {\r\n inventoryShowAll.click();\r\n }\r\n }, 2000);\r\n};\r\n","import * as mapInventory from \"./global/modules/map-inventory_wp\";\r\nmapInventory.init();\r\n"],"names":["map","fs","filteredJsonInventory","inventoryShowAll","postalCodeInput","ajax","axios","favourite","id","clearStore","store","resetFields","inventoryPostnumber","inventoryNoHits","updatePosition","searchInput","useMyLocationButton","el","searchQuery","postNordApiUrl","postNordQuery","postNordUrl","response","updateMapList","lat","long","mapInventory","e","distanceRounder","located","dist","toofar","radius","where","decodeEntities","encodedString","userLat","userLng","accuracy","stores","jsonInventory","sortOnDistance","storeItems","currentStore","selectedStore","addClicker","marker","content","infowindow","setUserPosition","lng","currentLat","currentLng","userPin","usersPositionMarker","markers","isInitial","myLatLng","storeCounter","bounds","boundsAll","mapOptions","objs","getDistanceFromLatLonInKm","b","distance","obj","sizes","x","distanceRound","fav","far","HTMLid","HTMLtitle","HTMLfav","HTMLsizes","HTMLadress","HTMLphone","HTMLnav","decodedTitle","contentString","pin","pinFav","HTMLlistItem","list","scrollToTarget","locateStore","targetElement","favId","setFavoriteStore","postalCodeInputButton","inventoryShowAllEvent","initialMap","getFavoriteStore","storeId","bodyFormData","updatedLat","updatedLng","updateRadius","storeCount","i","storeElement","lat1","lon1","lat2","lon2","dLat","deg2rad","dLon","a","deg","initMap","error","onGeolocateSuccess","pos","crd","onGeolocateError","init","mapInventory.init"],"mappings":"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"}