// Change Log
// MAS 2009-03-11 Corrected formatting of phone numbers

var map;	// holds map definition
var directions;

function load() {
	if (GBrowserIsCompatible()) {
		// create a map in the "map" div
		map = new GMap2(document.getElementById("map"));
		map.addControl(new GSmallMapControl());	// size and pan control
		map.addControl(new GMapTypeControl());	// lets visitor switch between map and satellite mode
		map.addControl(new GScaleControl()); 	// scale control
		map.setCenter(new GLatLng(43.642241, -83.525795), 8);	// center of the Thumb
		var dir = document.getElementById('directions');
		directions = new GDirections(map, dir); 
		GEvent.addListener(directions, 'error', 
						   function() {
							   var msg = document.getElementById('message');
							   msg.innerHTML = '<p>Error retrieving directions: ' + directions.getStatus().code + '</p>';
						   });
		
		// set up the markers on the map for the businesses
		var mgr = new GMarkerManager(map);	// manages the push pins
		document.getElementById('mapoptions').innerHTML = 'Loading data...';
		
		GDownloadUrl("getbusinesslist.php", function(data, responseCode) {  
			var xml = GXml.parse(data);
			var businesses = xml.documentElement.getElementsByTagName("Business");
			var markersSubscribers = [];	// will hold coordinates found in database for paid subscribers
			var markersNonSubscribers = [];	// will hold coordinates found in database for basic listings
			var countNew = 0;	// only add a few new ones at a time...eases the load on the client
			document.getElementById('mapoptions').innerHTML = 'Processing data...';
			for (var i = 0; i < businesses.length; i++) {
				if (!(businesses[i].getElementsByTagName("lat")[0].firstChild && businesses[i].getElementsByTagName("lon")[0].firstChild)) {
					// fetch the lat and lon, and then save it in the database for next time
					// but only try if there's an address....
					if (businesses[i].getElementsByTagName("address")[0].firstChild && countNew < 30) {
						countNew++;
						//var info = formatInfo(businesses[i]);
						newLatLng(mgr, businesses[i]);	// try to add the marker
					}
				}
				else {
					var lat = businesses[i].getElementsByTagName("lat")[0].firstChild.data;
					var lon = businesses[i].getElementsByTagName("lon")[0].firstChild.data;
					var subscrLevel = businesses[i].getElementsByTagName("SCLASSID")[0].firstChild.data;
					if (subscrLevel < 9) {	// paid subscribers
						markersSubscribers.push(createMarker(lat, lon, businesses[i]));
					}
					else {	// basic listings
						markersNonSubscribers.push(createMarker(lat, lon, businesses[i]));
					}
				}
			}
			document.getElementById('mapoptions').innerHTML = 'Adding subscribers...';
			mgr.addMarkers(markersSubscribers, 8);
			document.getElementById('mapoptions').innerHTML = 'Adding basic...';
			mgr.addMarkers(markersNonSubscribers, 12);
			document.getElementById('mapoptions').innerHTML = 'Done!';
			mgr.refresh();
			document.getElementById('mapoptions').innerHTML = '';
		});
	}
}

function formatInfo(row, newlat, newlon) {	
	// formats according to subscription level, i.e. basic doesn't show street address
	var busname = row.getElementsByTagName("busname")[0].firstChild.data;
	var address = row.getElementsByTagName("address")[0].firstChild.data;
	var city = row.getElementsByTagName("city")[0].firstChild.data;
	var zipcode = row.getElementsByTagName("zipcode")[0].firstChild.data;
	var showAddress = row.getElementsByTagName("showFullAddress")[0].firstChild.data;
	var showURL = row.getElementsByTagName("showURL")[0].firstChild.data;
	var lat;
	var lon;
	if (row.getElementsByTagName("lat")[0].firstChild && row.getElementsByTagName("lon")[0].firstChild) {
		lat = row.getElementsByTagName("lat")[0].firstChild.data;
		lon = row.getElementsByTagName("lon")[0].firstChild.data;
	}
	else {
		lat = newlat;
		lon = newlon;
	}
	var areacode = 0;
	var phonenumber = 0;
	if (row.getElementsByTagName("areacode")[0].firstChild) {
		areacode = row.getElementsByTagName("areacode")[0].firstChild.data;
		phonenumber = row.getElementsByTagName("phonenumber")[0].firstChild.data;
	}
	var url = (row.getElementsByTagName("url")[0].firstChild ? row.getElementsByTagName("url")[0].firstChild.data : '');
	
//MAS 090311	var phone = phonenumber % 10000;
//MAS 090311	var exchange = (phonenumber - phone) / 10000;
//MAS 090311
	var exchange = phonenumber.substr(0, 3);
	var phone = phonenumber.substr(3);
//MAS 090311

	var info = busname;
	if (showAddress) {
		info += '<br />';
		info += address;
	}
	info += '<br />';
	info += city + ' ' + zipcode + ' ';
	busname = busname.replace(/'/g, '');
	busname = busname.replace(/"/g, '');
	if (showAddress) {
		if (lat && lon) {
			info += '<a href="javascript://" class="mapinfo" onclick="getDirections(\'' + busname + '\', ' + lat + ', ' + lon + ');">Get Directions</a>';
		}
		if (areacode) {
			info += '<br />';
			info += '(' + areacode + ') ' + exchange + '-' + phone;
		}
		if (showURL && url > '') {
			info += '<br />';
			info += '<a href="' + url + '" class="mapinfo" target="_blank">' + url.substr(7) + '</a>';
		}
	}
	return info;
} 

function createMarker(lat, lon, row) {
	var marker = new GMarker(new GLatLng(lat, lon));	// create the marker
	var info = formatInfo(row, lat, lon);
	var busID = row.getElementsByTagName("BUSID")[0].firstChild.data;
	var zipcode = row.getElementsByTagName("zipcode")[0].firstChild.data;
	var showLocal = row.getElementsByTagName("showLocal")[0].firstChild.data;
	GEvent.addListener(marker, "click", function() {	// add the listener to show the info window
		marker.openInfoWindowHtml(info);
		if (showLocal > 0) {	// area town; show list of businesses in the neighborhood
			url = 'getlocalbusinesses.php?zipcode=' + zipcode + '&id=' + busID;
			GDownloadUrl(url, function(data, responseCode) {
				var tgt = document.getElementById("directions");
				tgt.innerHTML = data;
				clearMessage();
			});
		}
		else {
			document.getElementById('directions').innerHTML = '';
		}
	});
	return marker;
}

function newLatLng(mgr, row) {
	var address = row.getElementsByTagName("address")[0].firstChild.data;
	var zipcode = row.getElementsByTagName("zipcode")[0].firstChild.data;
	var lookup = address + ", " + zipcode;
	var busID = row.getElementsByTagName("BUSID")[0].firstChild.data;
	var subscrLevel = row.getElementsByTagName("SCLASSID")[0].firstChild.data;
	
	var geocoder = new GClientGeocoder();
	geocoder.getLatLng(lookup, function(point) {
		if (point) {
			var url = 'updatelatlon.php?id=' + busID + '&lat=' + point.y + '&lon=' + point.x;
			// Note that we won't track failures to update....
			var info = formatInfo(row, point.y, point.x);
			addMarker(mgr, point.y, point.x, info, subscrLevel);
			GDownloadUrl(url, function(data, responseCode) {
//				var tgt = document.getElementById("directions");
//				tgt.innerHTML = data;
			});
		}
	});
}

function addMarker(mgr, lat, lon, info, subscrLevel) {
	var marker = new GMarker(new GLatLng(lat, lon));	// create the marker
	GEvent.addListener(marker, "click", function() {	// add the listener to show the info window
		marker.openInfoWindowHtml(info);
	});
	if (subscrLevel < 9) {	// show paid subscribers at all levels
		mgr.addMarker(marker, 0);	// add the new marker
	}
	else {
		mgr.addMarker(marker, 16); 	// basic subscribers only show at higher zoom levels
	}
}

function getDirections(busname, lat, lon) {
	var url = 'getdirections.php?busname=' + busname + '&lat=' + lat + '&lon=' + lon;
	GDownloadUrl(url, function(data, responseCode) {
		clearMessage();
		var tgt = document.getElementById("directions");
		tgt.innerHTML = data;
		window.scrollBy(0, 500);
		document.forms[0].address.focus();
	});
}

function showDirections() {
	clearMessage();
	var dir = document.getElementById('directions');
	var src = document.forms[0];
	var addr = src.address.value;
	var busname = src.busname.value;
	var lat = src.lat.value;
	var lon = src.lon.value;
	
	dir.innerHTML = '<h2>Driving Directions</h2>';	// clear the destination
	dir.innerHTML += '<h3>' + addr + ' to ' + busname + '</h3>';
	dir.innerHTML += '<p>Click on one of the steps below for a detail view of it in the map above.</p>';

	var query = addr + ' to ' + busname + '@' + lat + ',' + lon;
	directions.clear();	// clear the last query
	directions.load(query);
}

function clearMessage() {
	var msg = document.getElementById('message');
	msg.innerHTML = '';
}
