/**
* @name PGN viewer
* @copyright 2006 Karsten Nymann Pedersen
* @version 2.00
* @author Karsten Nymann Pedersen
* @license Buyware
* @mail pgnreader@rapax.dk
*/

var pgn_calculate_piece_pos = function(){

// brikkernes gang
	this.kingX = new Array(1,1,1,0,0,-1,-1,-1);
  this.kingY = new Array(1,0,-1,1,-1,1,0,-1);
	this.queenX = new Array(1,2,3,4,5,6,7,-1,-2,-3,-4,-5,-6,-7,1,2,3,4,5,6,7,-1,-2,-3,-4,-5,-6,-7,0,0,0,0,0,0,0,0,1,2,3,4,5,6,7,0,0,0,0,0,0,0,-1,-2,-3,-4,-5,-6,-7);
	this.queenY = new Array(1,2,3,4,5,6,7,-1,-2,-3,-4,-5,-6,-7,-1,-2,-3,-4,-5,-6,-7,1,2,3,4,5,6,7,0,1,2,3,4,5,6,7,0,0,0,0,0,0,0,-1,-2,-3,-4,-5,-6,-7,0,0,0,0,0,0,0);
	this.rookX = new Array(0,0,0,0,0,0,0,0,1,2,3,4,5,6,7,0,0,0,0,0,0,0,-1,-2,-3,-4,-5,-6,-7);
	this.rookY = new Array(0,1,2,3,4,5,6,7,0,0,0,0,0,0,0,-1,-2,-3,-4,-5,-6,-7,0,0,0,0,0,0,0);
	this.bishopX = new Array(1,2,3,4,5,6,7,-1,-2,-3,-4,-5,-6,-7,1,2,3,4,5,6,7,-1,-2,-3,-4,-5,-6,-7);
	this.bishopY = new Array(1,2,3,4,5,6,7,-1,-2,-3,-4,-5,-6,-7,-1,-2,-3,-4,-5,-6,-7,1,2,3,4,5,6,7);
	this.knightX = new Array(2,2,1,1,-1,-1,-2,-2);
	this.knightY = new Array(1,-1,2,-2,2,-2,1,-1);

// regular expession
	this.removeSign = /\+|#|x/g

// Brik definition
	this.tjekBonde="abcdefgh";
	this.tjekOfficer="RNBQK";
	this.rak = "abcdefgh";
	this.kol = "87654321";

}

pgn_calculate_piece_pos.prototype.n1 = function()
{
}

// *********************************************************************
// Funktion der uderegner brikkens nye position
// *********************************************************************

pgn_calculate_piece_pos.prototype.udregnTilPos = function()
{
	if (this.traek.length==2)
	{
		this.xTil=this.rak.indexOf(this.traek.charAt(0));
		this.yTil=this.kol.indexOf(this.traek.charAt(1));
	}
	if (this.traek.length==3)
	{
		this.xTil=this.rak.indexOf(this.traek.charAt(1));
		this.yTil=this.kol.indexOf(this.traek.charAt(2));
	}
	if (this.traek.length==4)
	{
		this.xTil=this.rak.indexOf(this.traek.charAt(2));
		this.yTil=this.kol.indexOf(this.traek.charAt(3));
	}
}

// *********************************************************************
// Funktion der finder brikkens placering
// *********************************************************************
pgn_calculate_piece_pos.prototype.tjekForNull = function(y,x)
{
  if (this.brik.toLowerCase()=="n") return true;
  this.stepY=((this.yTil-y)==0)?0:(this.yTil-y)/Math.abs(this.yTil-y);
  this.stepX=((this.xTil-x)==0)?0:(this.xTil-x)/Math.abs(this.xTil-x);
  this.y=y+this.stepY;
  this.x=x+this.stepX;
  if ((this.yTil==this.y) && (this.xTil==this.x)) return true;

  while ((this.yTil!=this.y) || (this.xTil!=this.x))
  {
    if ((this.yTil==this.y) && (this.xTil==this.x)) return true;
      if (this.braet[this.y*8+this.x]!="-") return false;
      this.y+=this.stepY;
      this.x+=this.stepX;

  }
  return true;
}

// *********************************************************************
// Funktion der finder officerers gang.
// *********************************************************************
pgn_calculate_piece_pos.prototype.findBrik = function(xs,ys)
{

  if (!this.hvid) this.brik=this.brik.toLowerCase();
  this.xs=xs;
  this.ys=ys;
  this.yFra=-1;
  this.xFra=-1;
  for (x=0; x<this.xs.length; x++)
  {
    this.ypos=this.yTil+this.ys[x];
    this.xpos=this.xTil+this.xs[x];
    if (this.ypos>=0 && this.ypos<=7 && this.xpos>=0 && this.xpos<=7)
    {
      if (this.yFra==-1 && this.xFra==-1 && this.braet[this.ypos*8+this.xpos]==this.brik)
      {
        if (this.tjekForNull(this.ypos,this.xpos)) {
          this.xFra=this.xpos;
          this.yFra=this.ypos;
        }
      }
    }
  }
  if (this.traek.length==4)
  {
    if (this.rak.indexOf(this.traek.charAt(1))>-1) {
      this.xFra=this.rak.indexOf(this.traek.charAt(1));
      this.yFra=-1;
      for (x=0; x<this.ys.length; x++)
      {
        this.ypos=this.yTil+this.ys[x];
        if (this.ypos>=0 && this.ypos<=7)
        {
          if (this.yFra==-1 && this.braet[this.ypos*8+this.xFra]==this.brik)
          {
            if (this.tjekForNull(this.ypos,this.xFra)) this.yFra=this.ypos;
          }
        }
      }
    }
		if (this.kol.indexOf(this.traek.charAt(1))>-1) {
      this.yFra=this.kol.indexOf(this.traek.charAt(1));
      this.xFra=-1;
      for (x=0; x<this.xs.length; x++)
      {
        this.xpos=this.xTil+this.xs[x];
        if (this.xpos>=0 && this.xpos<=7)
        {
          if (this.xFra==-1 && this.braet[this.yFra*8+this.xpos]==this.brik)
          {
            if (this.tjekForNull(this.yFra,this.xpos)) this.xFra=this.xpos;
          }
        }
      }
    }
  }

  this.braet[this.yFra*8+this.xFra]="-";
  this.braet[this.yTil*8+this.xTil]=this.brik;
}

// *********************************************************************
// Funktion der finder ud af hvilken officer det er.
// *********************************************************************
pgn_calculate_piece_pos.prototype.officer=function()
	{
    this.udregnTilPos();
		switch (this.brik)
		{
			case	"K":
				this.findBrik(this.kingX,this.kingY);;
			break;

			case	"Q":
				this.findBrik(this.queenX,this.queenY);;
			break;

			case	"R":
				this.findBrik(this.rookX,this.rookY);;
			break;

			case	"B":
				this.findBrik(this.bishopX,this.bishopY);;
			break;

			case	"N":
				this.findBrik(this.knightX,this.knightY);;
			break;
		}

  }

// *********************************************************************
// Funktion der finder koden for rokaden
// *********************************************************************
pgn_calculate_piece_pos.prototype.rokade=function()
{
	if (this.traek=="O-O") (this.hvid)?this.kode="47677757":this.kode="40607050";
	if (this.traek=="O-O-O") (this.hvid)?this.kode="47270737":this.kode="40200030";
	this.braet[parseFloat(this.kode.charAt(1))*8+parseFloat(this.kode.charAt(0))]="-";
  this.braet[parseFloat(this.kode.charAt(3))*8+parseFloat(this.kode.charAt(2))]=(this.hvid)?"K":"k";
	this.braet[parseFloat(this.kode.charAt(5))*8+parseFloat(this.kode.charAt(4))]="-";
  this.braet[parseFloat(this.kode.charAt(7))*8+parseFloat(this.kode.charAt(6))]=(this.hvid)?"R":"r";
}

// *********************************************************************
// Funktion der finder koden for bondetrękket
// *********************************************************************

pgn_calculate_piece_pos.prototype.pawn=function()
{
	(this.hvid)?this.retning=1:this.retning=-1;
  (this.hvid)?this.brik="P":this.brik="p";

  if (this.rak.indexOf(this.traek.charAt(1))>-1)
  {
		this.xTil=this.rak.indexOf(this.traek.charAt(1));
		this.yTil=this.kol.indexOf(this.traek.charAt(2));
	}
  else
  {
		this.xTil=this.rak.indexOf(this.traek.charAt(0));
		this.yTil=this.kol.indexOf(this.traek.charAt(1));
	}

  if (this.braet[(this.yTil+this.retning)*8+this.xTil]==this.brik) this.yFra=this.yTil+this.retning;
  else if (this.braet[(this.yTil+this.retning+this.retning)*8+this.xTil]==this.brik)
  {
  	this.yFra=this.yTil+this.retning+this.retning;
     this.enpassant=this.traek.charAt(0)+(this.yTil+this.retning);
  }
	this.xFra=this.xTil;

  if (this.traek.length>=3)
  {
  	this.traek=this.traek.split("=").join("");
		if (this.tjekOfficer.indexOf(this.traek.charAt(this.traek.length-1))>-1) {
		 	 (this.hvid)?this.brik=this.traek.charAt(this.traek.length-1):this.brik=this.traek.charAt(this.traek.length-1).toLowerCase();
		}
    this.yFra=this.yTil+this.retning;
		this.xFra=this.rak.indexOf(this.traek.charAt(0));
		if (this.braet[this.yTil*8+this.xTil]=="-") this.braet[this.yFra*8+this.xTil]="-";// enpassant!
  }


// Er det et normalt tręk
// afslutning udregn koden og flyt brik i this.braet
  this.braet[this.yFra*8+this.xFra]="-";
  this.braet[this.yTil*8+this.xTil]=this.brik;
}

// *********************************************************************
// Funktion der opdeller i forskellige tręk typer og returnerer ny bręt
// *********************************************************************
pgn_calculate_piece_pos.prototype.calcBoard = function()
{
	this.brik=this.traek.charAt(0)
	if (this.brik=='O') this.rokade();
	else if (this.tjekBonde.indexOf(this.brik)>=0) this.pawn();
	else if (this.tjekOfficer.indexOf(this.brik)>=0) this.officer();
	return this.braet.join("");
}

pgn_calculate_piece_pos.prototype.findStartNr = function()
{
	for (n=0; n<this.variant.length;n++)
	{
	  if (this.variant[n]) return n;
	}  
}

pgn_calculate_piece_pos.prototype.udregnVariant=function(variant)
{
	if (typeof this.boardArray[variant]=="undefined") this.boardArray[variant] = new Array();
	var Startnr = this.findStartNr();
	if (variant>0)
	{
		var vnr = settings.variantStart[settings.gameNumber][variant]
		this.braet = this.boardArray[vnr][Startnr].split("");
	}
	
  for (n=Startnr; n<this.variant.length;n++){
  	this.traeknr=n+1;
    if (this.variant[n]){
			(n/2==parseInt(n/2))? this.hvid=true : this.hvid=false;
      this.traek=this.variant[n].replace(this.removeSign,"");
      this.boardArray[variant][this.traeknr] = this.calcBoard();
    }
	}
}

pgn_calculate_piece_pos.prototype.calculateBoards = function()
{
  this.parti = settings.pgnArrayGame[settings.gameNumber];
  this.braet = settings.startBoard[settings.gameNumber].split("");
  this.variantStart = settings.variantStart[settings.gameNumber]
	this.boardArray = new Array();
  this.boardArray[0] = new Array();
  this.boardArray[0][0]=this.braet.join("");
	this.codeArea=new Array();
  for (variant=0; variant<this.parti.length; variant++)
	{
  	this.codeArea[variant]=new Array();
    this.variant = this.parti[variant];
    this.udregnVariant(variant);
  }
	settings.boardArray[settings.gameNumber] = this.boardArray;
}

