/**

* @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();

    }

    else{

			if (this.variant[n+1]){

				  this.braet = this.boardArray[this.variantStart[variant]][this.traeknr].split("");

			}

		}

	}

}



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;

}



