var Board = new Array(91);
var ScoreEBW = new Array(3);
var ValidPos = new Array(81);
var ValidCnt;
var NTurn;
var mColor;
var GameRec = '';
var timerID = 0;
var Vect = [-10, -9, -8, -1, 1, 8, 9, 10];
var PieceChar = ['.', '*', 'O'];

var isIE = (navigator.appName == 'Microsoft Internet Explorer');
if (isIE) {
	document.write('<bgsound src="#" id="soundeffect">');
}

initBoard();

////

function preloadImages() {
	(new Image()).src = 'PieceF1.gif';
	(new Image()).src = 'PieceF2.gif';
	(new Image()).src = 'PieceT1.gif';
	(new Image()).src = 'PieceT2.gif';
	(new Image()).src = 'PieceS2.gif';
}

function initBoard() {
	var i;

	for (i = 0; i <= 90; ++i)
		if ((i < 10) || (i > 80) || (i % 9 == 0))
			Board[i] = -1;
		else
			Board[i] = 0;

	Board[40] = 2;
	Board[41] = 1;
	Board[49] = 1;
	Board[50] = 2;

	NTurn = mColor = 1;
}

function examinePos(n) {
	var i, p, v;

	if (Board[n] != 0)
		return 0;
	for (i = 0; i < 8; ++i) {
		v = Vect[i];
		p = n + v;
		if (Board[p] == 3 - NTurn) {
			do {
				p += v;
			} while (Board[p] == 3 - NTurn);
			if (Board[p] == NTurn)
				return 1;
		}
	}
	return 0;
}

function setPieceImg(id, pfx, c) {
	var img = $('i' + id);
	img.src = pfx + c + '.gif';
	img.alt = PieceChar[c];
}

function updateScore(fdisp) {
	var i, c, e;

	ScoreEBW[0] = ScoreEBW[1] = ScoreEBW[2] = 0;
	ValidCnt = 0;
	for (i = 10; i <= 80; ++i) {
		c = Board[i];
		if (c >= 0) {
			ValidPos[i] = e = examinePos(i);
			ValidCnt += e;
			++ScoreEBW[c];
			if (fdisp)
				setPieceImg(i, 'ajax/PieceL', c);
		}
	}
	$('score').innerHTML = ScoreEBW[1] + ':' + ScoreEBW[2];

	if (ScoreEBW[0] == 60) {
		$('newbtn').value = 'Change';
	} else {
		$('newbtn').value = 'New Game';
	}
}

function clickSound() {
	if (isIE) {
		$('soundeffect').src = 'click.au';
	} else {	// http://www.boutell.com/newfaq/creating/scriptsound.html
		// var se = $('soundeffect');
		// if (se.Play)
		//	se.Play();
		// else if (se.DoPlay)
		//	se.DoPlay();
		// http://www.phon.ucl.ac.uk/home/mark/audio/play.htm
		// $('ranking').innerHTML = '<embed src="click.au" hidden="true" autostart="true" loop="false">';
	}
}

function performMove(n) {
	var i, j, p, v, s;

	for (i = 10; i <= 80; ++i) {
		if (Board[i] > 0) {
			s = $('i' + i).src;
			if (s.indexOf('PieceF') >= 0) {
				$('i' + i).src = s.replace('PieceF', 'PieceL');
			}
		}
	}
	if (n) {
		for (i = 0; i < 8; ++i) {
			v = Vect[i];
			p = n + v;
			if (Board[p] == 3 - NTurn) {
				j = 0;
				do {
					++j;
					p += v;
				} while (Board[p] == 3 - NTurn);
				if (Board[p] == NTurn) {
					do {
						p -= v;
						Board[p] = NTurn;
						setPieceImg(p, 'ajax/PieceF', NTurn);
					} while (--j);
				}
			}
		}
		Board[n] = NTurn;
		setPieceImg(n, 'ajax/PieceL', NTurn);
		clickSound();
		GameRec += 'abcdefgh'.charAt((n % 9) - 1) + Math.floor(n / 9);
	}
	NTurn = 3 - NTurn;
}

function gameSet() {
	var my, opp, s;

	my = ScoreEBW[mColor];
	opp = ScoreEBW[3 - mColor];
	if ((opp == 0) && (my != 64)) {
		my = 63;
	} else if ((my == 0) && (opp != 64)) {
		opp = 63;
	}
	my -= opp;
	s = '/cgi-bin/user/okuhara/brevrank.pl?s=' + my;
	if (my >= 63)
		s += '&t=' + GameRec;
	// else
	//	s += '&b=' + escape(navigator.userAgent.replace(/\s/g, '+'));
	ajax.update(s, 'ranking');
}

function comResponse(s) {
	var img;
	var comMv = parseInt(s);

	if (isNaN(comMv))
		return;
	if (comMv != 0) {
		if (ValidPos[comMv] == 0)
			return;
	} else {
		if (ValidCnt != 0)
			return;
	}

	clearTimeout(timerID);
	timerID = 0;
	performMove(comMv);
	updateScore(false);
	setPieceImg('oturn', 'ajax/PieceS', 0);

	if ((ScoreEBW[0] == 0) || ((comMv == 0) && (ValidCnt == 0))) {
		gameSet();
		return;
	}

	$('passbtn').disabled = (ValidCnt != 0);
	setPieceImg('mturn', 'ajax/PieceS', NTurn);
}

function sendRequest() {
	var s = '/cgi-bin/user/okuhara/breversi.pl?m=0&p=';
	var i;

	for (i = 10; i <= 80; ++i)
		if (i % 9)
			s += Board[i];
	s += '+' + NTurn;
	timerID = setTimeout("sendRequest()", 15000);	// in case of comm error
	ajax.get(s, comResponse);
}

function comRequest(n) {
	$('passbtn').disabled = true;
	setPieceImg('mturn', 'ajax/PieceS', 0);

	if ((ScoreEBW[0] == 0) || ((n == 0) && (ValidCnt == 0))) {
		gameSet();
		return;
	}

	setPieceImg('oturn', 'ajax/PieceS', NTurn);
	timerID = setTimeout("sendRequest()", 1000);	// sleep 1 sec
}

function cClick(n) {
	if ((timerID != 0) || ((n != 0) && (ValidPos[n] == 0)))
		return;	// invalid move

	performMove(n);
	updateScore(false);
	comRequest(n);
}

function cOver(n) {
	if ((NTurn == mColor) && (ValidPos[n] != 0))
		$('i' + n).src = 'ajax/PieceT' + NTurn + '.gif';
}

function cOut(n) {
	if ((NTurn == mColor) && (ValidPos[n] != 0))
		$('i' + n).src = 'ajax/PieceL0.gif';
}

function newbtnClick() {
	if (timerID) {
		clearTimeout(timerID);
		timerID = 0;
	}
	if (ScoreEBW[0] == 60) {	// Change
		mColor = 2;
		comRequest(0);
	} else {	// New
		initBoard();
		updateScore(true);
		setPieceImg('oturn', 'ajax/PieceS', 0);
		setPieceImg('mturn', 'ajax/PieceS', 1);
		GameRec = '';
		$('ranking').innerHTML = '&nbsp;';
	}
}

