function sContest(Name, Name2, Class, Scored)
{
	this.Name        = Name;
	this.Name2       = Name2;
	this.Class       = Class;
	this.Scored      = Scored;
}

var vContest = new Array()
var vContestNum = 0

function Contest(Name, Name2, Class, Scored)
{
	vContest[vContestNum++] = new sContest(Name, Name2, Class, Scored);
}

function findContest(Name)
{
	for (var i = 0; i < vContest.length; i++)
	{
		if (vContest[i].Name == Name) {
			return i;
		}
	}
	return 0;
}

function sContestType(Type, Class)
{
	this.Type  = Type;
	this.Class = Class;
}

var vContestType = new Array()
var vContestTypeNum = 0

function ContestType(Type, Class)
{
	vContestType[vContestTypeNum++] = new sContestType(Type, Class);
}

function findContestType(Type)
{
	for (var i = 0; i < vContestType.length; i++)
	{
		if (vContestType[i].Type == Type) {
			return i;
		}
	}
	return 0;
}

function sPilotClass(Class)
{
	this.Class = Class;
}

var vPilotClass = new Array()
var vPilotClassNum = 0

function PilotClass(Class)
{
	vPilotClass[vPilotClassNum++] = new sPilotClass(Class);
}

function findPilotClass(Class)
{
	for (var i = 0; i < vPilotClass.length; i++)
	{
		if (vPilotClass[i].Class == Class) {
			return i;
		}
	}
	return 0;
}

function ClassScore()
{
	this.Total = 0;
	this.NoTotal = 0;
	this.hasScore = false;
	this.Score = new Array();
	for (var i = 0; i < vContestNum; i++) {
		this.Score[i] = 0;
	}
}

function TypeScore()
{
	this.ClassScore = new Array();
	for (var i = 0; i < vPilotClassNum; i++) {
		this.ClassScore[i] = new ClassScore();
	}
}
function sPilot(Name)
{
	this.Name = Name;
	this.TypeScore = new Array();
	for (var i = 0; i < vContestTypeNum; i++) {
		this.TypeScore[i] = new TypeScore();
	}
}

var vPilot = new Array()
var vPilotNum = 0

function newPilot(Name)
{
	vPilot[vPilotNum++] = new sPilot(Name);
}

function findPilot(Name)
{
	for (var i = 0; i < vPilot.length; i++)
	{
		if (vPilot[i].Name == Name) {
			return i;
		}
	}

	newPilot(Name);
	return i;
}

var vSetContest
var vSetContestType
var vSetPilotClass

function setContest(ContestName)
{
	vSetContest = ContestName;
}

function setContestType(ContestType)
{
	vSetContestType = ContestType;
}

function setPilotClass(PilotClass)
{
	vSetPilotClass = PilotClass;
}

function Score(PilotName, PilotScore)
{
	var contest = findContest(vSetContest);
	var cType   = findContestType(vSetContestType);
	var pClass  = findPilotClass(vSetPilotClass);
	var pilot   = findPilot(PilotName);

	vPilot[pilot].TypeScore[cType].ClassScore[pClass].Score[contest] = PilotScore;
}

function sOotContest(PilotName, OotDate, OotName, OotLocation, OotType, OotScore)
{
	this.PilotName   = PilotName;
	this.OotDate     = OotDate;
	this.OotName     = OotName;
	this.OotLocation = OotLocation;
	this.OotType     = OotType;
	this.OotScore    = OotScore;
}

var vOotContest = new Array()
var vOotContestNum = 0

function OotScore(PilotName, OotDate, OotName, OotLocation, OotScore)
{
	Score(PilotName, OotScore);
	vOotContest[vOotContestNum++] = new sOotContest(PilotName, OotDate, OotName, OotLocation, vSetContestType, OotScore);
}

function calcTotals()
{
	for (var cType = 0; cType < vContestTypeNum; cType++) {
		for (var pClass = 0; pClass < vPilotClassNum; pClass++) {
			for (var pilot = 0; pilot < vPilotNum; pilot++) {
				var sortScore = new Array();
				var noScore = 0;
				for (var contest = 0; contest < vContestNum; contest++) {
					if (vPilot[pilot].TypeScore[cType].ClassScore[pClass].Score[contest] > 0) {
						vPilot[pilot].TypeScore[cType].ClassScore[pClass].hasScore = true;
					}
					if (vContest[contest].Scored == true) {
						sortScore[contest] = vPilot[pilot].TypeScore[cType].ClassScore[pClass].Score[contest];
					} else {
						noScore += vPilot[pilot].TypeScore[cType].ClassScore[pClass].Score[contest];
						sortScore[contest] = 0;
					}
				}
				sortScore.sort(function(a,b){return b - a});
				for (var score = 0; score < 5; score++) {
					vPilot[pilot].TypeScore[cType].ClassScore[pClass].Total += sortScore[score];
				}
				vPilot[pilot].TypeScore[cType].ClassScore[pClass].NoTotal = noScore;
			}
		}
	}
}

function sPilotScore(Pilot, Score, NoScore)
{
	this.Pilot   = Pilot;
	this.Score   = Score;
	this.NoScore = NoScore;
}

function sClassPilot()
{
	this.PilotScoreNum = 0;
	this.PilotScore    = new Array();
}

function sTypePilot()
{
	this.ClassPilot = new Array();
	for (var i = 0; i < vPilotClassNum; i++) {
		this.ClassPilot[i] = new sClassPilot();
	}
}

function sPilotOrder()
{
	this.TypePilot = new Array();
	for (var i = 0; i < vContestTypeNum; i++) {
		this.TypePilot[i] = new sTypePilot();
	}
}

var vPilotOrder

function pilotSort(a, b)
{
	if (b.Score != a.Score) {
		return b.Score - a.Score;
	}

	if (b.Score == 0 && b.NoScore != a.NoScore) {
		return b.NoScore - a.NoScore;
	}

	var aName = vPilot[a.Pilot].Name;
	var bName = vPilot[b.Pilot].Name;
	var aSortName;
	var bSortName;
	if (aName.lastIndexOf(" ") > 0) {
		aSortName = aName.substring(aName.lastIndexOf(" "), aName.length-1);
	} else {
		aSortName = aName;
	}
	if (bName.lastIndexOf(" ") > 0) {
		bSortName = bName.substring(bName.lastIndexOf(" "), bName.length-1);
	} else {
		bSortName = bName;
	}

	if (aSortName < bSortName) {
		return -1;
	} else if (aSortName > bSortName) {
		return 1;
	} else if (aName < bName) {
		return -1;
	} else if (aName > bName) {
		return 1;
	} else {
		return 0;
	}
}
function sortPilots()
{
	vPilotOrder = new sPilotOrder();
	for (var cType = 0; cType < vContestTypeNum; cType++) {
		for (var pClass = 0; pClass < vPilotClassNum; pClass++) {
			for (var pilot = 0; pilot < vPilotNum; pilot++) {
				if (vPilot[pilot].TypeScore[cType].ClassScore[pClass].hasScore) {
					vPilotOrder.TypePilot[cType].ClassPilot[pClass].PilotScore[vPilotOrder.TypePilot[cType].ClassPilot[pClass].PilotScoreNum++] = new sPilotScore(pilot, vPilot[pilot].TypeScore[cType].ClassScore[pClass].Total, vPilot[pilot].TypeScore[cType].ClassScore[pClass].NoTotal);
				}
			}
			if (vPilotOrder.TypePilot[cType].ClassPilot[pClass].PilotScoreNum > 1) {
				vPilotOrder.TypePilot[cType].ClassPilot[pClass].PilotScore.sort(pilotSort);
			}
		}
	}	
}

function printStandings()
{
	var numScore = 0;
	calcTotals();
	sortPilots();
	for (var cType = 0; cType < vContestTypeNum; cType++) {
		document.write("<h2>" + vContestType[cType].Type + "</h2>");
		document.write("<div style=\"margin-left:20px\">");
		document.write("<table class=\"ppss\">");
		document.write("<colgroup>");
		document.write("<col width=\"130\"></col>");      // pilot name
		for (var c = 0; c < vContestNum; c++) {
			if (vContestType[cType].Class == vContest[c].Class) {
				document.write("<col width=\"40\"></col>");   // pilot contest score
			}
		}
		document.write("<col width=\"50\"></col>");      // pilot total score
		document.write("</colgroup>");
		document.write("<thead><tr>");
		document.write("<th></th>");                      // pilot name
		numScore = 0;
		for (var c = 0; c < vContestNum; c++) {
			if (vContestType[cType].Class == vContest[c].Class) {
				numScore++;
				if (vContest[c].Scored) {
					document.write("<th>");
				} else {
					document.write("<th style=\"color: blue\">");
				}
				document.write(vContest[c].Name + "<br>" + vContest[c].Name2 + "</th>");
			}
		}
		if (numScore > 1) {
			document.write("<th><br>Total</th>");             // pilot total score
		}
		document.write("</tr></thead>");
		document.write("<tbody>");

		for (var pClass = 0; pClass < vPilotClassNum; pClass++) {
			var pilots = vPilotOrder.TypePilot[cType].ClassPilot[pClass].PilotScoreNum;
			if (pilots > 0) {
				if (vPilotClassNum > 1) {
					document.write("<tr>");
					document.write("<td colspan=" + vContestNum+2 + "><h3>" + vPilotClass[pClass].Class + "</h3></td>");
					document.write("</tr>");
				}
				for (var p = 0; p < pilots; p++) {
					var pilot = vPilotOrder.TypePilot[cType].ClassPilot[pClass].PilotScore[p].Pilot;
//					if (vPilot[pilot].TypeScore[cType].ClassScore[pClass].Total > 0) {
						document.write("<tr>");
						document.write("<td>" + vPilot[pilot].Name + "</td>");
						for (var c = 0; c < vContestNum; c++) {
							if (vContestType[cType].Class == vContest[c].Class) {
								if (vContest[c].Scored) {
									document.write("<td align=\"right\">")
								} else {
									document.write("<td align=\"right\" style=\"color: blue\">")
								}
								if (vPilot[pilot].TypeScore[cType].ClassScore[pClass].Score[c] > 0)	
								document.write(vPilot[pilot].TypeScore[cType].ClassScore[pClass].Score[c])
								document.write("</td>");
							}
						}
						if (numScore > 1) {
							document.write("<td align=\"right\">" + vPilot[pilot].TypeScore[cType].ClassScore[pClass].Total + "</td>");
						}
						document.write("</tr>");
//					}
				}
			}
		}
		document.write("</tbody>");
		document.write("</table>");
		document.write("</div>");
	}
}

function printOotScoreSummary()
{
	document.write("<h2>Out-of-Town Contest Score Summary</h2>");
	document.write("<div style=\"margin-left:20px\">");
	document.write("<table class=\"ppss\">");
	document.write("<colgroup>");
	document.write("<col width=\"130\"></col><col width=\"130\"></col><col width=\"160\"></col><col width=\"110\"></col><col width=\"150\"></col><col width=\"50\"></col>");
	document.write("</colgroup>");
	document.write("<thead><tr>");
	document.write("<th>Name</th><th>Date</th><th>Contest</th><th>Location</th><th>Class</th><th>Score</th>");
	document.write("</tr></thead>");
	document.write("<tbody>");
	for (var oot = 0; oot < vOotContestNum; oot++) {
		document.write("<tr>");
		document.write("<td>" + vOotContest[oot].PilotName + "</td>");
		document.write("<td>" + vOotContest[oot].OotDate + "</td>");
		document.write("<td>" + vOotContest[oot].OotName + "</td>");
		document.write("<td>" + vOotContest[oot].OotLocation + "</td>");
		document.write("<td>" + vOotContest[oot].OotType + "</td>");
		document.write("<td align=\"right\">" + vOotContest[oot].OotScore + "</td>");
		document.write("</tr>");
	}
	document.write("</tbody>");
	document.write("</table>");
	document.write("</div>");
}

