{"version":3,"file":"googlemaps.bundle.js","mappings":"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","sources":["webpack://woningborg.website/./src/frontend/scripts/googlemaps.js"],"sourcesContent":["/**\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 * 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/**\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) Wether 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 * @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 /**\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'] ||\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 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_ =\r\n 'https://google-maps-utility-library-v3.googlecode.com/svn/trunk/markerclusterer/' +\r\n '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/**\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/**\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/**\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/**\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 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\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 = 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/**\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 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};\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/**\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 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 }\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 }\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)) {\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/**\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/**\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 this.div_.addEventListener('click', function (event) {\r\n that.triggerClusterClick(event);\r\n });\r\n\r\n // google.maps.event.addEventListener(this.div_, 'click', function (event) {\r\n // that.triggerClusterClick(event);\r\n // });\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 (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/**\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/**\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/**\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 (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/**\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};\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 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 return style.join('');\r\n};\r\n\r\n\r\n(function ($) {\r\n\r\n 'use strict';\r\n\r\n // Define and expose object\r\n window.App = {\r\n\r\n window: $(window),\r\n body: $('body'),\r\n page: $('#page'),\r\n baseURL: $('base').attr('href')\r\n }\r\n}(jQuery));\r\n(function ($) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * Map object\r\n */\r\n App.Map = {\r\n\r\n activeMarker: null,\r\n bounds: null,\r\n infoWindow: null,\r\n map: null,\r\n mapNode: null,\r\n markers: [],\r\n markerClusterer: null,\r\n organizations: [],\r\n\r\n options: {\r\n clusterIcons: [\r\n {url: '/images/m1.png', width: 53, height: 52, textColor: '#fff'},\r\n {url: '/images/m2.png', width: 56, height: 55, textColor: '#fff'},\r\n {url: '/images/m3.png', width: 66, height: 65, textColor: '#fff'},\r\n {url: '/images/m4.png', width: 78, height: 77, textColor: '#fff'},\r\n {url: '/images/m5.png', width: 90, height: 98, textColor: '#fff'}\r\n ],\r\n scrollwheel: false,\r\n clusterInfoWindowZoom: 12,\r\n clusterZoomIncrement: 1,\r\n clusterLinkClassName: 'cluster-link',\r\n clusterListInfoWindowHeader: 'Op deze locatie zijn %n organisaties gevestigd',\r\n hideInfoWindowsOnZoom: true,\r\n mapSelector: '#js-partners-map',\r\n markerIcon: '/images/google-map-marker.svg',\r\n markerLinkInfoWindowMore: 'Bekijk organisatie'\r\n },\r\n\r\n /**\r\n * Set up the map\r\n */\r\n init: function () {\r\n this.organizations = window.organizations;\r\n this.mapNode = $(this.options.mapSelector);\r\n\r\n // Make sure both organizations and the map node are set\r\n if (window.organizations && this.mapNode.length) {\r\n this.inititalizeMap();\r\n }\r\n },\r\n\r\n /**\r\n * Set up the Google Map\r\n */\r\n inititalizeMap: function () {\r\n var self = this;\r\n\r\n // Create the map\r\n this.map = new google.maps.Map(this.mapNode[0], {\r\n mapTypeControl: false,\r\n mapTypeId: google.maps.MapTypeId.ROADMAP,\r\n panControl: false,\r\n streetViewControl: false,\r\n center: {lat: 52.1193993, lng: 5.633566},\r\n zoom: 8,\r\n // restriction: {\r\n // latLngBounds: {\r\n // north: -10,\r\n // south: -40,\r\n // east: 160,\r\n // west: 100,\r\n // },\r\n // },\r\n zoomControlOptions: {\r\n scrollwheel: false,\r\n position: google.maps.ControlPosition.RIGHT_BOTTOM\r\n }\r\n });\r\n\r\n // If the option is enabled, hide the active info window when the zoom changes\r\n if (this.options.hideInfoWindowsOnZoom) {\r\n google.maps.event.addListener(this.map, 'zoom_changed', function () {\r\n self.closeActiveInfoWindow();\r\n });\r\n }\r\n\r\n // Set the bounds\r\n this.bounds = new google.maps.LatLngBounds();\r\n\r\n // Add the markers to the map\r\n self.markers = [];\r\n this.addMarkers();\r\n\r\n // Fit to the bounds\r\n this.map.fitBounds(this.bounds);\r\n\r\n // Set up clustering\r\n this.applyClustering();\r\n\r\n this.map.setCenter(new google.maps.LatLng(parseFloat(51.4895218375193), parseFloat(5.493504558944068)));\r\n },\r\n \r\n /**\r\n * Add markers to the map\r\n */\r\n addMarkers: function () {\r\n\r\n var self = this;\r\n self.markerClusterer = new MarkerClusterer(this.map, this.markers, {\r\n styles: this.options.clusterIcons,\r\n zoomOnClick: false\r\n });\r\n\r\n $.each(this.organizations, function (index, organization) {\r\n // Create a new marker\r\n var marker = new google.maps.Marker({\r\n icon: self.options.markerIcon,\r\n index: index,\r\n infoWindowData: organization.infoWindowData,\r\n map: self.map,\r\n position: new google.maps.LatLng(this.lat, this.long)\r\n });\r\n\r\n // Add event handlers to the markers\r\n google.maps.event.addListener(marker, 'click', function () {\r\n self.showMarkerInfoWindow(marker, organization.infoWindowData);\r\n });\r\n\r\n // Add the marker position to the bounds\r\n self.bounds.extend(marker.position);\r\n\r\n // Store the marker clustering\r\n self.markers.push(marker);\r\n });\r\n //letop vierkant hierboven laten staan!!\r\n var bounds = new google.maps.LatLngBounds();\r\n for (var i = 0; i < self.markers.length; i++) {\r\n bounds.extend(self.markers[i].getPosition());\r\n }\r\n\r\n this.map.fitBounds(bounds);\r\n },\r\n\r\n /**\r\n * Show marker info window\r\n * @param {object} marker\r\n * @param {object} data\r\n */\r\n showMarkerInfoWindow: function (marker, data) {\r\n\r\n var content;\r\n\r\n this.closeActiveInfoWindow();\r\n\r\n // Render different content if the data contains a URL\r\n if (data.url) {\r\n content = [\r\n '

' + data.title + '

',\r\n '

' + data.address + '

',\r\n '

' + data.zipCode + '

',\r\n '' + this.options.markerLinkInfoWindowMore + ''\r\n ];\r\n } else {\r\n content = [\r\n '

' + data.title + '

',\r\n '

' + data.address + '

',\r\n '

' + data.zipCode + '

',\r\n '

' + data.size + '

',\r\n '

' + data.branch + '

'\r\n ];\r\n }\r\n\r\n // Create info window with content\r\n this.infoWindow = new google.maps.InfoWindow({\r\n content: content.join('')\r\n });\r\n\r\n this.infoWindow.open(this.map, marker);\r\n },\r\n\r\n /**\r\n * Show cluster list info window\r\n * @param {object} cluster\r\n * @param {object} center\r\n */\r\n showClusterListInfoWindow: function (cluster, center) {\r\n\r\n var self = this,\r\n markers = cluster.getMarkers(),\r\n content = [];\r\n\r\n this.closeActiveInfoWindow();\r\n\r\n // Loop over marker data and push linked titles to content\r\n var counter = 0;\r\n $.each(markers, function () {\r\n if (counter > 0) {\r\n content.push('
');\r\n }\r\n content.push('

' + this.infoWindowData.title + '

');\r\n content.push('

' + this.infoWindowData.address + '

');\r\n content.push('

' + this.infoWindowData.zipCode + '

');\r\n if (this.infoWindowData.url) {\r\n content.push('' + this.infoWindowData.title + '');\r\n }\r\n counter += 1;\r\n });\r\n\r\n // Create info window from content\r\n this.infoWindow = new google.maps.InfoWindow({\r\n content: content.join('')\r\n });\r\n\r\n this.infoWindow.open(this.map);\r\n this.infoWindow.setPosition(center);\r\n },\r\n\r\n\r\n /**\r\n * Show cluster detail info window\r\n * @param {number} index\r\n * @param {number} lat\r\n * @param {number} lng\r\n */\r\n showClusterDetailInfoWindow: function (index, lat, lng) {\r\n\r\n var data = this.organizations[index].infoWindowData,\r\n position = new google.maps.LatLng(lat, lng);\r\n\r\n this.closeActiveInfoWindow();\r\n\r\n // Create info window with content\r\n this.infoWindow = new google.maps.InfoWindow({\r\n content: [\r\n '

' + data.title + '

',\r\n '

' + data.street + '

',\r\n '

' + data.zipCode + ' ' + data.place + '

',\r\n '

' + data.size + '

',\r\n '

' + data.branch + '

'\r\n ].join('')\r\n });\r\n\r\n this.infoWindow.open(this.map);\r\n this.infoWindow.setPosition(position);\r\n },\r\n\r\n /**\r\n *\r\n */\r\n closeActiveInfoWindow: function () {\r\n if (this.infoWindow) {\r\n this.infoWindow.close();\r\n }\r\n },\r\n\r\n applyClustering: function () {\r\n\r\n var self = this;\r\n\r\n // Apply clustering\r\n this.markerClusterer = new MarkerClusterer(this.map, this.markers, {\r\n styles: this.options.clusterIcons,\r\n zoomOnClick: false\r\n });\r\n\r\n // When a cluster is clicked, either zoom in (default behaviour)\r\n // When the user is zoomed in past the configured clusterInfoWindowZoom show a cluster list containing the underlying markers\r\n google.maps.event.addListener(this.markerClusterer, 'clusterclick', function (cluster) {\r\n\r\n var zoom = self.map.getZoom(),\r\n center = cluster.getCenter();\r\n\r\n if (zoom > self.options.clusterInfoWindowZoom) {\r\n self.showClusterListInfoWindow(cluster, center);\r\n } else {\r\n self.map.setZoom(zoom + self.options.clusterZoomIncrement);\r\n self.map.panTo(center);\r\n }\r\n });\r\n\r\n // Delegated event handler to handle clicks on the markers in the cluster list\r\n // When a list item is clicked, show a custom info window containing the marker details\r\n App.body.on('click', '.' + this.options.clusterLinkClassName, function (event) {\r\n\r\n var link = $(this),\r\n data = link.data(),\r\n href = link.attr('href');\r\n\r\n if (href === '#') {\r\n self.showClusterDetailInfoWindow(data.index, data.lat, data.lng);\r\n event.preventDefault();\r\n }\r\n });\r\n }\r\n };\r\n\r\n}(jQuery));"],"names":["MarkerClusterer","map","opt_markers","opt_options","this","extend","google","maps","OverlayView","map_","markers_","clusters_","sizes","styles_","ready_","options","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_","prototype","obj1","obj2","object","property","apply","onAdd","setReady_","draw","size","i","push","url","height","width","fitMapToMarkers","marker","markers","getMarkers","bounds","LatLngBounds","getPosition","fitBounds","setStyles","isZoomOnClick","getTotalMarkers","setMaxZoom","maxZoom","getMaxZoom","calculator_","numStyles","index","count","dv","parseInt","text","Math","min","setCalculator","calculator","getCalculator","opt_nodraw","pushMarkerTo_","isAdded","repaint","addMarker","removeMarker_","indexOf","m","splice","removeMarker","removed","removeMarkers","r","ready","createClusters_","getTotalClusters","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","center","getCenter","d","isMarkerInClusterBounds","mapBounds","getBounds","isMarkerAlreadyAdded","l","calculateBounds_","len","updateIcon","getSize","mz","hide","sums","setCenter","setSums","show","triggerClusterClick","trigger","document","createElement","pos","getPosFromLatLng_","style","cssText","createCss","innerHTML","getPanes","overlayMouseTarget","appendChild","addEventListener","latlng","iconAnchor_","width_","height_","top","left","display","onRemove","parentNode","removeChild","text_","index_","useStyle","max","url_","textColor_","anchor_","textSize_","backgroundPosition_","backgroundPosition","txtColor","txtSize","join","$","App","body","page","baseURL","attr","jQuery","Map","activeMarker","infoWindow","mapNode","organizations","clusterIcons","textColor","scrollwheel","clusterInfoWindowZoom","clusterZoomIncrement","clusterLinkClassName","clusterListInfoWindowHeader","hideInfoWindowsOnZoom","mapSelector","markerIcon","markerLinkInfoWindowMore","init","inititalizeMap","self","mapTypeControl","mapTypeId","MapTypeId","ROADMAP","panControl","streetViewControl","zoomControlOptions","position","ControlPosition","RIGHT_BOTTOM","closeActiveInfoWindow","applyClustering","parseFloat","zoomOnClick","each","organization","Marker","icon","infoWindowData","long","showMarkerInfoWindow","data","content","title","address","zipCode","branch","InfoWindow","open","showClusterListInfoWindow","counter","setPosition","showClusterDetailInfoWindow","street","place","close","setZoom","panTo","on","link","preventDefault"],"sourceRoot":""}