var xmlHttp;
var seqHttp;
var result;
var seq;
var sortkey = 'pos';
var format = 'dms';
var kph_mph = 'kph';
var should_play_sound = false;
var got_data = 0;
var display_cols;
var everything = new Array(true,true,true,true,true,true,true,true,true,true,true,true,true,true);
function $(id) { return document.getElementById(id);}
function sid()
{
	var d = new Date();
	var day = d.getUTCDate();
	var hour = d.getUTCHours();
	var min = d.getUTCMinutes();
	var txt;
	if (day < 10) txt = '0'+day;
	else txt = ''+day;
	if (hour < 10) txt = txt + '0';
	txt = txt + hour;
	if (min < 10) txt = txt + '0';
	txt = txt + min;
	return txt;
}

function Result(posn, posn_class, team, name, paddlers, clas, lat, lng, loc, timestamp, penalty, status, msg, paddling_time, corrected_time, comments, url, newdata)
{
	this.posn = posn;
	this.posn_class = posn_class;
	this.team = team;
	this.name = name;
	this.paddlers = paddlers;
	this.clas = clas;
	this.lat = lat;
	this.lng = lng;
	this.loc = loc;
	this.timestamp = timestamp;
	this.penalty = penalty;
	this.status = status;
	if (status == 'DELINQUENT') this.status = 'SLOW UPDATES';
	this.msg = msg;
	this.paddling_time = paddling_time;
	this.corrected_time = corrected_time;
	this.comments = comments;
	if (url == 'http://maps.google.com') this.url = url;
	else {
		var placename = 'Team '+team;
		placename.replace(/ /g, '\xa0');
		timestamp.replace(/ /g, '\xa0');
		placename = encodeURIComponent(placename+' '+timestamp+'@'+lat+','+lng);
		
		this.url = 'http://maps.google.com/maps?q='+placename+'&z=12&om=1&t=k';
	}
	this.newdata = newdata;
}
function Refresh()
{
	seqHttp=null;
	if (window.XMLHttpRequest)
	{// code for IE7, Firefox, Mozilla, etc.
		seqHttp=new XMLHttpRequest();
	}
	else if (window.ActiveXObject)
	{// code for IE5, IE6
		seqHttp=new ActiveXObject("Microsoft.XMLHTTP");
	}
	if (seqHttp!=null)
	{
		var url = "seq.txt?sid="+sid();
		seqHttp.onreadystatechange=getseq;
			try
			{
				seqHttp.open("GET",url,true);
			}
			catch (er)
			{
				txt = $("date").innerHTML;
				if (txt.substr(0,1) != '<') txt = '<span style="color:red">'+txt+' ['+status+']</span>';
				$("date").innerHTML = txt;
			}
		seqHttp.send(null);
		var d = new Date();
		var delay = 900 - (d.getMinutes()*60 + d.getSeconds()) % 900;
	
		setTimeout("Refresh()", delay*1000);
	}
	else
	{
		alert("Your browser does not support XMLHTTP.");
	}
}

function report_state(status)
{
	txt = $("date").innerHTML;
	if (txt.substr(0,1) != '<') txt = '<span style="color:red">'+txt+' ['+status+']</span>';
	else {
		idx = txt.indexOf('[');
		if (idx > 0) {
			txt = txt.substr(0, idx+1)+status+']</span>';
		}
	}
	$("date").innerHTML = txt;
	return;
}

function getseq()
{
	if(seqHttp.readyState!=4) return;
	if(seqHttp.status!=200)
	{
		report_state(seqHttp.status);
		return;
	}
	newseq = seqHttp.responseText;
	newseq = newseq.substring(0,newseq.length-2);
	if (seq != newseq)
		showResults();
	else {
		var d = Date();
		$("date").innerHTML = 'Results as of '+d.toLocaleString();
	}
}

function showResults()
{ 
	xmlHttp=null;
	$("pos").checked=true

	if (window.XMLHttpRequest)
	{// code for IE7, Firefox, Mozilla, etc.
		xmlHttp=new XMLHttpRequest();
	}
	else if (window.ActiveXObject)
	{// code for IE5, IE6
		xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
	}
	if (xmlHttp!=null)
	{
		var url = "results.xml?sid="+sid();
		xmlHttp.onreadystatechange=state_Change;
		try
		{
			xmlHttp.open("GET",url,true);
		}
		catch (er)
		{
			txt = $("date").innerHTML;
			if (txt.substr(0,1) != '<') txt = '<span style="color:red">'+txt+' ['+status+']</span>';
			$("date").innerHTML = txt;
		}
		xmlHttp.send(null);
	}
	else
	{
		alert("Your browser does not support XMLHTTP.");
	}
}

function state_Change() 
{ 
	if(xmlHttp.readyState!=4) return;
	if(xmlHttp.status!=200)
	{
		report_state(seqHttp.status);
		return;
	}
	var xmlDoc;
	var txt;
	try
	{
		xmlDoc = xmlHttp.responseXML.documentElement;
	}
	catch (er)
	{
		alert("Problem parsing response as XML");
	}
	seq = xmlDoc.getElementsByTagName("seq")[0].childNodes[0].nodeValue;
	txt = '<a href="results_static.kml?t=';
	txt = txt + seq;
	txt = txt + '">Static Results with history on Google Earth.</a>';
	$("static_link").innerHTML= txt;
	txt = '<a href="http://maps.google.com/maps?f=q&amp;hl=en&amp;q=http://yukon1000.com/'
	txt = txt + base;
	txt = txt + '/results_static.kml%3ft%3d';
	txt = txt + seq;
	txt = txt + '&amp;ie=UTF8&amp;om=1&amp;t=k" target="_blank">Google Maps</a>';
	$("static_map").innerHTML= txt;
	txt = '<a href="http://maps.live.com/default.aspx?mapurl=http://yukon1000.com/'
	txt = txt + base;
	txt = txt + '/results_static.kml" target="_blank">Microsoft Live</a>';
	$("ms_live").innerHTML= txt;
	var d = Date();
	$("date").innerHTML = d.toLocaleString();
	result = new Array();
	var team;
	var name;
	var paddlers;
	var clas;
	var lat;
	var lng;
	var loc;
	var timestamp;
	var penalty;
	var status;
	var msg;
	var paddling_time;
	var corrected_time;
	var comments;
	var url;
	var newdata;
	var posn = new Array();	// numeric ranking of boats in class
	var display_posn_class;
	var display_posn;
	var equal = 0;	// true if previous 2 entries finished together
	var class_equal = new Array(); // true if previous 2 entries in same
					// class finished together
	var class_prev = new Array();	// index of previous in same class
	
	x=xmlHttp.responseXML.documentElement.getElementsByTagName("data");
	for (i=0;i<x.length;i++)
	{
		xx=x[i].getElementsByTagName("team");
		{
			try
			{
				team = xx[0].firstChild.nodeValue;
			}
			catch (er)
			{
				team = "";
			}
		}
		xx=x[i].getElementsByTagName("name");
		{
			try
			{
				name = xx[0].firstChild.nodeValue;
			}
				catch (er)
			{
				name = "";
			}
		}
		xx=x[i].getElementsByTagName("paddlers");
		{
			try
			{
				paddlers = xx[0].firstChild.nodeValue;
			}
			catch (er)
			{
				paddlers = "";
			}
		}
		xx=x[i].getElementsByTagName("class");
		{
			try
			{
				clas = xx[0].firstChild.nodeValue;
			}
			catch (er)
			{
				clas = "";
			}
		}
		xx=x[i].getElementsByTagName("lat");
		{
			try
			{
				lat = xx[0].firstChild.nodeValue;
			}
			catch (er)
			{
				lat = "";
			}
		}
		xx=x[i].getElementsByTagName("long");
		{
			try
			{
				lng = xx[0].firstChild.nodeValue;
			}
			catch (er)
			{
				lng = "";
			}
		}
		xx=x[i].getElementsByTagName("loc");
		{
			try
			{
				loc = xx[0].firstChild.nodeValue;
			}
			catch (er)
			{
				loc = "";
			}
		}
		xx=x[i].getElementsByTagName("timestamp");
		{
			try
			{
				timestamp = xx[0].firstChild.nodeValue;
			}
			catch (er)
			{
				timestamp = "";
			}
		}
		xx=x[i].getElementsByTagName("penalty");
		{
			try
			{
				penalty = xx[0].firstChild.nodeValue;
			}
			catch (er)
			{
				penalty = "";
			}
		}
		xx=x[i].getElementsByTagName("status");
		{
			try
			{
				status = xx[0].firstChild.nodeValue;
			}
			catch (er)
			{
				status = "";
			}
		}
		xx=x[i].getElementsByTagName("msg");
		{
			try
			{
				msg = xx[0].firstChild.nodeValue;
			}
			catch (er)
			{
				msg = "";
			}
		}
		xx=x[i].getElementsByTagName("paddling-time");
		{
			try
			{
				paddling_time = xx[0].firstChild.nodeValue;
			}
			catch (er)
			{
				paddling_time = "";
			}
		}
		xx=x[i].getElementsByTagName("corrected-time");
		{
			try
			{
				corrected_time = xx[0].firstChild.nodeValue;
			}
			catch (er)
			{
				corrected_time = "";
			}
		}
		xx=x[i].getElementsByTagName("comments");
		{
			try
			{
				comments = xx[0].firstChild.nodeValue;
			}
			catch (er)
			{
				comments = "";
			}
		}
		xx=x[i].getElementsByTagName("url");
		{
			try
			{
				url = xx[0].firstChild.nodeValue;
			}
			catch (er)
			{
				url = "";
			}
		}
		xx=x[i].getElementsByTagName("new");
		{
			try
			{
				newdata = xx[0].firstChild.nodeValue;
			}
			catch (er)
			{
				newdata = "";
			}
		}
		if (posn[clas] == undefined) posn[clas] = 1;
		else posn[clas] += 1;
		if (i > 0
		&& status == 'FINISHED' && result[i-1].status == 'FINISHED'
		&& corrected_time == result[i-1].corrected_time) {
			if (!equal) {
				equal = 1;
				result[i-1].posn = i+'=';
			}
			display_posn = result[i-1].posn;
			if (typeof(class_prev[clas]) != 'undefined' 
			&&  result[class_prev[clas]].status == 'FINISHED'
			&& corrected_time == result[class_prev[clas]].corrected_time) {
				if (typeof(class_equal[clas]) == 'undefined'
				|| class_equal[clas] == 0) {
					class_equal[clas] = 1;	
					result[class_prev[clas]].posn_class = (posn[clas]-1)+'=';
				}
				display_posn_class = result[class_prev[clas]].posn;
			} else {
				class_equal[clas] = 0;
				display_posn_class = posn[clas];
			}
		} else {
			equal = 0;
			display_posn_class = posn[clas];
			class_equal[clas] = 0;
			display_posn = i+1;
		}
		class_prev[clas] = i;

		result[i] = new Result(display_posn, display_posn_class, team, name, paddlers, clas, lat, lng, loc, timestamp, penalty, status, msg, paddling_time, corrected_time, comments, url, newdata);
	}
	got_data = 1;
	result.sort(result_sort);
	formatResults();
	displayAllResults();
	play_sound();
}
function change_cols()
{
	var i;
	var option;
	for (i = 0, option= $('display_col'+i); option; i++, option=$('display_col'+i)) {
		display_cols[i] = option.checked;
	}
	var cols = display_cols.join(',');
	createCookie('result_columns', cols, 300);
	displayAllResults();
}


function sort_by(by)
{
	sortkey=by;
	result.sort(result_sort);
	formatResults();
	displayAllResults();

}

function result_sort(m1, m2)
{
	if (sortkey == 'pos') return parseInt(m1.posn,10) - parseInt(m2.posn,10);
	return m1.team - m2.team;
}

function format_as(fmt)
{
	if (format != fmt) {
		createCookie('deg_fmt', fmt, 300);
		format = fmt;
		if (got_data) {
			formatResults();
			displayAllResults();

		}
	}
}

function dist_as(unit)
{
	if (kph_mph != unit) {
		createCookie('kph_mph', unit, 300);
		kph_mph = unit;
		if (got_data) {
			formatResults();
			displayAllResults();
		}
	}
}

function formatResults()
{
	for (i = 0; i < result.length; i++) {
		result[i].fmt_lat = format_res(result[i].lat);
		result[i].fmt_lng = format_res(result[i].lng);
		result[i].fmt_loc = format_loc(result[i].loc);
	}
}

function format_res(loc)
{
	if (loc == 'UNKNOWN') return loc;
	var deg;
	var min;
	var sec;
	var idx;
	var par = 0;
	idx = loc.indexOf(" ");
	if (loc.substr(0, 1) == '(') par = 1;
	deg = loc.substr(par, idx);
	min = loc.substr(idx+1, 2);
	sec = loc.substr(idx+4, 2);
	var direction = loc.substr(idx+6);
	if (par == 1) par = '(';
	else par = '';
	if (format == 'dms') {
		deg = par+deg + '&nbsp;' + min + '&nbsp;' + sec + direction;
	} else if (format == 'd_dd') {
		deg = deg*1 + min/60 + sec/3600;
		deg = par + deg.toFixed(4) + direction;
	} else {
		min = min*1 + sec/60;
		deg = par + deg + ' ' + min.toFixed(2) + direction;
	}
	return deg;
}

function format_loc(loc)
{
	var bits;
	var miles;
	bits = loc.split(" km ");
	miles = parseFloat(bits[0]);
	if (kph_mph != 'kph') miles = miles * 0.621371192;
	miles = miles.toFixed(1);
	if (kph_mph != 'kph') miles =miles+ ' ml ' + bits[1];
	else miles =miles+ ' km ' + bits[1];
	return miles;
}

function displayAllResults()
{
	var i;
	for (i = 0; i < classes.length; i++) {
		displayResults(classes[i], class_names[i]);
	}
}
function displayResults(id, heading)
{
	var evenodd = "even";
	var posn = 0;
	var has_pen = 0;
	var has_pad = 0;
	var has_cor = 0;
	var has_com = 0;
	var stat;
	var clas;
	if (id == 'results') posn = 1;
	for (i = 0; i < result.length; i++) {
		if (!posn && id == result[i].clas) {
			posn = 1;
		}
		if (!has_pen && result[i].penalty != "&nbsp;") {
			has_pen = 1;
		}
		if (!has_pad && result[i].paddling_time != "&nbsp;") {
			has_pad = 1;
		}
		if (!has_cor && result[i].corrected_time != "&nbsp;") {
			has_cor = 1;
		}
		if (!has_com && !(result[i].comments == "&nbsp;" || result[i].comments == "")) {
			has_com = 1;
		}
	}
	if (!posn) {
		$(id).innerHTML= '';
		return;
	}

	txt =   '<div class="rcontent"><p class="mb">'+heading+'</p></div>';
	txt+='<table width="100%" border="0" cellspacing="0" cellpadding="0">';
	txt+='  <tr>';
	if (display_cols[0])
		txt+='	  <TD class="tb">Posn</TD>';
	if (display_cols[1])
		txt+='	  <TD class="tb">#</TD>';
	if (display_cols[2])
		txt+='	  <TD class="tb">Team Name</TD>';
	if (display_cols[3])
		txt+='	  <TD class="tb">Team Members</TD>';
	if (display_cols[4] && id == 'results')
		txt+='	  <TD class="tb">Class</TD>';
	if (display_cols[5])
		txt+='	  <TD class="tb">Location</TD>';
	if (display_cols[6])
		txt+='	  <TD class="tb">Last known<BR>'
		+'	    location&nbsp;</p></TD>';
	if (display_cols[7])
		txt+='    <TD class="tb">Time&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>';
	if (display_cols[8] && has_pen) {
		txt+='    <TD class="tb">Total<br>Penalties</TD>';
	}
	if (display_cols[9])
		txt+='    <TD class="tb">Status&nbsp;</TD>';
	if (display_cols[10] && has_pad) {
		txt+='    <TD class="tb">Total Time</TD>';
	}
	if (display_cols[11] && has_cor) {
		txt+='    <TD class="tb">Corrected Time</TD>';
	}
	if (display_cols[12] && has_com) {
		txt+='    <TD class="tb" >Comments</TD>';
	}
	if (display_cols[13])
		txt+='    <TD class="noprint"><p class="tb">map<br>url</p></TD>';
	txt+='  </TR>';
	posn = 0;
	for (i = 0; i < result.length; i++) {
		if (id != 'results' && result[i].clas != id) continue;
		stat = result[i].status;
		if (result[i].newdata == 1) td = '  <TD class="tbi"';
		else td = '  <TD class="t"'
		if (stat == 'WITHDRAWN' || stat == 'DISQUALIFIED')
		      	td+=' style: style="text-decoration:line-through"';
		td += '>';
		posn = posn+1;
		txt+='  <TR class="'+evenodd+'">';
		if (display_cols[0]) {
			if (id == 'results') {
				txt+=td+result[i].posn;+'</td>';
			} else {
				txt+=td+result[i].posn_class+'&nbsp;('+result[i].posn+')</TD>';
			}
		}
		if (display_cols[1])
			txt+=td+result[i].team+'</TD>';
		if (display_cols[2])
			txt+=td+'<a href="teams.html#'+result[i].team+'" target="_blank">'
			+       result[i].name+'</a>&nbsp;</TD>';
		if (display_cols[3])
			txt+=td+result[i].paddlers+'</TD>';
		if (display_cols[4] && id == 'results') {
			if (class_name[result[i].clas] != "undefined") clas = class_name[result[i].clas];
			else clas = result[i].clas;
			txt+=td+clas+'</TD>';
		}
		if (display_cols[5])
			txt+=td+result[i].fmt_lat+', '+result[i].fmt_lng+'</TD>';
		if (display_cols[6])
			txt+=td+result[i].fmt_loc+'</TD>';
		if (display_cols[7])
			txt+=td+result[i].timestamp+'</TD>';
		if (display_cols[8] && has_pen) {
			txt+=td+result[i].penalty+'</TD>';
		}
		if (display_cols[9]) {
			txt+='   <TD><p class="tb" title="'+result[i].msg+'">'
			if (result[i].newdata == 1) txt+= '<img class="noprint" src="../images/star.gif">';
			if (stat != 'OK') {
				fnt = 1;
				if (stat == 'FINISHED') txt+='<font color="green">';
				else if (stat == 'WITHDRAWN') txt+='<font color="yellow">';
				else if (stat == 'DISQUALIFIED') txt+='<font color="orange">';
				else if (stat == 'UNKNOWN') txt+='<font color="white">';
				else if (stat == 'SLOW UPDATES')txt+='<font color="orangered">';
				else if (stat == 'OUT OF CONTACT')txt+='<font color="orangered">';
				else if (stat == 'TRACK')txt+='<font color="darkslategray">';
				else txt+='<font color="red">';
			}
			else fnt = 0;
			txt+=stat;
			if (fnt) txt+='</font>';
			txt+='</p></TD>';
		}
		if (display_cols[10] && has_pad) {
			txt+=td+result[i].paddling_time+'</TD>';
		}
		if (display_cols[11] && has_cor) {
			txt+=td+result[i].corrected_time+'</TD>';
		}
		if (display_cols[12] && has_com) {
			txt+=td+result[i].comments+'</TD>';
		}
		if (display_cols[13]) {
			if (result[i].url != 'http://maps.google.com')
				txt+='   <TD class="noprint3"><a href="'+result[i].url+'" target="_blank"><img src="../images/earth.gif" height="16" border="none"></a>';
			else
				txt+='   <TD class="noprint" align="center" valign="middle">&nbsp;</a>';
		}
		if (evenodd == 'even') {
			evenodd = 'odd';
		} else {
			evenodd = 'even';
		}
	}
	$(id).innerHTML= txt
}

function getURLParam(strParamName){
	var strReturn = "";
	var strHref = window.location.href;
	if ( strHref.indexOf("?") > -1 ){
		var strQueryString = strHref.substr(strHref.indexOf("?")).toLowerCase();
		var aQueryString = strQueryString.split("&");
		for ( var iParam = 0; iParam < aQueryString.length; iParam++ ){
			if (aQueryString[iParam].indexOf(strParamName.toLowerCase() + "=") > -1 ){
				var aParam = aQueryString[iParam].split("=");
				strReturn = aParam[1];
				break;
			}
		}
	}
	return unescape(strReturn);
} 

function createCookie(name,value,days) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}

function change_disp_map()
{
	var checked = $('disp_map').checked;
	if ($('map')) {
		if (checked) {
			$('map').style.display = 'block';
			$('map').innerHTML = map_html;
		} else {
			$('map').innerHTML = '&nbsp;';
			$('map').style.display = 'none';
		}
	}
	createCookie('map', checked?'true':'false', 14);

}
function set_sound()
{
	var i = $('play_sound').checked;
	if (i == should_play_sound) return;
	should_play_sound = i;
	i = i?'1':'0';
	createCookie('play_sound', i, 300);
}
function play_sound()
{
	if (!should_play_sound) return;
	$('ding2').src ='../images/ding.mp3';
	o = $('ding1');
	if (o && o.play) o.play();
	if (o && o.Play) o.Play();
	var o = $('ding');
	if (o && o.play) o.play();
}
window.onload=function(){
	var i;
	menusetup();
	kph_mph = readCookie('kph_mph');
	if (kph_mph != 'mph') kph_mph = 'kph';
	$(kph_mph).checked = true;
	format = readCookie('deg_fmt');
	if (format != 'd_dd' && format != 'dm_mm') {
		format = 'dms';
	}
	$(format).checked = true;
	var cols = readCookie('result_columns');
	if (cols == null) display_cols = everything;
	else {
		display_cols = cols.split(',');
		for (i = 0; i < display_cols.length; i++)
			display_cols[i] = (display_cols[i] === 'true');
		}
	var option;
	for (i = 0, option= $('display_col'+i); option; i++, option=$('display_col'+i)) {
		option.checked = display_cols[i];
	}
	change_disp_map();
	showResults();
	var d = new Date();
	var delay = 900 - (d.getMinutes()*60 + d.getSeconds()) % 900;
	
	setTimeout("Refresh()", delay*1000);
}

