var game = null;
var numberOfPlayers = 0;


/*****************************************************************************
 *
 *  Define the Game Object and Functions
 *
 *****************************************************************************/
function Game(theNumberOfPlayers, skillLevel, boardDivName)
{
    this.players = new Array();
    this.skillLevel = skillLevel;
    this.currentPlayer = 0;
    this.bag = new Bag();
    this.board = new Board(boardDivName, theNumberOfPlayers);
	this.ingeniousCnt = 0;
    this.humanPlayer = new HumanPlayer(Language.translate('You'), 0, Math.random(), this, this.bag);
    this.players.push(this.humanPlayer);
	this.desiresSwap = false;
	this.ingeniousDialog = new Dialog(300, 200, Language.translate('DeclareIngeniousDialogHeader'));
	this.placeTileDialog = new Dialog(200, 120, Language.translate('PlaceATileDialogHeader'));
	this.gameOverDialog = new Dialog(320, 200, Language.translate('GameOverDialogHeader'));
	this.anchor = getElementPosition('anchor');

	this.sharedDragControl = new DragControl
	(
		'control0',
		this.board,
		this.anchor.left,
		this.anchor.top
	);

	ADD_DHTML('control0');
	dd.elements['control0'].hide();

    for (var i=1; i<theNumberOfPlayers; i++)
    {
        this.players.push(new ComputerPlayer(Language.translate('Player') + ' ' + i, i, Math.random(), this, this.bag));
    }

	this.humanPlayer.setDHTMLCallbacks();
	showDivById('board');
}

Game.onKeyPress = function(event)
{
    var e = event;
    if (e == null)
    {
        e = window.event;
    }

	var key = (e.which) ? e.which : e.keyCode;

	var dialog = Dialog.getActiveDialog();
	if (dialog != null)
	{
		dialog.onKeyPress(key);
	}
	else
	{
		if (KeyboardConstants.isEndTurnKey(key))
		{
			game.endTurn();
		}

		if (KeyboardConstants.isSwapKey(key))
		{
			game.endTurnWithSwap(key);
		}
	}
}



Game.prototype.getBoard = function()
{
	return this.board;
}

Game.prototype.getHumanPlayer = function()
{
    return this.humanPlayer;
}

Game.prototype.getPlayers = function()
{
    return this.players;
}

Game.prototype.isGameOver = function()
{
	return !this.board.hasPlayableSpace() || this.getCurrentPlayer().isInstantWinner();
}

Game.prototype.getCurrentPlayer = function()
{
	return this.players[this.currentPlayer];
}

Game.prototype.start = function()
{
	// choose a starting player and hit them up to take a turn
	this.currentPlayer = Math.round((Math.random() * 1000)) % this.players.length;
	this.takeTurn();
}

Game.prototype.nextPlayer = function()
{
	this.currentPlayer = (this.currentPlayer + 1) % this.players.length;
}

// Called by the human player
Game.prototype.endTurnWithSwap = function()
{
	if (this.humanPlayer.isActive())
	{
		if (this.humanPlayer.canEndTurn())
		{
			this.desiresSwap = true;
			this.endTurn();
		}
		else
		{
			this.showPlaceTileDialog();
		}
	}
}

Game.prototype.showPlaceTileDialog = function()
{
	dd.elements[this.placeTileDialog.getId()].moveTo(100+this.anchor.left, 200+this.anchor.top);
	this.placeTileDialog.activate
	(
		Language.translate('PlaceATileBeforeEndingYourTurn') +
		this.placeTileDialog.getCloseButtonHtml()
	);
}

// Called by the human player
Game.prototype.endTurn = function()
{
	if (this.humanPlayer.isActive())
	{
		if (this.humanPlayer.canEndTurn())
		{
			this._endTurn();
		}
		else
		{
			this.showPlaceTileDialog();
		}
	}
}


Game.prototype._endTurn = function()
{
	var currentPlayer = this.getCurrentPlayer();

	var selectedTile = currentPlayer.getSelectedTile();
	var selectedSpace = currentPlayer.getSelectedSpace();

	if ((selectedTile != null) && (selectedSpace != null))
	{
		if (currentPlayer.isComputerPlayer())
		{
			currentPlayer.flySelectedTile();
		}
		else
		{
			this.completeTurn();
		}
	}


}

Game.prototype.completeTurn = function()
{
	var currentPlayer = this.getCurrentPlayer();
	var selectedTile = currentPlayer.getSelectedTile();
	var selectedSpace = currentPlayer.getSelectedSpace();

	while (selectedTile.getOrientation() != currentPlayer.getSelectedOrientation())
	{
		selectedTile.rotate(true);
	}

	this.board.placeTile(selectedTile, selectedSpace);
	var tileScore = this.board.scoreTile(selectedTile, selectedSpace);
	var cnt = this.scoreTilePlacement(tileScore);
	if (cnt > 0)
	{
		var _this = this;
		var wrapper = function()
		{
			currentPlayer.removeTileFromHand(selectedTile);

			var adjustment = document.getElementById('ingeniousCnt');
			if (adjustment != null)
			{
				_this.ingeniousCnt = parseInt(adjustment.value);
			}

			setTimeout('game.launchNextTurn()', 5);
		}
		_this.ingeniousCnt += cnt;

		dd.elements[this.ingeniousDialog.getId()].moveTo(75+this.anchor.left, 150+this.anchor.top);
		this.ingeniousDialog.activate
		(
			'<h1>' + Language.translate('DeclareIngeniousDialogHeader') + '</h1>' +
			currentPlayer.getScoreBoard().getIngeniousDisplayCubesHtml() +
			'<p>' + Language.translate('BonusMovesDeclaration') +
			(currentPlayer.isComputerPlayer() ? '<p>' : this.getIngeniousAdjustmentHtml()) +
				this.ingeniousDialog.getCloseButtonHtml(),
			wrapper
		);

		return;
	}

	this.ingeniousCnt += cnt;
	currentPlayer.removeTileFromHand(selectedTile);
	setTimeout('game.launchNextTurn()', 5);
}


Game.prototype.launchNextTurn = function()
{
	var currentPlayer = this.getCurrentPlayer();
	currentPlayer.deactivate();

	if (this.isGameOver())
	{
		this.showResults();
	}
	else
	{
		if (this.ingeniousCnt <= 0)
		{
			if (this.desiresSwap == true)
			{
				currentPlayer.swapTiles
				(
					function()
					{
						game.nextPlayer();
						game.takeTurn();
					}
				);
			}
			else
			{
				currentPlayer.refillHand();
				this.nextPlayer();
				this.takeTurn();
			}
		}
		else
		{
			if (this.ingeniousCnt > 0)
			{
				this.ingeniousCnt--;
			}
			this.takeTurn();
		}
	}
}


Game.prototype.takeTurn = function()
{
	this.desiresSwap = false;

	if (this.isGameOver())
	{
		this.showResults();
	}
	else
	{
		var currentPlayer = this.getCurrentPlayer();
		currentPlayer.activate();
		setTimeout("game._takeTurn()", 50);
	}
}

Game.prototype._takeTurn = function()
{
	var currentPlayer = this.getCurrentPlayer();
	currentPlayer.takeTurn();
}


Game.prototype.showResults = function()
{
	var html = this.getGameOverHtml() +
				this.gameOverDialog.getNewGameButtonHtml();
	dd.elements[this.gameOverDialog.getId()].moveTo(100+this.anchor.left, 100+this.anchor.top);
	this.gameOverDialog.activate
	(
		html,
		function()
		{
			Game.beginGame();
		}
	);
}

Game.prototype.scoreTilePlacement = function(tileScore)
{
	return this.getCurrentPlayer().scoreTilePlacement(tileScore);
}

Game.prototype.getGameOverHtml = function()
{
	var scoreBoards = new Array();
	for (var i=0; i<this.players.length; i++)
	{
		scoreBoards.push(this.players[i].getScoreBoard());
	}

	scoreBoards.sort(ScoreBoard.sortBoards);

    var html = '';
    if (scoreBoards[0].getPlayerIndex() == 0)
    {
        html = '<h1>' + Language.translate('YouAreTheWinner') + '</h1>';
    }
    else
    {
        html = '<h1>' + Language.translate('Player') + scoreBoards[0].getPlayerIndex() +
            Language.translate('PlayerIsTheWinner') + '</h1>';
    }

	html += '<table width="100%">';
	for (var i=0; i<scoreBoards.length; i++)
	{
		var scoreBoard = scoreBoards[i];
		html += '<tr>';
		if (scoreBoard.getPlayerIndex() == 0)
		{
			html += '<td>' + Language.translate('You') + '</td>';
		}
		else
		{
			html += '<td>' + Language.translate('Player') + scoreBoard.getPlayerIndex() + '</td>';
		}

		var scores = scoreBoard.scores;
		for (var j=0; j<scores.length; j++)
		{
			var symbol = scores[j];
			html += '<td><img src="' + symbol.getCubeImage() + '"/> ' +
			        scoreBoard.getScore(symbol) +
			        '</td>';
		}
		html += '</tr>';
	}
	html += '</table><p>';
	return html;
}

Game.prototype.getIngeniousAdjustmentHtml = function()
{
	var html = '<p>' + Language.translate('BonusPlaysSelectionLabel') + '<select id="ingeniousCnt" name="ingeniousCnt">';
	for (var i=this.ingeniousCnt; i>=0; i--)
	{
		html += '<option value="' + i + '">' + i;
	}
	html += '</select><p>';
	return html;
}

Game.establishGameParameters = function()
{
	var dialog = new Dialog(330, 220, Language.translate('GameSetupDialogHeader'));
	dd.elements[dialog.getId()].moveTo(250, 200);

	var html = '<center><table>' +
        '<tr><td>' + Language.translate('LanguageSelectionLabel')  +
            '</td><td>' +
            '<img class="clickable" src="/ingenious/images/flag_usa.png" onclick="Language.setLanguage(\'ENGLISH\')">' +
            '&nbsp;&nbsp;' +
            '<img class="clickable" src="/ingenious/images/flag_germany.png" onclick="Language.setLanguage(\'GERMAN\')">' +
            '&nbsp;&nbsp;' +
            '<img class="clickable" src="/ingenious/images/flag_netherlands.png" onclick="Language.setLanguage(\'DUTCH\')">' +
            '&nbsp;&nbsp;' +
            '<img class="clickable" src="/ingenious/images/flag_poland.png" onclick="Language.setLanguage(\'POLISH\')">' +
            '</td></tr>' +
		'<tr><td>' + Language.translate('NumberOfPlayers') + '</td><td><select id="numberOfPlayers" name="numberOfPlayers">' +
		'<option value="4">4<option value="3">3<option value="2">2</select></td></tr>' +
		'<tr><td>' + Language.translate('BotSkillLevel') + '</td><td><select id="skillLevel" name="skillLevel">' +
		'<option value="basic">' + Language.translate('BotSkillLevelBasic') + '</select></td></tr>' +
		'<tr><td colspan="2">&nbsp;<br>' +
			Symbol.RED.getImgTag(Symbol.RED.getImage()) +
			Symbol.GREEN.getImgTag(Symbol.GREEN.getImage()) +
			Symbol.BLUE.getImgTag(Symbol.BLUE.getImage()) +
			Symbol.ORANGE.getImgTag(Symbol.ORANGE.getImage()) +
			Symbol.YELLOW.getImgTag(Symbol.YELLOW.getImage()) +
			Symbol.PURPLE.getImgTag(Symbol.PURPLE.getImage()) +
		'</table></center>' +
		Language.translate('InitialGameDialogFooter');

	html += dialog.getStartButtonHtml();

	dialog.activate
	(
		html,
		function()
		{
			var pcntSel = document.getElementById('numberOfPlayers');
			var skillSel = document.getElementById('skillLevel');

			game = new Game
			(
				pcntSel.value,
				skillSel.value,
				'board'
			);

			showDivById('anchor');

            document.getElementById('MainControlDirections').innerHTML =
                Language.translate('MainControlDirections');

			setTimeout('game.start()', 5);
		}
	);
}

Game.beginGame = function()
{
    window.location.reload();
}


Game.showRules = function(page)
{
	var dialog = new Dialog(600, 600, 'Rules');
	dd.elements[dialog.getId()].moveTo(100, 100);

	var html = '<iframe width="100%" height="100%" src="/ingenious/rules' +
				page + '.html"></iframe><p>';

	html += Game.getPrevNextButtonsHtml(page, dialog.getId());

	dialog.activate(html, null);
}


Game.getPrevNextButtonsHtml = function(page, id)
{
	var html = '<table width="100%"><tr><td align="left">';

	if (page > 1)
	{
		html += '<a href="javascript:Dialog.close(\'' + id + '\');Game.showRules(' + (page-1) + ');">Prev</a>';
	}

	html += '</td><td align="right">';

	if (page < 6)
	{
		html += '<a href="javascript:Dialog.close(\'' + id + '\');Game.showRules(' + (page+1) + ');">Next</a>';
	}

	html += '</td></tr></table>';
	return html;
}