function MarkerManager(E,D){var C=this;C.map_=E;C.mapZoom_=E.getZoom();C.projection_=E.getCurrentMapType().getProjection();D=D||{};C.tileSize_=MarkerManager.DEFAULT_TILE_SIZE_;var B=MarkerManager.DEFAULT_MAX_ZOOM_;if(D.maxZoom!=undefined){B=D.maxZoom}C.maxZoom_=B;C.trackMarkers_=D.trackMarkers;var A;if(typeof D.borderPadding=="number"){A=D.borderPadding}else{A=MarkerManager.DEFAULT_BORDER_PADDING_}C.swPadding_=new GSize(-A,A);C.nePadding_=new GSize(A,-A);C.borderPadding_=A;C.gridWidth_=[];C.grid_=[];C.grid_[B]=[];C.numMarkers_=[];C.numMarkers_[B]=0;GEvent.bind(E,"moveend",C,C.onMapMoveEnd_);C.removeOverlay_=function(F){E.removeOverlay(F);C.shownMarkers_--};C.addOverlay_=function(F){E.addOverlay(F);C.shownMarkers_++};C.resetManager_();C.shownMarkers_=0;C.shownBounds_=C.getMapGridBounds_()}MarkerManager.DEFAULT_TILE_SIZE_=1024;MarkerManager.DEFAULT_MAX_ZOOM_=17;MarkerManager.DEFAULT_BORDER_PADDING_=100;MarkerManager.MERCATOR_ZOOM_LEVEL_ZERO_RANGE=256;MarkerManager.prototype.resetManager_=function(){var C=this;var A=MarkerManager.MERCATOR_ZOOM_LEVEL_ZERO_RANGE;for(var B=0;B<=C.maxZoom_;++B){C.grid_[B]=[];C.numMarkers_[B]=0;C.gridWidth_[B]=Math.ceil(A/C.tileSize_);A<<=1}};MarkerManager.prototype.clearMarkers=function(){var A=this;A.processAll_(A.shownBounds_,A.removeOverlay_);A.resetManager_()};MarkerManager.prototype.getTilePoint_=function(C,B,A){var D=this.projection_.fromLatLngToPixel(C,B);return new GPoint(Math.floor((D.x+A.width)/this.tileSize_),Math.floor((D.y+A.height)/this.tileSize_))};MarkerManager.prototype.addMarkerBatch_=function(G,F,E){var D=G.getPoint();if(this.trackMarkers_){GEvent.bind(G,"changed",this,this.onMarkerMoved_)}var C=this.getTilePoint_(D,E,GSize.ZERO);for(var B=E;B>=F;B--){var A=this.getGridCellCreate_(C.x,C.y,B);A.push(G);C.x=C.x>>1;C.y=C.y>>1}};MarkerManager.prototype.isGridPointVisible_=function(C){var F=this;var A=F.shownBounds_.minY<=C.y&&C.y<=F.shownBounds_.maxY;var E=F.shownBounds_.minX;var D=E<=C.x&&C.x<=F.shownBounds_.maxX;if(!D&&E<0){var B=F.gridWidth_[F.shownBounds_.z];D=E+B<=C.x&&C.x<=B-1}return A&&D};MarkerManager.prototype.onMarkerMoved_=function(F,E,D){var G=this;var C=G.maxZoom_;var B=false;var A=G.getTilePoint_(E,C,GSize.ZERO);var I=G.getTilePoint_(D,C,GSize.ZERO);while(C>=0&&(A.x!=I.x||A.y!=I.y)){var H=G.getGridCellNoCreate_(A.x,A.y,C);if(H){if(G.removeFromArray(H,F)){G.getGridCellCreate_(I.x,I.y,C).push(F)}}if(C==G.mapZoom_){if(G.isGridPointVisible_(A)){if(!G.isGridPointVisible_(I)){G.removeOverlay_(F);B=true}}else{if(G.isGridPointVisible_(I)){G.addOverlay_(F);B=true}}}A.x=A.x>>1;A.y=A.y>>1;I.x=I.x>>1;I.y=I.y>>1;--C}if(B){G.notifyListeners_()}};MarkerManager.prototype.removeMarker=function(F){var E=this;var B=E.maxZoom_;var A=false;var G=F.getPoint();var D=E.getTilePoint_(G,B,GSize.ZERO);while(B>=0){var C=E.getGridCellNoCreate_(D.x,D.y,B);if(C){E.removeFromArray(C,F)}if(B==E.mapZoom_){if(E.isGridPointVisible_(D)){E.removeOverlay_(F);A=true}}D.x=D.x>>1;D.y=D.y>>1;--B}if(A){E.notifyListeners_()}};MarkerManager.prototype.addMarkers=function(E,C,A){var B=this.getOptMaxZoom_(A);for(var D=E.length-1;D>=0;D--){this.addMarkerBatch_(E[D],C,B)}this.numMarkers_[C]+=E.length};MarkerManager.prototype.getOptMaxZoom_=function(A){return A!=undefined?A:this.maxZoom_};MarkerManager.prototype.getMarkerCount=function(A){var C=0;for(var B=0;B<=A;B++){C+=this.numMarkers_[B]}return C};MarkerManager.prototype.addMarker=function(E,C,B){var A=this;var F=this.getOptMaxZoom_(B);A.addMarkerBatch_(E,C,F);var D=A.getTilePoint_(E.getPoint(),A.mapZoom_,GSize.ZERO);if(A.isGridPointVisible_(D)&&C<=A.shownBounds_.z&&A.shownBounds_.z<=F){A.addOverlay_(E);A.notifyListeners_()}this.numMarkers_[C]++};GBounds.prototype.containsPoint=function(B){var A=this;return(A.minX<=B.x&&A.maxX>=B.x&&A.minY<=B.y&&A.maxY>=B.y)};MarkerManager.prototype.getGridCellCreate_=function(A,F,E){var D=this.grid_[E];if(A<0){A+=this.gridWidth_[E]}var C=D[A];if(!C){C=D[A]=[];return C[F]=[]}var B=C[F];if(!B){return C[F]=[]}return B};MarkerManager.prototype.getGridCellNoCreate_=function(A,E,D){var C=this.grid_[D];if(A<0){A+=this.gridWidth_[D]}var B=C[A];return B?B[E]:undefined};MarkerManager.prototype.getGridBounds_=function(B,G,E,D){G=Math.min(G,this.maxZoom_);var C=B.getSouthWest();var H=B.getNorthEast();var I=this.getTilePoint_(C,G,E);var F=this.getTilePoint_(H,G,D);var J=this.gridWidth_[G];if(H.lng()<C.lng()||F.x<I.x){I.x-=J}if(F.x-I.x+1>=J){I.x=0;F.x=J-1}var A=new GBounds([I,F]);A.z=G;return A};MarkerManager.prototype.getMapGridBounds_=function(){var A=this;return A.getGridBounds_(A.map_.getBounds(),A.mapZoom_,A.swPadding_,A.nePadding_)};MarkerManager.prototype.onMapMoveEnd_=function(){var A=this;A.objectSetTimeout_(this,this.updateMarkers_,0)};MarkerManager.prototype.objectSetTimeout_=function(C,B,A){return window.setTimeout(function(){B.call(C)},A)};MarkerManager.prototype.refresh=function(){var A=this;if(A.shownMarkers_>0){A.processAll_(A.shownBounds_,A.removeOverlay_)}A.processAll_(A.shownBounds_,A.addOverlay_);A.notifyListeners_()};MarkerManager.prototype.updateMarkers_=function(){var B=this;B.mapZoom_=this.map_.getZoom();var A=B.getMapGridBounds_();if(A.equals(B.shownBounds_)&&A.z==B.shownBounds_.z){return }if(A.z!=B.shownBounds_.z){B.processAll_(B.shownBounds_,B.removeOverlay_);B.processAll_(A,B.addOverlay_)}else{B.rectangleDiff_(B.shownBounds_,A,B.removeCellMarkers_);B.rectangleDiff_(A,B.shownBounds_,B.addCellMarkers_)}B.shownBounds_=A;B.notifyListeners_()};MarkerManager.prototype.notifyListeners_=function(){GEvent.trigger(this,"changed",this.shownBounds_,this.shownMarkers_)};MarkerManager.prototype.processAll_=function(C,B){for(var A=C.minX;A<=C.maxX;A++){for(var D=C.minY;D<=C.maxY;D++){this.processCellMarkers_(A,D,C.z,B)}}};MarkerManager.prototype.processCellMarkers_=function(A,F,E,D){var C=this.getGridCellNoCreate_(A,F,E);if(C){for(var B=C.length-1;B>=0;B--){D(C[B])}}};MarkerManager.prototype.removeCellMarkers_=function(A,C,B){this.processCellMarkers_(A,C,B,this.removeOverlay_)};MarkerManager.prototype.addCellMarkers_=function(A,C,B){this.processCellMarkers_(A,C,B,this.addOverlay_)};MarkerManager.prototype.rectangleDiff_=function(C,B,A){var D=this;D.rectangleDiffCoords(C,B,function(E,F){A.apply(D,[E,F,C.z])})};MarkerManager.prototype.rectangleDiffCoords=function(K,J,I){var G=K.minX;var E=K.minY;var D=K.maxX;var C=K.maxY;var B=J.minX;var A=J.minY;var H=J.maxX;var F=J.maxY;for(var M=G;M<=D;M++){for(var L=E;L<=C&&L<A;L++){I(M,L)}for(var L=Math.max(F+1,E);L<=C;L++){I(M,L)}}for(var L=Math.max(E,A);L<=Math.min(C,F);L++){for(var M=Math.min(D+1,B)-1;M>=G;M--){I(M,L)}for(var M=Math.max(G,H+1);M<=D;M++){I(M,L)}}};MarkerManager.prototype.removeFromArray=function(A,E,D){var C=0;for(var B=0;B<A.length;++B){if(A[B]===E||(D&&A[B]==E)){A.splice(B--,1);C++}}return C}