function MarkerManager(c,b){var e=this;e.map_=c;e.mapZoom_=c.getZoom();e.projection_=c.getCurrentMapType().getProjection();b=b||{};e.tileSize_=MarkerManager.DEFAULT_TILE_SIZE_;var g=c.getMapTypes();var h=g[0].getMaximumResolution();for(var i=0;i<g.length;i++){var f=g[i].getMaximumResolution();if(f>h){h=f}}
e.maxZoom_=b.maxZoom||h;e.trackMarkers_=b.trackMarkers;e.show_=b.show||true;var d;if(typeof b.borderPadding==="number"){d=b.borderPadding}else{d=MarkerManager.DEFAULT_BORDER_PADDING_}
e.swPadding_=new GSize(-d,d);e.nePadding_=new GSize(d,-d);e.borderPadding_=d;e.gridWidth_=[];e.grid_=[];e.grid_[e.maxZoom_]=[];e.numMarkers_=[];e.numMarkers_[e.maxZoom_]=0;GEvent.bind(c,"moveend",e,e.onMapMoveEnd_);e.removeOverlay_=function(a){c.removeOverlay(a);e.shownMarkers_--};e.addOverlay_=function(a){if(e.show_){c.addOverlay(a);e.shownMarkers_++}};e.resetManager_();e.shownMarkers_=0;e.shownBounds_=e.getMapGridBounds_()}
MarkerManager.DEFAULT_TILE_SIZE_=1024;MarkerManager.DEFAULT_BORDER_PADDING_=100;MarkerManager.MERCATOR_ZOOM_LEVEL_ZERO_RANGE=256;MarkerManager.prototype.resetManager_=function(){var a=this;var c=MarkerManager.MERCATOR_ZOOM_LEVEL_ZERO_RANGE;for(var b=0;b<=a.maxZoom_;++b){a.grid_[b]=[];a.numMarkers_[b]=0;a.gridWidth_[b]=Math.ceil(c/a.tileSize_);c<<=1}};MarkerManager.prototype.clearMarkers=function(){var a=this;a.processAll_(a.shownBounds_,a.removeOverlay_);a.resetManager_()};MarkerManager.prototype.getTilePoint_=function(a,c,b){var d=this.projection_.fromLatLngToPixel(a,c);return new GPoint(Math.floor((d.x+b.width)/this.tileSize_),Math.floor((d.y+b.height)/this.tileSize_))};MarkerManager.prototype.addMarkerBatch_=function(e,a,f){var b=e.getPoint();e.MarkerManager_minZoom=a;if(this.trackMarkers_){GEvent.bind(e,"changed",this,this.onMarkerMoved_)}
var d=this.getTilePoint_(b,f,GSize.ZERO);for(var c=f;c>=a;c--){var g=this.getGridCellCreate_(d.x,d.y,c);g.push(e);d.x=d.x>>1;d.y=d.y>>1}};MarkerManager.prototype.isGridPointVisible_=function(e){var a=this;var c=a.shownBounds_.minY<=e.y&&e.y<=a.shownBounds_.maxY;var f=a.shownBounds_.minX;var d=f<=e.x&&e.x<=a.shownBounds_.maxX;if(!d&&f<0){var b=a.gridWidth_[a.shownBounds_.z];d=f+b<=e.x&&e.x<=b-1}
return c&&d};MarkerManager.prototype.onMarkerMoved_=function(e,i,g){var c=this;var a=c.maxZoom_;var f=false;var h=c.getTilePoint_(i,a,GSize.ZERO);var d=c.getTilePoint_(g,a,GSize.ZERO);while(a>=0&&(h.x!==d.x||h.y!==d.y)){var b=c.getGridCellNoCreate_(h.x,h.y,a);if(b){if(c.removeFromArray_(b,e)){c.getGridCellCreate_(d.x,d.y,a).push(e)}}
if(a===c.mapZoom_){if(c.isGridPointVisible_(h)){if(!c.isGridPointVisible_(d)){c.removeOverlay_(e);f=true}}else{if(c.isGridPointVisible_(d)){c.addOverlay_(e);f=true}}}
h.x=h.x>>1;h.y=h.y>>1;d.x=d.x>>1;d.y=d.y>>1;--a}
if(f){c.notifyListeners_()}};MarkerManager.prototype.removeMarker=function(e){var c=this;var b=c.maxZoom_;var a=false;var f=e.getPoint();var d=c.getTilePoint_(f,b,GSize.ZERO);while(b>=0){var g=c.getGridCellNoCreate_(d.x,d.y,b);if(g){c.removeFromArray_(g,e)}
if(b===c.mapZoom_){if(c.isGridPointVisible_(d)){c.removeOverlay_(e);a=true}}
d.x=d.x>>1;d.y=d.y>>1;--b}
if(a){c.notifyListeners_()}
c.numMarkers_[e.MarkerManager_minZoom]--};MarkerManager.prototype.addMarkers=function(b,a,c){var d=this.getOptMaxZoom_(c);for(var i=b.length-1;i>=0;i--){this.addMarkerBatch_(b[i],a,d)}
this.numMarkers_[a]+=b.length};MarkerManager.prototype.getOptMaxZoom_=function(a){return a||this.maxZoom_};MarkerManager.prototype.getMarkerCount=function(a){var b=0;for(var z=0;z<=a;z++){b+=this.numMarkers_[z]}
return b};MarkerManager.prototype.getMarker=function(e,b,a){var d=this;var h=new GLatLng(e,b);var g=d.getTilePoint_(h,a,GSize.ZERO);var f=new GMarker(h);var c=d.getGridCellNoCreate_(g.x,g.y,a);if(c!=undefined){for(var i=0;i<c.length;i++){if(e==c[i].getLatLng().lat()&&b==c[i].getLatLng().lng()){f=c[i]}}}
return f};MarkerManager.prototype.addMarker=function(e,a,c){var b=this;var f=this.getOptMaxZoom_(c);b.addMarkerBatch_(e,a,f);var d=b.getTilePoint_(e.getPoint(),b.mapZoom_,GSize.ZERO);if(b.isGridPointVisible_(d)&&a<=b.shownBounds_.z&&b.shownBounds_.z<=f){b.addOverlay_(e);b.notifyListeners_()}
this.numMarkers_[a]++};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(x,y,z){var b=this.grid_[z];if(x<0){x+=this.gridWidth_[z]}
var c=b[x];if(!c){c=b[x]=[];return(c[y]=[])}
var a=c[y];if(!a){return(c[y]=[])}
return a};MarkerManager.prototype.getGridCellNoCreate_=function(x,y,z){var a=this.grid_[z];if(x<0){x+=this.gridWidth_[z]}
var b=a[x];return b?b[y]:undefined};MarkerManager.prototype.getGridBounds_=function(j,b,c,e){b=Math.min(b,this.maxZoom_);var i=j.getSouthWest();var f=j.getNorthEast();var d=this.getTilePoint_(i,b,c);var g=this.getTilePoint_(f,b,e);var a=this.gridWidth_[b];if(f.lng()<i.lng()||g.x<d.x){d.x-=a}
if(g.x-d.x+1>=a){d.x=0;g.x=a-1}
var h=new GBounds([d,g]);h.z=b;return h};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,a,c){return window.setTimeout(function(){a.call(b)},c)};MarkerManager.prototype.visible=function(){return this.show_?true:false};MarkerManager.prototype.isHidden=function(){return!this.show_};MarkerManager.prototype.show=function(){this.show_=true;this.refresh()};MarkerManager.prototype.hide=function(){this.show_=false;this.refresh()};MarkerManager.prototype.toggle=function(){this.show_=!this.show_;this.refresh()};MarkerManager.prototype.refresh=function(){var a=this;if(a.shownMarkers_>0){a.processAll_(a.shownBounds_,a.removeOverlay_)}
if(a.show_){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_);if(a.show_){a.processAll_(b,a.addOverlay_)}}else{a.rectangleDiff_(a.shownBounds_,b,a.removeCellMarkers_);if(a.show_){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(b,a){for(var x=b.minX;x<=b.maxX;x++){for(var y=b.minY;y<=b.maxY;y++){this.processCellMarkers_(x,y,b.z,a)}}};MarkerManager.prototype.processCellMarkers_=function(x,y,z,a){var b=this.getGridCellNoCreate_(x,y,z);if(b){for(var i=b.length-1;i>=0;i--){a(b[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(c,d,a){var b=this;b.rectangleDiffCoords_(c,d,function(x,y){a.apply(b,[x,y,c.z])})};MarkerManager.prototype.rectangleDiffCoords_=function(j,k,b){var f=j.minX;var a=j.minY;var d=j.maxX;var h=j.maxY;var g=k.minX;var c=k.minY;var e=k.maxX;var i=k.maxY;var x,y;for(x=f;x<=d;x++){for(y=a;y<=h&&y<c;y++){b(x,y)}
for(y=Math.max(i+1,a);y<=h;y++){b(x,y)}}
for(y=Math.max(a,c);y<=Math.min(h,i);y++){for(x=Math.min(d+1,g)-1;x>=f;x--){b(x,y)}
for(x=Math.max(f,e+1);x<=d;x++){b(x,y)}}};MarkerManager.prototype.removeFromArray_=function(a,c,b){var d=0;for(var i=0;i<a.length;++i){if(a[i]===c||(b&&a[i]===c)){a.splice(i--,1);d++}}
return d};
