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