{"version":3,"sources":["Pages/Home/OpportunitiesMap.js"],"names":["volunteerGroupInfoWindowTemplate","activityInfoWindowTemplate","opportunitiesMap","markerClusterer","openInfoWindow","markers","placesIdsNearZip","searchAreaCircle","loadOpportunities","$","getJSON","data","config","opportunities","empty","select2","interests","val","selectedInterestIds","trigger","places","initMap","initEvents","initHandlebars","Handlebars","compile","html","google","maps","Circle","strokeColor","strokeOpacity","strokeWeight","fillColor","fillOpacity","center","LatLng","radius","Map","document","getElementById","zoom","streetViewControl","gestureHandling","forEach","p","marker","Marker","map","position","title","interestIds","x","interestId","placeId","infoWindowContent","opportunityType","infoWindow","InfoWindow","content","addListener","close","open","push","MarkerClusterer","imagePath","setMaxZoom","event","cluster","getZoom","minClusterZoom","setZoom","oms","OverlappingMarkerSpiderfier","markersWontMove","keepSpiderfied","m","addMarker","filterPlacesNearZip","on","updateMarkers","setMap","hasZipFilter","zipCode","length","postAsJson","JSON","stringify","latLng","lat","lng","setCenter","radiusInMeters","Number","setRadius","geometry","spherical","computeDistanceBetween","getPosition","getCenter","resetRadiusFilters","clearMarkers","placedIds","checkPlaceIds","includeMarker","some","id","includes","removeMarker"],"mappings":"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","file":"OpportunitiesMap.min.js","sourcesContent":["var volunteerGroupInfoWindowTemplate, activityInfoWindowTemplate;\nvar opportunitiesMap;\nvar markers = [];\nvar placesIdsNearZip = [];\nvar searchAreaCircle = null;\nvar markerClusterer;\nvar openInfoWindow;\n\n$(function () {\n $('.select2').select2();\n\n loadOpportunities();\n initHandlebars();\n});\n\nfunction loadOpportunities() {\n $.getJSON('/api/Home/GetOpportunities', function (data) {\n if (data) {\n config.opportunities = data.opportunities;\n $('#interestFilter').empty().select2({ data: data.interests }).val(data.selectedInterestIds).trigger('change');\n $('#placeFilter').empty().select2({ data: data.places }).trigger('change');\n initMap();\n initEvents();\n }\n });\n}\n\nfunction initHandlebars() {\n volunteerGroupInfoWindowTemplate = Handlebars.compile($('#volunteerGroupInfoWindowTemplate').html());\n activityInfoWindowTemplate = Handlebars.compile($('#activityInfoWindowTemplate').html());\n}\n\nfunction initMap() {\n searchAreaCircle = new google.maps.Circle({\n strokeColor: '#C0C0C0',\n strokeOpacity: 0.8,\n strokeWeight: 2,\n fillColor: \"#C0C0C0\",\n fillOpacity: 0.35,\n center: new google.maps.LatLng(config.center),\n radius: 25 * 1609.344 //Miles to meters\n });\n\n opportunitiesMap = new google.maps.Map(document.getElementById('opportunitiesMap'), {\n center: config.center,\n zoom: config.zoom,\n streetViewControl: false,\n gestureHandling: 'greedy'\n });\n\n config.opportunities.forEach(function (p) {\n var marker = new google.maps.Marker({\n map: opportunitiesMap,\n position: p.position,\n title: p.title,\n interestIds: p.interests.map(function (x) { return x.interestId }),\n placeId: p.placeId\n });\n\n var infoWindowContent = null;\n\n if (p.opportunityType === 'volunteerGroup') {\n infoWindowContent = volunteerGroupInfoWindowTemplate(p)\n }\n else if (p.opportunityType === 'activity') {\n infoWindowContent = activityInfoWindowTemplate(p)\n }\n\n var infoWindow = new google.maps.InfoWindow({\n content: infoWindowContent\n });\n\n marker.addListener(\"click\", function () {\n if (openInfoWindow) {\n openInfoWindow.close();\n }\n infoWindow.open(opportunitiesMap, marker);\n openInfoWindow = infoWindow;\n });\n\n markers.push(marker);\n });\n\n // Add a marker clusterer to manage the markers.\n markerClusterer = new MarkerClusterer(opportunitiesMap, markers, {\n imagePath: \"/lib/marker-clusterer-plus/images/m\"\n });\n\n var minClusterZoom = 15; //(first level without clustering)\n markerClusterer.setMaxZoom(minClusterZoom);\n\n google.maps.event.addListener(markerClusterer, 'clusterclick', function (cluster) {\n if (opportunitiesMap.getZoom() > minClusterZoom + 1) { // If zoomed in past minClusterZoom, zoom out to minClusterZoom\n opportunitiesMap.setZoom(minClusterZoom + 1);\n }\n });\n\n // Make overlapping markers spider\n var oms = new OverlappingMarkerSpiderfier(opportunitiesMap, {\n markersWontMove: true,\n keepSpiderfied: true\n });\n\n markers.forEach(function (m) {\n oms.addMarker(m);\n });\n\n //Initial zip filter\n if ($('#zipCodeFilter').val()) {\n filterPlacesNearZip();\n }\n}\n\nfunction initEvents() {\n $(document).on('change', '#interestFilter', updateMarkers);\n $(document).on('change', '#placeFilter', updateMarkers);\n $(document).on('input', '#zipCodeFilter', filterPlacesNearZip);\n $(document).on('change', '#radiusFilter', filterPlacesNearZip);\n\n $(document).on('click', '#clearFiltersBtn', function () {\n searchAreaCircle.setMap(null);\n placesIdsNearZip = [];\n $('#zipCodeFilter').val('');\n $('#radiusFilter').val('25');\n $('#placeFilter').val('').trigger('change');\n $('#interestFilter').val('').trigger('change');\n });\n\n google.maps.event.addListener(opportunitiesMap, 'click', function () {\n if (openInfoWindow) {\n openInfoWindow.close();\n }\n });\n}\n\nfunction hasZipFilter() {\n var zipCode = $('#zipCodeFilter').val();\n var radius = $('#radiusFilter').val();\n\n return (radius && zipCode && zipCode.length === 5);\n}\n\nfunction filterPlacesNearZip() {\n var zipCode = $('#zipCodeFilter').val();\n var radius = $('#radiusFilter').val();\n\n if (hasZipFilter()) {\n postAsJson('/api/Home/GetLatLngByZipCode', JSON.stringify({ zipCode: zipCode }), function (latLng) {\n if (latLng && latLng.lat && latLng.lng) {\n opportunitiesMap.setCenter(latLng);\n\n var radiusInMeters = Number(radius) * 1609.344; //miles to meters\n\n searchAreaCircle.setCenter(new google.maps.LatLng(latLng));\n searchAreaCircle.setRadius(radiusInMeters);\n searchAreaCircle.setMap(opportunitiesMap);\n\n placesIdsNearZip = [];\n markers.forEach(function (x) {\n var distanceBetweenInMeters = google.maps.geometry.spherical.computeDistanceBetween(x.getPosition(), searchAreaCircle.getCenter());\n\n if (distanceBetweenInMeters <= radiusInMeters) {\n placesIdsNearZip.push(x.placeId);\n }\n });\n\n updateMarkers();\n }\n else {\n resetRadiusFilters();\n }\n });\n }\n else {\n resetRadiusFilters();\n }\n}\n\nfunction resetRadiusFilters() {\n placesIdsNearZip = [];\n searchAreaCircle.setMap(null);\n}\n\nfunction updateMarkers() {\n markerClusterer.clearMarkers();\n var interestIds = $('#interestFilter').val();\n var placedIds = $('#placeFilter').val();\n var checkPlaceIds = hasZipFilter();\n\n markers.forEach(function (x) {\n var includeMarker = true;\n\n if (interestIds && interestIds.length > 0 && !interestIds.some(function (id) { return x.interestIds.includes(id); })) {\n includeMarker = false;\n }\n\n if (placedIds && placedIds.length > 0 && !placedIds.some(function (id) { return x.placeId === id; })) {\n includeMarker = false;\n }\n\n if (checkPlaceIds && !placesIdsNearZip.some(function (id) { return x.placeId === id; })) {\n includeMarker = false;\n }\n\n if (includeMarker) {\n x.setMap(opportunitiesMap);\n markerClusterer.addMarker(x);\n }\n else {\n x.setMap(null);\n markerClusterer.removeMarker(x);\n }\n });\n}"]}