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