{"version":3,"file":"esri-leaflet-geocoder.js","sources":["../package.json","../src/Tasks/Geocode.js","../src/Tasks/ReverseGeocode.js","../src/Tasks/Suggest.js","../src/Services/Geocode.js","../src/Classes/GeosearchCore.js","../src/Providers/ArcgisOnlineGeocoder.js","../src/Controls/Geosearch.js","../src/Providers/FeatureLayer.js","../src/Providers/MapService.js","../src/Providers/GeocodeService.js","../src/EsriLeafletGeocoding.js"],"sourcesContent":["{\n \"name\": \"esri-leaflet-geocoder\",\n \"description\": \"Esri Geocoding utility and search plugin for Leaflet.\",\n \"version\": \"2.2.9\",\n \"author\": \"Patrick Arlt <parlt@esri.com> (http://patrickarlt.com)\",\n \"contributors\": [\n \"Patrick Arlt <parlt@esri.com> (http://patrickarlt.com)\",\n \"John Gravois <jgravois@esri.com> (http://johngravois.com)\"\n ],\n \"dependencies\": {\n \"esri-leaflet\": \"^2.0.3\",\n \"leaflet\": \"^1.0.0\"\n },\n \"devDependencies\": {\n \"chai\": \"3.5.0\",\n \"gh-release\": \"^2.0.0\",\n \"http-server\": \"^0.10.0\",\n \"imagemin\": \"^3.2.0\",\n \"isparta\": \"^4.0.0\",\n \"istanbul\": \"^0.4.2\",\n \"karma\": \"^1.3.0\",\n \"karma-chai-sinon\": \"^0.1.3\",\n \"karma-chrome-launcher\": \"^2.2.0\",\n \"karma-coverage\": \"^1.1.1\",\n \"karma-mocha\": \"^1.3.0\",\n \"karma-mocha-reporter\": \"^2.2.1\",\n \"karma-sourcemap-loader\": \"^0.3.5\",\n \"mkdirp\": \"^0.5.1\",\n \"mocha\": \"^3.1.0\",\n \"node-sass\": \"^3.2.0\",\n \"parallelshell\": \"^2.0.0\",\n \"phantomjs\": \"^1.9.8\",\n \"rollup\": \"^0.25.4\",\n \"rollup-plugin-json\": \"^2.0.0\",\n \"rollup-plugin-node-resolve\": \"^1.4.0\",\n \"rollup-plugin-uglify\": \"^0.3.1\",\n \"semistandard\": \"^9.0.0\",\n \"sinon\": \"^1.11.1\",\n \"sinon-chai\": \"2.8.0\",\n \"snazzy\": \"^5.0.0\",\n \"uglify-js\": \"^2.6.1\",\n \"watch\": \"^0.17.1\"\n },\n \"homepage\": \"https://github.com/Esri/esri-leaflet-geocoder\",\n \"jsnext:main\": \"src/EsriLeafletGeocoding.js\",\n \"jspm\": {\n \"registry\": \"npm\",\n \"format\": \"es6\",\n \"main\": \"src/EsriLeafletGeocoding.js\"\n },\n \"license\": \"Apache-2.0\",\n \"main\": \"dist/esri-leaflet-geocoder-debug.js\",\n \"browser\": \"dist/esri-leaflet-geocoder-debug.js\",\n \"readmeFilename\": \"README.md\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git@github.com:Esri/esri-leaflet-geocoder.git\"\n },\n \"scripts\": {\n \"prebuild\": \"mkdirp dist\",\n \"build\": \"rollup -c profiles/debug.js & rollup -c profiles/production.js & npm run css & npm run img\",\n \"css\": \"node-sass ./src/esri-leaflet-geocoder.css ./dist/esri-leaflet-geocoder.css --output-style compressed\",\n \"img\": \"imagemin ./src/img ./dist/img\",\n \"lint\": \"semistandard | snazzy\",\n \"prepare\": \"npm run build\",\n \"pretest\": \"npm run build\",\n \"release\": \"./scripts/release.sh\",\n \"start-watch\": \"watch \\\"npm run build\\\" src\",\n \"start\": \"parallelshell \\\"npm run start-watch\\\" \\\"http-server -p 5678 -c-1 -o\\\"\",\n \"test\": \"npm run lint && karma start\"\n },\n \"semistandard\": {\n \"globals\": [\n \"expect\",\n \"L\",\n \"XMLHttpRequest\",\n \"sinon\",\n \"xhr\"\n ]\n },\n \"style\": \"./dist/esri-leaflet-geocoder.css\"\n}\n","import {\n latLng,\n latLngBounds\n} from 'leaflet';\nimport { Task, Util as EsriUtil } from 'esri-leaflet';\nimport { WorldGeocodingServiceUrl } from '../EsriLeafletGeocoding';\n\nexport var Geocode = Task.extend({\n path: 'findAddressCandidates',\n\n params: {\n outSr: 4326,\n forStorage: false,\n outFields: '*',\n maxLocations: 20\n },\n\n setters: {\n 'address': 'address',\n 'neighborhood': 'neighborhood',\n 'city': 'city',\n 'subregion': 'subregion',\n 'region': 'region',\n 'postal': 'postal',\n 'country': 'country',\n 'text': 'singleLine',\n 'category': 'category',\n 'token': 'token',\n 'key': 'magicKey',\n 'fields': 'outFields',\n 'forStorage': 'forStorage',\n 'maxLocations': 'maxLocations'\n },\n\n initialize: function (options) {\n options = options || {};\n options.url = options.url || WorldGeocodingServiceUrl;\n Task.prototype.initialize.call(this, options);\n },\n\n within: function (bounds) {\n bounds = latLngBounds(bounds);\n this.params.searchExtent = EsriUtil.boundsToExtent(bounds);\n return this;\n },\n\n nearby: function (coords, radius) {\n var centroid = latLng(coords);\n this.params.location = centroid.lng + ',' + centroid.lat;\n this.params.distance = Math.min(Math.max(radius, 2000), 50000);\n return this;\n },\n\n run: function (callback, context) {\n if (this.options.customParam) {\n this.params[this.options.customParam] = this.params.singleLine;\n delete this.params.singleLine;\n }\n\n return this.request(function (error, response) {\n var processor = this._processGeocoderResponse;\n var results = (!error) ? processor(response) : undefined;\n callback.call(context, error, { results: results }, response);\n }, this);\n },\n\n _processGeocoderResponse: function (response) {\n var results = [];\n\n for (var i = 0; i < response.candidates.length; i++) {\n var candidate = response.candidates[i];\n if (candidate.extent) {\n var bounds = EsriUtil.extentToBounds(candidate.extent);\n }\n\n results.push({\n text: candidate.address,\n bounds: bounds,\n score: candidate.score,\n latlng: latLng(candidate.location.y, candidate.location.x),\n properties: candidate.attributes\n });\n }\n return results;\n }\n});\n\nexport function geocode (options) {\n return new Geocode(options);\n}\n\nexport default geocode;\n","import { latLng } from 'leaflet';\nimport { Task } from 'esri-leaflet';\nimport { WorldGeocodingServiceUrl } from '../EsriLeafletGeocoding';\n\nexport var ReverseGeocode = Task.extend({\n path: 'reverseGeocode',\n\n params: {\n outSR: 4326,\n returnIntersection: false\n },\n\n setters: {\n 'distance': 'distance',\n 'language': 'langCode',\n 'intersection': 'returnIntersection'\n },\n\n initialize: function (options) {\n options = options || {};\n options.url = options.url || WorldGeocodingServiceUrl;\n Task.prototype.initialize.call(this, options);\n },\n\n latlng: function (coords) {\n var centroid = latLng(coords);\n this.params.location = centroid.lng + ',' + centroid.lat;\n return this;\n },\n\n run: function (callback, context) {\n return this.request(function (error, response) {\n var result;\n\n if (!error) {\n result = {\n latlng: latLng(response.location.y, response.location.x),\n address: response.address\n };\n } else {\n result = undefined;\n }\n\n callback.call(context, error, result, response);\n }, this);\n }\n});\n\nexport function reverseGeocode (options) {\n return new ReverseGeocode(options);\n}\n\nexport default reverseGeocode;\n","import {\n latLng,\n latLngBounds\n} from 'leaflet';\nimport { Task, Util as EsriUtil } from 'esri-leaflet';\nimport { WorldGeocodingServiceUrl } from '../EsriLeafletGeocoding';\n\nexport var Suggest = Task.extend({\n path: 'suggest',\n\n params: {},\n\n setters: {\n text: 'text',\n category: 'category',\n countries: 'countryCode',\n maxSuggestions: 'maxSuggestions'\n },\n\n initialize: function (options) {\n options = options || {};\n if (!options.url) {\n options.url = WorldGeocodingServiceUrl;\n options.supportsSuggest = true;\n }\n Task.prototype.initialize.call(this, options);\n },\n\n within: function (bounds) {\n bounds = latLngBounds(bounds);\n bounds = bounds.pad(0.5);\n var center = bounds.getCenter();\n var ne = bounds.getNorthWest();\n this.params.location = center.lng + ',' + center.lat;\n this.params.distance = Math.min(Math.max(center.distanceTo(ne), 2000), 50000);\n this.params.searchExtent = EsriUtil.boundsToExtent(bounds);\n return this;\n },\n\n nearby: function (coords, radius) {\n var centroid = latLng(coords);\n this.params.location = centroid.lng + ',' + centroid.lat;\n this.params.distance = Math.min(Math.max(radius, 2000), 50000);\n return this;\n },\n\n run: function (callback, context) {\n if (this.options.supportsSuggest) {\n return this.request(function (error, response) {\n callback.call(context, error, response, response);\n }, this);\n } else {\n console.warn('this geocoding service does not support asking for suggestions');\n }\n }\n\n});\n\nexport function suggest (options) {\n return new Suggest(options);\n}\n\nexport default suggest;\n","import { Service } from 'esri-leaflet';\nimport { WorldGeocodingServiceUrl } from '../EsriLeafletGeocoding';\nimport geocode from '../Tasks/Geocode';\nimport reverseGeocode from '../Tasks/ReverseGeocode';\nimport suggest from '../Tasks/Suggest';\n\nexport var GeocodeService = Service.extend({\n initialize: function (options) {\n options = options || {};\n if (options.url) {\n Service.prototype.initialize.call(this, options);\n this._confirmSuggestSupport();\n } else {\n options.url = WorldGeocodingServiceUrl;\n options.supportsSuggest = true;\n Service.prototype.initialize.call(this, options);\n }\n },\n\n geocode: function () {\n return geocode(this);\n },\n\n reverse: function () {\n return reverseGeocode(this);\n },\n\n suggest: function () {\n // requires either the Esri World Geocoding Service or a <10.3 ArcGIS Server Geocoding Service that supports suggest.\n return suggest(this);\n },\n\n _confirmSuggestSupport: function () {\n this.metadata(function (error, response) {\n if (error) { return; }\n // pre 10.3 geocoding services dont list capabilities (and dont support maxLocations)\n // only SOME individual services have been configured to support asking for suggestions\n if (!response.capabilities) {\n this.options.supportsSuggest = false;\n } else if (response.capabilities.indexOf('Suggest') > -1) {\n this.options.supportsSuggest = true;\n } else {\n this.options.supportsSuggest = false;\n }\n // whether the service supports suggest or not, utilize the metadata response to determine the appropriate parameter name for single line geocoding requests\n this.options.customParam = response.singleLineAddressField.name;\n }, this);\n }\n});\n\nexport function geocodeService (options) {\n return new GeocodeService(options);\n}\n\nexport default geocodeService;\n","import { Evented, Util, latLngBounds } from 'leaflet';\n\nexport var GeosearchCore = Evented.extend({\n\n options: {\n zoomToResult: true,\n useMapBounds: 12,\n searchBounds: null\n },\n\n initialize: function (control, options) {\n Util.setOptions(this, options);\n this._control = control;\n\n if (!options || !options.providers || !options.providers.length) {\n throw new Error('You must specify at least one provider');\n }\n\n this._providers = options.providers;\n },\n\n _geocode: function (text, key, provider) {\n var activeRequests = 0;\n var allResults = [];\n var bounds;\n\n var callback = Util.bind(function (error, results) {\n activeRequests--;\n if (error) {\n return;\n }\n\n if (results) {\n allResults = allResults.concat(results);\n }\n\n if (activeRequests <= 0) {\n bounds = this._boundsFromResults(allResults);\n\n this.fire('results', {\n results: allResults,\n bounds: bounds,\n latlng: (bounds) ? bounds.getCenter() : undefined,\n text: text\n }, true);\n\n if (this.options.zoomToResult && bounds) {\n this._control._map.fitBounds(bounds);\n }\n\n this.fire('load');\n }\n }, this);\n\n if (key) {\n activeRequests++;\n provider.results(text, key, this._searchBounds(), callback);\n } else {\n for (var i = 0; i < this._providers.length; i++) {\n activeRequests++;\n this._providers[i].results(text, key, this._searchBounds(), callback);\n }\n }\n },\n\n _suggest: function (text) {\n var activeRequests = this._providers.length;\n\n var createCallback = Util.bind(function (text, provider) {\n return Util.bind(function (error, suggestions) {\n if (error) { return; }\n\n var i;\n\n activeRequests = activeRequests - 1;\n\n if (text.length < 2) {\n this._suggestions.innerHTML = '';\n this._suggestions.style.display = 'none';\n return;\n }\n\n if (suggestions.length) {\n for (i = 0; i < suggestions.length; i++) {\n suggestions[i].provider = provider;\n }\n } else {\n // we still need to update the UI\n this._control._renderSuggestions(suggestions);\n }\n\n if (provider._lastRender !== text && provider.nodes) {\n for (i = 0; i < provider.nodes.length; i++) {\n if (provider.nodes[i].parentElement) {\n this._control._suggestions.removeChild(provider.nodes[i]);\n }\n }\n\n provider.nodes = [];\n }\n\n if (suggestions.length && this._control._input.value === text) {\n this._control.clearSuggestions(provider.nodes);\n\n provider._lastRender = text;\n provider.nodes = this._control._renderSuggestions(suggestions);\n this._control._nodes = [];\n }\n }, this);\n }, this);\n\n this._pendingSuggestions = [];\n\n for (var i = 0; i < this._providers.length; i++) {\n var provider = this._providers[i];\n var request = provider.suggestions(text, this._searchBounds(), createCallback(text, provider));\n this._pendingSuggestions.push(request);\n }\n },\n\n _searchBounds: function () {\n if (this.options.searchBounds !== null) {\n return this.options.searchBounds;\n }\n\n if (this.options.useMapBounds === false) {\n return null;\n }\n\n if (this.options.useMapBounds === true) {\n return this._control._map.getBounds();\n }\n\n if (this.options.useMapBounds <= this._control._map.getZoom()) {\n return this._control._map.getBounds();\n }\n\n return null;\n },\n\n _boundsFromResults: function (results) {\n if (!results.length) {\n return;\n }\n\n var nullIsland = latLngBounds([0, 0], [0, 0]);\n var resultBounds = [];\n var resultLatlngs = [];\n\n // collect the bounds and center of each result\n for (var i = results.length - 1; i >= 0; i--) {\n var result = results[i];\n\n resultLatlngs.push(result.latlng);\n\n // make sure bounds are valid and not 0,0. sometimes bounds are incorrect or not present\n if (result.bounds && result.bounds.isValid() && !result.bounds.equals(nullIsland)) {\n resultBounds.push(result.bounds);\n }\n }\n\n // form a bounds object containing all center points\n var bounds = latLngBounds(resultLatlngs);\n\n // and extend it to contain all bounds objects\n for (var j = 0; j < resultBounds.length; j++) {\n bounds.extend(resultBounds[j]);\n }\n\n return bounds;\n },\n\n _getAttribution: function () {\n var attribs = [];\n var providers = this._providers;\n\n for (var i = 0; i < providers.length; i++) {\n if (providers[i].options.attribution) {\n attribs.push(providers[i].options.attribution);\n }\n }\n\n return attribs.join(', ');\n }\n\n});\n\nexport function geosearchCore (control, options) {\n return new GeosearchCore(control, options);\n}\n\nexport default geosearchCore;\n","import { GeocodeService } from '../Services/Geocode';\n\nexport var ArcgisOnlineProvider = GeocodeService.extend({\n options: {\n label: 'Places and Addresses',\n maxResults: 5\n },\n\n suggestions: function (text, bounds, callback) {\n var request = this.suggest().text(text);\n\n if (bounds) {\n request.within(bounds);\n }\n\n if (this.options.countries) {\n request.countries(this.options.countries);\n }\n\n if (this.options.categories) {\n request.category(this.options.categories);\n }\n\n // 15 is the maximum number of suggestions that can be returned\n request.maxSuggestions(this.options.maxResults);\n\n return request.run(function (error, results, response) {\n var suggestions = [];\n if (!error) {\n while (response.suggestions.length && suggestions.length <= (this.options.maxResults - 1)) {\n var suggestion = response.suggestions.shift();\n if (!suggestion.isCollection) {\n suggestions.push({\n text: suggestion.text,\n unformattedText: suggestion.text,\n magicKey: suggestion.magicKey\n });\n }\n }\n }\n callback(error, suggestions);\n }, this);\n },\n\n results: function (text, key, bounds, callback) {\n var request = this.geocode().text(text);\n\n if (key) {\n request.key(key);\n }\n // in the future Address/StreetName geocoding requests that include a magicKey will always only return one match\n request.maxLocations(this.options.maxResults);\n\n if (bounds) {\n request.within(bounds);\n }\n\n if (this.options.forStorage) {\n request.forStorage(true);\n }\n\n return request.run(function (error, response) {\n callback(error, response.results);\n }, this);\n }\n});\n\nexport function arcgisOnlineProvider (options) {\n return new ArcgisOnlineProvider(options);\n}\n\nexport default arcgisOnlineProvider;\n","import {\n Control,\n DomEvent,\n DomUtil,\n Evented,\n Util,\n latLngBounds\n} from 'leaflet';\nimport { geosearchCore } from '../Classes/GeosearchCore';\nimport { arcgisOnlineProvider } from '../Providers/ArcgisOnlineGeocoder';\nimport { Util as EsriUtil } from 'esri-leaflet';\n\nexport var Geosearch = Control.extend({\n includes: Evented.prototype,\n\n options: {\n position: 'topleft',\n collapseAfterResult: true,\n expanded: false,\n allowMultipleResults: true,\n placeholder: 'Search for places or addresses',\n title: 'Location Search'\n },\n\n initialize: function (options) {\n Util.setOptions(this, options);\n\n if (!options || !options.providers || !options.providers.length) {\n if (!options) {\n options = {};\n }\n options.providers = [ arcgisOnlineProvider() ];\n }\n\n // instantiate the underlying class and pass along options\n this._geosearchCore = geosearchCore(this, options);\n this._geosearchCore._providers = options.providers;\n\n // bubble each providers events to the control\n this._geosearchCore.addEventParent(this);\n for (var i = 0; i < this._geosearchCore._providers.length; i++) {\n this._geosearchCore._providers[i].addEventParent(this);\n }\n\n this._geosearchCore._pendingSuggestions = [];\n\n Control.prototype.initialize.call(options);\n },\n\n _renderSuggestions: function (suggestions) {\n var currentGroup;\n\n if (suggestions.length > 0) {\n this._suggestions.style.display = 'block';\n }\n // set the maxHeight of the suggestions box to\n // map height\n // - suggestions offset (distance from top of suggestions to top of control)\n // - control offset (distance from top of control to top of map)\n // - 10 (extra padding)\n this._suggestions.style.maxHeight = (this._map.getSize().y - this._suggestions.offsetTop - this._wrapper.offsetTop - 10) + 'px';\n\n var nodes = [];\n var list;\n var header;\n var suggestionTextArray = [];\n\n for (var i = 0; i < suggestions.length; i++) {\n var suggestion = suggestions[i];\n if (!header && this._geosearchCore._providers.length > 1 && currentGroup !== suggestion.provider.options.label) {\n header = DomUtil.create('span', 'geocoder-control-header', this._suggestions);\n header.textContent = suggestion.provider.options.label;\n header.innerText = suggestion.provider.options.label;\n currentGroup = suggestion.provider.options.label;\n nodes.push(header);\n }\n\n if (!list) {\n list = DomUtil.create('ul', 'geocoder-control-list', this._suggestions);\n }\n\n if (suggestionTextArray.indexOf(suggestion.text) === -1) {\n var suggestionItem = DomUtil.create('li', 'geocoder-control-suggestion', list);\n\n suggestionItem.innerHTML = suggestion.text;\n suggestionItem.provider = suggestion.provider;\n suggestionItem['data-magic-key'] = suggestion.magicKey;\n suggestionItem.unformattedText = suggestion.unformattedText;\n } else {\n for (var j = 0; j < list.childNodes.length; j++) {\n // if the same text already appears in the list of suggestions, append an additional ObjectID to its magicKey instead\n if (list.childNodes[j].innerHTML === suggestion.text) {\n list.childNodes[j]['data-magic-key'] += ',' + suggestion.magicKey;\n }\n }\n }\n suggestionTextArray.push(suggestion.text);\n }\n\n DomUtil.removeClass(this._input, 'geocoder-control-loading');\n\n nodes.push(list);\n\n return nodes;\n },\n\n _boundsFromResults: function (results) {\n if (!results.length) {\n return;\n }\n\n var nullIsland = latLngBounds([0, 0], [0, 0]);\n var resultBounds = [];\n var resultLatlngs = [];\n\n // collect the bounds and center of each result\n for (var i = results.length - 1; i >= 0; i--) {\n var result = results[i];\n\n resultLatlngs.push(result.latlng);\n\n // make sure bounds are valid and not 0,0. sometimes bounds are incorrect or not present\n if (result.bounds && result.bounds.isValid() && !result.bounds.equals(nullIsland)) {\n resultBounds.push(result.bounds);\n }\n }\n\n // form a bounds object containing all center points\n var bounds = latLngBounds(resultLatlngs);\n\n // and extend it to contain all bounds objects\n for (var j = 0; j < resultBounds.length; j++) {\n bounds.extend(resultBounds[j]);\n }\n\n return bounds;\n },\n\n clear: function () {\n this._suggestions.innerHTML = '';\n this._suggestions.style.display = 'none';\n this._input.value = '';\n\n if (this.options.collapseAfterResult) {\n this._input.placeholder = '';\n DomUtil.removeClass(this._wrapper, 'geocoder-control-expanded');\n }\n\n if (!this._map.scrollWheelZoom.enabled() && this._map.options.scrollWheelZoom) {\n this._map.scrollWheelZoom.enable();\n }\n },\n\n clearSuggestions: function () {\n if (this._nodes) {\n for (var k = 0; k < this._nodes.length; k++) {\n if (this._nodes[k].parentElement) {\n this._suggestions.removeChild(this._nodes[k]);\n }\n }\n }\n },\n\n _setupClick: function () {\n DomUtil.addClass(this._wrapper, 'geocoder-control-expanded');\n this._input.focus();\n },\n\n disable: function () {\n this._input.disabled = true;\n DomUtil.addClass(this._input, 'geocoder-control-input-disabled');\n DomEvent.removeListener(this._wrapper, 'click', this._setupClick, this);\n },\n\n enable: function () {\n this._input.disabled = false;\n DomUtil.removeClass(this._input, 'geocoder-control-input-disabled');\n DomEvent.addListener(this._wrapper, 'click', this._setupClick, this);\n },\n\n getAttribution: function () {\n var attribs = [];\n\n for (var i = 0; i < this._providers.length; i++) {\n if (this._providers[i].options.attribution) {\n attribs.push(this._providers[i].options.attribution);\n }\n }\n\n return attribs.join(', ');\n },\n\n geocodeSuggestion: function (e) {\n var suggestionItem = e.target || e.srcElement;\n\n // make sure and point at the actual 'geocoder-control-suggestion'\n if (suggestionItem.classList.length < 1) {\n suggestionItem = suggestionItem.parentNode;\n }\n\n this._geosearchCore._geocode(suggestionItem.unformattedText, suggestionItem['data-magic-key'], suggestionItem.provider);\n this.clear();\n },\n\n onAdd: function (map) {\n // include 'Powered by Esri' in map attribution\n EsriUtil.setEsriAttribution(map);\n\n this._map = map;\n this._wrapper = DomUtil.create('div', 'geocoder-control');\n this._input = DomUtil.create('input', 'geocoder-control-input leaflet-bar', this._wrapper);\n this._input.title = this.options.title;\n\n if (this.options.expanded) {\n DomUtil.addClass(this._wrapper, 'geocoder-control-expanded');\n this._input.placeholder = this.options.placeholder;\n }\n\n this._suggestions = DomUtil.create('div', 'geocoder-control-suggestions leaflet-bar', this._wrapper);\n\n var credits = this._geosearchCore._getAttribution();\n map.attributionControl.addAttribution(credits);\n\n DomEvent.addListener(this._input, 'focus', function (e) {\n this._input.placeholder = this.options.placeholder;\n DomUtil.addClass(this._wrapper, 'geocoder-control-expanded');\n }, this);\n\n DomEvent.addListener(this._wrapper, 'click', this._setupClick, this);\n\n // make sure both click and touch spawn an address/poi search\n DomEvent.addListener(this._suggestions, 'mousedown', this.geocodeSuggestion, this);\n DomEvent.addListener(this._suggestions, 'touchend', this.geocodeSuggestion, this);\n\n DomEvent.addListener(this._input, 'blur', function (e) {\n this.clear();\n }, this);\n\n DomEvent.addListener(this._input, 'keydown', function (e) {\n var text = (e.target || e.srcElement).value;\n\n DomUtil.addClass(this._wrapper, 'geocoder-control-expanded');\n\n var list = this._suggestions.querySelectorAll('.' + 'geocoder-control-suggestion');\n var selected = this._suggestions.querySelectorAll('.' + 'geocoder-control-selected')[0];\n var selectedPosition;\n\n for (var i = 0; i < list.length; i++) {\n if (list[i] === selected) {\n selectedPosition = i;\n break;\n }\n }\n\n switch (e.keyCode) {\n case 13:\n /*\n if an item has been selected, geocode it\n if focus is on the input textbox, geocode only if multiple results are allowed and more than two characters are present, or if a single suggestion is displayed.\n if less than two characters have been typed, abort the geocode\n */\n if (selected) {\n this._geosearchCore._geocode(selected.unformattedText, selected['data-magic-key'], selected.provider);\n this.clear();\n } else if (this.options.allowMultipleResults && text.length >= 2) {\n this._geosearchCore._geocode(this._input.value, undefined);\n this.clear();\n } else {\n if (list.length === 1) {\n DomUtil.addClass(list[0], 'geocoder-control-selected');\n this._geosearchCore._geocode(list[0].innerHTML, list[0]['data-magic-key'], list[0].provider);\n } else {\n this.clear();\n this._input.blur();\n }\n }\n DomEvent.preventDefault(e);\n break;\n case 38:\n if (selected) {\n DomUtil.removeClass(selected, 'geocoder-control-selected');\n }\n\n var previousItem = list[selectedPosition - 1];\n\n if (selected && previousItem) {\n DomUtil.addClass(previousItem, 'geocoder-control-selected');\n } else {\n DomUtil.addClass(list[list.length - 1], 'geocoder-control-selected');\n }\n DomEvent.preventDefault(e);\n break;\n case 40:\n if (selected) {\n DomUtil.removeClass(selected, 'geocoder-control-selected');\n }\n\n var nextItem = list[selectedPosition + 1];\n\n if (selected && nextItem) {\n DomUtil.addClass(nextItem, 'geocoder-control-selected');\n } else {\n DomUtil.addClass(list[0], 'geocoder-control-selected');\n }\n DomEvent.preventDefault(e);\n break;\n default:\n // when the input changes we should cancel all pending suggestion requests if possible to avoid result collisions\n for (var x = 0; x < this._geosearchCore._pendingSuggestions.length; x++) {\n var request = this._geosearchCore._pendingSuggestions[x];\n if (request && request.abort && !request.id) {\n request.abort();\n }\n }\n break;\n }\n }, this);\n\n DomEvent.addListener(this._input, 'keyup', Util.throttle(function (e) {\n var key = e.which || e.keyCode;\n var text = (e.target || e.srcElement).value;\n\n // require at least 2 characters for suggestions\n if (text.length < 2) {\n this._suggestions.innerHTML = '';\n this._suggestions.style.display = 'none';\n DomUtil.removeClass(this._input, 'geocoder-control-loading');\n return;\n }\n\n // if this is the escape key it will clear the input so clear suggestions\n if (key === 27) {\n this._suggestions.innerHTML = '';\n this._suggestions.style.display = 'none';\n return;\n }\n\n // if this is NOT the up/down arrows or enter make a suggestion\n if (key !== 13 && key !== 38 && key !== 40) {\n if (this._input.value !== this._lastValue) {\n this._lastValue = this._input.value;\n DomUtil.addClass(this._input, 'geocoder-control-loading');\n this._geosearchCore._suggest(text);\n }\n }\n }, 50, this), this);\n\n DomEvent.disableClickPropagation(this._wrapper);\n\n // when mouse moves over suggestions disable scroll wheel zoom if its enabled\n DomEvent.addListener(this._suggestions, 'mouseover', function (e) {\n if (map.scrollWheelZoom.enabled() && map.options.scrollWheelZoom) {\n map.scrollWheelZoom.disable();\n }\n });\n\n // when mouse moves leaves suggestions enable scroll wheel zoom if its disabled\n DomEvent.addListener(this._suggestions, 'mouseout', function (e) {\n if (!map.scrollWheelZoom.enabled() && map.options.scrollWheelZoom) {\n map.scrollWheelZoom.enable();\n }\n });\n\n this._geosearchCore.on('load', function (e) {\n DomUtil.removeClass(this._input, 'geocoder-control-loading');\n this.clear();\n this._input.blur();\n }, this);\n\n return this._wrapper;\n }\n});\n\nexport function geosearch (options) {\n return new Geosearch(options);\n}\n\nexport default geosearch;\n","import { Util, geoJson, latLngBounds } from 'leaflet';\nimport { FeatureLayerService } from 'esri-leaflet';\n\nexport var FeatureLayerProvider = FeatureLayerService.extend({\n options: {\n label: 'Feature Layer',\n maxResults: 5,\n bufferRadius: 1000,\n formatSuggestion: function (feature) {\n return feature.properties[this.options.searchFields[0]];\n }\n },\n\n initialize: function (options) {\n FeatureLayerService.prototype.initialize.call(this, options);\n if (typeof this.options.searchFields === 'string') {\n this.options.searchFields = [this.options.searchFields];\n }\n this._suggestionsQuery = this.query();\n this._resultsQuery = this.query();\n },\n\n suggestions: function (text, bounds, callback) {\n var query = this._suggestionsQuery.where(this._buildQuery(text))\n .returnGeometry(false);\n\n if (bounds) {\n query.intersects(bounds);\n }\n\n if (this.options.idField) {\n query.fields([this.options.idField].concat(this.options.searchFields));\n }\n\n var request = query.run(function (error, results, raw) {\n if (error) {\n callback(error, []);\n } else {\n this.options.idField = raw.objectIdFieldName;\n var suggestions = [];\n for (var i = results.features.length - 1; i >= 0; i--) {\n var feature = results.features[i];\n suggestions.push({\n text: this.options.formatSuggestion.call(this, feature),\n unformattedText: feature.properties[this.options.searchFields[0]],\n magicKey: feature.id\n });\n }\n callback(error, suggestions.slice(0, this.options.maxResults));\n }\n }, this);\n\n return request;\n },\n\n results: function (text, key, bounds, callback) {\n var query = this._resultsQuery;\n\n if (key) {\n delete query.params.where;\n query.featureIds([key]);\n } else {\n query.where(this._buildQuery(text));\n }\n\n if (bounds) {\n query.within(bounds);\n }\n\n return query.run(Util.bind(function (error, features) {\n var results = [];\n for (var i = 0; i < features.features.length; i++) {\n var feature = features.features[i];\n if (feature) {\n var bounds = this._featureBounds(feature);\n\n var result = {\n latlng: bounds.getCenter(),\n bounds: bounds,\n text: this.options.formatSuggestion.call(this, feature),\n properties: feature.properties,\n geojson: feature\n };\n\n results.push(result);\n\n // clear query parameters for the next search\n delete this._resultsQuery.params['objectIds'];\n }\n }\n callback(error, results);\n }, this));\n },\n\n orderBy: function (fieldName, order) {\n this._suggestionsQuery.orderBy(fieldName, order);\n },\n\n _buildQuery: function (text) {\n var queryString = [];\n\n for (var i = this.options.searchFields.length - 1; i >= 0; i--) {\n var field = 'upper(\"' + this.options.searchFields[i] + '\")';\n\n queryString.push(field + \" LIKE upper('%\" + text + \"%')\");\n }\n\n if (this.options.where) {\n return this.options.where + ' AND (' + queryString.join(' OR ') + ')';\n } else {\n return queryString.join(' OR ');\n }\n },\n\n _featureBounds: function (feature) {\n var geojson = geoJson(feature);\n if (feature.geometry.type === 'Point') {\n var center = geojson.getBounds().getCenter();\n var lngRadius = ((this.options.bufferRadius / 40075017) * 360) / Math.cos((180 / Math.PI) * center.lat);\n var latRadius = (this.options.bufferRadius / 40075017) * 360;\n return latLngBounds([center.lat - latRadius, center.lng - lngRadius], [center.lat + latRadius, center.lng + lngRadius]);\n } else {\n return geojson.getBounds();\n }\n }\n});\n\nexport function featureLayerProvider (options) {\n return new FeatureLayerProvider(options);\n}\n\nexport default featureLayerProvider;\n","import { Util, geoJson, latLngBounds } from 'leaflet';\nimport { MapService } from 'esri-leaflet';\n\nexport var MapServiceProvider = MapService.extend({\n options: {\n layers: [0],\n label: 'Map Service',\n bufferRadius: 1000,\n maxResults: 5,\n formatSuggestion: function (feature) {\n return feature.properties[feature.displayFieldName] + ' <small>' + feature.layerName + '</small>';\n }\n },\n\n initialize: function (options) {\n MapService.prototype.initialize.call(this, options);\n this._getIdFields();\n },\n\n suggestions: function (text, bounds, callback) {\n var request = this.find().text(text).fields(this.options.searchFields).returnGeometry(false).layers(this.options.layers);\n\n return request.run(function (error, results, raw) {\n var suggestions = [];\n if (!error) {\n var count = Math.min(this.options.maxResults, results.features.length);\n raw.results = raw.results.reverse();\n for (var i = 0; i < count; i++) {\n var feature = results.features[i];\n var result = raw.results[i];\n var layer = result.layerId;\n var idField = this._idFields[layer];\n feature.layerId = layer;\n feature.layerName = this._layerNames[layer];\n feature.displayFieldName = this._displayFields[layer];\n if (idField) {\n suggestions.push({\n text: this.options.formatSuggestion.call(this, feature),\n unformattedText: feature.properties[feature.displayFieldName],\n magicKey: result.attributes[idField] + ':' + layer\n });\n }\n }\n }\n callback(error, suggestions.reverse());\n }, this);\n },\n\n results: function (text, key, bounds, callback) {\n var results = [];\n var request;\n\n if (key) {\n var featureId = key.split(':')[0];\n var layer = key.split(':')[1];\n request = this.query().layer(layer).featureIds(featureId);\n } else {\n request = this.find().text(text).fields(this.options.searchFields).layers(this.options.layers);\n }\n\n return request.run(function (error, features, response) {\n if (!error) {\n if (response.results) {\n response.results = response.results.reverse();\n }\n for (var i = 0; i < features.features.length; i++) {\n var feature = features.features[i];\n layer = layer || response.results[i].layerId;\n\n if (feature && layer !== undefined) {\n var bounds = this._featureBounds(feature);\n feature.layerId = layer;\n feature.layerName = this._layerNames[layer];\n feature.displayFieldName = this._displayFields[layer];\n\n var result = {\n latlng: bounds.getCenter(),\n bounds: bounds,\n text: this.options.formatSuggestion.call(this, feature),\n properties: feature.properties,\n geojson: feature\n };\n\n results.push(result);\n }\n }\n }\n callback(error, results.reverse());\n }, this);\n },\n\n _featureBounds: function (feature) {\n var geojson = geoJson(feature);\n if (feature.geometry.type === 'Point') {\n var center = geojson.getBounds().getCenter();\n var lngRadius = ((this.options.bufferRadius / 40075017) * 360) / Math.cos((180 / Math.PI) * center.lat);\n var latRadius = (this.options.bufferRadius / 40075017) * 360;\n return latLngBounds([center.lat - latRadius, center.lng - lngRadius], [center.lat + latRadius, center.lng + lngRadius]);\n } else {\n return geojson.getBounds();\n }\n },\n\n _layerMetadataCallback: function (layerid) {\n return Util.bind(function (error, metadata) {\n if (error) { return; }\n this._displayFields[layerid] = metadata.displayField;\n this._layerNames[layerid] = metadata.name;\n for (var i = 0; i < metadata.fields.length; i++) {\n var field = metadata.fields[i];\n if (field.type === 'esriFieldTypeOID') {\n this._idFields[layerid] = field.name;\n break;\n }\n }\n }, this);\n },\n\n _getIdFields: function () {\n this._idFields = {};\n this._displayFields = {};\n this._layerNames = {};\n for (var i = 0; i < this.options.layers.length; i++) {\n var layer = this.options.layers[i];\n this.get(layer, {}, this._layerMetadataCallback(layer));\n }\n }\n});\n\nexport function mapServiceProvider (options) {\n return new MapServiceProvider(options);\n}\n\nexport default mapServiceProvider;\n","import { GeocodeService } from '../Services/Geocode';\n\nexport var GeocodeServiceProvider = GeocodeService.extend({\n options: {\n label: 'Geocode Server',\n maxResults: 5\n },\n\n suggestions: function (text, bounds, callback) {\n if (this.options.supportsSuggest) {\n var request = this.suggest().text(text);\n if (bounds) {\n request.within(bounds);\n }\n\n return request.run(function (error, results, response) {\n var suggestions = [];\n if (!error) {\n while (response.suggestions.length && suggestions.length <= (this.options.maxResults - 1)) {\n var suggestion = response.suggestions.shift();\n if (!suggestion.isCollection) {\n suggestions.push({\n text: suggestion.text,\n unformattedText: suggestion.text,\n magicKey: suggestion.magicKey\n });\n }\n }\n }\n callback(error, suggestions);\n }, this);\n } else {\n callback(undefined, []);\n return false;\n }\n },\n\n results: function (text, key, bounds, callback) {\n var request = this.geocode().text(text);\n\n if (key) {\n request.key(key);\n }\n\n request.maxLocations(this.options.maxResults);\n\n if (bounds) {\n request.within(bounds);\n }\n\n return request.run(function (error, response) {\n callback(error, response.results);\n }, this);\n }\n});\n\nexport function geocodeServiceProvider (options) {\n return new GeocodeServiceProvider(options);\n}\n\nexport default geocodeServiceProvider;\n","export { version as VERSION } from '../package.json';\nexport var WorldGeocodingServiceUrl = 'https://geocode.arcgis.com/arcgis/rest/services/World/GeocodeServer/';\n\n// import tasks\nexport { Geocode, geocode } from './Tasks/Geocode';\nexport { ReverseGeocode, reverseGeocode } from './Tasks/ReverseGeocode';\nexport { Suggest, suggest } from './Tasks/Suggest';\n\n// import service\nexport { GeocodeService, geocodeService } from './Services/Geocode';\n\n// import control\nexport { Geosearch, geosearch } from './Controls/Geosearch';\n\n// import supporting class\nexport { GeosearchCore, geosearchCore } from './Classes/GeosearchCore';\n\n// import providers\nexport { ArcgisOnlineProvider, arcgisOnlineProvider } from './Providers/ArcgisOnlineGeocoder';\nexport { FeatureLayerProvider, featureLayerProvider } from './Providers/FeatureLayer';\nexport { MapServiceProvider, mapServiceProvider } from './Providers/MapService';\nexport { GeocodeServiceProvider, geocodeServiceProvider } from './Providers/GeocodeService';\n"],"names":["geocode","options","Geocode","reverseGeocode","ReverseGeocode","suggest","Suggest","geocodeService","GeocodeService","geosearchCore","control","GeosearchCore","arcgisOnlineProvider","ArcgisOnlineProvider","geosearch","Geosearch","featureLayerProvider","FeatureLayerProvider","mapServiceProvider","MapServiceProvider","geocodeServiceProvider","GeocodeServiceProvider","Task","extend","path","params","outSr","forStorage","outFields","maxLocations","setters","address","neighborhood","city","subregion","region","postal","country","text","category","token","key","fields","initialize","url","WorldGeocodingServiceUrl","prototype","call","this","within","bounds","latLngBounds","searchExtent","EsriUtil","boundsToExtent","nearby","coords","radius","centroid","latLng","location","lng","lat","distance","Math","min","max","run","callback","context","customParam","singleLine","request","error","response","processor","_processGeocoderResponse","results","undefined","i","candidates","length","candidate","extent","extentToBounds","push","score","latlng","y","x","properties","attributes","outSR","returnIntersection","language","intersection","result","countries","maxSuggestions","supportsSuggest","pad","center","getCenter","ne","getNorthWest","distanceTo","console","warn","Service","_confirmSuggestSupport","reverse","metadata","capabilities","indexOf","singleLineAddressField","name","Evented","zoomToResult","useMapBounds","searchBounds","Util","setOptions","_control","providers","Error","_providers","_geocode","provider","activeRequests","allResults","bind","concat","_boundsFromResults","fire","_map","fitBounds","_searchBounds","_suggest","createCallback","suggestions","_suggestions","innerHTML","style","display","_renderSuggestions","_lastRender","nodes","parentElement","removeChild","_input","value","clearSuggestions","_nodes","_pendingSuggestions","getBounds","getZoom","nullIsland","resultBounds","resultLatlngs","isValid","equals","j","_getAttribution","attribs","attribution","join","label","maxResults","categories","suggestion","shift","isCollection","unformattedText","magicKey","Control","includes","position","collapseAfterResult","expanded","allowMultipleResults","placeholder","title","_geosearchCore","addEventParent","currentGroup","maxHeight","getSize","offsetTop","_wrapper","list","header","suggestionTextArray","DomUtil","create","textContent","innerText","suggestionItem","childNodes","removeClass","clear","scrollWheelZoom","enabled","enable","k","_setupClick","addClass","focus","disable","disabled","DomEvent","removeListener","addListener","getAttribution","geocodeSuggestion","e","target","srcElement","classList","parentNode","onAdd","map","setEsriAttribution","credits","attributionControl","addAttribution","selectedPosition","querySelectorAll","selected","keyCode","blur","preventDefault","previousItem","nextItem","abort","id","throttle","which","_lastValue","disableClickPropagation","on","FeatureLayerService","bufferRadius","formatSuggestion","feature","searchFields","_suggestionsQuery","query","_resultsQuery","where","_buildQuery","returnGeometry","intersects","idField","raw","objectIdFieldName","features","slice","featureIds","_featureBounds","geojson","orderBy","fieldName","order","queryString","field","geoJson","geometry","type","lngRadius","cos","PI","latRadius","MapService","layers","displayFieldName","layerName","_getIdFields","find","count","layer","layerId","_idFields","_layerNames","_displayFields","featureId","split","_layerMetadataCallback","layerid","displayField","get"],"mappings":"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"}