/*
zMapCurrentZoom=10;
widthPerPixel=1;
heightPerPixel=1;

latWidth = 50
longWidth=30

blockWidthCount= longWidth MOD 3

roundedNumber=(Math.ceil(50/5)*5)-50;

149316.58177815771622574706218665/3

0.000599397594923326944 / 32 = heightPerPixel

roundedNumber=(Math.ceil(89/0.000599397594923326944)*0.000599397594923326944)-89;

0.000018731174841353967 = heightPerPixel

9609648

each 32 grid is 

ratio = -4751437.1497675215174405322134933 / 9609648.1680691446420145595329078
(0.49444444444444444444444444444445)

grid32LongOffset = ratio * 300301.50525216077006295498540334
(148482.41093023504742001663167163) - this is the number of offset blocks
2.7812499999999999999999999999988 - this is the offset needed to land perfect on the block offset

300301.50525216077006295498540334 * 32 = maxworldlat

minLong=29;
minLat=89.5;

gridYSize=32;
heightPerPixelZoomed=heightPerPixel*zMapCurrentZoom;
maxWorldLatPixels=180 / heightPerPixelZoomed;
ratio=(minLat/heightPerPixelZoomed)/maxWorldLatPixels;
gridOffset=ratio*(maxWorldLatPixels/32);
pixelYLatOffset=Math.floor((Math.ceil(gridOffset)-gridOffset)*gridYSize);

gridXSize=32;
widthPerPixelZoomed=widthPerPixel*zMapCurrentZoom;
maxWorldLongPixels=180 / widthPerPixelZoomed;
ratio=(minLong/widthPerPixelZoomed)/maxWorldLongPixels;
gridOffset=ratio*(maxWorldLongPixels/32);
pixelXLongOffset=Math.floor((Math.ceil(gridOffset)-gridOffset)*gridXSize);


operations:
89.5 / heightPerPixel = 4778130.6169010469192239059899736
ratio is (0.49722222222222222222222222222227)
gridOffset is 149316.58177815771622574706218665
.58177815771622574706218665 * 32 = 18.6169010469192239059899728 pixelOffset

operations
89.45 / heightPerPixel = 4772791.9234743418388672312346776
ratio is (0.49666666666666666666666666666671)
gridOffset is 149149.74760857318246460097608365
.58177815771622574706218665 * 32 = 23.9234743418388672312346768 pixelOffset

89.45 / heightPerPixel = 4772791.9234743418388672312346776
ratio is (0.496666666666666)
gridOffset is 149149.747608572
.747608572 * 32 = 23.923474304 pixelOffset


-4751437.1497675215174405322134933 * heightPerPixel = -89 latitude

=maxWorldPixels/originMinPixels

latpixels=latitude / heightPerPixel;
9609648.1680691446420145595329078 * heightPerPixel = 180 latitude
get the width/height of the group: 32
if should be possible to alter the lat/long that is searched for so that it snaps to a grid according to the above variables.


when rendering, i will have to have an x/y offset that is subtracted from the position of each marker. 
then we'll need to check if the groups match the same lat/long as the previous query and not redraw them.  however even if they redraw, it shouldn't be noticeable.

*/

var mapLoadFunction=function(){};
var mapObj=false;
var mapProps=new Object();
//var arrMarkers=new Array();
var streetView=false;
var mapFullscreen=false;
var zGMapAbsPos=null;
var zHideMapControl=false;
var zOneLatitude=false;
var zOneLongitude=false;
var zMapOverlayDivObj=null;
var zMapOverlayDivObjAbsPos=null;
var zMapOverlayDivObjAbsPos2=null;
var zMapIgnoreMoveEnd=false;
var zMapCurrentListingLink=null;
var zArrMapTotalLat=[];
var zArrMapTotalLong=[];
var zArrMapText=[];
var zMapCount=0;
var zBingAddress="";
function createMarker(point, htmlText) {
	var marker = new GMarker(point);
	GEvent.addListener(marker, "click", function() {
	  marker.openInfoWindowHtml(htmlText);
	});
	//arrMarkers.push(marker);
	
	return marker;
}
var zMapFirstZoomChange=true;
var widthPerPixel=0.000021457672119140625;
var heightPerPixel=0.000018731174841353967;
var zMapCurrentZoom=0;
var zMapTimeoutUpdate=0;
function onGMAPLoad() {
	mapProps.longBlockWidth=84;//Math.round(mapProps.stageWidth/mapProps.longBlocks);
	mapProps.latBlockWidth=91;//Math.round(mapProps.stageHeight/mapProps.latBlocks);
	mapProps.latBlocks=Math.ceil(mapProps.stageHeight/mapProps.longBlockWidth);
	mapProps.longBlocks=Math.ceil(mapProps.stageWidth/mapProps.latBlockWidth);
	zMapOverlayDivObj=document.getElementById("zMapOverlayDiv");
	zMapOverlayDivObjAbsPos=zGetAbsPosition(zMapOverlayDivObj);
	setTimeout("loadBingMap();",200);
	mapLoadFunction();
	var mid=document.getElementById("myGoogleMap");
 zGMapAbsPos=zGetAbsPosition(mid);
	if(!GMap2 || mid==undefined) return;
  mapObj = new GMap2(mid);//,{"googleBarOptions ":{"style":"new"}});
  mapObj.addControl(new GSmallMapControl());
  if(zHideMapControl == false){
	mapObj.addControl(new GMapTypeControl());
  }
  mapObj.enableScrollWheelZoom();
 // mapObj.enableContinuousZoom();
  //mapObj.enableGoogleBar();
 // GEvent.addListener(mapObj, "maptypechanged", function(){ if(streetView) goToStreet(); });
  GEvent.addListener(mapObj, "zoomend", function(oldZoom,newZoom){zMapOverlayDivObj.style.display="none"; zMapCurrentZoom=newZoom; if(oldZoom != newZoom && !zMapFirstZoomChange){ mapObj.clearOverlays();zCreatePermanentMarkers(); } zMapOverlaysIds=[];zMapOverlays=[]; zMapFirstZoomChange=false; clearInterval(zMapTimeoutUpdate); zMapTimeoutUpdate=setTimeout('zMapCoorUpdate(true,"zMLSSearchForm");',200); if(newZoom>oldZoom){ streetView=false;}  });
  GEvent.addListener(mapObj, "dragend", function(){zMapOverlayDivObj.style.display="none";if(!zMapIgnoreMoveEnd){ clearInterval(zMapTimeoutUpdate); zMapTimeoutUpdate=setTimeout('zMapCoorUpdate(true,"zMLSSearchForm");',10);} zMapIgnoreMoveEnd=false; });
  GEvent.addListener(mapObj, "movestart", function(){zMapOverlayDivObj.style.display="none"; });

  GEvent.addListener(mapObj, "move", function(){zMapOverlayDivObj.style.display="none";zMapGetOffsets(); });

	if(mapProps.avgLat==0 || mapProps.avgLong==0){
		var d383=document.getElementById("zMapAllDiv");
		d383.style.display="none";
		return;
	}
	// width/height per pixel at zoom 1
		minLat=0;
		maxLat=0;
		minLong=0;
		maxLong=0;
	if(zMapCount!=0){
		minLat=zArrMapTotalLat[0];
		maxLat=zArrMapTotalLat[0];
		minLong=zArrMapTotalLong[0];
		maxLong=zArrMapTotalLong[0];
		for(i=0;i<zMapCount;i++){
			if(zArrMapTotalLat[i]<minLat){
				minLat=zArrMapTotalLat[i];
			}
			if(zArrMapTotalLat[i]>maxLat){
				maxLat=zArrMapTotalLat[i];
			}
			if(zArrMapTotalLong[i]<minLong){
				minLong=zArrMapTotalLong[i];
			}
			if(zArrMapTotalLong[i]>maxLong){
				maxLong=zArrMapTotalLong[i];
			}
		}
		avgLat=(maxLat+minLat)/2;
		avgLong=(maxLong+minLong)/2;
	}else{
		avgLat=mapProps.avgLat;
		avgLong=mapProps.avgLong;
	}
	margin=50;
	if(minLat==0){
		minLat=avgLat;
		maxLat=avgLat;	
		minLong=avgLong;
		maxLong=avgLong;	
	}
	minLat=Math.max(19.66328,minLat);
	maxLat=Math.min(34.22697,maxLat);
	minLong=Math.max(-83.803711,minLong);
	maxLong=Math.min(-76.641602,maxLong);
	avgLat=(maxLat+minLat)/2;
	avgLong=(maxLong+minLong)/2;
	// latitude = y   longitude = x
	// get the zoom level
	propHeight=Math.max(heightPerPixel*50,Math.abs(maxLat-minLat));
	propWidth=Math.max(widthPerPixel*50,Math.abs(maxLong-minLong));
	twp=widthPerPixel;
	thp=heightPerPixel;
	for(zoom=1;zoom<=20;zoom++){
		if(zoom != 1){
			twp*=2;
			thp*=2;
		}
		maxWidth=mapProps.stageWidth*twp;
		maxHeight=mapProps.stageHeight*thp;
		// all properties must fit within zoom level
		if(maxWidth>propWidth+(twp*margin) && maxHeight>propHeight+(thp*margin)){
			break;
		}
	}
	// set zoom and center
	mapProps.avgLong=avgLong;
	mapProps.avgLat=avgLat;
	if(Math.abs(maxLat-minLat)==0){
		mapProps.zoom=20-zoom;
	}else{
		mapProps.zoom=18-zoom;
	}
	streetView=false;
	mapObj.closeInfoWindow();
	mapObj.setCenter(new GLatLng(mapProps.avgLat, mapProps.avgLong), mapProps.zoom);
	for(var i=0;i<zMapCount;i++){
		if(zArrMapText[i] != false){
			var pm=new Object();
			pm.point=new GLatLng(zArrMapTotalLat[i],zArrMapTotalLong[i]);
			pm.title="zNearAddressMarker";
			pm.htmlText='<table width="150" cellpadding="0" cellspacing="0" border="0"><tr><td>'+zArrMapText[i]+'</td></tr></table>';
			var marker=zAddPermanentMarker(pm);
		}
	}
	if(zAjaxNearAddressMarker){
		var d2=document.getElementById("search_near_address");
		var pm=new Object();
		pm.point=new GLatLng(zAjaxNearAddressMarker[0], zAjaxNearAddressMarker[1]);
		pm.title="zNearAddressMarker";
		arrAd=d2.value.split(",");
		var ad1=arrAd.shift()+"<br>"+arrAd.join(",");
		pm.htmlText='<table width="150" cellpadding="0" cellspacing="0" border="0"><tr><td>Location:<br>'+ad1+'</td></tr></table>';
		var marker=zAddPermanentMarker(pm);
		GEvent.trigger(marker,"click");
	}

}
var zAjaxNearAddressMarker=false;
var zMapMarkerIdOff=0;
function zMapMarker(latlng, opts) {
	zMapMarkerIdOff++;
	this.id="zMapMarkerId"+zMapMarkerIdOff;
  this.myRolloverCallback=false;
  this.myRolloverCallbackObj=new Object();
  this.myRolloverHTML="";
  this.latlng = latlng;
  if (!opts) opts = {};
  this.iconcolor_=new String(opts.iconcolor) || "";
  this.height_ = opts.height || 32;
  this.width_ = opts.width || 32;
  this.scale_= opts.scale || 1;
  this.image_ = opts.image || false;
  this.imageOver_ = opts.imageOver;
  this.clicked_ = 0;
}

var zMarkerMapCounter=0;
var zCurrentMarkerMapCounter=0;
if(typeof GOverlay!="undefined"){
	zMapMarker.prototype = new GOverlay();
}

function zMapMarkerRollOut(force){
	var p=20;
	//document.getElementById("testdebug").value=zMousePosition.x+" >= "+(zMapOverlayDivObjAbsPos.x-p)+" && "+(zMousePosition.x)+" <= "+(zMapOverlayDivObjAbsPos.x+zMapOverlayDivObjAbsPos.width+p)+" && "+zMousePosition.y+" >= "+(zMapOverlayDivObjAbsPos.y-p)+" && "+zMousePosition.y+" <= "+(zMapOverlayDivObjAbsPos.y+zMapOverlayDivObjAbsPos.height+p);
	if(zMapOverlayDivObj!=null && zCurrentMarkerMapCounter!=0){
		var d2=document.getElementById("zSeeThroughMarkerId"+zCurrentMarkerMapCounter);
		var image=false;
		if(d2==null){
			var d2=document.getElementById("zMapMarkerImage"+zCurrentMarkerMapCounter);
			image=true;
		}
		if(d2!=null){
	  		if(!force && (zMousePosition.x-zPositionObjSubtractPos[0]>=zMapOverlayDivObjAbsPos.x-p && zMousePosition.x-zPositionObjSubtractPos[0]<=zMapOverlayDivObjAbsPos.x+zMapOverlayDivObjAbsPos.width+p && zMousePosition.y-zPositionObjSubtractPos[1]>=zMapOverlayDivObjAbsPos.y-p && zMousePosition.y-zPositionObjSubtractPos[1]<=zMapOverlayDivObjAbsPos.y+zMapOverlayDivObjAbsPos.height+p)){
				// in overlay tooltip
			}else if(!force && zMousePosition.x>=zMapOverlayDivObjAbsPos2.x-p && zMousePosition.x<=zMapOverlayDivObjAbsPos2.x+zMapOverlayDivObjAbsPos2.width+p && zMousePosition.y>=zMapOverlayDivObjAbsPos2.y-p && zMousePosition.y<=zMapOverlayDivObjAbsPos2.y+zMapOverlayDivObjAbsPos2.height+p){
			//}else if(!force && zMousePosition.x-zPositionObjSubtractPos[0]>=zMapOverlayDivObjAbsPos2.x-p && zMousePosition.x-zPositionObjSubtractPos[0]<=zMapOverlayDivObjAbsPos2.x+zMapOverlayDivObjAbsPos2.width+p && zMousePosition.y-zPositionObjSubtractPos[1]>=zMapOverlayDivObjAbsPos2.y-p && zMousePosition.y-zPositionObjSubtractPos[1]<=zMapOverlayDivObjAbsPos2.y+zMapOverlayDivObjAbsPos2.height+p){
				// in overlay
			}else if(!image){
				d2.style.opacity=0; d2.style.filter='alpha(opacity=0)';
				zCurrentMarkerMapCounter=0;
				zMapOverlayDivObj.innerHTML="";
				zMapOverlayDivObj.style.display="none"; 
			}else{
				zCurrentMarkerMapCounter=0;
				zMapOverlayDivObj.innerHTML="";
				zMapOverlayDivObj.style.display="none"; 
			}
		}
	}
}
zMapMarker.prototype.mySetRolloverHTML=function(html){
	this.myRolloverHTML=html;
}
zMapMarker.prototype.mySetRolloverCallback=function(cb,callbackObj){
	this.myRolloverCallback=cb;
	this.myRolloverCallbackObj=callbackObj;
}

function zFixMapMarkerDiv(){
	if(zCurrentMarkerMapCounter!=0){
		zMapOverlayDivObjAbsPos=zGetAbsPosition(zMapOverlayDivObj);
		var d2=document.getElementById("zMapMarkerImage"+zCurrentMarkerMapCounter);	
		if(d2==null) return;
		d2.onmouseover(false,true);
	}
}

zMapMarker.prototype.initialize = function(map) {
  var me = this;
	zMarkerMapCounter++;
	this.zMarkerMapCounter=zMarkerMapCounter;
  // Create the DIV representing our zMapMarker
  var div = document.createElement("div");
  div.id="zMapMarkerImage"+this.zMarkerMapCounter;
  div.style.position = "absolute";
  div.style.paddingLeft = "0px";
  div.style.cursor = 'pointer';
  div.obj=this;
	if(me.image_ != false){
		div.style.zIndex=2000+this.zMarkerMapCounter;
	}else{
		div.style.zIndex=1000+this.zMarkerMapCounter;
	}
	//	document.getElementById("testdebug").value="";//+="set to 100 height\n";
  
  div.onmouseover=function(o, omt){
	  /*if(zCurrentMarkerMapCounter==this.zMarkerMapCounter){
		  alert('same');
		  return;
	  }*/
	 /* if(omt==null){
		 zMapOverlayDivObj.style.width="280px";
		 zMapOverlayDivObj.style.height="100px";
	  }else{
	  }*/
		zMapOverlayDivObj.style.width="215px";
		zMapOverlayDivObj.style.height="65px";
	//	document.getElementById("testdebug").value+="set to 65 height\n";
	
	var p=0;
	  if(zCurrentMarkerMapCounter!=0 && zCurrentMarkerMapCounter != this.obj.zMarkerMapCounter){
//		if(zMousePosition.x>=zMapOverlayDivObjAbsPos2.x-p && zMousePosition.x<=zMapOverlayDivObjAbsPos2.x+zMapOverlayDivObjAbsPos2.width+p && zMousePosition.y>=zMapOverlayDivObjAbsPos2.y-p && zMousePosition.y<=zMapOverlayDivObjAbsPos2.y+zMapOverlayDivObjAbsPos2.height+p){
		//	alert('i here');
	  	zMapMarkerRollOut(true);
	//	}
	  }
	var px=(zMousePosition.x-zGMapAbsPos.x);
	var py=zMousePosition.y-zGMapAbsPos.y;
	var pos=zGetAbsPosition(this);
	zMapOverlayDivObjAbsPos2=pos;
	zCurrentMarkerMapCounter=this.obj.zMarkerMapCounter;
	  zMapOverlayDivObj.innerHTML=this.obj.myRolloverHTML;
	if(this.obj.myRolloverCallback!=false){
	  this.obj.myRolloverCallback(this.obj.myRolloverCallbackObj);
	}
	if(this.obj.image_ == false){
		setTimeout("zFixMapMarkerDiv();",10);
	}else{
		if(px>zGMapAbsPos.width/2){
			zMapOverlayDivObj.style.left=((pos.x-zPositionObjSubtractPos[0])-(parseInt(zMapOverlayDivObj.style.width)+(9)))+"px";
			if(py<zGMapAbsPos.height/2){
				zMapOverlayDivObj.style.top=(pos.y-zPositionObjSubtractPos[1])+"px";
			}else{
				zMapOverlayDivObj.style.top=((pos.y+pos.height-zPositionObjSubtractPos[1])-(parseInt(zMapOverlayDivObj.style.height)+9))+"px";
			}
		}else{
			zMapOverlayDivObj.style.left=(pos.x+pos.width-zPositionObjSubtractPos[0])+"px";
			if(py<zGMapAbsPos.height/2){
				zMapOverlayDivObj.style.top=(pos.y-zPositionObjSubtractPos[1])+"px";
			}else{
				zMapOverlayDivObj.style.top=((pos.y+pos.height-zPositionObjSubtractPos[1])-(parseInt(zMapOverlayDivObj.style.height)+9))+"px";
			}
		}
		//zMapOverlayDivObjAbsPos=zGetAbsPosition(zMapOverlayDivObj);
		zMapOverlayDivObjAbsPos={"x":parseInt(zMapOverlayDivObj.style.left),"y":parseInt(zMapOverlayDivObj.style.top),"width":parseInt(zMapOverlayDivObj.style.width),"height":parseInt(zMapOverlayDivObj.style.height)};
	//document.getElementById("testdebug").value=" mx:"+zMousePosition.x+" my:"+zMousePosition.y+" x:"+zMapOverlayDivObjAbsPos.x+" y:"+zMapOverlayDivObjAbsPos.y+"\n";
	}
	var d2=document.getElementById("zSeeThroughMarkerId"+this.obj.zMarkerMapCounter);
	if(d2!=null){
	  d2.style.opacity=0.5; d2.style.filter='alpha(opacity=50)';
	}
	
	  zMapOverlayDivObj.style.display="block";
  }
if(me.image_ == false){
	div.onmousemove=function(){
		//document.getElementById("testdebug").value="x:"+zMousePosition.x+" y:"+zMousePosition.y+" newx:"+((zMousePosition.y-20)-parseInt(zMapOverlayDivObj.style.height))+"|"+parseInt(zMapOverlayDivObj.style.height)+" newy:"+((zMousePosition.x-20)-(parseInt(zMapOverlayDivObj.style.width)+(9)))+" | "+d2;
	  	//zMapOverlayDivObj.style.top=(((zMousePosition.y-zPositionObjSubtractPos[1])-20)-100)+"px";
	   // zMapOverlayDivObj.style.left=(((zMousePosition.x-zPositionObjSubtractPos[0])-20)-(280+(9)))+"px";
	  	zMapOverlayDivObj.style.top=((zMousePosition.y-zPositionObjSubtractPos[1])+20)+"px";
	    zMapOverlayDivObj.style.left=((zMousePosition.x-zPositionObjSubtractPos[0])+20)+"px";
			
	}
	var nw=((me.scale_*34)+24);
	var nh=((me.scale_*30)+20);
	div.innerHTML='<div id="zSeeThroughMarkerId'+zMarkerMapCounter+'" class="zSeeThroughMarker"  style="z-index:2;top:0px; width:'+me.width_+'px; height:'+me.height_+'px; left:0px;position:absolute;"></div><div style="position:absolute; left:'+((me.width_/2)-(nw/2))+'px; top:'+((me.height_/2)-(nh/2))+'px; z-index:3;"><img src="/z/a/listing/images/icon-multi'+this.iconcolor_+'.jpg" style="opacity:.5; filter: alpha(opacity = 50);" width="'+nw+'" height="'+nh+'" border="0"></div>';
}else{
  var img = document.createElement("img");
  this.img_=img;
  img.src = me.image_;
  img.style.width = me.width_ + "px";
  img.style.height = me.height_ + "px";
  div.appendChild(img);
  div.ondblclick=function(){
	  if(zMapCurrentListingLink != null && zMapCurrentListingLink != ""){
		 mapObj=null;
		window.top.location.href=zMapCurrentListingLink;  
	  }
  }
}

  GEvent.addDomListener(div, "click", function(event) {
    me.clicked_ = 1;
    GEvent.trigger(me, "click");
  });

  map.getPane(G_MAP_MARKER_PANE).appendChild(div);

  this.map_ = map;
  this.div_ = div;
};
zMapMarker.prototype.remove = function() {
  this.div_.parentNode.removeChild(this.div_);
};

zMapMarker.prototype.copy = function() {
  var opts = {};
  opts.color = this.color_;
  opts.height = this.height_;
  opts.width = this.width_;
  opts.image = this.image_;
  opts.imageOver = this.image_;
  return new zMapMarker(this.latlng, opts);
};
zMapMarker.prototype.redraw = function(force) {
  if (!force) return;
  var divPixel = this.map_.fromLatLngToDivPixel(this.latlng);
if(isNaN(divPixel.x)) return;
  this.div_.style.width = this.width_ + "px";
  this.div_.style.height = this.height_ + "px";
if(this.image_ == false){
  this.div_.style.left = (divPixel.x-(this.width_)) + "px";
  this.div_.style.top = (divPixel.y-(this.height_)) + "px";
	}else{
  this.div_.style.left = (divPixel.x-(this.width_/2)) + "px";
  this.div_.style.top = (divPixel.y-(this.height_/2)) + "px";
	}
};
zMapMarker.prototype.getZIndex = function(m) {
  return GOverlay.getZIndex(marker.getPoint().lat())-m.clicked*10000;
}
zMapMarker.prototype.getPoint = function() {
  return this.latlng;
};
zMapMarker.prototype.setStyle = function(style) {
  for (s in style) {
    this.div_.style[s] = style[s];
  }
};
zMapMarker.prototype.setImage = function(image) {
  this.div_.style.background = 'url("' + image + '")';
}


function createMarkerListingAjax(point, id, iconcolor) {
	var marker = new zMapMarker(point,{"image":"/z/a/listing/images/icon-home"+iconcolor+".jpg","width":21,"height":17,"iconcolor":iconcolor});//new GMarker(point);
	obj=new Object();
	obj.id=id;
	marker.mySetRolloverCallback(zMapLoadListing,obj);
	//marker.mySetRolloverHTML('<span>listing id#'+id+'</span><br /><a href=\"#\">View Property</a> | <a href=\"#\" onClick=\"goToStreet();\">Zoom to Street Level</a>');
	//arrMarkers.push(marker);
	return marker;
} 
var rolloverMarker=null;
function createMarkerGroupBgAjax(point, obj, index, iconcolor) {
	if(obj.arrCountAtAddress[index]==1){
		point = new GLatLng(obj.listing_latitude[index],obj.listing_longitude[index]);
		//alert(obj.listing_latitude[index]+":"+point.x+":"+point.y);
		//alert(iconcolor);
		var marker = new zMapMarker(point,{"image":"/z/a/listing/images/icon-home"+iconcolor+".jpg","width":21,"height":17,"iconcolor":iconcolor});
		marker.mySetRolloverHTML('<strong>'+obj.arrCount[index]+' listings at this address</strong><br />Average list price: '+obj.avgPrice[index]+'</span><br /><a href="javascript:void(0);" onclick="document.getElementById(\'search_within_map_name1\').checked=true;	document.getElementById(\'search_within_map_name1\').onclick();document.getElementById(\'searchgotolistings\').value=1;document.zMLSSearchForm.search_map_coordinates_list.value=\''+obj.listing_longitude[index]+","+obj.listing_longitude[index]+","+obj.listing_latitude[index]+","+obj.listing_latitude[index]+'\';document.zMLSSearchForm.submit();">Click here to view all listings</a>');
	}else{
		//alert(zHighestMapCount);
		var scale=obj.arrCount[index]/zHighestMapCount;
		var marker = new zMapMarker(point,{"width":mapProps.longBlockWidth,"height":mapProps.latBlockWidth,"scale":scale,"iconcolor":iconcolor});
		marker.mySetRolloverHTML('<strong>'+obj.arrCount[index]+' matching listings here</strong><br />Average list price: '+obj.avgPrice[index]+'</span><br />Double click the red icon to zoom in.');
	}
	//arrMarkers.push(marker);
	return marker;
}
var zMapOverlays=new Array();
var zMapOverlaysIds=new Array();
var pixelXLongOffset=0;
var pixelYLatOffset=0;
function zMapGetOffsets(){
// latitude is max 90 and long is max 180 - mistake!
	// can't figure out how to lock group position
	return;
	var point0=new GLatLng(mapObj.getBounds().getNorthEast().lat(),mapObj.getBounds().getSouthWest().lng());
	var point2=mapObj.fromLatLngToContainerPixel(point0);
	var point1=new GLatLng(0,0);
	var point=mapObj.fromLatLngToContainerPixel(point1);
	// origin is far southeast in the world.  if we plot to a place on the other side of the origin, we may need to adjust this math:
	var point3=new GPoint((Math.ceil(point.y/84)*84)-point.y, (Math.ceil(point.x/91)*91)-point.x);
	
	pixelYLatOffset=point3.y;
	pixelXLongOffset=point3.x;
	
}
var zArrMapMarkPrevious=new Array();
var zHighestMapCount=0;
function zUpdateMapMarkers(obj){
	var arrOverlays=new Array();
	var arrOverlaysTemp=new Array();
	var arrSkip=new Array();
	var found=false;
	zMapGetOffsets();
	if(obj.listing_id && obj.listing_id != ""){
		zHighestMapCount=0;
		for(var i2=0;i2<obj.listing_id.length;i2++){
			if(obj.listing_id[i2] == "0"){
				zHighestMapCount=Math.max(zHighestMapCount,obj.arrCount[i2]);
			}
		}
		for(var i2=0;i2<obj.listing_id.length;i2++){
			found=-1;
			if(obj.listing_id[i2] != "0"){
				for(var n=0;n < zMapOverlaysIds.length;n++){
					if(zMapOverlaysIds[n]==obj.listing_id[i2]){
						found=zMapOverlaysIds[n];	
						marker=zMapOverlays[n];
						marker.img_.src="/z/a/listing/images/icon-home"+obj.arrColor[i2]+".jpg";
						arrSkip.push(found);
						break;
					}
				}
				if(found==-1){
					var point = new GLatLng(obj.listing_latitude[i2],obj.listing_longitude[i2]);
					var marker = createMarkerListingAjax(point, obj.listing_id[i2], obj.arrColor[i2]);
					marker.listing_id = obj.listing_id[i2];
					mapObj.addOverlay(marker);
				}
			}else{
				var point = new GLatLng(obj.minLat[i2],obj.minLong[i2]);
				var marker = createMarkerGroupBgAjax(point, obj, i2, obj.arrColor[i2]);
				marker.listing_id=0;
				mapObj.addOverlay(marker);
			}
			arrOverlaysTemp.push(obj.listing_id[i2]);
			arrOverlays.push(marker);
		}
	}
	var arrDelete=new Array();
	for(var n=0;n<zMapOverlaysIds.length;n++){
		found=false;
		for(var i=0;i<arrSkip.length;i++){
			if(arrSkip[i]==zMapOverlaysIds[n]){
				found=true;
				break;
			}
		}
		if(found==false){
			mapObj.removeOverlay(zMapOverlays[n]);
		}
	}
	zMapOverlaysIds=arrOverlaysTemp;
	zMapOverlays=arrOverlays;
}

function zMapCoorUpdate(fireAjax, formName) {
	var bounds =new Object();
	if(!mapObj.getBounds) return;
	bounds.minY=mapObj.getBounds().getSouthWest().lat();
	bounds.minX=mapObj.getBounds().getSouthWest().lng();
	bounds.maxY=mapObj.getBounds().getNorthEast().lat();
	bounds.maxX=mapObj.getBounds().getNorthEast().lng();
	//alert(bounds.minX+","+bounds.maxX+","+bounds.minY+","+bounds.maxY);
	var fd=eval('document.'+formName);
//	alert(formName+":"+'document.'+formName+":"+fd + ":"+zFormData[formName]);
	if(fd!=undefined && fd.search_map_coordinates_list) {
		
		/*
		can't figure out how to lock group position:
	var point0=new GLatLng(bounds.maxY,bounds.minX);
	var point2=mapObj.fromLatLngToContainerPixel(point0);
	var point1=new GLatLng(0,0);
	var point=mapObj.fromLatLngToContainerPixel(point1);
	// origin is far southeast in the world.  if we plot to a place on the other side of the origin, we may need to adjust this math:
	var point3=new GPoint((Math.ceil(point.y/mapProps.latBlocks)*mapProps.latBlocks)-point.y, (Math.ceil(point.x/mapProps.longBlocks)*mapProps.longBlocks)-point.x);
	
	pixelYLatOffset=point3.y;
	pixelXLongOffset=point3.x;
	var point2=new GPoint(pixelYLatOffset,pixelXLongOffset);
	var point4=new GPoint(pixelYLatOffset+(mapProps.latBlocks*mapProps.latBlockWidth),pixelXLongOffset+(mapProps.longBlocks*mapProps.longBlockWidth));
	var point=mapObj.fromContainerPixelToLatLng(point2);
	var point5=mapObj.fromContainerPixelToLatLng(point4);
	
	fd.search_map_coordinates_list2.value=point.x+","+point5.x+","+point5.y+","+point.y;
		fd.search_map_coordinates_list2.value=bounds.minX+","+bounds.maxX+","+bounds.minY+","+bounds.maxY;
	*/
		
		fd.search_map_coordinates_list.value=bounds.minX+","+bounds.maxX+","+bounds.minY+","+bounds.maxY;
		fd.search_map_long_blocks.value=mapProps.longBlocks;
		fd.search_map_lat_blocks.value=mapProps.latBlocks;
		if(fireAjax) {
			//document.getElementById("testdebug").value+=fd.search_map_coordinates_list.value+"\n";
			//getMLSCount();
			zFormData[formName].onChangeCallback(formName);
		}else{
			//document.getElementById("testdebug").value+=fd.search_map_coordinates_list.value+"|no ajax\n";
		}
	}


	


}

function goToStreet(lat,long){
	streetView=true;
	zMapIgnoreMoveEnd=true;
	mapObj.setCenter(new GLatLng(lat, long), mapProps.zoom);
	zMapOverlayDivObj.style.left=(zGMapAbsPos.x+(zGMapAbsPos.width/2)+9)+"px";
	zMapOverlayDivObj.style.top=(zGMapAbsPos.y+(zGMapAbsPos.height/2)-9)+"px";
	//if(mapObj.getCurrentMapType() != G_MAP_TYPE){
	if(mapObj.getCurrentMapType() != G_NORMAL_MAP){
		mapObj.setZoom(17-3);
	}else{
		mapObj.setZoom(17-1);
	}
}


function toggleMapFullscreen(){
	var mapDiv=document.getElementById("myGoogleMap");
	var mapFloater=document.getElementById("mapFloater");
	
	if(mapFullscreen){
		mapFullscreen=false;
		mapProps.stageWidth=mapProps.stageWidth;
		mapProps.stageHeight=mapProps.stageHeight;
		mapDiv.style.width=mapProps.stageWidth+'px';
		mapDiv.style.height=mapProps.stageHeight+'px';
		mapFloater.style.marginLeft='10px'; 
		mapFloater.style.marginBottom='10px';
	}else{
		mapFullscreen=true;
		mapFloater.style.marginLeft='0px'; 
		mapFloater.style.marginBottom='10px';
		// find size of full screen and copy functionality from tiny mce or other source
		alert('not implemented');
		return;
	}
	onLoad();
}
function searchWithinMap(forceSubmit){
	var bounds =new Object();
	bounds.minY=mapObj.getBounds().getSouthWest().lat();
	bounds.minX=mapObj.getBounds().getSouthWest().lng();
	bounds.maxY=mapObj.getBounds().getNorthEast().lat();
	bounds.maxX=mapObj.getBounds().getNorthEast().lng();
	document.mapSearchForm.search_map_coordinates_list.value=bounds.minX+","+bounds.maxX+","+bounds.minY+","+bounds.maxY;
	document.mapSearchForm.submit();
}
  var BingMap = null;
  var pinLocation = "";
  var bingid=null;
  var VEMap=null;
	function loadBingMap(){
	if(document.getElementById("zGStreetView")==null)return;
	var url = "http://ecn.dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6.2&mkt=en-us";
	var e = document.createElement("script");
	e.src = url;
	e.type="text/javascript";
	document.getElementsByTagName("head")[0].appendChild(e);
	bingid=setInterval("GetBingMap()",1000);
	}
var zBingCheckId=null;
	
function GetBingMap() {
	if(typeof VEMap=="function" && bingid!=null){
		clearInterval(bingid);
		bingid=null;
		//setTimeout("GetBingMap()",3000);
		//return;
	} else if(bingid!=null) {
		return;
	}

	BingMap = new VEMap('myBingMap');
	BingMap.LoadMap(new VELatLong(zOneLatitude, zOneLongitude),17);
	BingMap.AddPushpin(new VELatLong(zOneLatitude, zOneLongitude));
	zBingCheckId=setTimeout("zBingHideMap();",500);
	BingMap.AttachEvent("onobliqueenter", OnObliqueEnterHandler);
	
}   
function zBingHideMap(){
	document.getElementById("myBingMapC").style.display="none";
	clearTimeout(zBingCheckId);
	zBingCheckId=null;
}

function OnObliqueEnterHandler() {
	if(BingMap.IsBirdseyeAvailable()) {
		clearTimeout(zBingCheckId);
		zBingCheckId=null;
		document.getElementById("myBingMapC").style.display="block";
		var TopOfProperty = new VELatLong(zOneLatitude, zOneLongitude); 
		BingMap.SetBirdseyeScene(TopOfProperty);
	}
}

function zMapShowListing(r){
//	alert('callback was run:'+str);	
	eval('var myObj='+r+';');
	//alert(myObj.loadtime+":"+myObj.COUNT+":"+myObj.html);
	zMapCurrentListingLink=myObj.link;
	zMapOverlayDivObj.innerHTML=myObj.html;
}
function zMapLoadListing(obj){
	 zMapOverlayDivObj.style.width="280px";
	zMapOverlayDivObj.style.height="100px";
	//	document.getElementById("testdebug").value+="set to 100 height\n";
	 
//	 zMapOverlayDivObj.style.height="110px";
	var tempObj={};
	tempObj.id="zMapListing";
	tempObj.url="/z/_a/listing/search-form?action=ajaxMapListing&listing_id="+obj.id;
	if(zDebugMLSAjax){
		tempObj.debug=true;
	}
	tempObj.cache=true;
	tempObj.callback=zMapShowListing;
	tempObj.ignoreOldRequests=true;
	zAjax(tempObj);	
}


var myPano;	
if(typeof GClientGeocoder!="undefined"){
	var geocoder = new GClientGeocoder();
}
var streetviewlatlong=0;
if(typeof GStreetviewClient!="undefined"){
	var panoClient = new GStreetviewClient(); 
}
function gmsvShowAddress() { 
	if(document.getElementById("zGStreetView")==null)return;
	if(zOneLatitude != ""){ 
		gmsvLoadGoogleMaps({y:zOneLatitude,x:zOneLongitude}); 
	}else if(zBingAddress != ""){
		geocoder.getLatLng( zBingAddress   ,    function(point) {      if (!point) {    if(zOneLatitude != ""){ gmsvLoadGoogleMaps({y:zOneLatitude,x:zOneLongitude}); }else{ handleGMSVErr(0); }    } else {  gmsvLoadGoogleMaps(point); }    }  );
	}else{ handleGMSVErr(0);}
}
var mapLoadFunction=gmsvShowAddress;
function gmsvLoadGoogleMaps(point){
	streetviewlatlong = new GLatLng(point.y,point.x);
	panoramaOptions = { latlng:streetviewlatlong };
	myPano = new GStreetviewPanorama(document.getElementById("pano"), panoramaOptions);
      GEvent.addListener(myPano, "error", handleGMSVErr);
      panoClient.getNearestPanorama(streetviewlatlong, showPanoData);
}
function handleGMSVErr(errorCode) { //alert("errorCode:"+errorCode);
var d1=document.getElementById("zGStreetView");d1.style.display="none"; }  

function showPanoData(panoData) {
  if (panoData.code != 200) {
   // GLog.write('showPanoData: Server rejected with code: ' + panoData.code);
   handleGMSVErr(0);
	return;
  }
  var d1=document.getElementById("zGStreetView");
  d1.style.display="block";
  var angle = computeAngle(streetviewlatlong, panoData.location.latlng);
  myPano.setLocationAndPOV(panoData.location.latlng, {yaw: angle});
}

function computeAngle(endLatLng, startLatLng) {
  var DEGREE_PER_RADIAN = 57.2957795;
  var RADIAN_PER_DEGREE = 0.017453;

  var dlat = endLatLng.lat() - startLatLng.lat();
  var dlng = endLatLng.lng() - startLatLng.lng();
  var yaw = Math.atan2(dlng * Math.cos(endLatLng.lat() * RADIAN_PER_DEGREE), dlat)
		 * DEGREE_PER_RADIAN;
  return wrapAngle(yaw);
}

function wrapAngle(angle) {
if (angle >= 360) {
  angle -= 360;
} else if (angle < 0) {
 angle += 360;
}
return angle;
}
function zSetNearAddress(v){
	if(v != ""){
		zSetWithinMap(1);
		zSetWithinMap2(1);
	}else{
		zSetWithinMap(0);
		zSetWithinMap2(0);
	}
}

function zSetWithinMap(b){
	var d1=document.getElementById("setWithinMapRadio1");
	if(d1==null) return;
	var d2=document.getElementById("setWithinMapRadio2");
	var d3=document.getElementById("search_within_map_name1");
	if(b==1){
		d2.checked=false;
		d1.checked=true;
	}else{	
		d1.checked=false;
		d2.checked=true;
	}
}
function zSetWithinMap2(b){
	var d1=document.getElementById("setWithinMapRadio1");
	if(d1==null) return;
	var d3=document.getElementById("search_within_map_name1");
	var d2=document.getElementById("search_within_map");
	if(b==1){
		d3.checked=true;
	}else{
		d3.checked=false;
	}
	d3.onclick();
}

var zArrPermanentMarker=new Array();
function zAjaxReturnNearAddress(r,skipParse){
	// throws an error when debugging is enabled.
	//r='{"success":true,"errorMsg":"","search_map_coordinates_list":"-81.1391101437,-81.1376618563,29.2753658556,29.2768141444"}';
	if(zDebugMLSAjax){
		document.write(r);	
		return;
	}
	eval('var myObj='+r+';');
	if(!myObj.success){
		alert(myObj.errorMessage);
		return;
	}
	//alert("set:"+myObj.success);
	// set map coordinates
	var arrLatLong=myObj.search_map_coordinates_list.split(",");
	var minLat=parseFloat(arrLatLong[2]);
	var maxLat=parseFloat(arrLatLong[3]);
	var minLong=parseFloat(arrLatLong[0]);
	var maxLong=parseFloat(arrLatLong[1]);
	var avgLat=(minLat+maxLat)/2;
	var avgLong=(minLong+maxLong)/2;
	var zoom=0;
	var propHeight=Math.max(heightPerPixel*50,Math.abs(maxLat-minLat));
	var propWidth=Math.max(widthPerPixel*50,Math.abs(maxLong-minLong));
	var twp=widthPerPixel;
	var thp=heightPerPixel;
	margin=50;
	for(zoom=1;zoom<=20;zoom++){
		if(zoom != 1){
			twp*=2;
			thp*=2;
		}
		maxWidth=mapProps.stageWidth*twp;
		maxHeight=mapProps.stageHeight*thp;
		// all properties must fit within zoom level
		if(maxWidth>propWidth+(twp*margin) && maxHeight>propHeight+(thp*margin)){
			break;
		}
	}
	// set zoom and center
	mapProps.avgLong=avgLong;
	mapProps.avgLat=avgLat;
	if(Math.abs(maxLat-minLat)==0){
		mapProps.zoom=20-zoom;
	}else{
		mapProps.zoom=18-zoom;
	}
	streetView=false;
	var d1=document.getElementById("searchNearAddress");
	var d2=document.getElementById("search_near_address");
	d2.value=d1.value;
	var d3=document.getElementById("zNearAddressDiv");
	d3.style.display="none";
	if(typeof mapObj == "undefined"){
		return;
	}
	mapObj.closeInfoWindow();
	mapObj.setCenter(new GLatLng(mapProps.avgLat, mapProps.avgLong), mapProps.zoom);
	
	zSetNearAddress(1);
	var pm=new Object();
	pm.point=new GLatLng(mapProps.avgLat, mapProps.avgLong);
	pm.title="zNearAddressMarker";
	arrAd=d2.value.split(",");
	var ad1=arrAd.shift()+"<br>"+arrAd.join(",");
	pm.htmlText='<table width="150" cellpadding="0" cellspacing="0" border="0"><tr><td>Location:<br>'+ad1+'</td></tr></table>';
	var marker=zAddPermanentMarker(pm);
	GEvent.trigger(marker,"click");
	jumpToSearchForm();
}

function zAddPermanentMarker(pm){
	for(var i=0;i<zArrPermanentMarker.length;i++){
		if(zArrPermanentMarker[i].title == pm.title){
			zArrPermanentMarker[i].point=pm.point;
			zArrPermanentMarker[i].title=pm.title;
			zArrPermanentMarker[i].htmlText=pm.htmlText;
			zArrPermanentMarker[i].marker=zCreatePermanentMarker(zArrPermanentMarker[i]);
			return zArrPermanentMarker[i].marker;
		}
	}
	zArrPermanentMarker.push(pm);
	zArrPermanentMarker[zArrPermanentMarker.length-1].marker=zCreatePermanentMarker(zArrPermanentMarker[zArrPermanentMarker.length-1]);
	return zArrPermanentMarker[zArrPermanentMarker.length-1].marker;
}
function zCreatePermanentMarkers(offset){
	for(var i=0;i<zArrPermanentMarker.length;i++){
		zArrPermanentMarker[i].marker=zCreatePermanentMarker(zArrPermanentMarker[i]);
	}
}
function zCreatePermanentMarker(pm){
	var title="";
	if(pm.marker){
		mapObj.removeOverlay(pm.marker);
	}
	var marker = new GMarker(pm.point,{"title":pm.title});
	GEvent.addListener(marker, "click", function(e) { marker.openInfoWindowHtml(pm.htmlText); });
	mapObj.addOverlay(marker);
	return marker;
}
function zAjaxMapRadiusChange(){
	var d3=document.getElementById("search_near_radius");
	if(d3.value != ""){
		zAjaxSetNearAddress();
	}
}
function zAjaxFailNearAddress(){
	alert('There was a problem setting the address. Try again');
}
function zAjaxSetNearAddress(){
	var d1=document.getElementById("searchNearAddress");
	var d2=document.getElementById("search_near_radius");
	var d3="/z/_a/listing/search-form?action=nearAddress&search_near_address="+escape(d1.value)+"&search_near_radius="+escape(d2.value);
	
	var tempObj={};
	tempObj.id="zMapNearAddress";
	tempObj.url=d3;
	tempObj.callback=zAjaxReturnNearAddress;
	tempObj.errorCallback=zAjaxFailNearAddress;
	tempObj.cache=false;
	tempObj.ignoreOldRequests=true;
	zAjax(tempObj);
}
function zAjaxCancelNearAddress(){
	var d1=document.getElementById("searchNearAddress");
	var d2=document.getElementById("search_near_radius");
	var d3=document.getElementById("zNearAddressDiv");
	d3.style.display="none";
	d1.value='';
	d2.value='0.1';
}
function zNearAddressChange(o){
	var d1=document.getElementById("zNearAddressDiv");
	var d3=document.getElementById("search_near_address");
	if(o.value == ""){
		d1.style.display="none";
		d3.value="";
	}else{
		d1.style.display="block";
	}
}