﻿// Global variables
// For style edits will need right-click context menus. See http://www.webtoolkit.info/javascript-context-menu.html

var TriangleImage = "<img alt='drop-down pointer' src='images/dropdown_triangle.gif' class='triangle' width='10px' height='7px' />";
var clientArgs = {      // Parameters passed via the query string and dealt with locally, converted to lower case.
	bannerurl: "",      // URL of the banner image. Can also be set by server script based on the database.
	esp: "",            // Edit style password. If this is set to the login password for the club, allow user to alter colours.
	fs: 12,             // Font size in px.
	nl: 4,              // Number of lists (menus) to show. -1 means hide the whole of the caption table.
	no: 0,              // No options pop-up box if 1.
	nr: 0,              // No redirect. Stop any redirection to another page.
	sbi: 0,             // Set to 1 if parameter sbi set (suppress boat info) ie suppress the title info.
	scroll: -1,         // Scroll the page after a delay of scroll seconds. -1 is no scrolling.
	sfn: 0,             // Show foot notes by default.
	sss: 0,             // Show series summary, rather than the full series results.
	stw: 0,             // Show time to win for boats that have not yet finished.
	stylesheet: "",     // URL of the style sheet. Can also be set by server script based on the database.
	width: 0            // Width of the page in px. 0 means full width.
};
var serverArgs = {      // Arguments passed in javascript written on the server.
	bannerurl: "",      // Set to the relative address of the banner (_BS/Banner0000xxx.gif) by the server if there is one.
	classKey: 0,
	className: "",
	clubKey: 0,
	clubName: 0,
	dsKey: 0,
	dsName: "",
	halIssue: "",       // Issue string for the version of HAL that uploaded the results.
	isLevelOrPursuit: 0,
	raceKey: 0,
	raceName: "",
	redirectToOldPage: 0,   // Redirect to the old page, based on server criteria, eg club request.
	sbi: 0,             // Set to 1 by server script if the club has registered to suppress boat details.
	seriesKey: 0,
	seriesName: "",
	seriesSwitches: 0   // The Int32 number holding the switch bits that control what columns to show (eg, ShowHelmName).
};

function showSeriesResults(event) {
	// Called from the onclick event for the series link written into the data table by server script
	stopDefaultAction(event);
	$('#R0').trigger('click');
	debug.log(clientArgs.sss ? "Show summary series results, linked from a race page." : "Show full series results, linked from a race page.");
}
function toggleShowSummary(event) {
	optionsPanel.cancel();
	$('#DataDiv').slideUp('fast');
	stopDefaultAction(event);
	if (clientArgs.sss) {
		clientArgs.sss = 0;
		$('#spanSeriesResults a').text('Summary overall results');
		$('td.seriespoints').show();
		$('td.seriesracessailed').hide();
		$('tr#row0001').show(); // Show the row with dates of races in it
		debug.log("Switched from summary to full results.");
	} else {
		clientArgs.sss = 1;
		$('#spanSeriesResults a').text('Full overall results');
		$('td.seriespoints').hide();
		$('td.seriesracessailed').show();
		$('tr#row0001').hide(); // Hide the row with dates of races in it
		debug.log("Switched from full to summary results.");
	}
	$('#DataDiv').slideDown('slow');
}
function addBespokeParameters() {
	// Add bespoke parameters requested by clubs
	var existingCrsurl = String(window.location), newUrl;
	if (!clientArgs.sfn  && serverArgs.clubKey === 1026) {
		// Show foot notes right away for RPEYC
		newUrl = existingCrsurl + "&SFN";
		window.location = newUrl;
	}
}
function redirectIfNecessary() {
	// Redirect if the machine cannot handle this page.
	if (!clientArgs.nr) {
		var oldCrsurl = String(window.location);
		oldCrsurl = oldCrsurl.toLowerCase().replace("crs.aspx", "crsz.aspx");
		if (serverArgs.redirectToOldPage) {
			debug.log("Redirecting to page '" + oldCrsurl + "' on the say so of the server.");
			window.location = oldCrsurl;
		}
		if ($.browser.msie && $.browser.version <= 7) {
			debug.log("Redirecting to page '" + oldCrsurl + "' because this is IE version 7 of less.");
			window.location = oldCrsurl;
		}
		if (navigator.userAgent.match(/iPad/i)) {
			debug.log("Redirecting to page '" + oldCrsurl + "' because this is an iPad.");
			window.location = oldCrsurl;
		}
		if (navigator.userAgent.match(/iPhone/i)) {
			debug.log("Redirecting to page '" + oldCrsurl + "' because this is an iPhone.");
			window.location = oldCrsurl;
		}
		if (navigator.userAgent.match(/iPod/i)) {
			debug.log("Redirecting to page '" + oldCrsurl + "' because this is an iPod.");
			window.location = oldCrsurl;
		}
	}
}
function stopDefaultAction(event) {
	if (event) {
		if (event.preventDefault) {
			event.preventDefault();
		} else {
			if (event.returnValue) {
				event.returnValue = false;
			}
		}
	}
}
/*jslint bitwise: true */
function showSwitch(seriesSwitch, mask) {
	return seriesSwitch & mask ? 1 : 0;
}
/*jslint bitwise: false */
var debug = {
	show: 1,    // Set to 0 to suppress log messages on the console
	log: function (msg) {
		if (debug.show && (typeof console !== "undefined")) {
			console.log(msg);
		}
	}
};
var loadPage = {
	getclientArgs: function () {
		// Parse the query string and update any of the following parameters: nl, fs, scroll, stw.
		// Ignore other parameters (keys and style sheet) which are handled in server script
		var query = location.search.substring(1), pairs = query.split("&"), pos, argname, value, i, pairslength, argsnl, argsfs, argsscroll, argswidth;
		for (i = 0, pairslength = pairs.length; i < pairslength; i += 1) {
			pos = pairs[i].indexOf('=');
			if (pos >= 1) {
				// argument with an = sign and at least one character to the left of it.
				argname = pairs[i].substring(0, pos).toLowerCase();
				value = pairs[i].substring(pos + 1);
				if (argname === "nl" || argname === "numberoflists") {
					if (value) {
						argsnl = parseInt(value, 10);
						if (!isNaN(argsnl)) { clientArgs.nl = argsnl; }
						clientArgs.nl = Math.min(4, clientArgs.nl);
						clientArgs.nl = Math.max(-1, clientArgs.nl);
					}
					debug.log("Query string arg nl set to " + clientArgs.nl);
				}
				if (argname === "banner" || argname === "bannerurl") {
					clientArgs.bannerurl = value ? value : "none";
					debug.log("Query string arg bannerurl set to " + clientArgs.bannerurl);
				}
				if (argname === "esp" || argname === "editstylepassword") {
					if (value) {
						clientArgs.esp = value;
						debug.log("Edit style password supplied.");
					} else {
						clientArgs.esp = "";
					}
				}
				if (argname === "fs" || argname === "fontsize") {
					if (value) {
						argsfs = parseInt(value, 10);
						if (!isNaN(argsfs)) { clientArgs.fs = argsfs; }
						clientArgs.fs = Math.min(64, clientArgs.fs);
						clientArgs.fs = Math.max(8, clientArgs.fs);
					}
					debug.log("Query string arg fs set to " + clientArgs.fs);
				}
				if (argname === "scroll") {
					if (value) {
						argsscroll = parseInt(value, 10);
						if (!isNaN(argsscroll)) { clientArgs.scroll = argsscroll; }
						clientArgs.scroll = Math.min(300, clientArgs.scroll);
						clientArgs.scroll = Math.max(0, clientArgs.scroll);
					} else {
						clientArgs.scroll = 0;
					}
					debug.log("Query string arg scroll set to " + clientArgs.scroll);
				}
				if (argname === "width") {
					if (value) {
						argswidth = parseInt(value, 10);
						if (!isNaN(argswidth)) { clientArgs.width = argswidth; }
						clientArgs.width = Math.min(3000, clientArgs.width);
						clientArgs.width = Math.max(100, clientArgs.width);
					}
					debug.log("Query string arg width set to " + clientArgs.width);
				}
				if (argname === "no" || argname === "nooptions") {
					clientArgs.no = 1;
					debug.log("Query string arg NoOptions.");
				}
				if (argname === "sbi" || argname === "suppressboatinfo") {
					clientArgs.sbi = 1;
					debug.log("Query string arg sbi set to " + clientArgs.sbi);
				}
				if (argname === "sfn" || argname === "showfootnotes") {
					clientArgs.sfn = 1;
					debug.log("Query string arg sfn set to " + clientArgs.sfn);
				}
				if (argname === "stw" || argname === "showtimetowin") {
					clientArgs.stw = 1;
					debug.log("Query string arg stw set to " + clientArgs.stw);
				}
				if (argname === "sss" || argname === "showseriessummary") {
					clientArgs.sss = 1;
					debug.log("Query string arg sss set to " + clientArgs.sss);
				}
				if (argname === "nr" || argname === "noredirect") {
					clientArgs.nr = 1;
					debug.log("No redirection allowed.");
				}
			} else if (pos < 0) {
				// argument with no = sign
				argname = pairs[i].toLowerCase();
				if (argname === "scroll") {
					clientArgs.scroll = 0;
					debug.log("Query string arg scroll set to " + clientArgs.scroll);
				}
				if (argname === "no" || argname === "nooptions") {
					clientArgs.no = 1;
					debug.log("Query string arg NoOptions.");
				}
				if (argname === "sbi" || argname === "suppressboatinfo") {
					clientArgs.sbi = 1;
					debug.log("Query string arg sbi set to " + clientArgs.sbi);
				}
				if (argname === "sfn" || argname === "showfootnotes") {
					clientArgs.sfn = 1;
					debug.log("Query string arg sfn set to " + clientArgs.sfn);
				}
				if (argname === "stw" || argname === "showtimetowin") {
					clientArgs.stw = 1;
					debug.log("Query string arg stw set to " + clientArgs.stw);
				}
				if (argname === "sss" || argname === "showseriessummary") {
					clientArgs.sss = 1;
					debug.log("Query string arg sss set to " + clientArgs.sss);
				}
				if (argname === "nobanner") {
					clientArgs.bannerurl = "none";
					debug.log("Query string arg banner set to " + clientArgs.bannerurl);
				}
				if (argname === "nr" || argname === "noredirect") {
					clientArgs.nr = 1;
					debug.log("No redirection allowed.");
				}
			}
		}
	}
};
var ajaxResults = {
	AjaxRaceResults: function () {
		redirectIfNecessary(); // In case the server set redirectToOldPage on the basis of a club request
		optionsPanel.cancel();
		//  Get result for an individual race from the web service
		$.ajax({
			type: 'POST',
			cache: false,
			url: 'Crsajax.asmx/GetRaceResults',
			beforeSend: optionsPanel.cancel(),
			data: "{'dsKey':" + serverArgs.dsKey + ", 'raceKey':" + serverArgs.raceKey + "}",
			contentType: 'application/json; charset=utf-8',
			dataType: 'json',
			success: function (msg) {
				$('#DataDiv').html(msg.d);
				$('#linkFootnotes').html('Show foot notes');
				debug.log("Results of race '" + serverArgs.raceName + "' loaded.");
			},
			complete: function () { ajaxResults.AjaxResultsComplete(); }
		});
	},
	AjaxSeriesResults: function () {
		//  Get overall results for a series from the web service
		redirectIfNecessary(); // In case the server set redirectToOldPage on the basis of a club request
		$.ajax({
			type: 'POST',
			cache: false,
			url: 'Crsajax.asmx/GetSeriesResults',
			beforeSend: optionsPanel.cancel(),
			data: "{'dsKey':'" + serverArgs.dsKey + "', 'seriesKey':'" + serverArgs.seriesKey + "'}",
			contentType: 'application/json; charset=utf-8',
			dataType: 'json',
			success: function (msg) {
				$('#DataDiv').html(msg.d);
				$('#linkFootnotes').html('Show foot notes');
				if (clientArgs.sss) {
					$('#spanSeriesResults a').text('Full overall results');
					$('td.seriespoints').hide();
					$('td.seriesracessailed').show();
				} else {
					$('#spanSeriesResults a').text('Summary overall results');
					$('td.seriespoints').show();
					$('tr#row0001 td').removeAttr('title');  // Remove redundant titles from the row that just shows the dates of the races
					$('td.seriesracessailed').hide();
				}
				debug.log("Results of series '" + serverArgs.seriesName + "' loaded.");
			},
			complete: function () { ajaxResults.AjaxResultsComplete(); }
		});
	},
	AjaxResultsComplete: function () {
		// The asynchronous AJAX request to get results has completed
		ajaxResults.setSeriesSwitches();        // Show or hide the various columns
		if (serverArgs.raceKey === 0 && clientArgs.sss) {
			$('tr#row0001').hide(); // Hide the row with dates of races in it
		} else {
			$('tr#row0001').show(); // Show the row with dates of races in it
		}
		formatPage.setPageWidth();
		formatPage.setBGColour();
		if (serverArgs.sbi || clientArgs.sbi) { $('td.seriessailno, td.racesailno').removeAttr('title'); } // Hide the boat details if requested
		timeToWin.setTimeToWin();
		if (clientArgs.sfn) { $('#linkFootnotes').click(); }   // Show the foot notes by default, if requested
		$('td.highlight').click(function (e) { alert('Highlight area clicked with the ' + e.button + ' button.'); });
		$('#DataDiv').slideDown('slow', ajaxResults.logElementSizes());
		// Start scrolling if clientArgs.scroll >= 0
		//        if (clientArgs.scroll >= 0) { scrolling.scrollPixels = 0; setTimeout('scrolling.scrollDown()', clientArgs.scroll * 1000); }
		if (clientArgs.scroll >= 0) { scrolling.scrollPixels = 0; setTimeout(function () { scrolling.scrollDown(); }, clientArgs.scroll * 1000); }
		//        $.cookie('HALClubKey', serverArgs.clubKey, { expires: 365 });
		//        $.cookie('HALDSKey', serverArgs.dsKey, { expires: 365 });
		//        $.cookie('HALClassKey', serverArgs.classKey, { expires: 365 });
		//        $.cookie('HALSeriesKey', serverArgs.seriesKey, { expires: 365 });
		var oneYearFromNow = new Date(),
			printUrl = 'URL for this page is http://www.halsraceresults.com/crs/crs.aspx?DSKey=' + serverArgs.dsKey;
		oneYearFromNow.setFullYear(oneYearFromNow.getFullYear() + 1);
		document.cookie = "HALClubKey=" + serverArgs.clubKey + "; expires=" + oneYearFromNow.toGMTString();
		document.cookie = "HALDSKey=" + serverArgs.dsKey + "; expires=" + oneYearFromNow.toGMTString();
		document.cookie = "HALClassKey=" + serverArgs.classKey + "; expires=" + oneYearFromNow.toGMTString();
		document.cookie = "HALSeriesKey=" + serverArgs.seriesKey + "; expires=" + oneYearFromNow.toGMTString();
		debug.log("Cookies for the keys stored.");
//        printUrl = 'URL for this page is http://www.halsraceresults.com/crs/crs.aspx?';
//        printUrl += 'DSKey=' + serverArgs.dsKey;
		printUrl += serverArgs.raceKey === 0 ? '&SeriesKey=' + serverArgs.seriesKey : '&RaceKey=' + serverArgs.raceKey;
		if (clientArgs.fs !== 12) { printUrl += '&FS=' + clientArgs.fs; }
		if (clientArgs.width) { printUrl += '&Width=' + clientArgs.width; }
		if (clientArgs.nr) { printUrl += '&NR'; }
		if (clientArgs.sss) { printUrl += '&SSS'; }
		if (clientArgs.stw) { printUrl += '&STW'; }
		if (clientArgs.stylesheet) { printUrl += '&Stylesheet=' + clientArgs.stylesheet; }
		$('#URLforPrintOutput').text(printUrl);
	},
	setSeriesSwitches: function () {
		// serverArgs.seriesSwitches set and this function called in script that is part of the AJAX download
		var showForThisSeries = "Show: ";
		if (showSwitch(serverArgs.seriesSwitches, 0x80)) { showForThisSeries += "sel flags, "; } else { $('.raceflags, .seriesflags').addClass('hidden'); }
		if (showSwitch(serverArgs.seriesSwitches, 0x200)) { showForThisSeries += "boat name, "; } else { $('.racename, .seriesname').addClass('hidden'); }
		if (showSwitch(serverArgs.seriesSwitches, 0x400)) { showForThisSeries += "boat type, "; } else { $('.racetype, .seriestype').addClass('hidden'); }
		if (showSwitch(serverArgs.seriesSwitches, 0x800)) { showForThisSeries += "club name, "; } else { $('.raceclub, .seriesclub').addClass('hidden'); }
		if (showSwitch(serverArgs.seriesSwitches, 0x1000)) { showForThisSeries += "crew name, "; } else { $('.racecrew, .seriescrew').addClass('hidden'); }
		if (showSwitch(serverArgs.seriesSwitches, 0x2000)) { showForThisSeries += "helm name, "; } else { $('.racehelm, .serieshelm').addClass('hidden'); }
		if (showSwitch(serverArgs.seriesSwitches, 0x4000)) { showForThisSeries += "bow number, "; } else { $('.racehullno, .serieshullno').addClass('hidden'); }
		if (showSwitch(serverArgs.seriesSwitches, 0x8000)) { showForThisSeries += "owner name, "; } else { $('.raceowner, .seriesowner').addClass('hidden'); }
		if (showSwitch(serverArgs.seriesSwitches, 0x10000)) { showForThisSeries += "mark provisional, "; }
		showForThisSeries = showForThisSeries.substr(0, showForThisSeries.length - 2) + ".";
		debug.log(serverArgs.isLevelOrPursuit ?
			"Ajax call completed. Level series. SeriesSwitches = 0x" + serverArgs.seriesSwitches.toString(16) + " - " + showForThisSeries : 
			"Ajax call completed. Handicap series. SeriesSwitches = 0x" + serverArgs.seriesSwitches.toString(16) + " - " + showForThisSeries);
	},
	logElementSizes: function () {
		if (debug.show) {
			$('*').scroll(function () { debug.log($(this).attr('id') + ' scrolled.'); });
			debug.log('Element sizes:');
			ajaxResults.logElementSize(document.documentElement);
			ajaxResults.logElementSize(document.getElementById('crsBody'));
			ajaxResults.logElementSize(document.getElementById('container'));
			ajaxResults.logElementSize(document.getElementById('divMain'));
			ajaxResults.logElementSize(document.getElementById('DataDiv'));
			ajaxResults.logElementSize(document.getElementById('ResultsTable'));
		}
	},
	logElementSize: function (elem) {
		if (elem) {
			var s = 'Element ' + elem.id + ': ';
			s += 'clientHeight ' + elem.clientHeight + ', scrollHeight ' + elem.scrollHeight;
			if (elem.clientHeight < elem.scrollHeight) { s += ' (so it has a vertical scroll bar)'; }
			s += ', clientWidth ' + elem.clientWidth + ', scrollWidth ' + elem.scrollWidth;
			if (elem.clientWidth < elem.scrollWidth) { s += ' (so it has a horizontal scroll bar)'; }
			debug.log(s);
		}
	}
};
var optionsPanel = {
	cancel: function () {
		// Click handler for the Cancel button in the Optins pop-up div
		$('#divOptions').css('display', 'none');
	},
	go: function () {
		// Click handler for the Go button in the Options pop-up div
		var newwidth;
		$('#DataDiv').slideUp('fast');
		if ($('#chkScroll').is(':checked')) { scrolling.scrollPixels = 0; clientArgs.scroll = 0; } else { clientArgs.scroll = -1; }
		clientArgs.stw = $('#chkSTW').is(':checked') ? 1 : 0;
		clientArgs.fs = $('#selFS').val();

		// Page width
		if ($('#txtWidth').attr('value')) {
			newwidth = parseInt($('#txtWidth').attr('value'), 10);
			if (!isNaN(newwidth) && newwidth !== formatPage.containerWidth && newwidth >= 100 && newwidth <= 3000) {
				clientArgs.width = newwidth;
			}
		} else {
			clientArgs.width = 0;
		}
		formatPage.setFontSize();
		$('#divOptions').css('display', 'none');
		ajaxResults.AjaxResultsComplete();
	},
	launch: function () {
		// Event handler for the Options link. Show the divOptions pop-up

		// Set the font size and number of lists select tags and the time to win check box
		$('#selFS').removeAttr('selected');
		$('#selFS option').each(function () {
			var $this = $(this);
			if (parseInt($this.val(), 10) === clientArgs.fs) { $this.attr('selected', 'selected'); }
		});
		// Set the page width
		$('#txtWidth').attr('value', formatPage.containerWidth);
		// Set show time to win
		if (serverArgs.raceKey === 0 || serverArgs.isLevelOrPursuit) {
			// This is an overall series page or a level race page. No time to win.
			$('#rowSTW').addClass('hidden');
		} else {
			$('#rowSTW').removeClass('hidden');
			if (clientArgs.stw) {
				$('#chkTimeToWin').attr('checked', 'checked');
			} else {
				$('#chkTimeToWin').removeAttr('checked');
			}
		}
		// Set scrolling
		if (clientArgs.scroll > 0) {
			$('#chkScroll').attr('checked', 'checked');
		} else {
			$('#chkScroll').removeAttr('checked');
		}
		// Position divOptions at the bottom right of the container div and display it
		var $DivOptions = $('#divOptions'),
			$container = $('#container'),
			divOptionsTop = $container.offset().top + $container.height() - $DivOptions.height() - 30,
			divOptionsLeft = $container.offset().left + $container.width() - $DivOptions.width() - 20;
		if (divOptionsTop < 10) { divOptionsTop = 10; }
		if (divOptionsLeft < 10) { divOptionsLeft = 10; }
		$DivOptions.css('left', divOptionsLeft + 'px');
		$DivOptions.css('top', divOptionsTop + 'px');
		$DivOptions.fadeIn('slow');
		$('#btnOptionsCancel').focus();
	}
};
var scrolling = {
	scrollPixels: 0,
	scrollDown: function () {
		scrolling.scrollPixels = $('#HALLink').offset().top - $(window).height() + 50;
		if (scrolling.scrollPixels > 0) {
			scrolling.scrollDown1PixelAtaTime();
			debug.log("Starting to scroll down.");
		}
	},
	scrollDown1PixelAtaTime: function () {
		var scrollMsecs = 40;       // Interval in msec between scrolls of 1 pixel each
		if (clientArgs.fs > 14) { scrollMsecs = 25; }
		if (clientArgs.fs > 24) { scrollMsecs = 15; }
		if (scrolling.scrollPixels > 0) {
			scrolling.scrollPixels -= 1;
			window.scrollBy(0, 1);
			//            setTimeout("scrolling.scrollDown1PixelAtaTime()", scrollMsecs);
			setTimeout(function () { scrolling.scrollDown1PixelAtaTime(); }, scrollMsecs);
		} else {
			//            setTimeout("scrolling.scrollUp()", 2000);
			setTimeout(function () { scrolling.scrollUp(); }, 2000);
		}
	},
	scrollUp: function () {
		window.scrollTo(0, 0);
		//        scrolling.scrollPixels = $('#container').offset().top;
		//        if (scrolling.scrollPixels < 0) {
		//            scrolling.scrollUp1PixelAtaTime();
		//            debug.log("Scrolling up.");
		//        };
		//        scrolling.scrollPixels = $('#HALLink').offset().top - $(window).height();
		//        setTimeout("scrolling.scrollDown()", clientArgs.scroll * 1000);
		setTimeout(function () { scrolling.scrollDown(); }, clientArgs.scroll * 1000);
	},
	scrollUp1PixelAtaTime: function () {
		var scrollMsecs = 5;       // Interval in msec between scrolls of 1 pixel each
		if (clientArgs.fs > 14) { scrollMsecs = 3; }
		if (clientArgs.fs > 24) { scrollMsecs = 2; }
		if (scrolling.scrollPixels < 0) {
			scrolling.scrollPixels += 1;
			window.scrollBy(0, -1);
			//            setTimeout("scrolling.scrollUp1PixelAtaTime()", scrollMsecs);
			setTimeout(function () { scrolling.scrollUp1PixelAtaTime(); }, scrollMsecs);
		} else {
			//            setTimeout("scrolling.scrollDown()", 2000);
			setTimeout(function () { scrolling.scrollDown(); }, 2000);
		}
	}
};
var timeToWin = {
	setTimeToWin: function () { // Set the finish time needed to win for DNC boats
		if (serverArgs.raceKey !== 0) {
			if (clientArgs.stw) {
				$('span.stw').show();
				$('span.notstw').hide();
				timeToWin.refreshTimeToWin = window.setInterval('timeToWin.checkTimeToWin()', 2000);
			} else {
				if (timeToWin.refreshTimeToWin) { window.clearInterval(timeToWin.refreshTimeToWin); }
				$('span.stw').hide();
				$('span.notstw').show();
				$('td.stw').css({ 'background-color': 'transparent' });
			}
		}
	},
	checkTimeToWin: function () {
		debug.log("Checking the time to win fields.");
		$('#DataDiv table tr td.racefinishtime').each(function () {
			var $this = $(this),
				$status = $this.siblings(".racestatus:contains('DNC')"),
				stringTimeToWin,
				dateTime,
				dateParts,
				timeParts,
				thisTimeToWin,
				timeNow;
			if ($status.length >= 1) {
				// found a DNC time to win
				stringTimeToWin = $this.siblings(".racetimetowin").html();
				if (stringTimeToWin) {
					dateTime = stringTimeToWin.split("T");
					if (dateTime.length === 2) {
						dateParts = dateTime[0].split("-");
						if (dateParts.length === 3) {
							timeParts = dateTime[1].split(":");
							if (timeParts.length === 3) {
								thisTimeToWin = new Date(dateParts[0], dateParts[1] - 1, dateParts[2], timeParts[0], timeParts[1], timeParts[2]);
								timeNow = new Date();
								$this.css('background-color', thisTimeToWin < timeNow ? '#ff9999' : '#99ff99');
							}
						}
					}
				}
			}
		});
	},
	refreshTimeToWin: 0
};
var mainMenus = {
	GetSeriesMenu: function (e) { // A new class has been chosen. Get a new series menu
		var $target = $(e.target);  //Grab the click target here before it is overridden
		$('#DataDiv').slideUp('fast');
		// Update the class name and reset the css class for each entry in the menu.
		$('#menuCellClassKey h2').html(serverArgs.className + TriangleImage);
		$('#menuCellClassKey ul li').addClass('active').removeClass('showing');
		$target.addClass('showing').removeClass('active');
		// Call the web service to get the series menu for the new class
		$.ajax({
			type: 'POST',
			cache: false,
			url: 'Crsajax.asmx/GetSeriesMenuCell',
			data: "{'dsKey':'" + serverArgs.dsKey + "', 'classKey':'" + serverArgs.classKey + "', 'aimSeriesKey':'" + serverArgs.seriesKey + "'}",
			contentType: 'application/json; charset=utf-8',
			dataType: 'json',
			success: function (msg) {
				mainMenus.NewSeriesMenu(msg);
				debug.log("Class '" + serverArgs.className + "' chosen.");
			}
		});
	},
	NewSeriesMenu: function (result) {
		$('#menuCellSeriesKey').html(result.d); // Replace the series menu with the one downloaded from the server
		var $ChosenSeriesLi = $('#menuCellSeriesKey ul li.showing'); // Make sure that one of the series is selected
		$ChosenSeriesLi.trigger('click'); // Make sure that one of the series is selected
	},
	GetRaceMenu: function (e) {
		// A new series has been chosen.
		var $target = $(e.target);  //Grab the click target here before it is overridden
		$('#DataDiv').slideUp('fast');
		// Update the series name and reset the css class for each entry in the menu.
		$('#menuCellSeriesKey h2').html(serverArgs.seriesName + TriangleImage);
		$('#menuCellSeriesKey ul li').addClass('active').removeClass('showing');
		$target.addClass('showing').removeClass('active');
		// Call the web service to get the race menu for the new series
		$.ajax({
			type: 'POST',
			cache: false,
			url: 'Crsajax.asmx/GetRacesMenuCell',
			data: "{'dsKey':'" + serverArgs.dsKey + "', 'seriesKey':'" + serverArgs.seriesKey + "', 'aimRaceKey':'" + serverArgs.raceKey + "'}",
			contentType: 'application/json; charset=utf-8',
			dataType: 'json',
			success: function (msg) {
				mainMenus.NewRacesMenu(msg);
				debug.log("Series '" + serverArgs.seriesName + "' chosen.");
			}
		});
	},
	NewRacesMenu: function (result) {
		$('#menuCellRaceKey').html(result.d); // Replace the race menu with the one just downloaded from the server
		if (timeToWin.refreshTimeToWin) { clearInterval(timeToWin.refreshTimeToWin); }
		$('#menuCellRaceKey ul li.showing').trigger('click');
	},
	GetResults: function (e) {
		// Hide the old results that will be replaced
		var $target = $(e.target);  //Grab the click target here before it is overridden
		$('#DataDiv').slideUp('fast');
		//  User expects to see either overall series results or individual race results
		$('#menuCellRaceKey h2').html(serverArgs.raceName + TriangleImage); // update the race name
		$('#menuCellRaceKey ul li').addClass('active').removeClass('showing');
		$target.addClass('showing').removeClass('active');
		setTimeout(serverArgs.raceKey === 0 ? function () {
			ajaxResults.AjaxSeriesResults();
		} : function () {
			ajaxResults.AjaxRaceResults();
		}, 300);
		stopDefaultAction(e);
	}
};
var formatPage = {
	containerWidth: 0,
	setBanner: function () {
		if (clientArgs.bannerurl) {
			// banner set (or suppressed) in the query string
			if (clientArgs.bannerurl === "none") {
				$('div.banner').remove();
			} else {
				$('div.banner').html("<img src='" + clientArgs.bannerurl + "' class='banner' alt='Club Banner' id='banner' title='Banner for " + serverArgs.clubName + "' />");
			}
		} else {
			// banner may have been set from the server database
			if (serverArgs.bannerurl) {
				$('div.banner').html("<img src='" + serverArgs.bannerurl + "' class='banner' alt='Club Banner' id='banner' title='Banner for " + serverArgs.clubName + "' />");
			} else {
				$('div.banner').remove();
			}
		}
	},
	setFontSize: function () {
		$('#container').css('font-size', clientArgs.fs + "px");
	},
	setPageWidth: function () {
		var $windowWidth = $('#container').parent().width();
		formatPage.containerWidth = clientArgs.width ? clientArgs.width : $windowWidth - 6;
		$('#container').css('width', formatPage.containerWidth + 'px');
		debug.log("Window resized to " + window.innerHeight + ' high, by ' + window.innerWidth + ' wide.');
	},
	setBGColour: function () {
		// Note: this must be called after the results table is loaded by AJAX
		var bgColour = $('#DataDiv table').css('background-color');
		$('#DataDiv').css('background-color', bgColour);
		//    TODO:    Calculate a suitable contrasting colour for the even rows
		//    var evenBGColour = '#dddddd';
		//    $('tr.even').css('background-color', evenBGColour);
	},
	toggleFootnotes: function (event) {
		// Click event handler for the footnotes link
		optionsPanel.cancel();
		$('#footerrow').slideToggle();
		$('#linkFootnotes').html($('#linkFootnotes').html() === 'Hide foot notes' ? 'Show foot notes' : 'Hide foot notes');
		stopDefaultAction(event);
	}
};

$(document).ready(function () {
	loadPage.getclientArgs();   // Get any of the following arguments passed in the query string: nl, fs, scroll, stw, sss, switches, nr
	addBespokeParameters();
	// Add event handlers
	//    $(document).bind("contextmenu", function () { return false; });   // Suppress the standard right-click context menu
	$(window).resize(function () { formatPage.setPageWidth(); });
	$('#linkFootnotes').click(function (event) { formatPage.toggleFootnotes(event); });
	$('#linkOptions').click(function (event) { optionsPanel.launch(); stopDefaultAction(event); });
	$('#btnOptionsCancel').click(function () { optionsPanel.cancel(); });
	$('#btnOptionsGo').click(function () { optionsPanel.go(); });
	$('#menuCellDSKey ul, #menuCellDSKey h2 img, #menuCellClassKey ul, #menuCellClassKey h2 img, #menuCellSeriesKey ul, #menuCellSeriesKey h2 img, #menuCellRaceKey ul, #menuCellRaceKey h2 img').css('visibility', 'visible');
	if (clientArgs.nl < 4) { $('#menuCellDSKey ul, #menuCellDSKey h2 img').css('visibility', 'hidden'); }
	if (clientArgs.nl > 2) { $("#menuCellClassKey").click(function (e) { mainMenus.GetSeriesMenu(e); }); } else { $('#menuCellClassKey ul, #menuCellClassKey h2 img').css('visibility', 'hidden'); }
	if (clientArgs.nl > 1) { $("#menuCellSeriesKey").click(function (e) { mainMenus.GetRaceMenu(e); }); } else { $('#menuCellSeriesKey ul, #menuCellSeriesKey h2 img').css('visibility', 'hidden'); }
	if (clientArgs.nl > 0) { $('#menuCellRaceKey').click(function (e) { mainMenus.GetResults(e); }); } else { $('#menuCellRaceKey ul, #menuCellRaceKey h2 img').css('visibility', 'hidden'); }
	if (clientArgs.nl < 0) { $('.controls').css('visibility', 'hidden'); }  // Hide all the menus.
	if (clientArgs.no) { $('#linkOptions').hide(); }
	// Do those page format methods that can be done before AJAX loads the results table
	formatPage.setFontSize();
	formatPage.setPageWidth();
	formatPage.setBanner();
	// Load the first set of results
	if (serverArgs.raceKey === 0) { ajaxResults.AjaxSeriesResults(); } else { ajaxResults.AjaxRaceResults(); }
	debug.log("Document ready completed.");
});

