function MarkerManager(_1,_2){
var me=this;
me.map_=_1;
me.mapZoom_=_1.getZoom();
me.projection_=_1.getCurrentMapType().getProjection();
_2=_2||{};
me.tileSize_=MarkerManager.DEFAULT_TILE_SIZE_;
var _3=MarkerManager.DEFAULT_MAX_ZOOM_;
if(_2.maxZoom!=undefined){
_3=_2.maxZoom;
}
me.maxZoom_=_3;
me.trackMarkers_=_2.trackMarkers;
var _4;
if(typeof _2.borderPadding=="number"){
_4=_2.borderPadding;
}else{
_4=MarkerManager.DEFAULT_BORDER_PADDING_;
}
me.swPadding_=new GSize(-_4,_4);
me.nePadding_=new GSize(_4,-_4);
me.borderPadding_=_4;
me.gridWidth_=[];
me.grid_=[];
me.grid_[_3]=[];
me.numMarkers_=[];
me.numMarkers_[_3]=0;
GEvent.bind(_1,"moveend",me,me.onMapMoveEnd_);
me.removeOverlay_=function(_5){
_1.removeOverlay(_5);
me.shownMarkers_--;
};
me.addOverlay_=function(_6){
_1.addOverlay(_6);
me.shownMarkers_++;
};
me.resetManager_();
me.shownMarkers_=0;
me.shownBounds_=me.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 me=this;
var _7=MarkerManager.MERCATOR_ZOOM_LEVEL_ZERO_RANGE;
for(var _8=0;_8<=me.maxZoom_;++_8){
me.grid_[_8]=[];
me.numMarkers_[_8]=0;
me.gridWidth_[_8]=Math.ceil(_7/me.tileSize_);
_7<<=1;
}
};
MarkerManager.prototype.clearMarkers=function(){
var me=this;
me.processAll_(me.shownBounds_,me.removeOverlay_);
me.resetManager_();
};
MarkerManager.prototype.getTilePoint_=function(_9,_a,_b){
var _c=this.projection_.fromLatLngToPixel(_9,_a);
return new GPoint(Math.floor((_c.x+_b.width)/this.tileSize_),Math.floor((_c.y+_b.height)/this.tileSize_));
};
MarkerManager.prototype.addMarkerBatch_=function(_d,_e,_f){
var _10=_d.getPoint();
if(this.trackMarkers_){
GEvent.bind(_d,"changed",this,this.onMarkerMoved_);
}
var _11=this.getTilePoint_(_10,_f,GSize.ZERO);
for(var _12=_f;_12>=_e;_12--){
var _13=this.getGridCellCreate_(_11.x,_11.y,_12);
_13.push(_d);
_11.x=_11.x>>1;
_11.y=_11.y>>1;
}
};
MarkerManager.prototype.isGridPointVisible_=function(_14){
var me=this;
var _15=me.shownBounds_.minY<=_14.y&&_14.y<=me.shownBounds_.maxY;
var _16=me.shownBounds_.minX;
var _17=_16<=_14.x&&_14.x<=me.shownBounds_.maxX;
if(!_17&&_16<0){
var _18=me.gridWidth_[me.shownBounds_.z];
_17=_16+_18<=_14.x&&_14.x<=_18-1;
}
return _15&&_17;
};
MarkerManager.prototype.onMarkerMoved_=function(_19,_1a,_1b){
var me=this;
var _1c=me.maxZoom_;
var _1d=false;
var _1e=me.getTilePoint_(_1a,_1c,GSize.ZERO);
var _1f=me.getTilePoint_(_1b,_1c,GSize.ZERO);
while(_1c>=0&&(_1e.x!=_1f.x||_1e.y!=_1f.y)){
var _20=me.getGridCellNoCreate_(_1e.x,_1e.y,_1c);
if(_20){
if(me.removeFromArray(_20,_19)){
me.getGridCellCreate_(_1f.x,_1f.y,_1c).push(_19);
}
}
if(_1c==me.mapZoom_){
if(me.isGridPointVisible_(_1e)){
if(!me.isGridPointVisible_(_1f)){
me.removeOverlay_(_19);
_1d=true;
}
}else{
if(me.isGridPointVisible_(_1f)){
me.addOverlay_(_19);
_1d=true;
}
}
}
_1e.x=_1e.x>>1;
_1e.y=_1e.y>>1;
_1f.x=_1f.x>>1;
_1f.y=_1f.y>>1;
--_1c;
}
if(_1d){
me.notifyListeners_();
}
};
MarkerManager.prototype.removeMarker=function(_21){
var me=this;
var _22=me.maxZoom_;
var _23=false;
var _24=_21.getPoint();
var _25=me.getTilePoint_(_24,_22,GSize.ZERO);
while(_22>=0){
var _26=me.getGridCellNoCreate_(_25.x,_25.y,_22);
if(_26){
me.removeFromArray(_26,_21);
}
if(_22==me.mapZoom_){
if(me.isGridPointVisible_(_25)){
me.removeOverlay_(_21);
_23=true;
}
}
_25.x=_25.x>>1;
_25.y=_25.y>>1;
--_22;
}
if(_23){
me.notifyListeners_();
}
};
MarkerManager.prototype.addMarkers=function(_27,_28,_29){
var _2a=this.getOptMaxZoom_(_29);
for(var i=_27.length-1;i>=0;i--){
this.addMarkerBatch_(_27[i],_28,_2a);
}
this.numMarkers_[_28]+=_27.length;
};
MarkerManager.prototype.getOptMaxZoom_=function(_2b){
return _2b!=undefined?_2b:this.maxZoom_;
};
MarkerManager.prototype.getMarkerCount=function(_2c){
var _2d=0;
for(var z=0;z<=_2c;z++){
_2d+=this.numMarkers_[z];
}
return _2d;
};
MarkerManager.prototype.addMarker=function(_2e,_2f,_30){
var me=this;
var _31=this.getOptMaxZoom_(_30);
me.addMarkerBatch_(_2e,_2f,_31);
var _32=me.getTilePoint_(_2e.getPoint(),me.mapZoom_,GSize.ZERO);
if(me.isGridPointVisible_(_32)&&_2f<=me.shownBounds_.z&&me.shownBounds_.z<=_31){
me.addOverlay_(_2e);
me.notifyListeners_();
}
this.numMarkers_[_2f]++;
};
GBounds.prototype.containsPoint=function(_33){
var _34=this;
return (_34.minX<=_33.x&&_34.maxX>=_33.x&&_34.minY<=_33.y&&_34.maxY>=_33.y);
};
MarkerManager.prototype.getGridCellCreate_=function(x,y,z){
var _35=this.grid_[z];
if(x<0){
x+=this.gridWidth_[z];
}
var _36=_35[x];
if(!_36){
_36=_35[x]=[];
return _36[y]=[];
}
var _37=_36[y];
if(!_37){
return _36[y]=[];
}
return _37;
};
MarkerManager.prototype.getGridCellNoCreate_=function(x,y,z){
var _38=this.grid_[z];
if(x<0){
x+=this.gridWidth_[z];
}
var _39=_38[x];
return _39?_39[y]:undefined;
};
MarkerManager.prototype.getGridBounds_=function(_3a,_3b,_3c,_3d){
_3b=Math.min(_3b,this.maxZoom_);
var bl=_3a.getSouthWest();
var tr=_3a.getNorthEast();
var sw=this.getTilePoint_(bl,_3b,_3c);
var ne=this.getTilePoint_(tr,_3b,_3d);
var gw=this.gridWidth_[_3b];
if(tr.lng()<bl.lng()||ne.x<sw.x){
sw.x-=gw;
}
if(ne.x-sw.x+1>=gw){
sw.x=0;
ne.x=gw-1;
}
var _3e=new GBounds([sw,ne]);
_3e.z=_3b;
return _3e;
};
MarkerManager.prototype.getMapGridBounds_=function(){
var me=this;
return me.getGridBounds_(me.map_.getBounds(),me.mapZoom_,me.swPadding_,me.nePadding_);
};
MarkerManager.prototype.onMapMoveEnd_=function(){
var me=this;
me.objectSetTimeout_(this,this.updateMarkers_,0);
};
MarkerManager.prototype.objectSetTimeout_=function(_3f,_40,_41){
return window.setTimeout(function(){
_40.call(_3f);
},_41);
};
MarkerManager.prototype.refresh=function(){
var me=this;
if(me.shownMarkers_>0){
me.processAll_(me.shownBounds_,me.removeOverlay_);
}
me.processAll_(me.shownBounds_,me.addOverlay_);
me.notifyListeners_();
};
MarkerManager.prototype.updateMarkers_=function(){
var me=this;
me.mapZoom_=this.map_.getZoom();
var _42=me.getMapGridBounds_();
if(_42.equals(me.shownBounds_)&&_42.z==me.shownBounds_.z){
return;
}
if(_42.z!=me.shownBounds_.z){
me.processAll_(me.shownBounds_,me.removeOverlay_);
me.processAll_(_42,me.addOverlay_);
}else{
me.rectangleDiff_(me.shownBounds_,_42,me.removeCellMarkers_);
me.rectangleDiff_(_42,me.shownBounds_,me.addCellMarkers_);
}
me.shownBounds_=_42;
me.notifyListeners_();
};
MarkerManager.prototype.notifyListeners_=function(){
GEvent.trigger(this,"changed",this.shownBounds_,this.shownMarkers_);
};
MarkerManager.prototype.processAll_=function(_43,_44){
for(var x=_43.minX;x<=_43.maxX;x++){
for(var y=_43.minY;y<=_43.maxY;y++){
this.processCellMarkers_(x,y,_43.z,_44);
}
}
};
MarkerManager.prototype.processCellMarkers_=function(x,y,z,_45){
var _46=this.getGridCellNoCreate_(x,y,z);
if(_46){
for(var i=_46.length-1;i>=0;i--){
_45(_46[i]);
}
}
};
MarkerManager.prototype.removeCellMarkers_=function(x,y,z){
this.processCellMarkers_(x,y,z,this.removeOverlay_);
};
MarkerManager.prototype.addCellMarkers_=function(x,y,z){
this.processCellMarkers_(x,y,z,this.addOverlay_);
};
MarkerManager.prototype.rectangleDiff_=function(_47,_48,_49){
var me=this;
me.rectangleDiffCoords(_47,_48,function(x,y){
_49.apply(me,[x,y,_47.z]);
});
};
MarkerManager.prototype.rectangleDiffCoords=function(_4a,_4b,_4c){
var _4d=_4a.minX;
var _4e=_4a.minY;
var _4f=_4a.maxX;
var _50=_4a.maxY;
var _51=_4b.minX;
var _52=_4b.minY;
var _53=_4b.maxX;
var _54=_4b.maxY;
for(var x=_4d;x<=_4f;x++){
for(var y=_4e;y<=_50&&y<_52;y++){
_4c(x,y);
}
for(var y=Math.max(_54+1,_4e);y<=_50;y++){
_4c(x,y);
}
}
for(var y=Math.max(_4e,_52);y<=Math.min(_50,_54);y++){
for(var x=Math.min(_4f+1,_51)-1;x>=_4d;x--){
_4c(x,y);
}
for(var x=Math.max(_4d,_53+1);x<=_4f;x++){
_4c(x,y);
}
}
};
MarkerManager.prototype.removeFromArray=function(_55,_56,_57){
var _58=0;
for(var i=0;i<_55.length;++i){
if(_55[i]===_56||(_57&&_55[i]==_56)){
_55.splice(i--,1);
_58++;
}
}
return _58;
};

