var boards = new Array();;
var nrBoards = 0;

var autoinc = 0;

var FENStart="rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1";
// construct a valid basically valid FEN
var FENregexp=new RegExp("^[1-8rnbqrpRNBQRP/]+ [bw] [kqKQ-]+ [a-h36-]+ \d+ \d+");

function BoardObj(name) {

	// set properties

	this.setFen = _BO_setFen;
	this.clearBoard = _BO_clearBoard;
	this.writeBoard = _BO_writeBoard;

	// set variables
	this.name = name;
	this.clearBoard();
}

function _BO_clearBoard() {
	this.board = new Array(8);
	for (i=0; i<8; i++) {
		this.board[i] = new Array(8);
		for (j=0; j<8; j++)
			this.board[i][j] = 0;
	}
	this.whiteList = new Array();
	this.blackList = new Array();
}

function _BO_setFen(fen) {
	var FENparts = fen.split(" ");
	var tmpboard = this.board;
	// decode FEN
	var fenok = true;
	var pos=0;
	var row=0;
	var col=0;
	while (fenok && pos<FENparts[0].length) {
		c = FENparts[0].charAt(pos);
		if (c=="/") {
			if (col!=8) { // line not completely filled
				fenok = false;
				continue;
			}
			row++; col=0;
			if (row>7) { // too many rows
				fenok = false;
				document.write("too many rows");
			}
		}
		else
		if (c>="1" && c<="8") {
			skip=parseInt(c);
			for (j=0; fenok && j<skip; j++) {
				if (col>=8) {
					fenok = false;
					break;
				} else {
					this.board[row][col] = 0; col++;
				}
			}
		}
		else
		{
			if (col>=8) { // too many cols
				fenok = false;
				document.write("too many cols in piece");
			} else {
				// ok, we have a valid piece
				this.board[row][col] = piece2int(c);
				col++;
			}
		}
		pos++;
	}
	if (fenok && (row!=7 || col!=8)) {
		fenok = false;
	}
	// change board if valid
	if (!fenok) {
		this.board = tmpboard;
		document.write("Bad FEN!");
	}
}

function _BO_writeBoard() {
	for (i=0; i<8; i++) {
		for (j=0; j<8; j++) {
			document.write("<img src=\"/b/" + int2img(this.board[i][j]) +
				square2img(i,j) + ".gif\">");
		}
		document.write("<br />\n");
	}
}

function piece2int(ch) {
	var lc = ch.toLowerCase();
	var fac = (lc==ch)? -1 : 1; // neg means black, pos means white
	if (lc=="k") return fac*1;
	if (lc=="q") return fac*2;
	if (lc=="r") return fac*3;
	if (lc=="b") return fac*4;
	if (lc=="n") return fac*5;
	if (lc=="p") return fac*6;
	return 0;
}

function int2piece(i) {
	var white = (i<0) ? false : true;
	var absi = Math.abs(i);
	if (absi==1) return white?"K":"k";
	if (absi==2) return white?"Q":"q";
	if (absi==3) return white?"R":"r";
	if (absi==4) return white?"B":"b";
	if (absi==5) return white?"N":"n";
	if (absi==6) return white?"P":"p";
	return "";
}

function int2img(i) {
	var white = (i<0) ? false : true;
	var absi = Math.abs(i);
	if (absi==1) return white?"wk":"bk";
	if (absi==2) return white?"wq":"bq";
	if (absi==3) return white?"wr":"br";
	if (absi==4) return white?"wb":"bb";
	if (absi==5) return white?"wn":"bn";
	if (absi==6) return white?"wp":"bp";
	return "";
}

function square2img(r,c) {
	if ((r+c)%2==0) return "w";
	return "b";
}

function CreateBoard(name) {
	boards[nrBoards] = new BoardObj(name);
	boards[nrBoards].setFen(FENStart);
	nrBoards++;
	return;
}

function SetFen(name,fen) {
	for (i=0; i<nrBoards; i++) {
		if (boards[i].name==name) {
			boards[i].setFen(fen);
			return;
		}
	}
	CreateBoard(name);
	SetFen(name,fen);
	return;
}

function WriteBoard(name) {
	for (i=0; i<nrBoards; i++) {
		if (boards[i].name==name)
			boards[i].writeBoard();
	}
	return;
}

function WriteFen(fen) {
	autoinc++;
	SetFen("_sjai_"+autoinc,fen);
	WriteBoard("_sjai_"+autoinc);
}

function initSJPGN() {
}

initSJPGN();
