{"version":3,"sources":["webpack:///webpack/bootstrap 4b14b2fe0d2f00fd3acc?6fbb********************************","webpack:///./~/gmaps-marker-clusterer/src/markerclusterer.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","id","loaded","modules","call","m","c","p","MarkerClusterer","map","opt_markers","opt_options","this","extend","google","maps","OverlayView","map_","markers_","clusters_","markersCluster_","markersUniqueID","sizes","styles_","cssClass_","cssDefaultClass_","setIndex_","ready_","options","gridSize_","undefined","minClusterSize_","ignoreHiddenMarkers_","maxZoom_","imagePath_","MARKER_CLUSTER_IMAGE_PATH_","imageExtension_","MARKER_CLUSTER_IMAGE_EXTENSION_","zoomOnClick_","averageCenter_","onMouseoverCluster_","onMouseoutCluster_","drawCluster_","hideCluster_","showCluster_","onAddCluster_","onRemoveCluster_","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_","prototype","obj1","obj2","object","property","apply","onAdd","setReady_","draw","size","i","url","push","height","width","fitMapToMarkers","marker","markers","getMarkers","bounds","LatLngBounds","getPosition","fitBounds","setStyles","isZoomOnClick","getTotalMarkers","setMaxZoom","maxZoom","getMaxZoom","getMarkersCluster","uniqueID","calculator_","numStyles","index","count","dv","parseInt","text","Math","min","setCalculator","calculator","getCalculator","opt_nodraw","pushMarkerTo_","isAdded","repaint","addMarker","removeMarker_","indexOf","splice","removeMarker","removed","removeMarkers","r","ready","createClusters_","getTotalClusters","getClusters","setGridSize","setMinClusterSize","getExtendedBounds","projection","getProjection","tr","LatLng","getNorthEast","lat","lng","bl","getSouthWest","trPix","fromLatLngToDivPixel","x","y","blPix","ne","fromDivPixelToLatLng","sw","isMarkerInBounds_","contains","clearMarkers","opt_hide","remove","oldClusters","slice","window","setTimeout","distanceBetweenPoints_","p1","p2","dLat","PI","dLon","a","sin","cos","atan2","sqrt","addToClosestCluster_","distance","clusterToAddTo","clusterIndex","center","getCenter","d","isMarkerInClusterBounds","mapBounds","getBounds","getVisible","isMarkerAlreadyAdded","l","calculateBounds_","len","updateIcon","getSize","mz","hide","sums","setCenter","setSums","show","triggerClusterClick","trigger","triggerClusterMouseover","triggerClusterMouseout","clusterIcon","document","createElement","pos","getPosFromLatLng_","style","cssText","createCss","innerHTML","addClass","getPanes","overlayMouseTarget","appendChild","isDragging","isMouseDown","addDomListener","defaultClusterOnAdd","latlng","_typeof","iconAnchor_","width_","height_","top","left","defaultClusterDraw","display","className","defaultClusterHide","defaultClusterShow","onRemove","parentNode","removeChild","defaultClusterOnRemove","text_","index_","useStyle","max","url_","textColor_","anchor_","textSize_","backgroundPosition_","backgroundPosition","txtColor","txtSize","join"],"mappings":"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","file":"markerclusterer.min.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 4b14b2fe0d2f00fd3acc","// ==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 Gmaps MarkerClusterer for Google Maps v3\r\n * @version version 1.2.0\r\n * @author Luke Mahe\r\n * @author Sebastian Hösl \r\n * @fileoverview\r\n * The library creates and manages per-zoom-level clusters for large amounts of\r\n * markers.\r\n * This is a v3 implementation of the v2 MarkerClusterer\r\n * {@link http://gmaps-utility-library-dev.googlecode.com/svn/tags/markerclusterer/}\r\n * >.\r\n */\r\n\r\n/**\r\n * @license\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 * 'ignoreHiddenMarkers': (boolean) Whether to ignore markers that are not\r\n * visible or count and cluster them anyway\r\n * 'styles': (Array) An array of objects with these 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 * 'cssClass': (string) One or more CSS class for styling this marker.\r\n * 'onMouseoverCluster': (function) The event handler used for onmouseover\r\n * each cluster\r\n * 'onMouseoutCluster': (function) The event handler used for onmouseout\r\n * each cluster\r\n * 'drawCluster': (function) Custom draw method for ClusterIcon\r\n * 'hideCluster': (function) Custom hide method for ClusterIcon\r\n * 'showCluster': (function) Custom hide method for ClusterIcon\r\n * 'onAddCluster': (function) Custom onAdd method for ClusterIcon\r\n * 'onRemoveCluster': (function) Custom onRemove method for ClusterIcon\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 /**\r\n * @type {Object} holding information about every markers cluster\r\n */\r\n this.markersCluster_ = {};\r\n\r\n /**\r\n * @type {Number} Unique markers ID\r\n */\r\n this.markersUniqueID = 1;\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 * @private\r\n */\r\n this.cssClass_ = '';\r\n\r\n /**\r\n * @private\r\n * @type {string} Set a default Cluster Class\r\n */\r\n this.cssDefaultClass_ = 'cluster';\r\n\r\n /**\r\n * @private\r\n */\r\n this.setIndex_ = 0;\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 * @type {number}\r\n * @private\r\n */\r\n this.gridSize_ = (options['gridSize'] !== undefined) ? 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 {boolean}\r\n * @private\r\n */\r\n this.ignoreHiddenMarkers_ = options['ignoreHiddenMarkers'] || false;\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 this.cssClass_ = options['cssClass'] || null;\r\n\r\n /**\r\n * @type {string}\r\n * @private\r\n */\r\n this.imagePath_ = options['imagePath'] ||\r\n this.MARKER_CLUSTER_IMAGE_PATH_;\r\n\r\n /**\r\n * @type {string}\r\n * @private\r\n */\r\n this.imageExtension_ = options['imageExtension'] ||\r\n 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 /**\r\n * @type {function}\r\n * @private\r\n */\r\n this.onMouseoverCluster_ = options['onMouseoverCluster'];\r\n\r\n /**\r\n * @type {function}\r\n * @private\r\n */\r\n this.onMouseoutCluster_ = options['onMouseoutCluster'];\r\n\r\n /**\r\n * @type {function}\r\n * @private\r\n */\r\n this.drawCluster_ = options['drawCluster'];\r\n\r\n /**\r\n * @type {function}\r\n * @private\r\n */\r\n this.hideCluster_ = options['hideCluster'];\r\n\r\n /**\r\n * @type {function}\r\n * @private\r\n */\r\n this.showCluster_ = options['showCluster'];\r\n\r\n /**\r\n * @type {function}\r\n * @private\r\n */\r\n this.onAddCluster_ = options['onAddCluster'];\r\n\r\n /**\r\n * @type {function}\r\n * @private\r\n */\r\n this.onRemoveCluster_ = options['onRemoveCluster'];\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/**\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_ = 'https://raw.githubusercontent.com/gmaps-marker-clusterer/gmaps-marker-clusterer/master/images/m';\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_EXTENSION_ = 'png';\r\n\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/**\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 var url = '';\r\n if (typeof this.imagePath_ === 'function') {\r\n url = this.imagePath_(i, size);\r\n } else {\r\n url = this.imagePath_ + (i + 1) + '.' + this.imageExtension_;\r\n }\r\n this.styles_.push({\r\n url: url,\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/**\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/**\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/**\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/**\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/**\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\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/**\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 * Gets marker's cluster object based on given marker\r\n *\r\n * @param {google.maps.Marker} marker\r\n *\r\n * @return {Cluster}\r\n */\r\nMarkerClusterer.prototype.getMarkersCluster = function(marker) {\r\n return this.clusters_[this.markersCluster_[marker.uniqueID]];\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\r\n return {\r\n text: count,\r\n index: index\r\n };\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/**\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/**\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/**\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 marker.uniqueID = this.markersUniqueID;\r\n this.markersUniqueID++;\r\n this.markers_.push(marker);\r\n};\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/**\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 } 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 delete this.markersCluster_[marker.uniqueID];\r\n\r\n return true;\r\n};\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 } else {\r\n return false;\r\n }\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 = markers.length; i >= 0; i--) {\r\n var marker = markers[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/**\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/**\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/**\r\n * Returns the list of clusters in the clusterer\r\n *\r\n * @return {Array.} The list of clusters.\r\n */\r\nMarkerClusterer.prototype.getClusters = function() {\r\n return this.clusters_;\r\n};\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/**\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/**\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/**\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/**\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/**\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(bounds.getNorthEast().lat(),\r\n bounds.getNorthEast().lng());\r\n var bl = new google.maps.LatLng(bounds.getSouthWest().lat(),\r\n bounds.getSouthWest().lng());\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/**\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/**\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 this.markersCluster_ = {};\r\n this.markersUniqueID = 1;\r\n};\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 this.markersCluster_ = {};\r\n this.markersUniqueID = 1;\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/**\r\n * Redraws the clusters.\r\n */\r\nMarkerClusterer.prototype.redraw = function() {\r\n this.createClusters_();\r\n};\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 = Math.sin(dLat / 2) * Math.sin(dLat / 2) +\r\n Math.cos(p1.lat() * Math.PI / 180) * Math.cos(p2.lat() * Math.PI / 180) *\r\n Math.sin(dLon / 2) * 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/**\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 var clusterIndex = null;\r\n for (var i = 0, cluster; cluster = this.clusters_[i]; i++) {\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 clusterIndex = i;\r\n }\r\n }\r\n }\r\n\r\n if (clusterToAddTo && clusterToAddTo.isMarkerInClusterBounds(marker)) {\r\n clusterToAddTo.addMarker(marker);\r\n } else {\r\n var cluster = new Cluster(this);\r\n cluster.addMarker(marker);\r\n this.clusters_.push(cluster);\r\n clusterIndex = this.clusters_.length - 1;\r\n }\r\n\r\n if (marker.isAdded) {\r\n this.markersCluster_[marker.uniqueID] = clusterIndex;\r\n }\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(this.map_.getBounds().getSouthWest(),\r\n this.map_.getBounds().getNorthEast());\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) && (!this.ignoreHiddenMarkers_ || marker.getVisible())) {\r\n this.addToClosestCluster_(marker);\r\n }\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(this, markerClusterer.getStyles(),\r\n markerClusterer.getGridSize());\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 } 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/**\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 } 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/**\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/**\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/**\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/**\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/**\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/**\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/**\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/**\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/**\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/**\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/**\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(markerClusterer, 'clusterclick', this.cluster_, event);\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 * Triggers the clustermouseover event.\r\n * @param {google.maps.MouseEvent} event The event to propagate\r\n */\r\nClusterIcon.prototype.triggerClusterMouseover = function(event) {\r\n var markerClusterer = this.cluster_.getMarkerClusterer();\r\n\r\n // Trigger the clustermouseover event.\r\n google.maps.event.trigger(markerClusterer, 'clustermouseover', this.cluster_, event);\r\n\r\n if (typeof this.cluster_.markerClusterer_.onMouseoverCluster_ === 'function') {\r\n this.cluster_.markerClusterer_.onMouseoverCluster_(this, event);\r\n }\r\n};\r\n\r\n/**\r\n * Triggers the clustermouseout event.\r\n * @param {google.maps.MouseEvent} event The event to propagate\r\n */\r\nClusterIcon.prototype.triggerClusterMouseout = function(event) {\r\n var markerClusterer = this.cluster_.getMarkerClusterer();\r\n\r\n // Trigger the clustermouseout event.\r\n google.maps.event.trigger(markerClusterer, 'clustermouseout', this.cluster_, event);\r\n\r\n if (typeof this.cluster_.markerClusterer_.onMouseoutCluster_ === 'function') {\r\n this.cluster_.markerClusterer_.onMouseoutCluster_(this, event);\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 if (typeof this.cluster_.markerClusterer_.onAddCluster_ === 'function') {\r\n this.cluster_.markerClusterer_.onAddCluster_(this);\r\n }\r\n else {\r\n defaultClusterOnAdd(this);\r\n }\r\n};\r\n\r\n/**\r\n * Default onAdd function\r\n * @ignore\r\n */\r\nfunction defaultClusterOnAdd(clusterIcon) {\r\n clusterIcon.div_ = document.createElement('DIV');\r\n if (clusterIcon.visible_) {\r\n var pos = clusterIcon.getPosFromLatLng_(clusterIcon.center_);\r\n clusterIcon.div_.style.cssText = clusterIcon.createCss(pos);\r\n clusterIcon.div_.innerHTML = clusterIcon.sums_.text;\r\n clusterIcon.addClass();\r\n }\r\n\r\n var panes = clusterIcon.getPanes();\r\n\r\n panes.overlayMouseTarget.appendChild(clusterIcon.div_);\r\n\r\n var isDragging = false;\r\n var isMouseDown = false;\r\n\r\n google.maps.event.addDomListener(clusterIcon.div_, 'click', function(event) {\r\n // Only perform click when not preceded by a drag\r\n if (!isDragging) {\r\n clusterIcon.triggerClusterClick(event);\r\n }\r\n });\r\n\r\n google.maps.event.addDomListener(clusterIcon.div_, 'mousedown', function() {\r\n isDragging = false;\r\n isMouseDown = true;\r\n });\r\n\r\n google.maps.event.addDomListener(clusterIcon.div_, 'mouseup', function() {\r\n isDragging = false;\r\n isMouseDown = false;\r\n });\r\n\r\n google.maps.event.addDomListener(clusterIcon.div_, 'mousemove', function() {\r\n if (isMouseDown) {\r\n isDragging = true;\r\n }\r\n });\r\n\r\n google.maps.event.addDomListener(clusterIcon.div_, 'mouseover', function(event) {\r\n clusterIcon.triggerClusterMouseover(event);\r\n });\r\n\r\n google.maps.event.addDomListener(clusterIcon.div_, 'mouseout', function(event) {\r\n clusterIcon.triggerClusterMouseout(event);\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 } 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/**\r\n * Draw the icon.\r\n * @ignore\r\n */\r\nClusterIcon.prototype.draw = function () {\r\n if (typeof this.cluster_.markerClusterer_.drawCluster_ === 'function') {\r\n this.cluster_.markerClusterer_.drawCluster_(this);\r\n }\r\n else {\r\n defaultClusterDraw(this);\r\n }\r\n};\r\n\r\n/**\r\n * Default draw function\r\n * @ignore\r\n */\r\nfunction defaultClusterDraw(clusterIcon) {\r\n if (clusterIcon.visible_) {\r\n var pos = clusterIcon.getPosFromLatLng_(clusterIcon.center_);\r\n clusterIcon.div_.style.top = pos.y + 'px';\r\n clusterIcon.div_.style.left = pos.x + 'px';\r\n }\r\n}\r\n\r\n\r\n/**\r\n * Hide the icon.\r\n */\r\nClusterIcon.prototype.hide = function() {\r\n if (typeof this.cluster_.markerClusterer_.hideCluster_ === 'function') {\r\n this.cluster_.markerClusterer_.hideCluster_(this);\r\n }\r\n else {\r\n defaultClusterHide(this);\r\n }\r\n};\r\n\r\n\r\n/**\r\n * Default hide function\r\n * @ignore\r\n */\r\nfunction defaultClusterHide(clusterIcon) {\r\n if (clusterIcon.div_) {\r\n clusterIcon.div_.style.display = 'none';\r\n clusterIcon.div_.className = '';\r\n }\r\n clusterIcon.visible_ = false;\r\n}\r\n\r\n\r\n/**\r\n * Position and show the icon.\r\n */\r\nClusterIcon.prototype.show = function() {\r\n if (typeof this.cluster_.markerClusterer_.showCluster_ === 'function') {\r\n this.cluster_.markerClusterer_.showCluster_(this);\r\n }\r\n else {\r\n defaultClusterShow(this);\r\n }\r\n};\r\n\r\n/**\r\n * Default show function\r\n * @ignore\r\n */\r\nfunction defaultClusterShow(clusterIcon) {\r\n if (clusterIcon.div_) {\r\n var pos = clusterIcon.getPosFromLatLng_(clusterIcon.center_);\r\n clusterIcon.div_.style.cssText = clusterIcon.createCss(pos);\r\n clusterIcon.div_.style.display = '';\r\n clusterIcon.addClass();\r\n }\r\n clusterIcon.visible_ = true;\r\n}\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/**\r\n * Implementation of the onRemove interface.\r\n * @ignore\r\n */\r\nClusterIcon.prototype.onRemove = function() {\r\n if (typeof this.cluster_.markerClusterer_.onRemoveCluster_ === 'function') {\r\n this.cluster_.markerClusterer_.onRemoveCluster_(this);\r\n }\r\n else {\r\n defaultClusterOnRemove(this);\r\n }\r\n};\r\n\r\n/**\r\n * Default onRemove function\r\n * @ignore\r\n */\r\nfunction defaultClusterOnRemove(clusterIcon) {\r\n if (clusterIcon.div_ && clusterIcon.div_.parentNode) {\r\n clusterIcon.hide();\r\n clusterIcon.div_.parentNode.removeChild(clusterIcon.div_);\r\n clusterIcon.div_ = null;\r\n }\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/**\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.textSize_ = style['textSize'];\r\n this.backgroundPosition_ = style['backgroundPosition'];\r\n this.iconAnchor_ = style['iconAnchor'];\r\n this.setIndex_ = index;\r\n};\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/**\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 var markerClusterer = this.cluster_.getMarkerClusterer();\r\n\r\n if (!markerClusterer.cssClass_) {\r\n style.push('background-image:url(' + this.url_ + ');');\r\n var backgroundPosition = this.backgroundPosition_ ? this.backgroundPosition_ : '0 0';\r\n style.push('background-position:' + backgroundPosition + ';');\r\n\r\n if (typeof this.anchor_ === 'object') {\r\n if (typeof this.anchor_[0] === 'number' && this.anchor_[0] > 0 &&\r\n this.anchor_[0] < this.height_) {\r\n style.push('height:' + (this.height_ - this.anchor_[0]) +\r\n 'px; padding-top:' + this.anchor_[0] + 'px;');\r\n } else if (typeof this.anchor_[0] === 'number' && this.anchor_[0] < 0 &&\r\n -this.anchor_[0] < this.height_) {\r\n style.push('height:' + this.height_ + 'px; line-height:' + (this.height_ + this.anchor_[0]) +\r\n 'px;');\r\n } else {\r\n style.push('height:' + this.height_ + 'px; line-height:' + this.height_ +\r\n 'px;');\r\n }\r\n if (typeof this.anchor_[1] === 'number' && this.anchor_[1] > 0 &&\r\n this.anchor_[1] < this.width_) {\r\n style.push('width:' + (this.width_ - this.anchor_[1]) +\r\n 'px; padding-left:' + this.anchor_[1] + 'px;');\r\n } else {\r\n style.push('width:' + this.width_ + 'px; text-align:center;');\r\n }\r\n } else {\r\n style.push('height:' + this.height_ + 'px; line-height:' +\r\n this.height_ + 'px; width:' + this.width_ + 'px; text-align:center;');\r\n }\r\n\r\n var txtColor = this.textColor_ ? this.textColor_ : 'black';\r\n var txtSize = this.textSize_ ? this.textSize_ : 11;\r\n\r\n style.push('cursor:pointer; top:' + pos.y + 'px; left:' +\r\n pos.x + 'px; color:' + txtColor + '; position:absolute; font-size:' +\r\n txtSize + 'px; font-family:Arial,sans-serif; font-weight:bold');\r\n\r\n } else {\r\n style.push('top:' + pos.y + 'px; left:' + pos.x + 'px;');\r\n }\r\n\r\n return style.join('');\r\n};\r\n\r\n/**\r\n * Set the class for the cluster icon\r\n * @ignore\r\n */\r\nClusterIcon.prototype.addClass = function() {\r\n var markerClusterer = this.cluster_.getMarkerClusterer();\r\n\r\n if (markerClusterer.cssClass_) {\r\n this.div_.className = markerClusterer.cssClass_ + ' ' + markerClusterer.cssDefaultClass_ + this.setIndex_;\r\n } else {\r\n this.div_.className = markerClusterer.cssDefaultClass_ + this.setIndex_;\r\n }\r\n}\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['getMarkersCluster'] = MarkerClusterer.prototype.getMarkersCluster;\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'] =\r\n 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'] =\r\n 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;\n\n\n// WEBPACK FOOTER //\n// ./~/gmaps-marker-clusterer/src/markerclusterer.js"],"sourceRoot":""}