{"version":3,"sources":["assets/icons.js","main.js"],"names":["locationString","String","raw","bagString","cartString","basketString","module","exports","require","capitalizeFirstLetter","nameS","result","words","split","lowerWords","upperWords","forEach","word","toLowerCase","includes","toUpperCase","charAt","slice","originalOnAdd","L","Marker","prototype","onAdd","originalOnRemove","onRemove","mergeOptions","bounceOnAdd","bounceOnAddOptions","duration","height","loop","bounceOnAddCallback","include","_toPoint","latlng","_map","latLngToContainerPoint","_toLatLng","point","containerPointToLatLng","_motionStep","opts","self","progress","Date","start","delta","_easeOutBounce","step","_animationId","Util","requestAnimFrame","timestamp","end","_bounceMotion","callback","original","latLng","_origLatlng","start_y","_dropPoint","y","start_x","x","distance","_point","project","getCenter","_origMapCenter","setLatLng","pos","bounce","options","endCallback","arguments","_getDropPoint","stopBounce","cancelAnimFrame","top_y","undefined","getBounds","_northEast","Point","map","call","getLatLng","markerL","mapLink","userLink","mapsURL","layersIndex","gardens","foodB","wic","snap","convenienceS","groceryS","svgStrings","dropdown_span","document","querySelector","layers","vars_dict","pop_name","pop_address","pop_conp1","pop_conp2","pop_conm1","pop_conm2","pop_manage","pop_conp","pop_phone","pop_service","pop_hours","pop_city","pop_state","pop_pharmacy","pop_ewic","popupHTMLs","vals","iconL","divIcon","className","html","popupAnchor","icons","s","center","zoom","attribution","tileLayer","addTo","locate","setView","maxZoom","enableHighAccuracy","addEventListener","e","panTo","animate","marker","icon","bindPopup","openPopup","Object","keys","item","_url","esri","featureLayer","url","pointToLayer","geojson","pane","createPane","onEachFeature","f","lyr","content","setPopup","geocode_point","lyrLinks","querySelectorAll","feature","lyrName","var_dict","attrs","properties","key","lyrLink","lyrSlected","currentTarget","getAttribute","hasLayer","removeLayer","addLayer","innerHTML","southWest","northEast","bounds","latLngBounds","geocoder","Geocoding","geosearch","position","searchBounds","title","placeholder","zoomToResult","geocoder_result","layerGroup","get_nearest","feature_layer","factor","arr_points","eachFeature","layer","fid_dis_point","coor","lat","geometry","coordinates","lng","point_current","id","dis","fid","push","sort","a","b","top3","fitbounds","element","values","results","clearLayers","result_1st","riseOnHover","nearest_points","nearest_bounds","fitBounds","flyTo"],"mappings":"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","file":"main.a453cd60.js","sourceRoot":"..","sourcesContent":["let locationString = String.raw`\r\n\r\n`;\r\nlet bagString = String.raw`\r\nlove`;\r\nlet cartString = String.raw`\r\nUI\r\n`;\r\nlet basketString = String.raw`\r\nArtboard 9 \r\n \r\n`;\r\nmodule.exports = {locationString, bagString,basketString,cartString };\r\n\r\n\r\n\r\n","const {locationString, bagString,basketString,cartString} = require('./assets/icons');\r\n\r\n//Code snippet of BounceMarker\r\n/**\r\n * Copyright (C) 2013 Maxime Hadjinlian \r\n * All Rights Reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without\r\n * modification, are permitted provided that the following conditions are met:\r\n *\r\n * - Redistributions of source code must retain the above copyright notice,\r\n * this list of conditions and the following disclaimer.\r\n *\r\n * - Redistributions in binary form must reproduce the above copyright notice,\r\n * this list of conditions and the following disclaimer in the documentation\r\n * and/or other materials provided with the distribution.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\r\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\r\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r\n * POSSIBILITY OF SUCH DAMAGE.\r\n */\r\n\r\n(function() {\r\n // Retain the value of the original onAdd and onRemove functions\r\n let originalOnAdd = L.Marker.prototype.onAdd;\r\n let originalOnRemove = L.Marker.prototype.onRemove;\r\n\r\n // Add bounceonAdd options\r\n L.Marker.mergeOptions({\r\n bounceOnAdd: false,\r\n bounceOnAddOptions: {\r\n duration: 1000,\r\n height: -1,\r\n loop: 1,\r\n },\r\n bounceOnAddCallback: function() {},\r\n });\r\n\r\n L.Marker.include({\r\n\r\n _toPoint: function(latlng) {\r\n return this._map.latLngToContainerPoint(latlng);\r\n },\r\n\r\n _toLatLng: function(point) {\r\n return this._map.containerPointToLatLng(point);\r\n },\r\n\r\n _motionStep: function(opts) {\r\n let self = this;\r\n let timePassed = new Date() - opts.start;\r\n let progress = timePassed / opts.duration;\r\n\r\n if (progress > 1) {\r\n progress = 1;\r\n }\r\n\r\n let delta = self._easeOutBounce(progress);\r\n opts.step(delta);\r\n\r\n if (progress === 1) {\r\n opts.start = new Date();\r\n progress = 0;\r\n if (opts.loop > 0) opts.loop = opts.loop - 1;\r\n if (opts.loop === 0) {\r\n opts.end();\r\n return;\r\n }\r\n }\r\n\r\n self._animationId = L.Util.requestAnimFrame(function(timestamp) {\r\n self._motionStep(opts);\r\n });\r\n },\r\n\r\n _bounceMotion: function(opts, callback) {\r\n let original = L.latLng(this._origLatlng);\r\n let start_y = this._dropPoint.y;\r\n let start_x = this._dropPoint.x;\r\n let distance = this._point.y - start_y;\r\n let self = this;\r\n\r\n self._animationId = L.Util.requestAnimFrame(function() {\r\n self._motionStep({\r\n duration: opts.duration || 1000, // 1 sec by default\r\n loop: opts.loop || 1,\r\n start: new Date(),\r\n step: function(delta) {\r\n self._dropPoint.y =\r\n start_y\r\n + (distance * delta)\r\n - (self._map.project(self._map.getCenter()).y - self._origMapCenter.y);\r\n self._dropPoint.x =\r\n start_x\r\n - (self._map.project(self._map.getCenter()).x - self._origMapCenter.x);\r\n self.setLatLng(self._toLatLng(self._dropPoint));\r\n },\r\n end: function() {\r\n self.setLatLng(original);\r\n if (typeof callback === 'function') callback();\r\n },\r\n });\r\n });\r\n },\r\n\r\n // Many thanks to Robert Penner for this function\r\n _easeOutBounce: function(pos) {\r\n if ((pos) < (1 / 2.75)) {\r\n return (7.5625 * pos * pos);\r\n } else if (pos < (2 / 2.75)) {\r\n return (7.5625 * (pos -= (1.5 / 2.75)) * pos + 0.75);\r\n } else if (pos < (2.5 / 2.75)) {\r\n return (7.5625 * (pos -= (2.25 / 2.75)) * pos + 0.9375);\r\n } else {\r\n return (7.5625 * (pos -= (2.625 / 2.75)) * pos + 0.984375);\r\n }\r\n },\r\n\r\n // Bounce : if options.height in pixels is not specified, drop from top.\r\n // If options.duration is not specified animation is 1s long.\r\n bounce: function(options, endCallback) {\r\n if (typeof options === 'function') {\r\n endCallback = options;\r\n options = null;\r\n }\r\n options = options || {duration: 1000, height: -1, loop: 1};\r\n\r\n // backward compatibility\r\n if (typeof options === 'number') {\r\n options.duration = arguments[0];\r\n options.height = arguments[1];\r\n }\r\n\r\n // Keep original map center\r\n this._origMapCenter = this._map.project(this._map.getCenter());\r\n this._dropPoint = this._getDropPoint(options.height);\r\n this._bounceMotion(options, endCallback);\r\n },\r\n\r\n stopBounce: function(){\r\n // We may have modified the marker; so we need to place it where it\r\n // belongs so next time its coordinates are not changed.\r\n this.setLatLng(this._origLatlng);\r\n L.Util.cancelAnimFrame(this._animationId);\r\n },\r\n\r\n // This will get you a drop point given a height.\r\n // If no height is given, the top y will be used.\r\n _getDropPoint: function(height) {\r\n // Get current coordidates in pixel\r\n this._point = this._toPoint(this._origLatlng);\r\n let top_y;\r\n if (height === undefined || height < 0) {\r\n top_y = this._toPoint(this._map.getBounds()._northEast).y;\r\n } else {\r\n top_y = this._point.y - height;\r\n }\r\n return new L.Point(this._point.x, top_y);\r\n },\r\n\r\n onAdd: function(map) {\r\n this._map = map;\r\n\r\n // Call leaflet original method to add the Marker to the map.\r\n originalOnAdd.call(this, map);\r\n\r\n // Keep original latitude and longitude\r\n this._origLatlng = this.getLatLng();\r\n\r\n if (this.options.bounceOnAdd === true) {\r\n this.bounce(this.options.bounceOnAddOptions, this.options.bounceOnAddCallback);\r\n }\r\n },\r\n\r\n onRemove: function(map) {\r\n this.stopBounce();\r\n originalOnRemove.call(this, map);\r\n },\r\n });\r\n})();\r\n//END of Bouncermarker.js\r\n\r\n//Capitalize a string\r\nfunction capitalizeFirstLetter(nameS) {\r\n let result = ''\r\n let words = nameS.split(' ');\r\n let lowerWords = ['of', 'and'];\r\n let upperWords = ['llc']\r\n words.forEach(function (word) {\r\n word = word.toLowerCase();\r\n if (upperWords.includes(word)){result += word.toUpperCase()+' ';}\r\n else if (lowerWords.includes(word)){result += word+' ';}\r\n else{result += word.charAt(0).toUpperCase()+word.slice(1)+' ';}\r\n\r\n })\r\n return result;\r\n\r\n}\r\n//end of capitalization of words\r\n\r\nconst mapLink = 'OpenStreetMap';\r\nconst userLink = 'Guixing Wei@S4';\r\nconst mapsURL = 'https://services.arcgis.com/8veDRDlhXWywYP3S/arcgis/rest/services/FoodAndNutrition_ViewLayer/FeatureServer';\r\nconst layersIndex = {gardens: 0, foodB: 1, wic: 2, snap: 3, convenienceS: 4,groceryS: 5};\r\nconst svgStrings = {gardens: basketString, foodB: bagString, wic: bagString, snap: bagString, convenienceS: cartString, groceryS: cartString};\r\nvar dropdown_span = document.querySelector('#layers-toggle span');\r\n\r\nvar layers = {}; //containers of all feature layers\r\n\r\nconst vars_dict = {\r\n gardens: {pop_name: 'USER_Name', pop_address: 'Match_addr', pop_conp1: 'USER_Contact1', pop_conp2: 'USER_Contact2', pop_conm1: 'USER_Contact1Method', pop_conm2: 'USER_Contact2Method', pop_manage: \"USER_Management\"},\r\n foodB: {pop_name: 'Name', pop_address: 'Match_addr', pop_conp: 'Contact_Name',pop_phone: 'Phone', pop_service: 'Service', pop_hours: 'HoursComments'},\r\n wic: {pop_name: 'USER_Tradename', pop_address: 'USER_Address', pop_city: 'USER_City', pop_state: 'USER_State', pop_pharmacy: 'USER_Pharmacy', pop_ewic: 'USER_eWIC_Certified'},\r\n snap: {pop_name: 'Store_Name', pop_address: 'Address', pop_city: \"City\", pop_state: \"State\"},\r\n convenienceS: {pop_name: 'Name', pop_address: 'Match_addr', pop_phone: 'Phone'},\r\n groceryS: {pop_name: 'Name', pop_address: 'Address', pop_city: 'City', pop_state: 'State',pop_phone: 'Phone'}\r\n}\r\n//pop-up attributes\r\n\r\nvar popupHTMLs = {\r\n gardens: function (vals){return `
${vals.pop_name}

Address: ${vals.pop_address}
Contact: ${vals.pop_conp1==\"Name Not Available\"? '': vals.pop_conp1} ${vals.pop_conp2=='No Second Contact'? ' ':vals.pop_conp2}
Contact Methods: ${vals.pop_conm1=='Contact Not Available'? '':vals.pop_conm1}${vals.pop_conm2=='No Second Contact Method'? '':'
'+vals.pop_conm2}
Management: ${vals.pop_manage}`},\r\n foodB: function (vals) {return `
${vals.pop_name}

Address: ${vals.pop_address}
Contact: ${vals.pop_conp}
Phone: ${vals.pop_phone}
Service: ${vals.pop_service}
Hours Comments:
${vals.pop_hours}`},\r\n wic: function (vals) {return`
${vals.pop_name}

Address: ${vals.pop_address},${vals.pop_city}, ${vals.pop_state}
Pharmacy: ${vals.pop_pharmacy}
eWIC Certified: ${vals.pop_ewic}`},\r\n snap: function (vals) {return`
${vals.pop_name}

Address: ${vals.pop_address}, ${vals.pop_city}, ${vals.pop_state}
`},\r\n convenienceS: function (vals) {return`
${capitalizeFirstLetter(vals.pop_name)}

Address: ${vals.pop_address}
Phone: ${vals.pop_phone}`},\r\n groceryS: function (vals) {return`
${capitalizeFirstLetter(vals.pop_name)}

Address: ${capitalizeFirstLetter(vals.pop_address)},${capitalizeFirstLetter(vals.pop_city)}, ${vals.pop_state}
Phone: ${vals.pop_phone}`}\r\n}\r\n\r\n//Icons\r\nvar iconL = L.divIcon({\r\n className: \"myDivIcon locate\",\r\n html: locationString,\r\n popupAnchor: [10,0],\r\n});\r\nlet markerL;\r\nlet icons = {};\r\nfor (const s in svgStrings){\r\n icons[s] = L.divIcon({\r\n className: `myDivIcon ${s}`,\r\n html: svgStrings[s],\r\n popupAnchor: [10,0]\r\n })\r\n}\r\n//end of icon sections\r\n\r\n\r\n\r\nlet map = L.map('map',\r\n {\r\n center: [41.825606, -71.407919],\r\n zoom: 13,\r\n });\r\n\r\nlet attribution = '©' + mapLink + 'Developer '+ '| ©' + userLink + '';\r\nL.tileLayer('https://{s}.tile.osm.org/{z}/{x}/{y}.png',{\r\n attribution:attribution,\r\n}).addTo(map);\r\n\r\n//map locate\r\nmap.locate({\r\n setView: false,\r\n maxZoom: 13,\r\n enableHighAccuracy: true,\r\n});\r\nmap.addEventListener('locationfound', function (e) {\r\n map.panTo(e.latlng, {animate: false});\r\n markerL = new L.marker(e.latlng,\r\n {icon: iconL,\r\n bounceOnAdd: true,\r\n bounceOnAddOptions: {duration:1500}\r\n })\r\n .bindPopup(\"You are here!\")\r\n .addTo(map)\r\n .openPopup();\r\n\r\n\r\n\r\n});\r\nmap.addEventListener('locationerror', function (e) {\r\n //alert(\"Unable to locate; please enable your browser's location service!\");\r\n});\r\n//end of map locating\r\n\r\n//load all feature layers to map\r\nObject.keys(layersIndex).forEach(item => {\r\n let _url = `${mapsURL}/${layersIndex[item]}`;\r\n layers[item] = L.esri.featureLayer({\r\n url: _url,\r\n pointToLayer: (geojson, latlng)=>{\r\n return L.marker(latlng, {icon: icons[item], pane: map.createPane(String(item))});},\r\n onEachFeature: (f, lyr)=>{\r\n let content = setPopup(f, item);\r\n lyr.bindPopup(content).addTo(map);\r\n }\r\n\r\n });\r\n layers[item].addTo(map);\r\n});\r\n\r\n\r\n//add eventlistener to layerWin item\r\nlet lyrLinks = document.querySelectorAll(\"#layerSel a\");\r\nlyrLinks.forEach(lyrLink=>{\r\n lyrLink.addEventListener('click',e =>{\r\n let lyrSlected = e.currentTarget.getAttribute(\"data-value\");\r\n Object.keys(layers).forEach(lyr => {\r\n if (lyr != lyrSlected && map.hasLayer(layers[lyr])) {map.removeLayer(layers[lyr]);}\r\n else if (lyr == lyrSlected && ! map.hasLayer(layers[lyr])) {map.addLayer(layers[lyr]);}\r\n else{}\r\n });\r\n //update the text of the dropdown button\r\n dropdown_span.innerHTML = e.currentTarget.innerHTML.split(\"\")[0];\r\n\r\n\r\n })\r\n})\r\n\r\nfunction setPopup(feature, lyrName){\r\n\r\n let var_dict = vars_dict[lyrName];\r\n let attrs = feature.properties;\r\n let vals = {};\r\n Object.keys(var_dict).forEach(key => {\r\n vals[key] = attrs[var_dict[key]];\r\n })\r\n let content = popupHTMLs[lyrName](vals);\r\n\r\n return content;\r\n}\r\n\r\n//add geocoder control\r\n\r\nlet geocode_point;\r\nconst southWest = L.latLng(41.363407,-71.829872),\r\n northEast = L.latLng(42.006935,-71.250924),\r\n bounds = L.latLngBounds(southWest,northEast);\r\nlet geocoder = L.esri.Geocoding.geosearch({\r\n position: 'topleft',\r\n searchBounds: bounds,\r\n title: \"Put in your address to find practices near you\",\r\n placeholder: \"RI Address search\",\r\n zoomToResult: false\r\n}).addTo(map);\r\nlet geocoder_result = L.layerGroup().addTo(map);\r\ngeocoder.addEventListener('results', results=>{\r\n geocoder_result.clearLayers();\r\n if (markerL != undefined) {\r\n map.removeLayer(markerL);\r\n };\r\n let result_1st = results.results[0].latlng;\r\n geocoder_result.addLayer(L.marker(result_1st, {riseOnHover:true, icon:iconL}));\r\n let nearest_points = get_nearest(result_1st,map, layers.groceryS ,8);\r\n //console.log(nearest_points);\r\n let nearest_bounds = L.latLngBounds(nearest_points);\r\n map.fitBounds(nearest_bounds);\r\n map.flyTo(result_1st);\r\n\r\n});\r\n\r\n\r\nfunction get_nearest(point,map,feature_layer,factor = 5){\r\n let arr_points = [];\r\n feature_layer.eachFeature(function(layer) {\r\n let feature = layer.feature;\r\n let fid_dis_point = {};\r\n //console.log(feature);\r\n let coor = {lat:feature.geometry.coordinates[1], lng: feature.geometry.coordinates[0]};\r\n let point_current = L.latLng(coor);\r\n let id = feature.id;\r\n let dis = map.distance(point_current,point);\r\n fid_dis_point.fid = id;\r\n fid_dis_point.dis = dis;\r\n fid_dis_point.point = point_current;\r\n arr_points.push(fid_dis_point);\r\n });\r\n arr_points.sort((a,b)=> (a.dis > b.dis)? 1:-1);\r\n let top3 = arr_points.slice(0,factor);\r\n let bounds = [point];\r\n let fitbounds =[];\r\n top3.forEach(function (element) {\r\n bounds.push(element.point);\r\n });\r\n bounds.forEach(function (x) {\r\n fitbounds.push(Object.values(x));\r\n });\r\n return fitbounds;\r\n};\r\n\r\n"]}