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