{"version":3,"file":"ol-geocoder.js","sources":["../konstants/index.js","../src/helpers/mix.js","../src/helpers/dom.js","../src/html.js","../src/providers/photon.js","../src/providers/osm.js","../src/providers/mapquest.js","../src/providers/bing.js","../src/providers/opencage.js","../src/helpers/ajax.js","../src/nominatim.js","../src/base.js"],"sourcesContent":["import * as _VARS_ from './vars.json';\n\nexport const VARS = _VARS_;\n\nexport const EVENT_TYPE = {\n ADDRESSCHOSEN: 'addresschosen',\n};\n\nexport const CONTROL_TYPE = {\n NOMINATIM: 'nominatim',\n REVERSE: 'reverse',\n};\n\nexport const TARGET_TYPE = {\n GLASS: 'glass-button',\n INPUT: 'text-input',\n};\n\nexport const FEATURE_SRC = '//cdn.rawgit.com/jonataswalker/map-utils/master/images/marker.png';\n\nexport const PROVIDERS = {\n OSM: 'osm',\n MAPQUEST: 'mapquest',\n PHOTON: 'photon',\n BING: 'bing',\n OPENCAGE: 'opencage',\n};\n\nexport const DEFAULT_OPTIONS = {\n provider: PROVIDERS.OSM,\n placeholder: 'Search for an address',\n featureStyle: null,\n targetType: TARGET_TYPE.GLASS,\n lang: 'en-US',\n limit: 5,\n keepOpen: false,\n preventDefault: false,\n autoComplete: false,\n autoCompleteMinLength: 2,\n autoCompleteTimeout: 200,\n debug: false,\n};\n","/**\n * Overwrites obj1's values with obj2's and adds\n * obj2's if non existent in obj1\n * @returns obj3 a new object based on obj1 and obj2\n */\nexport function mergeOptions(obj1, obj2) {\n const obj3 = {};\n\n for (const key in obj1) {\n if (Object.prototype.hasOwnProperty.call(obj1, key)) {\n obj3[key] = obj1[key];\n }\n }\n\n for (const key in obj2) {\n if (Object.prototype.hasOwnProperty.call(obj2, key)) {\n obj3[key] = obj2[key];\n }\n }\n\n return obj3;\n}\n\nexport function assert(condition, message = 'Assertion failed') {\n if (!condition) {\n if (typeof Error !== 'undefined') throw new Error(message);\n\n throw message; // Fallback\n }\n}\n\nexport function now() {\n // Polyfill for window.performance.now()\n // @license http://opensource.org/licenses/MIT\n // copyright Paul Irish 2015\n // https://gist.github.com/paulirish/5438650\n if ('performance' in window === false) {\n window.performance = {};\n }\n\n if ('now' in window.performance === false) {\n let nowOffset = Date.now();\n\n if (performance.timing && performance.timing.navigationStart) {\n nowOffset = performance.timing.navigationStart;\n }\n\n window.performance.now = () => Date.now() - nowOffset;\n }\n\n return window.performance.now();\n}\n\nexport function flyTo(map, coord, duration = 500, resolution = 2.388657133911758) {\n map.getView().animate({ duration, resolution }, { duration, center: coord });\n}\n\nexport function randomId(prefix) {\n const id = now().toString(36);\n\n return prefix ? prefix + id : id;\n}\n\nexport function isNumeric(str) {\n return /^\\d+$/u.test(str);\n}\n\nexport function isEmpty(str) {\n return !str || str.length === 0;\n}\n\nexport function emptyArray(array) {\n while (array.length) array.pop();\n}\n\nexport function anyMatchInArray(source, target) {\n return source.some((each) => target.includes(each));\n}\n\nexport function everyMatchInArray(arr1, arr2) {\n return arr2.every((each) => arr1.includes(each));\n}\n\nexport function anyItemHasValue(obj, has = false) {\n const keys = Object.keys(obj);\n\n keys.forEach((key) => {\n if (!isEmpty(obj[key])) has = true;\n });\n\n return has;\n}\n","/* eslint-disable optimize-regex/optimize-regex */\n/* eslint-disable prefer-named-capture-group */\nimport { isNumeric } from './mix';\n\n/**\n * @param {Element|Array} element DOM node or array of nodes.\n * @param {String|Array} classname Class or array of classes.\n * For example: 'class1 class2' or ['class1', 'class2']\n * @param {Number|undefined} timeout Timeout to remove a class.\n */\nexport function addClass(element, classname, timeout) {\n if (Array.isArray(element)) {\n element.forEach((each) => addClass(each, classname));\n\n return;\n }\n\n const array = Array.isArray(classname) ? classname : classname.split(/\\s+/u);\n\n let i = array.length;\n\n while (i--) {\n if (!hasClass(element, array[i])) {\n _addClass(element, array[i], timeout);\n }\n }\n}\n\n/**\n * @param {Element|Array} element DOM node or array of nodes.\n * @param {String|Array} classname Class or array of classes.\n * For example: 'class1 class2' or ['class1', 'class2']\n * @param {Number|undefined} timeout Timeout to add a class.\n */\nexport function removeClass(element, classname, timeout) {\n if (Array.isArray(element)) {\n element.forEach((each) => removeClass(each, classname, timeout));\n\n return;\n }\n\n const array = Array.isArray(classname) ? classname : classname.split(/\\s+/u);\n\n let i = array.length;\n\n while (i--) {\n if (hasClass(element, array[i])) {\n _removeClass(element, array[i], timeout);\n }\n }\n}\n\n/**\n * @param {Element} element DOM node.\n * @param {String} classname Classname.\n * @return {Boolean}\n */\nexport function hasClass(element, c) {\n // use native if available\n return element.classList ? element.classList.contains(c) : classRegex(c).test(element.className);\n}\n\n/**\n * @param {Element|Array} element DOM node or array of nodes.\n * @param {String} classname Classe.\n */\nexport function toggleClass(element, classname) {\n if (Array.isArray(element)) {\n element.forEach((each) => toggleClass(each, classname));\n\n return;\n }\n\n // use native if available\n if (element.classList) {\n element.classList.toggle(classname);\n } else {\n hasClass(element, classname) ? _removeClass(element, classname) : _addClass(element, classname);\n }\n}\n\n/**\n * Abstraction to querySelectorAll for increased\n * performance and greater usability\n * @param {String} selector\n * @param {Element} context (optional)\n * @param {Boolean} findAll (optional)\n * @return (findAll) {Element} : {Array}\n */\nexport function $(id) {\n id = id[0] === '#' ? id.slice(1, 1 + id.length) : id;\n\n return document.getElementById(id);\n}\n\nexport function isElement(obj) {\n // DOM, Level2\n if ('HTMLElement' in window) {\n return !!obj && obj instanceof HTMLElement;\n }\n\n // Older browsers\n return !!obj && typeof obj === 'object' && obj.nodeType === 1 && !!obj.nodeName;\n}\n\nexport function getAllChildren(node, tag) {\n return [].slice.call(node.getElementsByTagName(tag));\n}\n\nexport function removeAllChildren(node) {\n while (node.firstChild) node.firstChild.remove();\n}\n\nexport function removeAll(collection) {\n let node;\n\n while ((node = collection[0])) node.remove();\n}\n\nexport function getChildren(node, tag) {\n return [].filter.call(node.childNodes, (el) =>\n tag ? el.nodeType === 1 && el.tagName.toLowerCase() === tag : el.nodeType === 1\n );\n}\n\nexport function template(html, row) {\n return html.replace(/\\{\\s*([\\w-]+)\\s*\\}/gu, (htm, key) => {\n const value = row[key] === undefined ? '' : row[key];\n\n return htmlEscape(value);\n });\n}\n\nexport function htmlEscape(str) {\n return String(str)\n .replaceAll('&', '&')\n .replaceAll('<', '<')\n .replaceAll('>', '>')\n .replaceAll('\"', '"')\n .replaceAll(\"'\", ''');\n}\n\nexport function createElement(node, html) {\n let elem;\n\n if (Array.isArray(node)) {\n elem = document.createElement(node[0]);\n\n if (node[1].id) elem.id = node[1].id;\n\n if (node[1].classname) elem.className = node[1].classname;\n\n if (node[1].attr) {\n const { attr } = node[1];\n\n if (Array.isArray(attr)) {\n let i = -1;\n\n while (++i < attr.length) {\n elem.setAttribute(attr[i].name, attr[i].value);\n }\n } else {\n elem.setAttribute(attr.name, attr.value);\n }\n }\n } else {\n elem = document.createElement(node);\n }\n\n elem.innerHTML = html;\n\n const frag = document.createDocumentFragment();\n\n while (elem.childNodes[0]) frag.append(elem.childNodes[0]);\n\n elem.append(frag);\n\n return elem;\n}\n\nfunction classRegex(classname) {\n // eslint-disable-next-line security/detect-non-literal-regexp\n return new RegExp(`(^|\\\\s+) ${classname} (\\\\s+|$)`, 'u');\n}\n\nfunction _addClass(el, klass, timeout) {\n // use native if available\n if (el.classList) {\n el.classList.add(klass);\n } else {\n el.className = `${el.className} ${klass}`.trim();\n }\n\n if (timeout && isNumeric(timeout)) {\n window.setTimeout(() => _removeClass(el, klass), timeout);\n }\n}\n\nfunction _removeClass(el, klass, timeout) {\n if (el.classList) {\n el.classList.remove(klass);\n } else {\n el.className = el.className.replace(classRegex(klass), ' ').trim();\n }\n\n if (timeout && isNumeric(timeout)) {\n window.setTimeout(() => _addClass(el, klass), timeout);\n }\n}\n","import { VARS, TARGET_TYPE } from '../konstants';\n\nimport { createElement } from './helpers/dom';\n\nconst klasses = VARS.cssClasses;\n\n/**\n * @class Html\n */\nexport class Html {\n /**\n * @constructor\n * @param {Function} base Base class.\n */\n constructor(base) {\n this.options = base.options;\n this.els = this.createControl();\n }\n\n createControl() {\n let container;\n let containerClass;\n let elements;\n\n if (this.options.targetType === TARGET_TYPE.INPUT) {\n containerClass = `${klasses.namespace} ${klasses.inputText.container}`;\n container = createElement(\n ['div', { id: VARS.containerId, classname: containerClass }],\n Html.input\n );\n elements = {\n container,\n control: container.querySelector(`.${klasses.inputText.control}`),\n input: container.querySelector(`.${klasses.inputText.input}`),\n reset: container.querySelector(`.${klasses.inputText.reset}`),\n result: container.querySelector(`.${klasses.inputText.result}`),\n };\n } else {\n containerClass = `${klasses.namespace} ${klasses.glass.container}`;\n container = createElement(\n ['div', { id: VARS.containerId, classname: containerClass }],\n Html.glass\n );\n elements = {\n container,\n control: container.querySelector(`.${klasses.glass.control}`),\n button: container.querySelector(`.${klasses.glass.button}`),\n input: container.querySelector(`.${klasses.glass.input}`),\n reset: container.querySelector(`.${klasses.glass.reset}`),\n result: container.querySelector(`.${klasses.glass.result}`),\n };\n }\n\n // set placeholder from options\n elements.input.placeholder = this.options.placeholder;\n\n return elements;\n }\n}\n\nHtml.glass = `\n
\n \n \n \n
\n
    \n`;\n\nHtml.input = `\n
    \n \n \n \n
    \n
      \n`;\n","/**\n * @class Photon\n */\nexport class Photon {\n /**\n * @constructor\n */\n constructor() {\n this.settings = {\n url: 'https://photon.komoot.io/api/',\n\n params: {\n q: '',\n limit: 10,\n lang: 'en',\n },\n\n langs: ['de', 'it', 'fr', 'en'],\n };\n }\n\n getParameters(options) {\n options.lang = options.lang.toLowerCase();\n\n return {\n url: this.settings.url,\n\n params: {\n q: options.query,\n limit: options.limit || this.settings.params.limit,\n\n lang: this.settings.langs.includes(options.lang) ? options.lang : this.settings.params.lang,\n },\n };\n }\n\n handleResponse(results) {\n if (results.features.length === 0) return [];\n\n return results.features.map((result) => ({\n lon: result.geometry.coordinates[0],\n lat: result.geometry.coordinates[1],\n\n address: {\n name: result.properties.name,\n postcode: result.properties.postcode,\n city: result.properties.city,\n state: result.properties.state,\n country: result.properties.country,\n },\n\n original: {\n formatted: result.properties.name,\n details: result.properties,\n },\n }));\n }\n}\n","/**\n * @class OpenStreet\n */\nexport class OpenStreet {\n /**\n * @constructor\n */\n constructor() {\n this.settings = {\n url: 'https://nominatim.openstreetmap.org/search/',\n\n params: {\n q: '',\n format: 'json',\n addressdetails: 1,\n limit: 10,\n countrycodes: '',\n 'accept-language': 'en-US',\n },\n };\n }\n\n getParameters(opt) {\n return {\n url: this.settings.url,\n\n params: {\n q: opt.query,\n format: this.settings.params.format,\n addressdetails: this.settings.params.addressdetails,\n limit: opt.limit || this.settings.params.limit,\n countrycodes: opt.countrycodes || this.settings.params.countrycodes,\n 'accept-language': opt.lang || this.settings.params['accept-language'],\n },\n };\n }\n\n handleResponse(results) {\n if (results.length === 0) return [];\n\n return results.map((result) => ({\n lon: result.lon,\n lat: result.lat,\n bbox: result.boundingbox,\n\n address: {\n name: result.display_name,\n road: result.address.road || '',\n houseNumber: result.address.house_number || '',\n postcode: result.address.postcode,\n city: result.address.city || result.address.town,\n state: result.address.state,\n country: result.address.country,\n },\n\n original: {\n formatted: result.display_name,\n details: result.address,\n },\n }));\n }\n}\n","/**\n * @class MapQuest\n */\nexport class MapQuest {\n /**\n * @constructor\n */\n constructor() {\n this.settings = {\n url: 'https://open.mapquestapi.com/nominatim/v1/search.php',\n\n params: {\n q: '',\n key: '',\n format: 'json',\n addressdetails: 1,\n limit: 10,\n countrycodes: '',\n 'accept-language': 'en-US',\n },\n };\n }\n\n getParameters(options) {\n return {\n url: this.settings.url,\n\n params: {\n q: options.query,\n key: options.key,\n format: 'json',\n addressdetails: 1,\n limit: options.limit || this.settings.params.limit,\n countrycodes: options.countrycodes || this.settings.params.countrycodes,\n\n 'accept-language': options.lang || this.settings.params['accept-language'],\n },\n };\n }\n\n handleResponse(results) {\n if (results.length === 0) return [];\n\n return results.map((result) => ({\n lon: result.lon,\n lat: result.lat,\n\n address: {\n name: result.address.neighbourhood || '',\n road: result.address.road || '',\n postcode: result.address.postcode,\n city: result.address.city || result.address.town,\n state: result.address.state,\n country: result.address.country,\n },\n\n original: {\n formatted: result.display_name,\n details: result.address,\n },\n }));\n }\n}\n","/**\n * @class Bing\n */\nexport class Bing {\n /**\n * @constructor\n */\n constructor() {\n this.settings = {\n url: 'https://dev.virtualearth.net/REST/v1/Locations',\n callbackName: 'jsonp',\n\n params: {\n query: '',\n key: '',\n includeNeighborhood: 0,\n maxResults: 10,\n },\n };\n }\n\n getParameters(options) {\n return {\n url: this.settings.url,\n callbackName: this.settings.callbackName,\n\n params: {\n query: options.query,\n key: options.key,\n\n includeNeighborhood:\n options.includeNeighborhood || this.settings.params.includeNeighborhood,\n\n maxResults: options.maxResults || this.settings.params.maxResults,\n },\n };\n }\n\n handleResponse(results) {\n const { resources } = results.resourceSets[0];\n\n if (resources.length === 0) return [];\n\n return resources.map((result) => ({\n lon: result.point.coordinates[1],\n lat: result.point.coordinates[0],\n\n address: {\n name: result.name,\n },\n\n original: {\n formatted: result.address.formattedAddress,\n details: result.address,\n },\n }));\n }\n}\n","/**\n * @class OpenCage\n */\nexport class OpenCage {\n /**\n * @constructor\n */\n constructor() {\n this.settings = {\n url: 'https://api.opencagedata.com/geocode/v1/json?',\n\n params: {\n q: '',\n key: '',\n limit: 10,\n countrycode: '',\n pretty: 1,\n no_annotations: 1,\n },\n };\n }\n\n getParameters(options) {\n return {\n url: this.settings.url,\n\n params: {\n q: options.query,\n key: options.key,\n limit: options.limit || this.settings.params.limit,\n countrycode: options.countrycodes || this.settings.params.countrycodes,\n },\n };\n }\n\n handleResponse(results) {\n if (results.results.length === 0) return [];\n\n return results.results.map((result) => ({\n lon: result.geometry.lng,\n lat: result.geometry.lat,\n\n address: {\n name: result.components.house_number || '',\n road: result.components.road || '',\n postcode: result.components.postcode,\n city: result.components.city || result.components.town,\n state: result.components.state,\n country: result.components.country,\n },\n\n original: {\n formatted: result.formatted,\n details: result.components,\n },\n }));\n }\n}\n","export function json(obj) {\n return new Promise((resolve, reject) => {\n const url = encodeUrlXhr(obj.url, obj.data);\n const config = {\n method: 'GET',\n mode: 'cors',\n credentials: 'same-origin',\n };\n\n if (obj.jsonp) {\n jsonp(url, obj.callbackName, resolve);\n } else {\n fetch(url, config)\n .then((r) => r.json())\n .then(resolve)\n .catch(reject);\n }\n });\n}\n\nfunction toQueryString(obj) {\n return Object.keys(obj)\n .reduce((acc, k) => {\n acc.push(\n typeof obj[k] === 'object'\n ? toQueryString(obj[k])\n : `${encodeURIComponent(k)}=${encodeURIComponent(obj[k])}`\n );\n\n return acc;\n }, [])\n .join('&');\n}\n\nfunction encodeUrlXhr(url, data) {\n if (data && typeof data === 'object') {\n url += (/\\?/u.test(url) ? '&' : '?') + toQueryString(data);\n }\n\n return url;\n}\n\nfunction jsonp(url, key, callback) {\n // https://github.com/Fresheyeball/micro-jsonp/blob/master/src/jsonp.js\n const { head } = document;\n const script = document.createElement('script');\n // generate minimally unique name for callback function\n const callbackName = `f${Math.round(Math.random() * Date.now())}`;\n\n // set request url\n script.setAttribute(\n 'src',\n // add callback parameter to the url\n // where key is the parameter key supplied\n // and callbackName is the parameter value\n `${url + (url.indexOf('?') > 0 ? '&' : '?') + key}=${callbackName}`\n );\n\n // place jsonp callback on window,\n // the script sent by the server should call this\n // function as it was passed as a url parameter\n window[callbackName] = (data) => {\n window[callbackName] = undefined;\n\n // clean up script tag created for request\n setTimeout(() => head.removeChild(script), 0);\n\n // hand data back to the user\n callback(data);\n };\n\n // actually make the request\n head.append(script);\n}\n","import LayerVector from 'ol/layer/Vector';\nimport SourceVector from 'ol/source/Vector';\nimport Point from 'ol/geom/Point';\nimport Feature from 'ol/Feature';\nimport proj from 'ol/proj';\n\nimport { VARS, TARGET_TYPE, PROVIDERS, EVENT_TYPE } from '../konstants';\n\nimport {\n hasClass,\n addClass,\n removeClass,\n createElement,\n template,\n removeAllChildren,\n} from './helpers/dom';\nimport { Photon } from './providers/photon';\nimport { OpenStreet } from './providers/osm';\nimport { MapQuest } from './providers/mapquest';\nimport { Bing } from './providers/bing';\nimport { OpenCage } from './providers/opencage';\nimport { randomId, flyTo } from './helpers/mix';\nimport { json } from './helpers/ajax';\n\nconst klasses = VARS.cssClasses;\n\n/**\n * @class Nominatim\n */\nexport class Nominatim {\n /**\n * @constructor\n * @param {Function} base Base class.\n */\n constructor(base, els) {\n this.Base = base;\n\n this.layerName = randomId('geocoder-layer-');\n this.layer = new LayerVector({\n name: this.layerName,\n source: new SourceVector(),\n });\n\n this.options = base.options;\n // provider is either the name of a built-in provider as a string or an\n // object that implements the provider API\n this.options.provider =\n typeof this.options.provider === 'string'\n ? this.options.provider.toLowerCase()\n : this.options.provider;\n this.provider = this.newProvider();\n\n this.els = els;\n this.lastQuery = '';\n this.container = this.els.container;\n this.registeredListeners = { mapClick: false };\n this.setListeners();\n }\n\n setListeners() {\n let timeout;\n let lastQuery;\n\n const openSearch = (evt) => {\n evt.stopPropagation();\n\n hasClass(this.els.control, klasses.glass.expanded) ? this.collapse() : this.expand();\n };\n const query = (evt) => {\n const value = evt.target.value.trim();\n const hit = evt.key\n ? evt.key === 'Enter'\n : evt.which\n ? evt.which === 13\n : evt.keyCode\n ? evt.keyCode === 13\n : false;\n\n if (hit) {\n evt.preventDefault();\n this.query(value);\n }\n };\n // eslint-disable-next-line unicorn/consistent-function-scoping\n const stopBubbling = (evt) => evt.stopPropagation();\n const reset = (evt) => {\n this.els.input.focus();\n this.els.input.value = '';\n this.lastQuery = '';\n addClass(this.els.reset, klasses.hidden);\n this.clearResults();\n };\n const handleValue = (evt) => {\n const value = evt.target.value.trim();\n\n value.length !== 0\n ? removeClass(this.els.reset, klasses.hidden)\n : addClass(this.els.reset, klasses.hidden);\n\n if (this.options.autoComplete && value !== lastQuery) {\n lastQuery = value;\n timeout && clearTimeout(timeout);\n timeout = setTimeout(() => {\n if (value.length >= this.options.autoCompleteMinLength) {\n this.query(value);\n }\n }, this.options.autoCompleteTimeout);\n }\n };\n\n this.els.input.addEventListener('keypress', query, false);\n this.els.input.addEventListener('click', stopBubbling, false);\n this.els.input.addEventListener('input', handleValue, false);\n this.els.reset.addEventListener('click', reset, false);\n\n if (this.options.targetType === TARGET_TYPE.GLASS) {\n this.els.button.addEventListener('click', openSearch, false);\n }\n }\n\n query(q) {\n // lazy provider\n if (!this.provider) {\n this.provider = this.newProvider();\n }\n\n const parameters = this.provider.getParameters({\n query: q,\n key: this.options.key,\n lang: this.options.lang,\n countrycodes: this.options.countrycodes,\n limit: this.options.limit,\n });\n\n if (this.lastQuery === q && this.els.result.firstChild) return;\n\n this.lastQuery = q;\n this.clearResults();\n addClass(this.els.reset, klasses.spin);\n\n const ajax = {\n url: parameters.url,\n data: parameters.params,\n };\n\n if (parameters.callbackName) {\n ajax.jsonp = true;\n ajax.callbackName = parameters.callbackName;\n }\n\n json(ajax)\n .then((res) => {\n // eslint-disable-next-line no-console\n this.options.debug && console.info(res);\n\n removeClass(this.els.reset, klasses.spin);\n\n // will be fullfiled according to provider\n const res_ = this.provider.handleResponse(res);\n\n if (res_) {\n this.createList(res_);\n this.listenMapClick();\n }\n })\n .catch((err) => {\n removeClass(this.els.reset, klasses.spin);\n\n const li = createElement('li', '
      Error! No internet connection?
      ');\n\n this.els.result.append(li);\n });\n }\n\n createList(response) {\n const ul = this.els.result;\n\n response.forEach((row) => {\n let addressHtml;\n\n switch (this.options.provider) {\n case PROVIDERS.OSM:\n addressHtml = `${row.address.name}`;\n\n break;\n\n default:\n addressHtml = this.addressTemplate(row.address);\n }\n\n const html = `${addressHtml}`;\n const li = createElement('li', html);\n\n li.addEventListener(\n 'click',\n (evt) => {\n evt.preventDefault();\n this.chosen(row, addressHtml, row.address, row.original);\n },\n false\n );\n\n ul.append(li);\n });\n }\n\n chosen(place, addressHtml, addressObj, addressOriginal) {\n const map = this.Base.getMap();\n const coord_ = [Number.parseFloat(place.lon), Number.parseFloat(place.lat)];\n const projection = map.getView().getProjection();\n const coord = proj.transform(coord_, 'EPSG:4326', projection);\n\n let { bbox } = place;\n\n if (bbox) {\n bbox = proj.transformExtent(\n [bbox[2], bbox[1], bbox[3], bbox[0]], // NSWE -> WSEN\n 'EPSG:4326',\n projection\n );\n }\n\n const address = {\n formatted: addressHtml,\n details: addressObj,\n original: addressOriginal,\n };\n\n this.options.keepOpen === false && this.clearResults(true);\n\n if (this.options.preventDefault === true) {\n this.Base.dispatchEvent({\n type: EVENT_TYPE.ADDRESSCHOSEN,\n address,\n coordinate: coord,\n bbox,\n place,\n });\n } else {\n if (bbox) {\n map.getView().fit(bbox, { duration: 500 });\n } else {\n flyTo(map, coord);\n }\n\n const feature = this.createFeature(coord, address);\n\n this.Base.dispatchEvent({\n type: EVENT_TYPE.ADDRESSCHOSEN,\n address,\n feature,\n coordinate: coord,\n bbox,\n place,\n });\n }\n }\n\n createFeature(coord) {\n const feature = new Feature(new Point(coord));\n\n this.addLayer();\n feature.setStyle(this.options.featureStyle);\n feature.setId(randomId('geocoder-ft-'));\n this.getSource().addFeature(feature);\n\n return feature;\n }\n\n addressTemplate(address) {\n const html = [];\n\n if (address.name) {\n html.push(['{name}'].join(''));\n }\n\n if (address.road || address.building || address.house_number) {\n html.push(\n ['{building} {road} {house_number}'].join('')\n );\n }\n\n if (address.city || address.town || address.village) {\n html.push(\n ['{postcode} {city} {town} {village}'].join('')\n );\n }\n\n if (address.state || address.country) {\n html.push(['{state} {country}'].join(''));\n }\n\n return template(html.join('
      '), address);\n }\n\n newProvider() {\n switch (this.options.provider) {\n case PROVIDERS.OSM:\n return new OpenStreet();\n case PROVIDERS.MAPQUEST:\n return new MapQuest();\n case PROVIDERS.PHOTON:\n return new Photon();\n case PROVIDERS.BING:\n return new Bing();\n case PROVIDERS.OPENCAGE:\n return new OpenCage();\n\n default:\n return this.options.provider;\n }\n }\n\n expand() {\n removeClass(this.els.input, klasses.spin);\n addClass(this.els.control, klasses.glass.expanded);\n window.setTimeout(() => this.els.input.focus(), 100);\n this.listenMapClick();\n }\n\n collapse() {\n this.els.input.value = '';\n this.els.input.blur();\n addClass(this.els.reset, klasses.hidden);\n removeClass(this.els.control, klasses.glass.expanded);\n this.clearResults();\n }\n\n listenMapClick() {\n // already registered\n if (this.registeredListeners.mapClick) return;\n\n const that = this;\n const mapElement = this.Base.getMap().getTargetElement();\n\n this.registeredListeners.mapClick = true;\n\n // one-time fire click\n mapElement.addEventListener(\n 'click',\n {\n handleEvent(evt) {\n that.clearResults(true);\n mapElement.removeEventListener(evt.type, this, false);\n that.registeredListeners.mapClick = false;\n },\n },\n false\n );\n }\n\n clearResults(collapse) {\n collapse && this.options.targetType === TARGET_TYPE.GLASS\n ? this.collapse()\n : removeAllChildren(this.els.result);\n }\n\n getSource() {\n return this.layer.getSource();\n }\n\n addLayer() {\n let found = false;\n\n const map = this.Base.getMap();\n\n map.getLayers().forEach((layer) => {\n if (layer === this.layer) found = true;\n });\n\n if (!found) map.addLayer(this.layer);\n }\n}\n","import Control from 'ol/control/Control';\nimport Style from 'ol/style/Style';\nimport Icon from 'ol/style/Icon';\n\nimport { CONTROL_TYPE, DEFAULT_OPTIONS, FEATURE_SRC } from '../konstants';\n\nimport { Html } from './html';\nimport { Nominatim } from './nominatim';\nimport { assert, mergeOptions } from './helpers/mix';\n\n/**\n * @class Base\n * @extends {ol.control.Control}\n */\nexport default class Base extends Control {\n /**\n * @constructor\n * @param {string} type nominatim|reverse.\n * @param {object} options Options.\n */\n constructor(type = CONTROL_TYPE.NOMINATIM, options = {}) {\n if (!(this instanceof Base)) return new Base();\n\n assert(typeof type === 'string', '@param `type` should be string!');\n assert(\n type === CONTROL_TYPE.NOMINATIM || type === CONTROL_TYPE.REVERSE,\n `@param 'type' should be '${CONTROL_TYPE.NOMINATIM}'\n or '${CONTROL_TYPE.REVERSE}'!`\n );\n assert(typeof options === 'object', '@param `options` should be object!');\n\n DEFAULT_OPTIONS.featureStyle = [\n new Style({ image: new Icon({ scale: 0.7, src: FEATURE_SRC }) }),\n ];\n\n this.options = mergeOptions(DEFAULT_OPTIONS, options);\n this.container = undefined;\n\n let $nominatim;\n\n const $html = new Html(this);\n\n if (type === CONTROL_TYPE.NOMINATIM) {\n this.container = $html.els.container;\n $nominatim = new Nominatim(this, $html.els);\n this.layer = $nominatim.layer;\n }\n\n super({ element: this.container });\n }\n\n /**\n * @return {ol.layer.Vector} Returns the layer created by this control\n */\n getLayer() {\n return this.layer;\n }\n\n /**\n * @return {ol.source.Vector} Returns the source created by this control\n */\n getSource() {\n return this.getLayer().getSource();\n }\n\n /**\n * Set a new provider\n * @param {String} provider\n */\n setProvider(provider) {\n this.options.provider = provider;\n }\n\n /**\n * Set provider key\n * @param {String} key\n */\n setProviderKey(key) {\n this.options.key = key;\n }\n}\n"],"names":["VARS","EVENT_TYPE","CONTROL_TYPE","TARGET_TYPE","PROVIDERS","DEFAULT_OPTIONS","provider","placeholder","featureStyle","targetType","lang","limit","keepOpen","preventDefault","autoComplete","autoCompleteMinLength","autoCompleteTimeout","debug","assert","condition","message","Error","randomId","prefix","const","id","window","performance","let","nowOffset","Date","now","timing","navigationStart","toString","isNumeric","str","test","addClass","element","classname","timeout","Array","isArray","forEach","each","array","split","i","length","hasClass","_addClass","removeClass","_removeClass","c","classList","contains","classRegex","className","template","html","row","replace","htm","key","value","undefined","String","replaceAll","createElement","node","elem","document","attr","setAttribute","name","innerHTML","frag","createDocumentFragment","childNodes","append","RegExp","el","klass","add","trim","setTimeout","remove","klasses","cssClasses","Html","base","this","options","els","createControl","container","containerClass","elements","inputText","containerId","input","control","querySelector","reset","result","glass","button","Photon","settings","url","params","q","langs","getParameters","toLowerCase","query","includes","handleResponse","results","features","map","lon","geometry","coordinates","lat","address","properties","postcode","city","state","country","original","formatted","details","OpenStreet","format","addressdetails","countrycodes","accept-language","opt","bbox","boundingbox","display_name","road","houseNumber","house_number","town","MapQuest","neighbourhood","Bing","callbackName","includeNeighborhood","maxResults","resourceSets","resources","point","formattedAddress","OpenCage","countrycode","pretty","no_annotations","json","obj","Promise","resolve","reject","data","toQueryString","encodeUrlXhr","jsonp","callback","script","Math","round","random","indexOf","head","removeChild","fetch","method","mode","credentials","then","r","catch","Object","keys","reduce","acc","k","push","encodeURIComponent","join","lng","components","Nominatim","Base","layerName","layer","LayerVector","source","SourceVector","newProvider","lastQuery","registeredListeners","mapClick","setListeners","addEventListener","evt","target","which","keyCode","stopPropagation","hidden","clearTimeout","focus","clearResults","expanded","collapse","expand","parameters","firstChild","spin","ajax","res","console","info","res_","createList","listenMapClick","err","li","response","ul","addressHtml","addressTemplate","chosen","place","addressObj","addressOriginal","getMap","coord_","Number","parseFloat","projection","getView","getProjection","coord","proj","transform","transformExtent","dispatchEvent","type","coordinate","fit","duration","resolution","animate","center","flyTo","feature","createFeature","Feature","Point","addLayer","setStyle","setId","getSource","addFeature","building","village","blur","that","mapElement","getTargetElement","handleEvent","removeEventListener","removeAllChildren","found","getLayers","$nominatim","Style","image","Icon","scale","src","obj1","obj2","obj3","prototype","hasOwnProperty","call","mergeOptions","$html","super","getLayer","setProvider","setProviderKey","Control"],"mappings":"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"}