// Creates and returns an array full of the first 100 integers in Roman Numeral Form.
// Don't forget array is zero based.
function createRomanNumeralArray() {
	var mRNArray = new Array(100);
	mRNArray[0] = "I";
	mRNArray[1] = "II";
	mRNArray[2] = "III";
	mRNArray[3] = "IV";
	mRNArray[4] = "V";
	mRNArray[5] = "VI";
	mRNArray[6] = "VII";
	mRNArray[7] = "VIII";
	mRNArray[8] = "IX";
	mRNArray[9] = "X";
	mRNArray[10] = "XI";
	mRNArray[11] = "XII";
	mRNArray[12] = "XIII";
	mRNArray[13] = "XIV";
	mRNArray[14] = "XV";
	mRNArray[15] = "XVI";
	mRNArray[16] = "XVII";
	mRNArray[17] = "XVIII";
	mRNArray[18] = "XIX";
	mRNArray[19] = "XX";
	mRNArray[20] = "XXI";
	mRNArray[21] = "XXII";
	mRNArray[22] = "XXIII";
	mRNArray[23] = "XXIV";
	mRNArray[24] = "XXV";
	mRNArray[25] = "XXVI";
	mRNArray[26] = "XXVII";
	mRNArray[27] = "XXVIII";
	mRNArray[28] = "XXIX";
	mRNArray[29] = "XXX";
	mRNArray[30] = "XXXI";
	mRNArray[31] = "XXXII";
	mRNArray[32] = "XXXIII";
	mRNArray[33] = "XXXIV";
	mRNArray[34] = "XXXV";
	mRNArray[35] = "XXXVI";
	mRNArray[36] = "XXXVII";
	mRNArray[37] = "XXXVIII";
	mRNArray[38] = "XXXIX";
	mRNArray[39] = "XL";
	mRNArray[40] = "XLI";
	mRNArray[41] = "XLII";
	mRNArray[42] = "XLIII";
	mRNArray[43] = "XLIV";
	mRNArray[44] = "XLV";
	mRNArray[45] = "XLVI";
	mRNArray[46] = "XLVII";
	mRNArray[47] = "XLVIII";
	mRNArray[48] = "XLIX";
	mRNArray[49] = "L";
	mRNArray[50] = "LI";
	mRNArray[51] = "LII";
	mRNArray[52] = "LIII";
	mRNArray[53] = "LIV";
	mRNArray[54] = "LV";
	mRNArray[55] = "LVI";
	mRNArray[56] = "LVII";
	mRNArray[57] = "LVIII";
	mRNArray[58] = "LIX";
	mRNArray[59] = "LX";
	mRNArray[60] = "LXI";
	mRNArray[61] = "LXII";
	mRNArray[62] = "LXIII";
	mRNArray[63] = "LXIV";
	mRNArray[64] = "LXV";
	mRNArray[65] = "LXVI";
	mRNArray[66] = "LXVII";
	mRNArray[67] = "LXVIII";
	mRNArray[68] = "LXIX";
	mRNArray[69] = "LXX";
	mRNArray[70] = "LXXI";
	mRNArray[71] = "LXXII";
	mRNArray[72] = "LXXIII";
	mRNArray[73] = "LXXIV";
	mRNArray[74] = "LXXV";
	mRNArray[75] = "LXXVI";
	mRNArray[76] = "LXXVII";
	mRNArray[77] = "LXXVIII";
	mRNArray[78] = "LXXIX";
	mRNArray[79] = "LXXX";
	mRNArray[80] = "LXXXI";
	mRNArray[81] = "LXXXII";
	mRNArray[82] = "LXXXIII";
	mRNArray[83] = "LXXXIV";
	mRNArray[84] = "LXXXV";
	mRNArray[85] = "LXXXVI";
	mRNArray[86] = "LXXXVII";
	mRNArray[87] = "LXXXVIII";
	mRNArray[88] = "LXXXIX";
	mRNArray[89] = "XC";
	mRNArray[90] = "XCI";
	mRNArray[91] = "XCII";
	mRNArray[92] = "XCIII";
	mRNArray[93] = "XCIV";
	mRNArray[94] = "XCV";
	mRNArray[95] = "XCVI";
	mRNArray[96] = "XCVII";
	mRNArray[97] = "XCVIII";
	mRNArray[98] = "XCIX";
	mRNArray[99] = "C";
	return mRNArray;
} // End of function_name


var RomanNumeralArray;
var baseRomanNumeralArray;
var currentScore;
var gameInProgress;
var colClaimed;
var rowClaimed;
var houseClaimed;

var count=11;
var counterlayer;
var Id;
var stopCount = false;

var pickedNumbers;

var completedRows;
var currentRows;
var spareCells = 5;

function countdown()
	{
		if (gameInProgress)
		{
			count--; 
			if (count==0) {
				//This function also seems to work fine for no time left
				pickNextNumberTimeRemaining();
				return true;
			}
			if (count>-1) {
				changelayer_content(count);
			}
			if (count>0)
			{
				Id = window.setTimeout("countdown()",1000); 
			}
		}
	}	

	function changelayer_content(counter)
	{
		if (counter < 10) 
		{ 
			msgstring = "Time:  " + counter;
		}
		else
		{
			msgstring = "Time: " + counter;
		}
		
		if(document.layers)
		{
			//thisbrowser="NN4";
			counterlayer = document.layers[0];
			counterlayer.document.open();
			counterlayer.document.write(msgstring);
			counterlayer.document.close();
		}
		if(document.all)
		{
			//thisbrowser="ie"
			counterlayer = document.all["remainingtime"];
			counterlayer.innerHTML= msgstring;
		}
		if(!document.all && document.getElementById)
		{
			//thisbrowser="NN6";
			counterlayer = document.getElementById("remainingtime");
			counterlayer.innerHTML = msgstring;
		}
	}

function setupGame() 
{
	RomanNumeralArray = createRomanNumeralArray();
	baseRomanNumeralArray = createRomanNumeralArray();
	currentScore = 0;
	colClaimed = false;
	rowClaimed = false;
	houseClaimed = false;
	displayScore(currentScore);
	pickedNumbers = 0;
	currentRow = '';
	completedRows = '';
	spareCells = 5;
	document.getElementById('remainingtime').innerHTML = 'Time: 00';
	document.getElementById('currentnumber').innerHTML = '';
	document.getElementById('shareresults').innerHTML = '';
	document.getElementById('row').innerHTML = 'Row';
	document.getElementById('column').innerHTML = 'Column';
	document.getElementById('house').innerHTML = 'House';
	document.getElementById('newgame').innerHTML = 'Start new game';
	document.getElementById('marknumber').innerHTML = 'Pick next number';
	document.getElementById('callednumbers').innerHTML = '';
	

	document.getElementById('board').innerHTML = generateBoard(0);	
}

function generateBoard(numberType) {
	if (numberType == 1)
	{
		var romanNumeralBoardArray = createRomanNumeralArray();
	}
	var boardSquareHTML = '';
	var usedNumberArray = getArrayOfNumbers(20,100);
	var squareID = 1;
	var boardHTML = '<table class="automargin border">';
	var missingSpaces;
	var missing1 = 0;
	var missing2 = 0;
	var numberOutput;
	
	for (var i=1; i <= 4; i++)
	{
		boardHTML += '<tr>';
		missingSpaces = 0;
		missing1 = 0;
		missing2 = 0;
		for (var n=1; n <= 5; n++)
		{
			if (Math.random() < 0.3 && missingSpaces < 2 && gameInProgress)
			{
				if (missingSpaces == 0)
				{
					missing1 = Math.floor(Math.random() * 5) + 1;
					missingSpaces = 1;
				}
				else
				{
					missing2 = Math.floor(Math.random() * 5) + 1;
					missingSpaces = 2;
				}
			}
		}

		for (var z=1; z <= 5; z++)
		{
			boardSquareHTML = '';
			//We remove some numbers from the list, to make it look more like a bingo board
			//This algorithm is biased, and removes earlier numbers in the row more often.
			if ((z == missing1 || z == missing2) || !gameInProgress)
			{
				boardSquareHTML = "<div class='boardsquare border textcenter' id='" + squareID + "' row='"+ i +"' col='"+ z +"' ingame='0' value='0' selected='0' onclick='markSquare(" + squareID + ")'></div>";
			}
			else
			{
				if (numberType == 1)
				{
					numberOutput = romanNumeralBoardArray[usedNumberArray[squareID - 1] - 1];
				}
				else
				{
					numberOutput = usedNumberArray[squareID - 1];
				}
					boardSquareHTML = "<div class='boardsquare border textcenter' id='" + squareID + "' row='"+ i +"' col='"+ z +"' ingame='1' value='"+ numberOutput +"' selected='0' onclick='markSquare(" + squareID + ")'>" + numberOutput + "</div>";
			}
			squareID++;
			boardHTML = boardHTML + '<td class="border">' + boardSquareHTML + '</td>';
		}
		boardHTML += '</tr>';
	}

	boardHTML += '</table>';
	return boardHTML;
}



function markSquare(squareID) {
	clearMarkedSquare();
	var selectedSquare = document.getElementById(squareID);
	if (selectedSquare.getAttribute('selected') == 0)
	{
		selectedSquare.style.backgroundColor = "#EEEE00";
		selectedSquare.setAttribute("selected", "1");
		selectedSquare.style.textDecoration = "underline";
	}	
	return true;
} // End of markSquare

function clearMarkedSquare() {
	var currentSquare;
	for(var i=1; i<=20; i++)
	{
		currentSquare = document.getElementById(i);
		if (currentSquare.getAttribute('selected') == "1") 
		{
			currentSquare.style.backgroundColor = "#FFFFFF";
			currentSquare.setAttribute("selected", "0");
			currentSquare.style.textDecoration = "none";
		}
	}
}

function checkMarkedSquareAgainstRNValue()
{
	var markedSquareValue = 0;
	var currentSquare;
	var currentNumber = document.getElementById('currentnumber').innerHTML;
	for(var i=1; i<=20; i++)
	{
		currentSquare = document.getElementById(i);
		if (currentSquare.getAttribute('selected') == "1") 
		{
			markedSquareValue = currentSquare.getAttribute("value");
			break;
		}
	}
	if (markedSquareValue != 0)
	{ 
		if (baseRomanNumeralArray[markedSquareValue - 1] == currentNumber)
		{
			changeScore(count);
			currentSquare.setAttribute('selected', '2');
			currentSquare.style.backgroundColor = "#00EE00";
		}
		else
		{
			changeScore(-5);
		}
	}
}

function checkAvailableNumberHasBeenMarked() 
{
	var currentSquare;
	var currentNumber = document.getElementById('currentnumber').innerHTML;
		for(var i=1; i<=20; i++)
		{
			currentSquare = document.getElementById(i);
			currentSquareValue = currentSquare.getAttribute("value");
			if (baseRomanNumeralArray[currentSquareValue - 1] == currentNumber)
			{
				//If the current number has not been selected, lose points, and mark as auto selected
				if (currentSquare.getAttribute('selected') == 0)
				{
				 	changeScore(-5);
					currentSquare.setAttribute('selected', '3');
					currentSquare.style.backgroundColor = "#FF8C00";
					currentSquare.style.textDecoration = "overline";
				}
				break;
			}
			
		}
}

function pickNextNumber() {
	var pickedRomanNumeral = "";
	var randomNum;
	var tries = 0;
	
	while (pickedRomanNumeral == "")
	{
		randomNum = randInt(100);
		pickedRomanNumeral = RomanNumeralArray[randomNum - 1];
		if (pickedNumbers == 100)
		{
			sendMessage("All numbers have been shown");
			document.getElementById('currentnumber').innerHTML = "";
			return false;
		}
	}
	RomanNumeralArray[randomNum - 1] = "";
	document.getElementById('currentnumber').innerHTML = pickedRomanNumeral;
	pickedNumbers++;
	return true;
}

function pickNextNumberTimeRemaining()
{
	if (gameInProgress)
	{
		checkMarkedSquareAgainstRNValue();
		checkAvailableNumberHasBeenMarked();
		clearMarkedSquare();
		recordShownNumbers();
		//If all numbers are picked, then we automatically claim a full house, and end the game.
		if (!pickNextNumber())
		{
			claimHouse();
		}
		resetTime();
	}
}

function recordShownNumbers()
{
	var currentNumber = document.getElementById('currentnumber').innerHTML;
	var display = "";
	var spareCellsText = "";
	for (var i=1; i<=100; i++)
	{
		if (baseRomanNumeralArray[i - 1] == currentNumber)
		{
			display = i + " = ";
			break;
		}
	}
	
	currentRow = currentRow + "<td>" + display + currentNumber + "</td>";
	spareCells--;
	for (var i=0; i<spareCells; i++)
	{
		spareCellsText += "<td> </td>";
	}
	document.getElementById('calledtable').innerHTML = completedRows + currentRow + spareCellsText + "</tr>";
	if (pickedNumbers / 5 == Math.floor(pickedNumbers / 5) )
	{
		completedRows = completedRows + currentRow + "</tr><tr>";
		currentRow = '';
		spareCells = 5;
	}
}

function resetTime()
{
	count=11;
	window.clearTimeout(Id);
	countdown();
}

function getArrayOfNumbers(numberNeeded, maxNum)
{
	var mNumberArray = new Array(numberNeeded);
	var numbersFilled = 0;	
	var newRandom = 0;
	var n;
	var numberAlreadyThere = false;

	while (numbersFilled <= numberNeeded)
	{
		newRandom = randInt(maxNum);
		numberAlreadyThere = false;		
		
		for(n in mNumberArray)
		{
			if(mNumberArray[n] == newRandom) {numberAlreadyThere = true;}
		}
		
		if (!numberAlreadyThere)
		{
			mNumberArray[numbersFilled] = newRandom;
			numbersFilled++;
		}
	}

	mNumberArray.sort(sortNumber);
	return mNumberArray;	
}

function claimColumn()
{
	if (!colClaimed && gameInProgress)
	{
		var colSquareID; 
		var colSquare;
		var markedInColumn;
		var scoreMade = 0;
		var markedAndPoints;
		for (var i=1; i <= 5; i++)
		{
			markedInColumn = 0;
			scoreMade = 0;
			for (var z=1; z <= 4; z++)
			{
				colSquareID = ((z-1) * 5) + i;	
				markedAndPoints = markedSquareAndPoints(colSquareID);
				markedInColumn += markedAndPoints[0];
				scoreMade += markedAndPoints[1];
			}
			if (markedInColumn == 4)
			{
				colClaimed = true;
				changeScore(scoreMade);
				sendMessage("You have claimed a column for " + scoreMade + " points.");
				return true;
			}
		}
	}
}

function claimRow()
{
	if (!rowClaimed && gameInProgress)
	{
		var rowSquareID; 
		var rowSquare;
		var markedInRow;
		var scoreMade = 0;
		var markedAndPoints;
		for (var i=1; i <= 4; i++)
		{
			markedInRow = 0;
			scoreMade = 0;
			for (var z=1; z <= 5; z++)
			{
				rowSquareID = ((i-1) * 5) + z;	
				markedAndPoints = markedSquareAndPoints(rowSquareID);
				markedInRow += markedAndPoints[0];
				scoreMade += markedAndPoints[1];
			}
			if (markedInRow == 5)
			{
				rowClaimed = true;
				changeScore(scoreMade);
				sendMessage("You have claimed a row for " + scoreMade + " points.");
				return true;
			}
		}
	}
}

function claimHouse()
{
	if (!houseClaimed && gameInProgress)
	{
		var SquareID; 
		var Square;
		var marked = 0;
		var scoreMade = 0;
		var markedAndPoints;
		for (var i=1; i <= 4; i++)
		{
			for (var z=1; z <= 5; z++)
			{
				SquareID = ((i-1) * 5) + z;	
				markedAndPoints = markedSquareAndPoints(SquareID);
				marked += markedAndPoints[0];
				scoreMade += markedAndPoints[1];
			}
		}
		if (marked == 20)
		{
			houseClaimed = true;
			gameInProgress = false;
			changeScore(scoreMade);
			sendMessage("You have claimed a full board for " + scoreMade + " points.");
			shareResults();
			return true;
		}
	}
}

function shareResults()
{
	var gameResults = '<div style="width: 450px;height: 130px;text-align:center;border: 1px solid black;margin-top:0.5em;margin-bottom:0.5em;margin-left:auto;margin-right:auto;font-family: Arial, Helvetica, Sans-Serif;"><p><h2>I scored ' + currentScore + ' points playing<br />Roman Numeral Bingo</h2></p><p><a href="http://www.toadflaxgames.co.uk/RomanNumeralBingo/">Can you do better?</a></p></div>' 
	document.getElementById('shareresults').innerHTML = gameResults + '<div>Copy the text below to share your results on your blog or Livejournal</div><textarea rows=5 cols=50>' + gameResults + '</textarea>';
	return true;
}

function markedSquareAndPoints(squareID)
{
	markedAndPoints = new Array(2);
	square = document.getElementById(squareID);
	markedAndPoints[0] = 0;
	markedAndPoints[1] = 0;
	if (square.getAttribute('value') == 0) 
	{
		markedAndPoints[0] = 1;
	}
	if (square.getAttribute('selected') == 2) 
	{
		markedAndPoints[0] = 1;
		markedAndPoints[1] = 5;
	}
	if (square.getAttribute('selected') == 3) 
	{
		markedAndPoints[0] = 1;
		markedAndPoints[1] = 2;
	}
	return markedAndPoints;
}

function startNewGame() {
	gameInProgress = true;
	setupGame();
	document.getElementById('callednumbers').innerHTML = 'Called Numbers:<br /><table id=\'calledtable\'><col style=\'width:6em\' /><col style=\'width:6em\' /><col style=\'width:6em\' /><col style=\'width:6em\' /><col style=\'width:6em\' /></table>';
	document.getElementById('instructions').innerHTML = '';
	sendMessage("");
	pickNextNumber();
	resetTime();
}

function initialBoard() 
{
	setupGame();
	sendMessage("Press 'Start new game' to begin game.");
}

function changeScore(diff) {
	currentScore += diff;
	displayScore(currentScore);
	return true;
} // End of changeScore

function displayScore(score) {
	document.getElementById('score').innerHTML = "Score: " + score;
	return true;
}

function sendMessage(messageText) {
	document.getElementById('message').innerHTML = messageText;
	return true;
} // End of sendMessage

function randInt ( n )
{
  return ( Math.floor ( Math.random ( ) * n + 1 ) );
}

function sortNumber(a, b)
{
	return a - b;
}
