// JavaScript Document
// fixture generator

var iNumberOfTeams = 0;
var arrayHomeTeam;
var arrayAwayTeam;
var iAlternate = 0;
var HOME;
var AWAY;
var arrayFixtures;
var iSeriesIncrement = 1;
var iRoundOfSeries;
var arrayTeams;
var bNoMatch = false;
var iMinimumNumberOfTeams = 3;
var iScreen = 0;



// ************* FIXTURE CORE CODE *****************************************************

function createFixtures()
{
	HOME = 0;
	AWAY = 1;

	var table = document.getElementById("tblFixtures");

	if (iScreen == 0)
	{

		if ((iNumberOfTeams % 2) != 0)
		{
			iNumberOfTeams = iNumberOfTeams + 1;
			bNoMatch = true;
		}

		toggleScreens();

		buildArray();
		buildInitialPattern();
		RotateTeams();
	}

	assignTeamsToArray();

	//Create inital half of fixture list, then reverse home and away teams for second half

	for (iRoundOfSeries=0; iRoundOfSeries<2; iRoundOfSeries++)
	{
		createTable();
		HOME = 1;
		AWAY = 0;
	}
}

function buildArray()
{

	arrayHomeTeam = new Array((iNumberOfTeams/2));
	arrayAwayTeam = new Array((iNumberOfTeams/2));

	//Build 3-dimensional array to hold [series][Home\Away][Teams]

	arrayFixtures = new Array(iNumberOfTeams-1);

	for (i=0; i<(iNumberOfTeams); i++)
	{
		arrayFixtures[i] = new Array(1);
		for (j=0; j<2; j++)
		{
			arrayFixtures[i][j] = new Array(((iNumberOfTeams/2)-1));
		}
	}
}


function buildInitialPattern()
{
	//Complete the first series with initial team pattern

	for (i=0; i<(iNumberOfTeams/2); i++)
	{
		arrayHomeTeam[i] = i;
		arrayAwayTeam[i] = ((iNumberOfTeams-1)-i);

		arrayFixtures[0][HOME][i] = i;
		arrayFixtures[0][AWAY][i] = ((iNumberOfTeams-1)-i);
	}
}


function RotateTeams()
{
	//Complete the remaining fixtures by incrementing the initial pattern
	//When a teamID reaches (iNumberOfTeams-2) knock it down to zero

	var iTempHome;
	var iTempAway;
	var iLastElementInAwayArray;
	var iFirstElementInHomeArray;

	var iKnockDown = (arrayAwayTeam[0] - 1);

	for (j=1; j<(iNumberOfTeams); j++)
	{
		for (i=0; i<(iNumberOfTeams-1); i++)
		{
			if (i!=0)
			{
				if(arrayAwayTeam[i] == iKnockDown)
					arrayAwayTeam[i] = 0;
				else
					arrayAwayTeam[i] = arrayAwayTeam[i] + 1;
			}

			if(arrayHomeTeam[i] == iKnockDown)
				arrayHomeTeam[i] = 0;
			else
				arrayHomeTeam[i] = arrayHomeTeam[i] + 1;

			arrayFixtures[j][HOME][i] = arrayHomeTeam[i];
			arrayFixtures[j][AWAY][i] = arrayAwayTeam[i];
		}
	}
}


function createTable()
{
	//Use 3 dimensional array contents to build a fixture table

	var table = document.getElementById("tblFixtures");

	//Print out first series
	createSeperatorRow(table,0);
	for (h=0; h<(iNumberOfTeams/2); h++)
	{
		createFixtureRow(table,0,h);
	}

	//Interleave remaining series except last two of each section
	var iInterleave = (iNumberOfTeams/2);

	for (i=1; i<((iNumberOfTeams/2)-1); i++)
	{
		createSeperatorRow(table,iInterleave);

		for (k=0; k<(iNumberOfTeams/2); k++)
		{
			createFixtureRow(table,iInterleave,k);
		}
		iInterleave++;

		createSeperatorRow(table,i);

		for (j=0; j<(iNumberOfTeams/2); j++)
		{
			createFixtureRow(table,i,j);
		}
	}

	//Print out last series of section one
	createSeperatorRow(table,((iNumberOfTeams/2)-1));
	for (l=0; l<(iNumberOfTeams/2); l++)
	{
		createFixtureRow(table,((iNumberOfTeams/2)-1),l);
	}

	//Print out last series of section two
	createSeperatorRow(table,(iNumberOfTeams-1));
	for (m=0; m<(iNumberOfTeams/2); m++)
	{
		createFixtureRow(table,(iNumberOfTeams-2),m);
	}
}


function createSeperatorRow(table,i)
{
	//Print out series number at the top of each series

	var rowSep;
	var cell0;

	rowSep = table.insertRow(table.rows.length);
	cell0 = rowSep.insertCell(0);
	cell0.colSpan=3;
	cell0.bgColor = 'ff9900';
	cell0.innerHTML = "Series " + iSeriesIncrement;
	iSeriesIncrement++;
}

function createFixtureRow(table,iSeries,iFixture)
{
	//Create fixture in series

	var row;
	var cell0;
	var cell1;
	var cell2;

	row = table.insertRow(table.rows.length);
	cell0 = row.insertCell(0);
	cell1 = row.insertCell(1);
	cell2 = row.insertCell(2);

	cell0.width = '40%';
	cell0.align = 'right';
	cell1.width = '20%';
	cell1.align = 'center';
	cell2.width = '40%';
	cell2.align = 'left';

	if ((iAlternate == 0) && (iFixture == 0))
	{
		if (iRoundOfSeries == 0)
		{
			cell0.innerHTML = arrayTeams[arrayFixtures[iSeries][AWAY][iFixture]];
			cell1.innerHTML = ' v ';
			cell2.innerHTML = arrayTeams[arrayFixtures[iSeries][HOME][iFixture]];
		}
		else
		{
			cell0.innerHTML = arrayTeams[arrayFixtures[iSeries][HOME][iFixture]];
			cell1.innerHTML = ' v ';
			cell2.innerHTML = arrayTeams[arrayFixtures[iSeries][AWAY][iFixture]];
		}
		iAlternate++;
		return;
	}
	if ((iAlternate == 1) && (iFixture == 0))
	{
		if (iRoundOfSeries == 0)
		{
			cell0.innerHTML = arrayTeams[arrayFixtures[iSeries][HOME][iFixture]];
			cell1.innerHTML = ' v ';
			cell2.innerHTML = arrayTeams[arrayFixtures[iSeries][AWAY][iFixture]];
		}
		else
		{
			cell0.innerHTML = arrayTeams[arrayFixtures[iSeries][AWAY][iFixture]];
			cell1.innerHTML = ' v ';
			cell2.innerHTML = arrayTeams[arrayFixtures[iSeries][HOME][iFixture]];
		}
		iAlternate--;
		return;
	}

	cell0.innerHTML = arrayTeams[arrayFixtures[iSeries][HOME][iFixture]];
	cell1.innerHTML = ' v ';
	cell2.innerHTML = arrayTeams[arrayFixtures[iSeries][AWAY][iFixture]];
}

function assignTeamsToArray()
{
	arrayTeams = new Array((iNumberOfTeams-1));
	var iTeam;
	var sTeamName;
	var table = document.getElementById('tblTeam');
	var iOffset = 0;

	if (bNoMatch)
	{
		iOffset = 1;
		arrayTeams[iNumberOfTeams-1] = "No match";
	}


	for(i=0; i<(iNumberOfTeams-iOffset); i++)
	{
		iTeam = generateRandomNumber((table.rows.length-1));
		sTeamName = table.rows(iTeam).cells(0).innerHTML;
		arrayTeams[i] = sTeamName;
		table.deleteRow(iTeam);
	}


	var table2 = document.getElementById('tblRandomTeamTable');
	var row;
	var cell;

	for(j=0; j<iNumberOfTeams; j++)
	{
		row = table.insertRow(table2.rows.length);
		cell = row.insertCell(0);
		cell.innerHTML = arrayTeams[j];
	}


}


function generateRandomNumber(iMaxSeeding)
{
	var iRandomNumber = Math.round((Math.random() * iMaxSeeding));
	return iRandomNumber;
}



// ************ GUI CODE ***********************************************************************

function pageLoad()
{
	objForm = document.forms.formGenerator;
	objForm.txtTeamName.focus();

	document.all.rowDisplayEditTeams.style.display = 'none';
	document.all.rowDisplayFixturesButton.style.display = 'none';

}

function addTeam()
{
	var table;
	var objTextBox = document.forms.formGenerator.txtTeamName;

	if (objTextBox.value == '')
	{
		resetPage();
		return false;
	}

	table = document.getElementById('tblTeam');

	if (table && table.insertRow)
	{
		var row = table.insertRow(table.rows.length);
		var cell = row.insertCell(0);
		cell.innerHTML = objTextBox.value;
		cell.id = 'team' + iNumberOfTeams;
		iNumberOfTeams++;

		var newOption = new Option(objTextBox.value, iNumberOfTeams);
		document.forms.formGenerator.selectEditTeam.options.add(newOption);

		formatTeamTable();

		resetPage();

	}
}


function deleteTeam()
{
	var objSelectEditTeam = document.forms.formGenerator.selectEditTeam;
	var iIndex = objSelectEditTeam.selectedIndex;

	iNumberOfTeams--;
	objSelectEditTeam.options.remove(iIndex);
	document.getElementById('tblTeam').deleteRow(iIndex);

	formatTeamTable();

	resetPage();
}


function formatTeamTable()
{
	var iTableLength = document.getElementById('tblTeam').rows.length;

	for (i=0; i<iTableLength; i++)
	{
		if ((i % 2) == 0)
			document.getElementById('tblTeam').rows(i).cells(0).bgColor = 'ff9900';
		else
			document.getElementById('tblTeam').rows(i).cells(0).bgColor = 'white';
	}
}


function resetPage()
{
	var objTextBox = document.forms.formGenerator.txtTeamName;
	objTextBox.value = '';
	objTextBox.focus();

	if (iNumberOfTeams == 0)
		document.all.rowDisplayEditTeams.style.display = 'none';
	else
		document.all.rowDisplayEditTeams.style.display = 'block';

	if (iNumberOfTeams >= iMinimumNumberOfTeams)
		document.all.rowDisplayFixturesButton.style.display = 'block';
	else
		document.all.rowDisplayFixturesButton.style.display = 'none';

	document.getElementById('spanNumberOfTeams').innerHTML = 'Number of teams in division is ' + iNumberOfTeams;
}

function toggleScreens()
{
	var iFixturesPerSeries = (iNumberOfTeams/2);
	var iNumberOfFixtures = (iNumberOfTeams * (iNumberOfTeams-1));

	document.getElementById('spanTitle').innerHTML = 'Division Fixtures';
	document.getElementById('tblAddTeam').style.display = 'none';
	document.getElementById('rowDisplayEditTeams').style.display = 'none';
	document.getElementById('spanNumberOfFixturesPerSeries').innerHTML = '<BR>Number of fixtures per series is ' + iFixturesPerSeries;
	document.getElementById('spanNumberOfFixtures').innerHTML = '<BR>Total number of fixtures is ' + iNumberOfFixtures;
	document.getElementById('spanNumberOfSeries').innerHTML = '<BR>Number of series (weeks) in division is ' + calculateNumberOfSeries(iNumberOfFixtures,iNumberOfTeams);
	iScreen = 1;
}

function calculateNumberOfSeries(iNumberOfFixtures,iNumberOfTeams)
{
	var iNumberOfSeries = ((iNumberOfFixtures / iNumberOfTeams) * 2);
	return iNumberOfSeries;
}


// *********************************************************************************************


