
var board;
var turn = 1;
var moveNumber = 1;
var ai1 = new Player(1);//black AI
var ai2 = new Player(2);//white AI
var passCount = 0;
var currOver = {x:-1,y:-1};

function init() {
	log("starting init() ");
	board = new Board(7);
	board.updateState(1);
	board.render();
	
	//add mouse over handler to inspect stuff?
	//board's click handler
	jQuery('canvas#board').bind('click', {'board':board}, function(evt) {
		var board = evt.data.board;
		var canvas = jQuery(this);
		var offset = canvas.offset();
		var cellSize = canvas.width() / board.size;
		//alert('cellSize:' + cellSize);
		var pos = {
			'x' : Math.floor((evt.pageX - offset.left) / cellSize),
			'y' : Math.floor((evt.pageY - offset.top) / cellSize)};
		cellClick(pos.x, pos.y);
		//alert("you clicked at " + pos.x + "," + pos.y);
		//alert("this is: " + this);
	});
	jQuery('canvas#board').bind('mousemove', {'board':board}, function(evt) {
		var board = evt.data.board;
		var canvas = jQuery(this);
		var offset = canvas.offset();
		var cellSize = canvas.width() / board.size;
		var pos = {
			'x' : Math.floor((evt.pageX - offset.left) / cellSize),
			'y' : Math.floor((evt.pageY - offset.top) / cellSize)};
		if(currOver.x != pos.x || currOver.y != pos.y) {
			currOver = pos;
			cellOver(pos);
		}
	});
	jQuery('#pass').click(pass);
	jQuery('#auto').click(function() {autoPlayOn = true; autoPlay();});
	jQuery('#stop').click(function() {autoPlayOn = false;});
}


function log(msg) {
  jQuery('#log').append(msg + "<br>\n");
  $('#log').scrollTop(1000000);
}

function getNextTurn(turn) {
  return (turn == 1) ? 2 : 1;
}

function cellClick(x, y) {
	log("cellClick(" + x + "," + y + ")");
	var pos = new Position(x, y);
	if(board.makeMove(pos, turn)) {
		passCount = 0;
		turn = getNextTurn(turn);
		moveNumber++;
		board.render('board');
		setTimeout(function(){autoMove(ai2);}, 10);
	} else {
		log("invalid move.  try again");
	} 
}

function cellOver(pos) {
	var i = board.getInt(pos.x, pos.y);
	if(i) {
		var celldetails = jQuery('#celldetails');
		celldetails.html(i.toString().replace(/\n/g, "<br>"));
		//celldetails.append("<br>rating: " + (Math.round(ai1.evalMove(board, i) * 100) / 100));
		celldetails.append("<br>rating: " + ai1.evalMove(board, i));
	}
}

function pass() {
	log("black passed");
	passCount += 1;
	if(passCount == 2) {
		gameOver();
	} else {
		turn = getNextTurn(turn);
		moveNumber++;
		board.render('board');
		autoMove(ai2);
	}

}

var autoPlayOn = false;
function autoPlay() {
	if(autoPlayOn) {
		var ai = turn == 1 ? ai1 : ai2;
		autoMove(ai);
		if(passCount < 2) {
			setTimeout(autoPlay, 10);
		}
	}
}

var autoRunTime = 0.0;
var autoMoveCount = 0;

function autoMove(ai) {
	var autoStartTime = (new Date()).getTime();
	var chosenMove = ai.chooseMove(board);
	if(chosenMove == null) {
		log("player " + ai.stoneMine + " passes");
		passCount += 1;
		if(passCount == 2)
			gameOver();
	} else if(board.makeMove(chosenMove, turn)) {
		log("player " + ai.stoneMine + " chose: " + chosenMove.toString());
		passCount = 0;
	} else {
		log("player " + ai.stoneMine + " chose an illegal move: " + chosenMove.toString());
	}
	turn = getNextTurn(turn);
	
	var autoEndTime = (new Date()).getTime();
	autoRunTime += autoEndTime - autoStartTime;
	autoMoveCount++;
	moveNumber++;
	board.render('board');
}

function gameOver() {
	var score = board.scoreByStone[1] + " - " + board.scoreByStone[2];
	if(board.scoreByStone[1] > board.scoreByStone[2])
		alert("Game over. Black wins.\n" + score);
	else if(board.scoreByStone[2] > board.scoreByStone[1])
		alert("Game over. White wins.\n" + score);
	else
		alert("Game over.  Tie.\n" + score);
	if(autoRunTime) {
		alert("" + autoRunTime + " / " + autoMoveCount + " = " + (autoRunTime / autoMoveCount));
	}
}
