{"version":3,"sources":["../../source/assets/js/markerclusterer.js","../../source/assets/js/stickyfill.js"],"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","minZoom","maxZoom","Math","min","mapTypes","getMapTypeId","max","resetViewport","redraw","length","Object","keys","addMarkers","Cluster","markerClusterer","markerClusterer_","getMap","getGridSize","getMinClusterSize","isAverageCenter","center_","bounds_","clusterIcon_","ClusterIcon","getStyles","cluster","styles","opt_padding","getMarkerClusterer","padding_","cluster_","div_","sums_","visible_","window","document","_createClass","defineProperties","target","props","i","descriptor","enumerable","configurable","writable","defineProperty","key","Constructor","protoProps","staticProps","prototype","testNode","seppuku","isWindowDefined","getComputedStyle","createElement","some","prefix","style","position","e","isInitialized","shadowRootExists","ShadowRoot","scroll","top","left","stickies","targetObj","sourceObject","hasOwnProperty","parseNumeric","val","parseFloat","getDocOffsetTop","node","docOffsetTop","offsetTop","offsetParent","Sticky","instance","TypeError","_classCallCheck","HTMLElement","Error","sticky","_node","_stickyMode","_active","push","refresh","value","_removed","_deactivate","nodeComputedStyle","nodeComputedProps","display","marginTop","marginBottom","marginLeft","marginRight","cssFloat","isNaN","originalPosition","referenceNode","parentNode","host","nodeWinOffset","getBoundingClientRect","parentWinOffset","parentComputedStyle","_parent","offsetHeight","_offsetToWindow","right","documentElement","clientWidth","_offsetToParent","borderTopWidth","borderLeftWidth","borderRightWidth","_styles","bottom","width","nodeTopValue","_limits","start","pageYOffset","end","borderBottomWidth","parentPosition","_recalcPosition","clone","_clone","height","padding","border","borderSpacing","fontSize","insertBefore","stickyMode","abs","_this","removeChild","_this2","index","splice","Stickyfill","forceSticky","init","refreshAll","addOne","add","nodeList","addedStickies","_loop","forEach","removeOne","remove","_loop2","removeAll","checkScroll","addEventListener","fastCheckTimer","docHiddenKey","visibilityChangeEventName","startFastCheckTimer","clearInterval","pageXOffset","setInterval","_fastCheck","module","exports","obj1","obj2","object","property","apply","onAdd","setReady_","draw","size","url","fitMapToMarkers","marker","markers","getMarkers","bounds","LatLngBounds","getPosition","fitBounds","setStyles","isZoomOnClick","getTotalMarkers","setMaxZoom","getMaxZoom","calculator_","numStyles","count","dv","parseInt","text","setCalculator","calculator","getCalculator","opt_nodraw","pushMarkerTo_","isAdded","repaint","addMarker","removeMarker_","indexOf","m","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","oldClusters","slice","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","pos","getPosFromLatLng_","cssText","createCss","innerHTML","getPanes","overlayMouseTarget","appendChild","addDomListener","latlng","width_","height_","onRemove","text_","index_","useStyle","url_","textColor_","anchor_","textSize_","backgroundPosition_","backgroundPosition","txtColor","txtSize","join","$","Vivo","LocMap","coordinates","_coordinates","Locations","Map","getElementById","scrollwheel","minLat","maxLat","minLng","maxLng","arrMarkers","loc","tag","id","Marker","label","vivoTag","animation","Animation","DROP","name","markerNo","dest","setZoom","offset","animate","scrollTop","on","ev","preventDefault","markerID","attr","replace","imagePath","onLoad","elements","querySelectorAll","jQuery"],"mappings":"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","file":"locations.js","sourcesContent":["/**\n * @name MarkerClusterer for Google Maps v3\n * @version version 1.0.1\n * @author Luke Mahe\n * @fileoverview\n * The library creates and manages per-zoom-level clusters for large amounts of\n * markers.\n *
\n * This is a v3 implementation of the\n * v2 MarkerClusterer.\n */\n\n/**\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\n/**\n * A Marker Clusterer that clusters markers.\n *\n * @param {google.maps.Map} map The Google map to attach to.\n * @param {Array.=} opt_markers Optional markers to add to\n * the cluster.\n * @param {Object=} opt_options support the following options:\n * 'gridSize': (number) The grid size of a cluster in pixels.\n * 'maxZoom': (number) The maximum zoom level that a marker can be part of a\n * cluster.\n * 'zoomOnClick': (boolean) Whether the default behaviour of clicking on a\n * cluster is to zoom into it.\n * 'averageCenter': (boolean) Whether the center of each cluster should be\n * the average of all markers in the cluster.\n * 'minimumClusterSize': (number) The minimum number of markers to be in a\n * cluster before the markers are hidden and a count\n * is shown.\n * 'styles': (object) An object that has style properties:\n * 'url': (string) The image url.\n * 'height': (number) The image height.\n * 'width': (number) The image width.\n * 'anchor': (Array) The anchor position of the label text.\n * 'textColor': (string) The text color.\n * 'textSize': (number) The text size.\n * 'backgroundPosition': (string) The position of the backgound x, y.\n * @constructor\n * @extends google.maps.OverlayView\n */\nfunction MarkerClusterer(map, opt_markers, opt_options) {\n // MarkerClusterer implements google.maps.OverlayView interface. We use the\n // extend function to extend MarkerClusterer with google.maps.OverlayView\n // because it might not always be available when the code is defined so we\n // look for it at the last possible moment. If it doesn't exist now then\n // there is no point going ahead :)\n this.extend(MarkerClusterer, google.maps.OverlayView);\n this.map_ = map;\n\n /**\n * @type {Array.}\n * @private\n */\n this.markers_ = [];\n\n /**\n * @type {Array.}\n */\n this.clusters_ = [];\n\n this.sizes = [53, 56, 66, 78, 90];\n\n /**\n * @private\n */\n this.styles_ = [];\n\n /**\n * @type {boolean}\n * @private\n */\n this.ready_ = false;\n\n var options = opt_options || {};\n\n /**\n * @type {number}\n * @private\n */\n this.gridSize_ = options['gridSize'] || 60;\n\n /**\n * @private\n */\n this.minClusterSize_ = options['minimumClusterSize'] || 2;\n\n\n /**\n * @type {?number}\n * @private\n */\n this.maxZoom_ = options['maxZoom'] || null;\n\n this.styles_ = options['styles'] || [];\n\n /**\n * @type {string}\n * @private\n */\n this.imagePath_ = options['imagePath'] ||\n this.MARKER_CLUSTER_IMAGE_PATH_;\n\n /**\n * @type {string}\n * @private\n */\n this.imageExtension_ = options['imageExtension'] ||\n this.MARKER_CLUSTER_IMAGE_EXTENSION_;\n\n /**\n * @type {boolean}\n * @private\n */\n this.zoomOnClick_ = true;\n\n if (options['zoomOnClick'] != undefined) {\n this.zoomOnClick_ = options['zoomOnClick'];\n }\n\n /**\n * @type {boolean}\n * @private\n */\n this.averageCenter_ = false;\n\n if (options['averageCenter'] != undefined) {\n this.averageCenter_ = options['averageCenter'];\n }\n\n this.setupStyles_();\n\n this.setMap(map);\n\n /**\n * @type {number}\n * @private\n */\n this.prevZoom_ = this.map_.getZoom();\n\n // Add the map event listeners\n var that = this;\n google.maps.event.addListener(this.map_, 'zoom_changed', function() {\n // Determines map type and prevent illegal zoom levels\n var zoom = that.map_.getZoom();\n var minZoom = that.map_.minZoom || 0;\n var maxZoom = Math.min(that.map_.maxZoom || 100,\n that.map_.mapTypes[that.map_.getMapTypeId()].maxZoom);\n zoom = Math.min(Math.max(zoom,minZoom),maxZoom);\n\n if (that.prevZoom_ != zoom) {\n that.prevZoom_ = zoom;\n that.resetViewport();\n }\n });\n\n google.maps.event.addListener(this.map_, 'idle', function() {\n that.redraw();\n });\n\n // Finally, add the markers\n if (opt_markers && (opt_markers.length || Object.keys(opt_markers).length)) {\n this.addMarkers(opt_markers, false);\n }\n}\n\n\n/**\n * The marker cluster image path.\n *\n * @type {string}\n * @private\n */\nMarkerClusterer.prototype.MARKER_CLUSTER_IMAGE_PATH_ = '../images/m';\n\n\n/**\n * The marker cluster image path.\n *\n * @type {string}\n * @private\n */\nMarkerClusterer.prototype.MARKER_CLUSTER_IMAGE_EXTENSION_ = 'png';\n\n\n/**\n * Extends a objects prototype by anothers.\n *\n * @param {Object} obj1 The object to be extended.\n * @param {Object} obj2 The object to extend with.\n * @return {Object} The new extended object.\n * @ignore\n */\nMarkerClusterer.prototype.extend = function(obj1, obj2) {\n return (function(object) {\n for (var property in object.prototype) {\n this.prototype[property] = object.prototype[property];\n }\n return this;\n }).apply(obj1, [obj2]);\n};\n\n\n/**\n * Implementaion of the interface method.\n * @ignore\n */\nMarkerClusterer.prototype.onAdd = function() {\n this.setReady_(true);\n};\n\n/**\n * Implementaion of the interface method.\n * @ignore\n */\nMarkerClusterer.prototype.draw = function() {};\n\n/**\n * Sets up the styles object.\n *\n * @private\n */\nMarkerClusterer.prototype.setupStyles_ = function() {\n if (this.styles_.length) {\n return;\n }\n\n for (var i = 0, size; size = this.sizes[i]; i++) {\n this.styles_.push({\n url: this.imagePath_ + (i + 1) + '.' + this.imageExtension_,\n height: size,\n width: size\n });\n }\n};\n\n/**\n * Fit the map to the bounds of the markers in the clusterer.\n */\nMarkerClusterer.prototype.fitMapToMarkers = function() {\n var markers = this.getMarkers();\n var bounds = new google.maps.LatLngBounds();\n for (var i = 0, marker; marker = markers[i]; i++) {\n bounds.extend(marker.getPosition());\n }\n\n this.map_.fitBounds(bounds);\n};\n\n\n/**\n * Sets the styles.\n *\n * @param {Object} styles The style to set.\n */\nMarkerClusterer.prototype.setStyles = function(styles) {\n this.styles_ = styles;\n};\n\n\n/**\n * Gets the styles.\n *\n * @return {Object} The styles object.\n */\nMarkerClusterer.prototype.getStyles = function() {\n return this.styles_;\n};\n\n\n/**\n * Whether zoom on click is set.\n *\n * @return {boolean} True if zoomOnClick_ is set.\n */\nMarkerClusterer.prototype.isZoomOnClick = function() {\n return this.zoomOnClick_;\n};\n\n/**\n * Whether average center is set.\n *\n * @return {boolean} True if averageCenter_ is set.\n */\nMarkerClusterer.prototype.isAverageCenter = function() {\n return this.averageCenter_;\n};\n\n\n/**\n * Returns the array of markers in the clusterer.\n *\n * @return {Array.} The markers.\n */\nMarkerClusterer.prototype.getMarkers = function() {\n return this.markers_;\n};\n\n\n/**\n * Returns the number of markers in the clusterer\n *\n * @return {Number} The number of markers.\n */\nMarkerClusterer.prototype.getTotalMarkers = function() {\n return this.markers_.length;\n};\n\n\n/**\n * Sets the max zoom for the clusterer.\n *\n * @param {number} maxZoom The max zoom level.\n */\nMarkerClusterer.prototype.setMaxZoom = function(maxZoom) {\n this.maxZoom_ = maxZoom;\n};\n\n\n/**\n * Gets the max zoom for the clusterer.\n *\n * @return {number} The max zoom level.\n */\nMarkerClusterer.prototype.getMaxZoom = function() {\n return this.maxZoom_;\n};\n\n\n/**\n * The function for calculating the cluster icon image.\n *\n * @param {Array.} markers The markers in the clusterer.\n * @param {number} numStyles The number of styles available.\n * @return {Object} A object properties: 'text' (string) and 'index' (number).\n * @private\n */\nMarkerClusterer.prototype.calculator_ = function(markers, numStyles) {\n var index = 0;\n var count = markers.length;\n var dv = count;\n while (dv !== 0) {\n dv = parseInt(dv / 10, 10);\n index++;\n }\n\n index = Math.min(index, numStyles);\n return {\n text: count,\n index: index\n };\n};\n\n\n/**\n * Set the calculator function.\n *\n * @param {function(Array, number)} calculator The function to set as the\n * calculator. The function should return a object properties:\n * 'text' (string) and 'index' (number).\n *\n */\nMarkerClusterer.prototype.setCalculator = function(calculator) {\n this.calculator_ = calculator;\n};\n\n\n/**\n * Get the calculator function.\n *\n * @return {function(Array, number)} the calculator function.\n */\nMarkerClusterer.prototype.getCalculator = function() {\n return this.calculator_;\n};\n\n\n/**\n * Add an array of markers to the clusterer.\n *\n * @param {Array.} markers The markers to add.\n * @param {boolean=} opt_nodraw Whether to redraw the clusters.\n */\nMarkerClusterer.prototype.addMarkers = function(markers, opt_nodraw) {\n if (markers.length) {\n for (var i = 0, marker; marker = markers[i]; i++) {\n this.pushMarkerTo_(marker);\n }\n } else if (Object.keys(markers).length) {\n for (var marker in markers) {\n this.pushMarkerTo_(markers[marker]);\n }\n }\n if (!opt_nodraw) {\n this.redraw();\n }\n};\n\n\n/**\n * Pushes a marker to the clusterer.\n *\n * @param {google.maps.Marker} marker The marker to add.\n * @private\n */\nMarkerClusterer.prototype.pushMarkerTo_ = function(marker) {\n marker.isAdded = false;\n if (marker['draggable']) {\n // If the marker is draggable add a listener so we update the clusters on\n // the drag end.\n var that = this;\n google.maps.event.addListener(marker, 'dragend', function() {\n marker.isAdded = false;\n that.repaint();\n });\n }\n this.markers_.push(marker);\n};\n\n\n/**\n * Adds a marker to the clusterer and redraws if needed.\n *\n * @param {google.maps.Marker} marker The marker to add.\n * @param {boolean=} opt_nodraw Whether to redraw the clusters.\n */\nMarkerClusterer.prototype.addMarker = function(marker, opt_nodraw) {\n this.pushMarkerTo_(marker);\n if (!opt_nodraw) {\n this.redraw();\n }\n};\n\n\n/**\n * Removes a marker and returns true if removed, false if not\n *\n * @param {google.maps.Marker} marker The marker to remove\n * @return {boolean} Whether the marker was removed or not\n * @private\n */\nMarkerClusterer.prototype.removeMarker_ = function(marker) {\n var index = -1;\n if (this.markers_.indexOf) {\n index = this.markers_.indexOf(marker);\n } else {\n for (var i = 0, m; m = this.markers_[i]; i++) {\n if (m == marker) {\n index = i;\n break;\n }\n }\n }\n\n if (index == -1) {\n // Marker is not in our list of markers.\n return false;\n }\n\n marker.setMap(null);\n\n this.markers_.splice(index, 1);\n\n return true;\n};\n\n\n/**\n * Remove a marker from the cluster.\n *\n * @param {google.maps.Marker} marker The marker to remove.\n * @param {boolean=} opt_nodraw Optional boolean to force no redraw.\n * @return {boolean} True if the marker was removed.\n */\nMarkerClusterer.prototype.removeMarker = function(marker, opt_nodraw) {\n var removed = this.removeMarker_(marker);\n\n if (!opt_nodraw && removed) {\n this.resetViewport();\n this.redraw();\n return true;\n } else {\n return false;\n }\n};\n\n\n/**\n * Removes an array of markers from the cluster.\n *\n * @param {Array.} markers The markers to remove.\n * @param {boolean=} opt_nodraw Optional boolean to force no redraw.\n */\nMarkerClusterer.prototype.removeMarkers = function(markers, opt_nodraw) {\n var removed = false;\n\n for (var i = 0, marker; marker = markers[i]; i++) {\n var r = this.removeMarker_(marker);\n removed = removed || r;\n }\n\n if (!opt_nodraw && removed) {\n this.resetViewport();\n this.redraw();\n return true;\n }\n};\n\n\n/**\n * Sets the clusterer's ready state.\n *\n * @param {boolean} ready The state.\n * @private\n */\nMarkerClusterer.prototype.setReady_ = function(ready) {\n if (!this.ready_) {\n this.ready_ = ready;\n this.createClusters_();\n }\n};\n\n\n/**\n * Returns the number of clusters in the clusterer.\n *\n * @return {number} The number of clusters.\n */\nMarkerClusterer.prototype.getTotalClusters = function() {\n return this.clusters_.length;\n};\n\n\n/**\n * Returns the google map that the clusterer is associated with.\n *\n * @return {google.maps.Map} The map.\n */\nMarkerClusterer.prototype.getMap = function() {\n return this.map_;\n};\n\n\n/**\n * Sets the google map that the clusterer is associated with.\n *\n * @param {google.maps.Map} map The map.\n */\nMarkerClusterer.prototype.setMap = function(map) {\n this.map_ = map;\n};\n\n\n/**\n * Returns the size of the grid.\n *\n * @return {number} The grid size.\n */\nMarkerClusterer.prototype.getGridSize = function() {\n return this.gridSize_;\n};\n\n\n/**\n * Sets the size of the grid.\n *\n * @param {number} size The grid size.\n */\nMarkerClusterer.prototype.setGridSize = function(size) {\n this.gridSize_ = size;\n};\n\n\n/**\n * Returns the min cluster size.\n *\n * @return {number} The grid size.\n */\nMarkerClusterer.prototype.getMinClusterSize = function() {\n return this.minClusterSize_;\n};\n\n/**\n * Sets the min cluster size.\n *\n * @param {number} size The grid size.\n */\nMarkerClusterer.prototype.setMinClusterSize = function(size) {\n this.minClusterSize_ = size;\n};\n\n\n/**\n * Extends a bounds object by the grid size.\n *\n * @param {google.maps.LatLngBounds} bounds The bounds to extend.\n * @return {google.maps.LatLngBounds} The extended bounds.\n */\nMarkerClusterer.prototype.getExtendedBounds = function(bounds) {\n var projection = this.getProjection();\n\n // Turn the bounds into latlng.\n var tr = new google.maps.LatLng(bounds.getNorthEast().lat(),\n bounds.getNorthEast().lng());\n var bl = new google.maps.LatLng(bounds.getSouthWest().lat(),\n bounds.getSouthWest().lng());\n\n // Convert the points to pixels and the extend out by the grid size.\n var trPix = projection.fromLatLngToDivPixel(tr);\n trPix.x += this.gridSize_;\n trPix.y -= this.gridSize_;\n\n var blPix = projection.fromLatLngToDivPixel(bl);\n blPix.x -= this.gridSize_;\n blPix.y += this.gridSize_;\n\n // Convert the pixel points back to LatLng\n var ne = projection.fromDivPixelToLatLng(trPix);\n var sw = projection.fromDivPixelToLatLng(blPix);\n\n // Extend the bounds to contain the new bounds.\n bounds.extend(ne);\n bounds.extend(sw);\n\n return bounds;\n};\n\n\n/**\n * Determins if a marker is contained in a bounds.\n *\n * @param {google.maps.Marker} marker The marker to check.\n * @param {google.maps.LatLngBounds} bounds The bounds to check against.\n * @return {boolean} True if the marker is in the bounds.\n * @private\n */\nMarkerClusterer.prototype.isMarkerInBounds_ = function(marker, bounds) {\n return bounds.contains(marker.getPosition());\n};\n\n\n/**\n * Clears all clusters and markers from the clusterer.\n */\nMarkerClusterer.prototype.clearMarkers = function() {\n this.resetViewport(true);\n\n // Set the markers a empty array.\n this.markers_ = [];\n};\n\n\n/**\n * Clears all existing clusters and recreates them.\n * @param {boolean} opt_hide To also hide the marker.\n */\nMarkerClusterer.prototype.resetViewport = function(opt_hide) {\n // Remove all the clusters\n for (var i = 0, cluster; cluster = this.clusters_[i]; i++) {\n cluster.remove();\n }\n\n // Reset the markers to not be added and to be invisible.\n for (var i = 0, marker; marker = this.markers_[i]; i++) {\n marker.isAdded = false;\n if (opt_hide) {\n marker.setMap(null);\n }\n }\n\n this.clusters_ = [];\n};\n\n/**\n *\n */\nMarkerClusterer.prototype.repaint = function() {\n var oldClusters = this.clusters_.slice();\n this.clusters_.length = 0;\n this.resetViewport();\n this.redraw();\n\n // Remove the old clusters.\n // Do it in a timeout so the other clusters have been drawn first.\n window.setTimeout(function() {\n for (var i = 0, cluster; cluster = oldClusters[i]; i++) {\n cluster.remove();\n }\n }, 0);\n};\n\n\n/**\n * Redraws the clusters.\n */\nMarkerClusterer.prototype.redraw = function() {\n this.createClusters_();\n};\n\n\n/**\n * Calculates the distance between two latlng locations in km.\n * @see http://www.movable-type.co.uk/scripts/latlong.html\n *\n * @param {google.maps.LatLng} p1 The first lat lng point.\n * @param {google.maps.LatLng} p2 The second lat lng point.\n * @return {number} The distance between the two points in km.\n * @private\n*/\nMarkerClusterer.prototype.distanceBetweenPoints_ = function(p1, p2) {\n if (!p1 || !p2) {\n return 0;\n }\n\n var R = 6371; // Radius of the Earth in km\n var dLat = (p2.lat() - p1.lat()) * Math.PI / 180;\n var dLon = (p2.lng() - p1.lng()) * Math.PI / 180;\n var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +\n Math.cos(p1.lat() * Math.PI / 180) * Math.cos(p2.lat() * Math.PI / 180) *\n Math.sin(dLon / 2) * Math.sin(dLon / 2);\n var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n var d = R * c;\n return d;\n};\n\n\n/**\n * Add a marker to a cluster, or creates a new cluster.\n *\n * @param {google.maps.Marker} marker The marker to add.\n * @private\n */\nMarkerClusterer.prototype.addToClosestCluster_ = function(marker) {\n var distance = 40000; // Some large number\n var clusterToAddTo = null;\n var pos = marker.getPosition();\n for (var i = 0, cluster; cluster = this.clusters_[i]; i++) {\n var center = cluster.getCenter();\n if (center) {\n var d = this.distanceBetweenPoints_(center, marker.getPosition());\n if (d < distance) {\n distance = d;\n clusterToAddTo = cluster;\n }\n }\n }\n\n if (clusterToAddTo && clusterToAddTo.isMarkerInClusterBounds(marker)) {\n clusterToAddTo.addMarker(marker);\n } else {\n var cluster = new Cluster(this);\n cluster.addMarker(marker);\n this.clusters_.push(cluster);\n }\n};\n\n\n/**\n * Creates the clusters.\n *\n * @private\n */\nMarkerClusterer.prototype.createClusters_ = function() {\n if (!this.ready_) {\n return;\n }\n\n // Get our current map view bounds.\n // Create a new bounds object so we don't affect the map.\n var mapBounds = new google.maps.LatLngBounds(this.map_.getBounds().getSouthWest(),\n this.map_.getBounds().getNorthEast());\n var bounds = this.getExtendedBounds(mapBounds);\n\n for (var i = 0, marker; marker = this.markers_[i]; i++) {\n if (!marker.isAdded && this.isMarkerInBounds_(marker, bounds)) {\n this.addToClosestCluster_(marker);\n }\n }\n};\n\n\n/**\n * A cluster that contains markers.\n *\n * @param {MarkerClusterer} markerClusterer The markerclusterer that this\n * cluster is associated with.\n * @constructor\n * @ignore\n */\nfunction Cluster(markerClusterer) {\n this.markerClusterer_ = markerClusterer;\n this.map_ = markerClusterer.getMap();\n this.gridSize_ = markerClusterer.getGridSize();\n this.minClusterSize_ = markerClusterer.getMinClusterSize();\n this.averageCenter_ = markerClusterer.isAverageCenter();\n this.center_ = null;\n this.markers_ = [];\n this.bounds_ = null;\n this.clusterIcon_ = new ClusterIcon(this, markerClusterer.getStyles(),\n markerClusterer.getGridSize());\n}\n\n/**\n * Determins if a marker is already added to the cluster.\n *\n * @param {google.maps.Marker} marker The marker to check.\n * @return {boolean} True if the marker is already added.\n */\nCluster.prototype.isMarkerAlreadyAdded = function(marker) {\n if (this.markers_.indexOf) {\n return this.markers_.indexOf(marker) != -1;\n } else {\n for (var i = 0, m; m = this.markers_[i]; i++) {\n if (m == marker) {\n return true;\n }\n }\n }\n return false;\n};\n\n\n/**\n * Add a marker the cluster.\n *\n * @param {google.maps.Marker} marker The marker to add.\n * @return {boolean} True if the marker was added.\n */\nCluster.prototype.addMarker = function(marker) {\n if (this.isMarkerAlreadyAdded(marker)) {\n return false;\n }\n\n if (!this.center_) {\n this.center_ = marker.getPosition();\n this.calculateBounds_();\n } else {\n if (this.averageCenter_) {\n var l = this.markers_.length + 1;\n var lat = (this.center_.lat() * (l-1) + marker.getPosition().lat()) / l;\n var lng = (this.center_.lng() * (l-1) + marker.getPosition().lng()) / l;\n this.center_ = new google.maps.LatLng(lat, lng);\n this.calculateBounds_();\n }\n }\n\n marker.isAdded = true;\n this.markers_.push(marker);\n\n var len = this.markers_.length;\n if (len < this.minClusterSize_ && marker.getMap() != this.map_) {\n // Min cluster size not reached so show the marker.\n marker.setMap(this.map_);\n }\n\n if (len == this.minClusterSize_) {\n // Hide the markers that were showing.\n for (var i = 0; i < len; i++) {\n this.markers_[i].setMap(null);\n }\n }\n\n if (len >= this.minClusterSize_) {\n marker.setMap(null);\n }\n\n this.updateIcon();\n return true;\n};\n\n\n/**\n * Returns the marker clusterer that the cluster is associated with.\n *\n * @return {MarkerClusterer} The associated marker clusterer.\n */\nCluster.prototype.getMarkerClusterer = function() {\n return this.markerClusterer_;\n};\n\n\n/**\n * Returns the bounds of the cluster.\n *\n * @return {google.maps.LatLngBounds} the cluster bounds.\n */\nCluster.prototype.getBounds = function() {\n var bounds = new google.maps.LatLngBounds(this.center_, this.center_);\n var markers = this.getMarkers();\n for (var i = 0, marker; marker = markers[i]; i++) {\n bounds.extend(marker.getPosition());\n }\n return bounds;\n};\n\n\n/**\n * Removes the cluster\n */\nCluster.prototype.remove = function() {\n this.clusterIcon_.remove();\n this.markers_.length = 0;\n delete this.markers_;\n};\n\n\n/**\n * Returns the center of the cluster.\n *\n * @return {number} The cluster center.\n */\nCluster.prototype.getSize = function() {\n return this.markers_.length;\n};\n\n\n/**\n * Returns the center of the cluster.\n *\n * @return {Array.} The cluster center.\n */\nCluster.prototype.getMarkers = function() {\n return this.markers_;\n};\n\n\n/**\n * Returns the center of the cluster.\n *\n * @return {google.maps.LatLng} The cluster center.\n */\nCluster.prototype.getCenter = function() {\n return this.center_;\n};\n\n\n/**\n * Calculated the extended bounds of the cluster with the grid.\n *\n * @private\n */\nCluster.prototype.calculateBounds_ = function() {\n var bounds = new google.maps.LatLngBounds(this.center_, this.center_);\n this.bounds_ = this.markerClusterer_.getExtendedBounds(bounds);\n};\n\n\n/**\n * Determines if a marker lies in the clusters bounds.\n *\n * @param {google.maps.Marker} marker The marker to check.\n * @return {boolean} True if the marker lies in the bounds.\n */\nCluster.prototype.isMarkerInClusterBounds = function(marker) {\n return this.bounds_.contains(marker.getPosition());\n};\n\n\n/**\n * Returns the map that the cluster is associated with.\n *\n * @return {google.maps.Map} The map.\n */\nCluster.prototype.getMap = function() {\n return this.map_;\n};\n\n\n/**\n * Updates the cluster icon\n */\nCluster.prototype.updateIcon = function() {\n var zoom = this.map_.getZoom();\n var mz = this.markerClusterer_.getMaxZoom();\n\n if (mz && zoom > mz) {\n // The zoom is greater than our max zoom so show all the markers in cluster.\n for (var i = 0, marker; marker = this.markers_[i]; i++) {\n marker.setMap(this.map_);\n }\n return;\n }\n\n if (this.markers_.length < this.minClusterSize_) {\n // Min cluster size not yet reached.\n this.clusterIcon_.hide();\n return;\n }\n\n var numStyles = this.markerClusterer_.getStyles().length;\n var sums = this.markerClusterer_.getCalculator()(this.markers_, numStyles);\n this.clusterIcon_.setCenter(this.center_);\n this.clusterIcon_.setSums(sums);\n this.clusterIcon_.show();\n};\n\n\n/**\n * A cluster icon\n *\n * @param {Cluster} cluster The cluster to be associated with.\n * @param {Object} styles An object that has style properties:\n * 'url': (string) The image url.\n * 'height': (number) The image height.\n * 'width': (number) The image width.\n * 'anchor': (Array) The anchor position of the label text.\n * 'textColor': (string) The text color.\n * 'textSize': (number) The text size.\n * 'backgroundPosition: (string) The background postition x, y.\n * @param {number=} opt_padding Optional padding to apply to the cluster icon.\n * @constructor\n * @extends google.maps.OverlayView\n * @ignore\n */\nfunction ClusterIcon(cluster, styles, opt_padding) {\n cluster.getMarkerClusterer().extend(ClusterIcon, google.maps.OverlayView);\n\n this.styles_ = styles;\n this.padding_ = opt_padding || 0;\n this.cluster_ = cluster;\n this.center_ = null;\n this.map_ = cluster.getMap();\n this.div_ = null;\n this.sums_ = null;\n this.visible_ = false;\n\n this.setMap(this.map_);\n}\n\n\n/**\n * Triggers the clusterclick event and zoom's if the option is set.\n */\nClusterIcon.prototype.triggerClusterClick = function() {\n var markerClusterer = this.cluster_.getMarkerClusterer();\n\n // Trigger the clusterclick event.\n google.maps.event.trigger(markerClusterer, 'clusterclick', this.cluster_);\n\n if (markerClusterer.isZoomOnClick()) {\n // Zoom into the cluster.\n this.map_.fitBounds(this.cluster_.getBounds());\n }\n};\n\n\n/**\n * Adding the cluster icon to the dom.\n * @ignore\n */\nClusterIcon.prototype.onAdd = function() {\n this.div_ = document.createElement('DIV');\n if (this.visible_) {\n var pos = this.getPosFromLatLng_(this.center_);\n this.div_.style.cssText = this.createCss(pos);\n this.div_.innerHTML = this.sums_.text;\n }\n\n var panes = this.getPanes();\n panes.overlayMouseTarget.appendChild(this.div_);\n\n var that = this;\n google.maps.event.addDomListener(this.div_, 'click', function() {\n that.triggerClusterClick();\n });\n};\n\n\n/**\n * Returns the position to place the div dending on the latlng.\n *\n * @param {google.maps.LatLng} latlng The position in latlng.\n * @return {google.maps.Point} The position in pixels.\n * @private\n */\nClusterIcon.prototype.getPosFromLatLng_ = function(latlng) {\n var pos = this.getProjection().fromLatLngToDivPixel(latlng);\n pos.x -= parseInt(this.width_ / 2, 10);\n pos.y -= parseInt(this.height_ / 2, 10);\n return pos;\n};\n\n\n/**\n * Draw the icon.\n * @ignore\n */\nClusterIcon.prototype.draw = function() {\n if (this.visible_) {\n var pos = this.getPosFromLatLng_(this.center_);\n this.div_.style.top = pos.y + 'px';\n this.div_.style.left = pos.x + 'px';\n }\n};\n\n\n/**\n * Hide the icon.\n */\nClusterIcon.prototype.hide = function() {\n if (this.div_) {\n this.div_.style.display = 'none';\n }\n this.visible_ = false;\n};\n\n\n/**\n * Position and show the icon.\n */\nClusterIcon.prototype.show = function() {\n if (this.div_) {\n var pos = this.getPosFromLatLng_(this.center_);\n this.div_.style.cssText = this.createCss(pos);\n this.div_.style.display = '';\n }\n this.visible_ = true;\n};\n\n\n/**\n * Remove the icon from the map\n */\nClusterIcon.prototype.remove = function() {\n this.setMap(null);\n};\n\n\n/**\n * Implementation of the onRemove interface.\n * @ignore\n */\nClusterIcon.prototype.onRemove = function() {\n if (this.div_ && this.div_.parentNode) {\n this.hide();\n this.div_.parentNode.removeChild(this.div_);\n this.div_ = null;\n }\n};\n\n\n/**\n * Set the sums of the icon.\n *\n * @param {Object} sums The sums containing:\n * 'text': (string) The text to display in the icon.\n * 'index': (number) The style index of the icon.\n */\nClusterIcon.prototype.setSums = function(sums) {\n this.sums_ = sums;\n this.text_ = sums.text;\n this.index_ = sums.index;\n if (this.div_) {\n this.div_.innerHTML = sums.text;\n }\n\n this.useStyle();\n};\n\n\n/**\n * Sets the icon to the the styles.\n */\nClusterIcon.prototype.useStyle = function() {\n var index = Math.max(0, this.sums_.index - 1);\n index = Math.min(this.styles_.length - 1, index);\n var style = this.styles_[index];\n this.url_ = style['url'];\n this.height_ = style['height'];\n this.width_ = style['width'];\n this.textColor_ = style['textColor'];\n this.anchor_ = style['anchor'];\n this.textSize_ = style['textSize'];\n this.backgroundPosition_ = style['backgroundPosition'];\n};\n\n\n/**\n * Sets the center of the icon.\n *\n * @param {google.maps.LatLng} center The latlng to set as the center.\n */\nClusterIcon.prototype.setCenter = function(center) {\n this.center_ = center;\n};\n\n\n/**\n * Create the css text based on the position of the icon.\n *\n * @param {google.maps.Point} pos The position.\n * @return {string} The css style text.\n */\nClusterIcon.prototype.createCss = function(pos) {\n var style = [];\n style.push('background-image:url(' + this.url_ + ');');\n var backgroundPosition = this.backgroundPosition_ ? this.backgroundPosition_ : '0 0';\n style.push('background-position:' + backgroundPosition + ';');\n\n if (typeof this.anchor_ === 'object') {\n if (typeof this.anchor_[0] === 'number' && this.anchor_[0] > 0 &&\n this.anchor_[0] < this.height_) {\n style.push('height:' + (this.height_ - this.anchor_[0]) +\n 'px; padding-top:' + this.anchor_[0] + 'px;');\n } else {\n style.push('height:' + this.height_ + 'px; line-height:' + this.height_ +\n 'px;');\n }\n if (typeof this.anchor_[1] === 'number' && this.anchor_[1] > 0 &&\n this.anchor_[1] < this.width_) {\n style.push('width:' + (this.width_ - this.anchor_[1]) +\n 'px; padding-left:' + this.anchor_[1] + 'px;');\n } else {\n style.push('width:' + this.width_ + 'px; text-align:center;');\n }\n } else {\n style.push('height:' + this.height_ + 'px; line-height:' +\n this.height_ + 'px; width:' + this.width_ + 'px; text-align:center;');\n }\n\n var txtColor = this.textColor_ ? this.textColor_ : 'black';\n var txtSize = this.textSize_ ? this.textSize_ : 11;\n\n style.push('cursor:pointer; top:' + pos.y + 'px; left:' +\n pos.x + 'px; color:' + txtColor + '; position:absolute; font-size:' +\n txtSize + 'px; font-family:Arial,sans-serif; font-weight:bold');\n return style.join('');\n};\n","/*!\r\n * Stickyfill – `position: sticky` polyfill\r\n * v. 2.1.0 | https://github.com/wilddeer/stickyfill\r\n * MIT License\r\n */\r\n\r\n;(function(window, document) {\r\n 'use strict';\r\n \r\n /*\r\n * 1. Check if the browser supports `position: sticky` natively or is too old to run the polyfill.\r\n * If either of these is the case set `seppuku` flag. It will be checked later to disable key features\r\n * of the polyfill, but the API will remain functional to avoid breaking things.\r\n */\r\n \r\n var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\r\n \r\n function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\r\n \r\n var seppuku = false;\r\n \r\n var isWindowDefined = typeof window !== 'undefined';\r\n \r\n // The polyfill can’t function properly without `window` or `window.getComputedStyle`.\r\n if (!isWindowDefined || !window.getComputedStyle) seppuku = true;\r\n // Dont’t get in a way if the browser supports `position: sticky` natively.\r\n else {\r\n (function () {\r\n var testNode = document.createElement('div');\r\n \r\n if (['', '-webkit-', '-moz-', '-ms-'].some(function (prefix) {\r\n try {\r\n testNode.style.position = prefix + 'sticky';\r\n } catch (e) {}\r\n \r\n return testNode.style.position != '';\r\n })) seppuku = true;\r\n })();\r\n }\r\n \r\n /*\r\n * 2. “Global” vars used across the polyfill\r\n */\r\n var isInitialized = false;\r\n \r\n // Check if Shadow Root constructor exists to make further checks simpler\r\n var shadowRootExists = typeof ShadowRoot !== 'undefined';\r\n \r\n // Last saved scroll position\r\n var scroll = {\r\n top: null,\r\n left: null\r\n };\r\n \r\n // Array of created Sticky instances\r\n var stickies = [];\r\n \r\n /*\r\n * 3. Utility functions\r\n */\r\n function extend(targetObj, sourceObject) {\r\n for (var key in sourceObject) {\r\n if (sourceObject.hasOwnProperty(key)) {\r\n targetObj[key] = sourceObject[key];\r\n }\r\n }\r\n }\r\n \r\n function parseNumeric(val) {\r\n return parseFloat(val) || 0;\r\n }\r\n \r\n function getDocOffsetTop(node) {\r\n var docOffsetTop = 0;\r\n \r\n while (node) {\r\n docOffsetTop += node.offsetTop;\r\n node = node.offsetParent;\r\n }\r\n \r\n return docOffsetTop;\r\n }\r\n \r\n /*\r\n * 4. Sticky class\r\n */\r\n \r\n var Sticky = function () {\r\n function Sticky(node) {\r\n _classCallCheck(this, Sticky);\r\n \r\n if (!(node instanceof HTMLElement)) throw new Error('First argument must be HTMLElement');\r\n if (stickies.some(function (sticky) {\r\n return sticky._node === node;\r\n })) throw new Error('Stickyfill is already applied to this node');\r\n \r\n this._node = node;\r\n this._stickyMode = null;\r\n this._active = false;\r\n \r\n stickies.push(this);\r\n \r\n this.refresh();\r\n }\r\n \r\n _createClass(Sticky, [{\r\n key: 'refresh',\r\n value: function refresh() {\r\n if (seppuku || this._removed) return;\r\n if (this._active) this._deactivate();\r\n \r\n var node = this._node;\r\n \r\n /*\r\n * 1. Save node computed props\r\n */\r\n var nodeComputedStyle = getComputedStyle(node);\r\n var nodeComputedProps = {\r\n position: nodeComputedStyle.position,\r\n top: nodeComputedStyle.top,\r\n display: nodeComputedStyle.display,\r\n marginTop: nodeComputedStyle.marginTop,\r\n marginBottom: nodeComputedStyle.marginBottom,\r\n marginLeft: nodeComputedStyle.marginLeft,\r\n marginRight: nodeComputedStyle.marginRight,\r\n cssFloat: nodeComputedStyle.cssFloat\r\n };\r\n \r\n /*\r\n * 2. Check if the node can be activated\r\n */\r\n if (isNaN(parseFloat(nodeComputedProps.top)) || nodeComputedProps.display == 'table-cell' || nodeComputedProps.display == 'none') return;\r\n \r\n this._active = true;\r\n \r\n /*\r\n * 3. Check if the current node position is `sticky`. If it is, it means that the browser supports sticky positioning,\r\n * but the polyfill was force-enabled. We set the node’s position to `static` before continuing, so that the node\r\n * is in it’s initial position when we gather its params.\r\n */\r\n var originalPosition = node.style.position;\r\n if (nodeComputedStyle.position == 'sticky' || nodeComputedStyle.position == '-webkit-sticky') node.style.position = 'static';\r\n \r\n /*\r\n * 4. Get necessary node parameters\r\n */\r\n var referenceNode = node.parentNode;\r\n var parentNode = shadowRootExists && referenceNode instanceof ShadowRoot ? referenceNode.host : referenceNode;\r\n var nodeWinOffset = node.getBoundingClientRect();\r\n var parentWinOffset = parentNode.getBoundingClientRect();\r\n var parentComputedStyle = getComputedStyle(parentNode);\r\n \r\n this._parent = {\r\n node: parentNode,\r\n styles: {\r\n position: parentNode.style.position\r\n },\r\n offsetHeight: parentNode.offsetHeight\r\n };\r\n this._offsetToWindow = {\r\n left: nodeWinOffset.left,\r\n right: document.documentElement.clientWidth - nodeWinOffset.right\r\n };\r\n this._offsetToParent = {\r\n top: nodeWinOffset.top - parentWinOffset.top - parseNumeric(parentComputedStyle.borderTopWidth),\r\n left: nodeWinOffset.left - parentWinOffset.left - parseNumeric(parentComputedStyle.borderLeftWidth),\r\n right: -nodeWinOffset.right + parentWinOffset.right - parseNumeric(parentComputedStyle.borderRightWidth)\r\n };\r\n this._styles = {\r\n position: originalPosition,\r\n top: node.style.top,\r\n bottom: node.style.bottom,\r\n left: node.style.left,\r\n right: node.style.right,\r\n width: node.style.width,\r\n marginTop: node.style.marginTop,\r\n marginLeft: node.style.marginLeft,\r\n marginRight: node.style.marginRight\r\n };\r\n \r\n var nodeTopValue = parseNumeric(nodeComputedProps.top);\r\n this._limits = {\r\n start: nodeWinOffset.top + window.pageYOffset - nodeTopValue,\r\n end: parentWinOffset.top + window.pageYOffset + parentNode.offsetHeight - parseNumeric(parentComputedStyle.borderBottomWidth) - node.offsetHeight - nodeTopValue - parseNumeric(nodeComputedProps.marginBottom)\r\n };\r\n \r\n /*\r\n * 5. Ensure that the node will be positioned relatively to the parent node\r\n */\r\n var parentPosition = parentComputedStyle.position;\r\n \r\n if (parentPosition != 'absolute' && parentPosition != 'relative') {\r\n parentNode.style.position = 'relative';\r\n }\r\n \r\n /*\r\n * 6. Recalc node position.\r\n * It’s important to do this before clone injection to avoid scrolling bug in Chrome.\r\n */\r\n this._recalcPosition();\r\n \r\n /*\r\n * 7. Create a clone\r\n */\r\n var clone = this._clone = {};\r\n clone.node = document.createElement('div');\r\n \r\n // Apply styles to the clone\r\n extend(clone.node.style, {\r\n width: nodeWinOffset.right - nodeWinOffset.left + 'px',\r\n height: nodeWinOffset.bottom - nodeWinOffset.top + 'px',\r\n marginTop: nodeComputedProps.marginTop,\r\n marginBottom: nodeComputedProps.marginBottom,\r\n marginLeft: nodeComputedProps.marginLeft,\r\n marginRight: nodeComputedProps.marginRight,\r\n cssFloat: nodeComputedProps.cssFloat,\r\n padding: 0,\r\n border: 0,\r\n borderSpacing: 0,\r\n fontSize: '1em',\r\n position: 'static'\r\n });\r\n \r\n referenceNode.insertBefore(clone.node, node);\r\n clone.docOffsetTop = getDocOffsetTop(clone.node);\r\n }\r\n }, {\r\n key: '_recalcPosition',\r\n value: function _recalcPosition() {\r\n if (!this._active || this._removed) return;\r\n \r\n var stickyMode = scroll.top <= this._limits.start ? 'start' : scroll.top >= this._limits.end ? 'end' : 'middle';\r\n \r\n if (this._stickyMode == stickyMode) return;\r\n \r\n switch (stickyMode) {\r\n case 'start':\r\n extend(this._node.style, {\r\n position: 'absolute',\r\n left: this._offsetToParent.left + 'px',\r\n right: this._offsetToParent.right + 'px',\r\n top: this._offsetToParent.top + 'px',\r\n bottom: 'auto',\r\n width: 'auto',\r\n marginLeft: 0,\r\n marginRight: 0,\r\n marginTop: 0\r\n });\r\n break;\r\n \r\n case 'middle':\r\n extend(this._node.style, {\r\n position: 'fixed',\r\n left: this._offsetToWindow.left + 'px',\r\n right: this._offsetToWindow.right + 'px',\r\n top: this._styles.top,\r\n bottom: 'auto',\r\n width: 'auto',\r\n marginLeft: 0,\r\n marginRight: 0,\r\n marginTop: 0\r\n });\r\n break;\r\n \r\n case 'end':\r\n extend(this._node.style, {\r\n position: 'absolute',\r\n left: this._offsetToParent.left + 'px',\r\n right: this._offsetToParent.right + 'px',\r\n top: 'auto',\r\n bottom: 0,\r\n width: 'auto',\r\n marginLeft: 0,\r\n marginRight: 0\r\n });\r\n break;\r\n }\r\n \r\n this._stickyMode = stickyMode;\r\n }\r\n }, {\r\n key: '_fastCheck',\r\n value: function _fastCheck() {\r\n if (!this._active || this._removed) return;\r\n \r\n if (Math.abs(getDocOffsetTop(this._clone.node) - this._clone.docOffsetTop) > 1 || Math.abs(this._parent.node.offsetHeight - this._parent.offsetHeight) > 1) this.refresh();\r\n }\r\n }, {\r\n key: '_deactivate',\r\n value: function _deactivate() {\r\n var _this = this;\r\n \r\n if (!this._active || this._removed) return;\r\n \r\n this._clone.node.parentNode.removeChild(this._clone.node);\r\n delete this._clone;\r\n \r\n extend(this._node.style, this._styles);\r\n delete this._styles;\r\n \r\n // Check whether element’s parent node is used by other stickies.\r\n // If not, restore parent node’s styles.\r\n if (!stickies.some(function (sticky) {\r\n return sticky !== _this && sticky._parent && sticky._parent.node === _this._parent.node;\r\n })) {\r\n extend(this._parent.node.style, this._parent.styles);\r\n }\r\n delete this._parent;\r\n \r\n this._stickyMode = null;\r\n this._active = false;\r\n \r\n delete this._offsetToWindow;\r\n delete this._offsetToParent;\r\n delete this._limits;\r\n }\r\n }, {\r\n key: 'remove',\r\n value: function remove() {\r\n var _this2 = this;\r\n \r\n this._deactivate();\r\n \r\n stickies.some(function (sticky, index) {\r\n if (sticky._node === _this2._node) {\r\n stickies.splice(index, 1);\r\n return true;\r\n }\r\n });\r\n \r\n this._removed = true;\r\n }\r\n }]);\r\n \r\n return Sticky;\r\n }();\r\n \r\n /*\r\n * 5. Stickyfill API\r\n */\r\n \r\n \r\n var Stickyfill = {\r\n stickies: stickies,\r\n Sticky: Sticky,\r\n \r\n forceSticky: function forceSticky() {\r\n seppuku = false;\r\n init();\r\n \r\n this.refreshAll();\r\n },\r\n addOne: function addOne(node) {\r\n // Check whether it’s a node\r\n if (!(node instanceof HTMLElement)) {\r\n // Maybe it’s a node list of some sort?\r\n // Take first node from the list then\r\n if (node.length && node[0]) node = node[0];else return;\r\n }\r\n \r\n // Check if Stickyfill is already applied to the node\r\n // and return existing sticky\r\n for (var i = 0; i < stickies.length; i++) {\r\n if (stickies[i]._node === node) return stickies[i];\r\n }\r\n \r\n // Create and return new sticky\r\n return new Sticky(node);\r\n },\r\n add: function add(nodeList) {\r\n // If it’s a node make an array of one node\r\n if (nodeList instanceof HTMLElement) nodeList = [nodeList];\r\n // Check if the argument is an iterable of some sort\r\n if (!nodeList.length) return;\r\n \r\n // Add every element as a sticky and return an array of created Sticky instances\r\n var addedStickies = [];\r\n \r\n var _loop = function _loop(i) {\r\n var node = nodeList[i];\r\n \r\n // If it’s not an HTMLElement – create an empty element to preserve 1-to-1\r\n // correlation with input list\r\n if (!(node instanceof HTMLElement)) {\r\n addedStickies.push(void 0);\r\n return 'continue';\r\n }\r\n \r\n // If Stickyfill is already applied to the node\r\n // add existing sticky\r\n if (stickies.some(function (sticky) {\r\n if (sticky._node === node) {\r\n addedStickies.push(sticky);\r\n return true;\r\n }\r\n })) return 'continue';\r\n \r\n // Create and add new sticky\r\n addedStickies.push(new Sticky(node));\r\n };\r\n \r\n for (var i = 0; i < nodeList.length; i++) {\r\n var _ret2 = _loop(i);\r\n \r\n if (_ret2 === 'continue') continue;\r\n }\r\n \r\n return addedStickies;\r\n },\r\n refreshAll: function refreshAll() {\r\n stickies.forEach(function (sticky) {\r\n return sticky.refresh();\r\n });\r\n },\r\n removeOne: function removeOne(node) {\r\n // Check whether it’s a node\r\n if (!(node instanceof HTMLElement)) {\r\n // Maybe it’s a node list of some sort?\r\n // Take first node from the list then\r\n if (node.length && node[0]) node = node[0];else return;\r\n }\r\n \r\n // Remove the stickies bound to the nodes in the list\r\n stickies.some(function (sticky) {\r\n if (sticky._node === node) {\r\n sticky.remove();\r\n return true;\r\n }\r\n });\r\n },\r\n remove: function remove(nodeList) {\r\n // If it’s a node make an array of one node\r\n if (nodeList instanceof HTMLElement) nodeList = [nodeList];\r\n // Check if the argument is an iterable of some sort\r\n if (!nodeList.length) return;\r\n \r\n // Remove the stickies bound to the nodes in the list\r\n \r\n var _loop2 = function _loop2(i) {\r\n var node = nodeList[i];\r\n \r\n stickies.some(function (sticky) {\r\n if (sticky._node === node) {\r\n sticky.remove();\r\n return true;\r\n }\r\n });\r\n };\r\n \r\n for (var i = 0; i < nodeList.length; i++) {\r\n _loop2(i);\r\n }\r\n },\r\n removeAll: function removeAll() {\r\n while (stickies.length) {\r\n stickies[0].remove();\r\n }\r\n }\r\n };\r\n \r\n /*\r\n * 6. Setup events (unless the polyfill was disabled)\r\n */\r\n function init() {\r\n if (isInitialized) {\r\n return;\r\n }\r\n \r\n isInitialized = true;\r\n \r\n // Watch for scroll position changes and trigger recalc/refresh if needed\r\n function checkScroll() {\r\n if (window.pageXOffset != scroll.left) {\r\n scroll.top = window.pageYOffset;\r\n scroll.left = window.pageXOffset;\r\n \r\n Stickyfill.refreshAll();\r\n } else if (window.pageYOffset != scroll.top) {\r\n scroll.top = window.pageYOffset;\r\n scroll.left = window.pageXOffset;\r\n \r\n // recalc position for all stickies\r\n stickies.forEach(function (sticky) {\r\n return sticky._recalcPosition();\r\n });\r\n }\r\n }\r\n \r\n checkScroll();\r\n window.addEventListener('scroll', checkScroll);\r\n \r\n // Watch for window resizes and device orientation changes and trigger refresh\r\n window.addEventListener('resize', Stickyfill.refreshAll);\r\n window.addEventListener('orientationchange', Stickyfill.refreshAll);\r\n \r\n //Fast dirty check for layout changes every 500ms\r\n var fastCheckTimer = void 0;\r\n \r\n function startFastCheckTimer() {\r\n fastCheckTimer = setInterval(function () {\r\n stickies.forEach(function (sticky) {\r\n return sticky._fastCheck();\r\n });\r\n }, 500);\r\n }\r\n \r\n function stopFastCheckTimer() {\r\n clearInterval(fastCheckTimer);\r\n }\r\n \r\n var docHiddenKey = void 0;\r\n var visibilityChangeEventName = void 0;\r\n \r\n if ('hidden' in document) {\r\n docHiddenKey = 'hidden';\r\n visibilityChangeEventName = 'visibilitychange';\r\n } else if ('webkitHidden' in document) {\r\n docHiddenKey = 'webkitHidden';\r\n visibilityChangeEventName = 'webkitvisibilitychange';\r\n }\r\n \r\n if (visibilityChangeEventName) {\r\n if (!document[docHiddenKey]) startFastCheckTimer();\r\n \r\n document.addEventListener(visibilityChangeEventName, function () {\r\n if (document[docHiddenKey]) {\r\n stopFastCheckTimer();\r\n } else {\r\n startFastCheckTimer();\r\n }\r\n });\r\n } else startFastCheckTimer();\r\n }\r\n \r\n if (!seppuku) init();\r\n \r\n /*\r\n * 7. Expose Stickyfill\r\n */\r\n if (typeof module != 'undefined' && module.exports) {\r\n module.exports = Stickyfill;\r\n } else if (isWindowDefined) {\r\n window.Stickyfill = Stickyfill;\r\n }\r\n \r\n})(window, document);"]}