/***********************************************************************************************************
 * su.bot.checkers.javascript.Board
 * Location: http://www.bot.su/library/su/bot/checkers/javascript/Board.js
 * Class Version Location: http://www.bot.su/library/su/bot/checkers/javascript/board/builds/20070528/Board.js
 * Index Version Location: http://www.bot.su/library/su/bot/checkers/javascript/board/index.html
 * © Bot.Su (http://www.bot.su/)
***********************************************************************************************************/

if (typeof su == "undefined") {su = {};};
if (typeof su.bot == "undefined") {su.bot = {};};
if (typeof su.bot.checkers == "undefined") {su.bot.checkers = {};};
if (typeof su.bot.checkers.javascript == "undefined") {su.bot.checkers.javascript = {};};

if (typeof su.bot.checkers.javascript.Board == "undefined") {
 su.bot.checkers.javascript.Board = function() {}; 
 
 su.bot.checkers.javascript.Board.prototype.checkers;
  su.bot.checkers.javascript.Board.prototype.getChecker = function (i, j) {return this.checkers[i][j];};
  su.bot.checkers.javascript.Board.prototype.getCheckers = function () {return this.checkers;};
  su.bot.checkers.javascript.Board.prototype.setCheckers = function (checkers) {this.checkers = checkers;}; 
 su.bot.checkers.javascript.Board.prototype.environment;
  su.bot.checkers.javascript.Board.prototype.getEnvironment = function () {return this.environment;};
  su.bot.checkers.javascript.Board.prototype.setEnvironment = function (environment) {this.environment = environment;}; 
 su.bot.checkers.javascript.Board.prototype.squares;
  su.bot.checkers.javascript.Board.prototype.getSquare = function (i, j) {return this.squares[i][j];};
  su.bot.checkers.javascript.Board.prototype.getSquares = function () {return this.squares;};
  su.bot.checkers.javascript.Board.prototype.setSquares = function (squares) {this.squares = squares;}; 
  
 su.bot.checkers.javascript.Board.prototype.contain = function(square) {return this.containI(square.i)&&this.containJ(square.j);};   
 su.bot.checkers.javascript.Board.prototype.containI = function(i) {return (i >= 0 && i < this.checkers.length);};   
 su.bot.checkers.javascript.Board.prototype.containJ = function(j) {return (j >= 0 && j < this.checkers[0].length);}; 
  
 su.bot.checkers.javascript.Board.prototype.create = function() {this.createSquares();this.createCheckers();};  
  
 su.bot.checkers.javascript.Board.prototype.createCheckers = function() {
  this.checkers = new Array();  
  var restNumberSquares = this.getEnvironment().getProperties().getNumberSquares();
  var currentNumberMaxCheckers = this.getEnvironment().getProperties().getNumberMaxCheckers();
  var currentNumberMinCheckers = this.getEnvironment().getProperties().getNumberMinCheckers();
  for(var i = 0; i < this.squares.length; i++) {
   var horizontal = new Array();
   for(var j=0; j < this.squares[i].length; j++) {
    var checker = new su.bot.checkers.javascript.Checker();
	if(!this.squares[i][j].getStatus()) {
     checker.setType("empty"); checker.setOwner("empty");
	} else {
     if(this.getEnvironment().getProperties().getWhoseTopPosition() == "max") {
      if(currentNumberMaxCheckers > 0) {
       checker.setType("checker"); checker.setOwner("max");
	   currentNumberMaxCheckers--;
	  } else if(restNumberSquares <= currentNumberMinCheckers*2) {
       checker.setType("checker"); checker.setOwner("min");
	   currentNumberMinCheckers--;
	  } else {
       checker.setType("empty"); checker.setOwner("empty");
	  };
	 } else if(this.getEnvironment().getProperties().getWhoseTopPosition() == "min") { 
      if(currentNumberMinCheckers > 0) {
       checker.setType("checker"); checker.setOwner("min");
	   currentNumberMinCheckers--;
	  } else if(restNumberSquares <= currentNumberMaxCheckers*2) {
       checker.setType("checker"); checker.setOwner("max");
	   currentNumberMaxCheckers--;
	  } else {
       checker.setType("empty"); checker.setOwner("empty");
	  };
	 } else {
      checker.setType("empty"); checker.setOwner("empty");
	 };
	};
	horizontal[j] = checker;
	restNumberSquares--;
   };
   this.checkers[i] = horizontal;
  };
 };  
  
 su.bot.checkers.javascript.Board.prototype.createSquares = function() {
  this.squares = new Array();  
  var properties = this.getEnvironment().getProperties();
  var currentStatus = properties.getLeftTopSquareStatus();
  var numberSquaresHorizontal = properties.getNumberSquaresHorizontal();
  var numberSquaresVertical = properties.getNumberSquaresVertical();
  for(var i = 0; i < numberSquaresHorizontal; i++) {
   var horizontal = new Array();
   for(var j=0; j < numberSquaresVertical; j++) {
    var square = new su.bot.checkers.javascript.Square();
	square.setI(i);
	square.setJ(j);
	square.setStatus(currentStatus);
	horizontal[j] = square;
	currentStatus = !currentStatus;
   };
   this.squares[i] = horizontal;
   currentStatus = !currentStatus;
  };
 }; 
 
 su.bot.checkers.javascript.Board.prototype.getCheckersLocation = function (name) {
  var cL = new Array();
  for(var i = 0; i < this.squares.length; i++) {
   for(var j=0; j < this.squares[i].length; j++) {
    if(this.checkers[i][j].owner == name) {cL[cL.length] = this.squares[i][j];};
   };
  };
  return cL;
 };   
 
 su.bot.checkers.javascript.Board.prototype.getCopy = function () {
  var copy = new su.bot.checkers.javascript.Board();
  copy.environment = this.environment;
  var s = new Array();
  for(var i = 0; i < this.squares.length; i++) {
   var h = new Array();
   for(var j = 0; j < this.squares[i].length; j++) {h[j] = this.squares[i][j].clone();};
   s[i] = h;
  };
  copy.squares = s;
  var c = new Array();
  for(var i = 0; i < this.checkers.length; i++) {
   var h = new Array();
   for(var j = 0; j < this.checkers[i].length; j++) {h[j] = this.checkers[i][j].clone();};
   c[i] = h;
  };
  copy.checkers = c;
  return copy;
 };
 
 su.bot.checkers.javascript.Board.prototype.isFree = function (fromSquare, toSquare) {
  if(!this.contain(fromSquare) || !this.contain(toSquare)) {return false;};
  var fromI = fromSquare.i; var fromJ = fromSquare.j;
  var toI = toSquare.i; var toJ = toSquare.j;
  var directionI = 1; if((toI-fromI) < 0) {directionI = -1;};
  var directionJ = 1; if((toJ-fromJ) < 0) {directionJ = -1;};
  var distance = (toI-fromI)*directionI;
  if(distance != ((toJ-fromJ)*directionJ)) {return false;};
  for(var offset = 1; offset <= distance; offset++) {
   var i = fromI+offset*directionI; var j = fromJ+offset*directionJ;
   if(!this.checkers[i][j].isEmpty()) {return false;};
  };
  return true;
 };
 
 su.bot.checkers.javascript.Board.prototype.move = function (move) {
  this.getChecker(move.getTo().getI(), move.getTo().getJ()).setFromChecker(this.getChecker(move.getFrom().getI(), move.getFrom().getJ()));
  this.getChecker(move.getFrom().getI(), move.getFrom().getJ()).clear();
  if(move.getComeKing()) {this.getChecker(move.getTo().getI(), move.getTo().getJ()).doKing();};
  if(move.getTaked()) {this.getChecker(move.getTake().getI(), move.getTake().getJ()).clear();};
 };
};
