(function($) {
	$(function() {

		var game;

		function getSize() {
			return 3;
		}

		function getPlayerChar(c, def) {
			c = c.charAt(0);
			if (/\S/i.test(c)) {
				return c;
			}
			return def;
		}

		function getP1Char() {
			return getPlayerChar($("#p1char").val(), 'X');
		}

		function getP2Char() {
			return getPlayerChar($("#p2char").val(), 'O');
		}

		function getAI() {
			var ai = $("#ai").val();
			switch (ai) {
			case "s1": default:
				return new BaseAI(new RandomAI());
			case "s2":
				return new BaseAI(new FirstAvailableAI());
			case "s3":
				return new BaseAI(ScoredAI());
			case "none":
				return false;
			}
		}

		function p2Starts() {
			return $("#p2Starts:checked").size();
		}

		function status(message) {
			$("#message").html(message);
		}

		function myAlert(message) {
			$("#message").html(message).highlightFade({ "speed": 1500 });
		}

		function onGameOver() {
			$(this.winningCells).wrapInner('<span class="blink"></span>');
			if (this.winner == 1) {
				myAlert("Player 1 wins!");
			}
			else if (this.winner == 2) {
				myAlert("Player 2 wins!");
			}
			else if (this.winner == 0) {
				myAlert("Tie");
			}
			else {
				myAlert("Aiiieeeeee! You broke the game!");
			}
		}

		function onTurn() {
			status("Player " + (this.move == 0 ? "1" : "2") + "'s turn");
		}

		function newGame() {
			game = new TicTacToe(getSize(), $("#boardContainer"), getAI(), getP1Char(), getP2Char());
			if (p2Starts()) {
				if(getAI()) {
					game.aiMove(1);
				}
				else {
					game.move = 1;
				}
			}

			game.onGameOver = onGameOver;
			game.onTurn = onTurn;
			game.onTurn();

			game.render();
		}

		$("#newGame").click(newGame);

		$("#p1char").change(function() {
			if (game) {
				game.p1char = getP1Char();
				game.update();
			}
		});
		$("#p2char").change(function() {
			if (game) {
				game.p2char = getP2Char();
				game.update();
			}
		});

		newGame();
	});
})(jQuery);

