{"version":3,"sources":["markerclusterer.js","app.js","oms.min.js","actions-bar.controller.js","actions-bar.directive.js","asset-map.controller.js","asset-map.directive.js","asset-map-table.controller.js","asset-map-table.directive.js","macy.js","assets-list.controller.js","assets-list.directive.js","assets.service.js","click-out-to-close.directive.js","communities.controller.js","communities.directive.js","communities.service.js","communities-list.controller.js","communities-list.directive.js","community-data-table.controller.js","community-data-table.directive.js","domain-indicator-picker.controller.js","domain-indicator-picker.directive.js","domain-selector.controller.js","domain-selector.directive.js","domain-selector.service.js","domain-year-picker.controller.js","domain-year-picker.directive.js","legend.service.js","loading.service.js","race-ethno-charts.controller.js","race-ethno-charts.directive.js","ng-map.min.js","risk-ranking-map.controller.js","risk-ranking-map.directive.js","typeahead.controller.js","typeahead.directive.js","rankings-service.js","reverse.filter.js"],"names":["MarkerClusterer","map","opt_markers","opt_options","this","extend","google","maps","OverlayView","map_","markers_","clusters_","sizes","styles_","ready_","options","groupPredicate_","m1","m2","gridSize_","minClusterSize_","maxZoom_","imagePath_","MARKER_CLUSTER_IMAGE_PATH_","imageExtension_","MARKER_CLUSTER_IMAGE_EXTENSION_","zoomOnClick_","undefined","averageCenter_","setupStyles_","setMap","prevZoom_","getZoom","that","event","addListener","zoom","resetViewport","redraw","length","addMarkers","Cluster","markerClusterer","markerClusterer_","getMap","getGridSize","getMinClusterSize","isAverageCenter","center_","bounds_","clusterIcon_","ClusterIcon","getStyles","cluster","styles","opt_padding","getMarkerClusterer","padding_","cluster_","div_","sums_","visible_","angular","module","h","u","v","A","B","hasOwnProperty","C","slice","OverlappingMarkerSpiderfier","w","b","d","a","g","f","e","c","call","constructor","n","p","unspiderfy","s","t","q","k","y","z","prototype","VERSION","MapTypeId","Math","PI","keepSpiderfied","markersWontHide","markersWontMove","nearbyDistance","circleSpiralSwitchover","circleFootSeparation","circleStartAngle","spiralFootSeparation","spiralLengthStart","spiralLengthFactor","spiderfiedZIndex","usualLegZIndex","highlightedLegZIndex","legWeight","legColors","usual","highlighted","HYBRID","SATELLITE","TERRAIN","ROADMAP","j","addMarker","_oms","F","push","o","_omsData","getVisible","getMarkers","removeMarker","m","splice","removeListener","clearMarkers","clearListeners","trigger","arguments","apply","Point","x","cos","sin","l","getStreetView","getMapTypeId","position","G","markersNearMarker","getProjection","markersNearAnyOtherMarker","r","i","setOptions","strokeColor","mapTypeId","zIndex","reverse","D","Polyline","path","strokeWeight","setPosition","setZIndex","round","fromLatLngToDivPixel","fromDivPixelToLatLng","indexOf","draw","window","controller","$scope","$location","$http","getEncodedUrl","encodeURIComponent","currentURL","absUrl","imageDownload","inProgress","error","getEncodedURL","assetRawDataUrl","state","selectedIndicator","id","selectedAssets","assetId","assetParents","findAssetParent","assetsById","name","trim","join","$watch","oldVal","newVal","search","selectedCommunities","communities","retryCount","downloadImage","url","method","responseType","success","data","status","headers","config","file","Blob","type","fileName","navigator","msSaveOrOpenBlob","msSaveBlob","fileURL","URL","createObjectURL","tempLink","document","createElement","href","target","download","body","appendChild","click","removeChild","console","log","directive","restrict","scope","$q","$timeout","$attrs","NgMap","AssetsService","LoadingService","pinPath","pinPathSolid","overlapDistance","standardIcon","color","labelOrigin","fillColor","fillOpacity","scale","countifyMarkerStyle","count","setIcon","icon","solidIcon","setLabel","text","toString","markerClusters","markerOverlappers","markerStash","markerReference","forEach","countLabel","label","standardizeMarkerStyle","gridSize","maxZoom","groupPredicate","communityDistrictId","fontFamily","height","width","fontSize","textColor","lineHeight","backgroundColor","domainsByName","border","borderRadius","domain","arr","markerArr","marker","isArea","polygon","mapMarker","ind","removeMarkers","fromLatLngToPixel","pow","proj","bounds","getBounds","nw","fromLatLngToPoint","LatLng","getNorthEast","lat","getSouthWest","lng","point","floor","markerIndexesNearMarker","markers","pxSq","markerPt","reduce","accum","pt1","pt2","dx","dy","ptDistanceSq","usualPosition","concat","findAndStyleOverlappingMarkers","_","debounce","Object","keys","key","mapBounds","skip","groups","overlaps","group","mi","groupOverlappingMarkers","filter","contains","assetsByGroup","newValue","oldValue","assetsByName","assetsLoadingId","taskStart","getAssets","then","response","taskEnd","assetDrawingId","newMarkers","selectedAssetMarkers","assetNumStash","processMarker","category","asset","domainsByAsset","markerID","description","long","newMarker","Marker","assetMouseOver","assetMouseOut","wkt","shapeData","ccc","viz","util","MapUtil","wktToGooglePolygon","markerLatLng","eventLoc","latLng2Point","mapHoverBox","posLeft","posTop","domainName","domainIcon","assetCategory","assetDescription","hoveredCommunity","communitiesById","isAsset","$apply","numberOfAssets","batchSize","batchMarkers","rest","promise","batch","when","buildNewMarkers","newMarkersArr","removeThese","assetMap","cap","triggerScreenshot","warn","attachMapListeners","once","lastZoom","zoomedInCount","curZoom","dataLayer","eventCategory","eventAction","eventLabel","location","pathname","obj1","obj2","object","property","onAdd","setReady_","size","fitMapToMarkers","LatLngBounds","getPosition","fitBounds","setStyles","isZoomOnClick","getTotalMarkers","setGroupPredicate","pred","getGroupPredicate","setMaxZoom","getMaxZoom","calculator_","numStyles","index","dv","parseInt","min","setCalculator","calculator","getCalculator","opt_nodraw","pushMarkerTo_","isAdded","repaint","removeMarker_","removed","ready","createClusters_","getTotalClusters","setGridSize","setMinClusterSize","getExtendedBounds","projection","tr","bl","trPix","blPix","ne","sw","isMarkerInBounds_","opt_hide","remove","oldClusters","setTimeout","distanceBetweenPoints_","p1","p2","dLat","dLon","atan2","sqrt","addToClosestCluster_","distance","clusterToAddTo","center","getCenter","isMarkerInClusterBounds","isMarkerAlreadyAdded","calculateBounds_","len","updateIcon","getSize","mz","hide","sums","setCenter","setSums","show","triggerClusterClick","pos","getPosFromLatLng_","style","cssText","createCss","innerHTML","getPanes","overlayMouseTarget","isDragging","addDomListener","latlng","_typeof","iconAnchor_","width_","height_","top","left","display","onRemove","parentNode","text_","index_","useStyle","max","url_","textColor_","anchor_","fontSize_","fontFamily_","fontWeight_","lineHeight_","backgroundPosition_","backgroundColor_","border_","borderRadius_","backgroundPosition","txtColor","fontWeight","$sanitize","groupsWithSelectedAssets","groupsArr","groupIdsArr","addAssetsToTable","parentGroup","children","groupID","assetOrChildIsSelected","shouldReturn","child","refreshMasonry","elm","Macy","init","container","margin","columns","assetsTable","root","factory","define","amd","exports","objects","merge","obj","prop","extended","getCurrentColumns","noOfColumns","docWidth","clientWidth","widths","cache","breakAt","getColumnWidths","marginIncluded","getTopValue","row","col","eles","tempHeight","totalHeight","getProperty","elements","replace","isNaN","recalculate","each","ele","removeAttribute","percentageWidth","val","setWidths","trueOrder","elements2d","tempIndexs","indexArray","elements2dLen","eleIndexs","eleIndexsLen","rows","reOrder","element2dArray","overflowEles","overflowElesLen","findIndexOfSmallestTotal","shuffleOrder","setContainerHeight","imagesLoaded","during","after","imgsRequired","currentlyLoaded","calculateOnImageLoad","imgs","selector","nl","querySelectorAll","offsetParent","unshift","img","complete","addEventListener","defaults","waitForImages","alternate","totalLeft","element2dArrayLen","rowArray","bubbleSort","rowArrayLen","smallestIndex","smallest","lastSmall","runningTotal","arrLen","element","value","getComputedStyle","getPropertyValue","highest","findLargestColumn","list","temp","func","querySelector","onImageLoad","removeEventListener","assetIdCounter","processAndGroupAssets","opts","generatedId","isTopLevel","isChildOfGroupId","topLevelGroupId","assets","findGroupDomain","groupName","output","domains","selectAsset","selectParent","selectedParent","assetIds","split","hasChildAssets","parentAssetIds","candidateId","removeAsset","removeParent","triggerLabelClick","assetID","$event","$","currentTarget","attr","includes","openAccordion","toggleAsset","toggleParent","hasSelectedChildren","assetChildIsSelected","resourceName","toggleAssetsByParent","assetIsSelected","toggleAccordion","parent","removeClass","addClass","groupId","forceSelect","assetGroupIsSelected","allAssetsAreSelected","toggleAllAssets","allSelected","elem","assetGroupHasSelectedAssets","assetGroup","checkForSelectedAssets","before","communitiesByRank","highestRankBefore","lowestRankBefore","highestRankAfter","lowestRankAfter","rrMap","styleShape","fips","newDomain","prevDomain","selectedDomain","defaultAsset","prevDefaultAsset","nonTopLevelAssets","targetAsset","defaultAssetChildren","domainAsset","find","parentAsset","assetsArray","deferred","defer","resolve","reject","$document","link","elemClickHandler","stopPropagation","docClickHandler","clickOutToClose","on","$on","off","rankingsService","assetPicker","addCommunity","communityId","removeCommunity","doPush","community","toggleCommunity","communityIsSelected","toggleCommunitiesByGroup","groupIsSelected","communitiesByGroup","filteredCommunitiesByGroup","communityIndex","checkForUserSelections","allSelectedBefore","highestRanked","lowestRanked","cd","build","oldCommunityRanks","communityData","sortedByGroup","sortedById","sortedByFips","communitiesByFips","sortedCommunities","sort","rank","getCommunityData","domainId","yearId","includeOtherIndicators","processCommunityData","sortList","indicator","isReverse","sorting","indicatorId","isActiveSortingDirection","indicators","findSelectedCommunities","array","sortTable","domainHasIndicator","parseIndicatorName","LegendService","mapLegend","legend","colorByCommunity","refreshLegend","getLegend","commIndValue","highDataValue","lowDataValue","indicatorGroup","colors","indicatorPickerIsOpen","CommunitiesService","DomainSelectorService","selectDomain","domainLoadingId","getDomainById","hasSelectedYear","match","year","selectedYear","years","colorByGroup","communityLoadingId","communityDistrictData","newIndicator","render","setDomainHoverState","domainIndex","isHovered","domainBorderStyle","thisDomain","hex","opacity","substring","hexToRgba","defaultDomainIndex","processDomainData","yearPickerIsOpen","$parent","cityDemographics","citywideStats","dataLayerPush","indicatorID","tasks","loadingTasks","taskId","random","showHoverStats","communityCharts","selectedChartCommunities","madeChartSelection","getFirstDemographic","demographics","rebuildCharts","forceReload","chartsToShow","demographicsIndicatorKey","all","thisChart","chartDefaults","datasets","remainder","demo","percent","chartLegend","Chart","getElementById","getContext","comm","Number","EPSILON","some","demographic","update","rebuild","commIds","labels","tooltips","enabled","responsive","toggleChartCommunity","selectedCharts","chartTypeahead","chartResetTypeahead","selectedIndex","filteredResults","chartQueryString","chartUpdateTypeahead","needle","haystack","parsedStr","toLowerCase","firstLettersFilter","chartTypeaheadKeyPressed","selectedId","chartTypeaheadSelected","require","$inject","BicyclingLayer","getOptions","getControlOptions","getEvents","drawing","DrawingManager","drawingMode","drawingmode","drawingControl","drawingcontrol","drawingControlOptions","circleOptions","circleoptions","markerOptions","markeroptions","polygonOptions","polygonoptions","polylineOptions","polylineoptions","rectangleOptions","rectangleoptions","$observe","setDrawingMode","addObject","bind","deleteObject","visualization","DynamicMapsEngineLayer","FusionTablesLayer","Array","MVCArray","HeatmapLayer","orgAttributes","KmlLayer","observeAttrSetObj","mapTypes","set","MapsEngineLayer","initMethod","overlayMapTypes","insertAt","TrafficLayer","TransitLayer","toUpperCase","JSON","parse","isoDateRE","Attr2MapOptions","$parse","$log","NavigatorGeolocation","GeoCoder","camelCaseFilter","jsonizeFilter","attributes","getJSON","getLatLng","parseFloat","isFinite","toOptionValue","input","getNumber","err","newOptions","doNotConverStringToNumber","err2","exp","eval","matches","capitalizedKey","charAt","weather","Date","expr","$eval","el","SymbolPath","Size","getAttrsToObserve","noWatcher","ControlPosition","service","provider","setDefaultOptions","M","O","defaultOptions","addMap","deleteMap","initMap","setStyle","getGeoLocation","observeAndSet","$get","StreetViewService","getPanoramaByLocation","StreetViewStatus","OK","pano","StreetViewPanorama","getDiv","enableCloseButton","setPano","getPanorama","setPanorama","currentStyle","defaultView","Map","initializeMap","eventListeners","controls","clear","heatmapLayers","getCurrentPosition","coords","latitude","longitude","geocode","address","geometry","getAttribute","inUse","mapInstances","resetMapInstances","getMapInstance","returnMapInstance","geolocation","timeout","Geocoder","GeocoderStatus","setStreetView","Circle","Polygon","Rectangle","clickable","GroundOverlay","centered","geoCallback","placesAutoComplete","places","Autocomplete","$setViewValue","setTypes","setComponentRestrictions","controllerAs","mapLazyLoadParams","mapLazyLoad","savedHtml","lazyLoadCallback","html","contents","src","pre","compile","css","InfoWindow","isString","wrap","__template","__open","anchor","setContent","open","content","parentElement","className","template","showInfoWindow","customMarkers","Error","infoWindows","singleInfoWindow","lastInfoWindow","hideInfoWindow","close","mapId","visible","visibleOnMarker","DirectionsService","travelMode","route","DirectionsStatus","setDirections","waypoints","origin","destination","panel","DirectionsRenderer","setPanel","visibility","getDraggable","draggable","setDraggable","offsetWidth","offsetHeight","setVisible","firstElementChild","mapOptions","mapEvents","objectChanged","clearInstanceListeners","zoomToIncludeMarkers","maximumZoom","enableMaximumZoomCheck","geoLocationOptions","geoFallbackCenter","addListenerOnce","$emit","mapInitialized","setZoom","lazyInit","triggerResize","latLng","topRight","bottomLeft","worldPoint","getPaths","doCommunityGroupToggle","doCommunityToggle","communityName","overlaysString","overlays","buttonValue","overlayIds","_index","radio","$hiddenRadio","parents","radioVal","overlayVals","renderOverlays","preventDefault","$content","self","isClosed","slideDown","slideUp","hasRendered","zoomControl","scrollWheel","forceInactive","cShapes","shape","determineShapeColorUsingLegend","indicatorsForCurCommunity","curIndicatorForCurCommunity","indicatorValueForCurLocation","findIndex","legendItem","actions","mouseover","communityRank","mouseout","debug","labelEngine","CCCLabelEngine","shapesLoadingId","wktPolygon","rawLatLng","renderLabels","labelLoadingTaskDone","labelsLoadingId","overlayColors","0","1","2","3","4","5","6","7","removeOverlays","overlayShapes","removeOverlayMarkers","overlayMarkers","overlaysLoadingId","labelClasslist","overlayTypeIds","hardcodedPositions","hardcodedPositionsByOverlayTypeAndFips","tokens","overlayType","labelContent","strokeOpacity","positions","noIcon","CIRCLE","labelXOffset","labelAnchor","MarkerWithLabel","labelClass","$filter","flatten","typeahead","resetTypeahead","queryString","updateTypeahead","focus","typeaheadKeyPressed","typeaheadSelected","zoomOnSelection","mapDiv","mapDim","WORLD_DIM","latRad","radX2","mapPx","worldPx","fraction","LN2","latFraction","lngDiff","lngFraction","latZoom","lngZoom","getBoundsZoomLevel","rankedCommunities","lowestRank","first","highestRank","last","items","isArray"],"mappings":"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","file":"risk-ranking-generated.js","sourcesContent":["/* global google */\r\n\r\n// ==ClosureCompiler==\r\n// @compilation_level ADVANCED_OPTIMIZATIONS\r\n// @externs_url https://raw.githubusercontent.com/google/closure-compiler/master/contrib/externs/maps/google_maps_api_v3.js\r\n// ==/ClosureCompiler==\r\n\r\n/**\r\n * @name MarkerClusterer for Google Maps v3\r\n * @version version 1.0\r\n * @author Luke Mahe\r\n * @fileoverview\r\n * The library creates and manages per-zoom-level clusters for large amounts of\r\n * markers.\r\n *
\r\n * This is a v3 implementation of the\r\n * v2 MarkerClusterer.\r\n */\r\n\r\n/**\r\n * @license\r\n * Copyright 2010 Google Inc. All Rights Reserved.\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n\r\n/**\r\n * A Marker Clusterer that clusters markers.\r\n *\r\n * @param {google.maps.Map} map The Google map to attach to.\r\n * @param {Array.=} opt_markers Optional markers to add to\r\n * the cluster.\r\n * @param {Object=} opt_options support the following options:\r\n * 'gridSize': (number) The grid size of a cluster in pixels.\r\n * 'maxZoom': (number) The maximum zoom level that a marker can be part of a\r\n * cluster.\r\n * 'zoomOnClick': (boolean) Whether the default behaviour of clicking on a\r\n * cluster is to zoom into it.\r\n * 'averageCenter': (boolean) Whether the center of each cluster should be\r\n * the average of all markers in the cluster.\r\n * 'minimumClusterSize': (number) The minimum number of markers to be in a\r\n * cluster before the markers are hidden and a count\r\n * is shown.\r\n * 'styles': (object) An object that has style properties:\r\n * 'url': (string) The image url.\r\n * 'height': (number) The image height.\r\n * 'width': (number) The image width.\r\n * 'anchor': (Array) The anchor position of the label text.\r\n * 'textColor': (string) The text color.\r\n * 'textSize': (number) The text size.\r\n * 'backgroundPosition': (string) The position of the backgound x, y.\r\n * 'iconAnchor': (Array) The anchor position of the icon x, y.\r\n * @constructor\r\n * @extends google.maps.OverlayView\r\n */\r\nfunction MarkerClusterer(map, opt_markers, opt_options) {\r\n // MarkerClusterer implements google.maps.OverlayView interface. We use the\r\n // extend function to extend MarkerClusterer with google.maps.OverlayView\r\n // because it might not always be available when the code is defined so we\r\n // look for it at the last possible moment. If it doesn't exist now then\r\n // there is no point going ahead :)\r\n this.extend(MarkerClusterer, google.maps.OverlayView);\r\n this.map_ = map;\r\n\r\n /**\r\n * @type {Array.}\r\n * @private\r\n */\r\n this.markers_ = [];\r\n\r\n /**\r\n * @type {Array.}\r\n */\r\n this.clusters_ = [];\r\n\r\n this.sizes = [53, 56, 66, 78, 90];\r\n\r\n /**\r\n * @private\r\n */\r\n this.styles_ = [];\r\n\r\n /**\r\n * @type {boolean}\r\n * @private\r\n */\r\n this.ready_ = false;\r\n\r\n var options = opt_options || {};\r\n\r\n /**\r\n * @private\r\n */\r\n this.groupPredicate_ =\r\n options[\"groupPredicate\"] ||\r\n function(m1, m2) {\r\n return true;\r\n };\r\n\r\n /**\r\n * @type {number}\r\n * @private\r\n */\r\n this.gridSize_ = options[\"gridSize\"] || 60;\r\n\r\n /**\r\n * @private\r\n */\r\n this.minClusterSize_ = options[\"minimumClusterSize\"] || 2;\r\n\r\n /**\r\n * @type {?number}\r\n * @private\r\n */\r\n this.maxZoom_ = options[\"maxZoom\"] || null;\r\n\r\n this.styles_ = options[\"styles\"] || [];\r\n\r\n /**\r\n * @type {string}\r\n * @private\r\n */\r\n this.imagePath_ = options[\"imagePath\"] || this.MARKER_CLUSTER_IMAGE_PATH_;\r\n\r\n /**\r\n * @type {string}\r\n * @private\r\n */\r\n this.imageExtension_ =\r\n options[\"imageExtension\"] || this.MARKER_CLUSTER_IMAGE_EXTENSION_;\r\n\r\n /**\r\n * @type {boolean}\r\n * @private\r\n */\r\n this.zoomOnClick_ = true;\r\n\r\n if (options[\"zoomOnClick\"] != undefined) {\r\n this.zoomOnClick_ = options[\"zoomOnClick\"];\r\n }\r\n\r\n /**\r\n * @type {boolean}\r\n * @private\r\n */\r\n this.averageCenter_ = false;\r\n\r\n if (options[\"averageCenter\"] != undefined) {\r\n this.averageCenter_ = options[\"averageCenter\"];\r\n }\r\n\r\n this.setupStyles_();\r\n\r\n this.setMap(map);\r\n\r\n /**\r\n * @type {number}\r\n * @private\r\n */\r\n this.prevZoom_ = this.map_.getZoom();\r\n\r\n // Add the map event listeners\r\n var that = this;\r\n google.maps.event.addListener(this.map_, \"zoom_changed\", function() {\r\n var zoom = that.map_.getZoom();\r\n\r\n if (that.prevZoom_ != zoom) {\r\n that.prevZoom_ = zoom;\r\n that.resetViewport();\r\n }\r\n });\r\n\r\n google.maps.event.addListener(this.map_, \"idle\", function() {\r\n that.redraw();\r\n });\r\n\r\n // Finally, add the markers\r\n if (opt_markers && opt_markers.length) {\r\n this.addMarkers(opt_markers, false);\r\n }\r\n}\r\n\r\n/**\r\n * The marker cluster image path.\r\n *\r\n * @type {string}\r\n * @private\r\n */\r\nMarkerClusterer.prototype.MARKER_CLUSTER_IMAGE_PATH_ = \"../images/m\";\r\n\r\n/**\r\n * The marker cluster image path.\r\n *\r\n * @type {string}\r\n * @private\r\n */\r\nMarkerClusterer.prototype.MARKER_CLUSTER_IMAGE_EXTENSION_ = \"png\";\r\n\r\n/**\r\n * Extends a objects prototype by anothers.\r\n *\r\n * @param {Object} obj1 The object to be extended.\r\n * @param {Object} obj2 The object to extend with.\r\n * @return {Object} The new extended object.\r\n * @ignore\r\n */\r\nMarkerClusterer.prototype.extend = function(obj1, obj2) {\r\n return function(object) {\r\n for (var property in object.prototype) {\r\n this.prototype[property] = object.prototype[property];\r\n }\r\n return this;\r\n }.apply(obj1, [obj2]);\r\n};\r\n\r\n/**\r\n * Implementaion of the interface method.\r\n * @ignore\r\n */\r\nMarkerClusterer.prototype.onAdd = function() {\r\n this.setReady_(true);\r\n};\r\n\r\n/**\r\n * Implementaion of the interface method.\r\n * @ignore\r\n */\r\nMarkerClusterer.prototype.draw = function() {};\r\n\r\n/**\r\n * Sets up the styles object.\r\n *\r\n * @private\r\n */\r\nMarkerClusterer.prototype.setupStyles_ = function() {\r\n if (this.styles_.length) {\r\n return;\r\n }\r\n\r\n for (var i = 0, size; (size = this.sizes[i]); i++) {\r\n this.styles_.push({\r\n url: this.imagePath_ + (i + 1) + \".\" + this.imageExtension_,\r\n height: size,\r\n width: size\r\n });\r\n }\r\n};\r\n\r\n/**\r\n * Fit the map to the bounds of the markers in the clusterer.\r\n */\r\nMarkerClusterer.prototype.fitMapToMarkers = function() {\r\n var markers = this.getMarkers();\r\n var bounds = new google.maps.LatLngBounds();\r\n for (var i = 0, marker; (marker = markers[i]); i++) {\r\n bounds.extend(marker.getPosition());\r\n }\r\n\r\n this.map_.fitBounds(bounds);\r\n};\r\n\r\n/**\r\n * Sets the styles.\r\n *\r\n * @param {Object} styles The style to set.\r\n */\r\nMarkerClusterer.prototype.setStyles = function(styles) {\r\n this.styles_ = styles;\r\n};\r\n\r\n/**\r\n * Gets the styles.\r\n *\r\n * @return {Object} The styles object.\r\n */\r\nMarkerClusterer.prototype.getStyles = function() {\r\n return this.styles_;\r\n};\r\n\r\n/**\r\n * Whether zoom on click is set.\r\n *\r\n * @return {boolean} True if zoomOnClick_ is set.\r\n */\r\nMarkerClusterer.prototype.isZoomOnClick = function() {\r\n return this.zoomOnClick_;\r\n};\r\n\r\n/**\r\n * Whether average center is set.\r\n *\r\n * @return {boolean} True if averageCenter_ is set.\r\n */\r\nMarkerClusterer.prototype.isAverageCenter = function() {\r\n return this.averageCenter_;\r\n};\r\n\r\n/**\r\n * Returns the array of markers in the clusterer.\r\n *\r\n * @return {Array.} The markers.\r\n */\r\nMarkerClusterer.prototype.getMarkers = function() {\r\n return this.markers_;\r\n};\r\n\r\n/**\r\n * Returns the number of markers in the clusterer\r\n *\r\n * @return {Number} The number of markers.\r\n */\r\nMarkerClusterer.prototype.getTotalMarkers = function() {\r\n return this.markers_.length;\r\n};\r\n\r\nMarkerClusterer.prototype.setGroupPredicate = function(pred) {\r\n this.groupPredicate_ = pred;\r\n};\r\n\r\nMarkerClusterer.prototype.getGroupPredicate = function() {\r\n return this.groupPredicate_;\r\n};\r\n\r\n/**\r\n * Sets the max zoom for the clusterer.\r\n *\r\n * @param {number} maxZoom The max zoom level.\r\n */\r\nMarkerClusterer.prototype.setMaxZoom = function(maxZoom) {\r\n this.maxZoom_ = maxZoom;\r\n};\r\n\r\n/**\r\n * Gets the max zoom for the clusterer.\r\n *\r\n * @return {number} The max zoom level.\r\n */\r\nMarkerClusterer.prototype.getMaxZoom = function() {\r\n return this.maxZoom_;\r\n};\r\n\r\n/**\r\n * The function for calculating the cluster icon image.\r\n *\r\n * @param {Array.} markers The markers in the clusterer.\r\n * @param {number} numStyles The number of styles available.\r\n * @return {Object} A object properties: 'text' (string) and 'index' (number).\r\n * @private\r\n */\r\nMarkerClusterer.prototype.calculator_ = function(markers, numStyles) {\r\n var index = 0;\r\n var count = markers.length;\r\n var dv = count;\r\n while (dv !== 0) {\r\n dv = parseInt(dv / 10, 10);\r\n index++;\r\n }\r\n\r\n index = Math.min(index, numStyles);\r\n return {\r\n text: count,\r\n index: index\r\n };\r\n};\r\n\r\n/**\r\n * Set the calculator function.\r\n *\r\n * @param {function(Array, number)} calculator The function to set as the\r\n * calculator. The function should return a object properties:\r\n * 'text' (string) and 'index' (number).\r\n *\r\n */\r\nMarkerClusterer.prototype.setCalculator = function(calculator) {\r\n this.calculator_ = calculator;\r\n};\r\n\r\n/**\r\n * Get the calculator function.\r\n *\r\n * @return {function(Array, number)} the calculator function.\r\n */\r\nMarkerClusterer.prototype.getCalculator = function() {\r\n return this.calculator_;\r\n};\r\n\r\n/**\r\n * Add an array of markers to the clusterer.\r\n *\r\n * @param {Array.} markers The markers to add.\r\n * @param {boolean=} opt_nodraw Whether to redraw the clusters.\r\n */\r\nMarkerClusterer.prototype.addMarkers = function(markers, opt_nodraw) {\r\n for (var i = 0, marker; (marker = markers[i]); i++) {\r\n this.pushMarkerTo_(marker);\r\n }\r\n if (!opt_nodraw) {\r\n this.redraw();\r\n }\r\n};\r\n\r\n/**\r\n * Pushes a marker to the clusterer.\r\n *\r\n * @param {google.maps.Marker} marker The marker to add.\r\n * @private\r\n */\r\nMarkerClusterer.prototype.pushMarkerTo_ = function(marker) {\r\n marker.isAdded = false;\r\n if (marker[\"draggable\"]) {\r\n // If the marker is draggable add a listener so we update the clusters on\r\n // the drag end.\r\n var that = this;\r\n google.maps.event.addListener(marker, \"dragend\", function() {\r\n marker.isAdded = false;\r\n that.repaint();\r\n });\r\n }\r\n this.markers_.push(marker);\r\n};\r\n\r\n/**\r\n * Adds a marker to the clusterer and redraws if needed.\r\n *\r\n * @param {google.maps.Marker} marker The marker to add.\r\n * @param {boolean=} opt_nodraw Whether to redraw the clusters.\r\n */\r\nMarkerClusterer.prototype.addMarker = function(marker, opt_nodraw) {\r\n this.pushMarkerTo_(marker);\r\n if (!opt_nodraw) {\r\n this.redraw();\r\n }\r\n};\r\n\r\n/**\r\n * Removes a marker and returns true if removed, false if not\r\n *\r\n * @param {google.maps.Marker} marker The marker to remove\r\n * @return {boolean} Whether the marker was removed or not\r\n * @private\r\n */\r\nMarkerClusterer.prototype.removeMarker_ = function(marker) {\r\n var index = -1;\r\n if (this.markers_.indexOf) {\r\n index = this.markers_.indexOf(marker);\r\n }\r\n else {\r\n for (var i = 0, m; (m = this.markers_[i]); i++) {\r\n if (m == marker) {\r\n index = i;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (index == -1) {\r\n // Marker is not in our list of markers.\r\n return false;\r\n }\r\n\r\n marker.setMap(null);\r\n\r\n this.markers_.splice(index, 1);\r\n\r\n return true;\r\n};\r\n\r\n/**\r\n * Remove a marker from the cluster.\r\n *\r\n * @param {google.maps.Marker} marker The marker to remove.\r\n * @param {boolean=} opt_nodraw Optional boolean to force no redraw.\r\n * @return {boolean} True if the marker was removed.\r\n */\r\nMarkerClusterer.prototype.removeMarker = function(marker, opt_nodraw) {\r\n var removed = this.removeMarker_(marker);\r\n\r\n if (!opt_nodraw && removed) {\r\n this.resetViewport();\r\n this.redraw();\r\n return true;\r\n }\r\n else {\r\n return false;\r\n }\r\n};\r\n\r\n/**\r\n * Removes an array of markers from the cluster.\r\n *\r\n * @param {Array.} markers The markers to remove.\r\n * @param {boolean=} opt_nodraw Optional boolean to force no redraw.\r\n */\r\nMarkerClusterer.prototype.removeMarkers = function(markers, opt_nodraw) {\r\n var removed = false;\r\n\r\n for (var i = 0, marker; (marker = markers[i]); i++) {\r\n var r = this.removeMarker_(marker);\r\n removed = removed || r;\r\n }\r\n\r\n if (!opt_nodraw && removed) {\r\n this.resetViewport();\r\n this.redraw();\r\n return true;\r\n }\r\n};\r\n\r\n/**\r\n * Sets the clusterer's ready state.\r\n *\r\n * @param {boolean} ready The state.\r\n * @private\r\n */\r\nMarkerClusterer.prototype.setReady_ = function(ready) {\r\n if (!this.ready_) {\r\n this.ready_ = ready;\r\n this.createClusters_();\r\n }\r\n};\r\n\r\n/**\r\n * Returns the number of clusters in the clusterer.\r\n *\r\n * @return {number} The number of clusters.\r\n */\r\nMarkerClusterer.prototype.getTotalClusters = function() {\r\n return this.clusters_.length;\r\n};\r\n\r\n/**\r\n * Returns the google map that the clusterer is associated with.\r\n *\r\n * @return {google.maps.Map} The map.\r\n */\r\nMarkerClusterer.prototype.getMap = function() {\r\n return this.map_;\r\n};\r\n\r\n/**\r\n * Sets the google map that the clusterer is associated with.\r\n *\r\n * @param {google.maps.Map} map The map.\r\n */\r\nMarkerClusterer.prototype.setMap = function(map) {\r\n this.map_ = map;\r\n};\r\n\r\n/**\r\n * Returns the size of the grid.\r\n *\r\n * @return {number} The grid size.\r\n */\r\nMarkerClusterer.prototype.getGridSize = function() {\r\n return this.gridSize_;\r\n};\r\n\r\n/**\r\n * Sets the size of the grid.\r\n *\r\n * @param {number} size The grid size.\r\n */\r\nMarkerClusterer.prototype.setGridSize = function(size) {\r\n this.gridSize_ = size;\r\n};\r\n\r\n/**\r\n * Returns the min cluster size.\r\n *\r\n * @return {number} The grid size.\r\n */\r\nMarkerClusterer.prototype.getMinClusterSize = function() {\r\n return this.minClusterSize_;\r\n};\r\n\r\n/**\r\n * Sets the min cluster size.\r\n *\r\n * @param {number} size The grid size.\r\n */\r\nMarkerClusterer.prototype.setMinClusterSize = function(size) {\r\n this.minClusterSize_ = size;\r\n};\r\n\r\n/**\r\n * Extends a bounds object by the grid size.\r\n *\r\n * @param {google.maps.LatLngBounds} bounds The bounds to extend.\r\n * @return {google.maps.LatLngBounds} The extended bounds.\r\n */\r\nMarkerClusterer.prototype.getExtendedBounds = function(bounds) {\r\n var projection = this.getProjection();\r\n\r\n // Turn the bounds into latlng.\r\n var tr = new google.maps.LatLng(\r\n bounds.getNorthEast().lat(),\r\n bounds.getNorthEast().lng()\r\n );\r\n var bl = new google.maps.LatLng(\r\n bounds.getSouthWest().lat(),\r\n bounds.getSouthWest().lng()\r\n );\r\n\r\n // Convert the points to pixels and the extend out by the grid size.\r\n var trPix = projection.fromLatLngToDivPixel(tr);\r\n trPix.x += this.gridSize_;\r\n trPix.y -= this.gridSize_;\r\n\r\n var blPix = projection.fromLatLngToDivPixel(bl);\r\n blPix.x -= this.gridSize_;\r\n blPix.y += this.gridSize_;\r\n\r\n // Convert the pixel points back to LatLng\r\n var ne = projection.fromDivPixelToLatLng(trPix);\r\n var sw = projection.fromDivPixelToLatLng(blPix);\r\n\r\n // Extend the bounds to contain the new bounds.\r\n bounds.extend(ne);\r\n bounds.extend(sw);\r\n\r\n return bounds;\r\n};\r\n\r\n/**\r\n * Determins if a marker is contained in a bounds.\r\n *\r\n * @param {google.maps.Marker} marker The marker to check.\r\n * @param {google.maps.LatLngBounds} bounds The bounds to check against.\r\n * @return {boolean} True if the marker is in the bounds.\r\n * @private\r\n */\r\nMarkerClusterer.prototype.isMarkerInBounds_ = function(marker, bounds) {\r\n return bounds.contains(marker.getPosition());\r\n};\r\n\r\n/**\r\n * Clears all clusters and markers from the clusterer.\r\n */\r\nMarkerClusterer.prototype.clearMarkers = function() {\r\n this.resetViewport(true);\r\n\r\n // Set the markers a empty array.\r\n this.markers_ = [];\r\n};\r\n\r\n/**\r\n * Clears all existing clusters and recreates them.\r\n * @param {boolean} opt_hide To also hide the marker.\r\n */\r\nMarkerClusterer.prototype.resetViewport = function(opt_hide) {\r\n // Remove all the clusters\r\n for (var i = 0, cluster; (cluster = this.clusters_[i]); i++) {\r\n cluster.remove();\r\n }\r\n\r\n // Reset the markers to not be added and to be invisible.\r\n for (var i = 0, marker; (marker = this.markers_[i]); i++) {\r\n marker.isAdded = false;\r\n if (opt_hide) {\r\n marker.setMap(null);\r\n }\r\n }\r\n\r\n this.clusters_ = [];\r\n};\r\n\r\n/**\r\n *\r\n */\r\nMarkerClusterer.prototype.repaint = function() {\r\n var oldClusters = this.clusters_.slice();\r\n this.clusters_.length = 0;\r\n this.resetViewport();\r\n this.redraw();\r\n\r\n // Remove the old clusters.\r\n // Do it in a timeout so the other clusters have been drawn first.\r\n window.setTimeout(function() {\r\n for (var i = 0, cluster; (cluster = oldClusters[i]); i++) {\r\n cluster.remove();\r\n }\r\n }, 0);\r\n};\r\n\r\n/**\r\n * Redraws the clusters.\r\n */\r\nMarkerClusterer.prototype.redraw = function() {\r\n this.createClusters_();\r\n};\r\n\r\n/**\r\n * Calculates the distance between two latlng locations in km.\r\n * @see http://www.movable-type.co.uk/scripts/latlong.html\r\n *\r\n * @param {google.maps.LatLng} p1 The first lat lng point.\r\n * @param {google.maps.LatLng} p2 The second lat lng point.\r\n * @return {number} The distance between the two points in km.\r\n * @private\r\n */\r\nMarkerClusterer.prototype.distanceBetweenPoints_ = function(p1, p2) {\r\n if (!p1 || !p2) {\r\n return 0;\r\n }\r\n\r\n var R = 6371; // Radius of the Earth in km\r\n var dLat = ((p2.lat() - p1.lat()) * Math.PI) / 180;\r\n var dLon = ((p2.lng() - p1.lng()) * Math.PI) / 180;\r\n var a =\r\n Math.sin(dLat / 2) * Math.sin(dLat / 2) +\r\n Math.cos((p1.lat() * Math.PI) / 180) *\r\n Math.cos((p2.lat() * Math.PI) / 180) *\r\n Math.sin(dLon / 2) *\r\n Math.sin(dLon / 2);\r\n var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\r\n var d = R * c;\r\n return d;\r\n};\r\n\r\n/**\r\n * Add a marker to a cluster, or creates a new cluster.\r\n *\r\n * @param {google.maps.Marker} marker The marker to add.\r\n * @private\r\n */\r\nMarkerClusterer.prototype.addToClosestCluster_ = function(marker) {\r\n var distance = 40000; // Some large number\r\n var clusterToAddTo = null;\r\n var pos = marker.getPosition();\r\n\r\n for (var i = 0, cluster; (cluster = this.clusters_[i]); i++) {\r\n if (this.getGroupPredicate().call(this, marker, cluster.getMarkers()[0])) {\r\n var center = cluster.getCenter();\r\n if (center) {\r\n var d = this.distanceBetweenPoints_(center, marker.getPosition());\r\n if (d < distance) {\r\n distance = d;\r\n clusterToAddTo = cluster;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (clusterToAddTo && clusterToAddTo.isMarkerInClusterBounds(marker)) {\r\n clusterToAddTo.addMarker(marker);\r\n }\r\n else {\r\n var cluster = new Cluster(this);\r\n cluster.addMarker(marker);\r\n this.clusters_.push(cluster);\r\n }\r\n};\r\n\r\n/**\r\n * Creates the clusters.\r\n *\r\n * @private\r\n */\r\nMarkerClusterer.prototype.createClusters_ = function() {\r\n if (!this.ready_) {\r\n return;\r\n }\r\n\r\n // Get our current map view bounds.\r\n // Create a new bounds object so we don't affect the map.\r\n var mapBounds = new google.maps.LatLngBounds(\r\n this.map_.getBounds().getSouthWest(),\r\n this.map_.getBounds().getNorthEast()\r\n );\r\n var bounds = this.getExtendedBounds(mapBounds);\r\n\r\n for (var i = 0, marker; (marker = this.markers_[i]); i++) {\r\n if (!marker.isAdded && this.isMarkerInBounds_(marker, bounds)) {\r\n this.addToClosestCluster_(marker);\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * A cluster that contains markers.\r\n *\r\n * @param {MarkerClusterer} markerClusterer The markerclusterer that this\r\n * cluster is associated with.\r\n * @constructor\r\n * @ignore\r\n */\r\nfunction Cluster(markerClusterer) {\r\n this.markerClusterer_ = markerClusterer;\r\n this.map_ = markerClusterer.getMap();\r\n this.gridSize_ = markerClusterer.getGridSize();\r\n this.minClusterSize_ = markerClusterer.getMinClusterSize();\r\n this.averageCenter_ = markerClusterer.isAverageCenter();\r\n this.center_ = null;\r\n this.markers_ = [];\r\n this.bounds_ = null;\r\n this.clusterIcon_ = new ClusterIcon(\r\n this,\r\n markerClusterer.getStyles(),\r\n markerClusterer.getGridSize()\r\n );\r\n}\r\n\r\n/**\r\n * Determins if a marker is already added to the cluster.\r\n *\r\n * @param {google.maps.Marker} marker The marker to check.\r\n * @return {boolean} True if the marker is already added.\r\n */\r\nCluster.prototype.isMarkerAlreadyAdded = function(marker) {\r\n if (this.markers_.indexOf) {\r\n return this.markers_.indexOf(marker) != -1;\r\n }\r\n else {\r\n for (var i = 0, m; (m = this.markers_[i]); i++) {\r\n if (m == marker) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n};\r\n\r\n/**\r\n * Add a marker the cluster.\r\n *\r\n * @param {google.maps.Marker} marker The marker to add.\r\n * @return {boolean} True if the marker was added.\r\n */\r\nCluster.prototype.addMarker = function(marker) {\r\n if (this.isMarkerAlreadyAdded(marker)) {\r\n return false;\r\n }\r\n\r\n if (!this.center_) {\r\n this.center_ = marker.getPosition();\r\n this.calculateBounds_();\r\n }\r\n else {\r\n if (this.averageCenter_) {\r\n var l = this.markers_.length + 1;\r\n var lat = (this.center_.lat() * (l - 1) + marker.getPosition().lat()) / l;\r\n var lng = (this.center_.lng() * (l - 1) + marker.getPosition().lng()) / l;\r\n this.center_ = new google.maps.LatLng(lat, lng);\r\n this.calculateBounds_();\r\n }\r\n }\r\n\r\n marker.isAdded = true;\r\n this.markers_.push(marker);\r\n\r\n var len = this.markers_.length;\r\n if (len < this.minClusterSize_ && marker.getMap() != this.map_) {\r\n // Min cluster size not reached so show the marker.\r\n marker.setMap(this.map_);\r\n }\r\n\r\n if (len == this.minClusterSize_) {\r\n // Hide the markers that were showing.\r\n for (var i = 0; i < len; i++) {\r\n this.markers_[i].setMap(null);\r\n }\r\n }\r\n\r\n if (len >= this.minClusterSize_) {\r\n marker.setMap(null);\r\n }\r\n\r\n this.updateIcon();\r\n return true;\r\n};\r\n\r\n/**\r\n * Returns the marker clusterer that the cluster is associated with.\r\n *\r\n * @return {MarkerClusterer} The associated marker clusterer.\r\n */\r\nCluster.prototype.getMarkerClusterer = function() {\r\n return this.markerClusterer_;\r\n};\r\n\r\n/**\r\n * Returns the bounds of the cluster.\r\n *\r\n * @return {google.maps.LatLngBounds} the cluster bounds.\r\n */\r\nCluster.prototype.getBounds = function() {\r\n var bounds = new google.maps.LatLngBounds(this.center_, this.center_);\r\n var markers = this.getMarkers();\r\n for (var i = 0, marker; (marker = markers[i]); i++) {\r\n bounds.extend(marker.getPosition());\r\n }\r\n return bounds;\r\n};\r\n\r\n/**\r\n * Removes the cluster\r\n */\r\nCluster.prototype.remove = function() {\r\n this.clusterIcon_.remove();\r\n this.markers_.length = 0;\r\n delete this.markers_;\r\n};\r\n\r\n/**\r\n * Returns the center of the cluster.\r\n *\r\n * @return {number} The cluster center.\r\n */\r\nCluster.prototype.getSize = function() {\r\n return this.markers_.length;\r\n};\r\n\r\n/**\r\n * Returns the center of the cluster.\r\n *\r\n * @return {Array.} The cluster center.\r\n */\r\nCluster.prototype.getMarkers = function() {\r\n return this.markers_;\r\n};\r\n\r\n/**\r\n * Returns the center of the cluster.\r\n *\r\n * @return {google.maps.LatLng} The cluster center.\r\n */\r\nCluster.prototype.getCenter = function() {\r\n return this.center_;\r\n};\r\n\r\n/**\r\n * Calculated the extended bounds of the cluster with the grid.\r\n *\r\n * @private\r\n */\r\nCluster.prototype.calculateBounds_ = function() {\r\n var bounds = new google.maps.LatLngBounds(this.center_, this.center_);\r\n this.bounds_ = this.markerClusterer_.getExtendedBounds(bounds);\r\n};\r\n\r\n/**\r\n * Determines if a marker lies in the clusters bounds.\r\n *\r\n * @param {google.maps.Marker} marker The marker to check.\r\n * @return {boolean} True if the marker lies in the bounds.\r\n */\r\nCluster.prototype.isMarkerInClusterBounds = function(marker) {\r\n return this.bounds_.contains(marker.getPosition());\r\n};\r\n\r\n/**\r\n * Returns the map that the cluster is associated with.\r\n *\r\n * @return {google.maps.Map} The map.\r\n */\r\nCluster.prototype.getMap = function() {\r\n return this.map_;\r\n};\r\n\r\n/**\r\n * Updates the cluster icon\r\n */\r\nCluster.prototype.updateIcon = function() {\r\n var zoom = this.map_.getZoom();\r\n var mz = this.markerClusterer_.getMaxZoom();\r\n\r\n if (mz && zoom > mz) {\r\n // The zoom is greater than our max zoom so show all the markers in cluster.\r\n for (var i = 0, marker; (marker = this.markers_[i]); i++) {\r\n marker.setMap(this.map_);\r\n }\r\n return;\r\n }\r\n\r\n if (this.markers_.length < this.minClusterSize_) {\r\n // Min cluster size not yet reached.\r\n this.clusterIcon_.hide();\r\n return;\r\n }\r\n\r\n var numStyles = this.markerClusterer_.getStyles().length;\r\n var sums = this.markerClusterer_.getCalculator()(this.markers_, numStyles);\r\n this.clusterIcon_.setCenter(this.center_);\r\n this.clusterIcon_.setSums(sums);\r\n this.clusterIcon_.show();\r\n};\r\n\r\n/**\r\n * A cluster icon\r\n *\r\n * @param {Cluster} cluster The cluster to be associated with.\r\n * @param {Object} styles An object that has style properties:\r\n * 'url': (string) The image url.\r\n * 'height': (number) The image height.\r\n * 'width': (number) The image width.\r\n * 'anchor': (Array) The anchor position of the label text.\r\n * 'textColor': (string) The text color.\r\n * 'textSize': (number) The text size.\r\n * 'backgroundPosition: (string) The background postition x, y.\r\n * @param {number=} opt_padding Optional padding to apply to the cluster icon.\r\n * @constructor\r\n * @extends google.maps.OverlayView\r\n * @ignore\r\n */\r\nfunction ClusterIcon(cluster, styles, opt_padding) {\r\n cluster.getMarkerClusterer().extend(ClusterIcon, google.maps.OverlayView);\r\n\r\n this.styles_ = styles;\r\n this.padding_ = opt_padding || 0;\r\n this.cluster_ = cluster;\r\n this.center_ = null;\r\n this.map_ = cluster.getMap();\r\n this.div_ = null;\r\n this.sums_ = null;\r\n this.visible_ = false;\r\n\r\n this.setMap(this.map_);\r\n}\r\n\r\n/**\r\n * Triggers the clusterclick event and zoom's if the option is set.\r\n *\r\n * @param {google.maps.MouseEvent} event The event to propagate\r\n */\r\nClusterIcon.prototype.triggerClusterClick = function(event) {\r\n var markerClusterer = this.cluster_.getMarkerClusterer();\r\n\r\n // Trigger the clusterclick event.\r\n google.maps.event.trigger(\r\n markerClusterer,\r\n \"clusterclick\",\r\n this.cluster_,\r\n event\r\n );\r\n\r\n if (markerClusterer.isZoomOnClick()) {\r\n // Zoom into the cluster.\r\n this.map_.fitBounds(this.cluster_.getBounds());\r\n }\r\n};\r\n\r\n/**\r\n * Adding the cluster icon to the dom.\r\n * @ignore\r\n */\r\nClusterIcon.prototype.onAdd = function() {\r\n this.div_ = document.createElement(\"DIV\");\r\n if (this.visible_) {\r\n var pos = this.getPosFromLatLng_(this.center_);\r\n this.div_.style.cssText = this.createCss(pos);\r\n this.div_.innerHTML = this.sums_.text;\r\n }\r\n\r\n var panes = this.getPanes();\r\n panes.overlayMouseTarget.appendChild(this.div_);\r\n\r\n var that = this;\r\n var isDragging = false;\r\n google.maps.event.addDomListener(this.div_, \"click\", function(event) {\r\n // Only perform click when not preceded by a drag\r\n if (!isDragging) {\r\n that.triggerClusterClick(event);\r\n }\r\n });\r\n google.maps.event.addDomListener(this.div_, \"mousedown\", function() {\r\n isDragging = false;\r\n });\r\n google.maps.event.addDomListener(this.div_, \"mousemove\", function() {\r\n isDragging = true;\r\n });\r\n};\r\n\r\n/**\r\n * Returns the position to place the div dending on the latlng.\r\n *\r\n * @param {google.maps.LatLng} latlng The position in latlng.\r\n * @return {google.maps.Point} The position in pixels.\r\n * @private\r\n */\r\nClusterIcon.prototype.getPosFromLatLng_ = function(latlng) {\r\n var pos = this.getProjection().fromLatLngToDivPixel(latlng);\r\n\r\n if (typeof this.iconAnchor_ === \"object\" && this.iconAnchor_.length === 2) {\r\n pos.x -= this.iconAnchor_[0];\r\n pos.y -= this.iconAnchor_[1];\r\n }\r\n else {\r\n pos.x -= parseInt(this.width_ / 2, 10);\r\n pos.y -= parseInt(this.height_ / 2, 10);\r\n }\r\n return pos;\r\n};\r\n\r\n/**\r\n * Draw the icon.\r\n * @ignore\r\n */\r\nClusterIcon.prototype.draw = function() {\r\n if (this.visible_) {\r\n var pos = this.getPosFromLatLng_(this.center_);\r\n this.div_.style.top = pos.y + \"px\";\r\n this.div_.style.left = pos.x + \"px\";\r\n }\r\n};\r\n\r\n/**\r\n * Hide the icon.\r\n */\r\nClusterIcon.prototype.hide = function() {\r\n if (this.div_) {\r\n this.div_.style.display = \"none\";\r\n }\r\n this.visible_ = false;\r\n};\r\n\r\n/**\r\n * Position and show the icon.\r\n */\r\nClusterIcon.prototype.show = function() {\r\n if (this.div_) {\r\n var pos = this.getPosFromLatLng_(this.center_);\r\n this.div_.style.cssText = this.createCss(pos);\r\n this.div_.style.display = \"\";\r\n }\r\n this.visible_ = true;\r\n};\r\n\r\n/**\r\n * Remove the icon from the map\r\n */\r\nClusterIcon.prototype.remove = function() {\r\n this.setMap(null);\r\n};\r\n\r\n/**\r\n * Implementation of the onRemove interface.\r\n * @ignore\r\n */\r\nClusterIcon.prototype.onRemove = function() {\r\n if (this.div_ && this.div_.parentNode) {\r\n this.hide();\r\n this.div_.parentNode.removeChild(this.div_);\r\n this.div_ = null;\r\n }\r\n};\r\n\r\n/**\r\n * Set the sums of the icon.\r\n *\r\n * @param {Object} sums The sums containing:\r\n * 'text': (string) The text to display in the icon.\r\n * 'index': (number) The style index of the icon.\r\n */\r\nClusterIcon.prototype.setSums = function(sums) {\r\n this.sums_ = sums;\r\n this.text_ = sums.text;\r\n this.index_ = sums.index;\r\n if (this.div_) {\r\n this.div_.innerHTML = sums.text;\r\n }\r\n\r\n this.useStyle();\r\n};\r\n\r\n/**\r\n * Sets the icon to the the styles.\r\n */\r\nClusterIcon.prototype.useStyle = function() {\r\n var index = Math.max(0, this.sums_.index - 1);\r\n index = Math.min(this.styles_.length - 1, index);\r\n var style = this.styles_[index];\r\n this.url_ = style[\"url\"];\r\n this.height_ = style[\"height\"];\r\n this.width_ = style[\"width\"];\r\n this.textColor_ = style[\"textColor\"];\r\n this.anchor_ = style[\"anchor\"];\r\n this.fontSize_ = style[\"fontSize\"];\r\n this.fontFamily_ = style[\"fontFamily\"];\r\n this.fontWeight_ = style[\"fontWeight\"];\r\n this.lineHeight_ = style[\"lineHeight\"];\r\n this.backgroundPosition_ = style[\"backgroundPosition\"];\r\n this.backgroundColor_ = style[\"backgroundColor\"];\r\n this.border_ = style[\"border\"];\r\n this.borderRadius_ = style[\"borderRadius\"];\r\n this.iconAnchor_ = style[\"iconAnchor\"];\r\n};\r\n\r\n/**\r\n * Sets the center of the icon.\r\n *\r\n * @param {google.maps.LatLng} center The latlng to set as the center.\r\n */\r\nClusterIcon.prototype.setCenter = function(center) {\r\n this.center_ = center;\r\n};\r\n\r\n/**\r\n * Create the css text based on the position of the icon.\r\n *\r\n * @param {google.maps.Point} pos The position.\r\n * @return {string} The css style text.\r\n */\r\nClusterIcon.prototype.createCss = function(pos) {\r\n var style = [];\r\n style.push(\"background-image:url(\" + this.url_ + \");\");\r\n var backgroundPosition = this.backgroundPosition_\r\n ? this.backgroundPosition_\r\n : \"0 0\";\r\n style.push(\"background-position:\" + backgroundPosition + \";\");\r\n\r\n if (typeof this.anchor_ === \"object\") {\r\n if (\r\n typeof this.anchor_[0] === \"number\" &&\r\n this.anchor_[0] > 0 &&\r\n this.anchor_[0] < this.height_\r\n ) {\r\n style.push(\r\n \"height:\" +\r\n (this.height_ - this.anchor_[0]) +\r\n \"px; padding-top:\" +\r\n this.anchor_[0] +\r\n \"px;\"\r\n );\r\n }\r\n else if (\r\n typeof this.anchor_[0] === \"number\" &&\r\n this.anchor_[0] < 0 &&\r\n -this.anchor_[0] < this.height_\r\n ) {\r\n style.push(\r\n \"height:\" +\r\n this.height_ +\r\n \"px; line-height:\" +\r\n (this.height_ + this.anchor_[0]) +\r\n \"px;\"\r\n );\r\n }\r\n else {\r\n style.push(\r\n \"height:\" + this.height_ + \"px; line-height:\" + this.height_ + \"px;\"\r\n );\r\n }\r\n if (\r\n typeof this.anchor_[1] === \"number\" &&\r\n this.anchor_[1] > 0 &&\r\n this.anchor_[1] < this.width_\r\n ) {\r\n style.push(\r\n \"width:\" +\r\n (this.width_ - this.anchor_[1]) +\r\n \"px; padding-left:\" +\r\n this.anchor_[1] +\r\n \"px;\"\r\n );\r\n }\r\n else {\r\n style.push(\"width:\" + this.width_ + \"px; text-align:center;\");\r\n }\r\n }\r\n else {\r\n style.push(\r\n \"height:\" +\r\n this.height_ +\r\n \"px; line-height:\" +\r\n this.height_ +\r\n \"px; width:\" +\r\n this.width_ +\r\n \"px; text-align:center;\"\r\n );\r\n }\r\n\r\n var txtColor = this.textColor_ ? this.textColor_ : \"black\";\r\n var fontSize = this.fontSize_ ? this.fontSize_ : 11;\r\n var fontFamily = this.fontFamily_\r\n ? this.fontFamily_\r\n : \"Helvetica, Arial, sans-serif\";\r\n var fontWeight = this.fontWeight_ ? this.fontWeight_ : \"500\";\r\n var lineHeight = this.lineHeight_ ? this.lineHeight_ : \"auto\";\r\n var backgroundColor = this.backgroundColor_\r\n ? this.backgroundColor_\r\n : \"transparent\";\r\n var border = this.border_ ? this.border_ : \"none\";\r\n var borderRadius = this.borderRadius_ ? this.borderRadius_ : \"0\";\r\n style.push(\r\n \"cursor:pointer; top:\" +\r\n pos.y +\r\n \"px; left:\" +\r\n pos.x +\r\n \"px; color:\" +\r\n txtColor +\r\n \"; position:absolute; font-size:\" +\r\n fontSize +\r\n \"; line-height:\" +\r\n lineHeight +\r\n \"; font-family:\" +\r\n fontFamily +\r\n \"; font-weight: \" +\r\n fontWeight +\r\n \"; background-color: \" +\r\n backgroundColor +\r\n \"; border: \" +\r\n border +\r\n \"; border-radius: \" +\r\n borderRadius +\r\n \";\"\r\n );\r\n return style.join(\"\");\r\n};\r\n\r\n// Export Symbols for Closure\r\n// If you are not going to compile with closure then you can remove the\r\n// code below.\r\nwindow[\"MarkerClusterer\"] = MarkerClusterer;\r\nMarkerClusterer.prototype[\"addMarker\"] = MarkerClusterer.prototype.addMarker;\r\nMarkerClusterer.prototype[\"addMarkers\"] = MarkerClusterer.prototype.addMarkers;\r\nMarkerClusterer.prototype[\"clearMarkers\"] =\r\n MarkerClusterer.prototype.clearMarkers;\r\nMarkerClusterer.prototype[\"fitMapToMarkers\"] =\r\n MarkerClusterer.prototype.fitMapToMarkers;\r\nMarkerClusterer.prototype[\"getCalculator\"] =\r\n MarkerClusterer.prototype.getCalculator;\r\nMarkerClusterer.prototype[\"getGridSize\"] =\r\n MarkerClusterer.prototype.getGridSize;\r\nMarkerClusterer.prototype[\"getExtendedBounds\"] =\r\n MarkerClusterer.prototype.getExtendedBounds;\r\nMarkerClusterer.prototype[\"getMap\"] = MarkerClusterer.prototype.getMap;\r\nMarkerClusterer.prototype[\"getMarkers\"] = MarkerClusterer.prototype.getMarkers;\r\nMarkerClusterer.prototype[\"getMaxZoom\"] = MarkerClusterer.prototype.getMaxZoom;\r\nMarkerClusterer.prototype[\"getStyles\"] = MarkerClusterer.prototype.getStyles;\r\nMarkerClusterer.prototype[\"getTotalClusters\"] =\r\n MarkerClusterer.prototype.getTotalClusters;\r\nMarkerClusterer.prototype[\"getTotalMarkers\"] =\r\n MarkerClusterer.prototype.getTotalMarkers;\r\nMarkerClusterer.prototype[\"redraw\"] = MarkerClusterer.prototype.redraw;\r\nMarkerClusterer.prototype[\"removeMarker\"] =\r\n MarkerClusterer.prototype.removeMarker;\r\nMarkerClusterer.prototype[\"removeMarkers\"] =\r\n MarkerClusterer.prototype.removeMarkers;\r\nMarkerClusterer.prototype[\"resetViewport\"] =\r\n MarkerClusterer.prototype.resetViewport;\r\nMarkerClusterer.prototype[\"repaint\"] = MarkerClusterer.prototype.repaint;\r\nMarkerClusterer.prototype[\"setCalculator\"] =\r\n MarkerClusterer.prototype.setCalculator;\r\nMarkerClusterer.prototype[\"setGridSize\"] =\r\n MarkerClusterer.prototype.setGridSize;\r\nMarkerClusterer.prototype[\"setMaxZoom\"] = MarkerClusterer.prototype.setMaxZoom;\r\nMarkerClusterer.prototype[\"onAdd\"] = MarkerClusterer.prototype.onAdd;\r\nMarkerClusterer.prototype[\"draw\"] = MarkerClusterer.prototype.draw;\r\n\r\nCluster.prototype[\"getCenter\"] = Cluster.prototype.getCenter;\r\nCluster.prototype[\"getSize\"] = Cluster.prototype.getSize;\r\nCluster.prototype[\"getMarkers\"] = Cluster.prototype.getMarkers;\r\n\r\nClusterIcon.prototype[\"onAdd\"] = ClusterIcon.prototype.onAdd;\r\nClusterIcon.prototype[\"draw\"] = ClusterIcon.prototype.draw;\r\nClusterIcon.prototype[\"onRemove\"] = ClusterIcon.prototype.onRemove;\r\n","(function() {\r\n angular.module(\"app\", [\"ngMap\", \"ngSanitize\"]);\r\n})();\r\n","(function() {\r\n /*\r\n OverlappingMarkerSpiderfier\r\nhttps://github.com/jawj/OverlappingMarkerSpiderfier\r\nCopyright (c) 2011 - 2012 George MacKerron\r\nReleased under the MIT licence: http://opensource.org/licenses/mit-license\r\nNote: The Google Maps API v3 must be included *before* this code\r\n*/\r\n var h = !0,\r\n u = null,\r\n v = !1;\r\n (function() {\r\n var A,\r\n B = {}.hasOwnProperty,\r\n C = [].slice;\r\n if (((A = this.google) != u ? A.maps : void 0) != u)\r\n this.OverlappingMarkerSpiderfier = (function() {\r\n function w(b, d) {\r\n var a,\r\n g,\r\n f,\r\n e,\r\n c = this;\r\n this.map = b;\r\n d == u && (d = {});\r\n for (a in d) B.call(d, a) && ((g = d[a]), (this[a] = g));\r\n this.e = new this.constructor.g(this.map);\r\n this.n();\r\n this.b = {};\r\n e = [\"click\", \"zoom_changed\", \"maptypeid_changed\"];\r\n g = 0;\r\n for (f = e.length; g < f; g++)\r\n (a = e[g]),\r\n p.addListener(this.map, a, function() {\r\n return c.unspiderfy();\r\n });\r\n }\r\n var p, s, t, q, k, c, y, z;\r\n c = w.prototype;\r\n z = [w, c];\r\n q = 0;\r\n for (k = z.length; q < k; q++) (t = z[q]), (t.VERSION = \"0.3.3\");\r\n s = google.maps;\r\n p = s.event;\r\n k = s.MapTypeId;\r\n y = 2 * Math.PI;\r\n c.keepSpiderfied = v;\r\n c.markersWontHide = v;\r\n c.markersWontMove = v;\r\n c.nearbyDistance = 20;\r\n c.circleSpiralSwitchover = 9;\r\n c.circleFootSeparation = 23;\r\n c.circleStartAngle = y / 12;\r\n c.spiralFootSeparation = 26;\r\n c.spiralLengthStart = 11;\r\n c.spiralLengthFactor = 4;\r\n c.spiderfiedZIndex = 1e3;\r\n c.usualLegZIndex = 10;\r\n c.highlightedLegZIndex = 20;\r\n c.legWeight = 1.5;\r\n c.legColors = { usual: {}, highlighted: {} };\r\n q = c.legColors.usual;\r\n t = c.legColors.highlighted;\r\n q[k.HYBRID] = q[k.SATELLITE] = \"#fff\";\r\n t[k.HYBRID] = t[k.SATELLITE] = \"#f00\";\r\n q[k.TERRAIN] = q[k.ROADMAP] = \"#444\";\r\n t[k.TERRAIN] = t[k.ROADMAP] = \"#f00\";\r\n c.n = function() {\r\n this.a = [];\r\n this.j = [];\r\n };\r\n c.addMarker = function(b) {\r\n var d,\r\n a = this;\r\n if (b._oms != u) return this;\r\n b._oms = h;\r\n d = [\r\n p.addListener(b, \"click\", function(d) {\r\n return a.F(b, d);\r\n })\r\n ];\r\n this.markersWontHide ||\r\n d.push(\r\n p.addListener(b, \"visible_changed\", function() {\r\n return a.o(b, v);\r\n })\r\n );\r\n this.markersWontMove ||\r\n d.push(\r\n p.addListener(b, \"position_changed\", function() {\r\n return a.o(b, h);\r\n })\r\n );\r\n this.j.push(d);\r\n this.a.push(b);\r\n return this;\r\n };\r\n c.o = function(b, d) {\r\n if (\r\n b._omsData != u &&\r\n (d || !b.getVisible()) &&\r\n !(this.s != u || this.t != u)\r\n )\r\n return this.unspiderfy(d ? b : u);\r\n };\r\n c.getMarkers = function() {\r\n return this.a.slice(0);\r\n };\r\n c.removeMarker = function(b) {\r\n var d, a, g, f, e;\r\n b._omsData != u && this.unspiderfy();\r\n d = this.m(this.a, b);\r\n if (d < 0) return this;\r\n g = this.j.splice(d, 1)[0];\r\n f = 0;\r\n for (e = g.length; f < e; f++) (a = g[f]), p.removeListener(a);\r\n delete b._oms;\r\n this.a.splice(d, 1);\r\n return this;\r\n };\r\n c.clearMarkers = function() {\r\n var b, d, a, g, f, e, c, m;\r\n this.unspiderfy();\r\n m = this.a;\r\n b = g = 0;\r\n for (e = m.length; g < e; b = ++g) {\r\n a = m[b];\r\n d = this.j[b];\r\n f = 0;\r\n for (c = d.length; f < c; f++) (b = d[f]), p.removeListener(b);\r\n delete a._oms;\r\n }\r\n this.n();\r\n return this;\r\n };\r\n c.addListener = function(b, d) {\r\n var a, g;\r\n ((g = (a = this.b)[b]) != u ? g : (a[b] = [])).push(d);\r\n return this;\r\n };\r\n c.removeListener = function(b, d) {\r\n var a;\r\n a = this.m(this.b[b], d);\r\n a < 0 || this.b[b].splice(a, 1);\r\n return this;\r\n };\r\n c.clearListeners = function(b) {\r\n this.b[b] = [];\r\n return this;\r\n };\r\n c.trigger = function() {\r\n var b, d, a, g, f, e;\r\n d = arguments[0];\r\n b = arguments.length >= 2 ? C.call(arguments, 1) : [];\r\n d = (a = this.b[d]) != u ? a : [];\r\n e = [];\r\n g = 0;\r\n for (f = d.length; g < f; g++) (a = d[g]), e.push(a.apply(u, b));\r\n return e;\r\n };\r\n c.u = function(b, d) {\r\n var a, g, f, e, c;\r\n f = (this.circleFootSeparation * (2 + b)) / y;\r\n g = y / b;\r\n c = [];\r\n for (a = e = 0; b >= 0 ? e < b : e > b; a = b >= 0 ? ++e : --e)\r\n (a = this.circleStartAngle + a * g),\r\n c.push(new s.Point(d.x + f * Math.cos(a), d.y + f * Math.sin(a)));\r\n return c;\r\n };\r\n c.v = function(b, d) {\r\n var a, g, f, e, c;\r\n f = this.spiralLengthStart;\r\n a = 0;\r\n c = [];\r\n for (g = e = 0; b >= 0 ? e < b : e > b; g = b >= 0 ? ++e : --e)\r\n (a += this.spiralFootSeparation / f + 5e-4 * g),\r\n (g = new s.Point(d.x + f * Math.cos(a), d.y + f * Math.sin(a))),\r\n (f += (y * this.spiralLengthFactor) / a),\r\n c.push(g);\r\n return c;\r\n };\r\n c.F = function(b, d) {\r\n var a, g, f, e, c, m, l, x, n;\r\n e = b._omsData != u;\r\n (!e || !this.keepSpiderfied) && this.unspiderfy();\r\n if (\r\n e ||\r\n this.map.getStreetView().getVisible() ||\r\n this.map.getMapTypeId() === \"GoogleEarthAPI\"\r\n )\r\n return this.trigger(\"click\", b, d);\r\n e = [];\r\n c = [];\r\n a = this.nearbyDistance;\r\n m = a * a;\r\n f = this.c(b.position);\r\n n = this.a;\r\n l = 0;\r\n for (x = n.length; l < x; l++)\r\n (a = n[l]),\r\n a.map != u &&\r\n a.getVisible() &&\r\n ((g = this.c(a.position)),\r\n this.f(g, f) < m ? e.push({ A: a, p: g }) : c.push(a));\r\n return e.length === 1 ? this.trigger(\"click\", b, d) : this.G(e, c);\r\n };\r\n c.markersNearMarker = function(b, d) {\r\n var a, g, f, e, c, m, l, x, n, p;\r\n d == u && (d = v);\r\n if (this.e.getProjection() == u)\r\n throw \"Must wait for 'idle' event on map before calling markersNearMarker\";\r\n a = this.nearbyDistance;\r\n c = a * a;\r\n f = this.c(b.position);\r\n e = [];\r\n x = this.a;\r\n m = 0;\r\n for (l = x.length; m < l; m++)\r\n if (((a = x[m]), !(a === b || a.map == u || !a.getVisible())))\r\n if (\r\n ((g = this.c(\r\n (n = (p = a._omsData) != u ? p.l : void 0) != u\r\n ? n\r\n : a.position\r\n )),\r\n this.f(g, f) < c && (e.push(a), d))\r\n )\r\n break;\r\n return e;\r\n };\r\n c.markersNearAnyOtherMarker = function() {\r\n var b, d, a, g, c, e, r, m, l, p, n, k;\r\n if (this.e.getProjection() == u)\r\n throw \"Must wait for 'idle' event on map before calling markersNearAnyOtherMarker\";\r\n e = this.nearbyDistance;\r\n b = e * e;\r\n g = this.a;\r\n e = [];\r\n n = 0;\r\n for (a = g.length; n < a; n++)\r\n (d = g[n]),\r\n e.push({\r\n q: this.c(\r\n (r = (l = d._omsData) != u ? l.l : void 0) != u\r\n ? r\r\n : d.position\r\n ),\r\n d: v\r\n });\r\n n = this.a;\r\n d = r = 0;\r\n for (l = n.length; r < l; d = ++r)\r\n if (\r\n ((a = n[d]), a.map != u && a.getVisible() && ((g = e[d]), !g.d))\r\n ) {\r\n k = this.a;\r\n a = m = 0;\r\n for (p = k.length; m < p; a = ++m)\r\n if (\r\n ((c = k[a]),\r\n a !== d &&\r\n (c.map != u && c.getVisible()) &&\r\n ((c = e[a]), (!(a < d) || c.d) && this.f(g.q, c.q) < b))\r\n ) {\r\n g.d = c.d = h;\r\n break;\r\n }\r\n }\r\n n = this.a;\r\n a = [];\r\n b = r = 0;\r\n for (l = n.length; r < l; b = ++r) (d = n[b]), e[b].d && a.push(d);\r\n return a;\r\n };\r\n c.z = function(b) {\r\n var d = this;\r\n return {\r\n h: function() {\r\n return b._omsData.i.setOptions({\r\n strokeColor: d.legColors.highlighted[d.map.mapTypeId],\r\n zIndex: d.highlightedLegZIndex\r\n });\r\n },\r\n k: function() {\r\n return b._omsData.i.setOptions({\r\n strokeColor: d.legColors.usual[d.map.mapTypeId],\r\n zIndex: d.usualLegZIndex\r\n });\r\n }\r\n };\r\n };\r\n c.G = function(b, d) {\r\n var a, c, f, e, r, m, l, k, n, q;\r\n this.s = h;\r\n q = b.length;\r\n a = this.C(\r\n (function() {\r\n var a, d, c;\r\n c = [];\r\n a = 0;\r\n for (d = b.length; a < d; a++) (k = b[a]), c.push(k.p);\r\n return c;\r\n })()\r\n );\r\n e =\r\n q >= this.circleSpiralSwitchover\r\n ? this.v(q, a).reverse()\r\n : this.u(q, a);\r\n a = function() {\r\n var a,\r\n d,\r\n k,\r\n q = this;\r\n k = [];\r\n a = 0;\r\n for (d = e.length; a < d; a++)\r\n (f = e[a]),\r\n (c = this.D(f)),\r\n (n = this.B(b, function(a) {\r\n return q.f(a.p, f);\r\n })),\r\n (l = n.A),\r\n (m = new s.Polyline({\r\n map: this.map,\r\n path: [l.position, c],\r\n strokeColor: this.legColors.usual[this.map.mapTypeId],\r\n strokeWeight: this.legWeight,\r\n zIndex: this.usualLegZIndex\r\n })),\r\n (l._omsData = { l: l.position, i: m }),\r\n this.legColors.highlighted[this.map.mapTypeId] !==\r\n this.legColors.usual[this.map.mapTypeId] &&\r\n ((r = this.z(l)),\r\n (l._omsData.w = {\r\n h: p.addListener(l, \"mouseover\", r.h),\r\n k: p.addListener(l, \"mouseout\", r.k)\r\n })),\r\n l.setPosition(c),\r\n l.setZIndex(Math.round(this.spiderfiedZIndex + f.y)),\r\n k.push(l);\r\n return k;\r\n }.call(this);\r\n delete this.s;\r\n this.r = h;\r\n return this.trigger(\"spiderfy\", a, d);\r\n };\r\n c.unspiderfy = function(b) {\r\n var d, a, c, f, e, k, m;\r\n b == u && (b = u);\r\n if (this.r == u) return this;\r\n this.t = h;\r\n f = [];\r\n c = [];\r\n m = this.a;\r\n e = 0;\r\n for (k = m.length; e < k; e++)\r\n (a = m[e]),\r\n a._omsData != u\r\n ? (a._omsData.i.setMap(u),\r\n a !== b && a.setPosition(a._omsData.l),\r\n a.setZIndex(u),\r\n (d = a._omsData.w),\r\n d != u && (p.removeListener(d.h), p.removeListener(d.k)),\r\n delete a._omsData,\r\n f.push(a))\r\n : c.push(a);\r\n delete this.t;\r\n delete this.r;\r\n this.trigger(\"unspiderfy\", f, c);\r\n return this;\r\n };\r\n c.f = function(b, d) {\r\n var a, c;\r\n a = b.x - d.x;\r\n c = b.y - d.y;\r\n return a * a + c * c;\r\n };\r\n c.C = function(b) {\r\n var d, a, c, f, e;\r\n f = a = c = 0;\r\n for (e = b.length; f < e; f++) (d = b[f]), (a += d.x), (c += d.y);\r\n b = b.length;\r\n return new s.Point(a / b, c / b);\r\n };\r\n c.c = function(b) {\r\n return this.e.getProjection().fromLatLngToDivPixel(b);\r\n };\r\n c.D = function(b) {\r\n return this.e.getProjection().fromDivPixelToLatLng(b);\r\n };\r\n c.B = function(b, c) {\r\n var a, g, f, e, k, m;\r\n f = k = 0;\r\n for (m = b.length; k < m; f = ++k)\r\n if (\r\n ((e = b[f]),\r\n (e = c(e)),\r\n typeof a === \"undefined\" || a === u || e < g)\r\n )\r\n (g = e), (a = f);\r\n return b.splice(a, 1)[0];\r\n };\r\n c.m = function(b, c) {\r\n var a, g, f, e;\r\n if (b.indexOf != u) return b.indexOf(c);\r\n a = f = 0;\r\n for (e = b.length; f < e; a = ++f)\r\n if (((g = b[a]), g === c)) return a;\r\n return -1;\r\n };\r\n w.g = function(b) {\r\n return this.setMap(b);\r\n };\r\n w.g.prototype = new s.OverlayView();\r\n w.g.prototype.draw = function() {};\r\n return w;\r\n })();\r\n }.call(this));\r\n}.call(window));\r\n/* Tue 7 May 2013 14:56:02 BST */\r\n","(function() {\r\n \"use strict\";\r\n\r\n angular\r\n .module(\"app\")\r\n .controller(\"ActionsBarController\", [\r\n \"$scope\",\r\n \"$location\",\r\n \"$http\",\r\n ActionsBarController\r\n ]);\r\n\r\n function ActionsBarController($scope, $location, $http) {\r\n $scope.currentURL = $location;\r\n $scope.imageDownload = {\r\n inProgress: false,\r\n error: false\r\n };\r\n\r\n function getEncodedUrl() {\r\n return encodeURIComponent($scope.currentURL.absUrl());\r\n }\r\n\r\n $scope.getEncodedURL = getEncodedUrl;\r\n\r\n var selectedAssetsString = function() {\r\n if ($scope.state && $scope.state.selectedAssets) {\r\n var assetsByName = $scope.state.selectedAssets\r\n .map(function(assetId) {\r\n var assetParents = $scope.findAssetParent(assetId);\r\n if (assetParents.length > 1) {\r\n return (\r\n $scope.state.assetsById[assetParents[1]].name.trim() +\r\n \"/\" +\r\n $scope.state.assetsById[assetId].name.trim()\r\n );\r\n }\r\n else {\r\n return $scope.state.assetsById[assetId].name.trim();\r\n }\r\n })\r\n .join(\"|\");\r\n\r\n return assetsByName;\r\n }\r\n else {\r\n return \"\";\r\n }\r\n };\r\n\r\n $scope.assetRawDataUrl = function() {\r\n return $scope.state && $scope.state.selectedIndicator\r\n ? \"/AssetRawData.axd?ind=\" +\r\n $scope.state.selectedIndicator.id +\r\n \"&assets=\" +\r\n encodeURIComponent(selectedAssetsString())\r\n : \"\";\r\n };\r\n\r\n $scope.$watch(\r\n \"state.selectedCommunities\",\r\n function(oldVal, newVal) {\r\n if (oldVal === newVal) {\r\n return false;\r\n }\r\n $location.search(\r\n \"communities\",\r\n $scope.state.selectedCommunities.communities.join(\"|\")\r\n );\r\n },\r\n true\r\n );\r\n\r\n $scope.retryCount = 0;\r\n $scope.downloadImage = function() {\r\n var url =\r\n \"/image/generate?width=1200&wait=true&url=\" +\r\n getEncodedUrl() +\r\n \"%26cap%3Dtrue\";\r\n $scope.imageDownload.inProgress = true;\r\n $scope.imageDownload.error = false;\r\n\r\n $http({\r\n url: url,\r\n method: \"GET\",\r\n responseType: \"arraybuffer\"\r\n })\r\n .success(function(data, status, headers, config) {\r\n // TODO when WS success\r\n var file = new Blob([data], {\r\n type: \"image/png\"\r\n });\r\n\r\n var fileName = \"CCC-Image.png\";\r\n\r\n if (window.navigator.msSaveOrOpenBlob) {\r\n window.navigator.msSaveBlob(file, fileName);\r\n }\r\n else {\r\n //trick to download store a file having its URL\r\n var fileURL = URL.createObjectURL(file);\r\n var tempLink = document.createElement(\"a\");\r\n tempLink.href = fileURL;\r\n tempLink.target = \"_blank\";\r\n tempLink.download = fileName;\r\n document.body.appendChild(tempLink);\r\n tempLink.click();\r\n document.body.removeChild(tempLink);\r\n }\r\n $scope.imageDownload.inProgress = false;\r\n })\r\n .error(function(data, status, headers, config) {\r\n if ($scope.retryCount >= 3) {\r\n $scope.retryCount = 0;\r\n $scope.imageDownload.inProgress = false;\r\n $scope.imageDownload.error = true;\r\n console.log(data, status, headers, config);\r\n }\r\n else {\r\n $scope.retryCount += 1;\r\n $scope.downloadImage();\r\n }\r\n });\r\n };\r\n }\r\n})();\r\n","(function() {\r\n \"use strict\";\r\n\r\n angular.module(\"app\").directive(\"cccActionsBar\", cccActionsBar);\r\n\r\n function cccActionsBar() {\r\n return {\r\n restrict: \"EA\",\r\n scope: false,\r\n controller: \"ActionsBarController\"\r\n };\r\n }\r\n})();\r\n","/* global google, MarkerClusterer */\r\n\r\n(function() {\r\n \"use strict\";\r\n\r\n angular\r\n .module(\"app\")\r\n .controller(\"AssetMapController\", [\r\n \"$scope\",\r\n \"$q\",\r\n \"$http\",\r\n \"$timeout\",\r\n \"$location\",\r\n \"$attrs\",\r\n \"NgMap\",\r\n \"AssetsService\",\r\n \"LoadingService\",\r\n AssetMapController\r\n ]);\r\n\r\n // This controller exists alongside the RiskRankingMapController, adding additional functionality\r\n // to handle assets and map marker interaction\r\n function AssetMapController(\r\n $scope,\r\n $q,\r\n $http,\r\n $timeout,\r\n $location,\r\n $attrs,\r\n NgMap,\r\n AssetsService,\r\n LoadingService\r\n ) {\r\n var pinPath =\r\n \"M0-31c-6.6,0-12,5.3-12,11.8C-12-14-4.6-4.5-1.4-0.7C-1.1-0.3-0.5,0,0,0s1.1-0.2,1.4-0.7C4.6-4.5,12-14,12-19.2C12-25.7,6.6-31,0-31zM0-14.9c-2.2,0-4-1.8-4-4s1.8-4,4-4s4,1.8,4,4S2.2-14.9,0-14.9z\",\r\n pinPathSolid =\r\n \"M0-31c-6.6,0-12,5.3-12,11.8C-12-14-4.6-4.5-1.4-0.7C-1.1-0.3-0.5,0,0,0s1.1-0.2,1.4-0.7C4.6-4.5,12-14,12-19.2C12-25.7,6.6-31,0-31z\",\r\n overlapDistance = 3,\r\n maxClusterZoom = 13;\r\n\r\n $scope.markerClusters = {};\r\n $scope.markerOverlappers = {};\r\n $scope.markerStash = {};\r\n $scope.markerReference = {};\r\n\r\n function standardIcon(color) {\r\n return {\r\n path: pinPath,\r\n labelOrigin: new google.maps.Point(0, -18),\r\n fillColor: color,\r\n fillOpacity: 1,\r\n scale: 1,\r\n strokeColor: \"#e1e9eb\",\r\n strokeWeight: 1\r\n };\r\n }\r\n\r\n function solidIcon(color) {\r\n var icon = standardIcon(color);\r\n icon.path = pinPathSolid;\r\n return icon;\r\n }\r\n\r\n // Change the marker style back to normal\r\n function standardizeMarkerStyle(m) {\r\n m.setIcon(standardIcon(m.icon.fillColor));\r\n m.setLabel({\r\n text: \" \",\r\n color: \"white\"\r\n });\r\n }\r\n\r\n // Add a count to the marker pin\r\n function countifyMarkerStyle(m, count) {\r\n m.setIcon(solidIcon(m.icon.fillColor));\r\n m.setLabel({\r\n text: count.toString(),\r\n color: \"white\"\r\n });\r\n }\r\n\r\n var markerClusterer = {\r\n // Create a new marker cluster for a domain id, if one doesn't exist already\r\n // This gives us a reference for adding/removing individual markers per domain later on\r\n create: function(id) {\r\n // Add an overlapping marker spiderfier\r\n if (!$scope.markerOverlappers[id]) {\r\n $scope.markerOverlappers[id] = new OverlappingMarkerSpiderfier(\r\n $scope.map,\r\n {\r\n nearbyDistance: overlapDistance\r\n }\r\n );\r\n\r\n // On spiderfy, remove the special number style\r\n $scope.markerOverlappers[id].addListener(\"spiderfy\", function(m) {\r\n m.forEach(function(m) {\r\n m.color = \"black\";\r\n m.data.countLabel = m.label.text;\r\n standardizeMarkerStyle(m);\r\n });\r\n });\r\n\r\n // On Unspiderfy, change back to special number style\r\n $scope.markerOverlappers[id].addListener(\"unspiderfy\", function(m) {\r\n m.forEach(function(m) {\r\n countifyMarkerStyle(m, m.data.countLabel);\r\n m.data.countLabel = undefined;\r\n });\r\n });\r\n }\r\n\r\n $scope.markerClusters[id] =\r\n $scope.markerClusters[id] ||\r\n new MarkerClusterer(\r\n $scope.map,\r\n null, // This param is usually new markers; we'll add our own later\r\n {\r\n gridSize: 90,\r\n maxZoom: maxClusterZoom,\r\n groupPredicate: function(m1, m2) {\r\n var currentZoom = this.map.zoom;\r\n // Above this zoom level, only group within CD boundaries\r\n if (currentZoom >= 12) {\r\n return (\r\n m1.data.communityDistrictId === m2.data.communityDistrictId\r\n );\r\n }\r\n return true;\r\n },\r\n styles: [\r\n {\r\n fontFamily: \"GestaCond-Bold\",\r\n url: \"\",\r\n height: 36,\r\n width: 36,\r\n fontSize: \"16px\",\r\n textColor: \"#e1e9eb\",\r\n lineHeight: \"32px\",\r\n backgroundColor: \"#\" + $scope.state.domainsByName[id].color,\r\n border: \"3px solid #e1e9eb\",\r\n borderRadius: \"40px\"\r\n }\r\n ]\r\n }\r\n );\r\n },\r\n\r\n // Adds markers by array for more efficient processing\r\n addMarkers: function(domain, arr) {\r\n var markerArr = [];\r\n\r\n arr.forEach(function(marker) {\r\n if (marker.data.isArea) {\r\n marker.polygon.data = marker.data;\r\n $scope.markerReference[marker.id] = marker.polygon;\r\n }\r\n else {\r\n marker.mapMarker.data = marker.data;\r\n markerArr.push(marker.mapMarker);\r\n $scope.markerReference[marker.id] = marker.mapMarker;\r\n }\r\n });\r\n\r\n $scope.markerClusters[domain].addMarkers(markerArr);\r\n markerArr.forEach(function(m) {\r\n $scope.markerOverlappers[domain].addMarker(m);\r\n });\r\n },\r\n\r\n // Removes markers by array for more efficient processing\r\n removeMarkers: function(domain, arr) {\r\n var markerArr = [];\r\n\r\n arr.forEach(function(marker) {\r\n if ($scope.markerReference[marker].data.isArea) {\r\n $scope.markerReference[marker].setMap(null);\r\n }\r\n\r\n // Add each marker to the removal array, then remove it from our reference arrays\r\n markerArr.push($scope.markerReference[marker]);\r\n\r\n var ind = $scope.markerStash[domain].indexOf(marker);\r\n $scope.markerStash[domain].splice(ind, 1);\r\n delete $scope.markerReference[marker];\r\n });\r\n\r\n if ($scope.markerClusters[domain]) {\r\n $scope.markerClusters[domain].removeMarkers(markerArr);\r\n }\r\n }\r\n };\r\n\r\n // Calculate pixel position of any point on the map\r\n function fromLatLngToPixel(position) {\r\n var scale = Math.pow(2, $scope.map.getZoom());\r\n var proj = $scope.map.getProjection();\r\n var bounds = $scope.map.getBounds();\r\n\r\n var nw = proj.fromLatLngToPoint(\r\n new google.maps.LatLng(\r\n bounds.getNorthEast().lat(),\r\n bounds.getSouthWest().lng()\r\n )\r\n );\r\n var point = proj.fromLatLngToPoint(position);\r\n\r\n return new google.maps.Point(\r\n Math.floor((point.x - nw.x) * scale),\r\n Math.floor((point.y - nw.y) * scale)\r\n );\r\n }\r\n\r\n // Square of distance between 2 points\r\n function ptDistanceSq(pt1, pt2) {\r\n var dx, dy;\r\n\r\n dx = pt1.x - pt2.x;\r\n dy = pt1.y - pt2.y;\r\n return dx * dx + dy * dy;\r\n }\r\n\r\n // Find markers that are overlapping\r\n function markerIndexesNearMarker(markers, marker) {\r\n var pxSq = overlapDistance * overlapDistance,\r\n markerPt = fromLatLngToPixel(marker.position);\r\n\r\n return markers.reduce(function(accum, m, i) {\r\n if (m === marker || !m.getVisible()) {\r\n return accum;\r\n }\r\n var mPt = fromLatLngToPixel(\r\n m._omsData ? m._omsData.usualPosition : m.position\r\n );\r\n return ptDistanceSq(mPt, markerPt) < pxSq ? accum.concat(i) : accum;\r\n }, []);\r\n }\r\n\r\n // Group all markers that overlap each other\r\n function groupOverlappingMarkers(markers) {\r\n var skip = markers.map(function() {\r\n return false;\r\n }),\r\n groups = [];\r\n\r\n for (var i = 0; i < markers.length; i++) {\r\n if (skip[i]) continue;\r\n var overlaps = markerIndexesNearMarker(markers.slice(i), markers[i]);\r\n\r\n if (overlaps.length > 0) {\r\n var group = [markers[i]].concat(\r\n overlaps.map(function(mi) {\r\n return markers[i + mi];\r\n })\r\n );\r\n overlaps.forEach(function(mi) {\r\n skip[i + mi] = true;\r\n });\r\n groups.push(group);\r\n }\r\n }\r\n return groups;\r\n }\r\n\r\n // Find and style any overlapping markers\r\n var findAndStyleOverlappingMarkers = _.debounce(function() {\r\n // Unspiderfy any spiderfied markers to avoid errors\r\n Object.keys($scope.markerOverlappers).forEach(function(key) {\r\n $scope.markerOverlappers[key].unspiderfy();\r\n });\r\n\r\n // Don't do anything if we're in a clustered zoom level\r\n\t\t\tif ($scope.map && $scope.map.getZoom() <= maxClusterZoom) {\r\n return;\r\n }\r\n\r\n var mapBounds = $scope.map.getBounds();\r\n\r\n // For every marker clusterer\r\n Object.keys($scope.markerClusters).forEach(function(key) {\r\n // Filter down to just the pins that are in view, for performance\r\n var pinsInView = $scope.markerClusters[key]\r\n .getMarkers()\r\n .filter(function(m) {\r\n return mapBounds.contains(m.position);\r\n });\r\n\r\n // Group these pins by overlapping\r\n var groupedPins = groupOverlappingMarkers(pinsInView);\r\n\r\n // Style each pin with the count in the group\r\n groupedPins.forEach(function(g) {\r\n g.forEach(function(m) {\r\n countifyMarkerStyle(m, g.length);\r\n });\r\n });\r\n });\r\n }, 100);\r\n\r\n // Find an asset's direct parent\r\n // This will either return a parent asset array, or nothing if the asset is a parent or has no children\r\n $scope.findAssetParent = function(assetId) {\r\n return Object.keys($scope.state.assetsByGroup).filter(function(group) {\r\n return $scope.state.assetsByGroup[group].indexOf(assetId) > -1;\r\n });\r\n };\r\n\r\n // When the selected assets change, make an API request to load asset + marker data\r\n $scope.$watch(\r\n \"state.selectedAssets\",\r\n function(newValue, oldValue) {\r\n // Quick exit on initialization, not everything will be ready yet.\r\n // https://docs.angularjs.org/api/ng/type/$rootScope.Scope\r\n // If `newValue` has length, that means `state.selectedAssets` was created from URL parameters,\r\n // so it's safe to execute the rest of the function\r\n if (!newValue.length && newValue === oldValue) {\r\n return false;\r\n }\r\n\r\n // Concatenate all selected assets together in the right format for making the API request\r\n var assetsByName = $scope.state.selectedAssets\r\n .map(function(assetId) {\r\n var assetParents = $scope.findAssetParent(assetId);\r\n if (assetParents.length > 1) {\r\n return (\r\n $scope.state.assetsById[assetParents[1]].name.trim() +\r\n \"/\" +\r\n $scope.state.assetsById[assetId].name.trim()\r\n );\r\n }\r\n else {\r\n return $scope.state.assetsById[assetId].name.trim();\r\n }\r\n })\r\n .join(\"|\");\r\n\r\n // Update the URL with the new selected assets string\r\n $location.search(\"assets\", assetsByName);\r\n\r\n var assetsLoadingId = LoadingService.taskStart(\r\n $scope,\r\n \"Loading Assets\"\r\n );\r\n\r\n AssetsService.getAssets(assetsByName).then(\r\n function(response) {\r\n LoadingService.taskEnd($scope, assetsLoadingId);\r\n\r\n var assetDrawingId = LoadingService.taskStart(\r\n $scope,\r\n \"Drawing Asset Pins\"\r\n );\r\n\r\n var newMarkers = {};\r\n var selectedAssetMarkers = [];\r\n var assetNumStash = {}; // so we don't bother $scope over and over\r\n $scope.state.numberOfAssets = {}; // reset the assets counter\r\n\r\n function processMarker(marker) {\r\n /* For sub-assets, an array of categories will be returned by the API, including any parent assets. The actual category is the last item in the array. Example:\r\n category: [\r\n 'Parent Asset',\r\n 'Child Asset'\r\n ]\r\n\r\n Parent assets will not have assets of their own, but their total count should be\r\n the sum of all their child assets. */\r\n\r\n if (!assetNumStash[marker.communityDistrictId]) {\r\n assetNumStash[marker.communityDistrictId] = {};\r\n }\r\n\r\n marker.category.forEach(function(category, ind, arr) {\r\n if (assetNumStash[marker.communityDistrictId][category]) {\r\n assetNumStash[marker.communityDistrictId][category]++;\r\n }\r\n else {\r\n assetNumStash[marker.communityDistrictId][category] = 1;\r\n }\r\n });\r\n\r\n // Sugar to make things a little more understandable\r\n var asset = $scope.state.assetsByName[marker.category[0]];\r\n var domain = $scope.state.domainsByAsset[asset.id];\r\n\r\n // Markers don't have IDs, so let's build our own from three unique data points:\r\n // - Marker description\r\n // - Latitude\r\n // - Longitude\r\n var markerID =\r\n marker.description + \"-\" + marker.lat + \"-\" + marker.long;\r\n selectedAssetMarkers.push(markerID);\r\n\r\n $scope.markerStash[domain] = $scope.markerStash[domain] || [];\r\n newMarkers[domain] = newMarkers[domain] || [];\r\n\r\n // If the marker doesn't already exist, add it to the stash and create it on the map\r\n if ($scope.markerStash[domain].indexOf(markerID) === -1) {\r\n $scope.markerStash[domain].push(markerID);\r\n\r\n var newMarker;\r\n var isArea =\r\n marker.isArea &&\r\n marker.assetId != null &&\r\n marker.assetId != 0;\r\n if (!isArea && marker.lat && marker.long) {\r\n newMarker = {\r\n data: marker,\r\n id: markerID,\r\n asset: asset,\r\n mapMarker: new google.maps.Marker({\r\n position: {\r\n lat: marker.lat,\r\n lng: marker.long\r\n },\r\n label: {\r\n text: \" \",\r\n color: \"white\"\r\n },\r\n icon: standardIcon(\r\n \"#\" + $scope.state.domainsByName[domain].color\r\n )\r\n })\r\n };\r\n\r\n // On mouseover, we need to populate and display the marker info box\r\n newMarker.mapMarker.addListener(\"mouseover\", function() {\r\n assetMouseOver(marker, $scope.map);\r\n });\r\n newMarker.mapMarker.addListener(\"mouseout\", function() {\r\n assetMouseOut();\r\n });\r\n newMarkers[domain].push(newMarker);\r\n }\r\n else if (isArea) {\r\n var wkt = marker.shapeData;\r\n var polygon = ccc.viz.map.util.MapUtil.wktToGooglePolygon(\r\n wkt\r\n );\r\n\r\n polygon.setOptions({\r\n fillColor: \"#\" + $scope.state.domainsByName[domain].color,\r\n\r\n zIndex: 1000\r\n });\r\n\r\n polygon.addListener(\"mouseover\", function() {\r\n assetMouseOver(marker, $scope.map);\r\n\r\n this.setOptions({\r\n strokeColor: \"#dea003\",\r\n strokeWeight: 3\r\n });\r\n });\r\n polygon.addListener(\"mouseout\", function() {\r\n assetMouseOut();\r\n this.setOptions({\r\n strokeColor: \"#e2ecec\",\r\n strokeWeight: 1\r\n });\r\n });\r\n\r\n newMarker = {\r\n data: marker,\r\n id: markerID,\r\n asset: asset,\r\n polygon: polygon\r\n };\r\n\r\n polygon.setMap($scope.map);\r\n newMarkers[domain].push(newMarker);\r\n }\r\n }\r\n }\r\n\r\n function assetMouseOver(marker, map) {\r\n $scope.map = map;\r\n var markerLatLng = new google.maps.LatLng(\r\n marker.lat,\r\n marker.long\r\n );\r\n var eventLoc = $scope.latLng2Point(markerLatLng, $scope.map);\r\n var domain =\r\n $scope.state.domainsByAsset[\r\n $scope.state.assetsByName[marker.category[0]].id\r\n ];\r\n\r\n // Magic numbers to offset the box position for better UI\r\n $scope.mapHoverBox.posLeft = eventLoc.x + 40;\r\n $scope.mapHoverBox.posTop = eventLoc.y - 70;\r\n\r\n $scope.mapHoverBox.domainName = domain;\r\n $scope.mapHoverBox.domainIcon =\r\n $scope.state.domainsByName[domain].icon;\r\n\r\n // For all categories an asset has, create a pretty slash-separated string for the display name when a user hovers on the map marker.\r\n $scope.mapHoverBox.assetCategory = \"\";\r\n marker.category.forEach(function(category, ind, arr) {\r\n $scope.mapHoverBox.assetCategory += marker.category[ind];\r\n // Separate every category except for the last one, so no trailing slash\r\n if (ind !== marker.category.length - 1) {\r\n $scope.mapHoverBox.assetCategory += \" / \";\r\n }\r\n });\r\n\r\n $scope.mapHoverBox.assetDescription = marker.description;\r\n $scope.mapHoverBox.hoveredCommunity =\r\n $scope.state.communitiesById[marker.communityDistrictId];\r\n\r\n // The `isAsset` flag determines whether the hover pop-out displays community\r\n // info, or asset info. `isAsset` trumps community info\r\n $scope.mapHoverBox.isAsset = true;\r\n\r\n $scope.$apply();\r\n }\r\n\r\n function assetMouseOut() {\r\n $scope.mapHoverBox.isAsset = false;\r\n $scope.$apply();\r\n }\r\n\r\n // Batch the markers up in to groups and process them one group at a time, sequentially\r\n var batchSize = 75;\r\n function batchMarkers(accum, rest) {\r\n if (rest.length <= batchSize) {\r\n accum.push(rest);\r\n return accum;\r\n }\r\n\r\n accum.push(rest.slice(0, batchSize));\r\n return batchMarkers(accum, rest.slice(batchSize));\r\n }\r\n\r\n var batchedMarkers = batchMarkers([], response);\r\n\r\n // Process each batch at a time sequentially, with a settimeout on each batch process\r\n // This has the benefit of returning control to the browser after each batch is processed\r\n batchedMarkers\r\n .reduce(function(promise, batch) {\r\n return promise.then(function() {\r\n return $timeout(function() {\r\n batch.forEach(processMarker);\r\n }, 0);\r\n });\r\n }, $q.when(true))\r\n .then(function() {\r\n $scope.state.numberOfAssets = assetNumStash;\r\n\r\n // Helper function to prevent race condition caused by trying to add markers\r\n // before the map promise resolves\r\n var buildNewMarkers = function(domain) {\r\n var newMarkersArr = [];\r\n\r\n for (var marker in newMarkers[domain]) {\r\n newMarkersArr.push(newMarkers[domain][marker]);\r\n }\r\n\r\n markerClusterer.addMarkers(domain, newMarkersArr);\r\n };\r\n\r\n Object.keys(newMarkers).forEach(function(domain, ind, arr) {\r\n // Create a new cluster of markers for this specific domain\r\n // Sometimes this fires before the map has made it into scope; check for that\r\n if (!$scope.map) {\r\n NgMap.getMap().then(function(map) {\r\n $scope.map = map;\r\n markerClusterer.create(domain, map);\r\n\r\n buildNewMarkers(domain);\r\n });\r\n }\r\n else {\r\n markerClusterer.create(domain, $scope.map);\r\n buildNewMarkers(domain);\r\n }\r\n });\r\n\r\n // The `markerStash` lets us know all the markers we just added. Since `state.selectedAssets`\r\n // changed, and we might need to remove assets too, compare `markerStash` to the\r\n // `selectedAssetMarkers` array. Any markers that aren't found can be presumed removed.\r\n Object.keys($scope.markerStash).forEach(function(\r\n domain,\r\n ind,\r\n arr\r\n ) {\r\n var removeThese = [];\r\n\r\n $scope.markerStash[domain].forEach(function(marker) {\r\n if (selectedAssetMarkers.indexOf(marker) === -1) {\r\n removeThese.push(marker);\r\n }\r\n });\r\n\r\n markerClusterer.removeMarkers(domain, removeThese);\r\n });\r\n\r\n LoadingService.taskEnd($scope, assetDrawingId);\r\n\r\n findAndStyleOverlappingMarkers();\r\n\r\n if ($attrs.assetMap) {\r\n\t\t\t\t\t\t// At this point, the map should be all done rendering\r\n\t\t\t\t\t\t$timeout(function () {\r\n if ($scope.currentURL.search().cap) {\r\n window.triggerScreenshot();\r\n }\r\n }, 1000);\r\n }\r\n });\r\n },\r\n function(response) {\r\n console.warn(\"getAssets failed!\");\r\n }\r\n );\r\n },\r\n true\r\n ); // compares equality, not reference\r\n\r\n // Attach map listeners to process any overlapping markers\r\n var attachMapListeners = _.once(function() {\r\n var lastZoom = $scope.map.getZoom();\r\n var zoomedInCount = 0;\r\n google.maps.event.addListener(\r\n $scope.map,\r\n \"zoom_changed\",\r\n function trackMapZoom() {\r\n // Tracks when a user clicks on zoom on a map 3 or more times on the \"Asset Mapping\" page.\r\n var curZoom = $scope.map.getZoom();\r\n\r\n if (curZoom > lastZoom) {\r\n zoomedInCount += 1;\r\n\r\n if (zoomedInCount >= 3) {\r\n dataLayer.push({\r\n event: \"3 or More Map Zoom\",\r\n eventCategory: \"Interactive Clicks\",\r\n eventAction: \"3 or More Map Zoom\",\r\n eventLabel: window.location.pathname\r\n });\r\n }\r\n }\r\n else if (curZoom < lastZoom) {\r\n zoomedInCount -= 1;\r\n }\r\n\r\n lastZoom = curZoom;\r\n }\r\n );\r\n\r\n google.maps.event.addListener($scope.map, \"zoom_changed\", function() {\r\n findAndStyleOverlappingMarkers();\r\n });\r\n\r\n google.maps.event.addListener($scope.map, \"center_changed\", function() {\r\n findAndStyleOverlappingMarkers();\r\n });\r\n });\r\n\r\n $scope.$watch(\"map\", function() {\r\n if ($scope.map) {\r\n attachMapListeners();\r\n }\r\n });\r\n }\r\n})();\r\n","(function() {\r\n \"use strict\";\r\n\r\n angular.module(\"app\").directive(\"cccAssetMap\", cccAssetMap);\r\n\r\n function cccAssetMap() {\r\n return {\r\n restrict: \"EA\",\r\n scope: false,\r\n controller: \"AssetMapController\"\r\n };\r\n }\r\n})();\r\n","/* global Macy */\r\n\r\n(function() {\r\n \"use strict\";\r\n\r\n angular\r\n .module(\"app\")\r\n .controller(\"AssetMapTableController\", [\r\n \"$scope\",\r\n \"$sanitize\",\r\n \"$timeout\",\r\n AssetMapTableController\r\n ]);\r\n\r\n function AssetMapTableController($scope, $sanitize, $timeout) {\r\n // A custom filter that returns all groups (domains) with selected assets\r\n $scope.groupsWithSelectedAssets = function(groups) {\r\n var groupsArr = [];\r\n var groupIdsArr = [];\r\n\r\n var addAssetsToTable = function(domain, parentGroup) {\r\n if (domain.children) {\r\n domain.children.forEach(function(asset, ind, arr) {\r\n // We only want to add each domain/group once\r\n // If there's a parent group, we'll want to use that ID\r\n var groupID;\r\n if (parentGroup) {\r\n groupID = parentGroup.id;\r\n }\r\n else {\r\n groupID = domain.id;\r\n }\r\n\r\n if (\r\n $scope.state.selectedAssets.indexOf(asset.id) >= 0 &&\r\n groupIdsArr.indexOf(groupID) === -1\r\n ) {\r\n groupsArr.push(parentGroup ? parentGroup : domain);\r\n groupIdsArr.push(groupID);\r\n }\r\n\r\n // If this specific asset has child assets, capture those too\r\n // A child asset might be selected even if a parent isn't, so we want to make sure we\r\n // catch that and show the group as expected\r\n if (asset.children) {\r\n addAssetsToTable(asset, domain);\r\n }\r\n });\r\n }\r\n };\r\n\r\n groups.forEach(function(group, ind, arr) {\r\n addAssetsToTable(group);\r\n });\r\n\r\n return groupsArr;\r\n };\r\n\r\n // Check if an asset is, or any children of the asset are selected\r\n // Per the feature spec, parent/sibling assets need to be visible if any child is selected\r\n $scope.assetOrChildIsSelected = function(asset) {\r\n var assetIsGroup = Object.keys($scope.state.assetsByGroup).indexOf(\r\n asset.toString()\r\n );\r\n\r\n if (assetIsGroup >= 0) {\r\n var shouldReturn = false;\r\n $scope.state.assetsByGroup[asset].forEach(function(child, ind, arr) {\r\n if ($scope.state.selectedAssets.indexOf(child) >= 0) {\r\n shouldReturn = true;\r\n return;\r\n }\r\n });\r\n return shouldReturn;\r\n }\r\n else {\r\n return $scope.state.selectedAssets.indexOf(asset) >= 0;\r\n }\r\n };\r\n\r\n var refreshMasonry = function() {\r\n $scope.state.selectedCommunities.communities.forEach(function(\r\n elm,\r\n ind,\r\n arr\r\n ) {\r\n // Macy doesn't like the idea of multiple masonry containers, so we get around that by\r\n // re-initializing each container every time. Definitely not ideal or optimal, but it works.\r\n Macy.init({\r\n container: \".macy-wrapper-\" + ind,\r\n margin: 24,\r\n columns: 3\r\n });\r\n });\r\n };\r\n\r\n var assetsTable = {};\r\n\r\n $scope.$watch(\r\n \"state.selectedAssets\",\r\n function(oldVal, newVal) {\r\n if (oldVal === newVal) {\r\n return false;\r\n }\r\n\r\n $scope.state.selectedAssets.forEach(function(asset, ind, arr) {\r\n for (var group in $scope.state.assetsByGroup) {\r\n assetsTable[group] = assetsTable[group] || [];\r\n if (\r\n $scope.state.assetsByGroup[group].indexOf(asset) >= 0 &&\r\n assetsTable[group].indexOf(asset) === -1\r\n ) {\r\n assetsTable[group].push(asset);\r\n }\r\n }\r\n });\r\n\r\n // Since Macy isn't tied to Angular, this timeout prevents a race condition if Angular\r\n // takes longer to update than Macy does to update\r\n $timeout(refreshMasonry, 175);\r\n },\r\n true\r\n );\r\n\r\n $scope.$watch(\r\n \"state.selectedCommunities\",\r\n function(oldVal, newVal) {\r\n if (oldVal === newVal) {\r\n return false;\r\n }\r\n\r\n // Since Macy isn't tied to Angular, this timeout prevents a race condition if Angular\r\n // takes longer to update than Macy does to update\r\n $timeout(refreshMasonry, 175);\r\n },\r\n true\r\n );\r\n }\r\n})();\r\n","(function() {\r\n \"use strict\";\r\n\r\n angular.module(\"app\").directive(\"cccAssetMapTable\", cccAssetMapTable);\r\n\r\n function cccAssetMapTable() {\r\n return {\r\n restrict: \"EA\",\r\n scope: false,\r\n controller: \"AssetMapTableController\"\r\n };\r\n }\r\n})();\r\n","(function(root, factory) {\r\n if (typeof define === \"function\" && define.amd) {\r\n define([], function() {\r\n return factory();\r\n });\r\n }\r\n else if (typeof exports === \"object\") {\r\n module.exports = factory();\r\n }\r\n else {\r\n root.Macy = factory();\r\n }\r\n})(window, function () {\r\n \"use strict\";\r\n\r\n /**\r\n * Extend objects.\r\n * @param {Object} objects - Objects to merge\r\n * @return {Object} - New object\r\n */\r\n var extend = function(objects) {\r\n var extended = {};\r\n var i = 1;\r\n var prop;\r\n\r\n var merge = function(obj) {\r\n for (prop in obj) {\r\n if (Object.prototype.hasOwnProperty.call(obj, prop)) {\r\n if (Object.prototype.toString.call(obj[prop]) === \"[object Object]\") {\r\n extended[prop] = extend(extended[prop], obj[prop]);\r\n }\r\n else {\r\n extended[prop] = obj[prop];\r\n }\r\n }\r\n }\r\n };\r\n\r\n merge(arguments[0]);\r\n\r\n for (i = 1; i < arguments.length; i++) {\r\n var obj = arguments[i];\r\n merge(obj);\r\n }\r\n\r\n return extended;\r\n };\r\n\r\n /**\r\n * Public API.\r\n * @type {Object}\r\n */\r\n var Macy = {};\r\n\r\n /**\r\n * Current version.\r\n * @type {String}\r\n */\r\n Macy.VERSION = \"1.1.2\";\r\n\r\n /**\r\n * Expose settings.\r\n * @type {Object}\r\n */\r\n Macy.settings = {};\r\n\r\n /**\r\n * Default options.\r\n * @type {Object}\r\n */\r\n var defaults = {\r\n columns: 3,\r\n margin: 2,\r\n trueOrder: true,\r\n waitForImages: false\r\n };\r\n\r\n var cache = {\r\n options: {}\r\n };\r\n\r\n var imgsRequired, currentlyLoaded;\r\n\r\n /**\r\n * Works out how many columns should be used at the current width.\r\n * @return {Number} - The number of colummns\r\n */\r\n var getCurrentColumns = function() {\r\n var docWidth = document.body.clientWidth;\r\n var noOfColumns;\r\n\r\n for (var widths in cache.options.breakAt) {\r\n if (docWidth < widths) {\r\n noOfColumns = cache.options.breakAt[widths];\r\n\r\n break;\r\n }\r\n }\r\n\r\n if (!noOfColumns) {\r\n noOfColumns = cache.options.columns;\r\n }\r\n\r\n return noOfColumns;\r\n };\r\n\r\n /**\r\n * Gets the column column width with or without margin calculated\r\n * @param Boolean marginIncluded - Value that decided if margine should be included\r\n * @return {String|Number} - Returns either a string or number\r\n */\r\n var getColumnWidths = function(marginIncluded) {\r\n marginIncluded =\r\n typeof marginIncluded !== \"undefined\" ? marginIncluded : true;\r\n var noOfColumns = getCurrentColumns();\r\n var margins;\r\n\r\n if (!marginIncluded) {\r\n return 100 / noOfColumns;\r\n }\r\n\r\n if (noOfColumns === 1) {\r\n return 100 + \"%\";\r\n }\r\n\r\n margins = ((noOfColumns - 1) * cache.options.margin) / noOfColumns;\r\n\r\n return \"calc(\" + 100 / noOfColumns + \"% - \" + margins + \"px)\";\r\n };\r\n\r\n /**\r\n * Sets the element widths based on the amount of columns.\r\n */\r\n var setWidths = function() {\r\n var percentageWidth = getColumnWidths();\r\n\r\n each(cache.elements, function(index, val) {\r\n val.style.width = percentageWidth;\r\n val.style.position = \"absolute\";\r\n });\r\n };\r\n\r\n /**\r\n * Gets the calculated left value for an element.\r\n * @param {Number} col - Current Column Number\r\n * @return {String} - Returns a calculated string\r\n */\r\n var getLeftValue = function(col) {\r\n var noOfColumns = getCurrentColumns();\r\n var totalLeft = 0;\r\n var margin, str;\r\n\r\n col++;\r\n\r\n if (col === 1) {\r\n return 0;\r\n }\r\n\r\n margin =\r\n (cache.options.margin -\r\n ((noOfColumns - 1) * cache.options.margin) / noOfColumns) *\r\n (col - 1);\r\n totalLeft += getColumnWidths(false) * (col - 1);\r\n str = \"calc(\" + totalLeft + \"% + \" + margin + \"px)\";\r\n\r\n return str;\r\n };\r\n\r\n /**\r\n * Gets the calculated top value for an element.\r\n * @param {Number} row - The elements row position\r\n * @param {Number} col - The elements columns position\r\n * @param {Array} eles - The elements\r\n * @return {Number} - The Position that should be set on the element\r\n */\r\n var getTopValue = function(row, col, eles) {\r\n var totalHeight = 0;\r\n var tempHeight;\r\n\r\n if (row === 0) {\r\n return 0;\r\n }\r\n\r\n for (var i = 0; i < row; i++) {\r\n tempHeight = parseInt(\r\n getProperty(cache.elements[eles[i]], \"height\").replace(\"px\", \"\"),\r\n 10\r\n );\r\n totalHeight += isNaN(tempHeight) ? 0 : tempHeight + cache.options.margin;\r\n }\r\n\r\n return totalHeight;\r\n };\r\n\r\n /**\r\n * Sorts the elements in the ordering method by placing each element in the next column.\r\n * @param {Number} columns - Number of columns\r\n */\r\n var reOrder = function(columns) {\r\n var col = 0;\r\n var elements2d = [];\r\n var tempIndexs = [];\r\n var indexArray = [];\r\n\r\n each(cache.elements, function(index) {\r\n col++;\r\n\r\n if (col > columns) {\r\n col = 1;\r\n elements2d.push(tempIndexs);\r\n tempIndexs = [];\r\n }\r\n\r\n tempIndexs.push(index);\r\n });\r\n\r\n elements2d.push(tempIndexs);\r\n\r\n for (var i = 0, elements2dLen = elements2d.length; i < elements2dLen; i++) {\r\n var eleIndexs = elements2d[i];\r\n\r\n for (var j = 0, eleIndexsLen = eleIndexs.length; j < eleIndexsLen; j++) {\r\n indexArray[j] =\r\n typeof indexArray[j] === \"undefined\" ? [] : indexArray[j];\r\n indexArray[j].push(eleIndexs[j]);\r\n }\r\n }\r\n\r\n cache.rows = indexArray;\r\n setPosition(false);\r\n };\r\n\r\n /**\r\n * Sorts the elements in the shuffle method by placing each element in the shortest column.\r\n * @param {Number} columns - Number of columns\r\n */\r\n var shuffleOrder = function(columns) {\r\n var eles = cache.elements;\r\n var element2dArray = [];\r\n var overflowEles = [];\r\n\r\n for (var i = 0; i < columns; i++) {\r\n element2dArray[i] = [];\r\n }\r\n\r\n for (var k = 0; k < eles.length; k++) {\r\n overflowEles.push(k);\r\n }\r\n\r\n for (\r\n var v = 0, overflowElesLen = overflowEles.length;\r\n v < overflowElesLen;\r\n v++\r\n ) {\r\n var index = findIndexOfSmallestTotal(element2dArray);\r\n\r\n element2dArray[index] =\r\n typeof element2dArray[index] === \"undefined\"\r\n ? []\r\n : element2dArray[index];\r\n element2dArray[index].push(overflowEles[v]);\r\n }\r\n\r\n cache.rows = element2dArray;\r\n setPosition(true);\r\n };\r\n\r\n /**\r\n * Sets the position of each element in array.\r\n * @param {Bool} alternate=false - The sort method used.\r\n */\r\n var setPosition = function(alternate) {\r\n alternate = alternate || false;\r\n var eles = cache.elements;\r\n var element2dArray = cache.rows;\r\n\r\n for (\r\n var i = 0, element2dArrayLen = element2dArray.length;\r\n i < element2dArrayLen;\r\n i++\r\n ) {\r\n var rowArray = alternate\r\n ? bubbleSort(element2dArray[i])\r\n : element2dArray[i];\r\n\r\n for (var j = 0, rowArrayLen = rowArray.length; j < rowArrayLen; j++) {\r\n var left, top;\r\n\r\n left = getLeftValue(i);\r\n top = getTopValue(j, i, rowArray, alternate);\r\n eles[rowArray[j]].style.top = top + \"px\";\r\n eles[rowArray[j]].style.left = left;\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Finds the shortest row and return the index in the 2-dimentional array.\r\n * @param {Array} arr - Array to find the shortest column from\r\n * @return {Number} - Index for the shortest row\r\n */\r\n var findIndexOfSmallestTotal = function(arr) {\r\n var runningTotal = 0;\r\n var smallestIndex, smallest, lastSmall, tempHeight;\r\n\r\n for (var i = 0, arrLen = arr.length; i < arrLen; i++) {\r\n for (var j = 0; j < arr[i].length; j++) {\r\n tempHeight = parseInt(\r\n getProperty(cache.elements[arr[i][j]], \"height\").replace(\"px\", \"\"),\r\n 10\r\n );\r\n runningTotal += isNaN(tempHeight) ? 0 : tempHeight;\r\n }\r\n\r\n lastSmall = smallest;\r\n smallest =\r\n smallest === undefined\r\n ? runningTotal\r\n : smallest > runningTotal\r\n ? runningTotal\r\n : smallest;\r\n\r\n if (lastSmall === undefined || lastSmall > smallest) {\r\n smallestIndex = i;\r\n }\r\n runningTotal = 0;\r\n }\r\n\r\n return smallestIndex;\r\n };\r\n\r\n /**\r\n * Shortcut for window.getComputedStyle(element, null).getPropertyValue(value).\r\n * @param {Object} element - Element to get property from\r\n * @param {String} value - Value to get from element\r\n * @return {String} - The returned property\r\n */\r\n var getProperty = function(element, value) {\r\n return window.getComputedStyle(element, null).getPropertyValue(value);\r\n };\r\n\r\n /**\r\n * Finds the largest column and returns its height value.\r\n * @return {Number} - The height value of the highest column\r\n */\r\n var findLargestColumn = function() {\r\n var arr = cache.rows;\r\n var highest = 0,\r\n runningTotal = 0;\r\n\r\n for (var i = 0, arrLen = arr.length; i < arrLen; i++) {\r\n for (var j = 0; j < arr[i].length; j++) {\r\n runningTotal += parseInt(\r\n getProperty(cache.elements[arr[i][j]], \"height\").replace(\"px\", \"\"),\r\n 10\r\n );\r\n runningTotal += j !== 0 ? cache.options.margin : 0;\r\n }\r\n\r\n highest = highest < runningTotal ? runningTotal : highest;\r\n runningTotal = 0;\r\n }\r\n\r\n return highest;\r\n };\r\n\r\n /**\r\n * Recalculates element positions.\r\n */\r\n var recalculate = function() {\r\n var columns = getCurrentColumns();\r\n\r\n if (columns === 1) {\r\n cache.container.style.height = \"auto\";\r\n each(cache.elements, function(index, ele) {\r\n ele.removeAttribute(\"style\");\r\n });\r\n\r\n return;\r\n }\r\n\r\n setWidths();\r\n cache.elements = cache.container.children;\r\n\r\n if (!cache.options.trueOrder) {\r\n shuffleOrder(columns);\r\n setContainerHeight();\r\n\r\n return;\r\n }\r\n\r\n reOrder(columns);\r\n setContainerHeight();\r\n };\r\n\r\n /**\r\n * Sets the container height to the largest row.\r\n */\r\n var setContainerHeight = function() {\r\n cache.container.style.height = findLargestColumn() + \"px\";\r\n };\r\n\r\n /**\r\n * Sorts an array of integers in accending order.\r\n * @param {Array} list - Array to be sorted\r\n * @return {Array} - Sorted Array\r\n */\r\n var bubbleSort = function(list) {\r\n var arr = list;\r\n var n = arr.length - 1;\r\n\r\n for (var i = 0; i < n; i++) {\r\n for (var j = 0; j < n; j++) {\r\n if (arr[j] > arr[j + 1]) {\r\n var temp = arr[j];\r\n arr[j] = arr[j + 1];\r\n arr[j + 1] = temp;\r\n }\r\n }\r\n }\r\n\r\n return arr;\r\n };\r\n\r\n /**\r\n * Returns an element with the selector.\r\n * @param {String} selector - Element selector String\r\n * @return {Object} - An Element with desired selector\r\n */\r\n var ele = function(selector) {\r\n return document.querySelector(selector);\r\n };\r\n\r\n /**\r\n * Returns all elements with the selector that is visible.\r\n * @param {String} selector - Element selector String\r\n * @return {Array} - An array of all visible elements with that selector\r\n */\r\n var eles = function(selector) {\r\n var nl = document.querySelectorAll(selector);\r\n var arr = [];\r\n\r\n for (var i = nl.length - 1; i >= 0; i--) {\r\n if (nl[i].offsetParent !== null) {\r\n arr.unshift(nl[i]);\r\n }\r\n }\r\n\r\n return arr;\r\n };\r\n\r\n /**\r\n * Loops through each item in an array calling a function.\r\n * @param {Array} arr - Array to be cycled through\r\n * @param {Function} func - Function to be called\r\n */\r\n var each = function(arr, func) {\r\n for (var i = 0, arrLen = arr.length; i < arrLen; i++) {\r\n func(i, arr[i]);\r\n }\r\n };\r\n\r\n /**\r\n * Fires recalculate if images are loaded.\r\n * @param {Function} during\r\n * @param {Function} after\r\n */\r\n var imagesLoaded = function(during, after) {\r\n during = during || false;\r\n after = after || false;\r\n\r\n if (typeof during === \"function\") {\r\n during();\r\n }\r\n\r\n if (currentlyLoaded >= imgsRequired && typeof after === \"function\") {\r\n after();\r\n }\r\n };\r\n\r\n /**\r\n * Removes Macy instance.\r\n */\r\n var remove = function() {\r\n each(cache.container.children, function(index, ele) {\r\n ele.removeAttribute(\"style\");\r\n });\r\n\r\n cache.container.removeAttribute(\"style\");\r\n\r\n window.removeEventListener(\"resize\", recalculate);\r\n };\r\n\r\n /**\r\n * Fires calculate on image load.\r\n * @param {Function} during\r\n * @param {Function} after\r\n */\r\n var calculateOnImageLoad = function(during, after) {\r\n var imgs = eles(\"img\");\r\n\r\n imgsRequired = imgs.length - 1;\r\n currentlyLoaded = 0;\r\n\r\n each(imgs, function(i, img) {\r\n if (img.complete) {\r\n currentlyLoaded++;\r\n imagesLoaded(during, after);\r\n\r\n return;\r\n }\r\n\r\n img.addEventListener(\"load\", function() {\r\n currentlyLoaded++;\r\n imagesLoaded(during, after);\r\n });\r\n\r\n img.addEventListener(\"error\", function() {\r\n imgsRequired--;\r\n imagesLoaded(during, after);\r\n });\r\n });\r\n };\r\n\r\n /**\r\n * Initialising function.\r\n * @param {Object} options - The configuartion object for griddly\r\n */\r\n Macy.init = function(options) {\r\n if (!options.container) {\r\n return;\r\n }\r\n\r\n cache.container = ele(options.container);\r\n\r\n if (!cache.container) {\r\n return;\r\n }\r\n\r\n delete options.container;\r\n\r\n cache.options = extend(defaults, options);\r\n\r\n window.addEventListener(\"resize\", recalculate);\r\n\r\n cache.container.style.position = \"relative\";\r\n cache.elements = cache.container.children;\r\n\r\n if (!cache.options.waitForImages) {\r\n recalculate();\r\n calculateOnImageLoad(function() {\r\n recalculate();\r\n });\r\n\r\n return;\r\n }\r\n\r\n calculateOnImageLoad(null, function() {\r\n recalculate();\r\n });\r\n };\r\n\r\n /**\r\n * Set up public methods.\r\n */\r\n Macy.recalculate = recalculate;\r\n Macy.onImageLoad = calculateOnImageLoad;\r\n Macy.remove = remove;\r\n\r\n /**\r\n * Return public API.\r\n */\r\n return Macy;\r\n});\r\n","(function() {\r\n \"use strict\";\r\n\r\n angular\r\n .module(\"app\")\r\n .controller(\"AssetsListController\", [\r\n \"$scope\",\r\n \"$location\",\r\n \"$timeout\",\r\n \"$sanitize\",\r\n AssetsListController,\r\n ]);\r\n\r\n function AssetsListController($scope, $location, $timeout, $sanitize) {\r\n // Assets don't come from the server with any sort of unique identifier\r\n // For easier tracking, let's build a unique ID for each asset\r\n var assetIdCounter = 0;\r\n var generateAssetId = function() {\r\n assetIdCounter += 1;\r\n return assetIdCounter;\r\n };\r\n\r\n var processAndGroupAssets = function(obj, opts) {\r\n opts = opts || {};\r\n\r\n for (var i = 0; i < obj.length; i++) {\r\n var generatedId = generateAssetId();\r\n\r\n obj[i].id = generatedId;\r\n\r\n $scope.state.assetsById[generatedId] = {\r\n name: obj[i].name,\r\n isTopLevel: !opts.isChildOfGroupId,\r\n };\r\n\r\n $scope.state.assetsByName[obj[i].name] = {\r\n id: generatedId,\r\n isTopLevel: !opts.isChildOfGroupId,\r\n };\r\n\r\n if (opts.isChildOfGroupId) {\r\n $scope.state.assetsByGroup[opts.isChildOfGroupId].push(obj[i].id);\r\n }\r\n\r\n if (\r\n opts.topLevelGroupId &&\r\n opts.topLevelGroupId !== opts.isChildOfGroupId\r\n ) {\r\n $scope.state.assetsByGroup[opts.topLevelGroupId].push(obj[i].id);\r\n // console.log(opts.domainName);\r\n }\r\n\r\n if (opts.domainName) {\r\n $scope.state.domainsByAsset[obj[i].id] = opts.domainName;\r\n }\r\n\r\n // If this asset is a group with children, need to assign IDs for those too\r\n // Since this isn't the first run, we also need to pass the new group ID\r\n if (obj[i].children.length) {\r\n // Since this asset has children, create a group for it if it doesn't already exist\r\n $scope.state.assetsByGroup[obj[i].id] =\r\n $scope.state.assetsByGroup[obj[i].id] || [];\r\n processAndGroupAssets(obj[i].children, {\r\n isChildOfGroupId: obj[i].id,\r\n topLevelGroupId: opts.topLevelGroupId || obj[i].id,\r\n domainName: opts.domainName || obj[i].name,\r\n });\r\n }\r\n }\r\n };\r\n\r\n // First run is top-level, defines groups\r\n processAndGroupAssets($scope.state.assets);\r\n\r\n $scope.state.findGroupDomain = function(groupName) {\r\n var output;\r\n $scope.domains.forEach(function(elm, ind, arr) {\r\n if (groupName === elm.name) {\r\n output = elm;\r\n }\r\n });\r\n return output;\r\n };\r\n\r\n $scope.state.selectAsset = function(assetId) {\r\n if ($scope.state.selectedAssets.indexOf(assetId) < 0) {\r\n $scope.state.selectedAssets.push(assetId);\r\n // $scope.rrMap.styleShape($scope.state.assetsById[assetId].fips);\r\n }\r\n };\r\n $scope.state.selectParent = function(assetId) {\r\n if ($scope.state.selectedParent.indexOf(assetId) < 0) {\r\n $scope.state.selectedParent.push(assetId);\r\n // $scope.rrMap.styleShape($scope.state.assetsById[assetId].fips);\r\n }\r\n };\r\n if (!$scope.state.selectedAssets) {\r\n if ($location.search().assets) {\r\n var assetIds = [];\r\n $location\r\n .search()\r\n .assets.split(\"|\")\r\n .forEach(function(asset, ind, arr) {\r\n // Child assets are prefixed by their parent and a slash. Break that out.\r\n asset = asset.split(\"/\");\r\n asset = asset[asset.length - 1];\r\n assetIds.push($scope.state.assetsByName[asset].id);\r\n });\r\n $scope.state.selectedAssets = assetIds;\r\n }\r\n else {\r\n $scope.state.selectedAssets = [];\r\n }\r\n }\r\n \r\n $scope.state.hasChildAssets = function(assetId) { \r\n var children = $scope.state.assetsByGroup[assetId];\r\n return (children && children.length > 0);\r\n };\r\n\r\n if (!$scope.state.selectedParent) {\r\n if ($location.search().assets) {\r\n var parentAssetIds = [];\r\n $location\r\n .search()\r\n .assets.split(\"|\")\r\n .forEach(function(asset, ind, arr) {\r\n // Child assets are prefixed by their parent and a slash. Break that out.\r\n asset = asset.split(\"/\");\r\n asset = asset[0];\r\n var candidateId = $scope.state.assetsByName[asset].id;\r\n if ($scope.state.hasChildAssets(candidateId)) {\r\n parentAssetIds.push(candidateId);\r\n }\r\n });\r\n $scope.state.selectedParent = parentAssetIds;\r\n }\r\n else {\r\n $scope.state.selectedParent = [];\r\n }\r\n }\r\n\r\n $scope.state.removeAsset = function(assetId) {\r\n var index = $scope.state.selectedAssets.indexOf(assetId);\r\n if (index > -1) {\r\n $scope.state.selectedAssets.splice(index, 1);\r\n // $scope.rrMap.styleShape($scope.state.communitiesById[assetId].fips);\r\n }\r\n };\r\n $scope.state.removeParent = function(assetId) {\r\n var index = $scope.state.selectedParent.indexOf(assetId);\r\n\r\n if (index > -1) {\r\n $scope.state.selectedParent.splice(index, 1);\r\n // $scope.rrMap.styleShape($scope.state.communitiesById[assetId].fips);\r\n }\r\n };\r\n $scope.state.triggerLabelClick = function(assetID, $event) {\r\n var element = $($event.currentTarget);\r\n if (\r\n !$(element)\r\n .attr(\"class\")\r\n .split(\" \")\r\n .includes(\"is-checked\")\r\n ) {\r\n $scope.state.openAccordion(element);\r\n }\r\n\r\n $scope.state.toggleAsset(assetID);\r\n $scope.state.toggleParent(assetID);\r\n };\r\n\r\n $scope.state.toggleParent = function(assetId) {\r\n var children = $scope.state.assetsByGroup[assetId];\r\n var selectedAssets = $scope.state.selectedAssets;\r\n var hasSelectedChildren = selectedAssets.filter(function(e) {\r\n return children && children.indexOf(e) > -1;\r\n });\r\n if (\r\n $scope.state.assetChildIsSelected(assetId) &&\r\n hasSelectedChildren.length == 0\r\n ) {\r\n $scope.state.removeParent(assetId);\r\n return false;\r\n }\r\n else if ($scope.state.hasChildAssets(assetId)) {\r\n $scope.state.selectParent(assetId);\r\n return true;\r\n }\r\n };\r\n $scope.state.toggleAsset = function(assetId) {\r\n // Tracks when a user clicks on a resource checkbox button on the \"Map Community Resources\" page\r\n var resourceName = $scope.state.assetsById[assetId].name;\r\n dataLayer.push({\r\n event: \"Resource Clicks\",\r\n eventCategory: \"Interactive Clicks\",\r\n eventAction: \"Resource Click|\" + resourceName,\r\n eventLabel: window.location.pathname,\r\n });\r\n\r\n if ($scope.state.assetsByGroup[assetId]) {\r\n return $scope.state.toggleAssetsByParent(assetId);\r\n }\r\n else {\r\n if ($scope.state.assetIsSelected(assetId)) {\r\n $scope.state.removeAsset(assetId);\r\n return false;\r\n }\r\n else {\r\n $scope.state.selectAsset(assetId);\r\n return true;\r\n }\r\n }\r\n };\r\n\r\n $scope.state.toggleAccordion = function($event) {\r\n var element = $event.currentTarget;\r\n var parent = $(element).parent();\r\n if (\r\n parent\r\n .attr(\"class\")\r\n .split(\" \")\r\n .includes(\"open\")\r\n ) {\r\n $(parent).removeClass(\"open\");\r\n }\r\n else {\r\n $(parent).addClass(\"open\");\r\n }\r\n };\r\n\r\n $scope.state.openAccordion = function(element) {\r\n var parent = element.parent().parent();\r\n if (\r\n !parent\r\n .attr(\"class\")\r\n .split(\" \")\r\n .includes(\"open\")\r\n ) {\r\n $(parent).addClass(\"open\");\r\n }\r\n };\r\n\r\n $scope.state.toggleAssetsByParent = function(groupId, forceSelect) {\r\n if ($scope.state.assetGroupIsSelected(groupId) && !forceSelect) {\r\n $scope.state.assetsByGroup[groupId].forEach(function(val, ind, arr) {\r\n if ($scope.state.assetsByGroup[val]) {\r\n return $scope.state.toggleAssetsByParent(val, true);\r\n }\r\n else {\r\n $scope.state.removeAsset(val);\r\n }\r\n });\r\n $scope.state.removeAsset(groupId);\r\n }\r\n else {\r\n $scope.state.assetsByGroup[groupId].forEach(function(val, ind, arr) {\r\n if ($scope.state.assetsByGroup[val]) {\r\n return $scope.state.toggleAssetsByParent(val, true);\r\n }\r\n else {\r\n $scope.state.selectAsset(val);\r\n }\r\n });\r\n $scope.state.selectAsset(groupId);\r\n }\r\n };\r\n\r\n $scope.state.allAssetsAreSelected = function() {\r\n return (\r\n $scope.state.selectedAssets.length ===\r\n Object.keys($scope.state.assetsById).length\r\n );\r\n };\r\n\r\n $scope.state.toggleAllAssets = function() {\r\n var allSelected = $scope.state.allAssetsAreSelected();\r\n\r\n for (var asset in $scope.state.assetsById) {\r\n if ($scope.state.assetsById.hasOwnProperty(asset)) {\r\n // Need to coerce `asset` to a Number\r\n if (allSelected) {\r\n $scope.state.removeAsset(+asset);\r\n }\r\n else {\r\n $scope.state.selectAsset(+asset);\r\n }\r\n }\r\n }\r\n };\r\n\r\n $scope.state.assetIsSelected = function(assetId) {\r\n if ($scope.state.assetsByGroup[assetId]) {\r\n return $scope.state.assetGroupIsSelected(assetId);\r\n }\r\n else {\r\n return $scope.state.selectedAssets.indexOf(assetId) >= 0;\r\n }\r\n };\r\n\r\n $scope.state.assetChildIsSelected = function(assetId) {\r\n var matchedArray = $scope.state.selectedParent.filter(function(e) {\r\n return e == assetId;\r\n });\r\n\r\n if (matchedArray.length > 0) {\r\n return true;\r\n }\r\n };\r\n $scope.state.assetGroupIsSelected = function(groupId) {\r\n // Quick exist if we haven't created groups yet\r\n if (!$scope.state.assetsByGroup[groupId]) {\r\n return false;\r\n }\r\n\r\n var matchedArray = $scope.state.selectedAssets.filter(function(elem) {\r\n return $scope.state.assetsByGroup[groupId].indexOf(elem) > -1;\r\n });\r\n if (matchedArray.length == $scope.state.assetsByGroup[groupId].length) {\r\n $scope.state.selectAsset(groupId);\r\n return true;\r\n }\r\n else {\r\n $scope.state.removeAsset(groupId);\r\n return false;\r\n }\r\n };\r\n\r\n $scope.state.assetGroupHasSelectedAssets = function(assetGroup) {\r\n for (var i = 0; i < assetGroup.children.length; i++) {\r\n var child = assetGroup.children[i];\r\n if (\r\n $scope.state.assetIsSelected(child.id) ||\r\n $scope.state.assetChildIsSelected(child.id)\r\n ) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n // When the selected year changes, we need to default to the highest- and\r\n // lowest-ranked communities ONLY if the user hasn't made any selections themselves\r\n $scope.state.checkForSelectedAssets = function(before) {\r\n // before = communitiesByRank before `selectedYear` pulled in new data\r\n var after = $scope.state.communitiesByRank;\r\n\r\n var highestRankBefore = before ? before[0] : {};\r\n var lowestRankBefore = before ? before[before.length - 1] : {};\r\n\r\n var highestRankAfter = after[0];\r\n var lowestRankAfter = after[after.length - 1];\r\n\r\n // By default, or if the only two selected communities are the old highest and\r\n // lowest ranked, clear the selections and select the new highest- and\r\n // lowest-ranking communities\r\n if (\r\n $scope.state.selectedAssets.length === 0 ||\r\n ($scope.state.selectedAssets.length === 2 &&\r\n $scope.state.assetIsSelected(highestRankBefore.id) &&\r\n $scope.state.assetIsSelected(lowestRankBefore.id))\r\n ) {\r\n $scope.state.selectedAssets = [];\r\n $scope.state.selectAsset(highestRankAfter.id);\r\n $scope.state.selectAsset(lowestRankAfter.id);\r\n\r\n // Restyle the old districts on the map if we need to\r\n $scope.rrMap.styleShape(highestRankBefore.fips);\r\n $scope.rrMap.styleShape(lowestRankBefore.fips);\r\n }\r\n };\r\n\r\n $scope.$watch(\r\n \"state.selectedDomain\",\r\n function(newDomain, prevDomain) {\r\n // quick exit on the first run, or if there's no default asset\r\n if (\r\n prevDomain === newDomain ||\r\n !$scope.state.selectedDomain.defaultAsset\r\n ) {\r\n return false;\r\n }\r\n\r\n var domain = $scope.state.selectedDomain;\r\n\r\n var prevDefaultAsset;\r\n if (prevDomain && prevDomain.defaultAsset) {\r\n prevDefaultAsset = $scope.state.assetsByName[prevDomain.defaultAsset.name];\r\n }\r\n\r\n var nonTopLevelAssets = $scope.state.selectedAssets.filter(function(id) {\r\n return !$scope.state.assetsById[id].isTopLevel;\r\n });\r\n\r\n function isSelectedAssetThePreviousDefault() {\r\n return prevDefaultAsset &&\r\n (prevDefaultAsset.id === nonTopLevelAssets[0] ||\r\n ($scope.state.selectedParent && $scope.state.selectedParent.includes(prevDefaultAsset.id)));\r\n }\r\n\r\n if (nonTopLevelAssets.length === 0 || (nonTopLevelAssets.length === 1 && isSelectedAssetThePreviousDefault)) {\r\n // ...clear any selected assets and select the new domain's default asset\r\n $scope.state.selectedParent = [];\r\n $scope.state.selectedAssets = [];\r\n if (!domain.defaultAsset || domain.defaultAsset.name === \"0\") { \r\n console.warn(\"No default asset found for domain '\" + domain.name + \"'.\");\r\n return;\r\n }\r\n\r\n var targetAsset;\r\n var defaultAssetChildren = domain.defaultAsset.children;\r\n if (defaultAssetChildren && defaultAssetChildren.length) {\r\n var domainAsset = $scope.state.assets.find(a => a.name === domain.name);\r\n if (!domainAsset) {\r\n console.error(\"Unable to find domain asset '\" + domain.name + '\"');\r\n return;\r\n }\r\n\r\n var parentAsset = domainAsset.children.find(a => a.name == domain.defaultAsset.name);\r\n if (!parentAsset) {\r\n console.error(\"Unable to find parent default asset '\" + domain.defaultAsset.name + '\"');\r\n return;\r\n }\r\n\r\n $scope.state.selectParent(parentAsset.id);\r\n targetAsset = parentAsset.children.find(a => a.name === defaultAssetChildren[0].name);\r\n if (!targetAsset) {\r\n console.error(\"Unable to find default child asset '\" + defaultAssetChildren[0].name + \"'.\");\r\n return;\r\n }\r\n }\r\n else {\r\n targetAsset = $scope.state.assetsByName[domain.defaultAsset.name];\r\n if (!targetAsset) {\r\n console.error(\"Unable to find default asset '\" + domain.defaultAsset.name + \"'.\");\r\n return;\r\n }\r\n }\r\n \r\n $scope.state.selectAsset(targetAsset.id);\r\n }\r\n },\r\n true,\r\n );\r\n }\r\n})();\r\n","(function() {\r\n \"use strict\";\r\n\r\n angular.module(\"app\").directive(\"cccAssetsList\", cccAssetsList);\r\n\r\n function cccAssetsList() {\r\n return {\r\n restrict: \"EA\",\r\n scope: false,\r\n controller: \"AssetsListController\"\r\n };\r\n }\r\n})();\r\n","(function() {\r\n \"use strict\";\r\n\r\n angular\r\n .module(\"app\")\r\n .factory(\"AssetsService\", [\"$http\", \"$q\", AssetsService]);\r\n\r\n function AssetsService($http, $q) {\r\n var service = {\r\n getAssets: getAssets\r\n };\r\n\r\n function getAssets(assetsArray) {\r\n var deferred = $q.defer();\r\n\r\n $http({\r\n method: \"POST\",\r\n url: \"api/AssetMapping/GetAssets\",\r\n data: '{assets: \"' + assetsArray + '\"}',\r\n cache: true // this data rarely updates, no need for an instant re-request\r\n })\r\n .success(function(data) {\r\n deferred.resolve(data);\r\n })\r\n .error(function(error) {\r\n deferred.reject();\r\n });\r\n\r\n return deferred.promise;\r\n }\r\n\r\n return service;\r\n }\r\n})();\r\n","(function() {\r\n angular.module(\"app\").directive(\"clickOutToClose\", [\r\n \"$document\",\r\n \"$timeout\",\r\n function($document, $timeout) {\r\n return {\r\n restrict: \"A\",\r\n link: function(scope, elem, attr, ctrl) {\r\n var elemClickHandler = function(e) {\r\n e.stopPropagation();\r\n };\r\n\r\n var docClickHandler = function(e) {\r\n $timeout(function() {\r\n scope.$apply(attr.clickOutToClose);\r\n });\r\n };\r\n\r\n elem.on(\"click\", elemClickHandler);\r\n $document.on(\"click\", docClickHandler);\r\n\r\n // teardown the event handlers when the scope is destroyed.\r\n scope.$on(\"$destroy\", function() {\r\n elem.off(\"click\", elemClickHandler);\r\n $document.off(\"click\", docClickHandler);\r\n });\r\n }\r\n };\r\n }\r\n ]);\r\n})();\r\n","(function() {\r\n \"use strict\";\r\n\r\n angular\r\n .module(\"app\")\r\n .controller(\"CommunitiesController\", [\r\n \"$scope\",\r\n \"$location\",\r\n \"rankingsService\",\r\n CommunitiesController\r\n ]);\r\n\r\n function CommunitiesController($scope, $location, rankingsService) {\r\n // Create the app-wide selectedCommunities object\r\n // `communities` is the actual ID store. Accessed by getters/setters, basically\r\n $scope.state.selectedCommunities = {\r\n communities: []\r\n };\r\n\r\n $scope.state.assets = window.ccc.assetPicker;\r\n $scope.state.assetsById = {};\r\n $scope.state.assetsByName = {};\r\n $scope.state.assetsByGroup = {};\r\n $scope.state.domainsByAsset = {}; // Easily pull domain name/color for an asset\r\n\r\n $scope.state.selectedCommunities.addCommunity = function(communityId) {\r\n if (\r\n $scope.state.selectedCommunities.communities.indexOf(communityId) < 0\r\n ) {\r\n $scope.state.selectedCommunities.communities.push(communityId);\r\n $scope.rrMap.styleShape($scope.state.communitiesById[communityId].fips);\r\n }\r\n };\r\n\r\n $scope.state.selectedCommunities.removeCommunity = function(\r\n communityId,\r\n doPush\r\n ) {\r\n var index = $scope.state.selectedCommunities.communities.indexOf(\r\n communityId\r\n );\r\n if (index > -1) {\r\n $scope.state.selectedCommunities.communities.splice(index, 1);\r\n\r\n // `true` parameter forces community to style as unselected/unhovered\r\n // Offers better UX when a user un-selects a community from the map itself\r\n var community = $scope.state.communitiesById[communityId];\r\n $scope.rrMap.styleShape(community.fips, true);\r\n\r\n if (doPush) {\r\n // Tracks when a user removes a community\r\n dataLayer.push({\r\n event: \"Community Removed\",\r\n eventCategory: \"Interactive Clicks\",\r\n eventAction: \"Community Removed|\" + community.name,\r\n eventLabel: window.location.pathname\r\n });\r\n }\r\n }\r\n };\r\n\r\n $scope.state.selectedCommunities.toggleCommunity = function(communityId) {\r\n if ($scope.state.selectedCommunities.communityIsSelected(communityId)) {\r\n $scope.state.selectedCommunities.removeCommunity(communityId);\r\n return false;\r\n }\r\n else {\r\n $scope.state.selectedCommunities.addCommunity(communityId);\r\n return true;\r\n }\r\n };\r\n\r\n $scope.state.selectedCommunities.toggleCommunitiesByGroup = function(\r\n groupName\r\n ) {\r\n if ($scope.state.selectedCommunities.groupIsSelected(groupName)) {\r\n $scope.state.communitiesByGroup[groupName].forEach(function(\r\n val,\r\n ind,\r\n arr\r\n ) {\r\n $scope.state.selectedCommunities.removeCommunity(val);\r\n });\r\n }\r\n else {\r\n $scope.state.communitiesByGroup[groupName].forEach(function(\r\n val,\r\n ind,\r\n arr\r\n ) {\r\n $scope.state.selectedCommunities.addCommunity(val);\r\n });\r\n }\r\n };\r\n\r\n $scope.state.selectedCommunities.communityIsSelected = function(\r\n communityId,\r\n filteredCommunitiesByGroup\r\n ) {\r\n var selectedCommunities = $scope.state.selectedCommunities.communities;\r\n if (selectedCommunities.indexOf(communityId) < 0) {\r\n return false;\r\n }\r\n if (\r\n $scope.currentURL.search().cap &&\r\n filteredCommunitiesByGroup &&\r\n selectedCommunities.length > 25\r\n ) {\r\n var communityIndex = filteredCommunitiesByGroup\r\n .filter(function(community) {\r\n return selectedCommunities.indexOf(community.id) > -1;\r\n })\r\n .map(function(community) {\r\n return community.id;\r\n })\r\n .indexOf(communityId);\r\n\r\n return communityIndex > -1 && communityIndex < 5;\r\n }\r\n return true;\r\n };\r\n\r\n $scope.state.selectedCommunities.groupIsSelected = function(groupName) {\r\n // Quick exit if we haven't built out the requisite datasets yet\r\n if (!$scope.state.communitiesByGroup[groupName]) {\r\n return false;\r\n }\r\n\r\n var matchedArray = $scope.state.selectedCommunities.communities.filter(\r\n function(elem) {\r\n return $scope.state.communitiesByGroup[groupName].indexOf(elem) > -1;\r\n }\r\n );\r\n\r\n return (\r\n matchedArray.length == $scope.state.communitiesByGroup[groupName].length\r\n );\r\n };\r\n\r\n $scope.state.selectedCommunities.communitiesByGroup = function(groupName) {\r\n var selectedCommunitiesByGroup = $scope.state.communitiesByGroup[\r\n groupName\r\n ].filter(function(communityId) {\r\n return $scope.state.selectedCommunities.communityIsSelected(\r\n communityId\r\n );\r\n });\r\n return selectedCommunitiesByGroup;\r\n };\r\n\r\n // When the selected year changes, we need to default to the highest- and\r\n // lowest-ranked communities ONLY if the user hasn't made any selections themselves\r\n $scope.state.selectedCommunities.checkForUserSelections = function(before) {\r\n // before = communitiesByRank before `selectedYear` pulled in new data\r\n var after = $scope.state.communitiesByRank;\r\n\r\n var highestRankBefore = rankingsService.highestRanked(before);\r\n var lowestRankBefore = rankingsService.lowestRanked(before);\r\n\r\n var highestRankAfter = rankingsService.highestRanked(after);\r\n var lowestRankAfter = rankingsService.lowestRanked(after);\r\n\r\n function id(x) {\r\n return x.id;\r\n }\r\n\r\n function oldDefaultsAreSelected() {\r\n var allSelectedBefore = highestRankBefore.concat(lowestRankBefore);\r\n return allSelectedBefore.reduce(function(accum, cd) {\r\n return (\r\n accum && $scope.state.selectedCommunities.communityIsSelected(cd.id)\r\n );\r\n }, allSelectedBefore.length ===\r\n $scope.state.selectedCommunities.communities.length);\r\n }\r\n\r\n // By default, or if the only two selected communities are the old highest and\r\n // lowest ranked, clear the selections and select the new highest- and\r\n // lowest-ranking communities\r\n if (\r\n $scope.state.selectedCommunities.communities.length === 0 ||\r\n oldDefaultsAreSelected()\r\n ) {\r\n $scope.state.selectedCommunities.communities = [];\r\n\r\n highestRankAfter.concat(lowestRankAfter).forEach(function(cd) {\r\n $scope.state.selectedCommunities.addCommunity(cd.id);\r\n });\r\n\r\n highestRankBefore.concat(lowestRankBefore).forEach(function(cd) {\r\n $scope.rrMap.styleShape(cd.fips);\r\n });\r\n }\r\n };\r\n\r\n $scope.state.selectedCommunities.build = function(\r\n response,\r\n oldCommunityRanks\r\n ) {\r\n $scope.state.communityData = response;\r\n\r\n // Depending on what data a method has available, we might need to find a community\r\n // by a variety of keys. Group (Lowest Risk, Medium Risk, etc), ID, Fips ID, etc.\r\n // Pre-building these objects makes it easier and faster than walking the main obj.\r\n var sortedByGroup = {};\r\n var sortedById = {};\r\n var sortedByFips = {};\r\n\r\n $scope.state.communityData.map(function(community) {\r\n sortedByGroup[community.group] = sortedByGroup[community.group] || [];\r\n sortedByGroup[community.group].push(community.id);\r\n sortedById[community.id] = community;\r\n sortedByFips[community.fips] = community;\r\n });\r\n\r\n $scope.state.communitiesByGroup = sortedByGroup;\r\n $scope.state.communitiesById = sortedById;\r\n $scope.state.communitiesByFips = sortedByFips;\r\n\r\n var sortedCommunities = $scope.state.communityData.sort(function(a, b) {\r\n return a.rank - b.rank;\r\n });\r\n\r\n $scope.state.communitiesByRank = sortedCommunities;\r\n\r\n if ($scope.state.selectedCommunities) {\r\n if (\r\n !$scope.state.selectedCommunities.communities.length &&\r\n $location.search().communities\r\n ) {\r\n $location\r\n .search()\r\n .communities.split(\"|\")\r\n .forEach(function(id, ind, arr) {\r\n $scope.state.selectedCommunities.addCommunity(+id); // coerse to int\r\n });\r\n }\r\n else {\r\n $scope.state.selectedCommunities.checkForUserSelections(\r\n oldCommunityRanks\r\n );\r\n }\r\n }\r\n };\r\n }\r\n})();\r\n","(function() {\r\n \"use strict\";\r\n\r\n angular.module(\"app\").directive(\"cccCommunities\", cccCommunities);\r\n\r\n function cccCommunities() {\r\n return {\r\n restrict: \"EA\",\r\n scope: false,\r\n controller: \"CommunitiesController\"\r\n };\r\n }\r\n})();\r\n","(function() {\r\n \"use strict\";\r\n\r\n angular\r\n .module(\"app\")\r\n .factory(\"CommunitiesService\", [\"$http\", \"$q\", CommunitiesService]);\r\n\r\n function CommunitiesService($http, $q) {\r\n var _communities = [];\r\n var service = {\r\n getCommunityData: getCommunityData\r\n };\r\n\r\n // Prevents unnecessary API calls\r\n var communitiesAreLoaded = false;\r\n\r\n function getCommunityData(domainId, yearId, includeOtherIndicators) {\r\n var deferred = $q.defer();\r\n\r\n $http({\r\n method: \"GET\",\r\n url:\r\n \"api/RiskRankingData/GetDomainLocation?id=\" +\r\n domainId +\r\n \"&timeFrame=\" +\r\n yearId +\r\n \"&includeOtherIndicators=\" +\r\n (includeOtherIndicators ? \"true\" : \"false\"),\r\n cache: true // this data rarely updates, no need for an instant re-request\r\n })\r\n .success(function(data) {\r\n processCommunityData(data);\r\n })\r\n .error(function(error) {\r\n deferred.reject();\r\n });\r\n\r\n function processCommunityData(data) {\r\n deferred.resolve(data);\r\n }\r\n\r\n return deferred.promise;\r\n }\r\n\r\n return service;\r\n }\r\n})();\r\n","(function() {\r\n \"use strict\";\r\n\r\n angular\r\n .module(\"app\")\r\n .controller(\"CommunitiesListController\", [\r\n \"$scope\",\r\n CommunitiesListController\r\n ]);\r\n\r\n function CommunitiesListController($scope) {\r\n $scope.sortList = function(indicator, isReverse) {\r\n $scope.sorting.indicatorId = indicator;\r\n $scope.sorting.indicator = \"indicators[\" + indicator + \"].value\";\r\n $scope.sorting.reverse = isReverse;\r\n };\r\n\r\n $scope.isActiveSortingDirection = function(indicatorId, isReverse) {\r\n return (\r\n $scope.sorting.indicatorId === indicatorId &&\r\n $scope.sorting.reverse === isReverse\r\n );\r\n };\r\n\r\n $scope.state.selectedCommunities.checkForUserSelections();\r\n }\r\n})();\r\n","(function() {\r\n \"use strict\";\r\n\r\n angular.module(\"app\").directive(\"cccCommunitiesList\", cccCommunitiesList);\r\n\r\n function cccCommunitiesList() {\r\n return {\r\n restrict: \"EA\",\r\n scope: false,\r\n controller: \"CommunitiesListController\"\r\n };\r\n }\r\n})();\r\n","(function() {\r\n \"use strict\";\r\n\r\n angular\r\n .module(\"app\")\r\n .controller(\"CommunityDataTableController\", [\r\n \"$scope\",\r\n CommunityDataTableController\r\n ]);\r\n\r\n function CommunityDataTableController($scope) {\r\n // By default, sort by the first indicator returned from the API\r\n // This will be \"Overall Risk Ranking\", if required\r\n $scope.sorting = {\r\n indicator:\r\n \"indicators[\" +\r\n $scope.state.selectedDomain.indicators[0].id +\r\n \"].value\",\r\n indicatorId: $scope.state.selectedDomain.indicators[0].id,\r\n reverse: false\r\n };\r\n\r\n // Middleware-ish for community data table ng-repeat\r\n // ng-repeat iterates through all communities, this filter checks if community is selected\r\n // That way, we have access to all the most recent community data without data duplication\r\n $scope.findSelectedCommunities = function(value, index, array) {\r\n if (!$scope.state.selectedCommunities) {\r\n return false;\r\n }\r\n return $scope.state.selectedCommunities.communityIsSelected(value.id);\r\n };\r\n\r\n $scope.sorting.sortTable = function(indicator) {\r\n if (indicator === $scope.sorting.indicatorId) {\r\n // User is re-sorting the currently selected indicator. Just flip the order.\r\n $scope.sorting.reverse = !$scope.sorting.reverse;\r\n }\r\n else {\r\n // User has selected to a new indicator. Update scope, default to top-down sorting.\r\n $scope.sorting.indicatorId = indicator;\r\n $scope.sorting.indicator = \"indicators[\" + indicator + \"].value\";\r\n $scope.sorting.reverse = false;\r\n }\r\n };\r\n\r\n $scope.isActiveSortingDirection = function(indicatorId, isReverse) {\r\n return (\r\n $scope.sorting.indicatorId === indicatorId &&\r\n $scope.sorting.reverse === isReverse\r\n );\r\n };\r\n\r\n $scope.domainHasIndicator = function(domain, indicator) {\r\n for (var prop in domain) {\r\n if (domain.hasOwnProperty(prop) && +prop === +indicator) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n };\r\n\r\n // Basically, the \"Overall Risk Ranking\" indicator needs to render as \"Overall Rank\".\r\n // Because that indicator is arbitrary, we need to do a string match to check the indicator\r\n // and tweak the name if need be.\r\n $scope.parseIndicatorName = function(indicator) {\r\n return indicator === \"Overall Risk Ranking\" ? \"Overall Rank\" : indicator;\r\n };\r\n }\r\n})();\r\n","(function() {\r\n \"use strict\";\r\n\r\n angular\r\n .module(\"app\")\r\n .directive(\"cccCommunityDataTable\", cccCommunityDataTable);\r\n\r\n function cccCommunityDataTable() {\r\n return {\r\n restrict: \"EA\",\r\n scope: false,\r\n controller: \"CommunityDataTableController\"\r\n };\r\n }\r\n})();\r\n","(function() {\r\n \"use strict\";\r\n\r\n angular\r\n .module(\"app\")\r\n .controller(\"DomainIndicatorPickerController\", [\r\n \"$scope\",\r\n \"$location\",\r\n \"LegendService\",\r\n DomainIndicatorPickerController\r\n ]);\r\n\r\n function DomainIndicatorPickerController($scope, $location, LegendService) {\r\n $scope.state.mapLegend = undefined;\r\n $scope.legend.colorByCommunity = {};\r\n\r\n $scope.state.refreshLegend = function() {\r\n LegendService.getLegend($scope.state.selectedIndicator.id).then(function(\r\n response\r\n ) {\r\n $scope.state.mapLegend = response;\r\n\r\n // When the indicator changes, the community data does too.\r\n // Re-style each community to display the proper ranking\r\n $scope.state.communityData.forEach(function(community, ind, arr) {\r\n var commIndValue =\r\n community.indicators[$scope.state.selectedIndicator.id];\r\n if (commIndValue && commIndValue.value) {\r\n $scope.state.mapLegend.forEach(function(legend, ind, arr) {\r\n if (\r\n commIndValue.value <= legend.highDataValue &&\r\n commIndValue.value >= legend.lowDataValue\r\n ) {\r\n community.indicatorGroup = ind;\r\n $scope.legend.colorByCommunity[community.id] =\r\n $scope.legend.colors[ind];\r\n }\r\n });\r\n }\r\n\r\n $scope.rrMap.styleShape(community.fips);\r\n });\r\n });\r\n };\r\n\r\n $scope.$watch(\"state.selectedIndicator\", function(oldVal, newVal) {\r\n if (oldVal === newVal) {\r\n return false;\r\n }\r\n\r\n $scope.state.indicatorPickerIsOpen = false;\r\n $scope.state.refreshLegend();\r\n $location.search(\"indicator\", $scope.state.selectedIndicator.id);\r\n\r\n // Tracks when users select different Risk Ranking indicators from a drop down under a domain (e.g. health) on the \"Asset Mapping\" page\r\n dataLayer.push({\r\n event: \"Risk Ranking Indicator Click on Asset Page\",\r\n eventCategory: \"Interactive Clicks\",\r\n eventAction: \"Domain Indicator |\" + $scope.state.selectedIndicator.name,\r\n eventLabel: window.location.pathname\r\n });\r\n });\r\n\r\n if ($location.search().indicator) {\r\n $scope.state.selectedIndicator = $scope.state.selectedDomain.indicators.find(\r\n function(indicator) {\r\n if (indicator.id == $location.search().indicator) {\r\n return indicator;\r\n }\r\n }\r\n );\r\n }\r\n\r\n if (!$scope.state.selectedIndicator) {\r\n $scope.state.selectedIndicator = $scope.state.selectedDomain.indicators.find(\r\n function(indicator) {\r\n if (indicator.id == $scope.state.selectedDomain.id) {\r\n return indicator;\r\n }\r\n }\r\n );\r\n }\r\n\r\n if (!$scope.state.selectedIndicator) {\r\n $scope.state.selectedIndicator =\r\n $scope.state.selectedDomain.indicators[\r\n $scope.state.selectedDomain.indicators.length - 1\r\n ];\r\n }\r\n }\r\n})();\r\n","(function() {\r\n \"use strict\";\r\n\r\n angular\r\n .module(\"app\")\r\n .directive(\"cccDomainIndicatorPicker\", cccDomainIndicatorPicker);\r\n\r\n function cccDomainIndicatorPicker() {\r\n return {\r\n restrict: \"EA\",\r\n scope: false,\r\n controller: \"DomainIndicatorPickerController\"\r\n };\r\n }\r\n})();\r\n","(function() {\r\n \"use strict\";\r\n\r\n angular\r\n .module(\"app\")\r\n .controller(\"DomainSelectorController\", [\r\n \"$scope\",\r\n \"$attrs\",\r\n \"$location\",\r\n \"CommunitiesService\",\r\n \"DomainSelectorService\",\r\n \"LoadingService\",\r\n DomainSelectorController\r\n ]);\r\n\r\n function DomainSelectorController(\r\n $scope,\r\n $attrs,\r\n $location,\r\n CommunitiesService,\r\n DomainSelectorService,\r\n LoadingService\r\n ) {\r\n // We receive domain border color data from the API as a hex code\r\n // Need to convert that to RGBA for hover styling\r\n var hexToRgba = function(hex, opacity) {\r\n hex = hex.replace(\"#\", \"\");\r\n var r = parseInt(hex.substring(0, 2), 16);\r\n var g = parseInt(hex.substring(2, 4), 16);\r\n var b = parseInt(hex.substring(4, 6), 16);\r\n\r\n return \"rgba(\" + r + \",\" + g + \",\" + b + \",\" + opacity / 100 + \")\";\r\n };\r\n\r\n // Domain tab is clicked\r\n $scope.selectDomain = function(domain) {\r\n var domainLoadingId = LoadingService.taskStart(\r\n $scope,\r\n \"Loading Domain Data\"\r\n );\r\n\r\n DomainSelectorService.getDomainById(domain, $attrs.assetMap).then(\r\n function(response) {\r\n LoadingService.taskEnd($scope, domainLoadingId);\r\n $scope.state.selectedDomain = response.data;\r\n\r\n $location.search(\"domain\", $scope.state.selectedDomain.id);\r\n\r\n if ($attrs.assetMap) {\r\n // Domains should default to the Risk Ranking indicator\r\n // But that indicator needs to be generated ourselves\r\n $scope.state.selectedDomain.indicators.push({\r\n id: $scope.state.selectedDomain.id,\r\n name: $scope.state.selectedDomain.name.match(/^overall.*/i)\r\n ? $scope.state.selectedDomain.name\r\n : $scope.state.selectedDomain.name + \" Risk Ranking\"\r\n });\r\n }\r\n\r\n // If there's already a year selected, check if the new domain has data for that\r\n // year. If so, keep that year selected; otherwise, default to the most recent year\r\n\r\n if ($location.search().year) {\r\n $scope.state.selectedYear = {\r\n id: +$location.search().year // coerse to int\r\n };\r\n }\r\n\r\n if ($scope.state.selectedYear) {\r\n var hasSelectedYear;\r\n\r\n // Run through the response data `years` array of objects to find any match\r\n response.data.years.filter(function(year, index, array) {\r\n if (year.id === $scope.state.selectedYear.id) {\r\n hasSelectedYear = index;\r\n return true;\r\n }\r\n return false;\r\n });\r\n\r\n $scope.state.selectedYear = hasSelectedYear\r\n ? response.data.years[hasSelectedYear]\r\n : response.data.years[0];\r\n }\r\n else {\r\n $scope.state.selectedYear = response.data.years[0];\r\n }\r\n\r\n // Map the new domain's groups to our legend colors\r\n $scope.legend.colorByGroup = {};\r\n $scope.state.selectedDomain.groups.map(function(group, index) {\r\n $scope.legend.colorByGroup[group] = $scope.legend.colors[index];\r\n return true;\r\n });\r\n\r\n if ($attrs.assetMap) {\r\n var communityLoadingId = LoadingService.taskStart(\r\n $scope,\r\n \"Loading Community Data\"\r\n );\r\n CommunitiesService.getCommunityData(\r\n $scope.state.selectedDomain.id,\r\n $scope.state.selectedYear.id,\r\n true\r\n ).then(\r\n function(response) {\r\n LoadingService.taskEnd($scope, communityLoadingId);\r\n var oldCommunityRanks = $scope.state.communitiesByRank;\r\n $scope.state.selectedCommunities.build(\r\n response.communityDistrictData,\r\n oldCommunityRanks\r\n );\r\n\r\n // Domains should default to the Risk Ranking indicator\r\n // As a fall-back, default the default (ha) to the last indicator (usually Risk Ranking)\r\n var newIndicator =\r\n $scope.state.selectedDomain.indicators[\r\n $scope.state.selectedDomain.indicators.length - 1\r\n ];\r\n\r\n $scope.state.selectedDomain.indicators.forEach(function(\r\n indicator\r\n ) {\r\n // Indicator id for Risk Ranking is just the domain ID\r\n if (indicator.id === $scope.state.selectedDomain.id) {\r\n newIndicator = indicator;\r\n }\r\n });\r\n\r\n if ($scope.state.selectedIndicator) {\r\n // If there already a selected indicator, and the new domain also shares that indicator,\r\n // don't update the indicator. Otherwise, default to Risk Ranking.\r\n if (\r\n $scope.state.selectedDomain.indicators.indexOf(\r\n $scope.state.selectedIndicator\r\n ) === -1\r\n ) {\r\n $scope.state.selectedIndicator = newIndicator;\r\n }\r\n }\r\n else {\r\n $scope.state.selectedIndicator = newIndicator;\r\n }\r\n\r\n $scope.state.refreshLegend();\r\n\r\n // Now that we have all the community data we need, render that map\r\n $scope.rrMap.render();\r\n },\r\n function(response) {\r\n console.warn(\"getCommunityData failed!\");\r\n }\r\n );\r\n }\r\n },\r\n function(response) {\r\n console.warn(\"getDomainById failed!\");\r\n }\r\n );\r\n };\r\n\r\n $scope.setDomainHoverState = function(domainIndex, isHovered) {\r\n $scope.domains[domainIndex].isHovered = isHovered;\r\n };\r\n\r\n $scope.domainBorderStyle = function(domainIndex) {\r\n var thisDomain = $scope.domains[domainIndex]; // Sugar\r\n\r\n // If the domain is selected, give it the full color border, hovering or not\r\n if (\r\n $scope.state.selectedDomain &&\r\n $scope.state.selectedDomain.id === thisDomain.id\r\n ) {\r\n return \"#\" + thisDomain.color;\r\n }\r\n\r\n // If a domain isn't selected, but is hovered, give it a colored border at 40% opacity\r\n if (thisDomain.isHovered) {\r\n return hexToRgba(thisDomain.color, 40);\r\n }\r\n\r\n // Otherwise, just return nothing / no style changes\r\n return \"\";\r\n };\r\n\r\n var init = function() {\r\n // `window.ccc` is set in index.cshtml, populated from data provided by the view model\r\n // Prevents an unnecessary API request\r\n $scope.domains = window.ccc.domains;\r\n\r\n // Creating a `state` object on ``$scope` makes it easier for nested directives to\r\n // access our app-wide state via JS prototypal inheritance, without resorting to `$parent`.\r\n $scope.state = {};\r\n\r\n $scope.state.domainsByName = {};\r\n $scope.domains.map(function(domain) {\r\n $scope.state.domainsByName[domain.name] = domain;\r\n return true;\r\n });\r\n\r\n // If the user hasn't specified a domain, default to Overall Risk Ranking\r\n if ($location.search().domain) {\r\n var defaultDomainIndex = 0;\r\n var domainId = $location.search().domain;\r\n $scope.domains.forEach(function(domain, ind, arr) {\r\n if (domain.id == domainId) {\r\n defaultDomainIndex = ind;\r\n }\r\n });\r\n $scope.selectDomain($scope.domains[defaultDomainIndex]);\r\n }\r\n else {\r\n $scope.selectDomain($scope.domains[0]);\r\n }\r\n };\r\n\r\n // Ready, set, go!\r\n init();\r\n }\r\n})();\r\n","(function() {\r\n \"use strict\";\r\n\r\n angular.module(\"app\").directive(\"cccDomainSelector\", cccDomainSelector);\r\n\r\n function cccDomainSelector() {\r\n return {\r\n restrict: \"EA\",\r\n scope: false,\r\n controller: \"DomainSelectorController\"\r\n };\r\n }\r\n})();\r\n","(function() {\r\n \"use strict\";\r\n\r\n angular\r\n .module(\"app\")\r\n .factory(\"DomainSelectorService\", [\"$http\", \"$q\", DomainSelectorService]);\r\n\r\n function DomainSelectorService($http, $q) {\r\n var service = {\r\n getDomainById: getDomainById,\r\n };\r\n\r\n function getDomainById(domain, includeOtherIndicators) {\r\n var deferred = $q.defer();\r\n\r\n $http({\r\n method: \"GET\",\r\n url:\r\n \"/api/RiskRankingData/GetDomainById?id=\" +\r\n domain.id +\r\n \"&includeOtherIndicators=\" +\r\n (includeOtherIndicators ? \"true\" : \"false\"),\r\n cache: true, // this data rarely updates, no need for an instant re-request\r\n })\r\n .success(function(data) {\r\n processDomainData(data);\r\n })\r\n .error(function(error) {\r\n deferred.reject();\r\n });\r\n\r\n var processDomainData = function(data) {\r\n if (domain.defaultAsset) {\r\n data.defaultAsset = domain.defaultAsset[0];\r\n }\r\n\r\n deferred.resolve({\r\n data: data,\r\n });\r\n };\r\n\r\n return deferred.promise;\r\n }\r\n\r\n return service;\r\n }\r\n})();\r\n","(function() {\r\n \"use strict\";\r\n\r\n angular\r\n .module(\"app\")\r\n .controller(\"DomainYearPickerController\", [\r\n \"$scope\",\r\n \"$location\",\r\n \"CommunitiesService\",\r\n \"LoadingService\",\r\n DomainYearPickerController\r\n ]);\r\n\r\n function DomainYearPickerController(\r\n $scope,\r\n $location,\r\n CommunitiesService,\r\n LoadingService\r\n ) {\r\n // This is a `$watch`er instead of a simple method so changes made by other controllers\r\n // will still trigger this API request. Primary use-case: when a user selects a domain\r\n // for the first time, `selectedYear` defaults to the most recent year, and we want to\r\n // immediately request and display the appropriate community data for that year.\r\n $scope.$watch(\"state.selectedYear\", function() {\r\n $scope.yearPickerIsOpen = false;\r\n\r\n $location.search(\"year\", $scope.state.selectedYear.id);\r\n // We pass this to `checkForUserSelections` to compare against the updated community\r\n // ranks, checking to see if we need to make any selection changes\r\n var oldCommunityRanks = $scope.state.communitiesByRank;\r\n\r\n var communityLoadingId = LoadingService.taskStart(\r\n $scope.$parent,\r\n \"Loading Community Data\"\r\n );\r\n\r\n CommunitiesService.getCommunityData(\r\n $scope.state.selectedDomain.id,\r\n $scope.state.selectedYear.id\r\n ).then(\r\n function(response) {\r\n LoadingService.taskEnd($scope.$parent, communityLoadingId);\r\n\r\n $scope.state.selectedCommunities.build(\r\n response.communityDistrictData,\r\n oldCommunityRanks\r\n );\r\n\r\n if (\r\n response.cityDemographics &&\r\n Object.keys(response.cityDemographics).length\r\n ) {\r\n $scope.state.citywideStats = response.cityDemographics;\r\n }\r\n\r\n // Now that we have all the community data we need, render that map\r\n $scope.rrMap.render();\r\n\r\n // When the indicator changes, the community data does too.\r\n // Re-style each community to display the proper ranking\r\n $scope.state.communityData.forEach(function(community, ind, arr) {\r\n $scope.rrMap.styleShape(community.fips);\r\n });\r\n },\r\n function(response) {\r\n console.warn(\"getCommunityData failed!\");\r\n }\r\n );\r\n });\r\n\r\n $scope.dataLayerPush = function() {\r\n // Tracks use of the domain year selector dropdown on the \"Risk Ranking\" page\r\n dataLayer.push({\r\n event: \"Domain Year Selector Clicks\",\r\n eventCategory: \"Interactive Clicks\",\r\n eventAction: \"Domain Year Selector|\" + $scope.state.selectedYear.name,\r\n eventLabel: window.location.pathname\r\n });\r\n };\r\n }\r\n})();\r\n","(function() {\r\n \"use strict\";\r\n\r\n angular.module(\"app\").directive(\"cccDomainYearPicker\", cccDomainYearPicker);\r\n\r\n function cccDomainYearPicker() {\r\n return {\r\n restrict: \"EA\",\r\n scope: false,\r\n controller: \"DomainYearPickerController\"\r\n };\r\n }\r\n})();\r\n","(function() {\r\n \"use strict\";\r\n\r\n angular\r\n .module(\"app\")\r\n .factory(\"LegendService\", [\"$http\", \"$q\", LegendService]);\r\n\r\n function LegendService($http, $q) {\r\n var service = {\r\n getLegend: getLegend\r\n };\r\n\r\n function getLegend(indicatorID) {\r\n var deferred = $q.defer();\r\n\r\n $http({\r\n method: \"GET\",\r\n url: \"api/AssetMapping/GetLegend?id=\" + indicatorID,\r\n cache: true // this data rarely updates, no need for an instant re-request\r\n })\r\n .success(function(data) {\r\n deferred.resolve(data);\r\n })\r\n .error(function(error) {\r\n deferred.reject();\r\n });\r\n\r\n return deferred.promise;\r\n }\r\n\r\n return service;\r\n }\r\n})();\r\n","(function() {\r\n \"use strict\";\r\n\r\n angular.module(\"app\").factory(\"LoadingService\", [LoadingService]);\r\n\r\n // As noted in http://stackoverflow.com/a/2117523/302749\r\n function generateTaskId() {\r\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, function(c) {\r\n var r = (Math.random() * 16) | 0,\r\n v = c == \"x\" ? r : (r & 0x3) | 0x8;\r\n return v.toString(16);\r\n });\r\n }\r\n\r\n function LoadingService() {\r\n return {\r\n taskStart: function(scope, description) {\r\n var tasks = scope.loadingTasks || [],\r\n taskId = generateTaskId();\r\n\r\n scope.loadingTasks = tasks.concat({\r\n id: taskId,\r\n description: description\r\n });\r\n return taskId;\r\n },\r\n taskEnd: function(scope, id) {\r\n var tasks = scope.loadingTasks || [];\r\n scope.loadingTasks = tasks.filter(function(t) {\r\n return t.id !== id;\r\n });\r\n }\r\n };\r\n }\r\n})();\r\n","(function() {\r\n \"use strict\";\r\n\r\n angular\r\n .module(\"app\")\r\n .controller(\"RaceEthnoChartsController\", [\r\n \"$scope\",\r\n \"$sanitize\",\r\n \"$timeout\",\r\n \"$location\",\r\n \"rankingsService\",\r\n RaceEthnoChartsController,\r\n ]);\r\n\r\n function RaceEthnoChartsController(\r\n $scope,\r\n $sanitize,\r\n $timeout,\r\n $location,\r\n rankingsService,\r\n ) {\r\n $scope.showHoverStats = [];\r\n $scope.state.communityCharts = {};\r\n $scope.state.selectedChartCommunities = [];\r\n\r\n var madeChartSelection = false;\r\n\r\n $scope.getFirstDemographic = function(demographics) {\r\n var key = demographics ? Object.keys(demographics)[0] : null;\r\n\r\n return key ? demographics[key] : [];\r\n };\r\n\r\n $scope.rebuildCharts = function(forceReload) {\r\n if (!$scope.state.chartsToShow && !$scope.state.communitiesByRank) {\r\n return;\r\n }\r\n\r\n var rebuild = function(forceReload) {\r\n var demographicsIndicatorKey = $scope.state.citywideStats\r\n ? Object.keys($scope.state.citywideStats)[0]\r\n : undefined;\r\n\r\n if (demographicsIndicatorKey) {\r\n if (!$scope.state.communityCharts.all) {\r\n var thisChart = chartDefaults;\r\n thisChart.data.datasets[0].data = [];\r\n\r\n var remainder = 1;\r\n\r\n $scope.state.citywideStats[demographicsIndicatorKey].forEach(\r\n function(demo, ind, arr) {\r\n // data arrives as floating point\r\n thisChart.data.datasets[0].data.push(demo.percent);\r\n $scope.chartLegend[ind].label = demo.name;\r\n remainder = remainder - demo.percent;\r\n },\r\n );\r\n\r\n if (remainder > 0) {\r\n thisChart.data.datasets[0].data.push(remainder);\r\n $scope.chartLegend[$scope.chartLegend.length - 1].label = \"Other\";\r\n $scope.state.citywideStats[demographicsIndicatorKey].push({\r\n name: \"Other\",\r\n percent: remainder,\r\n display: Math.round(remainder * 1000) / 10 + \"%\",\r\n });\r\n }\r\n\r\n $scope.state.communityCharts.all = new Chart(\r\n document.getElementById(\"race-ethno-chart-all\").getContext(\"2d\"),\r\n thisChart,\r\n );\r\n }\r\n else {\r\n }\r\n\r\n $scope.state.chartsToShow.forEach(function(comm, ind, arr) {\r\n var thisChart = chartDefaults;\r\n thisChart.data.datasets[0].data = [];\r\n\r\n if (comm.demographics) {\r\n var remainder = 1;\r\n comm.demographics[demographicsIndicatorKey].forEach(function(\r\n demo,\r\n ind,\r\n arr,\r\n ) {\r\n // data arrives as floating point\r\n thisChart.data.datasets[0].data.push(demo.percent);\r\n $scope.chartLegend[ind].label = demo.name;\r\n remainder = remainder - demo.percent;\r\n });\r\n\r\n if (remainder > Number.EPSILON) {\r\n thisChart.data.datasets[0].data.push(remainder);\r\n $scope.chartLegend[$scope.chartLegend.length - 1].label =\r\n \"Other\";\r\n \r\n if(!comm.demographics[demographicsIndicatorKey].some((demographic) => demographic && demographic.name === \"Other\")) {\r\n // Only add a catch-all \"Other\" demographic if there isn't one with that name yet\r\n comm.demographics[demographicsIndicatorKey].push({\r\n name: \"Other\",\r\n percent: remainder,\r\n display: Math.round(remainder * 1000) / 10 + \"%\",\r\n });\r\n }\r\n }\r\n\r\n if (!$scope.state.communityCharts[comm.id]) {\r\n $scope.state.communityCharts[comm.id] = new Chart(\r\n document\r\n .getElementById(\"race-ethno-chart-\" + ind)\r\n .getContext(\"2d\"),\r\n thisChart,\r\n );\r\n }\r\n\r\n if (forceReload) {\r\n $scope.state.communityCharts[comm.id].update();\r\n }\r\n }\r\n });\r\n }\r\n };\r\n\r\n $timeout(function() {\r\n rebuild(forceReload);\r\n }, 150);\r\n };\r\n\r\n $scope.$watch(\r\n \"state.communitiesByRank\",\r\n function() {\r\n if (!$scope.state.communitiesByRank) return;\r\n\r\n if (!madeChartSelection) {\r\n $scope.state.communityCharts = {};\r\n\r\n if ($location.search()[\"charts\"]) {\r\n madeChartSelection = true;\r\n var commIds = $location\r\n .search()\r\n [\"charts\"].split(\",\")\r\n .map(function(id) {\r\n return +id;\r\n });\r\n $scope.state.selectedChartCommunities = commIds;\r\n $scope.state.chartsToShow = commIds.map(function(id) {\r\n return $scope.state.communitiesById[id];\r\n });\r\n }\r\n else {\r\n $scope.state.chartsToShow = rankingsService\r\n .lowestRanked($scope.state.communitiesByRank)\r\n .concat(\r\n rankingsService.highestRanked($scope.state.communitiesByRank),\r\n );\r\n }\r\n }\r\n },\r\n true,\r\n );\r\n\r\n $scope.$watch(\r\n \"state.chartsToShow\",\r\n function() {\r\n $scope.rebuildCharts(true);\r\n },\r\n true,\r\n );\r\n\r\n $scope.chartLegend = [\r\n {\r\n color: \"#516747\",\r\n },\r\n {\r\n color: \"#648c4e\",\r\n },\r\n {\r\n color: \"#64ab4d\",\r\n },\r\n {\r\n color: \"#b9d5aa\",\r\n },\r\n {\r\n color: \"#ededed\",\r\n },\r\n ];\r\n\r\n var chartDefaults = {\r\n type: \"pie\",\r\n data: {\r\n labels: [\"Red\", \"Blue\", \"Yellow\"],\r\n datasets: [\r\n {\r\n data: [300, 50, 100, 20],\r\n backgroundColor: [\"#516747\", \"#648c4e\", \"#64ab4d\", \"#b9d5aa\"],\r\n },\r\n ],\r\n },\r\n options: {\r\n tooltips: {\r\n enabled: false,\r\n },\r\n legend: {\r\n display: false,\r\n },\r\n responsive: false,\r\n },\r\n };\r\n\r\n // TODO - This is copied from the main Typeahead component\r\n // No time to refactor Typeahead, do that soon.\r\n\r\n $scope.state.toggleChartCommunity = function(id) {\r\n var selectedCharts = $scope.state.selectedChartCommunities;\r\n\r\n if (!madeChartSelection) {\r\n madeChartSelection = true;\r\n selectedCharts = rankingsService\r\n .lowestRanked($scope.state.communitiesByRank)\r\n .concat(rankingsService.highestRanked($scope.state.communitiesByRank))\r\n .map(function(x) {\r\n return x.id;\r\n });\r\n }\r\n\r\n var index = selectedCharts.indexOf(id);\r\n if (index >= 0) {\r\n selectedCharts.splice(index, 1);\r\n $scope.state.communityCharts[id] = undefined;\r\n\r\n // Tracks when a user removes a community\r\n dataLayer.push({\r\n event: \"Community Removed\",\r\n eventCategory: \"Interactive Clicks\",\r\n eventAction:\r\n \"Community Removed|\" + $scope.state.communitiesById[id].name,\r\n eventLabel: window.location.pathname,\r\n });\r\n }\r\n else {\r\n selectedCharts.push(id);\r\n }\r\n\r\n $location.search(\"charts\", selectedCharts.join(\",\"));\r\n $scope.state.selectedChartCommunities = selectedCharts;\r\n $scope.state.chartsToShow = $scope.state.selectedChartCommunities.map(\r\n function(id) {\r\n return $scope.state.communitiesById[id];\r\n },\r\n );\r\n };\r\n\r\n $scope.chartTypeahead = {};\r\n\r\n $scope.chartResetTypeahead = function() {\r\n // Prevents first item from being selected automatically\r\n $scope.chartTypeahead.selectedIndex = -1;\r\n\r\n $scope.chartTypeahead.filteredResults = [];\r\n\r\n // Empty out typeahead input field\r\n $scope.chartQueryString = \"\";\r\n };\r\n\r\n $scope.chartResetTypeahead();\r\n\r\n $scope.chartUpdateTypeahead = function(needle) {\r\n $scope.chartTypeahead.filteredResults = $scope.state.communityData.filter(\r\n function(community) {\r\n return firstLettersFilter(community.name, needle);\r\n },\r\n );\r\n };\r\n\r\n // Typeahead filter\r\n // Requirements: find matches for community names where any word starts with a user-provided\r\n // string. Example: `b` matches `Battery Park` and `Midtown Business District`\r\n // TODO - This should probably be its own filter file\r\n function firstLettersFilter(haystack, needle) {\r\n // Split the community name by any non-word characters\r\n var parsedStr = haystack.toLowerCase().split(/\\W+/);\r\n\r\n // User input and strings to search are converted to lowercase\r\n needle = needle.toLowerCase();\r\n\r\n for (var i = 0; i < parsedStr.length; i++) {\r\n if (parsedStr[i].indexOf(needle) === 0) {\r\n // string match found!\r\n return true;\r\n }\r\n }\r\n\r\n // no string match found\r\n return false;\r\n }\r\n\r\n $scope.chartTypeaheadKeyPressed = function(event, communityId) {\r\n if (event.key === \"ArrowDown\") {\r\n $scope.chartTypeahead.selectedIndex += 1;\r\n }\r\n else if (event.key === \"ArrowUp\") {\r\n $scope.chartTypeahead.selectedIndex =\r\n $scope.chartTypeahead.selectedIndex >= -1\r\n ? $scope.chartTypeahead.selectedIndex - 1\r\n : -1;\r\n }\r\n else if (event.key === \"Enter\") {\r\n var selectedId =\r\n $scope.chartTypeahead.filteredResults[\r\n $scope.chartTypeahead.selectedIndex\r\n ].id;\r\n $scope.chartTypeaheadSelected(selectedId);\r\n }\r\n else {\r\n // If the keypress isn't an arrow, it's probably a letter or number\r\n // Reset the selected index\r\n $scope.chartTypeahead.selectedIndex = -1;\r\n }\r\n };\r\n\r\n $scope.chartTypeaheadSelected = function(id) {\r\n // Tracks when a user searches using \"Add community to compare\" which displays a race/ethnicity pie chart on the \"Risk Ranking\" page\r\n dataLayer.push({\r\n event: \"Compare Community for Race/Ethnicity\",\r\n eventCategory: \"Interactive Clicks\",\r\n eventAction:\r\n \"RE Community Search|\" + $scope.state.communitiesById[id].name,\r\n eventLabel: window.location.pathname,\r\n });\r\n\r\n $scope.state.toggleChartCommunity(id);\r\n $scope.chartResetTypeahead();\r\n };\r\n }\r\n})();\r\n","(function() {\r\n \"use strict\";\r\n\r\n angular.module(\"app\").directive(\"cccRaceEthnoCharts\", cccRaceEthnoCharts);\r\n\r\n function cccRaceEthnoCharts() {\r\n return {\r\n restrict: \"EA\",\r\n scope: false,\r\n controller: \"RaceEthnoChartsController\"\r\n };\r\n }\r\n})();\r\n","!(function(e, t) {\r\n typeof exports == \"object\"\r\n ? (module.exports = t(require(\"angular\")))\r\n : typeof define == \"function\" && define.amd\r\n ? define([\"angular\"], t)\r\n : t(e.angular);\r\n})(window, function(angular) {\r\n /**\r\n * AngularJS Google Maps Ver. 1.17.94\r\n *\r\n * The MIT License (MIT)\r\n *\r\n * Copyright (c) 2014, 2015, 1016 Allen Kim\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\r\n * this software and associated documentation files (the \"Software\"), to deal in\r\n * the Software without restriction, including without limitation the rights to\r\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r\n * the Software, and to permit persons to whom the Software is furnished to do so,\r\n * subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n */\r\n return (\r\n angular.module(\"ngMap\", []),\r\n (function() {\r\n \"use strict\";\r\n var e,\r\n t = function(t, n, o, i, a, r, s) {\r\n e = a;\r\n var p = this;\r\n p.mapOptions,\r\n p.mapEvents,\r\n p.eventListeners,\r\n (p.addObject = function(e, t) {\r\n if (p.map) {\r\n p.map[e] = p.map[e] || {};\r\n var n = Object.keys(p.map[e]).length;\r\n (p.map[e][t.id || n] = t),\r\n p.map instanceof google.maps.Map &&\r\n (e != \"infoWindows\" &&\r\n t.setMap &&\r\n t.setMap &&\r\n t.setMap(p.map),\r\n t.centered && t.position && p.map.setCenter(t.position),\r\n e == \"markers\" && p.objectChanged(\"markers\"),\r\n e == \"customMarkers\" && p.objectChanged(\"customMarkers\"));\r\n }\r\n }),\r\n (p.deleteObject = function(e, t) {\r\n if (t.map) {\r\n var n = t.map[e];\r\n for (var o in n)\r\n n[o] === t &&\r\n (google.maps.event.clearInstanceListeners(t), delete n[o]);\r\n t.map && t.setMap && t.setMap(null),\r\n e == \"markers\" && p.objectChanged(\"markers\"),\r\n e == \"customMarkers\" && p.objectChanged(\"customMarkers\");\r\n }\r\n }),\r\n (p.observeAttrSetObj = function(t, n, o) {\r\n if (n.noWatcher) return !1;\r\n for (var i = e.getAttrsToObserve(t), a = 0; a < i.length; a++) {\r\n var s = i[a];\r\n n.$observe(s, r.observeAndSet(s, o));\r\n }\r\n }),\r\n (p.zoomToIncludeMarkers = function() {\r\n if (\r\n (p.map.markers != null &&\r\n Object.keys(p.map.markers).length > 0) ||\r\n (p.map.customMarkers != null &&\r\n Object.keys(p.map.customMarkers).length > 0)\r\n ) {\r\n var e = new google.maps.LatLngBounds();\r\n for (var t in p.map.markers)\r\n e.extend(p.map.markers[t].getPosition());\r\n for (var n in p.map.customMarkers)\r\n e.extend(p.map.customMarkers[n].getPosition());\r\n p.mapOptions.maximumZoom && (p.enableMaximumZoomCheck = !0),\r\n p.map.fitBounds(e);\r\n }\r\n }),\r\n (p.objectChanged = function(e) {\r\n !p.map ||\r\n (e != \"markers\" && e != \"customMarkers\") ||\r\n p.map.zoomToIncludeMarkers != \"auto\" ||\r\n p.zoomToIncludeMarkers();\r\n }),\r\n (p.initializeMap = function() {\r\n var a = p.mapOptions,\r\n u = p.mapEvents,\r\n l = p.map;\r\n if (((p.map = s.getMapInstance(n[0])), r.setStyle(n[0]), l)) {\r\n var g = e.filter(o),\r\n d = e.getOptions(g),\r\n m = e.getControlOptions(g);\r\n a = angular.extend(d, m);\r\n for (var f in l) {\r\n var v = l[f];\r\n if (typeof v == \"object\")\r\n for (var y in v) p.addObject(f, v[y]);\r\n }\r\n (p.map.showInfoWindow = p.showInfoWindow),\r\n (p.map.hideInfoWindow = p.hideInfoWindow);\r\n }\r\n a.zoom = a.zoom || 15;\r\n var h = a.center;\r\n if (!a.center || (typeof h == \"string\" && h.match(/\\{\\{.*\\}\\}/)))\r\n a.center = new google.maps.LatLng(0, 0);\r\n else if (typeof h == \"string\" && h.match(/[0-9.-]*,[0-9.-]*/))\r\n a.center = new google.maps.LatLng(h);\r\n else if (!(h instanceof google.maps.LatLng)) {\r\n var M = a.center;\r\n delete a.center,\r\n r.getGeoLocation(M, a.geoLocationOptions).then(\r\n function(e) {\r\n p.map.setCenter(e);\r\n var n = a.geoCallback;\r\n n && i(n)(t);\r\n },\r\n function() {\r\n a.geoFallbackCenter &&\r\n p.map.setCenter(a.geoFallbackCenter);\r\n }\r\n );\r\n }\r\n p.map.setOptions(a);\r\n for (var b in u) {\r\n var O = u[b],\r\n w = google.maps.event.addListener(p.map, b, O);\r\n p.eventListeners[b] = w;\r\n }\r\n p.observeAttrSetObj(c, o, p.map),\r\n (p.singleInfoWindow = a.singleInfoWindow),\r\n google.maps.event.trigger(p.map, \"resize\"),\r\n google.maps.event.addListenerOnce(p.map, \"idle\", function() {\r\n r.addMap(p),\r\n a.zoomToIncludeMarkers && p.zoomToIncludeMarkers(),\r\n (t.map = p.map),\r\n t.$emit(\"mapInitialized\", p.map),\r\n o.mapInitialized && i(o.mapInitialized)(t, { map: p.map });\r\n }),\r\n a.zoomToIncludeMarkers &&\r\n a.maximumZoom &&\r\n google.maps.event.addListener(\r\n p.map,\r\n \"zoom_changed\",\r\n function() {\r\n p.enableMaximumZoomCheck == 1 &&\r\n ((p.enableMaximumZoomCheck = !1),\r\n google.maps.event.addListenerOnce(\r\n p.map,\r\n \"bounds_changed\",\r\n function() {\r\n p.map.setZoom(\r\n Math.min(a.maximumZoom, p.map.getZoom())\r\n );\r\n }\r\n ));\r\n }\r\n );\r\n }),\r\n (t.google = google);\r\n var c = e.orgAttributes(n),\r\n u = e.filter(o),\r\n l = e.getOptions(u, { scope: t }),\r\n g = e.getControlOptions(u),\r\n d = angular.extend(l, g),\r\n m = e.getEvents(t, u);\r\n if (\r\n (Object.keys(m).length && void 0,\r\n (p.mapOptions = d),\r\n (p.mapEvents = m),\r\n (p.eventListeners = {}),\r\n l.lazyInit)\r\n ) {\r\n if (\r\n o.id &&\r\n o.id.indexOf(\"{{\", 0) === 0 &&\r\n o.id.indexOf(\"}}\", o.id.length - \"}}\".length) !== -1\r\n )\r\n var f = o.id.slice(2, -2),\r\n v = i(f)(t);\r\n else var v = o.id;\r\n (p.map = { id: v }), r.addMap(p);\r\n }\r\n else p.initializeMap();\r\n l.triggerResize && google.maps.event.trigger(p.map, \"resize\"),\r\n n.bind(\"$destroy\", function() {\r\n s.returnMapInstance(p.map), r.deleteMap(p);\r\n });\r\n };\r\n (t.$inject = [\r\n \"$scope\",\r\n \"$element\",\r\n \"$attrs\",\r\n \"$parse\",\r\n \"Attr2MapOptions\",\r\n \"NgMap\",\r\n \"NgMapPool\"\r\n ]),\r\n angular.module(\"ngMap\").controller(\"__MapController\", t);\r\n })(),\r\n (function() {\r\n \"use strict\";\r\n var e,\r\n t = function(t, o, i, a) {\r\n a = a[0] || a[1];\r\n var r = e.orgAttributes(o),\r\n s = e.filter(i),\r\n p = e.getOptions(s, { scope: t }),\r\n c = e.getEvents(t, s),\r\n u = n(p, c);\r\n a.addObject(\"bicyclingLayers\", u),\r\n a.observeAttrSetObj(r, i, u),\r\n o.bind(\"$destroy\", function() {\r\n a.deleteObject(\"bicyclingLayers\", u);\r\n });\r\n },\r\n n = function(e, t) {\r\n var n = new google.maps.BicyclingLayer(e);\r\n for (var o in t) google.maps.event.addListener(n, o, t[o]);\r\n return n;\r\n },\r\n o = function(n) {\r\n return (\r\n (e = n), { restrict: \"E\", require: [\"?^map\", \"?^ngMap\"], link: t }\r\n );\r\n };\r\n (o.$inject = [\"Attr2MapOptions\"]),\r\n angular.module(\"ngMap\").directive(\"bicyclingLayer\", o);\r\n })(),\r\n (function() {\r\n \"use strict\";\r\n var e,\r\n t,\r\n n,\r\n o = function(n, o, i, a) {\r\n a = a[0] || a[1];\r\n var r = e.filter(i),\r\n s = e.getOptions(r, { scope: n }),\r\n p = e.getEvents(n, r),\r\n c = o[0].parentElement.removeChild(o[0]);\r\n t(c.innerHTML.trim())(n);\r\n for (var u in p) google.maps.event.addDomListener(c, u, p[u]);\r\n a.addObject(\"customControls\", c);\r\n var l = s.position;\r\n a.map.controls[google.maps.ControlPosition[l]].push(c),\r\n o.bind(\"$destroy\", function() {\r\n a.deleteObject(\"customControls\", c);\r\n });\r\n },\r\n i = function(i, a, r) {\r\n return (\r\n (e = i),\r\n (t = a),\r\n (n = r),\r\n { restrict: \"E\", require: [\"?^map\", \"?^ngMap\"], link: o }\r\n );\r\n };\r\n (i.$inject = [\"Attr2MapOptions\", \"$compile\", \"NgMap\"]),\r\n angular.module(\"ngMap\").directive(\"customControl\", i);\r\n })(),\r\n (function() {\r\n \"use strict\";\r\n var e,\r\n t,\r\n n,\r\n o,\r\n i = function(e) {\r\n (e = e || {}),\r\n (this.el = document.createElement(\"div\")),\r\n (this.el.style.display = \"inline-block\"),\r\n (this.el.style.visibility = \"hidden\"),\r\n (this.visible = !0);\r\n for (var t in e) this[t] = e[t];\r\n },\r\n a = function() {\r\n (i.prototype = new google.maps.OverlayView()),\r\n (i.prototype.setContent = function(e, t) {\r\n (this.el.innerHTML = e),\r\n (this.el.style.position = \"absolute\"),\r\n t && n(angular.element(this.el).contents())(t);\r\n }),\r\n (i.prototype.getDraggable = function() {\r\n return this.draggable;\r\n }),\r\n (i.prototype.setDraggable = function(e) {\r\n this.draggable = e;\r\n }),\r\n (i.prototype.getPosition = function() {\r\n return this.position;\r\n }),\r\n (i.prototype.setPosition = function(e) {\r\n e && (this.position = e);\r\n var n = this;\r\n if (\r\n this.getProjection() &&\r\n typeof this.position.lng == \"function\"\r\n ) {\r\n var o = function() {\r\n var e = n.getProjection().fromLatLngToDivPixel(n.position),\r\n t = Math.round(e.x - n.el.offsetWidth / 2),\r\n o = Math.round(e.y - n.el.offsetHeight - 10);\r\n (n.el.style.left = t + \"px\"),\r\n (n.el.style.top = o + \"px\"),\r\n (n.el.style.visibility = \"visible\");\r\n };\r\n n.el.offsetWidth && n.el.offsetHeight ? o() : t(o, 300);\r\n }\r\n }),\r\n (i.prototype.setZIndex = function(e) {\r\n e && (this.zIndex = e), (this.el.style.zIndex = this.zIndex);\r\n }),\r\n (i.prototype.getVisible = function() {\r\n return this.visible;\r\n }),\r\n (i.prototype.setVisible = function(e) {\r\n (this.el.style.display = e ? \"inline-block\" : \"none\"),\r\n (this.visible = e);\r\n }),\r\n (i.prototype.addClass = function(e) {\r\n var t = this.el.className.trim().split(\" \");\r\n t.indexOf(e) == -1 && t.push(e),\r\n (this.el.className = t.join(\" \"));\r\n }),\r\n (i.prototype.removeClass = function(e) {\r\n var t = this.el.className.split(\" \"),\r\n n = t.indexOf(e);\r\n n > -1 && t.splice(n, 1), (this.el.className = t.join(\" \"));\r\n }),\r\n (i.prototype.onAdd = function() {\r\n this.getPanes().overlayMouseTarget.appendChild(this.el);\r\n }),\r\n (i.prototype.draw = function() {\r\n this.setPosition(),\r\n this.setZIndex(this.zIndex),\r\n this.setVisible(this.visible);\r\n }),\r\n (i.prototype.onRemove = function() {\r\n this.el.parentNode.removeChild(this.el);\r\n });\r\n },\r\n r = function(n, a) {\r\n return function(r, s, p, c) {\r\n c = c[0] || c[1];\r\n var u = e.orgAttributes(s),\r\n l = e.filter(p),\r\n g = e.getOptions(l, { scope: r }),\r\n d = e.getEvents(r, l);\r\n s[0].style.display = \"none\";\r\n var m = new i(g);\r\n t(function() {\r\n r.$watch(\r\n \"[\" + a.join(\",\") + \"]\",\r\n function() {\r\n m.setContent(n, r);\r\n },\r\n !0\r\n ),\r\n m.setContent(s[0].innerHTML, r);\r\n var e = s[0].firstElementChild.className;\r\n m.addClass(\"custom-marker\"),\r\n m.addClass(e),\r\n g.position instanceof google.maps.LatLng ||\r\n o.getGeoLocation(g.position).then(function(e) {\r\n m.setPosition(e);\r\n });\r\n });\r\n for (var f in d) google.maps.event.addDomListener(m.el, f, d[f]);\r\n c.addObject(\"customMarkers\", m),\r\n c.observeAttrSetObj(u, p, m),\r\n s.bind(\"$destroy\", function() {\r\n c.deleteObject(\"customMarkers\", m);\r\n });\r\n };\r\n },\r\n s = function(i, s, p, c) {\r\n return (\r\n (e = p),\r\n (t = i),\r\n (n = s),\r\n (o = c),\r\n {\r\n restrict: \"E\",\r\n require: [\"?^map\", \"?^ngMap\"],\r\n compile: function(e) {\r\n a(), (e[0].style.display = \"none\");\r\n var t = e.html(),\r\n n = t.match(/{{([^}]+)}}/g),\r\n o = [];\r\n return (\r\n (n || []).forEach(function(e) {\r\n var t = e.replace(\"{{\", \"\").replace(\"}}\", \"\");\r\n e.indexOf(\"::\") == -1 &&\r\n e.indexOf(\"this.\") == -1 &&\r\n o.indexOf(t) == -1 &&\r\n o.push(e.replace(\"{{\", \"\").replace(\"}}\", \"\"));\r\n }),\r\n r(t, o)\r\n );\r\n }\r\n }\r\n );\r\n };\r\n (s.$inject = [\"$timeout\", \"$compile\", \"Attr2MapOptions\", \"NgMap\"]),\r\n angular.module(\"ngMap\").directive(\"customMarker\", s);\r\n })(),\r\n (function() {\r\n \"use strict\";\r\n var e,\r\n t,\r\n n,\r\n o = function(e, t) {\r\n e.panel &&\r\n (e.panel =\r\n document.getElementById(e.panel) ||\r\n document.querySelector(e.panel));\r\n var n = new google.maps.DirectionsRenderer(e);\r\n for (var o in t) google.maps.event.addListener(n, o, t[o]);\r\n return n;\r\n },\r\n i = function(e, o) {\r\n var i = new google.maps.DirectionsService(),\r\n a = o;\r\n a.travelMode = a.travelMode || \"DRIVING\";\r\n var r = [\r\n \"origin\",\r\n \"destination\",\r\n \"travelMode\",\r\n \"transitOptions\",\r\n \"unitSystem\",\r\n \"durationInTraffic\",\r\n \"waypoints\",\r\n \"optimizeWaypoints\",\r\n \"provideRouteAlternatives\",\r\n \"avoidHighways\",\r\n \"avoidTolls\",\r\n \"region\"\r\n ];\r\n for (var s in a) r.indexOf(s) === -1 && delete a[s];\r\n a.waypoints &&\r\n (a.waypoints == \"[]\" || a.waypoints === \"\") &&\r\n delete a.waypoints;\r\n var p = function(n) {\r\n i.route(n, function(n, o) {\r\n o == google.maps.DirectionsStatus.OK &&\r\n t(function() {\r\n e.setDirections(n);\r\n });\r\n });\r\n };\r\n a.origin &&\r\n a.destination &&\r\n (a.origin == \"current-location\"\r\n ? n.getCurrentPosition().then(function(e) {\r\n (a.origin = new google.maps.LatLng(\r\n e.coords.latitude,\r\n e.coords.longitude\r\n )),\r\n p(a);\r\n })\r\n : a.destination == \"current-location\"\r\n ? n.getCurrentPosition().then(function(e) {\r\n (a.destination = new google.maps.LatLng(\r\n e.coords.latitude,\r\n e.coords.longitude\r\n )),\r\n p(a);\r\n })\r\n : p(a));\r\n },\r\n a = function(a, r, s, p) {\r\n var c = a;\r\n (e = p), (t = r), (n = s);\r\n var u = function(n, a, r, s) {\r\n s = s[0] || s[1];\r\n var p = c.orgAttributes(a),\r\n u = c.filter(r),\r\n l = c.getOptions(u, { scope: n }),\r\n g = c.getEvents(n, u),\r\n d = c.getAttrsToObserve(p),\r\n m = o(l, g);\r\n s.addObject(\"directionsRenderers\", m),\r\n d.forEach(function(e) {\r\n !(function(e) {\r\n r.$observe(e, function(n) {\r\n if (e == \"panel\")\r\n t(function() {\r\n var e =\r\n document.getElementById(n) ||\r\n document.querySelector(n);\r\n e && m.setPanel(e);\r\n });\r\n else if (l[e] !== n) {\r\n var o = c.toOptionValue(n, { key: e });\r\n (l[e] = o), i(m, l);\r\n }\r\n });\r\n })(e);\r\n }),\r\n e.getMap().then(function() {\r\n i(m, l);\r\n }),\r\n a.bind(\"$destroy\", function() {\r\n s.deleteObject(\"directionsRenderers\", m);\r\n });\r\n };\r\n return { restrict: \"E\", require: [\"?^map\", \"?^ngMap\"], link: u };\r\n };\r\n (a.$inject = [\r\n \"Attr2MapOptions\",\r\n \"$timeout\",\r\n \"NavigatorGeolocation\",\r\n \"NgMap\"\r\n ]),\r\n angular.module(\"ngMap\").directive(\"directions\", a);\r\n })(),\r\n (function() {\r\n \"use strict\";\r\n angular.module(\"ngMap\").directive(\"drawingManager\", [\r\n \"Attr2MapOptions\",\r\n function(e) {\r\n var t = e;\r\n return {\r\n restrict: \"E\",\r\n require: [\"?^map\", \"?^ngMap\"],\r\n link: function(e, n, o, i) {\r\n i = i[0] || i[1];\r\n var a = t.filter(o),\r\n r = t.getOptions(a, { scope: e }),\r\n s = t.getControlOptions(a),\r\n p = t.getEvents(e, a),\r\n c = new google.maps.drawing.DrawingManager({\r\n drawingMode: r.drawingmode,\r\n drawingControl: r.drawingcontrol,\r\n drawingControlOptions: s.drawingControlOptions,\r\n circleOptions: r.circleoptions,\r\n markerOptions: r.markeroptions,\r\n polygonOptions: r.polygonoptions,\r\n polylineOptions: r.polylineoptions,\r\n rectangleOptions: r.rectangleoptions\r\n });\r\n o.$observe(\"drawingControlOptions\", function(e) {\r\n (c.drawingControlOptions = t.getControlOptions({\r\n drawingControlOptions: e\r\n }).drawingControlOptions),\r\n c.setDrawingMode(null),\r\n c.setMap(i.map);\r\n });\r\n for (var u in p) google.maps.event.addListener(c, u, p[u]);\r\n i.addObject(\"mapDrawingManager\", c),\r\n n.bind(\"$destroy\", function() {\r\n i.deleteObject(\"mapDrawingManager\", c);\r\n });\r\n }\r\n };\r\n }\r\n ]);\r\n })(),\r\n (function() {\r\n \"use strict\";\r\n angular.module(\"ngMap\").directive(\"dynamicMapsEngineLayer\", [\r\n \"Attr2MapOptions\",\r\n function(e) {\r\n var t = e,\r\n n = function(e, t) {\r\n var n = new google.maps.visualization.DynamicMapsEngineLayer(e);\r\n for (var o in t) google.maps.event.addListener(n, o, t[o]);\r\n return n;\r\n };\r\n return {\r\n restrict: \"E\",\r\n require: [\"?^map\", \"?^ngMap\"],\r\n link: function(e, o, i, a) {\r\n a = a[0] || a[1];\r\n var r = t.filter(i),\r\n s = t.getOptions(r, { scope: e }),\r\n p = t.getEvents(e, r, p),\r\n c = n(s, p);\r\n a.addObject(\"mapsEngineLayers\", c);\r\n }\r\n };\r\n }\r\n ]);\r\n })(),\r\n (function() {\r\n \"use strict\";\r\n angular.module(\"ngMap\").directive(\"fusionTablesLayer\", [\r\n \"Attr2MapOptions\",\r\n function(e) {\r\n var t = e,\r\n n = function(e, t) {\r\n var n = new google.maps.FusionTablesLayer(e);\r\n for (var o in t) google.maps.event.addListener(n, o, t[o]);\r\n return n;\r\n };\r\n return {\r\n restrict: \"E\",\r\n require: [\"?^map\", \"?^ngMap\"],\r\n link: function(e, o, i, a) {\r\n a = a[0] || a[1];\r\n var r = t.filter(i),\r\n s = t.getOptions(r, { scope: e }),\r\n p = t.getEvents(e, r, p),\r\n c = n(s, p);\r\n a.addObject(\"fusionTablesLayers\", c);\r\n }\r\n };\r\n }\r\n ]);\r\n })(),\r\n (function() {\r\n \"use strict\";\r\n angular.module(\"ngMap\").directive(\"heatmapLayer\", [\r\n \"Attr2MapOptions\",\r\n \"$window\",\r\n function(e, t) {\r\n var n = e;\r\n return {\r\n restrict: \"E\",\r\n require: [\"?^map\", \"?^ngMap\"],\r\n link: function(e, o, i, a) {\r\n a = a[0] || a[1];\r\n var r = n.filter(i),\r\n s = n.getOptions(r, { scope: e });\r\n if (\r\n ((s.data = t[i.data] || e[i.data]), !(s.data instanceof Array))\r\n )\r\n throw \"invalid heatmap data\";\r\n s.data = new google.maps.MVCArray(s.data);\r\n {\r\n var p = new google.maps.visualization.HeatmapLayer(s);\r\n n.getEvents(e, r);\r\n }\r\n a.addObject(\"heatmapLayers\", p);\r\n }\r\n };\r\n }\r\n ]);\r\n })(),\r\n (function() {\r\n \"use strict\";\r\n var e = function(e, t, n, o, i, a, r) {\r\n var s = e,\r\n p = function(e, a, r) {\r\n var s;\r\n !e.position ||\r\n e.position instanceof google.maps.LatLng ||\r\n delete e.position,\r\n (s = new google.maps.InfoWindow(e));\r\n for (var p in a) p && google.maps.event.addListener(s, p, a[p]);\r\n var c = n(function(e) {\r\n angular.isString(r)\r\n ? o(r).then(\r\n function(t) {\r\n e(\r\n angular\r\n .element(t)\r\n .wrap(\"
\")\r\n .parent()\r\n );\r\n },\r\n function(e) {\r\n throw \"info-window template request failed: \" + e;\r\n }\r\n )\r\n : e(r);\r\n }).then(function(e) {\r\n var t = e.html().trim();\r\n if (angular.element(t).length != 1)\r\n throw \"info-window working as a template must have a container\";\r\n s.__template = t.replace(/\\s?ng-non-bindable[='\"]+/, \"\");\r\n });\r\n return (\r\n (s.__open = function(e, n, o) {\r\n c.then(function() {\r\n i(function() {\r\n o && (n.anchor = o);\r\n var i = t(s.__template)(n);\r\n s.setContent(i[0]),\r\n n.$apply(),\r\n o && o.getPosition\r\n ? s.open(e, o)\r\n : o && o instanceof google.maps.LatLng\r\n ? (s.open(e), s.setPosition(o))\r\n : s.open(e);\r\n var a = s.content.parentElement.parentElement.parentElement;\r\n a.className = \"ng-map-info-window\";\r\n });\r\n });\r\n }),\r\n s\r\n );\r\n },\r\n c = function(e, t, n, o) {\r\n (o = o[0] || o[1]), t.css(\"display\", \"none\");\r\n var i,\r\n c = s.orgAttributes(t),\r\n u = s.filter(n),\r\n l = s.getOptions(u, { scope: e }),\r\n g = s.getEvents(e, u),\r\n d = p(l, g, l.template || t);\r\n !l.position ||\r\n l.position instanceof google.maps.LatLng ||\r\n (i = l.position),\r\n i &&\r\n r.getGeoLocation(i).then(function(t) {\r\n d.setPosition(t), d.__open(o.map, e, t);\r\n var i = n.geoCallback;\r\n i && a(i)(e);\r\n }),\r\n o.addObject(\"infoWindows\", d),\r\n o.observeAttrSetObj(c, n, d),\r\n (o.showInfoWindow = o.map.showInfoWindow =\r\n o.showInfoWindow ||\r\n function(t, n, i) {\r\n var a = typeof t == \"string\" ? t : n,\r\n r = typeof t == \"string\" ? n : i;\r\n if (typeof r == \"string\")\r\n if (\r\n typeof o.map.markers != \"undefined\" &&\r\n typeof o.map.markers[r] != \"undefined\"\r\n )\r\n r = o.map.markers[r];\r\n else {\r\n if (typeof o.map.customMarkers[r] == \"undefined\")\r\n throw new Error(\r\n \"Cant open info window for id \" +\r\n r +\r\n \". Marker or CustomMarker is not defined\"\r\n );\r\n r = o.map.customMarkers[r];\r\n }\r\n var s = o.map.infoWindows[a],\r\n p = r ? r : this.getPosition ? this : null;\r\n s.__open(o.map, e, p),\r\n o.singleInfoWindow &&\r\n (o.lastInfoWindow && e.hideInfoWindow(o.lastInfoWindow),\r\n (o.lastInfoWindow = a));\r\n }),\r\n (o.hideInfoWindow = o.map.hideInfoWindow =\r\n o.hideInfoWindow ||\r\n function(e, t) {\r\n var n = typeof e == \"string\" ? e : t,\r\n i = o.map.infoWindows[n];\r\n i.close();\r\n }),\r\n (e.showInfoWindow = o.map.showInfoWindow),\r\n (e.hideInfoWindow = o.map.hideInfoWindow);\r\n var m = d.mapId ? { id: d.mapId } : 0;\r\n r.getMap(m).then(function(t) {\r\n if ((d.visible && d.__open(t, e), d.visibleOnMarker)) {\r\n var n = d.visibleOnMarker;\r\n d.__open(t, e, t.markers[n]);\r\n }\r\n });\r\n };\r\n return { restrict: \"E\", require: [\"?^map\", \"?^ngMap\"], link: c };\r\n };\r\n (e.$inject = [\r\n \"Attr2MapOptions\",\r\n \"$compile\",\r\n \"$q\",\r\n \"$templateRequest\",\r\n \"$timeout\",\r\n \"$parse\",\r\n \"NgMap\"\r\n ]),\r\n angular.module(\"ngMap\").directive(\"infoWindow\", e);\r\n })(),\r\n (function() {\r\n \"use strict\";\r\n angular.module(\"ngMap\").directive(\"kmlLayer\", [\r\n \"Attr2MapOptions\",\r\n function(e) {\r\n var t = e,\r\n n = function(e, t) {\r\n var n = new google.maps.KmlLayer(e);\r\n for (var o in t) google.maps.event.addListener(n, o, t[o]);\r\n return n;\r\n };\r\n return {\r\n restrict: \"E\",\r\n require: [\"?^map\", \"?^ngMap\"],\r\n link: function(e, o, i, a) {\r\n a = a[0] || a[1];\r\n var r = t.orgAttributes(o),\r\n s = t.filter(i),\r\n p = t.getOptions(s, { scope: e }),\r\n c = t.getEvents(e, s),\r\n u = n(p, c);\r\n a.addObject(\"kmlLayers\", u),\r\n a.observeAttrSetObj(r, i, u),\r\n o.bind(\"$destroy\", function() {\r\n a.deleteObject(\"kmlLayers\", u);\r\n });\r\n }\r\n };\r\n }\r\n ]);\r\n })(),\r\n (function() {\r\n \"use strict\";\r\n angular.module(\"ngMap\").directive(\"mapData\", [\r\n \"Attr2MapOptions\",\r\n \"NgMap\",\r\n function(e, t) {\r\n var n = e;\r\n return {\r\n restrict: \"E\",\r\n require: [\"?^map\", \"?^ngMap\"],\r\n link: function(e, o, i) {\r\n var a = n.filter(i),\r\n r = n.getOptions(a, { scope: e }),\r\n s = n.getEvents(e, a, s);\r\n t.getMap().then(function(t) {\r\n for (var n in r) {\r\n var o = r[n];\r\n typeof e[o] == \"function\" ? t.data[n](e[o]) : t.data[n](o);\r\n }\r\n for (var i in s) t.data.addListener(i, s[i]);\r\n });\r\n }\r\n };\r\n }\r\n ]);\r\n })(),\r\n (function() {\r\n \"use strict\";\r\n var e,\r\n t,\r\n n,\r\n o = [],\r\n i = [],\r\n a = function(n, a, r) {\r\n var s = r.mapLazyLoadParams || r.mapLazyLoad;\r\n if (void 0 === window.google || void 0 === window.google.maps) {\r\n i.push({ scope: n, element: a, savedHtml: o[i.length] }),\r\n (window.lazyLoadCallback = function() {\r\n e(function() {\r\n i.forEach(function(e) {\r\n e.element.html(e.savedHtml),\r\n t(e.element.contents())(e.scope);\r\n });\r\n }, 100);\r\n });\r\n var p = document.createElement(\"script\");\r\n (p.src =\r\n s +\r\n (s.indexOf(\"?\") > -1 ? \"&\" : \"?\") +\r\n \"callback=lazyLoadCallback\"),\r\n document.querySelector('script[src=\"' + p.src + '\"]') ||\r\n document.body.appendChild(p);\r\n }\r\n else a.html(o), t(a.contents())(n);\r\n },\r\n r = function(e, t) {\r\n return (\r\n !t.mapLazyLoad && void 0,\r\n o.push(e.html()),\r\n (n = t.mapLazyLoad),\r\n void 0 !== window.google && void 0 !== window.google.maps\r\n ? !1\r\n : (e.html(\"\"), { pre: a })\r\n );\r\n },\r\n s = function(n, o) {\r\n return (t = n), (e = o), { compile: r };\r\n };\r\n (s.$inject = [\"$compile\", \"$timeout\"]),\r\n angular.module(\"ngMap\").directive(\"mapLazyLoad\", s);\r\n })(),\r\n (function() {\r\n \"use strict\";\r\n angular.module(\"ngMap\").directive(\"mapType\", [\r\n \"$parse\",\r\n \"NgMap\",\r\n function(e, t) {\r\n return {\r\n restrict: \"E\",\r\n require: [\"?^map\", \"?^ngMap\"],\r\n link: function(n, o, i, a) {\r\n a = a[0] || a[1];\r\n var r,\r\n s = i.name;\r\n if (!s) throw \"invalid map-type name\";\r\n if (((r = e(i.object)(n)), !r)) throw \"invalid map-type object\";\r\n t.getMap().then(function(e) {\r\n e.mapTypes.set(s, r);\r\n }),\r\n a.addObject(\"mapTypes\", r);\r\n }\r\n };\r\n }\r\n ]);\r\n })(),\r\n (function() {\r\n \"use strict\";\r\n var e = function() {\r\n return {\r\n restrict: \"AE\",\r\n controller: \"__MapController\",\r\n controllerAs: \"ngmap\"\r\n };\r\n };\r\n angular.module(\"ngMap\").directive(\"map\", [e]),\r\n angular.module(\"ngMap\").directive(\"ngMap\", [e]);\r\n })(),\r\n (function() {\r\n \"use strict\";\r\n angular.module(\"ngMap\").directive(\"mapsEngineLayer\", [\r\n \"Attr2MapOptions\",\r\n function(e) {\r\n var t = e,\r\n n = function(e, t) {\r\n var n = new google.maps.visualization.MapsEngineLayer(e);\r\n for (var o in t) google.maps.event.addListener(n, o, t[o]);\r\n return n;\r\n };\r\n return {\r\n restrict: \"E\",\r\n require: [\"?^map\", \"?^ngMap\"],\r\n link: function(e, o, i, a) {\r\n a = a[0] || a[1];\r\n var r = t.filter(i),\r\n s = t.getOptions(r, { scope: e }),\r\n p = t.getEvents(e, r, p),\r\n c = n(s, p);\r\n a.addObject(\"mapsEngineLayers\", c);\r\n }\r\n };\r\n }\r\n ]);\r\n })(),\r\n (function() {\r\n \"use strict\";\r\n var e,\r\n t,\r\n n,\r\n o = function(e, t) {\r\n var o;\r\n if (n.defaultOptions.marker)\r\n for (var i in n.defaultOptions.marker)\r\n typeof e[i] == \"undefined\" && (e[i] = n.defaultOptions.marker[i]);\r\n e.position instanceof google.maps.LatLng ||\r\n (e.position = new google.maps.LatLng(0, 0)),\r\n (o = new google.maps.Marker(e)),\r\n Object.keys(t).length > 0;\r\n for (var a in t) a && google.maps.event.addListener(o, a, t[a]);\r\n return o;\r\n },\r\n i = function(i, a, r, s) {\r\n s = s[0] || s[1];\r\n var p,\r\n c = e.orgAttributes(a),\r\n u = e.filter(r),\r\n l = e.getOptions(u, i, { scope: i }),\r\n g = e.getEvents(i, u);\r\n l.position instanceof google.maps.LatLng || (p = l.position);\r\n var d = o(l, g);\r\n s.addObject(\"markers\", d),\r\n p &&\r\n n.getGeoLocation(p).then(function(e) {\r\n d.setPosition(e), l.centered && d.map.setCenter(e);\r\n var n = r.geoCallback;\r\n n && t(n)(i);\r\n }),\r\n s.observeAttrSetObj(c, r, d),\r\n a.bind(\"$destroy\", function() {\r\n s.deleteObject(\"markers\", d);\r\n });\r\n },\r\n a = function(o, a, r) {\r\n return (\r\n (e = o),\r\n (t = a),\r\n (n = r),\r\n { restrict: \"E\", require: [\"^?map\", \"?^ngMap\"], link: i }\r\n );\r\n };\r\n (a.$inject = [\"Attr2MapOptions\", \"$parse\", \"NgMap\"]),\r\n angular.module(\"ngMap\").directive(\"marker\", a);\r\n })(),\r\n (function() {\r\n \"use strict\";\r\n angular.module(\"ngMap\").directive(\"overlayMapType\", [\r\n \"NgMap\",\r\n function(e) {\r\n return {\r\n restrict: \"E\",\r\n require: [\"?^map\", \"?^ngMap\"],\r\n link: function(t, n, o, i) {\r\n i = i[0] || i[1];\r\n var a = o.initMethod || \"insertAt\",\r\n r = t[o.object];\r\n e.getMap().then(function(e) {\r\n if (a == \"insertAt\") {\r\n var t = parseInt(o.index, 10);\r\n e.overlayMapTypes.insertAt(t, r);\r\n }\r\n else a == \"push\" && e.overlayMapTypes.push(r);\r\n }),\r\n i.addObject(\"overlayMapTypes\", r);\r\n }\r\n };\r\n }\r\n ]);\r\n })(),\r\n (function() {\r\n \"use strict\";\r\n var e = function(e, t) {\r\n var n = e,\r\n o = function(e, o, i, a) {\r\n if (i.placesAutoComplete === \"false\") return !1;\r\n var r = n.filter(i),\r\n s = n.getOptions(r, { scope: e }),\r\n p = n.getEvents(e, r),\r\n c = new google.maps.places.Autocomplete(o[0], s);\r\n for (var u in p) google.maps.event.addListener(c, u, p[u]);\r\n var l = function() {\r\n t(function() {\r\n a && a.$setViewValue(o.val());\r\n }, 100);\r\n };\r\n google.maps.event.addListener(c, \"place_changed\", l),\r\n o[0].addEventListener(\"change\", l),\r\n i.$observe(\"types\", function(e) {\r\n if (e) {\r\n var t = n.toOptionValue(e, { key: \"types\" });\r\n c.setTypes(t);\r\n }\r\n }),\r\n i.$observe(\"componentRestrictions\", function(t) {\r\n t && c.setComponentRestrictions(e.$eval(t));\r\n });\r\n };\r\n return { restrict: \"A\", require: \"?ngModel\", link: o };\r\n };\r\n (e.$inject = [\"Attr2MapOptions\", \"$timeout\"]),\r\n angular.module(\"ngMap\").directive(\"placesAutoComplete\", e);\r\n })(),\r\n (function() {\r\n \"use strict\";\r\n var e = function(e, t) {\r\n var n,\r\n o = e.name;\r\n switch ((delete e.name, o)) {\r\n case \"circle\":\r\n e.center instanceof google.maps.LatLng ||\r\n (e.center = new google.maps.LatLng(0, 0)),\r\n (n = new google.maps.Circle(e));\r\n break;\r\n case \"polygon\":\r\n n = new google.maps.Polygon(e);\r\n break;\r\n case \"polyline\":\r\n n = new google.maps.Polyline(e);\r\n break;\r\n case \"rectangle\":\r\n n = new google.maps.Rectangle(e);\r\n break;\r\n case \"groundOverlay\":\r\n case \"image\":\r\n var i = e.url,\r\n a = { opacity: e.opacity, clickable: e.clickable, id: e.id };\r\n n = new google.maps.GroundOverlay(i, e.bounds, a);\r\n }\r\n for (var r in t) t[r] && google.maps.event.addListener(n, r, t[r]);\r\n return n;\r\n },\r\n t = function(t, n, o) {\r\n var i = t,\r\n a = function(t, a, r, s) {\r\n s = s[0] || s[1];\r\n var p,\r\n c,\r\n u = i.orgAttributes(a),\r\n l = i.filter(r),\r\n g = i.getOptions(l, { scope: t }),\r\n d = i.getEvents(t, l);\r\n (c = g.name),\r\n g.center instanceof google.maps.LatLng || (p = g.center);\r\n var m = e(g, d);\r\n s.addObject(\"shapes\", m),\r\n p &&\r\n c == \"circle\" &&\r\n o.getGeoLocation(p).then(function(e) {\r\n m.setCenter(e), m.centered && m.map.setCenter(e);\r\n var o = r.geoCallback;\r\n o && n(o)(t);\r\n }),\r\n s.observeAttrSetObj(u, r, m),\r\n a.bind(\"$destroy\", function() {\r\n s.deleteObject(\"shapes\", m);\r\n });\r\n };\r\n return { restrict: \"E\", require: [\"?^map\", \"?^ngMap\"], link: a };\r\n };\r\n (t.$inject = [\"Attr2MapOptions\", \"$parse\", \"NgMap\"]),\r\n angular.module(\"ngMap\").directive(\"shape\", t);\r\n })(),\r\n (function() {\r\n \"use strict\";\r\n var e = function(e, t) {\r\n var n = e,\r\n o = function(e, t, n) {\r\n var o, i;\r\n t.container &&\r\n ((i = document.getElementById(t.container)),\r\n (i = i || document.querySelector(t.container))),\r\n i\r\n ? (o = new google.maps.StreetViewPanorama(i, t))\r\n : ((o = e.getStreetView()), o.setOptions(t));\r\n for (var a in n) a && google.maps.event.addListener(o, a, n[a]);\r\n return o;\r\n },\r\n i = function(e, i, a) {\r\n var r = n.filter(a),\r\n s = n.getOptions(r, { scope: e }),\r\n p = n.getControlOptions(r),\r\n c = angular.extend(s, p),\r\n u = n.getEvents(e, r);\r\n t.getMap().then(function(e) {\r\n var t = o(e, c, u);\r\n e.setStreetView(t),\r\n !t.getPosition() && t.setPosition(e.getCenter()),\r\n google.maps.event.addListener(\r\n t,\r\n \"position_changed\",\r\n function() {\r\n t.getPosition() !== e.getCenter() &&\r\n e.setCenter(t.getPosition());\r\n }\r\n );\r\n var n = google.maps.event.addListener(\r\n e,\r\n \"center_changed\",\r\n function() {\r\n t.setPosition(e.getCenter()),\r\n google.maps.event.removeListener(n);\r\n }\r\n );\r\n });\r\n };\r\n return { restrict: \"E\", require: [\"?^map\", \"?^ngMap\"], link: i };\r\n };\r\n (e.$inject = [\"Attr2MapOptions\", \"NgMap\"]),\r\n angular.module(\"ngMap\").directive(\"streetViewPanorama\", e);\r\n })(),\r\n (function() {\r\n \"use strict\";\r\n angular.module(\"ngMap\").directive(\"trafficLayer\", [\r\n \"Attr2MapOptions\",\r\n function(e) {\r\n var t = e,\r\n n = function(e, t) {\r\n var n = new google.maps.TrafficLayer(e);\r\n for (var o in t) google.maps.event.addListener(n, o, t[o]);\r\n return n;\r\n };\r\n return {\r\n restrict: \"E\",\r\n require: [\"?^map\", \"?^ngMap\"],\r\n link: function(e, o, i, a) {\r\n a = a[0] || a[1];\r\n var r = t.orgAttributes(o),\r\n s = t.filter(i),\r\n p = t.getOptions(s, { scope: e }),\r\n c = t.getEvents(e, s),\r\n u = n(p, c);\r\n a.addObject(\"trafficLayers\", u),\r\n a.observeAttrSetObj(r, i, u),\r\n o.bind(\"$destroy\", function() {\r\n a.deleteObject(\"trafficLayers\", u);\r\n });\r\n }\r\n };\r\n }\r\n ]);\r\n })(),\r\n (function() {\r\n \"use strict\";\r\n angular.module(\"ngMap\").directive(\"transitLayer\", [\r\n \"Attr2MapOptions\",\r\n function(e) {\r\n var t = e,\r\n n = function(e, t) {\r\n var n = new google.maps.TransitLayer(e);\r\n for (var o in t) google.maps.event.addListener(n, o, t[o]);\r\n return n;\r\n };\r\n return {\r\n restrict: \"E\",\r\n require: [\"?^map\", \"?^ngMap\"],\r\n link: function(e, o, i, a) {\r\n a = a[0] || a[1];\r\n var r = t.orgAttributes(o),\r\n s = t.filter(i),\r\n p = t.getOptions(s, { scope: e }),\r\n c = t.getEvents(e, s),\r\n u = n(p, c);\r\n a.addObject(\"transitLayers\", u),\r\n a.observeAttrSetObj(r, i, u),\r\n o.bind(\"$destroy\", function() {\r\n a.deleteObject(\"transitLayers\", u);\r\n });\r\n }\r\n };\r\n }\r\n ]);\r\n })(),\r\n (function() {\r\n \"use strict\";\r\n var e = /([\\:\\-\\_]+(.))/g,\r\n t = /^moz([A-Z])/,\r\n n = function() {\r\n return function(n) {\r\n return n\r\n .replace(e, function(e, t, n, o) {\r\n return o ? n.toUpperCase() : n;\r\n })\r\n .replace(t, \"Moz$1\");\r\n };\r\n };\r\n angular.module(\"ngMap\").filter(\"camelCase\", n);\r\n })(),\r\n (function() {\r\n \"use strict\";\r\n var e = function() {\r\n return function(e) {\r\n try {\r\n return JSON.parse(e), e;\r\n }\r\n catch (t) {\r\n return e\r\n .replace(/([\\$\\w]+)\\s*:/g, function(e, t) {\r\n return '\"' + t + '\":';\r\n })\r\n .replace(/'([^']+)'/g, function(e, t) {\r\n return '\"' + t + '\"';\r\n });\r\n }\r\n };\r\n };\r\n angular.module(\"ngMap\").filter(\"jsonize\", e);\r\n })(),\r\n (function() {\r\n \"use strict\";\r\n var isoDateRE = /^(\\d{4}\\-\\d\\d\\-\\d\\d([tT][\\d:\\.]*)?)([zZ]|([+\\-])(\\d\\d):?(\\d\\d))?$/,\r\n Attr2MapOptions = function(\r\n $parse,\r\n $timeout,\r\n $log,\r\n NavigatorGeolocation,\r\n GeoCoder,\r\n camelCaseFilter,\r\n jsonizeFilter\r\n ) {\r\n var orgAttributes = function(e) {\r\n e.length > 0 && (e = e[0]);\r\n for (var t = {}, n = 0; n < e.attributes.length; n++) {\r\n var o = e.attributes[n];\r\n t[o.name] = o.value;\r\n }\r\n return t;\r\n },\r\n getJSON = function(e) {\r\n var t = /^[\\+\\-]?[0-9\\.]+,[ ]*\\ ?[\\+\\-]?[0-9\\.]+$/;\r\n return (\r\n e.match(t) && (e = \"[\" + e + \"]\"), JSON.parse(jsonizeFilter(e))\r\n );\r\n },\r\n getLatLng = function(e) {\r\n var t = e;\r\n return (\r\n e[0].constructor == Array\r\n ? (t = e.map(function(e) {\r\n return new google.maps.LatLng(e[0], e[1]);\r\n }))\r\n : !isNaN(parseFloat(e[0])) &&\r\n isFinite(e[0]) &&\r\n (t = new google.maps.LatLng(t[0], t[1])),\r\n t\r\n );\r\n },\r\n toOptionValue = function(input, options) {\r\n var output;\r\n try {\r\n output = getNumber(input);\r\n }\r\n catch (err) {\r\n try {\r\n var output = getJSON(input);\r\n if (output instanceof Array)\r\n output =\r\n output[0].constructor == Object\r\n ? output\r\n : getLatLng(output);\r\n else if (output === Object(output)) {\r\n var newOptions = options;\r\n (newOptions.doNotConverStringToNumber = !0),\r\n (output = getOptions(output, newOptions));\r\n }\r\n }\r\n catch (err2) {\r\n if (input.match(/^[A-Z][a-zA-Z0-9]+\\(.*\\)$/))\r\n try {\r\n var exp = \"new google.maps.\" + input;\r\n output = eval(exp);\r\n }\r\n catch (e) {\r\n output = input;\r\n }\r\n else if (input.match(/^([A-Z][a-zA-Z0-9]+)\\.([A-Z]+)$/))\r\n try {\r\n var matches = input.match(\r\n /^([A-Z][a-zA-Z0-9]+)\\.([A-Z]+)$/\r\n );\r\n output = google.maps[matches[1]][matches[2]];\r\n }\r\n catch (e) {\r\n output = input;\r\n }\r\n else if (input.match(/^[A-Z]+$/))\r\n try {\r\n var capitalizedKey =\r\n options.key.charAt(0).toUpperCase() +\r\n options.key.slice(1);\r\n options.key.match(\r\n /temperatureUnit|windSpeedUnit|labelColor/\r\n )\r\n ? ((capitalizedKey = capitalizedKey.replace(/s$/, \"\")),\r\n (output = google.maps.weather[capitalizedKey][input]))\r\n : (output = google.maps[capitalizedKey][input]);\r\n }\r\n catch (e) {\r\n output = input;\r\n }\r\n else if (input.match(isoDateRE))\r\n try {\r\n output = new Date(input);\r\n }\r\n catch (e) {\r\n output = input;\r\n }\r\n else if (input.match(/^{/) && options.scope)\r\n try {\r\n var expr = input.replace(/{{/, \"\").replace(/}}/g, \"\");\r\n output = options.scope.$eval(expr);\r\n }\r\n catch (err) {\r\n output = input;\r\n }\r\n else output = input;\r\n }\r\n }\r\n if (\r\n ((options.key == \"center\" || options.key == \"position\") &&\r\n output instanceof Array &&\r\n (output = new google.maps.LatLng(output[0], output[1])),\r\n options.key == \"bounds\" &&\r\n output instanceof Array &&\r\n (output = new google.maps.LatLngBounds(output[0], output[1])),\r\n options.key == \"icons\" && output instanceof Array)\r\n )\r\n for (var i = 0; i < output.length; i++) {\r\n var el = output[i];\r\n el.icon.path.match(/^[A-Z_]+$/) &&\r\n (el.icon.path = google.maps.SymbolPath[el.icon.path]);\r\n }\r\n if (options.key == \"icon\" && output instanceof Object) {\r\n (\"\" + output.path).match(/^[A-Z_]+$/) &&\r\n (output.path = google.maps.SymbolPath[output.path]);\r\n for (var key in output) {\r\n var arr = output[key];\r\n key == \"anchor\" || key == \"origin\" || key == \"labelOrigin\"\r\n ? (output[key] = new google.maps.Point(arr[0], arr[1]))\r\n : (key == \"size\" || key == \"scaledSize\") &&\r\n (output[key] = new google.maps.Size(arr[0], arr[1]));\r\n }\r\n }\r\n return output;\r\n },\r\n getAttrsToObserve = function(e) {\r\n var t = [];\r\n if (!e.noWatcher)\r\n for (var n in e) {\r\n var o = e[n];\r\n o && o.match(/\\{\\{.*\\}\\}/) && t.push(camelCaseFilter(n));\r\n }\r\n return t;\r\n },\r\n filter = function(e) {\r\n var t = {};\r\n for (var n in e)\r\n n.match(/^\\$/) || n.match(/^ng[A-Z]/) || (t[n] = e[n]);\r\n return t;\r\n },\r\n getOptions = function(e, t) {\r\n t = t || {};\r\n var n = {};\r\n for (var o in e)\r\n if (e[o] || e[o] === 0) {\r\n if (o.match(/^on[A-Z]/)) continue;\r\n if (o.match(/ControlOptions$/)) continue;\r\n n[o] =\r\n typeof e[o] != \"string\"\r\n ? e[o]\r\n : t.doNotConverStringToNumber && e[o].match(/^[0-9]+$/)\r\n ? e[o]\r\n : toOptionValue(e[o], { key: o, scope: t.scope });\r\n }\r\n return n;\r\n },\r\n getEvents = function(e, t) {\r\n var n = {},\r\n o = function(e) {\r\n return \"_\" + e.toLowerCase();\r\n },\r\n i = function(t) {\r\n var n = t.match(/([^\\(]+)\\(([^\\)]*)\\)/),\r\n o = n[1],\r\n i = n[2].replace(/event[ ,]*/, \"\"),\r\n a = $parse(\"[\" + i + \"]\");\r\n return function(t) {\r\n function n(e, t) {\r\n return e[t];\r\n }\r\n var i = a(e),\r\n r = o.split(\".\").reduce(n, e);\r\n r && r.apply(this, [t].concat(i)),\r\n $timeout(function() {\r\n e.$apply();\r\n });\r\n };\r\n };\r\n for (var a in t)\r\n if (t[a]) {\r\n if (!a.match(/^on[A-Z]/)) continue;\r\n var r = a.replace(/^on/, \"\");\r\n (r = r.charAt(0).toLowerCase() + r.slice(1)),\r\n (r = r.replace(/([A-Z])/g, o));\r\n var s = t[a];\r\n n[r] = new i(s);\r\n }\r\n return n;\r\n },\r\n getControlOptions = function(e) {\r\n var t = {};\r\n if (typeof e != \"object\") return !1;\r\n for (var n in e)\r\n if (e[n]) {\r\n if (!n.match(/(.*)ControlOptions$/)) continue;\r\n var o = e[n],\r\n i = o.replace(/'/g, '\"');\r\n i = i.replace(/([^\"]+)|(\"[^\"]+\")/g, function(e, t, n) {\r\n return t ? t.replace(/([a-zA-Z0-9]+?):/g, '\"$1\":') : n;\r\n });\r\n try {\r\n var a = JSON.parse(i);\r\n for (var r in a)\r\n if (a[r]) {\r\n var s = a[r];\r\n if (\r\n (typeof s == \"string\"\r\n ? (s = s.toUpperCase())\r\n : r === \"mapTypeIds\" &&\r\n (s = s.map(function(e) {\r\n return e.match(/^[A-Z]+$/)\r\n ? google.maps.MapTypeId[e.toUpperCase()]\r\n : e;\r\n })),\r\n r === \"style\")\r\n ) {\r\n var p = n.charAt(0).toUpperCase() + n.slice(1),\r\n c = p.replace(/Options$/, \"\") + \"Style\";\r\n a[r] = google.maps[c][s];\r\n }\r\n else\r\n a[r] =\r\n r === \"position\"\r\n ? google.maps.ControlPosition[s]\r\n : s;\r\n }\r\n t[n] = a;\r\n }\r\n catch (u) {}\r\n }\r\n return t;\r\n };\r\n return {\r\n filter: filter,\r\n getOptions: getOptions,\r\n getEvents: getEvents,\r\n getControlOptions: getControlOptions,\r\n toOptionValue: toOptionValue,\r\n getAttrsToObserve: getAttrsToObserve,\r\n orgAttributes: orgAttributes\r\n };\r\n };\r\n (Attr2MapOptions.$inject = [\r\n \"$parse\",\r\n \"$timeout\",\r\n \"$log\",\r\n \"NavigatorGeolocation\",\r\n \"GeoCoder\",\r\n \"camelCaseFilter\",\r\n \"jsonizeFilter\"\r\n ]),\r\n angular.module(\"ngMap\").service(\"Attr2MapOptions\", Attr2MapOptions);\r\n })(),\r\n (function() {\r\n \"use strict\";\r\n var e,\r\n t = function(t) {\r\n var n = e.defer(),\r\n o = new google.maps.Geocoder();\r\n return (\r\n o.geocode(t, function(e, t) {\r\n t == google.maps.GeocoderStatus.OK ? n.resolve(e) : n.reject(t);\r\n }),\r\n n.promise\r\n );\r\n },\r\n n = function(n) {\r\n return (e = n), { geocode: t };\r\n };\r\n (n.$inject = [\"$q\"]), angular.module(\"ngMap\").service(\"GeoCoder\", n);\r\n })(),\r\n (function() {\r\n \"use strict\";\r\n var e,\r\n t = function(t) {\r\n var n = e.defer();\r\n return (\r\n navigator.geolocation\r\n ? (void 0 === t\r\n ? (t = { timeout: 5e3 })\r\n : void 0 === t.timeout && (t.timeout = 5e3),\r\n navigator.geolocation.getCurrentPosition(\r\n function(e) {\r\n n.resolve(e);\r\n },\r\n function(e) {\r\n n.reject(e);\r\n },\r\n t\r\n ))\r\n : n.reject(\"Browser Geolocation service failed.\"),\r\n n.promise\r\n );\r\n },\r\n n = function(n) {\r\n return (e = n), { getCurrentPosition: t };\r\n };\r\n (n.$inject = [\"$q\"]),\r\n angular.module(\"ngMap\").service(\"NavigatorGeolocation\", n);\r\n })(),\r\n (function() {\r\n \"use strict\";\r\n var e,\r\n t,\r\n n,\r\n o = [],\r\n i = function(n) {\r\n var i = t.createElement(\"div\");\r\n (i.style.width = \"100%\"), (i.style.height = \"100%\"), n.appendChild(i);\r\n var a = new e.google.maps.Map(i, {});\r\n return o.push(a), a;\r\n },\r\n a = function(e, t) {\r\n for (var n, i = 0; i < o.length; i++) {\r\n var a = o[i];\r\n if (a.id == t && !a.inUse) {\r\n var r = a.getDiv();\r\n e.appendChild(r), (n = a);\r\n break;\r\n }\r\n }\r\n return n;\r\n },\r\n r = function(e) {\r\n for (var t, n = 0; n < o.length; n++) {\r\n var i = o[n];\r\n if (!i.id && !i.inUse) {\r\n var a = i.getDiv();\r\n e.appendChild(a), (t = i);\r\n break;\r\n }\r\n }\r\n return t;\r\n },\r\n s = function(e) {\r\n var t = a(e, e.id) || r(e);\r\n return (\r\n t\r\n ? n(function() {\r\n google.maps.event.trigger(t, \"idle\");\r\n }, 100)\r\n : (t = i(e)),\r\n (t.inUse = !0),\r\n t\r\n );\r\n },\r\n p = function(e) {\r\n e.inUse = !1;\r\n },\r\n c = function() {\r\n for (var e = 0; e < o.length; e++) o[e] = null;\r\n o = [];\r\n },\r\n u = function(i, a, r) {\r\n return (\r\n (t = i[0]),\r\n (e = a),\r\n (n = r),\r\n {\r\n mapInstances: o,\r\n resetMapInstances: c,\r\n getMapInstance: s,\r\n returnMapInstance: p\r\n }\r\n );\r\n };\r\n (u.$inject = [\"$document\", \"$window\", \"$timeout\"]),\r\n angular.module(\"ngMap\").factory(\"NgMapPool\", u);\r\n })(),\r\n (function() {\r\n \"use strict\";\r\n var e,\r\n t,\r\n n,\r\n o,\r\n i,\r\n a,\r\n r,\r\n s = {},\r\n p = function(n, o) {\r\n var i;\r\n return (\r\n n.currentStyle\r\n ? (i = n.currentStyle[o])\r\n : e.getComputedStyle &&\r\n (i = t.defaultView\r\n .getComputedStyle(n, null)\r\n .getPropertyValue(o)),\r\n i\r\n );\r\n },\r\n c = function(e) {\r\n var t = s[e || 0];\r\n return t.map instanceof google.maps.Map\r\n ? void 0\r\n : (t.initializeMap(), t.map);\r\n },\r\n u = function(t) {\r\n function o(n) {\r\n s[t]\r\n ? i.resolve(s[t].map)\r\n : n > a\r\n ? i.reject(\"could not find map\")\r\n : e.setTimeout(function() {\r\n o(n + 100);\r\n }, 100);\r\n }\r\n (t = typeof t == \"object\" ? t.id : t), (t = t || 0);\r\n var i = n.defer(),\r\n a = 2e3;\r\n return o(0), i.promise;\r\n },\r\n l = function(e) {\r\n if (e.map) {\r\n var t = Object.keys(s).length;\r\n s[e.map.id || t] = e;\r\n }\r\n },\r\n g = function(e) {\r\n var t = Object.keys(s).length - 1,\r\n n = e.map.id || t;\r\n if (e.map) {\r\n for (var o in e.eventListeners) {\r\n var i = e.eventListeners[o];\r\n google.maps.event.removeListener(i);\r\n }\r\n e.map.controls &&\r\n e.map.controls.forEach(function(e) {\r\n e.clear();\r\n });\r\n }\r\n e.map.heatmapLayers &&\r\n Object.keys(e.map.heatmapLayers).forEach(function(t) {\r\n e.deleteObject(\"heatmapLayers\", e.map.heatmapLayers[t]);\r\n }),\r\n delete s[n];\r\n },\r\n d = function(e, t) {\r\n var i = n.defer();\r\n return (\r\n !e || e.match(/^current/i)\r\n ? o.getCurrentPosition(t).then(\r\n function(e) {\r\n var t = e.coords.latitude,\r\n n = e.coords.longitude,\r\n o = new google.maps.LatLng(t, n);\r\n i.resolve(o);\r\n },\r\n function(e) {\r\n i.reject(e);\r\n }\r\n )\r\n : a.geocode({ address: e }).then(\r\n function(e) {\r\n i.resolve(e[0].geometry.location);\r\n },\r\n function(e) {\r\n i.reject(e);\r\n }\r\n ),\r\n i.promise\r\n );\r\n },\r\n m = function(e, t) {\r\n return function(n) {\r\n if (n) {\r\n var o = r(\"set-\" + e),\r\n a = i.toOptionValue(n, { key: e });\r\n t[o] &&\r\n (e.match(/center|position/) && typeof a == \"string\"\r\n ? d(a).then(function(e) {\r\n t[o](e);\r\n })\r\n : t[o](a));\r\n }\r\n };\r\n },\r\n f = function(e) {\r\n var t = e.getAttribute(\"default-style\");\r\n t == \"true\"\r\n ? ((e.style.display = \"block\"), (e.style.height = \"300px\"))\r\n : (p(e, \"display\") != \"block\" && (e.style.display = \"block\"),\r\n p(e, \"height\").match(/^(0|auto)/) && (e.style.height = \"300px\"));\r\n };\r\n angular.module(\"ngMap\").provider(\"NgMap\", function() {\r\n var s = {};\r\n this.setDefaultOptions = function(e) {\r\n s = e;\r\n };\r\n var p = function(p, v, y, h, M, b, O) {\r\n return (\r\n (e = p),\r\n (t = v[0]),\r\n (n = y),\r\n (o = h),\r\n (i = M),\r\n (a = b),\r\n (r = O),\r\n {\r\n defaultOptions: s,\r\n addMap: l,\r\n deleteMap: g,\r\n getMap: u,\r\n initMap: c,\r\n setStyle: f,\r\n getGeoLocation: d,\r\n observeAndSet: m\r\n }\r\n );\r\n };\r\n (p.$inject = [\r\n \"$window\",\r\n \"$document\",\r\n \"$q\",\r\n \"NavigatorGeolocation\",\r\n \"Attr2MapOptions\",\r\n \"GeoCoder\",\r\n \"camelCaseFilter\"\r\n ]),\r\n (this.$get = p);\r\n });\r\n })(),\r\n (function() {\r\n \"use strict\";\r\n var e,\r\n t = function(t, n) {\r\n n = n || t.getCenter();\r\n var o = e.defer(),\r\n i = new google.maps.StreetViewService();\r\n return (\r\n i.getPanoramaByLocation(n || t.getCenter, 100, function(e, t) {\r\n t === google.maps.StreetViewStatus.OK\r\n ? o.resolve(e.location.pano)\r\n : o.resolve(!1);\r\n }),\r\n o.promise\r\n );\r\n },\r\n n = function(e, t) {\r\n var n = new google.maps.StreetViewPanorama(e.getDiv(), {\r\n enableCloseButton: !0\r\n });\r\n n.setPano(t);\r\n },\r\n o = function(o) {\r\n return (e = o), { getPanorama: t, setPanorama: n };\r\n };\r\n (o.$inject = [\"$q\"]), angular.module(\"ngMap\").service(\"StreetView\", o);\r\n })(),\r\n \"ngMap\"\r\n );\r\n});\r\n","/* global google */\r\n\r\n(function() {\r\n \"use strict\";\r\n\r\n angular\r\n .module(\"app\")\r\n .controller(\"RiskRankingMapController\", [\r\n \"$scope\",\r\n \"$http\",\r\n \"$timeout\",\r\n \"$location\",\r\n \"$attrs\",\r\n \"NgMap\",\r\n \"LoadingService\",\r\n RiskRankingMapController,\r\n ]);\r\n\r\n function RiskRankingMapController(\r\n $scope,\r\n $http,\r\n $timeout,\r\n $location,\r\n $attrs,\r\n NgMap,\r\n LoadingService,\r\n ) {\r\n /*\r\n Helper functions from the old site for making shape data into a format Google Maps likes.\r\n Haven't touched these, just ported from the original code.\r\n */\r\n\r\n var regExes = {\r\n typeStr: /^\\s*(\\w+)\\s*\\(\\s*(.*)\\s*\\)\\s*$/,\r\n parenComma: /\\)\\s*,\\s*\\(/,\r\n doubleParenComma: /\\)\\s*\\)\\s*,\\s*\\(\\s*\\(/,\r\n trimParens: /^\\s*\\(?(.*?)\\)?\\s*$/,\r\n };\r\n\r\n // Helper function to determine the pixel location of a map lat/long\r\n // Used for Google Maps events that don't pass the browser mouse event data (x/y coords)\r\n $scope.latLng2Point = function(latLng, map) {\r\n var topRight = map\r\n .getProjection()\r\n .fromLatLngToPoint(map.getBounds().getNorthEast());\r\n var bottomLeft = map\r\n .getProjection()\r\n .fromLatLngToPoint(map.getBounds().getSouthWest());\r\n var scale = Math.pow(2, map.getZoom());\r\n var worldPoint = map.getProjection().fromLatLngToPoint(latLng);\r\n return new google.maps.Point(\r\n (worldPoint.x - bottomLeft.x) * scale,\r\n (worldPoint.y - topRight.y) * scale,\r\n );\r\n };\r\n\t\t\r\n if (!google.maps.Polygon.prototype.getBounds) {\r\n google.maps.Polygon.prototype.getBounds = function () {\r\n var bounds = new google.maps.LatLngBounds();\r\n this.getPaths().forEach(function (element, index) {\r\n bounds.extend(element);\r\n });\r\n return bounds;\r\n };\r\n }\r\n\r\n // Per spec, legend colors are hard-coded, not provided by Datacenter\r\n $scope.legend = {\r\n colors: [\"#0b7ace\", \"#3895cb\", \"#6fb6cc\", \"#97cdd0\", \"#c4e4df\"],\r\n };\r\n\r\n $scope.mapHoverBox = {\r\n posLeft: 0,\r\n posTop: 0,\r\n hoveredCommunity: {},\r\n };\r\n\r\n $scope.doCommunityGroupToggle = function(groupName) {\r\n $scope.state.selectedCommunities.toggleCommunitiesByGroup(groupName);\r\n\r\n // Tracks when a user clicks on a community group checkbox button on the \"Risk Ranking\" page\r\n dataLayer.push({\r\n event: \"Community Clicks\",\r\n eventCategory: \"Interactive Clicks\",\r\n eventAction: \"Community Click|\" + groupName,\r\n eventLabel: window.location.pathname,\r\n });\r\n };\r\n\r\n $scope.doCommunityToggle = function(communityId) {\r\n $scope.state.selectedCommunities.toggleCommunity(communityId);\r\n\r\n // Tracks when a user clicks on a community checkbox button on the \"Risk Ranking\" page\r\n var communityName = $scope.state.communitiesById[communityId].name;\r\n dataLayer.push({\r\n event: \"Community Clicks\",\r\n eventCategory: \"Interactive Clicks\",\r\n eventAction: \"Community Click|\" + communityName,\r\n eventLabel: window.location.pathname,\r\n });\r\n };\r\n\r\n // Boundary overlay radios\r\n var overlaysString = $location.search().overlays;\r\n if (overlaysString) {\r\n // Select overlays based on url param\r\n $scope.overlayIds = overlaysString;\r\n var buttonValue = (overlaysString instanceof Array && overlaysString.length > 0)\r\n ? overlaysString[0]\r\n : overlaysString;\r\n $('.boundary-radio-hidden[value=\"' + buttonValue + '\"]')\r\n .prop(\"checked\", true);\r\n }\r\n\r\n $(\".boundary-radio-hidden, .boundary-radio-hidden::before, .boundary-overlay-list label\").click(function (e) {\r\n $(\".boundary-radio-hidden\").each(function (_index, radio) {\r\n $(radio).prop(\"checked\", null);\r\n });\r\n\r\n var $hiddenRadio = $(\".boundary-radio-hidden\", $(e.target).parents(\"li\"));\r\n $hiddenRadio.prop(\"checked\", true);\r\n\r\n var radioVal = $hiddenRadio.val();\r\n var overlayVals = radioVal ? [radioVal, radioVal + \"_label\"] : null;\r\n $scope.overlayIds = overlayVals;\r\n\r\n // Update url param with user's selected overlay\r\n $location.search(\"overlays\", overlayVals);\r\n\r\n $scope.rrMap.renderOverlays();\r\n\r\n e.preventDefault();\r\n e.stopPropagation();\r\n });\r\n\r\n // Show/hide the legend when the \"+/-\" button is clicked\r\n $(\".icon-map-overlay-control\").on(\"click\", function (e) {\r\n e.preventDefault();\r\n\r\n var $content = $(\".map-overlay-content\", $(e.target).parents(\".map-overlay-block\"));\r\n if (self.isClosed) {\r\n // Show it\r\n $content.parent().removeClass(\"closed\");\r\n $content.slideDown();\r\n self.isClosed = false;\r\n }\r\n else {\r\n // Hide it\r\n $content.slideUp(400, function () {\r\n $content.parent().addClass(\"closed\");\r\n });\r\n self.isClosed = true;\r\n }\r\n });\r\n\r\n $scope.rrMap = {\r\n // Only need to render the full map once\r\n hasRendered: false,\r\n\r\n // Used to determine functionality for live site vs. \"Download Image\" mode\r\n mapOptions: {\r\n zoomControl: $scope.currentURL.search().cap ? false : true,\r\n scrollWheel: false,\r\n },\r\n\r\n // `forceInactive` is used to force a community shape back to its non-highlighted default state,\r\n // specifically when a user is hovering on a community and clicks to deselect it. Without\r\n // forcing a non-highlighted state, the code would detect the `mouseover` and highlight it\r\n styleShape: function(fips, forceInactive) {\r\n // It's possible this method will be called before the map is rendered\r\n // If so, just return out. We'll update the shape style eventually.\r\n // TODO - Feels like a race condition. What's causing this?\r\n if (!$scope.cShapes) {\r\n return false;\r\n }\r\n\r\n // Sugar\r\n var shape = $scope.cShapes[fips];\r\n var community = $scope.state.communitiesByFips[fips];\r\n\r\n // Set the shape's background color\r\n // First, make sure the shape that the user is interacting with is an actual community,\r\n // not a non-community placeholder shape on the map\r\n if (!community) {\r\n return; \r\n }\r\n\r\n var determineShapeColorUsingLegend = true;\r\n\r\n var curCommunity = $scope.state.communitiesByFips[fips];\r\n var indicatorsForCurCommunity = curCommunity.indicators;\r\n var selectedIndicator = $scope.state.selectedIndicator;\r\n if (selectedIndicator) {\r\n var curIndicatorId = selectedIndicator.id;\r\n var curIndicatorForCurCommunity = indicatorsForCurCommunity[curIndicatorId];\r\n \r\n if (curIndicatorForCurCommunity) {\r\n var indicatorValueForCurLocation = curIndicatorForCurCommunity.value;\r\n \r\n // Try to determine the color for the shape by comparing its community's data value with the bounds from the legend\r\n var index = $scope.state.mapLegend.findIndex((legendItem) => {\r\n return (legendItem.lowDataValue <= indicatorValueForCurLocation && indicatorValueForCurLocation < legendItem.highDataValue); \r\n });\r\n \r\n determineShapeColorUsingLegend = index >= 0;\r\n }\r\n else {\r\n determineShapeColorUsingLegend = false;\r\n }\r\n }\r\n else {\r\n determineShapeColorUsingLegend = false;\r\n }\r\n\r\n if (determineShapeColorUsingLegend) {\r\n $scope.cShapes[fips].fillColor = $scope.legend.colors[index];\r\n }\r\n else {\r\n if (selectedIndicator && selectedIndicator.id === $scope.state.selectedDomain.id) {\r\n $scope.cShapes[fips].fillColor = $scope.legend.colorByGroup[community.group];\r\n }\r\n else if ($scope.legend.colorByCommunity && $scope.legend.colorByCommunity[community.id]) {\r\n $scope.cShapes[fips].fillColor = $scope.legend.colorByCommunity[community.id];\r\n }\r\n else {\r\n $scope.cShapes[fips].fillColor = $scope.legend.colorByGroup[community.group];\r\n }\r\n }\r\n\r\n // Check if shape is hovered, but we're not forcing the default un-highlighted state\r\n if (\r\n !forceInactive &&\r\n ($scope.mapHoverBox.hoveredCommunity.id === community.id ||\r\n $scope.state.selectedCommunities.communityIsSelected(\r\n community.id,\r\n ))\r\n ) {\r\n shape.setOptions({\r\n strokeColor: \"#dea003\",\r\n strokeWeight: 3,\r\n zIndex: 99,\r\n });\r\n }\r\n else {\r\n shape.setOptions({\r\n strokeColor: \"#fff\",\r\n strokeWeight: 1,\r\n zIndex: 1,\r\n });\r\n }\r\n },\r\n actions: {\r\n mouseover: function(event, shape, map) {\r\n $scope.mapHoverBox.hoveredCommunity =\r\n $scope.state.communitiesByFips[shape.fips];\r\n\r\n $scope.mapHoverBox.communityRank = $scope.mapHoverBox.hoveredCommunity\r\n ? $scope.mapHoverBox.hoveredCommunity.rank\r\n : 0;\r\n\r\n // When hovering over a community, mark this flag as false so we don't also show the asset pop-out\r\n $scope.mapHoverBox.isAsset = false;\r\n\r\n if ($scope.mapHoverBox.hoveredCommunity) {\r\n var eventLoc = $scope.latLng2Point(event.latLng, $scope.map);\r\n\r\n $scope.mapHoverBox.posLeft = eventLoc.x + 25;\r\n $scope.mapHoverBox.posTop = eventLoc.y - 50;\r\n }\r\n\r\n $scope.$apply();\r\n $scope.rrMap.styleShape(shape.fips);\r\n },\r\n mouseout: function(event, shape, map) {\r\n // Reset the map hover box\r\n $scope.mapHoverBox.posLeft = null;\r\n $scope.mapHoverBox.posTop = null;\r\n $scope.mapHoverBox.communityRank = null;\r\n $scope.mapHoverBox.hoveredCommunity = {};\r\n $scope.$apply();\r\n\r\n $scope.rrMap.styleShape(shape.fips);\r\n },\r\n click: function(event, shape, map) {\r\n // Tracks when a user clicks on a community on a map on the \"Risk Ranking\" page\r\n var community = $scope.state.communitiesByFips[shape.fips];\r\n if (community) {\r\n dataLayer.push({\r\n event: \"Map Clicks\",\r\n eventCategory: \"Interactive Clicks\",\r\n eventAction: \"Map Click|\" + community.name,\r\n eventLabel: window.location.pathname,\r\n });\r\n $scope.state.selectedCommunities.toggleCommunity(community.id);\r\n }\r\n else {\r\n console.error(\"No community found for this shape:\", shape);\r\n\t\t\t\t\t\t\r\n var latitude = event.latLng.lat();\r\n var longitude = event.latLng.lng();\r\n console.debug(latitude + \", \" + longitude);\r\n }\r\n },\r\n },\r\n\r\n // This is wrapped in a function so we can hold off on generating the map until all the\r\n // community data we need has successfully loaded\r\n render: function() {\r\n if (!$scope.rrMap.hasRendered) {\r\n NgMap.getMap().then(function(map) {\r\n $scope.rrMap.labelEngine = new CCCLabelEngine(map);\r\n var shapesLoadingId = LoadingService.taskStart(\r\n $scope,\r\n \"Loading Map Shapes\",\r\n );\r\n\r\n $http({\r\n method: \"GET\",\r\n url:\r\n \"/api/MapData/GetWktPolygons?locationTypeId=3&isSimplified=true\",\r\n cache: true,\r\n }).then(\r\n function successCallback(response) {\r\n $scope.rrMap.hasRendered = true;\r\n\r\n $scope.cShapes = {};\r\n\r\n // Parse out the WKT text into google API Polygons\r\n for (var fips in response.data) {\r\n var wktPolygon = response.data[fips];\r\n\r\n var polygon = ccc.viz.map.util.MapUtil.wktToGooglePolygon(\r\n wktPolygon,\r\n );\r\n\r\n polygon.setOptions({\r\n fips: fips,\r\n });\r\n\r\n $scope.cShapes[fips] = polygon;\r\n\r\n $scope.rrMap.styleShape(fips);\r\n\r\n // Render the shape on the map itself\r\n $scope.cShapes[fips].setMap(map);\r\n\r\n google.maps.event.addListener(\r\n $scope.cShapes[fips],\r\n \"mouseover\",\r\n function(event) {\r\n $scope.rrMap.actions.mouseover(event, this, map);\r\n },\r\n );\r\n\r\n google.maps.event.addListener(\r\n $scope.cShapes[fips],\r\n \"mouseout\",\r\n function(event) {\r\n $scope.rrMap.actions.mouseout(event, this, map);\r\n },\r\n );\r\n\r\n google.maps.event.addListener(\r\n $scope.cShapes[fips],\r\n \"click\",\r\n function(event) {\r\n var latitude = event.latLng.lat();\r\n var longitude = event.latLng.lng();\r\n console.debug( latitude + \", \" + longitude );\r\n\r\n $scope.rrMap.actions.click(event, this, map);\r\n },\r\n );\r\n }\r\n\r\n LoadingService.taskEnd($scope, shapesLoadingId);\r\n\r\n $scope.rrMap.renderOverlays();\r\n\r\n if (!$attrs.assetMap) {\r\n $timeout(function() {\r\n // At this point, the map should be all done rendering\r\n if ($scope.currentURL.search().cap) {\r\n window.triggerScreenshot();\r\n }\r\n }, 750);\r\n }\r\n },\r\n function errorCallback(response) {\r\n console.warn(\"Couldn't load map shapes!\");\r\n },\r\n );\r\n\r\n // Check URL params for default zoom level and center point\r\n if ($location.search().zoom) {\r\n map.setZoom(+$location.search().zoom);\r\n }\r\n\r\n if ($location.search().center) {\r\n var rawLatLng = $location.search().center.split(\",\");\r\n var latLng = {\r\n lat: +rawLatLng[0],\r\n lng: +rawLatLng[1],\r\n };\r\n map.setCenter(latLng);\r\n }\r\n\r\n // Update the URL params when a user zooms, or drags the map around\r\n google.maps.event.addListener(map, \"zoom_changed\", function() {\r\n $scope.$apply(function() {\r\n $location.search(\"zoom\", map.getZoom());\r\n });\r\n });\r\n\r\n google.maps.event.addListener(map, \"center_changed\", function() {\r\n $scope.$apply(function() {\r\n $location.search(\r\n \"center\",\r\n map.getCenter().lat() + \",\" + map.getCenter().lng(),\r\n );\r\n });\r\n });\r\n google.maps.event.addListener(map, \"idle\", () => $scope.rrMap.renderLabels());\r\n\r\n }); // NgMap\r\n } // hasRendered\r\n }, // render()\r\n\r\n labelLoadingTaskDone: function(labelsLoadingId) {\r\n return () => {\r\n LoadingService.taskEnd($scope, labelsLoadingId);\r\n };\r\n },\r\n\r\n overlayColors: {\r\n \"0\": \"#E7298A\",\r\n \"1\": \"#E7298A\",\r\n \"2\": \"#E7298A\",\r\n \"3\": \"#E7298A\",\r\n \"4\": \"#E7298A\",\r\n \"5\": \"#E7298A\",\r\n \"6\": \"#E7298A\",\r\n \"7\": \"#E7298A\",\r\n },\r\n\r\n removeOverlays: function () {\r\n // Remove old shapes\r\n if ($scope.overlayShapes) {\r\n for (var index in $scope.overlayShapes) {\r\n var polygon = $scope.overlayShapes[index];\r\n if (polygon && polygon.setMap) {\r\n polygon.setMap(null);\r\n }\r\n }\r\n }\r\n },\r\n\r\n removeOverlayMarkers: function () {\r\n // Remove old markers\r\n if ($scope.overlayMarkers) {\r\n for (var index in $scope.overlayMarkers) {\r\n var marker = $scope.overlayMarkers[index];\r\n if (marker && marker.setMap) {\r\n marker.setMap(null);\r\n }\r\n }\r\n }\r\n },\r\n\r\n renderLabels: function() {\r\n // TO DO - Loading Service tasks for labels\r\n // var labelsLoadingId = LoadingService.taskStart($scope, \"Loading Labels\");\r\n $scope.rrMap.labelEngine.renderLabels($scope.overlayMarkers);//, null, $scope.rrMap.labelLoadingTaskDone(labelsLoadingId));\r\n },\r\n\r\n renderOverlays: function () {\r\n var overlaysLoadingId = LoadingService.taskStart($scope, \"Loading District Overlays\");\r\n\r\n $scope.rrMap.removeOverlays();\r\n $scope.rrMap.removeOverlayMarkers();\r\n\r\n const zipcodesOverlayTypeId = \"4\";\r\n var labelClasslist = \"overlay-label overlay-label--hidden\"; // Hide labels until we're ready, once LabelGun prunes the overlapping ones\r\n var overlayTypeIds = $scope.overlayIds;\r\n if (overlayTypeIds instanceof Array && overlayTypeIds.indexOf(zipcodesOverlayTypeId) >= 0) {\t\t\t\t\t\t\r\n labelClasslist += \" overlay-label--small\"; // Use smaller font for zipcodes\r\n }\r\n\r\n // global\r\n var hardcodedPositions = hardcodedPositionsByOverlayTypeAndFips;\r\n NgMap.getMap().then(function (map) {\r\n $http({\r\n method: \"GET\",\r\n url: \"/api/MapData/GetWktOverlayPolygons?overlays=\" + $scope.overlayIds, //overlayTypesToRequest,\r\n cache: true,\r\n }).then(function successCallback(response) {\r\n // Remove references to the marker and shape objects as late as possible\r\n // Doing this too soon results in orphaned markers and shapes after zooming\r\n // This is because Google's setMap() is asynchronous\r\n // See $scope.rrMap.removeOverlays(), $scope.rrMap.removeOverlayMarkers()\r\n $scope.overlayShapes = [];\r\n $scope.overlayMarkers = [];\r\n\r\n // Parse out the WKT text into google API Polygons\r\n for (var key in response.data) {\r\n var tokens = key.split(\"|\");\r\n var overlayType = tokens[0];\r\n var fips = tokens[1];\r\n var labelContent = tokens[2];\r\n\r\n var wktPolygon = response.data[key];\r\n\r\n var polygon = ccc.viz.map.util.MapUtil.wktToGooglePolygon(wktPolygon);\r\n\r\n polygon.setOptions({\r\n clickable: false,\r\n fips: fips,\r\n overlayType: overlayType,\r\n fillColor: \"#ffffff\",\r\n fillOpacity: 0.0,\r\n strokeColor: $scope.rrMap.overlayColors[overlayType],\r\n strokeOpacity: 0.9,\r\n strokeWeight: 1,\r\n zIndex: 100 + parseInt(overlayType),\r\n });\r\n\r\n // Render the shape on the map itself\r\n polygon.setMap(map);\r\n $scope.overlayShapes.push(polygon);\r\n\r\n // Add label marker for the polygon\r\n var noIcon = {\r\n // Workaround to have a label with no icon\r\n path: google.maps.SymbolPath.CIRCLE,\r\n scale: 0,\r\n };\r\n\t\t\t\t\t\t\t\r\n // account for label text itself\r\n var labelXOffset = 5 + fips.length * 4;\r\n var labelYOffset = 15;\r\n var labelAnchor = new google.maps.Point(labelXOffset, labelYOffset);\r\n\t\t\t\t\t\t\t\r\n // hardcoded positions\r\n var positions;\r\n if (hardcodedPositions && hardcodedPositions[overlayType]) {\r\n positions = hardcodedPositions[overlayType][fips];\r\n }\r\n\t\t\t\t\t\t\t\r\n if (!positions || !positions.length) {\r\n // Just need one label - position over geometric center\r\n var center = polygon.getBounds().getCenter();\r\n $scope.overlayMarkers.push(new MarkerWithLabel({\r\n map: map,\r\n position: center,\r\n icon: noIcon,\r\n labelContent: labelContent,\r\n labelAnchor: labelAnchor,\r\n labelClass: labelClasslist,\r\n }));\r\n }\r\n else {\r\n positions.forEach(position => {\r\n // Hardcoded positions, and possibly multiple labels for gerrymandered/multipolygon locations\r\n $scope.overlayMarkers.push(new MarkerWithLabel({\r\n map: map,\r\n position: new google.maps.LatLng(position[0], position[1]),//position,\r\n icon: noIcon,\r\n labelContent: labelContent,\r\n labelAnchor: labelAnchor,\r\n labelClass: labelClasslist,\r\n }));\t\t\t\t\t\t\t\t\r\n });\r\n }\r\n } // foreach key in response.data\r\n LoadingService.taskEnd($scope, overlaysLoadingId);\r\n\r\n $scope.rrMap.renderLabels();\r\n }); // $http.then()\r\n }); // renderOverlays()\r\n },\r\n }; // $scope.rrMap\r\n } // RiskRankingMapController\r\n})();\r\n","(function() {\r\n \"use strict\";\r\n\r\n angular.module(\"app\").directive(\"cccRiskRankingMap\", cccRiskRankingMap);\r\n\r\n function cccRiskRankingMap() {\r\n return {\r\n restrict: \"EA\",\r\n scope: false,\r\n controller: \"RiskRankingMapController\"\r\n };\r\n }\r\n})();\r\n","/* global google */\r\n\r\n(function() {\r\n \"use strict\";\r\n\r\n angular\r\n .module(\"app\")\r\n .controller(\"TypeaheadController\", [\r\n \"$scope\",\r\n \"$attrs\",\r\n \"$filter\",\r\n \"NgMap\",\r\n \"$timeout\",\r\n TypeaheadController\r\n ]);\r\n\r\n function TypeaheadController($scope, $attrs, $filter, NgMap, $timeout) {\r\n $scope.typeahead = {};\r\n\r\n $scope.resetTypeahead = function() {\r\n // Prevents first item from being selected automatically\r\n $scope.typeahead.selectedIndex = -1;\r\n\r\n $scope.typeahead.filteredResults = [];\r\n\r\n // Empty out typeahead input field\r\n $scope.queryString = \"\";\r\n };\r\n\r\n $scope.resetTypeahead();\r\n\r\n $scope.updateTypeahead = function(needle) {\r\n $scope.typeahead.filteredResults = $scope.state.communityData.filter(\r\n function(community) {\r\n return firstLettersFilter(community.name, needle);\r\n }\r\n );\r\n };\r\n\r\n $scope.focus = function(event) {\r\n $timeout(function() {\r\n $scope.updateTypeahead(\"\");\r\n }, 150);\r\n };\r\n\r\n // Typeahead filter\r\n // Requirements: find matches for community names where any word starts with a user-provided\r\n // string. Example: `b` matches `Battery Park` and `Midtown Business District`\r\n // TODO - This should probably be its own filter file\r\n function firstLettersFilter(haystack, needle) {\r\n // Split the community name by any non-word characters\r\n var parsedStr = haystack.toLowerCase().split(/\\W+/);\r\n\r\n // User input and strings to search are converted to lowercase\r\n needle = needle.toLowerCase();\r\n\r\n for (var i = 0; i < parsedStr.length; i++) {\r\n if (parsedStr[i].indexOf(needle) === 0) {\r\n // string match found!\r\n return true;\r\n }\r\n }\r\n\r\n // no string match found\r\n return false;\r\n }\r\n\r\n $scope.typeaheadKeyPressed = function(event, communityId) {\r\n // console.log(communityId);\r\n // console.log($scope.typeaheadSelected.index);\r\n if (event.key === \"ArrowDown\") {\r\n $scope.typeahead.selectedIndex += 1;\r\n }\r\n else if (event.key === \"ArrowUp\") {\r\n $scope.typeahead.selectedIndex =\r\n $scope.typeahead.selectedIndex >= -1\r\n ? $scope.typeahead.selectedIndex - 1\r\n : -1;\r\n }\r\n else if (event.key === \"Enter\") {\r\n var selectedId =\r\n $scope.typeahead.filteredResults[$scope.typeahead.selectedIndex].id;\r\n $scope.typeaheadSelected(selectedId);\r\n }\r\n else {\r\n // If the keypress isn't an arrow, it's probably a letter or number\r\n // Reset the selected index\r\n $scope.typeahead.selectedIndex = -1;\r\n }\r\n };\r\n\r\n function getBoundsZoomLevel(bounds, mapDim) {\r\n var WORLD_DIM = { height: 256, width: 256 };\r\n var ZOOM_MAX = 21;\r\n\r\n function latRad(lat) {\r\n var sin = Math.sin((lat * Math.PI) / 180);\r\n var radX2 = Math.log((1 + sin) / (1 - sin)) / 2;\r\n return Math.max(Math.min(radX2, Math.PI), -Math.PI) / 2;\r\n }\r\n\r\n function zoom(mapPx, worldPx, fraction) {\r\n return Math.floor(Math.log(mapPx / worldPx / fraction) / Math.LN2);\r\n }\r\n\r\n var ne = bounds.getNorthEast();\r\n var sw = bounds.getSouthWest();\r\n\r\n var latFraction = (latRad(ne.lat()) - latRad(sw.lat())) / Math.PI;\r\n\r\n var lngDiff = ne.lng() - sw.lng();\r\n var lngFraction = (lngDiff < 0 ? lngDiff + 360 : lngDiff) / 360;\r\n\r\n var latZoom = zoom(mapDim.height, WORLD_DIM.height, latFraction);\r\n var lngZoom = zoom(mapDim.width, WORLD_DIM.width, lngFraction);\r\n\r\n return Math.min(latZoom, lngZoom, ZOOM_MAX);\r\n }\r\n\r\n function getBounds(shape) {\r\n function extendBounds(bounds, point) {\r\n return bounds.extend(point);\r\n }\r\n\r\n return _.flatten(\r\n shape.getPaths().b.map(function(path) {\r\n return path.b;\r\n })\r\n ).reduce(extendBounds, new google.maps.LatLngBounds());\r\n }\r\n\r\n $scope.typeaheadSelected = function(id) {\r\n // Tracks when a user searches for a community from the \"Communities by Risk\" right rail on the \"Risk Ranking\" page and clicks on it\r\n var community = $scope.state.communitiesById[id];\r\n dataLayer.push({\r\n event: \"Community Search\",\r\n eventCategory: \"Interactive Clicks\",\r\n eventAction: \"Community Search|\" + community.name,\r\n eventLabel: window.location.pathname\r\n });\r\n\r\n $scope.state.selectedCommunities.toggleCommunity(id);\r\n $scope.resetTypeahead();\r\n\r\n if ($attrs.zoomOnSelection) {\r\n var bounds = getBounds($scope.cShapes[community.fips]);\r\n var center = bounds.getCenter(),\r\n mapDiv = $scope.map.getDiv(),\r\n zoom = getBoundsZoomLevel(bounds, {\r\n width: $(mapDiv).width(),\r\n height: $(mapDiv).height()\r\n });\r\n\r\n setTimeout(function() {\r\n $scope.map.setZoom(zoom);\r\n $scope.map.setCenter(center);\r\n }, 0);\r\n }\r\n };\r\n }\r\n})();\r\n","(function() {\r\n \"use strict\";\r\n\r\n angular.module(\"app\").directive(\"cccTypeahead\", cccTypeahead);\r\n\r\n function cccTypeahead() {\r\n return {\r\n restrict: \"EA\",\r\n scope: false,\r\n controller: \"TypeaheadController\"\r\n };\r\n }\r\n})();\r\n","(function() {\r\n \"use strict\";\r\n\r\n angular.module(\"app\").factory(\"rankingsService\", [RankingsService]);\r\n\r\n function RankingsService() {\r\n return {\r\n lowestRanked: function(rankedCommunities) {\r\n if (!rankedCommunities) return [];\r\n\r\n var lowestRank = _.first(rankedCommunities).rank;\r\n return rankedCommunities.filter(function(cd) {\r\n return cd.rank === lowestRank;\r\n });\r\n },\r\n highestRanked: function(rankedCommunities) {\r\n if (!rankedCommunities) return [];\r\n\r\n var highestRank = _.last(rankedCommunities).rank;\r\n return rankedCommunities.filter(function(cd) {\r\n return cd.rank === highestRank;\r\n });\r\n }\r\n };\r\n }\r\n})();\r\n","(function() {\r\n \"use strict\";\r\n\r\n angular.module(\"app\").filter(\"reverse\", function() {\r\n return function(items) {\r\n return Array.isArray(items) ? items.slice().reverse() : items;\r\n };\r\n });\r\n})();\r\n"]}