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