pyk 0.2.6 → 0.2.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. checksums.yaml +8 -8
  2. data/app/assets/javascripts/lib/chardinjs.min.js +2 -0
  3. data/app/assets/javascripts/lib/crossfilter.js +1383 -1
  4. data/app/assets/javascripts/lib/{d3.js → d3.v3.js} +0 -0
  5. data/app/assets/javascripts/lib/dc.js +3492 -757
  6. data/app/assets/javascripts/lib/jquery.gridster.js +2 -3621
  7. data/app/assets/javascripts/lib/markermanager.js +2 -980
  8. data/app/assets/javascripts/lib/underscore.js +1276 -0
  9. data/app/assets/javascripts/nvd3/lib/colorbrewer.js +302 -0
  10. data/app/assets/javascripts/nvd3/lib/crossfilter.js +1180 -0
  11. data/app/assets/javascripts/nvd3/lib/crossfilter.min.js +1 -0
  12. data/app/assets/javascripts/nvd3/lib/d3.v2.js +7033 -0
  13. data/app/assets/javascripts/nvd3/lib/d3.v2.min.js +4 -0
  14. data/app/assets/javascripts/nvd3/lib/d3.v3.js +8436 -0
  15. data/app/assets/javascripts/nvd3/lib/fisheye.js +86 -0
  16. data/app/assets/javascripts/nvd3/lib/hive.js +80 -0
  17. data/app/assets/javascripts/nvd3/lib/horizon.js +192 -0
  18. data/app/assets/javascripts/nvd3/lib/sankey.js +292 -0
  19. data/app/assets/javascripts/nvd3/nv.d3.js +14312 -0
  20. data/app/assets/javascripts/nvd3/nv.d3.min.js +6 -0
  21. data/app/assets/javascripts/nvd3/src/core.js +122 -0
  22. data/app/assets/javascripts/nvd3/src/interactiveLayer.js +251 -0
  23. data/app/assets/javascripts/nvd3/src/models/axis.js +405 -0
  24. data/app/assets/javascripts/nvd3/src/models/backup/bullet.js +250 -0
  25. data/app/assets/javascripts/nvd3/src/models/backup/bulletChart.js +349 -0
  26. data/app/assets/javascripts/nvd3/src/models/boilerplate.js +104 -0
  27. data/app/assets/javascripts/nvd3/src/models/bullet.js +385 -0
  28. data/app/assets/javascripts/nvd3/src/models/bulletChart.js +343 -0
  29. data/app/assets/javascripts/nvd3/src/models/cumulativeLineChart.js +782 -0
  30. data/app/assets/javascripts/nvd3/src/models/discreteBar.js +349 -0
  31. data/app/assets/javascripts/nvd3/src/models/discreteBarChart.js +333 -0
  32. data/app/assets/javascripts/nvd3/src/models/distribution.js +148 -0
  33. data/app/assets/javascripts/nvd3/src/models/historicalBar.js +331 -0
  34. data/app/assets/javascripts/nvd3/src/models/historicalBarChart.js +419 -0
  35. data/app/assets/javascripts/nvd3/src/models/indentedTree.js +337 -0
  36. data/app/assets/javascripts/nvd3/src/models/legend.js +270 -0
  37. data/app/assets/javascripts/nvd3/src/models/line.js +284 -0
  38. data/app/assets/javascripts/nvd3/src/models/lineChart.js +465 -0
  39. data/app/assets/javascripts/nvd3/src/models/linePlusBarChart.js +433 -0
  40. data/app/assets/javascripts/nvd3/src/models/linePlusBarWithFocusChart.js +658 -0
  41. data/app/assets/javascripts/nvd3/src/models/lineWithFisheye.js +200 -0
  42. data/app/assets/javascripts/nvd3/src/models/lineWithFisheyeChart.js +297 -0
  43. data/app/assets/javascripts/nvd3/src/models/lineWithFocusChart.js +574 -0
  44. data/app/assets/javascripts/nvd3/src/models/multiBar.js +461 -0
  45. data/app/assets/javascripts/nvd3/src/models/multiBarChart.js +524 -0
  46. data/app/assets/javascripts/nvd3/src/models/multiBarHorizontal.js +424 -0
  47. data/app/assets/javascripts/nvd3/src/models/multiBarHorizontalChart.js +434 -0
  48. data/app/assets/javascripts/nvd3/src/models/multiBarTimeSeries.js +384 -0
  49. data/app/assets/javascripts/nvd3/src/models/multiBarTimeSeriesChart.js +405 -0
  50. data/app/assets/javascripts/nvd3/src/models/multiChart.js +452 -0
  51. data/app/assets/javascripts/nvd3/src/models/ohlcBar.js +380 -0
  52. data/app/assets/javascripts/nvd3/src/models/parallelCoordinates.js +239 -0
  53. data/app/assets/javascripts/nvd3/src/models/pie.js +398 -0
  54. data/app/assets/javascripts/nvd3/src/models/pieChart.js +292 -0
  55. data/app/assets/javascripts/nvd3/src/models/scatter.js +674 -0
  56. data/app/assets/javascripts/nvd3/src/models/scatterChart.js +628 -0
  57. data/app/assets/javascripts/nvd3/src/models/scatterPlusLineChart.js +620 -0
  58. data/app/assets/javascripts/nvd3/src/models/sparkline.js +194 -0
  59. data/app/assets/javascripts/nvd3/src/models/sparklinePlus.js +295 -0
  60. data/app/assets/javascripts/nvd3/src/models/stackedArea.js +368 -0
  61. data/app/assets/javascripts/nvd3/src/models/stackedAreaChart.js +629 -0
  62. data/app/assets/javascripts/nvd3/src/tooltip.js +490 -0
  63. data/app/assets/javascripts/nvd3/src/utils.js +152 -0
  64. data/app/assets/javascripts/pyk.js +1 -0
  65. data/app/assets/stylesheets/lib/chardinjs.css +82 -0
  66. data/app/assets/stylesheets/nvd3/nv.d3.css +769 -0
  67. data/app/assets/stylesheets/pyk.css.scss +1 -0
  68. metadata +61 -2
@@ -1,980 +1,2 @@
1
- /**
2
- * @name MarkerManager v3
3
- * @version 1.1
4
- * @copyright (c) 2007 Google Inc.
5
- * @author Doug Ricket, Bjorn Brala (port to v3), others,
6
- *
7
- * @fileoverview Marker manager is an interface between the map and the user,
8
- * designed to manage adding and removing many points when the viewport changes.
9
- * <br /><br />
10
- * <b>How it Works</b>:<br/>
11
- * The MarkerManager places its markers onto a grid, similar to the map tiles.
12
- * When the user moves the viewport, it computes which grid cells have
13
- * entered or left the viewport, and shows or hides all the markers in those
14
- * cells.
15
- * (If the users scrolls the viewport beyond the markers that are loaded,
16
- * no markers will be visible until the <code>EVENT_moveend</code>
17
- * triggers an update.)
18
- * In practical consequences, this allows 10,000 markers to be distributed over
19
- * a large area, and as long as only 100-200 are visible in any given viewport,
20
- * the user will see good performance corresponding to the 100 visible markers,
21
- * rather than poor performance corresponding to the total 10,000 markers.
22
- * Note that some code is optimized for speed over space,
23
- * with the goal of accommodating thousands of markers.
24
- */
25
-
26
- /*
27
- * Licensed under the Apache License, Version 2.0 (the "License");
28
- * you may not use this file except in compliance with the License.
29
- * You may obtain a copy of the License at
30
- *
31
- * http://www.apache.org/licenses/LICENSE-2.0
32
- *
33
- * Unless required by applicable law or agreed to in writing, software
34
- * distributed under the License is distributed on an "AS IS" BASIS,
35
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
36
- * See the License for the specific language governing permissions and
37
- * limitations under the License.
38
- */
39
-
40
- /**
41
- * @name MarkerManagerOptions
42
- * @class This class represents optional arguments to the {@link MarkerManager}
43
- * constructor.
44
- * @property {Number} maxZoom Sets the maximum zoom level monitored by a
45
- * marker manager. If not given, the manager assumes the maximum map zoom
46
- * level. This value is also used when markers are added to the manager
47
- * without the optional {@link maxZoom} parameter.
48
- * @property {Number} borderPadding Specifies, in pixels, the extra padding
49
- * outside the map's current viewport monitored by a manager. Markers that
50
- * fall within this padding are added to the map, even if they are not fully
51
- * visible.
52
- * @property {Boolean} trackMarkers=false Indicates whether or not a marker
53
- * manager should track markers' movements. If you wish to move managed
54
- * markers using the {@link setPoint}/{@link setLatLng} methods,
55
- * this option should be set to {@link true}.
56
- */
57
-
58
- /**
59
- * Creates a new MarkerManager that will show/hide markers on a map.
60
- *
61
- * Events:
62
- * @event changed (Parameters: shown bounds, shown markers) Notify listeners when the state of what is displayed changes.
63
- * @event loaded MarkerManager has succesfully been initialized.
64
- *
65
- * @constructor
66
- * @param {Map} map The map to manage.
67
- * @param {Object} opt_opts A container for optional arguments:
68
- * {Number} maxZoom The maximum zoom level for which to create tiles.
69
- * {Number} borderPadding The width in pixels beyond the map border,
70
- * where markers should be display.
71
- * {Boolean} trackMarkers Whether or not this manager should track marker
72
- * movements.
73
- */
74
- function MarkerManager(map, opt_opts) {
75
- var me = this;
76
- me.map_ = map;
77
- me.mapZoom_ = map.getZoom();
78
-
79
- me.projectionHelper_ = new ProjectionHelperOverlay(map);
80
- google.maps.event.addListener(me.projectionHelper_, 'ready', function () {
81
- me.projection_ = this.getProjection();
82
- me.initialize(map, opt_opts);
83
- });
84
- }
85
-
86
-
87
- MarkerManager.prototype.initialize = function (map, opt_opts) {
88
- var me = this;
89
-
90
- opt_opts = opt_opts || {};
91
- me.tileSize_ = MarkerManager.DEFAULT_TILE_SIZE_;
92
-
93
- var mapTypes = map.mapTypes;
94
-
95
- // Find max zoom level
96
- var mapMaxZoom = 1;
97
- for (var sType in mapTypes ) {
98
- if (mapTypes.hasOwnProperty(sType) &&
99
- mapTypes.get(sType) && mapTypes.get(sType).maxZoom === 'number') {
100
- var mapTypeMaxZoom = map.mapTypes.get(sType).maxZoom;
101
- if (mapTypeMaxZoom > mapMaxZoom) {
102
- mapMaxZoom = mapTypeMaxZoom;
103
- }
104
- }
105
- }
106
-
107
- me.maxZoom_ = opt_opts.maxZoom || 19;
108
-
109
- me.trackMarkers_ = opt_opts.trackMarkers;
110
- me.show_ = opt_opts.show || true;
111
-
112
- var padding;
113
- if (typeof opt_opts.borderPadding === 'number') {
114
- padding = opt_opts.borderPadding;
115
- } else {
116
- padding = MarkerManager.DEFAULT_BORDER_PADDING_;
117
- }
118
- // The padding in pixels beyond the viewport, where we will pre-load markers.
119
- me.swPadding_ = new google.maps.Size(-padding, padding);
120
- me.nePadding_ = new google.maps.Size(padding, -padding);
121
- me.borderPadding_ = padding;
122
-
123
- me.gridWidth_ = {};
124
-
125
- me.grid_ = {};
126
- me.grid_[me.maxZoom_] = {};
127
- me.numMarkers_ = {};
128
- me.numMarkers_[me.maxZoom_] = 0;
129
-
130
-
131
- google.maps.event.addListener(map, 'dragend', function () {
132
- me.onMapMoveEnd_();
133
- });
134
-
135
- google.maps.event.addListener(map, 'idle', function () {
136
- me.onMapMoveEnd_();
137
- });
138
-
139
- google.maps.event.addListener(map, 'zoom_changed', function () {
140
- me.onMapMoveEnd_();
141
- });
142
-
143
-
144
-
145
- /**
146
- * This closure provide easy access to the map.
147
- * They are used as callbacks, not as methods.
148
- * @param GMarker marker Marker to be removed from the map
149
- * @private
150
- */
151
- me.removeOverlay_ = function (marker) {
152
- marker.setMap(null);
153
- me.shownMarkers_--;
154
- };
155
-
156
- /**
157
- * This closure provide easy access to the map.
158
- * They are used as callbacks, not as methods.
159
- * @param GMarker marker Marker to be added to the map
160
- * @private
161
- */
162
- me.addOverlay_ = function (marker) {
163
- if (me.show_) {
164
- marker.setMap(me.map_);
165
- me.shownMarkers_++;
166
- }
167
- };
168
-
169
- me.resetManager_();
170
- me.shownMarkers_ = 0;
171
-
172
- me.shownBounds_ = me.getMapGridBounds_();
173
-
174
- google.maps.event.trigger(me, 'loaded');
175
-
176
- };
177
-
178
- /**
179
- * Default tile size used for deviding the map into a grid.
180
- */
181
- MarkerManager.DEFAULT_TILE_SIZE_ = 1024;
182
-
183
- /*
184
- * How much extra space to show around the map border so
185
- * dragging doesn't result in an empty place.
186
- */
187
- MarkerManager.DEFAULT_BORDER_PADDING_ = 100;
188
-
189
- /**
190
- * Default tilesize of single tile world.
191
- */
192
- MarkerManager.MERCATOR_ZOOM_LEVEL_ZERO_RANGE = 256;
193
-
194
-
195
- /**
196
- * Initializes MarkerManager arrays for all zoom levels
197
- * Called by constructor and by clearAllMarkers
198
- */
199
- MarkerManager.prototype.resetManager_ = function () {
200
- var mapWidth = MarkerManager.MERCATOR_ZOOM_LEVEL_ZERO_RANGE;
201
- for (var zoom = 0; zoom <= this.maxZoom_; ++zoom) {
202
- this.grid_[zoom] = {};
203
- this.numMarkers_[zoom] = 0;
204
- this.gridWidth_[zoom] = Math.ceil(mapWidth / this.tileSize_);
205
- mapWidth <<= 1;
206
- }
207
-
208
- };
209
-
210
- /**
211
- * Removes all markers in the manager, and
212
- * removes any visible markers from the map.
213
- */
214
- MarkerManager.prototype.clearMarkers = function () {
215
- this.processAll_(this.shownBounds_, this.removeOverlay_);
216
- this.resetManager_();
217
- };
218
-
219
-
220
- /**
221
- * Gets the tile coordinate for a given latlng point.
222
- *
223
- * @param {LatLng} latlng The geographical point.
224
- * @param {Number} zoom The zoom level.
225
- * @param {google.maps.Size} padding The padding used to shift the pixel coordinate.
226
- * Used for expanding a bounds to include an extra padding
227
- * of pixels surrounding the bounds.
228
- * @return {GPoint} The point in tile coordinates.
229
- *
230
- */
231
- MarkerManager.prototype.getTilePoint_ = function (latlng, zoom, padding) {
232
-
233
- var pixelPoint = this.projectionHelper_.LatLngToPixel(latlng, zoom);
234
-
235
- var point = new google.maps.Point(
236
- Math.floor((pixelPoint.x + padding.width) / this.tileSize_),
237
- Math.floor((pixelPoint.y + padding.height) / this.tileSize_)
238
- );
239
-
240
- return point;
241
- };
242
-
243
-
244
- /**
245
- * Finds the appropriate place to add the marker to the grid.
246
- * Optimized for speed; does not actually add the marker to the map.
247
- * Designed for batch-processing thousands of markers.
248
- *
249
- * @param {Marker} marker The marker to add.
250
- * @param {Number} minZoom The minimum zoom for displaying the marker.
251
- * @param {Number} maxZoom The maximum zoom for displaying the marker.
252
- */
253
- MarkerManager.prototype.addMarkerBatch_ = function (marker, minZoom, maxZoom) {
254
- var me = this;
255
-
256
- var mPoint = marker.getPosition();
257
- marker.MarkerManager_minZoom = minZoom;
258
-
259
-
260
- // Tracking markers is expensive, so we do this only if the
261
- // user explicitly requested it when creating marker manager.
262
- if (this.trackMarkers_) {
263
- google.maps.event.addListener(marker, 'changed', function (a, b, c) {
264
- me.onMarkerMoved_(a, b, c);
265
- });
266
- }
267
-
268
- var gridPoint = this.getTilePoint_(mPoint, maxZoom, new google.maps.Size(0, 0, 0, 0));
269
-
270
- for (var zoom = maxZoom; zoom >= minZoom; zoom--) {
271
- var cell = this.getGridCellCreate_(gridPoint.x, gridPoint.y, zoom);
272
- cell.push(marker);
273
-
274
- gridPoint.x = gridPoint.x >> 1;
275
- gridPoint.y = gridPoint.y >> 1;
276
- }
277
- };
278
-
279
-
280
- /**
281
- * Returns whether or not the given point is visible in the shown bounds. This
282
- * is a helper method that takes care of the corner case, when shownBounds have
283
- * negative minX value.
284
- *
285
- * @param {Point} point a point on a grid.
286
- * @return {Boolean} Whether or not the given point is visible in the currently
287
- * shown bounds.
288
- */
289
- MarkerManager.prototype.isGridPointVisible_ = function (point) {
290
- var vertical = this.shownBounds_.minY <= point.y &&
291
- point.y <= this.shownBounds_.maxY;
292
- var minX = this.shownBounds_.minX;
293
- var horizontal = minX <= point.x && point.x <= this.shownBounds_.maxX;
294
- if (!horizontal && minX < 0) {
295
- // Shifts the negative part of the rectangle. As point.x is always less
296
- // than grid width, only test shifted minX .. 0 part of the shown bounds.
297
- var width = this.gridWidth_[this.shownBounds_.z];
298
- horizontal = minX + width <= point.x && point.x <= width - 1;
299
- }
300
- return vertical && horizontal;
301
- };
302
-
303
-
304
- /**
305
- * Reacts to a notification from a marker that it has moved to a new location.
306
- * It scans the grid all all zoom levels and moves the marker from the old grid
307
- * location to a new grid location.
308
- *
309
- * @param {Marker} marker The marker that moved.
310
- * @param {LatLng} oldPoint The old position of the marker.
311
- * @param {LatLng} newPoint The new position of the marker.
312
- */
313
- MarkerManager.prototype.onMarkerMoved_ = function (marker, oldPoint, newPoint) {
314
- // NOTE: We do not know the minimum or maximum zoom the marker was
315
- // added at, so we start at the absolute maximum. Whenever we successfully
316
- // remove a marker at a given zoom, we add it at the new grid coordinates.
317
- var zoom = this.maxZoom_;
318
- var changed = false;
319
- var oldGrid = this.getTilePoint_(oldPoint, zoom, new google.maps.Size(0, 0, 0, 0));
320
- var newGrid = this.getTilePoint_(newPoint, zoom, new google.maps.Size(0, 0, 0, 0));
321
- while (zoom >= 0 && (oldGrid.x !== newGrid.x || oldGrid.y !== newGrid.y)) {
322
- var cell = this.getGridCellNoCreate_(oldGrid.x, oldGrid.y, zoom);
323
- if (cell) {
324
- if (this.removeFromArray_(cell, marker)) {
325
- this.getGridCellCreate_(newGrid.x, newGrid.y, zoom).push(marker);
326
- }
327
- }
328
- // For the current zoom we also need to update the map. Markers that no
329
- // longer are visible are removed from the map. Markers that moved into
330
- // the shown bounds are added to the map. This also lets us keep the count
331
- // of visible markers up to date.
332
- if (zoom === this.mapZoom_) {
333
- if (this.isGridPointVisible_(oldGrid)) {
334
- if (!this.isGridPointVisible_(newGrid)) {
335
- this.removeOverlay_(marker);
336
- changed = true;
337
- }
338
- } else {
339
- if (this.isGridPointVisible_(newGrid)) {
340
- this.addOverlay_(marker);
341
- changed = true;
342
- }
343
- }
344
- }
345
- oldGrid.x = oldGrid.x >> 1;
346
- oldGrid.y = oldGrid.y >> 1;
347
- newGrid.x = newGrid.x >> 1;
348
- newGrid.y = newGrid.y >> 1;
349
- --zoom;
350
- }
351
- if (changed) {
352
- this.notifyListeners_();
353
- }
354
- };
355
-
356
-
357
- /**
358
- * Removes marker from the manager and from the map
359
- * (if it's currently visible).
360
- * @param {GMarker} marker The marker to delete.
361
- */
362
- MarkerManager.prototype.removeMarker = function (marker) {
363
- var zoom = this.maxZoom_;
364
- var changed = false;
365
- var point = marker.getPosition();
366
- var grid = this.getTilePoint_(point, zoom, new google.maps.Size(0, 0, 0, 0));
367
- while (zoom >= 0) {
368
- var cell = this.getGridCellNoCreate_(grid.x, grid.y, zoom);
369
-
370
- if (cell) {
371
- this.removeFromArray_(cell, marker);
372
- }
373
- // For the current zoom we also need to update the map. Markers that no
374
- // longer are visible are removed from the map. This also lets us keep the count
375
- // of visible markers up to date.
376
- if (zoom === this.mapZoom_) {
377
- if (this.isGridPointVisible_(grid)) {
378
- this.removeOverlay_(marker);
379
- changed = true;
380
- }
381
- }
382
- grid.x = grid.x >> 1;
383
- grid.y = grid.y >> 1;
384
- --zoom;
385
- }
386
- if (changed) {
387
- this.notifyListeners_();
388
- }
389
- this.numMarkers_[marker.MarkerManager_minZoom]--;
390
- };
391
-
392
-
393
- /**
394
- * Add many markers at once.
395
- * Does not actually update the map, just the internal grid.
396
- *
397
- * @param {Array of Marker} markers The markers to add.
398
- * @param {Number} minZoom The minimum zoom level to display the markers.
399
- * @param {Number} opt_maxZoom The maximum zoom level to display the markers.
400
- */
401
- MarkerManager.prototype.addMarkers = function (markers, minZoom, opt_maxZoom) {
402
- var maxZoom = this.getOptMaxZoom_(opt_maxZoom);
403
- for (var i = markers.length - 1; i >= 0; i--) {
404
- this.addMarkerBatch_(markers[i], minZoom, maxZoom);
405
- }
406
-
407
- this.numMarkers_[minZoom] += markers.length;
408
- };
409
-
410
-
411
- /**
412
- * Returns the value of the optional maximum zoom. This method is defined so
413
- * that we have just one place where optional maximum zoom is calculated.
414
- *
415
- * @param {Number} opt_maxZoom The optinal maximum zoom.
416
- * @return The maximum zoom.
417
- */
418
- MarkerManager.prototype.getOptMaxZoom_ = function (opt_maxZoom) {
419
- return opt_maxZoom || this.maxZoom_;
420
- };
421
-
422
-
423
- /**
424
- * Calculates the total number of markers potentially visible at a given
425
- * zoom level.
426
- *
427
- * @param {Number} zoom The zoom level to check.
428
- */
429
- MarkerManager.prototype.getMarkerCount = function (zoom) {
430
- var total = 0;
431
- for (var z = 0; z <= zoom; z++) {
432
- total += this.numMarkers_[z];
433
- }
434
- return total;
435
- };
436
-
437
- /**
438
- * Returns a marker given latitude, longitude and zoom. If the marker does not
439
- * exist, the method will return a new marker. If a new marker is created,
440
- * it will NOT be added to the manager.
441
- *
442
- * @param {Number} lat - the latitude of a marker.
443
- * @param {Number} lng - the longitude of a marker.
444
- * @param {Number} zoom - the zoom level
445
- * @return {GMarker} marker - the marker found at lat and lng
446
- */
447
- MarkerManager.prototype.getMarker = function (lat, lng, zoom) {
448
- var mPoint = new google.maps.LatLng(lat, lng);
449
- var gridPoint = this.getTilePoint_(mPoint, zoom, new google.maps.Size(0, 0, 0, 0));
450
-
451
- var marker = new google.maps.Marker({position: mPoint});
452
-
453
- var cellArray = this.getGridCellNoCreate_(gridPoint.x, gridPoint.y, zoom);
454
- if (cellArray !== undefined) {
455
- for (var i = 0; i < cellArray.length; i++)
456
- {
457
- if (lat === cellArray[i].getPosition().lat() && lng === cellArray[i].getPosition().lng()) {
458
- marker = cellArray[i];
459
- }
460
- }
461
- }
462
- return marker;
463
- };
464
-
465
- /**
466
- * Add a single marker to the map.
467
- *
468
- * @param {Marker} marker The marker to add.
469
- * @param {Number} minZoom The minimum zoom level to display the marker.
470
- * @param {Number} opt_maxZoom The maximum zoom level to display the marker.
471
- */
472
- MarkerManager.prototype.addMarker = function (marker, minZoom, opt_maxZoom) {
473
- var maxZoom = this.getOptMaxZoom_(opt_maxZoom);
474
- this.addMarkerBatch_(marker, minZoom, maxZoom);
475
- var gridPoint = this.getTilePoint_(marker.getPosition(), this.mapZoom_, new google.maps.Size(0, 0, 0, 0));
476
- if (this.isGridPointVisible_(gridPoint) &&
477
- minZoom <= this.shownBounds_.z &&
478
- this.shownBounds_.z <= maxZoom) {
479
- this.addOverlay_(marker);
480
- this.notifyListeners_();
481
- }
482
- this.numMarkers_[minZoom]++;
483
- };
484
-
485
-
486
- /**
487
- * Helper class to create a bounds of INT ranges.
488
- * @param bounds Array.<Object.<string, number>> Bounds object.
489
- * @constructor
490
- */
491
- function GridBounds(bounds) {
492
- // [sw, ne]
493
-
494
- this.minX = Math.min(bounds[0].x, bounds[1].x);
495
- this.maxX = Math.max(bounds[0].x, bounds[1].x);
496
- this.minY = Math.min(bounds[0].y, bounds[1].y);
497
- this.maxY = Math.max(bounds[0].y, bounds[1].y);
498
-
499
- }
500
-
501
- /**
502
- * Returns true if this bounds equal the given bounds.
503
- * @param {GridBounds} gridBounds GridBounds The bounds to test.
504
- * @return {Boolean} This Bounds equals the given GridBounds.
505
- */
506
- GridBounds.prototype.equals = function (gridBounds) {
507
- if (this.maxX === gridBounds.maxX && this.maxY === gridBounds.maxY && this.minX === gridBounds.minX && this.minY === gridBounds.minY) {
508
- return true;
509
- } else {
510
- return false;
511
- }
512
- };
513
-
514
- /**
515
- * Returns true if this bounds (inclusively) contains the given point.
516
- * @param {Point} point The point to test.
517
- * @return {Boolean} This Bounds contains the given Point.
518
- */
519
- GridBounds.prototype.containsPoint = function (point) {
520
- var outer = this;
521
- return (outer.minX <= point.x && outer.maxX >= point.x && outer.minY <= point.y && outer.maxY >= point.y);
522
- };
523
-
524
- /**
525
- * Get a cell in the grid, creating it first if necessary.
526
- *
527
- * Optimization candidate
528
- *
529
- * @param {Number} x The x coordinate of the cell.
530
- * @param {Number} y The y coordinate of the cell.
531
- * @param {Number} z The z coordinate of the cell.
532
- * @return {Array} The cell in the array.
533
- */
534
- MarkerManager.prototype.getGridCellCreate_ = function (x, y, z) {
535
- var grid = this.grid_[z];
536
- if (x < 0) {
537
- x += this.gridWidth_[z];
538
- }
539
- var gridCol = grid[x];
540
- if (!gridCol) {
541
- gridCol = grid[x] = [];
542
- return (gridCol[y] = []);
543
- }
544
- var gridCell = gridCol[y];
545
- if (!gridCell) {
546
- return (gridCol[y] = []);
547
- }
548
- return gridCell;
549
- };
550
-
551
-
552
- /**
553
- * Get a cell in the grid, returning undefined if it does not exist.
554
- *
555
- * NOTE: Optimized for speed -- otherwise could combine with getGridCellCreate_.
556
- *
557
- * @param {Number} x The x coordinate of the cell.
558
- * @param {Number} y The y coordinate of the cell.
559
- * @param {Number} z The z coordinate of the cell.
560
- * @return {Array} The cell in the array.
561
- */
562
- MarkerManager.prototype.getGridCellNoCreate_ = function (x, y, z) {
563
- var grid = this.grid_[z];
564
-
565
- if (x < 0) {
566
- x += this.gridWidth_[z];
567
- }
568
- var gridCol = grid[x];
569
- return gridCol ? gridCol[y] : undefined;
570
- };
571
-
572
-
573
- /**
574
- * Turns at geographical bounds into a grid-space bounds.
575
- *
576
- * @param {LatLngBounds} bounds The geographical bounds.
577
- * @param {Number} zoom The zoom level of the bounds.
578
- * @param {google.maps.Size} swPadding The padding in pixels to extend beyond the
579
- * given bounds.
580
- * @param {google.maps.Size} nePadding The padding in pixels to extend beyond the
581
- * given bounds.
582
- * @return {GridBounds} The bounds in grid space.
583
- */
584
- MarkerManager.prototype.getGridBounds_ = function (bounds, zoom, swPadding, nePadding) {
585
- zoom = Math.min(zoom, this.maxZoom_);
586
-
587
- var bl = bounds.getSouthWest();
588
- var tr = bounds.getNorthEast();
589
- var sw = this.getTilePoint_(bl, zoom, swPadding);
590
-
591
- var ne = this.getTilePoint_(tr, zoom, nePadding);
592
- var gw = this.gridWidth_[zoom];
593
-
594
- // Crossing the prime meridian requires correction of bounds.
595
- if (tr.lng() < bl.lng() || ne.x < sw.x) {
596
- sw.x -= gw;
597
- }
598
- if (ne.x - sw.x + 1 >= gw) {
599
- // Computed grid bounds are larger than the world; truncate.
600
- sw.x = 0;
601
- ne.x = gw - 1;
602
- }
603
-
604
- var gridBounds = new GridBounds([sw, ne]);
605
- gridBounds.z = zoom;
606
-
607
- return gridBounds;
608
- };
609
-
610
-
611
- /**
612
- * Gets the grid-space bounds for the current map viewport.
613
- *
614
- * @return {Bounds} The bounds in grid space.
615
- */
616
- MarkerManager.prototype.getMapGridBounds_ = function () {
617
- return this.getGridBounds_(this.map_.getBounds(), this.mapZoom_, this.swPadding_, this.nePadding_);
618
- };
619
-
620
-
621
- /**
622
- * Event listener for map:movend.
623
- * NOTE: Use a timeout so that the user is not blocked
624
- * from moving the map.
625
- *
626
- * Removed this because a a lack of a scopy override/callback function on events.
627
- */
628
- MarkerManager.prototype.onMapMoveEnd_ = function () {
629
- this.objectSetTimeout_(this, this.updateMarkers_, 0);
630
- };
631
-
632
-
633
- /**
634
- * Call a function or evaluate an expression after a specified number of
635
- * milliseconds.
636
- *
637
- * Equivalent to the standard window.setTimeout function, but the given
638
- * function executes as a method of this instance. So the function passed to
639
- * objectSetTimeout can contain references to this.
640
- * objectSetTimeout(this, function () { alert(this.x) }, 1000);
641
- *
642
- * @param {Object} object The target object.
643
- * @param {Function} command The command to run.
644
- * @param {Number} milliseconds The delay.
645
- * @return {Boolean} Success.
646
- */
647
- MarkerManager.prototype.objectSetTimeout_ = function (object, command, milliseconds) {
648
- return window.setTimeout(function () {
649
- command.call(object);
650
- }, milliseconds);
651
- };
652
-
653
-
654
- /**
655
- * Is this layer visible?
656
- *
657
- * Returns visibility setting
658
- *
659
- * @return {Boolean} Visible
660
- */
661
- MarkerManager.prototype.visible = function () {
662
- return this.show_ ? true : false;
663
- };
664
-
665
-
666
- /**
667
- * Returns true if the manager is hidden.
668
- * Otherwise returns false.
669
- * @return {Boolean} Hidden
670
- */
671
- MarkerManager.prototype.isHidden = function () {
672
- return !this.show_;
673
- };
674
-
675
-
676
- /**
677
- * Shows the manager if it's currently hidden.
678
- */
679
- MarkerManager.prototype.show = function () {
680
- this.show_ = true;
681
- this.refresh();
682
- };
683
-
684
-
685
- /**
686
- * Hides the manager if it's currently visible
687
- */
688
- MarkerManager.prototype.hide = function () {
689
- this.show_ = false;
690
- this.refresh();
691
- };
692
-
693
-
694
- /**
695
- * Toggles the visibility of the manager.
696
- */
697
- MarkerManager.prototype.toggle = function () {
698
- this.show_ = !this.show_;
699
- this.refresh();
700
- };
701
-
702
-
703
- /**
704
- * Refresh forces the marker-manager into a good state.
705
- * <ol>
706
- * <li>If never before initialized, shows all the markers.</li>
707
- * <li>If previously initialized, removes and re-adds all markers.</li>
708
- * </ol>
709
- */
710
- MarkerManager.prototype.refresh = function () {
711
- if (this.shownMarkers_ > 0) {
712
- this.processAll_(this.shownBounds_, this.removeOverlay_);
713
- }
714
- // An extra check on this.show_ to increase performance (no need to processAll_)
715
- if (this.show_) {
716
- this.processAll_(this.shownBounds_, this.addOverlay_);
717
- }
718
- this.notifyListeners_();
719
- };
720
-
721
-
722
- /**
723
- * After the viewport may have changed, add or remove markers as needed.
724
- */
725
- MarkerManager.prototype.updateMarkers_ = function () {
726
- this.mapZoom_ = this.map_.getZoom();
727
- var newBounds = this.getMapGridBounds_();
728
-
729
- // If the move does not include new grid sections,
730
- // we have no work to do:
731
- if (newBounds.equals(this.shownBounds_) && newBounds.z === this.shownBounds_.z) {
732
- return;
733
- }
734
-
735
- if (newBounds.z !== this.shownBounds_.z) {
736
- this.processAll_(this.shownBounds_, this.removeOverlay_);
737
- if (this.show_) { // performance
738
- this.processAll_(newBounds, this.addOverlay_);
739
- }
740
- } else {
741
- // Remove markers:
742
- this.rectangleDiff_(this.shownBounds_, newBounds, this.removeCellMarkers_);
743
-
744
- // Add markers:
745
- if (this.show_) { // performance
746
- this.rectangleDiff_(newBounds, this.shownBounds_, this.addCellMarkers_);
747
- }
748
- }
749
- this.shownBounds_ = newBounds;
750
-
751
- this.notifyListeners_();
752
- };
753
-
754
-
755
- /**
756
- * Notify listeners when the state of what is displayed changes.
757
- */
758
- MarkerManager.prototype.notifyListeners_ = function () {
759
- google.maps.event.trigger(this, 'changed', this.shownBounds_, this.shownMarkers_);
760
- };
761
-
762
-
763
- /**
764
- * Process all markers in the bounds provided, using a callback.
765
- *
766
- * @param {Bounds} bounds The bounds in grid space.
767
- * @param {Function} callback The function to call for each marker.
768
- */
769
- MarkerManager.prototype.processAll_ = function (bounds, callback) {
770
- for (var x = bounds.minX; x <= bounds.maxX; x++) {
771
- for (var y = bounds.minY; y <= bounds.maxY; y++) {
772
- this.processCellMarkers_(x, y, bounds.z, callback);
773
- }
774
- }
775
- };
776
-
777
-
778
- /**
779
- * Process all markers in the grid cell, using a callback.
780
- *
781
- * @param {Number} x The x coordinate of the cell.
782
- * @param {Number} y The y coordinate of the cell.
783
- * @param {Number} z The z coordinate of the cell.
784
- * @param {Function} callback The function to call for each marker.
785
- */
786
- MarkerManager.prototype.processCellMarkers_ = function (x, y, z, callback) {
787
- var cell = this.getGridCellNoCreate_(x, y, z);
788
- if (cell) {
789
- for (var i = cell.length - 1; i >= 0; i--) {
790
- callback(cell[i]);
791
- }
792
- }
793
- };
794
-
795
-
796
- /**
797
- * Remove all markers in a grid cell.
798
- *
799
- * @param {Number} x The x coordinate of the cell.
800
- * @param {Number} y The y coordinate of the cell.
801
- * @param {Number} z The z coordinate of the cell.
802
- */
803
- MarkerManager.prototype.removeCellMarkers_ = function (x, y, z) {
804
- this.processCellMarkers_(x, y, z, this.removeOverlay_);
805
- };
806
-
807
-
808
- /**
809
- * Add all markers in a grid cell.
810
- *
811
- * @param {Number} x The x coordinate of the cell.
812
- * @param {Number} y The y coordinate of the cell.
813
- * @param {Number} z The z coordinate of the cell.
814
- */
815
- MarkerManager.prototype.addCellMarkers_ = function (x, y, z) {
816
- this.processCellMarkers_(x, y, z, this.addOverlay_);
817
- };
818
-
819
-
820
- /**
821
- * Use the rectangleDiffCoords_ function to process all grid cells
822
- * that are in bounds1 but not bounds2, using a callback, and using
823
- * the current MarkerManager object as the instance.
824
- *
825
- * Pass the z parameter to the callback in addition to x and y.
826
- *
827
- * @param {Bounds} bounds1 The bounds of all points we may process.
828
- * @param {Bounds} bounds2 The bounds of points to exclude.
829
- * @param {Function} callback The callback function to call
830
- * for each grid coordinate (x, y, z).
831
- */
832
- MarkerManager.prototype.rectangleDiff_ = function (bounds1, bounds2, callback) {
833
- var me = this;
834
- me.rectangleDiffCoords_(bounds1, bounds2, function (x, y) {
835
- callback.apply(me, [x, y, bounds1.z]);
836
- });
837
- };
838
-
839
-
840
- /**
841
- * Calls the function for all points in bounds1, not in bounds2
842
- *
843
- * @param {Bounds} bounds1 The bounds of all points we may process.
844
- * @param {Bounds} bounds2 The bounds of points to exclude.
845
- * @param {Function} callback The callback function to call
846
- * for each grid coordinate.
847
- */
848
- MarkerManager.prototype.rectangleDiffCoords_ = function (bounds1, bounds2, callback) {
849
- var minX1 = bounds1.minX;
850
- var minY1 = bounds1.minY;
851
- var maxX1 = bounds1.maxX;
852
- var maxY1 = bounds1.maxY;
853
- var minX2 = bounds2.minX;
854
- var minY2 = bounds2.minY;
855
- var maxX2 = bounds2.maxX;
856
- var maxY2 = bounds2.maxY;
857
-
858
- var x, y;
859
- for (x = minX1; x <= maxX1; x++) { // All x in R1
860
- // All above:
861
- for (y = minY1; y <= maxY1 && y < minY2; y++) { // y in R1 above R2
862
- callback(x, y);
863
- }
864
- // All below:
865
- for (y = Math.max(maxY2 + 1, minY1); // y in R1 below R2
866
- y <= maxY1; y++) {
867
- callback(x, y);
868
- }
869
- }
870
-
871
- for (y = Math.max(minY1, minY2);
872
- y <= Math.min(maxY1, maxY2); y++) { // All y in R2 and in R1
873
- // Strictly left:
874
- for (x = Math.min(maxX1 + 1, minX2) - 1;
875
- x >= minX1; x--) { // x in R1 left of R2
876
- callback(x, y);
877
- }
878
- // Strictly right:
879
- for (x = Math.max(minX1, maxX2 + 1); // x in R1 right of R2
880
- x <= maxX1; x++) {
881
- callback(x, y);
882
- }
883
- }
884
- };
885
-
886
-
887
- /**
888
- * Removes value from array. O(N).
889
- *
890
- * @param {Array} array The array to modify.
891
- * @param {any} value The value to remove.
892
- * @param {Boolean} opt_notype Flag to disable type checking in equality.
893
- * @return {Number} The number of instances of value that were removed.
894
- */
895
- MarkerManager.prototype.removeFromArray_ = function (array, value, opt_notype) {
896
- var shift = 0;
897
- for (var i = 0; i < array.length; ++i) {
898
- if (array[i] === value || (opt_notype && array[i] === value)) {
899
- array.splice(i--, 1);
900
- shift++;
901
- }
902
- }
903
- return shift;
904
- };
905
-
906
-
907
-
908
-
909
-
910
-
911
-
912
- /**
913
- * Projection overlay helper. Helps in calculating
914
- * that markers get into the right grid.
915
- * @constructor
916
- * @param {Map} map The map to manage.
917
- **/
918
- function ProjectionHelperOverlay(map) {
919
-
920
- this.setMap(map);
921
-
922
- var TILEFACTOR = 8;
923
- var TILESIDE = 1 << TILEFACTOR;
924
- var RADIUS = 7;
925
-
926
- this._map = map;
927
- this._zoom = -1;
928
- this._X0 =
929
- this._Y0 =
930
- this._X1 =
931
- this._Y1 = -1;
932
-
933
-
934
- }
935
- ProjectionHelperOverlay.prototype = new google.maps.OverlayView();
936
-
937
- /**
938
- * Helper function to convert Lng to X
939
- * @private
940
- * @param {float} lng
941
- **/
942
- ProjectionHelperOverlay.prototype.LngToX_ = function (lng) {
943
- return (1 + lng / 180);
944
- };
945
-
946
- /**
947
- * Helper function to convert Lat to Y
948
- * @private
949
- * @param {float} lat
950
- **/
951
- ProjectionHelperOverlay.prototype.LatToY_ = function (lat) {
952
- var sinofphi = Math.sin(lat * Math.PI / 180);
953
- return (1 - 0.5 / Math.PI * Math.log((1 + sinofphi) / (1 - sinofphi)));
954
- };
955
-
956
- /**
957
- * Old school LatLngToPixel
958
- * @param {LatLng} latlng google.maps.LatLng object
959
- * @param {Number} zoom Zoom level
960
- * @return {position} {x: pixelPositionX, y: pixelPositionY}
961
- **/
962
- ProjectionHelperOverlay.prototype.LatLngToPixel = function (latlng, zoom) {
963
- var map = this._map;
964
- var div = this.getProjection().fromLatLngToDivPixel(latlng);
965
- var abs = {x: ~~(0.5 + this.LngToX_(latlng.lng()) * (2 << (zoom + 6))), y: ~~(0.5 + this.LatToY_(latlng.lat()) * (2 << (zoom + 6)))};
966
- return abs;
967
- };
968
-
969
-
970
- /**
971
- * Draw function only triggers a ready event for
972
- * MarkerManager to know projection can proceed to
973
- * initialize.
974
- */
975
- ProjectionHelperOverlay.prototype.draw = function () {
976
- if (!this.ready) {
977
- this.ready = true;
978
- google.maps.event.trigger(this, 'ready');
979
- }
980
- };
1
+ /*** @name MarkerManager v3* @version 1.1*/
2
+ function MarkerManager(e,t){var n=this;n.map_=e;n.mapZoom_=e.getZoom();n.projectionHelper_=new ProjectionHelperOverlay(e);google.maps.event.addListener(n.projectionHelper_,"ready",function(){n.projection_=this.getProjection();n.initialize(e,t)})}function GridBounds(e){this.minX=Math.min(e[0].x,e[1].x);this.maxX=Math.max(e[0].x,e[1].x);this.minY=Math.min(e[0].y,e[1].y);this.maxY=Math.max(e[0].y,e[1].y)}function ProjectionHelperOverlay(e){this.setMap(e);var t=8;var n=1<<t;var r=7;this._map=e;this._zoom=-1;this._X0=this._Y0=this._X1=this._Y1=-1}MarkerManager.prototype.initialize=function(e,t){var n=this;t=t||{};n.tileSize_=MarkerManager.DEFAULT_TILE_SIZE_;var r=e.mapTypes;var i=1;for(var s in r){if(r.hasOwnProperty(s)&&r.get(s)&&r.get(s).maxZoom==="number"){var o=e.mapTypes.get(s).maxZoom;if(o>i){i=o}}}n.maxZoom_=t.maxZoom||19;n.trackMarkers_=t.trackMarkers;n.show_=t.show||true;var u;if(typeof t.borderPadding==="number"){u=t.borderPadding}else{u=MarkerManager.DEFAULT_BORDER_PADDING_}n.swPadding_=new google.maps.Size(-u,u);n.nePadding_=new google.maps.Size(u,-u);n.borderPadding_=u;n.gridWidth_={};n.grid_={};n.grid_[n.maxZoom_]={};n.numMarkers_={};n.numMarkers_[n.maxZoom_]=0;google.maps.event.addListener(e,"dragend",function(){n.onMapMoveEnd_()});google.maps.event.addListener(e,"idle",function(){n.onMapMoveEnd_()});google.maps.event.addListener(e,"zoom_changed",function(){n.onMapMoveEnd_()});n.removeOverlay_=function(e){e.setMap(null);n.shownMarkers_--};n.addOverlay_=function(e){if(n.show_){e.setMap(n.map_);n.shownMarkers_++}};n.resetManager_();n.shownMarkers_=0;n.shownBounds_=n.getMapGridBounds_();google.maps.event.trigger(n,"loaded")};MarkerManager.DEFAULT_TILE_SIZE_=1024;MarkerManager.DEFAULT_BORDER_PADDING_=100;MarkerManager.MERCATOR_ZOOM_LEVEL_ZERO_RANGE=256;MarkerManager.prototype.resetManager_=function(){var e=MarkerManager.MERCATOR_ZOOM_LEVEL_ZERO_RANGE;for(var t=0;t<=this.maxZoom_;++t){this.grid_[t]={};this.numMarkers_[t]=0;this.gridWidth_[t]=Math.ceil(e/this.tileSize_);e<<=1}};MarkerManager.prototype.clearMarkers=function(){this.processAll_(this.shownBounds_,this.removeOverlay_);this.resetManager_()};MarkerManager.prototype.getTilePoint_=function(e,t,n){var r=this.projectionHelper_.LatLngToPixel(e,t);var i=new google.maps.Point(Math.floor((r.x+n.width)/this.tileSize_),Math.floor((r.y+n.height)/this.tileSize_));return i};MarkerManager.prototype.addMarkerBatch_=function(e,t,n){var r=this;var i=e.getPosition();e.MarkerManager_minZoom=t;if(this.trackMarkers_){google.maps.event.addListener(e,"changed",function(e,t,n){r.onMarkerMoved_(e,t,n)})}var s=this.getTilePoint_(i,n,new google.maps.Size(0,0,0,0));for(var o=n;o>=t;o--){var u=this.getGridCellCreate_(s.x,s.y,o);u.push(e);s.x=s.x>>1;s.y=s.y>>1}};MarkerManager.prototype.isGridPointVisible_=function(e){var t=this.shownBounds_.minY<=e.y&&e.y<=this.shownBounds_.maxY;var n=this.shownBounds_.minX;var r=n<=e.x&&e.x<=this.shownBounds_.maxX;if(!r&&n<0){var i=this.gridWidth_[this.shownBounds_.z];r=n+i<=e.x&&e.x<=i-1}return t&&r};MarkerManager.prototype.onMarkerMoved_=function(e,t,n){var r=this.maxZoom_;var i=false;var s=this.getTilePoint_(t,r,new google.maps.Size(0,0,0,0));var o=this.getTilePoint_(n,r,new google.maps.Size(0,0,0,0));while(r>=0&&(s.x!==o.x||s.y!==o.y)){var u=this.getGridCellNoCreate_(s.x,s.y,r);if(u){if(this.removeFromArray_(u,e)){this.getGridCellCreate_(o.x,o.y,r).push(e)}}if(r===this.mapZoom_){if(this.isGridPointVisible_(s)){if(!this.isGridPointVisible_(o)){this.removeOverlay_(e);i=true}}else{if(this.isGridPointVisible_(o)){this.addOverlay_(e);i=true}}}s.x=s.x>>1;s.y=s.y>>1;o.x=o.x>>1;o.y=o.y>>1;--r}if(i){this.notifyListeners_()}};MarkerManager.prototype.removeMarker=function(e){var t=this.maxZoom_;var n=false;var r=e.getPosition();var i=this.getTilePoint_(r,t,new google.maps.Size(0,0,0,0));while(t>=0){var s=this.getGridCellNoCreate_(i.x,i.y,t);if(s){this.removeFromArray_(s,e)}if(t===this.mapZoom_){if(this.isGridPointVisible_(i)){this.removeOverlay_(e);n=true}}i.x=i.x>>1;i.y=i.y>>1;--t}if(n){this.notifyListeners_()}this.numMarkers_[e.MarkerManager_minZoom]--};MarkerManager.prototype.addMarkers=function(e,t,n){var r=this.getOptMaxZoom_(n);for(var i=e.length-1;i>=0;i--){this.addMarkerBatch_(e[i],t,r)}this.numMarkers_[t]+=e.length};MarkerManager.prototype.getOptMaxZoom_=function(e){return e||this.maxZoom_};MarkerManager.prototype.getMarkerCount=function(e){var t=0;for(var n=0;n<=e;n++){t+=this.numMarkers_[n]}return t};MarkerManager.prototype.getMarker=function(e,t,n){var r=new google.maps.LatLng(e,t);var i=this.getTilePoint_(r,n,new google.maps.Size(0,0,0,0));var s=new google.maps.Marker({position:r});var o=this.getGridCellNoCreate_(i.x,i.y,n);if(o!==undefined){for(var u=0;u<o.length;u++){if(e===o[u].getPosition().lat()&&t===o[u].getPosition().lng()){s=o[u]}}}return s};MarkerManager.prototype.addMarker=function(e,t,n){var r=this.getOptMaxZoom_(n);this.addMarkerBatch_(e,t,r);var i=this.getTilePoint_(e.getPosition(),this.mapZoom_,new google.maps.Size(0,0,0,0));if(this.isGridPointVisible_(i)&&t<=this.shownBounds_.z&&this.shownBounds_.z<=r){this.addOverlay_(e);this.notifyListeners_()}this.numMarkers_[t]++};GridBounds.prototype.equals=function(e){if(this.maxX===e.maxX&&this.maxY===e.maxY&&this.minX===e.minX&&this.minY===e.minY){return true}else{return false}};GridBounds.prototype.containsPoint=function(e){var t=this;return t.minX<=e.x&&t.maxX>=e.x&&t.minY<=e.y&&t.maxY>=e.y};MarkerManager.prototype.getGridCellCreate_=function(e,t,n){var r=this.grid_[n];if(e<0){e+=this.gridWidth_[n]}var i=r[e];if(!i){i=r[e]=[];return i[t]=[]}var s=i[t];if(!s){return i[t]=[]}return s};MarkerManager.prototype.getGridCellNoCreate_=function(e,t,n){var r=this.grid_[n];if(e<0){e+=this.gridWidth_[n]}var i=r[e];return i?i[t]:undefined};MarkerManager.prototype.getGridBounds_=function(e,t,n,r){t=Math.min(t,this.maxZoom_);var i=e.getSouthWest();var s=e.getNorthEast();var o=this.getTilePoint_(i,t,n);var u=this.getTilePoint_(s,t,r);var a=this.gridWidth_[t];if(s.lng()<i.lng()||u.x<o.x){o.x-=a}if(u.x-o.x+1>=a){o.x=0;u.x=a-1}var f=new GridBounds([o,u]);f.z=t;return f};MarkerManager.prototype.getMapGridBounds_=function(){return this.getGridBounds_(this.map_.getBounds(),this.mapZoom_,this.swPadding_,this.nePadding_)};MarkerManager.prototype.onMapMoveEnd_=function(){this.objectSetTimeout_(this,this.updateMarkers_,0)};MarkerManager.prototype.objectSetTimeout_=function(e,t,n){return window.setTimeout(function(){t.call(e)},n)};MarkerManager.prototype.visible=function(){return this.show_?true:false};MarkerManager.prototype.isHidden=function(){return!this.show_};MarkerManager.prototype.show=function(){this.show_=true;this.refresh()};MarkerManager.prototype.hide=function(){this.show_=false;this.refresh()};MarkerManager.prototype.toggle=function(){this.show_=!this.show_;this.refresh()};MarkerManager.prototype.refresh=function(){if(this.shownMarkers_>0){this.processAll_(this.shownBounds_,this.removeOverlay_)}if(this.show_){this.processAll_(this.shownBounds_,this.addOverlay_)}this.notifyListeners_()};MarkerManager.prototype.updateMarkers_=function(){this.mapZoom_=this.map_.getZoom();var e=this.getMapGridBounds_();if(e.equals(this.shownBounds_)&&e.z===this.shownBounds_.z){return}if(e.z!==this.shownBounds_.z){this.processAll_(this.shownBounds_,this.removeOverlay_);if(this.show_){this.processAll_(e,this.addOverlay_)}}else{this.rectangleDiff_(this.shownBounds_,e,this.removeCellMarkers_);if(this.show_){this.rectangleDiff_(e,this.shownBounds_,this.addCellMarkers_)}}this.shownBounds_=e;this.notifyListeners_()};MarkerManager.prototype.notifyListeners_=function(){google.maps.event.trigger(this,"changed",this.shownBounds_,this.shownMarkers_)};MarkerManager.prototype.processAll_=function(e,t){for(var n=e.minX;n<=e.maxX;n++){for(var r=e.minY;r<=e.maxY;r++){this.processCellMarkers_(n,r,e.z,t)}}};MarkerManager.prototype.processCellMarkers_=function(e,t,n,r){var i=this.getGridCellNoCreate_(e,t,n);if(i){for(var s=i.length-1;s>=0;s--){r(i[s])}}};MarkerManager.prototype.removeCellMarkers_=function(e,t,n){this.processCellMarkers_(e,t,n,this.removeOverlay_)};MarkerManager.prototype.addCellMarkers_=function(e,t,n){this.processCellMarkers_(e,t,n,this.addOverlay_)};MarkerManager.prototype.rectangleDiff_=function(e,t,n){var r=this;r.rectangleDiffCoords_(e,t,function(t,i){n.apply(r,[t,i,e.z])})};MarkerManager.prototype.rectangleDiffCoords_=function(e,t,n){var r=e.minX;var i=e.minY;var s=e.maxX;var o=e.maxY;var u=t.minX;var a=t.minY;var f=t.maxX;var l=t.maxY;var c,h;for(c=r;c<=s;c++){for(h=i;h<=o&&h<a;h++){n(c,h)}for(h=Math.max(l+1,i);h<=o;h++){n(c,h)}}for(h=Math.max(i,a);h<=Math.min(o,l);h++){for(c=Math.min(s+1,u)-1;c>=r;c--){n(c,h)}for(c=Math.max(r,f+1);c<=s;c++){n(c,h)}}};MarkerManager.prototype.removeFromArray_=function(e,t,n){var r=0;for(var i=0;i<e.length;++i){if(e[i]===t||n&&e[i]===t){e.splice(i--,1);r++}}return r};ProjectionHelperOverlay.prototype=new google.maps.OverlayView;ProjectionHelperOverlay.prototype.LngToX_=function(e){return 1+e/180};ProjectionHelperOverlay.prototype.LatToY_=function(e){var t=Math.sin(e*Math.PI/180);return 1-.5/Math.PI*Math.log((1+t)/(1-t))};ProjectionHelperOverlay.prototype.LatLngToPixel=function(e,t){var n=this._map;var r=this.getProjection().fromLatLngToDivPixel(e);var i={x:~~(.5+this.LngToX_(e.lng())*(2<<t+6)),y:~~(.5+this.LatToY_(e.lat())*(2<<t+6))};return i};ProjectionHelperOverlay.prototype.draw=function(){if(!this.ready){this.ready=true;google.maps.event.trigger(this,"ready")}}