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