function MarkerManager(b,c){var d=this;d.map_=b;d.mapZoom_=b.getZoom();d.projection_=b.getCurrentMapType().getProjection();c=c||{};d.tileSize_=MarkerManager.DEFAULT_TILE_SIZE_;var e=MarkerManager.DEFAULT_MAX_ZOOM_;if(c.maxZoom!=undefined){e=c.maxZoom}d.maxZoom_=e;d.trackMarkers_=c.trackMarkers;var f;if(typeof c.borderPadding=="number"){f=c.borderPadding}else{f=MarkerManager.DEFAULT_BORDER_PADDING_}d.swPadding_=new GSize(-f,f);d.nePadding_=new GSize(f,-f);d.borderPadding_=f;d.gridWidth_=[];d.grid_=[];d.grid_[e]=[];d.numMarkers_=[];d.numMarkers_[e]=0;GEvent.bind(b,"moveend",d,d.onMapMoveEnd_);d.removeOverlay_=function(a){b.removeOverlay(a);d.shownMarkers_--};d.addOverlay_=function(a){b.addOverlay(a);d.shownMarkers_++};d.resetManager_();d.shownMarkers_=0;d.shownBounds_=d.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(a,b,c){var d=this.projection_.fromLatLngToPixel(a,b);return new GPoint(Math.floor((d.x+c.width)/this.tileSize_),Math.floor((d.y+c.height)/this.tileSize_))};MarkerManager.prototype.addMarkerBatch_=function(a,b,c){var d=a.getPoint();if(this.trackMarkers_){GEvent.bind(a,"changed",this,this.onMarkerMoved_)}var e=this.getTilePoint_(d,c,GSize.ZERO);for(var f=c;f>=b;f--){var g=this.getGridCellCreate_(e.x,e.y,f);g.push(a);e.x=e.x>>1;e.y=e.y>>1}};MarkerManager.prototype.isGridPointVisible_=function(a){var b=this;var c=b.shownBounds_.minY<=a.y&&a.y<=b.shownBounds_.maxY;var d=b.shownBounds_.minX;var e=d<=a.x&&a.x<=b.shownBounds_.maxX;if(!e&&d<0){var f=b.gridWidth_[b.shownBounds_.z];e=d+f<=a.x&&a.x<=f-1}return c&&e};MarkerManager.prototype.onMarkerMoved_=function(a,b,c){var d=this;var e=d.maxZoom_;var f=false;var g=d.getTilePoint_(b,e,GSize.ZERO);var h=d.getTilePoint_(c,e,GSize.ZERO);while(e>=0&&(g.x!=h.x||g.y!=h.y)){var i=d.getGridCellNoCreate_(g.x,g.y,e);if(i){if(d.removeFromArray(i,a)){d.getGridCellCreate_(h.x,h.y,e).push(a)}}if(e==d.mapZoom_){if(d.isGridPointVisible_(g)){if(!d.isGridPointVisible_(h)){d.removeOverlay_(a);f=true}}else{if(d.isGridPointVisible_(h)){d.addOverlay_(a);f=true}}}g.x=g.x>>1;g.y=g.y>>1;h.x=h.x>>1;h.y=h.y>>1;--e}if(f){d.notifyListeners_()}};MarkerManager.prototype.removeMarker=function(a){var b=this;var c=b.maxZoom_;var d=false;var e=a.getPoint();var f=b.getTilePoint_(e,c,GSize.ZERO);while(c>=0){var g=b.getGridCellNoCreate_(f.x,f.y,c);if(g){b.removeFromArray(g,a)}if(c==b.mapZoom_){if(b.isGridPointVisible_(f)){b.removeOverlay_(a);d=true}}f.x=f.x>>1;f.y=f.y>>1;--c}if(d){b.notifyListeners_()}};MarkerManager.prototype.addMarkers=function(a,b,c){var d=this.getOptMaxZoom_(c);for(var i=a.length-1;i>=0;i--){this.addMarkerBatch_(a[i],b,d)}this.numMarkers_[b]+=a.length};MarkerManager.prototype.getOptMaxZoom_=function(a){return a!=undefined?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.addMarker=function(a,b,c){var d=this;var e=this.getOptMaxZoom_(c);d.addMarkerBatch_(a,b,e);var f=d.getTilePoint_(a.getPoint(),d.mapZoom_,GSize.ZERO);if(d.isGridPointVisible_(f)&&b<=d.shownBounds_.z&&d.shownBounds_.z<=e){d.addOverlay_(a);d.notifyListeners_()}this.numMarkers_[b]++};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 a=this.grid_[z];if(x<0){x+=this.gridWidth_[z]}var b=a[x];if(!b){b=a[x]=[];return b[y]=[]}var c=b[y];if(!c){return b[y]=[]}return c};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(a,b,c,d){b=Math.min(b,this.maxZoom_);var e=a.getSouthWest();var f=a.getNorthEast();var g=this.getTilePoint_(e,b,c);var h=this.getTilePoint_(f,b,d);var i=this.gridWidth_[b];if(f.lng()<e.lng()||h.x<g.x){g.x-=i}if(h.x-g.x+1>=i){g.x=0;h.x=i-1}var j=new GBounds([g,h]);j.z=b;return j};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(a,b,c){return window.setTimeout(function(){b.call(a)},c)};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(a,b){for(var x=a.minX;x<=a.maxX;x++){for(var y=a.minY;y<=a.maxY;y++){this.processCellMarkers_(x,y,a.z,b)}}};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(a,b,c){var d=this;d.rectangleDiffCoords(a,b,function(x,y){c.apply(d,[x,y,a.z])})};MarkerManager.prototype.rectangleDiffCoords=function(a,b,c){var d=a.minX;var e=a.minY;var f=a.maxX;var g=a.maxY;var h=b.minX;var i=b.minY;var j=b.maxX;var k=b.maxY;for(var x=d;x<=f;x++){for(var y=e;y<=g&&y<i;y++){c(x,y)}for(var y=Math.max(k+1,e);y<=g;y++){c(x,y)}}for(var y=Math.max(e,i);y<=Math.min(g,k);y++){for(var x=Math.min(f+1,h)-1;x>=d;x--){c(x,y)}for(var x=Math.max(d,j+1);x<=f;x++){c(x,y)}}};MarkerManager.prototype.removeFromArray=function(a,b,c){var d=0;for(var i=0;i<a.length;++i){if(a[i]===b||(c&&a[i]==b)){a.splice(i--,1);d++}}return d};
