function MarkerManager(G,H){var E=this;
E.map_=G;
E.mapZoom_=G.getZoom();
E.projection_=G.getCurrentMapType().getProjection();
H=H||{};
E.tileSize_=MarkerManager.DEFAULT_TILE_SIZE_;
var B=G.getMapTypes();
var A=B[0].getMaximumResolution();
for(var C=0;
C<B.length;
C++){var D=B[C].getMaximumResolution();
if(D>A){A=D
}}E.maxZoom_=H.maxZoom||A;
E.trackMarkers_=H.trackMarkers;
E.show_=H.show||true;
var F;
if(typeof H.borderPadding==="number"){F=H.borderPadding
}else{F=MarkerManager.DEFAULT_BORDER_PADDING_
}E.swPadding_=new GSize(-F,F);
E.nePadding_=new GSize(F,-F);
E.borderPadding_=F;
E.gridWidth_=[];
E.grid_=[];
E.grid_[E.maxZoom_]=[];
E.numMarkers_=[];
E.numMarkers_[E.maxZoom_]=0;
GEvent.bind(G,"moveend",E,E.onMapMoveEnd_);
E.removeOverlay_=function(I){G.removeOverlay(I);
E.shownMarkers_--
};
E.addOverlay_=function(I){if(E.show_){G.addOverlay(I);
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 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(D,B,C){var A=this.projection_.fromLatLngToPixel(D,B);
return new GPoint(Math.floor((A.x+C.width)/this.tileSize_),Math.floor((A.y+C.height)/this.tileSize_))
};
MarkerManager.prototype.addMarkerBatch_=function(C,G,B){var F=C.getPoint();
C.MarkerManager_minZoom=G;
if(this.trackMarkers_){GEvent.bind(C,"changed",this,this.onMarkerMoved_)
}var D=this.getTilePoint_(F,B,GSize.ZERO);
for(var E=B;
E>=G;
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 F=this;
var D=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 E=F.gridWidth_[F.shownBounds_.z];
C=A+E<=B.x&&B.x<=E-1
}return D&&C
};
MarkerManager.prototype.onMarkerMoved_=function(E,A,C){var G=this;
var I=G.maxZoom_;
var D=false;
var B=G.getTilePoint_(A,I,GSize.ZERO);
var F=G.getTilePoint_(C,I,GSize.ZERO);
while(I>=0&&(B.x!==F.x||B.y!==F.y)){var H=G.getGridCellNoCreate_(B.x,B.y,I);
if(H){if(G.removeFromArray_(H,E)){G.getGridCellCreate_(F.x,F.y,I).push(E)
}}if(I===G.mapZoom_){if(G.isGridPointVisible_(B)){if(!G.isGridPointVisible_(F)){G.removeOverlay_(E);
D=true
}}else{if(G.isGridPointVisible_(F)){G.addOverlay_(E);
D=true
}}}B.x=B.x>>1;
B.y=B.y>>1;
F.x=F.x>>1;
F.y=F.y>>1;
--I
}if(D){G.notifyListeners_()
}};
MarkerManager.prototype.removeMarker=function(C){var F=this;
var E=F.maxZoom_;
var G=false;
var B=C.getPoint();
var D=F.getTilePoint_(B,E,GSize.ZERO);
while(E>=0){var A=F.getGridCellNoCreate_(D.x,D.y,E);
if(A){F.removeFromArray_(A,C)
}if(E===F.mapZoom_){if(F.isGridPointVisible_(D)){F.removeOverlay_(C);
G=true
}}D.x=D.x>>1;
D.y=D.y>>1;
--E
}if(G){F.notifyListeners_()
}F.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(E,H,I){var F=this;
var A=new GLatLng(E,H);
var B=F.getTilePoint_(A,I,GSize.ZERO);
var D=new GMarker(A);
var G=F.getGridCellNoCreate_(B.x,B.y,I);
if(G!=undefined){for(var C=0;
C<G.length;
C++){if(E==G[C].getLatLng().lat()&&H==G[C].getLatLng().lng()){D=G[C]
}}}return D
};
MarkerManager.prototype.addMarker=function(B,F,D){var E=this;
var A=this.getOptMaxZoom_(D);
E.addMarkerBatch_(B,F,A);
var C=E.getTilePoint_(B.getPoint(),E.mapZoom_,GSize.ZERO);
if(E.isGridPointVisible_(C)&&F<=E.shownBounds_.z&&E.shownBounds_.z<=A){E.addOverlay_(B);
E.notifyListeners_()
}this.numMarkers_[F]++
};
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(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 GBounds([G,D]);
C.z=I;
return C
};
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.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,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
};