function MarkerManager(b,c){var a=this;a.map_=b;a.mapZoom_=b.getZoom();a.projectionHelper_=new ProjectionHelperOverlay(b);google.maps.event.addListener(a.projectionHelper_,"ready",function(){a.projection_=this.getProjection();a.initialize(b,c)})}MarkerManager.prototype.initialize=function(f,h){var d=this;h=h||{};d.tileSize_=MarkerManager.DEFAULT_TILE_SIZE_;var b=f.mapTypes;var a=1;for(var g in b){if(typeof f.mapTypes.get(g)==="object"&&typeof f.mapTypes.get(g).maxZoom==="number"){var c=f.mapTypes.get(g).maxZoom;if(c>a){a=c}}}d.maxZoom_=h.maxZoom||19;d.trackMarkers_=h.trackMarkers;d.show_=h.show||true;var e;if(typeof h.borderPadding==="number"){e=h.borderPadding}else{e=MarkerManager.DEFAULT_BORDER_PADDING_}d.swPadding_=new google.maps.Size(-e,e);d.nePadding_=new google.maps.Size(e,-e);d.borderPadding_=e;d.gridWidth_={};d.grid_={};d.grid_[d.maxZoom_]={};d.numMarkers_={};d.numMarkers_[d.maxZoom_]=0;google.maps.event.addListener(f,"dragend",function(){d.onMapMoveEnd_()});google.maps.event.addListener(f,"idle",function(){d.onMapMoveEnd_()});google.maps.event.addListener(f,"zoom_changed",function(){d.onMapMoveEnd_()});d.removeOverlay_=function(i){i.setMap(null);d.shownMarkers_--};d.addOverlay_=function(i){if(d.show_){i.setMap(d.map_);d.shownMarkers_++}};d.resetManager_();d.shownMarkers_=0;d.shownBounds_=d.getMapGridBounds_();google.maps.event.trigger(d,"loaded")};MarkerManager.DEFAULT_TILE_SIZE_=1024;MarkerManager.DEFAULT_BORDER_PADDING_=100;MarkerManager.MERCATOR_ZOOM_LEVEL_ZERO_RANGE=256;MarkerManager.prototype.resetManager_=function(){var a=MarkerManager.MERCATOR_ZOOM_LEVEL_ZERO_RANGE;for(var b=0;b<=this.maxZoom_;++b){this.grid_[b]={};this.numMarkers_[b]=0;this.gridWidth_[b]=Math.ceil(a/this.tileSize_);a<<=1}};MarkerManager.prototype.clearMarkers=function(){this.processAll_(this.shownBounds_,this.removeOverlay_);this.resetManager_()};MarkerManager.prototype.getTilePoint_=function(e,c,d){var b=this.projectionHelper_.LatLngToPixel(e,c);var a=new google.maps.Point(Math.floor((b.x+d.width)/this.tileSize_),Math.floor((b.y+d.height)/this.tileSize_));return a};MarkerManager.prototype.addMarkerBatch_=function(c,h,b){var f=this;var g=c.getPosition();c.MarkerManager_minZoom=h;if(this.trackMarkers_){google.maps.event.addListener(c,"changed",function(j,i,k){f.onMarkerMoved_(j,i,k)})}var d=this.getTilePoint_(g,b,new google.maps.Size(0,0,0,0));for(var e=b;e>=h;e--){var a=this.getGridCellCreate_(d.x,d.y,e);a.push(c);d.x=d.x>>1;d.y=d.y>>1}};MarkerManager.prototype.isGridPointVisible_=function(b){var d=this.shownBounds_.minY<=b.y&&b.y<=this.shownBounds_.maxY;var a=this.shownBounds_.minX;var c=a<=b.x&&b.x<=this.shownBounds_.maxX;if(!c&&a<0){var e=this.gridWidth_[this.shownBounds_.z];c=a+e<=b.x&&b.x<=e-1}return d&&c};MarkerManager.prototype.onMarkerMoved_=function(c,g,b){var f=this.maxZoom_;var h=false;var e=this.getTilePoint_(g,f,new google.maps.Size(0,0,0,0));var d=this.getTilePoint_(b,f,new google.maps.Size(0,0,0,0));while(f>=0&&(e.x!==d.x||e.y!==d.y)){var a=this.getGridCellNoCreate_(e.x,e.y,f);if(a){if(this.removeFromArray_(a,c)){this.getGridCellCreate_(d.x,d.y,f).push(c)}}if(f===this.mapZoom_){if(this.isGridPointVisible_(e)){if(!this.isGridPointVisible_(d)){this.removeOverlay_(c);h=true}}else{if(this.isGridPointVisible_(d)){this.addOverlay_(c);h=true}}}e.x=e.x>>1;e.y=e.y>>1;d.x=d.x>>1;d.y=d.y>>1;--f}if(h){this.notifyListeners_()}};MarkerManager.prototype.removeMarker=function(c){var e=this.maxZoom_;var f=false;var b=c.getPosition();var d=this.getTilePoint_(b,e,new google.maps.Size(0,0,0,0));while(e>=0){var a=this.getGridCellNoCreate_(d.x,d.y,e);if(a){this.removeFromArray_(a,c)}if(e===this.mapZoom_){if(this.isGridPointVisible_(d)){this.removeOverlay_(c);f=true}}d.x=d.x>>1;d.y=d.y>>1;--e}if(f){this.notifyListeners_()}this.numMarkers_[c.MarkerManager_minZoom]--};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||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.getMarker=function(f,c,e){var g=new google.maps.LatLng(f,c);var b=this.getTilePoint_(g,e,new google.maps.Size(0,0,0,0));var a=new google.maps.Marker({position:g});var h=this.getGridCellNoCreate_(b.x,b.y,e);if(h!==undefined){for(var d=0;d<h.length;d++){if(f===h[d].getPosition().lat()&&c===h[d].getPosition().lng()){a=h[d]}}}return a};MarkerManager.prototype.addMarker=function(b,e,d){var a=this.getOptMaxZoom_(d);this.addMarkerBatch_(b,e,a);var c=this.getTilePoint_(b.getPosition(),this.mapZoom_,new google.maps.Size(0,0,0,0));if(this.isGridPointVisible_(c)&&e<=this.shownBounds_.z&&this.shownBounds_.z<=a){this.addOverlay_(b);this.notifyListeners_()}this.numMarkers_[e]++};function GridBounds(a){this.minX=Math.min(a[0].x,a[1].x);this.maxX=Math.max(a[0].x,a[1].x);this.minY=Math.min(a[0].y,a[1].y);this.maxY=Math.max(a[0].y,a[1].y)}GridBounds.prototype.equals=function(a){if(this.maxX===a.maxX&&this.maxY===a.maxY&&this.minX===a.minX&&this.minY===a.minY){return true}else{return false}};GridBounds.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(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(a,i,h,f){i=Math.min(i,this.maxZoom_);var b=a.getSouthWest();var e=a.getNorthEast();var g=this.getTilePoint_(b,i,h);var d=this.getTilePoint_(e,i,f);var j=this.gridWidth_[i];if(e.lng()<b.lng()||d.x<g.x){g.x-=j}if(d.x-g.x+1>=j){g.x=0;d.x=j-1}var c=new GridBounds([g,d]);c.z=i;return c};MarkerManager.prototype.getMapGridBounds_=function(){return this.getGridBounds_(this.map_.getBounds(),this.mapZoom_,this.swPadding_,this.nePadding_)};MarkerManager.prototype.onMapMoveEnd_=function(){this.objectSetTimeout_(this,this.updateMarkers_,0)};MarkerManager.prototype.objectSetTimeout_=function(b,c,a){return window.setTimeout(function(){c.call(b)},a)};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(){if(this.shownMarkers_>0){this.processAll_(this.shownBounds_,this.removeOverlay_)}if(this.show_){this.processAll_(this.shownBounds_,this.addOverlay_)}this.notifyListeners_()};MarkerManager.prototype.updateMarkers_=function(){this.mapZoom_=this.map_.getZoom();var a=this.getMapGridBounds_();if(a.equals(this.shownBounds_)&&a.z===this.shownBounds_.z){return}if(a.z!==this.shownBounds_.z){this.processAll_(this.shownBounds_,this.removeOverlay_);if(this.show_){this.processAll_(a,this.addOverlay_)}}else{this.rectangleDiff_(this.shownBounds_,a,this.removeCellMarkers_);if(this.show_){this.rectangleDiff_(a,this.shownBounds_,this.addCellMarkers_)}}this.shownBounds_=a;this.notifyListeners_()};MarkerManager.prototype.notifyListeners_=function(){google.maps.event.trigger(this,"changed",this.shownBounds_,this.shownMarkers_)};MarkerManager.prototype.processAll_=function(b,d){for(var a=b.minX;a<=b.maxX;a++){for(var c=b.minY;c<=b.maxY;c++){this.processCellMarkers_(a,c,b.z,d)}}};MarkerManager.prototype.processCellMarkers_=function(b,f,d,e){var a=this.getGridCellNoCreate_(b,f,d);if(a){for(var c=a.length-1;c>=0;c--){e(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,l){var f=b.minX;var m=b.minY;var h=b.maxX;var d=b.maxY;var e=a.minX;var k=a.minY;var g=a.maxX;var c=a.maxY;var j,i;for(j=f;j<=h;j++){for(i=m;i<=d&&i<k;i++){l(j,i)}for(i=Math.max(c+1,m);i<=d;i++){l(j,i)}}for(i=Math.max(m,k);i<=Math.min(d,c);i++){for(j=Math.min(h+1,e)-1;j>=f;j--){l(j,i)}for(j=Math.max(f,g+1);j<=h;j++){l(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};function ProjectionHelperOverlay(c){this.setMap(c);var a=8;var b=1<<a;var d=7;this._map=c;this._zoom=-1;this._X0=this._Y0=this._X1=this._Y1=-1}ProjectionHelperOverlay.prototype=new google.maps.OverlayView();ProjectionHelperOverlay.prototype.LngToX_=function(a){return(1+a/180)};ProjectionHelperOverlay.prototype.LatToY_=function(b){var a=Math.sin(b*Math.PI/180);return(1-0.5/Math.PI*Math.log((1+a)/(1-a)))};ProjectionHelperOverlay.prototype.LatLngToPixel=function(e,b){var c=this._map;var d=this.getProjection().fromLatLngToDivPixel(e);var a={x:~~(0.5+this.LngToX_(e.lng())*(2<<(b+6))),y:~~(0.5+this.LatToY_(e.lat())*(2<<(b+6)))};return a};ProjectionHelperOverlay.prototype.draw=function(){if(!this.ready){this.ready=true;google.maps.event.trigger(this,"ready")}};
