// defaults and settings that you might want to change
var MAPDIVID="gmap";
var DFLTTYPE=G_HYBRID_MAP;
var DFLTZOOM=15;
var DOMAINURL="http://bainrealestate.com/"
var OFFICELAT=41.87936;
var OFFICELON=-73.47823;
// icons for "main" and "comps", and their shadow
var MICO="http://maps.google.com/mapfiles/ms/micons/red-dot.png";
var CICO="http://maps.google.com/mapfiles/ms/micons/blue-dot.png";
var ICOS="http://maps.google.com/mapfiles/ms/micons/msmarker.shadow.png";
// default property bounds line color, thickness, and opacity
var LCOL="#FF0000";
var LWGT=3;
var LOPC=1.00;
var GEOCODEDELAY = 250;

// array field indexes for prop records - these must match the records created in listing-detailsmap.php!
var PROPID = 0;
var PROPRECTYPE = 1;
var PROPTITLE = 2;
var PROPPIC = 3;
var PROPPRICE = 4;
var PROPLOCTYPE = 5;
var PROPLOC = 6;
var PROPBNDS = 7;
var PROPINFOLINK = 8;

var map;
var zoombnds;
var mainmarker;
var numcompsmapped;
var geocoder;

function drawPoly(propBnds) {
	var tokens, lat, lon, ptArr, nPts, p, polyArr;
	if (propBnds.length > 0) {
		ptArr = escape(propBnds).split('%0B');
		nPts = ptArr.length;
		polyArr = new Array();
		for (p=0;p<nPts;p++) {
			tokens = ptArr[p].split('%2C');
			lat = parseFloat(tokens[0]);
			lon = parseFloat(tokens[1]);
			polyArr.push(new GLatLng(lat, lon));
		}
		polyArr.push(polyArr[0]);
		map.addOverlay(new GPolyline(polyArr,LCOL,LWGT,LOPC));
	}
}
function addMarker(point,recnum) {
	var ico, marker, html, ismainprop, mrec;
	mrec = minfo[recnum];
	ismainprop = (mrec[PROPRECTYPE] == 'main');
	// need to issue a setCenter before any overlays can be added, but also want to set it for "main" property
	if (recnum==0 || ismainprop) map.setCenter(point, DFLTZOOM, DFLTTYPE);
	// create non-default icon to display - one for "main" property and another for "comps"
	ico = new GIcon();
	ico.iconSize = new GSize(32,32);
	ico.image = (ismainprop ? MICO : CICO);
	ico.shadow = ICOS;
	ico.shadowSize = new GSize(59,32);
	ico.iconAnchor = new GPoint(16,32);
	ico.infoWindowAnchor = new GPoint(16,0);
	// create marker and build info window (if unmapped and it's the main property, put marker and "error message" at main office)
	if (point == -1 && ismainprop) {
		point = new GLatLng(OFFICELAT,OFFICELON);
		html='<span class="infwnd">Unable to map addresss for<br /><br />' +
			'<a href="'+DOMAINURL+'">'+mrec[PROPTITLE]+'</a><br /><br />' +
			'Please contact us<br /><br />' +
			'or drop by our office here.</span>';
		marker = new GMarker(point, {icon: ico, title: "Main Office"});
	} else {
		html='<span class="infwnd"><a href="'+DOMAINURL+mrec[PROPINFOLINK]+'">' +
			mrec[PROPTITLE]+'<br /><br />' +
			'<img src="'+mrec[PROPPIC]+'" width="180" height="135" border="0" alt="Property photo - "+mrec[PROPPIC]></a><br /><br />Price: $'+mrec[PROPPRICE];
		if (ismainprop && numcompsmapped>0)
			html+='<br /><br /><i><a href="javascript:zoomToAll();"><img src="'+CICO+'" border="0" width="16" height="16"> Zoom out to see comps</a></i>';
		html+='</span>';
		marker = new GMarker(point, {icon: ico, title: mrec[PROPTITLE]+' $'+mrec[PROPPRICE]});
	}
	if (marker) {
		// add marker click event listener
		GEvent.addListener(marker, "click", function() {
			marker.openInfoWindowHtml(html);
		});
		// add the marker to the map (and open its window if it's the "main" property)
		map.addOverlay(marker);
		if (ismainprop) {
			GEvent.trigger(marker,"click");
			mainmarker = marker;
		} else
			++numcompsmapped;
		zoombnds.extend(marker.getPoint());
	}
}
function zoomToAll() {
	mainmarker.closeInfoWindow();
	map.setCenter(zoombnds.getCenter(), map.getBoundsZoomLevel(zoombnds)-1);
}
function gmload() {
	var i, p;
	if (GBrowserIsCompatible()) {

		// initialize mapping with Google
		map = new GMap2(document.getElementById(MAPDIVID));
		map.addControl(new GSmallMapControl());
		map.removeMapType(G_SATELLITE_MAP);
		map.addControl(new GMapTypeControl());
		map.addControl(new GScaleControl());
		map.enableDoubleClickZoom();
		zoombnds = new GLatLngBounds();
		geocoder = new GClientGeocoder();

		// convert the data string to a data array
		minfo = eval(minfo);

		// order indexes so "main" record is processed last, so we can know if any comps have been mapped
		// NOTE - this code will not work as intended if there is more than 1 "main" property in minfo!
		var procOrder = [];
		p = 0;
		for (i=0; i<minfo.length; i++) {
			if (minfo[i][PROPRECTYPE]=='main')
				p = i;
			else
				procOrder[procOrder.length] = i;
		}
		procOrder[procOrder.length] = p;

		// process all of the property records
		numcompsmapped = 0;
		for (i=0; i<minfo.length; i++) {
			p = procOrder[i];
			// try to geocode if it's an address
			if (minfo[p][PROPLOCTYPE]=="addr") {
				if (geocoder)
					setTimeout('geocoder.getLatLng("'+minfo[p][PROPLOC]+'", function(point){if(!point)point=-1;addMarker(point,'+p+');})', GEOCODEDELAY);
				else
					addMarker(-1,p);
			// else use the specified lat,lon coordinate
			} else {
				var tokens = minfo[p][PROPLOC].split(",");
				var lat = parseFloat(tokens[0]);
				var lon = parseFloat(tokens[1]);
				addMarker(new GLatLng(lat,lon),p);
			}
			// if it's the main property, draw any specified property bounds as a polygon
			if (minfo[p][PROPRECTYPE]=='main')
				drawPoly(minfo[p][PROPBNDS]);
		}
     	} else {
       		alert("Embedded Google Map is not compatible with this browser");
	}
}

