function MarkerManager(J,I){var G=this;
G.map_=J;
G.mapZoom_=J.getZoom();
G.projection_=J.getCurrentMapType().getProjection();
I=I||{};
G.tileSize_=MarkerManager.DEFAULT_TILE_SIZE_;
var H=MarkerManager.DEFAULT_MAX_ZOOM_;
if(I.maxZoom!=undefined){H=I.maxZoom
}G.maxZoom_=H;
G.trackMarkers_=I.trackMarkers;
var F;
if(typeof I.borderPadding=="number"){F=I.borderPadding
}else{F=MarkerManager.DEFAULT_BORDER_PADDING_
}G.swPadding_=new GSize(-F,F);
G.nePadding_=new GSize(F,-F);
G.borderPadding_=F;
G.gridWidth_=[];
G.grid_=[];
G.grid_[H]=[];
G.numMarkers_=[];
G.numMarkers_[H]=0;
GEvent.bind(J,"moveend",G,G.onMapMoveEnd_);
G.removeOverlay_=function(A){J.removeOverlay(A);
G.shownMarkers_--
};
G.addOverlay_=function(A){J.addOverlay(A);
G.shownMarkers_++
};
G.resetManager_();
G.shownMarkers_=0;
G.shownBounds_=G.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 D=this;
var F=MarkerManager.MERCATOR_ZOOM_LEVEL_ZERO_RANGE;
for(var E=0;
E<=D.maxZoom_;
++E){D.grid_[E]=[];
D.numMarkers_[E]=0;
D.gridWidth_[E]=Math.ceil(F/D.tileSize_);
F<<=1
}};
MarkerManager.prototype.clearMarkers=function(){var B=this;
B.processAll_(B.shownBounds_,B.removeOverlay_);
B.resetManager_()
};
MarkerManager.prototype.getTilePoint_=function(H,F,E){var G=this.projection_.fromLatLngToPixel(H,F);
return new GPoint(Math.floor((G.x+E.width)/this.tileSize_),Math.floor((G.y+E.height)/this.tileSize_))
};
MarkerManager.prototype.addMarkerBatch_=function(L,H,M){var I=L.getPoint();
if(this.trackMarkers_){GEvent.bind(L,"changed",this,this.onMarkerMoved_)
}var K=this.getTilePoint_(I,M,GSize.ZERO);
for(var J=M;
J>=H;
J--){var N=this.getGridCellCreate_(K.x,K.y,J);
N.push(L);
K.x=K.x>>1;
K.y=K.y>>1
}};
MarkerManager.prototype.isGridPointVisible_=function(H){var J=this;
var L=J.shownBounds_.minY<=H.y&&H.y<=J.shownBounds_.maxY;
var I=J.shownBounds_.minX;
var G=I<=H.x&&H.x<=J.shownBounds_.maxX;
if(!G&&I<0){var K=J.gridWidth_[J.shownBounds_.z];
G=I+K<=H.x&&H.x<=K-1
}return L&&G
};
MarkerManager.prototype.onMarkerMoved_=function(Q,L,J){var O=this;
var M=O.maxZoom_;
var R=false;
var K=O.getTilePoint_(L,M,GSize.ZERO);
var P=O.getTilePoint_(J,M,GSize.ZERO);
while(M>=0&&(K.x!=P.x||K.y!=P.y)){var N=O.getGridCellNoCreate_(K.x,K.y,M);
if(N){if(O.removeFromArray(N,Q)){O.getGridCellCreate_(P.x,P.y,M).push(Q)
}}if(M==O.mapZoom_){if(O.isGridPointVisible_(K)){if(!O.isGridPointVisible_(P)){O.removeOverlay_(Q);
R=true
}}else{if(O.isGridPointVisible_(P)){O.addOverlay_(Q);
R=true
}}}K.x=K.x>>1;
K.y=K.y>>1;
P.x=P.x>>1;
P.y=P.y>>1;
--M
}if(R){O.notifyListeners_()
}};
MarkerManager.prototype.removeMarker=function(L){var I=this;
var J=I.maxZoom_;
var H=false;
var M=L.getPoint();
var K=I.getTilePoint_(M,J,GSize.ZERO);
while(J>=0){var N=I.getGridCellNoCreate_(K.x,K.y,J);
if(N){I.removeFromArray(N,L)
}if(J==I.mapZoom_){if(I.isGridPointVisible_(K)){I.removeOverlay_(L);
H=true
}}K.x=K.x>>1;
K.y=K.y>>1;
--J
}if(H){I.notifyListeners_()
}};
MarkerManager.prototype.addMarkers=function(J,I,F){var H=this.getOptMaxZoom_(F);
for(var G=J.length-1;
G>=0;
G--){this.addMarkerBatch_(J[G],I,H)
}this.numMarkers_[I]+=J.length
};
MarkerManager.prototype.getOptMaxZoom_=function(B){return B!=undefined?B:this.maxZoom_
};
MarkerManager.prototype.getMarkerCount=function(E){var F=0;
for(var D=0;
D<=E;
D++){F+=this.numMarkers_[D]
}return F
};
MarkerManager.prototype.addMarker=function(H,J,L){var K=this;
var I=this.getOptMaxZoom_(L);
K.addMarkerBatch_(H,J,I);
var G=K.getTilePoint_(H.getPoint(),K.mapZoom_,GSize.ZERO);
if(K.isGridPointVisible_(G)&&J<=K.shownBounds_.z&&K.shownBounds_.z<=I){K.addOverlay_(H);
K.notifyListeners_()
}this.numMarkers_[J]++
};
GBounds.prototype.containsPoint=function(C){var D=this;
return(D.minX<=C.x&&D.maxX>=C.x&&D.minY<=C.y&&D.maxY>=C.y)
};
MarkerManager.prototype.getGridCellCreate_=function(I,J,K){var G=this.grid_[K];
if(I<0){I+=this.gridWidth_[K]
}var H=G[I];
if(!H){H=G[I]=[];
return H[J]=[]
}var L=H[J];
if(!L){return H[J]=[]
}return L
};
MarkerManager.prototype.getGridCellNoCreate_=function(H,I,J){var F=this.grid_[J];
if(H<0){H+=this.gridWidth_[J]
}var G=F[H];
return G?G[I]:undefined
};
MarkerManager.prototype.getGridBounds_=function(L,N,O,Q){N=Math.min(N,this.maxZoom_);
var K=L.getSouthWest();
var R=L.getNorthEast();
var P=this.getTilePoint_(K,N,O);
var S=this.getTilePoint_(R,N,Q);
var M=this.gridWidth_[N];
if(R.lng()<K.lng()||S.x<P.x){P.x-=M
}if(S.x-P.x+1>=M){P.x=0;
S.x=M-1
}var T=new GBounds([P,S]);
T.z=N;
return T
};
MarkerManager.prototype.getMapGridBounds_=function(){var B=this;
return B.getGridBounds_(B.map_.getBounds(),B.mapZoom_,B.swPadding_,B.nePadding_)
};
MarkerManager.prototype.onMapMoveEnd_=function(){var B=this;
B.objectSetTimeout_(this,this.updateMarkers_,0)
};
MarkerManager.prototype.objectSetTimeout_=function(E,D,F){return window.setTimeout(function(){D.call(E)
},F)
};
MarkerManager.prototype.refresh=function(){var B=this;
if(B.shownMarkers_>0){B.processAll_(B.shownBounds_,B.removeOverlay_)
}B.processAll_(B.shownBounds_,B.addOverlay_);
B.notifyListeners_()
};
MarkerManager.prototype.updateMarkers_=function(){var C=this;
C.mapZoom_=this.map_.getZoom();
var D=C.getMapGridBounds_();
if(D.equals(C.shownBounds_)&&D.z==C.shownBounds_.z){return 
}if(D.z!=C.shownBounds_.z){C.processAll_(C.shownBounds_,C.removeOverlay_);
C.processAll_(D,C.addOverlay_)
}else{C.rectangleDiff_(C.shownBounds_,D,C.removeCellMarkers_);
C.rectangleDiff_(D,C.shownBounds_,C.addCellMarkers_)
}C.shownBounds_=D;
C.notifyListeners_()
};
MarkerManager.prototype.notifyListeners_=function(){GEvent.trigger(this,"changed",this.shownBounds_,this.shownMarkers_)
};
MarkerManager.prototype.processAll_=function(F,H){for(var G=F.minX;
G<=F.maxX;
G++){for(var E=F.minY;
E<=F.maxY;
E++){this.processCellMarkers_(G,E,F.z,H)
}}};
MarkerManager.prototype.processCellMarkers_=function(H,J,L,K){var I=this.getGridCellNoCreate_(H,J,L);
if(I){for(var G=I.length-1;
G>=0;
G--){K(I[G])
}}};
MarkerManager.prototype.removeCellMarkers_=function(F,D,E){this.processCellMarkers_(F,D,E,this.removeOverlay_)
};
MarkerManager.prototype.addCellMarkers_=function(F,D,E){this.processCellMarkers_(F,D,E,this.addOverlay_)
};
MarkerManager.prototype.rectangleDiff_=function(F,G,H){var E=this;
E.rectangleDiffCoords(F,G,function(B,A){H.apply(E,[B,A,F.z])
})
};
MarkerManager.prototype.rectangleDiffCoords=function(X,Y,N){var T=X.minX;
var Z=X.minY;
var R=X.maxX;
var V=X.maxY;
var U=Y.minX;
var O=Y.minY;
var S=Y.maxX;
var W=Y.maxY;
for(var P=T;
P<=R;
P++){for(var Q=Z;
Q<=V&&Q<O;
Q++){N(P,Q)
}for(var Q=Math.max(W+1,Z);
Q<=V;
Q++){N(P,Q)
}}for(var Q=Math.max(Z,O);
Q<=Math.min(V,W);
Q++){for(var P=Math.min(R+1,U)-1;
P>=T;
P--){N(P,Q)
}for(var P=Math.max(T,S+1);
P<=R;
P++){N(P,Q)
}}};
MarkerManager.prototype.removeFromArray=function(I,F,J){var H=0;
for(var G=0;
G<I.length;
++G){if(I[G]===F||(J&&I[G]==F)){I.splice(G--,1);
H++
}}return H
};