
$.googleMap={maps:{},marker:function(m,ct){if(!m){return null;}else if(m.lat==null&&m.lng==null){return $.googleMap.marker($.googleMap.readFromGeo(m));}else{var gkicon=new GIcon();gkicon.image='http://www.tregny.com/css/img/i/markers/m'+(ct+1)+'.png';gkicon.shadow='http://www.tregny.com/css/img/i/markers/marker_shadow.png';gkicon.iconSize=new GSize(20,35);gkicon.shadowSize=new GSize(39,35);gkicon.iconAnchor=new GPoint(13,34);gkicon.infoWindowAnchor=new GPoint(10,2);var marker=new GMarker(new GLatLng(m.lat,m.lng),{icon:gkicon});GEvent.addListener(marker,"mouseover",function(){marker.setImage("http://www.tregny.com/css/img/i/markers/m"+(ct+1)+"o.png");marker.importance=50;var popuphtml;var priceWithCommas=window.gAddCommas(m.price);popuphtml='<img src="http://www.tregny.com/reo'+m.img+'" width="75" class="left" />';popuphtml+='<div class="left" style="width: 165px; padding: 0 0 0 10px;">';popuphtml+='<h4 class="header-reg notopm"><a href="http://www.tregny.com/details/'+m.aptnum+'">$'+priceWithCommas+' '+m.apttype+' '+m.blgtype+'</a></h4>';popuphtml+='<div style="font-size: 1.1em; color: #333; margin-bottom: 10px;">';popuphtml+='<p><b>Price</b>: $'+priceWithCommas+'</p>';popuphtml+='<p><b>Neighborhood</b>: '+m.hood+'</p>';popuphtml+=(m.title==''||m.title==null)?'':'<p><b>Description</b>: '+m.title+'</p>';popuphtml+='</div></div>';$('#gmapPointPopup').gmapPopup({html:popuphtml});});GEvent.addListener(marker,"mouseout",function(){marker.setImage("http://www.tregny.com/css/img/i/markers/m"+(ct+1)+".png");$('#gmapPointPopup').hide();});tregny_gmarkers[ct]=marker;GEvent.addListener(marker,"click",function(){window.location='/details/'+m.aptnum;});return marker;}},readFromGeo:function(elem){var latElem=$(".latitude",elem)[0];var lngElem=$(".longitude",elem)[0];if(latElem&&lngElem){return{lat:parseFloat($(latElem).attr("title")),lng:parseFloat($(lngElem).attr("title")),txt:$(elem).attr("title")}}else{return null;}},mapNum:1};$.fn.googleMap=function(lat,lng,zoom,options){if(!window.GBrowserIsCompatible||!GBrowserIsCompatible())return this;if(lat==null)lat=37.4419;if(lng==null)lng=-122.1419;if(!zoom)zoom=13;if(!options||typeof options!='object')options={};options.mapOptions=options.mapOptions||{};options.markers=options.markers||[];options.controls=options.controls||{};return this.each(function(){if(!this.id)this.id="gMap"+$.googleMap.mapNum++;var map=$.googleMap.maps[this.id]=new GMap2(this,options.mapOptions);map.setCenter(new GLatLng(lat,lng),zoom);for(var i=0;i<options.controls.length;i++){var c=options.controls[i];eval("map.addControl(new "+c+"());");}
var marker=null;for(var i=0;i<options.markers.length;i++){if(marker=$.googleMap.marker(options.markers[i],i))map.addOverlay(marker);}});};(function($){$.scrollFollow=function(box,options)
{box=$(box);var position=box.css('position');function ani()
{box.queue([]);var viewportHeight=parseInt($(window).height());var pageScroll=parseInt($(document).scrollTop());var parentTop=parseInt(box.cont.offset().top);var parentHeight=parseInt(box.cont.attr('offsetHeight'));var boxHeight=parseInt(box.attr('offsetHeight')+(parseInt(box.css('marginTop'))||0)+(parseInt(box.css('marginBottom'))||0));var aniTop;if(isActive)
{if(options.relativeTo=='top')
{if(box.initialOffsetTop>=(pageScroll+options.offset))
{aniTop=box.initialTop;}
else
{aniTop=Math.min((Math.max((-parentTop),(pageScroll-box.initialOffsetTop+box.initialTop))+options.offset),(parentHeight-boxHeight-box.paddingAdjustment));}}
else if(options.relativeTo=='bottom')
{if((box.initialOffsetTop+boxHeight)>=(pageScroll+options.offset+viewportHeight))
{aniTop=box.initialTop;}
else
{aniTop=Math.min((pageScroll+viewportHeight-boxHeight-options.offset),(parentHeight-boxHeight));}}
if((new Date().getTime()-box.lastScroll)>=(options.delay-20))
{box.animate({top:aniTop},options.speed,options.easing);}}};var isActive=true;if($.cookie!=undefined)
{if($.cookie('scrollFollowSetting'+box.attr('id'))=='false')
{var isActive=false;$('#'+options.killSwitch).text(options.offText).toggle(function()
{isActive=true;$(this).text(options.onText);$.cookie('scrollFollowSetting'+box.attr('id'),true,{expires:365,path:'/'});ani();},function()
{isActive=false;$(this).text(options.offText);box.animate({top:box.initialTop},options.speed,options.easing);$.cookie('scrollFollowSetting'+box.attr('id'),false,{expires:365,path:'/'});});}
else
{$('#'+options.killSwitch).text(options.onText).toggle(function()
{isActive=false;$(this).text(options.offText);box.animate({top:box.initialTop},0);$.cookie('scrollFollowSetting'+box.attr('id'),false,{expires:365,path:'/'});},function()
{isActive=true;$(this).text(options.onText);$.cookie('scrollFollowSetting'+box.attr('id'),true,{expires:365,path:'/'});ani();});}}
if(options.container=='')
{box.cont=box.parent();}
else
{box.cont=$('#'+options.container);}
box.initialOffsetTop=parseInt(box.offset().top);box.initialTop=parseInt(box.css('top'))||0;if(box.css('position')=='relative')
{box.paddingAdjustment=parseInt(box.cont.css('paddingTop'))+parseInt(box.cont.css('paddingBottom'));}
else
{box.paddingAdjustment=0;}
$(window).scroll(function()
{$.fn.scrollFollow.interval=setTimeout(function(){ani();},options.delay);box.lastScroll=new Date().getTime();});$(window).resize(function()
{$.fn.scrollFollow.interval=setTimeout(function(){ani();},options.delay);box.lastScroll=new Date().getTime();});box.lastScroll=0;ani();};$.fn.scrollFollow=function(options)
{options=options||{};options.relativeTo=options.relativeTo||'top';options.speed=options.speed||500;options.offset=options.offset||0;options.easing=options.easing||'swing';options.container=options.container||this.parent().attr('id');options.killSwitch=options.killSwitch||'killSwitch';options.onText=options.onText||'Turn Slide Off';options.offText=options.offText||'Turn Slide On';options.delay=options.delay||0;this.each(function()
{new $.scrollFollow(this,options);});return this;};})(jQuery);var markerArray=[];var showedArray=[];var tooltip_flag=false;_DOMCONTROLS={'cats':null,'tip':null,'tipinner':null};$(document).ready(function(){if(GBrowserIsCompatible()&&document.getElementById("ad-map")){map=new GMap2(document.getElementById("ad-map"));map.addControl(new GSmallMapControl());map.setCenter(new GLatLng(40.740161,-73.985879),12);function makeIcon(count_from_zero,isHover){var icon=new GIcon();icon.image=makeImage(count_from_zero,isHover);icon.shadow='/css/img/i/markers2/shadow.png';icon.iconSize=new GSize(18,23);icon.iconAnchor=new GPoint(10,23);icon.shadowSize=new GSize(34,24);return icon;}
function makeImage(count_from_zero,isHover){return'/css/img/i/markers2/'+(parseInt(count_from_zero)+1)+((isHover)?'_on':'')+'.png';};function makeIconG(count_from_zero,isHover){var icon=new GIcon();icon.image=makeImageG(count_from_zero,isHover);icon.shadow='/css/img/i/markers2/marker_shadow.png';icon.iconSize=new GSize(18,23);icon.iconAnchor=new GPoint(10,23);icon.shadowSize=new GSize(34,24);return icon;}
function makeImageG(count_from_zero,isHover){return'/css/img/i/markers2/marker'+((isHover)?'_on':'')+'.png';};function makeMarker(latlng,count_from_zero){var multi_key=-1;var multi=0;for(var x=0;x<gmap_JSON.grouped.length;x++){if(in_array(count_from_zero,gmap_JSON.grouped[x])&&gmap_JSON.grouped[x].length>1){multi=1;multi_key=x;}};if(multi){var mkr=new GMarker(latlng,{icon:makeIconG(count_from_zero,false)});var mkrhtml;var mkrhtml_;var mkrhtml='<div class="listings_pop">';mkrhtml+='<div class="listings_pop_head"><a href="javascript: void(0);" id="hide_tt">CLOSE</a></div>';mkrhtml+='<div class="pop_listings_wrap">'
mkrhtml_='';for(var xx=0;xx<gmap_JSON.grouped[multi_key].length;xx++){var n=gmap_JSON.grouped[multi_key][xx];var i=gmap_JSON.info[n];mkrhtml+='<div class="search2_item_img"> <a href="/details/'+i.aptid+'"><img title="'+i.aptid+'" src="http://www.tregny.com/reo'+i.ad_img+'" width="100" /></a> </div>';mkrhtml+='<div class="search2_item_info">';mkrhtml+='<ul class="clean">';mkrhtml+='<li class="left"><h3><a href="/details/'+i.aptid+'" title="'+i.price+' '+i.apttype+' '+i.blgtype+'">'+i.apttype+'</a></h3></li>';mkrhtml+='<li class="right search2_item_prc">'+i.price+'</li>';mkrhtml+='<li class="left both search2_item_hood">'+i.hood+'</li>';if(i.adtitle!='')mkrhtml+='<li class="left search2_item_bb">'+i.adtitle+'</li>';mkrhtml+='</ul>';mkrhtml+='</div>';mkrhtml+='<div class="both"></div>';if(xx<3)mkrhtml_+='<h4 class="nobotm">'+i.price+' '+i.apttype+' '+i.blgtype+'</h4>';};mkrhtml+='</div>';mkrhtml+='</div>';if((gmap_JSON.grouped[multi_key].length-3)>0)mkrhtml_+='<br/>There are ('+(gmap_JSON.grouped[multi_key].length-3)+') more listings...';GEvent.addListener(mkr,'click',function(){Tooltip('show',mkr,mkrhtml);tooltip_flag=true;$("#hide_tt").bind("click",function(){Tooltip('hide');tooltip_flag=false;});});GEvent.addListener(mkr,'mouseover',function(){if(!tooltip_flag){Tooltip('show',mkr,mkrhtml_);mkr.setImage(makeImageG(count_from_zero,true));itemMouseover($('#f_item'+count_from_zero));}});GEvent.addListener(mkr,'mouseout',function(){if(!tooltip_flag){Tooltip('hide');mkr.setImage(makeImageG(count_from_zero,false));itemMouseout($('#f_item'+count_from_zero));}});showedArray.push(multi_key);return mkr;}
else{var mkr=new GMarker(latlng,{icon:makeIcon(count_from_zero,false)});var i=gmap_JSON.info[count_from_zero];var mkrhtml_='<h4 class="nobotm">'+i.price+' '+i.apttype+' '+i.blgtype+'</h4>';mkrhtml_+='<p class="nomarg"><small>'+i.hood+'</small></p>';if(i.adtitle!='')
mkrhtml_+='<p class="nomarg"><small>&ldquo;'+i.adtitle+'&rdquo;</small></p>';var mkrhtml='<div class="listings_pop">';mkrhtml+='<div class="listings_pop_head"><a href="javascript: void(0);" id="hide_tt">close</a></div>';mkrhtml+='<div class="search2_item_img"> <a href="/details/'+i.aptid+'"><img title="'+i.aptid+'" src="http://www.tregny.com/reo'+i.ad_img+'" width="100" /></a> </div>';mkrhtml+='<div class="search2_item_info">';mkrhtml+='<h3><a href="/details/'+i.aptid+'" title="'+i.price+' '+i.apttype+' '+i.blgtype+'">'+i.apttype+'</a></h3>';mkrhtml+='<ul class="clean">';mkrhtml+='<li class="right search2_item_prc">'+i.price+'</li>';mkrhtml+='<li class="left both search2_item_hood">'+i.hood+'</li>';if(i.adtitle!='')mkrhtml+='<li class="left search2_item_bb">'+i.adtitle+'</li>';mkrhtml+='</ul>';mkrhtml+='</div>';mkrhtml+='<div class="both"></div>';mkrhtml+='</div>';GEvent.addListener(mkr,'click',function(){Tooltip('show',mkr,mkrhtml);tooltip_flag=true;$("#hide_tt").bind("click",function(){Tooltip('hide');tooltip_flag=false;});});GEvent.addListener(mkr,'mouseover',function(){if(!tooltip_flag){Tooltip('show',mkr,mkrhtml_);mkr.setImage(makeImage(count_from_zero,true));itemMouseover($('#f_item'+count_from_zero));}});GEvent.addListener(mkr,'mouseout',function(){if(!tooltip_flag){Tooltip('hide');mkr.setImage(makeImage(count_from_zero,false));itemMouseout($('#f_item'+count_from_zero));}});return mkr;}};function generateBoundsFromMarkers(markers){var left,right,top,bottom;for(var x=0;x<markers.length;x++){if(markers[x]!=''){var mpos=markers[x].getLatLng();if(mpos.lng()<left||!left)left=mpos.lng();if(mpos.lng()>right||!right)right=mpos.lng();if(mpos.lat()<bottom||!bottom)bottom=mpos.lat();if(mpos.lat()>top||!top)top=mpos.lat();};};var sw=new GLatLng(bottom,left);var ne=new GLatLng(top,right);return new GLatLngBounds(sw,ne);};function TooltipControl(){};TooltipControl.prototype=new GControl();TooltipControl.prototype.initialize=function(map){var tip=document.createElement('div');var tip_inner=document.createElement('div');_DOMCONTROLS.tip=tip;_DOMCONTROLS.tipinner=tip_inner;$(tip).css({'padding':'0 6px 0 0','display':'none','position':'relative','width':'183px'});$(tip_inner).css({'font-size':'0.9em','width':'170px','padding':'','border-left':'1px solid #ddd','border-top':'1px solid #ddd'});tip.appendChild(tip_inner);map.getContainer().appendChild(tip);return tip;};TooltipControl.prototype.getDefaultPosition=function(){return new GControlPosition(G_ANCHOR_TOP_LEFT);}
function Tooltip(showorhide,marker,html){var $tip=$(_DOMCONTROLS.tip);var $tipinner=$(_DOMCONTROLS.tipinner);if(showorhide=='hide'){$tip.hide();}else{$tipinner.html(html);var _mpos=map.fromLatLngToContainerPixel(marker.getLatLng());var _twidth=$tip.width()+7;var _theight=$tip.height()+7;var _mwidth=map.getSize().width;var _mheight=map.getSize().height;var TOP_RIGHT=new GPoint(12,-19);var TOP_LEFT=new GPoint(-2,-20);var BOTTOM_RIGHT=new GPoint(10,-5);var BOTTOM_LEFT=new GPoint(-5,-5);var ROOM_TOP=false,ROOM_RIGHT=false,ROOM_BOTTOM=false,ROOM_LEFT=false;if(_mpos.y+TOP_RIGHT.y-_theight>=0)ROOM_TOP=true;if(_mpos.x+TOP_RIGHT.x+_twidth<=_mwidth)ROOM_RIGHT=true;if(_mpos.y+BOTTOM_LEFT.y+_theight<=_mheight)ROOM_BOTTOM=true;if(_mpos.x+BOTTOM_LEFT.x-_twidth>=0)ROOM_LEFT=true;var MODE=(ROOM_TOP&&ROOM_RIGHT)?'topright':((ROOM_TOP&&ROOM_LEFT)?'topleft':((ROOM_RIGHT&&ROOM_BOTTOM)?'bottomright':'bottomleft'));if(MODE=='topright'){$tipinner.css({'background':'#fff '});$tip.css({'left':(_mpos.x+TOP_RIGHT.x),'top':(_mpos.y+TOP_RIGHT.y-_theight)}).show();}else if(MODE=='topleft'){$tipinner.css({'background':'#fff '});$tip.css({'left':(_mpos.x+TOP_LEFT.x-_twidth),'top':(_mpos.y+TOP_LEFT.y-_theight)}).show();}else if(MODE=='bottomright'){$tipinner.css({'background':'#fff '});$tip.css({'left':(_mpos.x+BOTTOM_RIGHT.x),'top':(_mpos.y+BOTTOM_RIGHT.y)}).show();}else{$tipinner.css({'background':'#fff '});$tip.css({'left':(_mpos.x+BOTTOM_LEFT.x-_twidth),'top':(_mpos.y+BOTTOM_LEFT.y)}).show();}}}
map.addControl(new TooltipControl());if(gmap_JSON.markers.length!=0){for(var x=0;x<gmap_JSON.markers.length;x++){if(gmap_JSON.markers[x].lat()==0||gmap_JSON.markers[x].lng()==0){markerArray.push('');}else{var mkr=makeMarker(gmap_JSON.markers[x],x);markerArray.push(mkr);map.addOverlay(mkr);};};var bounds=generateBoundsFromMarkers(markerArray);var autozoomlevel=map.getBoundsZoomLevel(bounds);map.setCenter(bounds.getCenter(),autozoomlevel);};};$(document).ready(function(){topoffset=parseInt($('#f_filter').position().top)+10;bottomlimit=($('#more_listings').length!=0)?(parseInt($('#more_listings').position().top)-20):'undefined';if(bottomlimit!='undefined'){hei=bottomlimit-topoffset;$('#mapcont').height(hei);}
$('#ad-map').scrollFollow();});function starIt(item){item.unbind();item.bind("click",function(){url="/action/addstar/"+item.attr("id").substr(2);$.getJSON(url,false,function(data){if(data.responsecode==101){item.addClass('f_starred').removeClass('f_notstarred').html('Saved!');unStarIt(item);}else if(data.responsecode==203){showLoginPanel("You should be logged in to save listing");}else{alert('Oops! There was an error saving this listing - did you already save it?\n\nTry refreshing the page to update results.');}});});}
function unStarIt(item){item.unbind();item.bind("click",function(){url="/action/deletestar/"+item.attr("id").substr(2);$.getJSON(url,false,function(data){if(data.responsecode==101){item.addClass('f_notstarred').removeClass('f_starred').html('Save listing');starIt(item);}else if(data.responsecode==203){showLoginPanel("You should be logged in to save listing","findahome");}else{alert('Oops! There was an error saving this listing - did you already save it?\n\nTry refreshing the page to update results.');}});});}
$(".f_notstarred").each(function(i){var item=$(this);starIt(item);item=false;});$(".f_starred").each(function(i){var item=$(this);unStarIt(item);item=false;});$("#more_bio_info").click(function(){$("#bio_info").hide("fast");$("#bio_info_all").show("slow");});$("#less_bio_info").click(function(){$("#bio_info_all").hide("fast");$("#bio_info").show("slow");});$('.search2_item').bind('mouseover',function(){var index=$('.search2_item').index(this);itemMouseover($(this));if(gmap_JSON.markers[index]!='(0, 0)'){var multi_key=-1;var multi=0;for(var x=0;x<gmap_JSON.grouped.length;x++){if(in_array(index,gmap_JSON.grouped[x])&&gmap_JSON.grouped[x].length>1){multi=1;multi_key=x;}};if(multi){map.removeOverlay(markerArray[index]);map.addOverlay(markerArray[index]);markerArray[index].setImage(makeImageG(index,true));}
else{map.removeOverlay(markerArray[index]);map.addOverlay(markerArray[index]);markerArray[index].setImage(makeImage(index,true));}}}).bind('mouseout',function(){var index=$('.search2_item').index(this);itemMouseout($(this));if(gmap_JSON.markers[index]!='(0, 0)'){var multi_key=-1;var multi=0;for(var x=0;x<gmap_JSON.grouped.length;x++){if(in_array(index,gmap_JSON.grouped[x])&&gmap_JSON.grouped[x].length>1){multi=1;multi_key=x;}};if(multi)
markerArray[index].setImage(makeImageG(index,false));else
markerArray[index].setImage(makeImage(index,false));}});function itemMouseover($e){$e.addClass('f_itemhover');$e.find('.s2_pt').addClass('s2_pt_hover');};function itemMouseout($e){$e.removeClass('f_itemhover');$e.find('.s2_pt').removeClass('s2_pt_hover');};$('.f_view_tab A').bind('click',function(){$('.f_view_tab').each(function(){$(this).removeClass('f_selected');});$(this).parent('li').addClass('f_selected');if($(this).parent('li').attr('id')=='viewAgtListings'){$('.ad-listing-wrap, .ad-filt').show();$('.ad-mngmap-wrap').hide();}else{$('.ad-listing-wrap, .ad-filt').hide();$('.ad-mngmap-wrap').show();};});})
function MarkerManager(map,opt_opts){var me=this;me.map_=map;me.mapZoom_=map.getZoom();me.projection_=map.getCurrentMapType().getProjection();opt_opts=opt_opts||{};me.tileSize_=MarkerManager.DEFAULT_TILE_SIZE_;var mapTypes=map.getMapTypes();var mapMaxZoom=mapTypes[0].getMaximumResolution();for(var i=0;i<mapTypes.length;i++){var mapTypeMaxZoom=mapTypes[i].getMaximumResolution();if(mapTypeMaxZoom>mapMaxZoom){mapMaxZoom=mapTypeMaxZoom;}}
me.maxZoom_=opt_opts.maxZoom||mapMaxZoom;me.trackMarkers_=opt_opts.trackMarkers;var padding;if(typeof opt_opts.borderPadding==="number"){padding=opt_opts.borderPadding;}else{padding=MarkerManager.DEFAULT_BORDER_PADDING_;}
me.swPadding_=new GSize(-padding,padding);me.nePadding_=new GSize(padding,-padding);me.borderPadding_=padding;me.gridWidth_=[];me.grid_=[];me.grid_[me.maxZoom_]=[];me.numMarkers_=[];me.numMarkers_[me.maxZoom_]=0;GEvent.bind(map,"moveend",me,me.onMapMoveEnd_);me.removeOverlay_=function(marker){map.removeOverlay(marker);me.shownMarkers_--;};me.addOverlay_=function(marker){map.addOverlay(marker);if(marker.pleaseHideLater){marker.hide()};me.shownMarkers_++;};me.resetManager_();me.shownMarkers_=0;me.shownBounds_=me.getMapGridBounds_();}
MarkerManager.DEFAULT_TILE_SIZE_=1024;MarkerManager.DEFAULT_BORDER_PADDING_=100;MarkerManager.MERCATOR_ZOOM_LEVEL_ZERO_RANGE=256;MarkerManager.prototype.resetManager_=function(){var me=this;var mapWidth=MarkerManager.MERCATOR_ZOOM_LEVEL_ZERO_RANGE;for(var zoom=0;zoom<=me.maxZoom_;++zoom){me.grid_[zoom]=[];me.numMarkers_[zoom]=0;me.gridWidth_[zoom]=Math.ceil(mapWidth/me.tileSize_);mapWidth<<=1;}};MarkerManager.prototype.clearMarkers=function(){var me=this;me.processAll_(me.shownBounds_,me.removeOverlay_);me.resetManager_();};MarkerManager.prototype.getTilePoint_=function(latlng,zoom,padding){var pixelPoint=this.projection_.fromLatLngToPixel(latlng,zoom);return new GPoint(Math.floor((pixelPoint.x+padding.width)/this.tileSize_),Math.floor((pixelPoint.y+padding.height)/this.tileSize_));};MarkerManager.prototype.addMarkerBatch_=function(marker,minZoom,maxZoom){var mPoint=marker.getPoint();marker.MarkerManager_minZoom=minZoom;if(this.trackMarkers_){GEvent.bind(marker,"changed",this,this.onMarkerMoved_);}
var gridPoint=this.getTilePoint_(mPoint,maxZoom,GSize.ZERO);for(var zoom=maxZoom;zoom>=minZoom;zoom--){var cell=this.getGridCellCreate_(gridPoint.x,gridPoint.y,zoom);cell.push(marker);gridPoint.x=gridPoint.x>>1;gridPoint.y=gridPoint.y>>1;}};MarkerManager.prototype.isGridPointVisible_=function(point){var me=this;var vertical=me.shownBounds_.minY<=point.y&&point.y<=me.shownBounds_.maxY;var minX=me.shownBounds_.minX;var horizontal=minX<=point.x&&point.x<=me.shownBounds_.maxX;if(!horizontal&&minX<0){var width=me.gridWidth_[me.shownBounds_.z];horizontal=minX+width<=point.x&&point.x<=width-1;}
return vertical&&horizontal;};MarkerManager.prototype.onMarkerMoved_=function(marker,oldPoint,newPoint){var me=this;var zoom=me.maxZoom_;var changed=false;var oldGrid=me.getTilePoint_(oldPoint,zoom,GSize.ZERO);var newGrid=me.getTilePoint_(newPoint,zoom,GSize.ZERO);while(zoom>=0&&(oldGrid.x!==newGrid.x||oldGrid.y!==newGrid.y)){var cell=me.getGridCellNoCreate_(oldGrid.x,oldGrid.y,zoom);if(cell){if(me.removeFromArray(cell,marker)){me.getGridCellCreate_(newGrid.x,newGrid.y,zoom).push(marker);}}
if(zoom===me.mapZoom_){if(me.isGridPointVisible_(oldGrid)){if(!me.isGridPointVisible_(newGrid)){me.removeOverlay_(marker);changed=true;}}else{if(me.isGridPointVisible_(newGrid)){me.addOverlay_(marker);changed=true;}}}
oldGrid.x=oldGrid.x>>1;oldGrid.y=oldGrid.y>>1;newGrid.x=newGrid.x>>1;newGrid.y=newGrid.y>>1;--zoom;}
if(changed){me.notifyListeners_();}};MarkerManager.prototype.removeMarker=function(marker){var me=this;var zoom=me.maxZoom_;var changed=false;var point=marker.getPoint();var grid=me.getTilePoint_(point,zoom,GSize.ZERO);while(zoom>=0){var cell=me.getGridCellNoCreate_(grid.x,grid.y,zoom);if(cell){me.removeFromArray(cell,marker);}
if(zoom===me.mapZoom_){if(me.isGridPointVisible_(grid)){me.removeOverlay_(marker);changed=true;}}
grid.x=grid.x>>1;grid.y=grid.y>>1;--zoom;}
if(changed){me.notifyListeners_();}
me.numMarkers_[marker.MarkerManager_minZoom]--;};MarkerManager.prototype.addMarkers=function(markers,minZoom,opt_maxZoom){var maxZoom=this.getOptMaxZoom_(opt_maxZoom);for(var i=markers.length-1;i>=0;i--){this.addMarkerBatch_(markers[i],minZoom,maxZoom);}
this.numMarkers_[minZoom]+=markers.length;};MarkerManager.prototype.getOptMaxZoom_=function(opt_maxZoom){return opt_maxZoom||this.maxZoom_;};MarkerManager.prototype.getMarkerCount=function(zoom){var total=0;for(var z=0;z<=zoom;z++){total+=this.numMarkers_[z];}
return total;};MarkerManager.prototype.getMarker=function(lat,lng,zoom){var me=this;var mPoint=new GLatLng(lat,lng);var gridPoint=me.getTilePoint_(mPoint,zoom,GSize.ZERO);var marker=new GMarker(mPoint);var cellArray=me.getGridCellNoCreate_(gridPoint.x,gridPoint.y,zoom);if(cellArray!=undefined){for(var i=0;i<cellArray.length;i++)
{if(lat==cellArray[i].getLatLng().lat()&&lng==cellArray[i].getLatLng().lng())
{marker=cellArray[i];}}}
return marker;};MarkerManager.prototype.addMarker=function(marker,minZoom,opt_maxZoom){var me=this;var maxZoom=this.getOptMaxZoom_(opt_maxZoom);me.addMarkerBatch_(marker,minZoom,maxZoom);var gridPoint=me.getTilePoint_(marker.getPoint(),me.mapZoom_,GSize.ZERO);if(me.isGridPointVisible_(gridPoint)&&minZoom<=me.shownBounds_.z&&me.shownBounds_.z<=maxZoom){me.addOverlay_(marker);me.notifyListeners_();}
this.numMarkers_[minZoom]++;};GBounds.prototype.containsPoint=function(point){var outer=this;return(outer.minX<=point.x&&outer.maxX>=point.x&&outer.minY<=point.y&&outer.maxY>=point.y);};MarkerManager.prototype.getGridCellCreate_=function(x,y,z){var grid=this.grid_[z];if(x<0){x+=this.gridWidth_[z];}
var gridCol=grid[x];if(!gridCol){gridCol=grid[x]=[];return(gridCol[y]=[]);}
var gridCell=gridCol[y];if(!gridCell){return(gridCol[y]=[]);}
return gridCell;};MarkerManager.prototype.getGridCellNoCreate_=function(x,y,z){var grid=this.grid_[z];if(x<0){x+=this.gridWidth_[z];}
var gridCol=grid[x];return gridCol?gridCol[y]:undefined;};MarkerManager.prototype.getGridBounds_=function(bounds,zoom,swPadding,nePadding){zoom=Math.min(zoom,this.maxZoom_);var bl=bounds.getSouthWest();var tr=bounds.getNorthEast();var sw=this.getTilePoint_(bl,zoom,swPadding);var ne=this.getTilePoint_(tr,zoom,nePadding);var gw=this.gridWidth_[zoom];if(tr.lng()<bl.lng()||ne.x<sw.x){sw.x-=gw;}
if(ne.x-sw.x+1>=gw){sw.x=0;ne.x=gw-1;}
var gridBounds=new GBounds([sw,ne]);gridBounds.z=zoom;return gridBounds;};MarkerManager.prototype.getMapGridBounds_=function(){var me=this;return me.getGridBounds_(me.map_.getBounds(),me.mapZoom_,me.swPadding_,me.nePadding_);};MarkerManager.prototype.onMapMoveEnd_=function(){var me=this;me.objectSetTimeout_(this,this.updateMarkers_,0);};MarkerManager.prototype.objectSetTimeout_=function(object,command,milliseconds){return window.setTimeout(function(){command.call(object);},milliseconds);};MarkerManager.prototype.refresh=function(){var me=this;if(me.shownMarkers_>0){me.processAll_(me.shownBounds_,me.removeOverlay_);}
me.processAll_(me.shownBounds_,me.addOverlay_);me.notifyListeners_();};MarkerManager.prototype.updateMarkers_=function(){var me=this;me.mapZoom_=this.map_.getZoom();var newBounds=me.getMapGridBounds_();if(newBounds.equals(me.shownBounds_)&&newBounds.z===me.shownBounds_.z){return;}
if(newBounds.z!==me.shownBounds_.z){me.processAll_(me.shownBounds_,me.removeOverlay_);me.processAll_(newBounds,me.addOverlay_);}else{me.rectangleDiff_(me.shownBounds_,newBounds,me.removeCellMarkers_);me.rectangleDiff_(newBounds,me.shownBounds_,me.addCellMarkers_);}
me.shownBounds_=newBounds;me.notifyListeners_();};MarkerManager.prototype.notifyListeners_=function(){GEvent.trigger(this,"changed",this.shownBounds_,this.shownMarkers_);};MarkerManager.prototype.processAll_=function(bounds,callback){for(var x=bounds.minX;x<=bounds.maxX;x++){for(var y=bounds.minY;y<=bounds.maxY;y++){this.processCellMarkers_(x,y,bounds.z,callback);}}};MarkerManager.prototype.processCellMarkers_=function(x,y,z,callback){var cell=this.getGridCellNoCreate_(x,y,z);if(cell){for(var i=cell.length-1;i>=0;i--){callback(cell[i]);}}};MarkerManager.prototype.removeCellMarkers_=function(x,y,z){this.processCellMarkers_(x,y,z,this.removeOverlay_);};MarkerManager.prototype.addCellMarkers_=function(x,y,z){this.processCellMarkers_(x,y,z,this.addOverlay_);};MarkerManager.prototype.rectangleDiff_=function(bounds1,bounds2,callback){var me=this;me.rectangleDiffCoords(bounds1,bounds2,function(x,y){callback.apply(me,[x,y,bounds1.z]);});};MarkerManager.prototype.rectangleDiffCoords=function(bounds1,bounds2,callback){var minX1=bounds1.minX;var minY1=bounds1.minY;var maxX1=bounds1.maxX;var maxY1=bounds1.maxY;var minX2=bounds2.minX;var minY2=bounds2.minY;var maxX2=bounds2.maxX;var maxY2=bounds2.maxY;var x,y;for(x=minX1;x<=maxX1;x++){for(y=minY1;y<=maxY1&&y<minY2;y++){callback(x,y);}
for(y=Math.max(maxY2+1,minY1);y<=maxY1;y++){callback(x,y);}}
for(y=Math.max(minY1,minY2);y<=Math.min(maxY1,maxY2);y++){for(x=Math.min(maxX1+1,minX2)-1;x>=minX1;x--){callback(x,y);}
for(x=Math.max(minX1,maxX2+1);x<=maxX1;x++){callback(x,y);}}};MarkerManager.prototype.removeFromArray=function(array,value,opt_notype){var shift=0;for(var i=0;i<array.length;++i){if(array[i]===value||(opt_notype&&array[i]===value)){array.splice(i--,1);shift++;}}
return shift;};