﻿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 mf()
{
    var variationCount = 0;
    var htmlmoves = HtmlDecode(document.getElementById(ProblemSolution).value);
    var currentChar = parseInt(document.getElementById(currentCh).value) + 2 + parseInt(document.getElementById(promoted).value);
    var str = '@@@';
    
    while ((str == '@@@' || str == '|||') && (currentChar < htmlmoves.length))
    {
        str = htmlmoves.substring(currentChar, currentChar + 3);
    
        if (str == '@@@' || currentChar >= htmlmoves.length)
        {
            // We are at the end of a variation or of the main line
            return;
        }
    
        if (str == '|||')
        {
            // We are just before the beginning of a variation
            variationCount = 1;
            currentChar += 3;
            while (variationCount > 0)
            {
                str = htmlmoves.substring(currentChar, currentChar + 3);
                if (str == '|||')
                {
                    variationCount += 1;
                    currentChar += 3;
                }
                else if (str == '@@@')
                {
                    variationCount -= 1;
                    currentChar += 3;
                }
                else
                {
                    currentChar += 1;
                }
            }
        }
    }
    
    if (currentChar >= htmlmoves.length)
    {
        return;
    }
    
    getPlyFromChar(currentChar);
}

function mb()
{
    var variationCount = 0;
    var htmlmoves = HtmlDecode(document.getElementById(ProblemSolution).value);
    var currentChar = parseInt(document.getElementById(currentCh).value) - 3;
    var str = '|||';
    
    while ((str == '|||' || str == '@@@') && (currentChar >= 0))
    {
        str = htmlmoves.substring(currentChar, currentChar + 3);
    
        if (str == '|||')
        {
            // We are just at the beginning of the current variation or at the first move in the main line
            return;
        }
    
        if (str == '@@@')
        {
            // We have met the closing bracket of a variation
            variationCount = 1;
            currentChar -= 3;
            while (variationCount > 0)
            {
                str = htmlmoves.substring(currentChar, currentChar + 3);
                if (str == '@@@')
                {
                    variationCount += 1;
                    currentChar -= 3;
                }
                else if (str == '|||')
                {
                    variationCount -= 1;
                    currentChar -= 3;
                }
                else
                {
                    currentChar -= 1;
                }
            }
        }
    }
    
    getPlyFromChar(currentChar);    
}

function getPlyFromChar(currentChar)
{
    var foundChar = false;
    var charMap = document.getElementById(plyCharMap).value.split('~');
    
    var ply;
    for (ply = 0; ((ply < charMap.length - 1) && (!foundChar)); ply += 1)
    {
        // We check for currentChar or currentChar + 1 if a pawn promotion occurred in the ply before
        if (charMap[ply] == currentChar || charMap[ply] == currentChar + 1)
        {
           gpP(ply + 1);
           foundChar = true;
        }
    }
    
    if (!foundChar)
    {
        gpP(0);
    }
}

function gpP(newply)
{
    var source, dest;
    var parentPosition, newPosition;
    var startPosition, boardPosition;
    var piecemoved;
    var bSkipLoop;
    
    var posStack = new Array();
    var htmlmoves = HtmlDecode(document.getElementById(ProblemSolution).value);
        
    var plyCount = document.getElementById(PlyCount).value;
    if (newply == 999) 
    {
        newply = plyCount;
    }
    else if ((newply < 0) || (newply > plyCount)) 
    {
        return;
    }
    
    boardPosition = document.getElementById(posID).value;
    newPosition = document.getElementById(ProblemPosition).value;
 
    var promotedpieces = 0;
    var seenPly = 0;
    var varCharCount = 0;
    
    document.getElementById(promoted).value = "0";
    
    while (seenPly < newply)
    {
        bSkipLoop = false;
        
        var str = htmlmoves.substring(seenPly * 2 + promotedpieces + varCharCount, seenPly * 2 + promotedpieces + varCharCount + 3);
        
        if (str == "|||")
        {
            posStack.push(newPosition);
            posStack.push(parentPosition);
            varCharCount += 3;
            newPosition = parentPosition;
        }
        else if (str == "@@@")
        {
            parentPosition = posStack.pop();
            newPosition = posStack.pop();
            varCharCount += 3;
            bSkipLoop = true;
        }
        
        if (!bSkipLoop)
        {
            source = htmlmoves.charCodeAt(seenPly * 2 + promotedpieces + varCharCount) - 6;
            dest = htmlmoves.charCodeAt(seenPly * 2 + 1 + promotedpieces + varCharCount) - 6;
            piecemoved = newPosition.charAt(source);
            
            if (piecemoved >= 'a' && piecemoved <= 'f')
            {
                onMove = 0;
            }
            else
            {
                onMove = 1;
            }
            
            //Store the unaltered position
            parentPosition = newPosition;
            //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 (onMove == 0)
                        {
                            //White move
                            newPosition = setCharAt(newPosition,dest-12,"`");
                        }
                        else
                        {
                            //Black move
                            newPosition = setCharAt(newPosition,dest+12,"`");
                        }
                    }
                }
                //Check for pawn promotion
                if ((dest >= 110) && (onMove == 0)) 
                {
                    if (seenPly == newply - 1)
                    {
                        document.getElementById(promoted).value = "1";
                    }
                    promotedpieces++;
                    piecemoved = htmlmoves.charAt(seenPly * 2 + 1 + promotedpieces + varCharCount);
                }
                else if ((dest <= 33) && (onMove == 1)) 
                {
                    if (seenPly == newply - 1)
                    {
                        document.getElementById(promoted).value = "1";
                    }
                    promotedpieces++;
                    piecemoved = htmlmoves.charAt(seenPly * 2 + 1 + promotedpieces + varCharCount);
                }
            }
            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,"`");
        
            seenPly++;
        }
    }
    DisplayPosition(newPosition, boardPosition);

    document.getElementById(posID).setAttribute("value", newPosition);
    
    var oldply = document.getElementById(currentPly).value;
    document.getElementById(currentPly).value = newply.toString();

    if (oldply != 0) 
    {
        document.getElementById(String(oldply)).style.backgroundColor = document.getElementById(selBackground).value;
        document.getElementById(String(oldply)).style.color = document.getElementById(selForeground).value;
    }
    
    if (newply != 0)
    {
        document.getElementById(selBackground).value = document.getElementById(String(newply)).style.backgroundColor;
        document.getElementById(selForeground).value = document.getElementById(String(newply)).style.color;
        
        document.getElementById(String(newply)).style.backgroundColor = '#7086B8';
        document.getElementById(String(newply)).style.color = 'White';
        
        // Show the notation under the board display
        var moveOffset = parseInt(document.getElementById(mvOffset).value);
        var bGotNotation = false;
        var strMv = document.getElementById(plyMoveMap).value.split('~')[newply - 1];
        if (strMv.indexOf('.') != -1)
        {
            // Black move, eg: 1.
            if (newply == 1)
            {
                // If it is Black's turn initially...
                var o = String(newply + moveOffset).length;
                strMv = String(newply + moveOffset) + document.getElementById(String(newply)).innerText.substring(o, document.getElementById(String(newply)).innerText.length);
                bGotNotation = true;
            }                
            else
            {
                strMv = String(parseInt(strMv.substring(0, strMv.indexOf('.'))) + moveOffset) + '...';
            }
        }
        else
        {
            // White move eg: 1
            strMv = '';
        }
        
        if (!bGotNotation)
        {
            if (!document.getElementById(String(newply)).innerText.startsWith('('))
            {
                strMv += document.getElementById(String(newply)).innerText;
            }
            else
            {
                strMv = document.getElementById(String(newply)).innerText.substring(1, document.getElementById(String(newply)).innerText.length);
            }
        }
        strMv = strMv.replace(')','').replace('(','');
        document.getElementById(currentMove).innerText = strMv;
        document.getElementById(currentCh).value = document.getElementById(plyCharMap).value.split('~')[newply - 1];
    }
    else
    {
        document.getElementById(currentMove).innerText = '';
        document.getElementById(currentCh).value = -2;
    }
}

function ActOnKey(key)
{
    if (document.getElementById(promoted).value != "-1")
    {
        if (key==39 || key==102)
        {
            mf();
        }
        if (key==37 ||key==100)
        {
            mb();
        }
    }
}

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);
}