function MarkerManager(aa,ba){var me=this;me.map_=aa;me.mapZoom_=aa.getZoom();me.projection_=aa.getCurrentMapType().getProjection();ba=ba||{};me.tileSize_=MarkerManager.DEFAULT_TILE_SIZE_;var ca=MarkerManager.DEFAULT_MAX_ZOOM_;if(ba.maxZoom!=undefined){ca=ba.maxZoom;}
me.maxZoom_=ca;me.trackMarkers_=ba.trackMarkers;var da;if(typeof ba.borderPadding=="number"){da=ba.borderPadding;}
else{da=MarkerManager.DEFAULT_BORDER_PADDING_;}
me.swPadding_=new GSize(-da,da);me.nePadding_=new GSize(da,-da);me.borderPadding_=da;me.gridWidth_=[];me.grid_=[];me.grid_[ca]=[];me.numMarkers_=[];me.numMarkers_[ca]=0;GEvent.bind(aa,"moveend",me,me.onMapMoveEnd_);me.removeOverlay_=function(ea){aa.removeOverlay(ea);me.shownMarkers_--;};me.addOverlay_=function(fa){aa.addOverlay(fa);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 ga=MarkerManager.MERCATOR_ZOOM_LEVEL_ZERO_RANGE;for(var ha=0;ha<=me.maxZoom_;++ha){me.grid_[ha]=[];me.numMarkers_[ha]=0;me.gridWidth_[ha]=Math.ceil(ga/me.tileSize_);ga<<=1;}};MarkerManager.prototype.clearMarkers=function(){var me=this;me.processAll_(me.shownBounds_,me.removeOverlay_);me.resetManager_();};MarkerManager.prototype.getTilePoint_=function(ia,ja,ka){var la=this.projection_.fromLatLngToPixel(ia,ja);return new GPoint(Math.floor((la.x+ka.width)/this.tileSize_),Math.floor((la.y+ka.height)/this.tileSize_));};MarkerManager.prototype.addMarkerBatch_=function(ma,na,oa){var pa=ma.getPoint();if(this.trackMarkers_){GEvent.bind(ma,"changed",this,this.onMarkerMoved_);}
var qa=this.getTilePoint_(pa,oa,GSize.ZERO);for(var ra=oa;ra>=na;ra--){var sa=this.getGridCellCreate_(qa.x,qa.y,ra);sa.push(ma);qa.x=qa.x>>1;qa.y=qa.y>>1;}};MarkerManager.prototype.isGridPointVisible_=function(ta){var me=this;var ua=me.shownBounds_.minY<=ta.y&&ta.y<=me.shownBounds_.maxY;var va=me.shownBounds_.minX;var wa=va<=ta.x&&ta.x<=me.shownBounds_.maxX;if(!wa&&va<0){var xa=me.gridWidth_[me.shownBounds_.z];wa=va+xa<=ta.x&&ta.x<=xa-1;}
return ua&&wa;}
MarkerManager.prototype.onMarkerMoved_=function(ya,za,Aa){var me=this;var Ba=me.maxZoom_;var Ca=false;var Da=me.getTilePoint_(za,Ba,GSize.ZERO);var Ea=me.getTilePoint_(Aa,Ba,GSize.ZERO);while(Ba>=0&&(Da.x!=Ea.x||Da.y!=Ea.y)){var Fa=me.getGridCellNoCreate_(Da.x,Da.y,Ba);if(Fa){if(me.removeFromArray(Fa,ya)){me.getGridCellCreate_(Ea.x,Ea.y,Ba).push(ya);}}
if(Ba==me.mapZoom_){if(me.isGridPointVisible_(Da)){if(!me.isGridPointVisible_(Ea)){me.removeOverlay_(ya);Ca=true;}}
else{if(me.isGridPointVisible_(Ea)){me.addOverlay_(ya);Ca=true;}}}
Da.x=Da.x>>1;Da.y=Da.y>>1;Ea.x=Ea.x>>1;Ea.y=Ea.y>>1;--Ba;}
if(Ca){me.notifyListeners_();}};MarkerManager.prototype.removeMarker=function(Ga){var me=this;var Ha=me.maxZoom_;var Ia=false;var Ja=Ga.getPoint();var Ka=me.getTilePoint_(Ja,Ha,GSize.ZERO);while(Ha>=0){var La=me.getGridCellNoCreate_(Ka.x,Ka.y,Ha);if(La){me.removeFromArray(La,Ga);}
if(Ha==me.mapZoom_){if(me.isGridPointVisible_(Ka)){me.removeOverlay_(Ga);Ia=true;}}
Ka.x=Ka.x>>1;Ka.y=Ka.y>>1;--Ha;}
if(Ia){me.notifyListeners_();}};MarkerManager.prototype.addMarkers=function(Ma,Na,Oa){var Pa=this.getOptMaxZoom_(Oa);for(var i=Ma.length-1;i>=0;i--){this.addMarkerBatch_(Ma[i],Na,Pa);}
this.numMarkers_[Na]+=Ma.length;};MarkerManager.prototype.getOptMaxZoom_=function(Qa){return Qa!=undefined?Qa:this.maxZoom_;}
MarkerManager.prototype.getMarkerCount=function(Ra){var Sa=0;for(var z=0;z<=Ra;z++){Sa+=this.numMarkers_[z];}
return Sa;};MarkerManager.prototype.addMarker=function(Ta,Ua,Va){var me=this;var Wa=this.getOptMaxZoom_(Va);me.addMarkerBatch_(Ta,Ua,Wa);var Xa=me.getTilePoint_(Ta.getPoint(),me.mapZoom_,GSize.ZERO);if(me.isGridPointVisible_(Xa)&&Ua<=me.shownBounds_.z&&me.shownBounds_.z<=Wa){me.addOverlay_(Ta);me.notifyListeners_();}
this.numMarkers_[Ua]++;};GBounds.prototype.containsPoint=function(Ya){var Za=this;return(Za.minX<=Ya.x&&Za.maxX>=Ya.x&&Za.minY<=Ya.y&&Za.maxY>=Ya.y);}
MarkerManager.prototype.getGridCellCreate_=function(x,y,z){var $a=this.grid_[z];if(x<0){x+=this.gridWidth_[z];}
var ab=$a[x];if(!ab){ab=$a[x]=[];return ab[y]=[];}
var bb=ab[y];if(!bb){return ab[y]=[];}
return bb;};MarkerManager.prototype.getGridCellNoCreate_=function(x,y,z){var cb=this.grid_[z];if(x<0){x+=this.gridWidth_[z];}
var db=cb[x];return db?db[y]:undefined;};MarkerManager.prototype.getGridBounds_=function(eb,fb,gb,hb){fb=Math.min(fb,this.maxZoom_);var bl=eb.getSouthWest();var tr=eb.getNorthEast();var sw=this.getTilePoint_(bl,fb,gb);var ne=this.getTilePoint_(tr,fb,hb);var gw=this.gridWidth_[fb];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 ib=new GBounds([sw,ne]);ib.z=fb;return ib;};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(jb,kb,lb){return window.setTimeout(function(){kb.call(jb);},lb);};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 mb=me.getMapGridBounds_();if(mb.equals(me.shownBounds_)&&mb.z==me.shownBounds_.z){return;}
if(mb.z!=me.shownBounds_.z){me.processAll_(me.shownBounds_,me.removeOverlay_);me.processAll_(mb,me.addOverlay_);}
else{me.rectangleDiff_(me.shownBounds_,mb,me.removeCellMarkers_);me.rectangleDiff_(mb,me.shownBounds_,me.addCellMarkers_);}
me.shownBounds_=mb;me.notifyListeners_();};MarkerManager.prototype.notifyListeners_=function(){GEvent.trigger(this,"changed",this.shownBounds_,this.shownMarkers_);};MarkerManager.prototype.processAll_=function(nb,ob){for(var x=nb.minX;x<=nb.maxX;x++){for(var y=nb.minY;y<=nb.maxY;y++){this.processCellMarkers_(x,y,nb.z,ob);}}};MarkerManager.prototype.processCellMarkers_=function(x,y,z,pb){var qb=this.getGridCellNoCreate_(x,y,z);if(qb){for(var i=qb.length-1;i>=0;i--){pb(qb[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(rb,sb,tb){var me=this;me.rectangleDiffCoords(rb,sb,function(x,y){tb.apply(me,[x,y,rb.z]);});};MarkerManager.prototype.rectangleDiffCoords=function(ub,vb,wb){var xb=ub.minX;var yb=ub.minY;var zb=ub.maxX;var Ab=ub.maxY;var Bb=vb.minX;var Cb=vb.minY;var Db=vb.maxX;var Eb=vb.maxY;for(var x=xb;x<=zb;x++){for(var y=yb;y<=Ab&&y<Cb;y++){wb(x,y);}
for(var y=Math.max(Eb+1,yb);y<=Ab;y++){wb(x,y);}}
for(var y=Math.max(yb,Cb);y<=Math.min(Ab,Eb);y++){for(var x=Math.min(zb+1,Bb)-1;x>=xb;x--){wb(x,y);}
for(var x=Math.max(xb,Db+1);x<=zb;x++){wb(x,y);}}};MarkerManager.prototype.removeFromArray=function(Fb,Gb,Hb){var Ib=0;for(var i=0;i<Fb.length;++i){if(Fb[i]===Gb||(Hb&&Fb[i]==Gb)){Fb.splice(i--,1);Ib++;}}
return Ib;};