
var LINE_WIDTH = 5;
var MAP_WIDTH = 640;
var MAP_HEIGHT = 480;

var stations = [];
var lineNodes = [];
var lineColors = [];
var mapDrawn = false;	

var map;		

function DoSetup() {

	var request = GXmlHttp.create();
	request.open("GET", "stations.xml", true);

	request.onreadystatechange = function() {
		if (request.readyState == 4) {
			var xmlDoc = request.responseXML;

			//get station data
			var markers = xmlDoc.documentElement.getElementsByTagName("station");
			for (var i = 0; i < markers.length; i++) {
				stations.push( new Station(
					markers[i].getAttribute("name"),
					parseFloat(markers[i].getAttribute("lng")),
					parseFloat(markers[i].getAttribute("lat")),
					markers[i].getAttribute("stationtype")
				));
			}

			//get names of the line node types to retrieve
			var nodeTagNames = [];
			markers = xmlDoc.documentElement.getElementsByTagName("line");
			for (var i = 0; i < markers.length; i++) {
				nodeTagNames.push(markers[i].getAttribute("nodetagname"));
				lineColors.push(markers[i].getAttribute("color"));
			}

			//retrieve each of those line node types into a multidimensional array
			for(var lcv=0;lcv<nodeTagNames.length;lcv++){
				var tempNodes = [];
				markers = xmlDoc.documentElement.getElementsByTagName(nodeTagNames[lcv]);

				for (var i = 0; i < markers.length; i++) {
					tempNodes.push( new LineNode(
						markers[i].getAttribute("name"),
						parseFloat(markers[i].getAttribute("lng")),
						parseFloat(markers[i].getAttribute("lat")),
						markers[i].getAttribute("offset")
					));
				}
				lineNodes.push(tempNodes);
			}
			DrawStations();
			DrawLines();
		}
	}
	request.send(null);
}

function Station(name,lat,lng,type) {
	this.name = name;
	this.lat = lat;
	this.lng = lng;
	this.stationtype = type;
}

function LineNode(name,lat,lng,offset) {
	this.name = name;
	this.lat = lat;
	this.lng = lng;
	this.offset = offset;
}

function CreateStationMarker(name, point, icon) {
	var marker = new GMarker(point,icon);

	// Show this marker's index in the info window when it is clicked
	var html = "<DIV CLASS='stationoverlay'><b>" + name + "</b></div>";

	GEvent.addListener(marker, "click", function() {
		map.recenterOrPanToLatLng(point);
		marker.openInfoWindowHtml(html);
	});

	return marker;
}

function DrawStations() {

	var zoomlevel = map.getZoomLevel();
	//alert(zoomlevel);

	var normalstationiconurl = "";
	var normalstationiconsize = -1;

	var transferstationiconurl = "";
	var transferstationiconsize = -1;

	if (zoomlevel<=4) {
		normalstationiconurl = "ns";
		normalstationiconsize = 18;
		transferstationiconurl = "ts";
		transferstationiconsize = 30;
	} else if((zoomlevel==5)||(zoomlevel==6)) {
		normalstationiconurl = "ns_smaller";
		normalstationiconsize = 9;
		transferstationiconurl = "ts_smaller";
		transferstationiconsize = 15;
	} else if((zoomlevel==7)||(zoomlevel==8)) {
		transferstationiconurl = "ts_smallest";
		transferstationiconsize = 9;
		normalstationiconurl = "ns_smallest";
		normalstationiconsize = 5;
	}

	if (navigator.userAgent.toLowerCase().indexOf('msie')==-1) {
		transferstationiconurl = 'images/' + transferstationiconurl + '.png';
		normalstationiconurl = 'images/' + normalstationiconurl + '.png';
	} else {
		transferstationiconurl = 'images/' + transferstationiconurl + '.gif';
		normalstationiconurl = 'images/' + normalstationiconurl + '.gif';
	}

	if (normalstationiconsize!=-1) {
		var halfnormalstationsize = Math.floor(normalstationiconsize / 2);
		var halftransferstationsize = Math.floor(transferstationiconsize / 2);

		//create the station icons
		var normalStationIcon = new GIcon();
		normalStationIcon.image = normalstationiconurl;
		normalStationIcon.shadow = "images/blank.gif";
		normalStationIcon.iconSize = new GSize(normalstationiconsize,normalstationiconsize);
		normalStationIcon.shadowSize = new GSize(10,10);
		normalStationIcon.iconAnchor = new GPoint(halfnormalstationsize,halfnormalstationsize);
		normalStationIcon.infoWindowAnchor = new GPoint(halfnormalstationsize,halfnormalstationsize);
		normalStationIcon.infoShadowAnchor = new GPoint(0,0);

		var transferStationIcon = new GIcon();
		transferStationIcon.image = transferstationiconurl;
		transferStationIcon.shadow = "images/blank.gif";
		transferStationIcon.iconSize = new GSize(transferstationiconsize,transferstationiconsize);
		transferStationIcon.shadowSize = new GSize(10,10);
		transferStationIcon.iconAnchor = new GPoint(halftransferstationsize,halftransferstationsize);
		transferStationIcon.infoWindowAnchor = new GPoint(halftransferstationsize,halftransferstationsize);
		transferStationIcon.infoShadowAnchor = new GPoint(0,0);

		for (var i=0;i<stations.length;i++) {
			var point = new GPoint(parseFloat(stations[i].lat), parseFloat(stations[i].lng));
			var marker = null;
			if (stations[i].stationtype=='transfer') {
				marker = CreateStationMarker(stations[i].name,point,transferStationIcon);
			} else {
				marker = CreateStationMarker(stations[i].name,point,normalStationIcon);
			}
			map.addOverlay(marker);
		}
	}
	mapDrawn = true;
}

function DrawLines() {
	for (var lcv=0;lcv<lineNodes.length;lcv++) {
		DrawLine(lineNodes[lcv],lineColors[lcv]);
	}
}

function DrawLine(linenodes,color) {
	var mapSpan = map.getSpanLatLng();

	var mapdivheight = parseFloat(map_div.style.height);
	var mapdivwidth = parseFloat(map_div.style.width);

	var xlineScale = (((LINE_WIDTH)/2)/mapdivheight) * mapSpan.width;
	var ylineScale = (((LINE_WIDTH)/2)/mapdivwidth) * mapSpan.height;

	var metrolinePoints = [];
	
	for (var i=0;i<(linenodes.length-1);i++) {
		var offsetFlag1 = parseFloat(linenodes[i].offset);
		var offsetFlag2 = parseFloat(linenodes[i+1].offset)
		var point1x = parseFloat(linenodes[i].lat);
		var point1y = parseFloat(linenodes[i].lng);
		var point2x = parseFloat(linenodes[i+1].lat);
		var point2y = parseFloat(linenodes[i+1].lng);

		if ((offsetFlag1!=0)&&(offsetFlag2!=0)) {

			var rise = (point2y - point1y);
			var run = (point2x - point1x);
			var xoffset, yoffset;

			//horizontal line
			if (rise==0) {
				xoffset = 0;
				yoffset = (-1) * offsetFlag1;
			} else if(run==0) {
				//horizontal line
				xoffset = (-1) * offsetFlag1;
				yoffset = 0;
			} else {
				//all others
				var slope = (rise / run);
				var normalslope = (-1/slope);
				xoffset = Math.sqrt( 1 / (1 + (normalslope*normalslope)) );
				yoffset = xoffset * normalslope;

				//flip offsetflag if slope is negative (due to Math.sqrt always returning positive)
				if (slope<0) {
					offsetFlag1 = offsetFlag1 * -1;
				}

				//apply offset flag
				xoffset = xoffset * offsetFlag1;
				yoffset = yoffset * offsetFlag1;
			}

			//scale offset by previously determined factor
			xoffset = xoffset * xlineScale;
			yoffset = yoffset * ylineScale;

			point1x = point1x + xoffset;
			point1y = point1y + yoffset;

			point2x = point2x + xoffset;
			point2y = point2y + yoffset;
		}
		var point1 = new GPoint(point1x,point1y);
		var point2 = new GPoint(point2x,point2y);
		metrolinePoints.push(point1);
		metrolinePoints.push(point2);
	}
	var newLine = new GPolyline(metrolinePoints,color,LINE_WIDTH);
	map.addOverlay(newLine);
}


function getPageHeight() {
	var height = 0;
	if (window.innerHeight) {
		height = window.innerHeight;
	} else if(document.documentElement&&document.documentElement.clientHeight) {
		height = document.documentElement.clientHeight;
	} else {
		height = 800;
	}
	return height;
}

function friendStatus(status) {
	var show = document.getElementById('showFriend');
	var hide = document.getElementById('hideFriend');
	var friend = document.getElementById('tell_a_friend');

	var expDays = 30;
	var exp = new Date();
	exp.setTime(exp.getTime() + (expDays*24*60*60*1000));

	if (status == 'show') {
		hide.style.visibility = 'visible';
		hide.style.display = '';

		friend.style.visibility = 'visible';
		friend.style.display = '';

		show.style.visibility = 'hidden';
		show.style.display = 'none';

		SetCookie('friend', 'true', exp);
	} else {
		hide.style.visibility = 'hidden';
		hide.style.display = 'none';
		friend.style.visibility = 'hidden';
		friend.style.display = 'none';
		show.style.visibility = 'visible';
		show.style.display = '';
		SetCookie('friend', 'false', exp);
	}
}

function advancedStatus(status) {
	var ad_1 = document.getElementById('advanced_1');
	var ad_2 = document.getElementById('advanced_2');
	var show = document.getElementById('showAdvanced');
	var hide = document.getElementById('hideAdvanced');

	var expDays = 30;
	var exp = new Date();
	exp.setTime(exp.getTime() + (expDays*24*60*60*1000));

	if (status == 'show') {
		ad_1.style.visibility = 'visible';
		ad_1.style.display = '';
		ad_2.style.visibility = 'visible';
		ad_2.style.display = '';
		hide.style.visibility = 'visible';
		hide.style.display = '';
		show.style.visibility = 'hidden';
		show.style.display = 'none';
		var map_div = document.getElementById("map");
		var real_div = document.getElementById("real_div");
		var map_height = getPageHeight() - getoffset(map_div) - 10;
		map_div.style.height = map_height + 'px';
		real_div.style.height = map_height + 'px';
		real_div.style.top = getoffset(map_div) + 'px';
		SetCookie('advanced', 'true', exp);
	} else {
		ad_1.style.visibility = 'hidden';
		ad_1.style.display = 'none';
		ad_2.style.visibility = 'hidden';
		ad_2.style.display = 'none';
		hide.style.visibility = 'hidden';
		hide.style.display = 'none';
		show.style.visibility = 'visible';
		show.style.display = '';
		var map_div = document.getElementById("map");
		var real_div = document.getElementById("real_div");
		var map_height = getPageHeight() - getoffset(map_div) - 10;
		map_div.style.height = map_height + 'px';
		real_div.style.height = map_height + 'px';
		real_div.style.top = getoffset(map_div) + 'px';
		SetCookie('advanced', 'false', exp);
	}
}

function submit_form(dir, rec) {
	var off = 0;
	if (dir == 0) {
		off = document.forms.map_search.offset.value - document.forms.map_search.limit.value;
	} else if(dir == 1) {
		off = (document.forms.map_search.offset.value*1) + (document.forms.map_search.limit.value*1);
	} else {
		off = document.forms.map_search.offset.value;
	}
	document.forms.map_search.offset.value = off;
	document.forms.map_search.records.value = rec;
	document.forms.map_search.submit();
}

function sort(sort_by, sort_dir, rec) {
	document.forms.map_search.offset.value = 0;
	document.forms.map_search.records.value = rec;

	var expDays = 30;
	var exp = new Date();
	exp.setTime(exp.getTime() + (expDays*24*60*60*1000));

	SetCookie("sort_by", sort_by, exp);
	SetCookie("sort_dir", sort_dir, exp);

	document.forms.map_search.submit();
}

function getoffset(the_div){
	var _d47=0;
	while (the_div != null) {
		_d47+=the_div.offsetTop;
		the_div=the_div.offsetParent;
	}
	//alert(_d47);
	return _d47;
}

function SetCookie (name, value) {
	var argv = SetCookie.arguments;
	var argc = SetCookie.arguments.length;
	var expires = (argc > 2) ? argv[2] : null;
	document.cookie = name + "=" + escape (value) + "; expires=" + expires.toGMTString();
}

function GetCookie(name) {
	var dc = document.cookie;
	var prefix = name + "=";
	var begin = dc.indexOf("; " + prefix);
	if (begin == -1) {
		begin = dc.indexOf(prefix);
		if (begin != 0) return "";
	} else {
		begin += 2;
	}
	var end = document.cookie.indexOf(";", begin);
	if (end == -1) {
		end = dc.length;
	}
	return unescape(dc.substring(begin + prefix.length, end));
}

var xmlhttp = false;

// If the user is using Mozilla/Firefox/Safari/etc
if (window.XMLHttpRequest) {
	//Intiate the object
	xmlhttp = new XMLHttpRequest();
	//Set the mime type
	xmlhttp.overrideMimeType('text/xml');
} else if (window.ActiveXObject) {
	// If the user is using IE
	//Intiate the object
	xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}

function storeEmailStatus(form) {
	var expDays = 30;
	var exp = new Date();
	var realtor = '';
	exp.setTime(exp.getTime() + (expDays*24*60*60*1000));
	if (form.self_email.checked == true) {
		SetCookie("self_email", 'true', exp);					
	} else {
		SetCookie("self_email", 'false', exp);
	}
}

function checkLeadForm(form, key, origin) {
	var list = '';

	if (form.name.value == '') {
		list  += '    Name\n';
	}

	if (form.email.value == '') {
		list += '     Email\n';
	}
	
	if (form.phone.value == '') {
		list += '     Phone\n';
	}

	if (form.realtor[0].checked == false && form.realtor[1].checked == false && form.realtor[2].checked == false) {
		list += '     Realtor Status\n';
	}

	if (list != '') {
		list = 'The following fields are incomplete:\n' + list;
		list = list + 'Please complete the listed fields and resubmit';

		alert(list);
	} else {
		var expDays = 30;
		var exp = new Date();
		var realtor = '';
		exp.setTime(exp.getTime() + (expDays*24*60*60*1000));

		SetCookie("name", form.name.value, exp);
		SetCookie("email", form.email.value, exp);
		SetCookie("phone", form.phone.value, exp);

		if (form.realtor[0].checked == true) {
			SetCookie("realtor", "0", exp);
			realtor = 0;
		} else if (form.realtor[1].checked == true) {
			SetCookie("realtor", "1", exp);
			realtor = 1;
		} else if (form.realtor[2].checked == true) {
			SetCookie("realtor", "2", exp);
			realtor = 2;
		}

		var self_email = 'false';

		if (form.self_email.checked == true) {
			self_email = 'true';
		}

		submitLeadForm(origin, key, form.name.value, form.email.value, form.phone.value, realtor, self_email)
		//form.submit();
	}
}

function submitLeadForm(origin, key, name, email, phone, realtor, self_email) {
	var query = 'key=' + key + '&name=' + name + '&email=' + email + '&phone=' + phone + '&realtor=' + realtor + '&self_email=' + self_email;

	if (origin == 'map') {
		var div = document.getElementById("info_window_" + key);
	} else {
		var div = document.getElementById("div_" + key);
	}

	url = 'submit_form.php?' + query;
	xmlhttp.open('GET', url, true);

	//Check that the PHP script has finished sending us the result
	xmlhttp.onreadystatechange = function() {
		if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
			//Replace the content of the "result" DIV with the result returned by the PHP script
			div.innerHTML = xmlhttp.responseText + ' ';
		} else {
			//If the PHP script fails to send a response, or sends back an error, display a simple user-friendly notification
			div.innerHTML = 'Processing...';
		}
	};
	xmlhttp.send(null);
}

function emailFriend() {
	var form = document.forms.tell_friend;
	var name = form.name.value;
	var friendname = form.friendname.value;
	var friendemail = form.friendemail.value;
	var notes = form.notes.value;
	var list = '';

	if (name == '') {
		list  += '    Name\n';
	}

	if (friendname == '') {
		list += '     Friend Name\n';
	}

	if (friendemail == '') {
		list += '     Friend Email\n';
	}

	if (list != '') {
		list = 'The following fields are incomplete:\n' + list;
		list = list + 'Please complete the listed fields and resubmit';

		alert(list);
	} else {
		var div = document.getElementById("email_div");

		var query = 'name=' + name + '&friendname=' + friendname + '&friendemail=' + friendemail + '&notes=' + notes;
		url = 'email_friend.php?' + query;
		xmlhttp.open('GET', url, true);

		xmlhttp.onreadystatechange = function() {
			if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
				div.innerHTML = xmlhttp.responseText + ' ';
			} else {
				div.innerHTML = 'Processing...';
			}
		};
		xmlhttp.send(null);
	}
}

function clearField(element) {
	if (element.value == 'Click Search! to re-populate map') {
		element.value = '';
	}
}
