// imports MeetResults.js;

var MeetResultsGUI = {};

MeetResultsGUI._iTable = -1;
MeetResultsGUI._aroResults = [];
MeetResultsGUI._arfnScoreSheetClicked = [];

MeetResultsGUI.AddScoreSheetClicked = function(fn) {
	if (typeof(fn) == 'function') {
		MeetResultsGUI._arfnScoreSheetClicked.push(fn);
	}
};

MeetResultsGUI.RemoveScoreSheetClicked = function(fn) {
	for (var ixfn = 0; ixfn < MeetResultsGUI._arfnScoreSheetClicked.length; ixfn++) {
		if (MeetResultsGUI._arfnScoreSheetClicked[ixfn] === fn) {
			MeetResultsGUI._arfnScoreSheetClicked.splice(ixfn, 1);
			break;
		}
	}
};

MeetResultsGUI._onScoreSheetClicked = function(iTable, sTeamNumber) {
	for (var ixfn = 0; ixfn < MeetResultsGUI._arfnScoreSheetClicked.length; ixfn++) {
		MeetResultsGUI._arfnScoreSheetClicked[ixfn](sTeamNumber, MeetResultsGUI._aroResults[iTable]);
	}
};

MeetResultsGUI.htmlFromResults = function(sDate, oResults) {
	var iTable = MeetResultsGUI._iTable+1;
	MeetResultsGUI._iTable = iTable;
	MeetResultsGUI._aroResults.push(oResults);
	
	var iMaxRounds = 0;
	var bAlternate = false;
	for (var ixRounds = 0; ixRounds < oResults.aroClassRounds.length; ixRounds++) {
		if (oResults.aroClassRounds[ixRounds].arsRounds.length > iMaxRounds) {
			iMaxRounds = oResults.aroClassRounds[ixRounds].arsRounds.length;
		}
	}
	
	var sCurrentClass = null;
	var ret = [];
	ret.push('<table class="MeetResultsTable">');
	
	ret.push(MeetResultsGUI._generateHeader(sDate, iMaxRounds));
	
	for (var ixTeamResult = 0; ixTeamResult < oResults.aroTeamResults.length; ixTeamResult++) {
		if (sCurrentClass === null || sCurrentClass != oResults.aroTeamResults[ixTeamResult].sClass) {
			sCurrentClass = oResults.aroTeamResults[ixTeamResult].sClass;
			ret.push(MeetResultsGUI._generateClassHeader(sCurrentClass, oResults.aroClassRounds, iMaxRounds));
			bAlternate = false;
		}
		
		ret.push(MeetResultsGUI._generateMeetRound(oResults.aroTeamResults[ixTeamResult], iMaxRounds, bAlternate, iTable));
		bAlternate = !bAlternate;
	}
	
	ret.push('</table>');
	
	return ret.join('');
};

MeetResultsGUI.htmlScoreSheetFromTeam = function(sTeamNumber, oResults) {
	var ret = [];
	var oTeamResult = null;
	for (var ixTeamResult = 0; ixTeamResult < oResults.aroTeamResults.length; ixTeamResult++) {
		if (oResults.aroTeamResults[ixTeamResult].sTeamNumber == sTeamNumber) {
			oTeamResult = oResults.aroTeamResults[ixTeamResult];
			break;
		}
	}
	if (oTeamResult === null) { return ''; }
	
	ret.push('<div class="ScoreSheetTable">');
	
	ret.push(MeetResultsGUI._generateTeamInformation(oTeamResult));
	
	for (var ixTeamRound = 0; ixTeamRound < oTeamResult.aroTeamRounds.length; ixTeamRound++) {
		ret.push(MeetResultsGUI._generateScoreSheetForRound(oTeamResult.aroTeamRounds[ixTeamRound], ixTeamRound+1));
	}
	
	ret.push('</div>');
	
	return ret.join('');
};

MeetResultsGUI._generateScoreSheetForRound = function(oTeamRound, iRoundNumber) {
	var ret = [];
	ret.push('<div class="ScoreSheetRound">');
	ret.push('<span class="Title">');
	ret.push('Scoring Summary - Round ');
	ret.push(iRoundNumber + '');
	ret.push('</span>');
	
	var ixPoint;
	
	ret.push('<div class="PointHeading">');
	for (ixPoint = 0; ixPoint < oTeamRound.aroPoints.length; ixPoint++) {
		ret.push('<span class="PointHeading_Point">');
		ret.push(ixPoint+1+'');
		ret.push('</span>');
	}
	ret.push('<span class="PointHeading_Total">Total</span>');
	ret.push('</div>');
	
	ret.push('<div class="PointValue">');
	for (ixPoint = 0; ixPoint < oTeamRound.aroPoints.length; ixPoint++) {
		ret.push('<span class="PointValue_Value">');
		ret.push(oTeamRound.aroPoints[ixPoint].sIndicator);
		ret.push('</span>');
	}
	ret.push('<span class="PointValue_Total">');
	ret.push(oTeamRound.iGetTotalPoints()+'');
	ret.push('</span>');
	ret.push('</div>');
	ret.push('</div>');
	
	return ret.join('');
};

MeetResultsGUI._generateTeamInformation = function(oTeamResult) {
	var ret = [];
	ret.push('<div class="TeamInformation">');
	ret.push(' <span class="TeamName">');
	ret.push(oTeamResult.sName);
	ret.push('</span>');
	ret.push(' <span class="TeamNumber">');
	ret.push(oTeamResult.sTeamNumber);
	ret.push('</span>');
	ret.push(' <span class="TeamMembers">Team Members</span>');
	for (var ixTeamMember = 0; ixTeamMember < oTeamResult.arsTeamMembers.length; ixTeamMember++) {
		ret.push(' <span class="TeamMember">');
		ret.push(oTeamResult.arsTeamMembers[ixTeamMember]);
		ret.push('</span>');
	}
	ret.push('</span>');
	ret.push('</div>');
	
	return ret.join('');
};

MeetResultsGUI._generateScoreSheetLink = function(iTable, sTeamNumber, sContents) {
	var ret = [];
	ret.push('<a class="ScoreSheetLink" href="javascript:MeetResultsGUI._onScoreSheetClicked(');
	ret.push(iTable+'');
	ret.push(',\'');
	ret.push(sTeamNumber);
	ret.push('\');">');
	ret.push(sContents);
	ret.push('</a>');
	return ret.join('');
};

MeetResultsGUI._generateMeetRound = function(oTeamResult, iMaxRounds, bAlternate, iTable) {
	var ret = [];
	ret.push('<tr class="');
	if (bAlternate) {
		ret.push('MeetResultsRound Alternate');
	}
	else {
		ret.push('MeetResultsRound Primary');
	}
	ret.push('">');
	
	ret.push('<td class="Rank">');
	ret.push(oTeamResult.iGetRank() + '');
	ret.push('</td>');
	
	var sName = oTeamResult.sName + ' (' + oTeamResult.sTeamNumber + ')';
	ret.push('<td class="Name">');
	ret.push(MeetResultsGUI._generateScoreSheetLink(iTable, oTeamResult.sTeamNumber, sName));
	ret.push('</td>');
	
	var iBusts;
	for (var ixRound = 0; ixRound < iMaxRounds; ixRound++) {
		ret.push('<td class="RoundScore">');
		
		if (ixRound < oTeamResult.aroTeamRounds.length) {
			ret.push(MeetResultsGUI._getScoreWithBusts(oTeamResult.aroTeamRounds[ixRound].iGetTotalPoints(), oTeamResult.aroTeamRounds[ixRound].iGetTotalBusts()));
		}
		else {
			ret.push('-');
		}
		
		ret.push('</td>');
	}
	
	// total
	ret.push('<td class="Total">');
	
	var sTotal = MeetResultsGUI._getScoreWithBusts(oTeamResult.iGetTotalPoints(), oTeamResult.iGetTotalBusts());
	ret.push(MeetResultsGUI._generateScoreSheetLink(iTable, oTeamResult.sTeamNumber, sTotal));
	
	ret.push('</td>');
	
	ret.push('<td class="Average">');
	ret.push(oTeamResult.dblGetAverage() + '');
	ret.push('</td>');
	
	ret.push('</tr>');
	
	return ret.join('');
};

MeetResultsGUI._getScoreWithBusts = function(iScore, iBusts) {
	var ret = [];
	ret.push(iScore + '');
	if (iBusts > 0) {
		ret.push('<span class="Busts">(-');
		ret.push(iBusts + '');
		ret.push(')</span>');
	}
	return ret.join('');
};

MeetResultsGUI._generateClassHeader = function(sClass, aroClassRounds, iMaxRounds) {
	var oClassRound = null;
	for (var ixRound = 0; ixRound < aroClassRounds.length; ixRound++) {
		if (aroClassRounds[ixRound].sClass == sClass) {
			oClassRound = aroClassRounds[ixRound];
			break;
		}
	}
	
	if (oClassRound === null) { return ''; }
	
	var ret = [];
	ret.push('<tr class="MeetResultsRoundHeader">');
	ret.push('<td class="Rank">Rank</td>');
	ret.push('<td class="Class">');
	ret.push(sClass);
	ret.push('</td>');
	
	for (var ix = 0; ix < iMaxRounds; ix++) {
		ret.push('<td class="RoundDraw">');
		if (ix < oClassRound.arsRounds.length) {
			ret.push(oClassRound.arsRounds[ix]);
		}
		else {
			ret.push('&nbsp;');
		}
		ret.push('</td>');
	}
	
	ret.push('<td class="Total">Total</td>');
	ret.push('<td class="Average">Avg</td>');
	ret.push('</tr>');
	
	return ret.join('');
};

MeetResultsGUI._generateHeader = function(sDate, iMaxRounds) {
	var ret = [];
	ret.push('<tr class="MeetResultsHeader">');
	ret.push('<th colspan="2" class="Date">');
	ret.push(sDate);
	ret.push('</th>');
	
	for (var ixRound = 1; ixRound <= iMaxRounds; ixRound++) {
		ret.push('<th class="MeetRoundHeader">');
		ret.push('Round ');
		ret.push(ixRound + '');
		ret.push('</th>');
	}
	
	ret.push('<th class="Total">Total</th><th class="Average">Avg</th></tr>');
	
	return ret.join('');
};