﻿ie4=(document.all)?1:0;

if (!(ie4))
{
   var getter = function() { return this.textContent; };
   var setter = function(t) { return this.textContent = t; };
   HTMLElement.prototype.__defineGetter__("innerText", getter);
   HTMLElement.prototype.__defineSetter__("innerText", setter);
}

function gp(newply)
{
    var source;
    var dest;
    var newPosition;
    var startPosition;
    var boardPosition;
    var piecemoved;

    var htmlmoves = HtmlDecode(document.getElementById(Moves).value);
    
    var arrMoveNotation=document.getElementById(Notation).innerText.split(" ");
    if (newply==999) newply=arrMoveNotation.length-1;
    if ((newply<0) || (newply>=arrMoveNotation.length)) return;
    
    startPosition = document.getElementById(StartPosition).value;
    boardPosition = document.getElementById(posID).value;
    newPosition = startPosition;
 
    var promotedpieces=0;
    var loop=0;
    
    while (loop<newply)
    {
        source=htmlmoves.charCodeAt(loop*2+promotedpieces)-6;
        dest=htmlmoves.charCodeAt(loop*2+1+promotedpieces)-6;
        piecemoved = newPosition.charAt(source);
        
        //Check for en passant and pawn promotion
        if ((piecemoved=="f") || (piecemoved=="l"))
        {
            //check for enpassant
            if ((dest-source) % 12 != 0)
            {
                //The pawn has captured...check if destination was empty
                if (newPosition.charAt(dest) == "`")
                {
                    if (loop % 2 == 0)
                    {
                        //White move
                        newPosition = setCharAt(newPosition,dest-12,"`");
                    }
                    else
                    {
                        //Black move
                        newPosition = setCharAt(newPosition,dest+12,"`");
                    }
                }
            }
            //Check for pawn promotion
            if ((dest>=110) && (loop % 2 == 0)) 
            {
                promotedpieces++;
                piecemoved = htmlmoves.charAt(loop*2+1+promotedpieces);
            }
            else if ((dest<=33) && (loop%2 == 1)) 
            {
                promotedpieces++;
                piecemoved = htmlmoves.charAt(loop*2+1+promotedpieces);
            }
        }
        else if ((piecemoved == "e") || (piecemoved == "k"))
        {
            if ((source==30) && (dest==32) && (piecemoved=="e"))
            {
                //White king side castling occured
                newPosition = setCharAt(newPosition,33,"`");
                newPosition = setCharAt(newPosition,31,"a");
            }
            else if ((source==30) && (dest==28) && (piecemoved=="e"))
            {
                //White queen side castling occured
                newPosition = setCharAt(newPosition,26,"`");
                newPosition = setCharAt(newPosition,29,"a");
            }
            else if ((source==114) && (dest==116) && (piecemoved=="k"))
            {
                //Black king side castling occured
                newPosition = setCharAt(newPosition,117,"`");
                newPosition = setCharAt(newPosition,115,"g");
            }
            else if ((source==114) && (dest==112) && (piecemoved=="k"))
            {
                //Black queen side castling occured
                newPosition = setCharAt(newPosition,110,"`");
                newPosition = setCharAt(newPosition,113,"g");
            }
        }
        newPosition = setCharAt(newPosition,dest,piecemoved);
        newPosition = setCharAt(newPosition,source,"`");
        
        loop++;
    }
    DisplayPosition(newPosition,boardPosition);

    document.getElementById(posID).setAttribute("value",newPosition);
    var oldply = document.getElementById(currentPly).value;
    document.getElementById(currentPly).value = newply.toString();

    //Remove the highlight from previous active move and set it to current
    if (oldply != 0) 
    {
        document.getElementById(String(oldply)).style.backgroundColor='White';
        document.getElementById(String(oldply)).style.color='Black';
    }
        
    //Display the current move under the board
    if (newply != 0)
    {
        var gameNotation=document.getElementById(Notation).innerText.split(" ");
        var moveNotation=document.getElementById(currentMove);
        moveNotation.innerText="";
        if (newply % 2==0) moveNotation.innerText=String(Math.floor(newply/2)+(newply%2))+"...";
        moveNotation.innerText += gameNotation[newply-1];
        //Highlight the current move
        document.getElementById(String(newply)).style.backgroundColor='#7086B8';
        document.getElementById(String(newply)).style.color='White';
    }
    else
    {
        document.getElementById(currentMove).innerText="";
    }
}

function gpO(boardNumber, newply) {
    var source;
    var dest;
    var newPosition;
    var startPosition;
    var piecemoved;

    var htmlmoves = HtmlDecode(document.getElementById(Mvs).value);
    var Notation = document.getElementById(GameNotation).value;

    var arrMoveNotation = Notation.split(" ");
    if (newply == 999) newply = arrMoveNotation.length - 1;
    if ((newply < 0) || (newply > arrMoveNotation.length)) return;

    startPosition = document.getElementById(startPos).value;
    newPosition = startPosition;

    var promotedpieces = 0;
    var loop = 0;

    while (loop < newply) {
        source = htmlmoves.charCodeAt(loop * 2 + promotedpieces) - 6;
        dest = htmlmoves.charCodeAt(loop * 2 + 1 + promotedpieces) - 6;
        piecemoved = newPosition.charAt(source);

        //Check for en passant and pawn promotion
        if ((piecemoved == "f") || (piecemoved == "l")) {
            //check for enpassant
            if ((dest - source) % 12 != 0) {
                //The pawn has captured...check if destination was empty
                if (newPosition.charAt(dest) == "`") {
                    if (loop % 2 == 0) {
                        //White move
                        newPosition = setCharAt(newPosition, dest - 12, "`");
                    }
                    else {
                        //Black move
                        newPosition = setCharAt(newPosition, dest + 12, "`");
                    }
                }
            }
            //Check for pawn promotion
            if ((dest >= 110) && (loop % 2 == 0)) {
                promotedpieces++;
                piecemoved = htmlmoves.charAt(loop * 2 + 1 + promotedpieces);
            }
            else if ((dest <= 33) && (loop % 2 == 1)) {
                promotedpieces++;
                piecemoved = htmlmoves.charAt(loop * 2 + 1 + promotedpieces);
            }
        }
        else if ((piecemoved == "e") || (piecemoved == "k")) {
            if ((source == 30) && (dest == 32) && (piecemoved == "e")) {
                //White king side castling occured
                newPosition = setCharAt(newPosition, 33, "`");
                newPosition = setCharAt(newPosition, 31, "a");
            }
            else if ((source == 30) && (dest == 28) && (piecemoved == "e")) {
                //White queen side castling occured
                newPosition = setCharAt(newPosition, 26, "`");
                newPosition = setCharAt(newPosition, 29, "a");
            }
            else if ((source == 114) && (dest == 116) && (piecemoved == "k")) {
                //Black king side castling occured
                newPosition = setCharAt(newPosition, 117, "`");
                newPosition = setCharAt(newPosition, 115, "g");
            }
            else if ((source == 114) && (dest == 112) && (piecemoved == "k")) {
                //Black queen side castling occured
                newPosition = setCharAt(newPosition, 110, "`");
                newPosition = setCharAt(newPosition, 113, "g");
            }
        }
        newPosition = setCharAt(newPosition, dest, piecemoved);
        newPosition = setCharAt(newPosition, source, "`");

        loop++;
    }
    DisplayPositionOverview(boardNumber, newPosition, startPosition);

    var moveNumber = "";

    if (newply % 2 == 0) {
        moveNumber = String(Math.floor(newply / 2)) + "...";
    }
    else {
        moveNumber = String(Math.floor(newply / 2) + 1) + ".";
    }
    
    switch (boardNumber) {
        case 1:
            {
                document.getElementById(lblNotation1).innerText = moveNumber + arrMoveNotation[newply - 1];
                break;
            }
        case 2:
            {
                document.getElementById(lblNotation2).innerText = moveNumber + arrMoveNotation[newply - 1];
                break;
            }
        case 3:
            {
                document.getElementById(lblNotation3).innerText = moveNumber + arrMoveNotation[newply - 1];
                break;
            }
        case 4:
            {
                document.getElementById(lblNotation4).innerText = moveNumber + arrMoveNotation[newply - 1];
                break;
            }
        case 5:
            {
                document.getElementById(lblNotation5).innerText = moveNumber + arrMoveNotation[newply - 1];
                break;
            }
        case 6:
            {
                document.getElementById(lblNotation6).innerText = moveNumber + arrMoveNotation[newply - 1];
                break;
            }
        default:
            {
                break;
            }
    }
}

function DisplayPositionOverview(boardNumber, newPosition, oldPosition) {
    var row;
    var col;
    var imageName;

    var boardidentifier = String.fromCharCode(boardNumber + 64) //Convert the board number to A,B,C,D,E,F,G or H to identify the piece name

    for (var i = 0; i <= 143; i++) {
        if (newPosition.charAt(i) != oldPosition.charAt(i)) {
            row = Math.floor(i / 12) + 1;
            col = i % 12 + 1;
            imageName = CheckImageName(newPosition.charAt(i), row, col);

            var pieceNumber;
            if (i >= 110) { pieceNumber = i - 109 }
            else if (i >= 98) { pieceNumber = i - 89 }
            else if (i >= 86) { pieceNumber = i - 69 }
            else if (i >= 74) { pieceNumber = i - 49 }
            else if (i >= 62) { pieceNumber = i - 29 }
            else if (i >= 50) { pieceNumber = i - 9 }
            else if (i >= 38) { pieceNumber = i + 11 }
            else if (i >= 26) { pieceNumber = i + 31 }

            document.images["p" + boardidentifier + String(pieceNumber)].src = "images/small/" + imageName;
        }
    }
}

function ActOnKey(key)
{
    if (key==39 || key==102)
    {
        var linknum=parseInt(document.getElementById(currentPly).value)+1
        gp(linknum);
    }
    if (key==37 ||key==100)
    {
        var linknum=parseInt(document.getElementById(currentPly).value)-1
        gp(linknum);
    }
}

function CheckImageName(piece,row,col)
{
    var imageName = "";
    switch(piece)
    {
        case "a":
            imageName = "wr";
            break;
        case "b":
            imageName = "wn";
            break;
        case "c":
            imageName = "wb";
            break;
        case "d":
            imageName = "wq";
            break;
        case "e":
            imageName = "wk";
            break;
        case "f":
            imageName = "wp";
            break;
        case "g":
            imageName = "br";
            break;
        case "h":
            imageName = "bn";
            break;
        case "i":
            imageName = "bb";
            break;
        case "j":
            imageName = "bq";
            break;
        case "k":
            imageName = "bk";
            break;
        case "l":
            imageName = "bp";
            break;
        case "`":
            imageName = "es";
            break;
    }
    if ((row + col) % 2 != 0) imageName += "w.gif"; else imageName += "b.gif";

    return imageName;
}

function DisplayPosition(newPosition,oldPosition)
{
    var row;
    var col;
    var imageName;
    
    for (var i=0; i<=143; i++)
    {
        if (newPosition.charAt(i) != oldPosition.charAt(i))
        {
            row = Math.floor(i / 12)+1;
            col = i % 12 + 1;
            imageName = CheckImageName(newPosition.charAt(i),row,col);
            
            var pieceNumber;
            if (i>=110) {pieceNumber=i-109}
            else if (i>=98) {pieceNumber=i-89}
            else if (i>=86) {pieceNumber=i-69}
            else if (i>=74) {pieceNumber=i-49}
            else if (i>=62) {pieceNumber=i-29}
            else if (i>=50) {pieceNumber=i-9}
            else if (i>=38) {pieceNumber=i+11}
            else if (i>=26) {pieceNumber=i+31}
            
            document.images["p" + String(pieceNumber)].src = "images/" + imageName;
        }
    }
}

function FlipBoard()
{
    var row;
    var col;
    var imageName;

    var strHTML;
    strHTML = "<table class='BoardTable'>";
    
    var flipped = parseInt(document.getElementById(FlippedBoard).value);
    document.getElementById(FlippedBoard).value = 1-flipped;
    
    if (flipped == 0)
    {
        for (row=0; row<=7;row+=1)
        {
            strHTML += "<tr>";
            for (col=7; col>=0; col-=1)
            {
                var square;
                square=row*12+24+col+2;
                imageName = CheckImageName(document.getElementById(posID).value.charAt(square), row, col);
                strHTML += "<td>";
                strHTML += "<img name='p" + String(square-109+(20*(7-row))) + "' src='images/" + imageName + "' />";
                strHTML += "</td>";
            }
            strHTML += "</tr>";
        }
     }
     else
     {
        for (row=7; row>=0; row-=1)
        {
            strHTML += "<tr>";
            for (col=0; col<=7; col+=1)
            {
                var square;
                square=row*12+24+col+2;
                imageName = CheckImageName(document.getElementById(posID).value.charAt(square), row, col);
                strHTML += "<td>";
                strHTML += "<img name='p" + String(square-109+(20*(7-row))) + "' src='images/" + imageName + "' />";
                strHTML += "</td>";
            }
            strHTML += "</tr>";
        }
      }
      strHTML += "</table>";
      document.getElementById(chPosition).innerHTML = strHTML;
}

function setCharAt(str,index,ichar) 
{
    if (index > str.length-1) return str;
    return str.substr(0,index) + ichar + str.substr(index+1);
}